go-ethereum/eth/tracers/logger/logger_trace.go
HAOYUatHZ 05148de519
clean outdated trace fields (#928)
* update eth/tracers/logger/logger_trace.go

* update types

* update `StructLog` logic

* update rollup/tracing/tracing.go
2024-07-26 15:30:15 +08:00

86 lines
2.7 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package logger
import (
"github.com/scroll-tech/go-ethereum/common"
"github.com/scroll-tech/go-ethereum/core/vm"
)
type traceFunc func(l *StructLogger, scope *vm.ScopeContext) error
var (
// OpcodeExecs the map to load opcodes' trace funcs.
OpcodeExecs = map[vm.OpCode][]traceFunc{
vm.CALL: {traceToAddressCode, traceLastNAddressCode(1), traceContractAccount, traceLastNAddressAccount(1)}, // contract account is the caller, stack.nth_last(1) is the callee's address
vm.CALLCODE: {traceToAddressCode, traceLastNAddressCode(1), traceContractAccount, traceLastNAddressAccount(1)}, // contract account is the caller, stack.nth_last(1) is the callee's address
vm.DELEGATECALL: {traceToAddressCode, traceLastNAddressCode(1)},
vm.STATICCALL: {traceToAddressCode, traceLastNAddressCode(1), traceLastNAddressAccount(1)},
vm.SELFDESTRUCT: {traceContractAccount, traceLastNAddressAccount(0)},
vm.SELFBALANCE: {traceContractAccount},
vm.BALANCE: {traceLastNAddressAccount(0)},
vm.EXTCODEHASH: {traceLastNAddressAccount(0)},
vm.EXTCODESIZE: {traceLastNAddressAccount(0)},
vm.EXTCODECOPY: {traceLastNAddressCode(0)},
}
)
// traceToAddressCode gets tx.to addresss code
func traceToAddressCode(l *StructLogger, scope *vm.ScopeContext) error {
if l.env.To == nil {
return nil
}
traceCodeWithAddress(l, *l.env.To)
return nil
}
// traceLastNAddressCode
func traceLastNAddressCode(n int) traceFunc {
return func(l *StructLogger, scope *vm.ScopeContext) error {
stack := scope.Stack
stackData := stack.Data()
stackLen := len(stackData)
if stackLen <= n {
return nil
}
address := common.Address(stackData[stackLen-1-n].Bytes20())
traceCodeWithAddress(l, address)
l.statesAffected[address] = struct{}{}
return nil
}
}
func traceCodeWithAddress(l *StructLogger, address common.Address) {
code := l.env.StateDB.GetCode(address)
keccakCodeHash := l.env.StateDB.GetKeccakCodeHash(address)
poseidonCodeHash := l.env.StateDB.GetPoseidonCodeHash(address)
codeSize := l.env.StateDB.GetCodeSize(address)
l.bytecodes[poseidonCodeHash] = CodeInfo{
codeSize,
keccakCodeHash,
poseidonCodeHash,
code,
}
}
// traceContractAccount gets the contract's account
func traceContractAccount(l *StructLogger, scope *vm.ScopeContext) error {
l.statesAffected[scope.Contract.Address()] = struct{}{}
return nil
}
// traceLastNAddressAccount returns func about the last N's address account.
func traceLastNAddressAccount(n int) traceFunc {
return func(l *StructLogger, scope *vm.ScopeContext) error {
stack := scope.Stack
stackData := stack.Data()
stackLen := len(stackData)
if stackLen <= n {
return nil
}
address := common.Address(stackData[stackLen-1-n].Bytes20())
l.statesAffected[address] = struct{}{}
return nil
}
}