diff --git a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/RpcMethod.java b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/RpcMethod.java index 5b510cb8e71..a0ee64a69c0 100644 --- a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/RpcMethod.java +++ b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/RpcMethod.java @@ -97,6 +97,7 @@ public enum RpcMethod { ETH_GET_BALANCE("eth_getBalance"), ETH_GET_BLOCK_BY_HASH("eth_getBlockByHash"), ETH_GET_BLOCK_BY_NUMBER("eth_getBlockByNumber"), + ETH_GET_BLOCK_RECEIPTS("eth_getBlockReceipts"), ETH_GET_BLOCK_TRANSACTION_COUNT_BY_HASH("eth_getBlockTransactionCountByHash"), ETH_GET_BLOCK_TRANSACTION_COUNT_BY_NUMBER("eth_getBlockTransactionCountByNumber"), ETH_GET_CODE("eth_getCode"), diff --git a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/EthGetBlockReceipts.java b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/EthGetBlockReceipts.java new file mode 100644 index 00000000000..ad3fed007b7 --- /dev/null +++ b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/EthGetBlockReceipts.java @@ -0,0 +1,96 @@ +/* + * Copyright Hyperledger Besu contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on + * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the + * specific language governing permissions and limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + */ +package org.hyperledger.besu.ethereum.api.jsonrpc.internal.methods; + +import org.hyperledger.besu.datatypes.Hash; +import org.hyperledger.besu.ethereum.api.jsonrpc.RpcMethod; +import org.hyperledger.besu.ethereum.api.jsonrpc.internal.JsonRpcRequestContext; +import org.hyperledger.besu.ethereum.api.jsonrpc.internal.parameters.BlockParameterOrBlockHash; +import org.hyperledger.besu.ethereum.api.jsonrpc.internal.results.BlockReceiptsResult; +import org.hyperledger.besu.ethereum.api.jsonrpc.internal.results.TransactionReceiptResult; +import org.hyperledger.besu.ethereum.api.jsonrpc.internal.results.TransactionReceiptRootResult; +import org.hyperledger.besu.ethereum.api.jsonrpc.internal.results.TransactionReceiptStatusResult; +import org.hyperledger.besu.ethereum.api.query.BlockWithMetadata; +import org.hyperledger.besu.ethereum.api.query.BlockchainQueries; +import org.hyperledger.besu.ethereum.api.query.TransactionReceiptWithMetadata; +import org.hyperledger.besu.ethereum.api.query.TransactionWithMetadata; +import org.hyperledger.besu.ethereum.mainnet.ProtocolSchedule; +import org.hyperledger.besu.ethereum.mainnet.TransactionReceiptType; + +import java.util.List; +import java.util.Optional; +import java.util.function.Supplier; +import java.util.stream.Collectors; + +import com.google.common.base.Suppliers; + +public class EthGetBlockReceipts extends AbstractBlockParameterOrBlockHashMethod { + + private final ProtocolSchedule protocolSchedule; + + public EthGetBlockReceipts( + final BlockchainQueries blockchain, final ProtocolSchedule protocolSchedule) { + this(Suppliers.ofInstance(blockchain), protocolSchedule); + } + + public EthGetBlockReceipts( + final Supplier blockchain, final ProtocolSchedule protocolSchedule) { + super(blockchain); + this.protocolSchedule = protocolSchedule; + } + + @Override + public String getName() { + return RpcMethod.ETH_GET_BLOCK_RECEIPTS.getMethodName(); + } + + @Override + protected BlockParameterOrBlockHash blockParameterOrBlockHash( + final JsonRpcRequestContext request) { + return request.getRequiredParameter(0, BlockParameterOrBlockHash.class); + } + + @Override + protected Object resultByBlockHash(final JsonRpcRequestContext request, final Hash blockHash) { + return getBlockReceiptsResult(blockHash); + } + + private Optional txReceipt(final TransactionWithMetadata tx) { + Optional receipt = + blockchainQueries + .get() + .transactionReceiptByTransactionHash(tx.getTransaction().getHash(), protocolSchedule); + if (receipt.isPresent()) { + if (receipt.get().getReceipt().getTransactionReceiptType() == TransactionReceiptType.ROOT) { + return Optional.of(new TransactionReceiptRootResult(receipt.get())); + } else { + return Optional.of(new TransactionReceiptStatusResult(receipt.get())); + } + } + return Optional.empty(); + } + + private BlockReceiptsResult getBlockReceiptsResult(final Hash blockHash) { + BlockchainQueries blockchain = blockchainQueries.get(); + BlockWithMetadata theBlock = + blockchain.blockByHash(blockHash).get(); + final List txs2 = + theBlock.getTransactions().stream() + .map(tx -> txReceipt(tx).get()) + .collect(Collectors.toList()); + + return new BlockReceiptsResult(txs2); + } +} diff --git a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/results/BlockReceiptsResult.java b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/results/BlockReceiptsResult.java new file mode 100644 index 00000000000..2a239bdd3cb --- /dev/null +++ b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/results/BlockReceiptsResult.java @@ -0,0 +1,34 @@ +/* + * Copyright Hyperledger Besu contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on + * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the + * specific language governing permissions and limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + */ +package org.hyperledger.besu.ethereum.api.jsonrpc.internal.results; + +import java.util.List; + +import com.fasterxml.jackson.annotation.JsonValue; + +/** The result set from querying the receipts for a given block. */ +public class BlockReceiptsResult { + + private final List results; + + public BlockReceiptsResult(final List receipts) { + results = receipts; + } + + @JsonValue + public List getResults() { + return results; + } +} diff --git a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/methods/EthJsonRpcMethods.java b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/methods/EthJsonRpcMethods.java index 938e3f62c94..b3ca5514d7b 100644 --- a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/methods/EthJsonRpcMethods.java +++ b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/methods/EthJsonRpcMethods.java @@ -1,5 +1,5 @@ /* - * Copyright ConsenSys AG. + * Copyright Hyperledger Besu contributors * * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at @@ -28,6 +28,7 @@ import org.hyperledger.besu.ethereum.api.jsonrpc.internal.methods.EthGetBalance; import org.hyperledger.besu.ethereum.api.jsonrpc.internal.methods.EthGetBlockByHash; import org.hyperledger.besu.ethereum.api.jsonrpc.internal.methods.EthGetBlockByNumber; +import org.hyperledger.besu.ethereum.api.jsonrpc.internal.methods.EthGetBlockReceipts; import org.hyperledger.besu.ethereum.api.jsonrpc.internal.methods.EthGetBlockTransactionCountByHash; import org.hyperledger.besu.ethereum.api.jsonrpc.internal.methods.EthGetBlockTransactionCountByNumber; import org.hyperledger.besu.ethereum.api.jsonrpc.internal.methods.EthGetCode; @@ -119,6 +120,7 @@ protected Map create() { new EthGetBalance(blockchainQueries), new EthGetBlockByHash(blockchainQueries, blockResult), new EthGetBlockByNumber(blockchainQueries, blockResult, synchronizer), + new EthGetBlockReceipts(blockchainQueries, protocolSchedule), new EthGetBlockTransactionCountByNumber(blockchainQueries), new EthGetBlockTransactionCountByHash(blockchainQueries), new EthCall(