mirror of
https://github.com/ethereum/go-ethereum.git
synced 2026-08-19 10:22:23 +00:00
* update eth/tracers/logger/logger_trace.go * update types * update `StructLog` logic * update rollup/tracing/tracing.go
86 lines
2.7 KiB
Go
86 lines
2.7 KiB
Go
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 address’s 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
|
||
}
|
||
}
|