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 }