-
Notifications
You must be signed in to change notification settings - Fork 37
/
invariants.go
38 lines (29 loc) · 1.18 KB
/
invariants.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
package evm
import (
"bytes"
"github.com/filecoin-project/go-state-types/abi"
"github.com/filecoin-project/go-state-types/builtin"
"github.com/filecoin-project/go-state-types/builtin/v11/util/adt"
"github.com/ipfs/go-cid"
"golang.org/x/crypto/sha3"
"golang.org/x/xerrors"
)
// Checks internal invariants of evm state.
func CheckStateInvariants(st *State, store adt.Store) *builtin.MessageAccumulator {
acc := &builtin.MessageAccumulator{}
acc.Require(st.Nonce > 0, "EVM actor state nonce needs to be greater than 0")
byteCode, err := getBytecode(st.Bytecode, store)
acc.RequireNoError(err, "Unable to retrieve bytecode")
hasher := sha3.NewLegacyKeccak256()
hasher.Write(byteCode)
byteCodeHash := hasher.Sum(nil)
acc.Require(bytes.Equal(byteCodeHash, st.BytecodeHash[:]), "Bytecode hash doesn't match bytecode cid, bytecode_hash: %x hash from bytecode cid: %x", st.BytecodeHash, byteCodeHash)
return acc
}
func getBytecode(byteCodeCid cid.Cid, store adt.Store) ([]byte, error) {
var bytecode abi.CborBytesTransparent
if err := store.Get(store.Context(), byteCodeCid, &bytecode); err != nil {
return nil, xerrors.Errorf("failed to get bytecode %w", err)
}
return bytecode, nil
}