mirror of
https://github.com/vacp2p/status-linea-besu.git
synced 2026-01-09 22:07:59 -05:00
Update RPCs for yParity (#6119)
Update the GraphQL and JSON-RPC endpoints to provide `yParity` instead of `v` for non-legacy transactions. Update the JSON-RPC tests to use the Hive data. Add tests for Shanghai and Cancun Blocks. Signed-off-by: Danno Ferrin <danno.ferrin@swirldslabs.com>
This commit is contained in:
@@ -16,6 +16,7 @@
|
||||
- Implement new `miner_setMinPriorityFee` and `miner_getMinPriorityFee` RPC methods [#6080](https://github.com/hyperledger/besu/pull/6080)
|
||||
- Clique config option `createemptyblocks` to not create empty blocks [#6082](https://github.com/hyperledger/besu/pull/6082)
|
||||
- Upgrade EVM Reference Tests to v13 (Cancun) [#6114](https://github.com/hyperledger/besu/pull/6114)
|
||||
- Add `yParity` to GraphQL and JSON-RPC for relevant querise. [6119](https://github.com/hyperledger/besu/pull/6119)
|
||||
|
||||
### Bug fixes
|
||||
|
||||
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -1,5 +1,44 @@
|
||||
{
|
||||
"request" : {"jsonrpc":"2.0","id":34,"method":"eth_getBlockByNumber","params":["latest",false]},
|
||||
"response" : {"jsonrpc":"2.0","id":34,"result":{"number":"0x0","hash":"0x33235e7b7a78302cdb54e5ddba66c7ae49b01c1f5498bb00cd0c8ed5206784bf","mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000","parentHash":"0x0000000000000000000000000000000000000000000000000000000000000000","nonce":"0x0000000000000000","sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","transactionsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","stateRoot":"0x11045a28efc7c00a52a201e55b8d4c312971a930432e2b5380c20d2ce217385e","receiptsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","miner":"0x0000000000000000000000000000000000000000","difficulty":"0x0","totalDifficulty":"0x0","extraData":"0x","baseFeePerGas":"0x3b9aca00","size":"0x244","gasLimit":"0x2fefd8","gasUsed":"0x0","timestamp":"0x1234","uncles":[],"transactions":[],"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","withdrawals":[],"blobGasUsed":"0x0","excessBlobGas":"0x0","parentBeaconBlockRoot":"0x0000000000000000000000000000000000000000000000000000000000000000"}},
|
||||
"statusCode" : 200
|
||||
"request": {
|
||||
"jsonrpc": "2.0",
|
||||
"id": 34,
|
||||
"method": "eth_getBlockByNumber",
|
||||
"params": [
|
||||
"latest",
|
||||
false
|
||||
]
|
||||
},
|
||||
"response": {
|
||||
"jsonrpc": "2.0",
|
||||
"id": 34,
|
||||
"result": {
|
||||
"number": "0x0",
|
||||
"hash": "0x33235e7b7a78302cdb54e5ddba66c7ae49b01c1f5498bb00cd0c8ed5206784bf",
|
||||
"mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
|
||||
"parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
|
||||
"nonce": "0x0000000000000000",
|
||||
"sha3Uncles": "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347",
|
||||
"logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
|
||||
"transactionsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
|
||||
"stateRoot": "0x11045a28efc7c00a52a201e55b8d4c312971a930432e2b5380c20d2ce217385e",
|
||||
"receiptsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
|
||||
"miner": "0x0000000000000000000000000000000000000000",
|
||||
"difficulty": "0x0",
|
||||
"totalDifficulty": "0x0",
|
||||
"extraData": "0x",
|
||||
"baseFeePerGas": "0x3b9aca00",
|
||||
"size": "0x244",
|
||||
"gasLimit": "0x2fefd8",
|
||||
"gasUsed": "0x0",
|
||||
"timestamp": "0x1234",
|
||||
"uncles": [],
|
||||
"transactions": [],
|
||||
"withdrawalsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
|
||||
"withdrawals": [],
|
||||
"blobGasUsed": "0x0",
|
||||
"excessBlobGas": "0x0",
|
||||
"parentBeaconBlockRoot": "0x0000000000000000000000000000000000000000000000000000000000000000"
|
||||
}
|
||||
},
|
||||
"statusCode": 200
|
||||
}
|
||||
@@ -1,5 +1,95 @@
|
||||
{
|
||||
"request" : {"jsonrpc":"2.0","id":1,"method":"engine_forkchoiceUpdatedV3","params":[{"headBlockHash":"0x33235e7b7a78302cdb54e5ddba66c7ae49b01c1f5498bb00cd0c8ed5206784bf","safeBlockHash":"0x0000000000000000000000000000000000000000000000000000000000000000","finalizedBlockHash":"0x0000000000000000000000000000000000000000000000000000000000000000"},{"timestamp":"0x1235","prevRandao":"0x31a3b9b03c64172b39b7fa7d35d86eaa0f9cbac30e2abbf9895a32b80ae1cd76","suggestedFeeRecipient":"0x0000000000000000000000000000000000000000","withdrawals":[{"index":"0x1","validatorIndex":"0x0","address":"0x0000000000000000000000000000000000000000","amount":"0x64"},{"index":"0x2","validatorIndex":"0x1","address":"0x0100000000000000000000000000000000000000","amount":"0x64"},{"index":"0x3","validatorIndex":"0x2","address":"0x0200000000000000000000000000000000000000","amount":"0x64"},{"index":"0x4","validatorIndex":"0x3","address":"0x0300000000000000000000000000000000000000","amount":"0x64"},{"index":"0x5","validatorIndex":"0x4","address":"0x0400000000000000000000000000000000000000","amount":"0x64"},{"index":"0x6","validatorIndex":"0x5","address":"0x0500000000000000000000000000000000000000","amount":"0x64"},{"index":"0x7","validatorIndex":"0x6","address":"0x0600000000000000000000000000000000000000","amount":"0x64"},{"index":"0x8","validatorIndex":"0x7","address":"0x0700000000000000000000000000000000000000","amount":"0x64"},{"index":"0x9","validatorIndex":"0x8","address":"0x0800000000000000000000000000000000000000","amount":"0x64"},{"index":"0xa","validatorIndex":"0x9","address":"0x0900000000000000000000000000000000000000","amount":"0x64"}],"parentBeaconBlockRoot":"0x169630f535b4a41330164c6e5c92b1224c0c407f582d407d0ac3d206cd32fd52"}]},
|
||||
"response" : {"jsonrpc":"2.0","id":1,"result":{"payloadStatus":{"status":"VALID","latestValidHash":"0x33235e7b7a78302cdb54e5ddba66c7ae49b01c1f5498bb00cd0c8ed5206784bf","validationError":null},"payloadId":"0x78d3b312ed5adeb5"}},
|
||||
"statusCode" : 200
|
||||
"request": {
|
||||
"jsonrpc": "2.0",
|
||||
"id": 1,
|
||||
"method": "engine_forkchoiceUpdatedV3",
|
||||
"params": [
|
||||
{
|
||||
"headBlockHash": "0x33235e7b7a78302cdb54e5ddba66c7ae49b01c1f5498bb00cd0c8ed5206784bf",
|
||||
"safeBlockHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
|
||||
"finalizedBlockHash": "0x0000000000000000000000000000000000000000000000000000000000000000"
|
||||
},
|
||||
{
|
||||
"timestamp": "0x1235",
|
||||
"prevRandao": "0x31a3b9b03c64172b39b7fa7d35d86eaa0f9cbac30e2abbf9895a32b80ae1cd76",
|
||||
"suggestedFeeRecipient": "0x0000000000000000000000000000000000000000",
|
||||
"withdrawals": [
|
||||
{
|
||||
"index": "0x1",
|
||||
"validatorIndex": "0x0",
|
||||
"address": "0x0000000000000000000000000000000000000000",
|
||||
"amount": "0x64"
|
||||
},
|
||||
{
|
||||
"index": "0x2",
|
||||
"validatorIndex": "0x1",
|
||||
"address": "0x0100000000000000000000000000000000000000",
|
||||
"amount": "0x64"
|
||||
},
|
||||
{
|
||||
"index": "0x3",
|
||||
"validatorIndex": "0x2",
|
||||
"address": "0x0200000000000000000000000000000000000000",
|
||||
"amount": "0x64"
|
||||
},
|
||||
{
|
||||
"index": "0x4",
|
||||
"validatorIndex": "0x3",
|
||||
"address": "0x0300000000000000000000000000000000000000",
|
||||
"amount": "0x64"
|
||||
},
|
||||
{
|
||||
"index": "0x5",
|
||||
"validatorIndex": "0x4",
|
||||
"address": "0x0400000000000000000000000000000000000000",
|
||||
"amount": "0x64"
|
||||
},
|
||||
{
|
||||
"index": "0x6",
|
||||
"validatorIndex": "0x5",
|
||||
"address": "0x0500000000000000000000000000000000000000",
|
||||
"amount": "0x64"
|
||||
},
|
||||
{
|
||||
"index": "0x7",
|
||||
"validatorIndex": "0x6",
|
||||
"address": "0x0600000000000000000000000000000000000000",
|
||||
"amount": "0x64"
|
||||
},
|
||||
{
|
||||
"index": "0x8",
|
||||
"validatorIndex": "0x7",
|
||||
"address": "0x0700000000000000000000000000000000000000",
|
||||
"amount": "0x64"
|
||||
},
|
||||
{
|
||||
"index": "0x9",
|
||||
"validatorIndex": "0x8",
|
||||
"address": "0x0800000000000000000000000000000000000000",
|
||||
"amount": "0x64"
|
||||
},
|
||||
{
|
||||
"index": "0xa",
|
||||
"validatorIndex": "0x9",
|
||||
"address": "0x0900000000000000000000000000000000000000",
|
||||
"amount": "0x64"
|
||||
}
|
||||
],
|
||||
"parentBeaconBlockRoot": "0x169630f535b4a41330164c6e5c92b1224c0c407f582d407d0ac3d206cd32fd52"
|
||||
}
|
||||
]
|
||||
},
|
||||
"response": {
|
||||
"jsonrpc": "2.0",
|
||||
"id": 1,
|
||||
"result": {
|
||||
"payloadStatus": {
|
||||
"status": "VALID",
|
||||
"latestValidHash": "0x33235e7b7a78302cdb54e5ddba66c7ae49b01c1f5498bb00cd0c8ed5206784bf",
|
||||
"validationError": null
|
||||
},
|
||||
"payloadId": "0x78d3b312ed5adeb5"
|
||||
}
|
||||
},
|
||||
"statusCode": 200
|
||||
}
|
||||
@@ -1,17 +1,18 @@
|
||||
{
|
||||
"request" : {
|
||||
"jsonrpc":"2.0","method":"txpool_besuStatistics","params":[],"id":1
|
||||
|
||||
|
||||
},
|
||||
"response" : {
|
||||
"jsonrpc" : "2.0",
|
||||
"id" : 1,
|
||||
"result" : {
|
||||
"maxSize" : -1,
|
||||
"localCount" : 7,
|
||||
"remoteCount" : 0
|
||||
"request": {
|
||||
"jsonrpc": "2.0",
|
||||
"method": "txpool_besuStatistics",
|
||||
"params": [],
|
||||
"id": 1
|
||||
},
|
||||
"response": {
|
||||
"jsonrpc": "2.0",
|
||||
"id": 1,
|
||||
"result": {
|
||||
"maxSize": -1,
|
||||
"localCount": 7,
|
||||
"remoteCount": 0
|
||||
}
|
||||
},
|
||||
"statusCode" : 200
|
||||
"statusCode": 200
|
||||
}
|
||||
File diff suppressed because one or more lines are too long
@@ -109,7 +109,15 @@ public interface Transaction {
|
||||
Quantity getValue();
|
||||
|
||||
/**
|
||||
* Value corresponding to the 'V' component of the signature of the transaction.
|
||||
* Value corresponding to the 'yParity' component of non-legacy signatures.
|
||||
*
|
||||
* @return the 'yParity' component of the signature
|
||||
*/
|
||||
BigInteger getYParity();
|
||||
|
||||
/**
|
||||
* Value corresponding to the 'v' component of legacy signatures, which encodes chainId and
|
||||
* yParity.
|
||||
*
|
||||
* @return the 'V' component of the signature
|
||||
*/
|
||||
|
||||
@@ -17,6 +17,7 @@ package org.hyperledger.besu.ethereum.api.graphql.internal;
|
||||
import org.hyperledger.besu.datatypes.Address;
|
||||
import org.hyperledger.besu.ethereum.api.jsonrpc.internal.results.Quantity;
|
||||
|
||||
import java.math.BigInteger;
|
||||
import java.util.Locale;
|
||||
|
||||
import graphql.GraphQLContext;
|
||||
@@ -118,6 +119,8 @@ public class Scalars {
|
||||
return convertImpl(stringValue.getValue());
|
||||
} else if (input instanceof IntValue intValue) {
|
||||
return UInt256.valueOf(intValue.getValue()).toShortHexString();
|
||||
} else if (input instanceof BigInteger bigInteger) {
|
||||
return "0x" + bigInteger.toString(16);
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
|
||||
@@ -28,6 +28,7 @@ import org.hyperledger.besu.ethereum.core.Transaction;
|
||||
import org.hyperledger.besu.ethereum.mainnet.ProtocolSchedule;
|
||||
import org.hyperledger.besu.ethereum.rlp.BytesValueRLPOutput;
|
||||
|
||||
import java.math.BigInteger;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Optional;
|
||||
@@ -235,6 +236,22 @@ public class TransactionAdapter extends AdapterBase {
|
||||
return results;
|
||||
}
|
||||
|
||||
public BigInteger getR() {
|
||||
return transactionWithMetadata.getTransaction().getR();
|
||||
}
|
||||
|
||||
public BigInteger getS() {
|
||||
return transactionWithMetadata.getTransaction().getS();
|
||||
}
|
||||
|
||||
public Optional<BigInteger> getV() {
|
||||
return Optional.ofNullable(transactionWithMetadata.getTransaction().getV());
|
||||
}
|
||||
|
||||
public Optional<BigInteger> getYParity() {
|
||||
return Optional.ofNullable(transactionWithMetadata.getTransaction().getYParity());
|
||||
}
|
||||
|
||||
public List<AccessListEntryAdapter> getAccessList() {
|
||||
return transactionWithMetadata
|
||||
.getTransaction()
|
||||
|
||||
@@ -46,6 +46,7 @@ import org.apache.tuweni.bytes.Bytes;
|
||||
"transactionIndex",
|
||||
"type",
|
||||
"value",
|
||||
"yParity",
|
||||
"v",
|
||||
"r",
|
||||
"s",
|
||||
@@ -82,6 +83,7 @@ public class TransactionCompleteResult implements TransactionResult {
|
||||
private final String transactionIndex;
|
||||
private final String type;
|
||||
private final String value;
|
||||
private final String yParity;
|
||||
private final String v;
|
||||
private final String r;
|
||||
private final String s;
|
||||
@@ -114,12 +116,20 @@ public class TransactionCompleteResult implements TransactionResult {
|
||||
this.nonce = Quantity.create(transaction.getNonce());
|
||||
this.to = transaction.getTo().map(Bytes::toHexString).orElse(null);
|
||||
this.transactionIndex = Quantity.create(tx.getTransactionIndex().get());
|
||||
this.type =
|
||||
transactionType.equals(TransactionType.FRONTIER)
|
||||
? Quantity.create(0)
|
||||
: Quantity.create(transactionType.getSerializedType());
|
||||
if (transactionType == TransactionType.FRONTIER) {
|
||||
this.type = Quantity.create(0);
|
||||
this.yParity = null;
|
||||
this.v = Quantity.create(transaction.getV());
|
||||
} else {
|
||||
this.type = Quantity.create(transactionType.getSerializedType());
|
||||
this.yParity = Quantity.create(transaction.getYParity());
|
||||
this.v =
|
||||
(transactionType == TransactionType.ACCESS_LIST
|
||||
|| transactionType == TransactionType.EIP1559)
|
||||
? this.yParity
|
||||
: null;
|
||||
}
|
||||
this.value = Quantity.create(transaction.getValue());
|
||||
this.v = Quantity.create(transaction.getV());
|
||||
this.r = Quantity.create(transaction.getR());
|
||||
this.s = Quantity.create(transaction.getS());
|
||||
this.versionedHashes = transaction.getVersionedHashes().orElse(null);
|
||||
@@ -210,6 +220,13 @@ public class TransactionCompleteResult implements TransactionResult {
|
||||
return value;
|
||||
}
|
||||
|
||||
@JsonInclude(JsonInclude.Include.NON_NULL)
|
||||
@JsonGetter(value = "yParity")
|
||||
public String getYParity() {
|
||||
return yParity;
|
||||
}
|
||||
|
||||
@JsonInclude(JsonInclude.Include.NON_NULL)
|
||||
@JsonGetter(value = "v")
|
||||
public String getV() {
|
||||
return v;
|
||||
|
||||
@@ -44,6 +44,7 @@ import com.fasterxml.jackson.annotation.JsonPropertyOrder;
|
||||
"to",
|
||||
"transactionIndex",
|
||||
"value",
|
||||
"yParity",
|
||||
"v",
|
||||
"r",
|
||||
"s",
|
||||
@@ -77,6 +78,7 @@ public class TransactionPendingResult implements TransactionResult {
|
||||
private final String to;
|
||||
private final String type;
|
||||
private final String value;
|
||||
private final String yParity;
|
||||
private final String v;
|
||||
private final String r;
|
||||
private final String s;
|
||||
@@ -104,12 +106,20 @@ public class TransactionPendingResult implements TransactionResult {
|
||||
TransactionEncoder.encodeOpaqueBytes(transaction, EncodingContext.POOLED_TRANSACTION)
|
||||
.toString();
|
||||
this.to = transaction.getTo().map(Address::toHexString).orElse(null);
|
||||
this.type =
|
||||
transactionType.equals(TransactionType.FRONTIER)
|
||||
? Quantity.create(0)
|
||||
: Quantity.create(transactionType.getSerializedType());
|
||||
if (transactionType == TransactionType.FRONTIER) {
|
||||
this.type = Quantity.create(0);
|
||||
this.yParity = null;
|
||||
this.v = Quantity.create(transaction.getV());
|
||||
} else {
|
||||
this.type = Quantity.create(transactionType.getSerializedType());
|
||||
this.yParity = Quantity.create(transaction.getYParity());
|
||||
this.v =
|
||||
(transactionType == TransactionType.ACCESS_LIST
|
||||
|| transactionType == TransactionType.EIP1559)
|
||||
? this.yParity
|
||||
: null;
|
||||
}
|
||||
this.value = Quantity.create(transaction.getValue());
|
||||
this.v = Quantity.create(transaction.getV());
|
||||
this.r = Quantity.create(transaction.getR());
|
||||
this.s = Quantity.create(transaction.getS());
|
||||
this.versionedHashes = transaction.getVersionedHashes().orElse(null);
|
||||
@@ -195,6 +205,13 @@ public class TransactionPendingResult implements TransactionResult {
|
||||
return value;
|
||||
}
|
||||
|
||||
@JsonInclude(JsonInclude.Include.NON_NULL)
|
||||
@JsonGetter(value = "yParity")
|
||||
public String getYParity() {
|
||||
return yParity;
|
||||
}
|
||||
|
||||
@JsonInclude(JsonInclude.Include.NON_NULL)
|
||||
@JsonGetter(value = "v")
|
||||
public String getV() {
|
||||
return v;
|
||||
|
||||
@@ -20,6 +20,7 @@ import org.hyperledger.besu.ethereum.api.jsonrpc.internal.results.Quantity;
|
||||
import org.hyperledger.besu.ethereum.core.Transaction;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonGetter;
|
||||
import com.fasterxml.jackson.annotation.JsonInclude;
|
||||
import com.fasterxml.jackson.annotation.JsonPropertyOrder;
|
||||
import org.apache.tuweni.bytes.Bytes;
|
||||
|
||||
@@ -33,6 +34,7 @@ import org.apache.tuweni.bytes.Bytes;
|
||||
"to",
|
||||
"type",
|
||||
"value",
|
||||
"yParity",
|
||||
"v",
|
||||
"r",
|
||||
"s"
|
||||
@@ -47,11 +49,13 @@ public class PendingTransactionDetailResult implements JsonRpcResult {
|
||||
private final String to;
|
||||
private final String type;
|
||||
private final String value;
|
||||
private final String yParity;
|
||||
private final String v;
|
||||
private final String r;
|
||||
private final String s;
|
||||
|
||||
public PendingTransactionDetailResult(final Transaction tx) {
|
||||
TransactionType transactionType = tx.getType();
|
||||
this.from = tx.getSender().toString();
|
||||
this.gas = Quantity.create(tx.getGasLimit());
|
||||
this.gasPrice = tx.getGasPrice().map(Quantity::create).orElse(null);
|
||||
@@ -59,12 +63,20 @@ public class PendingTransactionDetailResult implements JsonRpcResult {
|
||||
this.input = tx.getPayload().toString();
|
||||
this.nonce = Quantity.create(tx.getNonce());
|
||||
this.to = tx.getTo().map(Bytes::toHexString).orElse(null);
|
||||
this.type =
|
||||
tx.getType().equals(TransactionType.FRONTIER)
|
||||
? Quantity.create(0)
|
||||
: Quantity.create(tx.getType().getSerializedType());
|
||||
if (transactionType == TransactionType.FRONTIER) {
|
||||
this.type = Quantity.create(0);
|
||||
this.yParity = null;
|
||||
this.v = Quantity.create(tx.getV());
|
||||
} else {
|
||||
this.type = Quantity.create(transactionType.getSerializedType());
|
||||
this.yParity = Quantity.create(tx.getYParity());
|
||||
this.v =
|
||||
(transactionType == TransactionType.ACCESS_LIST
|
||||
|| transactionType == TransactionType.EIP1559)
|
||||
? this.yParity
|
||||
: null;
|
||||
}
|
||||
this.value = Quantity.create(tx.getValue());
|
||||
this.v = Quantity.create(tx.getV());
|
||||
this.r = Quantity.create(tx.getR());
|
||||
this.s = Quantity.create(tx.getS());
|
||||
}
|
||||
@@ -114,6 +126,13 @@ public class PendingTransactionDetailResult implements JsonRpcResult {
|
||||
return value;
|
||||
}
|
||||
|
||||
@JsonInclude(JsonInclude.Include.NON_NULL)
|
||||
@JsonGetter(value = "yParity")
|
||||
public String getyParity() {
|
||||
return yParity;
|
||||
}
|
||||
|
||||
@JsonInclude(JsonInclude.Include.NON_NULL)
|
||||
@JsonGetter(value = "v")
|
||||
public String getV() {
|
||||
return v;
|
||||
|
||||
@@ -555,7 +555,8 @@ type Transaction {
|
||||
logs: [Log!]
|
||||
r: BigInt!
|
||||
s: BigInt!
|
||||
v: BigInt!
|
||||
v: BigInt
|
||||
yParity: BigInt
|
||||
|
||||
"""Envelope transaction support"""
|
||||
type: Long
|
||||
@@ -595,4 +596,4 @@ type Withdrawal {
|
||||
|
||||
"""Amount is the withdrawal value in Gwei."""
|
||||
amount: Long!
|
||||
}
|
||||
}
|
||||
|
||||
@@ -36,7 +36,6 @@ import org.hyperledger.besu.ethereum.p2p.rlpx.wire.Capability;
|
||||
import org.hyperledger.besu.ethereum.transaction.TransactionInvalidReason;
|
||||
import org.hyperledger.besu.ethereum.worldstate.DataStorageFormat;
|
||||
import org.hyperledger.besu.plugin.data.SyncStatus;
|
||||
import org.hyperledger.besu.testutil.BlockTestUtil;
|
||||
|
||||
import java.nio.file.Path;
|
||||
import java.util.Collections;
|
||||
@@ -74,9 +73,7 @@ public abstract class AbstractEthGraphQLHttpServiceTest {
|
||||
|
||||
@BeforeAll
|
||||
public static void setupConstants() {
|
||||
blockchainSetupUtil =
|
||||
BlockchainSetupUtil.createForEthashChain(
|
||||
BlockTestUtil.getHiveTestChainResources(), DataStorageFormat.BONSAI);
|
||||
blockchainSetupUtil = BlockchainSetupUtil.forHiveTesting(DataStorageFormat.BONSAI);
|
||||
blockchainSetupUtil.importAllBlocks();
|
||||
}
|
||||
|
||||
|
||||
@@ -103,7 +103,7 @@ public abstract class AbstractJsonRpcHttpServiceTest {
|
||||
}
|
||||
|
||||
protected BlockchainSetupUtil getBlockchainSetupUtil(final DataStorageFormat storageFormat) {
|
||||
return BlockchainSetupUtil.forTesting(storageFormat);
|
||||
return BlockchainSetupUtil.forHiveTesting(storageFormat);
|
||||
}
|
||||
|
||||
protected BlockchainSetupUtil createBlockchainSetupUtil(
|
||||
@@ -121,8 +121,7 @@ public abstract class AbstractJsonRpcHttpServiceTest {
|
||||
setupBlockchain();
|
||||
}
|
||||
|
||||
protected BlockchainSetupUtil startServiceWithEmptyChain(final DataStorageFormat storageFormat)
|
||||
throws Exception {
|
||||
protected BlockchainSetupUtil startServiceWithEmptyChain(final DataStorageFormat storageFormat) {
|
||||
final BlockchainSetupUtil emptySetupUtil = getBlockchainSetupUtil(storageFormat);
|
||||
startService(emptySetupUtil);
|
||||
return emptySetupUtil;
|
||||
@@ -199,7 +198,7 @@ public abstract class AbstractJsonRpcHttpServiceTest {
|
||||
startService(blockchainSetupUtil);
|
||||
}
|
||||
|
||||
private void startService(final BlockchainSetupUtil blockchainSetupUtil) throws Exception {
|
||||
private void startService(final BlockchainSetupUtil blockchainSetupUtil) {
|
||||
|
||||
final JsonRpcConfiguration config = JsonRpcConfiguration.createDefault();
|
||||
final Map<String, JsonRpcMethod> methods = getRpcMethods(config, blockchainSetupUtil);
|
||||
|
||||
@@ -15,7 +15,6 @@
|
||||
package org.hyperledger.besu.ethereum.api.jsonrpc.internal.methods;
|
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
import static org.mockito.ArgumentMatchers.eq;
|
||||
import static org.mockito.Mockito.verifyNoInteractions;
|
||||
import static org.mockito.Mockito.verifyNoMoreInteractions;
|
||||
import static org.mockito.Mockito.when;
|
||||
@@ -48,7 +47,7 @@ import org.mockito.Mock;
|
||||
import org.mockito.junit.jupiter.MockitoExtension;
|
||||
|
||||
@ExtendWith(MockitoExtension.class)
|
||||
public class EthGetTransactionByHashTest {
|
||||
class EthGetTransactionByHashTest {
|
||||
|
||||
private static final String VALID_TRANSACTION =
|
||||
"0xf86d0485174876e800830222e0945aae326516b4f8fe08074b7e972e40a713048d62880de0b6b3a7640000801ba05d4e7998757264daab67df2ce6f7e7a0ae36910778a406ca73898c9899a32b9ea0674700d5c3d1d27f2e6b4469957dfd1a1c49bf92383d80717afc84eb05695d5b";
|
||||
@@ -66,12 +65,12 @@ public class EthGetTransactionByHashTest {
|
||||
}
|
||||
|
||||
@Test
|
||||
public void returnsCorrectMethodName() {
|
||||
void returnsCorrectMethodName() {
|
||||
assertThat(method.getName()).isEqualTo(ETH_METHOD);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void shouldReturnErrorResponseIfMissingRequiredParameter() {
|
||||
void shouldReturnErrorResponseIfMissingRequiredParameter() {
|
||||
final JsonRpcRequest request = new JsonRpcRequest("2.0", method.getName(), new Object[] {});
|
||||
final JsonRpcRequestContext context = new JsonRpcRequestContext(request);
|
||||
|
||||
@@ -84,12 +83,12 @@ public class EthGetTransactionByHashTest {
|
||||
}
|
||||
|
||||
@Test
|
||||
public void shouldReturnNullResultWhenTransactionDoesNotExist() {
|
||||
void shouldReturnNullResultWhenTransactionDoesNotExist() {
|
||||
final String transactionHash =
|
||||
"0xf9ef5f0cf02685711cdf687b72d4754901729b942f4ea7f956e7fb206cae2f9e";
|
||||
when(transactionPool.getTransactionByHash(eq(Hash.fromHexString(transactionHash))))
|
||||
when(transactionPool.getTransactionByHash(Hash.fromHexString(transactionHash)))
|
||||
.thenReturn(Optional.empty());
|
||||
when(blockchainQueries.transactionByHash(eq(Hash.fromHexString(transactionHash))))
|
||||
when(blockchainQueries.transactionByHash(Hash.fromHexString(transactionHash)))
|
||||
.thenReturn(Optional.empty());
|
||||
|
||||
final JsonRpcRequest request =
|
||||
@@ -105,12 +104,12 @@ public class EthGetTransactionByHashTest {
|
||||
}
|
||||
|
||||
@Test
|
||||
public void shouldReturnPendingTransactionWhenTransactionExistsAndIsPending() {
|
||||
void shouldReturnPendingTransactionWhenTransactionExistsAndIsPending() {
|
||||
final org.hyperledger.besu.ethereum.core.Transaction transaction =
|
||||
org.hyperledger.besu.ethereum.core.Transaction.readFrom(
|
||||
Bytes.fromHexString(VALID_TRANSACTION));
|
||||
|
||||
when(transactionPool.getTransactionByHash(eq(transaction.getHash())))
|
||||
when(transactionPool.getTransactionByHash(transaction.getHash()))
|
||||
.thenReturn(Optional.of(transaction));
|
||||
verifyNoInteractions(blockchainQueries);
|
||||
|
||||
@@ -128,17 +127,16 @@ public class EthGetTransactionByHashTest {
|
||||
}
|
||||
|
||||
@Test
|
||||
public void shouldReturnCompleteTransactionWhenTransactionExistsInBlockchain() {
|
||||
void shouldReturnCompleteTransactionWhenTransactionExistsInBlockchain() {
|
||||
final org.hyperledger.besu.ethereum.core.Transaction transaction =
|
||||
org.hyperledger.besu.ethereum.core.Transaction.readFrom(
|
||||
Bytes.fromHexString(VALID_TRANSACTION));
|
||||
final TransactionWithMetadata transactionWithMetadata =
|
||||
new TransactionWithMetadata(transaction, 1, Optional.empty(), Hash.ZERO, 0);
|
||||
|
||||
when(transactionPool.getTransactionByHash(eq(transaction.getHash())))
|
||||
.thenReturn(Optional.empty());
|
||||
when(transactionPool.getTransactionByHash(transaction.getHash())).thenReturn(Optional.empty());
|
||||
verifyNoMoreInteractions(transactionPool);
|
||||
when(blockchainQueries.transactionByHash(eq(transaction.getHash())))
|
||||
when(blockchainQueries.transactionByHash(transaction.getHash()))
|
||||
.thenReturn(Optional.of(transactionWithMetadata));
|
||||
|
||||
final JsonRpcRequest request =
|
||||
@@ -156,7 +154,7 @@ public class EthGetTransactionByHashTest {
|
||||
}
|
||||
|
||||
@Test
|
||||
public void validateResultSpec() {
|
||||
void validateResultSpec() {
|
||||
|
||||
PendingTransaction pendingTx = getTransactionPool().stream().findFirst().get();
|
||||
Hash hash = pendingTx.getHash();
|
||||
@@ -183,6 +181,7 @@ public class EthGetTransactionByHashTest {
|
||||
assertThat(result.getRaw()).isNotNull();
|
||||
assertThat(result.getTo()).isNotNull();
|
||||
assertThat(result.getValue()).isNotNull();
|
||||
assertThat(result.getYParity()).isNotNull();
|
||||
assertThat(result.getV()).isNotNull();
|
||||
assertThat(result.getR()).isNotNull();
|
||||
assertThat(result.getS()).isNotNull();
|
||||
@@ -194,7 +193,7 @@ public class EthGetTransactionByHashTest {
|
||||
Transaction pendingTransaction = gen.transaction();
|
||||
System.out.println(pendingTransaction.getHash());
|
||||
return gen.transactionsWithAllTypes(4).stream()
|
||||
.map(transaction -> new PendingTransaction.Local(transaction))
|
||||
.map(PendingTransaction.Local::new)
|
||||
.collect(Collectors.toUnmodifiableSet());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,23 +1,34 @@
|
||||
{
|
||||
"request": "{block (number: 34) { baseFeePerGas difficulty extraData miner { address } mixHash nonce stateRoot totalDifficulty withdrawalsRoot withdrawals { address amount index validator } blobGasUsed excessBlobGas transactions { maxFeePerBlobGas blobGasUsed blobGasPrice } }} ",
|
||||
"response":{
|
||||
"request": "{block (number: 34) { baseFeePerGas difficulty extraData miner { address } mixHash nonce stateRoot totalDifficulty withdrawalsRoot withdrawals { address amount index validator } blobGasUsed excessBlobGas transactions { maxFeePerBlobGas blobGasUsed blobGasPrice type yParity v r s} }} ",
|
||||
"response": {
|
||||
"data": {
|
||||
"block":{
|
||||
"baseFeePerGas":"0x3437004a",
|
||||
"difficulty":"0x0",
|
||||
"extraData":"0x",
|
||||
"block": {
|
||||
"baseFeePerGas": "0x3437004a",
|
||||
"difficulty": "0x0",
|
||||
"extraData": "0x",
|
||||
"miner": {
|
||||
"address":"0x0000000000000000000000000000000000000000"
|
||||
"address": "0x0000000000000000000000000000000000000000"
|
||||
},
|
||||
"mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000",
|
||||
"nonce":"0x0000000000000000",
|
||||
"stateRoot":"0x34727aff24d1c51cd63fdc14515b15ddaa156fa0671c58a96c72b1553819945d",
|
||||
"totalDifficulty":"0x427c00",
|
||||
"withdrawalsRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
|
||||
"withdrawals":[],
|
||||
"blobGasUsed":"0x40000",
|
||||
"excessBlobGas":"0x0",
|
||||
"transactions":[{"maxFeePerBlobGas":"0x3b9aca00","blobGasUsed":"0x40000","blobGasPrice":"0x1"}]
|
||||
"mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
|
||||
"nonce": "0x0000000000000000",
|
||||
"stateRoot": "0x34727aff24d1c51cd63fdc14515b15ddaa156fa0671c58a96c72b1553819945d",
|
||||
"totalDifficulty": "0x427c00",
|
||||
"withdrawalsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
|
||||
"withdrawals": [],
|
||||
"blobGasUsed": "0x40000",
|
||||
"excessBlobGas": "0x0",
|
||||
"transactions": [
|
||||
{
|
||||
"maxFeePerBlobGas": "0x3b9aca00",
|
||||
"blobGasUsed": "0x40000",
|
||||
"blobGasPrice": "0x1",
|
||||
"type": "0x3",
|
||||
"yParity": "0x0",
|
||||
"v": null,
|
||||
"r": "0x6ae0612cfda43a9b464b10b4881c6fc2e4c24533cf89bbe07934da65c3ae49ce",
|
||||
"s": "0x125387aeb222ec51130cf99cbdabf24bd4a881914faed69f254e4a3f4bc507fc"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"request": "{transaction (hash : \"0x9cc6c7e602c56aa30c554bb691377f8703d778cec8845f4b88c0f72516b304f4\") { block{hash} gas gasPrice hash inputData nonce index value from {address} to {address} logs{index} status createdContract{address} } } ",
|
||||
"request": "{transaction (hash : \"0x9cc6c7e602c56aa30c554bb691377f8703d778cec8845f4b88c0f72516b304f4\") { block{hash} gas gasPrice hash inputData nonce index value from {address} to {address} logs{index} type yParity v r s status createdContract{address} } } ",
|
||||
"response": {
|
||||
"data": {
|
||||
"transaction": {
|
||||
@@ -24,6 +24,11 @@
|
||||
"index": "0x0"
|
||||
}
|
||||
],
|
||||
"type": "0x0",
|
||||
"yParity": null,
|
||||
"v": "0x1c",
|
||||
"r": "0x11232cac2f935ab8dd5d5972438fde90e05d0dd620860b42886e7d54dc5c4a0c",
|
||||
"s": "0x3dd467b5faa6e5a0f3c22a5396fefa5b03f07d8114d8434e0e1493736aad8d0e",
|
||||
"status": null,
|
||||
"createdContract": null
|
||||
}
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
"response": {
|
||||
"jsonrpc": "2.0",
|
||||
"id": 2,
|
||||
"result": "0x20"
|
||||
"result": "0x22"
|
||||
},
|
||||
"statusCode": 200
|
||||
}
|
||||
@@ -13,7 +13,7 @@
|
||||
"response": {
|
||||
"jsonrpc": "2.0",
|
||||
"id": 3,
|
||||
"result": "0x1b551"
|
||||
"result": "0x1f099"
|
||||
},
|
||||
"statusCode": 200
|
||||
}
|
||||
@@ -14,7 +14,7 @@
|
||||
"response": {
|
||||
"jsonrpc": "2.0",
|
||||
"id": 3,
|
||||
"result": "0x52d4"
|
||||
"result": "0x5238"
|
||||
},
|
||||
"statusCode": 200
|
||||
}
|
||||
|
||||
@@ -5,6 +5,8 @@
|
||||
"method": "eth_estimateGas",
|
||||
"params": [
|
||||
{
|
||||
"to": "0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b",
|
||||
"from": "0x6295ee1b4f6dd65047762f924ecd367c17eabf8f",
|
||||
"gas": "0x1"
|
||||
}
|
||||
]
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
"response": {
|
||||
"jsonrpc": "2.0",
|
||||
"id": 3,
|
||||
"result": "0x5208"
|
||||
"result": "0xcf08"
|
||||
},
|
||||
"statusCode": 200
|
||||
}
|
||||
@@ -17,26 +17,26 @@
|
||||
"jsonrpc": "2.0",
|
||||
"id": 28,
|
||||
"result": {
|
||||
"oldestBlock": "0x1f",
|
||||
"oldestBlock": "0x21",
|
||||
"baseFeePerGas": [
|
||||
"0x0",
|
||||
"0x0",
|
||||
"0x0"
|
||||
"0x3b9aca00",
|
||||
"0x3437004a",
|
||||
"0x2dbc88c1"
|
||||
],
|
||||
"gasUsedRatio": [
|
||||
0.00773588677333021,
|
||||
0.007545537421791245
|
||||
0.004079142040086682,
|
||||
0.003713085594819442
|
||||
],
|
||||
"reward": [
|
||||
[
|
||||
"0x1",
|
||||
"0x1",
|
||||
"0x1"
|
||||
"0x3b9aca00",
|
||||
"0x3b9aca00",
|
||||
"0x3b9aca00"
|
||||
],
|
||||
[
|
||||
"0x1",
|
||||
"0x1",
|
||||
"0x1"
|
||||
"0x3b9aca00",
|
||||
"0x3b9aca00",
|
||||
"0x3b9aca00"
|
||||
]
|
||||
]
|
||||
}
|
||||
|
||||
@@ -12,15 +12,15 @@
|
||||
"jsonrpc": "2.0",
|
||||
"id": 28,
|
||||
"result": {
|
||||
"oldestBlock": "0x1f",
|
||||
"oldestBlock": "0x21",
|
||||
"baseFeePerGas": [
|
||||
"0x0",
|
||||
"0x0",
|
||||
"0x0"
|
||||
"0x3b9aca00",
|
||||
"0x3437004a",
|
||||
"0x2dbc88c1"
|
||||
],
|
||||
"gasUsedRatio": [
|
||||
0.00773588677333021,
|
||||
0.007545537421791245
|
||||
0.004079142040086682,
|
||||
0.003713085594819442
|
||||
]
|
||||
}
|
||||
},
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
"method": "eth_getBalance",
|
||||
"params": [
|
||||
"0x8888f1f195afa192cfee860698584c030f4c9db1",
|
||||
"0x21"
|
||||
"0x120"
|
||||
]
|
||||
},
|
||||
"response": {
|
||||
|
||||
@@ -0,0 +1,71 @@
|
||||
{
|
||||
"request": {
|
||||
"id": 174,
|
||||
"jsonrpc": "2.0",
|
||||
"method": "eth_getBlockByNumber",
|
||||
"params": [
|
||||
"0x22",
|
||||
true
|
||||
]
|
||||
},
|
||||
"response": {
|
||||
"jsonrpc": "2.0",
|
||||
"id": 174,
|
||||
"result": {
|
||||
"number": "0x22",
|
||||
"hash": "0x4859ea10d276f6df988eabd48a02e0696cfd3deb769d2a5e0e416a5f3191028a",
|
||||
"mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
|
||||
"parentHash": "0x30e688f50392780a71899dcb4c35997f5c1d168cf90306d8e6919ea805097810",
|
||||
"nonce": "0x0000000000000000",
|
||||
"sha3Uncles": "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347",
|
||||
"logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
|
||||
"transactionsRoot": "0x16661f63605269a46ad0c5ad8596e5417310a641563d3aa9b74f70cea0e48b49",
|
||||
"stateRoot": "0x34727aff24d1c51cd63fdc14515b15ddaa156fa0671c58a96c72b1553819945d",
|
||||
"receiptsRoot": "0xb56f5313fa6822e1ee3f84487b5b2f12c5e1746778ad39f9a89e5f0239cc9b83",
|
||||
"miner": "0x0000000000000000000000000000000000000000",
|
||||
"difficulty": "0x0",
|
||||
"totalDifficulty": "0x427c00",
|
||||
"extraData": "0x",
|
||||
"baseFeePerGas": "0x3437004a",
|
||||
"size": "0x308",
|
||||
"gasLimit": "0x5fdfb0",
|
||||
"gasUsed": "0x5b22",
|
||||
"timestamp": "0x561bc351",
|
||||
"uncles": [],
|
||||
"transactions": [
|
||||
{
|
||||
"accessList": [],
|
||||
"blockHash": "0x4859ea10d276f6df988eabd48a02e0696cfd3deb769d2a5e0e416a5f3191028a",
|
||||
"blockNumber": "0x22",
|
||||
"chainId": "0x1",
|
||||
"from": "0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b",
|
||||
"gas": "0xc350",
|
||||
"gasPrice": "0x6fd1ca4a",
|
||||
"maxPriorityFeePerGas": "0x3b9aca00",
|
||||
"maxFeePerGas": "0xb2d05e00",
|
||||
"maxFeePerBlobGas": "0x3b9aca00",
|
||||
"hash": "0x7c80f35a47f1d432d46add30f262c45f9578e2b1352dbaca0256af1ff3235532",
|
||||
"input": "0x12a7b914",
|
||||
"nonce": "0x21",
|
||||
"to": "0x6295ee1b4f6dd65047762f924ecd367c17eabf8f",
|
||||
"transactionIndex": "0x0",
|
||||
"type": "0x3",
|
||||
"value": "0x0",
|
||||
"yParity": "0x0",
|
||||
"r": "0x6ae0612cfda43a9b464b10b4881c6fc2e4c24533cf89bbe07934da65c3ae49ce",
|
||||
"s": "0x125387aeb222ec51130cf99cbdabf24bd4a881914faed69f254e4a3f4bc507fc",
|
||||
"blobVersionedHashes": [
|
||||
"0x0100000000000000000000000000000000000000000000000000000000000000",
|
||||
"0x0102000000000000000000000000000000000000000000000000000000000000"
|
||||
]
|
||||
}
|
||||
],
|
||||
"withdrawalsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
|
||||
"withdrawals": [],
|
||||
"blobGasUsed": "0x40000",
|
||||
"excessBlobGas": "0x0",
|
||||
"parentBeaconBlockRoot": "0x0000000000000000000000000000000000000000000000000000000000000000"
|
||||
}
|
||||
},
|
||||
"statusCode": 200
|
||||
}
|
||||
@@ -0,0 +1,78 @@
|
||||
{
|
||||
"request": {
|
||||
"id": 174,
|
||||
"jsonrpc": "2.0",
|
||||
"method": "eth_getBlockByNumber",
|
||||
"params": [
|
||||
"0x21",
|
||||
true
|
||||
]
|
||||
},
|
||||
"response": {
|
||||
"jsonrpc": "2.0",
|
||||
"id": 174,
|
||||
"result": {
|
||||
"number": "0x21",
|
||||
"hash": "0x30e688f50392780a71899dcb4c35997f5c1d168cf90306d8e6919ea805097810",
|
||||
"mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
|
||||
"parentHash": "0x71d59849ddd98543bdfbe8548f5eed559b07b8aaf196369f39134500eab68e53",
|
||||
"nonce": "0x0000000000000000",
|
||||
"sha3Uncles": "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347",
|
||||
"logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
|
||||
"transactionsRoot": "0x319d63b103c713c43e4e9912731ea36906079597e53b128894e8c09d21a5ffad",
|
||||
"stateRoot": "0x0d3c456bb68669bad05da3a1a766daab236c9df1da8f74edf5ebe9383f00084c",
|
||||
"receiptsRoot": "0xd8f831982345c98e4189e8e76c303d833d1dc22f51efa20d717e31b9337a43cb",
|
||||
"miner": "0x0000000000000000000000000000000000000000",
|
||||
"difficulty": "0x0",
|
||||
"totalDifficulty": "0x427c00",
|
||||
"extraData": "0x",
|
||||
"baseFeePerGas": "0x3b9aca00",
|
||||
"size": "0x2f0",
|
||||
"gasLimit": "0x5fdfb0",
|
||||
"gasUsed": "0x641e",
|
||||
"timestamp": "0x561bc347",
|
||||
"uncles": [],
|
||||
"transactions": [
|
||||
{
|
||||
"accessList": [
|
||||
{
|
||||
"address": "0x6295ee1b4f6dd65047762f924ecd367c17eabf8f",
|
||||
"storageKeys": [
|
||||
"0x0000000000000000000000000000000000000000000000000000000000000000"
|
||||
]
|
||||
}
|
||||
],
|
||||
"blockHash": "0x30e688f50392780a71899dcb4c35997f5c1d168cf90306d8e6919ea805097810",
|
||||
"blockNumber": "0x21",
|
||||
"chainId": "0x1",
|
||||
"from": "0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b",
|
||||
"gas": "0xc350",
|
||||
"gasPrice": "0x77359400",
|
||||
"maxPriorityFeePerGas": "0x3b9aca00",
|
||||
"maxFeePerGas": "0xb2d05e00",
|
||||
"hash": "0x3ecd2ca6cf26c864d0ea5f038a58d4cd4a46a3e242fe92f446f392fdc232dd98",
|
||||
"input": "0x12a7b914",
|
||||
"nonce": "0x20",
|
||||
"to": "0x6295ee1b4f6dd65047762f924ecd367c17eabf8f",
|
||||
"transactionIndex": "0x0",
|
||||
"type": "0x2",
|
||||
"value": "0x0",
|
||||
"yParity": "0x0",
|
||||
"v" : "0x0",
|
||||
"r": "0x8abbfbd4c5f2a13a8d5ed394ac50bac7d678f83a23f645818492f76e8ee17ab3",
|
||||
"s": "0x7bd38c6929235f775d68b45bd7dea7981264f9a265b6bea97b070e15be88389c"
|
||||
}
|
||||
],
|
||||
"withdrawalsRoot": "0x37945ab58d2712a26df2a38d217e822694927e29b30d5993d7a53ccea618d1f3",
|
||||
"withdrawals": [
|
||||
{
|
||||
"index": "0x0",
|
||||
"validatorIndex": "0xa",
|
||||
"address": "0x0000000000000000000000000000000000000dad",
|
||||
"amount": "0x2540be400"
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
"statusCode": 200
|
||||
}
|
||||
@@ -10,32 +10,26 @@
|
||||
"response": {
|
||||
"jsonrpc": "2.0",
|
||||
"id": 307,
|
||||
"result": [ {
|
||||
"blockHash" : "0x71d59849ddd98543bdfbe8548f5eed559b07b8aaf196369f39134500eab68e53",
|
||||
"blockNumber" : "0x20",
|
||||
"contractAddress" : null,
|
||||
"cumulativeGasUsed" : "0x5c99",
|
||||
"from" : "0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b",
|
||||
"gasUsed" : "0x5c99",
|
||||
"effectiveGasPrice" : "0x1",
|
||||
"logs" : [ {
|
||||
"address" : "0x6295ee1b4f6dd65047762f924ecd367c17eabf8f",
|
||||
"topics" : [ "0x0000000000000000000000000000000000000000000000000000000000000001", "0x000000000000000000000000a94f5374fce5edbc8e2a8697c15331677e6ebf0b", "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" ],
|
||||
"data" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe9000000000000000000000000000000000000000000000000000000000000002a",
|
||||
"blockNumber" : "0x20",
|
||||
"transactionHash" : "0xcef53f2311d7c80e9086d661e69ac11a5f3d081e28e02a9ba9b66749407ac310",
|
||||
"transactionIndex" : "0x0",
|
||||
"blockHash" : "0x71d59849ddd98543bdfbe8548f5eed559b07b8aaf196369f39134500eab68e53",
|
||||
"logIndex" : "0x0",
|
||||
"removed" : false
|
||||
} ],
|
||||
"logsBloom" : "0x00000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000080000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000400000000000000000200000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000800000000040000000000000000000000000000000000000000010000000000000000000000000",
|
||||
"root" : "0x6d54fb51c667e4cc4bd8f2633b675f831b35d7784a70b5df91cd58f593c5286e",
|
||||
"to" : "0x6295ee1b4f6dd65047762f924ecd367c17eabf8f",
|
||||
"transactionHash" : "0xcef53f2311d7c80e9086d661e69ac11a5f3d081e28e02a9ba9b66749407ac310",
|
||||
"transactionIndex" : "0x0",
|
||||
"type" : "0x0"
|
||||
} ]
|
||||
"result": [
|
||||
{
|
||||
"blockHash": "0x4859ea10d276f6df988eabd48a02e0696cfd3deb769d2a5e0e416a5f3191028a",
|
||||
"blockNumber": "0x22",
|
||||
"contractAddress": null,
|
||||
"cumulativeGasUsed": "0x5b22",
|
||||
"from": "0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b",
|
||||
"gasUsed": "0x5b22",
|
||||
"effectiveGasPrice": "0x6fd1ca4a",
|
||||
"logs": [],
|
||||
"logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
|
||||
"status": "0x1",
|
||||
"to": "0x6295ee1b4f6dd65047762f924ecd367c17eabf8f",
|
||||
"transactionHash": "0x7c80f35a47f1d432d46add30f262c45f9578e2b1352dbaca0256af1ff3235532",
|
||||
"transactionIndex": "0x0",
|
||||
"type": "0x3",
|
||||
"blobGasUsed": "0x40000",
|
||||
"blobGasPrice": "0x1"
|
||||
}
|
||||
]
|
||||
},
|
||||
"statusCode": 200
|
||||
}
|
||||
@@ -4,7 +4,7 @@
|
||||
"jsonrpc": "2.0",
|
||||
"method": "eth_getBlockTransactionCountByNumber",
|
||||
"params": [
|
||||
"0x21"
|
||||
"0x120"
|
||||
]
|
||||
},
|
||||
"response": {
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
"params": [
|
||||
"0x8888f1f195afa192cfee860698584c030f4c9db1",
|
||||
["0x0000000000000000000000000000000000000000000000000000000000000347"],
|
||||
"0x21"
|
||||
"0x120"
|
||||
]
|
||||
},
|
||||
"response": {
|
||||
|
||||
@@ -5,25 +5,34 @@
|
||||
"method": "eth_getProof",
|
||||
"params": [
|
||||
"0x6295ee1b4f6dd65047762f924ecd367c17eabf8f",
|
||||
["0x0000000000000000000000000000000000000000000000000000000000000347"],
|
||||
[
|
||||
"0x0000000000000000000000000000000000000000000000000000000000000347"
|
||||
],
|
||||
"latest"
|
||||
]
|
||||
},
|
||||
"response": {
|
||||
"jsonrpc" : "2.0",
|
||||
"id" : 28,
|
||||
"result" : {
|
||||
"accountProof" : [ "0xf891a084e747fd6c2e7ca25d6f219938c2d9e3014c9e86e3fc3fb0014dcef9d10b6815a097699db78357681938d946074cafa3355e921261ba0bd5081bff15c4f17d0c7f8080808080808080a07ac9345327d90f69293f207fd3dbad91418e38cf6c663c97e8cda89c32448509808080a093e09806aca0b1db534f5e6940b2d43a717c47bf4dfc342a104d9945e82a221d8080", "0xf86ba03b8ec137a2f5a74ec3a73144b552caad890b18b5f725872fa212fff6d4d565bab848f84680820140a0dd3fa56425f8195f314c22547243081293b3f5537cd98ed8f84d4fda3f9a515ba035178fc0de1e7fc754dbd07360e6f80bed818b9e51c62682f312442c4838ac47" ],
|
||||
"address" : "0x6295ee1b4f6dd65047762f924ecd367c17eabf8f",
|
||||
"balance" : "0x140",
|
||||
"codeHash" : "0x35178fc0de1e7fc754dbd07360e6f80bed818b9e51c62682f312442c4838ac47",
|
||||
"nonce" : "0x0",
|
||||
"storageHash" : "0xdd3fa56425f8195f314c22547243081293b3f5537cd98ed8f84d4fda3f9a515b",
|
||||
"storageProof" : [ {
|
||||
"key" : "0x0347",
|
||||
"value" : "0x0",
|
||||
"proof" : [ "0xf8b18080a0c7f91ee5ea67d593275fcc773a02a5e5fb37b0625ca5c5cdc783483d43f2d7c280a06672614c102b0f02e747250bae452ed105110e25761c15a2a459afbd9eb8cf2e808080a0f671e05fab19f512b16fdcbc938f5fbbfbbc2fa67fecb575bb7721c221f71cf78080a0ba2fc36b0235d7ea299126bd4d404cb38456f32a6c236b422a3868f98c69eda1a0d77552655c7b63916586a73350b1933836f2378789613b548b90fa0a44125df180808080"]
|
||||
} ]
|
||||
"jsonrpc": "2.0",
|
||||
"id": 28,
|
||||
"result": {
|
||||
"accountProof": [
|
||||
"0xf8b1a00f23b4d3c6c2980e929008edfaa3cac1d693711fb114c678d3a0e02af00f481fa097699db78357681938d946074cafa3355e921261ba0bd5081bff15c4f17d0c7f808080a04341a174820f23ab9c524d4f8bf0e8c2b6075aaf1c689775ef752f039ad2c6a480808080a07ac9345327d90f69293f207fd3dbad91418e38cf6c663c97e8cda89c32448509808080a093e09806aca0b1db534f5e6940b2d43a717c47bf4dfc342a104d9945e82a221d8080",
|
||||
"0xf86ba03b8ec137a2f5a74ec3a73144b552caad890b18b5f725872fa212fff6d4d565bab848f84680820140a0dd3fa56425f8195f314c22547243081293b3f5537cd98ed8f84d4fda3f9a515ba035178fc0de1e7fc754dbd07360e6f80bed818b9e51c62682f312442c4838ac47"
|
||||
],
|
||||
"address": "0x6295ee1b4f6dd65047762f924ecd367c17eabf8f",
|
||||
"balance": "0x140",
|
||||
"codeHash": "0x35178fc0de1e7fc754dbd07360e6f80bed818b9e51c62682f312442c4838ac47",
|
||||
"nonce": "0x0",
|
||||
"storageHash": "0xdd3fa56425f8195f314c22547243081293b3f5537cd98ed8f84d4fda3f9a515b",
|
||||
"storageProof": [
|
||||
{
|
||||
"key": "0x0347",
|
||||
"value": "0x0",
|
||||
"proof": [
|
||||
"0xf8b18080a0c7f91ee5ea67d593275fcc773a02a5e5fb37b0625ca5c5cdc783483d43f2d7c280a06672614c102b0f02e747250bae452ed105110e25761c15a2a459afbd9eb8cf2e808080a0f671e05fab19f512b16fdcbc938f5fbbfbbc2fa67fecb575bb7721c221f71cf78080a0ba2fc36b0235d7ea299126bd4d404cb38456f32a6c236b422a3868f98c69eda1a0d77552655c7b63916586a73350b1933836f2378789613b548b90fa0a44125df180808080"
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
"statusCode": 200
|
||||
|
||||
@@ -5,25 +5,34 @@
|
||||
"method": "eth_getProof",
|
||||
"params": [
|
||||
"0x6295ee1b4f6dd65047762f924ecd367c17eabf8f",
|
||||
["0x0000000000000000000000000000000000000000000000000000000000000347"],
|
||||
[
|
||||
"0x0000000000000000000000000000000000000000000000000000000000000347"
|
||||
],
|
||||
"pending"
|
||||
]
|
||||
},
|
||||
"response": {
|
||||
"jsonrpc" : "2.0",
|
||||
"id" : 28,
|
||||
"result" : {
|
||||
"accountProof" : [ "0xf891a084e747fd6c2e7ca25d6f219938c2d9e3014c9e86e3fc3fb0014dcef9d10b6815a097699db78357681938d946074cafa3355e921261ba0bd5081bff15c4f17d0c7f8080808080808080a07ac9345327d90f69293f207fd3dbad91418e38cf6c663c97e8cda89c32448509808080a093e09806aca0b1db534f5e6940b2d43a717c47bf4dfc342a104d9945e82a221d8080", "0xf86ba03b8ec137a2f5a74ec3a73144b552caad890b18b5f725872fa212fff6d4d565bab848f84680820140a0dd3fa56425f8195f314c22547243081293b3f5537cd98ed8f84d4fda3f9a515ba035178fc0de1e7fc754dbd07360e6f80bed818b9e51c62682f312442c4838ac47" ],
|
||||
"address" : "0x6295ee1b4f6dd65047762f924ecd367c17eabf8f",
|
||||
"balance" : "0x140",
|
||||
"codeHash" : "0x35178fc0de1e7fc754dbd07360e6f80bed818b9e51c62682f312442c4838ac47",
|
||||
"nonce" : "0x0",
|
||||
"storageHash" : "0xdd3fa56425f8195f314c22547243081293b3f5537cd98ed8f84d4fda3f9a515b",
|
||||
"storageProof" : [ {
|
||||
"key" : "0x0347",
|
||||
"value" : "0x0",
|
||||
"proof" : [ "0xf8b18080a0c7f91ee5ea67d593275fcc773a02a5e5fb37b0625ca5c5cdc783483d43f2d7c280a06672614c102b0f02e747250bae452ed105110e25761c15a2a459afbd9eb8cf2e808080a0f671e05fab19f512b16fdcbc938f5fbbfbbc2fa67fecb575bb7721c221f71cf78080a0ba2fc36b0235d7ea299126bd4d404cb38456f32a6c236b422a3868f98c69eda1a0d77552655c7b63916586a73350b1933836f2378789613b548b90fa0a44125df180808080"]
|
||||
} ]
|
||||
"jsonrpc": "2.0",
|
||||
"id": 28,
|
||||
"result": {
|
||||
"accountProof": [
|
||||
"0xf8b1a00f23b4d3c6c2980e929008edfaa3cac1d693711fb114c678d3a0e02af00f481fa097699db78357681938d946074cafa3355e921261ba0bd5081bff15c4f17d0c7f808080a04341a174820f23ab9c524d4f8bf0e8c2b6075aaf1c689775ef752f039ad2c6a480808080a07ac9345327d90f69293f207fd3dbad91418e38cf6c663c97e8cda89c32448509808080a093e09806aca0b1db534f5e6940b2d43a717c47bf4dfc342a104d9945e82a221d8080",
|
||||
"0xf86ba03b8ec137a2f5a74ec3a73144b552caad890b18b5f725872fa212fff6d4d565bab848f84680820140a0dd3fa56425f8195f314c22547243081293b3f5537cd98ed8f84d4fda3f9a515ba035178fc0de1e7fc754dbd07360e6f80bed818b9e51c62682f312442c4838ac47"
|
||||
],
|
||||
"address": "0x6295ee1b4f6dd65047762f924ecd367c17eabf8f",
|
||||
"balance": "0x140",
|
||||
"codeHash": "0x35178fc0de1e7fc754dbd07360e6f80bed818b9e51c62682f312442c4838ac47",
|
||||
"nonce": "0x0",
|
||||
"storageHash": "0xdd3fa56425f8195f314c22547243081293b3f5537cd98ed8f84d4fda3f9a515b",
|
||||
"storageProof": [
|
||||
{
|
||||
"key": "0x0347",
|
||||
"value": "0x0",
|
||||
"proof": [
|
||||
"0xf8b18080a0c7f91ee5ea67d593275fcc773a02a5e5fb37b0625ca5c5cdc783483d43f2d7c280a06672614c102b0f02e747250bae452ed105110e25761c15a2a459afbd9eb8cf2e808080a0f671e05fab19f512b16fdcbc938f5fbbfbbc2fa67fecb575bb7721c221f71cf78080a0ba2fc36b0235d7ea299126bd4d404cb38456f32a6c236b422a3868f98c69eda1a0d77552655c7b63916586a73350b1933836f2378789613b548b90fa0a44125df180808080"
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
"statusCode": 200
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
"params": [
|
||||
"0x6295ee1b4f6dd65047762f924ecd367c17eabf8f",
|
||||
"0x0",
|
||||
"0x21"
|
||||
"0x120"
|
||||
]
|
||||
},
|
||||
"response": {
|
||||
|
||||
@@ -12,21 +12,30 @@
|
||||
"jsonrpc": "2.0",
|
||||
"id": 482,
|
||||
"result": {
|
||||
"blockHash": "0x71d59849ddd98543bdfbe8548f5eed559b07b8aaf196369f39134500eab68e53",
|
||||
"blockNumber": "0x20",
|
||||
"accessList": [],
|
||||
"blockHash": "0x4859ea10d276f6df988eabd48a02e0696cfd3deb769d2a5e0e416a5f3191028a",
|
||||
"blockNumber": "0x22",
|
||||
"chainId": "0x1",
|
||||
"from": "0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b",
|
||||
"gas": "0x4cb2f",
|
||||
"gasPrice": "0x1",
|
||||
"hash": "0xcef53f2311d7c80e9086d661e69ac11a5f3d081e28e02a9ba9b66749407ac310",
|
||||
"input": "0x9dc2c8f5",
|
||||
"nonce": "0x1f",
|
||||
"gas": "0xc350",
|
||||
"gasPrice": "0x6fd1ca4a",
|
||||
"maxPriorityFeePerGas": "0x3b9aca00",
|
||||
"maxFeePerGas": "0xb2d05e00",
|
||||
"maxFeePerBlobGas": "0x3b9aca00",
|
||||
"hash": "0x7c80f35a47f1d432d46add30f262c45f9578e2b1352dbaca0256af1ff3235532",
|
||||
"input": "0x12a7b914",
|
||||
"nonce": "0x21",
|
||||
"to": "0x6295ee1b4f6dd65047762f924ecd367c17eabf8f",
|
||||
"transactionIndex": "0x0",
|
||||
"type" : "0x0",
|
||||
"value": "0xa",
|
||||
"v": "0x1b",
|
||||
"r": "0x705b002a7df60707d33812e0298411721be20ea5a2f533707295140d89263b79",
|
||||
"s": "0x78024390784f24160739533b3ceea2698289a02afd9cc768581b4aa3d5f4b105"
|
||||
"type": "0x3",
|
||||
"value": "0x0",
|
||||
"yParity": "0x0",
|
||||
"r": "0x6ae0612cfda43a9b464b10b4881c6fc2e4c24533cf89bbe07934da65c3ae49ce",
|
||||
"s": "0x125387aeb222ec51130cf99cbdabf24bd4a881914faed69f254e4a3f4bc507fc",
|
||||
"blobVersionedHashes": [
|
||||
"0x0100000000000000000000000000000000000000000000000000000000000000",
|
||||
"0x0102000000000000000000000000000000000000000000000000000000000000"
|
||||
]
|
||||
}
|
||||
},
|
||||
"statusCode": 200
|
||||
|
||||
@@ -12,21 +12,30 @@
|
||||
"jsonrpc": "2.0",
|
||||
"id": 484,
|
||||
"result": {
|
||||
"blockHash": "0x71d59849ddd98543bdfbe8548f5eed559b07b8aaf196369f39134500eab68e53",
|
||||
"blockNumber": "0x20",
|
||||
"accessList": [],
|
||||
"blockHash": "0x4859ea10d276f6df988eabd48a02e0696cfd3deb769d2a5e0e416a5f3191028a",
|
||||
"blockNumber": "0x22",
|
||||
"chainId": "0x1",
|
||||
"from": "0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b",
|
||||
"gas": "0x4cb2f",
|
||||
"gasPrice": "0x1",
|
||||
"hash": "0xcef53f2311d7c80e9086d661e69ac11a5f3d081e28e02a9ba9b66749407ac310",
|
||||
"input": "0x9dc2c8f5",
|
||||
"nonce": "0x1f",
|
||||
"gas": "0xc350",
|
||||
"gasPrice": "0x6fd1ca4a",
|
||||
"maxPriorityFeePerGas": "0x3b9aca00",
|
||||
"maxFeePerGas": "0xb2d05e00",
|
||||
"maxFeePerBlobGas": "0x3b9aca00",
|
||||
"hash": "0x7c80f35a47f1d432d46add30f262c45f9578e2b1352dbaca0256af1ff3235532",
|
||||
"input": "0x12a7b914",
|
||||
"nonce": "0x21",
|
||||
"to": "0x6295ee1b4f6dd65047762f924ecd367c17eabf8f",
|
||||
"transactionIndex": "0x0",
|
||||
"type" : "0x0",
|
||||
"value": "0xa",
|
||||
"v": "0x1b",
|
||||
"r": "0x705b002a7df60707d33812e0298411721be20ea5a2f533707295140d89263b79",
|
||||
"s": "0x78024390784f24160739533b3ceea2698289a02afd9cc768581b4aa3d5f4b105"
|
||||
"type": "0x3",
|
||||
"value": "0x0",
|
||||
"yParity": "0x0",
|
||||
"r": "0x6ae0612cfda43a9b464b10b4881c6fc2e4c24533cf89bbe07934da65c3ae49ce",
|
||||
"s": "0x125387aeb222ec51130cf99cbdabf24bd4a881914faed69f254e4a3f4bc507fc",
|
||||
"blobVersionedHashes": [
|
||||
"0x0100000000000000000000000000000000000000000000000000000000000000",
|
||||
"0x0102000000000000000000000000000000000000000000000000000000000000"
|
||||
]
|
||||
}
|
||||
},
|
||||
"statusCode": 200
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
"response": {
|
||||
"jsonrpc": "2.0",
|
||||
"id": 488,
|
||||
"result": "0x20"
|
||||
"result": "0x22"
|
||||
},
|
||||
"statusCode": 200
|
||||
}
|
||||
@@ -11,7 +11,7 @@
|
||||
"response": {
|
||||
"jsonrpc": "2.0",
|
||||
"id": 488,
|
||||
"result": "0x20"
|
||||
"result": "0x22"
|
||||
},
|
||||
"statusCode": 200
|
||||
}
|
||||
@@ -50,7 +50,6 @@ import java.util.Collection;
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
import java.util.Optional;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import com.google.common.primitives.Longs;
|
||||
import org.apache.tuweni.bytes.Bytes;
|
||||
@@ -488,18 +487,25 @@ public class Transaction
|
||||
|
||||
@Override
|
||||
public BigInteger getV() {
|
||||
if (transactionType != null && transactionType != TransactionType.FRONTIER) {
|
||||
// EIP-2718 typed transaction, use yParity:
|
||||
return null;
|
||||
} else {
|
||||
final BigInteger recId = BigInteger.valueOf(signature.getRecId());
|
||||
return chainId
|
||||
.map(bigInteger -> recId.add(REPLAY_PROTECTED_V_BASE).add(TWO.multiply(bigInteger)))
|
||||
.orElseGet(() -> recId.add(REPLAY_UNPROTECTED_V_BASE));
|
||||
}
|
||||
}
|
||||
|
||||
final BigInteger recId = BigInteger.valueOf(signature.getRecId());
|
||||
|
||||
@Override
|
||||
public BigInteger getYParity() {
|
||||
if (transactionType != null && transactionType != TransactionType.FRONTIER) {
|
||||
// EIP-2718 typed transaction, return yParity:
|
||||
return recId;
|
||||
return BigInteger.valueOf(signature.getRecId());
|
||||
} else {
|
||||
if (chainId.isEmpty()) {
|
||||
return recId.add(REPLAY_UNPROTECTED_V_BASE);
|
||||
} else {
|
||||
return recId.add(REPLAY_PROTECTED_V_BASE).add(TWO.multiply(chainId.get()));
|
||||
}
|
||||
// legacy types never return yParity
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -532,13 +538,11 @@ public class Transaction
|
||||
private void memoizeHashAndSize() {
|
||||
final Bytes bytes = TransactionEncoder.encodeOpaqueBytes(this, EncodingContext.BLOCK_BODY);
|
||||
hash = Hash.hash(bytes);
|
||||
if (transactionType.supportsBlob()) {
|
||||
if (getBlobsWithCommitments().isPresent()) {
|
||||
final Bytes pooledBytes =
|
||||
TransactionEncoder.encodeOpaqueBytes(this, EncodingContext.POOLED_TRANSACTION);
|
||||
size = pooledBytes.size();
|
||||
return;
|
||||
}
|
||||
if (transactionType.supportsBlob() && getBlobsWithCommitments().isPresent()) {
|
||||
final Bytes pooledBytes =
|
||||
TransactionEncoder.encodeOpaqueBytes(this, EncodingContext.POOLED_TRANSACTION);
|
||||
size = pooledBytes.size();
|
||||
return;
|
||||
}
|
||||
size = bytes.size();
|
||||
}
|
||||
@@ -671,7 +675,7 @@ public class Transaction
|
||||
* @return the list of transaction hashes
|
||||
*/
|
||||
public static List<Hash> toHashList(final Collection<Transaction> transactions) {
|
||||
return transactions.stream().map(Transaction::getHash).collect(Collectors.toUnmodifiableList());
|
||||
return transactions.stream().map(Transaction::getHash).toList();
|
||||
}
|
||||
|
||||
private static Bytes32 computeSenderRecoveryHash(
|
||||
@@ -691,58 +695,44 @@ public class Transaction
|
||||
if (transactionType.requiresChainId()) {
|
||||
checkArgument(chainId.isPresent(), "Transaction type %s requires chainId", transactionType);
|
||||
}
|
||||
final Bytes preimage;
|
||||
switch (transactionType) {
|
||||
case FRONTIER:
|
||||
preimage = frontierPreimage(nonce, gasPrice, gasLimit, to, value, payload, chainId);
|
||||
break;
|
||||
case EIP1559:
|
||||
preimage =
|
||||
eip1559Preimage(
|
||||
nonce,
|
||||
maxPriorityFeePerGas,
|
||||
maxFeePerGas,
|
||||
gasLimit,
|
||||
to,
|
||||
value,
|
||||
payload,
|
||||
chainId,
|
||||
accessList);
|
||||
break;
|
||||
case BLOB:
|
||||
preimage =
|
||||
blobPreimage(
|
||||
nonce,
|
||||
maxPriorityFeePerGas,
|
||||
maxFeePerGas,
|
||||
maxFeePerBlobGas,
|
||||
gasLimit,
|
||||
to,
|
||||
value,
|
||||
payload,
|
||||
chainId,
|
||||
accessList,
|
||||
versionedHashes);
|
||||
break;
|
||||
case ACCESS_LIST:
|
||||
preimage =
|
||||
accessListPreimage(
|
||||
nonce,
|
||||
gasPrice,
|
||||
gasLimit,
|
||||
to,
|
||||
value,
|
||||
payload,
|
||||
accessList.orElseThrow(
|
||||
() ->
|
||||
new IllegalStateException(
|
||||
"Developer error: the transaction should be guaranteed to have an access list here")),
|
||||
chainId);
|
||||
break;
|
||||
default:
|
||||
throw new IllegalStateException(
|
||||
"Developer error. Didn't specify signing hash preimage computation");
|
||||
}
|
||||
final Bytes preimage =
|
||||
switch (transactionType) {
|
||||
case FRONTIER -> frontierPreimage(nonce, gasPrice, gasLimit, to, value, payload, chainId);
|
||||
case EIP1559 -> eip1559Preimage(
|
||||
nonce,
|
||||
maxPriorityFeePerGas,
|
||||
maxFeePerGas,
|
||||
gasLimit,
|
||||
to,
|
||||
value,
|
||||
payload,
|
||||
chainId,
|
||||
accessList);
|
||||
case BLOB -> blobPreimage(
|
||||
nonce,
|
||||
maxPriorityFeePerGas,
|
||||
maxFeePerGas,
|
||||
maxFeePerBlobGas,
|
||||
gasLimit,
|
||||
to,
|
||||
value,
|
||||
payload,
|
||||
chainId,
|
||||
accessList,
|
||||
versionedHashes);
|
||||
case ACCESS_LIST -> accessListPreimage(
|
||||
nonce,
|
||||
gasPrice,
|
||||
gasLimit,
|
||||
to,
|
||||
value,
|
||||
payload,
|
||||
accessList.orElseThrow(
|
||||
() ->
|
||||
new IllegalStateException(
|
||||
"Developer error: the transaction should be guaranteed to have an access list here")),
|
||||
chainId);
|
||||
};
|
||||
return keccak256(preimage);
|
||||
}
|
||||
|
||||
@@ -881,10 +871,9 @@ public class Transaction
|
||||
|
||||
@Override
|
||||
public boolean equals(final Object other) {
|
||||
if (!(other instanceof Transaction)) {
|
||||
if (!(other instanceof Transaction that)) {
|
||||
return false;
|
||||
}
|
||||
final Transaction that = (Transaction) other;
|
||||
return Objects.equals(this.chainId, that.chainId)
|
||||
&& this.gasLimit == that.gasLimit
|
||||
&& Objects.equals(this.gasPrice, that.gasPrice)
|
||||
@@ -926,9 +915,7 @@ public class Transaction
|
||||
sb.append("type=").append(getType()).append(", ");
|
||||
sb.append("nonce=").append(getNonce()).append(", ");
|
||||
getGasPrice()
|
||||
.ifPresent(
|
||||
gasPrice ->
|
||||
sb.append("gasPrice=").append(gasPrice.toHumanReadableString()).append(", "));
|
||||
.ifPresent(gp -> sb.append("gasPrice=").append(gp.toHumanReadableString()).append(", "));
|
||||
if (getMaxPriorityFeePerGas().isPresent() && getMaxFeePerGas().isPresent()) {
|
||||
sb.append("maxPriorityFeePerGas=")
|
||||
.append(getMaxPriorityFeePerGas().map(Wei::toHumanReadableString).get())
|
||||
@@ -981,8 +968,7 @@ public class Transaction
|
||||
sb.append(getSender()).append(", ");
|
||||
sb.append(getType()).append(", ");
|
||||
getGasPrice()
|
||||
.ifPresent(
|
||||
gasPrice -> sb.append("gp: ").append(gasPrice.toHumanReadableString()).append(", "));
|
||||
.ifPresent(gp -> sb.append("gp: ").append(gp.toHumanReadableString()).append(", "));
|
||||
if (getMaxPriorityFeePerGas().isPresent() && getMaxFeePerGas().isPresent()) {
|
||||
sb.append("mf: ")
|
||||
.append(getMaxFeePerGas().map(Wei::toHumanReadableString).get())
|
||||
@@ -995,7 +981,7 @@ public class Transaction
|
||||
}
|
||||
sb.append("gl: ").append(getGasLimit()).append(", ");
|
||||
sb.append("v: ").append(getValue().toHumanReadableString()).append(", ");
|
||||
getTo().ifPresent(to -> sb.append("to: ").append(to));
|
||||
getTo().ifPresent(t -> sb.append("to: ").append(t));
|
||||
return sb.append("}").toString();
|
||||
}
|
||||
|
||||
@@ -1019,26 +1005,18 @@ public class Transaction
|
||||
* @return a copy of the transaction
|
||||
*/
|
||||
public Transaction detachedCopy() {
|
||||
final Optional<Address> detachedTo =
|
||||
to.isEmpty() ? to : Optional.of(Address.wrap(to.get().copy()));
|
||||
final Optional<Address> detachedTo = to.map(address -> Address.wrap(address.copy()));
|
||||
final Optional<List<AccessListEntry>> detachedAccessList =
|
||||
maybeAccessList.isEmpty()
|
||||
? maybeAccessList
|
||||
: Optional.of(
|
||||
maybeAccessList.get().stream().map(this::accessListDetachedCopy).toList());
|
||||
maybeAccessList.map(
|
||||
accessListEntries ->
|
||||
accessListEntries.stream().map(this::accessListDetachedCopy).toList());
|
||||
final Optional<List<VersionedHash>> detachedVersionedHashes =
|
||||
versionedHashes.isEmpty()
|
||||
? versionedHashes
|
||||
: Optional.of(
|
||||
versionedHashes.get().stream()
|
||||
.map(vh -> new VersionedHash(vh.toBytes().copy()))
|
||||
.toList());
|
||||
versionedHashes.map(
|
||||
hashes -> hashes.stream().map(vh -> new VersionedHash(vh.toBytes().copy())).toList());
|
||||
final Optional<BlobsWithCommitments> detachedBlobsWithCommitments =
|
||||
blobsWithCommitments.isEmpty()
|
||||
? blobsWithCommitments
|
||||
: Optional.of(
|
||||
blobsWithCommitmentsDetachedCopy(
|
||||
blobsWithCommitments.get(), detachedVersionedHashes.get()));
|
||||
blobsWithCommitments.map(
|
||||
withCommitments ->
|
||||
blobsWithCommitmentsDetachedCopy(withCommitments, detachedVersionedHashes.get()));
|
||||
|
||||
return new Transaction(
|
||||
true,
|
||||
@@ -1276,7 +1254,7 @@ public class Transaction
|
||||
this.versionedHashes =
|
||||
kzgCommitments.stream()
|
||||
.map(c -> new VersionedHash(SHA256_VERSION_ID, Sha256Hash.sha256(c.getData())))
|
||||
.collect(Collectors.toList());
|
||||
.toList();
|
||||
}
|
||||
this.blobsWithCommitments =
|
||||
new BlobsWithCommitments(kzgCommitments, blobs, kzgProofs, versionedHashes);
|
||||
|
||||
@@ -44,13 +44,13 @@ import org.hyperledger.besu.testutil.BlockTestUtil.ChainResources;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.net.URISyntaxException;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.nio.file.Path;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.Optional;
|
||||
|
||||
import com.google.common.base.Charsets;
|
||||
import com.google.common.io.Resources;
|
||||
|
||||
public class BlockchainSetupUtil {
|
||||
@@ -113,6 +113,10 @@ public class BlockchainSetupUtil {
|
||||
return createForEthashChain(BlockTestUtil.getTestChainResources(), storageFormat);
|
||||
}
|
||||
|
||||
public static BlockchainSetupUtil forHiveTesting(final DataStorageFormat storageFormat) {
|
||||
return createForEthashChain(BlockTestUtil.getHiveTestChainResources(), storageFormat);
|
||||
}
|
||||
|
||||
public static BlockchainSetupUtil forMainnet() {
|
||||
return createForEthashChain(BlockTestUtil.getMainnetResources(), DataStorageFormat.FOREST);
|
||||
}
|
||||
@@ -162,7 +166,8 @@ public class BlockchainSetupUtil {
|
||||
final ProtocolContextProvider protocolContextProvider,
|
||||
final EthScheduler scheduler) {
|
||||
try {
|
||||
final String genesisJson = Resources.toString(chainResources.getGenesisURL(), Charsets.UTF_8);
|
||||
final String genesisJson =
|
||||
Resources.toString(chainResources.getGenesisURL(), StandardCharsets.UTF_8);
|
||||
|
||||
final GenesisConfigFile genesisConfigFile = GenesisConfigFile.fromConfig(genesisJson);
|
||||
final ProtocolSchedule protocolSchedule = protocolScheduleProvider.get(genesisConfigFile);
|
||||
|
||||
Reference in New Issue
Block a user