Skip to content

Commit

Permalink
Cache codehash for performance
Browse files Browse the repository at this point in the history
  • Loading branch information
samalws-tob committed Sep 5, 2024
1 parent 4e56d69 commit 7a8c43d
Showing 1 changed file with 15 additions and 1 deletion.
16 changes: 15 additions & 1 deletion fuzzing/coverage/coverage_tracer.go
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,13 @@ type CoverageTracer struct {

// nativeTracer is the underlying tracer used to capture EVM execution.
nativeTracer *chain.TestChainTracer

// codeHashCache is a cache for values returned by getContractCoverageMapHash,
// so that this expensive calculation doesn't need to be done every opcode.
// The Hash key is a contract's codehash (which uniquely identifies it),
// and the bool key is whether we're in contract init (true) or runtime (false)
// (since init vs runtime produces different results from getContractCoverageMapHash).
codeHashCache map[bool]map[common.Hash]common.Hash
}

// coverageTracerCallFrameState tracks state across call frames in the tracer.
Expand All @@ -71,6 +78,7 @@ func NewCoverageTracer() *CoverageTracer {
tracer := &CoverageTracer{
coverageMaps: NewCoverageMaps(),
callFrameStates: make([]*coverageTracerCallFrameState, 0),
codeHashCache: map[bool]map[common.Hash]common.Hash{false: make(map[common.Hash]common.Hash), true: make(map[common.Hash]common.Hash)},
}
nativeTracer := &tracers.Tracer{
Hooks: &tracing.Hooks{
Expand Down Expand Up @@ -159,11 +167,17 @@ func (t *CoverageTracer) OnOpcode(pc uint64, op byte, gas, cost uint64, scope tr
scopeContext := scope.(*vm.ScopeContext)
code := scopeContext.Contract.Code
codeSize := len(code)
isCreate := callFrameState.create
gethCodeHash := scopeContext.Contract.CodeHash
if codeSize > 0 {

// Obtain our contract coverage map lookup hash.
if callFrameState.lookupHash == nil {
lookupHash := getContractCoverageMapHash(code, callFrameState.create)
lookupHash, cacheHit := t.codeHashCache[isCreate][gethCodeHash]
if !cacheHit {
lookupHash = getContractCoverageMapHash(code, isCreate)
t.codeHashCache[isCreate][gethCodeHash] = lookupHash
}
callFrameState.lookupHash = &lookupHash
}

Expand Down

0 comments on commit 7a8c43d

Please sign in to comment.