From 7632f9bbba540fbc6b17962a9a8fd59d5238f49d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Tue, 17 Jan 2023 17:38:40 +0100 Subject: [PATCH 01/11] itests: Test FEVM recursive calls --- itests/contracts/RecCall.hex | 1 + itests/contracts/RecCall.sol | 16 +++++++ itests/contracts/StackFunc.hex | 1 + itests/contracts/StackFunc.sol | 12 +++++ itests/fevm_test.go | 81 +++++++++++++++++++++++++++++++++- itests/kit/evm.go | 21 ++++++--- 6 files changed, 124 insertions(+), 8 deletions(-) create mode 100644 itests/contracts/RecCall.hex create mode 100644 itests/contracts/RecCall.sol create mode 100644 itests/contracts/StackFunc.hex create mode 100644 itests/contracts/StackFunc.sol diff --git a/itests/contracts/RecCall.hex b/itests/contracts/RecCall.hex new file mode 100644 index 000000000..b8de20213 --- /dev/null +++ b/itests/contracts/RecCall.hex @@ -0,0 +1 @@ +608060405234801561001057600080fd5b5061025b806100206000396000f3fe60806040526004361061001e5760003560e01c8063cb7786d714610023575b600080fd5b61003d60048036038101906100389190610129565b61003f565b005b600083036100d15760008111156100cc573073ffffffffffffffffffffffffffffffffffffffff1663cb7786d7838460018561007b91906101ab565b6040518463ffffffff1660e01b8152600401610099939291906101ee565b600060405180830381600087803b1580156100b357600080fd5b505af11580156100c7573d6000803e3d6000fd5b505050505b6100e9565b6100e86001846100e191906101ab565b838361003f565b5b505050565b600080fd5b6000819050919050565b610106816100f3565b811461011157600080fd5b50565b600081359050610123816100fd565b92915050565b600080600060608486031215610142576101416100ee565b5b600061015086828701610114565b935050602061016186828701610114565b925050604061017286828701610114565b9150509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006101b6826100f3565b91506101c1836100f3565b92508282039050818111156101d9576101d861017c565b5b92915050565b6101e8816100f3565b82525050565b600060608201905061020360008301866101df565b61021060208301856101df565b61021d60408301846101df565b94935050505056fea26469706673582212209a21ff59c642e2970917c07bf498271c2a6df8e3929677952c0c2d8031db15cc64736f6c63430008110033 \ No newline at end of file diff --git a/itests/contracts/RecCall.sol b/itests/contracts/RecCall.sol new file mode 100644 index 000000000..f89611f0e --- /dev/null +++ b/itests/contracts/RecCall.sol @@ -0,0 +1,16 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.17; + +contract StackRecCall { + function exec1(uint256 n, uint256 m, uint256 r) public payable { + if(n == 0) { + if(r > 0) { + StackRecCall(address(this)).exec1(m, m, r-1); + } + + return; + } + + exec1(n-1, m, r); + } +} diff --git a/itests/contracts/StackFunc.hex b/itests/contracts/StackFunc.hex new file mode 100644 index 000000000..1a3d1202e --- /dev/null +++ b/itests/contracts/StackFunc.hex @@ -0,0 +1 @@ +608060405234801561001057600080fd5b50610162806100206000396000f3fe60806040526004361061001e5760003560e01c8063c38e07dd14610023575b600080fd5b61003d6004803603810190610038919061009c565b61003f565b005b600081031561005e5761005d60018261005891906100f8565b61003f565b5b50565b600080fd5b6000819050919050565b61007981610066565b811461008457600080fd5b50565b60008135905061009681610070565b92915050565b6000602082840312156100b2576100b1610061565b5b60006100c084828501610087565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061010382610066565b915061010e83610066565b9250828203905081811115610126576101256100c9565b5b9291505056fea2646970667358221220ee8f18bfd33b1e0156cfe68e9071dd32960b370c7e63ec53c62dd48e28cb5d3b64736f6c63430008110033 \ No newline at end of file diff --git a/itests/contracts/StackFunc.sol b/itests/contracts/StackFunc.sol new file mode 100644 index 000000000..7084901c6 --- /dev/null +++ b/itests/contracts/StackFunc.sol @@ -0,0 +1,12 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.17; + +contract StackSelf { + function exec1(uint256 n) public payable { + if(n == 0) { + return; + } + + exec1(n-1); + } +} \ No newline at end of file diff --git a/itests/fevm_test.go b/itests/fevm_test.go index e05b0e2cc..d39b6c274 100644 --- a/itests/fevm_test.go +++ b/itests/fevm_test.go @@ -2,6 +2,7 @@ package itests import ( "context" + "encoding/binary" "encoding/hex" "testing" "time" @@ -10,6 +11,7 @@ import ( "github.com/filecoin-project/go-address" builtintypes "github.com/filecoin-project/go-state-types/builtin" + "github.com/filecoin-project/go-state-types/exitcode" "github.com/filecoin-project/go-state-types/manifest" "github.com/filecoin-project/lotus/chain/types" @@ -38,9 +40,9 @@ func inputDataFromFrom(ctx context.Context, t *testing.T, client *kit.TestFullNo func setupFEVMTest(t *testing.T) (context.Context, context.CancelFunc, *kit.TestFullNode) { kit.QuietMiningLogs() - blockTime := 100 * time.Millisecond + blockTime := 5 * time.Millisecond client, _, ens := kit.EnsembleMinimal(t, kit.MockProofs(), kit.ThroughRPC()) - ens.InterconnectAll().BeginMining(blockTime) + ens.InterconnectAll().BeginMiningMustPost(blockTime) ctx, cancel := context.WithTimeout(context.Background(), time.Minute) return ctx, cancel, client } @@ -139,3 +141,78 @@ func TestEVMRpcDisable(t *testing.T) { _, err := client.EthBlockNumber(context.Background()) require.ErrorContains(t, err, "module disabled, enable with Fevm.EnableEthRPC") } + +// TestFEVMRecursiveFuncCall deploys a contract and makes a recursive function calls +func TestFEVMRecursiveFuncCall(t *testing.T) { + ctx, cancel, client := setupFEVMTest(t) + defer cancel() + + //install contract Actor + filenameActor := "contracts/StackFunc.hex" + fromAddr, actorAddr := client.EVM().DeployContractFromFilename(ctx, filenameActor) + + testN := func(n int) func(t *testing.T) { + return func(t *testing.T) { + inputData := make([]byte, 32) + binary.BigEndian.PutUint64(inputData[24:], uint64(n)) + + result := client.EVM().InvokeContractByFuncName(ctx, fromAddr, actorAddr, "exec1(uint256)", inputData) + require.Equal(t, result, []byte{}) + } + } + + t.Run("n=0", testN(0)) + t.Run("n=1", testN(1)) + t.Run("n=20", testN(20)) + t.Run("n=200", testN(200)) + t.Run("n=293", testN(293)) +} + +// TestFEVMRecursiveActorCall deploys a contract and makes a recursive actor calls +func TestFEVMRecursiveActorCall(t *testing.T) { + ctx, cancel, client := setupFEVMTest(t) + defer cancel() + + //install contract Actor + filenameActor := "contracts/RecCall.hex" + fromAddr, actorAddr := client.EVM().DeployContractFromFilename(ctx, filenameActor) + + testN := func(n, r int, ex exitcode.ExitCode) func(t *testing.T) { + return func(t *testing.T) { + inputData := make([]byte, 32*3) + binary.BigEndian.PutUint64(inputData[24:], uint64(n)) + binary.BigEndian.PutUint64(inputData[32+24:], uint64(n)) + binary.BigEndian.PutUint64(inputData[32+32+24:], uint64(r)) + + client.EVM().InvokeContractByFuncNameExpectExit(ctx, fromAddr, actorAddr, "exec1(uint256,uint256,uint256)", inputData, ex) + } + } + + t.Run("n=0,r=1", testN(0, 1, exitcode.Ok)) + t.Run("n=1,r=1", testN(1, 1, exitcode.Ok)) + t.Run("n=20,r=1", testN(20, 1, exitcode.Ok)) + t.Run("n=200,r=1", testN(200, 1, exitcode.Ok)) + t.Run("n=251,r=1", testN(251, 1, exitcode.Ok)) + + t.Run("n=252,r=1-fails", testN(252, 1, exitcode.ExitCode(23))) // 23 means stack overflow + + t.Run("n=0,r=10", testN(0, 10, exitcode.Ok)) + t.Run("n=1,r=10", testN(1, 10, exitcode.Ok)) + t.Run("n=20,r=10", testN(20, 10, exitcode.Ok)) + t.Run("n=200,r=10", testN(200, 10, exitcode.Ok)) + t.Run("n=251,r=10", testN(251, 10, exitcode.Ok)) + + t.Run("n=252,r=10-fails", testN(252, 10, exitcode.ExitCode(23))) + + t.Run("n=0,r=32", testN(0, 32, exitcode.Ok)) + t.Run("n=1,r=32", testN(1, 32, exitcode.Ok)) + t.Run("n=20,r=32", testN(20, 32, exitcode.Ok)) + t.Run("n=200,r=32", testN(200, 32, exitcode.Ok)) + t.Run("n=251,r=32", testN(251, 32, exitcode.Ok)) + + t.Run("n=0,r=254", testN(0, 254, exitcode.Ok)) + t.Run("n=251,r=170", testN(251, 170, exitcode.Ok)) + + t.Run("n=0,r=255-fails", testN(0, 255, exitcode.ExitCode(33))) // 33 means transaction reverted + t.Run("n=251,r=171-fails", testN(251, 171, exitcode.ExitCode(33))) +} diff --git a/itests/kit/evm.go b/itests/kit/evm.go index 46aaf52db..b3693ea45 100644 --- a/itests/kit/evm.go +++ b/itests/kit/evm.go @@ -21,8 +21,10 @@ import ( builtintypes "github.com/filecoin-project/go-state-types/builtin" "github.com/filecoin-project/go-state-types/builtin/v10/eam" "github.com/filecoin-project/go-state-types/crypto" + "github.com/filecoin-project/go-state-types/exitcode" "github.com/filecoin-project/lotus/api" + "github.com/filecoin-project/lotus/build" "github.com/filecoin-project/lotus/chain/actors" "github.com/filecoin-project/lotus/chain/types" "github.com/filecoin-project/lotus/chain/types/ethtypes" @@ -109,11 +111,12 @@ func (e *EVM) InvokeSolidity(ctx context.Context, sender address.Address, target params = buffer.Bytes() msg := &types.Message{ - To: target, - From: sender, - Value: big.Zero(), - Method: builtintypes.MethodsEVM.InvokeContract, - Params: params, + To: target, + From: sender, + Value: big.Zero(), + Method: builtintypes.MethodsEVM.InvokeContract, + GasLimit: build.BlockGasLimit, // note: we hardcode block gas limit due to slightly broken gas estimation - https://github.com/filecoin-project/lotus/issues/10041 + Params: params, } e.t.Log("sending invoke message") @@ -237,12 +240,18 @@ func (e *EVM) ComputeContractAddress(deployer ethtypes.EthAddress, nonce uint64) func (e *EVM) InvokeContractByFuncName(ctx context.Context, fromAddr address.Address, idAddr address.Address, funcSignature string, inputData []byte) []byte { entryPoint := CalcFuncSignature(funcSignature) wait := e.InvokeSolidity(ctx, fromAddr, idAddr, entryPoint, inputData) - require.True(e.t, wait.Receipt.ExitCode.IsSuccess(), "contract execution failed") + require.True(e.t, wait.Receipt.ExitCode.IsSuccess(), "contract execution failed: %d", wait.Receipt.ExitCode) result, err := cbg.ReadByteArray(bytes.NewBuffer(wait.Receipt.Return), uint64(len(wait.Receipt.Return))) require.NoError(e.t, err) return result } +func (e *EVM) InvokeContractByFuncNameExpectExit(ctx context.Context, fromAddr address.Address, idAddr address.Address, funcSignature string, inputData []byte, exit exitcode.ExitCode) { + entryPoint := CalcFuncSignature(funcSignature) + wait := e.InvokeSolidity(ctx, fromAddr, idAddr, entryPoint, inputData) + require.Equal(e.t, exit, wait.Receipt.ExitCode) +} + // function signatures are the first 4 bytes of the hash of the function name and types func CalcFuncSignature(funcName string) []byte { hasher := sha3.NewLegacyKeccak256() From 972e68a8c126aed1d9aaf48c8bc1a12917a16f78 Mon Sep 17 00:00:00 2001 From: Aayush Date: Fri, 20 Jan 2023 10:21:00 -0500 Subject: [PATCH 02/11] feat: minor improvements to Ethereum delegated siggys --- chain/types/ethtypes/eth_transactions.go | 29 ++++++++++++------------ 1 file changed, 14 insertions(+), 15 deletions(-) diff --git a/chain/types/ethtypes/eth_transactions.go b/chain/types/ethtypes/eth_transactions.go index b6ae22169..18b922234 100644 --- a/chain/types/ethtypes/eth_transactions.go +++ b/chain/types/ethtypes/eth_transactions.go @@ -12,13 +12,11 @@ import ( "github.com/filecoin-project/go-address" gocrypto "github.com/filecoin-project/go-crypto" - "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/big" builtintypes "github.com/filecoin-project/go-state-types/builtin" typescrypto "github.com/filecoin-project/go-state-types/crypto" "github.com/filecoin-project/lotus/build" - "github.com/filecoin-project/lotus/chain/actors" "github.com/filecoin-project/lotus/chain/types" ) @@ -63,6 +61,7 @@ func EthTxArgsFromMessage(msg *types.Message) (EthTxArgs, error) { to *EthAddress params []byte paramsReader = bytes.NewReader(msg.Params) + err error ) if msg.Version != 0 { @@ -72,11 +71,10 @@ func EthTxArgsFromMessage(msg *types.Message) (EthTxArgs, error) { if msg.To == builtintypes.EthereumAddressManagerActorAddr { switch msg.Method { case builtintypes.MethodsEAM.CreateExternal: - var create abi.CborBytes - if err := create.UnmarshalCBOR(paramsReader); err != nil { - return EthTxArgs{}, err + params, err = cbg.ReadByteArray(paramsReader, uint64(len(msg.Params))) + if err != nil { + return EthTxArgs{}, xerrors.Errorf("failed to read params byte array: %w", err) } - params = create default: return EthTxArgs{}, fmt.Errorf("unsupported EAM method") } @@ -103,11 +101,6 @@ func EthTxArgsFromMessage(msg *types.Message) (EthTxArgs, error) { if err != nil { return EthTxArgs{}, xerrors.Errorf("failed to read params byte array: %w", err) } - - if len(params) == 0 { - // Otherwise, we don't get a guaranteed round-trip. - return EthTxArgs{}, xerrors.Errorf("cannot invoke contracts with empty parameters from an eth-account") - } } } @@ -115,6 +108,11 @@ func EthTxArgsFromMessage(msg *types.Message) (EthTxArgs, error) { return EthTxArgs{}, xerrors.Errorf("extra data found in params") } + if len(params) == 0 && msg.Method != builtintypes.MethodSend { + // Otherwise, we don't get a guaranteed round-trip. + return EthTxArgs{}, xerrors.Errorf("msgs with empty parameters from an eth-account must be Sends (MethodNum: %d)", msg.Method) + } + return EthTxArgs{ ChainID: build.Eip155ChainId, Nonce: int(msg.Nonce), @@ -143,12 +141,13 @@ func (tx *EthTxArgs) ToUnsignedMessage(from address.Address) (*types.Message, er if len(tx.Input) == 0 { return nil, xerrors.New("cannot call CreateExternal without params") } - inputParams := abi.CborBytes(tx.Input) - params, err = actors.SerializeParams(&inputParams) - if err != nil { - return nil, fmt.Errorf("failed to serialize Create params: %w", err) + + buf := new(bytes.Buffer) + if err = cbg.WriteByteArray(buf, tx.Input); err != nil { + return nil, xerrors.Errorf("failed to serialize Create params: %w", err) } + params = buf.Bytes() } else { to, err = tx.To.ToFilecoinAddress() if err != nil { From 640f0dc8b6f34d9b1f0d9c2680dca2b649656764 Mon Sep 17 00:00:00 2001 From: Ian Davis Date: Sun, 22 Jan 2023 16:39:40 +0000 Subject: [PATCH 03/11] Add back <> parameter for docker push This commit reverts a change with the previous fix for this flow: - https://github.com/filecoin-project/lotus/pull/10088 --- .circleci/config.yml | 2 +- .circleci/template.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 374e41899..b67a7a7d0 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -473,7 +473,7 @@ jobs: - run: name: Docker push command: | - docker push filecoin/<>:<> + docker push filecoin/<>:<>-<> if [[ ! -z $CIRCLE_SHA ]]; then docker image tag filecoin/<>:<>-<> filecoin/<>:"${CIRCLE_SHA:0:7}"-<> docker push filecoin/<>:"${CIRCLE_SHA:0:7}"-<> diff --git a/.circleci/template.yml b/.circleci/template.yml index 44db05beb..d756f1136 100644 --- a/.circleci/template.yml +++ b/.circleci/template.yml @@ -473,7 +473,7 @@ jobs: - run: name: Docker push command: | - docker push filecoin/<>:<> + docker push filecoin/<>:<>-<> if [["[[ ! -z $CIRCLE_SHA ]]"]]; then docker image tag filecoin/<>:<>-<> filecoin/<>:"${CIRCLE_SHA:0:7}"-<> docker push filecoin/<>:"${CIRCLE_SHA:0:7}"-<> From 68e20cebd7ff82784f39704b3738b5494d3aa11f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Thu, 19 Jan 2023 17:21:34 +0100 Subject: [PATCH 04/11] itests: Test EAM interactions from accounts --- itests/eth_account_abstraction_test.go | 50 ++++++++++++++++++++++++++ itests/kit/node_full.go | 47 ++++++++++++++++++++++++ 2 files changed, 97 insertions(+) diff --git a/itests/eth_account_abstraction_test.go b/itests/eth_account_abstraction_test.go index 692e4646f..86b7e3e9b 100644 --- a/itests/eth_account_abstraction_test.go +++ b/itests/eth_account_abstraction_test.go @@ -11,6 +11,8 @@ import ( "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/big" + builtin2 "github.com/filecoin-project/go-state-types/builtin" + "github.com/filecoin-project/go-state-types/builtin/v10/eam" "github.com/filecoin-project/go-state-types/exitcode" "github.com/filecoin-project/lotus/api" @@ -313,3 +315,51 @@ func TestEthAccountAbstractionFailsFromEvmActor(t *testing.T) { require.Error(t, err, "expected gas estimation to fail") require.Contains(t, err.Error(), "SysErrSenderInvalid") } + +func TestEthAccountManagerPermissions(t *testing.T) { + kit.QuietMiningLogs() + + client, _, ens := kit.EnsembleMinimal(t, kit.MockProofs(), kit.ThroughRPC()) + ens.InterconnectAll().BeginMining(10 * time.Millisecond) + + ctx, cancel := context.WithTimeout(context.Background(), time.Minute) + defer cancel() + + // setup f1/f3/f4 accounts + + wsp, err := client.WalletNew(ctx, types.KTSecp256k1) + require.NoError(t, err) + + wbl, err := client.WalletNew(ctx, types.KTBLS) + require.NoError(t, err) + + wdl, err := client.WalletNew(ctx, types.KTDelegated) + require.NoError(t, err) + + def := client.DefaultKey.Address + + // send some funds + client.ExpectSend(ctx, def, wsp, types.FromFil(10), "") + client.ExpectSend(ctx, def, wbl, types.FromFil(10), "") + client.ExpectSend(ctx, def, wdl, types.FromFil(10), "") + require.NoError(t, err) + + // make sure that EAM only allows CreateExternal to be called by accounts + client.ExpectSend(ctx, wsp, builtin2.EthereumAddressManagerActorAddr, big.Zero(), "not one of supported (18)", client.MakeSendCall(builtin2.MethodsEAM.Create, &eam.CreateParams{Nonce: 0})) + client.ExpectSend(ctx, wbl, builtin2.EthereumAddressManagerActorAddr, big.Zero(), "not one of supported (18)", client.MakeSendCall(builtin2.MethodsEAM.Create, &eam.CreateParams{Nonce: 0})) + client.ExpectSend(ctx, wdl, builtin2.EthereumAddressManagerActorAddr, big.Zero(), "not one of supported (18)", client.MakeSendCall(builtin2.MethodsEAM.Create, &eam.CreateParams{Nonce: 0})) + + client.ExpectSend(ctx, wsp, builtin2.EthereumAddressManagerActorAddr, big.Zero(), "not one of supported (18)", client.MakeSendCall(builtin2.MethodsEAM.Create2, &eam.Create2Params{})) + client.ExpectSend(ctx, wbl, builtin2.EthereumAddressManagerActorAddr, big.Zero(), "not one of supported (18)", client.MakeSendCall(builtin2.MethodsEAM.Create2, &eam.Create2Params{})) + client.ExpectSend(ctx, wdl, builtin2.EthereumAddressManagerActorAddr, big.Zero(), "not one of supported (18)", client.MakeSendCall(builtin2.MethodsEAM.Create2, &eam.Create2Params{})) + + contractHex, err := os.ReadFile("contracts/SimpleCoin.hex") + require.NoError(t, err) + contract, err := hex.DecodeString(string(contractHex)) + require.NoError(t, err) + contractParams := abi.CborBytes(contract) + + client.ExpectSend(ctx, wsp, builtin2.EthereumAddressManagerActorAddr, big.Zero(), "", client.MakeSendCall(builtin2.MethodsEAM.CreateExternal, &contractParams)) + client.ExpectSend(ctx, wbl, builtin2.EthereumAddressManagerActorAddr, big.Zero(), "", client.MakeSendCall(builtin2.MethodsEAM.CreateExternal, &contractParams)) + client.ExpectSend(ctx, wdl, builtin2.EthereumAddressManagerActorAddr, big.Zero(), "", client.MakeSendCall(builtin2.MethodsEAM.CreateExternal, &contractParams)) +} diff --git a/itests/kit/node_full.go b/itests/kit/node_full.go index 4546f5a03..682ae118a 100644 --- a/itests/kit/node_full.go +++ b/itests/kit/node_full.go @@ -1,6 +1,7 @@ package kit import ( + "bytes" "context" "fmt" "testing" @@ -10,9 +11,11 @@ import ( "github.com/libp2p/go-libp2p/core/peer" "github.com/multiformats/go-multiaddr" "github.com/stretchr/testify/require" + cbg "github.com/whyrusleeping/cbor-gen" "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" + "github.com/filecoin-project/go-state-types/exitcode" "github.com/filecoin-project/lotus/api" "github.com/filecoin-project/lotus/api/v1api" @@ -124,6 +127,50 @@ func (f *TestFullNode) AssignPrivKey(pkey *Libp2p) { f.Pkey = pkey } +type SendCall struct { + Method abi.MethodNum + Params []byte +} + +func (f *TestFullNode) MakeSendCall(m abi.MethodNum, params cbg.CBORMarshaler) SendCall { + var b bytes.Buffer + err := params.MarshalCBOR(&b) + require.NoError(f.t, err) + return SendCall{ + Method: m, + Params: b.Bytes(), + } +} + +func (f *TestFullNode) ExpectSend(ctx context.Context, from, to address.Address, value types.BigInt, errContains string, sc ...SendCall) *types.SignedMessage { + msg := &types.Message{From: from, To: to, Value: value} + + if len(sc) == 1 { + msg.Method = sc[0].Method + msg.Params = sc[0].Params + } + + _, err := f.GasEstimateMessageGas(ctx, msg, nil, types.EmptyTSK) + if errContains != "" { + require.ErrorContains(f.t, err, errContains) + return nil + } + require.NoError(f.t, err) + + if errContains == "" { + m, err := f.MpoolPushMessage(ctx, msg, nil) + require.NoError(f.t, err) + + r, err := f.StateWaitMsg(ctx, m.Cid(), 1, api.LookbackNoLimit, true) + require.NoError(f.t, err) + + require.Equal(f.t, exitcode.Ok, r.Receipt.ExitCode) + return m + } + + return nil +} + // ChainPredicate encapsulates a chain condition. type ChainPredicate func(set *types.TipSet) bool From 804bef72c9f33fe5ec3b3df5ca74f3869817e58a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Mon, 23 Jan 2023 12:48:21 +0100 Subject: [PATCH 05/11] fix: cli: Wait for all results in GetAsks --- cli/client.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/cli/client.go b/cli/client.go index 1c41262a5..a8355f9a1 100644 --- a/cli/client.go +++ b/cli/client.go @@ -1517,6 +1517,8 @@ func GetAsks(ctx context.Context, api lapi.FullNode) ([]QueriedAsk, error) { } }(miner) } + + wg.Wait() }() loop: @@ -1590,6 +1592,8 @@ loop: lk.Unlock() }(miner) } + + wg.Wait() }() loop2: From 46746f349553b57d019fbed84ea81c109992afd8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Tue, 17 Jan 2023 17:38:40 +0100 Subject: [PATCH 06/11] itests: Test FEVM recursive calls --- itests/fevm_test.go | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/itests/fevm_test.go b/itests/fevm_test.go index d39b6c274..7fc04e86d 100644 --- a/itests/fevm_test.go +++ b/itests/fevm_test.go @@ -151,21 +151,21 @@ func TestFEVMRecursiveFuncCall(t *testing.T) { filenameActor := "contracts/StackFunc.hex" fromAddr, actorAddr := client.EVM().DeployContractFromFilename(ctx, filenameActor) - testN := func(n int) func(t *testing.T) { + testN := func(n int, ex exitcode.ExitCode) func(t *testing.T) { return func(t *testing.T) { inputData := make([]byte, 32) binary.BigEndian.PutUint64(inputData[24:], uint64(n)) - result := client.EVM().InvokeContractByFuncName(ctx, fromAddr, actorAddr, "exec1(uint256)", inputData) - require.Equal(t, result, []byte{}) + client.EVM().InvokeContractByFuncNameExpectExit(ctx, fromAddr, actorAddr, "exec1(uint256)", inputData, ex) } } - t.Run("n=0", testN(0)) - t.Run("n=1", testN(1)) - t.Run("n=20", testN(20)) - t.Run("n=200", testN(200)) - t.Run("n=293", testN(293)) + t.Run("n=0", testN(0, exitcode.Ok)) + t.Run("n=1", testN(1, exitcode.Ok)) + t.Run("n=20", testN(20, exitcode.Ok)) + t.Run("n=200", testN(200, exitcode.Ok)) + t.Run("n=507", testN(507, exitcode.Ok)) + t.Run("n=508", testN(508, exitcode.ExitCode(23))) // 23 means stack overflow } // TestFEVMRecursiveActorCall deploys a contract and makes a recursive actor calls From 88647827501564f2db014269aa97c23494ad9b51 Mon Sep 17 00:00:00 2001 From: Aayush Date: Tue, 24 Jan 2023 13:16:45 -0500 Subject: [PATCH 07/11] fix: EthAPI: Drop hack in GetStorageAt --- node/impl/full/eth.go | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/node/impl/full/eth.go b/node/impl/full/eth.go index 7eb992a22..28f02f1a0 100644 --- a/node/impl/full/eth.go +++ b/node/impl/full/eth.go @@ -500,18 +500,8 @@ func (a *EthModule) EthGetStorageAt(ctx context.Context, ethAddr ethtypes.EthAdd return nil, fmt.Errorf("failed to construct system sender address: %w", err) } - // TODO super duper hack (raulk). The EVM runtime actor uses the U256 parameter type in - // GetStorageAtParams, which serializes as a hex-encoded string. It should serialize - // as bytes. We didn't get to fix in time for Iron, so for now we just pass - // through the hex-encoded value passed through the Eth JSON-RPC API, by remarshalling it. - // We don't fix this at origin (builtin-actors) because we are not updating the bundle - // for Iron. - tmp, err := position.MarshalJSON() - if err != nil { - panic(err) - } params, err := actors.SerializeParams(&evm.GetStorageAtParams{ - StorageKey: tmp[1 : len(tmp)-1], // TODO strip the JSON-encoding quotes -- yuck + StorageKey: position, }) if err != nil { return nil, fmt.Errorf("failed to serialize parameters: %w", err) From ee6af9de6161f83a77ddad04b52bb74ac3fd780c Mon Sep 17 00:00:00 2001 From: ychiao Date: Tue, 24 Jan 2023 22:56:04 -0500 Subject: [PATCH 08/11] Eth JSON-RPC: implement web3_clientVersion --- api/api_full.go | 3 +++ api/eth_aliases.go | 2 ++ api/mocks/mock_full.go | 15 +++++++++++++++ api/proxy_gen.go | 13 +++++++++++++ build/openrpc/full.json.gz | Bin 32943 -> 32994 bytes build/openrpc/gateway.json.gz | Bin 8494 -> 8494 bytes build/openrpc/miner.json.gz | Bin 16044 -> 16047 bytes build/openrpc/worker.json.gz | Bin 5224 -> 5222 bytes documentation/en/api-v1-unstable-methods.md | 15 +++++++++++++++ node/impl/full/dummy.go | 4 ++++ node/impl/full/eth.go | 5 +++++ 11 files changed, 57 insertions(+) diff --git a/api/api_full.go b/api/api_full.go index b17fad3b5..ec7b23170 100644 --- a/api/api_full.go +++ b/api/api_full.go @@ -836,6 +836,9 @@ type FullNode interface { // Unsubscribe from a websocket subscription EthUnsubscribe(ctx context.Context, id ethtypes.EthSubscriptionID) (bool, error) //perm:write + // Returns the client version + Web3ClientVersion(ctx context.Context) (string, error) //perm:read + // CreateBackup creates node backup onder the specified file name. The // method requires that the lotus daemon is running with the // LOTUS_BACKUP_BASE_PATH environment variable set to some path, and that diff --git a/api/eth_aliases.go b/api/eth_aliases.go index cf69bfff7..ccf0317d9 100644 --- a/api/eth_aliases.go +++ b/api/eth_aliases.go @@ -41,4 +41,6 @@ func CreateEthRPCAliases(as apitypes.Aliaser) { as.AliasMethod("net_version", "Filecoin.NetVersion") as.AliasMethod("net_listening", "Filecoin.NetListening") + + as.AliasMethod("web3_clientVersion", "Filecoin.Web3ClientVersion") } diff --git a/api/mocks/mock_full.go b/api/mocks/mock_full.go index b32fc7d8b..02ded88a5 100644 --- a/api/mocks/mock_full.go +++ b/api/mocks/mock_full.go @@ -4096,3 +4096,18 @@ func (mr *MockFullNodeMockRecorder) WalletVerify(arg0, arg1, arg2, arg3 interfac mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "WalletVerify", reflect.TypeOf((*MockFullNode)(nil).WalletVerify), arg0, arg1, arg2, arg3) } + +// Web3ClientVersion mocks base method. +func (m *MockFullNode) Web3ClientVersion(arg0 context.Context) (string, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Web3ClientVersion", arg0) + ret0, _ := ret[0].(string) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Web3ClientVersion indicates an expected call of Web3ClientVersion. +func (mr *MockFullNodeMockRecorder) Web3ClientVersion(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Web3ClientVersion", reflect.TypeOf((*MockFullNode)(nil).Web3ClientVersion), arg0) +} diff --git a/api/proxy_gen.go b/api/proxy_gen.go index aaa1d87c7..a7345f098 100644 --- a/api/proxy_gen.go +++ b/api/proxy_gen.go @@ -582,6 +582,8 @@ type FullNodeStruct struct { WalletValidateAddress func(p0 context.Context, p1 string) (address.Address, error) `perm:"read"` WalletVerify func(p0 context.Context, p1 address.Address, p2 []byte, p3 *crypto.Signature) (bool, error) `perm:"read"` + + Web3ClientVersion func(p0 context.Context) (string, error) `perm:"read"` } } @@ -3936,6 +3938,17 @@ func (s *FullNodeStub) WalletVerify(p0 context.Context, p1 address.Address, p2 [ return false, ErrNotSupported } +func (s *FullNodeStruct) Web3ClientVersion(p0 context.Context) (string, error) { + if s.Internal.Web3ClientVersion == nil { + return "", ErrNotSupported + } + return s.Internal.Web3ClientVersion(p0) +} + +func (s *FullNodeStub) Web3ClientVersion(p0 context.Context) (string, error) { + return "", ErrNotSupported +} + func (s *GatewayStruct) ChainGetBlockMessages(p0 context.Context, p1 cid.Cid) (*BlockMessages, error) { if s.Internal.ChainGetBlockMessages == nil { return nil, ErrNotSupported diff --git a/build/openrpc/full.json.gz b/build/openrpc/full.json.gz index d7a354461cda8da023b97b3769dbcf447ce3dfde..4fc58a93a6f9db32082e1c3941745e4fd50f2902 100644 GIT binary patch delta 29653 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 iT^&nCbB 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
}C=w5%R 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 P0RR7rD4*SpoCW~^`&+i~ diff --git a/build/openrpc/gateway.json.gz b/build/openrpc/gateway.json.gz index 74a9f32217501ea2086005946499a082506f1aaf..d145c8939094c574aac4b8fbf5b83121686d0a13 100644 GIT binary patch delta 8399 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 delta 8442 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 YUEPR41Of#K34suJEmG*$i;VQY05$r8-2eap diff --git a/build/openrpc/miner.json.gz b/build/openrpc/miner.json.gz index d3750150c33b0714c410f71f2df105cf89fb9a69..b2a53e031c8e1d6baf37e6dcefd13e53135a8f2b 100644 GIT binary patch delta 14676 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%0Du3l^xJs_&k7^n&6>3tg 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 T^Z5S)00960TW`apk{Lm%0b->`z?S7hkkm2X zt7Lv9l}cq#SRQLT)Yq3^BOWeH?YlS+K?{?ahujBjpcBup&^z%uQ>CYBomif#>3vC- z{)wQ8Tu(YBOUqg_U34I2#&;1@qV6x8TDL7Xf{h&6|Akh*76nSDlwr?p^KM3c9d=`hLaS=6AVY!-y*4s5RI-yJ1TO;A%ac?DWPhtU6af=x;h*Rd zITkkHwPQlc8@`cQ1_y=U1^uk*8Y2NYZDVZ_M4%w^x6B-C=kDfUntTd<%=tT4G(Zc!L{_!7Yxw03|-;>1@t)`kj#oBT;ST2#SKIqa~ ztnvv&7l(WA)0b$5nT*I}DSbcd<2ZZwk!b@1Zbt(* zk%*oP+oOT1oPW)sWg#*Pwh1v|<@Wu&th7r=OnX6)=f&v2POwYgsLK$8U7k{mAX!Bv zZV>Ch&CC7Wn=;P*#?9BA(vp>YXfwdj&yAd;D`U4o@E`wtsGvN+Z#>&&mKxtPcyBSSrje zJ|1N%+jM3+x-JW&4*$|Fz1xZjZO)ohtp;Q2XL^D-D3seC{`C0agVdT2Ad8u35_SqW zX-3jA>~xC*zUl2yfq54HuTLw=l1l$WEaiW%KFtmC-*fcu41LL3ah+ z6?8X??!I2?m~z`0Mww1g$_%-QMd;+0R(La2W|3U*w2`=x>mhOk zEW92mp03n=EWR5UT@I$b@n|&ZpsA*GbaRM06Ac-iF&wDFsXl>yIFe-PFN9}v8rN#AK7-~LERUE?MGg8d8j z|B~5%Ps?Wim&iiUL)U(AKQcL)eyPfXUP3bC4Vp?+-+vT=Pq$J8PqoZk+d$Y; z+FUkj;P>g&LzIn_s>{+9{)vLWtMBe_N-WduL4D7UXnLb5@T2mC@&Sk>8hw~1Rm0l(8Za=Ah*iU2U$&XU%iW8-{g z+pGm}>U);2{C{m}SsCFU{=>*zcN_X)SufnUw0@p(MOIb0Z7hfk#QlxZRhjX*d`ks~AiMHfNN1v!7oIVXy_^$QnO zUy<5nu4z%~u!MGJJ zQ$z|aSgXh>nQ!GHE`KAQG)K-D0>N!_2d{PSX+`#|q%eJ%*~!MPn3ir#>-1^8X9`jnq42t6 z2gbdeZP4JeQ9rzu(|RH~t4GdV69<|mGC!>-IwvOju|0rd^Tw~>3jah@{=pNO9|!a+ z-Ut?HK~r&e@lF!QO^5)zk^y)r!`OddJ5NMN^nPhYSG18{^_J#?=4- delta 2530 zcmV<82_5$4DCj7#4FdveeUlFZJ%8(i9M^3>63d2WFczViae47n0lZVmiEUf{ym0}Y zn`9y;C}aC~$roR312O@5-G55l#*iSZW1g&s|5f2xp_FbHZpoPiIL+%4M(23_)=$&|-snS!mPFPRX^u8oZ z|3uJ4t|y(6rDd&|E;^7h4t=pCx!A6ek|3WKYivp$bsEf&r>DZspTB3|M zS^Ahn%CP6Qc{iiJ4!f~Lp;fh3kRd^aUK<(e53`da1TO+G%9B(CWPgrxC;}$X!ava^ zax84XYsZ9?H+&^_hr(zy*N|uMHQ*N--{kV^Iwd zg3Qe$L6E;`2-vnp`2H3dr11U1_Y2=&#rF@CUbgT5f(UXU4ISRU(CQzqy{ND&pIZ*^ z@}hyw?in^Y(IL0`rhkBODj#bI=~Lrkxx@ukcs>4fPy zoUYW#PiP>hJ$mMRu+pG5pcBozM+@g~`^SHr<;q?-e@_-uw3=%A6l=@XV7WxP`k+f| zvC1b9T_AdZ=smR<(f`84v>z|*D_RlCcLfwhOkbiIW-=m^rS$!*kK^p!N2U!7xE&4L zL?U`FY>x)2a(_05mW9YH*e1k;mD~68veGUgG3^CGo)@D7JHak}qb@@Xc6mxMf@Bqy zxIwG~lRJy7p^XxRoWW^qvue~xM0P}t8Vn~_lty;i_UL@M54aej_+HeWN~fcZkKMwF z?7v3lS>XHYKv`MZiFkUWt9P;#?iBjv6TP4`ZPDlf6vjsKYZ|2{T@3GYs*b8xxM3L ztZ{j&WPdDYbJ4avNeg6Rzi%d(KzH>kF>I5WGxMDu8t4&^QWQ12?T>1KyU#ZJjXTHJ zMub&uFA*k~%noD1n-ZRj3TIN_n>&XU+Km)niurDYFQC4uqN_6ANJl+uFrA>gg6;~s zE9h<(-F>~(G3B;1j53{~lo@hy!^$>tG#Xcf$_2HQ4{3U{w+C|se~8}CK0N!I{eZ5h z?Lz+^1D-RqBRP5R!c9JB(){6Hw#julZbX8nuEUKtQe1%Bx+{Q=e*tcuGBB!Ndu6x3 z42F{i4R8X(QImKL#D8t8OQUgFHk<}Bjdw6%R-cbB zs~LouHBpe}me{@^&2O9l2-5rlMn;h4wvJ4{0DZE+yWIXt`cC`!_D4$U8ZYq|>|e0| z7tH>LijvL#FOh|yhpzqLeq?eo|3q$H)*sz%y@X`O8#I-uzJDnKpKhfHo@$x7wt=vx zw7G25!0*$khbS8vW#`ZQ8iVT{LE)TC)ct3RGsxkB`I9!OGT#&4lFpZ z;J^pNw5Dal^c8~EnSUJtZ=hu)Coe=9a*epE0)o`2`>F0;ozMnZ$)2b4;oC$T-T z_Z(DmhE3ib=SWkUg8X=Ii5+GE{)OP5wvcj>>z^J!d}t;zy;Agf(N=AtwZHJzrnf%@ zn>!YpE4lZ%1CNr9al0>5({M08RA+gd-gs9z--t%LfhT93i!Oqk3v&LF$+@oYBj>zv zpOKu^Pk+q_`ReaWTA5Eb7P%R3pjbd_nT582LuV=SOXQUT@dV<%HpJ`aoD;>|`h|ig+1$PXCwanEQYGRQr}AvP!QB z2T~$G%eGUj3(BEFPaBURRP>HIQ2QNSpY%EtXzHDbsSGFm@kCV(y)s%9?zxC%jc2pb zK~AvSAJDu194vluT4p3?E(t@>qR_kd{Az-04|8oXQr@8!7#FR13YKbSNjer@oo@KM zjVG$0WQS<@FegfajY)s71YAMEgN(K5cTij%>b(_AX!o1Y?orPE=VnZJF96);E0}7e z2Az5=fX?kwQ8WaC+vW~l>)z9f>{&@+`ZBYV zja@M<-I&(t(|XSoq%cC^b;k~j#yQ)d!Dpj>cq^y%L~>S-oV$M}4m3?+<0(u%HV zBfaV^(|gaBNEvd2Em7-eM*7f*SNF9>`Tz!TEr7U7O9ZQmVAZ+^=UB;!Aqs7olWc~$ svL|X=_mEHZ!X%UT6CDAnlNA&`6zfUr_1*ga0{{U3|Kb@iE3Ga809lgbGXMYp diff --git a/documentation/en/api-v1-unstable-methods.md b/documentation/en/api-v1-unstable-methods.md index 2c853754b..445b24f82 100644 --- a/documentation/en/api-v1-unstable-methods.md +++ b/documentation/en/api-v1-unstable-methods.md @@ -291,6 +291,8 @@ * [WalletSignMessage](#WalletSignMessage) * [WalletValidateAddress](#WalletValidateAddress) * [WalletVerify](#WalletVerify) +* [Web3](#Web3) + * [Web3ClientVersion](#Web3ClientVersion) ## @@ -9207,3 +9209,16 @@ Inputs: Response: `true` +## Web3 + + +### Web3ClientVersion +Returns the client version + + +Perms: read + +Inputs: `null` + +Response: `"string value"` + diff --git a/node/impl/full/dummy.go b/node/impl/full/dummy.go index aa1450212..1a0c2fda7 100644 --- a/node/impl/full/dummy.go +++ b/node/impl/full/dummy.go @@ -118,4 +118,8 @@ func (e *EthModuleDummy) EthSendRawTransaction(ctx context.Context, rawTx ethtyp return ethtypes.EthHash{}, ErrModuleDisabled } +func (a *EthModuleDummy) Web3ClientVersion(ctx context.Context) (string, error) { + return "", ErrModuleDisabled +} + var _ EthModuleAPI = &EthModuleDummy{} diff --git a/node/impl/full/eth.go b/node/impl/full/eth.go index 7eb992a22..cc4bdfdde 100644 --- a/node/impl/full/eth.go +++ b/node/impl/full/eth.go @@ -64,6 +64,7 @@ type EthModuleAPI interface { EthCall(ctx context.Context, tx ethtypes.EthCall, blkParam string) (ethtypes.EthBytes, error) EthMaxPriorityFeePerGas(ctx context.Context) (ethtypes.EthBigInt, error) EthSendRawTransaction(ctx context.Context, rawTx ethtypes.EthBytes) (ethtypes.EthHash, error) + Web3ClientVersion(ctx context.Context) (string, error) } type EthEventAPI interface { @@ -714,6 +715,10 @@ func (a *EthModule) EthSendRawTransaction(ctx context.Context, rawTx ethtypes.Et return ethtypes.EthHashFromTxBytes(rawTx), nil } +func (a *EthModule) Web3ClientVersion(ctx context.Context) (string, error) { + return build.UserVersion(), nil +} + func (a *EthModule) ethCallToFilecoinMessage(ctx context.Context, tx ethtypes.EthCall) (*types.Message, error) { var from address.Address if tx.From == nil || *tx.From == (ethtypes.EthAddress{}) { From 358964d2c87e4c83588d9244600eb5f092eb2233 Mon Sep 17 00:00:00 2001 From: ychiao Date: Tue, 24 Jan 2023 22:59:46 -0500 Subject: [PATCH 09/11] fix lint --- node/impl/full/dummy.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/node/impl/full/dummy.go b/node/impl/full/dummy.go index 1a0c2fda7..182772189 100644 --- a/node/impl/full/dummy.go +++ b/node/impl/full/dummy.go @@ -118,7 +118,7 @@ func (e *EthModuleDummy) EthSendRawTransaction(ctx context.Context, rawTx ethtyp return ethtypes.EthHash{}, ErrModuleDisabled } -func (a *EthModuleDummy) Web3ClientVersion(ctx context.Context) (string, error) { +func (e *EthModuleDummy) Web3ClientVersion(ctx context.Context) (string, error) { return "", ErrModuleDisabled } From 7aed7d3fd0ec20f21c46e684e5c93952f9202774 Mon Sep 17 00:00:00 2001 From: Aayush Date: Tue, 24 Jan 2023 14:04:28 -0500 Subject: [PATCH 10/11] fix: EthAPI: Handle EthCall return correctly --- node/impl/full/eth.go | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/node/impl/full/eth.go b/node/impl/full/eth.go index 28f02f1a0..49a5387af 100644 --- a/node/impl/full/eth.go +++ b/node/impl/full/eth.go @@ -817,8 +817,9 @@ func (a *EthModule) EthEstimateGas(ctx context.Context, tx ethtypes.EthCall) (et func (a *EthModule) EthCall(ctx context.Context, tx ethtypes.EthCall, blkParam string) (ethtypes.EthBytes, error) { msg, err := a.ethCallToFilecoinMessage(ctx, tx) if err != nil { - return nil, err + return nil, xerrors.Errorf("failed to convert ethcall to filecoin message: %w", err) } + ts, err := a.parseBlkParam(ctx, blkParam) if err != nil { return nil, xerrors.Errorf("cannot parse block param: %s", blkParam) @@ -826,11 +827,17 @@ func (a *EthModule) EthCall(ctx context.Context, tx ethtypes.EthCall, blkParam s invokeResult, err := a.applyMessage(ctx, msg, ts.Key()) if err != nil { - return nil, err + return nil, xerrors.Errorf("failed to apply message: %w", err) } - if len(invokeResult.MsgRct.Return) > 0 { + + if msg.To == builtintypes.EthereumAddressManagerActorAddr { + // As far as I can tell, the Eth API always returns empty on contract deployment + return ethtypes.EthBytes{}, nil + + } else if len(invokeResult.MsgRct.Return) > 0 { return cbg.ReadByteArray(bytes.NewReader(invokeResult.MsgRct.Return), uint64(len(invokeResult.MsgRct.Return))) } + return ethtypes.EthBytes{}, nil } From 8842b21ec95b73cc6de85f0fa82ae3cbf60ddd7c Mon Sep 17 00:00:00 2001 From: Aayush Date: Wed, 25 Jan 2023 12:35:18 -0500 Subject: [PATCH 11/11] feat: vm: Assert empty object CID when dumping state --- chain/vm/invoker.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/chain/vm/invoker.go b/chain/vm/invoker.go index 47bd2e326..2dd1f37e6 100644 --- a/chain/vm/invoker.go +++ b/chain/vm/invoker.go @@ -291,7 +291,10 @@ func DumpActorState(i *ActorRegistry, act *types.Actor, b []byte) (interface{}, um := actInfo.vmActor.State() if um == nil { - // TODO::FVM @arajasek I would like to assert that we have the empty object here + if act.Code != EmptyObjectCid { + return nil, xerrors.Errorf("actor with code %s should only have empty object (%s) as its Head, instead has %s", act.Code, EmptyObjectCid, act.Head) + } + return nil, nil } if err := um.UnmarshalCBOR(bytes.NewReader(b)); err != nil {