Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 24 additions & 0 deletions core/state/statedb.go
Original file line number Diff line number Diff line change
Expand Up @@ -217,6 +217,28 @@ func (s *StateDB) IsTxFiltered() bool {
return s.arbExtraData.arbTxFilter
}

func (s *StateDB) AddTouchedAddress(addr common.Address) {
if s.arbExtraData.touchedAddresses == nil {
s.arbExtraData.touchedAddresses = make(map[common.Address]struct{})
}
s.arbExtraData.touchedAddresses[addr] = struct{}{}
}

func (s *StateDB) GetTouchedAddresses() []common.Address {
if s.arbExtraData.touchedAddresses == nil {
return nil
}
addrs := make([]common.Address, 0, len(s.arbExtraData.touchedAddresses))
for addr := range s.arbExtraData.touchedAddresses {
addrs = append(addrs, addr)
}
return addrs
}

func (s *StateDB) ClearTouchedAddresses() {
s.arbExtraData.touchedAddresses = nil
}

// StartPrefetcher initializes a new trie prefetcher to pull in nodes from the
// state trie concurrently while the state is mutated so that when we reach the
// commit phase, most of the needed data is already hot.
Expand Down Expand Up @@ -736,6 +758,7 @@ func (s *StateDB) Copy() *StateDB {
openWasmPages: s.arbExtraData.openWasmPages,
everWasmPages: s.arbExtraData.everWasmPages,
arbTxFilter: s.arbExtraData.arbTxFilter,
touchedAddresses: maps.Clone(s.arbExtraData.touchedAddresses),
},

db: s.db,
Expand Down Expand Up @@ -1107,6 +1130,7 @@ func (s *StateDB) SetTxContext(thash common.Hash, ti int) {
// Arbitrum: clear memory charging state for new tx
s.arbExtraData.openWasmPages = 0
s.arbExtraData.everWasmPages = 0
s.arbExtraData.touchedAddresses = nil
}

func (s *StateDB) clearJournalAndRefund() {
Expand Down
1 change: 1 addition & 0 deletions core/state/statedb_arbitrum.go
Original file line number Diff line number Diff line change
Expand Up @@ -224,6 +224,7 @@ type ArbitrumExtraData struct {
activatedWasms map[common.Hash]ActivatedWasm // newly activated WASMs
recentWasms RecentWasms
arbTxFilter bool
touchedAddresses map[common.Address]struct{}
}

func (s *StateDB) SetArbFinalizer(f func(*ArbitrumExtraData)) {
Expand Down
12 changes: 12 additions & 0 deletions core/state/statedb_hooked.go
Original file line number Diff line number Diff line change
Expand Up @@ -361,6 +361,18 @@ func (s *hookedStateDB) IsTxFiltered() bool {
return s.inner.IsTxFiltered()
}

func (s *hookedStateDB) AddTouchedAddress(addr common.Address) {
s.inner.AddTouchedAddress(addr)
}

func (s *hookedStateDB) GetTouchedAddresses() []common.Address {
return s.inner.GetTouchedAddresses()
}

func (s *hookedStateDB) ClearTouchedAddresses() {
s.inner.ClearTouchedAddresses()
}

func (s *hookedStateDB) Recording() bool {
return s.inner.Recording()
}
Expand Down
2 changes: 2 additions & 0 deletions core/vm/instructions.go
Original file line number Diff line number Diff line change
Expand Up @@ -923,6 +923,7 @@ func opSelfdestruct(pc *uint64, evm *EVM, scope *ScopeContext) ([]byte, error) {
return nil, ErrWriteProtection
}
beneficiary := scope.Stack.pop()
evm.StateDB.AddTouchedAddress(beneficiary.Bytes20())
balance := evm.StateDB.GetBalance(scope.Contract.Address())
evm.StateDB.AddBalance(beneficiary.Bytes20(), balance, tracing.BalanceIncreaseSelfdestruct)
evm.StateDB.SelfDestruct(scope.Contract.Address())
Expand Down Expand Up @@ -953,6 +954,7 @@ func opSelfdestruct6780(pc *uint64, evm *EVM, scope *ScopeContext) ([]byte, erro
}

beneficiary := scope.Stack.pop()
evm.StateDB.AddTouchedAddress(beneficiary.Bytes20())
balance := evm.StateDB.GetBalance(scope.Contract.Address())
evm.StateDB.SubBalance(scope.Contract.Address(), balance, tracing.BalanceDecreaseSelfdestruct)
evm.StateDB.AddBalance(beneficiary.Bytes20(), balance, tracing.BalanceIncreaseSelfdestruct)
Expand Down
5 changes: 5 additions & 0 deletions core/vm/interface.go
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,11 @@ type StateDB interface {
ClearTxFilter()
IsTxFiltered() bool

// Arbitrum
AddTouchedAddress(addr common.Address)
GetTouchedAddresses() []common.Address
ClearTouchedAddresses()

Recording() bool
Deterministic() bool
Database() state.Database
Expand Down
Loading