From ad00217d17fa07710f059089a0402e628004ef65 Mon Sep 17 00:00:00 2001 From: Ameziane H Date: Mon, 8 Jan 2024 18:13:28 +0100 Subject: [PATCH 01/16] Add a sender cache in Transaction.java Signed-off-by: Ameziane H --- .../besu/ethereum/core/Transaction.java | 29 +++++++++++++------ 1 file changed, 20 insertions(+), 9 deletions(-) diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/Transaction.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/Transaction.java index 79261159498..7132a01890c 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/Transaction.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/Transaction.java @@ -19,6 +19,10 @@ import static org.hyperledger.besu.crypto.Hash.keccak256; import static org.hyperledger.besu.datatypes.VersionedHash.SHA256_VERSION_ID; +import com.google.common.cache.Cache; +import com.google.common.cache.CacheBuilder; +import com.google.common.cache.CacheLoader; +import com.google.common.cache.LoadingCache; import org.hyperledger.besu.crypto.KeyPair; import org.hyperledger.besu.crypto.SECPPublicKey; import org.hyperledger.besu.crypto.SECPSignature; @@ -75,6 +79,8 @@ public class Transaction public static final BigInteger TWO = BigInteger.valueOf(2); + public static final Cache senderCache = CacheBuilder.newBuilder().recordStats().maximumSize(100_000L).build(); + private final long nonce; private final Optional gasPrice; @@ -409,16 +415,21 @@ public Optional getChainId() { * @return the transaction sender */ @Override - public Address getSender() { + public synchronized Address getSender() { if (sender == null) { - final SECPPublicKey publicKey = - signatureAlgorithm - .recoverPublicKeyFromSignature(getOrComputeSenderRecoveryHash(), signature) - .orElseThrow( - () -> - new IllegalStateException( - "Cannot recover public key from signature for " + this)); - sender = Address.extract(Hash.hash(publicKey.getEncodedBytes())); + Optional
cachedSender = Optional.ofNullable(senderCache.getIfPresent(this.hash)); + sender = cachedSender.orElseGet(() -> { + final SECPPublicKey publicKey = + signatureAlgorithm + .recoverPublicKeyFromSignature(getOrComputeSenderRecoveryHash(), signature) + .orElseThrow( + () -> + new IllegalStateException( + "Cannot recover public key from signature for " + this)); + Address calculatedSender = Address.extract(Hash.hash(publicKey.getEncodedBytes())); + senderCache.put(this.hash, calculatedSender); + return calculatedSender; + }); } return sender; } From 6b6ba427be5dddbdc0e06c58908a4b3e1b657876 Mon Sep 17 00:00:00 2001 From: Ameziane H Date: Tue, 9 Jan 2024 11:24:37 +0100 Subject: [PATCH 02/16] Manage the case where the transaction hash is not yet calculated Signed-off-by: Ameziane H --- .../besu/ethereum/core/Transaction.java | 33 ++++++++++--------- 1 file changed, 17 insertions(+), 16 deletions(-) diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/Transaction.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/Transaction.java index 7132a01890c..620fb3b8a3b 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/Transaction.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/Transaction.java @@ -19,10 +19,6 @@ import static org.hyperledger.besu.crypto.Hash.keccak256; import static org.hyperledger.besu.datatypes.VersionedHash.SHA256_VERSION_ID; -import com.google.common.cache.Cache; -import com.google.common.cache.CacheBuilder; -import com.google.common.cache.CacheLoader; -import com.google.common.cache.LoadingCache; import org.hyperledger.besu.crypto.KeyPair; import org.hyperledger.besu.crypto.SECPPublicKey; import org.hyperledger.besu.crypto.SECPSignature; @@ -55,6 +51,8 @@ import java.util.Objects; import java.util.Optional; +import com.google.common.cache.Cache; +import com.google.common.cache.CacheBuilder; import com.google.common.primitives.Longs; import org.apache.tuweni.bytes.Bytes; import org.apache.tuweni.bytes.Bytes32; @@ -79,7 +77,8 @@ public class Transaction public static final BigInteger TWO = BigInteger.valueOf(2); - public static final Cache senderCache = CacheBuilder.newBuilder().recordStats().maximumSize(100_000L).build(); + public static final Cache senderCache = + CacheBuilder.newBuilder().recordStats().maximumSize(100_000L).build(); private final long nonce; @@ -417,19 +416,21 @@ public Optional getChainId() { @Override public synchronized Address getSender() { if (sender == null) { - Optional
cachedSender = Optional.ofNullable(senderCache.getIfPresent(this.hash)); - sender = cachedSender.orElseGet(() -> { - final SECPPublicKey publicKey = - signatureAlgorithm + Optional
cachedSender = Optional.ofNullable(senderCache.getIfPresent(getHash())); + sender = + cachedSender.orElseGet( + () -> { + final SECPPublicKey publicKey = + signatureAlgorithm .recoverPublicKeyFromSignature(getOrComputeSenderRecoveryHash(), signature) .orElseThrow( - () -> - new IllegalStateException( - "Cannot recover public key from signature for " + this)); - Address calculatedSender = Address.extract(Hash.hash(publicKey.getEncodedBytes())); - senderCache.put(this.hash, calculatedSender); - return calculatedSender; - }); + () -> + new IllegalStateException( + "Cannot recover public key from signature for " + this)); + Address calculatedSender = Address.extract(Hash.hash(publicKey.getEncodedBytes())); + senderCache.put(this.hash, calculatedSender); + return calculatedSender; + }); } return sender; } From 1e0c6a436d5b8a6b0c52a112799f5614741f6ed3 Mon Sep 17 00:00:00 2001 From: Ameziane H Date: Tue, 9 Jan 2024 14:39:56 +0100 Subject: [PATCH 03/16] Add a change log entry Signed-off-by: Ameziane H --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index ea4b5f915e9..3458a70c25c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,6 +15,7 @@ - Add custom genesis file name to config overview if specified [#6297](https://github.com/hyperledger/besu/pull/6297) - Update Gradle plugins and replace unmaintained License Gradle Plugin with the actively maintained Gradle License Report [#6275](https://github.com/hyperledger/besu/pull/6275) - Optimize RocksDB WAL files, allows for faster restart and a more linear disk space utilization [#6328](https://github.com/hyperledger/besu/pull/6328) +- Add a cache on senders by transaction hash [#6375](https://github.com/hyperledger/besu/pull/6375) ### Bug fixes - INTERNAL_ERROR from `eth_estimateGas` JSON/RPC calls [#6344](https://github.com/hyperledger/besu/issues/6344) From 84ef5f5d5c975f94f76d3d5e827ab73ccd5fe408 Mon Sep 17 00:00:00 2001 From: Ameziane H Date: Fri, 12 Jan 2024 10:30:43 +0100 Subject: [PATCH 04/16] Calculate the senders and the hashes of all the transactions in parallel and asynchronously Signed-off-by: Ameziane H --- .../methods/engine/AbstractEngineNewPayload.java | 12 ++++++++++++ .../hyperledger/besu/ethereum/core/Transaction.java | 2 +- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/AbstractEngineNewPayload.java b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/AbstractEngineNewPayload.java index a5b8acfc056..5f94587180a 100644 --- a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/AbstractEngineNewPayload.java +++ b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/AbstractEngineNewPayload.java @@ -25,6 +25,7 @@ import static org.hyperledger.besu.ethereum.api.jsonrpc.internal.response.RpcErrorType.INVALID_PARAMS; import org.hyperledger.besu.consensus.merge.blockcreation.MergeMiningCoordinator; +import org.hyperledger.besu.datatypes.Address; import org.hyperledger.besu.datatypes.BlobGas; import org.hyperledger.besu.datatypes.Hash; import org.hyperledger.besu.datatypes.VersionedHash; @@ -68,6 +69,7 @@ import java.util.Collections; import java.util.List; import java.util.Optional; +import java.util.concurrent.CompletableFuture; import java.util.stream.Collectors; import io.vertx.core.Vertx; @@ -178,6 +180,16 @@ public JsonRpcResponse syncResponse(final JsonRpcRequestContext requestContext) .map(Bytes::fromHexString) .map(in -> TransactionDecoder.decodeOpaqueBytes(in, EncodingContext.BLOCK_BODY)) .collect(Collectors.toList()); + transactions.forEach( + transaction -> + CompletableFuture.runAsync( + () -> { + Address sender = transaction.getSender(); + LOG.atTrace() + .setMessage("The sender for transaction {} is calculated : {}") + .addArgument(transaction.getHash()) + .addArgument(sender).log(); + })); } catch (final RLPException | IllegalArgumentException e) { return respondWithInvalid( reqId, diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/Transaction.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/Transaction.java index 620fb3b8a3b..31d4c96174b 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/Transaction.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/Transaction.java @@ -414,7 +414,7 @@ public Optional getChainId() { * @return the transaction sender */ @Override - public synchronized Address getSender() { + public Address getSender() { if (sender == null) { Optional
cachedSender = Optional.ofNullable(senderCache.getIfPresent(getHash())); sender = From 527e6f14bee4398be564f20a6e52e75613142ca7 Mon Sep 17 00:00:00 2001 From: Ameziane H Date: Fri, 12 Jan 2024 12:09:47 +0100 Subject: [PATCH 05/16] spotless Signed-off-by: Ameziane H --- .../internal/methods/engine/AbstractEngineNewPayload.java | 3 ++- .../java/org/hyperledger/besu/ethereum/core/Transaction.java | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/AbstractEngineNewPayload.java b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/AbstractEngineNewPayload.java index 5f94587180a..f821047ca18 100644 --- a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/AbstractEngineNewPayload.java +++ b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/AbstractEngineNewPayload.java @@ -188,7 +188,8 @@ public JsonRpcResponse syncResponse(final JsonRpcRequestContext requestContext) LOG.atTrace() .setMessage("The sender for transaction {} is calculated : {}") .addArgument(transaction.getHash()) - .addArgument(sender).log(); + .addArgument(sender) + .log(); })); } catch (final RLPException | IllegalArgumentException e) { return respondWithInvalid( diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/Transaction.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/Transaction.java index 31d4c96174b..86c130fed08 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/Transaction.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/Transaction.java @@ -77,7 +77,7 @@ public class Transaction public static final BigInteger TWO = BigInteger.valueOf(2); - public static final Cache senderCache = + private static final Cache senderCache = CacheBuilder.newBuilder().recordStats().maximumSize(100_000L).build(); private final long nonce; From d8016bce10be91d1777192889dd4f58d3ac9a964 Mon Sep 17 00:00:00 2001 From: Ameziane H Date: Wed, 17 Jan 2024 17:37:25 +0100 Subject: [PATCH 06/16] Use ethScheduler instead of the forkjoin pool for getSender tasks Signed-off-by: Ameziane H --- .../merge/blockcreation/MergeCoordinator.java | 10 ++++++++ .../blockcreation/MergeMiningCoordinator.java | 8 +++++++ .../blockcreation/TransitionCoordinator.java | 11 +++++++++ .../engine/AbstractEngineNewPayload.java | 23 +++++++++++-------- 4 files changed, 42 insertions(+), 10 deletions(-) diff --git a/consensus/merge/src/main/java/org/hyperledger/besu/consensus/merge/blockcreation/MergeCoordinator.java b/consensus/merge/src/main/java/org/hyperledger/besu/consensus/merge/blockcreation/MergeCoordinator.java index 5773a468251..90c618bad74 100644 --- a/consensus/merge/src/main/java/org/hyperledger/besu/consensus/merge/blockcreation/MergeCoordinator.java +++ b/consensus/merge/src/main/java/org/hyperledger/besu/consensus/merge/blockcreation/MergeCoordinator.java @@ -816,6 +816,16 @@ public void onBadChain( }); } + /** + * returns the instance of ethScheduler + * + * @return get the Eth scheduler + */ + @Override + public EthScheduler getEthScheduler() { + return ethScheduler; + } + /** The interface Merge block creator factory. */ @FunctionalInterface protected interface MergeBlockCreatorFactory { diff --git a/consensus/merge/src/main/java/org/hyperledger/besu/consensus/merge/blockcreation/MergeMiningCoordinator.java b/consensus/merge/src/main/java/org/hyperledger/besu/consensus/merge/blockcreation/MergeMiningCoordinator.java index 887fef66299..e351c40f405 100644 --- a/consensus/merge/src/main/java/org/hyperledger/besu/consensus/merge/blockcreation/MergeMiningCoordinator.java +++ b/consensus/merge/src/main/java/org/hyperledger/besu/consensus/merge/blockcreation/MergeMiningCoordinator.java @@ -24,6 +24,7 @@ import org.hyperledger.besu.ethereum.core.Block; import org.hyperledger.besu.ethereum.core.BlockHeader; import org.hyperledger.besu.ethereum.core.Withdrawal; +import org.hyperledger.besu.ethereum.eth.manager.EthScheduler; import java.util.List; import java.util.Optional; @@ -171,6 +172,13 @@ ForkchoiceResult updateForkChoice( */ void finalizeProposalById(final PayloadIdentifier payloadId); + /** + * Return the scheduler + * + * @return the instance of the scheduler + */ + EthScheduler getEthScheduler(); + /** The type Forkchoice result. */ class ForkchoiceResult { /** The enum Status. */ diff --git a/consensus/merge/src/main/java/org/hyperledger/besu/consensus/merge/blockcreation/TransitionCoordinator.java b/consensus/merge/src/main/java/org/hyperledger/besu/consensus/merge/blockcreation/TransitionCoordinator.java index 75da1d22f3b..c0ee724c719 100644 --- a/consensus/merge/src/main/java/org/hyperledger/besu/consensus/merge/blockcreation/TransitionCoordinator.java +++ b/consensus/merge/src/main/java/org/hyperledger/besu/consensus/merge/blockcreation/TransitionCoordinator.java @@ -27,6 +27,7 @@ import org.hyperledger.besu.ethereum.core.BlockHeader; import org.hyperledger.besu.ethereum.core.Transaction; import org.hyperledger.besu.ethereum.core.Withdrawal; +import org.hyperledger.besu.ethereum.eth.manager.EthScheduler; import java.util.List; import java.util.Optional; @@ -228,4 +229,14 @@ public Optional getLatestValidHashOfBadBlock(final Hash blockHash) { public void finalizeProposalById(final PayloadIdentifier payloadId) { mergeCoordinator.finalizeProposalById(payloadId); } + + /** + * returns the instance of ethScheduler + * + * @return get the Eth scheduler + */ + @Override + public EthScheduler getEthScheduler() { + return mergeCoordinator.getEthScheduler(); + } } diff --git a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/AbstractEngineNewPayload.java b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/AbstractEngineNewPayload.java index f821047ca18..a4b128001f3 100644 --- a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/AbstractEngineNewPayload.java +++ b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/AbstractEngineNewPayload.java @@ -65,11 +65,11 @@ import org.hyperledger.besu.plugin.services.exception.StorageException; import java.security.InvalidParameterException; +import java.time.Duration; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Optional; -import java.util.concurrent.CompletableFuture; import java.util.stream.Collectors; import io.vertx.core.Vertx; @@ -182,15 +182,18 @@ public JsonRpcResponse syncResponse(final JsonRpcRequestContext requestContext) .collect(Collectors.toList()); transactions.forEach( transaction -> - CompletableFuture.runAsync( - () -> { - Address sender = transaction.getSender(); - LOG.atTrace() - .setMessage("The sender for transaction {} is calculated : {}") - .addArgument(transaction.getHash()) - .addArgument(sender) - .log(); - })); + mergeCoordinator + .getEthScheduler() + .scheduleFutureTask( + () -> { + Address sender = transaction.getSender(); + LOG.atTrace() + .setMessage("The sender for transaction {} is calculated : {}") + .addArgument(transaction.getHash()) + .addArgument(sender) + .log(); + }, + Duration.ofSeconds(1))); } catch (final RLPException | IllegalArgumentException e) { return respondWithInvalid( reqId, From 2e519106ee254932e3cac6df0979bd4948d32d66 Mon Sep 17 00:00:00 2001 From: Ameziane H Date: Thu, 18 Jan 2024 08:37:36 +0100 Subject: [PATCH 07/16] use scheduleTxWorkerTask instead of scheduleFutureTask Signed-off-by: Ameziane H --- .../internal/methods/engine/AbstractEngineNewPayload.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/AbstractEngineNewPayload.java b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/AbstractEngineNewPayload.java index a4b128001f3..3d220c258fb 100644 --- a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/AbstractEngineNewPayload.java +++ b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/AbstractEngineNewPayload.java @@ -184,7 +184,7 @@ public JsonRpcResponse syncResponse(final JsonRpcRequestContext requestContext) transaction -> mergeCoordinator .getEthScheduler() - .scheduleFutureTask( + .scheduleTxWorkerTask( () -> { Address sender = transaction.getSender(); LOG.atTrace() @@ -192,8 +192,7 @@ public JsonRpcResponse syncResponse(final JsonRpcRequestContext requestContext) .addArgument(transaction.getHash()) .addArgument(sender) .log(); - }, - Duration.ofSeconds(1))); + })); } catch (final RLPException | IllegalArgumentException e) { return respondWithInvalid( reqId, From 4b85796a99ce929aa256932e4a7d27090790b5ce Mon Sep 17 00:00:00 2001 From: Ameziane H Date: Fri, 19 Jan 2024 16:54:28 +0100 Subject: [PATCH 08/16] use scheduleServiceTask instead of scheduleTxWorkerTask Signed-off-by: Ameziane H --- .../internal/methods/engine/AbstractEngineNewPayload.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/AbstractEngineNewPayload.java b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/AbstractEngineNewPayload.java index 3d220c258fb..04db9e90a00 100644 --- a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/AbstractEngineNewPayload.java +++ b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/AbstractEngineNewPayload.java @@ -184,7 +184,7 @@ public JsonRpcResponse syncResponse(final JsonRpcRequestContext requestContext) transaction -> mergeCoordinator .getEthScheduler() - .scheduleTxWorkerTask( + .scheduleServiceTask( () -> { Address sender = transaction.getSender(); LOG.atTrace() From 6323f5f2b39959adc921cb44f0467f41cf6a23a5 Mon Sep 17 00:00:00 2001 From: Ameziane H Date: Fri, 19 Jan 2024 17:01:06 +0100 Subject: [PATCH 09/16] use scheduleServiceTask instead of scheduleTxWorkerTask Signed-off-by: Ameziane H --- .../hyperledger/besu/ethereum/eth/manager/EthScheduler.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/manager/EthScheduler.java b/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/manager/EthScheduler.java index 43f8d6a4c35..56360534ec9 100644 --- a/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/manager/EthScheduler.java +++ b/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/manager/EthScheduler.java @@ -142,6 +142,10 @@ public CompletableFuture scheduleServiceTask(final Supplier task) { return CompletableFuture.supplyAsync(task, servicesExecutor); } + public CompletableFuture scheduleServiceTask(final Runnable task) { + return CompletableFuture.runAsync(task, servicesExecutor); + } + public CompletableFuture scheduleServiceTask(final EthTask task) { final CompletableFuture serviceFuture = task.runAsync(servicesExecutor); pendingFutures.add(serviceFuture); From 6c42a111caf5c1ae996f6c37027c523394f7632c Mon Sep 17 00:00:00 2001 From: Ameziane H Date: Wed, 24 Jan 2024 11:09:13 +0100 Subject: [PATCH 10/16] spotless + use transaction workers and increase the number of threads to 4 Signed-off-by: Ameziane H --- .../internal/methods/engine/AbstractEngineNewPayload.java | 3 +-- .../besu/ethereum/eth/sync/SynchronizerConfiguration.java | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/AbstractEngineNewPayload.java b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/AbstractEngineNewPayload.java index 04db9e90a00..52f1c6130d5 100644 --- a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/AbstractEngineNewPayload.java +++ b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/AbstractEngineNewPayload.java @@ -65,7 +65,6 @@ import org.hyperledger.besu.plugin.services.exception.StorageException; import java.security.InvalidParameterException; -import java.time.Duration; import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -184,7 +183,7 @@ public JsonRpcResponse syncResponse(final JsonRpcRequestContext requestContext) transaction -> mergeCoordinator .getEthScheduler() - .scheduleServiceTask( + .scheduleTxWorkerTask( () -> { Address sender = transaction.getSender(); LOG.atTrace() diff --git a/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/sync/SynchronizerConfiguration.java b/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/sync/SynchronizerConfiguration.java index ee542b1b0f7..2a6ec11ed6b 100644 --- a/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/sync/SynchronizerConfiguration.java +++ b/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/sync/SynchronizerConfiguration.java @@ -43,7 +43,7 @@ public class SynchronizerConfiguration { public static final int DEFAULT_DOWNLOADER_CHECKPOINT_TIMEOUTS_PERMITTED = 5; public static final int DEFAULT_DOWNLOADER_CHAIN_SEGMENT_SIZE = 200; public static final int DEFAULT_DOWNLOADER_PARALLELISM = 4; - public static final int DEFAULT_TRANSACTIONS_PARALLELISM = 2; + public static final int DEFAULT_TRANSACTIONS_PARALLELISM = 4; public static final int DEFAULT_COMPUTATION_PARALLELISM = 2; public static final int DEFAULT_WORLD_STATE_TASK_CACHE_SIZE = CachingTaskCollection.DEFAULT_CACHE_SIZE; From 1e6aa0c84764018e4becf7cf91beda2a1752a78d Mon Sep 17 00:00:00 2001 From: Ameziane H Date: Wed, 24 Jan 2024 11:39:47 +0100 Subject: [PATCH 11/16] Plugin API new hash Signed-off-by: Ameziane H --- plugin-api/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugin-api/build.gradle b/plugin-api/build.gradle index d271094604d..c72ad934339 100644 --- a/plugin-api/build.gradle +++ b/plugin-api/build.gradle @@ -69,7 +69,7 @@ Calculated : ${currentHash} tasks.register('checkAPIChanges', FileStateChecker) { description = "Checks that the API for the Plugin-API project does not change without deliberate thought" files = sourceSets.main.allJava.files - knownHash = 'N583pqJipDs4kJkgL0cPq9PBsYdsLzvUlu2I8Kk+w7g=' + knownHash = 'ZsovOR0oPfomcLP4b+HjikWzM0Tx6sCwi68mf5qwZf4=' } check.dependsOn('checkAPIChanges') From f2f52256ce68671680860175a372ba6b15402932 Mon Sep 17 00:00:00 2001 From: Ameziane H Date: Wed, 24 Jan 2024 12:14:48 +0100 Subject: [PATCH 12/16] Plugin API new hash Signed-off-by: Ameziane H --- plugin-api/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugin-api/build.gradle b/plugin-api/build.gradle index c72ad934339..d8b5df01a7e 100644 --- a/plugin-api/build.gradle +++ b/plugin-api/build.gradle @@ -69,7 +69,7 @@ Calculated : ${currentHash} tasks.register('checkAPIChanges', FileStateChecker) { description = "Checks that the API for the Plugin-API project does not change without deliberate thought" files = sourceSets.main.allJava.files - knownHash = 'ZsovOR0oPfomcLP4b+HjikWzM0Tx6sCwi68mf5qwZf4=' + knownHash = 'vvTxv3CgYak1E0RNmWfEOne9nQblsGTNxE2oOKDGFDE=' } check.dependsOn('checkAPIChanges') From 6a67a420a5de499b6004f46c67d8ea7af39c0fc4 Mon Sep 17 00:00:00 2001 From: Ameziane H Date: Wed, 7 Feb 2024 13:36:42 +0100 Subject: [PATCH 13/16] Plugin API new hash + refactoring Signed-off-by: Ameziane H --- .../besu/ethereum/core/Transaction.java | 28 +++++++++---------- plugin-api/build.gradle | 3 +- 2 files changed, 15 insertions(+), 16 deletions(-) diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/Transaction.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/Transaction.java index 063d0cdadbd..2b4b7ac165b 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/Transaction.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/Transaction.java @@ -417,24 +417,24 @@ public Optional getChainId() { public Address getSender() { if (sender == null) { Optional
cachedSender = Optional.ofNullable(senderCache.getIfPresent(getHash())); - sender = - cachedSender.orElseGet( - () -> { - final SECPPublicKey publicKey = - signatureAlgorithm - .recoverPublicKeyFromSignature(getOrComputeSenderRecoveryHash(), signature) - .orElseThrow( - () -> - new IllegalStateException( - "Cannot recover public key from signature for " + this)); - Address calculatedSender = Address.extract(Hash.hash(publicKey.getEncodedBytes())); - senderCache.put(this.hash, calculatedSender); - return calculatedSender; - }); + sender = cachedSender.orElseGet(this::computeSender); } return sender; } + private Address computeSender() { + final SECPPublicKey publicKey = + signatureAlgorithm + .recoverPublicKeyFromSignature(getOrComputeSenderRecoveryHash(), signature) + .orElseThrow( + () -> + new IllegalStateException( + "Cannot recover public key from signature for " + this)); + Address calculatedSender = Address.extract(Hash.hash(publicKey.getEncodedBytes())); + senderCache.put(this.hash, calculatedSender); + return calculatedSender; + } + /** * Returns the public key extracted from the signature. * diff --git a/plugin-api/build.gradle b/plugin-api/build.gradle index 8faeb0c756e..ade07493c03 100644 --- a/plugin-api/build.gradle +++ b/plugin-api/build.gradle @@ -69,8 +69,7 @@ Calculated : ${currentHash} tasks.register('checkAPIChanges', FileStateChecker) { description = "Checks that the API for the Plugin-API project does not change without deliberate thought" files = sourceSets.main.allJava.files - knownHash = 'vvTxv3CgYak1E0RNmWfEOne9nQblsGTNxE2oOKDGFDE=' - + knownHash = '3+WNtdl1idY70N/MwVBbopU2ZWyWiu12YV1qaYXprZ8=' } check.dependsOn('checkAPIChanges') From e8b4a9a384274237e9ed80b056239c4ee096b48f Mon Sep 17 00:00:00 2001 From: Ameziane H Date: Wed, 7 Feb 2024 15:41:39 +0100 Subject: [PATCH 14/16] Update transaction unit tests following the add of the new field in Transaction.java Signed-off-by: Ameziane H --- .../besu/ethereum/eth/transactions/PendingTransaction.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/transactions/PendingTransaction.java b/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/transactions/PendingTransaction.java index a622507b190..1c4462e6e65 100644 --- a/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/transactions/PendingTransaction.java +++ b/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/transactions/PendingTransaction.java @@ -31,8 +31,8 @@ public abstract class PendingTransaction implements org.hyperledger.besu.datatypes.PendingTransaction { static final int NOT_INITIALIZED = -1; - static final int FRONTIER_AND_ACCESS_LIST_BASE_MEMORY_SIZE = 872; - static final int EIP1559_AND_EIP4844_BASE_MEMORY_SIZE = 984; + static final int FRONTIER_AND_ACCESS_LIST_BASE_MEMORY_SIZE = 888; + static final int EIP1559_AND_EIP4844_BASE_MEMORY_SIZE = 1000; static final int OPTIONAL_TO_MEMORY_SIZE = 112; static final int OPTIONAL_CHAIN_ID_MEMORY_SIZE = 80; static final int PAYLOAD_BASE_MEMORY_SIZE = 32; From 985ce12149ce46a658bd119fefcb32e9d0d702dc Mon Sep 17 00:00:00 2001 From: Ameziane H Date: Thu, 8 Feb 2024 10:26:11 +0100 Subject: [PATCH 15/16] Refactoring Signed-off-by: Ameziane H --- .../hyperledger/besu/ethereum/core/Transaction.java | 2 +- .../ethereum/eth/transactions/PendingTransaction.java | 10 +++++----- .../PendingTransactionEstimatedMemorySizeTest.java | 4 ++-- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/Transaction.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/Transaction.java index 2b4b7ac165b..6aec8e6646b 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/Transaction.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/Transaction.java @@ -430,7 +430,7 @@ private Address computeSender() { () -> new IllegalStateException( "Cannot recover public key from signature for " + this)); - Address calculatedSender = Address.extract(Hash.hash(publicKey.getEncodedBytes())); + final Address calculatedSender = Address.extract(Hash.hash(publicKey.getEncodedBytes())); senderCache.put(this.hash, calculatedSender); return calculatedSender; } diff --git a/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/transactions/PendingTransaction.java b/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/transactions/PendingTransaction.java index 1c4462e6e65..09723c10ec2 100644 --- a/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/transactions/PendingTransaction.java +++ b/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/transactions/PendingTransaction.java @@ -31,8 +31,8 @@ public abstract class PendingTransaction implements org.hyperledger.besu.datatypes.PendingTransaction { static final int NOT_INITIALIZED = -1; - static final int FRONTIER_AND_ACCESS_LIST_BASE_MEMORY_SIZE = 888; - static final int EIP1559_AND_EIP4844_BASE_MEMORY_SIZE = 1000; + static final int FRONTIER_AND_ACCESS_LIST_SHALLOW_MEMORY_SIZE = 888; + static final int EIP1559_AND_EIP4844_SHALLOW_MEMORY_SIZE = 1000; static final int OPTIONAL_TO_MEMORY_SIZE = 112; static final int OPTIONAL_CHAIN_ID_MEMORY_SIZE = 80; static final int PAYLOAD_BASE_MEMORY_SIZE = 32; @@ -136,14 +136,14 @@ private int computeMemorySize() { } private int computeFrontierMemorySize() { - return FRONTIER_AND_ACCESS_LIST_BASE_MEMORY_SIZE + return FRONTIER_AND_ACCESS_LIST_SHALLOW_MEMORY_SIZE + computePayloadMemorySize() + computeToMemorySize() + computeChainIdMemorySize(); } private int computeAccessListMemorySize() { - return FRONTIER_AND_ACCESS_LIST_BASE_MEMORY_SIZE + return FRONTIER_AND_ACCESS_LIST_SHALLOW_MEMORY_SIZE + computePayloadMemorySize() + computeToMemorySize() + computeChainIdMemorySize() @@ -151,7 +151,7 @@ private int computeAccessListMemorySize() { } private int computeEIP1559MemorySize() { - return EIP1559_AND_EIP4844_BASE_MEMORY_SIZE + return EIP1559_AND_EIP4844_SHALLOW_MEMORY_SIZE + computePayloadMemorySize() + computeToMemorySize() + computeChainIdMemorySize() diff --git a/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/transactions/PendingTransactionEstimatedMemorySizeTest.java b/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/transactions/PendingTransactionEstimatedMemorySizeTest.java index 20b94f5bf8c..1710a6cb230 100644 --- a/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/transactions/PendingTransactionEstimatedMemorySizeTest.java +++ b/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/transactions/PendingTransactionEstimatedMemorySizeTest.java @@ -381,7 +381,7 @@ public void baseEIP1559AndEIP4844TransactionMemorySize() { System.out.println("Base EIP1559 size: " + eip1559size); assertThat(eip1559size.sum()) - .isEqualTo(PendingTransaction.EIP1559_AND_EIP4844_BASE_MEMORY_SIZE); + .isEqualTo(PendingTransaction.EIP1559_AND_EIP4844_SHALLOW_MEMORY_SIZE); } @Test @@ -426,7 +426,7 @@ public void baseFrontierAndAccessListTransactionMemorySize() { System.out.println("Base Frontier size: " + frontierSize); assertThat(frontierSize.sum()) - .isEqualTo(PendingTransaction.FRONTIER_AND_ACCESS_LIST_BASE_MEMORY_SIZE); + .isEqualTo(PendingTransaction.FRONTIER_AND_ACCESS_LIST_SHALLOW_MEMORY_SIZE); } private GraphWalker getGraphWalker( From 4e25a7b251904ffd9fa7966fc5d5373ef82dcd6a Mon Sep 17 00:00:00 2001 From: ahamlat Date: Thu, 8 Feb 2024 14:15:44 +0100 Subject: [PATCH 16/16] Update ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/AbstractEngineNewPayload.java Co-authored-by: Fabio Di Fabio Signed-off-by: ahamlat --- .../internal/methods/engine/AbstractEngineNewPayload.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/AbstractEngineNewPayload.java b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/AbstractEngineNewPayload.java index 6d0ff98f4d7..a0c86d942c4 100644 --- a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/AbstractEngineNewPayload.java +++ b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/AbstractEngineNewPayload.java @@ -188,7 +188,7 @@ public JsonRpcResponse syncResponse(final JsonRpcRequestContext requestContext) Address sender = transaction.getSender(); LOG.atTrace() .setMessage("The sender for transaction {} is calculated : {}") - .addArgument(transaction.getHash()) + .addArgument(transaction::getHash) .addArgument(sender) .log(); }));