Skip to content

Commit

Permalink
core/state: fix several hook issues
Browse files Browse the repository at this point in the history
  • Loading branch information
rjl493456442 committed Oct 21, 2024
1 parent 8ca0cd5 commit 21f5a77
Show file tree
Hide file tree
Showing 4 changed files with 20 additions and 22 deletions.
2 changes: 1 addition & 1 deletion core/state/state_object.go
Original file line number Diff line number Diff line change
Expand Up @@ -459,7 +459,7 @@ func (s *stateObject) AddBalance(amount *uint256.Int) uint256.Int {
return s.SetBalance(new(uint256.Int).Add(s.Balance(), amount))
}

// SetBalance sets the balance for the object, and returns the prevous balance
// SetBalance sets the balance for the object, and returns the previous balance.
func (s *stateObject) SetBalance(amount *uint256.Int) uint256.Int {
prev := *s.data.Balance
s.db.journal.balanceChange(s.address, s.data.Balance)
Expand Down
26 changes: 12 additions & 14 deletions core/state/statedb.go
Original file line number Diff line number Diff line change
Expand Up @@ -402,24 +402,22 @@ func (s *StateDB) HasSelfDestructed(addr common.Address) bool {
// AddBalance adds amount to the account associated with addr.
func (s *StateDB) AddBalance(addr common.Address, amount *uint256.Int, reason tracing.BalanceChangeReason) uint256.Int {
stateObject := s.getOrNewStateObject(addr)
if stateObject != nil {
return stateObject.AddBalance(amount)
if stateObject == nil {
return uint256.Int{}
}
return uint256.Int{}
return stateObject.AddBalance(amount)
}

// SubBalance subtracts amount from the account associated with addr.
func (s *StateDB) SubBalance(addr common.Address, amount *uint256.Int, reason tracing.BalanceChangeReason) uint256.Int {
stateObject := s.getOrNewStateObject(addr)
var prev uint256.Int
if amount.IsZero() {
return prev
if stateObject == nil {
return uint256.Int{}
}
if stateObject != nil {
prev = *(stateObject.Balance())
stateObject.SetBalance(new(uint256.Int).Sub(stateObject.Balance(), amount))
if amount.IsZero() {
return *(stateObject.Balance())
}
return prev
return stateObject.SetBalance(new(uint256.Int).Sub(stateObject.Balance(), amount))
}

func (s *StateDB) SetBalance(addr common.Address, amount *uint256.Int, reason tracing.BalanceChangeReason) {
Expand Down Expand Up @@ -505,15 +503,15 @@ func (s *StateDB) SelfDestruct(addr common.Address) uint256.Int {
return prevBalance
}

func (s *StateDB) Selfdestruct6780(addr common.Address) uint256.Int {
func (s *StateDB) Selfdestruct6780(addr common.Address) (uint256.Int, bool) {
stateObject := s.getStateObject(addr)
if stateObject == nil {
return uint256.Int{}
return uint256.Int{}, false
}
if stateObject.newContract {
return s.SelfDestruct(addr)
return s.SelfDestruct(addr), true
}
return *(stateObject.Balance())
return *(stateObject.Balance()), false
}

// SetTransientState sets transient storage for a given account. It
Expand Down
12 changes: 6 additions & 6 deletions core/state/statedb_hooked.go
Original file line number Diff line number Diff line change
Expand Up @@ -159,7 +159,7 @@ func (s *hookedStateDB) Witness() *stateless.Witness {

func (s *hookedStateDB) SubBalance(addr common.Address, amount *uint256.Int, reason tracing.BalanceChangeReason) uint256.Int {
prev := s.inner.SubBalance(addr, amount, reason)
if s.hooks.OnBalanceChange != nil {
if s.hooks.OnBalanceChange != nil && !amount.IsZero() {
newBalance := new(uint256.Int).Sub(&prev, amount)
s.hooks.OnBalanceChange(addr, prev.ToBig(), newBalance.ToBig(), reason)
}
Expand All @@ -168,7 +168,7 @@ func (s *hookedStateDB) SubBalance(addr common.Address, amount *uint256.Int, rea

func (s *hookedStateDB) AddBalance(addr common.Address, amount *uint256.Int, reason tracing.BalanceChangeReason) uint256.Int {
prev := s.inner.AddBalance(addr, amount, reason)
if s.hooks.OnBalanceChange != nil {
if s.hooks.OnBalanceChange != nil && !amount.IsZero() {
newBalance := new(uint256.Int).Add(&prev, amount)
s.hooks.OnBalanceChange(addr, prev.ToBig(), newBalance.ToBig(), reason)
}
Expand Down Expand Up @@ -207,14 +207,14 @@ func (s *hookedStateDB) SelfDestruct(address common.Address) uint256.Int {
return prev
}

func (s *hookedStateDB) Selfdestruct6780(address common.Address) uint256.Int {
prev := s.inner.Selfdestruct6780(address)
if !prev.IsZero() {
func (s *hookedStateDB) Selfdestruct6780(address common.Address) (uint256.Int, bool) {
prev, changed := s.inner.Selfdestruct6780(address)
if !prev.IsZero() && changed {
if s.hooks.OnBalanceChange != nil {
s.hooks.OnBalanceChange(address, prev.ToBig(), new(big.Int), tracing.BalanceDecreaseSelfdestruct)
}
}
return prev
return prev, changed
}

func (s *hookedStateDB) AddLog(log *types.Log) {
Expand Down
2 changes: 1 addition & 1 deletion core/vm/interface.go
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ type StateDB interface {
SelfDestruct(common.Address) uint256.Int
HasSelfDestructed(common.Address) bool

Selfdestruct6780(common.Address) uint256.Int
Selfdestruct6780(common.Address) (uint256.Int, bool)

// Exist reports whether the given account exists in state.
// Notably this should also return true for self-destructed accounts.
Expand Down

0 comments on commit 21f5a77

Please sign in to comment.