diff --git a/CHANGELOG.md b/CHANGELOG.md index e4b05edf6b6..64dc9bcb0ca 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,7 @@ - Remove `--Xsnapsync-server-enabled` deprecated since 25.7.0. Use `--snapsync-server-enabled` instead. - Remove `--Xsnapsync-synchronizer-pre-merge-headers-only-enabled` deprecated since 25.7.0. Use `--snapsync-synchronizer-pre-checkpoint-headers-only-enabled` instead. - Remove `--Xhistory-expiry-prune` deprecated since 25.7.0. Use `--history-expiry-prune` instead. +- eth_createAccessList now returns success result if execution reverted [#9358](https://github.com/hyperledger/besu/pull/9358) ### Upcoming Breaking Changes - Sunsetting features - for more context on the reasoning behind the deprecation of these features, including alternative options, read [this blog post](https://www.lfdecentralizedtrust.org/blog/sunsetting-tessera-and-simplifying-hyperledger-besu) @@ -17,6 +18,7 @@ ### Additions and Improvements - Update to vertx 4.5.22 [#9375](https://github.com/hyperledger/besu/pull/9375) - Add `opcodes` optional parameter to RPC methods: `debug_standardTraceBlockToFile`, `debug_standardTraceBadBlockToFile`, `debug_traceBlockByNumber`, `debug_traceBlockByHash`, `debug_traceTransaction`, `debug_traceBlock`, `debug_traceCall` for tracing specified opcodes [#9335](https://github.com/hyperledger/besu/pull/9335) +- eth_createAccessList now returns success result if execution reverted [#9358](https://github.com/hyperledger/besu/pull/9358) ### Bug fixes diff --git a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/EthCreateAccessList.java b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/EthCreateAccessList.java index a977d93085f..121ee88a117 100644 --- a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/EthCreateAccessList.java +++ b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/EthCreateAccessList.java @@ -77,7 +77,7 @@ private Object createResponse( final JsonRpcRequestContext requestContext, final AccessListSimulatorResult result) { return result .result() - .map(createResponse(requestContext, result.tracer())) + .map(createResponse(result.tracer())) .orElseGet(() -> errorResponse(requestContext, RpcErrorType.INTERNAL_ERROR)); } @@ -99,11 +99,13 @@ private boolean shouldProcessWithAccessListOverride( } private Function createResponse( - final JsonRpcRequestContext request, final AccessListOperationTracer operationTracer) { + final AccessListOperationTracer operationTracer) { + // access list is created regardless, but include error message if result was not successful return result -> - result.isSuccessful() - ? new CreateAccessListResult(operationTracer.getAccessList(), result.getGasEstimate()) - : errorResponse(request, result); + new CreateAccessListResult( + operationTracer.getAccessList(), + result.getGasEstimate(), + result.isSuccessful() ? Optional.empty() : Optional.of("execution reverted")); } private AccessListSimulatorResult processTransactionWithAccessListOverride( diff --git a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/results/CreateAccessListResult.java b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/results/CreateAccessListResult.java index a6620366e88..f45c83558ac 100644 --- a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/results/CreateAccessListResult.java +++ b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/results/CreateAccessListResult.java @@ -18,16 +18,27 @@ import java.util.Collection; import java.util.List; +import java.util.Optional; import com.fasterxml.jackson.annotation.JsonGetter; +import com.fasterxml.jackson.annotation.JsonInclude; public class CreateAccessListResult { List accessListList; String gasUsed; + Optional errorMessage; public CreateAccessListResult(final List accessListEntries, final long gasUsed) { + this(accessListEntries, gasUsed, Optional.empty()); + } + + public CreateAccessListResult( + final List accessListEntries, + final long gasUsed, + final Optional errorMessage) { this.accessListList = accessListEntries; this.gasUsed = Quantity.create(gasUsed); + this.errorMessage = errorMessage; } @JsonGetter(value = "accessList") @@ -39,4 +50,10 @@ public Collection getAccessList() { public String getGasUsed() { return gasUsed; } + + @JsonGetter(value = "error") + @JsonInclude(JsonInclude.Include.NON_ABSENT) + public Optional getErrorMessage() { + return errorMessage; + } } diff --git a/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/EthCreateAccessListTest.java b/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/EthCreateAccessListTest.java index 7abda1e2926..144cec11e02 100644 --- a/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/EthCreateAccessListTest.java +++ b/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/EthCreateAccessListTest.java @@ -28,7 +28,6 @@ import org.hyperledger.besu.datatypes.Wei; import org.hyperledger.besu.ethereum.api.jsonrpc.internal.JsonRpcRequest; import org.hyperledger.besu.ethereum.api.jsonrpc.internal.JsonRpcRequestContext; -import org.hyperledger.besu.ethereum.api.jsonrpc.internal.response.JsonRpcError; import org.hyperledger.besu.ethereum.api.jsonrpc.internal.response.JsonRpcErrorResponse; import org.hyperledger.besu.ethereum.api.jsonrpc.internal.response.JsonRpcResponse; import org.hyperledger.besu.ethereum.api.jsonrpc.internal.response.JsonRpcSuccessResponse; @@ -194,14 +193,16 @@ public void shouldReturnErrorWhenWorldStateIsNotAvailable() { } @Test - public void shouldReturnErrorWhenTransactionReverted() { + public void shouldReturnAccessListEvenWhenTransactionReverted() { final JsonRpcRequestContext request = ethCreateAccessListRequest(legacyTransactionCallParameter(Wei.ZERO)); - mockTransactionSimulatorResult(false, true, 1L, pendingBlockHeader); + mockTransactionSimulatorResult(false, true, MIN_TX_GAS_COST, pendingBlockHeader); - final String errorReason = "0x00"; final JsonRpcResponse expectedResponse = - new JsonRpcErrorResponse(null, new JsonRpcError(RpcErrorType.REVERT_ERROR, errorReason)); + new JsonRpcSuccessResponse( + null, + new CreateAccessListResult( + List.of(), MIN_TX_GAS_COST, Optional.of("execution reverted"))); assertThat(method.response(request)).usingRecursiveComparison().isEqualTo(expectedResponse); verify(transactionSimulator, times(2))