diff --git a/cmd/utils/cmd.go b/cmd/utils/cmd.go index 092401ef86c8..9635e1b92720 100644 --- a/cmd/utils/cmd.go +++ b/cmd/utils/cmd.go @@ -193,10 +193,14 @@ func ImportChain(chain *core.BlockChain, fn string) error { } i := 0 for ; i < importBatchSize; i++ { + if i == 1907 { + break + } var b types.Block - if err := stream.Decode(&b); err == io.EOF { + if err := stream.Decode(&b); errors.Is(err, io.EOF) { break } else if err != nil { + fmt.Println(batch, i) return fmt.Errorf("at block %d: %v", n, err) } // don't import first block diff --git a/core/state_processor.go b/core/state_processor.go index a4aa17758802..fce022ca801a 100644 --- a/core/state_processor.go +++ b/core/state_processor.go @@ -289,7 +289,7 @@ func ApplyTransaction(config *params.ChainConfig, bc ChainContext, author *commo } // Create a new context to be used in the EVM environment blockContext := NewEVMBlockContext(header, bc, author) - istarget := blockContext.BlockNumber.Uint64() == 17366216 + istarget := blockContext.BlockNumber.Uint64() == 17165311 if istarget { tracer := logger.NewStructLogger(&logger.Config{ Debug: istarget, diff --git a/trie/transition.go b/trie/transition.go index 87242fa416b5..8798aa822dda 100644 --- a/trie/transition.go +++ b/trie/transition.go @@ -123,12 +123,20 @@ func (t *TransitionTrie) UpdateAccount(addr common.Address, account *types.State // Delete removes any existing value for key from the trie. If a node was not // found in the database, a trie.MissingNodeError is returned. func (t *TransitionTrie) DeleteStorage(addr common.Address, key []byte) error { - return t.overlay.DeleteStorage(addr, key) + err := t.overlay.DeleteStorage(addr, key) + if err != nil { + return err + } + return t.base.DeleteStorage(addr, key) } // DeleteAccount abstracts an account deletion from the trie. func (t *TransitionTrie) DeleteAccount(key common.Address) error { - return t.overlay.DeleteAccount(key) + err := t.overlay.DeleteAccount(key) + if err != nil { + return err + } + return t.base.DeleteAccount(key) } // Hash returns the root hash of the trie. It does not write to the database and diff --git a/trie/verkle.go b/trie/verkle.go index f63cb0e89524..34e17dd7830c 100644 --- a/trie/verkle.go +++ b/trie/verkle.go @@ -204,23 +204,17 @@ func (trie *VerkleTrie) UpdateStorage(address common.Address, key, value []byte) } func (t *VerkleTrie) DeleteAccount(addr common.Address) error { - var ( - err error - values = make([][]byte, verkle.NodeWidth) - stem = t.pointCache.GetTreeKeyVersionCached(addr[:]) - ) - - for i := 0; i < verkle.NodeWidth; i++ { - values[i] = zero[:] - } - switch root := t.root.(type) { - case *verkle.InternalNode: - err = root.InsertValuesAtStem(stem, values, t.FlatdbNodeResolver) - default: - return errInvalidRootType - } - if err != nil { - return fmt.Errorf("DeleteAccount (%x) error: %v", addr, err) + var key = t.pointCache.GetTreeKeyVersionCached(addr[:]) + + // XXX this only deletes the header account, but for completeness, + // we need to delete everything. This is only a problem pre-cancun + // which unfortunately we are still stuck at. + // NOTE we should also return immediately if we are post-transition. + for i := 0; i < 256; i++ { + key[31] = byte(i) + if root, err := t.root.(*verkle.InternalNode).Delete(key, t.FlatdbNodeResolver); root || err != nil { + return fmt.Errorf("error deleting key %x: %w", err) + } } return nil } @@ -230,8 +224,11 @@ func (t *VerkleTrie) DeleteAccount(addr common.Address) error { func (trie *VerkleTrie) DeleteStorage(addr common.Address, key []byte) error { pointEval := trie.pointCache.GetTreeKeyHeader(addr[:]) k := utils.GetTreeKeyStorageSlotWithEvaluatedAddress(pointEval, key) - var zero [32]byte - return trie.root.Insert(k, zero[:], trie.FlatdbNodeResolver) + deleteRoot, err := trie.root.Delete(k, trie.FlatdbNodeResolver) + if deleteRoot { + return errors.New("trying to delete the root node, that should never happen") + } + return err } // Hash returns the root hash of the trie. It does not write to the database and