Commit 53ca600e authored by protolambda's avatar protolambda

op-chain-ops,op-wheel: handle missing account in storage-trie lookup

parent 54db4e96
...@@ -5,6 +5,7 @@ import ( ...@@ -5,6 +5,7 @@ import (
"encoding/binary" "encoding/binary"
"errors" "errors"
"fmt" "fmt"
"github.com/ethereum/go-ethereum/core/types"
"math/big" "math/big"
"github.com/ethereum-optimism/optimism/op-node/rollup/derive" "github.com/ethereum-optimism/optimism/op-node/rollup/derive"
...@@ -181,16 +182,25 @@ func PostCheckUntouchables(udb state.Database, currDB *state.StateDB, prevRoot c ...@@ -181,16 +182,25 @@ func PostCheckUntouchables(udb state.Database, currDB *state.StateDB, prevRoot c
log.Info("checked code hash", "address", addr, "hash", hash) log.Info("checked code hash", "address", addr, "hash", hash)
// Ensure that the current/previous roots match // Ensure that the current/previous roots match
var prevRoot, currRoot common.Hash
prevStorage, err := prevDB.StorageTrie(addr) prevStorage, err := prevDB.StorageTrie(addr)
if err != nil { if err != nil {
return fmt.Errorf("failed to open previous-db storage trie of %s: %w", addr, err) return fmt.Errorf("failed to open previous-db storage trie of %s: %w", addr, err)
} }
if prevStorage == nil {
prevRoot = types.EmptyRootHash
} else {
prevRoot = prevStorage.Hash()
}
currStorage, err := currDB.StorageTrie(addr) currStorage, err := currDB.StorageTrie(addr)
if err != nil { if err != nil {
return fmt.Errorf("failed to open current-db storage trie of %s: %w", addr, err) return fmt.Errorf("failed to open current-db storage trie of %s: %w", addr, err)
} }
prevRoot := prevStorage.Hash() if currStorage == nil {
currRoot := currStorage.Hash() currRoot = types.EmptyRootHash
} else {
currRoot = currStorage.Hash()
}
if prevRoot != currRoot { if prevRoot != currRoot {
return fmt.Errorf("expected storage root for %s to be %s, but got %s", addr, prevRoot, currRoot) return fmt.Errorf("expected storage root for %s to be %s, but got %s", addr, prevRoot, currRoot)
} }
......
...@@ -220,6 +220,9 @@ func BuildL1DeveloperGenesis(config *DeployConfig) (*core.Genesis, error) { ...@@ -220,6 +220,9 @@ func BuildL1DeveloperGenesis(config *DeployConfig) (*core.Genesis, error) {
if err != nil { if err != nil {
return nil, fmt.Errorf("failed to open storage trie of %s: %w", dep.Address, err) return nil, fmt.Errorf("failed to open storage trie of %s: %w", dep.Address, err)
} }
if st == nil {
return nil, fmt.Errorf("missing account %s in state, address: %s", dep.Name, dep.Address)
}
iter := trie.NewIterator(st.NodeIterator(nil)) iter := trie.NewIterator(st.NodeIterator(nil))
depAddr := dep.Address depAddr := dep.Address
......
...@@ -190,6 +190,9 @@ func StorageReadAll(address common.Address, w io.Writer) HeadFn { ...@@ -190,6 +190,9 @@ func StorageReadAll(address common.Address, w io.Writer) HeadFn {
if err != nil { if err != nil {
return fmt.Errorf("failed to open storage trie of addr %s: %w", address, err) return fmt.Errorf("failed to open storage trie of addr %s: %w", address, err)
} }
if storage == nil {
return fmt.Errorf("no storage trie in state for account %s", address)
}
iter := trie.NewIterator(storage.NodeIterator(nil)) iter := trie.NewIterator(storage.NodeIterator(nil))
for iter.Next() { for iter.Next() {
if _, err := fmt.Fprintf(w, "+ %x = %x\n", iter.Key, dbValueToHash(iter.Value)); err != nil { if _, err := fmt.Fprintf(w, "+ %x = %x\n", iter.Key, dbValueToHash(iter.Value)); err != nil {
...@@ -220,10 +223,16 @@ func StorageDiff(out io.Writer, addressA, addressB common.Address) HeadFn { ...@@ -220,10 +223,16 @@ func StorageDiff(out io.Writer, addressA, addressB common.Address) HeadFn {
if err != nil { if err != nil {
return fmt.Errorf("failed to open storage trie of addr A %s: %w", addressA, err) return fmt.Errorf("failed to open storage trie of addr A %s: %w", addressA, err)
} }
if aStorage == nil {
return fmt.Errorf("no storage trie in state for account A %s", addressA)
}
bStorage, err := headState.StorageTrie(addressB) bStorage, err := headState.StorageTrie(addressB)
if err != nil { if err != nil {
return fmt.Errorf("failed to open storage trie of addr B %s: %w", addressB, err) return fmt.Errorf("failed to open storage trie of addr B %s: %w", addressB, err)
} }
if bStorage == nil {
return fmt.Errorf("no storage trie in state for account B %s", addressB)
}
aIter := trie.NewIterator(aStorage.NodeIterator(nil)) aIter := trie.NewIterator(aStorage.NodeIterator(nil))
bIter := trie.NewIterator(bStorage.NodeIterator(nil)) bIter := trie.NewIterator(bStorage.NodeIterator(nil))
hasA := aIter.Next() hasA := aIter.Next()
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment