diff --git a/eth/tracers/native/call.go b/eth/tracers/native/call.go index a9bad83648..792c106f7d 100644 --- a/eth/tracers/native/call.go +++ b/eth/tracers/native/call.go @@ -13,7 +13,7 @@ import ( ) func init() { - Register("callTracerNative", NewCallTracer) + register("callTracerNative", NewCallTracer) } type callFrame struct { @@ -33,7 +33,11 @@ type CallTracer struct { callstack []callFrame } +// NewCallTracer returns a native go tracer which tracks +// call frames of a tx, and implements vm.Tracer. func NewCallTracer() Tracer { + // First callframe contains tx context info + // and is populated on start and end. t := &CallTracer{callstack: make([]callFrame, 1)} return t } diff --git a/eth/tracers/native/native.go b/eth/tracers/native/native.go index 10c607fc43..3382d6b927 100644 --- a/eth/tracers/native/native.go +++ b/eth/tracers/native/native.go @@ -6,19 +6,27 @@ import ( "github.com/ethereum/go-ethereum/core/vm" ) +// Tracer interface extends vm.Tracer and additionally +// allows collecting the tracing result. type Tracer interface { vm.Tracer GetResult() (json.RawMessage, error) } -type Constructor func() Tracer +// constructor creates a new instance of a Tracer. +type constructor func() Tracer -var tracers map[string]Constructor = make(map[string]Constructor) +var tracers map[string]constructor = make(map[string]constructor) -func Register(name string, fn Constructor) { +// register makes native tracers in this directory which adhere +// to the `Tracer` interface available to the rest of the codebase. +// It is typically invoked in the `init()` function. +func register(name string, fn constructor) { tracers[name] = fn } +// New returns a new instance of a tracer, if one was +// registered under the given name. func New(name string) (Tracer, bool) { if fn, ok := tracers[name]; ok { return fn(), true