mirror of
https://github.com/ethereum/go-ethereum.git
synced 2026-08-18 18:02:24 +00:00
eth/tracers: add disableCode/Storage options for prestate
Signed-off-by: jsvisa <delweng@gmail.com>
This commit is contained in:
parent
a5fe7353cf
commit
9456ff2f5b
1 changed files with 34 additions and 19 deletions
|
|
@ -72,7 +72,9 @@ type prestateTracer struct {
|
|||
}
|
||||
|
||||
type prestateTracerConfig struct {
|
||||
DiffMode bool `json:"diffMode"` // If true, this tracer will return state modifications
|
||||
DiffMode bool `json:"diffMode"` // If true, this tracer will return state modifications
|
||||
DisableCode bool `json:"disableCode"` // If true, this tracer will not return the contract code
|
||||
DisableStorage bool `json:"disableStorage"` // If true, this tracer will not return the contract storage
|
||||
}
|
||||
|
||||
func newPrestateTracer(ctx *tracers.Context, cfg json.RawMessage, chainConfig *params.ChainConfig) (*tracers.Tracer, error) {
|
||||
|
|
@ -210,7 +212,6 @@ func (t *prestateTracer) processDiffState() {
|
|||
postAccount := &account{Storage: make(map[common.Hash]common.Hash)}
|
||||
newBalance := t.env.StateDB.GetBalance(addr).ToBig()
|
||||
newNonce := t.env.StateDB.GetNonce(addr)
|
||||
newCode := t.env.StateDB.GetCode(addr)
|
||||
|
||||
if newBalance.Cmp(t.pre[addr].Balance) != 0 {
|
||||
modified = true
|
||||
|
|
@ -220,25 +221,30 @@ func (t *prestateTracer) processDiffState() {
|
|||
modified = true
|
||||
postAccount.Nonce = newNonce
|
||||
}
|
||||
if !bytes.Equal(newCode, t.pre[addr].Code) {
|
||||
modified = true
|
||||
postAccount.Code = newCode
|
||||
if !t.config.DisableCode {
|
||||
newCode := t.env.StateDB.GetCode(addr)
|
||||
if !bytes.Equal(newCode, t.pre[addr].Code) {
|
||||
modified = true
|
||||
postAccount.Code = newCode
|
||||
}
|
||||
}
|
||||
|
||||
for key, val := range state.Storage {
|
||||
// don't include the empty slot
|
||||
if val == (common.Hash{}) {
|
||||
delete(t.pre[addr].Storage, key)
|
||||
}
|
||||
if !t.config.DisableStorage {
|
||||
for key, val := range state.Storage {
|
||||
// don't include the empty slot
|
||||
if val == (common.Hash{}) {
|
||||
delete(t.pre[addr].Storage, key)
|
||||
}
|
||||
|
||||
newVal := t.env.StateDB.GetState(addr, key)
|
||||
if val == newVal {
|
||||
// Omit unchanged slots
|
||||
delete(t.pre[addr].Storage, key)
|
||||
} else {
|
||||
modified = true
|
||||
if newVal != (common.Hash{}) {
|
||||
postAccount.Storage[key] = newVal
|
||||
newVal := t.env.StateDB.GetState(addr, key)
|
||||
if val == newVal {
|
||||
// Omit unchanged slots
|
||||
delete(t.pre[addr].Storage, key)
|
||||
} else {
|
||||
modified = true
|
||||
if newVal != (common.Hash{}) {
|
||||
postAccount.Storage[key] = newVal
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -263,11 +269,17 @@ func (t *prestateTracer) lookupAccount(addr common.Address) {
|
|||
Balance: t.env.StateDB.GetBalance(addr).ToBig(),
|
||||
Nonce: t.env.StateDB.GetNonce(addr),
|
||||
Code: t.env.StateDB.GetCode(addr),
|
||||
Storage: make(map[common.Hash]common.Hash),
|
||||
}
|
||||
if !acc.exists() {
|
||||
acc.empty = true
|
||||
}
|
||||
|
||||
if t.config.DisableCode {
|
||||
acc.Code = nil
|
||||
}
|
||||
if !t.config.DisableStorage {
|
||||
acc.Storage = make(map[common.Hash]common.Hash)
|
||||
}
|
||||
t.pre[addr] = acc
|
||||
}
|
||||
|
||||
|
|
@ -275,6 +287,9 @@ func (t *prestateTracer) lookupAccount(addr common.Address) {
|
|||
// it to the prestate of the given contract. It assumes `lookupAccount`
|
||||
// has been performed on the contract before.
|
||||
func (t *prestateTracer) lookupStorage(addr common.Address, key common.Hash) {
|
||||
if t.config.DisableStorage {
|
||||
return
|
||||
}
|
||||
if _, ok := t.pre[addr].Storage[key]; ok {
|
||||
return
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue