github.com/codysnider/go-ethereum@v1.10.18-0.20220420071915-14f4ae99222a/core/state/statedb.go (about)

     1  // Copyright 2014 The go-ethereum Authors
     2  // This file is part of the go-ethereum library.
     3  //
     4  // The go-ethereum library is free software: you can redistribute it and/or modify
     5  // it under the terms of the GNU Lesser General Public License as published by
     6  // the Free Software Foundation, either version 3 of the License, or
     7  // (at your option) any later version.
     8  //
     9  // The go-ethereum library is distributed in the hope that it will be useful,
    10  // but WITHOUT ANY WARRANTY; without even the implied warranty of
    11  // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
    12  // GNU Lesser General Public License for more details.
    13  //
    14  // You should have received a copy of the GNU Lesser General Public License
    15  // along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.
    16  
    17  // Package state provides a caching layer atop the Ethereum state trie.
    18  package state
    19  
    20  import (
    21  	"errors"
    22  	"fmt"
    23  	"math/big"
    24  	"sort"
    25  	"time"
    26  
    27  	"github.com/ethereum/go-ethereum/common"
    28  	"github.com/ethereum/go-ethereum/core/rawdb"
    29  	"github.com/ethereum/go-ethereum/core/state/snapshot"
    30  	"github.com/ethereum/go-ethereum/core/types"
    31  	"github.com/ethereum/go-ethereum/crypto"
    32  	"github.com/ethereum/go-ethereum/log"
    33  	"github.com/ethereum/go-ethereum/metrics"
    34  	"github.com/ethereum/go-ethereum/rlp"
    35  	"github.com/ethereum/go-ethereum/trie"
    36  )
    37  
    38  type revision struct {
    39  	id           int
    40  	journalIndex int
    41  }
    42  
    43  var (
    44  	// emptyRoot is the known root hash of an empty trie.
    45  	emptyRoot = common.HexToHash("56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421")
    46  )
    47  
    48  type proofList [][]byte
    49  
    50  func (n *proofList) Put(key []byte, value []byte) error {
    51  	*n = append(*n, value)
    52  	return nil
    53  }
    54  
    55  func (n *proofList) Delete(key []byte) error {
    56  	panic("not supported")
    57  }
    58  
    59  // StateDB structs within the ethereum protocol are used to store anything
    60  // within the merkle trie. StateDBs take care of caching and storing
    61  // nested states. It's the general query interface to retrieve:
    62  // * Contracts
    63  // * Accounts
    64  type StateDB struct {
    65  	db           Database
    66  	prefetcher   *triePrefetcher
    67  	originalRoot common.Hash // The pre-state root, before any changes were made
    68  	trie         Trie
    69  	hasher       crypto.KeccakState
    70  
    71  	snaps         *snapshot.Tree
    72  	snap          snapshot.Snapshot
    73  	snapDestructs map[common.Hash]struct{}
    74  	snapAccounts  map[common.Hash][]byte
    75  	snapStorage   map[common.Hash]map[common.Hash][]byte
    76  
    77  	// This map holds 'live' objects, which will get modified while processing a state transition.
    78  	stateObjects        map[common.Address]*stateObject
    79  	stateObjectsPending map[common.Address]struct{} // State objects finalized but not yet written to the trie
    80  	stateObjectsDirty   map[common.Address]struct{} // State objects modified in the current execution
    81  
    82  	// DB error.
    83  	// State objects are used by the consensus core and VM which are
    84  	// unable to deal with database-level errors. Any error that occurs
    85  	// during a database read is memoized here and will eventually be returned
    86  	// by StateDB.Commit.
    87  	dbErr error
    88  
    89  	// The refund counter, also used by state transitioning.
    90  	refund uint64
    91  
    92  	thash   common.Hash
    93  	txIndex int
    94  	logs    map[common.Hash][]*types.Log
    95  	logSize uint
    96  
    97  	preimages map[common.Hash][]byte
    98  
    99  	// Per-transaction access list
   100  	accessList *accessList
   101  
   102  	// Journal of state modifications. This is the backbone of
   103  	// Snapshot and RevertToSnapshot.
   104  	journal        *journal
   105  	validRevisions []revision
   106  	nextRevisionId int
   107  
   108  	// Measurements gathered during execution for debugging purposes
   109  	AccountReads         time.Duration
   110  	AccountHashes        time.Duration
   111  	AccountUpdates       time.Duration
   112  	AccountCommits       time.Duration
   113  	StorageReads         time.Duration
   114  	StorageHashes        time.Duration
   115  	StorageUpdates       time.Duration
   116  	StorageCommits       time.Duration
   117  	SnapshotAccountReads time.Duration
   118  	SnapshotStorageReads time.Duration
   119  	SnapshotCommits      time.Duration
   120  
   121  	AccountUpdated int
   122  	StorageUpdated int
   123  	AccountDeleted int
   124  	StorageDeleted int
   125  }
   126  
   127  // New creates a new state from a given trie.
   128  func New(root common.Hash, db Database, snaps *snapshot.Tree) (*StateDB, error) {
   129  	tr, err := db.OpenTrie(root)
   130  	if err != nil {
   131  		return nil, err
   132  	}
   133  	sdb := &StateDB{
   134  		db:                  db,
   135  		trie:                tr,
   136  		originalRoot:        root,
   137  		snaps:               snaps,
   138  		stateObjects:        make(map[common.Address]*stateObject),
   139  		stateObjectsPending: make(map[common.Address]struct{}),
   140  		stateObjectsDirty:   make(map[common.Address]struct{}),
   141  		logs:                make(map[common.Hash][]*types.Log),
   142  		preimages:           make(map[common.Hash][]byte),
   143  		journal:             newJournal(),
   144  		accessList:          newAccessList(),
   145  		hasher:              crypto.NewKeccakState(),
   146  	}
   147  	if sdb.snaps != nil {
   148  		if sdb.snap = sdb.snaps.Snapshot(root); sdb.snap != nil {
   149  			sdb.snapDestructs = make(map[common.Hash]struct{})
   150  			sdb.snapAccounts = make(map[common.Hash][]byte)
   151  			sdb.snapStorage = make(map[common.Hash]map[common.Hash][]byte)
   152  		}
   153  	}
   154  	return sdb, nil
   155  }
   156  
   157  // StartPrefetcher initializes a new trie prefetcher to pull in nodes from the
   158  // state trie concurrently while the state is mutated so that when we reach the
   159  // commit phase, most of the needed data is already hot.
   160  func (s *StateDB) StartPrefetcher(namespace string) {
   161  	if s.prefetcher != nil {
   162  		s.prefetcher.close()
   163  		s.prefetcher = nil
   164  	}
   165  	if s.snap != nil {
   166  		s.prefetcher = newTriePrefetcher(s.db, s.originalRoot, namespace)
   167  	}
   168  }
   169  
   170  // StopPrefetcher terminates a running prefetcher and reports any leftover stats
   171  // from the gathered metrics.
   172  func (s *StateDB) StopPrefetcher() {
   173  	if s.prefetcher != nil {
   174  		s.prefetcher.close()
   175  		s.prefetcher = nil
   176  	}
   177  }
   178  
   179  // setError remembers the first non-nil error it is called with.
   180  func (s *StateDB) setError(err error) {
   181  	if s.dbErr == nil {
   182  		s.dbErr = err
   183  	}
   184  }
   185  
   186  func (s *StateDB) Error() error {
   187  	return s.dbErr
   188  }
   189  
   190  func (s *StateDB) AddLog(log *types.Log) {
   191  	s.journal.append(addLogChange{txhash: s.thash})
   192  
   193  	log.TxHash = s.thash
   194  	log.TxIndex = uint(s.txIndex)
   195  	log.Index = s.logSize
   196  	s.logs[s.thash] = append(s.logs[s.thash], log)
   197  	s.logSize++
   198  }
   199  
   200  func (s *StateDB) GetLogs(hash common.Hash, blockHash common.Hash) []*types.Log {
   201  	logs := s.logs[hash]
   202  	for _, l := range logs {
   203  		l.BlockHash = blockHash
   204  	}
   205  	return logs
   206  }
   207  
   208  func (s *StateDB) Logs() []*types.Log {
   209  	var logs []*types.Log
   210  	for _, lgs := range s.logs {
   211  		logs = append(logs, lgs...)
   212  	}
   213  	return logs
   214  }
   215  
   216  // AddPreimage records a SHA3 preimage seen by the VM.
   217  func (s *StateDB) AddPreimage(hash common.Hash, preimage []byte) {
   218  	if _, ok := s.preimages[hash]; !ok {
   219  		s.journal.append(addPreimageChange{hash: hash})
   220  		pi := make([]byte, len(preimage))
   221  		copy(pi, preimage)
   222  		s.preimages[hash] = pi
   223  	}
   224  }
   225  
   226  // Preimages returns a list of SHA3 preimages that have been submitted.
   227  func (s *StateDB) Preimages() map[common.Hash][]byte {
   228  	return s.preimages
   229  }
   230  
   231  // AddRefund adds gas to the refund counter
   232  func (s *StateDB) AddRefund(gas uint64) {
   233  	s.journal.append(refundChange{prev: s.refund})
   234  	s.refund += gas
   235  }
   236  
   237  // SubRefund removes gas from the refund counter.
   238  // This method will panic if the refund counter goes below zero
   239  func (s *StateDB) SubRefund(gas uint64) {
   240  	s.journal.append(refundChange{prev: s.refund})
   241  	if gas > s.refund {
   242  		panic(fmt.Sprintf("Refund counter below zero (gas: %d > refund: %d)", gas, s.refund))
   243  	}
   244  	s.refund -= gas
   245  }
   246  
   247  // Exist reports whether the given account address exists in the state.
   248  // Notably this also returns true for suicided accounts.
   249  func (s *StateDB) Exist(addr common.Address) bool {
   250  	return s.getStateObject(addr) != nil
   251  }
   252  
   253  // Empty returns whether the state object is either non-existent
   254  // or empty according to the EIP161 specification (balance = nonce = code = 0)
   255  func (s *StateDB) Empty(addr common.Address) bool {
   256  	so := s.getStateObject(addr)
   257  	return so == nil || so.empty()
   258  }
   259  
   260  // GetBalance retrieves the balance from the given address or 0 if object not found
   261  func (s *StateDB) GetBalance(addr common.Address) *big.Int {
   262  	stateObject := s.getStateObject(addr)
   263  	if stateObject != nil {
   264  		return stateObject.Balance()
   265  	}
   266  	return common.Big0
   267  }
   268  
   269  func (s *StateDB) GetNonce(addr common.Address) uint64 {
   270  	stateObject := s.getStateObject(addr)
   271  	if stateObject != nil {
   272  		return stateObject.Nonce()
   273  	}
   274  
   275  	return 0
   276  }
   277  
   278  // TxIndex returns the current transaction index set by Prepare.
   279  func (s *StateDB) TxIndex() int {
   280  	return s.txIndex
   281  }
   282  
   283  func (s *StateDB) GetCode(addr common.Address) []byte {
   284  	stateObject := s.getStateObject(addr)
   285  	if stateObject != nil {
   286  		return stateObject.Code(s.db)
   287  	}
   288  	return nil
   289  }
   290  
   291  func (s *StateDB) GetCodeSize(addr common.Address) int {
   292  	stateObject := s.getStateObject(addr)
   293  	if stateObject != nil {
   294  		return stateObject.CodeSize(s.db)
   295  	}
   296  	return 0
   297  }
   298  
   299  func (s *StateDB) GetCodeHash(addr common.Address) common.Hash {
   300  	stateObject := s.getStateObject(addr)
   301  	if stateObject == nil {
   302  		return common.Hash{}
   303  	}
   304  	return common.BytesToHash(stateObject.CodeHash())
   305  }
   306  
   307  // GetState retrieves a value from the given account's storage trie.
   308  func (s *StateDB) GetState(addr common.Address, hash common.Hash) common.Hash {
   309  	stateObject := s.getStateObject(addr)
   310  	if stateObject != nil {
   311  		return stateObject.GetState(s.db, hash)
   312  	}
   313  	return common.Hash{}
   314  }
   315  
   316  // GetProof returns the Merkle proof for a given account.
   317  func (s *StateDB) GetProof(addr common.Address) ([][]byte, error) {
   318  	return s.GetProofByHash(crypto.Keccak256Hash(addr.Bytes()))
   319  }
   320  
   321  // GetProofByHash returns the Merkle proof for a given account.
   322  func (s *StateDB) GetProofByHash(addrHash common.Hash) ([][]byte, error) {
   323  	var proof proofList
   324  	err := s.trie.Prove(addrHash[:], 0, &proof)
   325  	return proof, err
   326  }
   327  
   328  // GetStorageProof returns the Merkle proof for given storage slot.
   329  func (s *StateDB) GetStorageProof(a common.Address, key common.Hash) ([][]byte, error) {
   330  	var proof proofList
   331  	trie := s.StorageTrie(a)
   332  	if trie == nil {
   333  		return proof, errors.New("storage trie for requested address does not exist")
   334  	}
   335  	err := trie.Prove(crypto.Keccak256(key.Bytes()), 0, &proof)
   336  	return proof, err
   337  }
   338  
   339  // GetCommittedState retrieves a value from the given account's committed storage trie.
   340  func (s *StateDB) GetCommittedState(addr common.Address, hash common.Hash) common.Hash {
   341  	stateObject := s.getStateObject(addr)
   342  	if stateObject != nil {
   343  		return stateObject.GetCommittedState(s.db, hash)
   344  	}
   345  	return common.Hash{}
   346  }
   347  
   348  // Database retrieves the low level database supporting the lower level trie ops.
   349  func (s *StateDB) Database() Database {
   350  	return s.db
   351  }
   352  
   353  // StorageTrie returns the storage trie of an account.
   354  // The return value is a copy and is nil for non-existent accounts.
   355  func (s *StateDB) StorageTrie(addr common.Address) Trie {
   356  	stateObject := s.getStateObject(addr)
   357  	if stateObject == nil {
   358  		return nil
   359  	}
   360  	cpy := stateObject.deepCopy(s)
   361  	cpy.updateTrie(s.db)
   362  	return cpy.getTrie(s.db)
   363  }
   364  
   365  func (s *StateDB) HasSuicided(addr common.Address) bool {
   366  	stateObject := s.getStateObject(addr)
   367  	if stateObject != nil {
   368  		return stateObject.suicided
   369  	}
   370  	return false
   371  }
   372  
   373  /*
   374   * SETTERS
   375   */
   376  
   377  // AddBalance adds amount to the account associated with addr.
   378  func (s *StateDB) AddBalance(addr common.Address, amount *big.Int) {
   379  	stateObject := s.GetOrNewStateObject(addr)
   380  	if stateObject != nil {
   381  		stateObject.AddBalance(amount)
   382  	}
   383  }
   384  
   385  // SubBalance subtracts amount from the account associated with addr.
   386  func (s *StateDB) SubBalance(addr common.Address, amount *big.Int) {
   387  	stateObject := s.GetOrNewStateObject(addr)
   388  	if stateObject != nil {
   389  		stateObject.SubBalance(amount)
   390  	}
   391  }
   392  
   393  func (s *StateDB) SetBalance(addr common.Address, amount *big.Int) {
   394  	stateObject := s.GetOrNewStateObject(addr)
   395  	if stateObject != nil {
   396  		stateObject.SetBalance(amount)
   397  	}
   398  }
   399  
   400  func (s *StateDB) SetNonce(addr common.Address, nonce uint64) {
   401  	stateObject := s.GetOrNewStateObject(addr)
   402  	if stateObject != nil {
   403  		stateObject.SetNonce(nonce)
   404  	}
   405  }
   406  
   407  func (s *StateDB) SetCode(addr common.Address, code []byte) {
   408  	stateObject := s.GetOrNewStateObject(addr)
   409  	if stateObject != nil {
   410  		stateObject.SetCode(crypto.Keccak256Hash(code), code)
   411  	}
   412  }
   413  
   414  func (s *StateDB) SetState(addr common.Address, key, value common.Hash) {
   415  	stateObject := s.GetOrNewStateObject(addr)
   416  	if stateObject != nil {
   417  		stateObject.SetState(s.db, key, value)
   418  	}
   419  }
   420  
   421  // SetStorage replaces the entire storage for the specified account with given
   422  // storage. This function should only be used for debugging.
   423  func (s *StateDB) SetStorage(addr common.Address, storage map[common.Hash]common.Hash) {
   424  	stateObject := s.GetOrNewStateObject(addr)
   425  	if stateObject != nil {
   426  		stateObject.SetStorage(storage)
   427  	}
   428  }
   429  
   430  // Suicide marks the given account as suicided.
   431  // This clears the account balance.
   432  //
   433  // The account's state object is still available until the state is committed,
   434  // getStateObject will return a non-nil account after Suicide.
   435  func (s *StateDB) Suicide(addr common.Address) bool {
   436  	stateObject := s.getStateObject(addr)
   437  	if stateObject == nil {
   438  		return false
   439  	}
   440  	s.journal.append(suicideChange{
   441  		account:     &addr,
   442  		prev:        stateObject.suicided,
   443  		prevbalance: new(big.Int).Set(stateObject.Balance()),
   444  	})
   445  	stateObject.markSuicided()
   446  	stateObject.data.Balance = new(big.Int)
   447  
   448  	return true
   449  }
   450  
   451  //
   452  // Setting, updating & deleting state object methods.
   453  //
   454  
   455  // updateStateObject writes the given object to the trie.
   456  func (s *StateDB) updateStateObject(obj *stateObject) {
   457  	// Track the amount of time wasted on updating the account from the trie
   458  	if metrics.EnabledExpensive {
   459  		defer func(start time.Time) { s.AccountUpdates += time.Since(start) }(time.Now())
   460  	}
   461  	// Encode the account and update the account trie
   462  	addr := obj.Address()
   463  	if err := s.trie.TryUpdateAccount(addr[:], &obj.data); err != nil {
   464  		s.setError(fmt.Errorf("updateStateObject (%x) error: %v", addr[:], err))
   465  	}
   466  
   467  	// If state snapshotting is active, cache the data til commit. Note, this
   468  	// update mechanism is not symmetric to the deletion, because whereas it is
   469  	// enough to track account updates at commit time, deletions need tracking
   470  	// at transaction boundary level to ensure we capture state clearing.
   471  	if s.snap != nil {
   472  		s.snapAccounts[obj.addrHash] = snapshot.SlimAccountRLP(obj.data.Nonce, obj.data.Balance, obj.data.Root, obj.data.CodeHash)
   473  	}
   474  }
   475  
   476  // deleteStateObject removes the given object from the state trie.
   477  func (s *StateDB) deleteStateObject(obj *stateObject) {
   478  	// Track the amount of time wasted on deleting the account from the trie
   479  	if metrics.EnabledExpensive {
   480  		defer func(start time.Time) { s.AccountUpdates += time.Since(start) }(time.Now())
   481  	}
   482  	// Delete the account from the trie
   483  	addr := obj.Address()
   484  	if err := s.trie.TryDelete(addr[:]); err != nil {
   485  		s.setError(fmt.Errorf("deleteStateObject (%x) error: %v", addr[:], err))
   486  	}
   487  }
   488  
   489  // getStateObject retrieves a state object given by the address, returning nil if
   490  // the object is not found or was deleted in this execution context. If you need
   491  // to differentiate between non-existent/just-deleted, use getDeletedStateObject.
   492  func (s *StateDB) getStateObject(addr common.Address) *stateObject {
   493  	if obj := s.getDeletedStateObject(addr); obj != nil && !obj.deleted {
   494  		return obj
   495  	}
   496  	return nil
   497  }
   498  
   499  // getDeletedStateObject is similar to getStateObject, but instead of returning
   500  // nil for a deleted state object, it returns the actual object with the deleted
   501  // flag set. This is needed by the state journal to revert to the correct s-
   502  // destructed object instead of wiping all knowledge about the state object.
   503  func (s *StateDB) getDeletedStateObject(addr common.Address) *stateObject {
   504  	// Prefer live objects if any is available
   505  	if obj := s.stateObjects[addr]; obj != nil {
   506  		return obj
   507  	}
   508  	// If no live objects are available, attempt to use snapshots
   509  	var data *types.StateAccount
   510  	if s.snap != nil {
   511  		start := time.Now()
   512  		acc, err := s.snap.Account(crypto.HashData(s.hasher, addr.Bytes()))
   513  		if metrics.EnabledExpensive {
   514  			s.SnapshotAccountReads += time.Since(start)
   515  		}
   516  		if err == nil {
   517  			if acc == nil {
   518  				return nil
   519  			}
   520  			data = &types.StateAccount{
   521  				Nonce:    acc.Nonce,
   522  				Balance:  acc.Balance,
   523  				CodeHash: acc.CodeHash,
   524  				Root:     common.BytesToHash(acc.Root),
   525  			}
   526  			if len(data.CodeHash) == 0 {
   527  				data.CodeHash = emptyCodeHash
   528  			}
   529  			if data.Root == (common.Hash{}) {
   530  				data.Root = emptyRoot
   531  			}
   532  		}
   533  	}
   534  	// If snapshot unavailable or reading from it failed, load from the database
   535  	if data == nil {
   536  		start := time.Now()
   537  		enc, err := s.trie.TryGet(addr.Bytes())
   538  		if metrics.EnabledExpensive {
   539  			s.AccountReads += time.Since(start)
   540  		}
   541  		if err != nil {
   542  			s.setError(fmt.Errorf("getDeleteStateObject (%x) error: %v", addr.Bytes(), err))
   543  			return nil
   544  		}
   545  		if len(enc) == 0 {
   546  			return nil
   547  		}
   548  		data = new(types.StateAccount)
   549  		if err := rlp.DecodeBytes(enc, data); err != nil {
   550  			log.Error("Failed to decode state object", "addr", addr, "err", err)
   551  			return nil
   552  		}
   553  	}
   554  	// Insert into the live set
   555  	obj := newObject(s, addr, *data)
   556  	s.setStateObject(obj)
   557  	return obj
   558  }
   559  
   560  func (s *StateDB) setStateObject(object *stateObject) {
   561  	s.stateObjects[object.Address()] = object
   562  }
   563  
   564  // GetOrNewStateObject retrieves a state object or create a new state object if nil.
   565  func (s *StateDB) GetOrNewStateObject(addr common.Address) *stateObject {
   566  	stateObject := s.getStateObject(addr)
   567  	if stateObject == nil {
   568  		stateObject, _ = s.createObject(addr)
   569  	}
   570  	return stateObject
   571  }
   572  
   573  // createObject creates a new state object. If there is an existing account with
   574  // the given address, it is overwritten and returned as the second return value.
   575  func (s *StateDB) createObject(addr common.Address) (newobj, prev *stateObject) {
   576  	prev = s.getDeletedStateObject(addr) // Note, prev might have been deleted, we need that!
   577  
   578  	var prevdestruct bool
   579  	if s.snap != nil && prev != nil {
   580  		_, prevdestruct = s.snapDestructs[prev.addrHash]
   581  		if !prevdestruct {
   582  			s.snapDestructs[prev.addrHash] = struct{}{}
   583  		}
   584  	}
   585  	newobj = newObject(s, addr, types.StateAccount{})
   586  	if prev == nil {
   587  		s.journal.append(createObjectChange{account: &addr})
   588  	} else {
   589  		s.journal.append(resetObjectChange{prev: prev, prevdestruct: prevdestruct})
   590  	}
   591  	s.setStateObject(newobj)
   592  	if prev != nil && !prev.deleted {
   593  		return newobj, prev
   594  	}
   595  	return newobj, nil
   596  }
   597  
   598  // CreateAccount explicitly creates a state object. If a state object with the address
   599  // already exists the balance is carried over to the new account.
   600  //
   601  // CreateAccount is called during the EVM CREATE operation. The situation might arise that
   602  // a contract does the following:
   603  //
   604  //   1. sends funds to sha(account ++ (nonce + 1))
   605  //   2. tx_create(sha(account ++ nonce)) (note that this gets the address of 1)
   606  //
   607  // Carrying over the balance ensures that Ether doesn't disappear.
   608  func (s *StateDB) CreateAccount(addr common.Address) {
   609  	newObj, prev := s.createObject(addr)
   610  	if prev != nil {
   611  		newObj.setBalance(prev.data.Balance)
   612  	}
   613  }
   614  
   615  func (db *StateDB) ForEachStorage(addr common.Address, cb func(key, value common.Hash) bool) error {
   616  	so := db.getStateObject(addr)
   617  	if so == nil {
   618  		return nil
   619  	}
   620  	it := trie.NewIterator(so.getTrie(db.db).NodeIterator(nil))
   621  
   622  	for it.Next() {
   623  		key := common.BytesToHash(db.trie.GetKey(it.Key))
   624  		if value, dirty := so.dirtyStorage[key]; dirty {
   625  			if !cb(key, value) {
   626  				return nil
   627  			}
   628  			continue
   629  		}
   630  
   631  		if len(it.Value) > 0 {
   632  			_, content, _, err := rlp.Split(it.Value)
   633  			if err != nil {
   634  				return err
   635  			}
   636  			if !cb(key, common.BytesToHash(content)) {
   637  				return nil
   638  			}
   639  		}
   640  	}
   641  	return nil
   642  }
   643  
   644  // Copy creates a deep, independent copy of the state.
   645  // Snapshots of the copied state cannot be applied to the copy.
   646  func (s *StateDB) Copy() *StateDB {
   647  	// Copy all the basic fields, initialize the memory ones
   648  	state := &StateDB{
   649  		db:                  s.db,
   650  		trie:                s.db.CopyTrie(s.trie),
   651  		stateObjects:        make(map[common.Address]*stateObject, len(s.journal.dirties)),
   652  		stateObjectsPending: make(map[common.Address]struct{}, len(s.stateObjectsPending)),
   653  		stateObjectsDirty:   make(map[common.Address]struct{}, len(s.journal.dirties)),
   654  		refund:              s.refund,
   655  		logs:                make(map[common.Hash][]*types.Log, len(s.logs)),
   656  		logSize:             s.logSize,
   657  		preimages:           make(map[common.Hash][]byte, len(s.preimages)),
   658  		journal:             newJournal(),
   659  		hasher:              crypto.NewKeccakState(),
   660  	}
   661  	// Copy the dirty states, logs, and preimages
   662  	for addr := range s.journal.dirties {
   663  		// As documented [here](https://github.com/ethereum/go-ethereum/pull/16485#issuecomment-380438527),
   664  		// and in the Finalise-method, there is a case where an object is in the journal but not
   665  		// in the stateObjects: OOG after touch on ripeMD prior to Byzantium. Thus, we need to check for
   666  		// nil
   667  		if object, exist := s.stateObjects[addr]; exist {
   668  			// Even though the original object is dirty, we are not copying the journal,
   669  			// so we need to make sure that anyside effect the journal would have caused
   670  			// during a commit (or similar op) is already applied to the copy.
   671  			state.stateObjects[addr] = object.deepCopy(state)
   672  
   673  			state.stateObjectsDirty[addr] = struct{}{}   // Mark the copy dirty to force internal (code/state) commits
   674  			state.stateObjectsPending[addr] = struct{}{} // Mark the copy pending to force external (account) commits
   675  		}
   676  	}
   677  	// Above, we don't copy the actual journal. This means that if the copy is copied, the
   678  	// loop above will be a no-op, since the copy's journal is empty.
   679  	// Thus, here we iterate over stateObjects, to enable copies of copies
   680  	for addr := range s.stateObjectsPending {
   681  		if _, exist := state.stateObjects[addr]; !exist {
   682  			state.stateObjects[addr] = s.stateObjects[addr].deepCopy(state)
   683  		}
   684  		state.stateObjectsPending[addr] = struct{}{}
   685  	}
   686  	for addr := range s.stateObjectsDirty {
   687  		if _, exist := state.stateObjects[addr]; !exist {
   688  			state.stateObjects[addr] = s.stateObjects[addr].deepCopy(state)
   689  		}
   690  		state.stateObjectsDirty[addr] = struct{}{}
   691  	}
   692  	for hash, logs := range s.logs {
   693  		cpy := make([]*types.Log, len(logs))
   694  		for i, l := range logs {
   695  			cpy[i] = new(types.Log)
   696  			*cpy[i] = *l
   697  		}
   698  		state.logs[hash] = cpy
   699  	}
   700  	for hash, preimage := range s.preimages {
   701  		state.preimages[hash] = preimage
   702  	}
   703  	// Do we need to copy the access list? In practice: No. At the start of a
   704  	// transaction, the access list is empty. In practice, we only ever copy state
   705  	// _between_ transactions/blocks, never in the middle of a transaction.
   706  	// However, it doesn't cost us much to copy an empty list, so we do it anyway
   707  	// to not blow up if we ever decide copy it in the middle of a transaction
   708  	state.accessList = s.accessList.Copy()
   709  
   710  	// If there's a prefetcher running, make an inactive copy of it that can
   711  	// only access data but does not actively preload (since the user will not
   712  	// know that they need to explicitly terminate an active copy).
   713  	if s.prefetcher != nil {
   714  		state.prefetcher = s.prefetcher.copy()
   715  	}
   716  	if s.snaps != nil {
   717  		// In order for the miner to be able to use and make additions
   718  		// to the snapshot tree, we need to copy that aswell.
   719  		// Otherwise, any block mined by ourselves will cause gaps in the tree,
   720  		// and force the miner to operate trie-backed only
   721  		state.snaps = s.snaps
   722  		state.snap = s.snap
   723  		// deep copy needed
   724  		state.snapDestructs = make(map[common.Hash]struct{})
   725  		for k, v := range s.snapDestructs {
   726  			state.snapDestructs[k] = v
   727  		}
   728  		state.snapAccounts = make(map[common.Hash][]byte)
   729  		for k, v := range s.snapAccounts {
   730  			state.snapAccounts[k] = v
   731  		}
   732  		state.snapStorage = make(map[common.Hash]map[common.Hash][]byte)
   733  		for k, v := range s.snapStorage {
   734  			temp := make(map[common.Hash][]byte)
   735  			for kk, vv := range v {
   736  				temp[kk] = vv
   737  			}
   738  			state.snapStorage[k] = temp
   739  		}
   740  	}
   741  	return state
   742  }
   743  
   744  // Snapshot returns an identifier for the current revision of the state.
   745  func (s *StateDB) Snapshot() int {
   746  	id := s.nextRevisionId
   747  	s.nextRevisionId++
   748  	s.validRevisions = append(s.validRevisions, revision{id, s.journal.length()})
   749  	return id
   750  }
   751  
   752  // RevertToSnapshot reverts all state changes made since the given revision.
   753  func (s *StateDB) RevertToSnapshot(revid int) {
   754  	// Find the snapshot in the stack of valid snapshots.
   755  	idx := sort.Search(len(s.validRevisions), func(i int) bool {
   756  		return s.validRevisions[i].id >= revid
   757  	})
   758  	if idx == len(s.validRevisions) || s.validRevisions[idx].id != revid {
   759  		panic(fmt.Errorf("revision id %v cannot be reverted", revid))
   760  	}
   761  	snapshot := s.validRevisions[idx].journalIndex
   762  
   763  	// Replay the journal to undo changes and remove invalidated snapshots
   764  	s.journal.revert(s, snapshot)
   765  	s.validRevisions = s.validRevisions[:idx]
   766  }
   767  
   768  // GetRefund returns the current value of the refund counter.
   769  func (s *StateDB) GetRefund() uint64 {
   770  	return s.refund
   771  }
   772  
   773  // Finalise finalises the state by removing the s destructed objects and clears
   774  // the journal as well as the refunds. Finalise, however, will not push any updates
   775  // into the tries just yet. Only IntermediateRoot or Commit will do that.
   776  func (s *StateDB) Finalise(deleteEmptyObjects bool) {
   777  	addressesToPrefetch := make([][]byte, 0, len(s.journal.dirties))
   778  	for addr := range s.journal.dirties {
   779  		obj, exist := s.stateObjects[addr]
   780  		if !exist {
   781  			// ripeMD is 'touched' at block 1714175, in tx 0x1237f737031e40bcde4a8b7e717b2d15e3ecadfe49bb1bbc71ee9deb09c6fcf2
   782  			// That tx goes out of gas, and although the notion of 'touched' does not exist there, the
   783  			// touch-event will still be recorded in the journal. Since ripeMD is a special snowflake,
   784  			// it will persist in the journal even though the journal is reverted. In this special circumstance,
   785  			// it may exist in `s.journal.dirties` but not in `s.stateObjects`.
   786  			// Thus, we can safely ignore it here
   787  			continue
   788  		}
   789  		if obj.suicided || (deleteEmptyObjects && obj.empty()) {
   790  			obj.deleted = true
   791  
   792  			// If state snapshotting is active, also mark the destruction there.
   793  			// Note, we can't do this only at the end of a block because multiple
   794  			// transactions within the same block might self destruct and then
   795  			// ressurrect an account; but the snapshotter needs both events.
   796  			if s.snap != nil {
   797  				s.snapDestructs[obj.addrHash] = struct{}{} // We need to maintain account deletions explicitly (will remain set indefinitely)
   798  				delete(s.snapAccounts, obj.addrHash)       // Clear out any previously updated account data (may be recreated via a ressurrect)
   799  				delete(s.snapStorage, obj.addrHash)        // Clear out any previously updated storage data (may be recreated via a ressurrect)
   800  			}
   801  		} else {
   802  			obj.finalise(true) // Prefetch slots in the background
   803  		}
   804  		s.stateObjectsPending[addr] = struct{}{}
   805  		s.stateObjectsDirty[addr] = struct{}{}
   806  
   807  		// At this point, also ship the address off to the precacher. The precacher
   808  		// will start loading tries, and when the change is eventually committed,
   809  		// the commit-phase will be a lot faster
   810  		addressesToPrefetch = append(addressesToPrefetch, common.CopyBytes(addr[:])) // Copy needed for closure
   811  	}
   812  	if s.prefetcher != nil && len(addressesToPrefetch) > 0 {
   813  		s.prefetcher.prefetch(s.originalRoot, addressesToPrefetch)
   814  	}
   815  	// Invalidate journal because reverting across transactions is not allowed.
   816  	s.clearJournalAndRefund()
   817  }
   818  
   819  // IntermediateRoot computes the current root hash of the state trie.
   820  // It is called in between transactions to get the root hash that
   821  // goes into transaction receipts.
   822  func (s *StateDB) IntermediateRoot(deleteEmptyObjects bool) common.Hash {
   823  	// Finalise all the dirty storage states and write them into the tries
   824  	s.Finalise(deleteEmptyObjects)
   825  
   826  	// If there was a trie prefetcher operating, it gets aborted and irrevocably
   827  	// modified after we start retrieving tries. Remove it from the statedb after
   828  	// this round of use.
   829  	//
   830  	// This is weird pre-byzantium since the first tx runs with a prefetcher and
   831  	// the remainder without, but pre-byzantium even the initial prefetcher is
   832  	// useless, so no sleep lost.
   833  	prefetcher := s.prefetcher
   834  	if s.prefetcher != nil {
   835  		defer func() {
   836  			s.prefetcher.close()
   837  			s.prefetcher = nil
   838  		}()
   839  	}
   840  	// Although naively it makes sense to retrieve the account trie and then do
   841  	// the contract storage and account updates sequentially, that short circuits
   842  	// the account prefetcher. Instead, let's process all the storage updates
   843  	// first, giving the account prefeches just a few more milliseconds of time
   844  	// to pull useful data from disk.
   845  	for addr := range s.stateObjectsPending {
   846  		if obj := s.stateObjects[addr]; !obj.deleted {
   847  			obj.updateRoot(s.db)
   848  		}
   849  	}
   850  	// Now we're about to start to write changes to the trie. The trie is so far
   851  	// _untouched_. We can check with the prefetcher, if it can give us a trie
   852  	// which has the same root, but also has some content loaded into it.
   853  	if prefetcher != nil {
   854  		if trie := prefetcher.trie(s.originalRoot); trie != nil {
   855  			s.trie = trie
   856  		}
   857  	}
   858  	usedAddrs := make([][]byte, 0, len(s.stateObjectsPending))
   859  	for addr := range s.stateObjectsPending {
   860  		if obj := s.stateObjects[addr]; obj.deleted {
   861  			s.deleteStateObject(obj)
   862  			s.AccountDeleted += 1
   863  		} else {
   864  			s.updateStateObject(obj)
   865  			s.AccountUpdated += 1
   866  		}
   867  		usedAddrs = append(usedAddrs, common.CopyBytes(addr[:])) // Copy needed for closure
   868  	}
   869  	if prefetcher != nil {
   870  		prefetcher.used(s.originalRoot, usedAddrs)
   871  	}
   872  	if len(s.stateObjectsPending) > 0 {
   873  		s.stateObjectsPending = make(map[common.Address]struct{})
   874  	}
   875  	// Track the amount of time wasted on hashing the account trie
   876  	if metrics.EnabledExpensive {
   877  		defer func(start time.Time) { s.AccountHashes += time.Since(start) }(time.Now())
   878  	}
   879  	return s.trie.Hash()
   880  }
   881  
   882  // Prepare sets the current transaction hash and index which are
   883  // used when the EVM emits new state logs.
   884  func (s *StateDB) Prepare(thash common.Hash, ti int) {
   885  	s.thash = thash
   886  	s.txIndex = ti
   887  }
   888  
   889  func (s *StateDB) clearJournalAndRefund() {
   890  	if len(s.journal.entries) > 0 {
   891  		s.journal = newJournal()
   892  		s.refund = 0
   893  	}
   894  	s.validRevisions = s.validRevisions[:0] // Snapshots can be created without journal entires
   895  }
   896  
   897  // Commit writes the state to the underlying in-memory trie database.
   898  func (s *StateDB) Commit(deleteEmptyObjects bool) (common.Hash, error) {
   899  	if s.dbErr != nil {
   900  		return common.Hash{}, fmt.Errorf("commit aborted due to earlier error: %v", s.dbErr)
   901  	}
   902  	// Finalize any pending changes and merge everything into the tries
   903  	s.IntermediateRoot(deleteEmptyObjects)
   904  
   905  	// Commit objects to the trie, measuring the elapsed time
   906  	var storageCommitted int
   907  	codeWriter := s.db.TrieDB().DiskDB().NewBatch()
   908  	for addr := range s.stateObjectsDirty {
   909  		if obj := s.stateObjects[addr]; !obj.deleted {
   910  			// Write any contract code associated with the state object
   911  			if obj.code != nil && obj.dirtyCode {
   912  				rawdb.WriteCode(codeWriter, common.BytesToHash(obj.CodeHash()), obj.code)
   913  				obj.dirtyCode = false
   914  			}
   915  			// Write any storage changes in the state object to its storage trie
   916  			committed, err := obj.CommitTrie(s.db)
   917  			if err != nil {
   918  				return common.Hash{}, err
   919  			}
   920  			storageCommitted += committed
   921  		}
   922  	}
   923  	if len(s.stateObjectsDirty) > 0 {
   924  		s.stateObjectsDirty = make(map[common.Address]struct{})
   925  	}
   926  	if codeWriter.ValueSize() > 0 {
   927  		if err := codeWriter.Write(); err != nil {
   928  			log.Crit("Failed to commit dirty codes", "error", err)
   929  		}
   930  	}
   931  	// Write the account trie changes, measuing the amount of wasted time
   932  	var start time.Time
   933  	if metrics.EnabledExpensive {
   934  		start = time.Now()
   935  	}
   936  	// The onleaf func is called _serially_, so we can reuse the same account
   937  	// for unmarshalling every time.
   938  	var account types.StateAccount
   939  	root, accountCommitted, err := s.trie.Commit(func(_ [][]byte, _ []byte, leaf []byte, parent common.Hash) error {
   940  		if err := rlp.DecodeBytes(leaf, &account); err != nil {
   941  			return nil
   942  		}
   943  		if account.Root != emptyRoot {
   944  			s.db.TrieDB().Reference(account.Root, parent)
   945  		}
   946  		return nil
   947  	})
   948  	if err != nil {
   949  		return common.Hash{}, err
   950  	}
   951  	if metrics.EnabledExpensive {
   952  		s.AccountCommits += time.Since(start)
   953  
   954  		accountUpdatedMeter.Mark(int64(s.AccountUpdated))
   955  		storageUpdatedMeter.Mark(int64(s.StorageUpdated))
   956  		accountDeletedMeter.Mark(int64(s.AccountDeleted))
   957  		storageDeletedMeter.Mark(int64(s.StorageDeleted))
   958  		accountCommittedMeter.Mark(int64(accountCommitted))
   959  		storageCommittedMeter.Mark(int64(storageCommitted))
   960  		s.AccountUpdated, s.AccountDeleted = 0, 0
   961  		s.StorageUpdated, s.StorageDeleted = 0, 0
   962  	}
   963  	// If snapshotting is enabled, update the snapshot tree with this new version
   964  	if s.snap != nil {
   965  		if metrics.EnabledExpensive {
   966  			defer func(start time.Time) { s.SnapshotCommits += time.Since(start) }(time.Now())
   967  		}
   968  		// Only update if there's a state transition (skip empty Clique blocks)
   969  		if parent := s.snap.Root(); parent != root {
   970  			if err := s.snaps.Update(root, parent, s.snapDestructs, s.snapAccounts, s.snapStorage); err != nil {
   971  				log.Warn("Failed to update snapshot tree", "from", parent, "to", root, "err", err)
   972  			}
   973  			// Keep 128 diff layers in the memory, persistent layer is 129th.
   974  			// - head layer is paired with HEAD state
   975  			// - head-1 layer is paired with HEAD-1 state
   976  			// - head-127 layer(bottom-most diff layer) is paired with HEAD-127 state
   977  			if err := s.snaps.Cap(root, 128); err != nil {
   978  				log.Warn("Failed to cap snapshot tree", "root", root, "layers", 128, "err", err)
   979  			}
   980  		}
   981  		s.snap, s.snapDestructs, s.snapAccounts, s.snapStorage = nil, nil, nil, nil
   982  	}
   983  	return root, err
   984  }
   985  
   986  // PrepareAccessList handles the preparatory steps for executing a state transition with
   987  // regards to both EIP-2929 and EIP-2930:
   988  //
   989  // - Add sender to access list (2929)
   990  // - Add destination to access list (2929)
   991  // - Add precompiles to access list (2929)
   992  // - Add the contents of the optional tx access list (2930)
   993  //
   994  // This method should only be called if Berlin/2929+2930 is applicable at the current number.
   995  func (s *StateDB) PrepareAccessList(sender common.Address, dst *common.Address, precompiles []common.Address, list types.AccessList) {
   996  	// Clear out any leftover from previous executions
   997  	s.accessList = newAccessList()
   998  
   999  	s.AddAddressToAccessList(sender)
  1000  	if dst != nil {
  1001  		s.AddAddressToAccessList(*dst)
  1002  		// If it's a create-tx, the destination will be added inside evm.create
  1003  	}
  1004  	for _, addr := range precompiles {
  1005  		s.AddAddressToAccessList(addr)
  1006  	}
  1007  	for _, el := range list {
  1008  		s.AddAddressToAccessList(el.Address)
  1009  		for _, key := range el.StorageKeys {
  1010  			s.AddSlotToAccessList(el.Address, key)
  1011  		}
  1012  	}
  1013  }
  1014  
  1015  // AddAddressToAccessList adds the given address to the access list
  1016  func (s *StateDB) AddAddressToAccessList(addr common.Address) {
  1017  	if s.accessList.AddAddress(addr) {
  1018  		s.journal.append(accessListAddAccountChange{&addr})
  1019  	}
  1020  }
  1021  
  1022  // AddSlotToAccessList adds the given (address, slot)-tuple to the access list
  1023  func (s *StateDB) AddSlotToAccessList(addr common.Address, slot common.Hash) {
  1024  	addrMod, slotMod := s.accessList.AddSlot(addr, slot)
  1025  	if addrMod {
  1026  		// In practice, this should not happen, since there is no way to enter the
  1027  		// scope of 'address' without having the 'address' become already added
  1028  		// to the access list (via call-variant, create, etc).
  1029  		// Better safe than sorry, though
  1030  		s.journal.append(accessListAddAccountChange{&addr})
  1031  	}
  1032  	if slotMod {
  1033  		s.journal.append(accessListAddSlotChange{
  1034  			address: &addr,
  1035  			slot:    &slot,
  1036  		})
  1037  	}
  1038  }
  1039  
  1040  // AddressInAccessList returns true if the given address is in the access list.
  1041  func (s *StateDB) AddressInAccessList(addr common.Address) bool {
  1042  	return s.accessList.ContainsAddress(addr)
  1043  }
  1044  
  1045  // SlotInAccessList returns true if the given (address, slot)-tuple is in the access list.
  1046  func (s *StateDB) SlotInAccessList(addr common.Address, slot common.Hash) (addressPresent bool, slotPresent bool) {
  1047  	return s.accessList.Contains(addr, slot)
  1048  }