rename scopeContext to opContext

This commit is contained in:
Sina Mahmoodi 2024-02-29 15:13:03 +01:00
parent 507c072b3b
commit f358e57490
12 changed files with 53 additions and 51 deletions

View file

@ -25,13 +25,15 @@ import (
"github.com/holiman/uint256" "github.com/holiman/uint256"
) )
type ScopeContext interface { // OpContext provides the context at which the opcode is being
GetMemoryData() []byte // executed in, including the memory, stack and various contract-level information.
GetStackData() []uint256.Int type OpContext interface {
GetCaller() common.Address MemoryData() []byte
GetAddress() common.Address StackData() []uint256.Int
GetCallValue() *uint256.Int Caller() common.Address
GetCallInput() []byte Address() common.Address
CallValue() *uint256.Int
CallInput() []byte
} }
type StateDB interface { type StateDB interface {
@ -98,8 +100,8 @@ type Hooks struct {
// be indicated by `reverted == false` and `err == ErrCodeStoreOutOfGas`. // be indicated by `reverted == false` and `err == ErrCodeStoreOutOfGas`.
CaptureExit func(output []byte, gasUsed uint64, err error, reverted bool) CaptureExit func(output []byte, gasUsed uint64, err error, reverted bool)
// Opcode level // Opcode level
CaptureState func(pc uint64, op OpCode, gas, cost uint64, scope ScopeContext, rData []byte, depth int, err error) CaptureState func(pc uint64, op OpCode, gas, cost uint64, scope OpContext, rData []byte, depth int, err error)
CaptureFault func(pc uint64, op OpCode, gas, cost uint64, scope ScopeContext, depth int, err error) CaptureFault func(pc uint64, op OpCode, gas, cost uint64, scope OpContext, depth int, err error)
CaptureKeccakPreimage func(hash common.Hash, data []byte) CaptureKeccakPreimage func(hash common.Hash, data []byte)
// Misc // Misc
OnGasChange func(old, new uint64, reason GasChangeReason) OnGasChange func(old, new uint64, reason GasChangeReason)

View file

@ -41,33 +41,33 @@ type ScopeContext struct {
Contract *Contract Contract *Contract
} }
func (ctx *ScopeContext) GetMemoryData() []byte { func (ctx *ScopeContext) MemoryData() []byte {
if ctx.Memory == nil { if ctx.Memory == nil {
return nil return nil
} }
return ctx.Memory.Data() return ctx.Memory.Data()
} }
func (ctx *ScopeContext) GetStackData() []uint256.Int { func (ctx *ScopeContext) StackData() []uint256.Int {
if ctx.Stack == nil { if ctx.Stack == nil {
return nil return nil
} }
return ctx.Stack.Data() return ctx.Stack.Data()
} }
func (ctx *ScopeContext) GetCaller() common.Address { func (ctx *ScopeContext) Caller() common.Address {
return ctx.Contract.Caller() return ctx.Contract.Caller()
} }
func (ctx *ScopeContext) GetAddress() common.Address { func (ctx *ScopeContext) Address() common.Address {
return ctx.Contract.Address() return ctx.Contract.Address()
} }
func (ctx *ScopeContext) GetCallValue() *uint256.Int { func (ctx *ScopeContext) CallValue() *uint256.Int {
return ctx.Contract.Value() return ctx.Contract.Value()
} }
func (ctx *ScopeContext) GetCallInput() []byte { func (ctx *ScopeContext) CallInput() []byte {
return ctx.Contract.Input return ctx.Contract.Input
} }

View file

@ -68,11 +68,11 @@ func (t *NoopTracer) CaptureEnd(output []byte, gasUsed uint64, err error, revert
} }
// CaptureState implements the EVMLogger interface to trace a single step of VM execution. // CaptureState implements the EVMLogger interface to trace a single step of VM execution.
func (t *NoopTracer) CaptureState(pc uint64, op tracing.OpCode, gas, cost uint64, scope tracing.ScopeContext, rData []byte, depth int, err error) { func (t *NoopTracer) CaptureState(pc uint64, op tracing.OpCode, gas, cost uint64, scope tracing.OpContext, rData []byte, depth int, err error) {
} }
// CaptureFault implements the EVMLogger interface to trace an execution fault. // CaptureFault implements the EVMLogger interface to trace an execution fault.
func (t *NoopTracer) CaptureFault(pc uint64, op tracing.OpCode, gas, cost uint64, _ tracing.ScopeContext, depth int, err error) { func (t *NoopTracer) CaptureFault(pc uint64, op tracing.OpCode, gas, cost uint64, _ tracing.OpContext, depth int, err error) {
} }
// CaptureKeccakPreimage is called during the KECCAK256 opcode. // CaptureKeccakPreimage is called during the KECCAK256 opcode.

View file

@ -310,7 +310,7 @@ func (t *jsTracer) CaptureStart(from common.Address, to common.Address, create b
} }
// CaptureState implements the Tracer interface to trace a single step of VM execution. // CaptureState implements the Tracer interface to trace a single step of VM execution.
func (t *jsTracer) CaptureState(pc uint64, op tracing.OpCode, gas, cost uint64, scope tracing.ScopeContext, rData []byte, depth int, err error) { func (t *jsTracer) CaptureState(pc uint64, op tracing.OpCode, gas, cost uint64, scope tracing.OpContext, rData []byte, depth int, err error) {
if !t.traceStep { if !t.traceStep {
return return
} }
@ -320,8 +320,8 @@ func (t *jsTracer) CaptureState(pc uint64, op tracing.OpCode, gas, cost uint64,
log := t.log log := t.log
log.op.op = vm.OpCode(op) log.op.op = vm.OpCode(op)
log.memory.memory = scope.GetMemoryData() log.memory.memory = scope.MemoryData()
log.stack.stack = scope.GetStackData() log.stack.stack = scope.StackData()
log.contract.scope = scope log.contract.scope = scope
log.pc = pc log.pc = pc
log.gas = gas log.gas = gas
@ -335,7 +335,7 @@ func (t *jsTracer) CaptureState(pc uint64, op tracing.OpCode, gas, cost uint64,
} }
// CaptureFault implements the Tracer interface to trace an execution fault // CaptureFault implements the Tracer interface to trace an execution fault
func (t *jsTracer) CaptureFault(pc uint64, op tracing.OpCode, gas, cost uint64, scope tracing.ScopeContext, depth int, err error) { func (t *jsTracer) CaptureFault(pc uint64, op tracing.OpCode, gas, cost uint64, scope tracing.OpContext, depth int, err error) {
if t.err != nil { if t.err != nil {
return return
} }
@ -805,14 +805,14 @@ func (do *dbObj) setupObject() *goja.Object {
} }
type contractObj struct { type contractObj struct {
scope tracing.ScopeContext scope tracing.OpContext
vm *goja.Runtime vm *goja.Runtime
toBig toBigFn toBig toBigFn
toBuf toBufFn toBuf toBufFn
} }
func (co *contractObj) GetCaller() goja.Value { func (co *contractObj) GetCaller() goja.Value {
caller := co.scope.GetCaller().Bytes() caller := co.scope.Caller().Bytes()
res, err := co.toBuf(co.vm, caller) res, err := co.toBuf(co.vm, caller)
if err != nil { if err != nil {
co.vm.Interrupt(err) co.vm.Interrupt(err)
@ -822,7 +822,7 @@ func (co *contractObj) GetCaller() goja.Value {
} }
func (co *contractObj) GetAddress() goja.Value { func (co *contractObj) GetAddress() goja.Value {
addr := co.scope.GetAddress().Bytes() addr := co.scope.Address().Bytes()
res, err := co.toBuf(co.vm, addr) res, err := co.toBuf(co.vm, addr)
if err != nil { if err != nil {
co.vm.Interrupt(err) co.vm.Interrupt(err)
@ -832,7 +832,7 @@ func (co *contractObj) GetAddress() goja.Value {
} }
func (co *contractObj) GetValue() goja.Value { func (co *contractObj) GetValue() goja.Value {
value := co.scope.GetCallValue() value := co.scope.CallValue()
res, err := co.toBig(co.vm, value.String()) res, err := co.toBig(co.vm, value.String())
if err != nil { if err != nil {
co.vm.Interrupt(err) co.vm.Interrupt(err)
@ -842,7 +842,7 @@ func (co *contractObj) GetValue() goja.Value {
} }
func (co *contractObj) GetInput() goja.Value { func (co *contractObj) GetInput() goja.Value {
input := common.CopyBytes(co.scope.GetCallInput()) input := common.CopyBytes(co.scope.CallInput())
res, err := co.toBuf(co.vm, input) res, err := co.toBuf(co.vm, input)
if err != nil { if err != nil {
co.vm.Interrupt(err) co.vm.Interrupt(err)

View file

@ -56,11 +56,11 @@ func (t *noop) CaptureEnd(output []byte, gasUsed uint64, err error, reverted boo
} }
// CaptureState implements the EVMLogger interface to trace a single step of VM execution. // CaptureState implements the EVMLogger interface to trace a single step of VM execution.
func (t *noop) CaptureState(pc uint64, op tracing.OpCode, gas, cost uint64, scope tracing.ScopeContext, rData []byte, depth int, err error) { func (t *noop) CaptureState(pc uint64, op tracing.OpCode, gas, cost uint64, scope tracing.OpContext, rData []byte, depth int, err error) {
} }
// CaptureFault implements the EVMLogger interface to trace an execution fault. // CaptureFault implements the EVMLogger interface to trace an execution fault.
func (t *noop) CaptureFault(pc uint64, op tracing.OpCode, gas, cost uint64, _ tracing.ScopeContext, depth int, err error) { func (t *noop) CaptureFault(pc uint64, op tracing.OpCode, gas, cost uint64, _ tracing.OpContext, depth int, err error) {
} }
// CaptureKeccakPreimage is called during the KECCAK256 opcode. // CaptureKeccakPreimage is called during the KECCAK256 opcode.

View file

@ -140,13 +140,13 @@ func (a *AccessListTracer) Hooks() *tracing.Hooks {
} }
// CaptureState captures all opcodes that touch storage or addresses and adds them to the accesslist. // CaptureState captures all opcodes that touch storage or addresses and adds them to the accesslist.
func (a *AccessListTracer) CaptureState(pc uint64, opcode tracing.OpCode, gas, cost uint64, scope tracing.ScopeContext, rData []byte, depth int, err error) { func (a *AccessListTracer) CaptureState(pc uint64, opcode tracing.OpCode, gas, cost uint64, scope tracing.OpContext, rData []byte, depth int, err error) {
stackData := scope.GetStackData() stackData := scope.StackData()
stackLen := len(stackData) stackLen := len(stackData)
op := vm.OpCode(opcode) op := vm.OpCode(opcode)
if (op == vm.SLOAD || op == vm.SSTORE) && stackLen >= 1 { if (op == vm.SLOAD || op == vm.SSTORE) && stackLen >= 1 {
slot := common.Hash(stackData[stackLen-1].Bytes32()) slot := common.Hash(stackData[stackLen-1].Bytes32())
a.list.addSlot(scope.GetAddress(), slot) a.list.addSlot(scope.Address(), slot)
} }
if (op == vm.EXTCODECOPY || op == vm.EXTCODEHASH || op == vm.EXTCODESIZE || op == vm.BALANCE || op == vm.SELFDESTRUCT) && stackLen >= 1 { if (op == vm.EXTCODECOPY || op == vm.EXTCODEHASH || op == vm.EXTCODESIZE || op == vm.BALANCE || op == vm.SELFDESTRUCT) && stackLen >= 1 {
addr := common.Address(stackData[stackLen-1].Bytes20()) addr := common.Address(stackData[stackLen-1].Bytes20())

View file

@ -162,7 +162,7 @@ func (l *StructLogger) Reset() {
// CaptureState logs a new structured log message and pushes it out to the environment // CaptureState logs a new structured log message and pushes it out to the environment
// //
// CaptureState also tracks SLOAD/SSTORE ops to track storage change. // CaptureState also tracks SLOAD/SSTORE ops to track storage change.
func (l *StructLogger) CaptureState(pc uint64, opcode tracing.OpCode, gas, cost uint64, scope tracing.ScopeContext, rData []byte, depth int, err error) { func (l *StructLogger) CaptureState(pc uint64, opcode tracing.OpCode, gas, cost uint64, scope tracing.OpContext, rData []byte, depth int, err error) {
// If tracing was interrupted, set the error and stop // If tracing was interrupted, set the error and stop
if l.interrupt.Load() { if l.interrupt.Load() {
return return
@ -173,8 +173,8 @@ func (l *StructLogger) CaptureState(pc uint64, opcode tracing.OpCode, gas, cost
} }
op := vm.OpCode(opcode) op := vm.OpCode(opcode)
memory := scope.GetMemoryData() memory := scope.MemoryData()
stack := scope.GetStackData() stack := scope.StackData()
// Copy a snapshot of the current memory state to a new buffer // Copy a snapshot of the current memory state to a new buffer
var mem []byte var mem []byte
if l.cfg.EnableMemory { if l.cfg.EnableMemory {
@ -189,7 +189,7 @@ func (l *StructLogger) CaptureState(pc uint64, opcode tracing.OpCode, gas, cost
stck[i] = item stck[i] = item
} }
} }
contractAddr := scope.GetAddress() contractAddr := scope.Address()
stackLen := len(stack) stackLen := len(stack)
// Copy a snapshot of the current storage to a new container // Copy a snapshot of the current storage to a new container
var storage Storage var storage Storage
@ -385,8 +385,8 @@ func (t *mdLogger) CaptureStart(from common.Address, to common.Address, create b
} }
// CaptureState also tracks SLOAD/SSTORE ops to track storage change. // CaptureState also tracks SLOAD/SSTORE ops to track storage change.
func (t *mdLogger) CaptureState(pc uint64, op tracing.OpCode, gas, cost uint64, scope tracing.ScopeContext, rData []byte, depth int, err error) { func (t *mdLogger) CaptureState(pc uint64, op tracing.OpCode, gas, cost uint64, scope tracing.OpContext, rData []byte, depth int, err error) {
stack := scope.GetStackData() stack := scope.StackData()
fmt.Fprintf(t.out, "| %4d | %10v | %3d |", pc, op, cost) fmt.Fprintf(t.out, "| %4d | %10v | %3d |", pc, op, cost)
if !t.cfg.DisableStack { if !t.cfg.DisableStack {
@ -405,7 +405,7 @@ func (t *mdLogger) CaptureState(pc uint64, op tracing.OpCode, gas, cost uint64,
} }
} }
func (t *mdLogger) CaptureFault(pc uint64, op tracing.OpCode, gas, cost uint64, scope tracing.ScopeContext, depth int, err error) { func (t *mdLogger) CaptureFault(pc uint64, op tracing.OpCode, gas, cost uint64, scope tracing.OpContext, depth int, err error) {
fmt.Fprintf(t.out, "\nError: at pc=%d, op=%v: %v\n", pc, op, err) fmt.Fprintf(t.out, "\nError: at pc=%d, op=%v: %v\n", pc, op, err)
} }

View file

@ -54,15 +54,15 @@ func (l *JSONLogger) Hooks() *tracing.Hooks {
} }
} }
func (l *JSONLogger) CaptureFault(pc uint64, op tracing.OpCode, gas uint64, cost uint64, scope tracing.ScopeContext, depth int, err error) { func (l *JSONLogger) CaptureFault(pc uint64, op tracing.OpCode, gas uint64, cost uint64, scope tracing.OpContext, depth int, err error) {
// TODO: Add rData to this interface as well // TODO: Add rData to this interface as well
l.CaptureState(pc, op, gas, cost, scope, nil, depth, err) l.CaptureState(pc, op, gas, cost, scope, nil, depth, err)
} }
// CaptureState outputs state information on the logger. // CaptureState outputs state information on the logger.
func (l *JSONLogger) CaptureState(pc uint64, op tracing.OpCode, gas, cost uint64, scope tracing.ScopeContext, rData []byte, depth int, err error) { func (l *JSONLogger) CaptureState(pc uint64, op tracing.OpCode, gas, cost uint64, scope tracing.OpContext, rData []byte, depth int, err error) {
memory := scope.GetMemoryData() memory := scope.MemoryData()
stack := scope.GetStackData() stack := scope.StackData()
log := StructLog{ log := StructLog{
Pc: pc, Pc: pc,

View file

@ -176,7 +176,7 @@ func (t *callTracer) CaptureEnd(output []byte, gasUsed uint64, err error, revert
} }
// CaptureState implements the EVMLogger interface to trace a single step of VM execution. // CaptureState implements the EVMLogger interface to trace a single step of VM execution.
func (t *callTracer) CaptureState(pc uint64, op tracing.OpCode, gas, cost uint64, scope tracing.ScopeContext, rData []byte, depth int, err error) { func (t *callTracer) CaptureState(pc uint64, op tracing.OpCode, gas, cost uint64, scope tracing.OpContext, rData []byte, depth int, err error) {
} }
// CaptureEnter is called when EVM enters a new scope (via call, create or selfdestruct). // CaptureEnter is called when EVM enters a new scope (via call, create or selfdestruct).

View file

@ -167,12 +167,12 @@ func (t *flatCallTracer) CaptureEnd(output []byte, gasUsed uint64, err error, re
} }
// CaptureState implements the EVMLogger interface to trace a single step of VM execution. // CaptureState implements the EVMLogger interface to trace a single step of VM execution.
func (t *flatCallTracer) CaptureState(pc uint64, op tracing.OpCode, gas, cost uint64, scope tracing.ScopeContext, rData []byte, depth int, err error) { func (t *flatCallTracer) CaptureState(pc uint64, op tracing.OpCode, gas, cost uint64, scope tracing.OpContext, rData []byte, depth int, err error) {
t.tracer.CaptureState(pc, op, gas, cost, scope, rData, depth, err) t.tracer.CaptureState(pc, op, gas, cost, scope, rData, depth, err)
} }
// CaptureFault implements the EVMLogger interface to trace an execution fault. // CaptureFault implements the EVMLogger interface to trace an execution fault.
func (t *flatCallTracer) CaptureFault(pc uint64, op tracing.OpCode, gas, cost uint64, scope tracing.ScopeContext, depth int, err error) { func (t *flatCallTracer) CaptureFault(pc uint64, op tracing.OpCode, gas, cost uint64, scope tracing.OpContext, depth int, err error) {
t.tracer.CaptureFault(pc, op, gas, cost, scope, depth, err) t.tracer.CaptureFault(pc, op, gas, cost, scope, depth, err)
} }

View file

@ -99,7 +99,7 @@ func (t *muxTracer) CaptureEnd(output []byte, gasUsed uint64, err error, reverte
} }
// CaptureState implements the EVMLogger interface to trace a single step of VM execution. // CaptureState implements the EVMLogger interface to trace a single step of VM execution.
func (t *muxTracer) CaptureState(pc uint64, op tracing.OpCode, gas, cost uint64, scope tracing.ScopeContext, rData []byte, depth int, err error) { func (t *muxTracer) CaptureState(pc uint64, op tracing.OpCode, gas, cost uint64, scope tracing.OpContext, rData []byte, depth int, err error) {
for _, t := range t.tracers { for _, t := range t.tracers {
if t.CaptureState != nil { if t.CaptureState != nil {
t.CaptureState(pc, op, gas, cost, scope, rData, depth, err) t.CaptureState(pc, op, gas, cost, scope, rData, depth, err)
@ -108,7 +108,7 @@ func (t *muxTracer) CaptureState(pc uint64, op tracing.OpCode, gas, cost uint64,
} }
// CaptureFault implements the EVMLogger interface to trace an execution fault. // CaptureFault implements the EVMLogger interface to trace an execution fault.
func (t *muxTracer) CaptureFault(pc uint64, op tracing.OpCode, gas, cost uint64, scope tracing.ScopeContext, depth int, err error) { func (t *muxTracer) CaptureFault(pc uint64, op tracing.OpCode, gas, cost uint64, scope tracing.OpContext, depth int, err error) {
for _, t := range t.tracers { for _, t := range t.tracers {
if t.CaptureFault != nil { if t.CaptureFault != nil {
t.CaptureFault(pc, op, gas, cost, scope, depth, err) t.CaptureFault(pc, op, gas, cost, scope, depth, err)

View file

@ -100,7 +100,7 @@ func newPrestateTracer(ctx *directory.Context, cfg json.RawMessage) (*directory.
} }
// CaptureState implements the EVMLogger interface to trace a single step of VM execution. // CaptureState implements the EVMLogger interface to trace a single step of VM execution.
func (t *prestateTracer) CaptureState(pc uint64, opcode tracing.OpCode, gas, cost uint64, scope tracing.ScopeContext, rData []byte, depth int, err error) { func (t *prestateTracer) CaptureState(pc uint64, opcode tracing.OpCode, gas, cost uint64, scope tracing.OpContext, rData []byte, depth int, err error) {
if err != nil { if err != nil {
return return
} }
@ -109,9 +109,9 @@ func (t *prestateTracer) CaptureState(pc uint64, opcode tracing.OpCode, gas, cos
return return
} }
op := vm.OpCode(opcode) op := vm.OpCode(opcode)
stackData := scope.GetStackData() stackData := scope.StackData()
stackLen := len(stackData) stackLen := len(stackData)
caller := scope.GetAddress() caller := scope.Address()
switch { switch {
case stackLen >= 1 && (op == vm.SLOAD || op == vm.SSTORE): case stackLen >= 1 && (op == vm.SLOAD || op == vm.SSTORE):
slot := common.Hash(stackData[stackLen-1].Bytes32()) slot := common.Hash(stackData[stackLen-1].Bytes32())
@ -133,7 +133,7 @@ func (t *prestateTracer) CaptureState(pc uint64, opcode tracing.OpCode, gas, cos
case stackLen >= 4 && op == vm.CREATE2: case stackLen >= 4 && op == vm.CREATE2:
offset := stackData[stackLen-2] offset := stackData[stackLen-2]
size := stackData[stackLen-3] size := stackData[stackLen-3]
init, err := directory.GetMemoryCopyPadded(scope.GetMemoryData(), int64(offset.Uint64()), int64(size.Uint64())) init, err := directory.GetMemoryCopyPadded(scope.MemoryData(), int64(offset.Uint64()), int64(size.Uint64()))
if err != nil { if err != nil {
log.Warn("failed to copy CREATE2 input", "err", err, "tracer", "prestateTracer", "offset", offset, "size", size) log.Warn("failed to copy CREATE2 input", "err", err, "tracer", "prestateTracer", "offset", offset, "size", size)
return return