diff --git a/CHANGELOG.md b/CHANGELOG.md index 704d9dceb4b..fb56254a2bc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -42,6 +42,7 @@ are provided with different values, using input as per the execution-apis spec i ### Additions and Improvements - Add `transactionReceipts` subscription type to `eth_subscribe` that pushes all transaction receipts when a new block is added, with optional `transactionHashes` filter to receive receipts for specific transactions only [#10190](https://github.com/besu-eth/besu/pull/10190) +- Add `enableMemory` parameter to `debug_traceTransaction` and `debug_traceBlockByNumber`. Defaults to `false`; memory is only included in trace output when explicitly enabled. The existing `disableMemory` parameter continues to work for backwards compatibility [#10169](https://github.com/besu-eth/besu/pull/10169) - `--net-restrict` now supports IPv6 CIDR notation (e.g. `fd00::/64`) in addition to IPv4, enabling subnet-based peer filtering in IPv6 and dual-stack deployments [#10028](https://github.com/besu-eth/besu/pull/10028) - Stop EngineQosTimer as part of shutdown [#9903](https://github.com/hyperledger/besu/pull/9903) - Add `--max-blobs-per-transaction` CLI option to configure the maximum number of blobs per transaction [#9912](https://github.com/hyperledger/besu/pull/9912) diff --git a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/parameters/TransactionTraceParams.java b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/parameters/TransactionTraceParams.java index 509d6af4c04..5ebad5d8c47 100644 --- a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/parameters/TransactionTraceParams.java +++ b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/parameters/TransactionTraceParams.java @@ -55,6 +55,13 @@ default boolean disableMemory() { return Boolean.TRUE.equals(disableMemoryNullable()); } + @JsonProperty(value = "enableMemory") + @Nullable Boolean enableMemoryNullable(); + + default boolean enableMemory() { + return Boolean.TRUE.equals(enableMemoryNullable()); + } + @JsonProperty(value = "disableStack") @Nullable Boolean disableStackNullable(); @@ -103,7 +110,9 @@ default TraceOptions traceOptions() { if (disableStorageNullable() != null) { builder.traceStorage(!disableStorage()); } - if (disableMemoryNullable() != null) { + if (enableMemoryNullable() != null) { + builder.traceMemory(enableMemory()); + } else if (disableMemoryNullable() != null) { builder.traceMemory(!disableMemory()); } else if (tracerType != TracerType.OPCODE_TRACER) { // Non-opcode tracers (e.g. callTracer) need memory capture enabled for internal diff --git a/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/parameters/TransactionTraceParamsTest.java b/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/parameters/TransactionTraceParamsTest.java index c37b538c84d..2775789627b 100644 --- a/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/parameters/TransactionTraceParamsTest.java +++ b/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/parameters/TransactionTraceParamsTest.java @@ -85,4 +85,50 @@ public void nonOpcodeTracerShouldRespectExplicitDisableMemory() throws Exception .describedAs("explicit disableMemory=true should be respected") .isFalse(); } + + @Test + public void enableMemoryTrueShouldEnableMemory() throws Exception { + final TransactionTraceParams params = + MAPPER.readValue("{\"enableMemory\": true}", TransactionTraceParams.class); + final OpCodeTracerConfig config = params.traceOptions().opCodeTracerConfig(); + + assertThat(config.traceMemory()) + .describedAs("enableMemory=true should enable memory tracing") + .isTrue(); + } + + @Test + public void enableMemoryFalseShouldDisableMemory() throws Exception { + final TransactionTraceParams params = + MAPPER.readValue("{\"enableMemory\": false}", TransactionTraceParams.class); + final OpCodeTracerConfig config = params.traceOptions().opCodeTracerConfig(); + + assertThat(config.traceMemory()) + .describedAs("enableMemory=false should disable memory tracing") + .isFalse(); + } + + @Test + public void enableMemoryShouldTakePrecedenceOverDisableMemory() throws Exception { + final TransactionTraceParams params = + MAPPER.readValue( + "{\"enableMemory\": true, \"disableMemory\": true}", TransactionTraceParams.class); + final OpCodeTracerConfig config = params.traceOptions().opCodeTracerConfig(); + + assertThat(config.traceMemory()) + .describedAs("enableMemory should take precedence over disableMemory") + .isTrue(); + } + + @Test + public void nonOpcodeTracerShouldRespectExplicitEnableMemoryFalse() throws Exception { + final TransactionTraceParams params = + MAPPER.readValue( + "{\"tracer\": \"callTracer\", \"enableMemory\": false}", TransactionTraceParams.class); + final OpCodeTracerConfig config = params.traceOptions().opCodeTracerConfig(); + + assertThat(config.traceMemory()) + .describedAs("explicit enableMemory=false should be respected for callTracer") + .isFalse(); + } }