This commit is contained in:
Daniel Liu 2026-05-21 21:54:20 -07:00 committed by GitHub
commit c281e47322
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 45 additions and 4 deletions

View file

@ -276,10 +276,6 @@ func (l *StructLogger) OnOpcode(pc uint64, opcode byte, gas, cost uint64, scope
if l.skip { if l.skip {
return return
} }
// check if already accumulated the size of the response.
if l.cfg.Limit != 0 && l.resultSize > l.cfg.Limit {
return
}
var ( var (
op = vm.OpCode(opcode) op = vm.OpCode(opcode)
memory = scope.MemoryData() memory = scope.MemoryData()
@ -329,6 +325,9 @@ func (l *StructLogger) OnOpcode(pc uint64, opcode byte, gas, cost uint64, scope
// create a log // create a log
if l.writer == nil { if l.writer == nil {
entry := log.toLegacyJSON() entry := log.toLegacyJSON()
if l.cfg.Limit != 0 && l.resultSize+len(entry) > l.cfg.Limit {
return
}
l.resultSize += len(entry) l.resultSize += len(entry)
l.logs = append(l.logs, entry) l.logs = append(l.logs, entry)
return return

View file

@ -24,6 +24,7 @@ import (
"github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/core/state" "github.com/ethereum/go-ethereum/core/state"
"github.com/ethereum/go-ethereum/core/tracing"
"github.com/ethereum/go-ethereum/core/vm" "github.com/ethereum/go-ethereum/core/vm"
"github.com/ethereum/go-ethereum/params" "github.com/ethereum/go-ethereum/params"
"github.com/holiman/uint256" "github.com/holiman/uint256"
@ -43,6 +44,16 @@ func (*dummyStatedb) GetStateAndCommittedState(common.Address, common.Hash) (com
return common.Hash{}, common.Hash{} return common.Hash{}, common.Hash{}
} }
type dummyOpContext struct{}
func (dummyOpContext) MemoryData() []byte { return nil }
func (dummyOpContext) StackData() []uint256.Int { return nil }
func (dummyOpContext) Caller() common.Address { return common.Address{} }
func (dummyOpContext) Address() common.Address { return common.Address{} }
func (dummyOpContext) CallValue() *uint256.Int { return new(uint256.Int) }
func (dummyOpContext) CallInput() []byte { return nil }
func (dummyOpContext) ContractCode() []byte { return nil }
func TestStoreCapture(t *testing.T) { func TestStoreCapture(t *testing.T) {
var ( var (
logger = NewStructLogger(nil) logger = NewStructLogger(nil)
@ -139,3 +150,34 @@ func TestStructLogLegacyJSONSpecFormatting(t *testing.T) {
}) })
} }
} }
func TestStructLoggerLimitRejectsOversizedEntry(t *testing.T) {
entry := (&StructLog{Op: vm.STOP, RefundCounter: 1337}).toLegacyJSON()
logger := NewStructLogger(&Config{Limit: len(entry) - 1})
logger.env = &tracing.VMContext{StateDB: &dummyStatedb{}}
logger.OnOpcode(0, byte(vm.STOP), 0, 0, dummyOpContext{}, nil, 0, nil)
if len(logger.logs) != 0 {
t.Fatalf("expected oversized entry to be skipped, got %d logs", len(logger.logs))
}
if logger.resultSize != 0 {
t.Fatalf("expected result size to remain zero, got %d", logger.resultSize)
}
}
func TestStructLoggerLimitAllowsEntryUpToBoundary(t *testing.T) {
entry := (&StructLog{Op: vm.STOP, RefundCounter: 1337}).toLegacyJSON()
logger := NewStructLogger(&Config{Limit: len(entry)})
logger.env = &tracing.VMContext{StateDB: &dummyStatedb{}}
logger.OnOpcode(0, byte(vm.STOP), 0, 0, dummyOpContext{}, nil, 0, nil)
logger.OnOpcode(0, byte(vm.STOP), 0, 0, dummyOpContext{}, nil, 0, nil)
if len(logger.logs) != 1 {
t.Fatalf("expected exactly one log at the size boundary, got %d", len(logger.logs))
}
if logger.resultSize != len(entry) {
t.Fatalf("expected result size %d, got %d", len(entry), logger.resultSize)
}
}