Skip to content

Commit

Permalink
core/state, tests: remove account reset operation
Browse files Browse the repository at this point in the history
  • Loading branch information
rjl493456442 committed Apr 9, 2024
1 parent c170cc0 commit d68fda5
Show file tree
Hide file tree
Showing 8 changed files with 355 additions and 356 deletions.
137 changes: 105 additions & 32 deletions core/state/journal.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,8 @@
package state

import (
"maps"

"github.com/ethereum/go-ethereum/common"
"github.com/holiman/uint256"
)
Expand All @@ -29,6 +31,9 @@ type journalEntry interface {

// dirtied returns the Ethereum address modified by this journal entry.
dirtied() *common.Address

// copy returns a deep-copied journal entry.
copy() journalEntry
}

// journal contains the list of state modifications applied since the last state
Expand Down Expand Up @@ -83,22 +88,23 @@ func (j *journal) length() int {
return len(j.entries)
}

// copy returns a deep-copied journal.
func (j *journal) copy() *journal {
entries := make([]journalEntry, 0, j.length())
for i := 0; i < j.length(); i++ {
entries = append(entries, j.entries[i].copy())
}
return &journal{
entries: entries,
dirties: maps.Clone(j.dirties),
}
}

type (
// Changes to the account trie.
createObjectChange struct {
account *common.Address
}
resetObjectChange struct {
account *common.Address
prev *stateObject
prevdestruct bool
prevAccount []byte
prevStorage map[common.Hash][]byte

prevAccountOriginExist bool
prevAccountOrigin []byte
prevStorageOrigin map[common.Hash][]byte
}
selfDestructChange struct {
account *common.Address
prev bool // whether account had already self-destructed
Expand Down Expand Up @@ -136,6 +142,7 @@ type (
touchChange struct {
account *common.Address
}

// Changes to the access list
accessListAddAccountChange struct {
address *common.Address
Expand All @@ -145,6 +152,7 @@ type (
slot *common.Hash
}

// Changes to transient storage
transientStorageChange struct {
account *common.Address
key, prevalue common.Hash
Expand All @@ -153,36 +161,18 @@ type (

func (ch createObjectChange) revert(s *StateDB) {
delete(s.stateObjects, *ch.account)
delete(s.stateObjectsDirty, *ch.account)
}

func (ch createObjectChange) dirtied() *common.Address {
return ch.account
}

func (ch resetObjectChange) revert(s *StateDB) {
s.setStateObject(ch.prev)
if !ch.prevdestruct {
delete(s.stateObjectsDestruct, ch.prev.address)
}
if ch.prevAccount != nil {
s.accounts[ch.prev.addrHash] = ch.prevAccount
}
if ch.prevStorage != nil {
s.storages[ch.prev.addrHash] = ch.prevStorage
}
if ch.prevAccountOriginExist {
s.accountsOrigin[ch.prev.address] = ch.prevAccountOrigin
}
if ch.prevStorageOrigin != nil {
s.storagesOrigin[ch.prev.address] = ch.prevStorageOrigin
func (ch createObjectChange) copy() journalEntry {
return createObjectChange{
account: ch.account,
}
}

func (ch resetObjectChange) dirtied() *common.Address {
return ch.account
}

func (ch selfDestructChange) revert(s *StateDB) {
obj := s.getStateObject(*ch.account)
if obj != nil {
Expand All @@ -195,6 +185,14 @@ func (ch selfDestructChange) dirtied() *common.Address {
return ch.account
}

func (ch selfDestructChange) copy() journalEntry {
return selfDestructChange{
account: ch.account,
prev: ch.prev,
prevbalance: new(uint256.Int).Set(ch.prevbalance),
}
}

var ripemd = common.HexToAddress("0000000000000000000000000000000000000003")

func (ch touchChange) revert(s *StateDB) {
Expand All @@ -204,6 +202,12 @@ func (ch touchChange) dirtied() *common.Address {
return ch.account
}

func (ch touchChange) copy() journalEntry {
return touchChange{
account: ch.account,
}
}

func (ch balanceChange) revert(s *StateDB) {
s.getStateObject(*ch.account).setBalance(ch.prev)
}
Expand All @@ -212,6 +216,13 @@ func (ch balanceChange) dirtied() *common.Address {
return ch.account
}

func (ch balanceChange) copy() journalEntry {
return balanceChange{
account: ch.account,
prev: new(uint256.Int).Set(ch.prev),
}
}

func (ch nonceChange) revert(s *StateDB) {
s.getStateObject(*ch.account).setNonce(ch.prev)
}
Expand All @@ -220,6 +231,13 @@ func (ch nonceChange) dirtied() *common.Address {
return ch.account
}

func (ch nonceChange) copy() journalEntry {
return nonceChange{
account: ch.account,
prev: ch.prev,
}
}

func (ch codeChange) revert(s *StateDB) {
s.getStateObject(*ch.account).setCode(common.BytesToHash(ch.prevhash), ch.prevcode)
}
Expand All @@ -228,6 +246,14 @@ func (ch codeChange) dirtied() *common.Address {
return ch.account
}

func (ch codeChange) copy() journalEntry {
return codeChange{
account: ch.account,
prevhash: common.CopyBytes(ch.prevhash),
prevcode: common.CopyBytes(ch.prevcode),
}
}

func (ch storageChange) revert(s *StateDB) {
s.getStateObject(*ch.account).setState(ch.key, ch.prevalue)
}
Expand All @@ -236,6 +262,14 @@ func (ch storageChange) dirtied() *common.Address {
return ch.account
}

func (ch storageChange) copy() journalEntry {
return storageChange{
account: ch.account,
key: ch.key,
prevalue: ch.prevalue,
}
}

func (ch transientStorageChange) revert(s *StateDB) {
s.setTransientState(*ch.account, ch.key, ch.prevalue)
}
Expand All @@ -244,6 +278,14 @@ func (ch transientStorageChange) dirtied() *common.Address {
return nil
}

func (ch transientStorageChange) copy() journalEntry {
return transientStorageChange{
account: ch.account,
key: ch.key,
prevalue: ch.prevalue,
}
}

func (ch refundChange) revert(s *StateDB) {
s.refund = ch.prev
}
Expand All @@ -252,6 +294,12 @@ func (ch refundChange) dirtied() *common.Address {
return nil
}

func (ch refundChange) copy() journalEntry {
return refundChange{
prev: ch.prev,
}
}

func (ch addLogChange) revert(s *StateDB) {
logs := s.logs[ch.txhash]
if len(logs) == 1 {
Expand All @@ -266,6 +314,12 @@ func (ch addLogChange) dirtied() *common.Address {
return nil
}

func (ch addLogChange) copy() journalEntry {
return addLogChange{
txhash: ch.txhash,
}
}

func (ch addPreimageChange) revert(s *StateDB) {
delete(s.preimages, ch.hash)
}
Expand All @@ -274,6 +328,12 @@ func (ch addPreimageChange) dirtied() *common.Address {
return nil
}

func (ch addPreimageChange) copy() journalEntry {
return addPreimageChange{
hash: ch.hash,
}
}

func (ch accessListAddAccountChange) revert(s *StateDB) {
/*
One important invariant here, is that whenever a (addr, slot) is added, if the
Expand All @@ -291,10 +351,23 @@ func (ch accessListAddAccountChange) dirtied() *common.Address {
return nil
}

func (ch accessListAddAccountChange) copy() journalEntry {
return accessListAddAccountChange{
address: ch.address,
}
}

func (ch accessListAddSlotChange) revert(s *StateDB) {
s.accessList.DeleteSlot(*ch.address, *ch.slot)
}

func (ch accessListAddSlotChange) dirtied() *common.Address {
return nil
}

func (ch accessListAddSlotChange) copy() journalEntry {
return accessListAddSlotChange{
address: ch.address,
slot: ch.slot,
}
}
36 changes: 9 additions & 27 deletions core/state/state_object.go
Original file line number Diff line number Diff line change
Expand Up @@ -32,21 +32,8 @@ import (
"github.com/holiman/uint256"
)

type Code []byte

func (c Code) String() string {
return string(c) //strings.Join(Disassemble(c), " ")
}

type Storage map[common.Hash]common.Hash

func (s Storage) String() (str string) {
for key, value := range s {
str += fmt.Sprintf("%X : %X\n", key, value)
}
return
}

func (s Storage) Copy() Storage {
return maps.Clone(s)
}
Expand All @@ -65,8 +52,8 @@ type stateObject struct {
data types.StateAccount // Account data with all mutations applied in the scope of block

// Write caches.
trie Trie // storage trie, which becomes non-nil on first access
code Code // contract bytecode, which gets set when code is loaded
trie Trie // storage trie, which becomes non-nil on first access
code []byte // contract bytecode, which gets set when code is loaded

originStorage Storage // Storage cache of original entries to dedup rewrites
pendingStorage Storage // Storage entries that need to be flushed to disk, at the end of an entire block
Expand All @@ -75,15 +62,10 @@ type stateObject struct {
// Cache flags.
dirtyCode bool // true if the code was updated

// Flag whether the account was marked as self-destructed. The self-destructed account
// is still accessible in the scope of same transaction.
// Flag whether the account was marked as self-destructed. The self-destructed
// account is still accessible in the scope of same transaction.
selfDestructed bool

// Flag whether the account was marked as deleted. A self-destructed account
// or an account that is considered as empty will be marked as deleted at
// the end of transaction and no longer accessible anymore.
deleted bool

// Flag whether the object was created in the current transaction
created bool
}
Expand Down Expand Up @@ -463,12 +445,12 @@ func (s *stateObject) deepCopy(db *StateDB) *stateObject {
obj.trie = db.db.CopyTrie(s.trie)
}
obj.code = s.code
obj.dirtyStorage = s.dirtyStorage.Copy()
obj.originStorage = s.originStorage.Copy()
obj.pendingStorage = s.pendingStorage.Copy()
obj.selfDestructed = s.selfDestructed
obj.dirtyStorage = s.dirtyStorage.Copy()
obj.dirtyCode = s.dirtyCode
obj.deleted = s.deleted
obj.selfDestructed = s.selfDestructed
obj.created = s.created
return obj
}

Expand All @@ -483,7 +465,7 @@ func (s *stateObject) Address() common.Address {

// Code returns the contract code associated with this object, if any.
func (s *stateObject) Code() []byte {
if s.code != nil {
if len(s.code) != 0 {
return s.code
}
if bytes.Equal(s.CodeHash(), types.EmptyCodeHash.Bytes()) {
Expand All @@ -501,7 +483,7 @@ func (s *stateObject) Code() []byte {
// or zero if none. This method is an almost mirror of Code, but uses a cache
// inside the database to avoid loading codes seen recently.
func (s *stateObject) CodeSize() int {
if s.code != nil {
if len(s.code) != 0 {
return len(s.code)
}
if bytes.Equal(s.CodeHash(), types.EmptyCodeHash.Bytes()) {
Expand Down
Loading

0 comments on commit d68fda5

Please sign in to comment.