Merge pull request #10221 from filecoin-project/feat/evm-actor-bytecode-getter
feat: actors: Add bytecode getter
This commit is contained in:
commit
4d5f60cd38
@ -49,4 +49,8 @@ type State interface {
|
||||
|
||||
Nonce() (uint64, error)
|
||||
GetState() interface{}
|
||||
|
||||
GetBytecode() ([]byte, error)
|
||||
GetBytecodeCID() (cid.Cid, error)
|
||||
GetBytecodeHash() ([32]byte, error)
|
||||
}
|
||||
|
@ -49,4 +49,8 @@ type State interface {
|
||||
|
||||
Nonce() (uint64, error)
|
||||
GetState() interface{}
|
||||
|
||||
GetBytecode() ([]byte, error)
|
||||
GetBytecodeCID() (cid.Cid, error)
|
||||
GetBytecodeHash() ([32]byte, error)
|
||||
}
|
||||
|
@ -21,12 +21,12 @@ func load{{.v}}(store adt.Store, root cid.Cid) (State, error) {
|
||||
|
||||
func make{{.v}}(store adt.Store, bytecode cid.Cid) (State, error) {
|
||||
out := state{{.v}}{store: store}
|
||||
s, err := evm{{.v}}.ConstructState(store, bytecode)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
s, err := evm{{.v}}.ConstructState(store, bytecode)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
out.State = *s
|
||||
out.State = *s
|
||||
|
||||
return &out, nil
|
||||
}
|
||||
@ -42,4 +42,26 @@ func (s *state{{.v}}) Nonce() (uint64, error) {
|
||||
|
||||
func (s *state{{.v}}) GetState() interface{} {
|
||||
return &s.State
|
||||
}
|
||||
}
|
||||
|
||||
func (s *state{{.v}}) GetBytecodeCID() (cid.Cid, error) {
|
||||
return s.State.Bytecode, nil
|
||||
}
|
||||
|
||||
func (s *state{{.v}}) GetBytecodeHash() ([32]byte, error) {
|
||||
return s.State.BytecodeHash, nil
|
||||
}
|
||||
|
||||
func (s *state{{.v}}) GetBytecode() ([]byte, error) {
|
||||
bc, err := s.GetBytecodeCID()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
var byteCode abi.CborBytesTransparent
|
||||
if err := s.store.Get(s.store.Context(), bc, &byteCode); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return byteCode, nil
|
||||
}
|
||||
|
23
chain/actors/builtin/evm/v10.go
generated
23
chain/actors/builtin/evm/v10.go
generated
@ -3,6 +3,7 @@ package evm
|
||||
import (
|
||||
"github.com/ipfs/go-cid"
|
||||
|
||||
"github.com/filecoin-project/go-state-types/abi"
|
||||
evm10 "github.com/filecoin-project/go-state-types/builtin/v10/evm"
|
||||
|
||||
"github.com/filecoin-project/lotus/chain/actors/adt"
|
||||
@ -43,3 +44,25 @@ func (s *state10) Nonce() (uint64, error) {
|
||||
func (s *state10) GetState() interface{} {
|
||||
return &s.State
|
||||
}
|
||||
|
||||
func (s *state10) GetBytecodeCID() (cid.Cid, error) {
|
||||
return s.State.Bytecode, nil
|
||||
}
|
||||
|
||||
func (s *state10) GetBytecodeHash() ([32]byte, error) {
|
||||
return s.State.BytecodeHash, nil
|
||||
}
|
||||
|
||||
func (s *state10) GetBytecode() ([]byte, error) {
|
||||
bc, err := s.GetBytecodeCID()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
var byteCode abi.CborBytesTransparent
|
||||
if err := s.store.Get(s.store.Context(), bc, &byteCode); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return byteCode, nil
|
||||
}
|
||||
|
@ -11,12 +11,16 @@ import (
|
||||
"time"
|
||||
|
||||
"github.com/stretchr/testify/require"
|
||||
"golang.org/x/crypto/sha3"
|
||||
|
||||
"github.com/filecoin-project/go-state-types/big"
|
||||
"github.com/filecoin-project/go-state-types/manifest"
|
||||
gstStore "github.com/filecoin-project/go-state-types/store"
|
||||
|
||||
"github.com/filecoin-project/lotus/api"
|
||||
"github.com/filecoin-project/lotus/blockstore"
|
||||
"github.com/filecoin-project/lotus/build"
|
||||
"github.com/filecoin-project/lotus/chain/actors/builtin/evm"
|
||||
"github.com/filecoin-project/lotus/chain/types"
|
||||
"github.com/filecoin-project/lotus/chain/types/ethtypes"
|
||||
"github.com/filecoin-project/lotus/itests/kit"
|
||||
@ -219,4 +223,32 @@ func TestDeployment(t *testing.T) {
|
||||
require.NoError(t, err)
|
||||
|
||||
client.AssertActorType(ctx, contractAddr, "evm")
|
||||
|
||||
// Check bytecode and bytecode hash match.
|
||||
contractAct, err := client.StateGetActor(ctx, contractAddr, types.EmptyTSK)
|
||||
require.NoError(t, err)
|
||||
|
||||
bs := blockstore.NewAPIBlockstore(client)
|
||||
ctxStore := gstStore.WrapBlockStore(ctx, bs)
|
||||
|
||||
evmSt, err := evm.Load(ctxStore, contractAct)
|
||||
require.NoError(t, err)
|
||||
|
||||
byteCodeCid, err := evmSt.GetBytecodeCID()
|
||||
require.NoError(t, err)
|
||||
|
||||
byteCode, err := bs.Get(ctx, byteCodeCid)
|
||||
require.NoError(t, err)
|
||||
|
||||
byteCodeHashChain, err := evmSt.GetBytecodeHash()
|
||||
require.NoError(t, err)
|
||||
|
||||
hasher := sha3.NewLegacyKeccak256()
|
||||
hasher.Write(byteCode.RawData())
|
||||
byteCodeHash := hasher.Sum(nil)
|
||||
require.Equal(t, byteCodeHashChain[:], byteCodeHash)
|
||||
|
||||
byteCodeSt, err := evmSt.GetBytecode()
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, byteCode.RawData(), byteCodeSt)
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user