From db9710b2aafde17ea850cde88c97779f66102eec Mon Sep 17 00:00:00 2001 From: Danno Ferrin Date: Sun, 16 Jun 2024 01:43:51 -0600 Subject: [PATCH 01/58] check initcode size earlier (#7233) Fail earlier with the initcode size check Signed-off-by: Danno Ferrin --- .../besu/evm/operation/AbstractCreateOperation.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/evm/src/main/java/org/hyperledger/besu/evm/operation/AbstractCreateOperation.java b/evm/src/main/java/org/hyperledger/besu/evm/operation/AbstractCreateOperation.java index a484f28ce..180eac279 100644 --- a/evm/src/main/java/org/hyperledger/besu/evm/operation/AbstractCreateOperation.java +++ b/evm/src/main/java/org/hyperledger/besu/evm/operation/AbstractCreateOperation.java @@ -104,6 +104,11 @@ public abstract class AbstractCreateOperation extends AbstractOperation { Code code = codeSupplier.get(); + if (code != null && code.getSize() > maxInitcodeSize) { + frame.popStackItems(getStackItemsConsumed()); + return new OperationResult(cost, ExceptionalHaltReason.CODE_TOO_LARGE); + } + if (value.compareTo(account.getBalance()) > 0 || frame.getDepth() >= 1024 || account.getNonce() == -1 @@ -113,14 +118,9 @@ public abstract class AbstractCreateOperation extends AbstractOperation { } else { account.incrementNonce(); - if (code.getSize() > maxInitcodeSize) { - frame.popStackItems(getStackItemsConsumed()); - return new OperationResult(cost, ExceptionalHaltReason.CODE_TOO_LARGE); - } if (!code.isValid()) { fail(frame); } else { - frame.decrementRemainingGas(cost); spawnChildMessage(frame, code, evm); frame.incrementRemainingGas(cost); From aef938964d0fc421517547cd58482ca53f94b8b8 Mon Sep 17 00:00:00 2001 From: Chaminda Divitotawela Date: Tue, 18 Jun 2024 11:42:50 +1000 Subject: [PATCH 02/58] fix: workflow permission to upload trivy sarif report (#7234) Trivy scan result upload to GitHub fails due to permission issue. Added permission security-events=write to the workflow file as a fix. Since workflow permission explicitly defined, it requires contents=read explicity set as well Signed-off-by: Chaminda Divitotawela --- .github/workflows/container-security-scan.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/container-security-scan.yml b/.github/workflows/container-security-scan.yml index 85065c828..f945d1322 100644 --- a/.github/workflows/container-security-scan.yml +++ b/.github/workflows/container-security-scan.yml @@ -14,6 +14,9 @@ on: jobs: scan-sarif: runs-on: ubuntu-latest + permissions: + contents: read + security-events: write steps: - name: Checkout From 86b9c38015590923c3c24d0599a17385c55c7332 Mon Sep 17 00:00:00 2001 From: Chaminda Divitotawela Date: Wed, 19 Jun 2024 10:28:05 +1000 Subject: [PATCH 03/58] container verify GitHub workflow (#7239) Container verification step in release process automated with the container verify GitHub workflow. New workflow is triggered at the end of the release workflow which will check the release container images starts successfully. Verification test only checks container starts and reach the Ethereum main loop Signed-off-by: Chaminda Divitotawela --- .github/workflows/BesuContainerVerify.sh | 70 ++++++++++++++++++++++++ .github/workflows/container-verify.yml | 57 +++++++++++++++++++ .github/workflows/release.yml | 14 +++++ 3 files changed, 141 insertions(+) create mode 100644 .github/workflows/BesuContainerVerify.sh create mode 100644 .github/workflows/container-verify.yml diff --git a/.github/workflows/BesuContainerVerify.sh b/.github/workflows/BesuContainerVerify.sh new file mode 100644 index 000000000..81537f326 --- /dev/null +++ b/.github/workflows/BesuContainerVerify.sh @@ -0,0 +1,70 @@ +#!/bin/bash +## +## Copyright contributors to Hyperledger Besu. +## +## Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with +## the License. You may obtain a copy of the License at +## +## http://www.apache.org/licenses/LICENSE-2.0 +## +## Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on +## an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the +## specific language governing permissions and limitations under the License. +## +## SPDX-License-Identifier: Apache-2.0 +## + +CONTAINER_NAME=${CONTAINER_NAME:-besu} +VERSION=${VERSION} +TAG=${TAG} +CHECK_LATEST=${CHECK_LATEST} +RETRY=${RETRY:-10} +SLEEP=${SLEEP:-5} + +# Helper function to throw error +log_error() { + echo "::error $1" + exit 1 +} + +# Check container is in running state +_RUN_STATE=$(docker inspect --type=container -f={{.State.Status}} ${CONTAINER_NAME}) +if [[ "${_RUN_STATE}" != "running" ]] +then + log_error "container is not running" +fi + +# Check for specific log message in container logs to verify besu started +_SUCCESS=false +while [[ ${_SUCCESS} != "true" && $RETRY -gt 0 ]] +do + docker logs ${CONTAINER_NAME} | grep -q "Ethereum main loop is up" && { + _SUCCESS=true + continue + } + echo "Waiting for the besu to start. Remaining retries $RETRY ..." + RETRY=$(expr $RETRY - 1) + sleep $SLEEP +done + +# Log entry does not present after all retries, fail the script with a message +if [[ ${_SUCCESS} != "true" ]] +then + docker logs --tail=100 ${CONTAINER_NAME} + log_error "could not find the log message 'Ethereum main loop is up'" +else + echo "Besu container started and entered main loop" +fi + +# For the latest tag check the version match +if [[ ${TAG} == "latest" && ${CHECK_LATEST} == "true" ]] +then + _VERSION_IN_LOG=$(docker logs ${CONTAINER_NAME} | grep "#" | grep "Besu version" | cut -d " " -f 4 | sed 's/\s//g') + echo "Extracted version from logs [$_VERSION_IN_LOG]" + if [[ "$_VERSION_IN_LOG" != "${VERSION}" ]] + then + log_error "version [$_VERSION_IN_LOG] extracted from container logs does not match the expected version [${VERSION}]" + else + echo "Latest Besu container version matches" + fi +fi diff --git a/.github/workflows/container-verify.yml b/.github/workflows/container-verify.yml new file mode 100644 index 000000000..c8f5726af --- /dev/null +++ b/.github/workflows/container-verify.yml @@ -0,0 +1,57 @@ +name: container verify + +on: + workflow_dispatch: + inputs: + version: + description: 'Besu version' + required: true + verify-latest-version: + description: 'Check latest container version' + required: false + type: choice + default: "true" + options: + - "true" + - "false" + +jobs: + verify: + timeout-minutes: 4 + strategy: + matrix: + combination: + - tag: ${{ inputs.version }} + platform: '' + runner: ubuntu-latest + - tag: ${{ inputs.version }}-amd64 + platform: 'linux/amd64' + runner: ubuntu-latest + - tag: latest + platform: '' + runner: ubuntu-latest + - tag: ${{ inputs.version }}-arm64 + platform: '' + runner: besu-arm64 + runs-on: ${{ matrix.combination.runner }} + env: + CONTAINER_NAME: besu-check + steps: + - name: Checkout + uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 + + - name: Start container + run: | + PLATFORM_OPT="" + [[ x${{ matrix.combination.platform }} != 'x' ]] && PLATFORM_OPT="--platform ${{ matrix.combination.platform }}" + docker run -d $PLATFORM_OPT --name ${{ env.CONTAINER_NAME }} hyperledger/besu:${{ matrix.combination.tag }} + + - name: Verify besu container + run: bash .github/workflows/BesuContainerVerify.sh + env: + TAG: ${{ matrix.combination.tag }} + VERSION: ${{ inputs.version }} + CHECK_LATEST: ${{ inputs.verify-latest-version }} + + - name: Stop container + run: docker stop ${{ env.CONTAINER_NAME }} diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index b1f8fb2fc..2aff0bb48 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -265,3 +265,17 @@ jobs: run: ./gradlew "-Prelease.releaseVersion=${{ github.event.release.name }}" "-PdockerOrgName=${{ env.registry }}/${{ secrets.DOCKER_ORG }}" dockerUploadRelease - name: Docker manifest run: ./gradlew "-Prelease.releaseVersion=${{ github.event.release.name }}" "-PdockerOrgName=${{ env.registry }}/${{ secrets.DOCKER_ORG }}" manifestDockerRelease + + verifyContainer: + needs: dockerPromoteX64 + runs-on: ubuntu-22.04 + permissions: + contents: read + actions: write + steps: + - name: Checkout + uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 + - name: Trigger container verify + run: echo '{"version":"${{ github.event.release.name }}","verify-latest-version":"true"}' | gh workflow run container-verify.yml --json + env: + GH_TOKEN: ${{ github.token }} From f5e5ad53e770715f5438d3e9c74a77cfe8cfc97b Mon Sep 17 00:00:00 2001 From: Stefan Pingel <16143240+pinges@users.noreply.github.com> Date: Thu, 20 Jun 2024 14:54:20 +1000 Subject: [PATCH 04/58] Investigate chain halts when syncing (#7162) Fix some reasons for chain download halts when syncing Signed-off-by: stefan.pingel@consensys.net Signed-off-by: Stefan Pingel <16143240+pinges@users.noreply.github.com> Co-authored-by: Sally MacFarlane --- CHANGELOG.md | 2 + .../MergeBesuControllerBuilder.java | 2 +- .../besu/ethereum/eth/manager/EthPeers.java | 51 ++++++++++++------- .../ethereum/eth/manager/EthScheduler.java | 5 -- .../RetryingGetAccountRangeFromPeerTask.java | 6 ++- .../task/AbstractRetryingPeerTask.java | 11 ++-- .../sync/fastsync/PivotBlockRetriever.java | 2 +- .../eth/sync/fastsync/SyncTargetManager.java | 21 +++++--- .../fullsync/BetterSyncTargetEvaluator.java | 2 +- .../eth/sync/range/RangeHeadersFetcher.java | 38 +++++++++++--- .../eth/sync/range/SyncTargetRangeSource.java | 23 ++++++--- .../eth/sync/tasks/CompleteBlocksTask.java | 2 +- .../tasks/DownloadHeaderSequenceTask.java | 2 +- .../sync/tasks/GetReceiptsForHeadersTask.java | 2 +- .../BetterSyncTargetEvaluatorTest.java | 2 +- .../connections/AbstractPeerConnection.java | 23 +++++---- .../rlpx/wire/messages/DisconnectMessage.java | 1 + 17 files changed, 130 insertions(+), 65 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3724ed84a..bac2d7c55 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,6 +15,8 @@ ### Bug fixes - Validation errors ignored in accounts-allowlist and empty list [#7138](https://github.com/hyperledger/besu/issues/7138) - Fix "Invalid block detected" for BFT chains using Bonsai DB [#7204](https://github.com/hyperledger/besu/pull/7204) +- Fix "Could not confirm best peer had pivot block" [#7109](https://github.com/hyperledger/besu/issues/7109) +- Fix "Chain Download Halt" [#6884](https://github.com/hyperledger/besu/issues/6884) ## 24.6.0 diff --git a/besu/src/main/java/org/hyperledger/besu/controller/MergeBesuControllerBuilder.java b/besu/src/main/java/org/hyperledger/besu/controller/MergeBesuControllerBuilder.java index e391f920c..1e8da674a 100644 --- a/besu/src/main/java/org/hyperledger/besu/controller/MergeBesuControllerBuilder.java +++ b/besu/src/main/java/org/hyperledger/besu/controller/MergeBesuControllerBuilder.java @@ -104,7 +104,7 @@ public class MergeBesuControllerBuilder extends BesuControllerBuilder { var mergeBestPeerComparator = new TransitionBestPeerComparator( genesisConfigOptions.getTerminalTotalDifficulty().map(Difficulty::of).orElseThrow()); - ethPeers.setBestChainComparator(mergeBestPeerComparator); + ethPeers.setBestPeerComparator(mergeBestPeerComparator); mergeContext.observeNewIsPostMergeState(mergeBestPeerComparator); Optional filterToUse = Optional.of(new MergePeerFilter()); diff --git a/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/manager/EthPeers.java b/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/manager/EthPeers.java index 2a4469220..bef7a1a03 100644 --- a/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/manager/EthPeers.java +++ b/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/manager/EthPeers.java @@ -198,9 +198,12 @@ public class EthPeers { peer.handleDisconnect(); abortPendingRequestsAssignedToDisconnectedPeers(); if (peer.getReputation().getScore() > USEFULL_PEER_SCORE_THRESHOLD) { - LOG.debug("Disconnected USEFULL peer {}", peer); + LOG.atDebug().setMessage("Disconnected USEFULL peer {}").addArgument(peer).log(); } else { - LOG.debug("Disconnected EthPeer {}", peer.getLoggableId()); + LOG.atDebug() + .setMessage("Disconnected EthPeer {}") + .addArgument(peer.getLoggableId()) + .log(); } } } @@ -318,11 +321,11 @@ public class EthPeers { public Stream streamBestPeers() { return streamAvailablePeers() .filter(EthPeer::isFullyValidated) - .sorted(getBestChainComparator().reversed()); + .sorted(getBestPeerComparator().reversed()); } public Optional bestPeer() { - return streamAvailablePeers().max(getBestChainComparator()); + return streamAvailablePeers().max(getBestPeerComparator()); } public Optional bestPeerWithHeightEstimate() { @@ -331,15 +334,15 @@ public class EthPeers { } public Optional bestPeerMatchingCriteria(final Predicate matchesCriteria) { - return streamAvailablePeers().filter(matchesCriteria).max(getBestChainComparator()); + return streamAvailablePeers().filter(matchesCriteria).max(getBestPeerComparator()); } - public void setBestChainComparator(final Comparator comparator) { + public void setBestPeerComparator(final Comparator comparator) { LOG.info("Updating the default best peer comparator"); bestPeerComparator = comparator; } - public Comparator getBestChainComparator() { + public Comparator getBestPeerComparator() { return bestPeerComparator; } @@ -394,8 +397,7 @@ public class EthPeers { public void disconnectWorstUselessPeer() { streamAvailablePeers() - .sorted(getBestChainComparator()) - .findFirst() + .min(getBestPeerComparator()) .ifPresent( peer -> { LOG.atDebug() @@ -551,10 +553,11 @@ public class EthPeers { if (!randomPeerPriority) { // Disconnect if too many peers if (!canExceedPeerLimits(id) && peerCount() >= peerUpperBound) { - LOG.trace( - "Too many peers. Disconnect connection: {}, max connections {}", - connection, - peerUpperBound); + LOG.atTrace() + .setMessage("Too many peers. Disconnect connection: {}, max connections {}") + .addArgument(connection) + .addArgument(peerUpperBound) + .log(); connection.disconnect(DisconnectMessage.DisconnectReason.TOO_MANY_PEERS); return false; } @@ -562,18 +565,28 @@ public class EthPeers { if (connection.inboundInitiated() && !canExceedPeerLimits(id) && remoteConnectionLimitReached()) { - LOG.trace( - "Too many remotely-initiated connections. Disconnect incoming connection: {}, maxRemote={}", - connection, - maxRemotelyInitiatedConnections); + LOG.atTrace() + .setMessage( + "Too many remotely-initiated connections. Disconnect incoming connection: {}, maxRemote={}") + .addArgument(connection) + .addArgument(maxRemotelyInitiatedConnections) + .log(); connection.disconnect(DisconnectMessage.DisconnectReason.TOO_MANY_PEERS); return false; } final boolean added = (completeConnections.putIfAbsent(id, peer) == null); if (added) { - LOG.trace("Added peer {} with connection {} to completeConnections", id, connection); + LOG.atTrace() + .setMessage("Added peer {} with connection {} to completeConnections") + .addArgument(id) + .addArgument(connection) + .log(); } else { - LOG.trace("Did not add peer {} with connection {} to completeConnections", id, connection); + LOG.atTrace() + .setMessage("Did not add peer {} with connection {} to completeConnections") + .addArgument(id) + .addArgument(connection) + .log(); } return added; } else { 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 717a0bb24..dcb666966 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 @@ -47,7 +47,6 @@ import org.slf4j.LoggerFactory; public class EthScheduler { private static final Logger LOG = LoggerFactory.getLogger(EthScheduler.class); - private final Duration defaultTimeout = Duration.ofSeconds(5); private final AtomicBoolean stopped = new AtomicBoolean(false); private final CountDownLatch shutdown = new CountDownLatch(1); private static final int TX_WORKER_CAPACITY = 1_000; @@ -219,10 +218,6 @@ public class EthScheduler { return CompletableFuture.runAsync(task, blockCreationExecutor); } - public CompletableFuture timeout(final EthTask task) { - return timeout(task, defaultTimeout); - } - public CompletableFuture timeout(final EthTask task, final Duration timeout) { final CompletableFuture future = task.run(); final CompletableFuture result = timeout(future, timeout); diff --git a/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/manager/snap/RetryingGetAccountRangeFromPeerTask.java b/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/manager/snap/RetryingGetAccountRangeFromPeerTask.java index 103172b08..36d6b75e6 100644 --- a/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/manager/snap/RetryingGetAccountRangeFromPeerTask.java +++ b/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/manager/snap/RetryingGetAccountRangeFromPeerTask.java @@ -30,6 +30,7 @@ import org.apache.tuweni.bytes.Bytes32; public class RetryingGetAccountRangeFromPeerTask extends AbstractRetryingPeerTask { + public static final int MAX_RETRIES = 4; private final EthContext ethContext; private final Bytes32 startKeyHash; private final Bytes32 endKeyHash; @@ -43,7 +44,10 @@ public class RetryingGetAccountRangeFromPeerTask final BlockHeader blockHeader, final MetricsSystem metricsSystem) { super( - ethContext, 4, data -> data.accounts().isEmpty() && data.proofs().isEmpty(), metricsSystem); + ethContext, + MAX_RETRIES, + data -> data.accounts().isEmpty() && data.proofs().isEmpty(), + metricsSystem); this.ethContext = ethContext; this.startKeyHash = startKeyHash; this.endKeyHash = endKeyHash; diff --git a/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/manager/task/AbstractRetryingPeerTask.java b/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/manager/task/AbstractRetryingPeerTask.java index cf48d6984..46c3cf1b2 100644 --- a/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/manager/task/AbstractRetryingPeerTask.java +++ b/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/manager/task/AbstractRetryingPeerTask.java @@ -122,15 +122,18 @@ public abstract class AbstractRetryingPeerTask extends AbstractEthTask { () -> ethContext .getScheduler() + // wait for a new peer for up to 5 seconds .timeout(waitTask, Duration.ofSeconds(5)) + // execute the task again .whenComplete((r, t) -> executeTaskTimed())); return; } - LOG.debug( - "Retrying after recoverable failure from peer task {}: {}", - this.getClass().getSimpleName(), - cause.getMessage()); + LOG.atDebug() + .setMessage("Retrying after recoverable failure from peer task {}: {}") + .addArgument(this.getClass().getSimpleName()) + .addArgument(cause.getMessage()) + .log(); // Wait before retrying on failure executeSubTask( () -> diff --git a/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/sync/fastsync/PivotBlockRetriever.java b/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/sync/fastsync/PivotBlockRetriever.java index 6ddd7db90..d8ff36271 100644 --- a/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/sync/fastsync/PivotBlockRetriever.java +++ b/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/sync/fastsync/PivotBlockRetriever.java @@ -39,7 +39,7 @@ import org.slf4j.LoggerFactory; public class PivotBlockRetriever { private static final Logger LOG = LoggerFactory.getLogger(PivotBlockRetriever.class); - public static final int MAX_QUERY_RETRIES_PER_PEER = 4; + public static final int MAX_QUERY_RETRIES_PER_PEER = 5; private static final int DEFAULT_MAX_PIVOT_BLOCK_RESETS = 250; private static final int SUSPICIOUS_NUMBER_OF_RETRIES = 5; diff --git a/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/sync/fastsync/SyncTargetManager.java b/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/sync/fastsync/SyncTargetManager.java index c19e06f99..b587b18f2 100644 --- a/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/sync/fastsync/SyncTargetManager.java +++ b/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/sync/fastsync/SyncTargetManager.java @@ -31,6 +31,7 @@ import org.hyperledger.besu.ethereum.p2p.rlpx.wire.messages.DisconnectMessage.Di import org.hyperledger.besu.ethereum.worldstate.WorldStateStorageCoordinator; import org.hyperledger.besu.plugin.services.MetricsSystem; +import java.time.Duration; import java.util.List; import java.util.Optional; import java.util.concurrent.CompletableFuture; @@ -41,6 +42,7 @@ import org.slf4j.LoggerFactory; public class SyncTargetManager extends AbstractSyncTargetManager { private static final Logger LOG = LoggerFactory.getLogger(SyncTargetManager.class); + private static final int SECONDS_PER_REQUEST = 6; // 5s per request + 1s wait between retries private final WorldStateStorageCoordinator worldStateStorageCoordinator; private final ProtocolSchedule protocolSchedule; @@ -93,7 +95,9 @@ public class SyncTargetManager extends AbstractSyncTargetManager { return completedFuture(Optional.empty()); } else { final EthPeer bestPeer = maybeBestPeer.get(); - if (bestPeer.chainState().getEstimatedHeight() < pivotBlockHeader.getNumber()) { + // Do not check the best peers estimated height if we are doing PoS + if (!protocolSchedule.getByBlockHeader(pivotBlockHeader).isPoS() + && bestPeer.chainState().getEstimatedHeight() < pivotBlockHeader.getNumber()) { LOG.info( "Best peer {} has chain height {} below pivotBlock height {}. Waiting for better peers. Current {} of max {}", maybeBestPeer.map(EthPeer::getLoggableId).orElse("none"), @@ -121,7 +125,8 @@ public class SyncTargetManager extends AbstractSyncTargetManager { task.assignPeer(bestPeer); return ethContext .getScheduler() - .timeout(task) + // Task is a retrying task. Make sure that the timeout is long enough to allow for retries. + .timeout(task, Duration.ofSeconds(MAX_QUERY_RETRIES_PER_PEER * SECONDS_PER_REQUEST + 2)) .thenCompose( result -> { if (peerHasDifferentPivotBlock(result)) { @@ -147,11 +152,13 @@ public class SyncTargetManager extends AbstractSyncTargetManager { }) .exceptionally( error -> { - LOG.debug( - "Could not confirm best peer {} had pivot block {}", - bestPeer.getLoggableId(), - pivotBlockHeader.getNumber(), - error); + LOG.atDebug() + .setMessage("Could not confirm best peer {} had pivot block {}, {}") + .addArgument(bestPeer.getLoggableId()) + .addArgument(pivotBlockHeader.getNumber()) + .addArgument(error) + .log(); + bestPeer.disconnect(DisconnectReason.USELESS_PEER_CANNOT_CONFIRM_PIVOT_BLOCK); return Optional.empty(); }); } diff --git a/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/sync/fullsync/BetterSyncTargetEvaluator.java b/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/sync/fullsync/BetterSyncTargetEvaluator.java index 68aa5ec95..1df59c654 100644 --- a/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/sync/fullsync/BetterSyncTargetEvaluator.java +++ b/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/sync/fullsync/BetterSyncTargetEvaluator.java @@ -40,7 +40,7 @@ public class BetterSyncTargetEvaluator { return maybeBestPeer .map( bestPeer -> { - if (ethPeers.getBestChainComparator().compare(bestPeer, currentSyncTarget) <= 0) { + if (ethPeers.getBestPeerComparator().compare(bestPeer, currentSyncTarget) <= 0) { // Our current target is better or equal to the best peer return false; } diff --git a/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/sync/range/RangeHeadersFetcher.java b/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/sync/range/RangeHeadersFetcher.java index 8ee1dc28a..e73c5aa9f 100644 --- a/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/sync/range/RangeHeadersFetcher.java +++ b/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/sync/range/RangeHeadersFetcher.java @@ -68,6 +68,10 @@ public class RangeHeadersFetcher { public CompletableFuture> getNextRangeHeaders( final EthPeer peer, final BlockHeader previousRangeHeader) { + LOG.atTrace() + .setMessage("Requesting next range headers from peer {}") + .addArgument(peer.getLoggableId()) + .log(); final int skip = syncConfig.getDownloaderChainSegmentSize() - 1; final int maximumHeaderRequestSize = syncConfig.getDownloaderHeaderRequestSize(); final long previousRangeNumber = previousRangeHeader.getNumber(); @@ -78,11 +82,20 @@ public class RangeHeadersFetcher { final BlockHeader targetHeader = finalRangeHeader.get(); final long blocksUntilTarget = targetHeader.getNumber() - previousRangeNumber; if (blocksUntilTarget <= 0) { + LOG.atTrace() + .setMessage("Requesting next range headers: no blocks until target: {}") + .addArgument(blocksUntilTarget) + .log(); return completedFuture(emptyList()); } final long maxHeadersToRequest = blocksUntilTarget / (skip + 1); additionalHeaderCount = (int) Math.min(maxHeadersToRequest, maximumHeaderRequestSize); if (additionalHeaderCount == 0) { + LOG.atTrace() + .setMessage( + "Requesting next range headers: additional header count is 0, blocks until target: {}") + .addArgument(blocksUntilTarget) + .log(); return completedFuture(singletonList(targetHeader)); } } else { @@ -97,11 +110,12 @@ public class RangeHeadersFetcher { final BlockHeader referenceHeader, final int headerCount, final int skip) { - LOG.trace( - "Requesting {} range headers, starting from {}, {} blocks apart", - headerCount, - referenceHeader.getNumber(), - skip); + LOG.atTrace() + .setMessage("Requesting {} range headers, starting from {}, {} blocks apart") + .addArgument(headerCount) + .addArgument(referenceHeader.getNumber()) + .addArgument(skip) + .log(); return GetHeadersFromPeerByHashTask.startingAtHash( protocolSchedule, ethContext, @@ -114,7 +128,19 @@ public class RangeHeadersFetcher { .assignPeer(peer) .run() .thenApply(PeerTaskResult::getResult) - .thenApply(headers -> stripExistingRangeHeaders(referenceHeader, headers)); + .thenApply( + headers -> { + if (headers.size() < headerCount) { + LOG.atTrace() + .setMessage( + "Peer {} returned fewer headers than requested. Expected: {}, Actual: {}") + .addArgument(peer) + .addArgument(headerCount) + .addArgument(headers.size()) + .log(); + } + return stripExistingRangeHeaders(referenceHeader, headers); + }); } private List stripExistingRangeHeaders( diff --git a/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/sync/range/SyncTargetRangeSource.java b/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/sync/range/SyncTargetRangeSource.java index 8c6186448..05d789922 100644 --- a/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/sync/range/SyncTargetRangeSource.java +++ b/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/sync/range/SyncTargetRangeSource.java @@ -40,6 +40,7 @@ import org.slf4j.LoggerFactory; public class SyncTargetRangeSource implements Iterator { private static final Logger LOG = LoggerFactory.getLogger(SyncTargetRangeSource.class); private static final Duration RETRY_DELAY_DURATION = Duration.ofSeconds(2); + public static final int DEFAULT_TIME_TO_WAIT_IN_SECONDS = 6; private final RangeHeadersFetcher fetcher; private final SyncTargetChecker syncTargetChecker; @@ -70,7 +71,7 @@ public class SyncTargetRangeSource implements Iterator { peer, commonAncestor, retriesPermitted, - Duration.ofSeconds(5), + Duration.ofSeconds(DEFAULT_TIME_TO_WAIT_IN_SECONDS), terminationCondition); } @@ -153,7 +154,7 @@ public class SyncTargetRangeSource implements Iterator { if (retryCount >= retriesPermitted) { LOG.atDebug() .setMessage( - "Disconnecting target peer for providing useless or empty range header: {}.") + "Disconnecting target peer {} for providing useless or empty range headers.") .addArgument(peer) .log(); peer.disconnect(DisconnectMessage.DisconnectReason.USELESS_PEER_USELESS_RESPONSES); @@ -169,12 +170,20 @@ public class SyncTargetRangeSource implements Iterator { } catch (final InterruptedException e) { LOG.trace("Interrupted while waiting for new range headers", e); return null; - } catch (final ExecutionException e) { - LOG.debug("Failed to retrieve new range headers", e); - this.pendingRequests = Optional.empty(); + } catch (final ExecutionException | TimeoutException e) { + if (e instanceof ExecutionException) { + this.pendingRequests = Optional.empty(); + } retryCount++; - return null; - } catch (final TimeoutException e) { + if (retryCount >= retriesPermitted) { + LOG.atDebug() + .setMessage( + "Disconnecting target peer {} for not providing useful range headers: Exception: {}.") + .addArgument(peer) + .addArgument(e) + .log(); + peer.disconnect(DisconnectMessage.DisconnectReason.USELESS_PEER_USELESS_RESPONSES); + } return null; } } diff --git a/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/sync/tasks/CompleteBlocksTask.java b/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/sync/tasks/CompleteBlocksTask.java index bdd59260e..524851af5 100644 --- a/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/sync/tasks/CompleteBlocksTask.java +++ b/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/sync/tasks/CompleteBlocksTask.java @@ -51,7 +51,7 @@ public class CompleteBlocksTask extends AbstractRetryingPeerTask> { private static final Logger LOG = LoggerFactory.getLogger(CompleteBlocksTask.class); private static final int MIN_SIZE_INCOMPLETE_LIST = 1; - private static final int DEFAULT_RETRIES = 4; + private static final int DEFAULT_RETRIES = 5; private final EthContext ethContext; private final ProtocolSchedule protocolSchedule; diff --git a/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/sync/tasks/DownloadHeaderSequenceTask.java b/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/sync/tasks/DownloadHeaderSequenceTask.java index 3049d3f1a..8ca376902 100644 --- a/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/sync/tasks/DownloadHeaderSequenceTask.java +++ b/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/sync/tasks/DownloadHeaderSequenceTask.java @@ -56,7 +56,7 @@ import org.slf4j.LoggerFactory; */ public class DownloadHeaderSequenceTask extends AbstractRetryingPeerTask> { private static final Logger LOG = LoggerFactory.getLogger(DownloadHeaderSequenceTask.class); - private static final int DEFAULT_RETRIES = 4; + private static final int DEFAULT_RETRIES = 5; private final EthContext ethContext; private final ProtocolContext protocolContext; diff --git a/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/sync/tasks/GetReceiptsForHeadersTask.java b/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/sync/tasks/GetReceiptsForHeadersTask.java index 699bf9c4b..58c4d3a7a 100644 --- a/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/sync/tasks/GetReceiptsForHeadersTask.java +++ b/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/sync/tasks/GetReceiptsForHeadersTask.java @@ -42,7 +42,7 @@ import org.slf4j.LoggerFactory; public class GetReceiptsForHeadersTask extends AbstractRetryingPeerTask>> { private static final Logger LOG = LoggerFactory.getLogger(GetReceiptsForHeadersTask.class); - private static final int DEFAULT_RETRIES = 4; + private static final int DEFAULT_RETRIES = 5; private final EthContext ethContext; diff --git a/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/sync/fullsync/BetterSyncTargetEvaluatorTest.java b/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/sync/fullsync/BetterSyncTargetEvaluatorTest.java index 9acf45965..0bc98aaa9 100644 --- a/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/sync/fullsync/BetterSyncTargetEvaluatorTest.java +++ b/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/sync/fullsync/BetterSyncTargetEvaluatorTest.java @@ -49,7 +49,7 @@ public class BetterSyncTargetEvaluatorTest { @BeforeEach public void setupMocks() { - when(ethPeers.getBestChainComparator()).thenReturn(EthPeers.HEAVIEST_CHAIN); + when(ethPeers.getBestPeerComparator()).thenReturn(EthPeers.HEAVIEST_CHAIN); } @Test diff --git a/ethereum/p2p/src/main/java/org/hyperledger/besu/ethereum/p2p/rlpx/connections/AbstractPeerConnection.java b/ethereum/p2p/src/main/java/org/hyperledger/besu/ethereum/p2p/rlpx/connections/AbstractPeerConnection.java index 7fcc02687..59cf34905 100644 --- a/ethereum/p2p/src/main/java/org/hyperledger/besu/ethereum/p2p/rlpx/connections/AbstractPeerConnection.java +++ b/ethereum/p2p/src/main/java/org/hyperledger/besu/ethereum/p2p/rlpx/connections/AbstractPeerConnection.java @@ -185,15 +185,20 @@ public abstract class AbstractPeerConnection implements PeerConnection { @Override public void disconnect(final DisconnectReason reason) { if (disconnected.compareAndSet(false, true)) { - connectionEventDispatcher.dispatchDisconnect(this, reason, false); - doSend(null, DisconnectMessage.create(reason)); - LOG.atDebug() - .setMessage("Disconnecting connection {}, peer {} reason {}") - .addArgument(this.hashCode()) - .addArgument(peer.getLoggableId()) - .addArgument(reason) - .log(); - closeConnection(); + try { + // send the disconnect message first, in case the dispatchDisconnect throws an exception + doSend(null, DisconnectMessage.create(reason)); + LOG.atDebug() + .setMessage("Disconnecting connection {}, peer {} reason {}") + .addArgument(this.hashCode()) + .addArgument(peer.getLoggableId()) + .addArgument(reason) + .log(); + connectionEventDispatcher.dispatchDisconnect(this, reason, false); + } finally { + // always close the connection + closeConnection(); + } } } diff --git a/ethereum/p2p/src/main/java/org/hyperledger/besu/ethereum/p2p/rlpx/wire/messages/DisconnectMessage.java b/ethereum/p2p/src/main/java/org/hyperledger/besu/ethereum/p2p/rlpx/wire/messages/DisconnectMessage.java index 663379033..87df88c40 100644 --- a/ethereum/p2p/src/main/java/org/hyperledger/besu/ethereum/p2p/rlpx/wire/messages/DisconnectMessage.java +++ b/ethereum/p2p/src/main/java/org/hyperledger/besu/ethereum/p2p/rlpx/wire/messages/DisconnectMessage.java @@ -131,6 +131,7 @@ public final class DisconnectMessage extends AbstractMessageData { USELESS_PEER_MISMATCHED_PIVOT_BLOCK((byte) 0x03, "Mismatched pivot block"), USELESS_PEER_FAILED_TO_RETRIEVE_CHAIN_STATE( (byte) 0x03, "Failed to retrieve header for chain state"), + USELESS_PEER_CANNOT_CONFIRM_PIVOT_BLOCK((byte) 0x03, "Peer failed to confirm pivot block"), USELESS_PEER_BY_REPUTATION((byte) 0x03, "Lowest reputation score"), USELESS_PEER_BY_CHAIN_COMPARATOR((byte) 0x03, "Lowest by chain height comparator"), TOO_MANY_PEERS((byte) 0x04), From 3026268f1542da4d329cf016e81b6455d82ddc61 Mon Sep 17 00:00:00 2001 From: Danno Ferrin Date: Thu, 20 Jun 2024 10:20:40 -0600 Subject: [PATCH 05/58] Check for EOFCreate subcontainer rules (#7232) Check and test for the unused container rule, and only returncontract targets can have truncated data rule. Also test the other subcontainer rules in unit tests. Signed-off-by: Danno Ferrin --- .../ethereum/eof/EOFReferenceTestTools.java | 18 + .../besu/evm/code/CodeV1Validation.java | 12 + .../hyperledger/besu/evm/code/EOFLayout.java | 10 + .../besu/evm/code/CodeFactoryTest.java | 438 +++++++++++++++++- .../besu/evm/code/EOFLayoutTest.java | 16 +- 5 files changed, 480 insertions(+), 14 deletions(-) diff --git a/ethereum/referencetests/src/reference-test/java/org/hyperledger/besu/ethereum/eof/EOFReferenceTestTools.java b/ethereum/referencetests/src/reference-test/java/org/hyperledger/besu/ethereum/eof/EOFReferenceTestTools.java index cf7ce66b0..22bf38390 100644 --- a/ethereum/referencetests/src/reference-test/java/org/hyperledger/besu/ethereum/eof/EOFReferenceTestTools.java +++ b/ethereum/referencetests/src/reference-test/java/org/hyperledger/besu/ethereum/eof/EOFReferenceTestTools.java @@ -72,6 +72,24 @@ public class EOFReferenceTestTools { // TXCREATE still in tests, but has been removed params.ignore("EOF1_undefined_opcodes_186"); + + // embedded containers rules changed + params.ignore("EOF1_embedded_container"); + + // truncated data is only allowed in embedded containers + params.ignore("ori/validInvalid-Prague\\[validInvalid_48\\]"); + params.ignore("efExample/validInvalid-Prague\\[validInvalid_1\\]"); + params.ignore("efValidation/EOF1_truncated_section-Prague\\[EOF1_truncated_section_3\\]"); + params.ignore("efValidation/EOF1_truncated_section-Prague\\[EOF1_truncated_section_4\\]"); + params.ignore("EIP3540/validInvalid-Prague\\[validInvalid_2\\]"); + params.ignore("EIP3540/validInvalid-Prague\\[validInvalid_3\\]"); + + // Orphan containers are no longer allowed + params.ignore("efValidation/EOF1_returncontract_valid-Prague\\[EOF1_returncontract_valid_1\\]"); + params.ignore("efValidation/EOF1_returncontract_valid-Prague\\[EOF1_returncontract_valid_2\\]"); + params.ignore("efValidation/EOF1_eofcreate_valid-Prague\\[EOF1_eofcreate_valid_1\\]"); + params.ignore("efValidation/EOF1_eofcreate_valid-Prague\\[EOF1_eofcreate_valid_2\\]"); + params.ignore("efValidation/EOF1_section_order-Prague\\[EOF1_section_order_6\\]"); } private EOFReferenceTestTools() { diff --git a/evm/src/main/java/org/hyperledger/besu/evm/code/CodeV1Validation.java b/evm/src/main/java/org/hyperledger/besu/evm/code/CodeV1Validation.java index b52f1dfeb..c940a7d93 100644 --- a/evm/src/main/java/org/hyperledger/besu/evm/code/CodeV1Validation.java +++ b/evm/src/main/java/org/hyperledger/besu/evm/code/CodeV1Validation.java @@ -67,6 +67,8 @@ public final class CodeV1Validation { * @param layout The parsed EOFLayout of the code * @return either null, indicating no error, or a String describing the validation error. */ + @SuppressWarnings( + "ReferenceEquality") // comparison `container != layout` is deliberate and correct public static String validate(final EOFLayout layout) { Queue workList = new ArrayDeque<>(layout.getSubcontainerCount()); workList.add(layout); @@ -74,6 +76,16 @@ public final class CodeV1Validation { while (!workList.isEmpty()) { EOFLayout container = workList.poll(); workList.addAll(List.of(container.subContainers())); + if (container != layout && container.containerMode().get() == null) { + return "Unreferenced container #" + layout.indexOfSubcontainer(container); + } + if (container.containerMode().get() != RUNTIME + && container.data().size() != container.dataLength()) { + return "Incomplete data section " + + (container == layout + ? " at root" + : " in container #" + layout.indexOfSubcontainer(container)); + } final String codeValidationError = CodeV1Validation.validateCode(container); if (codeValidationError != null) { diff --git a/evm/src/main/java/org/hyperledger/besu/evm/code/EOFLayout.java b/evm/src/main/java/org/hyperledger/besu/evm/code/EOFLayout.java index 95ad7f95d..1cce49b45 100644 --- a/evm/src/main/java/org/hyperledger/besu/evm/code/EOFLayout.java +++ b/evm/src/main/java/org/hyperledger/besu/evm/code/EOFLayout.java @@ -405,6 +405,16 @@ public record EOFLayout( return subContainers[i]; } + /** + * Finds the first instance of the subcontainer in the list of container, or -1 if not present + * + * @param container the container to search for + * @return the index of the container, or -1 if not found. + */ + public int indexOfSubcontainer(final EOFLayout container) { + return Arrays.asList(subContainers).indexOf(container); + } + /** * Is valid. * diff --git a/evm/src/test/java/org/hyperledger/besu/evm/code/CodeFactoryTest.java b/evm/src/test/java/org/hyperledger/besu/evm/code/CodeFactoryTest.java index d3335d077..75ec9eb01 100644 --- a/evm/src/test/java/org/hyperledger/besu/evm/code/CodeFactoryTest.java +++ b/evm/src/test/java/org/hyperledger/besu/evm/code/CodeFactoryTest.java @@ -15,10 +15,10 @@ package org.hyperledger.besu.evm.code; import static org.assertj.core.api.Assertions.assertThat; +import static org.hyperledger.besu.evm.EOFTestConstants.bytesFromPrettyPrint; import org.hyperledger.besu.evm.Code; -import org.apache.tuweni.bytes.Bytes; import org.junit.jupiter.api.Test; class CodeFactoryTest { @@ -178,13 +178,445 @@ class CodeFactoryTest { invalidCode("0xEF0001010002030004006000AABBCCDD"); } + @Test + void invalidDataTruncated() { + invalidCode("EF0001 010004 0200010001 040003 00 00800000 FE BEEF", "Incomplete data section"); + } + + @Test + void validComboEOFCreateReturnContract() { + validCode( + """ + 0x # EOF + ef0001 # Magic and Version ( 1 ) + 010004 # Types length ( 4 ) + 020001 # Total code sections ( 1 ) + 0011 # Code section 0 , 17 bytes + 030001 # Total subcontainers ( 1 ) + 0032 # Sub container 0, 50 byte + 040000 # Data section length( 0 ) + 00 # Terminator (end of header) + # Code section 0 types + 00 # 0 inputs\s + 80 # 0 outputs (Non-returning function) + 0004 # max stack: 4 + # Code section 0 - in=0 out=non-returning height=4 + 6000 # [0] PUSH1(0) + 6000 # [2] PUSH1(0) + 6000 # [4] PUSH1(0) + 6000 # [6] PUSH1(0) + ec00 # [8] EOFCREATE(0) + 612015 # [10] PUSH2(0x2015) + 6001 # [13] PUSH1(1) + 55 # [15] SSTORE + 00 # [16] STOP + # Subcontainer 0 starts here + ef0001 # Magic and Version ( 1 ) + 010004 # Types length ( 4 ) + 020001 # Total code sections ( 1 ) + 0006 # Code section 0 , 6 bytes + 030001 # Total subcontainers ( 1 ) + 0014 # Sub container 0, 20 byte + 040000 # Data section length( 0 ) \s + 00 # Terminator (end of header) + # Code section 0 types + 00 # 0 inputs\s + 80 # 0 outputs (Non-returning function) + 0002 # max stack: 2 + # Code section 0 - in=0 out=non-returning height=2 + 6000 # [0] PUSH1(0) + 6000 # [2] PUSH1(0) + ee00 # [4] RETURNCONTRACT(0) + # Subcontainer 0.0 starts here + ef0001 # Magic and Version ( 1 ) + 010004 # Types length ( 4 ) + 020001 # Total code sections ( 1 ) + 0001 # Code section 0 , 1 bytes + 040000 # Data section length( 0 ) \s + 00 # Terminator (end of header) + # Code section 0 types + 00 # 0 inputs\s + 80 # 0 outputs (Non-returning function) + 0000 # max stack: 0 + # Code section 0 - in=0 out=non-returning height=0 + 00 # [0] STOP + # Data section (empty) + # Subcontainer 0.0 ends + # Data section (empty) + # Subcontainer 0 ends + # Data section (empty) + """); + } + + @Test + void validComboReturnContactStop() { + validCode( + """ + 0x # EOF + ef0001 # Magic and Version ( 1 ) + 010004 # Types length ( 4 ) + 020001 # Total code sections ( 1 ) + 000c # Code section 0 , 12 bytes + 030001 # Total subcontainers ( 1 ) + 0014 # Sub container 0, 20 byte + 040000 # Data section length( 0 ) + 00 # Terminator (end of header) + # Code section 0 types + 00 # 0 inputs\s + 80 # 0 outputs (Non-returning function) + 0002 # max stack: 2 + # Code section 0 - in=0 out=non-returning height=2 + 612015 # [0] PUSH2(0x2015) + 6001 # [3] PUSH1(1) + 55 # [5] SSTORE + 6000 # [6] PUSH1(0) + 6000 # [8] PUSH1(0) + ee00 # [10] RETURNCONTRACT(0) + # Subcontainer 0 starts here + ef0001 # Magic and Version ( 1 ) + 010004 # Types length ( 4 ) + 020001 # Total code sections ( 1 ) + 0001 # Code section 0 , 1 bytes + 040000 # Data section length( 0 ) \s + 00 # Terminator (end of header) + # Code section 0 types + 00 # 0 inputs\s + 80 # 0 outputs (Non-returning function) + 0000 # max stack: 0 + # Code section 0 - in=0 out=non-returning height=0 + 00 # [0] STOP + # Data section (empty) + # Subcontainer 0 ends + # Data section (empty) + """); + } + + @Test + void validComboReturnContactReturn() { + validCode( + """ + 0x # EOF + ef0001 # Magic and Version ( 1 ) + 010004 # Types length ( 4 ) + 020001 # Total code sections ( 1 ) + 000c # Code section 0 , 12 bytes + 030001 # Total subcontainers ( 1 ) + 0018 # Sub container 0, 24 byte + 040000 # Data section length( 0 ) + 00 # Terminator (end of header) + # Code section 0 types + 00 # 0 inputs\s + 80 # 0 outputs (Non-returning function) + 0002 # max stack: 2 + # Code section 0 - in=0 out=non-returning height=2 + 612015 # [0] PUSH2(0x2015) + 6001 # [3] PUSH1(1) + 55 # [5] SSTORE + 6000 # [6] PUSH1(0) + 6000 # [8] PUSH1(0) + ee00 # [10] RETURNCONTRACT(0) + # Subcontainer 0 starts here + ef0001 # Magic and Version ( 1 ) + 010004 # Types length ( 4 ) + 020001 # Total code sections ( 1 ) + 0005 # Code section 0 , 5 bytes + 040000 # Data section length( 0 ) \s + 00 # Terminator (end of header) + # Code section 0 types + 00 # 0 inputs\s + 80 # 0 outputs (Non-returning function) + 0002 # max stack: 2 + # Code section 0 - in=0 out=non-returning height=2 + 6000 # [0] PUSH1(0) + 6000 # [2] PUSH1(0) + f3 # [4] RETURN + # Data section (empty) + # Subcontainer 0 ends + # Data section (empty) + """); + } + + @Test + void validComboEOFCreateRevert() { + validCode( + """ + 0x # EOF + ef0001 # Magic and Version ( 1 ) + 010004 # Types length ( 4 ) + 020001 # Total code sections ( 1 ) + 0011 # Code section 0 , 17 bytes + 030001 # Total subcontainers ( 1 ) + 0018 # Sub container 0, 24 byte + 040000 # Data section length( 0 ) + 00 # Terminator (end of header) + # Code section 0 types + 00 # 0 inputs\s + 80 # 0 outputs (Non-returning function) + 0004 # max stack: 4 + # Code section 0 - in=0 out=non-returning height=4 + 6000 # [0] PUSH1(0) + 6000 # [2] PUSH1(0) + 6000 # [4] PUSH1(0) + 6000 # [6] PUSH1(0) + ec00 # [8] EOFCREATE(0) + 612015 # [10] PUSH2(0x2015) + 6001 # [13] PUSH1(1) + 55 # [15] SSTORE + 00 # [16] STOP + # Subcontainer 0 starts here + ef0001 # Magic and Version ( 1 ) + 010004 # Types length ( 4 ) + 020001 # Total code sections ( 1 ) + 0005 # Code section 0 , 5 bytes + 040000 # Data section length( 0 ) \s + 00 # Terminator (end of header) + # Code section 0 types + 00 # 0 inputs\s + 80 # 0 outputs (Non-returning function) + 0002 # max stack: 2 + # Code section 0 - in=0 out=non-returning height=2 + 6000 # [0] PUSH1(0) + 6000 # [2] PUSH1(0) + fd # [4] REVERT + # Data section (empty) + # Subcontainer 0 ends + # Data section (empty) + """); + } + + @Test + void validComboReturncontractRevert() { + validCode( + """ + 0x # EOF + ef0001 # Magic and Version ( 1 ) + 010004 # Types length ( 4 ) + 020001 # Total code sections ( 1 ) + 000c # Code section 0 , 12 bytes + 030001 # Total subcontainers ( 1 ) + 0018 # Sub container 0, 24 byte + 040000 # Data section length( 0 ) + 00 # Terminator (end of header) + # Code section 0 types + 00 # 0 inputs\s + 80 # 0 outputs (Non-returning function) + 0002 # max stack: 2 + # Code section 0 - in=0 out=non-returning height=2 + 612015 # [0] PUSH2(0x2015) + 6001 # [3] PUSH1(1) + 55 # [5] SSTORE + 6000 # [6] PUSH1(0) + 6000 # [8] PUSH1(0) + ee00 # [10] RETURNCONTRACT(0) + # Subcontainer 0 starts here + ef0001 # Magic and Version ( 1 ) + 010004 # Types length ( 4 ) + 020001 # Total code sections ( 1 ) + 0005 # Code section 0 , 5 bytes + 040000 # Data section length( 0 ) \s + 00 # Terminator (end of header) + # Code section 0 types + 00 # 0 inputs\s + 80 # 0 outputs (Non-returning function) + 0002 # max stack: 2 + # Code section 0 - in=0 out=non-returning height=2 + 6000 # [0] PUSH1(0) + 6000 # [2] PUSH1(0) + fd # [4] REVERT + # Data section (empty) + # Subcontainer 0 ends + # Data section (empty) + """); + } + + @Test + void invalidComboEOFCreateStop() { + invalidCode( + """ + 0x # EOF + ef0001 # Magic and Version ( 1 ) + 010004 # Types length ( 4 ) + 020001 # Total code sections ( 1 ) + 0011 # Code section 0 , 17 bytes + 030001 # Total subcontainers ( 1 ) + 0014 # Sub container 0, 20 byte + 040000 # Data section length( 0 ) + 00 # Terminator (end of header) + # Code section 0 types + 00 # 0 inputs\s + 80 # 0 outputs (Non-returning function) + 0004 # max stack: 4 + # Code section 0 - in=0 out=non-returning height=4 + 6000 # [0] PUSH1(0) + 6000 # [2] PUSH1(0) + 6000 # [4] PUSH1(0) + 6000 # [6] PUSH1(0) + ec00 # [8] EOFCREATE(0) + 612015 # [10] PUSH2(0x2015) + 6001 # [13] PUSH1(1) + 55 # [15] SSTORE + 00 # [16] STOP + # Subcontainer 0 starts here + ef0001 # Magic and Version ( 1 ) + 010004 # Types length ( 4 ) + 020001 # Total code sections ( 1 ) + 0001 # Code section 0 , 1 bytes + 040000 # Data section length( 0 ) \s + 00 # Terminator (end of header) + # Code section 0 types + 00 # 0 inputs\s + 80 # 0 outputs (Non-returning function) + 0000 # max stack: 0 + # Code section 0 - in=0 out=non-returning height=0 + 00 # [0] STOP + # Data section (empty) + # Subcontainer 0 ends + # Data section (empty) + """, + "STOP is only a valid opcode in containers used for runtime operations."); + } + + @Test + void invalidComboEOFCretateReturn() { + invalidCode( + """ + 0x # EOF + ef0001 # Magic and Version ( 1 ) + 010004 # Types length ( 4 ) + 020001 # Total code sections ( 1 ) + 0011 # Code section 0 , 17 bytes + 030001 # Total subcontainers ( 1 ) + 0018 # Sub container 0, 24 byte + 040000 # Data section length( 0 ) + 00 # Terminator (end of header) + # Code section 0 types + 00 # 0 inputs\s + 80 # 0 outputs (Non-returning function) + 0004 # max stack: 4 + # Code section 0 - in=0 out=non-returning height=4 + 6000 # [0] PUSH1(0) + 6000 # [2] PUSH1(0) + 6000 # [4] PUSH1(0) + 6000 # [6] PUSH1(0) + ec00 # [8] EOFCREATE(0) + 612015 # [10] PUSH2(0x2015) + 6001 # [13] PUSH1(1) + 55 # [15] SSTORE + 00 # [16] STOP + # Subcontainer 0 starts here + ef0001 # Magic and Version ( 1 ) + 010004 # Types length ( 4 ) + 020001 # Total code sections ( 1 ) + 0005 # Code section 0 , 5 bytes + 040000 # Data section length( 0 ) \s + 00 # Terminator (end of header) + # Code section 0 types + 00 # 0 inputs\s + 80 # 0 outputs (Non-returning function) + 0002 # max stack: 2 + # Code section 0 - in=0 out=non-returning height=2 + 6000 # [0] PUSH1(0) + 6000 # [2] PUSH1(0) + f3 # [4] RETURN + # Data section (empty) + # Subcontainer 0 ends + # Data section (empty) + """, + "RETURN is only a valid opcode in containers used for runtime operations."); + } + + @Test + void invalidReturncontractReturncontract() { + invalidCode( + """ + 0x # EOF + ef0001 # Magic and Version ( 1 ) + 010004 # Types length ( 4 ) + 020001 # Total code sections ( 1 ) + 000c # Code section 0 , 12 bytes + 030001 # Total subcontainers ( 1 ) + 0032 # Sub container 0, 50 byte + 040000 # Data section length( 0 ) + 00 # Terminator (end of header) + # Code section 0 types + 00 # 0 inputs\s + 80 # 0 outputs (Non-returning function) + 0002 # max stack: 2 + # Code section 0 - in=0 out=non-returning height=2 + 612015 # [0] PUSH2(0x2015) + 6001 # [3] PUSH1(1) + 55 # [5] SSTORE + 6000 # [6] PUSH1(0) + 6000 # [8] PUSH1(0) + ee00 # [10] RETURNCONTRACT(0) + # Subcontainer 0 starts here + ef0001 # Magic and Version ( 1 ) + 010004 # Types length ( 4 ) + 020001 # Total code sections ( 1 ) + 0006 # Code section 0 , 6 bytes + 030001 # Total subcontainers ( 1 ) + 0014 # Sub container 0, 20 byte + 040000 # Data section length( 0 ) \s + 00 # Terminator (end of header) + # Code section 0 types + 00 # 0 inputs\s + 80 # 0 outputs (Non-returning function) + 0002 # max stack: 2 + # Code section 0 - in=0 out=non-returning height=2 + 6000 # [0] PUSH1(0) + 6000 # [2] PUSH1(0) + ee00 # [4] RETURNCONTRACT(0) + # Subcontainer 0.0 starts here + ef0001 # Magic and Version ( 1 ) + 010004 # Types length ( 4 ) + 020001 # Total code sections ( 1 ) + 0001 # Code section 0 , 1 bytes + 040000 # Data section length( 0 ) \s + 00 # Terminator (end of header) + # Code section 0 types + 00 # 0 inputs\s + 80 # 0 outputs (Non-returning function) + 0000 # max stack: 0 + # Code section 0 - in=0 out=non-returning height=0 + 00 # [0] STOP + # Data section (empty) + # Subcontainer 0.0 ends + # Data section (empty) + # Subcontainer 0 ends + # Data section (empty) + """, + "RETURNCONTRACT is only a valid opcode in containers used for initcode"); + } + + // // valid subcontainer references + // // invalid subcontainer references + // + // { + // "EF0001 010004 0200010001 040003 00 00800000 FE BEEF", + // "Incomplete data section", + // "Incomplete data section", + // 1 + // }, + // + + private static void validCode(final String str) { + Code code = CodeFactory.createCode(bytesFromPrettyPrint(str), 1); + assertThat(code.isValid()).isTrue(); + } + + private static void invalidCode(final String str, final String error) { + Code code = CodeFactory.createCode(bytesFromPrettyPrint(str), 1); + assertThat(code.isValid()).isFalse(); + assertThat(((CodeInvalid) code).getInvalidReason()).contains(error); + } + private static void invalidCode(final String str) { - Code code = CodeFactory.createCode(Bytes.fromHexString(str), 1); + Code code = CodeFactory.createCode(bytesFromPrettyPrint(str), 1); assertThat(code.isValid()).isFalse(); } private static void invalidCode(final String str, final boolean legacy) { - Code code = CodeFactory.createCode(Bytes.fromHexString(str), 1, legacy, false); + Code code = CodeFactory.createCode(bytesFromPrettyPrint(str), 1, legacy, false); assertThat(code.isValid()).isFalse(); } } diff --git a/evm/src/test/java/org/hyperledger/besu/evm/code/EOFLayoutTest.java b/evm/src/test/java/org/hyperledger/besu/evm/code/EOFLayoutTest.java index 94f1d9598..5324d7adf 100644 --- a/evm/src/test/java/org/hyperledger/besu/evm/code/EOFLayoutTest.java +++ b/evm/src/test/java/org/hyperledger/besu/evm/code/EOFLayoutTest.java @@ -143,16 +143,10 @@ public class EOFLayoutTest { }, { "EF0001 010004 0200010001 040003 00 00800000 FE DEADBEEF", - "Incomplete data section", + "Excess data section", "Dangling data after end of all sections", 1 }, - { - "EF0001 010004 0200010001 040003 00 00800000 FE BEEF", - "Incomplete data section", - "Incomplete data section", - 1 - }, { "EF0001 0200010001 040001 00 FE DA", "type section missing", @@ -343,9 +337,9 @@ public class EOFLayoutTest { @ParameterizedTest(name = "{1}") @MethodSource({ - // "correctContainers", - // "containersWithFormatErrors", - // "typeSectionTests", + "correctContainers", + "containersWithFormatErrors", + "typeSectionTests", "subContainers" }) void test( @@ -354,7 +348,7 @@ public class EOFLayoutTest { final String failureReason, final int expectedVersion) { final Bytes container = Bytes.fromHexString(containerString.replaceAll("[^a-fxA-F0-9]", "")); - final EOFLayout layout = EOFLayout.parseEOF(container); + final EOFLayout layout = EOFLayout.parseEOF(container, true); assertThat(layout.version()).isEqualTo(expectedVersion); assertThat(layout.invalidReason()).isEqualTo(failureReason); From 8c04d0ae36065617012a5d9857086fbab0962c86 Mon Sep 17 00:00:00 2001 From: Gabriel-Trintinalia Date: Fri, 21 Jun 2024 12:56:43 +1000 Subject: [PATCH 06/58] Remove deprecation message for `--Xp2p-peer-lower-bound` (#7247) Signed-off-by: Gabriel-Trintinalia --- CHANGELOG.md | 1 + .../org/hyperledger/besu/cli/BesuCommand.java | 4 ---- .../cli/options/unstable/NetworkingOptions.java | 15 +-------------- 3 files changed, 2 insertions(+), 18 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index bac2d7c55..a082a5b00 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ ## Next Release ### Breaking Changes +- `Xp2p-peer-lower-bound` has been removed. [#7247](https://github.com/hyperledger/besu/pull/7247) ### Additions and Improvements - Support for eth_maxPriorityFeePerGas [#5658](https://github.com/hyperledger/besu/issues/5658) diff --git a/besu/src/main/java/org/hyperledger/besu/cli/BesuCommand.java b/besu/src/main/java/org/hyperledger/besu/cli/BesuCommand.java index 9e612fea3..4262ff964 100644 --- a/besu/src/main/java/org/hyperledger/besu/cli/BesuCommand.java +++ b/besu/src/main/java/org/hyperledger/besu/cli/BesuCommand.java @@ -20,7 +20,6 @@ import static java.util.Arrays.asList; import static java.util.Collections.singletonList; import static org.hyperledger.besu.cli.DefaultCommandValues.getDefaultBesuDataPath; import static org.hyperledger.besu.cli.config.NetworkName.MAINNET; -import static org.hyperledger.besu.cli.options.unstable.NetworkingOptions.PEER_LOWER_BOUND_FLAG; import static org.hyperledger.besu.cli.util.CommandLineUtils.DEPENDENCY_WARNING_MSG; import static org.hyperledger.besu.cli.util.CommandLineUtils.isOptionSet; import static org.hyperledger.besu.controller.BesuController.DATABASE_PATH; @@ -1659,9 +1658,6 @@ public class BesuCommand implements DefaultCommandValues, Runnable { maxPeers = p2PDiscoveryOptionGroup.maxPeers; final Boolean isLimitRemoteWireConnectionsEnabled = p2PDiscoveryOptionGroup.isLimitRemoteWireConnectionsEnabled; - if (isOptionSet(commandLine, PEER_LOWER_BOUND_FLAG)) { - logger.warn(PEER_LOWER_BOUND_FLAG + " is deprecated and will be removed soon."); - } if (isLimitRemoteWireConnectionsEnabled) { final float fraction = Fraction.fromPercentage(p2PDiscoveryOptionGroup.maxRemoteConnectionsPercentage) diff --git a/besu/src/main/java/org/hyperledger/besu/cli/options/unstable/NetworkingOptions.java b/besu/src/main/java/org/hyperledger/besu/cli/options/unstable/NetworkingOptions.java index a66bb6fb6..aed7b079d 100644 --- a/besu/src/main/java/org/hyperledger/besu/cli/options/unstable/NetworkingOptions.java +++ b/besu/src/main/java/org/hyperledger/besu/cli/options/unstable/NetworkingOptions.java @@ -14,7 +14,6 @@ */ package org.hyperledger.besu.cli.options.unstable; -import org.hyperledger.besu.cli.DefaultCommandValues; import org.hyperledger.besu.cli.options.CLIOptions; import org.hyperledger.besu.cli.options.OptionParser; import org.hyperledger.besu.ethereum.p2p.config.NetworkingConfiguration; @@ -27,9 +26,6 @@ import picocli.CommandLine; /** The Networking Cli options. */ public class NetworkingOptions implements CLIOptions { - /** The constant PEER_LOWER_BOUND_FLAG */ - public static final String PEER_LOWER_BOUND_FLAG = "--Xp2p-peer-lower-bound"; - private final String INITIATE_CONNECTIONS_FREQUENCY_FLAG = "--Xp2p-initiate-connections-frequency"; private final String CHECK_MAINTAINED_CONNECTIONS_FREQUENCY_FLAG = @@ -77,13 +73,6 @@ public class NetworkingOptions implements CLIOptions { description = "Whether to enable filtering of peers based on the ENR field ForkId)") private final Boolean filterOnEnrForkId = NetworkingConfiguration.DEFAULT_FILTER_ON_ENR_FORK_ID; - @CommandLine.Option( - hidden = true, - names = PEER_LOWER_BOUND_FLAG, - description = - "(Deprecated) Lower bound on the target number of P2P connections (default: ${DEFAULT-VALUE})") - private final Integer peerLowerBoundConfig = DefaultCommandValues.DEFAULT_MAX_PEERS; - private NetworkingOptions() {} /** @@ -130,9 +119,7 @@ public class NetworkingOptions implements CLIOptions { CHECK_MAINTAINED_CONNECTIONS_FREQUENCY_FLAG, OptionParser.format(checkMaintainedConnectionsFrequencySec), INITIATE_CONNECTIONS_FREQUENCY_FLAG, - OptionParser.format(initiateConnectionsFrequencySec), - PEER_LOWER_BOUND_FLAG, - OptionParser.format((peerLowerBoundConfig))); + OptionParser.format(initiateConnectionsFrequencySec)); if (dnsDiscoveryServerOverride.isPresent()) { retval.add(DNS_DISCOVERY_SERVER_OVERRIDE_FLAG); From 609eb76ba0a2062e68257b74e7c2cba24371bf96 Mon Sep 17 00:00:00 2001 From: Matt Whitehead Date: Fri, 21 Jun 2024 19:55:10 +0100 Subject: [PATCH 07/58] Add build version option to prefix git hash with custom version property (#7222) * Add build version option to prefix git hash with custom version property * Refactor to make appending the git hash a boolean property. Include a commented-out example of how to use the properties in the gradle file Signed-off-by: Matthew Whitehead --- build.gradle | 4 ++++ gradle.properties | 5 +++++ 2 files changed, 9 insertions(+) diff --git a/build.gradle b/build.gradle index b26f36b51..3db0da35c 100644 --- a/build.gradle +++ b/build.gradle @@ -934,6 +934,10 @@ def calculateVersion() { def calVerPattern = ~/\d+\.\d+(\.\d+)?(-.*)?/ if (project.hasProperty('version') && (project.version =~ calVerPattern)) { + if (project.hasProperty('versionappendcommit') && project.versionappendcommit == "true") { + def gitDetails = getGitCommitDetails(7) // Adjust length as needed + return "${project.version}-${gitDetails.hash}" + } return "${project.version}" } else { // If no version is supplied or it doesn't match the semantic versioning, calculate from git diff --git a/gradle.properties b/gradle.properties index 61b69b617..93f56e013 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,4 +1,9 @@ org.gradle.welcome=never + +# Optional - set custom build version +# version=24.5.6-acme +# versionappendcommit=true + # Set exports/opens flags required by Google Java Format and ErrorProne plugins. (JEP-396) org.gradle.jvmargs=-Xmx4g \ --add-exports jdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED \ From 04eaaf9c24bf2e022f01b7d1bdac966e4584f31d Mon Sep 17 00:00:00 2001 From: Jason Frame Date: Mon, 24 Jun 2024 14:56:42 +1000 Subject: [PATCH 08/58] Handle invalid snap getTrieNode requests with empty paths gracefully (#7221) Signed-off-by: Jason Frame Co-authored-by: Sally MacFarlane --- .../besu/ethereum/eth/manager/snap/SnapServer.java | 6 ++++++ .../ethereum/eth/manager/snap/SnapServerTest.java | 12 ++++++++++++ 2 files changed, 18 insertions(+) diff --git a/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/manager/snap/SnapServer.java b/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/manager/snap/SnapServer.java index c2fa18648..bfccede67 100644 --- a/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/manager/snap/SnapServer.java +++ b/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/manager/snap/SnapServer.java @@ -519,6 +519,12 @@ class SnapServer implements BesuEvents.InitialSyncCompletionListener { } } else { + // There must be at least one element in the path otherwise it is invalid + if (triePath.isEmpty()) { + LOGGER.debug("returned empty trie nodes message due to invalid path"); + return EMPTY_TRIE_NODES_MESSAGE; + } + // otherwise the first element should be account hash, and subsequent paths // are compact encoded account storage paths diff --git a/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/manager/snap/SnapServerTest.java b/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/manager/snap/SnapServerTest.java index c15056d66..d7d3fc527 100644 --- a/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/manager/snap/SnapServerTest.java +++ b/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/manager/snap/SnapServerTest.java @@ -368,6 +368,18 @@ public class SnapServerTest { assertThat(trieNodes.size()).isEqualTo(2); } + @Test + public void assertAccountTrieRequest_invalidEmptyPath() { + insertTestAccounts(acct1); + var partialPathToAcct1 = Bytes.fromHexString("0x01"); // first nibble is 1 + var trieNodeRequest = + requestTrieNodes( + storageTrie.getRootHash(), List.of(List.of(), List.of(partialPathToAcct1))); + assertThat(trieNodeRequest).isNotNull(); + List trieNodes = trieNodeRequest.nodes(false); + assertThat(trieNodes.isEmpty()).isTrue(); + } + @Test public void assertAccountTrieLimitRequest() { insertTestAccounts(acct1, acct2, acct3, acct4); From 763d99d15fcaff7baa90aa0861b6721967e61e30 Mon Sep 17 00:00:00 2001 From: Ties <71668189+TiesD@users.noreply.github.com> Date: Mon, 24 Jun 2024 09:44:36 +0300 Subject: [PATCH 09/58] fix typos in CHANGELOG (#7226) Signed-off-by: Ties <71668189+TiesD@users.noreply.github.com> Co-authored-by: Matt Nelson <85905982+non-fungible-nelson@users.noreply.github.com> Co-authored-by: Sally MacFarlane --- CHANGELOG.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a082a5b00..5edb1d425 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2746,7 +2746,7 @@ If you have existing private transactions, see [migration details](docs/Private- This can be enabled using the `--rpc-http-api TRACE` CLI flag. There are some philosophical differences between Besu and other implementations that are outlined in [trace_rpc_apis](docs/trace_rpc_apis.md). -- Ability to automatically detect Docker NAT settings from inside the conainter. +- Ability to automatically detect Docker NAT settings from inside the container. The default NAT method (AUTO) can detect this so no user intervention is required to enable this. @@ -2969,7 +2969,7 @@ For compatibility with ETC Agharta upgrade, use 1.3.7 or later. - Update Governance and Code of Conduct verbiage [\#120](https://github.com/hyperledger/besu/pull/120) - Fix private transaction root mismatch [\#118](https://github.com/hyperledger/besu/pull/118) -- Programatically enforce plugin CLI variable names [\#117](https://github.com/hyperledger/besu/pull/117) +- Programmatically enforce plugin CLI variable names [\#117](https://github.com/hyperledger/besu/pull/117) - Additional unit test for selecting replaced pending transactions [\#116](https://github.com/hyperledger/besu/pull/116) - Only set sync targets that have an estimated height value [\#115](https://github.com/hyperledger/besu/pull/115) - Fix rlpx startup [\#114](https://github.com/hyperledger/besu/pull/114) @@ -3023,7 +3023,7 @@ For compatibility with ETC Agharta upgrade, use 1.3.7 or later. ### Technical Improvements -- Less verbose synching subscriptions [\#59](https://github.com/hyperledger/besu/pull/59) +- Less verbose syncing subscriptions [\#59](https://github.com/hyperledger/besu/pull/59) - Return enclave key instead of private transaction hash [\#53](https://github.com/hyperledger/besu/pull/53) - Fix mark sweep pruner bugs where nodes that should be kept were being swept [\#50](https://github.com/hyperledger/besu/pull/50) - Clean up BesuConfiguration construction [\#51](https://github.com/hyperledger/besu/pull/51) @@ -3156,7 +3156,7 @@ For compatibility with ETC Agharta upgrade, use 1.3.7 or later. - Updating Orion to v1.3.2 [#1805](https://github.com/PegaSysEng/pantheon/pull/1805) - Updaated newHeads subscription to emit events only for canonical blocks [#1798](https://github.com/PegaSysEng/pantheon/pull/1798) - Repricing for trie-size-dependent opcodes [#1795](https://github.com/PegaSysEng/pantheon/pull/1795) -- Revised Istanbul Versioning assignemnts [#1794](https://github.com/PegaSysEng/pantheon/pull/1794) +- Revised Istanbul Versioning assignments [#1794](https://github.com/PegaSysEng/pantheon/pull/1794) - Updated RevertReason to return BytesValue [#1793](https://github.com/PegaSysEng/pantheon/pull/1793) - Updated way priv_getPrivacyPrecompileAddress source [#1786](https://github.com/PegaSysEng/pantheon/pull/1786) (thanks to [iikirilov](https://github.com/iikirilov)) - Updated Chain ID opcode to return 0 as default [#1785](https://github.com/PegaSysEng/pantheon/pull/1785) @@ -4217,7 +4217,7 @@ has been updated to use the moved quickstart. - Fixed deprecation warnings [\#596](https://github.com/PegaSysEng/pantheon/pull/596) - IBFT Integration Tests - Future Height [\#591](https://github.com/PegaSysEng/pantheon/pull/591) - Added `getNodeData` to `EthPeer` to enable requesting node data [\#589](https://github.com/PegaSysEng/pantheon/pull/589) -- `Blockcreator` to use `parentblock` specified at constuction [\#588](https://github.com/PegaSysEng/pantheon/pull/588) +- `Blockcreator` to use `parentblock` specified at construction [\#588](https://github.com/PegaSysEng/pantheon/pull/588) - Support responding to `GetNodeData` requests [\#587](https://github.com/PegaSysEng/pantheon/pull/587) - IBFT validates block on proposal reception [\#583](https://github.com/PegaSysEng/pantheon/pull/583) - Rework `NewRoundValidator` tests [\#582](https://github.com/PegaSysEng/pantheon/pull/582) From a7fd80b531aa37354e06a90fd6d779bb5e781904 Mon Sep 17 00:00:00 2001 From: Wolmin <44748271+Wolmin@users.noreply.github.com> Date: Mon, 24 Jun 2024 11:00:11 +0200 Subject: [PATCH 10/58] feat: Add network option for LUKSO Mainnet (#7223) * Add option for LUKSO network Signed-off-by: Wolmin * Add tests for LUKSO Signed-off-by: Wolmin * Apply spotless Signed-off-by: Wolmin * Add changelog entry Signed-off-by: Wolmin * Fix duplicate func Signed-off-by: Wolmin * Fix changelog Signed-off-by: Wolmin * Add bootnodes to genesis Signed-off-by: Wolmin --------- Signed-off-by: Wolmin Signed-off-by: Wolmin <44748271+Wolmin@users.noreply.github.com> --- CHANGELOG.md | 1 + .../besu/cli/config/NetworkName.java | 2 + .../hyperledger/besu/cli/BesuCommandTest.java | 17 + .../cli/NetworkDeprecationMessageTest.java | 2 +- config/src/main/resources/lukso.json | 852 ++++++++++++++++++ 5 files changed, 873 insertions(+), 1 deletion(-) create mode 100644 config/src/main/resources/lukso.json diff --git a/CHANGELOG.md b/CHANGELOG.md index 5edb1d425..93294dfd7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,7 @@ - A full and up to date implementation of EOF for Prague [#7169](https://github.com/hyperledger/besu/pull/7169) - Add Subnet-Based Peer Permissions. [#7168](https://github.com/hyperledger/besu/pull/7168) - Reduce lock contention on transaction pool when building a block [#7180](https://github.com/hyperledger/besu/pull/7180) +- Add LUKSO as predefined network name [#7223](https://github.com/hyperledger/besu/pull/7223) ### Bug fixes - Validation errors ignored in accounts-allowlist and empty list [#7138](https://github.com/hyperledger/besu/issues/7138) diff --git a/besu/src/main/java/org/hyperledger/besu/cli/config/NetworkName.java b/besu/src/main/java/org/hyperledger/besu/cli/config/NetworkName.java index bd41015a7..f864068bb 100644 --- a/besu/src/main/java/org/hyperledger/besu/cli/config/NetworkName.java +++ b/besu/src/main/java/org/hyperledger/besu/cli/config/NetworkName.java @@ -28,6 +28,8 @@ public enum NetworkName { SEPOLIA("/sepolia.json", BigInteger.valueOf(11155111)), /** Holešky network name. */ HOLESKY("/holesky.json", BigInteger.valueOf(17000)), + /** LUKSO mainnet network name. */ + LUKSO("/lukso.json", BigInteger.valueOf(42)), /** Dev network name. */ DEV("/dev.json", BigInteger.valueOf(2018), false), diff --git a/besu/src/test/java/org/hyperledger/besu/cli/BesuCommandTest.java b/besu/src/test/java/org/hyperledger/besu/cli/BesuCommandTest.java index 1e8d15cdb..2c17cc42c 100644 --- a/besu/src/test/java/org/hyperledger/besu/cli/BesuCommandTest.java +++ b/besu/src/test/java/org/hyperledger/besu/cli/BesuCommandTest.java @@ -22,6 +22,7 @@ import static org.hyperledger.besu.cli.config.NetworkName.DEV; import static org.hyperledger.besu.cli.config.NetworkName.EXPERIMENTAL_EIPS; import static org.hyperledger.besu.cli.config.NetworkName.FUTURE_EIPS; import static org.hyperledger.besu.cli.config.NetworkName.HOLESKY; +import static org.hyperledger.besu.cli.config.NetworkName.LUKSO; import static org.hyperledger.besu.cli.config.NetworkName.MAINNET; import static org.hyperledger.besu.cli.config.NetworkName.MORDOR; import static org.hyperledger.besu.cli.config.NetworkName.SEPOLIA; @@ -1747,6 +1748,22 @@ public class BesuCommandTest extends CommandTestAbstract { verify(mockLogger, never()).warn(contains("Holesky is deprecated and will be shutdown")); } + @Test + public void luksoValuesAreUsed() { + parseCommand("--network", "lukso"); + + final ArgumentCaptor networkArg = + ArgumentCaptor.forClass(EthNetworkConfig.class); + + verify(mockControllerBuilderFactory).fromEthNetworkConfig(networkArg.capture(), any()); + verify(mockControllerBuilder).build(); + + assertThat(networkArg.getValue()).isEqualTo(EthNetworkConfig.getNetworkConfig(LUKSO)); + + assertThat(commandOutput.toString(UTF_8)).isEmpty(); + assertThat(commandErrorOutput.toString(UTF_8)).isEmpty(); + } + @Test public void classicValuesAreUsed() { parseCommand("--network", "classic"); diff --git a/besu/src/test/java/org/hyperledger/besu/cli/NetworkDeprecationMessageTest.java b/besu/src/test/java/org/hyperledger/besu/cli/NetworkDeprecationMessageTest.java index 9a8fb4274..e140db8c2 100644 --- a/besu/src/test/java/org/hyperledger/besu/cli/NetworkDeprecationMessageTest.java +++ b/besu/src/test/java/org/hyperledger/besu/cli/NetworkDeprecationMessageTest.java @@ -39,7 +39,7 @@ class NetworkDeprecationMessageTest { @EnumSource( value = NetworkName.class, names = { - "MAINNET", "SEPOLIA", "DEV", "CLASSIC", "MORDOR", "HOLESKY", + "MAINNET", "SEPOLIA", "DEV", "CLASSIC", "MORDOR", "HOLESKY", "LUKSO", }) void shouldThrowErrorForNonDeprecatedNetworks(final NetworkName network) { assertThatThrownBy(() -> NetworkDeprecationMessage.generate(network)) diff --git a/config/src/main/resources/lukso.json b/config/src/main/resources/lukso.json new file mode 100644 index 000000000..ff4296eae --- /dev/null +++ b/config/src/main/resources/lukso.json @@ -0,0 +1,852 @@ +{ + "config": { + "ethash": {}, + "chainId": 42, + "homesteadBlock": 0, + "eip150Block": 0, + "eip150Hash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "eip155Block": 0, + "eip158Block": 0, + "byzantiumBlock": 0, + "constantinopleBlock": 0, + "petersburgBlock": 0, + "istanbulBlock": 0, + "berlinBlock": 0, + "londonBlock": 0, + "mergeForkBlock": 0, + "terminalTotalDifficulty": 0, + "terminalTotalDifficultyPassed": true, + "shanghaiTime": 1687969198, + "cancunTime": 1767182400, + "discovery": { + "bootnodes": [ + "enode://c2bb19ce658cfdf1fecb45da599ee6c7bf36e5292efb3fb61303a0b2cd07f96c20ac9b376a464d687ac456675a2e4a44aec39a0509bcb4b6d8221eedec25aca2@34.147.73.193:30303", + "enode://276f14e4049840a0f5aa5e568b772ab6639251149a52ba244647277175b83f47b135f3b3d8d846cf81a8e681684e37e9fc10ec205a9841d3ae219aa08aa9717b@34.32.192.211:30303" + ] + } + }, + "number": "0x0", + "nonce": "0x1", + "difficulty": "0x1", + "gasLimit": "0x280de80", + "gasUsed": "0x0", + "timestamp": "0x646CE7B0", + "extraData": "0x416e642074686520776f726c6420626563616d65206f6e65", + "coinbase": "0x0000000000000000000000000000000000000000", + "mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "alloc": { + "0x953534215D31D0f2756b8A855aaFB7E641848c2e": { + "balance": "11143518000000000000000000" + }, + "0x5a4154edddE64858664F6219e031B6a47BA30993": { + "balance": "30525730000000000000000000" + }, + "0x0000000000000000000000000000000000000000": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000001": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000002": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000003": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000004": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000005": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000006": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000007": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000008": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000009": { + "balance": "1" + }, + "0x000000000000000000000000000000000000000a": { + "balance": "1" + }, + "0x000000000000000000000000000000000000000b": { + "balance": "1" + }, + "0x000000000000000000000000000000000000000c": { + "balance": "1" + }, + "0x000000000000000000000000000000000000000d": { + "balance": "1" + }, + "0x000000000000000000000000000000000000000e": { + "balance": "1" + }, + "0x000000000000000000000000000000000000000f": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000010": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000011": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000012": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000013": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000014": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000015": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000016": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000017": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000018": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000019": { + "balance": "1" + }, + "0x000000000000000000000000000000000000001a": { + "balance": "1" + }, + "0x000000000000000000000000000000000000001b": { + "balance": "1" + }, + "0x000000000000000000000000000000000000001c": { + "balance": "1" + }, + "0x000000000000000000000000000000000000001d": { + "balance": "1" + }, + "0x000000000000000000000000000000000000001e": { + "balance": "1" + }, + "0x000000000000000000000000000000000000001f": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000020": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000021": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000022": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000023": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000024": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000025": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000026": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000027": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000028": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000029": { + "balance": "1" + }, + "0x000000000000000000000000000000000000002a": { + "balance": "1" + }, + "0x000000000000000000000000000000000000002b": { + "balance": "1" + }, + "0x000000000000000000000000000000000000002c": { + "balance": "1" + }, + "0x000000000000000000000000000000000000002d": { + "balance": "1" + }, + "0x000000000000000000000000000000000000002e": { + "balance": "1" + }, + "0x000000000000000000000000000000000000002f": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000030": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000031": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000032": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000033": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000034": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000035": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000036": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000037": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000038": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000039": { + "balance": "1" + }, + "0x000000000000000000000000000000000000003a": { + "balance": "1" + }, + "0x000000000000000000000000000000000000003b": { + "balance": "1" + }, + "0x000000000000000000000000000000000000003c": { + "balance": "1" + }, + "0x000000000000000000000000000000000000003d": { + "balance": "1" + }, + "0x000000000000000000000000000000000000003e": { + "balance": "1" + }, + "0x000000000000000000000000000000000000003f": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000040": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000041": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000042": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000043": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000044": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000045": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000046": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000047": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000048": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000049": { + "balance": "1" + }, + "0x000000000000000000000000000000000000004a": { + "balance": "1" + }, + "0x000000000000000000000000000000000000004b": { + "balance": "1" + }, + "0x000000000000000000000000000000000000004c": { + "balance": "1" + }, + "0x000000000000000000000000000000000000004d": { + "balance": "1" + }, + "0x000000000000000000000000000000000000004e": { + "balance": "1" + }, + "0x000000000000000000000000000000000000004f": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000050": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000051": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000052": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000053": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000054": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000055": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000056": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000057": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000058": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000059": { + "balance": "1" + }, + "0x000000000000000000000000000000000000005a": { + "balance": "1" + }, + "0x000000000000000000000000000000000000005b": { + "balance": "1" + }, + "0x000000000000000000000000000000000000005c": { + "balance": "1" + }, + "0x000000000000000000000000000000000000005d": { + "balance": "1" + }, + "0x000000000000000000000000000000000000005e": { + "balance": "1" + }, + "0x000000000000000000000000000000000000005f": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000060": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000061": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000062": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000063": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000064": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000065": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000066": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000067": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000068": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000069": { + "balance": "1" + }, + "0x000000000000000000000000000000000000006a": { + "balance": "1" + }, + "0x000000000000000000000000000000000000006b": { + "balance": "1" + }, + "0x000000000000000000000000000000000000006c": { + "balance": "1" + }, + "0x000000000000000000000000000000000000006d": { + "balance": "1" + }, + "0x000000000000000000000000000000000000006e": { + "balance": "1" + }, + "0x000000000000000000000000000000000000006f": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000070": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000071": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000072": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000073": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000074": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000075": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000076": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000077": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000078": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000079": { + "balance": "1" + }, + "0x000000000000000000000000000000000000007a": { + "balance": "1" + }, + "0x000000000000000000000000000000000000007b": { + "balance": "1" + }, + "0x000000000000000000000000000000000000007c": { + "balance": "1" + }, + "0x000000000000000000000000000000000000007d": { + "balance": "1" + }, + "0x000000000000000000000000000000000000007e": { + "balance": "1" + }, + "0x000000000000000000000000000000000000007f": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000080": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000081": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000082": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000083": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000084": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000085": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000086": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000087": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000088": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000089": { + "balance": "1" + }, + "0x000000000000000000000000000000000000008a": { + "balance": "1" + }, + "0x000000000000000000000000000000000000008b": { + "balance": "1" + }, + "0x000000000000000000000000000000000000008c": { + "balance": "1" + }, + "0x000000000000000000000000000000000000008d": { + "balance": "1" + }, + "0x000000000000000000000000000000000000008e": { + "balance": "1" + }, + "0x000000000000000000000000000000000000008f": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000090": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000091": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000092": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000093": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000094": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000095": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000096": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000097": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000098": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000099": { + "balance": "1" + }, + "0x000000000000000000000000000000000000009a": { + "balance": "1" + }, + "0x000000000000000000000000000000000000009b": { + "balance": "1" + }, + "0x000000000000000000000000000000000000009c": { + "balance": "1" + }, + "0x000000000000000000000000000000000000009d": { + "balance": "1" + }, + "0x000000000000000000000000000000000000009e": { + "balance": "1" + }, + "0x000000000000000000000000000000000000009f": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000a0": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000a1": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000a2": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000a3": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000a4": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000a5": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000a6": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000a7": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000a8": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000a9": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000aa": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000ab": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000ac": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000ad": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000ae": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000af": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000b0": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000b1": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000b2": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000b3": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000b4": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000b5": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000b6": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000b7": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000b8": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000b9": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000ba": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000bb": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000bc": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000bd": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000be": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000bf": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000c0": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000c1": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000c2": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000c3": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000c4": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000c5": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000c6": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000c7": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000c8": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000c9": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000ca": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000cb": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000cc": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000cd": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000ce": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000cf": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000d0": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000d1": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000d2": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000d3": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000d4": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000d5": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000d6": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000d7": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000d8": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000d9": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000da": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000db": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000dc": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000dd": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000de": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000df": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000e0": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000e1": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000e2": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000e3": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000e4": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000e5": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000e6": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000e7": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000e8": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000e9": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000ea": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000eb": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000ec": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000ed": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000ee": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000ef": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000f0": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000f1": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000f2": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000f3": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000f4": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000f5": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000f6": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000f7": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000f8": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000f9": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000fa": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000fb": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000fc": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000fd": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000fe": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000ff": { + "balance": "1" + }, + "0xcafe00000000000000000000000000000000cafe": { + "balance": "0", + "code": "0x60806040526004361061003f5760003560e01c806301ffc9a71461004457806322895118146100a4578063621fd130146101ba578063c5f2892f14610244575b600080fd5b34801561005057600080fd5b506100906004803603602081101561006757600080fd5b50357fffffffff000000000000000000000000000000000000000000000000000000001661026b565b604080519115158252519081900360200190f35b6101b8600480360360808110156100ba57600080fd5b8101906020810181356401000000008111156100d557600080fd5b8201836020820111156100e757600080fd5b8035906020019184600183028401116401000000008311171561010957600080fd5b91939092909160208101903564010000000081111561012757600080fd5b82018360208201111561013957600080fd5b8035906020019184600183028401116401000000008311171561015b57600080fd5b91939092909160208101903564010000000081111561017957600080fd5b82018360208201111561018b57600080fd5b803590602001918460018302840111640100000000831117156101ad57600080fd5b919350915035610304565b005b3480156101c657600080fd5b506101cf6110b5565b6040805160208082528351818301528351919283929083019185019080838360005b838110156102095781810151838201526020016101f1565b50505050905090810190601f1680156102365780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561025057600080fd5b506102596110c7565b60408051918252519081900360200190f35b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a70000000000000000000000000000000000000000000000000000000014806102fe57507fffffffff0000000000000000000000000000000000000000000000000000000082167f8564090700000000000000000000000000000000000000000000000000000000145b92915050565b6030861461035d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806118056026913960400191505060405180910390fd5b602084146103b6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603681526020018061179c6036913960400191505060405180910390fd5b6060821461040f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260298152602001806118786029913960400191505060405180910390fd5b670de0b6b3a7640000341015610470576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806118526026913960400191505060405180910390fd5b633b9aca003406156104cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260338152602001806117d26033913960400191505060405180910390fd5b633b9aca00340467ffffffffffffffff811115610535576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602781526020018061182b6027913960400191505060405180910390fd5b6060610540826114ba565b90507f649bbc62d0e31342afea4e5cd82d4049e7e1ee912fc0889aa790803be39038c589898989858a8a6105756020546114ba565b6040805160a0808252810189905290819060208201908201606083016080840160c085018e8e80828437600083820152601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01690910187810386528c815260200190508c8c808284376000838201819052601f9091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01690920188810386528c5181528c51602091820193918e019250908190849084905b83811015610648578181015183820152602001610630565b50505050905090810190601f1680156106755780820380516001836020036101000a031916815260200191505b5086810383528881526020018989808284376000838201819052601f9091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169092018881038452895181528951602091820193918b019250908190849084905b838110156106ef5781810151838201526020016106d7565b50505050905090810190601f16801561071c5780820380516001836020036101000a031916815260200191505b509d505050505050505050505050505060405180910390a1600060028a8a600060801b604051602001808484808284377fffffffffffffffffffffffffffffffff0000000000000000000000000000000090941691909301908152604080517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0818403018152601090920190819052815191955093508392506020850191508083835b602083106107fc57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016107bf565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa158015610859573d6000803e3d6000fd5b5050506040513d602081101561086e57600080fd5b5051905060006002806108846040848a8c6116fe565b6040516020018083838082843780830192505050925050506040516020818303038152906040526040518082805190602001908083835b602083106108f857805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016108bb565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa158015610955573d6000803e3d6000fd5b5050506040513d602081101561096a57600080fd5b5051600261097b896040818d6116fe565b60405160009060200180848480828437919091019283525050604080518083038152602092830191829052805190945090925082918401908083835b602083106109f457805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016109b7565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa158015610a51573d6000803e3d6000fd5b5050506040513d6020811015610a6657600080fd5b5051604080516020818101949094528082019290925280518083038201815260609092019081905281519192909182918401908083835b60208310610ada57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610a9d565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa158015610b37573d6000803e3d6000fd5b5050506040513d6020811015610b4c57600080fd5b50516040805160208101858152929350600092600292839287928f928f92018383808284378083019250505093505050506040516020818303038152906040526040518082805190602001908083835b60208310610bd957805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610b9c565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa158015610c36573d6000803e3d6000fd5b5050506040513d6020811015610c4b57600080fd5b50516040518651600291889160009188916020918201918291908601908083835b60208310610ca957805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610c6c565b6001836020036101000a0380198251168184511680821785525050505050509050018367ffffffffffffffff191667ffffffffffffffff1916815260180182815260200193505050506040516020818303038152906040526040518082805190602001908083835b60208310610d4e57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610d11565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa158015610dab573d6000803e3d6000fd5b5050506040513d6020811015610dc057600080fd5b5051604080516020818101949094528082019290925280518083038201815260609092019081905281519192909182918401908083835b60208310610e3457805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610df7565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa158015610e91573d6000803e3d6000fd5b5050506040513d6020811015610ea657600080fd5b50519050858114610f02576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260548152602001806117486054913960600191505060405180910390fd5b60205463ffffffff11610f60576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806117276021913960400191505060405180910390fd5b602080546001019081905560005b60208110156110a9578160011660011415610fa0578260008260208110610f9157fe5b0155506110ac95505050505050565b600260008260208110610faf57fe5b01548460405160200180838152602001828152602001925050506040516020818303038152906040526040518082805190602001908083835b6020831061102557805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610fe8565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa158015611082573d6000803e3d6000fd5b5050506040513d602081101561109757600080fd5b50519250600282049150600101610f6e565b50fe5b50505050505050565b60606110c26020546114ba565b905090565b6020546000908190815b60208110156112f05781600116600114156111e6576002600082602081106110f557fe5b01548460405160200180838152602001828152602001925050506040516020818303038152906040526040518082805190602001908083835b6020831061116b57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909201916020918201910161112e565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa1580156111c8573d6000803e3d6000fd5b5050506040513d60208110156111dd57600080fd5b505192506112e2565b600283602183602081106111f657fe5b015460405160200180838152602001828152602001925050506040516020818303038152906040526040518082805190602001908083835b6020831061126b57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909201916020918201910161122e565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa1580156112c8573d6000803e3d6000fd5b5050506040513d60208110156112dd57600080fd5b505192505b6002820491506001016110d1565b506002826112ff6020546114ba565b600060401b6040516020018084815260200183805190602001908083835b6020831061135a57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909201916020918201910161131d565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790527fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000095909516920191825250604080518083037ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8018152601890920190819052815191955093508392850191508083835b6020831061143f57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101611402565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa15801561149c573d6000803e3d6000fd5b5050506040513d60208110156114b157600080fd5b50519250505090565b60408051600880825281830190925260609160208201818036833701905050905060c082901b8060071a60f81b826000815181106114f457fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508060061a60f81b8260018151811061153757fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508060051a60f81b8260028151811061157a57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508060041a60f81b826003815181106115bd57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508060031a60f81b8260048151811061160057fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508060021a60f81b8260058151811061164357fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508060011a60f81b8260068151811061168657fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508060001a60f81b826007815181106116c957fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535050919050565b6000808585111561170d578182fd5b83861115611719578182fd5b505082019391909203915056fe4465706f736974436f6e74726163743a206d65726b6c6520747265652066756c6c4465706f736974436f6e74726163743a207265636f6e7374727563746564204465706f7369744461746120646f6573206e6f74206d6174636820737570706c696564206465706f7369745f646174615f726f6f744465706f736974436f6e74726163743a20696e76616c6964207769746864726177616c5f63726564656e7469616c73206c656e6774684465706f736974436f6e74726163743a206465706f7369742076616c7565206e6f74206d756c7469706c65206f6620677765694465706f736974436f6e74726163743a20696e76616c6964207075626b6579206c656e6774684465706f736974436f6e74726163743a206465706f7369742076616c756520746f6f20686967684465706f736974436f6e74726163743a206465706f7369742076616c756520746f6f206c6f774465706f736974436f6e74726163743a20696e76616c6964207369676e6174757265206c656e677468a26469706673582212201dd26f37a621703009abf16e77e69c93dc50c79db7f6cc37543e3e0e3decdc9764736f6c634300060b0033", + "storage": { + "0x00000000000000000000000000000000000000000000000000000000000022":"0xf5a5fd42d16a20302798ef6ed309979b43003d2320d9f0e8ea9831a92759fb4b", + "0x00000000000000000000000000000000000000000000000000000000000023":"0xdb56114e00fdd4c1f85c892bf35ac9a89289aaecb1ebd0a96cde606a748b5d71", + "0x00000000000000000000000000000000000000000000000000000000000024":"0xc78009fdf07fc56a11f122370658a353aaa542ed63e44c4bc15ff4cd105ab33c", + "0x00000000000000000000000000000000000000000000000000000000000025":"0x536d98837f2dd165a55d5eeae91485954472d56f246df256bf3cae19352a123c", + "0x00000000000000000000000000000000000000000000000000000000000026":"0x9efde052aa15429fae05bad4d0b1d7c64da64d03d7a1854a588c2cb8430c0d30", + "0x00000000000000000000000000000000000000000000000000000000000027":"0xd88ddfeed400a8755596b21942c1497e114c302e6118290f91e6772976041fa1", + "0x00000000000000000000000000000000000000000000000000000000000028":"0x87eb0ddba57e35f6d286673802a4af5975e22506c7cf4c64bb6be5ee11527f2c", + "0x00000000000000000000000000000000000000000000000000000000000029":"0x26846476fd5fc54a5d43385167c95144f2643f533cc85bb9d16b782f8d7db193", + "0x0000000000000000000000000000000000000000000000000000000000002a":"0x506d86582d252405b840018792cad2bf1259f1ef5aa5f887e13cb2f0094f51e1", + "0x0000000000000000000000000000000000000000000000000000000000002b":"0xffff0ad7e659772f9534c195c815efc4014ef1e1daed4404c06385d11192e92b", + "0x0000000000000000000000000000000000000000000000000000000000002c":"0x6cf04127db05441cd833107a52be852868890e4317e6a02ab47683aa75964220", + "0x0000000000000000000000000000000000000000000000000000000000002d":"0xb7d05f875f140027ef5118a2247bbb84ce8f2f0f1123623085daf7960c329f5f", + "0x0000000000000000000000000000000000000000000000000000000000002e":"0xdf6af5f5bbdb6be9ef8aa618e4bf8073960867171e29676f8b284dea6a08a85e", + "0x0000000000000000000000000000000000000000000000000000000000002f":"0xb58d900f5e182e3c50ef74969ea16c7726c549757cc23523c369587da7293784", + "0x00000000000000000000000000000000000000000000000000000000000030":"0xd49a7502ffcfb0340b1d7885688500ca308161a7f96b62df9d083b71fcc8f2bb", + "0x00000000000000000000000000000000000000000000000000000000000031":"0x8fe6b1689256c0d385f42f5bbe2027a22c1996e110ba97c171d3e5948de92beb", + "0x00000000000000000000000000000000000000000000000000000000000032":"0x8d0d63c39ebade8509e0ae3c9c3876fb5fa112be18f905ecacfecb92057603ab", + "0x00000000000000000000000000000000000000000000000000000000000033":"0x95eec8b2e541cad4e91de38385f2e046619f54496c2382cb6cacd5b98c26f5a4", + "0x00000000000000000000000000000000000000000000000000000000000034":"0xf893e908917775b62bff23294dbbe3a1cd8e6cc1c35b4801887b646a6f81f17f", + "0x00000000000000000000000000000000000000000000000000000000000035":"0xcddba7b592e3133393c16194fac7431abf2f5485ed711db282183c819e08ebaa", + "0x00000000000000000000000000000000000000000000000000000000000036":"0x8a8d7fe3af8caa085a7639a832001457dfb9128a8061142ad0335629ff23ff9c", + "0x00000000000000000000000000000000000000000000000000000000000037":"0xfeb3c337d7a51a6fbf00b9e34c52e1c9195c969bd4e7a0bfd51d5c5bed9c1167", + "0x00000000000000000000000000000000000000000000000000000000000038":"0xe71f0aa83cc32edfbefa9f4d3e0174ca85182eec9f3a09f6a6c0df6377a510d7", + "0x00000000000000000000000000000000000000000000000000000000000039":"0x31206fa80a50bb6abe29085058f16212212a60eec8f049fecb92d8c8e0a84bc0", + "0x0000000000000000000000000000000000000000000000000000000000003a":"0x21352bfecbeddde993839f614c3dac0a3ee37543f9b412b16199dc158e23b544", + "0x0000000000000000000000000000000000000000000000000000000000003b":"0x619e312724bb6d7c3153ed9de791d764a366b389af13c58bf8a8d90481a46765", + "0x0000000000000000000000000000000000000000000000000000000000003c":"0x7cdd2986268250628d0c10e385c58c6191e6fbe05191bcc04f133f2cea72c1c4", + "0x0000000000000000000000000000000000000000000000000000000000003d":"0x848930bd7ba8cac54661072113fb278869e07bb8587f91392933374d017bcbe1", + "0x0000000000000000000000000000000000000000000000000000000000003e":"0x8869ff2c22b28cc10510d9853292803328be4fb0e80495e8bb8d271f5b889636", + "0x0000000000000000000000000000000000000000000000000000000000003f":"0xb5fe28e79f1b850f8658246ce9b6a1e7b49fc06db7143e8fe0b4f2b0c5523a5c", + "0x00000000000000000000000000000000000000000000000000000000000040":"0x985e929f70af28d0bdd1a90a808f977f597c7c778c489e98d3bd8910d31ac0f7" + } + } + } +} + From af80e53ad993d6257d2c56971ce4d4b83864e54d Mon Sep 17 00:00:00 2001 From: Fabio Di Fabio Date: Mon, 24 Jun 2024 12:54:34 +0200 Subject: [PATCH 11/58] Update Docker base image to Ubuntu 24.04 (#7251) Signed-off-by: Fabio Di Fabio --- CHANGELOG.md | 1 + docker/Dockerfile | 5 ++--- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 93294dfd7..2118b9abd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,7 @@ - A full and up to date implementation of EOF for Prague [#7169](https://github.com/hyperledger/besu/pull/7169) - Add Subnet-Based Peer Permissions. [#7168](https://github.com/hyperledger/besu/pull/7168) - Reduce lock contention on transaction pool when building a block [#7180](https://github.com/hyperledger/besu/pull/7180) +- Update Docker base image to Ubuntu 24.04 [#7251](https://github.com/hyperledger/besu/pull/7251) - Add LUKSO as predefined network name [#7223](https://github.com/hyperledger/besu/pull/7223) ### Bug fixes diff --git a/docker/Dockerfile b/docker/Dockerfile index ee138afca..c16345a82 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -1,5 +1,4 @@ - -FROM ubuntu:23.10 +FROM ubuntu:24.04 ARG VERSION="dev" ENV NO_PROXY_CACHE="-o Acquire::BrokenProxy=true -o Acquire::http::No-Cache=true -o Acquire::http::Pipeline-Depth=0" @@ -12,7 +11,7 @@ RUN apt-get update $NO_PROXY_CACHE && \ apt-get clean && \ rm -rf /var/cache/apt/archives/* /var/cache/apt/archives/partial/* && \ rm -rf /var/lib/apt/lists/* && \ - # Ubuntu 23.10 comes with an "ubuntu" user with uid 1000. We need 1000 for besu. + # Starting from version 23.10, Ubuntu comes with an "ubuntu" user with uid 1000. We need 1000 for besu. userdel ubuntu 2>/dev/null || true && rm -rf /home/ubuntu && \ # Ensure we use a stable UID for besu, as file permissions are tied to UIDs. adduser --uid 1000 --disabled-password --gecos "" --home /opt/besu besu && \ From 7e840ab6400c70be88f31dd4b6fa557aa1c6eb80 Mon Sep 17 00:00:00 2001 From: Danno Ferrin Date: Mon, 24 Jun 2024 14:41:27 -0600 Subject: [PATCH 12/58] Reconfigure how Protocol Specs are created WRT EVM condiguration (#7245) Make the max code size and max initcode size a part of the EVM configuration. As part of the change we need to move the tasks CodeFactory once handled as a static class and move it into the EVM. This has a nice follow on effect that we don't need to pass in max EOF versions or max code sizes anymore. Signed-off-by: Danno Ferrin --- CHANGELOG.md | 1 + .../mainnet/ClassicProtocolSpecs.java | 141 ++------ .../mainnet/MainnetProtocolSpecFactory.java | 175 ++------- .../mainnet/MainnetProtocolSpecs.java | 334 +++++------------- .../mainnet/ProtocolScheduleBuilder.java | 68 ++-- .../ethereum/mainnet/ProtocolSpecBuilder.java | 13 +- .../besu/evmtool/BenchmarkSubCommand.java | 9 +- .../besu/evmtool/CodeValidateSubCommand.java | 76 ++-- .../besu/evmtool/EOFTestSubCommand.java | 33 +- .../besu/evmtool/EvmToolCommand.java | 11 +- .../besu/evmtool/EvmToolComponent.java | 7 +- .../evmtool/MainnetGenesisFileModule.java | 16 +- .../besu/evmtool/PrettyPrintSubCommand.java | 22 +- .../besu/evmtool/ProtocolModule.java | 18 +- .../evmtool/CodeValidationSubCommandTest.java | 38 +- .../ReferenceTestProtocolSchedules.java | 13 + .../ethereum/eof/EOFReferenceTestTools.java | 31 +- .../java/org/hyperledger/besu/evm/Code.java | 10 +- .../java/org/hyperledger/besu/evm/EVM.java | 21 +- .../hyperledger/besu/evm/EvmSpecVersion.java | 89 +++-- .../besu/evm/code/CodeFactory.java | 119 +++---- .../besu/evm/code/CodeInvalid.java | 8 +- .../org/hyperledger/besu/evm/code/CodeV0.java | 8 +- .../org/hyperledger/besu/evm/code/CodeV1.java | 19 +- .../besu/evm/code/CodeV1Validation.java | 39 +- .../hyperledger/besu/evm/code/EOFLayout.java | 6 +- .../besu/evm/code/EOFValidator.java | 49 +++ .../CachedInvalidCodeRule.java | 61 ---- .../ContractValidationRule.java | 4 +- .../EOFValidationCodeRule.java | 20 +- .../contractvalidation/MaxCodeSizeRule.java | 28 +- .../contractvalidation/PrefixCodeRule.java | 7 +- .../besu/evm/fluent/EVMExecutor.java | 22 +- .../besu/evm/frame/ExceptionalHaltReason.java | 12 +- .../besu/evm/internal/EvmConfiguration.java | 55 ++- .../operation/AbstractCreateOperation.java | 3 +- .../evm/operation/EOFCreateOperation.java | 2 +- .../operation/ReturnContractOperation.java | 10 +- .../processor/AbstractMessageProcessor.java | 7 +- .../processor/ContractCreationProcessor.java | 20 +- .../besu/evm/code/CodeFactoryTest.java | 36 +- .../hyperledger/besu/evm/code/CodeV0Test.java | 16 +- .../hyperledger/besu/evm/code/CodeV1Test.java | 16 +- .../besu/evm/fluent/EVMExecutorTest.java | 18 +- .../besu/evm/internal/CodeCacheTest.java | 6 +- .../AbstractCreateOperationTest.java | 5 +- .../evm/operations/Create2OperationTest.java | 20 +- .../evm/operations/CreateOperationTest.java | 10 +- .../operations/EofCreateOperationTest.java | 13 +- .../evm/operations/ExtCallOperationTest.java | 24 +- .../ExtDelegateCallOperationTest.java | 41 ++- .../ExtStaticCallOperationTest.java | 19 +- .../evm/operations/JumpOperationTest.java | 25 +- .../operations/SelfDestructOperationTest.java | 7 +- .../ContractCreationProcessorTest.java | 112 ++---- .../besu/evm/toy/EvmToyCommand.java | 3 +- .../tracing/ExtendedOperationTracerTest.java | 13 +- 57 files changed, 886 insertions(+), 1123 deletions(-) create mode 100644 evm/src/main/java/org/hyperledger/besu/evm/code/EOFValidator.java delete mode 100644 evm/src/main/java/org/hyperledger/besu/evm/contractvalidation/CachedInvalidCodeRule.java diff --git a/CHANGELOG.md b/CHANGELOG.md index 2118b9abd..07cdf5863 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,7 @@ - Reduce lock contention on transaction pool when building a block [#7180](https://github.com/hyperledger/besu/pull/7180) - Update Docker base image to Ubuntu 24.04 [#7251](https://github.com/hyperledger/besu/pull/7251) - Add LUKSO as predefined network name [#7223](https://github.com/hyperledger/besu/pull/7223) +- Refactored how code, initcode, and max stack size are configured in forks. [#7245](https://github.com/hyperledger/besu/pull/7245) ### Bug fixes - Validation errors ignored in accounts-allowlist and empty list [#7138](https://github.com/hyperledger/besu/issues/7138) diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/ClassicProtocolSpecs.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/ClassicProtocolSpecs.java index 7575c7fe3..aec844894 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/ClassicProtocolSpecs.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/ClassicProtocolSpecs.java @@ -26,7 +26,6 @@ import org.hyperledger.besu.evm.ClassicEVMs; import org.hyperledger.besu.evm.MainnetEVMs; import org.hyperledger.besu.evm.contractvalidation.MaxCodeSizeRule; import org.hyperledger.besu.evm.contractvalidation.PrefixCodeRule; -import org.hyperledger.besu.evm.frame.MessageFrame; import org.hyperledger.besu.evm.gascalculator.BerlinGasCalculator; import org.hyperledger.besu.evm.gascalculator.DieHardGasCalculator; import org.hyperledger.besu.evm.gascalculator.IstanbulGasCalculator; @@ -44,7 +43,6 @@ import java.math.BigInteger; import java.util.Collections; import java.util.List; import java.util.Optional; -import java.util.OptionalInt; import java.util.OptionalLong; import java.util.Set; @@ -56,38 +54,28 @@ public class ClassicProtocolSpecs { } public static ProtocolSpecBuilder classicRecoveryInitDefinition( - final OptionalInt contractSizeLimit, - final OptionalInt configStackSizeLimit, final EvmConfiguration evmConfiguration) { - return MainnetProtocolSpecs.homesteadDefinition( - contractSizeLimit, configStackSizeLimit, evmConfiguration) + return MainnetProtocolSpecs.homesteadDefinition(evmConfiguration) .blockHeaderValidatorBuilder( feeMarket -> MainnetBlockHeaderValidator.createClassicValidator()) .name("ClassicRecoveryInit"); } public static ProtocolSpecBuilder tangerineWhistleDefinition( - final Optional chainId, - final OptionalInt contractSizeLimit, - final OptionalInt configStackSizeLimit, - final EvmConfiguration evmConfiguration) { - return MainnetProtocolSpecs.homesteadDefinition( - contractSizeLimit, configStackSizeLimit, evmConfiguration) + final Optional chainId, final EvmConfiguration evmConfiguration) { + return MainnetProtocolSpecs.homesteadDefinition(evmConfiguration) .isReplayProtectionSupported(true) .gasCalculator(TangerineWhistleGasCalculator::new) .transactionValidatorFactoryBuilder( - (gasCalculator, gasLimitCalculator, feeMarket) -> - new TransactionValidatorFactory(gasCalculator, gasLimitCalculator, true, chainId)) + (evm, gasLimitCalculator, feeMarket) -> + new TransactionValidatorFactory( + evm.getGasCalculator(), gasLimitCalculator, true, chainId)) .name("ClassicTangerineWhistle"); } public static ProtocolSpecBuilder dieHardDefinition( - final Optional chainId, - final OptionalInt ignoredConfigContractSizeLimit, - final OptionalInt configStackSizeLimit, - final EvmConfiguration evmConfiguration) { - return tangerineWhistleDefinition( - chainId, OptionalInt.empty(), configStackSizeLimit, evmConfiguration) + final Optional chainId, final EvmConfiguration evmConfiguration) { + return tangerineWhistleDefinition(chainId, evmConfiguration) .gasCalculator(DieHardGasCalculator::new) .difficultyCalculator(ClassicDifficultyCalculators.DIFFICULTY_BOMB_PAUSED) .name("DieHard"); @@ -95,11 +83,9 @@ public class ClassicProtocolSpecs { public static ProtocolSpecBuilder gothamDefinition( final Optional chainId, - final OptionalInt contractSizeLimit, - final OptionalInt configStackSizeLimit, final OptionalLong ecip1017EraRounds, final EvmConfiguration evmConfiguration) { - return dieHardDefinition(chainId, contractSizeLimit, configStackSizeLimit, evmConfiguration) + return dieHardDefinition(chainId, evmConfiguration) .blockReward(MAX_BLOCK_REWARD) .difficultyCalculator(ClassicDifficultyCalculators.DIFFICULTY_BOMB_DELAYED) .blockProcessorBuilder( @@ -122,35 +108,23 @@ public class ClassicProtocolSpecs { public static ProtocolSpecBuilder defuseDifficultyBombDefinition( final Optional chainId, - final OptionalInt contractSizeLimit, - final OptionalInt configStackSizeLimit, final OptionalLong ecip1017EraRounds, final EvmConfiguration evmConfiguration) { - return gothamDefinition( - chainId, contractSizeLimit, configStackSizeLimit, ecip1017EraRounds, evmConfiguration) + return gothamDefinition(chainId, ecip1017EraRounds, evmConfiguration) .difficultyCalculator(ClassicDifficultyCalculators.DIFFICULTY_BOMB_REMOVED) .transactionValidatorFactoryBuilder( - (gasCalculator, gasLimitCalculator, feeMarket) -> - new TransactionValidatorFactory(gasCalculator, gasLimitCalculator, true, chainId)) + (evm, gasLimitCalculator, feeMarket) -> + new TransactionValidatorFactory( + evm.getGasCalculator(), gasLimitCalculator, true, chainId)) .name("DefuseDifficultyBomb"); } public static ProtocolSpecBuilder atlantisDefinition( final Optional chainId, - final OptionalInt configContractSizeLimit, - final OptionalInt configStackSizeLimit, final boolean enableRevertReason, final OptionalLong ecip1017EraRounds, final EvmConfiguration evmConfiguration) { - final int contractSizeLimit = - configContractSizeLimit.orElse(MainnetProtocolSpecs.SPURIOUS_DRAGON_CONTRACT_SIZE_LIMIT); - final int stackSizeLimit = configStackSizeLimit.orElse(MessageFrame.DEFAULT_MAX_STACK_SIZE); - return gothamDefinition( - chainId, - configContractSizeLimit, - configStackSizeLimit, - ecip1017EraRounds, - evmConfiguration) + return gothamDefinition(chainId, ecip1017EraRounds, evmConfiguration) .evmBuilder(MainnetEVMs::byzantium) .evmConfiguration(evmConfiguration) .gasCalculator(SpuriousDragonGasCalculator::new) @@ -163,13 +137,9 @@ public class ClassicProtocolSpecs { ? ClassicProtocolSpecs::byzantiumTransactionReceiptFactoryWithReasonEnabled : ClassicProtocolSpecs::byzantiumTransactionReceiptFactory) .contractCreationProcessorBuilder( - (gasCalculator, evm) -> + evm -> new ContractCreationProcessor( - gasCalculator, - evm, - true, - Collections.singletonList(MaxCodeSizeRule.of(contractSizeLimit)), - 1)) + evm, true, Collections.singletonList(MaxCodeSizeRule.from(evm)), 1)) .transactionProcessorBuilder( (gasCalculator, feeMarket, @@ -183,7 +153,7 @@ public class ClassicProtocolSpecs { messageCallProcessor, true, false, - stackSizeLimit, + evmConfiguration.evmStackSize(), feeMarket, CoinbaseFeePriceCalculator.frontier())) .name("Atlantis"); @@ -191,18 +161,10 @@ public class ClassicProtocolSpecs { public static ProtocolSpecBuilder aghartaDefinition( final Optional chainId, - final OptionalInt configContractSizeLimit, - final OptionalInt configStackSizeLimit, final boolean enableRevertReason, final OptionalLong ecip1017EraRounds, final EvmConfiguration evmConfiguration) { - return atlantisDefinition( - chainId, - configContractSizeLimit, - configStackSizeLimit, - enableRevertReason, - ecip1017EraRounds, - evmConfiguration) + return atlantisDefinition(chainId, enableRevertReason, ecip1017EraRounds, evmConfiguration) .evmBuilder(MainnetEVMs::constantinople) .gasCalculator(PetersburgGasCalculator::new) .evmBuilder(MainnetEVMs::constantinople) @@ -212,18 +174,10 @@ public class ClassicProtocolSpecs { public static ProtocolSpecBuilder phoenixDefinition( final Optional chainId, - final OptionalInt configContractSizeLimit, - final OptionalInt configStackSizeLimit, final boolean enableRevertReason, final OptionalLong ecip1017EraRounds, final EvmConfiguration evmConfiguration) { - return aghartaDefinition( - chainId, - configContractSizeLimit, - configStackSizeLimit, - enableRevertReason, - ecip1017EraRounds, - evmConfiguration) + return aghartaDefinition(chainId, enableRevertReason, ecip1017EraRounds, evmConfiguration) .gasCalculator(IstanbulGasCalculator::new) .evmBuilder( (gasCalculator, evmConfig) -> @@ -235,18 +189,10 @@ public class ClassicProtocolSpecs { public static ProtocolSpecBuilder thanosDefinition( final Optional chainId, - final OptionalInt configContractSizeLimit, - final OptionalInt configStackSizeLimit, final boolean enableRevertReason, final OptionalLong ecip1017EraRounds, final EvmConfiguration evmConfiguration) { - return phoenixDefinition( - chainId, - configContractSizeLimit, - configStackSizeLimit, - enableRevertReason, - ecip1017EraRounds, - evmConfiguration) + return phoenixDefinition(chainId, enableRevertReason, ecip1017EraRounds, evmConfiguration) .blockHeaderValidatorBuilder( feeMarket -> MainnetBlockHeaderValidator.createPgaBlockHeaderValidator( @@ -280,23 +226,15 @@ public class ClassicProtocolSpecs { public static ProtocolSpecBuilder magnetoDefinition( final Optional chainId, - final OptionalInt configContractSizeLimit, - final OptionalInt configStackSizeLimit, final boolean enableRevertReason, final OptionalLong ecip1017EraRounds, final EvmConfiguration evmConfiguration) { - return thanosDefinition( - chainId, - configContractSizeLimit, - configStackSizeLimit, - enableRevertReason, - ecip1017EraRounds, - evmConfiguration) + return thanosDefinition(chainId, enableRevertReason, ecip1017EraRounds, evmConfiguration) .gasCalculator(BerlinGasCalculator::new) .transactionValidatorFactoryBuilder( - (gasCalculator, gasLimitCalculator, feeMarket) -> + (evm, gasLimitCalculator, feeMarket) -> new TransactionValidatorFactory( - gasCalculator, + evm.getGasCalculator(), gasLimitCalculator, true, chainId, @@ -310,47 +248,24 @@ public class ClassicProtocolSpecs { public static ProtocolSpecBuilder mystiqueDefinition( final Optional chainId, - final OptionalInt configContractSizeLimit, - final OptionalInt configStackSizeLimit, final boolean enableRevertReason, final OptionalLong ecip1017EraRounds, final EvmConfiguration evmConfiguration) { - final int contractSizeLimit = - configContractSizeLimit.orElse(MainnetProtocolSpecs.SPURIOUS_DRAGON_CONTRACT_SIZE_LIMIT); - return magnetoDefinition( - chainId, - configContractSizeLimit, - configStackSizeLimit, - enableRevertReason, - ecip1017EraRounds, - evmConfiguration) + return magnetoDefinition(chainId, enableRevertReason, ecip1017EraRounds, evmConfiguration) .gasCalculator(LondonGasCalculator::new) .contractCreationProcessorBuilder( - (gasCalculator, evm) -> + evm -> new ContractCreationProcessor( - gasCalculator, - evm, - true, - List.of(MaxCodeSizeRule.of(contractSizeLimit), PrefixCodeRule.of()), - 1)) + evm, true, List.of(MaxCodeSizeRule.from(evm), PrefixCodeRule.of()), 1)) .name("Mystique"); } public static ProtocolSpecBuilder spiralDefinition( final Optional chainId, - final OptionalInt configContractSizeLimit, - final OptionalInt configStackSizeLimit, final boolean enableRevertReason, final OptionalLong ecip1017EraRounds, final EvmConfiguration evmConfiguration) { - final int stackSizeLimit = configStackSizeLimit.orElse(MessageFrame.DEFAULT_MAX_STACK_SIZE); - return mystiqueDefinition( - chainId, - configContractSizeLimit, - configStackSizeLimit, - enableRevertReason, - ecip1017EraRounds, - evmConfiguration) + return mystiqueDefinition(chainId, enableRevertReason, ecip1017EraRounds, evmConfiguration) // EIP-3860 .gasCalculator(ShanghaiGasCalculator::new) // EIP-3855 @@ -372,7 +287,7 @@ public class ClassicProtocolSpecs { messageCallProcessor, true, true, - stackSizeLimit, + evmConfiguration.evmStackSize(), feeMarket, CoinbaseFeePriceCalculator.frontier())) .name("Spiral"); diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/MainnetProtocolSpecFactory.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/MainnetProtocolSpecFactory.java index 095a85ef5..a902d9faa 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/MainnetProtocolSpecFactory.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/MainnetProtocolSpecFactory.java @@ -20,14 +20,11 @@ import org.hyperledger.besu.evm.internal.EvmConfiguration; import java.math.BigInteger; import java.util.Optional; -import java.util.OptionalInt; import java.util.OptionalLong; public class MainnetProtocolSpecFactory { private final Optional chainId; - private final OptionalInt contractSizeLimit; - private final OptionalInt evmStackSize; private final boolean isRevertReasonEnabled; private final OptionalLong ecip1017EraRounds; private final EvmConfiguration evmConfiguration; @@ -35,15 +32,11 @@ public class MainnetProtocolSpecFactory { public MainnetProtocolSpecFactory( final Optional chainId, - final OptionalInt contractSizeLimit, - final OptionalInt evmStackSize, final boolean isRevertReasonEnabled, final OptionalLong ecip1017EraRounds, final EvmConfiguration evmConfiguration, final MiningParameters miningParameters) { this.chainId = chainId; - this.contractSizeLimit = contractSizeLimit; - this.evmStackSize = evmStackSize; this.isRevertReasonEnabled = isRevertReasonEnabled; this.ecip1017EraRounds = ecip1017EraRounds; this.evmConfiguration = evmConfiguration; @@ -51,153 +44,98 @@ public class MainnetProtocolSpecFactory { } public ProtocolSpecBuilder frontierDefinition() { - return MainnetProtocolSpecs.frontierDefinition( - contractSizeLimit, evmStackSize, evmConfiguration); + return MainnetProtocolSpecs.frontierDefinition(evmConfiguration); } public ProtocolSpecBuilder homesteadDefinition() { - return MainnetProtocolSpecs.homesteadDefinition( - contractSizeLimit, evmStackSize, evmConfiguration); + return MainnetProtocolSpecs.homesteadDefinition(evmConfiguration); } public ProtocolSpecBuilder daoRecoveryInitDefinition() { - return MainnetProtocolSpecs.daoRecoveryInitDefinition( - contractSizeLimit, evmStackSize, evmConfiguration); + return MainnetProtocolSpecs.daoRecoveryInitDefinition(evmConfiguration); } public ProtocolSpecBuilder daoRecoveryTransitionDefinition() { - return MainnetProtocolSpecs.daoRecoveryTransitionDefinition( - contractSizeLimit, evmStackSize, evmConfiguration); + return MainnetProtocolSpecs.daoRecoveryTransitionDefinition(evmConfiguration); } public ProtocolSpecBuilder tangerineWhistleDefinition() { - return MainnetProtocolSpecs.tangerineWhistleDefinition( - contractSizeLimit, evmStackSize, evmConfiguration); + return MainnetProtocolSpecs.tangerineWhistleDefinition(evmConfiguration); } public ProtocolSpecBuilder spuriousDragonDefinition() { - return MainnetProtocolSpecs.spuriousDragonDefinition( - chainId, contractSizeLimit, evmStackSize, evmConfiguration); + return MainnetProtocolSpecs.spuriousDragonDefinition(chainId, evmConfiguration); } public ProtocolSpecBuilder byzantiumDefinition() { return MainnetProtocolSpecs.byzantiumDefinition( - chainId, contractSizeLimit, evmStackSize, isRevertReasonEnabled, evmConfiguration); + chainId, isRevertReasonEnabled, evmConfiguration); } public ProtocolSpecBuilder constantinopleDefinition() { return MainnetProtocolSpecs.constantinopleDefinition( - chainId, contractSizeLimit, evmStackSize, isRevertReasonEnabled, evmConfiguration); + chainId, isRevertReasonEnabled, evmConfiguration); } public ProtocolSpecBuilder petersburgDefinition() { return MainnetProtocolSpecs.petersburgDefinition( - chainId, contractSizeLimit, evmStackSize, isRevertReasonEnabled, evmConfiguration); + chainId, isRevertReasonEnabled, evmConfiguration); } public ProtocolSpecBuilder istanbulDefinition() { return MainnetProtocolSpecs.istanbulDefinition( - chainId, contractSizeLimit, evmStackSize, isRevertReasonEnabled, evmConfiguration); + chainId, isRevertReasonEnabled, evmConfiguration); } public ProtocolSpecBuilder muirGlacierDefinition() { return MainnetProtocolSpecs.muirGlacierDefinition( - chainId, contractSizeLimit, evmStackSize, isRevertReasonEnabled, evmConfiguration); + chainId, isRevertReasonEnabled, evmConfiguration); } public ProtocolSpecBuilder berlinDefinition() { - return MainnetProtocolSpecs.berlinDefinition( - chainId, contractSizeLimit, evmStackSize, isRevertReasonEnabled, evmConfiguration); + return MainnetProtocolSpecs.berlinDefinition(chainId, isRevertReasonEnabled, evmConfiguration); } public ProtocolSpecBuilder londonDefinition(final GenesisConfigOptions genesisConfigOptions) { return MainnetProtocolSpecs.londonDefinition( - chainId, - contractSizeLimit, - evmStackSize, - isRevertReasonEnabled, - genesisConfigOptions, - evmConfiguration, - miningParameters); + chainId, isRevertReasonEnabled, genesisConfigOptions, evmConfiguration, miningParameters); } public ProtocolSpecBuilder arrowGlacierDefinition( final GenesisConfigOptions genesisConfigOptions) { return MainnetProtocolSpecs.arrowGlacierDefinition( - chainId, - contractSizeLimit, - evmStackSize, - isRevertReasonEnabled, - genesisConfigOptions, - evmConfiguration, - miningParameters); + chainId, isRevertReasonEnabled, genesisConfigOptions, evmConfiguration, miningParameters); } public ProtocolSpecBuilder grayGlacierDefinition( final GenesisConfigOptions genesisConfigOptions) { return MainnetProtocolSpecs.grayGlacierDefinition( - chainId, - contractSizeLimit, - evmStackSize, - isRevertReasonEnabled, - genesisConfigOptions, - evmConfiguration, - miningParameters); + chainId, isRevertReasonEnabled, genesisConfigOptions, evmConfiguration, miningParameters); } public ProtocolSpecBuilder parisDefinition(final GenesisConfigOptions genesisConfigOptions) { return MainnetProtocolSpecs.parisDefinition( - chainId, - contractSizeLimit, - evmStackSize, - isRevertReasonEnabled, - genesisConfigOptions, - evmConfiguration, - miningParameters); + chainId, isRevertReasonEnabled, genesisConfigOptions, evmConfiguration, miningParameters); } public ProtocolSpecBuilder shanghaiDefinition(final GenesisConfigOptions genesisConfigOptions) { return MainnetProtocolSpecs.shanghaiDefinition( - chainId, - contractSizeLimit, - evmStackSize, - isRevertReasonEnabled, - genesisConfigOptions, - evmConfiguration, - miningParameters); + chainId, isRevertReasonEnabled, genesisConfigOptions, evmConfiguration, miningParameters); } public ProtocolSpecBuilder cancunDefinition(final GenesisConfigOptions genesisConfigOptions) { return MainnetProtocolSpecs.cancunDefinition( - chainId, - contractSizeLimit, - evmStackSize, - isRevertReasonEnabled, - genesisConfigOptions, - evmConfiguration, - miningParameters); + chainId, isRevertReasonEnabled, genesisConfigOptions, evmConfiguration, miningParameters); } public ProtocolSpecBuilder pragueDefinition(final GenesisConfigOptions genesisConfigOptions) { return MainnetProtocolSpecs.pragueDefinition( - chainId, - contractSizeLimit, - evmStackSize, - isRevertReasonEnabled, - genesisConfigOptions, - evmConfiguration, - miningParameters); + chainId, isRevertReasonEnabled, genesisConfigOptions, evmConfiguration, miningParameters); } public ProtocolSpecBuilder pragueEOFDefinition(final GenesisConfigOptions genesisConfigOptions) { return MainnetProtocolSpecs.pragueEOFDefinition( - chainId, - contractSizeLimit, - evmStackSize, - isRevertReasonEnabled, - genesisConfigOptions, - evmConfiguration, - miningParameters); + chainId, isRevertReasonEnabled, genesisConfigOptions, evmConfiguration, miningParameters); } /** @@ -213,13 +151,7 @@ public class MainnetProtocolSpecFactory { */ public ProtocolSpecBuilder futureEipsDefinition(final GenesisConfigOptions genesisConfigOptions) { return MainnetProtocolSpecs.futureEipsDefinition( - chainId, - contractSizeLimit, - evmStackSize, - isRevertReasonEnabled, - genesisConfigOptions, - evmConfiguration, - miningParameters); + chainId, isRevertReasonEnabled, genesisConfigOptions, evmConfiguration, miningParameters); } /** @@ -235,100 +167,57 @@ public class MainnetProtocolSpecFactory { public ProtocolSpecBuilder experimentalEipsDefinition( final GenesisConfigOptions genesisConfigOptions) { return MainnetProtocolSpecs.experimentalEipsDefinition( - chainId, - contractSizeLimit, - evmStackSize, - isRevertReasonEnabled, - genesisConfigOptions, - evmConfiguration, - miningParameters); + chainId, isRevertReasonEnabled, genesisConfigOptions, evmConfiguration, miningParameters); } //////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////// // Classic Protocol Specs public ProtocolSpecBuilder dieHardDefinition() { - return ClassicProtocolSpecs.dieHardDefinition( - chainId, contractSizeLimit, evmStackSize, evmConfiguration); + return ClassicProtocolSpecs.dieHardDefinition(chainId, evmConfiguration); } public ProtocolSpecBuilder gothamDefinition() { - return ClassicProtocolSpecs.gothamDefinition( - chainId, contractSizeLimit, evmStackSize, ecip1017EraRounds, evmConfiguration); + return ClassicProtocolSpecs.gothamDefinition(chainId, ecip1017EraRounds, evmConfiguration); } public ProtocolSpecBuilder defuseDifficultyBombDefinition() { return ClassicProtocolSpecs.defuseDifficultyBombDefinition( - chainId, contractSizeLimit, evmStackSize, ecip1017EraRounds, evmConfiguration); + chainId, ecip1017EraRounds, evmConfiguration); } public ProtocolSpecBuilder atlantisDefinition() { return ClassicProtocolSpecs.atlantisDefinition( - chainId, - contractSizeLimit, - evmStackSize, - isRevertReasonEnabled, - ecip1017EraRounds, - evmConfiguration); + chainId, isRevertReasonEnabled, ecip1017EraRounds, evmConfiguration); } public ProtocolSpecBuilder aghartaDefinition() { return ClassicProtocolSpecs.aghartaDefinition( - chainId, - contractSizeLimit, - evmStackSize, - isRevertReasonEnabled, - ecip1017EraRounds, - evmConfiguration); + chainId, isRevertReasonEnabled, ecip1017EraRounds, evmConfiguration); } public ProtocolSpecBuilder phoenixDefinition() { return ClassicProtocolSpecs.phoenixDefinition( - chainId, - contractSizeLimit, - evmStackSize, - isRevertReasonEnabled, - ecip1017EraRounds, - evmConfiguration); + chainId, isRevertReasonEnabled, ecip1017EraRounds, evmConfiguration); } public ProtocolSpecBuilder thanosDefinition() { return ClassicProtocolSpecs.thanosDefinition( - chainId, - contractSizeLimit, - evmStackSize, - isRevertReasonEnabled, - ecip1017EraRounds, - evmConfiguration); + chainId, isRevertReasonEnabled, ecip1017EraRounds, evmConfiguration); } public ProtocolSpecBuilder magnetoDefinition() { return ClassicProtocolSpecs.magnetoDefinition( - chainId, - contractSizeLimit, - evmStackSize, - isRevertReasonEnabled, - ecip1017EraRounds, - evmConfiguration); + chainId, isRevertReasonEnabled, ecip1017EraRounds, evmConfiguration); } public ProtocolSpecBuilder mystiqueDefinition() { return ClassicProtocolSpecs.mystiqueDefinition( - chainId, - contractSizeLimit, - evmStackSize, - isRevertReasonEnabled, - ecip1017EraRounds, - evmConfiguration); + chainId, isRevertReasonEnabled, ecip1017EraRounds, evmConfiguration); } public ProtocolSpecBuilder spiralDefinition() { return ClassicProtocolSpecs.spiralDefinition( - chainId, - contractSizeLimit, - evmStackSize, - isRevertReasonEnabled, - ecip1017EraRounds, - evmConfiguration); + chainId, isRevertReasonEnabled, ecip1017EraRounds, evmConfiguration); } } diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/MainnetProtocolSpecs.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/MainnetProtocolSpecs.java index 16fee28bb..763c751e4 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/MainnetProtocolSpecs.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/MainnetProtocolSpecs.java @@ -48,7 +48,6 @@ import org.hyperledger.besu.evm.account.MutableAccount; import org.hyperledger.besu.evm.contractvalidation.EOFValidationCodeRule; import org.hyperledger.besu.evm.contractvalidation.MaxCodeSizeRule; import org.hyperledger.besu.evm.contractvalidation.PrefixCodeRule; -import org.hyperledger.besu.evm.frame.MessageFrame; import org.hyperledger.besu.evm.gascalculator.BerlinGasCalculator; import org.hyperledger.besu.evm.gascalculator.ByzantiumGasCalculator; import org.hyperledger.besu.evm.gascalculator.CancunGasCalculator; @@ -74,8 +73,8 @@ import java.math.BigInteger; import java.nio.charset.StandardCharsets; import java.util.Collections; import java.util.List; +import java.util.Objects; import java.util.Optional; -import java.util.OptionalInt; import java.util.Set; import java.util.stream.IntStream; @@ -85,11 +84,6 @@ import io.vertx.core.json.JsonArray; /** Provides the various {@link ProtocolSpec}s on mainnet hard forks. */ public abstract class MainnetProtocolSpecs { - public static final int FRONTIER_CONTRACT_SIZE_LIMIT = Integer.MAX_VALUE; - - public static final int SPURIOUS_DRAGON_CONTRACT_SIZE_LIMIT = 24576; - public static final int SHANGHAI_INIT_CODE_SIZE_LIMIT = 2 * SPURIOUS_DRAGON_CONTRACT_SIZE_LIMIT; - private static final Address RIPEMD160_PRECOMPILE = Address.fromHexString("0x0000000000000000000000000000000000000003"); @@ -107,12 +101,7 @@ public abstract class MainnetProtocolSpecs { private MainnetProtocolSpecs() {} - public static ProtocolSpecBuilder frontierDefinition( - final OptionalInt configContractSizeLimit, - final OptionalInt configStackSizeLimit, - final EvmConfiguration evmConfiguration) { - final int contractSizeLimit = configContractSizeLimit.orElse(FRONTIER_CONTRACT_SIZE_LIMIT); - final int stackSizeLimit = configStackSizeLimit.orElse(MessageFrame.DEFAULT_MAX_STACK_SIZE); + public static ProtocolSpecBuilder frontierDefinition(final EvmConfiguration evmConfiguration) { return new ProtocolSpecBuilder() .gasCalculator(FrontierGasCalculator::new) .gasLimitCalculatorBuilder(feeMarket -> new FrontierTargetingGasLimitCalculator()) @@ -120,17 +109,13 @@ public abstract class MainnetProtocolSpecs { .precompileContractRegistryBuilder(MainnetPrecompiledContractRegistries::frontier) .messageCallProcessorBuilder(MessageCallProcessor::new) .contractCreationProcessorBuilder( - (gasCalculator, evm) -> + evm -> new ContractCreationProcessor( - gasCalculator, - evm, - false, - Collections.singletonList(MaxCodeSizeRule.of(contractSizeLimit)), - 0)) + evm, false, Collections.singletonList(MaxCodeSizeRule.from(evm)), 0)) .transactionValidatorFactoryBuilder( - (gasCalculator, gasLimitCalculator, feeMarket) -> + (evm, gasLimitCalculator, feeMarket) -> new TransactionValidatorFactory( - gasCalculator, gasLimitCalculator, false, Optional.empty())) + evm.getGasCalculator(), gasLimitCalculator, false, Optional.empty())) .transactionProcessorBuilder( (gasCalculator, feeMarket, @@ -144,7 +129,7 @@ public abstract class MainnetProtocolSpecs { messageCallProcessor, false, false, - stackSizeLimit, + evmConfiguration.evmStackSize(), FeeMarket.legacy(), CoinbaseFeePriceCalculator.frontier())) .privateTransactionProcessorBuilder( @@ -157,7 +142,7 @@ public abstract class MainnetProtocolSpecs { contractCreationProcessor, messageCallProcessor, false, - stackSizeLimit, + evmConfiguration.evmStackSize(), new PrivateTransactionValidator(Optional.empty()))) .difficultyCalculator(MainnetDifficultyCalculators.FRONTIER) .blockHeaderValidatorBuilder(feeMarket -> MainnetBlockHeaderValidator.create()) @@ -188,35 +173,25 @@ public abstract class MainnetProtocolSpecs { return MainnetBlockValidator::new; } - public static ProtocolSpecBuilder homesteadDefinition( - final OptionalInt configContractSizeLimit, - final OptionalInt configStackSizeLimit, - final EvmConfiguration evmConfiguration) { - final int contractSizeLimit = configContractSizeLimit.orElse(FRONTIER_CONTRACT_SIZE_LIMIT); - return frontierDefinition(configContractSizeLimit, configStackSizeLimit, evmConfiguration) + public static ProtocolSpecBuilder homesteadDefinition(final EvmConfiguration evmConfiguration) { + return frontierDefinition(evmConfiguration) .gasCalculator(HomesteadGasCalculator::new) .evmBuilder(MainnetEVMs::homestead) .contractCreationProcessorBuilder( - (gasCalculator, evm) -> + evm -> new ContractCreationProcessor( - gasCalculator, - evm, - true, - Collections.singletonList(MaxCodeSizeRule.of(contractSizeLimit)), - 0)) + evm, true, Collections.singletonList(MaxCodeSizeRule.from(evm)), 0)) .transactionValidatorFactoryBuilder( - (gasCalculator, gasLimitCalculator, feeMarket) -> + (evm, gasLimitCalculator, feeMarket) -> new TransactionValidatorFactory( - gasCalculator, gasLimitCalculator, true, Optional.empty())) + evm.getGasCalculator(), gasLimitCalculator, true, Optional.empty())) .difficultyCalculator(MainnetDifficultyCalculators.HOMESTEAD) .name("Homestead"); } public static ProtocolSpecBuilder daoRecoveryInitDefinition( - final OptionalInt contractSizeLimit, - final OptionalInt configStackSizeLimit, final EvmConfiguration evmConfiguration) { - return homesteadDefinition(contractSizeLimit, configStackSizeLimit, evmConfiguration) + return homesteadDefinition(evmConfiguration) .blockHeaderValidatorBuilder(feeMarket -> MainnetBlockHeaderValidator.createDaoValidator()) .blockProcessorBuilder( (transactionProcessor, @@ -237,33 +212,22 @@ public abstract class MainnetProtocolSpecs { } public static ProtocolSpecBuilder daoRecoveryTransitionDefinition( - final OptionalInt contractSizeLimit, - final OptionalInt configStackSizeLimit, final EvmConfiguration evmConfiguration) { - return daoRecoveryInitDefinition(contractSizeLimit, configStackSizeLimit, evmConfiguration) + return daoRecoveryInitDefinition(evmConfiguration) .blockProcessorBuilder(MainnetBlockProcessor::new) .name("DaoRecoveryTransition"); } public static ProtocolSpecBuilder tangerineWhistleDefinition( - final OptionalInt contractSizeLimit, - final OptionalInt configStackSizeLimit, final EvmConfiguration evmConfiguration) { - return homesteadDefinition(contractSizeLimit, configStackSizeLimit, evmConfiguration) + return homesteadDefinition(evmConfiguration) .gasCalculator(TangerineWhistleGasCalculator::new) .name("TangerineWhistle"); } public static ProtocolSpecBuilder spuriousDragonDefinition( - final Optional chainId, - final OptionalInt configContractSizeLimit, - final OptionalInt configStackSizeLimit, - final EvmConfiguration evmConfiguration) { - final int contractSizeLimit = - configContractSizeLimit.orElse(SPURIOUS_DRAGON_CONTRACT_SIZE_LIMIT); - final int stackSizeLimit = configStackSizeLimit.orElse(MessageFrame.DEFAULT_MAX_STACK_SIZE); - - return tangerineWhistleDefinition(OptionalInt.empty(), configStackSizeLimit, evmConfiguration) + final Optional chainId, final EvmConfiguration evmConfiguration) { + return tangerineWhistleDefinition(evmConfiguration) .isReplayProtectionSupported(true) .gasCalculator(SpuriousDragonGasCalculator::new) .skipZeroBlockRewards(true) @@ -274,17 +238,17 @@ public abstract class MainnetProtocolSpecs { precompileContractRegistry, SPURIOUS_DRAGON_FORCE_DELETE_WHEN_EMPTY_ADDRESSES)) .contractCreationProcessorBuilder( - (gasCalculator, evm) -> + evm -> new ContractCreationProcessor( - gasCalculator, evm, true, - Collections.singletonList(MaxCodeSizeRule.of(contractSizeLimit)), + Collections.singletonList(MaxCodeSizeRule.from(evm)), 1, SPURIOUS_DRAGON_FORCE_DELETE_WHEN_EMPTY_ADDRESSES)) .transactionValidatorFactoryBuilder( - (gasCalculator, gasLimitCalculator, feeMarket) -> - new TransactionValidatorFactory(gasCalculator, gasLimitCalculator, true, chainId)) + (evm, gasLimitCalculator, feeMarket) -> + new TransactionValidatorFactory( + evm.getGasCalculator(), gasLimitCalculator, true, chainId)) .transactionProcessorBuilder( (gasCalculator, feeMarket, @@ -298,7 +262,7 @@ public abstract class MainnetProtocolSpecs { messageCallProcessor, true, false, - stackSizeLimit, + evmConfiguration.evmStackSize(), feeMarket, CoinbaseFeePriceCalculator.frontier())) .name("SpuriousDragon"); @@ -306,13 +270,9 @@ public abstract class MainnetProtocolSpecs { public static ProtocolSpecBuilder byzantiumDefinition( final Optional chainId, - final OptionalInt contractSizeLimit, - final OptionalInt configStackSizeLimit, final boolean enableRevertReason, final EvmConfiguration evmConfiguration) { - final int stackSizeLimit = configStackSizeLimit.orElse(MessageFrame.DEFAULT_MAX_STACK_SIZE); - return spuriousDragonDefinition( - chainId, contractSizeLimit, configStackSizeLimit, evmConfiguration) + return spuriousDragonDefinition(chainId, evmConfiguration) .gasCalculator(ByzantiumGasCalculator::new) .evmBuilder(MainnetEVMs::byzantium) .precompileContractRegistryBuilder(MainnetPrecompiledContractRegistries::byzantium) @@ -333,19 +293,16 @@ public abstract class MainnetProtocolSpecs { contractCreationProcessor, messageCallProcessor, false, - stackSizeLimit, + evmConfiguration.evmStackSize(), privateTransactionValidator)) .name("Byzantium"); } public static ProtocolSpecBuilder constantinopleDefinition( final Optional chainId, - final OptionalInt contractSizeLimit, - final OptionalInt configStackSizeLimit, final boolean enableRevertReason, final EvmConfiguration evmConfiguration) { - return byzantiumDefinition( - chainId, contractSizeLimit, configStackSizeLimit, enableRevertReason, evmConfiguration) + return byzantiumDefinition(chainId, enableRevertReason, evmConfiguration) .difficultyCalculator(MainnetDifficultyCalculators.CONSTANTINOPLE) .gasCalculator(ConstantinopleGasCalculator::new) .evmBuilder(MainnetEVMs::constantinople) @@ -355,30 +312,18 @@ public abstract class MainnetProtocolSpecs { public static ProtocolSpecBuilder petersburgDefinition( final Optional chainId, - final OptionalInt contractSizeLimit, - final OptionalInt configStackSizeLimit, final boolean enableRevertReason, final EvmConfiguration evmConfiguration) { - return constantinopleDefinition( - chainId, contractSizeLimit, configStackSizeLimit, enableRevertReason, evmConfiguration) + return constantinopleDefinition(chainId, enableRevertReason, evmConfiguration) .gasCalculator(PetersburgGasCalculator::new) .name("Petersburg"); } public static ProtocolSpecBuilder istanbulDefinition( final Optional chainId, - final OptionalInt configContractSizeLimit, - final OptionalInt configStackSizeLimit, final boolean enableRevertReason, final EvmConfiguration evmConfiguration) { - final int contractSizeLimit = - configContractSizeLimit.orElse(SPURIOUS_DRAGON_CONTRACT_SIZE_LIMIT); - return petersburgDefinition( - chainId, - configContractSizeLimit, - configStackSizeLimit, - enableRevertReason, - evmConfiguration) + return petersburgDefinition(chainId, enableRevertReason, evmConfiguration) .gasCalculator(IstanbulGasCalculator::new) .evmBuilder( (gasCalculator, jdCacheConfig) -> @@ -386,12 +331,11 @@ public abstract class MainnetProtocolSpecs { gasCalculator, chainId.orElse(BigInteger.ZERO), evmConfiguration)) .precompileContractRegistryBuilder(MainnetPrecompiledContractRegistries::istanbul) .contractCreationProcessorBuilder( - (gasCalculator, evm) -> + evm -> new ContractCreationProcessor( - gasCalculator, evm, true, - Collections.singletonList(MaxCodeSizeRule.of(contractSizeLimit)), + Collections.singletonList(MaxCodeSizeRule.from(evm)), 1, SPURIOUS_DRAGON_FORCE_DELETE_WHEN_EMPTY_ADDRESSES)) .name("Istanbul"); @@ -399,29 +343,23 @@ public abstract class MainnetProtocolSpecs { static ProtocolSpecBuilder muirGlacierDefinition( final Optional chainId, - final OptionalInt contractSizeLimit, - final OptionalInt configStackSizeLimit, final boolean enableRevertReason, final EvmConfiguration evmConfiguration) { - return istanbulDefinition( - chainId, contractSizeLimit, configStackSizeLimit, enableRevertReason, evmConfiguration) + return istanbulDefinition(chainId, enableRevertReason, evmConfiguration) .difficultyCalculator(MainnetDifficultyCalculators.MUIR_GLACIER) .name("MuirGlacier"); } static ProtocolSpecBuilder berlinDefinition( final Optional chainId, - final OptionalInt contractSizeLimit, - final OptionalInt configStackSizeLimit, final boolean enableRevertReason, final EvmConfiguration evmConfiguration) { - return muirGlacierDefinition( - chainId, contractSizeLimit, configStackSizeLimit, enableRevertReason, evmConfiguration) + return muirGlacierDefinition(chainId, enableRevertReason, evmConfiguration) .gasCalculator(BerlinGasCalculator::new) .transactionValidatorFactoryBuilder( - (gasCalculator, gasLimitCalculator, feeMarket) -> + (evm, gasLimitCalculator, feeMarket) -> new TransactionValidatorFactory( - gasCalculator, + evm.getGasCalculator(), gasLimitCalculator, true, chainId, @@ -435,30 +373,24 @@ public abstract class MainnetProtocolSpecs { static ProtocolSpecBuilder londonDefinition( final Optional chainId, - final OptionalInt configContractSizeLimit, - final OptionalInt configStackSizeLimit, final boolean enableRevertReason, final GenesisConfigOptions genesisConfigOptions, final EvmConfiguration evmConfiguration, final MiningParameters miningParameters) { - final int contractSizeLimit = - configContractSizeLimit.orElse(SPURIOUS_DRAGON_CONTRACT_SIZE_LIMIT); - final int stackSizeLimit = configStackSizeLimit.orElse(MessageFrame.DEFAULT_MAX_STACK_SIZE); final long londonForkBlockNumber = genesisConfigOptions.getLondonBlockNumber().orElse(Long.MAX_VALUE); - final BaseFeeMarket londonFeeMarket = - genesisConfigOptions.isZeroBaseFee() - ? FeeMarket.zeroBaseFee(londonForkBlockNumber) - : genesisConfigOptions.isFixedBaseFee() - ? FeeMarket.fixedBaseFee( - londonForkBlockNumber, miningParameters.getMinTransactionGasPrice()) - : FeeMarket.london(londonForkBlockNumber, genesisConfigOptions.getBaseFeePerGas()); - return berlinDefinition( - chainId, - configContractSizeLimit, - configStackSizeLimit, - enableRevertReason, - evmConfiguration) + final BaseFeeMarket londonFeeMarket; + if (genesisConfigOptions.isZeroBaseFee()) { + londonFeeMarket = FeeMarket.zeroBaseFee(londonForkBlockNumber); + } else if (genesisConfigOptions.isFixedBaseFee()) { + londonFeeMarket = + FeeMarket.fixedBaseFee( + londonForkBlockNumber, miningParameters.getMinTransactionGasPrice()); + } else { + londonFeeMarket = + FeeMarket.london(londonForkBlockNumber, genesisConfigOptions.getBaseFeePerGas()); + } + return berlinDefinition(chainId, enableRevertReason, evmConfiguration) .feeMarket(londonFeeMarket) .gasCalculator(LondonGasCalculator::new) .gasLimitCalculatorBuilder( @@ -466,9 +398,9 @@ public abstract class MainnetProtocolSpecs { new LondonTargetingGasLimitCalculator( londonForkBlockNumber, (BaseFeeMarket) feeMarket)) .transactionValidatorFactoryBuilder( - (gasCalculator, gasLimitCalculator, feeMarket) -> + (evm, gasLimitCalculator, feeMarket) -> new TransactionValidatorFactory( - gasCalculator, + evm.getGasCalculator(), gasLimitCalculator, feeMarket, true, @@ -491,16 +423,15 @@ public abstract class MainnetProtocolSpecs { messageCallProcessor, true, false, - stackSizeLimit, + evmConfiguration.evmStackSize(), feeMarket, CoinbaseFeePriceCalculator.eip1559())) .contractCreationProcessorBuilder( - (gasCalculator, evm) -> + evm -> new ContractCreationProcessor( - gasCalculator, evm, true, - List.of(MaxCodeSizeRule.of(contractSizeLimit), PrefixCodeRule.of()), + List.of(MaxCodeSizeRule.from(evm), PrefixCodeRule.of()), 1, SPURIOUS_DRAGON_FORCE_DELETE_WHEN_EMPTY_ADDRESSES)) .evmBuilder( @@ -521,61 +452,37 @@ public abstract class MainnetProtocolSpecs { static ProtocolSpecBuilder arrowGlacierDefinition( final Optional chainId, - final OptionalInt configContractSizeLimit, - final OptionalInt configStackSizeLimit, final boolean enableRevertReason, final GenesisConfigOptions genesisConfigOptions, final EvmConfiguration evmConfiguration, final MiningParameters miningParameters) { return londonDefinition( - chainId, - configContractSizeLimit, - configStackSizeLimit, - enableRevertReason, - genesisConfigOptions, - evmConfiguration, - miningParameters) + chainId, enableRevertReason, genesisConfigOptions, evmConfiguration, miningParameters) .difficultyCalculator(MainnetDifficultyCalculators.ARROW_GLACIER) .name("ArrowGlacier"); } static ProtocolSpecBuilder grayGlacierDefinition( final Optional chainId, - final OptionalInt configContractSizeLimit, - final OptionalInt configStackSizeLimit, final boolean enableRevertReason, final GenesisConfigOptions genesisConfigOptions, final EvmConfiguration evmConfiguration, final MiningParameters miningParameters) { return arrowGlacierDefinition( - chainId, - configContractSizeLimit, - configStackSizeLimit, - enableRevertReason, - genesisConfigOptions, - evmConfiguration, - miningParameters) + chainId, enableRevertReason, genesisConfigOptions, evmConfiguration, miningParameters) .difficultyCalculator(MainnetDifficultyCalculators.GRAY_GLACIER) .name("GrayGlacier"); } static ProtocolSpecBuilder parisDefinition( final Optional chainId, - final OptionalInt configContractSizeLimit, - final OptionalInt configStackSizeLimit, final boolean enableRevertReason, final GenesisConfigOptions genesisConfigOptions, final EvmConfiguration evmConfiguration, final MiningParameters miningParameters) { return grayGlacierDefinition( - chainId, - configContractSizeLimit, - configStackSizeLimit, - enableRevertReason, - genesisConfigOptions, - evmConfiguration, - miningParameters) + chainId, enableRevertReason, genesisConfigOptions, evmConfiguration, miningParameters) .evmBuilder( (gasCalculator, jdCacheConfig) -> MainnetEVMs.paris(gasCalculator, chainId.orElse(BigInteger.ZERO), evmConfiguration)) @@ -589,24 +496,12 @@ public abstract class MainnetProtocolSpecs { static ProtocolSpecBuilder shanghaiDefinition( final Optional chainId, - final OptionalInt configContractSizeLimit, - final OptionalInt configStackSizeLimit, final boolean enableRevertReason, final GenesisConfigOptions genesisConfigOptions, final EvmConfiguration evmConfiguration, final MiningParameters miningParameters) { - - // extra variables need to support flipping the warm coinbase flag. - final int stackSizeLimit = configStackSizeLimit.orElse(MessageFrame.DEFAULT_MAX_STACK_SIZE); - return parisDefinition( - chainId, - configContractSizeLimit, - configStackSizeLimit, - enableRevertReason, - genesisConfigOptions, - evmConfiguration, - miningParameters) + chainId, enableRevertReason, genesisConfigOptions, evmConfiguration, miningParameters) // gas calculator has new code to support EIP-3860 limit and meter initcode .gasCalculator(ShanghaiGasCalculator::new) // EVM has a new operation for EIP-3855 PUSH0 instruction @@ -628,14 +523,14 @@ public abstract class MainnetProtocolSpecs { messageCallProcessor, true, true, - stackSizeLimit, + evmConfiguration.evmStackSize(), feeMarket, CoinbaseFeePriceCalculator.eip1559())) // Contract creation rules for EIP-3860 Limit and meter intitcode .transactionValidatorFactoryBuilder( - (gasCalculator, gasLimitCalculator, feeMarket) -> + (evm, gasLimitCalculator, feeMarket) -> new TransactionValidatorFactory( - gasCalculator, + evm.getGasCalculator(), gasLimitCalculator, feeMarket, true, @@ -644,7 +539,7 @@ public abstract class MainnetProtocolSpecs { TransactionType.FRONTIER, TransactionType.ACCESS_LIST, TransactionType.EIP1559), - SHANGHAI_INIT_CODE_SIZE_LIMIT)) + evm.getEvmVersion().getMaxInitcodeSize())) .withdrawalsProcessor(new WithdrawalsProcessor()) .withdrawalsValidator(new WithdrawalsValidator.AllowedWithdrawals()) .name("Shanghai"); @@ -652,31 +547,25 @@ public abstract class MainnetProtocolSpecs { static ProtocolSpecBuilder cancunDefinition( final Optional chainId, - final OptionalInt configContractSizeLimit, - final OptionalInt configStackSizeLimit, final boolean enableRevertReason, final GenesisConfigOptions genesisConfigOptions, final EvmConfiguration evmConfiguration, final MiningParameters miningParameters) { - - final int stackSizeLimit = configStackSizeLimit.orElse(MessageFrame.DEFAULT_MAX_STACK_SIZE); final long londonForkBlockNumber = genesisConfigOptions.getLondonBlockNumber().orElse(0L); - final BaseFeeMarket cancunFeeMarket = - genesisConfigOptions.isZeroBaseFee() - ? FeeMarket.zeroBaseFee(londonForkBlockNumber) - : genesisConfigOptions.isFixedBaseFee() - ? FeeMarket.fixedBaseFee( - londonForkBlockNumber, miningParameters.getMinTransactionGasPrice()) - : FeeMarket.cancun(londonForkBlockNumber, genesisConfigOptions.getBaseFeePerGas()); + final BaseFeeMarket cancunFeeMarket; + if (genesisConfigOptions.isZeroBaseFee()) { + cancunFeeMarket = FeeMarket.zeroBaseFee(londonForkBlockNumber); + } else if (genesisConfigOptions.isFixedBaseFee()) { + cancunFeeMarket = + FeeMarket.fixedBaseFee( + londonForkBlockNumber, miningParameters.getMinTransactionGasPrice()); + } else { + cancunFeeMarket = + FeeMarket.cancun(londonForkBlockNumber, genesisConfigOptions.getBaseFeePerGas()); + } return shanghaiDefinition( - chainId, - configContractSizeLimit, - configStackSizeLimit, - enableRevertReason, - genesisConfigOptions, - evmConfiguration, - miningParameters) + chainId, enableRevertReason, genesisConfigOptions, evmConfiguration, miningParameters) .feeMarket(cancunFeeMarket) // gas calculator for EIP-4844 blob gas .gasCalculator(CancunGasCalculator::new) @@ -704,14 +593,14 @@ public abstract class MainnetProtocolSpecs { messageCallProcessor, true, true, - stackSizeLimit, + evmConfiguration.evmStackSize(), feeMarket, CoinbaseFeePriceCalculator.eip1559())) // change to check for max blob gas per block for EIP-4844 .transactionValidatorFactoryBuilder( - (gasCalculator, gasLimitCalculator, feeMarket) -> + (evm, gasLimitCalculator, feeMarket) -> new TransactionValidatorFactory( - gasCalculator, + evm.getGasCalculator(), gasLimitCalculator, feeMarket, true, @@ -721,7 +610,7 @@ public abstract class MainnetProtocolSpecs { TransactionType.ACCESS_LIST, TransactionType.EIP1559, TransactionType.BLOB), - SHANGHAI_INIT_CODE_SIZE_LIMIT)) + evm.getEvmVersion().getMaxInitcodeSize())) .precompileContractRegistryBuilder(MainnetPrecompiledContractRegistries::cancun) .blockHeaderValidatorBuilder(MainnetBlockHeaderValidator::cancunBlockHeaderValidator) .blockHashProcessor(new CancunBlockHashProcessor()) @@ -730,8 +619,6 @@ public abstract class MainnetProtocolSpecs { static ProtocolSpecBuilder pragueDefinition( final Optional chainId, - final OptionalInt configContractSizeLimit, - final OptionalInt configStackSizeLimit, final boolean enableRevertReason, final GenesisConfigOptions genesisConfigOptions, final EvmConfiguration evmConfiguration, @@ -741,13 +628,7 @@ public abstract class MainnetProtocolSpecs { genesisConfigOptions.getDepositContractAddress().orElse(DEFAULT_DEPOSIT_CONTRACT_ADDRESS); return cancunDefinition( - chainId, - configContractSizeLimit, - configStackSizeLimit, - enableRevertReason, - genesisConfigOptions, - evmConfiguration, - miningParameters) + chainId, enableRevertReason, genesisConfigOptions, evmConfiguration, miningParameters) // EIP-3074 AUTH and AUTCALL gas .gasCalculator(PragueGasCalculator::new) // EIP-3074 AUTH and AUTCALL @@ -759,9 +640,9 @@ public abstract class MainnetProtocolSpecs { // EIP-2537 BLS12-381 precompiles .precompileContractRegistryBuilder(MainnetPrecompiledContractRegistries::prague) - // EIP-7002 Withdrawls / EIP-6610 Deposits / EIP-7685 Requests + // EIP-7002 Withdrawals / EIP-6610 Deposits / EIP-7685 Requests .requestsValidator(pragueRequestsValidator(depositContractAddress)) - // EIP-7002 Withdrawls / EIP-6610 Deposits / EIP-7685 Requests + // EIP-7002 Withdrawals / EIP-6610 Deposits / EIP-7685 Requests .requestProcessorCoordinator(pragueRequestsProcessors(depositContractAddress)) // EIP-2935 Blockhash processor @@ -771,23 +652,13 @@ public abstract class MainnetProtocolSpecs { static ProtocolSpecBuilder pragueEOFDefinition( final Optional chainId, - final OptionalInt configContractSizeLimit, - final OptionalInt configStackSizeLimit, final boolean enableRevertReason, final GenesisConfigOptions genesisConfigOptions, final EvmConfiguration evmConfiguration, final MiningParameters miningParameters) { - final int contractSizeLimit = - configContractSizeLimit.orElse(SPURIOUS_DRAGON_CONTRACT_SIZE_LIMIT); return pragueDefinition( - chainId, - configContractSizeLimit, - configStackSizeLimit, - enableRevertReason, - genesisConfigOptions, - evmConfiguration, - miningParameters) + chainId, enableRevertReason, genesisConfigOptions, evmConfiguration, miningParameters) // EIP-7692 EOF v1 Gas calculator .gasCalculator(PragueEOFGasCalculator::new) // EIP-7692 EOF v1 EVM and opcodes @@ -797,12 +668,11 @@ public abstract class MainnetProtocolSpecs { gasCalculator, chainId.orElse(BigInteger.ZERO), evmConfiguration)) // EIP-7698 EOF v1 creation transaction .contractCreationProcessorBuilder( - (gasCalculator, evm) -> + evm -> new ContractCreationProcessor( - gasCalculator, evm, true, - List.of(MaxCodeSizeRule.of(contractSizeLimit), EOFValidationCodeRule.of(1)), + List.of(MaxCodeSizeRule.from(evm), EOFValidationCodeRule.from(evm)), 1, SPURIOUS_DRAGON_FORCE_DELETE_WHEN_EMPTY_ADDRESSES)) .name("PragueEOF"); @@ -810,22 +680,12 @@ public abstract class MainnetProtocolSpecs { static ProtocolSpecBuilder futureEipsDefinition( final Optional chainId, - final OptionalInt configContractSizeLimit, - final OptionalInt configStackSizeLimit, final boolean enableRevertReason, final GenesisConfigOptions genesisConfigOptions, final EvmConfiguration evmConfiguration, final MiningParameters miningParameters) { - final int contractSizeLimit = - configContractSizeLimit.orElse(SPURIOUS_DRAGON_CONTRACT_SIZE_LIMIT); return pragueEOFDefinition( - chainId, - configContractSizeLimit, - configStackSizeLimit, - enableRevertReason, - genesisConfigOptions, - evmConfiguration, - miningParameters) + chainId, enableRevertReason, genesisConfigOptions, evmConfiguration, miningParameters) // Use Future EIP configured EVM .evmBuilder( (gasCalculator, jdCacheConfig) -> @@ -833,12 +693,11 @@ public abstract class MainnetProtocolSpecs { gasCalculator, chainId.orElse(BigInteger.ZERO), evmConfiguration)) // change contract call creator to accept EOF code .contractCreationProcessorBuilder( - (gasCalculator, evm) -> + evm -> new ContractCreationProcessor( - gasCalculator, evm, true, - List.of(MaxCodeSizeRule.of(contractSizeLimit), EOFValidationCodeRule.of(1)), + List.of(MaxCodeSizeRule.from(evm), EOFValidationCodeRule.from(evm)), 1, SPURIOUS_DRAGON_FORCE_DELETE_WHEN_EMPTY_ADDRESSES)) // use future configured precompiled contracts @@ -848,21 +707,13 @@ public abstract class MainnetProtocolSpecs { static ProtocolSpecBuilder experimentalEipsDefinition( final Optional chainId, - final OptionalInt configContractSizeLimit, - final OptionalInt configStackSizeLimit, final boolean enableRevertReason, final GenesisConfigOptions genesisConfigOptions, final EvmConfiguration evmConfiguration, final MiningParameters miningParameters) { return futureEipsDefinition( - chainId, - configContractSizeLimit, - configStackSizeLimit, - enableRevertReason, - genesisConfigOptions, - evmConfiguration, - miningParameters) + chainId, enableRevertReason, genesisConfigOptions, evmConfiguration, miningParameters) .evmBuilder( (gasCalculator, jdCacheConfig) -> MainnetEVMs.experimentalEips( @@ -929,13 +780,7 @@ public abstract class MainnetProtocolSpecs { transactionProcessingResult.getRevertReason()); } - private static class DaoBlockProcessor implements BlockProcessor { - - private final BlockProcessor wrapped; - - public DaoBlockProcessor(final BlockProcessor wrapped) { - this.wrapped = wrapped; - } + private record DaoBlockProcessor(BlockProcessor wrapped) implements BlockProcessor { @Override public BlockProcessingResult processBlock( @@ -965,7 +810,8 @@ public abstract class MainnetProtocolSpecs { final JsonArray json = new JsonArray( Resources.toString( - this.getClass().getResource("/daoAddresses.json"), StandardCharsets.UTF_8)); + Objects.requireNonNull(this.getClass().getResource("/daoAddresses.json")), + StandardCharsets.UTF_8)); final List
addresses = IntStream.range(0, json.size()) .mapToObj(json::getString) diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/ProtocolScheduleBuilder.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/ProtocolScheduleBuilder.java index 78198922e..100a4425c 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/ProtocolScheduleBuilder.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/ProtocolScheduleBuilder.java @@ -24,6 +24,7 @@ import org.hyperledger.besu.evm.internal.EvmConfiguration; import java.math.BigInteger; import java.util.NavigableMap; import java.util.Optional; +import java.util.OptionalInt; import java.util.OptionalLong; import java.util.TreeMap; import java.util.function.Function; @@ -45,8 +46,6 @@ public class ProtocolScheduleBuilder { private final MiningParameters miningParameters; private final BadBlockManager badBlockManager; - private DefaultProtocolSchedule protocolSchedule; - public ProtocolScheduleBuilder( final GenesisConfigOptions config, final BigInteger defaultChainId, @@ -107,7 +106,7 @@ public class ProtocolScheduleBuilder { public ProtocolSchedule createProtocolSchedule() { final Optional chainId = config.getChainId().or(() -> defaultChainId); - protocolSchedule = new DefaultProtocolSchedule(chainId); + DefaultProtocolSchedule protocolSchedule = new DefaultProtocolSchedule(chainId); initSchedule(protocolSchedule, chainId); return protocolSchedule; } @@ -118,18 +117,18 @@ public class ProtocolScheduleBuilder { final MainnetProtocolSpecFactory specFactory = new MainnetProtocolSpecFactory( chainId, - config.getContractSizeLimit(), - config.getEvmStackSize(), isRevertReasonEnabled, config.getEcip1017EraRounds(), - evmConfiguration, + evmConfiguration.overrides( + config.getContractSizeLimit(), OptionalInt.empty(), config.getEvmStackSize()), miningParameters); validateForkOrdering(); final NavigableMap builders = buildMilestoneMap(specFactory); - // At this stage, all milestones are flagged with correct modifier, but ProtocolSpecs must be + // At this stage, all milestones are flagged with the correct modifier, but ProtocolSpecs must + // be // inserted _AT_ the modifier block entry. if (!builders.isEmpty()) { protocolSpecAdapters.stream() @@ -143,10 +142,7 @@ public class ProtocolScheduleBuilder { builders.put( modifierBlock, new BuilderMapEntry( - parent.milestoneType, - modifierBlock, - parent.getBuilder(), - entry.getValue())); + parent.milestoneType, modifierBlock, parent.builder(), entry.getValue())); }); } @@ -158,8 +154,8 @@ public class ProtocolScheduleBuilder { addProtocolSpec( protocolSchedule, e.milestoneType, - e.getBlockIdentifier(), - e.getBuilder(), + e.blockIdentifier(), + e.builder(), e.modifier)); // NOTE: It is assumed that Daofork blocks will not be used for private networks @@ -173,8 +169,8 @@ public class ProtocolScheduleBuilder { final ProtocolSpec originalProtocolSpec = getProtocolSpec( protocolSchedule, - previousSpecBuilder.getBuilder(), - previousSpecBuilder.getModifier()); + previousSpecBuilder.builder(), + previousSpecBuilder.modifier()); addProtocolSpec( protocolSchedule, BuilderMapEntry.MilestoneType.BLOCK_NUMBER, @@ -201,14 +197,13 @@ public class ProtocolScheduleBuilder { final ProtocolSpec originalProtocolSpec = getProtocolSpec( protocolSchedule, - previousSpecBuilder.getBuilder(), - previousSpecBuilder.getModifier()); + previousSpecBuilder.builder(), + previousSpecBuilder.modifier()); addProtocolSpec( protocolSchedule, BuilderMapEntry.MilestoneType.BLOCK_NUMBER, classicBlockNumber, - ClassicProtocolSpecs.classicRecoveryInitDefinition( - config.getContractSizeLimit(), config.getEvmStackSize(), evmConfiguration), + ClassicProtocolSpecs.classicRecoveryInitDefinition(evmConfiguration), Function.identity()); protocolSchedule.putBlockNumberMilestone( classicBlockNumber + 1, originalProtocolSpec); @@ -298,7 +293,7 @@ public class ProtocolScheduleBuilder { .flatMap(Optional::stream) .collect( Collectors.toMap( - BuilderMapEntry::getBlockIdentifier, + BuilderMapEntry::blockIdentifier, b -> b, (existing, replacement) -> replacement, TreeMap::new)); @@ -413,34 +408,11 @@ public class ProtocolScheduleBuilder { } } - private static class BuilderMapEntry { - private final MilestoneType milestoneType; - private final long blockIdentifier; - private final ProtocolSpecBuilder builder; - private final Function modifier; - - public BuilderMapEntry( - final MilestoneType milestoneType, - final long blockIdentifier, - final ProtocolSpecBuilder builder, - final Function modifier) { - this.milestoneType = milestoneType; - this.blockIdentifier = blockIdentifier; - this.builder = builder; - this.modifier = modifier; - } - - public long getBlockIdentifier() { - return blockIdentifier; - } - - public ProtocolSpecBuilder getBuilder() { - return builder; - } - - public Function getModifier() { - return modifier; - } + private record BuilderMapEntry( + ProtocolScheduleBuilder.BuilderMapEntry.MilestoneType milestoneType, + long blockIdentifier, + ProtocolSpecBuilder builder, + Function modifier) { private enum MilestoneType { BLOCK_NUMBER, diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/ProtocolSpecBuilder.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/ProtocolSpecBuilder.java index f79c6a874..cd886b6c8 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/ProtocolSpecBuilder.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/ProtocolSpecBuilder.java @@ -60,7 +60,7 @@ public class ProtocolSpecBuilder { private Function blockHeaderValidatorBuilder; private Function ommerHeaderValidatorBuilder; private Function blockBodyValidatorBuilder; - private BiFunction contractCreationProcessorBuilder; + private Function contractCreationProcessorBuilder; private Function precompileContractRegistryBuilder; private BiFunction @@ -155,8 +155,7 @@ public class ProtocolSpecBuilder { } public ProtocolSpecBuilder contractCreationProcessorBuilder( - final BiFunction - contractCreationProcessorBuilder) { + final Function contractCreationProcessorBuilder) { this.contractCreationProcessorBuilder = contractCreationProcessorBuilder; return this; } @@ -165,7 +164,7 @@ public class ProtocolSpecBuilder { final Function precompileContractRegistryBuilder) { this.precompileContractRegistryBuilder = - (precompiledContractConfiguration) -> { + precompiledContractConfiguration -> { final PrecompileContractRegistry registry = precompileContractRegistryBuilder.apply(precompiledContractConfiguration); if (precompiledContractConfiguration.getPrivacyParameters().isEnabled()) { @@ -327,9 +326,9 @@ public class ProtocolSpecBuilder { final PrecompiledContractConfiguration precompiledContractConfiguration = new PrecompiledContractConfiguration(gasCalculator, privacyParameters); final TransactionValidatorFactory transactionValidatorFactory = - transactionValidatorFactoryBuilder.apply(gasCalculator, gasLimitCalculator, feeMarket); + transactionValidatorFactoryBuilder.apply(evm, gasLimitCalculator, feeMarket); final AbstractMessageProcessor contractCreationProcessor = - contractCreationProcessorBuilder.apply(gasCalculator, evm); + contractCreationProcessorBuilder.apply(evm); final PrecompileContractRegistry precompileContractRegistry = precompileContractRegistryBuilder.apply(precompiledContractConfiguration); final AbstractMessageProcessor messageCallProcessor = @@ -507,6 +506,6 @@ public class ProtocolSpecBuilder { public interface TransactionValidatorFactoryBuilder { TransactionValidatorFactory apply( - GasCalculator gasCalculator, GasLimitCalculator gasLimitCalculator, FeeMarket feeMarket); + EVM evm, GasLimitCalculator gasLimitCalculator, FeeMarket feeMarket); } } diff --git a/ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/BenchmarkSubCommand.java b/ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/BenchmarkSubCommand.java index d190e55b0..05d90a7b3 100644 --- a/ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/BenchmarkSubCommand.java +++ b/ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/BenchmarkSubCommand.java @@ -18,7 +18,6 @@ import static org.hyperledger.besu.evmtool.BenchmarkSubCommand.COMMAND_NAME; import static picocli.CommandLine.ScopeType.INHERIT; import org.hyperledger.besu.BesuInfo; -import org.hyperledger.besu.evm.EvmSpecVersion; import org.hyperledger.besu.evmtool.benchmarks.AltBN128Benchmark; import org.hyperledger.besu.evmtool.benchmarks.BenchmarkExecutor; import org.hyperledger.besu.evmtool.benchmarks.ECRecoverBenchmark; @@ -64,12 +63,6 @@ public class BenchmarkSubCommand implements Runnable { negatable = true) Boolean nativeCode; - @Option( - names = {"--fork"}, - paramLabel = "", - description = "Fork to evaluate, when it impacts gas costing.") - String fork = EvmSpecVersion.defaultVersion().getName(); - @Parameters(description = "One or more of ${COMPLETION-CANDIDATES}.") EnumSet benchmarks = EnumSet.noneOf(Benchmark.class); @@ -91,7 +84,7 @@ public class BenchmarkSubCommand implements Runnable { var benchmarksToRun = benchmarks.isEmpty() ? EnumSet.allOf(Benchmark.class) : benchmarks; for (var benchmark : benchmarksToRun) { System.out.println("Benchmarks for " + benchmark); - benchmark.benchmarkExecutor.runBenchmark(output, nativeCode, fork); + benchmark.benchmarkExecutor.runBenchmark(output, nativeCode, parentCommand.getFork()); } } } diff --git a/ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/CodeValidateSubCommand.java b/ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/CodeValidateSubCommand.java index beb51cd4a..10e167f40 100644 --- a/ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/CodeValidateSubCommand.java +++ b/ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/CodeValidateSubCommand.java @@ -17,9 +17,12 @@ package org.hyperledger.besu.evmtool; import static java.nio.charset.StandardCharsets.UTF_8; import static org.hyperledger.besu.evmtool.CodeValidateSubCommand.COMMAND_NAME; +import org.hyperledger.besu.ethereum.mainnet.ProtocolSpec; +import org.hyperledger.besu.ethereum.referencetests.ReferenceTestProtocolSchedules; import org.hyperledger.besu.evm.Code; -import org.hyperledger.besu.evm.code.CodeFactory; -import org.hyperledger.besu.evm.code.CodeV1Validation; +import org.hyperledger.besu.evm.EVM; +import org.hyperledger.besu.evm.EvmSpecVersion; +import org.hyperledger.besu.evm.code.CodeInvalid; import org.hyperledger.besu.evm.code.EOFLayout; import org.hyperledger.besu.util.LogConfigurator; @@ -27,9 +30,7 @@ import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.io.IOException; -import java.io.InputStream; import java.io.InputStreamReader; -import java.io.PrintStream; import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; @@ -37,7 +38,9 @@ import java.util.stream.IntStream; import org.apache.tuweni.bytes.Bytes; import picocli.CommandLine; +import picocli.CommandLine.ParentCommand; +@SuppressWarnings({"ConstantValue", "DataFlowIssue"}) @CommandLine.Command( name = COMMAND_NAME, description = "Validates EVM code for fuzzing", @@ -45,8 +48,10 @@ import picocli.CommandLine; versionProvider = VersionProvider.class) public class CodeValidateSubCommand implements Runnable { public static final String COMMAND_NAME = "code-validate"; - private final InputStream input; - private final PrintStream output; + + @ParentCommand EvmToolCommand parentCommand; + + private final EVM evm; @CommandLine.Option( names = {"--file"}, @@ -60,41 +65,46 @@ public class CodeValidateSubCommand implements Runnable { @SuppressWarnings("unused") public CodeValidateSubCommand() { // PicoCLI requires this - this(System.in, System.out); + this(null); } - CodeValidateSubCommand(final InputStream input, final PrintStream output) { - this.input = input; - this.output = output; + CodeValidateSubCommand(final EvmToolCommand parentCommand) { + this.parentCommand = parentCommand; + String fork = EvmSpecVersion.PRAGUE.getName(); + if (parentCommand != null && parentCommand.hasFork()) { + fork = parentCommand.getFork(); + } + ProtocolSpec protocolSpec = ReferenceTestProtocolSchedules.create().geSpecByName(fork); + evm = protocolSpec.getEvm(); } @Override public void run() { LogConfigurator.setLevel("", "OFF"); if (cliCode.isEmpty() && codeFile == null) { - try (BufferedReader in = new BufferedReader(new InputStreamReader(input, UTF_8))) { + try (BufferedReader in = new BufferedReader(new InputStreamReader(parentCommand.in, UTF_8))) { + checkCodeFromBufferedReader(in); + } catch (IOException e) { + throw new RuntimeException(e); + } + } else if (codeFile != null) { + try (BufferedReader in = new BufferedReader(new FileReader(codeFile, UTF_8))) { checkCodeFromBufferedReader(in); } catch (IOException e) { throw new RuntimeException(e); } } else { - if (codeFile != null) { - try (BufferedReader in = new BufferedReader(new FileReader(codeFile, UTF_8))) { - checkCodeFromBufferedReader(in); - } catch (IOException e) { - throw new RuntimeException(e); - } - } for (String code : cliCode) { - output.print(considerCode(code)); + parentCommand.out.print(considerCode(code)); } } + parentCommand.out.flush(); } private void checkCodeFromBufferedReader(final BufferedReader in) { try { for (String code = in.readLine(); code != null; code = in.readLine()) { - output.print(considerCode(code)); + parentCommand.out.print(considerCode(code)); } } catch (IOException e) { throw new RuntimeException(e); @@ -114,24 +124,22 @@ public class CodeValidateSubCommand implements Runnable { return ""; } - EOFLayout layout = EOFLayout.parseEOF(codeBytes); + EOFLayout layout = evm.parseEOF(codeBytes); if (!layout.isValid()) { return "err: layout - " + layout.invalidReason() + "\n"; } - String error = CodeV1Validation.validate(layout); - if (error != null) { - return "err: " + error + "\n"; + Code code = evm.getCodeUncached(codeBytes); + if (code instanceof CodeInvalid codeInvalid) { + return "err: " + codeInvalid.getInvalidReason(); + } else { + return "OK " + + IntStream.range(0, code.getCodeSectionCount()) + .mapToObj(code::getCodeSection) + .map(cs -> code.getBytes().slice(cs.getEntryPoint(), cs.getLength())) + .map(Bytes::toUnprefixedHexString) + .collect(Collectors.joining(",")) + + "\n"; } - - Code code = CodeFactory.createCode(codeBytes, 1); - - return "OK " - + IntStream.range(0, code.getCodeSectionCount()) - .mapToObj(code::getCodeSection) - .map(cs -> layout.container().slice(cs.getEntryPoint(), cs.getLength())) - .map(Bytes::toUnprefixedHexString) - .collect(Collectors.joining(",")) - + "\n"; } } diff --git a/ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/EOFTestSubCommand.java b/ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/EOFTestSubCommand.java index cb2fbbfeb..ab53b41e1 100644 --- a/ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/EOFTestSubCommand.java +++ b/ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/EOFTestSubCommand.java @@ -20,13 +20,13 @@ import static org.hyperledger.besu.ethereum.referencetests.EOFTestCaseSpec.TestR import static org.hyperledger.besu.evmtool.EOFTestSubCommand.COMMAND_NAME; import org.hyperledger.besu.crypto.SignatureAlgorithmFactory; +import org.hyperledger.besu.ethereum.mainnet.ProtocolSpec; import org.hyperledger.besu.ethereum.referencetests.EOFTestCaseSpec; import org.hyperledger.besu.ethereum.referencetests.EOFTestCaseSpec.TestResult; +import org.hyperledger.besu.ethereum.referencetests.ReferenceTestProtocolSchedules; +import org.hyperledger.besu.evm.EVM; import org.hyperledger.besu.evm.EvmSpecVersion; -import org.hyperledger.besu.evm.code.CodeFactory; import org.hyperledger.besu.evm.code.CodeInvalid; -import org.hyperledger.besu.evm.code.CodeV1; -import org.hyperledger.besu.evm.code.CodeV1Validation; import org.hyperledger.besu.evm.code.EOFLayout; import org.hyperledger.besu.util.LogConfigurator; @@ -57,16 +57,14 @@ public class EOFTestSubCommand implements Runnable { // picocli does it magically @CommandLine.Parameters private final List eofTestFiles = new ArrayList<>(); - @CommandLine.Option( - names = {"--fork-name"}, - description = "Limit execution to one fork.") - private String forkName = null; - @CommandLine.Option( names = {"--test-name"}, description = "Limit execution to one test.") private String testVectorName = null; + EVM evm; + String fork = null; + public EOFTestSubCommand() { this(null); } @@ -82,6 +80,14 @@ public class EOFTestSubCommand implements Runnable { SignatureAlgorithmFactory.setDefaultInstance(); final ObjectMapper eofTestMapper = JsonUtils.createObjectMapper(); + if (parentCommand.hasFork()) { + fork = parentCommand.getFork(); + } + ProtocolSpec protocolSpec = + ReferenceTestProtocolSchedules.create() + .geSpecByName(fork == null ? EvmSpecVersion.PRAGUE.getName() : fork); + evm = protocolSpec.getEvm(); + final JavaType javaType = eofTestMapper .getTypeFactory() @@ -146,7 +152,8 @@ public class EOFTestSubCommand implements Runnable { String code = testVector.getValue().code(); for (var testResult : testVector.getValue().results().entrySet()) { String expectedForkName = testResult.getKey(); - if (forkName != null && !forkName.equals(expectedForkName)) { + if (fork != null && !fork.equals(expectedForkName)) { + System.out.println("Wrong fork - " + fork + " != " + expectedForkName); continue; } TestResult expectedResult = testResult.getValue(); @@ -210,16 +217,10 @@ public class EOFTestSubCommand implements Runnable { return failed("layout - " + layout.invalidReason()); } - var code = CodeFactory.createCode(codeBytes, 1); + var code = evm.getCodeUncached(codeBytes); if (!code.isValid()) { return failed("validate " + ((CodeInvalid) code).getInvalidReason()); } - if (code instanceof CodeV1 codeV1) { - var result = CodeV1Validation.validate(codeV1.getEofLayout()); - if (result != null) { - return (failed("deep validate error: " + result)); - } - } return passed(); } diff --git a/ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/EvmToolCommand.java b/ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/EvmToolCommand.java index b6e093aa2..90afdcdeb 100644 --- a/ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/EvmToolCommand.java +++ b/ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/EvmToolCommand.java @@ -322,6 +322,14 @@ public class EvmToolCommand implements Runnable { subCommandLine.setHelpSectionKeys(keys); } + public String getFork() { + return daggerOptions.provideFork().orElse(EvmSpecVersion.defaultVersion().getName()); + } + + public boolean hasFork() { + return daggerOptions.provideFork().isPresent(); + } + @Override public void run() { LogConfigurator.setLevel("", "OFF"); @@ -340,8 +348,7 @@ public class EvmToolCommand implements Runnable { .build(); int remainingIters = this.repeat; - final ProtocolSpec protocolSpec = - component.getProtocolSpec().apply(BlockHeaderBuilder.createDefault().buildBlockHeader()); + final ProtocolSpec protocolSpec = component.getProtocolSpec(); final Transaction tx = new Transaction.Builder() .nonce(0) diff --git a/ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/EvmToolComponent.java b/ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/EvmToolComponent.java index 95a648fe1..176700ee8 100644 --- a/ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/EvmToolComponent.java +++ b/ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/EvmToolComponent.java @@ -15,14 +15,13 @@ package org.hyperledger.besu.evmtool; import org.hyperledger.besu.ethereum.chain.Blockchain; -import org.hyperledger.besu.ethereum.core.BlockHeader; import org.hyperledger.besu.ethereum.core.MutableWorldState; import org.hyperledger.besu.ethereum.mainnet.ProtocolSpec; +import org.hyperledger.besu.evm.EVM; import org.hyperledger.besu.evm.worldstate.WorldUpdater; import org.hyperledger.besu.metrics.MetricsConfigurationModule; import org.hyperledger.besu.metrics.MetricsSystemModule; -import java.util.function.Function; import javax.inject.Singleton; import dagger.Component; @@ -40,7 +39,9 @@ import dagger.Component; }) public interface EvmToolComponent { - Function getProtocolSpec(); + ProtocolSpec getProtocolSpec(); + + EVM getEVM(); WorldUpdater getWorldUpdater(); diff --git a/ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/MainnetGenesisFileModule.java b/ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/MainnetGenesisFileModule.java index 761c81811..dc6b6dce0 100644 --- a/ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/MainnetGenesisFileModule.java +++ b/ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/MainnetGenesisFileModule.java @@ -27,9 +27,11 @@ import org.hyperledger.besu.ethereum.mainnet.MainnetProtocolSchedule; import org.hyperledger.besu.ethereum.mainnet.ProtocolSchedule; import org.hyperledger.besu.ethereum.mainnet.ProtocolScheduleBuilder; import org.hyperledger.besu.ethereum.mainnet.ProtocolSpecAdapters; +import org.hyperledger.besu.evm.EvmSpecVersion; import org.hyperledger.besu.evm.internal.EvmConfiguration; import java.math.BigInteger; +import java.util.Locale; import java.util.Map; import java.util.Optional; import java.util.function.Function; @@ -68,13 +70,15 @@ class MainnetGenesisFileModule extends GenesisFileModule { } } - if (fork.isPresent()) { - var schedules = createSchedules(); - var schedule = schedules.get(fork.map(String::toLowerCase).get()); - if (schedule != null) { - return schedule.get(); - } + var schedules = createSchedules(); + var schedule = + schedules.get( + fork.orElse(EvmSpecVersion.defaultVersion().getName()) + .toLowerCase(Locale.getDefault())); + if (schedule != null) { + return schedule.get(); } + return MainnetProtocolSchedule.fromConfig( configOptions, evmConfiguration, MiningParameters.newDefault(), new BadBlockManager()); } diff --git a/ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/PrettyPrintSubCommand.java b/ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/PrettyPrintSubCommand.java index 4e03f1aa6..10d31960a 100644 --- a/ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/PrettyPrintSubCommand.java +++ b/ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/PrettyPrintSubCommand.java @@ -16,7 +16,11 @@ package org.hyperledger.besu.evmtool; import static org.hyperledger.besu.evmtool.PrettyPrintSubCommand.COMMAND_NAME; -import org.hyperledger.besu.evm.code.CodeV1Validation; +import org.hyperledger.besu.ethereum.mainnet.ProtocolSpec; +import org.hyperledger.besu.ethereum.referencetests.ReferenceTestProtocolSchedules; +import org.hyperledger.besu.evm.EVM; +import org.hyperledger.besu.evm.EvmSpecVersion; +import org.hyperledger.besu.evm.code.CodeInvalid; import org.hyperledger.besu.evm.code.EOFLayout; import org.hyperledger.besu.util.LogConfigurator; @@ -63,14 +67,20 @@ public class PrettyPrintSubCommand implements Runnable { "Pretty printing of legacy EVM is not supported. Patches welcome!"); } else { - EOFLayout layout = EOFLayout.parseEOF(container); + String fork = EvmSpecVersion.PRAGUE.getName(); + if (parentCommand.hasFork()) { + fork = parentCommand.getFork(); + } + ProtocolSpec protocolSpec = ReferenceTestProtocolSchedules.create().geSpecByName(fork); + EVM evm = protocolSpec.getEvm(); + EOFLayout layout = evm.parseEOF(container); if (layout.isValid()) { - String validation = CodeV1Validation.validate(layout); - if (validation == null || force) { + var validatedCode = evm.getCodeUncached(container); + if (validatedCode.isValid() || force) { layout.prettyPrint(parentCommand.out); } - if (validation != null) { - parentCommand.out.println("EOF code is invalid - " + validation); + if (validatedCode instanceof CodeInvalid codeInvalid) { + parentCommand.out.println("EOF code is invalid - " + codeInvalid.getInvalidReason()); } } else { parentCommand.out.println("EOF layout is invalid - " + layout.invalidReason()); diff --git a/ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/ProtocolModule.java b/ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/ProtocolModule.java index 13ec7d877..1b8f557b3 100644 --- a/ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/ProtocolModule.java +++ b/ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/ProtocolModule.java @@ -14,11 +14,11 @@ */ package org.hyperledger.besu.evmtool; -import org.hyperledger.besu.ethereum.core.BlockHeader; +import org.hyperledger.besu.ethereum.core.BlockHeaderBuilder; import org.hyperledger.besu.ethereum.mainnet.ProtocolSchedule; import org.hyperledger.besu.ethereum.mainnet.ProtocolSpec; +import org.hyperledger.besu.evm.EVM; -import java.util.function.Function; import javax.inject.Singleton; import dagger.Module; @@ -30,7 +30,17 @@ public class ProtocolModule { @Provides @Singleton - Function getProtocolSpec(final ProtocolSchedule protocolSchedule) { - return protocolSchedule::getByBlockHeader; + ProtocolSpec getProtocolSpec(final ProtocolSchedule protocolSchedule) { + return protocolSchedule.getByBlockHeader( + BlockHeaderBuilder.createDefault() + .timestamp(Long.MAX_VALUE) + .number(Long.MAX_VALUE) + .buildBlockHeader()); + } + + @Provides + @Singleton + EVM getEVM(final ProtocolSpec protocolSpec) { + return protocolSpec.getEvm(); } } diff --git a/ethereum/evmtool/src/test/java/org/hyperledger/besu/evmtool/CodeValidationSubCommandTest.java b/ethereum/evmtool/src/test/java/org/hyperledger/besu/evmtool/CodeValidationSubCommandTest.java index 87af915f6..dd7133f86 100644 --- a/ethereum/evmtool/src/test/java/org/hyperledger/besu/evmtool/CodeValidationSubCommandTest.java +++ b/ethereum/evmtool/src/test/java/org/hyperledger/besu/evmtool/CodeValidationSubCommandTest.java @@ -19,7 +19,7 @@ import static org.assertj.core.api.Assertions.assertThat; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; -import java.io.PrintStream; +import java.io.PrintWriter; import org.junit.jupiter.api.Test; import picocli.CommandLine; @@ -44,8 +44,8 @@ class CodeValidationSubCommandTest { void testSingleValidViaInput() { final ByteArrayOutputStream baos = new ByteArrayOutputStream(); final ByteArrayInputStream bais = new ByteArrayInputStream(CODE_STOP_ONLY.getBytes(UTF_8)); - final CodeValidateSubCommand codeValidateSubCommand = - new CodeValidateSubCommand(bais, new PrintStream(baos)); + EvmToolCommand parentCommand = new EvmToolCommand(bais, new PrintWriter(baos, true, UTF_8)); + final CodeValidateSubCommand codeValidateSubCommand = new CodeValidateSubCommand(parentCommand); codeValidateSubCommand.run(); assertThat(baos.toString(UTF_8)).contains("OK 00\n"); } @@ -54,8 +54,8 @@ class CodeValidationSubCommandTest { void testSingleInvalidViaInput() { final ByteArrayOutputStream baos = new ByteArrayOutputStream(); final ByteArrayInputStream bais = new ByteArrayInputStream(CODE_BAD_MAGIC.getBytes(UTF_8)); - final CodeValidateSubCommand codeValidateSubCommand = - new CodeValidateSubCommand(bais, new PrintStream(baos)); + EvmToolCommand parentCommand = new EvmToolCommand(bais, new PrintWriter(baos, true, UTF_8)); + final CodeValidateSubCommand codeValidateSubCommand = new CodeValidateSubCommand(parentCommand); codeValidateSubCommand.run(); assertThat(baos.toString(UTF_8)).contains("err: layout - EOF header byte 1 incorrect\n"); } @@ -64,8 +64,8 @@ class CodeValidationSubCommandTest { void testMultipleViaInput() { final ByteArrayOutputStream baos = new ByteArrayOutputStream(); final ByteArrayInputStream bais = new ByteArrayInputStream(CODE_MULTIPLE.getBytes(UTF_8)); - final CodeValidateSubCommand codeValidateSubCommand = - new CodeValidateSubCommand(bais, new PrintStream(baos)); + EvmToolCommand parentCommand = new EvmToolCommand(bais, new PrintWriter(baos, true, UTF_8)); + final CodeValidateSubCommand codeValidateSubCommand = new CodeValidateSubCommand(parentCommand); codeValidateSubCommand.run(); assertThat(baos.toString(UTF_8)) .contains( @@ -80,8 +80,8 @@ class CodeValidationSubCommandTest { void testSingleValidViaCli() { final ByteArrayOutputStream baos = new ByteArrayOutputStream(); final ByteArrayInputStream bais = new ByteArrayInputStream(new byte[0]); - final CodeValidateSubCommand codeValidateSubCommand = - new CodeValidateSubCommand(bais, new PrintStream(baos)); + EvmToolCommand parentCommand = new EvmToolCommand(bais, new PrintWriter(baos, true, UTF_8)); + final CodeValidateSubCommand codeValidateSubCommand = new CodeValidateSubCommand(parentCommand); final CommandLine cmd = new CommandLine(codeValidateSubCommand); cmd.parseArgs(CODE_STOP_ONLY); codeValidateSubCommand.run(); @@ -92,8 +92,8 @@ class CodeValidationSubCommandTest { void testSingleInvalidViaCli() { final ByteArrayOutputStream baos = new ByteArrayOutputStream(); final ByteArrayInputStream bais = new ByteArrayInputStream(new byte[0]); - final CodeValidateSubCommand codeValidateSubCommand = - new CodeValidateSubCommand(bais, new PrintStream(baos)); + EvmToolCommand parentCommand = new EvmToolCommand(bais, new PrintWriter(baos, true, UTF_8)); + final CodeValidateSubCommand codeValidateSubCommand = new CodeValidateSubCommand(parentCommand); final CommandLine cmd = new CommandLine(codeValidateSubCommand); cmd.parseArgs(CODE_BAD_MAGIC); codeValidateSubCommand.run(); @@ -104,8 +104,8 @@ class CodeValidationSubCommandTest { void testMultipleViaCli() { final ByteArrayOutputStream baos = new ByteArrayOutputStream(); final ByteArrayInputStream bais = new ByteArrayInputStream(new byte[0]); - final CodeValidateSubCommand codeValidateSubCommand = - new CodeValidateSubCommand(bais, new PrintStream(baos)); + EvmToolCommand parentCommand = new EvmToolCommand(bais, new PrintWriter(baos, true, UTF_8)); + final CodeValidateSubCommand codeValidateSubCommand = new CodeValidateSubCommand(parentCommand); final CommandLine cmd = new CommandLine(codeValidateSubCommand); cmd.parseArgs(CODE_STOP_ONLY, CODE_BAD_MAGIC, CODE_RETURN_ONLY); codeValidateSubCommand.run(); @@ -122,8 +122,8 @@ class CodeValidationSubCommandTest { void testCliEclipsesInput() { final ByteArrayOutputStream baos = new ByteArrayOutputStream(); final ByteArrayInputStream bais = new ByteArrayInputStream(CODE_STOP_ONLY.getBytes(UTF_8)); - final CodeValidateSubCommand codeValidateSubCommand = - new CodeValidateSubCommand(bais, new PrintStream(baos)); + EvmToolCommand parentCommand = new EvmToolCommand(bais, new PrintWriter(baos, true, UTF_8)); + final CodeValidateSubCommand codeValidateSubCommand = new CodeValidateSubCommand(parentCommand); final CommandLine cmd = new CommandLine(codeValidateSubCommand); cmd.parseArgs(CODE_RETURN_ONLY); codeValidateSubCommand.run(); @@ -134,8 +134,8 @@ class CodeValidationSubCommandTest { void testInteriorCommentsSkipped() { final ByteArrayOutputStream baos = new ByteArrayOutputStream(); final ByteArrayInputStream bais = new ByteArrayInputStream(new byte[0]); - final CodeValidateSubCommand codeValidateSubCommand = - new CodeValidateSubCommand(bais, new PrintStream(baos)); + EvmToolCommand parentCommand = new EvmToolCommand(bais, new PrintWriter(baos, true, UTF_8)); + final CodeValidateSubCommand codeValidateSubCommand = new CodeValidateSubCommand(parentCommand); final CommandLine cmd = new CommandLine(codeValidateSubCommand); cmd.parseArgs(CODE_INTERIOR_COMMENTS); codeValidateSubCommand.run(); @@ -147,8 +147,8 @@ class CodeValidationSubCommandTest { final ByteArrayOutputStream baos = new ByteArrayOutputStream(); final ByteArrayInputStream bais = new ByteArrayInputStream(("# comment\n\n#blank line\n\n" + CODE_MULTIPLE).getBytes(UTF_8)); - final CodeValidateSubCommand codeValidateSubCommand = - new CodeValidateSubCommand(bais, new PrintStream(baos)); + EvmToolCommand parentCommand = new EvmToolCommand(bais, new PrintWriter(baos, true, UTF_8)); + final CodeValidateSubCommand codeValidateSubCommand = new CodeValidateSubCommand(parentCommand); codeValidateSubCommand.run(); assertThat(baos.toString(UTF_8)) .isEqualTo( diff --git a/ethereum/referencetests/src/main/java/org/hyperledger/besu/ethereum/referencetests/ReferenceTestProtocolSchedules.java b/ethereum/referencetests/src/main/java/org/hyperledger/besu/ethereum/referencetests/ReferenceTestProtocolSchedules.java index 2ebf5f799..0976b9242 100644 --- a/ethereum/referencetests/src/main/java/org/hyperledger/besu/ethereum/referencetests/ReferenceTestProtocolSchedules.java +++ b/ethereum/referencetests/src/main/java/org/hyperledger/besu/ethereum/referencetests/ReferenceTestProtocolSchedules.java @@ -17,10 +17,13 @@ package org.hyperledger.besu.ethereum.referencetests; import org.hyperledger.besu.config.GenesisConfigOptions; import org.hyperledger.besu.config.StubGenesisConfigOptions; import org.hyperledger.besu.ethereum.chain.BadBlockManager; +import org.hyperledger.besu.ethereum.core.BlockHeader; +import org.hyperledger.besu.ethereum.core.BlockHeaderTestFixture; import org.hyperledger.besu.ethereum.core.MiningParameters; import org.hyperledger.besu.ethereum.core.PrivacyParameters; import org.hyperledger.besu.ethereum.mainnet.ProtocolSchedule; import org.hyperledger.besu.ethereum.mainnet.ProtocolScheduleBuilder; +import org.hyperledger.besu.ethereum.mainnet.ProtocolSpec; import org.hyperledger.besu.ethereum.mainnet.ProtocolSpecAdapters; import org.hyperledger.besu.evm.internal.EvmConfiguration; import org.hyperledger.besu.evm.precompile.KZGPointEvalPrecompiledContract; @@ -102,6 +105,16 @@ public class ReferenceTestProtocolSchedules { return schedules.get(name); } + public ProtocolSpec geSpecByName(final String name) { + ProtocolSchedule schedule = getByName(name); + if (schedule == null) { + return null; + } + BlockHeader header = + new BlockHeaderTestFixture().timestamp(Long.MAX_VALUE).number(Long.MAX_VALUE).buildHeader(); + return schedule.getByBlockHeader(header); + } + private static ProtocolSchedule createSchedule(final GenesisConfigOptions options) { return new ProtocolScheduleBuilder( options, diff --git a/ethereum/referencetests/src/reference-test/java/org/hyperledger/besu/ethereum/eof/EOFReferenceTestTools.java b/ethereum/referencetests/src/reference-test/java/org/hyperledger/besu/ethereum/eof/EOFReferenceTestTools.java index 22bf38390..58f8c0252 100644 --- a/ethereum/referencetests/src/reference-test/java/org/hyperledger/besu/ethereum/eof/EOFReferenceTestTools.java +++ b/ethereum/referencetests/src/reference-test/java/org/hyperledger/besu/ethereum/eof/EOFReferenceTestTools.java @@ -23,12 +23,10 @@ import java.util.List; import java.util.Map; import org.apache.tuweni.bytes.Bytes; import org.hyperledger.besu.ethereum.referencetests.EOFTestCaseSpec; +import org.hyperledger.besu.ethereum.referencetests.ReferenceTestProtocolSchedules; import org.hyperledger.besu.evm.Code; -import org.hyperledger.besu.evm.EvmSpecVersion; -import org.hyperledger.besu.evm.code.CodeFactory; +import org.hyperledger.besu.evm.EVM; import org.hyperledger.besu.evm.code.CodeInvalid; -import org.hyperledger.besu.evm.code.CodeV1; -import org.hyperledger.besu.evm.code.CodeV1Validation; import org.hyperledger.besu.evm.code.EOFLayout; import org.hyperledger.besu.testutil.JsonTestParameters; @@ -74,7 +72,7 @@ public class EOFReferenceTestTools { params.ignore("EOF1_undefined_opcodes_186"); // embedded containers rules changed - params.ignore("EOF1_embedded_container"); + params.ignore("efValidation/EOF1_embedded_container-Prague\\[EOF1_embedded_container_\\d+\\]"); // truncated data is only allowed in embedded containers params.ignore("ori/validInvalid-Prague\\[validInvalid_48\\]"); @@ -101,19 +99,20 @@ public class EOFReferenceTestTools { return params.generate(filePath); } + @SuppressWarnings("java:S5960") // This is not production code, this is testing code. public static void executeTest( final String fork, final Bytes code, final EOFTestCaseSpec.TestResult expected) { - EvmSpecVersion evmVersion = EvmSpecVersion.fromName(fork); - assertThat(evmVersion).isNotNull(); + EVM evm = ReferenceTestProtocolSchedules.create().geSpecByName(fork).getEvm(); + assertThat(evm).isNotNull(); // hardwire in the magic byte transaction checks - if (evmVersion.getMaxEofVersion() < 1) { + if (evm.getMaxEOFVersion() < 1) { assertThat(expected.exception()).isEqualTo("EOF_InvalidCode"); } else { EOFLayout layout = EOFLayout.parseEOF(code); if (layout.isValid()) { - Code parsedCode = CodeFactory.createCode(code, evmVersion.getMaxEofVersion()); + Code parsedCode = evm.getCodeUncached(code); assertThat(parsedCode.isValid()) .withFailMessage( () -> @@ -125,22 +124,8 @@ public class EOFReferenceTestTools { ? null : ((CodeInvalid) parsedCode).getInvalidReason())) .isEqualTo(expected.result()); - if (parsedCode instanceof CodeV1 codeV1) { - var deepValidate = CodeV1Validation.validate(codeV1.getEofLayout()); - assertThat(deepValidate) - .withFailMessage( - () -> - codeV1.prettyPrint() - + "\nExpected exception :" - + expected.exception() - + " actual exception :" - + (parsedCode.isValid() ? null : deepValidate)) - .isNull(); - } if (expected.result()) { - System.out.println(code); - System.out.println(layout.writeContainer(null)); assertThat(code) .withFailMessage("Container round trip failed") .isEqualTo(layout.writeContainer(null)); diff --git a/evm/src/main/java/org/hyperledger/besu/evm/Code.java b/evm/src/main/java/org/hyperledger/besu/evm/Code.java index bcec28724..ac269d281 100644 --- a/evm/src/main/java/org/hyperledger/besu/evm/Code.java +++ b/evm/src/main/java/org/hyperledger/besu/evm/Code.java @@ -39,6 +39,13 @@ public interface Code { */ int getDataSize(); + /** + * Declared size of the data in bytes. For containers with aux data this may be larger. + * + * @return the declared data size + */ + int getDeclaredDataSize(); + /** * Get the bytes for the entire container, for example what EXTCODECOPY would want. For V0 it is * the same as getCodeBytes, for V1 it is the entire container, not just the data section. @@ -107,9 +114,10 @@ public interface Code { * @param index the index in the container to return * @param auxData any Auxiliary data to append to the subcontainer code. If fetching an initcode * container, pass null. + * @param evm the EVM in which we are instantiating the code * @return Either the subcontainer, or empty. */ - Optional getSubContainer(final int index, final Bytes auxData); + Optional getSubContainer(final int index, final Bytes auxData, EVM evm); /** * Loads data from the appropriate data section diff --git a/evm/src/main/java/org/hyperledger/besu/evm/EVM.java b/evm/src/main/java/org/hyperledger/besu/evm/EVM.java index 03348d9ab..f2eb7cf29 100644 --- a/evm/src/main/java/org/hyperledger/besu/evm/EVM.java +++ b/evm/src/main/java/org/hyperledger/besu/evm/EVM.java @@ -20,6 +20,7 @@ import static org.hyperledger.besu.evm.operation.SwapOperation.SWAP_BASE; import org.hyperledger.besu.datatypes.Hash; import org.hyperledger.besu.evm.code.CodeFactory; +import org.hyperledger.besu.evm.code.EOFLayout; import org.hyperledger.besu.evm.frame.ExceptionalHaltReason; import org.hyperledger.besu.evm.frame.MessageFrame; import org.hyperledger.besu.evm.frame.MessageFrame.State; @@ -87,6 +88,7 @@ public class EVM { private final OperationRegistry operations; private final GasCalculator gasCalculator; private final Operation endOfScriptStop; + private final CodeFactory codeFactory; private final CodeCache codeCache; private final EvmConfiguration evmConfiguration; private final EvmSpecVersion evmSpecVersion; @@ -114,6 +116,11 @@ public class EVM { this.codeCache = new CodeCache(evmConfiguration); this.evmSpecVersion = evmSpecVersion; + codeFactory = + new CodeFactory( + evmSpecVersion.maxEofVersion, + evmConfiguration.maxInitcodeSizeOverride().orElse(evmSpecVersion.maxInitcodeSize)); + enableShanghai = EvmSpecVersion.SHANGHAI.ordinal() <= evmSpecVersion.ordinal(); } @@ -365,7 +372,7 @@ public class EVM { * @return the code */ public Code getCodeUncached(final Bytes codeBytes) { - return CodeFactory.createCode(codeBytes, evmSpecVersion.getMaxEofVersion()); + return codeFactory.createCode(codeBytes); } /** @@ -375,6 +382,16 @@ public class EVM { * @return the code */ public Code getCodeForCreation(final Bytes codeBytes) { - return CodeFactory.createCode(codeBytes, evmSpecVersion.getMaxEofVersion(), false, true); + return codeFactory.createCode(codeBytes, true); + } + + /** + * Parse the EOF Layout of a byte-stream. No Code or stack validation is performed. + * + * @param bytes the bytes to parse + * @return an EOF layout represented by they byte-stream. + */ + public EOFLayout parseEOF(final Bytes bytes) { + return EOFLayout.parseEOF(bytes, true); } } diff --git a/evm/src/main/java/org/hyperledger/besu/evm/EvmSpecVersion.java b/evm/src/main/java/org/hyperledger/besu/evm/EvmSpecVersion.java index e543f672d..9bf370d03 100644 --- a/evm/src/main/java/org/hyperledger/besu/evm/EvmSpecVersion.java +++ b/evm/src/main/java/org/hyperledger/besu/evm/EvmSpecVersion.java @@ -23,49 +23,58 @@ import org.slf4j.LoggerFactory; /** The enum Evm spec version. */ public enum EvmSpecVersion { /** Frontier evm spec version. */ - FRONTIER(0, true, "Frontier", "Finalized"), + FRONTIER(Integer.MAX_VALUE, Integer.MAX_VALUE, 0, true, "Frontier", "Finalized"), /** Homestead evm spec version. */ - HOMESTEAD(0, true, "Homestead", "Finalized"), + HOMESTEAD(Integer.MAX_VALUE, Integer.MAX_VALUE, 0, true, "Homestead", "Finalized"), /** Tangerine Whistle evm spec version. */ - TANGERINE_WHISTLE(0, true, "Tangerine Whistle", "Finalized"), + TANGERINE_WHISTLE( + Integer.MAX_VALUE, Integer.MAX_VALUE, 0, true, "Tangerine Whistle", "Finalized"), /** Spurious Dragon evm spec version. */ - SPURIOUS_DRAGON(0, true, "Spuruous Dragon", "Finalized"), + SPURIOUS_DRAGON(0x6000, Integer.MAX_VALUE, 0, true, "Spuruous Dragon", "Finalized"), /** Byzantium evm spec version. */ - BYZANTIUM(0, true, "Byzantium", "Finalized"), + BYZANTIUM(0x6000, Integer.MAX_VALUE, 0, true, "Byzantium", "Finalized"), /** Constantinople evm spec version. */ - CONSTANTINOPLE(0, true, "Constantinople", "Did not reach Mainnet"), + CONSTANTINOPLE(0x6000, Integer.MAX_VALUE, 0, true, "Constantinople", "Did not reach Mainnet"), /** Petersburg / ConstantinopleFix evm spec version. */ - PETERSBURG(0, true, "ConstantinopleFix", "Finalized (also called Petersburg)"), + PETERSBURG( + 0x6000, + Integer.MAX_VALUE, + 0, + true, + "ConstantinopleFix", + "Finalized (also called Petersburg)"), /** Istanbul evm spec version. */ - ISTANBUL(0, true, "Istanbul", "Finalized"), + ISTANBUL(0x6000, Integer.MAX_VALUE, 0, true, "Istanbul", "Finalized"), /** Berlin evm spec version */ - BERLIN(0, true, "Berlin", "Finalized"), + BERLIN(0x6000, Integer.MAX_VALUE, 0, true, "Berlin", "Finalized"), /** London evm spec version. */ - LONDON(0, true, "London", "Finalized"), + LONDON(0x6000, Integer.MAX_VALUE, 0, true, "London", "Finalized"), /** Paris evm spec version. */ - PARIS(0, true, "Merge", "Finalized (also called Paris)"), + PARIS(0x6000, Integer.MAX_VALUE, 0, true, "Merge", "Finalized (also called Paris)"), /** Shanghai evm spec version. */ - SHANGHAI(0, true, "Shanghai", "Finalized"), + SHANGHAI(0x6000, 0xc000, 0, true, "Shanghai", "Finalized"), /** Cancun evm spec version. */ - CANCUN(0, true, "Cancun", "Finalized"), + CANCUN(0x6000, 0xc000, 0, true, "Cancun", "Finalized"), /** Prague evm spec version. */ - PRAGUE(0, false, "Prague", "In Development"), + PRAGUE(0x6000, 0xc000, 0, false, "Prague", "In Development"), /** PragueEOF evm spec version. */ - PRAGUE_EOF(1, false, "PragueEOF", "Prague + EOF. In Development"), + PRAGUE_EOF(0x6000, 0xc000, 1, false, "PragueEOF", "Prague + EOF. In Development"), /** Osaka evm spec version. */ - OSAKA(1, false, "Osaka", "Placeholder"), + OSAKA(0x6000, 0xc000, 1, false, "Osaka", "Placeholder"), /** Amstedam evm spec version. */ - AMSTERDAM(1, false, "Amsterdam", "Placeholder"), + AMSTERDAM(0x6000, 0xc000, 1, false, "Amsterdam", "Placeholder"), /** Bogota evm spec version. */ - BOGOTA(1, false, "Bogota", "Placeholder"), + BOGOTA(0x6000, 0xc000, 1, false, "Bogota", "Placeholder"), /** Polis evm spec version. */ - POLIS(1, false, "Polis", "Placeholder"), + POLIS(0x6000, 0xc000, 1, false, "Polis", "Placeholder"), /** Bogota evm spec version. */ - BANGKOK(1, false, "Bangkok", "Placeholder"), + BANGKOK(0x6000, 0xc000, 1, false, "Bangkok", "Placeholder"), /** Development fork for unscheduled EIPs */ - FUTURE_EIPS(1, false, "Future_EIPs", "Development, for accepted and unscheduled EIPs"), + FUTURE_EIPS( + 0x6000, 0xc000, 1, false, "Future_EIPs", "Development, for accepted and unscheduled EIPs"), /** Development fork for EIPs not accepted to Mainnet */ - EXPERIMENTAL_EIPS(1, false, "Experimental_EIPs", "Development, for experimental EIPs"); + EXPERIMENTAL_EIPS( + 0x6000, 0xc000, 1, false, "Experimental_EIPs", "Development, for experimental EIPs"); private static final Logger LOGGER = LoggerFactory.getLogger(EvmSpecVersion.class); @@ -75,6 +84,12 @@ public enum EvmSpecVersion { /** The Max eof version. */ final int maxEofVersion; + /** Maximum size of deployed code */ + final int maxCodeSize; + + /** Maximum size of initcode */ + final int maxInitcodeSize; + /** Public name matching execution-spec-tests name */ final String name; @@ -85,11 +100,15 @@ public enum EvmSpecVersion { boolean versionWarned = false; EvmSpecVersion( + final int maxCodeSize, + final int maxInitcodeSize, final int maxEofVersion, final boolean specFinalized, final String name, final String description) { this.maxEofVersion = maxEofVersion; + this.maxCodeSize = maxCodeSize; + this.maxInitcodeSize = maxInitcodeSize; this.specFinalized = specFinalized; this.name = name; this.description = description; @@ -102,7 +121,13 @@ public enum EvmSpecVersion { * @return the current mainnet for as of the release of this version of Besu */ public static EvmSpecVersion defaultVersion() { - return SHANGHAI; + EvmSpecVersion answer = null; + for (EvmSpecVersion version : EvmSpecVersion.values()) { + if (version.specFinalized) { + answer = version; + } + } + return answer; } /** @@ -114,6 +139,24 @@ public enum EvmSpecVersion { return maxEofVersion; } + /** + * Gets max deployed code size this EVM supports. + * + * @return the max eof version + */ + public int getMaxCodeSize() { + return maxCodeSize; + } + + /** + * Gets max initcode size this EVM supports. + * + * @return the max eof version + */ + public int getMaxInitcodeSize() { + return maxInitcodeSize; + } + /** * Name of the fork, in execution-spec-tests form * diff --git a/evm/src/main/java/org/hyperledger/besu/evm/code/CodeFactory.java b/evm/src/main/java/org/hyperledger/besu/evm/code/CodeFactory.java index f9a85a20b..a0bba7037 100644 --- a/evm/src/main/java/org/hyperledger/besu/evm/code/CodeFactory.java +++ b/evm/src/main/java/org/hyperledger/besu/evm/code/CodeFactory.java @@ -14,112 +14,99 @@ */ package org.hyperledger.besu.evm.code; -import static org.hyperledger.besu.evm.code.EOFLayout.EOFContainerMode.INITCODE; - import org.hyperledger.besu.evm.Code; import javax.annotation.Nonnull; -import com.google.errorprone.annotations.InlineMe; import org.apache.tuweni.bytes.Bytes; /** The Code factory. */ -public final class CodeFactory { +public class CodeFactory { /** The constant EOF_LEAD_BYTE. */ public static final byte EOF_LEAD_BYTE = -17; // 0xEF in signed byte form - private CodeFactory() { - // factory class, no instantiations. + /** Maximum EOF version that can be produced. Legacy is considered EOF version zero. */ + protected final int maxEofVersion; + + /** Maximum size of the code stream that can be produced, including all header bytes. */ + protected final int maxContainerSize; + + /** The EOF validator against which EOF layouts will be validated. */ + EOFValidator eofValidator; + + /** + * Create a code factory. + * + * @param maxEofVersion Maximum EOF version that can be set + * @param maxContainerSize Maximum size of a container that will be parsed. + */ + public CodeFactory(final int maxEofVersion, final int maxContainerSize) { + this.maxEofVersion = maxEofVersion; + this.maxContainerSize = maxContainerSize; + + eofValidator = new CodeV1Validation(maxContainerSize); } /** * Create Code. * * @param bytes the bytes - * @param maxEofVersion the max eof version * @return the code */ - public static Code createCode(final Bytes bytes, final int maxEofVersion) { - return createCode(bytes, maxEofVersion, false, false); + public Code createCode(final Bytes bytes) { + return createCode(bytes, false); } /** * Create Code. * * @param bytes the bytes - * @param maxEofVersion the max eof version - * @param legacyCreation Allow some corner cases. `EF` and not `EF00` code - * @deprecated use the no boolean or two boolean variant - * @return the code - */ - @Deprecated(since = "24.4.1") - @InlineMe( - replacement = "CodeFactory.createCode(bytes, maxEofVersion, legacyCreation, false)", - imports = "org.hyperledger.besu.evm.code.CodeFactory") - public static Code createCode( - final Bytes bytes, final int maxEofVersion, final boolean legacyCreation) { - return createCode(bytes, maxEofVersion, legacyCreation, false); - } - - /** - * Create Code. - * - * @param bytes the bytes - * @param maxEofVersion the max eof version - * @param legacyCreation Allow some corner cases. `EF` and not `EF00` code * @param createTransaction This is in a create transaction, allow dangling data * @return the code */ - public static Code createCode( - final Bytes bytes, - final int maxEofVersion, - final boolean legacyCreation, - final boolean createTransaction) { - if (maxEofVersion == 0) { - return new CodeV0(bytes); - } else if (maxEofVersion == 1) { - int codeSize = bytes.size(); - if (codeSize > 0 && bytes.get(0) == EOF_LEAD_BYTE) { - if (codeSize == 1 && !legacyCreation) { + public Code createCode(final Bytes bytes, final boolean createTransaction) { + return switch (maxEofVersion) { + case 0 -> new CodeV0(bytes); + case 1 -> createV1Code(bytes, createTransaction); + default -> new CodeInvalid(bytes, "Unsupported max code version " + maxEofVersion); + }; + } + + private @Nonnull Code createV1Code(final Bytes bytes, final boolean createTransaction) { + int codeSize = bytes.size(); + if (codeSize > 0 && bytes.get(0) == EOF_LEAD_BYTE) { + if (codeSize < 3) { + return new CodeInvalid(bytes, "EOF Container too short"); + } + if (bytes.get(1) != 0) { + if (createTransaction) { + // because some 0xef code made it to mainnet, this is only an error at contract creation + // time + return new CodeInvalid(bytes, "Incorrect second byte"); + } else { return new CodeV0(bytes); } - if (codeSize < 3) { - return new CodeInvalid(bytes, "EOF Container too short"); - } - if (bytes.get(1) != 0) { - if (legacyCreation) { - // because some 0xef code made it to mainnet, this is only an error at contract create - return new CodeInvalid(bytes, "Incorrect second byte"); - } else { - return new CodeV0(bytes); - } - } - int version = bytes.get(2); - if (version != 1) { - return new CodeInvalid(bytes, "Unsupported EOF Version: " + version); - } - - final EOFLayout layout = EOFLayout.parseEOF(bytes, !createTransaction); - if (createTransaction) { - layout.containerMode().set(INITCODE); - } - return createCode(layout, createTransaction); - } else { - return new CodeV0(bytes); } + int version = bytes.get(2); + if (version != 1) { + return new CodeInvalid(bytes, "Unsupported EOF Version: " + version); + } + + final EOFLayout layout = EOFLayout.parseEOF(bytes, !createTransaction); + return createCode(layout); } else { - return new CodeInvalid(bytes, "Unsupported max code version " + maxEofVersion); + return new CodeV0(bytes); } } @Nonnull - static Code createCode(final EOFLayout layout, final boolean createTransaction) { + Code createCode(final EOFLayout layout) { if (!layout.isValid()) { return new CodeInvalid(layout.container(), "Invalid EOF Layout: " + layout.invalidReason()); } - final String validationError = CodeV1Validation.validate(layout); + final String validationError = eofValidator.validate(layout); if (validationError != null) { return new CodeInvalid(layout.container(), "EOF Code Invalid : " + validationError); } diff --git a/evm/src/main/java/org/hyperledger/besu/evm/code/CodeInvalid.java b/evm/src/main/java/org/hyperledger/besu/evm/code/CodeInvalid.java index be71c296a..c7efd230f 100644 --- a/evm/src/main/java/org/hyperledger/besu/evm/code/CodeInvalid.java +++ b/evm/src/main/java/org/hyperledger/besu/evm/code/CodeInvalid.java @@ -16,6 +16,7 @@ package org.hyperledger.besu.evm.code; import org.hyperledger.besu.datatypes.Hash; import org.hyperledger.besu.evm.Code; +import org.hyperledger.besu.evm.EVM; import org.hyperledger.besu.evm.internal.Words; import java.util.Optional; @@ -66,6 +67,11 @@ public class CodeInvalid implements Code { return 0; } + @Override + public int getDeclaredDataSize() { + return 0; + } + @Override public Bytes getBytes() { return codeBytes; @@ -107,7 +113,7 @@ public class CodeInvalid implements Code { } @Override - public Optional getSubContainer(final int index, final Bytes auxData) { + public Optional getSubContainer(final int index, final Bytes auxData, final EVM evm) { return Optional.empty(); } diff --git a/evm/src/main/java/org/hyperledger/besu/evm/code/CodeV0.java b/evm/src/main/java/org/hyperledger/besu/evm/code/CodeV0.java index 31a49ba15..45b9cb82e 100644 --- a/evm/src/main/java/org/hyperledger/besu/evm/code/CodeV0.java +++ b/evm/src/main/java/org/hyperledger/besu/evm/code/CodeV0.java @@ -16,6 +16,7 @@ package org.hyperledger.besu.evm.code; import org.hyperledger.besu.datatypes.Hash; import org.hyperledger.besu.evm.Code; +import org.hyperledger.besu.evm.EVM; import org.hyperledger.besu.evm.internal.Words; import org.hyperledger.besu.evm.operation.JumpDestOperation; @@ -90,6 +91,11 @@ public class CodeV0 implements Code { return 0; } + @Override + public int getDeclaredDataSize() { + return 0; + } + @Override public Bytes getBytes() { return bytes; @@ -149,7 +155,7 @@ public class CodeV0 implements Code { } @Override - public Optional getSubContainer(final int index, final Bytes auxData) { + public Optional getSubContainer(final int index, final Bytes auxData, final EVM evm) { return Optional.empty(); } diff --git a/evm/src/main/java/org/hyperledger/besu/evm/code/CodeV1.java b/evm/src/main/java/org/hyperledger/besu/evm/code/CodeV1.java index 2bea400ed..50ffdd410 100644 --- a/evm/src/main/java/org/hyperledger/besu/evm/code/CodeV1.java +++ b/evm/src/main/java/org/hyperledger/besu/evm/code/CodeV1.java @@ -18,6 +18,7 @@ import static com.google.common.base.Preconditions.checkArgument; import org.hyperledger.besu.datatypes.Hash; import org.hyperledger.besu.evm.Code; +import org.hyperledger.besu.evm.EVM; import org.hyperledger.besu.evm.internal.Words; import java.io.PrintWriter; @@ -94,22 +95,23 @@ public class CodeV1 implements Code { } @Override - public Optional getSubContainer(final int index, final Bytes auxData) { + public Optional getSubContainer(final int index, final Bytes auxData, final EVM evm) { EOFLayout subcontainerLayout = eofLayout.getSubcontainer(index); + Bytes codeToLoad; if (auxData != null && !auxData.isEmpty()) { - Bytes subcontainerWithAuxData = subcontainerLayout.writeContainer(auxData); - if (subcontainerWithAuxData == null) { + codeToLoad = subcontainerLayout.writeContainer(auxData); + if (codeToLoad == null) { return Optional.empty(); } - subcontainerLayout = EOFLayout.parseEOF(subcontainerWithAuxData); } else { - // if no auxdata is added we must validate data is not truncated separately + // if no auxdata is added, we must validate data is not truncated separately if (subcontainerLayout.dataLength() != subcontainerLayout.data().size()) { return Optional.empty(); } + codeToLoad = subcontainerLayout.container(); } - Code subContainerCode = CodeFactory.createCode(subcontainerLayout, auxData == null); + Code subContainerCode = evm.getCodeForCreation(codeToLoad); return subContainerCode.isValid() && subContainerCode.getEofVersion() > 0 ? Optional.of(subContainerCode) @@ -150,6 +152,11 @@ public class CodeV1 implements Code { return eofLayout.data().size(); } + @Override + public int getDeclaredDataSize() { + return eofLayout.dataLength(); + } + @Override public int readBigEndianI16(final int index) { return Words.readBigEndianI16(index, eofLayout.container().toArrayUnsafe()); diff --git a/evm/src/main/java/org/hyperledger/besu/evm/code/CodeV1Validation.java b/evm/src/main/java/org/hyperledger/besu/evm/code/CodeV1Validation.java index c940a7d93..3c85bd1eb 100644 --- a/evm/src/main/java/org/hyperledger/besu/evm/code/CodeV1Validation.java +++ b/evm/src/main/java/org/hyperledger/besu/evm/code/CodeV1Validation.java @@ -52,12 +52,20 @@ import javax.annotation.Nullable; import org.apache.tuweni.bytes.Bytes; /** Code V1 Validation */ -public final class CodeV1Validation { +public class CodeV1Validation implements EOFValidator { static final int MAX_STACK_HEIGHT = 1024; - private CodeV1Validation() { - // to prevent instantiation + /** Maximum size of the code stream that can be produced, including all header bytes. */ + protected final int maxContainerSize; + + /** + * Create a new container, with a configurable maximim container size. + * + * @param maxContainerSize the maximum size of any container. + */ + public CodeV1Validation(final int maxContainerSize) { + this.maxContainerSize = maxContainerSize; } /** @@ -69,7 +77,12 @@ public final class CodeV1Validation { */ @SuppressWarnings( "ReferenceEquality") // comparison `container != layout` is deliberate and correct - public static String validate(final EOFLayout layout) { + @Override + public String validate(final EOFLayout layout) { + if (layout.container().size() > maxContainerSize) { + return "EOF container is larger than maximum size of " + maxContainerSize; + } + Queue workList = new ArrayDeque<>(layout.getSubcontainerCount()); workList.add(layout); @@ -87,12 +100,12 @@ public final class CodeV1Validation { : " in container #" + layout.indexOfSubcontainer(container)); } - final String codeValidationError = CodeV1Validation.validateCode(container); + final String codeValidationError = validateCode(container); if (codeValidationError != null) { return codeValidationError; } - final String stackValidationError = CodeV1Validation.validateStack(container); + final String stackValidationError = validateStack(container); if (stackValidationError != null) { return stackValidationError; } @@ -107,13 +120,14 @@ public final class CodeV1Validation { * @param eofLayout The EOF Layout * @return validation code, null otherwise. */ - public static String validateCode(final EOFLayout eofLayout) { + @Override + public String validateCode(final EOFLayout eofLayout) { if (!eofLayout.isValid()) { return "Invalid EOF container - " + eofLayout.invalidReason(); } for (CodeSection cs : eofLayout.codeSections()) { var validation = - CodeV1Validation.validateCode( + validateCode( eofLayout.container().slice(cs.getEntryPoint(), cs.getLength()), cs, eofLayout); if (validation != null) { return validation; @@ -128,7 +142,7 @@ public final class CodeV1Validation { * @param code the code section code * @return null if valid, otherwise a string containing an error reason. */ - static String validateCode( + String validateCode( final Bytes code, final CodeSection thisCodeSection, final EOFLayout eofLayout) { final int size = code.size(); final BitSet rjumpdests = new BitSet(size); @@ -359,12 +373,13 @@ public final class CodeV1Validation { } @Nullable - static String validateStack(final EOFLayout eofLayout) { + @Override + public String validateStack(final EOFLayout eofLayout) { WorkList workList = new WorkList(eofLayout.getCodeSectionCount()); workList.put(0); int sectionToValidatie = workList.take(); while (sectionToValidatie >= 0) { - var validation = CodeV1Validation.validateStack(sectionToValidatie, eofLayout, workList); + var validation = validateStack(sectionToValidatie, eofLayout, workList); if (validation != null) { return validation; } @@ -388,7 +403,7 @@ public final class CodeV1Validation { * @return null if valid, otherwise an error string providing the validation error. */ @Nullable - static String validateStack( + String validateStack( final int codeSectionToValidate, final EOFLayout eofLayout, final WorkList workList) { if (!eofLayout.isValid()) { return "EOF Layout invalid - " + eofLayout.invalidReason(); diff --git a/evm/src/main/java/org/hyperledger/besu/evm/code/EOFLayout.java b/evm/src/main/java/org/hyperledger/besu/evm/code/EOFLayout.java index 1cce49b45..8b41a9792 100644 --- a/evm/src/main/java/org/hyperledger/besu/evm/code/EOFLayout.java +++ b/evm/src/main/java/org/hyperledger/besu/evm/code/EOFLayout.java @@ -323,7 +323,7 @@ public record EOFLayout( } Bytes subcontainer = container.slice(pos, subcontianerSize); pos += subcontianerSize; - EOFLayout subLayout = EOFLayout.parseEOF(subcontainer); + EOFLayout subLayout = EOFLayout.parseEOF(subcontainer, false); if (!subLayout.isValid()) { String invalidSubReason = subLayout.invalidReason; return invalidLayout( @@ -349,6 +349,10 @@ public record EOFLayout( } else { completeContainer = container; } + if (strictSize && dataSize != data.size()) { + return invalidLayout( + container, version, "Truncated data section when a complete section was required"); + } return new EOFLayout(completeContainer, version, codeSections, subContainers, dataSize, data); } diff --git a/evm/src/main/java/org/hyperledger/besu/evm/code/EOFValidator.java b/evm/src/main/java/org/hyperledger/besu/evm/code/EOFValidator.java new file mode 100644 index 000000000..3cbdb404f --- /dev/null +++ b/evm/src/main/java/org/hyperledger/besu/evm/code/EOFValidator.java @@ -0,0 +1,49 @@ +/* + * Copyright contributors to Hyperledger Besu. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on + * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the + * specific language governing permissions and limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + */ +package org.hyperledger.besu.evm.code; + +import javax.annotation.Nullable; + +/** Code Validation */ +public interface EOFValidator { + + /** + * Validates the code and stack for the EOF Layout, with optional deep consideration of the + * containers. + * + * @param layout The parsed EOFLayout of the code + * @return either null, indicating no error, or a String describing the validation error. + */ + @Nullable + String validate(final EOFLayout layout); + + /** + * Performs code validation of the EOF layout. + * + * @param eofLayout The EOF Layout + * @return validation code, null otherwise. + */ + @Nullable + String validateCode(final EOFLayout eofLayout); + + /** + * Performs stack validation of the EOF layout. Presumes that code validation has been perfromed + * + * @param eofLayout The EOF Layout + * @return validation code, null otherwise. + */ + @Nullable + String validateStack(final EOFLayout eofLayout); +} diff --git a/evm/src/main/java/org/hyperledger/besu/evm/contractvalidation/CachedInvalidCodeRule.java b/evm/src/main/java/org/hyperledger/besu/evm/contractvalidation/CachedInvalidCodeRule.java deleted file mode 100644 index e0a7e49f4..000000000 --- a/evm/src/main/java/org/hyperledger/besu/evm/contractvalidation/CachedInvalidCodeRule.java +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Copyright contributors to Hyperledger Besu. - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on - * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the - * specific language governing permissions and limitations under the License. - * - * SPDX-License-Identifier: Apache-2.0 - */ -package org.hyperledger.besu.evm.contractvalidation; - -import org.hyperledger.besu.evm.Code; -import org.hyperledger.besu.evm.EvmSpecVersion; -import org.hyperledger.besu.evm.code.CodeFactory; -import org.hyperledger.besu.evm.frame.ExceptionalHaltReason; -import org.hyperledger.besu.evm.frame.MessageFrame; - -import java.util.Optional; - -import org.apache.tuweni.bytes.Bytes; - -/** The Cached invalid code rule. */ -public class CachedInvalidCodeRule implements ContractValidationRule { - - private final int maxEofVersion; - - /** - * Instantiates a new Cached invalid code rule. - * - * @param maxEofVersion the max eof version - */ - public CachedInvalidCodeRule(final int maxEofVersion) { - this.maxEofVersion = maxEofVersion; - } - - @Override - public Optional validate( - final Bytes contractCode, final MessageFrame frame) { - final Code code = CodeFactory.createCode(contractCode, maxEofVersion); - if (!code.isValid()) { - return Optional.of(ExceptionalHaltReason.INVALID_CODE); - } else { - return Optional.empty(); - } - } - - /** - * Instantiate contract validation rule. - * - * @param specVersion The evm spec version - * @return the contract validation rule - */ - public static ContractValidationRule of(final EvmSpecVersion specVersion) { - return new CachedInvalidCodeRule(specVersion.getMaxEofVersion()); - } -} diff --git a/evm/src/main/java/org/hyperledger/besu/evm/contractvalidation/ContractValidationRule.java b/evm/src/main/java/org/hyperledger/besu/evm/contractvalidation/ContractValidationRule.java index a32718e74..c5c61dd74 100644 --- a/evm/src/main/java/org/hyperledger/besu/evm/contractvalidation/ContractValidationRule.java +++ b/evm/src/main/java/org/hyperledger/besu/evm/contractvalidation/ContractValidationRule.java @@ -14,6 +14,7 @@ */ package org.hyperledger.besu.evm.contractvalidation; +import org.hyperledger.besu.evm.EVM; import org.hyperledger.besu.evm.frame.ExceptionalHaltReason; import org.hyperledger.besu.evm.frame.MessageFrame; @@ -30,7 +31,8 @@ public interface ContractValidationRule { * * @param contractCode the contract code to validate * @param frame the message frame to use for context + * @param evm the EVM against which the validation rule should be considered * @return the optional halt reason */ - Optional validate(Bytes contractCode, MessageFrame frame); + Optional validate(Bytes contractCode, MessageFrame frame, EVM evm); } diff --git a/evm/src/main/java/org/hyperledger/besu/evm/contractvalidation/EOFValidationCodeRule.java b/evm/src/main/java/org/hyperledger/besu/evm/contractvalidation/EOFValidationCodeRule.java index a052bcfa8..e61a006f0 100644 --- a/evm/src/main/java/org/hyperledger/besu/evm/contractvalidation/EOFValidationCodeRule.java +++ b/evm/src/main/java/org/hyperledger/besu/evm/contractvalidation/EOFValidationCodeRule.java @@ -14,8 +14,9 @@ */ package org.hyperledger.besu.evm.contractvalidation; +import org.hyperledger.besu.datatypes.Hash; import org.hyperledger.besu.evm.Code; -import org.hyperledger.besu.evm.code.CodeFactory; +import org.hyperledger.besu.evm.EVM; import org.hyperledger.besu.evm.code.CodeInvalid; import org.hyperledger.besu.evm.frame.ExceptionalHaltReason; import org.hyperledger.besu.evm.frame.MessageFrame; @@ -45,13 +46,14 @@ public class EOFValidationCodeRule implements ContractValidationRule { * * @param contractCode the contract code to validate * @param frame the message frame to use for context + * @param evm The EVM against which the validation should be considered against * @return Either an empty optional on success, or an optional containing one of the invalid * reasons. */ @Override public Optional validate( - final Bytes contractCode, final MessageFrame frame) { - Code code = CodeFactory.createCode(contractCode, maxEofVersion); + final Bytes contractCode, final MessageFrame frame, final EVM evm) { + Code code = evm.getCode(Hash.hash(contractCode), contractCode); if (!code.isValid()) { LOG.trace("EOF Validation Error: {}", ((CodeInvalid) code).getInvalidReason()); return Optional.of(ExceptionalHaltReason.INVALID_CODE); @@ -73,8 +75,20 @@ public class EOFValidationCodeRule implements ContractValidationRule { * * @param maxEofVersion Maximum EOF version to validate * @return The EOF validation contract validation rule. + * @deprecated use {@link #from(EVM)} */ + @Deprecated(forRemoval = true, since = "24.6.1") public static ContractValidationRule of(final int maxEofVersion) { return new EOFValidationCodeRule(maxEofVersion); } + + /** + * Create EOF validation. + * + * @param evm The EVM for which we are enforcing the rule + * @return The EOF validation contract validation rule. + */ + public static ContractValidationRule from(final EVM evm) { + return new EOFValidationCodeRule(evm.getMaxEOFVersion()); + } } diff --git a/evm/src/main/java/org/hyperledger/besu/evm/contractvalidation/MaxCodeSizeRule.java b/evm/src/main/java/org/hyperledger/besu/evm/contractvalidation/MaxCodeSizeRule.java index 9a82e89a6..794650a13 100644 --- a/evm/src/main/java/org/hyperledger/besu/evm/contractvalidation/MaxCodeSizeRule.java +++ b/evm/src/main/java/org/hyperledger/besu/evm/contractvalidation/MaxCodeSizeRule.java @@ -14,6 +14,8 @@ */ package org.hyperledger.besu.evm.contractvalidation; +import org.hyperledger.besu.evm.EVM; +import org.hyperledger.besu.evm.EvmSpecVersion; import org.hyperledger.besu.evm.frame.ExceptionalHaltReason; import org.hyperledger.besu.evm.frame.MessageFrame; @@ -41,7 +43,7 @@ public class MaxCodeSizeRule implements ContractValidationRule { @Override public Optional validate( - final Bytes contractCode, final MessageFrame frame) { + final Bytes contractCode, final MessageFrame frame, final EVM evm) { final int contractCodeSize = contractCode.size(); if (contractCodeSize <= maxCodeSize) { return Optional.empty(); @@ -55,12 +57,34 @@ public class MaxCodeSizeRule implements ContractValidationRule { } /** - * Instantiate ContractValidationRule. + * Fluent MaxCodeSizeRule constructor of an explicit size. * * @param maxCodeSize the max code size * @return the contract validation rule + * @deprecated use {@link #from(EVM)} */ + @Deprecated(forRemoval = true, since = "24.6.1") public static ContractValidationRule of(final int maxCodeSize) { return new MaxCodeSizeRule(maxCodeSize); } + + /** + * Fluent MaxCodeSizeRule from the EVM it is working with. + * + * @param evm The evm to get the size rules from. + * @return the contract validation rule + */ + public static ContractValidationRule from(final EVM evm) { + return from(evm.getEvmVersion()); + } + + /** + * Fluent MaxCodeSizeRule from the EVM it is working with. + * + * @param evmspec The evm spec version to get the size rules from. + * @return the contract validation rule + */ + public static ContractValidationRule from(final EvmSpecVersion evmspec) { + return new MaxCodeSizeRule(evmspec.getMaxCodeSize()); + } } diff --git a/evm/src/main/java/org/hyperledger/besu/evm/contractvalidation/PrefixCodeRule.java b/evm/src/main/java/org/hyperledger/besu/evm/contractvalidation/PrefixCodeRule.java index b596786ba..b19c47293 100644 --- a/evm/src/main/java/org/hyperledger/besu/evm/contractvalidation/PrefixCodeRule.java +++ b/evm/src/main/java/org/hyperledger/besu/evm/contractvalidation/PrefixCodeRule.java @@ -14,6 +14,7 @@ */ package org.hyperledger.besu.evm.contractvalidation; +import org.hyperledger.besu.evm.EVM; import org.hyperledger.besu.evm.frame.ExceptionalHaltReason; import org.hyperledger.besu.evm.frame.MessageFrame; @@ -31,12 +32,14 @@ public class PrefixCodeRule implements ContractValidationRule { private static final byte FORMAT_RESERVED = (byte) 0xEF; /** Default constructor. */ - public PrefixCodeRule() {} + public PrefixCodeRule() { + // This constructor exists because of JavaDoc linting rules. + } @Override // As per https://eips.ethereum.org/EIPS/eip-3541 public Optional validate( - final Bytes contractCode, final MessageFrame frame) { + final Bytes contractCode, final MessageFrame frame, final EVM evm) { if (!contractCode.isEmpty() && contractCode.get(0) == FORMAT_RESERVED) { LOG.trace("Contract creation error: code cannot start with {}", FORMAT_RESERVED); return Optional.of(ExceptionalHaltReason.INVALID_CODE); diff --git a/evm/src/main/java/org/hyperledger/besu/evm/fluent/EVMExecutor.java b/evm/src/main/java/org/hyperledger/besu/evm/fluent/EVMExecutor.java index 64e9653ab..a65bd034d 100644 --- a/evm/src/main/java/org/hyperledger/besu/evm/fluent/EVMExecutor.java +++ b/evm/src/main/java/org/hyperledger/besu/evm/fluent/EVMExecutor.java @@ -77,7 +77,7 @@ public class EVMExecutor { private OperationTracer tracer = OperationTracer.NO_TRACING; private boolean requireDeposit = true; private List contractValidationRules = - List.of(MaxCodeSizeRule.of(0x6000), PrefixCodeRule.of()); + List.of(MaxCodeSizeRule.from(EvmSpecVersion.SPURIOUS_DRAGON), PrefixCodeRule.of()); private long initialNonce = 1; private Collection
forceCommitAddresses = List.of(Address.fromHexString("0x03")); private Set
accessListWarmAddresses = new BytesTrieSet<>(Address.SIZE); @@ -240,7 +240,8 @@ public class EVMExecutor { final EVMExecutor executor = new EVMExecutor(MainnetEVMs.spuriousDragon(evmConfiguration)); executor.precompileContractRegistry = MainnetPrecompiledContracts.frontier(executor.evm.getGasCalculator()); - executor.contractValidationRules = List.of(MaxCodeSizeRule.of(0x6000)); + executor.contractValidationRules = + List.of(MaxCodeSizeRule.from(EvmSpecVersion.SPURIOUS_DRAGON)); return executor; } @@ -254,7 +255,7 @@ public class EVMExecutor { final EVMExecutor executor = new EVMExecutor(MainnetEVMs.byzantium(evmConfiguration)); executor.precompileContractRegistry = MainnetPrecompiledContracts.byzantium(executor.evm.getGasCalculator()); - executor.contractValidationRules = List.of(MaxCodeSizeRule.of(0x6000)); + executor.contractValidationRules = List.of(MaxCodeSizeRule.from(EvmSpecVersion.BYZANTIUM)); return executor; } @@ -268,7 +269,7 @@ public class EVMExecutor { final EVMExecutor executor = new EVMExecutor(MainnetEVMs.constantinople(evmConfiguration)); executor.precompileContractRegistry = MainnetPrecompiledContracts.byzantium(executor.evm.getGasCalculator()); - executor.contractValidationRules = List.of(MaxCodeSizeRule.of(0x6000)); + executor.contractValidationRules = List.of(MaxCodeSizeRule.from(EvmSpecVersion.CONSTANTINOPLE)); return executor; } @@ -282,7 +283,7 @@ public class EVMExecutor { final EVMExecutor executor = new EVMExecutor(MainnetEVMs.petersburg(evmConfiguration)); executor.precompileContractRegistry = MainnetPrecompiledContracts.byzantium(executor.evm.getGasCalculator()); - executor.contractValidationRules = List.of(MaxCodeSizeRule.of(0x6000)); + executor.contractValidationRules = List.of(MaxCodeSizeRule.from(EvmSpecVersion.PETERSBURG)); return executor; } @@ -317,7 +318,7 @@ public class EVMExecutor { final EVMExecutor executor = new EVMExecutor(MainnetEVMs.istanbul(chainId, evmConfiguration)); executor.precompileContractRegistry = MainnetPrecompiledContracts.istanbul(executor.evm.getGasCalculator()); - executor.contractValidationRules = List.of(MaxCodeSizeRule.of(0x6000)); + executor.contractValidationRules = List.of(MaxCodeSizeRule.from(EvmSpecVersion.ISTANBUL)); return executor; } @@ -352,7 +353,7 @@ public class EVMExecutor { final EVMExecutor executor = new EVMExecutor(MainnetEVMs.berlin(chainId, evmConfiguration)); executor.precompileContractRegistry = MainnetPrecompiledContracts.istanbul(executor.evm.getGasCalculator()); - executor.contractValidationRules = List.of(MaxCodeSizeRule.of(0x6000)); + executor.contractValidationRules = List.of(MaxCodeSizeRule.from(EvmSpecVersion.BERLIN)); return executor; } @@ -658,12 +659,7 @@ public class EVMExecutor { contractCreationProcessor, () -> new ContractCreationProcessor( - evm.getGasCalculator(), - evm, - requireDeposit, - contractValidationRules, - initialNonce, - forceCommitAddresses)); + evm, requireDeposit, contractValidationRules, initialNonce, forceCommitAddresses)); } /** diff --git a/evm/src/main/java/org/hyperledger/besu/evm/frame/ExceptionalHaltReason.java b/evm/src/main/java/org/hyperledger/besu/evm/frame/ExceptionalHaltReason.java index af121ae92..729d10ffa 100644 --- a/evm/src/main/java/org/hyperledger/besu/evm/frame/ExceptionalHaltReason.java +++ b/evm/src/main/java/org/hyperledger/besu/evm/frame/ExceptionalHaltReason.java @@ -63,6 +63,12 @@ public interface ExceptionalHaltReason { /** The constant NONEXISTENT_CONTAINER */ ExceptionalHaltReason NONEXISTENT_CONTAINER = DefaultExceptionalHaltReason.NONEXISTENT_CONTAINER; + /** The constant INVALID_CONTAINER */ + ExceptionalHaltReason INVALID_CONTAINER = DefaultExceptionalHaltReason.INVALID_CONTAINER; + + /** The constant DATA_TOO_SMALL */ + ExceptionalHaltReason DATA_TOO_SMALL = DefaultExceptionalHaltReason.DATA_TOO_SMALL; + /** The constant ADDRESS_OUT_OF_RANGE */ ExceptionalHaltReason ADDRESS_OUT_OF_RANGE = DefaultExceptionalHaltReason.ADDRESS_OUT_OF_RANGE; @@ -112,7 +118,11 @@ public interface ExceptionalHaltReason { EOF_CREATE_VERSION_INCOMPATIBLE( "EOF Code is attempting to create EOF code of an earlier version"), /** Container referenced by EOFCREATE operation does not exist */ - NONEXISTENT_CONTAINER("Referenced subcontainer index does not exist (too large?)"), + NONEXISTENT_CONTAINER("Referenced subcontainer index does not exist"), + /** Container referenced by EOFCREATE operation is invalid */ + INVALID_CONTAINER("Referenced subcontainer index is invalid"), + /** Container referenced by EOFCREATE operation does not exist */ + DATA_TOO_SMALL("Insufficient AuxData provided to a truncated container"), /** A given address cannot be used by EOF */ ADDRESS_OUT_OF_RANGE("Address has more than 20 bytes and is out of range"); diff --git a/evm/src/main/java/org/hyperledger/besu/evm/internal/EvmConfiguration.java b/evm/src/main/java/org/hyperledger/besu/evm/internal/EvmConfiguration.java index 126407653..ef7265dad 100644 --- a/evm/src/main/java/org/hyperledger/besu/evm/internal/EvmConfiguration.java +++ b/evm/src/main/java/org/hyperledger/besu/evm/internal/EvmConfiguration.java @@ -14,13 +14,27 @@ */ package org.hyperledger.besu.evm.internal; +import org.hyperledger.besu.evm.frame.MessageFrame; + +import java.util.Optional; +import java.util.OptionalInt; + /** * The type Evm configuration. * * @param jumpDestCacheWeightKB the jump destination cache weight in kb * @param worldUpdaterMode the world updater mode + * @param evmStackSize the maximum evm stack size + * @param maxCodeSizeOverride An optional override of the maximum code size set by the EVM fork + * @param maxInitcodeSizeOverride An optional override of the maximum initcode size set by the EVM + * fork */ -public record EvmConfiguration(long jumpDestCacheWeightKB, WorldUpdaterMode worldUpdaterMode) { +public record EvmConfiguration( + long jumpDestCacheWeightKB, + WorldUpdaterMode worldUpdaterMode, + Integer evmStackSize, + Optional maxCodeSizeOverride, + Optional maxInitcodeSizeOverride) { /** How should the world state update be handled within transactions? */ public enum WorldUpdaterMode { @@ -36,6 +50,22 @@ public record EvmConfiguration(long jumpDestCacheWeightKB, WorldUpdaterMode worl public static final EvmConfiguration DEFAULT = new EvmConfiguration(32_000L, WorldUpdaterMode.STACKED); + /** + * Create an EVM Configuration without any overrides + * + * @param jumpDestCacheWeightKilobytes the jump dest cache weight (in kibibytes) + * @param worldstateUpdateMode the workd update mode + */ + public EvmConfiguration( + final Long jumpDestCacheWeightKilobytes, final WorldUpdaterMode worldstateUpdateMode) { + this( + jumpDestCacheWeightKilobytes, + worldstateUpdateMode, + MessageFrame.DEFAULT_MAX_STACK_SIZE, + Optional.empty(), + Optional.empty()); + } + /** * Gets jump dest cache weight bytes. * @@ -44,4 +74,27 @@ public record EvmConfiguration(long jumpDestCacheWeightKB, WorldUpdaterMode worl public long getJumpDestCacheWeightBytes() { return jumpDestCacheWeightKB * 1024L; } + + /** + * Update the configuration with new overrides, or clearing the overrides with {@link + * Optional#empty} + * + * @param newMaxCodeSize a new max code size override + * @param newMaxInitcodeSize a new max initcode size override + * @param newEvmStackSize a new EVM stack size override + * @return the updated EVM configuration + */ + public EvmConfiguration overrides( + final OptionalInt newMaxCodeSize, + final OptionalInt newMaxInitcodeSize, + final OptionalInt newEvmStackSize) { + return new EvmConfiguration( + jumpDestCacheWeightKB, + worldUpdaterMode, + newEvmStackSize.orElse(MessageFrame.DEFAULT_MAX_STACK_SIZE), + newMaxCodeSize.isPresent() ? Optional.of(newMaxCodeSize.getAsInt()) : Optional.empty(), + newMaxInitcodeSize.isPresent() + ? Optional.of(newMaxInitcodeSize.getAsInt()) + : Optional.empty()); + } } diff --git a/evm/src/main/java/org/hyperledger/besu/evm/operation/AbstractCreateOperation.java b/evm/src/main/java/org/hyperledger/besu/evm/operation/AbstractCreateOperation.java index 180eac279..f026fd711 100644 --- a/evm/src/main/java/org/hyperledger/besu/evm/operation/AbstractCreateOperation.java +++ b/evm/src/main/java/org/hyperledger/besu/evm/operation/AbstractCreateOperation.java @@ -22,7 +22,6 @@ import org.hyperledger.besu.datatypes.Wei; import org.hyperledger.besu.evm.Code; import org.hyperledger.besu.evm.EVM; import org.hyperledger.besu.evm.account.MutableAccount; -import org.hyperledger.besu.evm.code.CodeFactory; import org.hyperledger.besu.evm.code.CodeInvalid; import org.hyperledger.besu.evm.frame.ExceptionalHaltReason; import org.hyperledger.besu.evm.frame.MessageFrame; @@ -218,7 +217,7 @@ public abstract class AbstractCreateOperation extends AbstractOperation { Code outputCode = (childFrame.getCreatedCode() != null) ? childFrame.getCreatedCode() - : CodeFactory.createCode(childFrame.getOutputData(), evm.getMaxEOFVersion()); + : evm.getCodeForCreation(childFrame.getOutputData()); frame.popStackItems(getStackItemsConsumed()); if (outputCode.isValid()) { diff --git a/evm/src/main/java/org/hyperledger/besu/evm/operation/EOFCreateOperation.java b/evm/src/main/java/org/hyperledger/besu/evm/operation/EOFCreateOperation.java index cb6b2d4e3..0fb1e34a7 100644 --- a/evm/src/main/java/org/hyperledger/besu/evm/operation/EOFCreateOperation.java +++ b/evm/src/main/java/org/hyperledger/besu/evm/operation/EOFCreateOperation.java @@ -74,7 +74,7 @@ public class EOFCreateOperation extends AbstractCreateOperation { int startIndex = frame.getPC() + 1; final int initContainerIndex = code.readU8(startIndex); - return code.getSubContainer(initContainerIndex, null).orElse(null); + return code.getSubContainer(initContainerIndex, null, evm).orElse(null); } @Override diff --git a/evm/src/main/java/org/hyperledger/besu/evm/operation/ReturnContractOperation.java b/evm/src/main/java/org/hyperledger/besu/evm/operation/ReturnContractOperation.java index c8031f4c4..978958007 100644 --- a/evm/src/main/java/org/hyperledger/besu/evm/operation/ReturnContractOperation.java +++ b/evm/src/main/java/org/hyperledger/besu/evm/operation/ReturnContractOperation.java @@ -64,9 +64,15 @@ public class ReturnContractOperation extends AbstractOperation { } Bytes auxData = frame.readMemory(from, length); - Optional newCode = code.getSubContainer(index, auxData); + if (code.getDataSize() + auxData.size() > evm.getEvmVersion().getMaxCodeSize()) { + return new OperationResult(cost, ExceptionalHaltReason.CODE_TOO_LARGE); + } + if (code.getDataSize() + auxData.size() < code.getDeclaredDataSize()) { + return new OperationResult(cost, ExceptionalHaltReason.DATA_TOO_SMALL); + } + Optional newCode = code.getSubContainer(index, auxData, evm); if (newCode.isEmpty()) { - return new OperationResult(cost, ExceptionalHaltReason.NONEXISTENT_CONTAINER); + return new OperationResult(cost, ExceptionalHaltReason.INVALID_CONTAINER); } frame.setCreatedCode(newCode.get()); diff --git a/evm/src/main/java/org/hyperledger/besu/evm/processor/AbstractMessageProcessor.java b/evm/src/main/java/org/hyperledger/besu/evm/processor/AbstractMessageProcessor.java index 5e6683263..0d394b2f8 100644 --- a/evm/src/main/java/org/hyperledger/besu/evm/processor/AbstractMessageProcessor.java +++ b/evm/src/main/java/org/hyperledger/besu/evm/processor/AbstractMessageProcessor.java @@ -71,7 +71,7 @@ public abstract class AbstractMessageProcessor { // List of addresses to force delete when they are touched but empty // when the state changes in the message are were not meant to be committed. private final Collection forceDeleteAccountsWhenEmpty; - private final EVM evm; + final EVM evm; /** * Instantiates a new Abstract message processor. @@ -188,15 +188,12 @@ public abstract class AbstractMessageProcessor { if (operationTracer != null) { if (frame.getState() == MessageFrame.State.NOT_STARTED) { operationTracer.traceContextEnter(frame); + start(frame, operationTracer); } else { operationTracer.traceContextReEnter(frame); } } - if (frame.getState() == MessageFrame.State.NOT_STARTED) { - start(frame, operationTracer); - } - if (frame.getState() == MessageFrame.State.CODE_EXECUTING) { codeExecute(frame, operationTracer); diff --git a/evm/src/main/java/org/hyperledger/besu/evm/processor/ContractCreationProcessor.java b/evm/src/main/java/org/hyperledger/besu/evm/processor/ContractCreationProcessor.java index 0e47db90a..a68c304c5 100644 --- a/evm/src/main/java/org/hyperledger/besu/evm/processor/ContractCreationProcessor.java +++ b/evm/src/main/java/org/hyperledger/besu/evm/processor/ContractCreationProcessor.java @@ -22,7 +22,6 @@ import org.hyperledger.besu.evm.account.MutableAccount; import org.hyperledger.besu.evm.contractvalidation.ContractValidationRule; import org.hyperledger.besu.evm.frame.ExceptionalHaltReason; import org.hyperledger.besu.evm.frame.MessageFrame; -import org.hyperledger.besu.evm.gascalculator.GasCalculator; import org.hyperledger.besu.evm.tracing.OperationTracer; import java.util.Collection; @@ -41,8 +40,6 @@ public class ContractCreationProcessor extends AbstractMessageProcessor { private final boolean requireCodeDepositToSucceed; - private final GasCalculator gasCalculator; - private final long initialContractNonce; private final List contractValidationRules; @@ -50,7 +47,6 @@ public class ContractCreationProcessor extends AbstractMessageProcessor { /** * Instantiates a new Contract creation processor. * - * @param gasCalculator the gas calculator * @param evm the evm * @param requireCodeDepositToSucceed the require code deposit to succeed * @param contractValidationRules the contract validation rules @@ -58,14 +54,12 @@ public class ContractCreationProcessor extends AbstractMessageProcessor { * @param forceCommitAddresses the force commit addresses */ public ContractCreationProcessor( - final GasCalculator gasCalculator, final EVM evm, final boolean requireCodeDepositToSucceed, final List contractValidationRules, final long initialContractNonce, final Collection
forceCommitAddresses) { super(evm, forceCommitAddresses); - this.gasCalculator = gasCalculator; this.requireCodeDepositToSucceed = requireCodeDepositToSucceed; this.contractValidationRules = contractValidationRules; this.initialContractNonce = initialContractNonce; @@ -74,25 +68,17 @@ public class ContractCreationProcessor extends AbstractMessageProcessor { /** * Instantiates a new Contract creation processor. * - * @param gasCalculator the gas calculator * @param evm the evm * @param requireCodeDepositToSucceed the require code deposit to succeed * @param contractValidationRules the contract validation rules * @param initialContractNonce the initial contract nonce */ public ContractCreationProcessor( - final GasCalculator gasCalculator, final EVM evm, final boolean requireCodeDepositToSucceed, final List contractValidationRules, final long initialContractNonce) { - this( - gasCalculator, - evm, - requireCodeDepositToSucceed, - contractValidationRules, - initialContractNonce, - Set.of()); + this(evm, requireCodeDepositToSucceed, contractValidationRules, initialContractNonce, Set.of()); } private static boolean accountExists(final Account account) { @@ -140,7 +126,7 @@ public class ContractCreationProcessor extends AbstractMessageProcessor { final Bytes contractCode = frame.getCreatedCode() == null ? frame.getOutputData() : frame.getCreatedCode().getBytes(); - final long depositFee = gasCalculator.codeDepositGasCost(contractCode.size()); + final long depositFee = evm.getGasCalculator().codeDepositGasCost(contractCode.size()); if (frame.getRemainingGas() < depositFee) { LOG.trace( @@ -161,7 +147,7 @@ public class ContractCreationProcessor extends AbstractMessageProcessor { } else { final var invalidReason = contractValidationRules.stream() - .map(rule -> rule.validate(contractCode, frame)) + .map(rule -> rule.validate(contractCode, frame, evm)) .filter(Optional::isPresent) .findFirst(); if (invalidReason.isEmpty()) { diff --git a/evm/src/test/java/org/hyperledger/besu/evm/code/CodeFactoryTest.java b/evm/src/test/java/org/hyperledger/besu/evm/code/CodeFactoryTest.java index 75ec9eb01..e1f1e767d 100644 --- a/evm/src/test/java/org/hyperledger/besu/evm/code/CodeFactoryTest.java +++ b/evm/src/test/java/org/hyperledger/besu/evm/code/CodeFactoryTest.java @@ -18,6 +18,9 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.hyperledger.besu.evm.EOFTestConstants.bytesFromPrettyPrint; import org.hyperledger.besu.evm.Code; +import org.hyperledger.besu.evm.EVM; +import org.hyperledger.besu.evm.MainnetEVMs; +import org.hyperledger.besu.evm.internal.EvmConfiguration; import org.junit.jupiter.api.Test; @@ -25,12 +28,12 @@ class CodeFactoryTest { @Test void invalidCodeIncompleteMagic() { - invalidCode("0xEF", true); + invalidCodeForCreation("0xEF"); } @Test void invalidCodeInvalidMagic() { - invalidCode("0xEFFF0101000302000400600000AABBCCDD", true); + invalidCodeForCreation("0xEFFF0101000302000400600000AABBCCDD"); } @Test @@ -180,7 +183,9 @@ class CodeFactoryTest { @Test void invalidDataTruncated() { - invalidCode("EF0001 010004 0200010001 040003 00 00800000 FE BEEF", "Incomplete data section"); + invalidCode( + "EF0001 010004 0200010001 040003 00 00800000 FE BEEF", + "Truncated data section when a complete section was required"); } @Test @@ -588,35 +593,28 @@ class CodeFactoryTest { "RETURNCONTRACT is only a valid opcode in containers used for initcode"); } - // // valid subcontainer references - // // invalid subcontainer references - // - // { - // "EF0001 010004 0200010001 040003 00 00800000 FE BEEF", - // "Incomplete data section", - // "Incomplete data section", - // 1 - // }, - // - private static void validCode(final String str) { - Code code = CodeFactory.createCode(bytesFromPrettyPrint(str), 1); + EVM evm = MainnetEVMs.pragueEOF(EvmConfiguration.DEFAULT); + Code code = evm.getCodeUncached(bytesFromPrettyPrint(str)); assertThat(code.isValid()).isTrue(); } private static void invalidCode(final String str, final String error) { - Code code = CodeFactory.createCode(bytesFromPrettyPrint(str), 1); + EVM evm = MainnetEVMs.pragueEOF(EvmConfiguration.DEFAULT); + Code code = evm.getCodeUncached(bytesFromPrettyPrint(str)); assertThat(code.isValid()).isFalse(); assertThat(((CodeInvalid) code).getInvalidReason()).contains(error); } private static void invalidCode(final String str) { - Code code = CodeFactory.createCode(bytesFromPrettyPrint(str), 1); + EVM evm = MainnetEVMs.pragueEOF(EvmConfiguration.DEFAULT); + Code code = evm.getCodeUncached(bytesFromPrettyPrint(str)); assertThat(code.isValid()).isFalse(); } - private static void invalidCode(final String str, final boolean legacy) { - Code code = CodeFactory.createCode(bytesFromPrettyPrint(str), 1, legacy, false); + private static void invalidCodeForCreation(final String str) { + EVM evm = MainnetEVMs.pragueEOF(EvmConfiguration.DEFAULT); + Code code = evm.getCodeForCreation(bytesFromPrettyPrint(str)); assertThat(code.isValid()).isFalse(); } } diff --git a/evm/src/test/java/org/hyperledger/besu/evm/code/CodeV0Test.java b/evm/src/test/java/org/hyperledger/besu/evm/code/CodeV0Test.java index 1bc984222..3b16b1c92 100644 --- a/evm/src/test/java/org/hyperledger/besu/evm/code/CodeV0Test.java +++ b/evm/src/test/java/org/hyperledger/besu/evm/code/CodeV0Test.java @@ -24,15 +24,12 @@ import org.hyperledger.besu.datatypes.Address; import org.hyperledger.besu.datatypes.Hash; import org.hyperledger.besu.datatypes.Wei; import org.hyperledger.besu.evm.EVM; -import org.hyperledger.besu.evm.EvmSpecVersion; +import org.hyperledger.besu.evm.MainnetEVMs; import org.hyperledger.besu.evm.frame.BlockValues; import org.hyperledger.besu.evm.frame.MessageFrame; -import org.hyperledger.besu.evm.gascalculator.IstanbulGasCalculator; import org.hyperledger.besu.evm.internal.EvmConfiguration; -import org.hyperledger.besu.evm.operation.JumpDestOperation; import org.hyperledger.besu.evm.operation.JumpOperation; import org.hyperledger.besu.evm.operation.Operation.OperationResult; -import org.hyperledger.besu.evm.operation.OperationRegistry; import org.hyperledger.besu.evm.worldstate.WorldUpdater; import javax.annotation.Nonnull; @@ -45,24 +42,19 @@ import org.mockito.Mockito; class CodeV0Test { - private static final IstanbulGasCalculator gasCalculator = new IstanbulGasCalculator(); - private static final int CURRENT_PC = 1; private EVM evm; @BeforeEach void startUp() { - final OperationRegistry registry = new OperationRegistry(); - registry.put(new JumpOperation(gasCalculator)); - registry.put(new JumpDestOperation(gasCalculator)); - evm = new EVM(registry, gasCalculator, EvmConfiguration.DEFAULT, EvmSpecVersion.PARIS); + evm = MainnetEVMs.pragueEOF(EvmConfiguration.DEFAULT); } @Test void shouldReuseJumpDestMap() { - final JumpOperation operation = new JumpOperation(gasCalculator); + final JumpOperation operation = new JumpOperation(evm.getGasCalculator()); final Bytes jumpBytes = Bytes.fromHexString("0x6003565b00"); - final CodeV0 getsCached = (CodeV0) spy(CodeFactory.createCode(jumpBytes, 0)); + final CodeV0 getsCached = (CodeV0) spy(evm.getCodeUncached(jumpBytes)); MessageFrame frame = createJumpFrame(getsCached); OperationResult result = operation.execute(frame, evm); diff --git a/evm/src/test/java/org/hyperledger/besu/evm/code/CodeV1Test.java b/evm/src/test/java/org/hyperledger/besu/evm/code/CodeV1Test.java index 8eda50316..f32a3f486 100644 --- a/evm/src/test/java/org/hyperledger/besu/evm/code/CodeV1Test.java +++ b/evm/src/test/java/org/hyperledger/besu/evm/code/CodeV1Test.java @@ -15,8 +15,6 @@ package org.hyperledger.besu.evm.code; import static org.assertj.core.api.Assertions.assertThat; -import static org.hyperledger.besu.evm.code.CodeV1Validation.validateCode; -import static org.hyperledger.besu.evm.code.CodeV1Validation.validateStack; import java.util.Arrays; import java.util.List; @@ -72,7 +70,8 @@ class CodeV1Test { final Bytes codeBytes, final CodeSection thisCodeSection, final EOFLayout eofLayout) { - final String validationError = validateCode(codeBytes, thisCodeSection, eofLayout); + CodeV1Validation validator = new CodeV1Validation(0xc000); + final String validationError = validator.validateCode(codeBytes, thisCodeSection, eofLayout); if (error == null) { assertThat(validationError).isNull(); } else { @@ -85,8 +84,8 @@ class CodeV1Test { String codeHex = "0xEF0001 01000C 020003 000b 0002 0008 040000 00 00800000 02010001 01000002 60016002e30001e30002f3 01e4 60005360106000e4"; final EOFLayout layout = EOFLayout.parseEOF(Bytes.fromHexString(codeHex.replace(" ", ""))); - - String validationError = validateCode(layout); + CodeV1Validation validator = new CodeV1Validation(0xc000); + String validationError = validator.validateCode(layout); assertThat(validationError).isNull(); } @@ -96,8 +95,8 @@ class CodeV1Test { String codeHex = "0xEF0001 01000C 020003 000b 0002 0008 040000 00 00000000 02010001 01000002 60016002e30001e30002f3 01e4 60005360106000e4"; final EOFLayout layout = EOFLayout.parseEOF(Bytes.fromHexString(codeHex.replace(" ", ""))); - - String validationError = validateCode(layout); + CodeV1Validation validator = new CodeV1Validation(0xc000); + String validationError = validator.validateCode(layout); assertThat(validationError) .isEqualTo( @@ -475,8 +474,9 @@ class CodeV1Test { + codeData; EOFLayout eofLayout = EOFLayout.parseEOF(Bytes.fromHexString(sb)); + CodeV1Validation validator = new CodeV1Validation(0xc000); - assertThat(validateStack(sectionToTest, eofLayout, new WorkList(sectionCount))) + assertThat(validator.validateStack(sectionToTest, eofLayout, new WorkList(sectionCount))) .isEqualTo(expectedError); } diff --git a/evm/src/test/java/org/hyperledger/besu/evm/fluent/EVMExecutorTest.java b/evm/src/test/java/org/hyperledger/besu/evm/fluent/EVMExecutorTest.java index 871d99f76..a080f649c 100644 --- a/evm/src/test/java/org/hyperledger/besu/evm/fluent/EVMExecutorTest.java +++ b/evm/src/test/java/org/hyperledger/besu/evm/fluent/EVMExecutorTest.java @@ -22,7 +22,6 @@ import org.hyperledger.besu.datatypes.Hash; import org.hyperledger.besu.datatypes.Wei; import org.hyperledger.besu.evm.EVM; import org.hyperledger.besu.evm.EvmSpecVersion; -import org.hyperledger.besu.evm.code.CodeFactory; import org.hyperledger.besu.evm.frame.MessageFrame; import org.hyperledger.besu.evm.gascalculator.FrontierGasCalculator; import org.hyperledger.besu.evm.internal.EvmConfiguration; @@ -135,19 +134,6 @@ class EVMExecutorTest { assertThat(futureEipsVM.getChainId()).contains(defaultChainId); } - @Test - void executeCode() { - var result = - EVMExecutor.evm(EvmSpecVersion.SHANGHAI) - .worldUpdater(createSimpleWorld().updater()) - .execute( - CodeFactory.createCode(Bytes.fromHexString("0x6001600255"), 1), - Bytes.EMPTY, - Wei.ZERO, - Address.ZERO); - assertThat(result).isNotNull(); - } - @Test void executeBytes() { var result = @@ -180,7 +166,7 @@ class EVMExecutorTest { .blobGasPrice(Wei.ONE) .callData(Bytes.fromHexString("0x12345678")) .ethValue(Wei.fromEth(1)) - .code(CodeFactory.createCode(Bytes.fromHexString("0x6001600255"), 0)) + .code(Bytes.fromHexString("0x6001600255")) .blockValues(new SimpleBlockValues()) .difficulty(Bytes.ofUnsignedLong(1L)) .mixHash(Bytes32.ZERO) @@ -199,7 +185,7 @@ class EVMExecutorTest { .accessListWarmStorage( Address.ZERO, Bytes32.ZERO, Bytes32.leftPad(Bytes.ofUnsignedLong(2L))) .messageCallProcessor(new MessageCallProcessor(null, null)) - .contractCallProcessor(new ContractCreationProcessor(null, null, true, null, 1L)) + .contractCallProcessor(new ContractCreationProcessor(null, true, null, 1L)) .execute(); assertThat(result).isNotNull(); } diff --git a/evm/src/test/java/org/hyperledger/besu/evm/internal/CodeCacheTest.java b/evm/src/test/java/org/hyperledger/besu/evm/internal/CodeCacheTest.java index 94f616898..7b8a74b0c 100644 --- a/evm/src/test/java/org/hyperledger/besu/evm/internal/CodeCacheTest.java +++ b/evm/src/test/java/org/hyperledger/besu/evm/internal/CodeCacheTest.java @@ -17,7 +17,8 @@ package org.hyperledger.besu.evm.internal; import static org.assertj.core.api.Assertions.assertThat; import org.hyperledger.besu.evm.Code; -import org.hyperledger.besu.evm.code.CodeFactory; +import org.hyperledger.besu.evm.EVM; +import org.hyperledger.besu.evm.MainnetEVMs; import org.hyperledger.besu.evm.operation.JumpDestOperation; import org.apache.tuweni.bytes.Bytes; @@ -29,10 +30,11 @@ class CodeCacheTest { @Test void testScale() { + EVM evm = MainnetEVMs.pragueEOF(EvmConfiguration.DEFAULT); final Bytes contractBytes = Bytes.fromHexString("0xDEAD" + op + "BEEF" + op + "B0B0" + op + "C0DE" + op + "FACE"); final CodeScale scale = new CodeScale(); - final Code contractCode = CodeFactory.createCode(contractBytes, 0); + final Code contractCode = evm.getCodeUncached(contractBytes); final int weight = scale.weigh(contractCode.getCodeHash(), contractCode); assertThat(weight) .isEqualTo(contractCode.getCodeHash().size() + (contractBytes.size() * 9 + 7) / 8); diff --git a/evm/src/test/java/org/hyperledger/besu/evm/operation/AbstractCreateOperationTest.java b/evm/src/test/java/org/hyperledger/besu/evm/operation/AbstractCreateOperationTest.java index 79f07e11a..3c99bd71f 100644 --- a/evm/src/test/java/org/hyperledger/besu/evm/operation/AbstractCreateOperationTest.java +++ b/evm/src/test/java/org/hyperledger/besu/evm/operation/AbstractCreateOperationTest.java @@ -30,7 +30,6 @@ import org.hyperledger.besu.evm.EVM; import org.hyperledger.besu.evm.MainnetEVMs; import org.hyperledger.besu.evm.account.Account; import org.hyperledger.besu.evm.account.MutableAccount; -import org.hyperledger.besu.evm.code.CodeFactory; import org.hyperledger.besu.evm.code.CodeInvalid; import org.hyperledger.besu.evm.frame.BlockValues; import org.hyperledger.besu.evm.frame.ExceptionalHaltReason; @@ -166,7 +165,7 @@ class AbstractCreateOperationTest { .sender(Address.fromHexString(SENDER)) .value(Wei.ZERO) .apparentValue(Wei.ZERO) - .code(CodeFactory.createCode(SIMPLE_CREATE, 0)) + .code(evm.getCodeUncached(SIMPLE_CREATE)) .completer(__ -> {}) .address(Address.fromHexString(SENDER)) .blockHashLookup(n -> Hash.hash(Words.longBytes(n))) @@ -197,7 +196,7 @@ class AbstractCreateOperationTest { operation.execute(messageFrame, evm); final MessageFrame createFrame = messageFrameStack.peek(); final ContractCreationProcessor ccp = - new ContractCreationProcessor(evm.getGasCalculator(), evm, false, List.of(), 0, List.of()); + new ContractCreationProcessor(evm, false, List.of(), 0, List.of()); ccp.process(createFrame, OperationTracer.NO_TRACING); } diff --git a/evm/src/test/java/org/hyperledger/besu/evm/operations/Create2OperationTest.java b/evm/src/test/java/org/hyperledger/besu/evm/operations/Create2OperationTest.java index eb04ccb74..73a4abd34 100644 --- a/evm/src/test/java/org/hyperledger/besu/evm/operations/Create2OperationTest.java +++ b/evm/src/test/java/org/hyperledger/besu/evm/operations/Create2OperationTest.java @@ -29,7 +29,6 @@ import org.hyperledger.besu.evm.Code; import org.hyperledger.besu.evm.EVM; import org.hyperledger.besu.evm.MainnetEVMs; import org.hyperledger.besu.evm.account.MutableAccount; -import org.hyperledger.besu.evm.code.CodeFactory; import org.hyperledger.besu.evm.frame.BlockValues; import org.hyperledger.besu.evm.frame.MessageFrame; import org.hyperledger.besu.evm.gascalculator.ConstantinopleGasCalculator; @@ -58,7 +57,7 @@ public class Create2OperationTest { private MessageFrame messageFrame; private final WorldUpdater worldUpdater = mock(WorldUpdater.class); private final MutableAccount account = mock(MutableAccount.class); - private final EVM evm = mock(EVM.class); + private final EVM evm = MainnetEVMs.pragueEOF(EvmConfiguration.DEFAULT); private final MutableAccount newAccount = mock(MutableAccount.class); private final Create2Operation operation = @@ -154,7 +153,7 @@ public class Create2OperationTest { .sender(Address.fromHexString(sender)) .value(Wei.ZERO) .apparentValue(Wei.ZERO) - .code(CodeFactory.createCode(codeBytes, 0)) + .code(evm.getCodeUncached(codeBytes)) .completer(__ -> {}) .address(Address.fromHexString(sender)) .blockHashLookup(n -> Hash.hash(Words.longBytes(n))) @@ -175,8 +174,6 @@ public class Create2OperationTest { when(account.getBalance()).thenReturn(Wei.ZERO); when(worldUpdater.getAccount(any())).thenReturn(account); when(worldUpdater.updater()).thenReturn(worldUpdater); - when(evm.getCode(any(), any())) - .thenAnswer(invocation -> CodeFactory.createCode(invocation.getArgument(1), 0)); } @ParameterizedTest @@ -190,7 +187,7 @@ public class Create2OperationTest { setUp(sender, salt, code); final Address targetContractAddress = operation.targetContractAddress( - messageFrame, CodeFactory.createCode(Bytes.fromHexString(code), 0)); + messageFrame, evm.getCodeUncached(Bytes.fromHexString(code))); assertThat(targetContractAddress).isEqualTo(Address.fromHexString(expectedAddress)); } @@ -224,11 +221,11 @@ public class Create2OperationTest { when(newAccount.isStorageEmpty()).thenReturn(true); when(worldUpdater.updater()).thenReturn(worldUpdater); - final EVM evm = MainnetEVMs.shanghai(DEV_NET_CHAIN_ID, EvmConfiguration.DEFAULT); - var result = maxInitCodeOperation.execute(messageFrame, evm); + final EVM myEVM = MainnetEVMs.shanghai(DEV_NET_CHAIN_ID, EvmConfiguration.DEFAULT); + var result = maxInitCodeOperation.execute(messageFrame, myEVM); final MessageFrame createFrame = messageFrame.getMessageFrameStack().peek(); final ContractCreationProcessor ccp = - new ContractCreationProcessor(evm.getGasCalculator(), evm, false, List.of(), 0, List.of()); + new ContractCreationProcessor(myEVM, false, List.of(), 0, List.of()); ccp.process(createFrame, OperationTracer.NO_TRACING); final Log log = createFrame.getLogs().get(0); @@ -268,7 +265,7 @@ public class Create2OperationTest { .sender(Address.fromHexString(SENDER)) .value(Wei.ZERO) .apparentValue(Wei.ZERO) - .code(CodeFactory.createCode(SIMPLE_CREATE, 0)) + .code(evm.getCodeUncached(SIMPLE_CREATE)) .completer(__ -> {}) .address(Address.fromHexString(SENDER)) .blockHashLookup(n -> Hash.hash(Words.longBytes(n))) @@ -298,7 +295,7 @@ public class Create2OperationTest { final UInt256 memoryOffset = UInt256.fromHexString("0xFF"); final UInt256 memoryLength = UInt256.valueOf(SIMPLE_CREATE.size()); - Code eofCode = CodeFactory.createCode(SIMPLE_EOF, 1); + Code eofCode = evm.getCodeUncached(SIMPLE_EOF); assertThat(eofCode.isValid()).isTrue(); final MessageFrame messageFrame = @@ -315,7 +312,6 @@ public class Create2OperationTest { when(account.getBalance()).thenReturn(Wei.ZERO); when(worldUpdater.getAccount(any())).thenReturn(account); - final EVM evm = MainnetEVMs.cancun(DEV_NET_CHAIN_ID, EvmConfiguration.DEFAULT); var result = operation.execute(messageFrame, evm); assertThat(result.getHaltReason()).isEqualTo(INVALID_OPERATION); assertThat(messageFrame.getStackItem(0).trimLeadingZeros()).isEqualTo(Bytes.EMPTY); diff --git a/evm/src/test/java/org/hyperledger/besu/evm/operations/CreateOperationTest.java b/evm/src/test/java/org/hyperledger/besu/evm/operations/CreateOperationTest.java index d95875e49..4fa5a0fdd 100644 --- a/evm/src/test/java/org/hyperledger/besu/evm/operations/CreateOperationTest.java +++ b/evm/src/test/java/org/hyperledger/besu/evm/operations/CreateOperationTest.java @@ -28,7 +28,6 @@ import org.hyperledger.besu.datatypes.Wei; import org.hyperledger.besu.evm.EVM; import org.hyperledger.besu.evm.MainnetEVMs; import org.hyperledger.besu.evm.account.MutableAccount; -import org.hyperledger.besu.evm.code.CodeFactory; import org.hyperledger.besu.evm.frame.BlockValues; import org.hyperledger.besu.evm.frame.MessageFrame; import org.hyperledger.besu.evm.gascalculator.ConstantinopleGasCalculator; @@ -59,6 +58,7 @@ class CreateOperationTest { private final CreateOperation maxInitCodeOperation = new CreateOperation( new ConstantinopleGasCalculator(), MainnetEVMs.SHANGHAI_INIT_CODE_SIZE_LIMIT); + private final EVM evm = MainnetEVMs.pragueEOF(EvmConfiguration.DEFAULT); private static final String TOPIC = "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"; // 32 FFs @@ -102,7 +102,7 @@ class CreateOperationTest { operation.execute(messageFrame, evm); final MessageFrame createFrame = messageFrame.getMessageFrameStack().peek(); final ContractCreationProcessor ccp = - new ContractCreationProcessor(evm.getGasCalculator(), evm, false, List.of(), 0, List.of()); + new ContractCreationProcessor(evm, false, List.of(), 0, List.of()); ccp.process(createFrame, OperationTracer.NO_TRACING); final Log log = createFrame.getLogs().get(0); @@ -194,7 +194,7 @@ class CreateOperationTest { var result = maxInitCodeOperation.execute(messageFrame, evm); final MessageFrame createFrame = messageFrame.getMessageFrameStack().peek(); final ContractCreationProcessor ccp = - new ContractCreationProcessor(evm.getGasCalculator(), evm, false, List.of(), 0, List.of()); + new ContractCreationProcessor(evm, false, List.of(), 0, List.of()); ccp.process(createFrame, OperationTracer.NO_TRACING); final Log log = createFrame.getLogs().get(0); @@ -229,7 +229,7 @@ class CreateOperationTest { final UInt256 memoryLength = UInt256.valueOf(SIMPLE_CREATE.size()); final MessageFrame messageFrame = new TestMessageFrameBuilder() - .code(CodeFactory.createCode(SIMPLE_EOF, 1)) + .code(evm.getCodeUncached(SIMPLE_EOF)) .pushStackItem(memoryLength) .pushStackItem(memoryOffset) .pushStackItem(Bytes.EMPTY) @@ -261,7 +261,7 @@ class CreateOperationTest { .sender(Address.fromHexString(SENDER)) .value(Wei.ZERO) .apparentValue(Wei.ZERO) - .code(CodeFactory.createCode(SIMPLE_CREATE, 0)) + .code(evm.getCodeUncached(SIMPLE_CREATE)) .completer(__ -> {}) .address(Address.fromHexString(SENDER)) .blockHashLookup(n -> Hash.hash(Words.longBytes(n))) diff --git a/evm/src/test/java/org/hyperledger/besu/evm/operations/EofCreateOperationTest.java b/evm/src/test/java/org/hyperledger/besu/evm/operations/EofCreateOperationTest.java index 2e41b4966..c0a7f2bcc 100644 --- a/evm/src/test/java/org/hyperledger/besu/evm/operations/EofCreateOperationTest.java +++ b/evm/src/test/java/org/hyperledger/besu/evm/operations/EofCreateOperationTest.java @@ -29,7 +29,6 @@ import org.hyperledger.besu.evm.Code; import org.hyperledger.besu.evm.EVM; import org.hyperledger.besu.evm.MainnetEVMs; import org.hyperledger.besu.evm.account.MutableAccount; -import org.hyperledger.besu.evm.code.CodeFactory; import org.hyperledger.besu.evm.code.CodeInvalid; import org.hyperledger.besu.evm.frame.BlockValues; import org.hyperledger.besu.evm.frame.MessageFrame; @@ -63,7 +62,8 @@ class EofCreateOperationTest { @Test void innerContractIsCorrect() { - Code code = CodeFactory.createCode(INNER_CONTRACT, 1); + final EVM evm = MainnetEVMs.pragueEOF(EvmConfiguration.DEFAULT); + Code code = evm.getCodeUncached(INNER_CONTRACT); assertThat(code.isValid()).isTrue(); final MessageFrame messageFrame = testMemoryFrame(code, CALL_DATA); @@ -78,11 +78,10 @@ class EofCreateOperationTest { when(newAccount.isStorageEmpty()).thenReturn(true); when(worldUpdater.updater()).thenReturn(worldUpdater); - final EVM evm = MainnetEVMs.pragueEOF(EvmConfiguration.DEFAULT); final MessageFrame createFrame = messageFrame.getMessageFrameStack().peek(); assertThat(createFrame).isNotNull(); final ContractCreationProcessor ccp = - new ContractCreationProcessor(evm.getGasCalculator(), evm, false, List.of(), 0, List.of()); + new ContractCreationProcessor(evm, false, List.of(), 0, List.of()); ccp.process(createFrame, OperationTracer.NO_TRACING); final Log log = createFrame.getLogs().get(0); @@ -93,8 +92,9 @@ class EofCreateOperationTest { @Test void eofCreatePassesInCallData() { Bytes outerContract = EOF_CREATE_CONTRACT; + final EVM evm = MainnetEVMs.pragueEOF(EvmConfiguration.DEFAULT); - Code code = CodeFactory.createCode(outerContract, 1); + Code code = evm.getCodeUncached(outerContract); if (!code.isValid()) { System.out.println(outerContract); fail(((CodeInvalid) code).getInvalidReason()); @@ -112,13 +112,12 @@ class EofCreateOperationTest { when(newAccount.isStorageEmpty()).thenReturn(true); when(worldUpdater.updater()).thenReturn(worldUpdater); - final EVM evm = MainnetEVMs.pragueEOF(EvmConfiguration.DEFAULT); var precompiles = MainnetPrecompiledContracts.prague(evm.getGasCalculator()); final MessageFrame createFrame = messageFrame.getMessageFrameStack().peek(); assertThat(createFrame).isNotNull(); final MessageCallProcessor mcp = new MessageCallProcessor(evm, precompiles); final ContractCreationProcessor ccp = - new ContractCreationProcessor(evm.getGasCalculator(), evm, false, List.of(), 0, List.of()); + new ContractCreationProcessor(evm, false, List.of(), 0, List.of()); while (!createFrame.getMessageFrameStack().isEmpty()) { var frame = createFrame.getMessageFrameStack().peek(); assert frame != null; diff --git a/evm/src/test/java/org/hyperledger/besu/evm/operations/ExtCallOperationTest.java b/evm/src/test/java/org/hyperledger/besu/evm/operations/ExtCallOperationTest.java index 3a2ddde7e..984ce2802 100644 --- a/evm/src/test/java/org/hyperledger/besu/evm/operations/ExtCallOperationTest.java +++ b/evm/src/test/java/org/hyperledger/besu/evm/operations/ExtCallOperationTest.java @@ -23,11 +23,12 @@ import org.hyperledger.besu.datatypes.Address; import org.hyperledger.besu.datatypes.Wei; import org.hyperledger.besu.evm.Code; import org.hyperledger.besu.evm.EVM; +import org.hyperledger.besu.evm.MainnetEVMs; import org.hyperledger.besu.evm.account.MutableAccount; -import org.hyperledger.besu.evm.code.CodeFactory; import org.hyperledger.besu.evm.frame.ExceptionalHaltReason; import org.hyperledger.besu.evm.frame.MessageFrame; import org.hyperledger.besu.evm.gascalculator.PragueEOFGasCalculator; +import org.hyperledger.besu.evm.internal.EvmConfiguration; import org.hyperledger.besu.evm.operation.AbstractExtCallOperation; import org.hyperledger.besu.evm.operation.ExtCallOperation; import org.hyperledger.besu.evm.testutils.TestMessageFrameBuilder; @@ -45,11 +46,11 @@ public class ExtCallOperationTest { private final WorldUpdater worldUpdater = mock(WorldUpdater.class); private final MutableAccount account = mock(MutableAccount.class); - private final EVM evm = mock(EVM.class); + private static final EVM EOF_EVM = MainnetEVMs.pragueEOF(EvmConfiguration.DEFAULT); public static final Code SIMPLE_EOF = - CodeFactory.createCode(Bytes.fromHexString("0xEF00010100040200010001040000000080000000"), 1); + EOF_EVM.getCodeUncached(Bytes.fromHexString("0xEF00010100040200010001040000000080000000")); public static final Code INVALID_EOF = - CodeFactory.createCode(Bytes.fromHexString("0xEF00010100040200010001040000000080000023"), 1); + EOF_EVM.getCodeUncached(Bytes.fromHexString("0xEF00010100040200010001040000000080000023")); private static final Address CONTRACT_ADDRESS = Address.fromHexString("0xc0de"); static Iterable data() { @@ -130,12 +131,13 @@ public class ExtCallOperationTest { messageFrame.warmUpAddress(CONTRACT_ADDRESS); } when(account.getBalance()).thenReturn(Wei.ZERO); + when(account.getCodeHash()).thenReturn((validCode ? SIMPLE_EOF : INVALID_EOF).getCodeHash()); + when(account.getCode()).thenReturn((validCode ? SIMPLE_EOF : INVALID_EOF).getBytes()); when(worldUpdater.get(any())).thenReturn(account); when(worldUpdater.getAccount(any())).thenReturn(account); when(worldUpdater.updater()).thenReturn(worldUpdater); - when(evm.getCode(any(), any())).thenReturn(validCode ? SIMPLE_EOF : INVALID_EOF); - var result = operation.execute(messageFrame, evm); + var result = operation.execute(messageFrame, EOF_EVM); assertThat(result.getGasCost()).isEqualTo(chargedGas); assertThat(result.getHaltReason()).isEqualTo(haltReason); @@ -218,12 +220,13 @@ public class ExtCallOperationTest { .build(); messageFrame.warmUpAddress(CONTRACT_ADDRESS); when(account.getBalance()).thenReturn(valueWeiHave); + when(account.getCodeHash()).thenReturn(SIMPLE_EOF.getCodeHash()); + when(account.getCode()).thenReturn(SIMPLE_EOF.getBytes()); when(worldUpdater.get(any())).thenReturn(account); when(worldUpdater.getAccount(any())).thenReturn(account); when(worldUpdater.updater()).thenReturn(worldUpdater); - when(evm.getCode(any(), any())).thenReturn(SIMPLE_EOF); - var result = operation.execute(messageFrame, evm); + var result = operation.execute(messageFrame, EOF_EVM); assertThat(result.getGasCost()).isEqualTo(chargedGas); assertThat(result.getHaltReason()).isEqualTo(haltReason); @@ -251,15 +254,16 @@ public class ExtCallOperationTest { .build(); messageFrame.warmUpAddress(CONTRACT_ADDRESS); when(account.getBalance()).thenReturn(Wei.ZERO); + when(account.getCodeHash()).thenReturn(SIMPLE_EOF.getCodeHash()); + when(account.getCode()).thenReturn(SIMPLE_EOF.getBytes()); when(worldUpdater.get(any())).thenReturn(account); when(worldUpdater.getAccount(any())).thenReturn(account); when(worldUpdater.updater()).thenReturn(worldUpdater); - when(evm.getCode(any(), any())).thenReturn(SIMPLE_EOF); while (messageFrame.getDepth() < 1024) { messageFrame.getMessageFrameStack().add(messageFrame); } - var result = operation.execute(messageFrame, evm); + var result = operation.execute(messageFrame, EOF_EVM); assertThat(result.getGasCost()).isEqualTo(100); assertThat(result.getHaltReason()).isNull(); diff --git a/evm/src/test/java/org/hyperledger/besu/evm/operations/ExtDelegateCallOperationTest.java b/evm/src/test/java/org/hyperledger/besu/evm/operations/ExtDelegateCallOperationTest.java index 7a4665403..d83e9f3dd 100644 --- a/evm/src/test/java/org/hyperledger/besu/evm/operations/ExtDelegateCallOperationTest.java +++ b/evm/src/test/java/org/hyperledger/besu/evm/operations/ExtDelegateCallOperationTest.java @@ -23,11 +23,12 @@ import org.hyperledger.besu.datatypes.Address; import org.hyperledger.besu.datatypes.Wei; import org.hyperledger.besu.evm.Code; import org.hyperledger.besu.evm.EVM; +import org.hyperledger.besu.evm.MainnetEVMs; import org.hyperledger.besu.evm.account.MutableAccount; -import org.hyperledger.besu.evm.code.CodeFactory; import org.hyperledger.besu.evm.frame.ExceptionalHaltReason; import org.hyperledger.besu.evm.frame.MessageFrame; import org.hyperledger.besu.evm.gascalculator.PragueEOFGasCalculator; +import org.hyperledger.besu.evm.internal.EvmConfiguration; import org.hyperledger.besu.evm.operation.AbstractExtCallOperation; import org.hyperledger.besu.evm.operation.ExtDelegateCallOperation; import org.hyperledger.besu.evm.testutils.TestMessageFrameBuilder; @@ -46,13 +47,13 @@ public class ExtDelegateCallOperationTest { private final WorldUpdater worldUpdater = mock(WorldUpdater.class); private final MutableAccount account = mock(MutableAccount.class); // private final MutableAccount targetAccount = mock(MutableAccount.class); - private final EVM evm = mock(EVM.class); + private static final EVM EOF_EVM = MainnetEVMs.pragueEOF(EvmConfiguration.DEFAULT); public static final Code SIMPLE_EOF = - CodeFactory.createCode(Bytes.fromHexString("0xEF00010100040200010001040000000080000000"), 1); - public static final Code SIMPLE_LEGACY = CodeFactory.createCode(Bytes.fromHexString("0x00"), 1); - public static final Code EMPTY_CODE = CodeFactory.createCode(Bytes.fromHexString(""), 1); + EOF_EVM.getCodeUncached(Bytes.fromHexString("0xEF00010100040200010001040000000080000000")); + public static final Code SIMPLE_LEGACY = EOF_EVM.getCodeUncached(Bytes.fromHexString("0x00")); + public static final Code EMPTY_CODE = EOF_EVM.getCodeUncached(Bytes.fromHexString("")); public static final Code INVALID_EOF = - CodeFactory.createCode(Bytes.fromHexString("0xEF00010100040200010001040000000080000023"), 1); + EOF_EVM.getCodeUncached(Bytes.fromHexString("0xEF00010100040200010001040000000080000023")); private static final Address CONTRACT_ADDRESS = Address.fromHexString("0xc0de"); static Iterable data() { @@ -134,12 +135,13 @@ public class ExtDelegateCallOperationTest { messageFrame.warmUpAddress(CONTRACT_ADDRESS); } when(account.getBalance()).thenReturn(Wei.ZERO); + when(account.getCodeHash()).thenReturn((validCode ? SIMPLE_EOF : INVALID_EOF).getCodeHash()); + when(account.getCode()).thenReturn((validCode ? SIMPLE_EOF : INVALID_EOF).getBytes()); when(worldUpdater.get(any())).thenReturn(account); when(worldUpdater.getAccount(any())).thenReturn(account); when(worldUpdater.updater()).thenReturn(worldUpdater); - when(evm.getCode(any(), any())).thenReturn(validCode ? SIMPLE_EOF : INVALID_EOF); - var result = operation.execute(messageFrame, evm); + var result = operation.execute(messageFrame, EOF_EVM); assertThat(result.getGasCost()).isEqualTo(chargedGas); assertThat(result.getHaltReason()).isEqualTo(haltReason); @@ -195,20 +197,22 @@ public class ExtDelegateCallOperationTest { when(worldUpdater.get(TestMessageFrameBuilder.DEFAUT_ADDRESS)).thenReturn(account); when(worldUpdater.getAccount(TestMessageFrameBuilder.DEFAUT_ADDRESS)).thenReturn(account); + Code code = + switch (name) { + case "EOF" -> SIMPLE_EOF; + case "Legacy" -> SIMPLE_LEGACY; + default -> EMPTY_CODE; + }; + when(account.getBalance()).thenReturn(Wei.ZERO); + when(account.getCodeHash()).thenReturn(code.getCodeHash()); + when(account.getCode()).thenReturn(code.getBytes()); when(worldUpdater.get(CONTRACT_ADDRESS)).thenReturn("Empty".equals(name) ? null : account); when(worldUpdater.getAccount(CONTRACT_ADDRESS)) .thenReturn("Empty".equals(name) ? null : account); - when(evm.getCode(any(), any())) - .thenReturn( - switch (name) { - case "EOF" -> SIMPLE_EOF; - case "Legacy" -> SIMPLE_LEGACY; - default -> EMPTY_CODE; - }); when(worldUpdater.updater()).thenReturn(worldUpdater); - var result = operation.execute(messageFrame, evm); + var result = operation.execute(messageFrame, EOF_EVM); assertThat(result.getGasCost()).isEqualTo(chargedGas); assertThat(result.getHaltReason()).isEqualTo(haltReason); @@ -235,15 +239,16 @@ public class ExtDelegateCallOperationTest { .build(); messageFrame.warmUpAddress(CONTRACT_ADDRESS); when(account.getBalance()).thenReturn(Wei.ZERO); + when(account.getCodeHash()).thenReturn(SIMPLE_EOF.getCodeHash()); + when(account.getCode()).thenReturn(SIMPLE_EOF.getBytes()); when(worldUpdater.get(any())).thenReturn(account); when(worldUpdater.getAccount(any())).thenReturn(account); when(worldUpdater.updater()).thenReturn(worldUpdater); - when(evm.getCode(any(), any())).thenReturn(SIMPLE_EOF); while (messageFrame.getDepth() < 1024) { messageFrame.getMessageFrameStack().add(messageFrame); } - var result = operation.execute(messageFrame, evm); + var result = operation.execute(messageFrame, EOF_EVM); assertThat(result.getGasCost()).isEqualTo(100); assertThat(result.getHaltReason()).isNull(); diff --git a/evm/src/test/java/org/hyperledger/besu/evm/operations/ExtStaticCallOperationTest.java b/evm/src/test/java/org/hyperledger/besu/evm/operations/ExtStaticCallOperationTest.java index 25be1d1df..76f267ec5 100644 --- a/evm/src/test/java/org/hyperledger/besu/evm/operations/ExtStaticCallOperationTest.java +++ b/evm/src/test/java/org/hyperledger/besu/evm/operations/ExtStaticCallOperationTest.java @@ -23,11 +23,12 @@ import org.hyperledger.besu.datatypes.Address; import org.hyperledger.besu.datatypes.Wei; import org.hyperledger.besu.evm.Code; import org.hyperledger.besu.evm.EVM; +import org.hyperledger.besu.evm.MainnetEVMs; import org.hyperledger.besu.evm.account.MutableAccount; -import org.hyperledger.besu.evm.code.CodeFactory; import org.hyperledger.besu.evm.frame.ExceptionalHaltReason; import org.hyperledger.besu.evm.frame.MessageFrame; import org.hyperledger.besu.evm.gascalculator.PragueEOFGasCalculator; +import org.hyperledger.besu.evm.internal.EvmConfiguration; import org.hyperledger.besu.evm.operation.AbstractExtCallOperation; import org.hyperledger.besu.evm.operation.ExtStaticCallOperation; import org.hyperledger.besu.evm.testutils.TestMessageFrameBuilder; @@ -45,11 +46,11 @@ public class ExtStaticCallOperationTest { private final WorldUpdater worldUpdater = mock(WorldUpdater.class); private final MutableAccount account = mock(MutableAccount.class); - private final EVM evm = mock(EVM.class); + private static final EVM EOF_EVM = MainnetEVMs.pragueEOF(EvmConfiguration.DEFAULT); public static final Code SIMPLE_EOF = - CodeFactory.createCode(Bytes.fromHexString("0xEF00010100040200010001040000000080000000"), 1); + EOF_EVM.getCodeUncached(Bytes.fromHexString("0xEF00010100040200010001040000000080000000")); public static final Code INVALID_EOF = - CodeFactory.createCode(Bytes.fromHexString("0xEF00010100040200010001040000000080000023"), 1); + EOF_EVM.getCodeUncached(Bytes.fromHexString("0xEF00010100040200010001040000000080000023")); private static final Address CONTRACT_ADDRESS = Address.fromHexString("0xc0de"); static Iterable data() { @@ -130,12 +131,13 @@ public class ExtStaticCallOperationTest { messageFrame.warmUpAddress(CONTRACT_ADDRESS); } when(account.getBalance()).thenReturn(Wei.ZERO); + when(account.getCodeHash()).thenReturn((validCode ? SIMPLE_EOF : INVALID_EOF).getCodeHash()); + when(account.getCode()).thenReturn((validCode ? SIMPLE_EOF : INVALID_EOF).getBytes()); when(worldUpdater.get(any())).thenReturn(account); when(worldUpdater.getAccount(any())).thenReturn(account); when(worldUpdater.updater()).thenReturn(worldUpdater); - when(evm.getCode(any(), any())).thenReturn(validCode ? SIMPLE_EOF : INVALID_EOF); - var result = operation.execute(messageFrame, evm); + var result = operation.execute(messageFrame, EOF_EVM); assertThat(result.getGasCost()).isEqualTo(chargedGas); assertThat(result.getHaltReason()).isEqualTo(haltReason); @@ -162,15 +164,16 @@ public class ExtStaticCallOperationTest { .build(); messageFrame.warmUpAddress(CONTRACT_ADDRESS); when(account.getBalance()).thenReturn(Wei.ZERO); + when(account.getCodeHash()).thenReturn(SIMPLE_EOF.getCodeHash()); + when(account.getCode()).thenReturn(SIMPLE_EOF.getBytes()); when(worldUpdater.get(any())).thenReturn(account); when(worldUpdater.getAccount(any())).thenReturn(account); when(worldUpdater.updater()).thenReturn(worldUpdater); - when(evm.getCode(any(), any())).thenReturn(SIMPLE_EOF); while (messageFrame.getDepth() < 1024) { messageFrame.getMessageFrameStack().add(messageFrame); } - var result = operation.execute(messageFrame, evm); + var result = operation.execute(messageFrame, EOF_EVM); assertThat(result.getGasCost()).isEqualTo(100); assertThat(result.getHaltReason()).isNull(); diff --git a/evm/src/test/java/org/hyperledger/besu/evm/operations/JumpOperationTest.java b/evm/src/test/java/org/hyperledger/besu/evm/operations/JumpOperationTest.java index e04b0d16f..3c466422e 100644 --- a/evm/src/test/java/org/hyperledger/besu/evm/operations/JumpOperationTest.java +++ b/evm/src/test/java/org/hyperledger/besu/evm/operations/JumpOperationTest.java @@ -18,17 +18,14 @@ import static org.assertj.core.api.Assertions.assertThat; import org.hyperledger.besu.datatypes.Address; import org.hyperledger.besu.evm.EVM; -import org.hyperledger.besu.evm.EvmSpecVersion; -import org.hyperledger.besu.evm.code.CodeFactory; +import org.hyperledger.besu.evm.MainnetEVMs; import org.hyperledger.besu.evm.frame.BlockValues; import org.hyperledger.besu.evm.frame.ExceptionalHaltReason; import org.hyperledger.besu.evm.frame.MessageFrame; import org.hyperledger.besu.evm.gascalculator.IstanbulGasCalculator; import org.hyperledger.besu.evm.internal.EvmConfiguration; -import org.hyperledger.besu.evm.operation.JumpDestOperation; import org.hyperledger.besu.evm.operation.JumpOperation; import org.hyperledger.besu.evm.operation.Operation.OperationResult; -import org.hyperledger.besu.evm.operation.OperationRegistry; import org.hyperledger.besu.evm.testutils.FakeBlockValues; import org.hyperledger.besu.evm.testutils.TestMessageFrameBuilder; @@ -46,7 +43,8 @@ class JumpOperationTest { private static final int CURRENT_PC = 1; - private Address address; + private final Address address = + Address.fromHexString("0xc0dec0dec0dec0dec0dec0dec0dec0dec0dec0de"); private EVM evm; private TestMessageFrameBuilder createMessageFrameBuilder(final long initialGas) { @@ -59,12 +57,7 @@ class JumpOperationTest { @BeforeEach void init() { - address = Address.fromHexString("0x18675309"); - - final OperationRegistry registry = new OperationRegistry(); - registry.put(new JumpOperation(gasCalculator)); - registry.put(new JumpDestOperation(gasCalculator)); - evm = new EVM(registry, gasCalculator, EvmConfiguration.DEFAULT, EvmSpecVersion.PARIS); + evm = MainnetEVMs.pragueEOF(EvmConfiguration.DEFAULT); } @Test @@ -74,7 +67,7 @@ class JumpOperationTest { final MessageFrame frame = createMessageFrameBuilder(10_000L) .pushStackItem(UInt256.fromHexString("0x03")) - .code(CodeFactory.createCode(jumpBytes, 0)) + .code(evm.getCodeUncached(jumpBytes)) .build(); frame.setPC(CURRENT_PC); @@ -89,7 +82,7 @@ class JumpOperationTest { final MessageFrame frame = createMessageFrameBuilder(10_000L) .pushStackItem(UInt256.fromHexString("0x03")) - .code(CodeFactory.createCode(jumpBytes, 0)) + .code(evm.getCodeUncached(jumpBytes)) .build(); frame.setPC(CURRENT_PC); @@ -104,7 +97,7 @@ class JumpOperationTest { final MessageFrame frameDestinationGreaterThanCodeSize = createMessageFrameBuilder(100L) .pushStackItem(UInt256.fromHexString("0xFFFFFFFF")) - .code(CodeFactory.createCode(jumpBytes, 0)) + .code(evm.getCodeUncached(jumpBytes)) .build(); frameDestinationGreaterThanCodeSize.setPC(CURRENT_PC); @@ -114,7 +107,7 @@ class JumpOperationTest { final MessageFrame frameDestinationEqualsToCodeSize = createMessageFrameBuilder(100L) .pushStackItem(UInt256.fromHexString("0x04")) - .code(CodeFactory.createCode(badJump, 0)) + .code(evm.getCodeUncached(badJump)) .build(); frameDestinationEqualsToCodeSize.setPC(CURRENT_PC); @@ -132,7 +125,7 @@ class JumpOperationTest { final MessageFrame longContract = createMessageFrameBuilder(100L) .pushStackItem(UInt256.fromHexString("0x12c")) - .code(CodeFactory.createCode(longCode, 0)) + .code(evm.getCodeUncached(longCode)) .build(); longContract.setPC(255); diff --git a/evm/src/test/java/org/hyperledger/besu/evm/operations/SelfDestructOperationTest.java b/evm/src/test/java/org/hyperledger/besu/evm/operations/SelfDestructOperationTest.java index a87c254b0..3b372f03a 100644 --- a/evm/src/test/java/org/hyperledger/besu/evm/operations/SelfDestructOperationTest.java +++ b/evm/src/test/java/org/hyperledger/besu/evm/operations/SelfDestructOperationTest.java @@ -24,11 +24,12 @@ import org.hyperledger.besu.datatypes.Address; import org.hyperledger.besu.datatypes.Hash; import org.hyperledger.besu.datatypes.Wei; import org.hyperledger.besu.evm.EVM; +import org.hyperledger.besu.evm.MainnetEVMs; import org.hyperledger.besu.evm.account.MutableAccount; -import org.hyperledger.besu.evm.code.CodeFactory; import org.hyperledger.besu.evm.frame.BlockValues; import org.hyperledger.besu.evm.frame.MessageFrame; import org.hyperledger.besu.evm.gascalculator.ConstantinopleGasCalculator; +import org.hyperledger.besu.evm.internal.EvmConfiguration; import org.hyperledger.besu.evm.internal.Words; import org.hyperledger.besu.evm.operation.Operation; import org.hyperledger.besu.evm.operation.SelfDestructOperation; @@ -55,7 +56,7 @@ public class SelfDestructOperationTest { @Mock private WorldUpdater worldUpdater; @Mock private MutableAccount accountOriginator; @Mock private MutableAccount accountBeneficiary; - @Mock private EVM evm; + private final EVM evm = MainnetEVMs.pragueEOF(EvmConfiguration.DEFAULT); private final SelfDestructOperation frontierOperation = new SelfDestructOperation(new ConstantinopleGasCalculator()); @@ -79,7 +80,7 @@ public class SelfDestructOperationTest { .sender(beneficiaryAddress) .value(Wei.ZERO) .apparentValue(Wei.ZERO) - .code(CodeFactory.createCode(SELFDESTRUCT_CODE, 0)) + .code(evm.getCodeUncached(SELFDESTRUCT_CODE)) .completer(__ -> {}) .address(originatorAddress) .blockHashLookup(n -> Hash.hash(Words.longBytes(n))) diff --git a/evm/src/test/java/org/hyperledger/besu/evm/processor/ContractCreationProcessorTest.java b/evm/src/test/java/org/hyperledger/besu/evm/processor/ContractCreationProcessorTest.java index 32f5ecc32..40ef063db 100644 --- a/evm/src/test/java/org/hyperledger/besu/evm/processor/ContractCreationProcessorTest.java +++ b/evm/src/test/java/org/hyperledger/besu/evm/processor/ContractCreationProcessorTest.java @@ -19,27 +19,25 @@ import static org.hyperledger.besu.evm.EOFTestConstants.EOF_CREATE_CONTRACT; import static org.hyperledger.besu.evm.EOFTestConstants.INNER_CONTRACT; import static org.hyperledger.besu.evm.frame.MessageFrame.State.COMPLETED_SUCCESS; import static org.hyperledger.besu.evm.frame.MessageFrame.State.EXCEPTIONAL_HALT; -import static org.mockito.Mockito.when; import org.hyperledger.besu.evm.EVM; -import org.hyperledger.besu.evm.code.CodeFactory; +import org.hyperledger.besu.evm.EvmSpecVersion; +import org.hyperledger.besu.evm.MainnetEVMs; import org.hyperledger.besu.evm.contractvalidation.EOFValidationCodeRule; import org.hyperledger.besu.evm.contractvalidation.MaxCodeSizeRule; import org.hyperledger.besu.evm.contractvalidation.PrefixCodeRule; import org.hyperledger.besu.evm.frame.ExceptionalHaltReason; import org.hyperledger.besu.evm.frame.MessageFrame; -import org.hyperledger.besu.evm.gascalculator.GasCalculator; +import org.hyperledger.besu.evm.internal.EvmConfiguration; import org.hyperledger.besu.evm.testutils.TestMessageFrameBuilder; import org.hyperledger.besu.evm.tracing.OperationTracer; import java.util.Collections; import org.apache.tuweni.bytes.Bytes; -import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; -import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; @Nested @@ -47,8 +45,7 @@ import org.mockito.junit.jupiter.MockitoExtension; class ContractCreationProcessorTest extends AbstractMessageProcessorTest { - @Mock GasCalculator gasCalculator; - @Mock EVM evm; + EVM evm = MainnetEVMs.pragueEOF(EvmConfiguration.DEFAULT); private ContractCreationProcessor processor; @@ -56,18 +53,12 @@ class ContractCreationProcessorTest void shouldThrowAnExceptionWhenCodeContractFormatInvalidPreEOF() { processor = new ContractCreationProcessor( - gasCalculator, - evm, - true, - Collections.singletonList(PrefixCodeRule.of()), - 1, - Collections.emptyList()); + evm, true, Collections.singletonList(PrefixCodeRule.of()), 1, Collections.emptyList()); final Bytes contractCode = Bytes.fromHexString("EF01010101010101"); final MessageFrame messageFrame = new TestMessageFrameBuilder().build(); messageFrame.setOutputData(contractCode); - messageFrame.setGasRemaining(100L); + messageFrame.setGasRemaining(10600L); - when(gasCalculator.codeDepositGasCost(contractCode.size())).thenReturn(10L); processor.codeSuccess(messageFrame, OperationTracer.NO_TRACING); assertThat(messageFrame.getState()).isEqualTo(EXCEPTIONAL_HALT); assertThat(messageFrame.getExceptionalHaltReason()) @@ -78,18 +69,12 @@ class ContractCreationProcessorTest void shouldNotThrowAnExceptionWhenCodeContractIsValid() { processor = new ContractCreationProcessor( - gasCalculator, - evm, - true, - Collections.singletonList(PrefixCodeRule.of()), - 1, - Collections.emptyList()); + evm, true, Collections.singletonList(PrefixCodeRule.of()), 1, Collections.emptyList()); final Bytes contractCode = Bytes.fromHexString("0101010101010101"); final MessageFrame messageFrame = new TestMessageFrameBuilder().build(); messageFrame.setOutputData(contractCode); - messageFrame.setGasRemaining(100L); + messageFrame.setGasRemaining(10600L); - when(gasCalculator.codeDepositGasCost(contractCode.size())).thenReturn(10L); processor.codeSuccess(messageFrame, OperationTracer.NO_TRACING); assertThat(messageFrame.getState()).isEqualTo(COMPLETED_SUCCESS); } @@ -98,13 +83,12 @@ class ContractCreationProcessorTest void shouldNotThrowAnExceptionWhenPrefixCodeRuleNotAdded() { processor = new ContractCreationProcessor( - gasCalculator, evm, true, Collections.emptyList(), 1, Collections.emptyList()); + evm, true, Collections.emptyList(), 1, Collections.emptyList()); final Bytes contractCode = Bytes.fromHexString("0F01010101010101"); final MessageFrame messageFrame = new TestMessageFrameBuilder().build(); messageFrame.setOutputData(contractCode); - messageFrame.setGasRemaining(100L); + messageFrame.setGasRemaining(10600L); - when(gasCalculator.codeDepositGasCost(contractCode.size())).thenReturn(10L); processor.codeSuccess(messageFrame, OperationTracer.NO_TRACING); assertThat(messageFrame.getState()).isEqualTo(COMPLETED_SUCCESS); } @@ -113,18 +97,16 @@ class ContractCreationProcessorTest void shouldThrowAnExceptionWhenCodeContractFormatInvalidPostEOF() { processor = new ContractCreationProcessor( - gasCalculator, evm, true, - Collections.singletonList(EOFValidationCodeRule.of(1)), + Collections.singletonList(EOFValidationCodeRule.from(evm)), 1, Collections.emptyList()); final Bytes contractCode = Bytes.fromHexString("EF00010101010101"); final MessageFrame messageFrame = new TestMessageFrameBuilder().build(); messageFrame.setOutputData(contractCode); - messageFrame.setGasRemaining(100L); + messageFrame.setGasRemaining(10600L); - when(gasCalculator.codeDepositGasCost(contractCode.size())).thenReturn(10L); processor.codeSuccess(messageFrame, OperationTracer.NO_TRACING); assertThat(messageFrame.getState()).isEqualTo(EXCEPTIONAL_HALT); assertThat(messageFrame.getExceptionalHaltReason()) @@ -135,18 +117,16 @@ class ContractCreationProcessorTest void eofValidationShouldAllowLegacyDeployFromLegacyInit() { processor = new ContractCreationProcessor( - gasCalculator, evm, true, - Collections.singletonList(EOFValidationCodeRule.of(1)), + Collections.singletonList(EOFValidationCodeRule.from(evm)), 1, Collections.emptyList()); final Bytes contractCode = Bytes.fromHexString("0101010101010101"); final MessageFrame messageFrame = new TestMessageFrameBuilder().build(); messageFrame.setOutputData(contractCode); - messageFrame.setGasRemaining(100L); + messageFrame.setGasRemaining(10600L); - when(gasCalculator.codeDepositGasCost(contractCode.size())).thenReturn(10L); processor.codeSuccess(messageFrame, OperationTracer.NO_TRACING); assertThat(messageFrame.getState()).isEqualTo(COMPLETED_SUCCESS); } @@ -155,19 +135,16 @@ class ContractCreationProcessorTest void eofValidationShouldAllowEOFCode() { processor = new ContractCreationProcessor( - gasCalculator, evm, true, - Collections.singletonList(EOFValidationCodeRule.of(1)), + Collections.singletonList(EOFValidationCodeRule.from(evm)), 1, Collections.emptyList()); - final Bytes contractCode = INNER_CONTRACT; final MessageFrame messageFrame = - new TestMessageFrameBuilder().code(CodeFactory.createCode(EOF_CREATE_CONTRACT, 1)).build(); - messageFrame.setOutputData(contractCode); - messageFrame.setGasRemaining(100L); + new TestMessageFrameBuilder().code(evm.getCodeUncached(EOF_CREATE_CONTRACT)).build(); + messageFrame.setOutputData(INNER_CONTRACT); + messageFrame.setGasRemaining(10600L); - when(gasCalculator.codeDepositGasCost(contractCode.size())).thenReturn(10L); processor.codeSuccess(messageFrame, OperationTracer.NO_TRACING); assertThat(messageFrame.getState()).isEqualTo(COMPLETED_SUCCESS); } @@ -176,18 +153,11 @@ class ContractCreationProcessorTest void prefixValidationShouldPreventEOFCode() { processor = new ContractCreationProcessor( - gasCalculator, - evm, - true, - Collections.singletonList(PrefixCodeRule.of()), - 1, - Collections.emptyList()); - final Bytes contractCode = INNER_CONTRACT; + evm, true, Collections.singletonList(PrefixCodeRule.of()), 1, Collections.emptyList()); final MessageFrame messageFrame = new TestMessageFrameBuilder().build(); - messageFrame.setOutputData(contractCode); - messageFrame.setGasRemaining(100L); + messageFrame.setOutputData(INNER_CONTRACT); + messageFrame.setGasRemaining(10600L); - when(gasCalculator.codeDepositGasCost(contractCode.size())).thenReturn(10L); processor.codeSuccess(messageFrame, OperationTracer.NO_TRACING); assertThat(messageFrame.getState()).isEqualTo(EXCEPTIONAL_HALT); } @@ -196,41 +166,36 @@ class ContractCreationProcessorTest void eofValidationShouldPreventLegacyDeployFromEOFInit() { processor = new ContractCreationProcessor( - gasCalculator, evm, true, - Collections.singletonList(EOFValidationCodeRule.of(1)), + Collections.singletonList(EOFValidationCodeRule.from(evm)), 1, Collections.emptyList()); final Bytes contractCode = Bytes.fromHexString("6030602001"); final Bytes initCode = EOF_CREATE_CONTRACT; final MessageFrame messageFrame = - new TestMessageFrameBuilder().code(CodeFactory.createCode(initCode, 1)).build(); + new TestMessageFrameBuilder().code(evm.getCodeForCreation(initCode)).build(); messageFrame.setOutputData(contractCode); - messageFrame.setGasRemaining(100L); + messageFrame.setGasRemaining(10600L); - when(gasCalculator.codeDepositGasCost(contractCode.size())).thenReturn(10L); processor.codeSuccess(messageFrame, OperationTracer.NO_TRACING); assertThat(messageFrame.getState()).isEqualTo(EXCEPTIONAL_HALT); } @Test - @Disabled("This is what's changing") void eofValidationPreventsEOFDeployFromLegacyInit() { processor = new ContractCreationProcessor( - gasCalculator, evm, true, - Collections.singletonList(EOFValidationCodeRule.of(1)), + Collections.singletonList(EOFValidationCodeRule.from(evm)), 1, Collections.emptyList()); final Bytes contractCode = EOF_CREATE_CONTRACT; final MessageFrame messageFrame = new TestMessageFrameBuilder().build(); messageFrame.setOutputData(contractCode); - messageFrame.setGasRemaining(100L); + messageFrame.setGasRemaining(10600L); - when(gasCalculator.codeDepositGasCost(contractCode.size())).thenReturn(10L); processor.codeSuccess(messageFrame, OperationTracer.NO_TRACING); assertThat(messageFrame.getState()).isEqualTo(EXCEPTIONAL_HALT); } @@ -239,18 +204,17 @@ class ContractCreationProcessorTest void shouldThrowAnExceptionWhenCodeContractTooLarge() { processor = new ContractCreationProcessor( - gasCalculator, evm, true, - Collections.singletonList(MaxCodeSizeRule.of(24 * 1024)), + Collections.singletonList(MaxCodeSizeRule.from(EvmSpecVersion.SPURIOUS_DRAGON)), 1, Collections.emptyList()); - final Bytes contractCode = Bytes.fromHexString("00".repeat(24 * 1024 + 1)); + final Bytes contractCode = + Bytes.fromHexString("00".repeat(EvmSpecVersion.SPURIOUS_DRAGON.getMaxCodeSize() + 1)); final MessageFrame messageFrame = new TestMessageFrameBuilder().build(); messageFrame.setOutputData(contractCode); - messageFrame.setGasRemaining(100L); + messageFrame.setGasRemaining(10_000_000L); - when(gasCalculator.codeDepositGasCost(contractCode.size())).thenReturn(10L); processor.codeSuccess(messageFrame, OperationTracer.NO_TRACING); assertThat(messageFrame.getState()).isEqualTo(EXCEPTIONAL_HALT); assertThat(messageFrame.getExceptionalHaltReason()) @@ -261,18 +225,17 @@ class ContractCreationProcessorTest void shouldNotThrowAnExceptionWhenCodeContractTooLarge() { processor = new ContractCreationProcessor( - gasCalculator, evm, true, - Collections.singletonList(MaxCodeSizeRule.of(24 * 1024)), + Collections.singletonList(MaxCodeSizeRule.from(EvmSpecVersion.SPURIOUS_DRAGON)), 1, Collections.emptyList()); - final Bytes contractCode = Bytes.fromHexString("00".repeat(24 * 1024)); + final Bytes contractCode = + Bytes.fromHexString("00".repeat(EvmSpecVersion.SPURIOUS_DRAGON.getMaxCodeSize())); final MessageFrame messageFrame = new TestMessageFrameBuilder().build(); messageFrame.setOutputData(contractCode); - messageFrame.setGasRemaining(100L); + messageFrame.setGasRemaining(5_000_000L); - when(gasCalculator.codeDepositGasCost(contractCode.size())).thenReturn(10L); processor.codeSuccess(messageFrame, OperationTracer.NO_TRACING); assertThat(messageFrame.getState()).isEqualTo(COMPLETED_SUCCESS); } @@ -281,13 +244,12 @@ class ContractCreationProcessorTest void shouldNotThrowAnExceptionWhenCodeSizeRuleNotAdded() { processor = new ContractCreationProcessor( - gasCalculator, evm, true, Collections.emptyList(), 1, Collections.emptyList()); + evm, true, Collections.emptyList(), 1, Collections.emptyList()); final Bytes contractCode = Bytes.fromHexString("00".repeat(24 * 1024 + 1)); final MessageFrame messageFrame = new TestMessageFrameBuilder().build(); messageFrame.setOutputData(contractCode); - messageFrame.setGasRemaining(100L); + messageFrame.setGasRemaining(5_000_000L); - when(gasCalculator.codeDepositGasCost(contractCode.size())).thenReturn(10L); processor.codeSuccess(messageFrame, OperationTracer.NO_TRACING); assertThat(messageFrame.getState()).isEqualTo(COMPLETED_SUCCESS); } @@ -295,6 +257,6 @@ class ContractCreationProcessorTest @Override protected ContractCreationProcessor getAbstractMessageProcessor() { return new ContractCreationProcessor( - gasCalculator, evm, true, Collections.emptyList(), 1, Collections.emptyList()); + evm, true, Collections.emptyList(), 1, Collections.emptyList()); } } diff --git a/evm/src/test/java/org/hyperledger/besu/evm/toy/EvmToyCommand.java b/evm/src/test/java/org/hyperledger/besu/evm/toy/EvmToyCommand.java index 4fc4d6bf6..fcf26c3c5 100644 --- a/evm/src/test/java/org/hyperledger/besu/evm/toy/EvmToyCommand.java +++ b/evm/src/test/java/org/hyperledger/besu/evm/toy/EvmToyCommand.java @@ -194,8 +194,7 @@ public class EvmToyCommand implements Runnable { .build(); final MessageCallProcessor mcp = new MessageCallProcessor(evm, precompileContractRegistry); - final ContractCreationProcessor ccp = - new ContractCreationProcessor(evm.getGasCalculator(), evm, false, List.of(), 0); + final ContractCreationProcessor ccp = new ContractCreationProcessor(evm, false, List.of(), 0); stopwatch.start(); Deque messageFrameStack = initialMessageFrame.getMessageFrameStack(); while (!messageFrameStack.isEmpty()) { diff --git a/evm/src/test/java/org/hyperledger/besu/evm/tracing/ExtendedOperationTracerTest.java b/evm/src/test/java/org/hyperledger/besu/evm/tracing/ExtendedOperationTracerTest.java index c0db4bfbf..bd043f933 100644 --- a/evm/src/test/java/org/hyperledger/besu/evm/tracing/ExtendedOperationTracerTest.java +++ b/evm/src/test/java/org/hyperledger/besu/evm/tracing/ExtendedOperationTracerTest.java @@ -16,14 +16,14 @@ package org.hyperledger.besu.evm.tracing; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.Mockito.when; import org.hyperledger.besu.evm.EVM; +import org.hyperledger.besu.evm.MainnetEVMs; import org.hyperledger.besu.evm.account.MutableAccount; import org.hyperledger.besu.evm.frame.ExceptionalHaltReason; import org.hyperledger.besu.evm.frame.MessageFrame; -import org.hyperledger.besu.evm.gascalculator.GasCalculator; +import org.hyperledger.besu.evm.internal.EvmConfiguration; import org.hyperledger.besu.evm.processor.ContractCreationProcessor; import org.hyperledger.besu.evm.worldstate.WorldUpdater; @@ -40,8 +40,6 @@ import org.mockito.junit.jupiter.MockitoExtension; @ExtendWith(MockitoExtension.class) class ExtendedOperationTracerTest { - @Mock GasCalculator gasCalculator; - @Mock EVM evm; @Mock MessageFrame frame; @Mock WorldUpdater worldUpdater; @Mock MutableAccount mutableAccount; @@ -49,7 +47,6 @@ class ExtendedOperationTracerTest { @BeforeEach void setUp() { when(frame.getOutputData()).thenReturn(Bytes.EMPTY); - when(gasCalculator.codeDepositGasCost(anyInt())).thenReturn(0L); when(frame.getRemainingGas()).thenReturn(1L); when(frame.getWorldUpdater()).thenReturn(worldUpdater); @@ -58,8 +55,9 @@ class ExtendedOperationTracerTest { @Test void shouldCallTraceAccountCreationResultIfIsExtendedTracing() { + EVM evm = MainnetEVMs.pragueEOF(EvmConfiguration.DEFAULT); final ContractCreationProcessor contractCreationProcessor = - new ContractCreationProcessor(gasCalculator, evm, false, Collections.emptyList(), 0); + new ContractCreationProcessor(evm, false, Collections.emptyList(), 0); final ExtendedOperationTracer tracer = new ExtendedOperationTracer(); contractCreationProcessor.codeSuccess(frame, tracer); @@ -71,8 +69,9 @@ class ExtendedOperationTracerTest { @Test void shouldNotCallTraceAccountCreationResultIfIsNotExtendedTracing() { + EVM evm = MainnetEVMs.pragueEOF(EvmConfiguration.DEFAULT); final ContractCreationProcessor contractCreationProcessor = - new ContractCreationProcessor(gasCalculator, evm, false, Collections.emptyList(), 0); + new ContractCreationProcessor(evm, false, Collections.emptyList(), 0); final DefaultOperationTracer tracer = new DefaultOperationTracer(); contractCreationProcessor.codeSuccess(frame, tracer); From db33b03f8d50f3e5f0f89e1debdec34aa91498ea Mon Sep 17 00:00:00 2001 From: leniram159 Date: Tue, 25 Jun 2024 01:13:33 +0200 Subject: [PATCH 13/58] Fix the wrong 'Identifier' and 'Synchronizer' usage (#7252) * fix the synchronizer usage Signed-off-by: Leni * fix Identifier usage Signed-off-by: Leni --------- Signed-off-by: Leni Co-authored-by: Sally MacFarlane --- .../common/bft/events/BlockTimerExpiry.java | 4 ++-- .../bft/statemachine/BaseBftController.java | 18 +++++++++--------- .../consensus/common/bft/BlockTimerTest.java | 6 +++--- .../ibft/statemachine/IbftController.java | 6 +++--- .../qbft/statemachine/QbftController.java | 6 +++--- 5 files changed, 20 insertions(+), 20 deletions(-) diff --git a/consensus/common/src/main/java/org/hyperledger/besu/consensus/common/bft/events/BlockTimerExpiry.java b/consensus/common/src/main/java/org/hyperledger/besu/consensus/common/bft/events/BlockTimerExpiry.java index 3027e0dca..d57e981ef 100644 --- a/consensus/common/src/main/java/org/hyperledger/besu/consensus/common/bft/events/BlockTimerExpiry.java +++ b/consensus/common/src/main/java/org/hyperledger/besu/consensus/common/bft/events/BlockTimerExpiry.java @@ -41,9 +41,9 @@ public final class BlockTimerExpiry implements BftEvent { /** * Gets round identifier. * - * @return the round indentifier + * @return the round Identifier */ - public ConsensusRoundIdentifier getRoundIndentifier() { + public ConsensusRoundIdentifier getRoundIdentifier() { return roundIdentifier; } diff --git a/consensus/common/src/main/java/org/hyperledger/besu/consensus/common/bft/statemachine/BaseBftController.java b/consensus/common/src/main/java/org/hyperledger/besu/consensus/common/bft/statemachine/BaseBftController.java index e35af1af6..58d579f28 100644 --- a/consensus/common/src/main/java/org/hyperledger/besu/consensus/common/bft/statemachine/BaseBftController.java +++ b/consensus/common/src/main/java/org/hyperledger/besu/consensus/common/bft/statemachine/BaseBftController.java @@ -44,7 +44,7 @@ public abstract class BaseBftController implements BftEventHandler { private final FutureMessageBuffer futureMessageBuffer; private final Gossiper gossiper; private final MessageTracker duplicateMessageTracker; - private final SynchronizerUpdater sychronizerUpdater; + private final SynchronizerUpdater synchronizerUpdater; private final AtomicBoolean started = new AtomicBoolean(false); @@ -56,7 +56,7 @@ public abstract class BaseBftController implements BftEventHandler { * @param gossiper the gossiper * @param duplicateMessageTracker the duplicate message tracker * @param futureMessageBuffer the future message buffer - * @param sychronizerUpdater the synchronizer updater + * @param synchronizerUpdater the synchronizer updater */ protected BaseBftController( final Blockchain blockchain, @@ -64,13 +64,13 @@ public abstract class BaseBftController implements BftEventHandler { final Gossiper gossiper, final MessageTracker duplicateMessageTracker, final FutureMessageBuffer futureMessageBuffer, - final SynchronizerUpdater sychronizerUpdater) { + final SynchronizerUpdater synchronizerUpdater) { this.blockchain = blockchain; this.bftFinalState = bftFinalState; this.futureMessageBuffer = futureMessageBuffer; this.gossiper = gossiper; this.duplicateMessageTracker = duplicateMessageTracker; - this.sychronizerUpdater = sychronizerUpdater; + this.synchronizerUpdater = synchronizerUpdater; } @Override @@ -162,14 +162,14 @@ public abstract class BaseBftController implements BftEventHandler { @Override public void handleBlockTimerExpiry(final BlockTimerExpiry blockTimerExpiry) { - final ConsensusRoundIdentifier roundIndentifier = blockTimerExpiry.getRoundIndentifier(); - if (isMsgForCurrentHeight(roundIndentifier)) { - getCurrentHeightManager().handleBlockTimerExpiry(roundIndentifier); + final ConsensusRoundIdentifier roundIdentifier = blockTimerExpiry.getRoundIdentifier(); + if (isMsgForCurrentHeight(roundIdentifier)) { + getCurrentHeightManager().handleBlockTimerExpiry(roundIdentifier); } else { LOG.trace( "Block timer event discarded as it is not for current block height chainHeight={} eventHeight={}", getCurrentHeightManager().getChainHeight(), - roundIndentifier.getSequenceNumber()); + roundIdentifier.getSequenceNumber()); } } @@ -221,7 +221,7 @@ public abstract class BaseBftController implements BftEventHandler { futureMessageBuffer.addMessage(msgRoundIdentifier.getSequenceNumber(), rawMsg); // Notify the synchronizer the transmitting peer must have the parent block to the received // message's target height. - sychronizerUpdater.updatePeerChainState( + synchronizerUpdater.updatePeerChainState( msgRoundIdentifier.getSequenceNumber() - 1L, rawMsg.getConnection()); } else { LOG.trace( diff --git a/consensus/common/src/test/java/org/hyperledger/besu/consensus/common/bft/BlockTimerTest.java b/consensus/common/src/test/java/org/hyperledger/besu/consensus/common/bft/BlockTimerTest.java index 230261481..70187a4d4 100644 --- a/consensus/common/src/test/java/org/hyperledger/besu/consensus/common/bft/BlockTimerTest.java +++ b/consensus/common/src/test/java/org/hyperledger/besu/consensus/common/bft/BlockTimerTest.java @@ -141,7 +141,7 @@ public class BlockTimerTest { assertThat(eventQueue.size()).isEqualTo(1); final BftEvent queuedEvent = eventQueue.poll(0, TimeUnit.SECONDS); assertThat(queuedEvent).isInstanceOf(BlockTimerExpiry.class); - assertThat(((BlockTimerExpiry) queuedEvent).getRoundIndentifier()) + assertThat(((BlockTimerExpiry) queuedEvent).getRoundIdentifier()) .usingRecursiveComparison() .isEqualTo(round); } @@ -171,7 +171,7 @@ public class BlockTimerTest { verify(mockQueue).add(bftEventCaptor.capture()); assertThat(bftEventCaptor.getValue() instanceof BlockTimerExpiry).isTrue(); - assertThat(((BlockTimerExpiry) bftEventCaptor.getValue()).getRoundIndentifier()) + assertThat(((BlockTimerExpiry) bftEventCaptor.getValue()).getRoundIdentifier()) .usingRecursiveComparison() .isEqualTo(round); } @@ -201,7 +201,7 @@ public class BlockTimerTest { verify(mockQueue).add(bftEventCaptor.capture()); assertThat(bftEventCaptor.getValue() instanceof BlockTimerExpiry).isTrue(); - assertThat(((BlockTimerExpiry) bftEventCaptor.getValue()).getRoundIndentifier()) + assertThat(((BlockTimerExpiry) bftEventCaptor.getValue()).getRoundIdentifier()) .usingRecursiveComparison() .isEqualTo(round); } diff --git a/consensus/ibft/src/main/java/org/hyperledger/besu/consensus/ibft/statemachine/IbftController.java b/consensus/ibft/src/main/java/org/hyperledger/besu/consensus/ibft/statemachine/IbftController.java index c19bd9f19..e2156bd7d 100644 --- a/consensus/ibft/src/main/java/org/hyperledger/besu/consensus/ibft/statemachine/IbftController.java +++ b/consensus/ibft/src/main/java/org/hyperledger/besu/consensus/ibft/statemachine/IbftController.java @@ -46,7 +46,7 @@ public class IbftController extends BaseBftController { * @param gossiper the gossiper * @param duplicateMessageTracker the duplicate message tracker * @param futureMessageBuffer the future message buffer - * @param sychronizerUpdater the synchronizer updater + * @param synchronizerUpdater the synchronizer updater */ public IbftController( final Blockchain blockchain, @@ -55,7 +55,7 @@ public class IbftController extends BaseBftController { final Gossiper gossiper, final MessageTracker duplicateMessageTracker, final FutureMessageBuffer futureMessageBuffer, - final SynchronizerUpdater sychronizerUpdater) { + final SynchronizerUpdater synchronizerUpdater) { super( blockchain, @@ -63,7 +63,7 @@ public class IbftController extends BaseBftController { gossiper, duplicateMessageTracker, futureMessageBuffer, - sychronizerUpdater); + synchronizerUpdater); this.ibftBlockHeightManagerFactory = ibftBlockHeightManagerFactory; } diff --git a/consensus/qbft/src/main/java/org/hyperledger/besu/consensus/qbft/statemachine/QbftController.java b/consensus/qbft/src/main/java/org/hyperledger/besu/consensus/qbft/statemachine/QbftController.java index bd2751ff3..57737542e 100644 --- a/consensus/qbft/src/main/java/org/hyperledger/besu/consensus/qbft/statemachine/QbftController.java +++ b/consensus/qbft/src/main/java/org/hyperledger/besu/consensus/qbft/statemachine/QbftController.java @@ -48,7 +48,7 @@ public class QbftController extends BaseBftController { * @param gossiper the gossiper * @param duplicateMessageTracker the duplicate message tracker * @param futureMessageBuffer the future message buffer - * @param sychronizerUpdater the synchronizer updater + * @param synchronizerUpdater the synchronizer updater * @param bftExtraDataCodec the bft extra data codec */ public QbftController( @@ -58,7 +58,7 @@ public class QbftController extends BaseBftController { final Gossiper gossiper, final MessageTracker duplicateMessageTracker, final FutureMessageBuffer futureMessageBuffer, - final SynchronizerUpdater sychronizerUpdater, + final SynchronizerUpdater synchronizerUpdater, final BftExtraDataCodec bftExtraDataCodec) { super( @@ -67,7 +67,7 @@ public class QbftController extends BaseBftController { gossiper, duplicateMessageTracker, futureMessageBuffer, - sychronizerUpdater); + synchronizerUpdater); this.qbftBlockHeightManagerFactory = qbftBlockHeightManagerFactory; this.bftExtraDataCodec = bftExtraDataCodec; } From 74780b8ef7ccb3951bf8d736a5882f4dda97de34 Mon Sep 17 00:00:00 2001 From: daniellehrner Date: Tue, 25 Jun 2024 02:59:21 +0200 Subject: [PATCH 14/58] Fix flaky SECP256R1 test (#7249) Signed-off-by: Daniel Lehrner Co-authored-by: Sally MacFarlane --- .../tests/acceptance/crypto/SECP256R1AcceptanceTest.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/acceptance-tests/tests/src/test/java/org/hyperledger/besu/tests/acceptance/crypto/SECP256R1AcceptanceTest.java b/acceptance-tests/tests/src/test/java/org/hyperledger/besu/tests/acceptance/crypto/SECP256R1AcceptanceTest.java index 7488b0603..27679463b 100644 --- a/acceptance-tests/tests/src/test/java/org/hyperledger/besu/tests/acceptance/crypto/SECP256R1AcceptanceTest.java +++ b/acceptance-tests/tests/src/test/java/org/hyperledger/besu/tests/acceptance/crypto/SECP256R1AcceptanceTest.java @@ -66,6 +66,12 @@ public class SECP256R1AcceptanceTest extends AcceptanceTestBase { besu.createNodeWithNonDefaultSignatureAlgorithm( "otherNode", GENESIS_FILE, otherNodeKeyPair, List.of(minerNode)); noDiscoveryCluster.addNode(otherNode); + + minerNode.verify(net.awaitPeerCount(1)); + otherNode.verify(net.awaitPeerCount(1)); + + final var minerChainHead = minerNode.execute(ethTransactions.block()); + otherNode.verify(blockchain.minimumHeight(minerChainHead.getNumber().longValue())); } @Test From cfc3e76d650a3d9da9f2aa85ab6d4c7edfaede40 Mon Sep 17 00:00:00 2001 From: Justin Florentine Date: Mon, 24 Jun 2024 21:37:14 -0400 Subject: [PATCH 15/58] update to work with the new max retries value (#7253) Signed-off-by: Justin Florentine Co-authored-by: Sally MacFarlane --- .../ethereum/eth/sync/fastsync/PivotBlockRetrieverTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/sync/fastsync/PivotBlockRetrieverTest.java b/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/sync/fastsync/PivotBlockRetrieverTest.java index 847ef5351..ae96bbf76 100644 --- a/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/sync/fastsync/PivotBlockRetrieverTest.java +++ b/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/sync/fastsync/PivotBlockRetrieverTest.java @@ -288,7 +288,7 @@ public class PivotBlockRetrieverTest { final CompletableFuture future = pivotBlockRetriever.downloadPivotBlockHeader(); peerA.respond(responder); - peerB.respondTimes(emptyResponder, 2); + peerB.respondTimes(emptyResponder, 3); // PeerA should have responded, while peerB is being retried, peerC shouldn't have been queried // yet From 0f2046d4b0eee238d858d7604ad57b4eaa5ac9b8 Mon Sep 17 00:00:00 2001 From: Danno Ferrin Date: Tue, 25 Jun 2024 08:36:42 -0600 Subject: [PATCH 16/58] Temporary CancunEOF fork for EOF testing. (#7227) Add Genesis ("CancunEOFTime") and reference test ("CancunEOF") support for a temporary Cancun+EOF fork, in anticipation of potential devnets. Signed-off-by: Danno Ferrin --- .../org/hyperledger/besu/cli/BesuCommand.java | 1 + .../besu/config/GenesisConfigOptions.java | 7 ++ .../besu/config/JsonGenesisConfigOptions.java | 7 ++ .../besu/config/StubGenesisConfigOptions.java | 21 +++++- .../besu/config/GenesisConfigOptionsTest.java | 8 ++ .../besu/ethereum/chain/GenesisState.java | 10 ++- .../mainnet/MainnetProtocolSpecFactory.java | 5 ++ .../mainnet/MainnetProtocolSpecs.java | 29 ++++++- .../mainnet/ProtocolScheduleBuilder.java | 2 + .../evmtool/MainnetGenesisFileModule.java | 3 + .../evmtool/benchmarks/BenchmarkExecutor.java | 18 +++-- .../besu/evmtool/state-test/create-eof.json | 4 +- .../besu/evmtool/trace/create-eof.json | 2 +- .../ReferenceTestProtocolSchedules.java | 1 + .../hyperledger/besu/evm/EvmSpecVersion.java | 6 ++ .../org/hyperledger/besu/evm/MainnetEVMs.java | 75 +++++++++++++++++++ .../besu/evm/fluent/EVMExecutor.java | 16 ++++ .../besu/evm/fluent/EVMExecutorTest.java | 4 + .../operations/EofCreateOperationTest.java | 4 +- 19 files changed, 207 insertions(+), 16 deletions(-) diff --git a/besu/src/main/java/org/hyperledger/besu/cli/BesuCommand.java b/besu/src/main/java/org/hyperledger/besu/cli/BesuCommand.java index 4262ff964..7e1be15fb 100644 --- a/besu/src/main/java/org/hyperledger/besu/cli/BesuCommand.java +++ b/besu/src/main/java/org/hyperledger/besu/cli/BesuCommand.java @@ -1514,6 +1514,7 @@ public class BesuCommand implements DefaultCommandValues, Runnable { } if (genesisConfigOptionsSupplier.get().getCancunTime().isPresent() + || genesisConfigOptionsSupplier.get().getCancunEOFTime().isPresent() || genesisConfigOptionsSupplier.get().getPragueTime().isPresent() || genesisConfigOptionsSupplier.get().getPragueEOFTime().isPresent()) { if (kzgTrustedSetupFile != null) { diff --git a/config/src/main/java/org/hyperledger/besu/config/GenesisConfigOptions.java b/config/src/main/java/org/hyperledger/besu/config/GenesisConfigOptions.java index 8e47af3b7..849b12118 100644 --- a/config/src/main/java/org/hyperledger/besu/config/GenesisConfigOptions.java +++ b/config/src/main/java/org/hyperledger/besu/config/GenesisConfigOptions.java @@ -242,6 +242,13 @@ public interface GenesisConfigOptions { */ OptionalLong getCancunTime(); + /** + * Gets cancun EOF time. + * + * @return the cancun EOF time + */ + OptionalLong getCancunEOFTime(); + /** * Gets prague time. * diff --git a/config/src/main/java/org/hyperledger/besu/config/JsonGenesisConfigOptions.java b/config/src/main/java/org/hyperledger/besu/config/JsonGenesisConfigOptions.java index d5635d9ae..b418a6785 100644 --- a/config/src/main/java/org/hyperledger/besu/config/JsonGenesisConfigOptions.java +++ b/config/src/main/java/org/hyperledger/besu/config/JsonGenesisConfigOptions.java @@ -288,6 +288,11 @@ public class JsonGenesisConfigOptions implements GenesisConfigOptions { return getOptionalLong("shanghaitime"); } + @Override + public OptionalLong getCancunEOFTime() { + return getOptionalLong("cancuneoftime"); + } + @Override public OptionalLong getCancunTime() { return getOptionalLong("cancuntime"); @@ -461,6 +466,7 @@ public class JsonGenesisConfigOptions implements GenesisConfigOptions { getMergeNetSplitBlockNumber().ifPresent(l -> builder.put("mergeNetSplitBlock", l)); getShanghaiTime().ifPresent(l -> builder.put("shanghaiTime", l)); getCancunTime().ifPresent(l -> builder.put("cancunTime", l)); + getCancunEOFTime().ifPresent(l -> builder.put("cancunEOFTime", l)); getPragueTime().ifPresent(l -> builder.put("pragueTime", l)); getPragueEOFTime().ifPresent(l -> builder.put("pragueEOFTime", l)); getTerminalBlockNumber().ifPresent(l -> builder.put("terminalBlockNumber", l)); @@ -610,6 +616,7 @@ public class JsonGenesisConfigOptions implements GenesisConfigOptions { Stream.of( getShanghaiTime(), getCancunTime(), + getCancunEOFTime(), getPragueTime(), getPragueEOFTime(), getFutureEipsTime(), diff --git a/config/src/main/java/org/hyperledger/besu/config/StubGenesisConfigOptions.java b/config/src/main/java/org/hyperledger/besu/config/StubGenesisConfigOptions.java index 32800f58a..24f333102 100644 --- a/config/src/main/java/org/hyperledger/besu/config/StubGenesisConfigOptions.java +++ b/config/src/main/java/org/hyperledger/besu/config/StubGenesisConfigOptions.java @@ -48,6 +48,7 @@ public class StubGenesisConfigOptions implements GenesisConfigOptions, Cloneable private OptionalLong mergeNetSplitBlockNumber = OptionalLong.empty(); private OptionalLong shanghaiTime = OptionalLong.empty(); private OptionalLong cancunTime = OptionalLong.empty(); + private OptionalLong cancunEOFTime = OptionalLong.empty(); private OptionalLong pragueTime = OptionalLong.empty(); private OptionalLong pragueEOFTime = OptionalLong.empty(); private OptionalLong futureEipsTime = OptionalLong.empty(); @@ -82,7 +83,9 @@ public class StubGenesisConfigOptions implements GenesisConfigOptions, Cloneable private boolean fixedBaseFee = false; /** Default constructor. */ - public StubGenesisConfigOptions() {} + public StubGenesisConfigOptions() { + // Explicit default constructor because of JavaDoc linting + } @Override public StubGenesisConfigOptions clone() { @@ -238,6 +241,11 @@ public class StubGenesisConfigOptions implements GenesisConfigOptions, Cloneable return cancunTime; } + @Override + public OptionalLong getCancunEOFTime() { + return cancunEOFTime; + } + @Override public OptionalLong getPragueTime() { return pragueTime; @@ -630,6 +638,17 @@ public class StubGenesisConfigOptions implements GenesisConfigOptions, Cloneable return this; } + /** + * Cancun EOF time. + * + * @param timestamp the timestamp + * @return the stub genesis config options + */ + public StubGenesisConfigOptions cancunEOFTime(final long timestamp) { + cancunEOFTime = OptionalLong.of(timestamp); + return this; + } + /** * Prague time. * diff --git a/config/src/test/java/org/hyperledger/besu/config/GenesisConfigOptionsTest.java b/config/src/test/java/org/hyperledger/besu/config/GenesisConfigOptionsTest.java index 0e8138e1b..ed313ad6c 100644 --- a/config/src/test/java/org/hyperledger/besu/config/GenesisConfigOptionsTest.java +++ b/config/src/test/java/org/hyperledger/besu/config/GenesisConfigOptionsTest.java @@ -193,6 +193,13 @@ class GenesisConfigOptionsTest { assertThat(config.getCancunTime()).hasValue(1670470142); } + @Test + void shouldGetCancunEOFTime() { + final GenesisConfigOptions config = + fromConfigOptions(singletonMap("cancunEOFTime", 1670470142)); + assertThat(config.getCancunEOFTime()).hasValue(1670470142); + } + @Test void shouldGetPragueTime() { final GenesisConfigOptions config = fromConfigOptions(singletonMap("pragueTime", 1670470143)); @@ -238,6 +245,7 @@ class GenesisConfigOptionsTest { assertThat(config.getMergeNetSplitBlockNumber()).isEmpty(); assertThat(config.getShanghaiTime()).isEmpty(); assertThat(config.getCancunTime()).isEmpty(); + assertThat(config.getCancunEOFTime()).isEmpty(); assertThat(config.getPragueTime()).isEmpty(); assertThat(config.getPragueEOFTime()).isEmpty(); assertThat(config.getFutureEipsTime()).isEmpty(); diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/chain/GenesisState.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/chain/GenesisState.java index e975a01f8..00b20a017 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/chain/GenesisState.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/chain/GenesisState.java @@ -304,7 +304,15 @@ public final class GenesisState { if (cancunTimestamp.isPresent()) { return genesis.getTimestamp() >= cancunTimestamp.getAsLong(); } - return isPragueAtGenesis(genesis); + return isPragueAtGenesis(genesis) || isCancunEOFAtGenesis(genesis); + } + + private static boolean isCancunEOFAtGenesis(final GenesisConfigFile genesis) { + final OptionalLong cancunEOFTimestamp = genesis.getConfigOptions().getCancunEOFTime(); + if (cancunEOFTimestamp.isPresent()) { + return genesis.getTimestamp() >= cancunEOFTimestamp.getAsLong(); + } + return isPragueEOFAtGenesis(genesis); } private static boolean isPragueAtGenesis(final GenesisConfigFile genesis) { diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/MainnetProtocolSpecFactory.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/MainnetProtocolSpecFactory.java index a902d9faa..aa9bae6c7 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/MainnetProtocolSpecFactory.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/MainnetProtocolSpecFactory.java @@ -128,6 +128,11 @@ public class MainnetProtocolSpecFactory { chainId, isRevertReasonEnabled, genesisConfigOptions, evmConfiguration, miningParameters); } + public ProtocolSpecBuilder cancunEOFDefinition(final GenesisConfigOptions genesisConfigOptions) { + return MainnetProtocolSpecs.cancunEOFDefinition( + chainId, isRevertReasonEnabled, genesisConfigOptions, evmConfiguration, miningParameters); + } + public ProtocolSpecBuilder pragueDefinition(final GenesisConfigOptions genesisConfigOptions) { return MainnetProtocolSpecs.pragueDefinition( chainId, isRevertReasonEnabled, genesisConfigOptions, evmConfiguration, miningParameters); diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/MainnetProtocolSpecs.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/MainnetProtocolSpecs.java index 763c751e4..b4a75c49c 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/MainnetProtocolSpecs.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/MainnetProtocolSpecs.java @@ -617,6 +617,19 @@ public abstract class MainnetProtocolSpecs { .name("Cancun"); } + static ProtocolSpecBuilder cancunEOFDefinition( + final Optional chainId, + final boolean enableRevertReason, + final GenesisConfigOptions genesisConfigOptions, + final EvmConfiguration evmConfiguration, + final MiningParameters miningParameters) { + + ProtocolSpecBuilder protocolSpecBuilder = + cancunDefinition( + chainId, enableRevertReason, genesisConfigOptions, evmConfiguration, miningParameters); + return addEOF(chainId, evmConfiguration, protocolSpecBuilder).name("CancunEOF"); + } + static ProtocolSpecBuilder pragueDefinition( final Optional chainId, final boolean enableRevertReason, @@ -657,8 +670,17 @@ public abstract class MainnetProtocolSpecs { final EvmConfiguration evmConfiguration, final MiningParameters miningParameters) { - return pragueDefinition( - chainId, enableRevertReason, genesisConfigOptions, evmConfiguration, miningParameters) + ProtocolSpecBuilder protocolSpecBuilder = + pragueDefinition( + chainId, enableRevertReason, genesisConfigOptions, evmConfiguration, miningParameters); + return addEOF(chainId, evmConfiguration, protocolSpecBuilder).name("PragueEOF"); + } + + private static ProtocolSpecBuilder addEOF( + final Optional chainId, + final EvmConfiguration evmConfiguration, + final ProtocolSpecBuilder protocolSpecBuilder) { + return protocolSpecBuilder // EIP-7692 EOF v1 Gas calculator .gasCalculator(PragueEOFGasCalculator::new) // EIP-7692 EOF v1 EVM and opcodes @@ -674,8 +696,7 @@ public abstract class MainnetProtocolSpecs { true, List.of(MaxCodeSizeRule.from(evm), EOFValidationCodeRule.from(evm)), 1, - SPURIOUS_DRAGON_FORCE_DELETE_WHEN_EMPTY_ADDRESSES)) - .name("PragueEOF"); + SPURIOUS_DRAGON_FORCE_DELETE_WHEN_EMPTY_ADDRESSES)); } static ProtocolSpecBuilder futureEipsDefinition( diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/ProtocolScheduleBuilder.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/ProtocolScheduleBuilder.java index 100a4425c..649442f88 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/ProtocolScheduleBuilder.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/ProtocolScheduleBuilder.java @@ -246,6 +246,7 @@ public class ProtocolScheduleBuilder { // Begin timestamp forks lastForkBlock = validateForkOrder("Shanghai", config.getShanghaiTime(), lastForkBlock); lastForkBlock = validateForkOrder("Cancun", config.getCancunTime(), lastForkBlock); + lastForkBlock = validateForkOrder("CancunEOF", config.getCancunEOFTime(), lastForkBlock); lastForkBlock = validateForkOrder("Prague", config.getPragueTime(), lastForkBlock); lastForkBlock = validateForkOrder("PragueEOF", config.getPragueEOFTime(), lastForkBlock); lastForkBlock = validateForkOrder("FutureEips", config.getFutureEipsTime(), lastForkBlock); @@ -326,6 +327,7 @@ public class ProtocolScheduleBuilder { // Timestamp Forks timestampMilestone(config.getShanghaiTime(), specFactory.shanghaiDefinition(config)), timestampMilestone(config.getCancunTime(), specFactory.cancunDefinition(config)), + timestampMilestone(config.getCancunEOFTime(), specFactory.cancunEOFDefinition(config)), timestampMilestone(config.getPragueTime(), specFactory.pragueDefinition(config)), timestampMilestone(config.getPragueEOFTime(), specFactory.pragueEOFDefinition(config)), timestampMilestone(config.getFutureEipsTime(), specFactory.futureEipsDefinition(config)), diff --git a/ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/MainnetGenesisFileModule.java b/ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/MainnetGenesisFileModule.java index dc6b6dce0..db70ccf41 100644 --- a/ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/MainnetGenesisFileModule.java +++ b/ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/MainnetGenesisFileModule.java @@ -117,6 +117,9 @@ class MainnetGenesisFileModule extends GenesisFileModule { Map.entry( "cancun", createSchedule(new StubGenesisConfigOptions().cancunTime(0).baseFeePerGas(0x0a))), + Map.entry( + "cancuneof", + createSchedule(new StubGenesisConfigOptions().cancunEOFTime(0).baseFeePerGas(0x0a))), Map.entry( "prague", createSchedule(new StubGenesisConfigOptions().pragueTime(0).baseFeePerGas(0x0a))), diff --git a/ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/benchmarks/BenchmarkExecutor.java b/ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/benchmarks/BenchmarkExecutor.java index 50a6df67d..082fae7f6 100644 --- a/ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/benchmarks/BenchmarkExecutor.java +++ b/ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/benchmarks/BenchmarkExecutor.java @@ -113,12 +113,12 @@ public abstract class BenchmarkExecutor { } timer.stop(); - if (executions < 1) { + if (executions > 0) { + final double elapsed = timer.elapsed(TimeUnit.NANOSECONDS) / 1.0e9D; + return elapsed / executions; + } else { return Double.NaN; } - - final double elapsed = timer.elapsed(TimeUnit.NANOSECONDS) / 1.0e9D; - return elapsed / executions; } /** @@ -143,7 +143,15 @@ public abstract class BenchmarkExecutor { case SHANGHAI -> new ShanghaiGasCalculator(); case CANCUN -> new CancunGasCalculator(); case PRAGUE -> new PragueGasCalculator(); - case PRAGUE_EOF, OSAKA, AMSTERDAM, BOGOTA, POLIS, BANGKOK, FUTURE_EIPS, EXPERIMENTAL_EIPS -> + case CANCUN_EOF, + PRAGUE_EOF, + OSAKA, + AMSTERDAM, + BOGOTA, + POLIS, + BANGKOK, + FUTURE_EIPS, + EXPERIMENTAL_EIPS -> new PragueEOFGasCalculator(); }; } diff --git a/ethereum/evmtool/src/test/resources/org/hyperledger/besu/evmtool/state-test/create-eof.json b/ethereum/evmtool/src/test/resources/org/hyperledger/besu/evmtool/state-test/create-eof.json index 4e8529872..e92404304 100644 --- a/ethereum/evmtool/src/test/resources/org/hyperledger/besu/evmtool/state-test/create-eof.json +++ b/ethereum/evmtool/src/test/resources/org/hyperledger/besu/evmtool/state-test/create-eof.json @@ -45,7 +45,7 @@ }, "out": "0x", "post": { - "Prague": [ + "CancunEOF": [ { "hash": "0x1a8642a04dae90535f00f53d3a30284c4db051d508a653db89eb100ba9aecbf3", "logs": "0xf48b954a6a6f4ce6b28e4950b7027413f4bdc8f459df6003b6e8d7a1567c8940", @@ -79,7 +79,7 @@ {"pc":5,"section":0,"op":95,"gas":"0x793d71","gasCost":"0x2","memSize":0,"stack":[],"depth":1,"refund":0,"opName":"PUSH0"}, {"pc":6,"section":0,"op":95,"gas":"0x793d6f","gasCost":"0x2","memSize":0,"stack":["0x0"],"depth":1,"refund":0,"opName":"PUSH0"}, {"pc":7,"section":0,"op":238,"immediate":"0x00","gas":"0x793d6d","gasCost":"0x0","memSize":0,"stack":["0x0","0x0"],"depth":1,"refund":0,"opName":"RETURNCONTRACT"}, - {"output":"","gasUsed":"0xe433","test":"create-eof","fork":"Prague","d":0,"g":0,"v":0,"postHash":"0x1a8642a04dae90535f00f53d3a30284c4db051d508a653db89eb100ba9aecbf3","postLogsHash":"0xf48b954a6a6f4ce6b28e4950b7027413f4bdc8f459df6003b6e8d7a1567c8940","pass":true}, + {"output":"","gasUsed":"0xe433","test":"create-eof","fork":"CancunEOF","d":0,"g":0,"v":0,"postHash":"0x1a8642a04dae90535f00f53d3a30284c4db051d508a653db89eb100ba9aecbf3","postLogsHash":"0xf48b954a6a6f4ce6b28e4950b7027413f4bdc8f459df6003b6e8d7a1567c8940","pass":true}, {"pc":0,"op":239,"gas":"0x794068","gasCost":"0x0","memSize":0,"stack":[],"depth":1,"refund":0,"opName":"INVALID","error":"Bad instruction"}, {"output":"","gasUsed":"0x7a1200","test":"create-eof","fork":"Cancun","d":0,"g":0,"v":0,"postHash":"0xaa80d89bc89f58da8de41d3894bd1a241896ff91f7a5964edaefb39e8e3a4a98","postLogsHash":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","pass":true,"error":"INVALID_OPERATION"} ] diff --git a/ethereum/evmtool/src/test/resources/org/hyperledger/besu/evmtool/trace/create-eof.json b/ethereum/evmtool/src/test/resources/org/hyperledger/besu/evmtool/trace/create-eof.json index bba2c8510..b0699f1b3 100644 --- a/ethereum/evmtool/src/test/resources/org/hyperledger/besu/evmtool/trace/create-eof.json +++ b/ethereum/evmtool/src/test/resources/org/hyperledger/besu/evmtool/trace/create-eof.json @@ -8,7 +8,7 @@ "--coinbase", "4444588443C3A91288C5002483449ABA1054192B", "--fork", - "pragueeof" + "CancunEOF" ], "stdin": "", "stdout": [ diff --git a/ethereum/referencetests/src/main/java/org/hyperledger/besu/ethereum/referencetests/ReferenceTestProtocolSchedules.java b/ethereum/referencetests/src/main/java/org/hyperledger/besu/ethereum/referencetests/ReferenceTestProtocolSchedules.java index 0976b9242..4d62c314a 100644 --- a/ethereum/referencetests/src/main/java/org/hyperledger/besu/ethereum/referencetests/ReferenceTestProtocolSchedules.java +++ b/ethereum/referencetests/src/main/java/org/hyperledger/besu/ethereum/referencetests/ReferenceTestProtocolSchedules.java @@ -84,6 +84,7 @@ public class ReferenceTestProtocolSchedules { "ShanghaiToCancunAtTime15k", createSchedule(genesisStub.clone().shanghaiTime(0).cancunTime(15000))); builder.put("Cancun", createSchedule(genesisStub.clone().cancunTime(0))); + builder.put("CancunEOF", createSchedule(genesisStub.clone().cancunEOFTime(0))); // also load KZG file for mainnet KZGPointEvalPrecompiledContract.init(); builder.put( diff --git a/evm/src/main/java/org/hyperledger/besu/evm/EvmSpecVersion.java b/evm/src/main/java/org/hyperledger/besu/evm/EvmSpecVersion.java index 9bf370d03..8dc536c7b 100644 --- a/evm/src/main/java/org/hyperledger/besu/evm/EvmSpecVersion.java +++ b/evm/src/main/java/org/hyperledger/besu/evm/EvmSpecVersion.java @@ -55,6 +55,8 @@ public enum EvmSpecVersion { SHANGHAI(0x6000, 0xc000, 0, true, "Shanghai", "Finalized"), /** Cancun evm spec version. */ CANCUN(0x6000, 0xc000, 0, true, "Cancun", "Finalized"), + /** Cancun evm spec version. */ + CANCUN_EOF(0x6000, 0xc000, 1, false, "CancunEOF", "For Testing"), /** Prague evm spec version. */ PRAGUE(0x6000, 0xc000, 0, false, "Prague", "In Development"), /** PragueEOF evm spec version. */ @@ -201,6 +203,10 @@ public enum EvmSpecVersion { if ("prague".equalsIgnoreCase(name)) { return EvmSpecVersion.PRAGUE_EOF; } + // TODO remove once PragueEOF settles + if ("cancuneof".equalsIgnoreCase(name)) { + return EvmSpecVersion.CANCUN_EOF; + } for (var version : EvmSpecVersion.values()) { if (version.name().equalsIgnoreCase(name)) { return version; diff --git a/evm/src/main/java/org/hyperledger/besu/evm/MainnetEVMs.java b/evm/src/main/java/org/hyperledger/besu/evm/MainnetEVMs.java index 11ce3546a..2d9be8d31 100644 --- a/evm/src/main/java/org/hyperledger/besu/evm/MainnetEVMs.java +++ b/evm/src/main/java/org/hyperledger/besu/evm/MainnetEVMs.java @@ -897,6 +897,76 @@ public class MainnetEVMs { registry.put(new BlobBaseFeeOperation(gasCalculator)); } + /** + * CancunEOF evm. + * + * @param evmConfiguration the evm configuration + * @return the evm + */ + public static EVM cancunEOF(final EvmConfiguration evmConfiguration) { + return cancunEOF(DEV_NET_CHAIN_ID, evmConfiguration); + } + + /** + * CancunEOF evm. + * + * @param chainId the chain id + * @param evmConfiguration the evm configuration + * @return the evm + */ + public static EVM cancunEOF(final BigInteger chainId, final EvmConfiguration evmConfiguration) { + return cancunEOF(new CancunGasCalculator(), chainId, evmConfiguration); + } + + /** + * CancunEOF evm. + * + * @param gasCalculator the gas calculator + * @param chainId the chain id + * @param evmConfiguration the evm configuration + * @return the evm + */ + public static EVM cancunEOF( + final GasCalculator gasCalculator, + final BigInteger chainId, + final EvmConfiguration evmConfiguration) { + return new EVM( + cancunEOFOperations(gasCalculator, chainId), + gasCalculator, + evmConfiguration, + EvmSpecVersion.CANCUN_EOF); + } + + /** + * Operation registry for PragueEOF's operations. + * + * @param gasCalculator the gas calculator + * @param chainId the chain id + * @return the operation registry + */ + public static OperationRegistry cancunEOFOperations( + final GasCalculator gasCalculator, final BigInteger chainId) { + OperationRegistry operationRegistry = new OperationRegistry(); + registerCancunEOFOperations(operationRegistry, gasCalculator, chainId); + return operationRegistry; + } + + /** + * Register CancunEOF's operations. + * + * @param registry the registry + * @param gasCalculator the gas calculator + * @param chainID the chain id + */ + public static void registerCancunEOFOperations( + final OperationRegistry registry, + final GasCalculator gasCalculator, + final BigInteger chainID) { + registerCancunOperations(registry, gasCalculator, chainID); + + registerEOFOperations(registry, gasCalculator); + } + /** * Prague evm. * @@ -1034,6 +1104,11 @@ public class MainnetEVMs { final BigInteger chainID) { registerPragueOperations(registry, gasCalculator, chainID); + registerEOFOperations(registry, gasCalculator); + } + + private static void registerEOFOperations( + final OperationRegistry registry, final GasCalculator gasCalculator) { // EIP-663 Unlimited Swap and Dup registry.put(new DupNOperation(gasCalculator)); registry.put(new SwapNOperation(gasCalculator)); diff --git a/evm/src/main/java/org/hyperledger/besu/evm/fluent/EVMExecutor.java b/evm/src/main/java/org/hyperledger/besu/evm/fluent/EVMExecutor.java index a65bd034d..08b7a067a 100644 --- a/evm/src/main/java/org/hyperledger/besu/evm/fluent/EVMExecutor.java +++ b/evm/src/main/java/org/hyperledger/besu/evm/fluent/EVMExecutor.java @@ -160,6 +160,7 @@ public class EVMExecutor { case PARIS -> paris(chainId, evmConfiguration); case SHANGHAI -> shanghai(chainId, evmConfiguration); case CANCUN -> cancun(chainId, evmConfiguration); + case CANCUN_EOF -> cancunEOF(chainId, evmConfiguration); case PRAGUE -> prague(chainId, evmConfiguration); case PRAGUE_EOF -> pragueEOF(chainId, evmConfiguration); case OSAKA -> osaka(chainId, evmConfiguration); @@ -493,6 +494,21 @@ public class EVMExecutor { return executor; } + /** + * Instantiate Cancun EOF evm executor. + * + * @param chainId the chain ID + * @param evmConfiguration the evm configuration + * @return the evm executor + */ + public static EVMExecutor cancunEOF( + final BigInteger chainId, final EvmConfiguration evmConfiguration) { + final EVMExecutor executor = new EVMExecutor(MainnetEVMs.cancunEOF(chainId, evmConfiguration)); + executor.precompileContractRegistry = + MainnetPrecompiledContracts.cancun(executor.evm.getGasCalculator()); + return executor; + } + /** * Instantiate Prague evm executor. * diff --git a/evm/src/test/java/org/hyperledger/besu/evm/fluent/EVMExecutorTest.java b/evm/src/test/java/org/hyperledger/besu/evm/fluent/EVMExecutorTest.java index a080f649c..aa9dcdb23 100644 --- a/evm/src/test/java/org/hyperledger/besu/evm/fluent/EVMExecutorTest.java +++ b/evm/src/test/java/org/hyperledger/besu/evm/fluent/EVMExecutorTest.java @@ -126,6 +126,10 @@ class EVMExecutorTest { EVMExecutor cancunEVM = EVMExecutor.cancun(EvmConfiguration.DEFAULT); assertThat(cancunEVM.getChainId()).contains(defaultChainId); + EVMExecutor cancunEOFEVM = + EVMExecutor.cancunEOF(defaultChainId.toBigInteger(), EvmConfiguration.DEFAULT); + assertThat(cancunEOFEVM.getChainId()).contains(defaultChainId); + EVMExecutor pragueEVM = EVMExecutor.pragueEOF(defaultChainId.toBigInteger(), EvmConfiguration.DEFAULT); assertThat(pragueEVM.getChainId()).contains(defaultChainId); diff --git a/evm/src/test/java/org/hyperledger/besu/evm/operations/EofCreateOperationTest.java b/evm/src/test/java/org/hyperledger/besu/evm/operations/EofCreateOperationTest.java index c0a7f2bcc..86a0f8cce 100644 --- a/evm/src/test/java/org/hyperledger/besu/evm/operations/EofCreateOperationTest.java +++ b/evm/src/test/java/org/hyperledger/besu/evm/operations/EofCreateOperationTest.java @@ -62,7 +62,7 @@ class EofCreateOperationTest { @Test void innerContractIsCorrect() { - final EVM evm = MainnetEVMs.pragueEOF(EvmConfiguration.DEFAULT); + final EVM evm = MainnetEVMs.cancunEOF(EvmConfiguration.DEFAULT); Code code = evm.getCodeUncached(INNER_CONTRACT); assertThat(code.isValid()).isTrue(); @@ -92,7 +92,7 @@ class EofCreateOperationTest { @Test void eofCreatePassesInCallData() { Bytes outerContract = EOF_CREATE_CONTRACT; - final EVM evm = MainnetEVMs.pragueEOF(EvmConfiguration.DEFAULT); + final EVM evm = MainnetEVMs.cancunEOF(EvmConfiguration.DEFAULT); Code code = evm.getCodeUncached(outerContract); if (!code.isValid()) { From 47f341edf5c80022349ab6be10d186adb3c50810 Mon Sep 17 00:00:00 2001 From: Jason Frame Date: Wed, 26 Jun 2024 15:50:45 +1000 Subject: [PATCH 17/58] Snapserver responses to return at least one response (#7190) Signed-off-by: Jason Frame --- .../ethereum/eth/manager/snap/SnapServer.java | 19 ++- .../eth/manager/snap/SnapServerTest.java | 154 ++++++++++++++++++ 2 files changed, 167 insertions(+), 6 deletions(-) diff --git a/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/manager/snap/SnapServer.java b/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/manager/snap/SnapServer.java index bfccede67..8d0add16f 100644 --- a/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/manager/snap/SnapServer.java +++ b/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/manager/snap/SnapServer.java @@ -456,8 +456,9 @@ class SnapServer implements BesuEvents.InitialSyncCompletionListener { } else { Optional optCode = worldStateStorageCoordinator.getCode(Hash.wrap(codeHash), null); if (optCode.isPresent()) { - if (sumListBytes(codeBytes) + optCode.get().size() > maxResponseBytes - || stopWatch.getTime() > StatefulPredicate.MAX_MILLIS_PER_REQUEST) { + if (!codeBytes.isEmpty() + && (sumListBytes(codeBytes) + optCode.get().size() > maxResponseBytes + || stopWatch.getTime() > StatefulPredicate.MAX_MILLIS_PER_REQUEST)) { break; } codeBytes.add(optCode.get()); @@ -511,8 +512,9 @@ class SnapServer implements BesuEvents.InitialSyncCompletionListener { var optStorage = storage.getTrieNodeUnsafe(CompactEncoding.decode(triePath.get(0))); if (optStorage.isPresent()) { - if (sumListBytes(trieNodes) + optStorage.get().size() > maxResponseBytes - || stopWatch.getTime() > StatefulPredicate.MAX_MILLIS_PER_REQUEST) { + if (!trieNodes.isEmpty() + && (sumListBytes(trieNodes) + optStorage.get().size() > maxResponseBytes + || stopWatch.getTime() > StatefulPredicate.MAX_MILLIS_PER_REQUEST)) { break; } trieNodes.add(optStorage.get()); @@ -536,7 +538,9 @@ class SnapServer implements BesuEvents.InitialSyncCompletionListener { storage.getTrieNodeUnsafe( Bytes.concatenate(accountPrefix, CompactEncoding.decode(path))); if (optStorage.isPresent()) { - if (sumListBytes(trieNodes) + optStorage.get().size() > maxResponseBytes) { + if (!trieNodes.isEmpty() + && sumListBytes(trieNodes) + optStorage.get().size() + > maxResponseBytes) { break; } trieNodes.add(optStorage.get()); @@ -614,11 +618,14 @@ class SnapServer implements BesuEvents.InitialSyncCompletionListener { return false; } + var hasNoRecords = recordLimit.get() == 0; var underRecordLimit = recordLimit.addAndGet(1) <= MAX_ENTRIES_PER_REQUEST; var underByteLimit = byteLimit.accumulateAndGet(0, (cur, __) -> cur + encodingSizeAccumulator.apply(pair)) < maxResponseBytesFudgeFactor; - if (underRecordLimit && underByteLimit) { + // Only enforce limits when we have at least 1 record as the snapsync spec + // requires at least 1 record must be returned + if (hasNoRecords || (underRecordLimit && underByteLimit)) { return true; } else { shouldContinue.set(false); diff --git a/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/manager/snap/SnapServerTest.java b/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/manager/snap/SnapServerTest.java index d7d3fc527..1b4cc0618 100644 --- a/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/manager/snap/SnapServerTest.java +++ b/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/manager/snap/SnapServerTest.java @@ -221,6 +221,37 @@ public class SnapServerTest { assertThat(assertIsValidAccountRangeProof(Hash.ZERO, rangeData)).isTrue(); } + @Test + public void assertAccountLimitRangeResponse_atLeastOneAccount() { + List randomLoad = IntStream.range(1, 4096).boxed().collect(Collectors.toList()); + Collections.shuffle(randomLoad); + randomLoad.stream() + .forEach( + i -> + insertTestAccounts( + createTestAccount( + Bytes.concatenate( + Bytes.fromHexString("0x40"), + Bytes.fromHexStringLenient(Integer.toHexString(i * 256))) + .toHexString()))); + + final BytesValueRLPOutput tmp = new BytesValueRLPOutput(); + tmp.startList(); + tmp.writeBytes(storageTrie.getRootHash()); + tmp.writeBytes(Hash.ZERO); + tmp.writeBytes(HASH_LAST); + tmp.writeBigIntegerScalar(BigInteger.ZERO); + tmp.endList(); + var tinyRangeLimit = new GetAccountRangeMessage(tmp.encoded()).wrapMessageData(BigInteger.ZERO); + + var rangeData = + getAndVerifyAccountRangeData( + (AccountRangeMessage) snapServer.constructGetAccountRangeResponse(tinyRangeLimit), 1); + + // assert proofs are valid for the requested range + assertThat(assertIsValidAccountRangeProof(Hash.ZERO, rangeData)).isTrue(); + } + @Test public void assertLastEmptyRange() { // When our final range request is empty, no next account is possible, @@ -353,6 +384,42 @@ public class SnapServerTest { .isTrue(); } + @Test + public void assertStorageLimitRangeResponse_atLeastOneSlot() { + insertTestAccounts(acct1, acct2, acct3, acct4); + + final BytesValueRLPOutput tmp = new BytesValueRLPOutput(); + tmp.startList(); + tmp.writeBigIntegerScalar(BigInteger.ONE); + tmp.writeBytes(storageTrie.getRootHash()); + tmp.writeList( + List.of(acct3.addressHash, acct4.addressHash), + (hash, rlpOutput) -> rlpOutput.writeBytes(hash)); + tmp.writeBytes(Hash.ZERO); + tmp.writeBytes(HASH_LAST); + tmp.writeBigIntegerScalar(BigInteger.ZERO); + tmp.endList(); + var tinyRangeLimit = new GetStorageRangeMessage(tmp.encoded()); + + var rangeData = + (StorageRangeMessage) snapServer.constructGetStorageRangeResponse(tinyRangeLimit); + + // assert proofs are valid for the requested range + assertThat(rangeData).isNotNull(); + var slotsData = rangeData.slotsData(false); + assertThat(slotsData).isNotNull(); + assertThat(slotsData.slots()).isNotNull(); + assertThat(slotsData.slots().size()).isEqualTo(1); + var firstAccountStorages = slotsData.slots().first(); + // expecting to see complete 10 slot storage for acct3 + assertThat(firstAccountStorages.size()).isEqualTo(1); + assertThat(slotsData.proofs().size()).isNotEqualTo(0); + + assertThat( + assertIsValidStorageProof(acct4, Hash.ZERO, firstAccountStorages, slotsData.proofs())) + .isTrue(); + } + @Test public void assertAccountTriePathRequest() { insertTestAccounts(acct1, acct2, acct3, acct4); @@ -416,6 +483,39 @@ public class SnapServerTest { assertThat(trieNodes.size()).isEqualTo(accountNodeLimit * 90 / 100); } + @Test + public void assertAccountTrieLimitRequest_atLeastOneTrieNode() { + insertTestAccounts(acct1, acct2, acct3, acct4); + + var partialPathToAcct1 = Bytes.fromHexString("0x01"); // first nibble is 1 + var partialPathToAcct2 = CompactEncoding.bytesToPath(acct2.addressHash).slice(0, 1); + var partialPathToAcct3 = Bytes.fromHexString("0x03"); // first nibble is 1 + var partialPathToAcct4 = Bytes.fromHexString("0x04"); // first nibble is 1 + final BytesValueRLPOutput tmp = new BytesValueRLPOutput(); + tmp.startList(); + tmp.writeBigIntegerScalar(BigInteger.ONE); + tmp.writeBytes(storageTrie.getRootHash()); + tmp.writeList( + List.of( + List.of(partialPathToAcct4), + List.of(partialPathToAcct3), + List.of(partialPathToAcct2), + List.of(partialPathToAcct1)), + (path, rlpOutput) -> + rlpOutput.writeList(path, (b, subRlpOutput) -> subRlpOutput.writeBytes(b))); + tmp.writeBigIntegerScalar(BigInteger.ZERO); + tmp.endList(); + + var trieNodeRequest = + (TrieNodesMessage) + snapServer.constructGetTrieNodesResponse(new GetTrieNodesMessage(tmp.encoded())); + + assertThat(trieNodeRequest).isNotNull(); + List trieNodes = trieNodeRequest.nodes(false); + assertThat(trieNodes).isNotNull(); + assertThat(trieNodes.size()).isEqualTo(1); + } + @Test public void assertStorageTriePathRequest() { insertTestAccounts(acct1, acct2, acct3, acct4); @@ -468,6 +568,37 @@ public class SnapServerTest { assertThat(trieNodes.size()).isEqualTo(trieNodeLimit * 90 / 100); } + @Test + public void assertStorageTrieLimitRequest_atLeastOneTrieNode() { + insertTestAccounts(acct1, acct2, acct3, acct4); + + var pathToSlot11 = CompactEncoding.encode(Bytes.fromHexStringLenient("0x0101")); + var pathToSlot12 = CompactEncoding.encode(Bytes.fromHexStringLenient("0x0102")); + var pathToSlot1a = CompactEncoding.encode(Bytes.fromHexStringLenient("0x010A")); // not present + + final BytesValueRLPOutput tmp = new BytesValueRLPOutput(); + tmp.startList(); + tmp.writeBigIntegerScalar(BigInteger.ONE); + tmp.writeBytes(storageTrie.getRootHash()); + tmp.writeList( + List.of( + List.of(acct3.addressHash, pathToSlot11, pathToSlot12, pathToSlot1a), + List.of(acct4.addressHash, pathToSlot11, pathToSlot12, pathToSlot1a)), + (path, rlpOutput) -> + rlpOutput.writeList(path, (b, subRlpOutput) -> subRlpOutput.writeBytes(b))); + tmp.writeBigIntegerScalar(BigInteger.ZERO); + tmp.endList(); + + var trieNodeRequest = + (TrieNodesMessage) + snapServer.constructGetTrieNodesResponse(new GetTrieNodesMessage(tmp.encoded())); + + assertThat(trieNodeRequest).isNotNull(); + List trieNodes = trieNodeRequest.nodes(false); + assertThat(trieNodes).isNotNull(); + assertThat(trieNodes.size()).isEqualTo(1); + } + @Test public void assertCodePresent() { insertTestAccounts(acct1, acct2, acct3, acct4); @@ -506,6 +637,29 @@ public class SnapServerTest { assertThat(codes.codes().size()).isEqualTo(codeLimit * 90 / 100); } + @Test + public void assertCodeLimitRequest_atLeastOneByteCode() { + insertTestAccounts(acct1, acct2, acct3, acct4); + + final BytesValueRLPOutput tmp = new BytesValueRLPOutput(); + tmp.startList(); + tmp.writeBigIntegerScalar(BigInteger.ONE); + tmp.writeList( + List.of(acct3.accountValue.getCodeHash(), acct4.accountValue.getCodeHash()), + (hash, rlpOutput) -> rlpOutput.writeBytes(hash)); + tmp.writeBigIntegerScalar(BigInteger.ZERO); + tmp.endList(); + + var codeRequest = + (ByteCodesMessage) + snapServer.constructGetBytecodesResponse(new GetByteCodesMessage(tmp.encoded())); + + assertThat(codeRequest).isNotNull(); + ByteCodesMessage.ByteCodes codes = codeRequest.bytecodes(false); + assertThat(codes).isNotNull(); + assertThat(codes.codes().size()).isEqualTo(1); + } + static SnapTestAccount createTestAccount(final String hexAddr) { return new SnapTestAccount( Hash.wrap(Bytes32.rightPad(Bytes.fromHexString(hexAddr))), From 67637fa3f0a23671394d5a552376944088007ccc Mon Sep 17 00:00:00 2001 From: Jason Frame Date: Thu, 27 Jun 2024 09:35:31 +1000 Subject: [PATCH 18/58] Snapserver GetTrieNodes request to handle short hash for storage (#7264) Signed-off-by: Jason Frame --- .../ethereum/eth/manager/snap/SnapServer.java | 2 +- .../eth/manager/snap/SnapServerTest.java | 25 ++++++++++++++++++- 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/manager/snap/SnapServer.java b/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/manager/snap/SnapServer.java index 8d0add16f..49f725d82 100644 --- a/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/manager/snap/SnapServer.java +++ b/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/manager/snap/SnapServer.java @@ -530,7 +530,7 @@ class SnapServer implements BesuEvents.InitialSyncCompletionListener { // otherwise the first element should be account hash, and subsequent paths // are compact encoded account storage paths - final Bytes accountPrefix = triePath.get(0); + final Bytes accountPrefix = Bytes32.leftPad(triePath.getFirst()); List storagePaths = triePath.subList(1, triePath.size()); for (var path : storagePaths) { diff --git a/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/manager/snap/SnapServerTest.java b/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/manager/snap/SnapServerTest.java index 1b4cc0618..2103af412 100644 --- a/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/manager/snap/SnapServerTest.java +++ b/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/manager/snap/SnapServerTest.java @@ -534,6 +534,24 @@ public class SnapServerTest { assertThat(trieNodes.size()).isEqualTo(4); } + @Test + public void assertStorageTrieShortAccountHashPathRequest() { + Bytes accountShortHash = Bytes.fromHexStringLenient("0x40"); + Hash accountFullHash = Hash.wrap(Bytes32.leftPad(accountShortHash)); + SnapTestAccount testAccount = createTestContractAccount(accountFullHash, inMemoryStorage); + insertTestAccounts(testAccount); + var pathToSlot11 = CompactEncoding.encode(Bytes.fromHexStringLenient("0x0101")); + var pathToSlot12 = CompactEncoding.encode(Bytes.fromHexStringLenient("0x0102")); + var trieNodeRequest = + requestTrieNodes( + storageTrie.getRootHash(), + List.of(List.of(accountShortHash, pathToSlot11, pathToSlot12))); + assertThat(trieNodeRequest).isNotNull(); + List trieNodes = trieNodeRequest.nodes(false); + assertThat(trieNodes).isNotNull(); + assertThat(trieNodes.size()).isEqualTo(2); + } + @Test public void assertStorageTrieLimitRequest() { insertTestAccounts(acct1, acct2, acct3, acct4); @@ -671,7 +689,12 @@ public class SnapServerTest { static SnapTestAccount createTestContractAccount( final String hexAddr, final BonsaiWorldStateKeyValueStorage storage) { - Hash acctHash = Hash.wrap(Bytes32.rightPad(Bytes.fromHexString(hexAddr))); + final Hash acctHash = Hash.wrap(Bytes32.rightPad(Bytes.fromHexString(hexAddr))); + return createTestContractAccount(acctHash, storage); + } + + static SnapTestAccount createTestContractAccount( + final Hash acctHash, final BonsaiWorldStateKeyValueStorage storage) { MerkleTrie trie = new StoredMerklePatriciaTrie<>( (loc, hash) -> storage.getAccountStorageTrieNode(acctHash, loc, hash), From 77183f6d600cfdc17d2f309aac507a8d038a56b5 Mon Sep 17 00:00:00 2001 From: Usman Saleem Date: Thu, 27 Jun 2024 13:09:00 +1000 Subject: [PATCH 19/58] javadoc: Adding javadoc for ethstats module (#7269) * javadoc: Adding javadoc for ethstats module --------- Signed-off-by: Usman Saleem --- .../logging/XmlExtensionConfiguration.java | 2 +- build.gradle | 1 - .../besu/ethstats/EthStatsService.java | 14 ++-- .../authentication/AuthenticationData.java | 19 +++++ .../ethstats/authentication/NodeInfo.java | 60 ++++++++++++++ .../besu/ethstats/report/BlockReport.java | 14 ++++ .../besu/ethstats/report/HistoryReport.java | 14 ++++ .../besu/ethstats/report/LatencyReport.java | 14 ++++ .../besu/ethstats/report/NodeStatsReport.java | 50 ++++++++++++ .../report/PendingTransactionsReport.java | 20 +++++ .../besu/ethstats/report/PingReport.java | 14 ++++ .../ethstats/request/EthStatsRequest.java | 65 +++++++++++++++ .../ethstats/util/EthStatsConnectOptions.java | 47 +++++++++++ .../ethstats/util/PrimusHeartBeatsHelper.java | 15 ++++ .../evmtool/src/main/resources/log4j2.xml | 2 +- util/build.gradle | 2 + .../log4j/plugin/BesuLogMessageConverter.java | 80 +++++++++++++++++++ .../plugin/BesuLogMessageConverterTest.java | 39 +++++++++ 18 files changed, 462 insertions(+), 10 deletions(-) create mode 100644 util/src/main/java/org/hyperledger/besu/util/log4j/plugin/BesuLogMessageConverter.java create mode 100644 util/src/test/java/org/hyperledger/besu/util/log4j/plugin/BesuLogMessageConverterTest.java diff --git a/besu/src/main/java/org/hyperledger/besu/cli/logging/XmlExtensionConfiguration.java b/besu/src/main/java/org/hyperledger/besu/cli/logging/XmlExtensionConfiguration.java index d2ae7071b..1e8732765 100644 --- a/besu/src/main/java/org/hyperledger/besu/cli/logging/XmlExtensionConfiguration.java +++ b/besu/src/main/java/org/hyperledger/besu/cli/logging/XmlExtensionConfiguration.java @@ -102,7 +102,7 @@ public class XmlExtensionConfiguration extends XmlConfiguration { dim("%t"), colorize("%-5level"), dim("%c{1}"), - colorize("%msg%n%throwable"))) + colorize("%msgc%n%throwable"))) .build(); final ConsoleAppender consoleAppender = ConsoleAppender.newBuilder().setName("Console").setLayout(patternLayout).build(); diff --git a/build.gradle b/build.gradle index 3db0da35c..d869daf5e 100644 --- a/build.gradle +++ b/build.gradle @@ -368,7 +368,6 @@ allprojects { // TODO: these are temporary disabled (ethereum and sub modules), it should be removed in a future PR. '-org.hyperledger.besu.ethereum,' + '-org.hyperledger.besu.ethereum.*,' + - '-org.hyperledger.besu.ethstats.*,' + '-org.hyperledger.besu.evmtool', true) options.addStringOption('Xmaxerrs','65535') diff --git a/ethereum/ethstats/src/main/java/org/hyperledger/besu/ethstats/EthStatsService.java b/ethereum/ethstats/src/main/java/org/hyperledger/besu/ethstats/EthStatsService.java index 0fa93e1b6..b96a48dc5 100644 --- a/ethereum/ethstats/src/main/java/org/hyperledger/besu/ethstats/EthStatsService.java +++ b/ethereum/ethstats/src/main/java/org/hyperledger/besu/ethstats/EthStatsService.java @@ -80,8 +80,8 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** - * This class describes the behaviour of the EthStats service. This class is used to report pending - * transactions, blocks, and several node-related information to a netstats server. + * This class describes the behaviour of the EthStatsService. This class is used to report pending + * transactions, blocks, and several node-related information to an ethstats server. */ public class EthStatsService { @@ -112,18 +112,18 @@ public class EthStatsService { private long pingTimestamp; /** - * Instantiates a new EthStats service. + * Instantiates a new EthStatsService. * - * @param ethStatsConnectOptions the netstats url + * @param ethStatsConnectOptions the ethstats options * @param blockchainQueries the blockchain queries * @param protocolManager the protocol manager * @param transactionPool the transaction pool * @param miningCoordinator the mining coordinator - * @param syncState the sync state - * @param vertx the vertx + * @param syncState the SyncState + * @param vertx the vertx instance * @param clientVersion the client version * @param genesisConfigOptions the genesis config options - * @param p2PNetwork the p 2 p network + * @param p2PNetwork the p2p network */ public EthStatsService( final EthStatsConnectOptions ethStatsConnectOptions, diff --git a/ethereum/ethstats/src/main/java/org/hyperledger/besu/ethstats/authentication/AuthenticationData.java b/ethereum/ethstats/src/main/java/org/hyperledger/besu/ethstats/authentication/AuthenticationData.java index 2e222f08b..cb68ebc7d 100644 --- a/ethereum/ethstats/src/main/java/org/hyperledger/besu/ethstats/authentication/AuthenticationData.java +++ b/ethereum/ethstats/src/main/java/org/hyperledger/besu/ethstats/authentication/AuthenticationData.java @@ -19,18 +19,37 @@ import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.fasterxml.jackson.databind.annotation.JsonSerialize; import org.immutables.value.Value; +/** + * This interface represents the authentication data. It provides methods to get the id, info, and + * secret of the authentication data. + */ @Value.Immutable @JsonSerialize(as = ImmutableAuthenticationData.class) @JsonDeserialize(as = ImmutableAuthenticationData.class) @Value.Style(allParameters = true) public interface AuthenticationData { + /** + * Gets the id of the authentication data. + * + * @return the id of the authentication data. + */ @JsonProperty("id") String getId(); + /** + * Gets the info of the authentication data. + * + * @return the info of the authentication data. + */ @JsonProperty("info") NodeInfo getInfo(); + /** + * Gets the secret of the authentication data. + * + * @return the secret of the authentication data. + */ @JsonProperty("secret") String getSecret(); } diff --git a/ethereum/ethstats/src/main/java/org/hyperledger/besu/ethstats/authentication/NodeInfo.java b/ethereum/ethstats/src/main/java/org/hyperledger/besu/ethstats/authentication/NodeInfo.java index 19c34db4b..b54fd9fa3 100644 --- a/ethereum/ethstats/src/main/java/org/hyperledger/besu/ethstats/authentication/NodeInfo.java +++ b/ethereum/ethstats/src/main/java/org/hyperledger/besu/ethstats/authentication/NodeInfo.java @@ -19,42 +19,102 @@ import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.fasterxml.jackson.databind.annotation.JsonSerialize; import org.immutables.value.Value; +/** + * This interface represents the information of a node. It provides methods to get the name, node, + * port, network, protocol, api, os, os version, client, update history capability, and contact of + * the node. + */ @Value.Immutable @JsonSerialize(as = ImmutableNodeInfo.class) @JsonDeserialize(as = ImmutableNodeInfo.class) @Value.Style(allParameters = true) public interface NodeInfo { + /** + * Gets the name of the node. + * + * @return the name of the node. + */ @JsonProperty("name") String getName(); + /** + * Gets the node. + * + * @return the node. + */ @JsonProperty("node") String getNode(); + /** + * Gets the port of the node. + * + * @return the port of the node. + */ @JsonProperty("port") String getPort(); + /** + * Gets the network of the node. + * + * @return the network of the node. + */ @JsonProperty("net") String getNetwork(); + /** + * Gets the protocol of the node. + * + * @return the protocol of the node. + */ @JsonProperty("protocol") String getProtocol(); + /** + * Gets the api of the node. + * + * @return the api of the node. + */ @JsonProperty("api") String getApi(); + /** + * Gets the operating system of the node. + * + * @return the operating system of the node. + */ @JsonProperty("os") String getOs(); + /** + * Gets the operating system version of the node. + * + * @return the operating system version of the node. + */ @JsonProperty("os_v") String getOsVer(); + /** + * Gets the client of the node. + * + * @return the client of the node. + */ @JsonProperty("client") String getClient(); + /** + * Gets the update history capability of the node. + * + * @return the update history capability of the node. + */ @JsonProperty("canUpdateHistory") Boolean getCanUpdateHistory(); + /** + * Gets the contact of the node. + * + * @return the contact of the node. + */ @JsonProperty("contact") String getContact(); } diff --git a/ethereum/ethstats/src/main/java/org/hyperledger/besu/ethstats/report/BlockReport.java b/ethereum/ethstats/src/main/java/org/hyperledger/besu/ethstats/report/BlockReport.java index ccedbb039..c4816d648 100644 --- a/ethereum/ethstats/src/main/java/org/hyperledger/besu/ethstats/report/BlockReport.java +++ b/ethereum/ethstats/src/main/java/org/hyperledger/besu/ethstats/report/BlockReport.java @@ -21,15 +21,29 @@ import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.fasterxml.jackson.databind.annotation.JsonSerialize; import org.immutables.value.Value; +/** + * This interface represents a block report. It provides methods to get the id and block result of + * the block report. + */ @Value.Immutable @Value.Style(allParameters = true) @JsonSerialize(as = ImmutableBlockReport.class) @JsonDeserialize(as = ImmutableBlockReport.class) public interface BlockReport { + /** + * Gets the id of the block report. + * + * @return the id of the block report. + */ @JsonProperty("id") String getId(); + /** + * Gets the block result of the block report. + * + * @return the block result of the block report. + */ @JsonProperty("block") BlockResult getBlock(); } diff --git a/ethereum/ethstats/src/main/java/org/hyperledger/besu/ethstats/report/HistoryReport.java b/ethereum/ethstats/src/main/java/org/hyperledger/besu/ethstats/report/HistoryReport.java index 3aafa6200..5df2c848c 100644 --- a/ethereum/ethstats/src/main/java/org/hyperledger/besu/ethstats/report/HistoryReport.java +++ b/ethereum/ethstats/src/main/java/org/hyperledger/besu/ethstats/report/HistoryReport.java @@ -23,15 +23,29 @@ import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.fasterxml.jackson.databind.annotation.JsonSerialize; import org.immutables.value.Value; +/** + * This interface represents a history report. It provides methods to get the id and history of the + * history report. + */ @Value.Immutable @Value.Style(allParameters = true) @JsonSerialize(as = ImmutableHistoryReport.class) @JsonDeserialize(as = ImmutableHistoryReport.class) public interface HistoryReport { + /** + * Gets the id of the history report. + * + * @return the id of the history report. + */ @JsonProperty(value = "id") String getId(); + /** + * Gets the block results of the history report. + * + * @return the list of block results of the history report. + */ @JsonProperty("history") List getHistory(); } diff --git a/ethereum/ethstats/src/main/java/org/hyperledger/besu/ethstats/report/LatencyReport.java b/ethereum/ethstats/src/main/java/org/hyperledger/besu/ethstats/report/LatencyReport.java index 58201332b..5c5884272 100644 --- a/ethereum/ethstats/src/main/java/org/hyperledger/besu/ethstats/report/LatencyReport.java +++ b/ethereum/ethstats/src/main/java/org/hyperledger/besu/ethstats/report/LatencyReport.java @@ -19,15 +19,29 @@ import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.fasterxml.jackson.databind.annotation.JsonSerialize; import org.immutables.value.Value; +/** + * This interface represents a latency report. It provides methods to get the id and latency of the + * latency report. + */ @Value.Immutable @Value.Style(allParameters = true) @JsonSerialize(as = ImmutableLatencyReport.class) @JsonDeserialize(as = ImmutableLatencyReport.class) public interface LatencyReport { + /** + * Gets the id of the latency report. + * + * @return the id of the latency report. + */ @JsonProperty("id") String getId(); + /** + * Gets the latency of the latency report. + * + * @return the latency of the latency report. + */ @JsonProperty("latency") String getLatency(); } diff --git a/ethereum/ethstats/src/main/java/org/hyperledger/besu/ethstats/report/NodeStatsReport.java b/ethereum/ethstats/src/main/java/org/hyperledger/besu/ethstats/report/NodeStatsReport.java index 67bc977a1..af95de720 100644 --- a/ethereum/ethstats/src/main/java/org/hyperledger/besu/ethstats/report/NodeStatsReport.java +++ b/ethereum/ethstats/src/main/java/org/hyperledger/besu/ethstats/report/NodeStatsReport.java @@ -19,42 +19,92 @@ import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.fasterxml.jackson.databind.annotation.JsonSerialize; import org.immutables.value.Value; +/** + * This interface represents a node stats report. It provides methods to get the id and stats of the + * node stats report. + */ @Value.Immutable @Value.Style(deepImmutablesDetection = true, depluralize = true) @JsonSerialize(as = ImmutableNodeStatsReport.class) @JsonDeserialize(as = ImmutableNodeStatsReport.class) public interface NodeStatsReport { + /** + * Gets the id of the node stats report. + * + * @return the id of the node stats report. + */ @JsonProperty("id") String getId(); + /** + * Gets the stats of the node stats report. + * + * @return the stats of the node stats report. + */ @JsonProperty("stats") NStats getStats(); + /** This interface represents the stats of a node. */ @Value.Immutable @Value.Style(allParameters = true) @JsonSerialize(as = ImmutableNStats.class) @JsonDeserialize(as = ImmutableNStats.class) interface NStats { + /** + * Checks if the node is active. + * + * @return true if the node is active, false otherwise. + */ @JsonProperty("active") boolean isActive(); + /** + * Checks if the node is mining. + * + * @return true if the node is mining, false otherwise. + */ @JsonProperty("mining") boolean isMining(); + /** + * Gets the hashrate of the node. + * + * @return the hashrate of the node. + */ @JsonProperty("hashrate") long getHashrate(); + /** + * Gets the number of peers of the node. + * + * @return the number of peers of the node. + */ @JsonProperty("peers") int getPeers(); + /** + * Gets the gas price of the node. + * + * @return the gas price of the node. + */ @JsonProperty("gasPrice") long getGasPrice(); + /** + * Checks if the node is syncing. + * + * @return true if the node is syncing, false otherwise. + */ @JsonProperty("syncing") boolean isSyncing(); + /** + * Gets the uptime of the node. + * + * @return the uptime of the node. + */ @JsonProperty("uptime") int getUpTime(); } diff --git a/ethereum/ethstats/src/main/java/org/hyperledger/besu/ethstats/report/PendingTransactionsReport.java b/ethereum/ethstats/src/main/java/org/hyperledger/besu/ethstats/report/PendingTransactionsReport.java index 5c168e290..dbb19ac34 100644 --- a/ethereum/ethstats/src/main/java/org/hyperledger/besu/ethstats/report/PendingTransactionsReport.java +++ b/ethereum/ethstats/src/main/java/org/hyperledger/besu/ethstats/report/PendingTransactionsReport.java @@ -19,24 +19,44 @@ import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.fasterxml.jackson.databind.annotation.JsonSerialize; import org.immutables.value.Value; +/** + * This interface represents a pending transactions report. It provides methods to get the id and + * stats of the pending transactions report. + */ @Value.Immutable @Value.Style(deepImmutablesDetection = true, depluralize = true) @JsonSerialize(as = ImmutablePendingTransactionsReport.class) @JsonDeserialize(as = ImmutablePendingTransactionsReport.class) public interface PendingTransactionsReport { + /** + * Gets the id of the pending transactions report. + * + * @return the id of the pending transactions report. + */ @JsonProperty("id") String getId(); + /** + * Gets the stats of the pending transactions report. + * + * @return the stats of the pending transactions report. + */ @JsonProperty("stats") PStats getStats(); + /** This interface represents the stats of a pending transactions report. */ @Value.Immutable @Value.Style(allParameters = true) @JsonSerialize(as = ImmutablePStats.class) @JsonDeserialize(as = ImmutablePStats.class) interface PStats { + /** + * Gets the number of pending transactions. + * + * @return the number of pending transactions. + */ @JsonProperty("pending") int getPending(); } diff --git a/ethereum/ethstats/src/main/java/org/hyperledger/besu/ethstats/report/PingReport.java b/ethereum/ethstats/src/main/java/org/hyperledger/besu/ethstats/report/PingReport.java index 945f35530..d7470a65c 100644 --- a/ethereum/ethstats/src/main/java/org/hyperledger/besu/ethstats/report/PingReport.java +++ b/ethereum/ethstats/src/main/java/org/hyperledger/besu/ethstats/report/PingReport.java @@ -19,15 +19,29 @@ import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.fasterxml.jackson.databind.annotation.JsonSerialize; import org.immutables.value.Value; +/** + * This interface represents a ping report. It provides methods to get the id and current time of + * the ping report. + */ @Value.Immutable @Value.Style(allParameters = true) @JsonSerialize(as = ImmutablePingReport.class) @JsonDeserialize(as = ImmutablePingReport.class) public interface PingReport { + /** + * Gets the id of the ping report. + * + * @return the id of the ping report. + */ @JsonProperty("id") String getId(); + /** + * Gets the current time of the ping report. + * + * @return the current time of the ping report. + */ @JsonProperty("clientTime") String getCurrentTime(); } diff --git a/ethereum/ethstats/src/main/java/org/hyperledger/besu/ethstats/request/EthStatsRequest.java b/ethereum/ethstats/src/main/java/org/hyperledger/besu/ethstats/request/EthStatsRequest.java index dbd8b9ccf..8d2acf3a0 100644 --- a/ethereum/ethstats/src/main/java/org/hyperledger/besu/ethstats/request/EthStatsRequest.java +++ b/ethereum/ethstats/src/main/java/org/hyperledger/besu/ethstats/request/EthStatsRequest.java @@ -23,10 +23,16 @@ import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; +/** + * This class represents an Ethereum statistics request. It provides methods to get the type of the + * request and the parameters associated with it. + */ public class EthStatsRequest { + /** The constant MAPPER. */ public static final ObjectMapper MAPPER = new ObjectMapper(); + /** The constant EMIT_FIELD. */ public static final String EMIT_FIELD = "emit"; @JsonProperty(EMIT_FIELD) @@ -34,11 +40,22 @@ public class EthStatsRequest { private EthStatsRequest() {} + /** + * Constructs a new EthStatsRequest with the given type and parameters. + * + * @param type the type of the request + * @param parameters the parameters of the request + */ public EthStatsRequest(final Type type, final Object... parameters) { this.emit = Stream.concat(Stream.of(type.value), Stream.of(parameters)).collect(Collectors.toList()); } + /** + * Gets the type of the request. + * + * @return the type of the request + */ @JsonIgnore public Type getType() { return getEmit().stream() @@ -49,14 +66,31 @@ public class EthStatsRequest { .orElse(Type.UNKNOWN); } + /** + * Gets the parameters of the request. + * + * @return the parameters of the request + */ public List getEmit() { return emit; } + /** + * Generates a command string from the request. + * + * @return the command string + * @throws JsonProcessingException if there is an error processing the JSON + */ public String generateCommand() throws JsonProcessingException { return MAPPER.writeValueAsString(this); } + /** + * Creates an EthStatsRequest from a response string. + * + * @param value the response string + * @return the EthStatsRequest + */ public static EthStatsRequest fromResponse(final String value) { try { return MAPPER.readValue(value, EthStatsRequest.class); @@ -65,16 +99,36 @@ public class EthStatsRequest { } } + /** The enum Type represents the type of the request. */ public enum Type { + /** Represents the 'hello' type of the request. */ HELLO("hello"), + + /** Represents the 'ready' type of the request. */ READY("ready"), + + /** Represents the 'node-ping' type of the request. */ NODE_PING("node-ping"), + + /** Represents the 'node-pong' type of the request. */ NODE_PONG("node-pong"), + + /** Represents the 'latency' type of the request. */ LATENCY("latency"), + + /** Represents the 'block' type of the request. */ BLOCK("block"), + + /** Represents the 'history' type of the request. */ HISTORY("history"), + + /** Represents the 'pending' type of the request. */ PENDING("pending"), + + /** Represents the 'stats' type of the request. */ STATS("stats"), + + /** Represents an unknown type of the request. */ UNKNOWN(""); String value; @@ -83,10 +137,21 @@ public class EthStatsRequest { this.value = value; } + /** + * Gets the value of the type. + * + * @return the value of the type + */ public String getValue() { return value; } + /** + * Gets the type from a value string. + * + * @param value the value string + * @return the type + */ public static Type fromValue(final String value) { for (Type type : values()) { if (type.value.equalsIgnoreCase(value)) { diff --git a/ethereum/ethstats/src/main/java/org/hyperledger/besu/ethstats/util/EthStatsConnectOptions.java b/ethereum/ethstats/src/main/java/org/hyperledger/besu/ethstats/util/EthStatsConnectOptions.java index 7f020adf4..1db747352 100644 --- a/ethereum/ethstats/src/main/java/org/hyperledger/besu/ethstats/util/EthStatsConnectOptions.java +++ b/ethereum/ethstats/src/main/java/org/hyperledger/besu/ethstats/util/EthStatsConnectOptions.java @@ -23,24 +23,71 @@ import javax.annotation.Nullable; import org.immutables.value.Value; import org.slf4j.LoggerFactory; +/** + * This interface represents the connection options for Ethereum statistics. It provides methods to + * get the scheme, node name, secret, host, port, contact, and CA certificate. + */ @Value.Immutable public interface EthStatsConnectOptions { + /** + * Gets the scheme of the connection. + * + * @return the scheme of the connection. + */ @Nullable String getScheme(); + /** + * Gets the node name of the connection. + * + * @return the node name of the connection. + */ String getNodeName(); + /** + * Gets the secret of the connection. + * + * @return the secret of the connection. + */ String getSecret(); + /** + * Gets the host of the connection. + * + * @return the host of the connection. + */ String getHost(); + /** + * Gets the port of the connection. + * + * @return the port of the connection. + */ Integer getPort(); + /** + * Gets the contact of the connection. + * + * @return the contact of the connection. + */ String getContact(); + /** + * Gets the CA certificate of the connection. + * + * @return the CA certificate of the connection. + */ @Nullable Path getCaCert(); + /** + * Creates an EthStatsConnectOptions from the given parameters. + * + * @param url the url of the connection + * @param contact the contact of the connection + * @param caCert the CA certificate of the connection + * @return the EthStatsConnectOptions + */ static EthStatsConnectOptions fromParams( final String url, final String contact, final Path caCert) { try { diff --git a/ethereum/ethstats/src/main/java/org/hyperledger/besu/ethstats/util/PrimusHeartBeatsHelper.java b/ethereum/ethstats/src/main/java/org/hyperledger/besu/ethstats/util/PrimusHeartBeatsHelper.java index e96019ef8..03b6634af 100644 --- a/ethereum/ethstats/src/main/java/org/hyperledger/besu/ethstats/util/PrimusHeartBeatsHelper.java +++ b/ethereum/ethstats/src/main/java/org/hyperledger/besu/ethstats/util/PrimusHeartBeatsHelper.java @@ -18,14 +18,29 @@ import java.util.regex.Pattern; import io.vertx.core.http.WebSocket; +/** This class provides helper methods for handling Primus heartbeats. */ public final class PrimusHeartBeatsHelper { + /** The constant PRIMUS_PING_REGEX. */ public static final Pattern PRIMUS_PING_REGEX = Pattern.compile("primus::ping::([\\d]+)"); + private PrimusHeartBeatsHelper() {} + + /** + * Checks if the given request is a heartbeat request. + * + * @param request the request to check + * @return true if the request is a heartbeat request, false otherwise + */ public static boolean isHeartBeatsRequest(final String request) { return PRIMUS_PING_REGEX.matcher(request).find(); } + /** + * Sends a heartbeat response through the given WebSocket. + * + * @param webSocket the WebSocket to send the response through + */ public static void sendHeartBeatsResponse(final WebSocket webSocket) { if (webSocket != null) { webSocket.writeTextMessage(String.format("\"primus::pong::%d\"", System.currentTimeMillis())); diff --git a/ethereum/evmtool/src/main/resources/log4j2.xml b/ethereum/evmtool/src/main/resources/log4j2.xml index 0d3a7de13..8e70c35ee 100644 --- a/ethereum/evmtool/src/main/resources/log4j2.xml +++ b/ethereum/evmtool/src/main/resources/log4j2.xml @@ -6,7 +6,7 @@ - + diff --git a/util/build.gradle b/util/build.gradle index b2a93b1c7..41e4badb3 100644 --- a/util/build.gradle +++ b/util/build.gradle @@ -31,6 +31,8 @@ jar { dependencies { api 'org.slf4j:slf4j-api' + annotationProcessor 'org.apache.logging.log4j:log4j-core' + implementation 'com.google.guava:guava' implementation 'net.java.dev.jna:jna' implementation 'org.apache.commons:commons-lang3' diff --git a/util/src/main/java/org/hyperledger/besu/util/log4j/plugin/BesuLogMessageConverter.java b/util/src/main/java/org/hyperledger/besu/util/log4j/plugin/BesuLogMessageConverter.java new file mode 100644 index 000000000..5598f92f9 --- /dev/null +++ b/util/src/main/java/org/hyperledger/besu/util/log4j/plugin/BesuLogMessageConverter.java @@ -0,0 +1,80 @@ +/* + * Copyright contributors to Hyperledger Besu. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on + * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the + * specific language governing permissions and limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + */ +package org.hyperledger.besu.util.log4j.plugin; + +import org.apache.logging.log4j.core.LogEvent; +import org.apache.logging.log4j.core.config.plugins.Plugin; +import org.apache.logging.log4j.core.pattern.ConverterKeys; +import org.apache.logging.log4j.core.pattern.LogEventPatternConverter; +import org.apache.logging.log4j.core.pattern.PatternConverter; + +/** + * Besu Log4j2 plugin for cleaner message logging. + * + *

Usage: In the pattern layout configuration, replace {@code %msg} with {@code %msgc}. + */ +@Plugin(name = "BesuLogMessageConverter", category = PatternConverter.CATEGORY) +@ConverterKeys({"msgc"}) +public class BesuLogMessageConverter extends LogEventPatternConverter { + + private BesuLogMessageConverter() { + super("BesuLogMessageConverter", null); + } + + /** + * Creates new instance of this class. Required by Log4j2. + * + * @param options Array of options + * @return instance of this class + */ + @SuppressWarnings("unused") // used by Log4j2 + public static BesuLogMessageConverter newInstance(final String[] options) { + return new BesuLogMessageConverter(); + } + + @Override + public void format(final LogEvent event, final StringBuilder toAppendTo) { + final String filteredString = formatBesuLogMessage(event.getMessage().getFormattedMessage()); + toAppendTo.append(filteredString); + } + + /** + * Format Besu log message. + * + * @param input The log message + * @return The formatted log message + */ + public static String formatBesuLogMessage(final String input) { + final StringBuilder builder = new StringBuilder(input.length()); + char prevChar = 0; + + for (int i = 0; i < input.length(); i++) { + final char c = input.charAt(i); + + if (c == 0x0A) { + if (prevChar == 0x0D) { + builder.append(prevChar); + } + builder.append(c); + } else if (c == 0x09 || !Character.isISOControl(c)) { + builder.append(c); + } + + prevChar = c; + } + + return builder.toString(); + } +} diff --git a/util/src/test/java/org/hyperledger/besu/util/log4j/plugin/BesuLogMessageConverterTest.java b/util/src/test/java/org/hyperledger/besu/util/log4j/plugin/BesuLogMessageConverterTest.java new file mode 100644 index 000000000..777e5c31a --- /dev/null +++ b/util/src/test/java/org/hyperledger/besu/util/log4j/plugin/BesuLogMessageConverterTest.java @@ -0,0 +1,39 @@ +/* + * Copyright contributors to Hyperledger Besu. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on + * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the + * specific language governing permissions and limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + */ +package org.hyperledger.besu.util.log4j.plugin; + +import static org.assertj.core.api.Assertions.assertThat; + +import org.junit.jupiter.api.Test; + +public class BesuLogMessageConverterTest { + + @Test + public void logCleanup() { + final StringBuilder testDataBuilder = new StringBuilder("log "); + for (int i = 0; i <= 0x001F; i++) { + testDataBuilder.append((char) i); + } + for (int i = 0x007F; i <= 0x009F; i++) { + testDataBuilder.append((char) i); + } + testDataBuilder.append((char) 0x0D).append((char) 0x0A).append("message"); + + String testData = testDataBuilder.toString(); + String cleanedData = BesuLogMessageConverter.formatBesuLogMessage(testData); + String expectedData = String.format("log %c%c%c%cmessage", 0x09, 0x0A, 0x0D, 0x0A); + assertThat(cleanedData).isEqualTo(expectedData); + } +} From bcacbab467d296825e99e98916fd96b5ee37b424 Mon Sep 17 00:00:00 2001 From: Usman Saleem Date: Thu, 27 Jun 2024 14:03:25 +1000 Subject: [PATCH 20/58] Fix javadoc for ethereum:core top level package (#7270) * javadoc - Apply javadoc to ethereum core top level package --------- Signed-off-by: Usman Saleem --- build.gradle | 1 - .../besu/ethereum/BlockProcessingOutputs.java | 29 +++++++++ .../besu/ethereum/BlockProcessingResult.java | 52 ++++++++++++++++ .../besu/ethereum/BlockValidationResult.java | 40 +++++++++++++ .../besu/ethereum/BlockValidator.java | 49 +++++++++++++++ .../besu/ethereum/ConsensusContext.java | 12 ++++ .../ethereum/ConsensusContextFactory.java | 10 ++++ .../besu/ethereum/GasLimitCalculator.java | 23 +++++++- .../besu/ethereum/MainnetBlockValidator.java | 22 +++++++ .../besu/ethereum/ProtocolContext.java | 59 +++++++++++++++++++ 10 files changed, 295 insertions(+), 2 deletions(-) diff --git a/build.gradle b/build.gradle index d869daf5e..a8e02a883 100644 --- a/build.gradle +++ b/build.gradle @@ -366,7 +366,6 @@ allprojects { '-org.hyperledger.besu.tests.acceptance.*,' + '-org.hyperledger.besu.tests.web3j.generated,' + // TODO: these are temporary disabled (ethereum and sub modules), it should be removed in a future PR. - '-org.hyperledger.besu.ethereum,' + '-org.hyperledger.besu.ethereum.*,' + '-org.hyperledger.besu.evmtool', true) diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/BlockProcessingOutputs.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/BlockProcessingOutputs.java index 4064b1ef1..92d976976 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/BlockProcessingOutputs.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/BlockProcessingOutputs.java @@ -21,17 +21,31 @@ import org.hyperledger.besu.ethereum.core.TransactionReceipt; import java.util.List; import java.util.Optional; +/** Contains the outputs of processing a block. */ public class BlockProcessingOutputs { private final MutableWorldState worldState; private final List receipts; private final Optional> maybeRequests; + /** + * Creates a new instance. + * + * @param worldState the world state after processing the block + * @param receipts the receipts produced by processing the block + */ public BlockProcessingOutputs( final MutableWorldState worldState, final List receipts) { this(worldState, receipts, Optional.empty()); } + /** + * Creates a new instance. + * + * @param worldState the world state after processing the block + * @param receipts the receipts produced by processing the block + * @param maybeRequests the requests produced by processing the block + */ public BlockProcessingOutputs( final MutableWorldState worldState, final List receipts, @@ -41,14 +55,29 @@ public class BlockProcessingOutputs { this.maybeRequests = maybeRequests; } + /** + * Returns the world state after processing the block. + * + * @return the world state after processing the block + */ public MutableWorldState getWorldState() { return worldState; } + /** + * Returns the receipts produced by processing the block. + * + * @return the receipts produced by processing the block + */ public List getReceipts() { return receipts; } + /** + * Returns the requests produced by processing the block. + * + * @return the requests produced by processing the block + */ public Optional> getRequests() { return maybeRequests; } diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/BlockProcessingResult.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/BlockProcessingResult.java index be8b2dd3d..926dd13ab 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/BlockProcessingResult.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/BlockProcessingResult.java @@ -20,24 +20,43 @@ import java.util.ArrayList; import java.util.List; import java.util.Optional; +/** Contains the outputs of processing a block. */ public class BlockProcessingResult extends BlockValidationResult { private final Optional yield; private final boolean isPartial; + /** A result indicating that processing failed. */ public static final BlockProcessingResult FAILED = new BlockProcessingResult("processing failed"); + /** + * A result indicating that processing was successful but incomplete. + * + * @param yield the outputs of processing a block + */ public BlockProcessingResult(final Optional yield) { this.yield = yield; this.isPartial = false; } + /** + * A result indicating that processing was successful but incomplete. + * + * @param yield the outputs of processing a block + * @param isPartial whether the processing was incomplete + */ public BlockProcessingResult( final Optional yield, final boolean isPartial) { this.yield = yield; this.isPartial = isPartial; } + /** + * A result indicating that processing was successful but incomplete. + * + * @param yield the outputs of processing a block + * @param errorMessage the error message if any + */ public BlockProcessingResult( final Optional yield, final String errorMessage) { super(errorMessage); @@ -45,6 +64,12 @@ public class BlockProcessingResult extends BlockValidationResult { this.isPartial = false; } + /** + * A result indicating that processing was successful but incomplete. + * + * @param yield the outputs of processing a block + * @param cause the cause of the error if any + */ public BlockProcessingResult( final Optional yield, final Throwable cause) { super(cause.getLocalizedMessage(), cause); @@ -52,6 +77,13 @@ public class BlockProcessingResult extends BlockValidationResult { this.isPartial = false; } + /** + * A result indicating that processing was successful but incomplete. + * + * @param yield the outputs of processing a block + * @param errorMessage the error message if any + * @param isPartial whether the processing was incomplete + */ public BlockProcessingResult( final Optional yield, final String errorMessage, @@ -61,20 +93,40 @@ public class BlockProcessingResult extends BlockValidationResult { this.isPartial = isPartial; } + /** + * A result indicating that processing failed. + * + * @param errorMessage the error message + */ public BlockProcessingResult(final String errorMessage) { super(errorMessage); this.isPartial = false; this.yield = Optional.empty(); } + /** + * Gets the block processing outputs of the result. + * + * @return the block processing outputs of the result + */ public Optional getYield() { return yield; } + /** + * Checks if the processing was incomplete. + * + * @return true if the processing was incomplete, false otherwise + */ public boolean isPartial() { return isPartial; } + /** + * Gets the transaction receipts of the result. + * + * @return the transaction receipts of the result + */ public List getReceipts() { if (yield.isEmpty()) { return new ArrayList<>(); diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/BlockValidationResult.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/BlockValidationResult.java index 68a13c7d9..83734e29c 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/BlockValidationResult.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/BlockValidationResult.java @@ -16,38 +16,78 @@ package org.hyperledger.besu.ethereum; import java.util.Optional; +/** + * Represents the result of a block validation. This class holds the success status, error message, + * and cause of the validation. + */ public class BlockValidationResult { + /** The error message of the failed validation, if any. */ public final Optional errorMessage; + + /** The cause of the failed validation, if any. */ public final Optional cause; + + /** + * The success status of the validation. True if the validation was successful, false otherwise. + */ public final boolean success; + /** Constructs a new BlockValidationResult indicating a successful validation. */ public BlockValidationResult() { this.success = true; this.errorMessage = Optional.empty(); this.cause = Optional.empty(); } + /** + * Constructs a new BlockValidationResult indicating a failed validation with the given error + * message. + * + * @param errorMessage the error message of the failed validation + */ public BlockValidationResult(final String errorMessage) { this.success = false; this.errorMessage = Optional.of(errorMessage); this.cause = Optional.empty(); } + /** + * Constructs a new BlockValidationResult indicating a failed validation with the given error + * message and cause. + * + * @param errorMessage the error message of the failed validation + * @param cause the cause of the failed validation + */ public BlockValidationResult(final String errorMessage, final Throwable cause) { this.success = false; this.errorMessage = Optional.of(errorMessage); this.cause = Optional.of(cause); } + /** + * Checks if the validation was successful. + * + * @return true if the validation was successful, false otherwise + */ public boolean isSuccessful() { return this.success; } + /** + * Checks if the validation failed. + * + * @return true if the validation failed, false otherwise + */ public boolean isFailed() { return !isSuccessful(); } + /** + * Gets the cause of the failed validation. + * + * @return the cause of the failed validation + */ public Optional causedBy() { return cause; } diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/BlockValidator.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/BlockValidator.java index dc4c071ec..e8136062b 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/BlockValidator.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/BlockValidator.java @@ -22,14 +22,39 @@ import org.hyperledger.besu.ethereum.mainnet.HeaderValidationMode; import java.util.List; import java.util.Optional; +/** + * The BlockValidator interface defines the methods for validating and processing blocks in the + * Ethereum protocol. + */ public interface BlockValidator { + /** + * Validates and processes a block with the given context, block, header validation mode, and + * ommer validation mode. + * + * @param context the protocol context + * @param block the block to validate and process + * @param headerValidationMode the header validation mode + * @param ommerValidationMode the ommer validation mode + * @return the result of the block processing + */ BlockProcessingResult validateAndProcessBlock( final ProtocolContext context, final Block block, final HeaderValidationMode headerValidationMode, final HeaderValidationMode ommerValidationMode); + /** + * Validates and processes a block with the given context, block, header validation mode, ommer + * validation mode, and persistence flag. + * + * @param context the protocol context + * @param block the block to validate and process + * @param headerValidationMode the header validation mode + * @param ommerValidationMode the ommer validation mode + * @param shouldPersist flag indicating whether the block should be persisted + * @return the result of the block processing + */ BlockProcessingResult validateAndProcessBlock( final ProtocolContext context, final Block block, @@ -37,6 +62,18 @@ public interface BlockValidator { final HeaderValidationMode ommerValidationMode, final boolean shouldPersist); + /** + * Validates and processes a block with the given context, block, header validation mode, ommer + * validation mode, persistence flag, and bad block recording flag. + * + * @param context the protocol context + * @param block the block to validate and process + * @param headerValidationMode the header validation mode + * @param ommerValidationMode the ommer validation mode + * @param shouldPersist flag indicating whether the block should be persisted + * @param shouldRecordBadBlock flag indicating whether bad blocks should be recorded + * @return the result of the block processing + */ BlockProcessingResult validateAndProcessBlock( final ProtocolContext context, final Block block, @@ -45,6 +82,18 @@ public interface BlockValidator { final boolean shouldPersist, final boolean shouldRecordBadBlock); + /** + * Performs fast block validation with the given context, block, transaction receipts, requests, + * header validation mode, and ommer validation mode. + * + * @param context the protocol context + * @param block the block to validate + * @param receipts the transaction receipts + * @param requests the requests + * @param headerValidationMode the header validation mode + * @param ommerValidationMode the ommer validation mode + * @return true if the block is valid, false otherwise + */ boolean fastBlockValidation( final ProtocolContext context, final Block block, diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/ConsensusContext.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/ConsensusContext.java index dc1c117ae..33ade39ab 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/ConsensusContext.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/ConsensusContext.java @@ -14,7 +14,19 @@ */ package org.hyperledger.besu.ethereum; +/** + * The ConsensusContext interface defines a method for casting the consensus context to a specific + * class. + */ @FunctionalInterface public interface ConsensusContext { + + /** + * Casts the consensus context to the specified class. + * + * @param the type of the class to cast the consensus context to + * @param klass the class to cast the consensus context to + * @return the consensus context cast to the specified class + */ C as(final Class klass); } diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/ConsensusContextFactory.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/ConsensusContextFactory.java index 848d86119..a9381fa19 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/ConsensusContextFactory.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/ConsensusContextFactory.java @@ -18,9 +18,19 @@ import org.hyperledger.besu.ethereum.chain.Blockchain; import org.hyperledger.besu.ethereum.mainnet.ProtocolSchedule; import org.hyperledger.besu.ethereum.worldstate.WorldStateArchive; +/** The ConsensusContextFactory interface defines a method for creating a consensus context. */ @FunctionalInterface public interface ConsensusContextFactory { + /** + * Creates a consensus context with the given blockchain, world state archive, and protocol + * schedule. + * + * @param blockchain the blockchain + * @param worldStateArchive the world state archive + * @param protocolSchedule the protocol schedule + * @return the created consensus context + */ ConsensusContext create( Blockchain blockchain, WorldStateArchive worldStateArchive, diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/GasLimitCalculator.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/GasLimitCalculator.java index 3d5375c40..7c15d6229 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/GasLimitCalculator.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/GasLimitCalculator.java @@ -14,16 +14,37 @@ */ package org.hyperledger.besu.ethereum; +/** The GasLimitCalculator interface defines methods for calculating the gas limit. */ public interface GasLimitCalculator { - static final long BLOB_GAS_LIMIT = 786432; + /** The constant BLOB_GAS_LIMIT represents the gas limit for blob data. */ + long BLOB_GAS_LIMIT = 786432; + /** + * Calculates the next gas limit based on the current gas limit, target gas limit, and new block + * number. + * + * @param currentGasLimit the current gas limit + * @param targetGasLimit the target gas limit + * @param newBlockNumber the new block number + * @return the calculated next gas limit + */ long nextGasLimit(long currentGasLimit, long targetGasLimit, long newBlockNumber); + /** + * Returns a GasLimitCalculator that always returns the current gas limit. + * + * @return a GasLimitCalculator that always returns the current gas limit + */ static GasLimitCalculator constant() { return (currentGasLimit, targetGasLimit, newBlockNumber) -> currentGasLimit; } + /** + * Returns the current blob gas limit. + * + * @return the current blob gas limit + */ default long currentBlobGasLimit() { return BLOB_GAS_LIMIT; } diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/MainnetBlockValidator.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/MainnetBlockValidator.java index 1b2847d08..5d80a9515 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/MainnetBlockValidator.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/MainnetBlockValidator.java @@ -36,14 +36,36 @@ import java.util.Optional; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +/** + * The MainnetBlockValidator class implements the BlockValidator interface for the Mainnet Ethereum + * network. It validates and processes blocks according to the rules of the Mainnet Ethereum + * network. + */ public class MainnetBlockValidator implements BlockValidator { private static final Logger LOG = LoggerFactory.getLogger(MainnetBlockValidator.class); + + /** The BlockHeaderValidator used to validate block headers. */ protected final BlockHeaderValidator blockHeaderValidator; + + /** The BlockBodyValidator used to validate block bodies. */ protected final BlockBodyValidator blockBodyValidator; + + /** The BlockProcessor used to process blocks. */ protected final BlockProcessor blockProcessor; + + /** The BadBlockManager used to manage bad blocks. */ protected final BadBlockManager badBlockManager; + /** + * Constructs a new MainnetBlockValidator with the given BlockHeaderValidator, BlockBodyValidator, + * BlockProcessor, and BadBlockManager. + * + * @param blockHeaderValidator the BlockHeaderValidator used to validate block headers + * @param blockBodyValidator the BlockBodyValidator used to validate block bodies + * @param blockProcessor the BlockProcessor used to process blocks + * @param badBlockManager the BadBlockManager used to manage bad blocks + */ public MainnetBlockValidator( final BlockHeaderValidator blockHeaderValidator, final BlockBodyValidator blockBodyValidator, diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/ProtocolContext.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/ProtocolContext.java index 1468c6210..e5ec5ae09 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/ProtocolContext.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/ProtocolContext.java @@ -35,6 +35,15 @@ public class ProtocolContext { private Optional synchronizer; + /** + * Constructs a new ProtocolContext with the given blockchain, world state archive, consensus + * context, and bad block manager. + * + * @param blockchain the blockchain of the protocol context + * @param worldStateArchive the world state archive of the protocol context + * @param consensusContext the consensus context of the protocol context + * @param badBlockManager the bad block manager of the protocol context + */ public ProtocolContext( final MutableBlockchain blockchain, final WorldStateArchive worldStateArchive, @@ -47,6 +56,17 @@ public class ProtocolContext { this.badBlockManager = badBlockManager; } + /** + * Initializes a new ProtocolContext with the given blockchain, world state archive, protocol + * schedule, consensus context factory, and bad block manager. + * + * @param blockchain the blockchain of the protocol context + * @param worldStateArchive the world state archive of the protocol context + * @param protocolSchedule the protocol schedule of the protocol context + * @param consensusContextFactory the consensus context factory of the protocol context + * @param badBlockManager the bad block manager of the protocol context + * @return the initialized ProtocolContext + */ public static ProtocolContext init( final MutableBlockchain blockchain, final WorldStateArchive worldStateArchive, @@ -60,30 +80,69 @@ public class ProtocolContext { badBlockManager); } + /** + * Gets the synchronizer of the protocol context. + * + * @return the synchronizer of the protocol context + */ public Optional getSynchronizer() { return synchronizer; } + /** + * Sets the synchronizer of the protocol context. + * + * @param synchronizer the synchronizer to set + */ public void setSynchronizer(final Optional synchronizer) { this.synchronizer = synchronizer; } + /** + * Gets the blockchain of the protocol context. + * + * @return the blockchain of the protocol context + */ public MutableBlockchain getBlockchain() { return blockchain; } + /** + * Gets the world state archive of the protocol context. + * + * @return the world state archive of the protocol context + */ public WorldStateArchive getWorldStateArchive() { return worldStateArchive; } + /** + * Gets the bad block manager of the protocol context. + * + * @return the bad block manager of the protocol context + */ public BadBlockManager getBadBlockManager() { return badBlockManager; } + /** + * Gets the consensus context of the protocol context. + * + * @param the type of the consensus context + * @param klass the klass + * @return the consensus context of the protocol context + */ public C getConsensusContext(final Class klass) { return consensusContext.as(klass); } + /** + * Gets the safe consensus context of the protocol context. + * + * @param the type of the consensus context + * @param klass the klass + * @return the consensus context of the protocol context + */ public Optional safeConsensusContext(final Class klass) { return Optional.ofNullable(consensusContext) .filter(c -> klass.isAssignableFrom(c.getClass())) From 571e03096dec1e5dbd8d6d9295e015b772b2bd08 Mon Sep 17 00:00:00 2001 From: Sally MacFarlane Date: Thu, 27 Jun 2024 15:10:19 +1000 Subject: [PATCH 21/58] Disable Flaky tests - permissioning (#7256) * disable some flaky tests Signed-off-by: Sally MacFarlane * correct name for test Signed-off-by: Sally MacFarlane * formatting Signed-off-by: Sally MacFarlane * disable some flaky tests Signed-off-by: Sally MacFarlane --------- Signed-off-by: Sally MacFarlane Co-authored-by: Usman Saleem --- .../NodeSmartContractPermissioningAcceptanceTest.java | 2 ++ .../NodeSmartContractPermissioningV2AcceptanceTest.java | 2 ++ ...NodeSmartContractPermissioningV2DNSAcceptanceTest.java | 8 ++------ .../api/jsonrpc/internal/methods/EthEstimateGasTest.java | 2 +- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/acceptance-tests/tests/src/test/java/org/hyperledger/besu/tests/acceptance/permissioning/NodeSmartContractPermissioningAcceptanceTest.java b/acceptance-tests/tests/src/test/java/org/hyperledger/besu/tests/acceptance/permissioning/NodeSmartContractPermissioningAcceptanceTest.java index 8f17c78ad..903919c80 100644 --- a/acceptance-tests/tests/src/test/java/org/hyperledger/besu/tests/acceptance/permissioning/NodeSmartContractPermissioningAcceptanceTest.java +++ b/acceptance-tests/tests/src/test/java/org/hyperledger/besu/tests/acceptance/permissioning/NodeSmartContractPermissioningAcceptanceTest.java @@ -17,6 +17,7 @@ package org.hyperledger.besu.tests.acceptance.permissioning; import org.hyperledger.besu.tests.acceptance.dsl.node.Node; import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; public class NodeSmartContractPermissioningAcceptanceTest @@ -57,6 +58,7 @@ public class NodeSmartContractPermissioningAcceptanceTest } @Test + @Disabled("test is flaky") public void permissionedNodeShouldPeerOnlyWithAllowedNodes() { bootnode.verify(net.awaitPeerCount(3)); allowedNode.verify(net.awaitPeerCount(3)); diff --git a/acceptance-tests/tests/src/test/java/org/hyperledger/besu/tests/acceptance/permissioning/NodeSmartContractPermissioningV2AcceptanceTest.java b/acceptance-tests/tests/src/test/java/org/hyperledger/besu/tests/acceptance/permissioning/NodeSmartContractPermissioningV2AcceptanceTest.java index 843d14004..efb88178d 100644 --- a/acceptance-tests/tests/src/test/java/org/hyperledger/besu/tests/acceptance/permissioning/NodeSmartContractPermissioningV2AcceptanceTest.java +++ b/acceptance-tests/tests/src/test/java/org/hyperledger/besu/tests/acceptance/permissioning/NodeSmartContractPermissioningV2AcceptanceTest.java @@ -17,6 +17,7 @@ package org.hyperledger.besu.tests.acceptance.permissioning; import org.hyperledger.besu.tests.acceptance.dsl.node.Node; import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; public class NodeSmartContractPermissioningV2AcceptanceTest @@ -51,6 +52,7 @@ public class NodeSmartContractPermissioningV2AcceptanceTest } @Test + @Disabled("test is flaky") public void permissionedNodeShouldPeerOnlyWithAllowedNodes() { bootnode.verify(net.awaitPeerCount(3)); allowedNode.verify(net.awaitPeerCount(3)); diff --git a/acceptance-tests/tests/src/test/java/org/hyperledger/besu/tests/acceptance/permissioning/NodeSmartContractPermissioningV2DNSAcceptanceTest.java b/acceptance-tests/tests/src/test/java/org/hyperledger/besu/tests/acceptance/permissioning/NodeSmartContractPermissioningV2DNSAcceptanceTest.java index 7a55283e4..435333a77 100644 --- a/acceptance-tests/tests/src/test/java/org/hyperledger/besu/tests/acceptance/permissioning/NodeSmartContractPermissioningV2DNSAcceptanceTest.java +++ b/acceptance-tests/tests/src/test/java/org/hyperledger/besu/tests/acceptance/permissioning/NodeSmartContractPermissioningV2DNSAcceptanceTest.java @@ -25,8 +25,10 @@ import java.net.UnknownHostException; import org.assertj.core.api.Assertions; import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; +@Disabled("test is flaky #7191") public class NodeSmartContractPermissioningV2DNSAcceptanceTest extends NodeSmartContractPermissioningV2AcceptanceTestBase { @@ -57,12 +59,6 @@ public class NodeSmartContractPermissioningV2DNSAcceptanceTest permissionedNode.execute(allowNode(permissionedNode)); permissionedNode.verify(connectionIsAllowed(permissionedNode)); - - // Verify initial configuration - bootnode.verify(net.awaitPeerCount(3)); - allowedNode.verify(net.awaitPeerCount(3)); - forbiddenNode.verify(net.awaitPeerCount(2)); - permissionedNode.verify(net.awaitPeerCount(2)); } @Test diff --git a/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/EthEstimateGasTest.java b/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/EthEstimateGasTest.java index 98b922640..aa52a31c1 100644 --- a/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/EthEstimateGasTest.java +++ b/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/EthEstimateGasTest.java @@ -361,7 +361,7 @@ public class EthEstimateGasTest { } @Test - public void shouldNotIgnoreSenderBalanceAccountWhenStrictModeDisabled() { + public void shouldNotIgnoreSenderBalanceAccountWhenStrictModeEnabled() { final JsonRpcRequestContext request = ethEstimateGasRequest(legacyTransactionCallParameter(Wei.ZERO, true)); mockTransientProcessorResultGasEstimate(1L, false, true); From d7f851071ccadd88149ebc6eda382c06c706a05e Mon Sep 17 00:00:00 2001 From: Matt Whitehead Date: Thu, 27 Jun 2024 11:34:44 +0100 Subject: [PATCH 22/58] Add bootnodes to the maintained peer list (#7257) * Add bootnodes to the maintained peer list Signed-off-by: Matthew Whitehead * Update unit tests Signed-off-by: Matthew Whitehead * Add entry in changelog Signed-off-by: Matthew Whitehead * Tweak unit test Signed-off-by: Matthew Whitehead * Refactor to keep common steps the same for both cases Signed-off-by: Matthew Whitehead * Add debug log, call sanitizePeers() only once Signed-off-by: Matthew Whitehead --------- Signed-off-by: Matthew Whitehead --- CHANGELOG.md | 1 + ...eSmartContractPermissioningAcceptanceTest.java | 4 ++-- ...martContractPermissioningV2AcceptanceTest.java | 6 +++--- .../java/org/hyperledger/besu/RunnerBuilder.java | 15 ++++++++++++++- 4 files changed, 20 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 07cdf5863..4eb0b5166 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,6 +15,7 @@ - Update Docker base image to Ubuntu 24.04 [#7251](https://github.com/hyperledger/besu/pull/7251) - Add LUKSO as predefined network name [#7223](https://github.com/hyperledger/besu/pull/7223) - Refactored how code, initcode, and max stack size are configured in forks. [#7245](https://github.com/hyperledger/besu/pull/7245) +- Nodes in a permissioned chain maintain (and retry) connections to bootnodes [#7257](https://github.com/hyperledger/besu/pull/7257) ### Bug fixes - Validation errors ignored in accounts-allowlist and empty list [#7138](https://github.com/hyperledger/besu/issues/7138) diff --git a/acceptance-tests/tests/src/test/java/org/hyperledger/besu/tests/acceptance/permissioning/NodeSmartContractPermissioningAcceptanceTest.java b/acceptance-tests/tests/src/test/java/org/hyperledger/besu/tests/acceptance/permissioning/NodeSmartContractPermissioningAcceptanceTest.java index 903919c80..f1ed4e149 100644 --- a/acceptance-tests/tests/src/test/java/org/hyperledger/besu/tests/acceptance/permissioning/NodeSmartContractPermissioningAcceptanceTest.java +++ b/acceptance-tests/tests/src/test/java/org/hyperledger/besu/tests/acceptance/permissioning/NodeSmartContractPermissioningAcceptanceTest.java @@ -38,9 +38,10 @@ public class NodeSmartContractPermissioningAcceptanceTest permissionedCluster.start(bootnode, forbiddenNode, allowedNode, permissionedNode); // updating permissioning smart contract with allowed nodes - + permissionedNode.verify(nodeIsForbidden(bootnode)); permissionedNode.execute(allowNode(bootnode)); permissionedNode.verify(nodeIsAllowed(bootnode)); + permissionedNode.verify(admin.hasPeer(bootnode)); permissionedNode.execute(allowNode(allowedNode)); permissionedNode.verify(nodeIsAllowed(allowedNode)); @@ -48,7 +49,6 @@ public class NodeSmartContractPermissioningAcceptanceTest permissionedNode.execute(allowNode(permissionedNode)); permissionedNode.verify(nodeIsAllowed(permissionedNode)); - permissionedNode.verify(admin.addPeer(bootnode)); permissionedNode.verify(admin.addPeer(allowedNode)); allowedNode.verify(eth.syncingStatus(false)); diff --git a/acceptance-tests/tests/src/test/java/org/hyperledger/besu/tests/acceptance/permissioning/NodeSmartContractPermissioningV2AcceptanceTest.java b/acceptance-tests/tests/src/test/java/org/hyperledger/besu/tests/acceptance/permissioning/NodeSmartContractPermissioningV2AcceptanceTest.java index efb88178d..1f2cc682c 100644 --- a/acceptance-tests/tests/src/test/java/org/hyperledger/besu/tests/acceptance/permissioning/NodeSmartContractPermissioningV2AcceptanceTest.java +++ b/acceptance-tests/tests/src/test/java/org/hyperledger/besu/tests/acceptance/permissioning/NodeSmartContractPermissioningV2AcceptanceTest.java @@ -62,7 +62,7 @@ public class NodeSmartContractPermissioningV2AcceptanceTest @Test public void permissionedNodeShouldDisconnectFromNodeNotPermittedAnymore() { - permissionedNode.verify(admin.addPeer(bootnode)); + permissionedNode.verify(admin.hasPeer(bootnode)); permissionedNode.verify(admin.addPeer(allowedNode)); permissionedNode.verify(net.awaitPeerCount(2)); @@ -74,7 +74,7 @@ public class NodeSmartContractPermissioningV2AcceptanceTest @Test public void permissionedNodeShouldConnectToNewlyPermittedNode() { - permissionedNode.verify(admin.addPeer(bootnode)); + permissionedNode.verify(admin.hasPeer(bootnode)); permissionedNode.verify(admin.addPeer(allowedNode)); permissionedNode.verify(net.awaitPeerCount(2)); @@ -89,7 +89,7 @@ public class NodeSmartContractPermissioningV2AcceptanceTest @Test public void permissioningUpdatesPropagateThroughNetwork() { - permissionedNode.verify(admin.addPeer(bootnode)); + permissionedNode.verify(admin.hasPeer(bootnode)); permissionedNode.verify(admin.addPeer(allowedNode)); permissionedNode.verify(net.awaitPeerCount(2)); diff --git a/besu/src/main/java/org/hyperledger/besu/RunnerBuilder.java b/besu/src/main/java/org/hyperledger/besu/RunnerBuilder.java index 1f9c48ccc..e9f9ef626 100644 --- a/besu/src/main/java/org/hyperledger/besu/RunnerBuilder.java +++ b/besu/src/main/java/org/hyperledger/besu/RunnerBuilder.java @@ -790,7 +790,20 @@ public class RunnerBuilder { LOG.debug("added ethash observer: {}", stratumServer.get()); } - sanitizePeers(network, staticNodes) + final Stream maintainedPeers; + if (besuController.getGenesisConfigOptions().isPoa()) { + // In a permissioned chain Besu should maintain connections to both static nodes and + // bootnodes, which includes retries periodically + maintainedPeers = + sanitizePeers( + network, + Stream.concat(staticNodes.stream(), bootnodes.stream()).collect(Collectors.toList())); + LOG.debug("Added bootnodes to the maintained peer list"); + } else { + // In a public chain only maintain connections to static nodes + maintainedPeers = sanitizePeers(network, staticNodes); + } + maintainedPeers .map(DefaultPeer::fromEnodeURL) .forEach(peerNetwork::addMaintainedConnectionPeer); From 3c5ce8bb897b47ddd32f9984f3e767aa2f2105bd Mon Sep 17 00:00:00 2001 From: Usman Saleem Date: Fri, 28 Jun 2024 10:40:55 +1000 Subject: [PATCH 23/58] Fix javadoc for ethereum api module, graphql package (#7272) * javadoc - Adding missing javadocs ethereum:api graphql package Signed-off-by: Usman Saleem --- build.gradle | 62 ++++- .../besu/ethereum/api/ApiConfiguration.java | 67 +++++ .../api/graphql/GraphQLConfiguration.java | 78 +++++- .../api/graphql/GraphQLContextType.java | 21 +- .../graphql/GraphQLDataFetcherContext.java | 38 +++ .../GraphQLDataFetcherContextImpl.java | 33 +++ .../api/graphql/GraphQLDataFetchers.java | 89 ++++++ .../api/graphql/GraphQLHttpService.java | 43 +++ .../ethereum/api/graphql/GraphQLProvider.java | 18 ++ .../api/graphql/internal/Scalars.java | 47 ++++ .../pojoadapter/AccessListEntryAdapter.java | 21 ++ .../internal/pojoadapter/AccountAdapter.java | 55 ++++ .../pojoadapter/BlockAdapterBase.java | 158 +++++++++++ .../internal/pojoadapter/CallResult.java | 29 ++ .../pojoadapter/EmptyAccountAdapter.java | 13 + .../internal/pojoadapter/LogAdapter.java | 41 +++ .../pojoadapter/NormalBlockAdapter.java | 59 ++++ .../pojoadapter/PendingStateAdapter.java | 65 ++++- .../pojoadapter/SyncStateAdapter.java | 30 +++ .../pojoadapter/TransactionAdapter.java | 253 ++++++++++++++++++ .../pojoadapter/WithdrawalAdapter.java | 34 +++ .../internal/response/GraphQLError.java | 133 ++++++--- .../response/GraphQLErrorResponse.java | 14 + .../internal/response/GraphQLJsonRequest.java | 41 +++ .../internal/response/GraphQLNoResponse.java | 12 + .../internal/response/GraphQLResponse.java | 22 +- .../response/GraphQLResponseType.java | 7 + .../response/GraphQLSuccessResponse.java | 21 ++ .../ethereum/p2p/testing/MockNetwork.java | 5 + 29 files changed, 1465 insertions(+), 44 deletions(-) diff --git a/build.gradle b/build.gradle index a8e02a883..1adc3b992 100644 --- a/build.gradle +++ b/build.gradle @@ -365,9 +365,65 @@ allprojects { options.addBooleanOption('Xdoclint/package:-org.hyperledger.besu.privacy.contracts.generated,' + '-org.hyperledger.besu.tests.acceptance.*,' + '-org.hyperledger.besu.tests.web3j.generated,' + - // TODO: these are temporary disabled (ethereum and sub modules), it should be removed in a future PR. - '-org.hyperledger.besu.ethereum.*,' + - '-org.hyperledger.besu.evmtool', + // TODO: these are temporary excluded from lint (ethereum sub modules), it should be removed in a future PR. + // ethereum api module + '-org.hyperledger.besu.ethereum.api.handlers,' + + '-org.hyperledger.besu.ethereum.api.jsonrpc,' + + '-org.hyperledger.besu.ethereum.api.jsonrpc.*,' + + '-org.hyperledger.besu.ethereum.api.query,' + + '-org.hyperledger.besu.ethereum.api.query.*,' + + '-org.hyperledger.besu.ethereum.api.tls,' + + '-org.hyperledger.besu.ethereum.api.util,' + + // ethereum blockcreation module + '-org.hyperledger.besu.ethereum.blockcreation,' + + '-org.hyperledger.besu.ethereum.blockcreation.*,' + + // ethereum core module + '-org.hyperledger.besu.ethereum.chain,' + + '-org.hyperledger.besu.ethereum.core,' + + '-org.hyperledger.besu.ethereum.core.*,' + + '-org.hyperledger.besu.ethereum.debug,' + + '-org.hyperledger.besu.ethereum.difficulty.fixed,' + + '-org.hyperledger.besu.ethereum.forkid,' + + '-org.hyperledger.besu.ethereum.mainnet,' + + '-org.hyperledger.besu.ethereum.mainnet.*,' + + '-org.hyperledger.besu.ethereum.privacy,' + + '-org.hyperledger.besu.ethereum.privacy.*,' + + '-org.hyperledger.besu.ethereum.processing,' + + '-org.hyperledger.besu.ethereum.proof,' + + '-org.hyperledger.besu.ethereum.storage,' + + '-org.hyperledger.besu.ethereum.storage.*,' + + '-org.hyperledger.besu.ethereum.transaction,' + + '-org.hyperledger.besu.ethereum.trie.*,' + + '-org.hyperledger.besu.ethereum.util,' + + '-org.hyperledger.besu.ethereum.vm,' + + '-org.hyperledger.besu.ethereum.worldstate,' + + // ethereum eth module + '-org.hyperledger.besu.ethereum.eth.*,' + + '-org.hyperledger.besu.ethereum.eth,' + + '-org.hyperledger.besu.consensus.merge,' + + // evmtool module + '-org.hyperledger.besu.evmtool,' + + // p2p module + '-org.hyperledger.besu.ethereum.p2p,' + + '-org.hyperledger.besu.ethereum.p2p.*,' + + // permissioning module + '-org.hyperledger.besu.ethereum.permissioning,' + + '-org.hyperledger.besu.ethereum.permissioning.*,' + + // referencetests module + '-org.hyperledger.besu.ethereum.referencetests,' + + // retesteth module + '-org.hyperledger.besu.ethereum.retesteth.methods,' + + '-org.hyperledger.besu.ethereum.retesteth,' + + //rlp module + '-org.hyperledger.besu.ethereum.rlp,' + + // stratum module + '-org.hyperledger.besu.ethereum.stratum,' + + // trie module + '-org.hyperledger.besu.ethereum.trie.*,' + + '-org.hyperledger.besu.ethereum.trie,' + + // verkle trie module + '-org.hyperledger.besu.ethereum.verkletrie,' + + '-org.hyperledger.besu.ethereum.verkletrie.*', true) options.addStringOption('Xmaxerrs','65535') options.addStringOption('Xmaxwarns','65535') diff --git a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/ApiConfiguration.java b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/ApiConfiguration.java index 334b71690..e317845f8 100644 --- a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/ApiConfiguration.java +++ b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/ApiConfiguration.java @@ -18,58 +18,125 @@ import org.hyperledger.besu.datatypes.Wei; import org.immutables.value.Value; +/** + * The ApiConfiguration class provides configuration for the API. It includes default values for gas + * price, max logs range, gas cap, and other parameters. + */ @Value.Immutable @Value.Style(allParameters = true) public abstract class ApiConfiguration { + /** + * The default lower bound coefficient for gas and priority fee. This value is used as the default + * lower bound when calculating the gas and priority fee. + */ public static final long DEFAULT_LOWER_BOUND_GAS_AND_PRIORITY_FEE_COEFFICIENT = 0L; + + /** + * The default upper bound coefficient for gas and priority fee. This value is used as the default + * upper bound when calculating the gas and priority fee. + */ public static final long DEFAULT_UPPER_BOUND_GAS_AND_PRIORITY_FEE_COEFFICIENT = Long.MAX_VALUE; + /** Constructs a new ApiConfiguration with default values. */ + protected ApiConfiguration() {} + + /** + * Returns the number of blocks to consider for gas price calculations. Default value is 100. + * + * @return the number of blocks for gas price calculations + */ @Value.Default public long getGasPriceBlocks() { return 100; } + /** + * Returns the percentile to use for gas price calculations. Default value is 50.0. + * + * @return the percentile for gas price calculations + */ @Value.Default public double getGasPricePercentile() { return 50.0d; } + /** + * Returns the maximum gas price. Default value is 500 GWei. + * + * @return the maximum gas price + */ @Value.Default public Wei getGasPriceMax() { return Wei.of(500_000_000_000L); // 500 GWei } + /** + * Returns the fraction to use for gas price calculations. This is derived from the gas price + * percentile. + * + * @return the fraction for gas price calculations + */ @Value.Derived public double getGasPriceFraction() { return getGasPricePercentile() / 100.0; } + /** + * Returns the maximum range for logs. Default value is 5000. + * + * @return the maximum range for logs + */ @Value.Default public Long getMaxLogsRange() { return 5000L; } + /** + * Returns the gas cap. Default value is 0. + * + * @return the gas cap + */ @Value.Default public Long getGasCap() { return 0L; } + /** + * Returns whether gas and priority fee limiting is enabled. Default value is false. + * + * @return true if gas and priority fee limiting is enabled, false otherwise + */ @Value.Default public boolean isGasAndPriorityFeeLimitingEnabled() { return false; } + /** + * Returns the lower bound coefficient for gas and priority fee. Default value is 0. + * + * @return the lower bound coefficient for gas and priority fee + */ @Value.Default public Long getLowerBoundGasAndPriorityFeeCoefficient() { return DEFAULT_LOWER_BOUND_GAS_AND_PRIORITY_FEE_COEFFICIENT; } + /** + * Returns the upper bound coefficient for gas and priority fee. Default value is Long.MAX_VALUE. + * + * @return the upper bound coefficient for gas and priority fee + */ @Value.Default public Long getUpperBoundGasAndPriorityFeeCoefficient() { return DEFAULT_UPPER_BOUND_GAS_AND_PRIORITY_FEE_COEFFICIENT; } + /** + * Returns the maximum range for trace filter. Default value is 1000. + * + * @return the maximum range for trace filter + */ @Value.Default public Long getMaxTraceFilterRange() { return 1000L; diff --git a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/graphql/GraphQLConfiguration.java b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/graphql/GraphQLConfiguration.java index 8c32b5528..a2829edb0 100644 --- a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/graphql/GraphQLConfiguration.java +++ b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/graphql/GraphQLConfiguration.java @@ -26,17 +26,33 @@ import java.util.Objects; import com.google.common.base.MoreObjects; +/** + * Represents the configuration for GraphQL. This class is used to set and get the configuration + * details for GraphQL such as enabling GraphQL, setting the port and host, setting the allowed + * domains for CORS, setting the hosts allowlist, and setting the HTTP timeout. + */ public class GraphQLConfiguration { private static final String DEFAULT_GRAPHQL_HTTP_HOST = "127.0.0.1"; + + /** The default port number for the GraphQL HTTP server. */ public static final int DEFAULT_GRAPHQL_HTTP_PORT = 8547; private boolean enabled; private int port; private String host; private List corsAllowedDomains = Collections.emptyList(); - private List hostsAllowlist = Arrays.asList("localhost", "127.0.0.1"); + private List hostsAllowlist = Arrays.asList("localhost", DEFAULT_GRAPHQL_HTTP_HOST); private long httpTimeoutSec = TimeoutOptions.defaultOptions().getTimeoutSeconds(); + /** + * Creates a default configuration for GraphQL. + * + *

This method initializes a new GraphQLConfiguration object with default settings. The default + * settings are: - GraphQL is not enabled - The port is set to the default GraphQL HTTP port - The + * host is set to the default GraphQL HTTP host - The HTTP timeout is set to the default timeout + * + * @return a GraphQLConfiguration object with default settings + */ public static GraphQLConfiguration createDefault() { final GraphQLConfiguration config = new GraphQLConfiguration(); config.setEnabled(false); @@ -48,52 +64,112 @@ public class GraphQLConfiguration { private GraphQLConfiguration() {} + /** + * Checks if GraphQL is enabled. + * + * @return true if GraphQL is enabled, false otherwise + */ public boolean isEnabled() { return enabled; } + /** + * Sets the enabled status of GraphQL. + * + * @param enabled the status to set. true to enable GraphQL, false to disable it + */ public void setEnabled(final boolean enabled) { this.enabled = enabled; } + /** + * Retrieves the port number for the GraphQL HTTP server. + * + * @return the port number + */ public int getPort() { return port; } + /** + * Sets the port number for the GraphQL HTTP server. + * + * @param port the port number to set + */ public void setPort(final int port) { this.port = port; } + /** + * Retrieves the host for the GraphQL HTTP server. + * + * @return the host + */ public String getHost() { return host; } + /** + * Sets the host for the GraphQL HTTP server. + * + * @param host the host to set + */ public void setHost(final String host) { this.host = host; } + /** + * Retrieves the allowed domains for CORS. + * + * @return a collection of allowed domains for CORS + */ Collection getCorsAllowedDomains() { return corsAllowedDomains; } + /** + * Sets the allowed domains for CORS. + * + * @param corsAllowedDomains a list of allowed domains for CORS + */ public void setCorsAllowedDomains(final List corsAllowedDomains) { checkNotNull(corsAllowedDomains); this.corsAllowedDomains = corsAllowedDomains; } + /** + * Retrieves the hosts allowlist. + * + * @return a collection of hosts in the allowlist + */ Collection getHostsAllowlist() { return Collections.unmodifiableCollection(this.hostsAllowlist); } + /** + * Sets the hosts allowlist. + * + * @param hostsAllowlist a list of hosts to be added to the allowlist + */ public void setHostsAllowlist(final List hostsAllowlist) { checkNotNull(hostsAllowlist); this.hostsAllowlist = hostsAllowlist; } + /** + * Retrieves the HTTP timeout in seconds. + * + * @return the HTTP timeout in seconds + */ public Long getHttpTimeoutSec() { return httpTimeoutSec; } + /** + * Sets the HTTP timeout in seconds. + * + * @param httpTimeoutSec the HTTP timeout to set in seconds + */ public void setHttpTimeoutSec(final long httpTimeoutSec) { this.httpTimeoutSec = httpTimeoutSec; } diff --git a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/graphql/GraphQLContextType.java b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/graphql/GraphQLContextType.java index 05752f813..c12f7578c 100644 --- a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/graphql/GraphQLContextType.java +++ b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/graphql/GraphQLContextType.java @@ -14,14 +14,33 @@ */ package org.hyperledger.besu.ethereum.api.graphql; -/** Internal GraphQL Context */ +/** + * Enum representing various context types for GraphQL. + * + *

These context types are used internally by GraphQL to manage different aspects of the system. + */ public enum GraphQLContextType { + /** Represents blockchain queries context. */ BLOCKCHAIN_QUERIES, + + /** Represents protocol schedule context. */ PROTOCOL_SCHEDULE, + + /** Represents transaction pool context. */ TRANSACTION_POOL, + + /** Represents mining coordinator context. */ MINING_COORDINATOR, + + /** Represents synchronizer context. */ SYNCHRONIZER, + + /** Represents is alive handler context. */ IS_ALIVE_HANDLER, + + /** Represents chain ID context. */ CHAIN_ID, + + /** Represents gas cap context. */ GAS_CAP } diff --git a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/graphql/GraphQLDataFetcherContext.java b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/graphql/GraphQLDataFetcherContext.java index 0ccd8d2b1..acebe95d1 100644 --- a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/graphql/GraphQLDataFetcherContext.java +++ b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/graphql/GraphQLDataFetcherContext.java @@ -21,18 +21,56 @@ import org.hyperledger.besu.ethereum.core.Synchronizer; import org.hyperledger.besu.ethereum.eth.transactions.TransactionPool; import org.hyperledger.besu.ethereum.mainnet.ProtocolSchedule; +/** + * Interface representing the context for a GraphQL data fetcher. + * + *

This context provides access to various components of the system such as the transaction pool, + * blockchain queries, mining coordinator, synchronizer, and protocol schedule. + */ public interface GraphQLDataFetcherContext { + /** + * Retrieves the transaction pool. + * + * @return the transaction pool + */ TransactionPool getTransactionPool(); + /** + * Retrieves the blockchain queries. + * + * @return the blockchain queries + */ BlockchainQueries getBlockchainQueries(); + /** + * Retrieves the mining coordinator. + * + * @return the mining coordinator + */ MiningCoordinator getMiningCoordinator(); + /** + * Retrieves the synchronizer. + * + * @return the synchronizer + */ Synchronizer getSynchronizer(); + /** + * Retrieves the protocol schedule. + * + * @return the protocol schedule + */ ProtocolSchedule getProtocolSchedule(); + /** + * Retrieves the is alive handler. + * + *

By default, this method returns a new IsAliveHandler instance with a status of true. + * + * @return the is alive handler + */ default IsAliveHandler getIsAliveHandler() { return new IsAliveHandler(true); } diff --git a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/graphql/GraphQLDataFetcherContextImpl.java b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/graphql/GraphQLDataFetcherContextImpl.java index 0e426ebf3..1f5ed82d7 100644 --- a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/graphql/GraphQLDataFetcherContextImpl.java +++ b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/graphql/GraphQLDataFetcherContextImpl.java @@ -21,6 +21,12 @@ import org.hyperledger.besu.ethereum.core.Synchronizer; import org.hyperledger.besu.ethereum.eth.transactions.TransactionPool; import org.hyperledger.besu.ethereum.mainnet.ProtocolSchedule; +/** + * Implementation of the GraphQLDataFetcherContext interface. + * + *

This class provides access to various components of the system such as the transaction pool, + * blockchain queries, mining coordinator, synchronizer, and protocol schedule. + */ public class GraphQLDataFetcherContextImpl implements GraphQLDataFetcherContext { private final BlockchainQueries blockchainQueries; @@ -30,6 +36,12 @@ public class GraphQLDataFetcherContextImpl implements GraphQLDataFetcherContext private final TransactionPool transactionPool; private final IsAliveHandler isAliveHandler; + /** + * Constructor that takes a GraphQLDataFetcherContext and an IsAliveHandler. + * + * @param context the GraphQLDataFetcherContext + * @param isAliveHandler the IsAliveHandler + */ public GraphQLDataFetcherContextImpl( final GraphQLDataFetcherContext context, final IsAliveHandler isAliveHandler) { this( @@ -41,6 +53,16 @@ public class GraphQLDataFetcherContextImpl implements GraphQLDataFetcherContext isAliveHandler); } + /** + * Constructor that takes a BlockchainQueries, ProtocolSchedule, TransactionPool, + * MiningCoordinator, and Synchronizer. + * + * @param blockchainQueries the BlockchainQueries + * @param protocolSchedule the ProtocolSchedule + * @param transactionPool the TransactionPool + * @param miningCoordinator the MiningCoordinator + * @param synchronizer the Synchronizer + */ public GraphQLDataFetcherContextImpl( final BlockchainQueries blockchainQueries, final ProtocolSchedule protocolSchedule, @@ -56,6 +78,17 @@ public class GraphQLDataFetcherContextImpl implements GraphQLDataFetcherContext new IsAliveHandler(true)); } + /** + * Constructor that takes a BlockchainQueries, ProtocolSchedule, TransactionPool, + * MiningCoordinator, Synchronizer, and IsAliveHandler. + * + * @param blockchainQueries the BlockchainQueries + * @param protocolSchedule the ProtocolSchedule + * @param transactionPool the TransactionPool + * @param miningCoordinator the MiningCoordinator + * @param synchronizer the Synchronizer + * @param isAliveHandler the IsAliveHandler + */ public GraphQLDataFetcherContextImpl( final BlockchainQueries blockchainQueries, final ProtocolSchedule protocolSchedule, diff --git a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/graphql/GraphQLDataFetchers.java b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/graphql/GraphQLDataFetchers.java index 312491f5c..0b97bdb2e 100644 --- a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/graphql/GraphQLDataFetchers.java +++ b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/graphql/GraphQLDataFetchers.java @@ -61,10 +61,34 @@ import graphql.schema.DataFetcher; import org.apache.tuweni.bytes.Bytes; import org.apache.tuweni.bytes.Bytes32; +/** + * This class contains data fetchers for GraphQL queries. + * + *

Data fetchers are responsible for fetching data for a specific field. Each field in the schema + * is associated with a data fetcher. When the field is being processed during a query, the + * associated data fetcher is invoked to get the data for that field. + * + *

This class contains data fetchers for various fields such as protocol version, syncing state, + * pending state, gas price, chain ID, max priority fee per gas, range block, block, account, logs, + * and transaction. + * + *

Each data fetcher is a method that returns a `DataFetcher` object. The `DataFetcher` object + * defines how to fetch the data for the field. It takes a `DataFetchingEnvironment` object as input + * which contains all the context needed to fetch the data. + */ public class GraphQLDataFetchers { private final Integer highestEthVersion; + /** + * Constructs a new GraphQLDataFetchers instance. + * + *

This constructor takes a set of supported capabilities and determines the highest Ethereum + * protocol version supported by these capabilities. This version is then stored and can be + * fetched using the getProtocolVersionDataFetcher method. + * + * @param supportedCapabilities a set of capabilities supported by the Ethereum node + */ public GraphQLDataFetchers(final Set supportedCapabilities) { final OptionalInt version = supportedCapabilities.stream() @@ -74,10 +98,30 @@ public class GraphQLDataFetchers { highestEthVersion = version.isPresent() ? version.getAsInt() : null; } + /** + * Returns a DataFetcher that fetches the highest Ethereum protocol version supported by the node. + * + *

The DataFetcher is a functional interface. It has a single method that takes a + * DataFetchingEnvironment object as input and returns the highest Ethereum protocol version as an + * Optional. + * + * @return a DataFetcher that fetches the highest Ethereum protocol version + */ DataFetcher> getProtocolVersionDataFetcher() { return dataFetchingEnvironment -> Optional.of(highestEthVersion); } + /** + * Returns a DataFetcher that fetches the result of sending a raw transaction. + * + *

The DataFetcher is a functional interface. It has a single method that takes a + * DataFetchingEnvironment object as input and returns the hash of the transaction if it is valid + * and added to the transaction pool. If the transaction is invalid, it throws a GraphQLException + * with the invalid reason. If the raw transaction data cannot be read, it throws a + * GraphQLException with INVALID_PARAMS error. + * + * @return a DataFetcher that fetches the result of sending a raw transaction + */ DataFetcher> getSendRawTransactionDataFetcher() { return dataFetchingEnvironment -> { try { @@ -99,6 +143,19 @@ public class GraphQLDataFetchers { }; } + /** + * Returns a DataFetcher that fetches the syncing state of the Ethereum node. + * + *

The DataFetcher is a functional interface. It has a single method that takes a + * DataFetchingEnvironment object as input and returns the syncing state as an + * Optional. + * + *

The SyncStateAdapter is a wrapper around the SyncStatus of the Ethereum node. It provides + * information about the current syncing state of the node such as the current block, highest + * block, and starting block. + * + * @return a DataFetcher that fetches the syncing state of the Ethereum node + */ DataFetcher> getSyncingDataFetcher() { return dataFetchingEnvironment -> { final Synchronizer synchronizer = @@ -125,6 +182,15 @@ public class GraphQLDataFetchers { }; } + /** + * Returns a DataFetcher that fetches the chain ID of the Ethereum node. + * + *

The DataFetcher is a functional interface. It has a single method that takes a + * DataFetchingEnvironment object as input and returns the chain ID as an {@code + * Optional}. + * + * @return a DataFetcher that fetches the chain ID of the Ethereum node + */ public DataFetcher> getChainIdDataFetcher() { return dataFetchingEnvironment -> { final GraphQLContext graphQLContext = dataFetchingEnvironment.getGraphQlContext(); @@ -132,6 +198,15 @@ public class GraphQLDataFetchers { }; } + /** + * Returns a DataFetcher that fetches the maximum priority fee per gas of the Ethereum node. + * + *

The DataFetcher is a functional interface. It has a single method that takes a + * DataFetchingEnvironment object as input and returns the maximum priority fee per gas as a Wei + * object. If the maximum priority fee per gas is not available, it returns Wei.ZERO. + * + * @return a DataFetcher that fetches the maximum priority fee per gas of the Ethereum node + */ public DataFetcher getMaxPriorityFeePerGasDataFetcher() { return dataFetchingEnvironment -> { final BlockchainQueries blockchainQuery = @@ -167,6 +242,20 @@ public class GraphQLDataFetchers { }; } + /** + * Returns a DataFetcher that fetches a specific block in the Ethereum blockchain. + * + *

The DataFetcher is a functional interface. It has a single method that takes a + * DataFetchingEnvironment object as input. This method fetches a block based on either a block + * number or a block hash. If both a block number and a block hash are provided, it throws a + * GraphQLException with INVALID_PARAMS error. If neither a block number nor a block hash is + * provided, it fetches the latest block. + * + *

The fetched block is then wrapped in a {@link NormalBlockAdapter} and returned as an {@code + * Optional}. + * + * @return a DataFetcher that fetches a specific block in the Ethereum blockchain + */ public DataFetcher> getBlockDataFetcher() { return dataFetchingEnvironment -> { diff --git a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/graphql/GraphQLHttpService.java b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/graphql/GraphQLHttpService.java index abbcdbf94..fc763a1e3 100644 --- a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/graphql/GraphQLHttpService.java +++ b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/graphql/GraphQLHttpService.java @@ -68,6 +68,15 @@ import io.vertx.ext.web.handler.TimeoutHandler; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +/** + * This class handles the HTTP service for GraphQL. It sets up the server, handles requests and + * responses, and manages the lifecycle of the server. + * + *

It is responsible for processing GraphQL requests, executing them using the provided GraphQL + * engine, and returning the results in the HTTP response. + * + *

It also handles errors and exceptions that may occur during the processing of a request. + */ public class GraphQLHttpService { private static final Logger LOG = LoggerFactory.getLogger(GraphQLHttpService.class); @@ -126,6 +135,15 @@ public class GraphQLHttpService { checkArgument(config.getHost() != null, "Required host is not configured."); } + /** + * Starts the GraphQL HTTP service. + * + *

This method initializes the HTTP server and sets up the necessary routes for handling + * GraphQL requests. It also validates the configuration and sets up the necessary handlers for + * different types of requests. + * + * @return a CompletableFuture that will be completed when the server is successfully started. + */ public CompletableFuture start() { LOG.info("Starting GraphQL HTTP service on {}:{}", config.getHost(), config.getPort()); // Create the HTTP server and a router object. @@ -230,6 +248,14 @@ public class GraphQLHttpService { } } + /** + * Stops the GraphQL HTTP service. + * + *

This method stops the HTTP server that was created and started by the start() method. If the + * server is not running, this method will do nothing. + * + * @return a CompletableFuture that will be completed when the server is successfully stopped. + */ public CompletableFuture stop() { if (httpServer == null) { return CompletableFuture.completedFuture(null); @@ -248,6 +274,15 @@ public class GraphQLHttpService { return resultFuture; } + /** + * Returns the socket address of the GraphQL HTTP service. + * + *

This method returns the socket address that the HTTP server is bound to. If the server is + * not running, it returns an empty socket address. + * + * @return the socket address of the HTTP server, or an empty socket address if the server is not + * running. + */ public InetSocketAddress socketAddress() { if (httpServer == null) { return EMPTY_SOCKET_ADDRESS; @@ -255,6 +290,14 @@ public class GraphQLHttpService { return new InetSocketAddress(config.getHost(), httpServer.actualPort()); } + /** + * Returns the URL of the GraphQL HTTP service. + * + *

This method constructs and returns the URL that the HTTP server is bound to. If the server + * is not running, it returns an empty string. + * + * @return the URL of the HTTP server, or an empty string if the server is not running. + */ @VisibleForTesting public String url() { if (httpServer == null) { diff --git a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/graphql/GraphQLProvider.java b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/graphql/GraphQLProvider.java index 7e62e39c0..2a3370572 100644 --- a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/graphql/GraphQLProvider.java +++ b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/graphql/GraphQLProvider.java @@ -31,12 +31,30 @@ import graphql.schema.idl.SchemaParser; import graphql.schema.idl.TypeDefinitionRegistry; import graphql.schema.idl.TypeRuntimeWiring; +/** + * This class provides the GraphQL service. + * + *

It contains a method to build the GraphQL service with the provided data fetchers. + */ public class GraphQLProvider { + /** + * The maximum complexity allowed for a GraphQL query. + * + *

This constant is used to prevent overly complex queries from being executed. A query's + * complexity is calculated based on the number and type of fields it contains. + */ public static final int MAX_COMPLEXITY = 200; private GraphQLProvider() {} + /** + * Builds the GraphQL service with the provided data fetchers. + * + * @param graphQLDataFetchers the data fetchers to be used in the GraphQL service. + * @return the built GraphQL service. + * @throws IOException if there is an error reading the schema file. + */ public static GraphQL buildGraphQL(final GraphQLDataFetchers graphQLDataFetchers) throws IOException { final URL url = Resources.getResource("schema.graphqls"); diff --git a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/graphql/internal/Scalars.java b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/graphql/internal/Scalars.java index 5762215bc..9fbeae5fd 100644 --- a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/graphql/internal/Scalars.java +++ b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/graphql/internal/Scalars.java @@ -35,6 +35,13 @@ import org.apache.tuweni.bytes.Bytes; import org.apache.tuweni.bytes.Bytes32; import org.apache.tuweni.units.bigints.UInt256; +/** + * The Scalars class provides methods for creating GraphQLScalarType objects. These objects + * represent the scalar types used in GraphQL, such as Address, BigInt, Bytes, Bytes32, and Long. + * Each method in this class returns a GraphQLScalarType object that has been configured with a + * specific Coercing implementation. The Coercing implementation defines how that type is + * serialized, deserialized and validated. + */ public class Scalars { private Scalars() {} @@ -366,6 +373,14 @@ public class Scalars { } }; + /** + * Creates a new GraphQLScalarType object for an Address. + * + *

The object is configured with a specific Coercing implementation that defines how the + * Address type is serialized, deserialized and validated. + * + * @return a GraphQLScalarType object for an Address. + */ public static GraphQLScalarType addressScalar() { return GraphQLScalarType.newScalar() .name("Address") @@ -374,6 +389,14 @@ public class Scalars { .build(); } + /** + * Creates a new GraphQLScalarType object for a BigInt. + * + *

The object is configured with a specific Coercing implementation that defines how the BigInt + * type is serialized, deserialized and validated. + * + * @return a GraphQLScalarType object for a BigInt. + */ public static GraphQLScalarType bigIntScalar() { return GraphQLScalarType.newScalar() .name("BigInt") @@ -382,6 +405,14 @@ public class Scalars { .build(); } + /** + * Creates a new GraphQLScalarType object for Bytes. + * + *

The object is configured with a specific Coercing implementation that defines how the Bytes + * type is serialized, deserialized and validated. + * + * @return a GraphQLScalarType object for Bytes. + */ public static GraphQLScalarType bytesScalar() { return GraphQLScalarType.newScalar() .name("Bytes") @@ -390,6 +421,14 @@ public class Scalars { .build(); } + /** + * Creates a new GraphQLScalarType object for Bytes32. + * + *

The object is configured with a specific Coercing implementation that defines how the + * Bytes32 type is serialized, deserialized and validated. + * + * @return a GraphQLScalarType object for Bytes32. + */ public static GraphQLScalarType bytes32Scalar() { return GraphQLScalarType.newScalar() .name("Bytes32") @@ -398,6 +437,14 @@ public class Scalars { .build(); } + /** + * Creates a new GraphQLScalarType object for a Long. + * + *

The object is configured with a specific Coercing implementation that defines how the Long + * type is serialized, deserialized and validated. + * + * @return a GraphQLScalarType object for a Long. + */ public static GraphQLScalarType longScalar() { return GraphQLScalarType.newScalar() .name("Long") diff --git a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/graphql/internal/pojoadapter/AccessListEntryAdapter.java b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/graphql/internal/pojoadapter/AccessListEntryAdapter.java index 10451dcc3..a0dc8743c 100644 --- a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/graphql/internal/pojoadapter/AccessListEntryAdapter.java +++ b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/graphql/internal/pojoadapter/AccessListEntryAdapter.java @@ -23,19 +23,40 @@ import java.util.Optional; import org.apache.tuweni.bytes.Bytes32; +/** + * The AccessListEntryAdapter class extends the AdapterBase class. It provides methods to get the + * storage keys and address from an AccessListEntry. + */ @SuppressWarnings("unused") // reflected by GraphQL public class AccessListEntryAdapter extends AdapterBase { + + /** The AccessListEntry object that this adapter wraps. */ private final AccessListEntry accessListEntry; + /** + * Constructs a new AccessListEntryAdapter with the given AccessListEntry. + * + * @param accessListEntry the AccessListEntry to be adapted + */ public AccessListEntryAdapter(final AccessListEntry accessListEntry) { this.accessListEntry = accessListEntry; } + /** + * Returns the storage keys from the AccessListEntry. + * + * @return a list of storage keys + */ public List getStorageKeys() { final var storage = accessListEntry.storageKeys(); return new ArrayList<>(storage); } + /** + * Returns the address from the AccessListEntry. + * + * @return an Optional containing the address if it exists, otherwise an empty Optional + */ public Optional

getAddress() { return Optional.of(accessListEntry.address()); } diff --git a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/graphql/internal/pojoadapter/AccountAdapter.java b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/graphql/internal/pojoadapter/AccountAdapter.java index faf42aafc..1b4c8323b 100644 --- a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/graphql/internal/pojoadapter/AccountAdapter.java +++ b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/graphql/internal/pojoadapter/AccountAdapter.java @@ -28,6 +28,10 @@ import org.apache.tuweni.bytes.Bytes; import org.apache.tuweni.bytes.Bytes32; import org.apache.tuweni.units.bigints.UInt256; +/** + * The AccountAdapter class extends the AdapterBase class. It provides methods to get the account + * details such as address, balance, transaction count, code, and storage. + */ @SuppressWarnings("unused") // reflected by GraphQL public class AccountAdapter extends AdapterBase { @@ -35,18 +39,42 @@ public class AccountAdapter extends AdapterBase { private final Address address; private final Optional blockNumber; + /** + * Constructs a new AccountAdapter with the given Account. + * + * @param account the Account to be adapted + */ public AccountAdapter(final Account account) { this(account == null ? null : account.getAddress(), account, Optional.empty()); } + /** + * Constructs a new AccountAdapter with the given Account and block number. + * + * @param account the Account to be adapted + * @param blockNumber the block number associated with the account + */ public AccountAdapter(final Account account, final Optional blockNumber) { this(account == null ? null : account.getAddress(), account, blockNumber); } + /** + * Constructs a new AccountAdapter with the given address and Account. + * + * @param address the address of the account + * @param account the Account to be adapted + */ public AccountAdapter(final Address address, final Account account) { this(address, account, Optional.empty()); } + /** + * Constructs a new AccountAdapter with the given address, Account, and block number. + * + * @param address the address of the account + * @param account the Account to be adapted + * @param blockNumber the block number associated with the account + */ public AccountAdapter( final Address address, final Account account, final Optional blockNumber) { this.account = Optional.ofNullable(account); @@ -54,18 +82,39 @@ public class AccountAdapter extends AdapterBase { this.blockNumber = blockNumber; } + /** + * Returns the address of the account. + * + * @return the address of the account + */ public Address getAddress() { return address; } + /** + * Returns the balance of the account. + * + * @return the balance of the account + */ public Wei getBalance() { return account.map(AccountState::getBalance).orElse(Wei.ZERO); } + /** + * Returns the transaction count of the account. + * + * @return the transaction count of the account + */ public Long getTransactionCount() { return account.map(AccountState::getNonce).orElse(0L); } + /** + * Returns the code of the account. + * + * @param environment the DataFetchingEnvironment + * @return the code of the account + */ public Bytes getCode(final DataFetchingEnvironment environment) { if (account.get() instanceof BonsaiAccount) { @@ -80,6 +129,12 @@ public class AccountAdapter extends AdapterBase { } } + /** + * Returns the storage of the account. + * + * @param environment the DataFetchingEnvironment + * @return the storage of the account + */ public Bytes32 getStorage(final DataFetchingEnvironment environment) { final BlockchainQueries query = getBlockchainQueries(environment); final Bytes32 slot = environment.getArgument("slot"); diff --git a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/graphql/internal/pojoadapter/BlockAdapterBase.java b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/graphql/internal/pojoadapter/BlockAdapterBase.java index 96434ee37..6d5b69635 100644 --- a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/graphql/internal/pojoadapter/BlockAdapterBase.java +++ b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/graphql/internal/pojoadapter/BlockAdapterBase.java @@ -48,15 +48,30 @@ import org.apache.tuweni.bytes.Bytes; import org.apache.tuweni.bytes.Bytes32; import org.apache.tuweni.units.bigints.UInt256; +/** + * The BlockAdapterBase class extends the AdapterBase class. It provides methods to get and + * manipulate block data. + */ @SuppressWarnings("unused") // reflected by GraphQL public class BlockAdapterBase extends AdapterBase { private final BlockHeader header; + /** + * Constructs a new BlockAdapterBase with the given BlockHeader. + * + * @param header the BlockHeader to be adapted + */ BlockAdapterBase(final BlockHeader header) { this.header = header; } + /** + * Returns the parent block of the current block. + * + * @param environment the DataFetchingEnvironment + * @return an Optional containing the parent block if it exists, otherwise an empty Optional + */ public Optional getParent(final DataFetchingEnvironment environment) { final BlockchainQueries query = getBlockchainQueries(environment); final Hash parentHash = header.getParentHash(); @@ -65,28 +80,59 @@ public class BlockAdapterBase extends AdapterBase { return block.map(NormalBlockAdapter::new); } + /** + * Returns the hash of the current block. + * + * @return the hash of the block + */ public Bytes32 getHash() { return header.getHash(); } + /** + * Returns the nonce of the current block. + * + * @return the nonce of the block + */ public Bytes getNonce() { final long nonce = header.getNonce(); final byte[] bytes = Longs.toByteArray(nonce); return Bytes.wrap(bytes); } + /** + * Returns the transactions root of the current block. + * + * @return the transactions root of the block + */ public Bytes32 getTransactionsRoot() { return header.getTransactionsRoot(); } + /** + * Returns the state root of the current block. + * + * @return the state root of the block + */ public Bytes32 getStateRoot() { return header.getStateRoot(); } + /** + * Returns the receipts root of the current block. + * + * @return the receipts root of the block + */ public Bytes32 getReceiptsRoot() { return header.getReceiptsRoot(); } + /** + * Returns the miner of the current block. + * + * @param environment the DataFetchingEnvironment + * @return an AccountAdapter instance representing the miner of the block + */ public AccountAdapter getMiner(final DataFetchingEnvironment environment) { final BlockchainQueries query = getBlockchainQueries(environment); @@ -102,46 +148,103 @@ public class BlockAdapterBase extends AdapterBase { .orElseGet(() -> new EmptyAccountAdapter(header.getCoinbase())); } + /** + * Returns the extra data of the current block. + * + * @return the extra data of the block + */ public Bytes getExtraData() { return header.getExtraData(); } + /** + * Returns the base fee per gas of the current block. + * + * @return the base fee per gas of the block + */ public Optional getBaseFeePerGas() { return header.getBaseFee(); } + /** + * Returns the gas limit of the current block. + * + * @return the gas limit of the block + */ public Long getGasLimit() { return header.getGasLimit(); } + /** + * Returns the gas used by the current block. + * + * @return the gas used by the block + */ public Long getGasUsed() { return header.getGasUsed(); } + /** + * Returns the timestamp of the current block. + * + * @return the timestamp of the block + */ public Long getTimestamp() { return header.getTimestamp(); } + /** + * Returns the logs bloom of the current block. + * + * @return the logs bloom of the block + */ public Bytes getLogsBloom() { return header.getLogsBloom(); } + /** + * Returns the mix hash of the current block. + * + * @return the mix hash of the block + */ public Bytes32 getMixHash() { return header.getMixHash(); } + /** + * Returns the difficulty of the current block. + * + * @return the difficulty of the block + */ public Difficulty getDifficulty() { return header.getDifficulty(); } + /** + * Returns the ommer hash of the current block. + * + * @return the ommer hash of the block + */ public Bytes32 getOmmerHash() { return header.getOmmersHash(); } + /** + * Returns the number of the current block. + * + * @return the number of the block + */ public Long getNumber() { return header.getNumber(); } + /** + * Returns an AccountAdapter instance for a given address at the current block. + * + * @param environment the DataFetchingEnvironment + * @return an AccountAdapter instance representing the account of the given address at the current + * block + */ public AccountAdapter getAccount(final DataFetchingEnvironment environment) { final BlockchainQueries query = getBlockchainQueries(environment); final long bn = header.getNumber(); @@ -152,6 +255,13 @@ public class BlockAdapterBase extends AdapterBase { .get(); } + /** + * Returns a list of logs for the current block that match a given filter. + * + * @param environment the DataFetchingEnvironment + * @return a list of LogAdapter instances representing the logs of the current block that match + * the filter + */ public List getLogs(final DataFetchingEnvironment environment) { final Map filter = environment.getArgument("filter"); @@ -183,11 +293,24 @@ public class BlockAdapterBase extends AdapterBase { return results; } + /** + * Estimates the gas used for a call execution. + * + * @param environment the DataFetchingEnvironment + * @return the estimated gas used for the call execution + */ public Long getEstimateGas(final DataFetchingEnvironment environment) { final Optional result = executeCall(environment); return result.map(CallResult::getGasUsed).orElse(0L); } + /** + * Executes a call and returns the result. + * + * @param environment the DataFetchingEnvironment + * @return an Optional containing the result of the call execution if it exists, otherwise an + * empty Optional + */ public Optional getCall(final DataFetchingEnvironment environment) { return executeCall(environment); } @@ -259,12 +382,23 @@ public class BlockAdapterBase extends AdapterBase { header); } + /** + * Returns the raw header of the current block. + * + * @return the raw header of the block + */ Bytes getRawHeader() { final BytesValueRLPOutput rlpOutput = new BytesValueRLPOutput(); header.writeTo(rlpOutput); return rlpOutput.encoded(); } + /** + * Returns the raw data of the current block. + * + * @param environment the DataFetchingEnvironment + * @return the raw data of the block + */ Bytes getRaw(final DataFetchingEnvironment environment) { final BlockchainQueries query = getBlockchainQueries(environment); return query @@ -279,10 +413,22 @@ public class BlockAdapterBase extends AdapterBase { .orElse(Bytes.EMPTY); } + /** + * Returns the withdrawals root of the current block. + * + * @return an Optional containing the withdrawals root if it exists, otherwise an empty Optional + */ Optional getWithdrawalsRoot() { return header.getWithdrawalsRoot().map(Function.identity()); } + /** + * Returns a list of withdrawals for the current block. + * + * @param environment the DataFetchingEnvironment + * @return an Optional containing a list of WithdrawalAdapter instances representing the + * withdrawals of the current block if they exist, otherwise an empty Optional + */ Optional> getWithdrawals(final DataFetchingEnvironment environment) { final BlockchainQueries query = getBlockchainQueries(environment); return query @@ -295,10 +441,22 @@ public class BlockAdapterBase extends AdapterBase { .map(wl -> wl.stream().map(WithdrawalAdapter::new).toList())); } + /** + * Returns the blob gas used by the current block. + * + * @return an Optional containing the blob gas used by the current block if it exists, otherwise + * an empty Optional + */ public Optional getBlobGasUsed() { return header.getBlobGasUsed(); } + /** + * Returns the excess blob gas of the current block. + * + * @return an Optional containing the excess blob gas of the current block if it exists, otherwise + * an empty Optional + */ public Optional getExcessBlobGas() { return header.getExcessBlobGas().map(BlobGas::toLong); } diff --git a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/graphql/internal/pojoadapter/CallResult.java b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/graphql/internal/pojoadapter/CallResult.java index 78fa30d87..0a5c9a8f3 100644 --- a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/graphql/internal/pojoadapter/CallResult.java +++ b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/graphql/internal/pojoadapter/CallResult.java @@ -16,26 +16,55 @@ package org.hyperledger.besu.ethereum.api.graphql.internal.pojoadapter; import org.apache.tuweni.bytes.Bytes; +/** + * Represents the result of a call execution. This class is used to encapsulate the status, gas + * used, and data returned by a call execution. It is used in conjunction with the {@link + * org.hyperledger.besu.ethereum.api.graphql.internal.pojoadapter.BlockAdapterBase} class. + * + * @see org.hyperledger.besu.ethereum.api.graphql.internal.pojoadapter.BlockAdapterBase + */ @SuppressWarnings("unused") // reflected by GraphQL public class CallResult { private final Long status; private final Long gasUsed; private final Bytes data; + /** + * Constructs a new CallResult. + * + * @param status the status of the call execution + * @param gasUsed the amount of gas used by the call + * @param data the data returned by the call + */ CallResult(final Long status, final Long gasUsed, final Bytes data) { this.status = status; this.gasUsed = gasUsed; this.data = data; } + /** + * Returns the status of the call execution. + * + * @return the status of the call execution + */ public Long getStatus() { return status; } + /** + * Returns the amount of gas used by the call. + * + * @return the amount of gas used by the call + */ public Long getGasUsed() { return gasUsed; } + /** + * Returns the data returned by the call. + * + * @return the data returned by the call + */ public Bytes getData() { return data; } diff --git a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/graphql/internal/pojoadapter/EmptyAccountAdapter.java b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/graphql/internal/pojoadapter/EmptyAccountAdapter.java index 4c19b997b..775934fb1 100644 --- a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/graphql/internal/pojoadapter/EmptyAccountAdapter.java +++ b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/graphql/internal/pojoadapter/EmptyAccountAdapter.java @@ -21,9 +21,22 @@ import graphql.schema.DataFetchingEnvironment; import org.apache.tuweni.bytes.Bytes; import org.apache.tuweni.bytes.Bytes32; +/** + * Represents an empty account in the Ethereum blockchain. This class is used when an account does + * not exist at a specific address. It provides default values for the account's properties. It + * extends the {@link org.hyperledger.besu.ethereum.api.graphql.internal.pojoadapter.AccountAdapter} + * class. + * + * @see org.hyperledger.besu.ethereum.api.graphql.internal.pojoadapter.AccountAdapter + */ public class EmptyAccountAdapter extends AccountAdapter { private final Address address; + /** + * Constructs a new EmptyAccountAdapter. + * + * @param address the address of the account + */ public EmptyAccountAdapter(final Address address) { super(null); this.address = address; diff --git a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/graphql/internal/pojoadapter/LogAdapter.java b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/graphql/internal/pojoadapter/LogAdapter.java index 6beab46fd..012edbe51 100644 --- a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/graphql/internal/pojoadapter/LogAdapter.java +++ b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/graphql/internal/pojoadapter/LogAdapter.java @@ -28,27 +28,62 @@ import java.util.Optional; import graphql.schema.DataFetchingEnvironment; import org.apache.tuweni.bytes.Bytes; +/** + * This class is an adapter for the LogWithMetadata class. + * + *

It extends the AdapterBase class and provides methods to get the index, topics, data, + * transaction, and account associated with a log. + */ @SuppressWarnings("unused") // reflected by GraphQL public class LogAdapter extends AdapterBase { private final LogWithMetadata logWithMetadata; + /** + * Constructor for LogAdapter. + * + *

It initializes the logWithMetadata field with the provided argument. + * + * @param logWithMetadata the log with metadata to be adapted. + */ public LogAdapter(final LogWithMetadata logWithMetadata) { this.logWithMetadata = logWithMetadata; } + /** + * Returns the index of the log. + * + * @return the index of the log. + */ public Integer getIndex() { return logWithMetadata.getLogIndex(); } + /** + * Returns the topics of the log. + * + * @return a list of topics of the log. + */ public List getTopics() { final List topics = logWithMetadata.getTopics(); return new ArrayList<>(topics); } + /** + * Returns the data of the log. + * + * @return the data of the log. + */ public Bytes getData() { return logWithMetadata.getData(); } + /** + * Returns the transaction associated with the log. + * + * @param environment the data fetching environment. + * @return a TransactionAdapter for the transaction associated with the log. + * @throws java.util.NoSuchElementException if the transaction is not found. + */ public TransactionAdapter getTransaction(final DataFetchingEnvironment environment) { final BlockchainQueries query = getBlockchainQueries(environment); final Hash hash = logWithMetadata.getTransactionHash(); @@ -56,6 +91,12 @@ public class LogAdapter extends AdapterBase { return tran.map(TransactionAdapter::new).orElseThrow(); } + /** + * Returns the account associated with the log. + * + * @param environment the data fetching environment. + * @return an AccountAdapter for the account associated with the log. + */ public AccountAdapter getAccount(final DataFetchingEnvironment environment) { final BlockchainQueries query = getBlockchainQueries(environment); long blockNumber = logWithMetadata.getBlockNumber(); diff --git a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/graphql/internal/pojoadapter/NormalBlockAdapter.java b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/graphql/internal/pojoadapter/NormalBlockAdapter.java index f54b3f0da..fa75028a3 100644 --- a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/graphql/internal/pojoadapter/NormalBlockAdapter.java +++ b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/graphql/internal/pojoadapter/NormalBlockAdapter.java @@ -27,9 +27,24 @@ import java.util.Optional; import graphql.schema.DataFetchingEnvironment; +/** + * This class is an adapter for the BlockWithMetadata class. + * + *

It extends the BlockAdapterBase class and provides methods to get the transaction count, total + * difficulty, ommer count, ommers, transactions, and specific ommer and transaction at a given + * index associated with a block. + */ @SuppressWarnings("unused") // reflected by GraphQL public class NormalBlockAdapter extends BlockAdapterBase { + /** + * Constructor for NormalBlockAdapter. + * + *

It initializes the blockWithMetaData field with the provided argument and calls the parent + * constructor with the header of the provided blockWithMetaData. + * + * @param blockWithMetaData the block with metadata to be adapted. + */ public NormalBlockAdapter( final BlockWithMetadata blockWithMetaData) { super(blockWithMetaData.getHeader()); @@ -38,18 +53,39 @@ public class NormalBlockAdapter extends BlockAdapterBase { private final BlockWithMetadata blockWithMetaData; + /** + * Returns the transaction count of the block. + * + * @return the transaction count of the block. + */ public Optional getTransactionCount() { return Optional.of(blockWithMetaData.getTransactions().size()); } + /** + * Returns the total difficulty of the block. + * + * @return the total difficulty of the block. + */ public Difficulty getTotalDifficulty() { return blockWithMetaData.getTotalDifficulty(); } + /** + * Returns the ommer count of the block. + * + * @return the ommer count of the block. + */ public Optional getOmmerCount() { return Optional.of(blockWithMetaData.getOmmers().size()); } + /** + * Returns the ommers of the block. + * + * @param environment the data fetching environment. + * @return a list of UncleBlockAdapter for the ommers of the block. + */ public List getOmmers(final DataFetchingEnvironment environment) { final BlockchainQueries query = getBlockchainQueries(environment); final List ommers = blockWithMetaData.getOmmers(); @@ -63,6 +99,12 @@ public class NormalBlockAdapter extends BlockAdapterBase { return results; } + /** + * Returns the ommer at a given index of the block. + * + * @param environment the data fetching environment. + * @return an UncleBlockAdapter for the ommer at the given index of the block. + */ public Optional getOmmerAt(final DataFetchingEnvironment environment) { final BlockchainQueries query = getBlockchainQueries(environment); final int index = ((Number) environment.getArgument("index")).intValue(); @@ -75,6 +117,13 @@ public class NormalBlockAdapter extends BlockAdapterBase { return Optional.empty(); } + /** + * Returns a list of TransactionAdapter objects for the transactions in the block. + * + *

Each TransactionAdapter object is created by adapting a TransactionWithMetadata object. + * + * @return a list of TransactionAdapter objects for the transactions in the block. + */ public List getTransactions() { final List trans = blockWithMetaData.getTransactions(); final List results = new ArrayList<>(); @@ -84,6 +133,16 @@ public class NormalBlockAdapter extends BlockAdapterBase { return results; } + /** + * Returns a TransactionAdapter object for the transaction at the given index in the block. + * + *

The index is retrieved from the data fetching environment. If there is no transaction at the + * given index, an empty Optional is returned. + * + * @param environment the data fetching environment. + * @return an Optional containing a TransactionAdapter object for the transaction at the given + * index in the block, or an empty Optional if there is no transaction at the given index. + */ public Optional getTransactionAt(final DataFetchingEnvironment environment) { final int index = ((Number) environment.getArgument("index")).intValue(); final List trans = blockWithMetaData.getTransactions(); diff --git a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/graphql/internal/pojoadapter/PendingStateAdapter.java b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/graphql/internal/pojoadapter/PendingStateAdapter.java index 0202db88f..49f6bc890 100644 --- a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/graphql/internal/pojoadapter/PendingStateAdapter.java +++ b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/graphql/internal/pojoadapter/PendingStateAdapter.java @@ -36,19 +36,41 @@ import graphql.schema.DataFetchingEnvironment; import org.apache.tuweni.bytes.Bytes; import org.apache.tuweni.units.bigints.UInt256; +/** + * This class represents the pending state of transactions in the Ethereum network. + * + *

It extends the AdapterBase class and provides methods to interact with the transaction pool. + */ @SuppressWarnings("unused") // reflected by GraphQL public class PendingStateAdapter extends AdapterBase { private final TransactionPool transactionPool; + /** + * Constructor for PendingStateAdapter. + * + *

It initializes the transactionPool field with the provided argument. + * + * @param transactionPool the transaction pool to be used. + */ public PendingStateAdapter(final TransactionPool transactionPool) { this.transactionPool = transactionPool; } + /** + * Returns the count of transactions in the transaction pool. + * + * @return the count of transactions in the transaction pool. + */ public Integer getTransactionCount() { return transactionPool.count(); } + /** + * Returns a list of TransactionAdapter objects for the transactions in the transaction pool. + * + * @return a list of TransactionAdapter objects for the transactions in the transaction pool. + */ public List getTransactions() { return transactionPool.getPendingTransactions().stream() .map(PendingTransaction::getTransaction) @@ -57,9 +79,17 @@ public class PendingStateAdapter extends AdapterBase { .toList(); } - // until the miner can expose the current "proposed block" we have no - // speculative environment, so estimate against latest. + /** + * Returns an AccountAdapter object for the account associated with the provided address. + * + *

The account state is estimated against the latest block. + * + * @param dataFetchingEnvironment the data fetching environment. + * @return an AccountAdapter object for the account associated with the provided address. + */ public AccountAdapter getAccount(final DataFetchingEnvironment dataFetchingEnvironment) { + // until the miner can expose the current "proposed block" we have no + // speculative environment, so estimate against latest. final BlockchainQueries blockchainQuery = dataFetchingEnvironment.getGraphQlContext().get(GraphQLContextType.BLOCKCHAIN_QUERIES); final Address addr = dataFetchingEnvironment.getArgument("address"); @@ -71,16 +101,39 @@ public class PendingStateAdapter extends AdapterBase { .orElseGet(() -> new AccountAdapter(null)); } - // until the miner can expose the current "proposed block" we have no - // speculative environment, so estimate against latest. + /** + * Estimates the gas required for a transaction. + * + *

This method calls the getCall method to simulate the transaction and then retrieves the gas + * used by the transaction. The gas estimation is done against the latest block as there is + * currently no way to expose the current "proposed block" for a speculative environment. + * + * @param environment the data fetching environment. + * @return an Optional containing the estimated gas for the transaction, or an empty Optional if + * the transaction simulation was not successful. + */ public Optional getEstimateGas(final DataFetchingEnvironment environment) { + // until the miner can expose the current "proposed block" we have no + // speculative environment, so estimate against latest. final Optional result = getCall(environment); return result.map(CallResult::getGasUsed); } - // until the miner can expose the current "proposed block" we have no - // speculative environment, so estimate against latest. + /** + * Simulates the execution of a transaction. + * + *

This method retrieves the transaction parameters from the data fetching environment, creates + * a CallParameter object, and then uses a TransactionSimulator to simulate the execution of the + * transaction. The simulation is done against the latest block as there is currently no way to + * expose the current "proposed block" for a speculative environment. + * + * @param environment the data fetching environment. + * @return an Optional containing the result of the transaction simulation, or an empty Optional + * if the transaction simulation was not successful. + */ public Optional getCall(final DataFetchingEnvironment environment) { + // until the miner can expose the current "proposed block" we have no + // speculative environment, so estimate against latest. final Map callData = environment.getArgument("data"); final Address from = (Address) callData.get("from"); final Address to = (Address) callData.get("to"); diff --git a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/graphql/internal/pojoadapter/SyncStateAdapter.java b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/graphql/internal/pojoadapter/SyncStateAdapter.java index 0a8dcbbf9..2c3876fe3 100644 --- a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/graphql/internal/pojoadapter/SyncStateAdapter.java +++ b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/graphql/internal/pojoadapter/SyncStateAdapter.java @@ -16,22 +16,52 @@ package org.hyperledger.besu.ethereum.api.graphql.internal.pojoadapter; import org.hyperledger.besu.plugin.data.SyncStatus; +/** + * The SyncStateAdapter class provides methods to retrieve the synchronization status of the + * blockchain. + * + *

This class is used to adapt a SyncStatus object into a format that can be used by GraphQL. The + * SyncStatus object is provided at construction time. + * + *

The class provides methods to retrieve the starting block, current block, and highest block of + * the synchronization status. + */ @SuppressWarnings("unused") // reflected by GraphQL public class SyncStateAdapter { private final SyncStatus syncStatus; + /** + * Constructs a new SyncStateAdapter object. + * + * @param syncStatus the SyncStatus object to adapt. + */ public SyncStateAdapter(final SyncStatus syncStatus) { this.syncStatus = syncStatus; } + /** + * Returns the starting block of the synchronization status. + * + * @return the starting block of the synchronization status. + */ public Long getStartingBlock() { return syncStatus.getStartingBlock(); } + /** + * Returns the current block of the synchronization status. + * + * @return the current block of the synchronization status. + */ public Long getCurrentBlock() { return syncStatus.getCurrentBlock(); } + /** + * Returns the highest block of the synchronization status. + * + * @return the highest block of the synchronization status. + */ public Long getHighestBlock() { return syncStatus.getHighestBlock(); } diff --git a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/graphql/internal/pojoadapter/TransactionAdapter.java b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/graphql/internal/pojoadapter/TransactionAdapter.java index 6e98afc90..d5eacf8e3 100644 --- a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/graphql/internal/pojoadapter/TransactionAdapter.java +++ b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/graphql/internal/pojoadapter/TransactionAdapter.java @@ -38,11 +38,28 @@ import javax.annotation.Nonnull; import graphql.schema.DataFetchingEnvironment; import org.apache.tuweni.bytes.Bytes; +/** + * The TransactionAdapter class provides methods to retrieve the transaction details. + * + *

This class is used to adapt a TransactionWithMetadata object into a format that can be used by + * GraphQL. The TransactionWithMetadata object is provided at construction time. + * + *

The class provides methods to retrieve the hash, type, nonce, index, from, to, value, gas + * price, max fee per gas, max priority fee per gas, max fee per blob gas, effective tip, gas, input + * data, block, status, gas used, cumulative gas used, effective gas price, blob gas used, blob gas + * price, created contract, logs, R, S, V, Y parity, access list, raw, raw receipt, and blob + * versioned hashes of the transaction. + */ @SuppressWarnings("unused") // reflected by GraphQL public class TransactionAdapter extends AdapterBase { private final TransactionWithMetadata transactionWithMetadata; private Optional transactionReceiptWithMetadata; + /** + * Constructs a new TransactionAdapter object. + * + * @param transactionWithMetadata the TransactionWithMetadata object to adapt. + */ public TransactionAdapter(final @Nonnull TransactionWithMetadata transactionWithMetadata) { this.transactionWithMetadata = transactionWithMetadata; } @@ -65,22 +82,53 @@ public class TransactionAdapter extends AdapterBase { return transactionReceiptWithMetadata; } + /** + * Returns the hash of the transaction. + * + * @return the hash of the transaction. + */ public Hash getHash() { return transactionWithMetadata.getTransaction().getHash(); } + /** + * Returns the type of the transaction. + * + * @return the type of the transaction. + */ public Optional getType() { return Optional.of(transactionWithMetadata.getTransaction().getType().ordinal()); } + /** + * Returns the nonce of the transaction. + * + * @return the nonce of the transaction. + */ public Long getNonce() { return transactionWithMetadata.getTransaction().getNonce(); } + /** + * Returns the index of the transaction. + * + * @return the index of the transaction. + */ public Optional getIndex() { return transactionWithMetadata.getTransactionIndex(); } + /** + * Retrieves the sender of the transaction. + * + *

This method uses the BlockchainQueries to get the block number and then retrieves the sender + * of the transaction. It then uses the getAndMapWorldState method to get the state of the + * sender's account at the given block number. + * + * @param environment the data fetching environment. + * @return an AccountAdapter object representing the sender's account state at the given block + * number. + */ public AccountAdapter getFrom(final DataFetchingEnvironment environment) { final BlockchainQueries query = getBlockchainQueries(environment); final Long blockNumber = @@ -96,6 +144,18 @@ public class TransactionAdapter extends AdapterBase { .orElse(new EmptyAccountAdapter(addr)); } + /** + * Retrieves the recipient of the transaction. + * + *

This method uses the BlockchainQueries to get the block number and then retrieves the + * recipient of the transaction. It then uses the getAndMapWorldState method to get the state of + * the recipient's account at the given block number. + * + * @param environment the data fetching environment. + * @return an Optional containing an AccountAdapter object representing the recipient's account + * state at the given block number, or an empty Optional if the transaction does not have a + * recipient (i.e., it is a contract creation transaction). + */ public Optional getTo(final DataFetchingEnvironment environment) { final BlockchainQueries query = getBlockchainQueries(environment); final Long blockNumber = @@ -115,39 +175,95 @@ public class TransactionAdapter extends AdapterBase { .or(() -> Optional.of(new EmptyAccountAdapter(address)))); } + /** + * Retrieves the value of the transaction. + * + * @return a Wei object representing the value of the transaction. + */ public Wei getValue() { return transactionWithMetadata.getTransaction().getValue(); } + /** + * Retrieves the gas price of the transaction. + * + * @return a Wei object representing the gas price of the transaction. If the transaction does not + * specify a gas price, this method returns zero. + */ public Wei getGasPrice() { return transactionWithMetadata.getTransaction().getGasPrice().orElse(Wei.ZERO); } + /** + * Retrieves the maximum fee per gas of the transaction. + * + * @return an Optional containing a Wei object representing the maximum fee per gas of the + * transaction, or an empty Optional if the transaction does not specify a maximum fee per + * gas. + */ public Optional getMaxFeePerGas() { return transactionWithMetadata.getTransaction().getMaxFeePerGas(); } + /** + * Retrieves the maximum priority fee per gas of the transaction. + * + * @return an Optional containing a Wei object representing the maximum priority fee per gas of + * the transaction, or an empty Optional if the transaction does not specify a maximum + * priority fee per gas. + */ public Optional getMaxPriorityFeePerGas() { return transactionWithMetadata.getTransaction().getMaxPriorityFeePerGas(); } + /** + * Retrieves the maximum fee per blob gas of the transaction. + * + * @return an Optional containing a Wei object representing the maximum fee per blob gas of the + * transaction, or an empty Optional if the transaction does not specify a maximum fee per + * blob gas. + */ public Optional getMaxFeePerBlobGas() { return transactionWithMetadata.getTransaction().getMaxFeePerBlobGas(); } + /** + * Retrieves the effective tip of the transaction. + * + * @param environment the data fetching environment. + * @return an Optional containing a Wei object representing the effective tip of the transaction, + * or an empty Optional if the transaction does not specify an effective tip. + */ public Optional getEffectiveTip(final DataFetchingEnvironment environment) { return getReceipt(environment) .map(rwm -> rwm.getTransaction().getEffectivePriorityFeePerGas(rwm.getBaseFee())); } + /** + * Retrieves the gas limit of the transaction. + * + * @return a Long object representing the gas limit of the transaction. + */ public Long getGas() { return transactionWithMetadata.getTransaction().getGasLimit(); } + /** + * Retrieves the input data of the transaction. + * + * @return a Bytes object representing the input data of the transaction. + */ public Bytes getInputData() { return transactionWithMetadata.getTransaction().getPayload(); } + /** + * Retrieves the block of the transaction. + * + * @param environment the data fetching environment. + * @return an Optional containing a NormalBlockAdapter object representing the block of the + * transaction, or an empty Optional if the transaction does not specify a block. + */ public Optional getBlock(final DataFetchingEnvironment environment) { return transactionWithMetadata .getBlockHash() @@ -155,6 +271,17 @@ public class TransactionAdapter extends AdapterBase { .map(NormalBlockAdapter::new); } + /** + * Retrieves the status of the transaction. + * + *

This method uses the getReceipt method to get the receipt of the transaction. It then checks + * the status of the receipt. If the status is -1, it returns an empty Optional. Otherwise, it + * returns an Optional containing the status of the receipt. + * + * @param environment the data fetching environment. + * @return an Optional containing a Long object representing the status of the transaction, or an + * empty Optional if the status of the receipt is -1. + */ public Optional getStatus(final DataFetchingEnvironment environment) { return getReceipt(environment) .map(TransactionReceiptWithMetadata::getReceipt) @@ -165,27 +292,87 @@ public class TransactionAdapter extends AdapterBase { : Optional.of((long) receipt.getStatus())); } + /** + * Retrieves the gas used by the transaction. + * + *

This method uses the getReceipt method to get the receipt of the transaction. It then + * returns an Optional containing the gas used by the transaction. + * + * @param environment the data fetching environment. + * @return an Optional containing a Long object representing the gas used by the transaction. + */ public Optional getGasUsed(final DataFetchingEnvironment environment) { return getReceipt(environment).map(TransactionReceiptWithMetadata::getGasUsed); } + /** + * Retrieves the cumulative gas used by the transaction. + * + *

This method uses the getReceipt method to get the receipt of the transaction. It then + * returns an Optional containing the cumulative gas used by the transaction. + * + * @param environment the data fetching environment. + * @return an Optional containing a Long object representing the cumulative gas used by the + * transaction. + */ public Optional getCumulativeGasUsed(final DataFetchingEnvironment environment) { return getReceipt(environment).map(rpt -> rpt.getReceipt().getCumulativeGasUsed()); } + /** + * Retrieves the effective gas price of the transaction. + * + *

This method uses the getReceipt method to get the receipt of the transaction. It then + * returns an Optional containing the effective gas price of the transaction. + * + * @param environment the data fetching environment. + * @return an Optional containing a Wei object representing the effective gas price of the + * transaction. + */ public Optional getEffectiveGasPrice(final DataFetchingEnvironment environment) { return getReceipt(environment) .map(rwm -> rwm.getTransaction().getEffectiveGasPrice(rwm.getBaseFee())); } + /** + * Retrieves the blob gas used by the transaction. + * + *

This method uses the getReceipt method to get the receipt of the transaction. It then + * returns an Optional containing the blob gas used by the transaction. + * + * @param environment the data fetching environment. + * @return an Optional containing a Long object representing the blob gas used by the transaction. + */ public Optional getBlobGasUsed(final DataFetchingEnvironment environment) { return getReceipt(environment).flatMap(TransactionReceiptWithMetadata::getBlobGasUsed); } + /** + * Retrieves the blob gas price of the transaction. + * + *

This method uses the getReceipt method to get the receipt of the transaction. It then + * returns an Optional containing the blob gas price of the transaction. + * + * @param environment the data fetching environment. + * @return an Optional containing a Wei object representing the blob gas price of the transaction. + */ public Optional getBlobGasPrice(final DataFetchingEnvironment environment) { return getReceipt(environment).flatMap(TransactionReceiptWithMetadata::getBlobGasPrice); } + /** + * Retrieves the contract created by the transaction. + * + *

This method checks if the transaction is a contract creation transaction. If it is, it + * retrieves the address of the created contract. It then uses the BlockchainQueries to get the + * block number and then retrieves the state of the created contract's account at the given block + * number. + * + * @param environment the data fetching environment. + * @return an Optional containing an AccountAdapter object representing the created contract's + * account state at the given block number, or an empty Optional if the transaction is not a + * contract creation transaction or if the block number is not specified. + */ public Optional getCreatedContract(final DataFetchingEnvironment environment) { final boolean contractCreated = transactionWithMetadata.getTransaction().isContractCreation(); if (contractCreated) { @@ -208,6 +395,17 @@ public class TransactionAdapter extends AdapterBase { return Optional.empty(); } + /** + * Retrieves the logs of the transaction. + * + *

This method uses the BlockchainQueries to get the block header and the receipt of the + * transaction. It then retrieves the logs of the transaction and adapts them into a format that + * can be used by GraphQL. + * + * @param environment the data fetching environment. + * @return a List of LogAdapter objects representing the logs of the transaction. If the + * transaction does not have a receipt, this method returns an empty list. + */ public List getLogs(final DataFetchingEnvironment environment) { final BlockchainQueries query = getBlockchainQueries(environment); final ProtocolSchedule protocolSchedule = @@ -240,14 +438,34 @@ public class TransactionAdapter extends AdapterBase { return results; } + /** + * Retrieves the R component of the transaction's signature. + * + * @return a BigInteger object representing the R component of the transaction's signature. + */ public BigInteger getR() { return transactionWithMetadata.getTransaction().getR(); } + /** + * Retrieves the S component of the transaction's signature. + * + * @return a BigInteger object representing the S component of the transaction's signature. + */ public BigInteger getS() { return transactionWithMetadata.getTransaction().getS(); } + /** + * Retrieves the V component of the transaction's signature. + * + *

If the transaction type is less than the BLOB transaction type and V is null, it returns the + * Y parity of the transaction. Otherwise, it returns V. + * + * @return an Optional containing a BigInteger object representing the V component of the + * transaction's signature, or an Optional containing the Y parity of the transaction if V is + * null and the transaction type is less than the BLOB transaction type. + */ public Optional getV() { BigInteger v = transactionWithMetadata.getTransaction().getV(); return Optional.ofNullable( @@ -258,10 +476,22 @@ public class TransactionAdapter extends AdapterBase { : v); } + /** + * Retrieves the Y parity of the transaction's signature. + * + * @return an Optional containing a BigInteger object representing the Y parity of the + * transaction's signature. + */ public Optional getYParity() { return Optional.ofNullable(transactionWithMetadata.getTransaction().getYParity()); } + /** + * Retrieves the access list of the transaction. + * + * @return a List of AccessListEntryAdapter objects representing the access list of the + * transaction. + */ public List getAccessList() { return transactionWithMetadata .getTransaction() @@ -270,12 +500,30 @@ public class TransactionAdapter extends AdapterBase { .orElse(List.of()); } + /** + * Retrieves the raw transaction data. + * + *

This method uses the writeTo method of the transaction to write the transaction data to a + * BytesValueRLPOutput object. It then encodes the BytesValueRLPOutput object and returns it. + * + * @return an Optional containing a Bytes object representing the raw transaction data. + */ public Optional getRaw() { final BytesValueRLPOutput rlpOutput = new BytesValueRLPOutput(); transactionWithMetadata.getTransaction().writeTo(rlpOutput); return Optional.of(rlpOutput.encoded()); } + /** + * Retrieves the raw receipt of the transaction. + * + *

This method uses the getReceipt method to get the receipt of the transaction. It then writes + * the receipt data to a BytesValueRLPOutput object using the writeToForNetwork method of the + * receipt. It then encodes the BytesValueRLPOutput object and returns it. + * + * @param environment the data fetching environment. + * @return an Optional containing a Bytes object representing the raw receipt of the transaction. + */ public Optional getRawReceipt(final DataFetchingEnvironment environment) { return getReceipt(environment) .map( @@ -286,6 +534,11 @@ public class TransactionAdapter extends AdapterBase { }); } + /** + * Retrieves the versioned hashes of the transaction. + * + * @return a List of VersionedHash objects representing the versioned hashes of the transaction. + */ public List getBlobVersionedHashes() { return transactionWithMetadata.getTransaction().getVersionedHashes().orElse(List.of()); } diff --git a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/graphql/internal/pojoadapter/WithdrawalAdapter.java b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/graphql/internal/pojoadapter/WithdrawalAdapter.java index e8454fcdb..85ec69b0d 100644 --- a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/graphql/internal/pojoadapter/WithdrawalAdapter.java +++ b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/graphql/internal/pojoadapter/WithdrawalAdapter.java @@ -17,26 +17,60 @@ package org.hyperledger.besu.ethereum.api.graphql.internal.pojoadapter; import org.hyperledger.besu.datatypes.Address; import org.hyperledger.besu.plugin.data.Withdrawal; +/** + * The WithdrawalAdapter class provides methods to retrieve the withdrawal details. + * + *

This class is used to adapt a Withdrawal object into a format that can be used by GraphQL. The + * Withdrawal object is provided at construction time. + * + *

The class provides methods to retrieve the index, validator, address, and amount of the + * withdrawal. + */ public class WithdrawalAdapter { Withdrawal withdrawal; + /** + * Constructs a new WithdrawalAdapter object. + * + * @param withdrawal the Withdrawal object to adapt. + */ public WithdrawalAdapter(final Withdrawal withdrawal) { this.withdrawal = withdrawal; } + /** + * Returns the index of the withdrawal. + * + * @return the index of the withdrawal. + */ public Long getIndex() { return withdrawal.getIndex().toLong(); } + /** + * Returns the validator of the withdrawal. + * + * @return the validator of the withdrawal. + */ public Long getValidator() { return withdrawal.getValidatorIndex().toLong(); } + /** + * Returns the address of the withdrawal. + * + * @return the address of the withdrawal. + */ public Address getAddress() { return withdrawal.getAddress(); } + /** + * Returns the amount of the withdrawal. + * + * @return the amount of the withdrawal. + */ public Long getAmount() { return withdrawal.getAmount().getAsBigInteger().longValue(); } diff --git a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/graphql/internal/response/GraphQLError.java b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/graphql/internal/response/GraphQLError.java index e4aeacd92..f370df8dc 100644 --- a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/graphql/internal/response/GraphQLError.java +++ b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/graphql/internal/response/GraphQLError.java @@ -19,30 +19,96 @@ import org.hyperledger.besu.ethereum.transaction.TransactionInvalidReason; import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonGetter; +/** + * Enum representing various types of GraphQL errors. + * + *

Each error is associated with a specific code and message. The code is an integer that + * uniquely identifies the error. The message is a string that provides a human-readable description + * of the error. + * + *

This enum includes standard errors such as INVALID_PARAMS and INTERNAL_ERROR, transaction + * validation failures such as NONCE_TOO_LOW and INVALID_TRANSACTION_SIGNATURE, and private + * transaction errors such as PRIVATE_TRANSACTION_FAILED and PRIVATE_NONCE_TOO_LOW. + * + *

The {@code of} method is used to map a {@code TransactionInvalidReason} to a corresponding + * {@code GraphQLError}. + */ @JsonFormat(shape = JsonFormat.Shape.OBJECT) public enum GraphQLError { // Standard errors + /** Error code -32602. This error occurs when the parameters provided are invalid. */ INVALID_PARAMS(-32602, "Invalid params"), + + /** Error code -32603. This error occurs when there is an internal error. */ INTERNAL_ERROR(-32603, "Internal error"), // Transaction validation failures + /** Error code -32001. This error occurs when the nonce value is too low. */ NONCE_TOO_LOW(-32001, "Nonce too low"), + + /** Error code -32002. This error occurs when the transaction signature is invalid. */ INVALID_TRANSACTION_SIGNATURE(-32002, "Invalid signature"), + + /** Error code -32003. This error occurs when the intrinsic gas exceeds the gas limit. */ INTRINSIC_GAS_EXCEEDS_LIMIT(-32003, "Intrinsic gas exceeds gas limit"), + + /** + * Error code -32004. This error occurs when the upfront cost of the transaction exceeds the + * account balance. + */ TRANSACTION_UPFRONT_COST_EXCEEDS_BALANCE(-32004, "Upfront cost exceeds account balance"), + + /** + * Error code -32005. This error occurs when the transaction gas limit exceeds the block gas + * limit. + */ EXCEEDS_BLOCK_GAS_LIMIT(-32005, "Transaction gas limit exceeds block gas limit"), + + /** Error code -32006. This error occurs when the nonce value is too high. */ INCORRECT_NONCE(-32006, "Nonce too high"), + + /** + * Error code -32007. This error occurs when the sender account is not authorized to send + * transactions. + */ TX_SENDER_NOT_AUTHORIZED(-32007, "Sender account not authorized to send transactions"), + + /** Error code -32008. This error occurs when the initial sync is still in progress. */ CHAIN_HEAD_WORLD_STATE_NOT_AVAILABLE(-32008, "Initial sync is still in progress"), + + /** + * Error code -32009. This error occurs when the gas price is below the configured minimum gas + * price. + */ GAS_PRICE_TOO_LOW(-32009, "Gas price below configured minimum gas price"), + + /** + * Error code -32000. This error occurs when the Chain ID in the transaction signature is wrong. + */ WRONG_CHAIN_ID(-32000, "Wrong Chain ID in transaction signature"), + + /** + * Error code -32000. This error occurs when signatures with replay protection are not supported. + */ REPLAY_PROTECTED_SIGNATURES_NOT_SUPPORTED( -32000, "Signatures with replay protection are not supported"), + + /** Error code -32000. This error occurs when the transaction fee cap is exceeded. */ TX_FEECAP_EXCEEDED(-32000, "Transaction fee cap exceeded"), // Private Transaction Errors + /** Error code -32000. This error occurs when a private transaction fails. */ PRIVATE_TRANSACTION_FAILED(-32000, "Private transaction failed"), + + /** + * Error code -50100. This error occurs when the nonce value for a private transaction is too low. + */ PRIVATE_NONCE_TOO_LOW(-50100, "Private transaction nonce too low"), + + /** + * Error code -50100. This error occurs when the nonce value for a private transaction is + * incorrect. + */ INCORRECT_PRIVATE_NONCE(-50100, "Private transaction nonce is incorrect"); private final int code; @@ -53,49 +119,52 @@ public enum GraphQLError { this.message = message; } + /** + * Returns the error code associated with this GraphQL error. + * + * @return the error code as an integer. + */ @JsonGetter("code") public int getCode() { return code; } + /** + * Returns the error message associated with this GraphQL error. + * + * @return the error message as a string. + */ @JsonGetter("message") public String getMessage() { return message; } + /** + * Maps a {@code TransactionInvalidReason} to a corresponding {@code GraphQLError}. + * + *

This method is used to convert a transaction invalid reason to a GraphQL error, which can be + * used to provide more detailed error information to the client. + * + * @param transactionInvalidReason the transaction invalid reason to be converted. + * @return the corresponding GraphQL error. + */ public static GraphQLError of(final TransactionInvalidReason transactionInvalidReason) { - switch (transactionInvalidReason) { - case WRONG_CHAIN_ID: - return WRONG_CHAIN_ID; - case REPLAY_PROTECTED_SIGNATURES_NOT_SUPPORTED: - return REPLAY_PROTECTED_SIGNATURES_NOT_SUPPORTED; - case INVALID_SIGNATURE: - return INVALID_TRANSACTION_SIGNATURE; - case UPFRONT_COST_EXCEEDS_BALANCE: - return TRANSACTION_UPFRONT_COST_EXCEEDS_BALANCE; - case NONCE_TOO_LOW: - case PRIVATE_NONCE_TOO_LOW: - return NONCE_TOO_LOW; - case NONCE_TOO_HIGH: - case PRIVATE_NONCE_TOO_HIGH: - return INCORRECT_NONCE; - case INTRINSIC_GAS_EXCEEDS_GAS_LIMIT: - return INTRINSIC_GAS_EXCEEDS_LIMIT; - case EXCEEDS_BLOCK_GAS_LIMIT: - return EXCEEDS_BLOCK_GAS_LIMIT; - case TX_SENDER_NOT_AUTHORIZED: - return TX_SENDER_NOT_AUTHORIZED; - case CHAIN_HEAD_WORLD_STATE_NOT_AVAILABLE: - return CHAIN_HEAD_WORLD_STATE_NOT_AVAILABLE; + return switch (transactionInvalidReason) { + case WRONG_CHAIN_ID -> WRONG_CHAIN_ID; + case REPLAY_PROTECTED_SIGNATURES_NOT_SUPPORTED -> REPLAY_PROTECTED_SIGNATURES_NOT_SUPPORTED; + case INVALID_SIGNATURE -> INVALID_TRANSACTION_SIGNATURE; + case UPFRONT_COST_EXCEEDS_BALANCE -> TRANSACTION_UPFRONT_COST_EXCEEDS_BALANCE; + case NONCE_TOO_LOW, PRIVATE_NONCE_TOO_LOW -> NONCE_TOO_LOW; + case NONCE_TOO_HIGH, PRIVATE_NONCE_TOO_HIGH -> INCORRECT_NONCE; + case INTRINSIC_GAS_EXCEEDS_GAS_LIMIT -> INTRINSIC_GAS_EXCEEDS_LIMIT; + case EXCEEDS_BLOCK_GAS_LIMIT -> EXCEEDS_BLOCK_GAS_LIMIT; + case TX_SENDER_NOT_AUTHORIZED -> TX_SENDER_NOT_AUTHORIZED; + case CHAIN_HEAD_WORLD_STATE_NOT_AVAILABLE -> CHAIN_HEAD_WORLD_STATE_NOT_AVAILABLE; // Private Transaction Invalid Reasons - case PRIVATE_TRANSACTION_FAILED: - return PRIVATE_TRANSACTION_FAILED; - case GAS_PRICE_TOO_LOW: - return GAS_PRICE_TOO_LOW; - case TX_FEECAP_EXCEEDED: - return TX_FEECAP_EXCEEDED; - default: - return INTERNAL_ERROR; - } + case PRIVATE_TRANSACTION_FAILED -> PRIVATE_TRANSACTION_FAILED; + case GAS_PRICE_TOO_LOW -> GAS_PRICE_TOO_LOW; + case TX_FEECAP_EXCEEDED -> TX_FEECAP_EXCEEDED; + default -> INTERNAL_ERROR; + }; } } diff --git a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/graphql/internal/response/GraphQLErrorResponse.java b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/graphql/internal/response/GraphQLErrorResponse.java index faf129311..8204fad07 100644 --- a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/graphql/internal/response/GraphQLErrorResponse.java +++ b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/graphql/internal/response/GraphQLErrorResponse.java @@ -16,12 +16,26 @@ package org.hyperledger.besu.ethereum.api.graphql.internal.response; import com.fasterxml.jackson.annotation.JsonIgnore; +/** + * Represents a GraphQL error response. This class extends the GraphQLResponse class and overrides + * the getType method to return ERROR. + */ public class GraphQLErrorResponse extends GraphQLResponse { + /** + * Constructs a new GraphQLErrorResponse with the specified errors. + * + * @param errors the errors to be included in the response. + */ public GraphQLErrorResponse(final Object errors) { super(errors); } + /** + * Returns the type of this GraphQL response. + * + * @return GraphQLResponseType.ERROR, indicating that this is an error response. + */ @Override @JsonIgnore public GraphQLResponseType getType() { diff --git a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/graphql/internal/response/GraphQLJsonRequest.java b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/graphql/internal/response/GraphQLJsonRequest.java index 4a0755fad..899e08a7f 100644 --- a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/graphql/internal/response/GraphQLJsonRequest.java +++ b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/graphql/internal/response/GraphQLJsonRequest.java @@ -19,36 +19,77 @@ import java.util.Map; import com.fasterxml.jackson.annotation.JsonGetter; import com.fasterxml.jackson.annotation.JsonSetter; +/** + * This class represents a GraphQL JSON request. + * + *

It contains the query, operation name, and variables for a GraphQL request. The query is a + * string that represents the GraphQL query. The operation name is a string that represents the + * operation to be performed. The variables is a map that contains the variables for the GraphQL + * query. + */ public class GraphQLJsonRequest { private String query; private String operationName; private Map variables; + /** Default constructor for GraphQLJsonRequest. */ + public GraphQLJsonRequest() {} + + /** + * Gets the query of the GraphQL request. + * + * @return the query of the GraphQL request. + */ @JsonGetter public String getQuery() { return query; } + /** + * Sets the query of the GraphQL request. + * + * @param query the query of the GraphQL request. + */ @JsonSetter public void setQuery(final String query) { this.query = query; } + /** + * Gets the operation name of the GraphQL request. + * + * @return the operation name of the GraphQL request. + */ @JsonGetter public String getOperationName() { return operationName; } + /** + * Sets the operation name of the GraphQL request. + * + * @param operationName the operation name of the GraphQL request. + */ @JsonSetter public void setOperationName(final String operationName) { this.operationName = operationName; } + /** + * Gets the variables of the GraphQL request. + * + * @return the variables of the GraphQL request. + */ @JsonGetter public Map getVariables() { return variables; } + /** + * Sets the variables of the GraphQL request. + * + * @param variables the variables of the GraphQL request. + */ @JsonSetter public void setVariables(final Map variables) { this.variables = variables; diff --git a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/graphql/internal/response/GraphQLNoResponse.java b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/graphql/internal/response/GraphQLNoResponse.java index abc072510..2891ed192 100644 --- a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/graphql/internal/response/GraphQLNoResponse.java +++ b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/graphql/internal/response/GraphQLNoResponse.java @@ -14,8 +14,20 @@ */ package org.hyperledger.besu.ethereum.api.graphql.internal.response; +/** + * This class represents a GraphQL response with no content. + * + *

It extends the GraphQLResponse class and overrides the getType method to return + * GraphQLResponseType.NONE. + */ public class GraphQLNoResponse extends GraphQLResponse { + /** + * Default constructor for GraphQLNoResponse. + * + *

It calls the parent constructor with null as the argument, indicating no content for this + * response. + */ public GraphQLNoResponse() { super(null); } diff --git a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/graphql/internal/response/GraphQLResponse.java b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/graphql/internal/response/GraphQLResponse.java index 21bc17d31..661216254 100644 --- a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/graphql/internal/response/GraphQLResponse.java +++ b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/graphql/internal/response/GraphQLResponse.java @@ -16,15 +16,35 @@ package org.hyperledger.besu.ethereum.api.graphql.internal.response; import java.util.Objects; +/** + * Represents a GraphQL response. This abstract class provides a structure for different types of + * GraphQL responses. + */ public abstract class GraphQLResponse { - public abstract GraphQLResponseType getType(); private final Object result; + /** + * Constructs a new GraphQLResponse with the specified result. + * + * @param result the result to be included in the response. + */ GraphQLResponse(final Object result) { this.result = result; } + /** + * Returns the type of this GraphQL response. + * + * @return the type of this GraphQL response as a GraphQLResponseType. + */ + public abstract GraphQLResponseType getType(); + + /** + * Returns the result of this GraphQL response. + * + * @return the result of this GraphQL response as an Object. + */ public Object getResult() { return result; } diff --git a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/graphql/internal/response/GraphQLResponseType.java b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/graphql/internal/response/GraphQLResponseType.java index ddd5170c3..655d5bc11 100644 --- a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/graphql/internal/response/GraphQLResponseType.java +++ b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/graphql/internal/response/GraphQLResponseType.java @@ -16,8 +16,15 @@ package org.hyperledger.besu.ethereum.api.graphql.internal.response; /** Various types of responses that the JSON-RPC component may produce. */ public enum GraphQLResponseType { + /** Represents a response type where there is no content. */ NONE, + + /** Represents a successful response type. */ SUCCESS, + + /** Represents an error response type. */ ERROR, + + /** Represents an unauthorized response type. */ UNAUTHORIZED } diff --git a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/graphql/internal/response/GraphQLSuccessResponse.java b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/graphql/internal/response/GraphQLSuccessResponse.java index c5a709c37..0721f7d27 100644 --- a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/graphql/internal/response/GraphQLSuccessResponse.java +++ b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/graphql/internal/response/GraphQLSuccessResponse.java @@ -16,12 +16,33 @@ package org.hyperledger.besu.ethereum.api.graphql.internal.response; import com.fasterxml.jackson.annotation.JsonIgnore; +/** + * This class represents a successful GraphQL response. + * + *

It extends the GraphQLResponse class and overrides the getType method to return + * GraphQLResponseType.SUCCESS. + */ public class GraphQLSuccessResponse extends GraphQLResponse { + /** + * Constructor for GraphQLSuccessResponse. + * + *

It calls the parent constructor with the provided data as the argument. + * + * @param data the data to be included in the successful response. + */ public GraphQLSuccessResponse(final Object data) { super(data); } + /** + * Returns the type of the GraphQL response. + * + *

This method is overridden to return GraphQLResponseType.SUCCESS, indicating a successful + * response. + * + * @return GraphQLResponseType.SUCCESS + */ @Override @JsonIgnore public GraphQLResponseType getType() { diff --git a/ethereum/mock-p2p/src/main/java/org/hyperledger/besu/ethereum/p2p/testing/MockNetwork.java b/ethereum/mock-p2p/src/main/java/org/hyperledger/besu/ethereum/p2p/testing/MockNetwork.java index b443afe9f..d7a3c2b50 100644 --- a/ethereum/mock-p2p/src/main/java/org/hyperledger/besu/ethereum/p2p/testing/MockNetwork.java +++ b/ethereum/mock-p2p/src/main/java/org/hyperledger/besu/ethereum/p2p/testing/MockNetwork.java @@ -55,6 +55,11 @@ public final class MockNetwork { private final Map nodes = new HashMap<>(); private final List capabilities; + /** + * Constructs a new MockNetwork with the specified capabilities. + * + * @param capabilities a list of capabilities that the mock network should have. + */ public MockNetwork(final List capabilities) { this.capabilities = capabilities; } From 75f565e0c7d8bd2b1716c9d408dbe03dbca183a7 Mon Sep 17 00:00:00 2001 From: Danno Ferrin Date: Thu, 27 Jun 2024 23:20:51 -0600 Subject: [PATCH 24/58] T8n support for isStateTest and empty accounts (#7275) Update t8n executor to support new isStateTest env flag that will disable extra-transactional processing such as block rewards and beacon root. Also, make sure such extra-transactional commits don't create empty accounts. Signed-off-by: Danno Ferrin Co-authored-by: Usman Saleem --- .../hyperledger/besu/evmtool/T8nExecutor.java | 53 ++++++++++++------- .../BlockchainReferenceTestCaseSpec.java | 3 +- .../referencetests/ReferenceTestEnv.java | 23 ++++++-- 3 files changed, 53 insertions(+), 26 deletions(-) diff --git a/ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/T8nExecutor.java b/ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/T8nExecutor.java index ccabce833..caa5cb367 100644 --- a/ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/T8nExecutor.java +++ b/ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/T8nExecutor.java @@ -51,6 +51,7 @@ import org.hyperledger.besu.ethereum.referencetests.ReferenceTestWorldState; import org.hyperledger.besu.ethereum.rlp.BytesValueRLPInput; import org.hyperledger.besu.ethereum.rlp.BytesValueRLPOutput; import org.hyperledger.besu.ethereum.rlp.RLP; +import org.hyperledger.besu.ethereum.trie.diffbased.common.DiffBasedAccount; import org.hyperledger.besu.evm.account.Account; import org.hyperledger.besu.evm.gascalculator.GasCalculator; import org.hyperledger.besu.evm.log.Log; @@ -265,9 +266,11 @@ public class T8nExecutor { .blobGasPricePerGas(calculateExcessBlobGasForParent(protocolSpec, blockHeader)); long blobGasLimit = protocolSpec.getGasLimitCalculator().currentBlobGasLimit(); - protocolSpec - .getBlockHashProcessor() - .processBlockHashes(blockchain, worldState, referenceTestEnv); + if (!referenceTestEnv.isStateTest()) { + protocolSpec + .getBlockHashProcessor() + .processBlockHashes(blockchain, worldState, referenceTestEnv); + } final WorldUpdater rootWorldStateUpdater = worldState.updater(); List receipts = new ArrayList<>(); @@ -318,13 +321,12 @@ public class T8nExecutor { timer.stop(); if (shouldClearEmptyAccounts(fork)) { - final Account coinbase = worldStateUpdater.getOrCreate(blockHeader.getCoinbase()); - if (coinbase != null && coinbase.isEmpty()) { - worldStateUpdater.deleteAccount(coinbase.getAddress()); - } - final Account txSender = worldStateUpdater.getAccount(transaction.getSender()); - if (txSender != null && txSender.isEmpty()) { - worldStateUpdater.deleteAccount(txSender.getAddress()); + var entries = new ArrayList<>(worldState.getAccumulator().getAccountsToUpdate().entrySet()); + for (var entry : entries) { + DiffBasedAccount updated = entry.getValue().getUpdated(); + if (updated != null && updated.isEmpty()) { + worldState.getAccumulator().deleteAccount(entry.getKey()); + } } } if (result.isInvalid()) { @@ -397,7 +399,9 @@ public class T8nExecutor { // block reward // The max production reward was 5 Eth, longs can hold over 18 Eth. - if (!validTransactions.isEmpty() && (rewardString == null || Long.decode(rewardString) > 0)) { + if (!referenceTestEnv.isStateTest() + && !validTransactions.isEmpty() + && (rewardString == null || Long.decode(rewardString) > 0)) { Wei reward = (rewardString == null) ? protocolSpec.getBlockReward() @@ -408,15 +412,24 @@ public class T8nExecutor { } rootWorldStateUpdater.commit(); - // Invoke the withdrawal processor to handle CL withdrawals. - if (!referenceTestEnv.getWithdrawals().isEmpty()) { - try { - protocolSpec - .getWithdrawalsProcessor() - .ifPresent( - p -> p.processWithdrawals(referenceTestEnv.getWithdrawals(), worldState.updater())); - } catch (RuntimeException re) { - resultObject.put("exception", re.getMessage()); + + if (referenceTestEnv.isStateTest()) { + if (!referenceTestEnv.getWithdrawals().isEmpty()) { + resultObject.put("exception", "withdrawals are not supported in state tests"); + } + } else { + // Invoke the withdrawal processor to handle CL withdrawals. + if (!referenceTestEnv.getWithdrawals().isEmpty()) { + try { + protocolSpec + .getWithdrawalsProcessor() + .ifPresent( + p -> + p.processWithdrawals( + referenceTestEnv.getWithdrawals(), worldState.updater())); + } catch (RuntimeException re) { + resultObject.put("exception", re.getMessage()); + } } } diff --git a/ethereum/referencetests/src/main/java/org/hyperledger/besu/ethereum/referencetests/BlockchainReferenceTestCaseSpec.java b/ethereum/referencetests/src/main/java/org/hyperledger/besu/ethereum/referencetests/BlockchainReferenceTestCaseSpec.java index 378637f36..1048f6238 100644 --- a/ethereum/referencetests/src/main/java/org/hyperledger/besu/ethereum/referencetests/BlockchainReferenceTestCaseSpec.java +++ b/ethereum/referencetests/src/main/java/org/hyperledger/besu/ethereum/referencetests/BlockchainReferenceTestCaseSpec.java @@ -249,7 +249,8 @@ public class BlockchainReferenceTestCaseSpec { @JsonProperty("uncleHeaders") final Object uncleHeaders, @JsonProperty("withdrawals") final Object withdrawals, @JsonProperty("depositRequests") final Object depositRequests, - @JsonProperty("withdrawalRequests") final Object withdrawalRequests) { + @JsonProperty("withdrawalRequests") final Object withdrawalRequests, + @JsonProperty("consolidationRequests") final Object consolidationRequests) { boolean blockVaid = true; // The BLOCK__WrongCharAtRLP_0 test has an invalid character in its rlp string. Bytes rlpAttempt = null; diff --git a/ethereum/referencetests/src/main/java/org/hyperledger/besu/ethereum/referencetests/ReferenceTestEnv.java b/ethereum/referencetests/src/main/java/org/hyperledger/besu/ethereum/referencetests/ReferenceTestEnv.java index 3cd248e3a..636e23f87 100644 --- a/ethereum/referencetests/src/main/java/org/hyperledger/besu/ethereum/referencetests/ReferenceTestEnv.java +++ b/ethereum/referencetests/src/main/java/org/hyperledger/besu/ethereum/referencetests/ReferenceTestEnv.java @@ -83,6 +83,8 @@ public class ReferenceTestEnv extends BlockHeader { private final Bytes32 beaconRoot; + private final boolean isStateTest; + /** * Public constructor. * @@ -120,7 +122,8 @@ public class ReferenceTestEnv extends BlockHeader { @JsonProperty("parentGasLimit") final String parentGasLimit, @JsonProperty("parentGasUsed") final String parentGasUsed, @JsonProperty("parentTimestamp") final String parentTimestamp, - @JsonProperty("parentUncleHash") final String _parentUncleHash) { + @JsonProperty("parentUncleHash") final String _parentUncleHash, + @JsonProperty("isStateTest") final String isStateTest) { super( generateTestBlockHash(previousHash, number), Hash.EMPTY_LIST_HASH, // ommersHash @@ -164,10 +167,16 @@ public class ReferenceTestEnv extends BlockHeader { Map.entry( Long.decode(entry.getKey()), Hash.fromHexString(entry.getValue()))) .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); - this.beaconRoot = - beaconRoot == null - ? (currentBeaconRoot == null ? null : Hash.fromHexString(currentBeaconRoot)) - : Hash.fromHexString(beaconRoot); + if (beaconRoot == null) { + if (currentBeaconRoot == null) { + this.beaconRoot = null; + } else { + this.beaconRoot = Hash.fromHexString(currentBeaconRoot); + } + } else { + this.beaconRoot = Hash.fromHexString(beaconRoot); + } + this.isStateTest = Boolean.parseBoolean(isStateTest); } @Override @@ -239,6 +248,10 @@ public class ReferenceTestEnv extends BlockHeader { return blockHashes; } + public boolean isStateTest() { + return isStateTest; + } + @Override public boolean equals(final Object o) { if (this == o) return true; From 6d55f91a9c8269cd797fec0954c727c087007b1e Mon Sep 17 00:00:00 2001 From: Simon Dudley Date: Fri, 28 Jun 2024 16:09:52 +1000 Subject: [PATCH 25/58] Promote storage x-trie-log subcommand to trie-log (#7278) Signed-off-by: Simon Dudley --- CHANGELOG.md | 8 ++++++++ .../besu/cli/subcommands/storage/TrieLogSubCommand.java | 3 ++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4eb0b5166..5ba6b4dc5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,13 @@ ## Next Release +### Upcoming Breaking Changes +- Receipt compaction will be enabled by default in a future version of Besu. After this change it will not be possible to downgrade to the previous Besu version. +- PKI-backed QBFT will be removed in a future version of Besu. Other forms of QBFT will remain unchanged. +- --Xbonsai-limit-trie-logs-enabled is deprecated, use --bonsai-limit-trie-logs-enabled instead +- --Xbonsai-trie-logs-pruning-window-size is deprecated, use --bonsai-trie-logs-pruning-window-size instead +- `besu storage x-trie-log` subcommand is deprecated, use `besu storage trie-log` instead + ### Breaking Changes - `Xp2p-peer-lower-bound` has been removed. [#7247](https://github.com/hyperledger/besu/pull/7247) @@ -16,6 +23,7 @@ - Add LUKSO as predefined network name [#7223](https://github.com/hyperledger/besu/pull/7223) - Refactored how code, initcode, and max stack size are configured in forks. [#7245](https://github.com/hyperledger/besu/pull/7245) - Nodes in a permissioned chain maintain (and retry) connections to bootnodes [#7257](https://github.com/hyperledger/besu/pull/7257) +- Promote experimental `besu storage x-trie-log` subcommand to production-ready [#7278](https://github.com/hyperledger/besu/pull/7278) ### Bug fixes - Validation errors ignored in accounts-allowlist and empty list [#7138](https://github.com/hyperledger/besu/issues/7138) diff --git a/besu/src/main/java/org/hyperledger/besu/cli/subcommands/storage/TrieLogSubCommand.java b/besu/src/main/java/org/hyperledger/besu/cli/subcommands/storage/TrieLogSubCommand.java index 6b0507895..de4261682 100644 --- a/besu/src/main/java/org/hyperledger/besu/cli/subcommands/storage/TrieLogSubCommand.java +++ b/besu/src/main/java/org/hyperledger/besu/cli/subcommands/storage/TrieLogSubCommand.java @@ -49,7 +49,8 @@ import picocli.CommandLine.ParentCommand; /** The Trie Log subcommand. */ @Command( - name = "x-trie-log", + name = "trie-log", + aliases = "x-trie-log", description = "Manipulate trie logs", mixinStandardHelpOptions = true, versionProvider = VersionProvider.class, From c298a9e77e00aa3745a47a155bf5b6448e53bac4 Mon Sep 17 00:00:00 2001 From: Justin Florentine Date: Fri, 28 Jun 2024 08:37:16 -0400 Subject: [PATCH 26/58] Evm tool readme update (#7274) * update paths to binary. update docker build to use java 21 * updated suggested jdk --------- Signed-off-by: Justin Florentine --- ethereum/evmtool/README.md | 71 ++++++--------------- ethereum/evmtool/build.gradle | 41 ------------ ethereum/evmtool/src/main/docker/Dockerfile | 2 +- 3 files changed, 20 insertions(+), 94 deletions(-) diff --git a/ethereum/evmtool/README.md b/ethereum/evmtool/README.md index a1a703f91..50db1066f 100644 --- a/ethereum/evmtool/README.md +++ b/ethereum/evmtool/README.md @@ -8,13 +8,9 @@ and enclosing data structures. Using EVM Tool in execution-specification-tests ----------------------------------------------- -To use EVM Tool in Execution Spec tests it is recommended that you use -the GraalVM build, as the framework incurs significant startup penalties -for each invocation when run via the Java runtime. - ### Building Execution Tests on macOS -Current as of 24 Jun 2023. +Current as of 26 Jun 2024. MacOS users will typically encounter two problems,one relating to the version of Python used and one relating to zsh. @@ -35,7 +31,7 @@ install python packages needs to escape the brackets pip install -e .\[docs,lint,test\] ``` -An all-in-one script, including homebrew, would look like +An all-in-one script, using homebrew, would look like ```zsh brew install ethereum solidity @@ -43,85 +39,56 @@ git clone https://github.com/ethereum/execution-spec-tests cd execution-spec-tests python3 -m venv ./venv/ source ./venv/bin/activate -pip install -e .[docs,lint,test] +pip install -e .\[docs,lint,test\] ``` -### Building EvmTool with GraalVM on macOS +### Building EvmTool on macOS -First you need a GraalVM JDK installed, if not already installed. +First you need a Java 21+ JDK installed, if not already installed. It is recommended you install [SDKMAN](https://sdkman.io/install) to -manage the graalVM install, homebrew has issues with native attributes -and code signing. +manage the jvm install. ```zsh -sdk install java 22.3.r17-grl -sdk use java 22.3.r17-grl +sdk install java 21.0.3-tem +sdk use java 21.0.3-tem ``` -You can also manually install GraalVM from -the [GraalVM website](https://www.graalvm.org/downloads).. - -Once GraalVM is installed you use the `nativeCompile` target. +Once a JVM is installed you use the gradle target: ```zsh -./gradlew nativeCompile +./gradlew installDist -x test ``` The resulting binary -is `./ethereum/evmtool/build/native/nativeCompile/evmtool` +is `build/install/besu/bin/evmtool` If the testing repository and besu are installed in the same parent directory, the command to run the execution tests is ```zsh -fill -v tests --evm-bin ../besu/ethereum/evmtool/build/install/evmtool/bin/evm +fill -v tests --evm-bin ../besu/build/install/besu/bin/evmtool ``` Assuming homebrew and SDKMan are both installed, the complete script is ```zsh -sdk install java 22.3.r17-grl -sdk use java 22.3.r17-grl +sdk install java 21.0.3-tem +sdk use java 21.0.3-tem git clone https://github.com/hyperledger/besu cd besu -./gradlew nativeCompile +./gradlew installDist -x test cd .. brew install ethereum solidity +solc-select install latest +solc-select use latest git clone https://github.com/ethereum/execution-spec-tests cd execution-spec-tests python3 -m venv ./venv/ source ./venv/bin/activate -pip install -e .[docs,lint,test] +pip install -e .\[docs,lint,test\] -fill -v tests --evm-bin ../besu/ethereum/evmtool/build/install/evmtool/bin/evm +fill -v tests --evm-bin ../besu/build/install/besu/bin/evmtool ``` -If you don't want to use the GraalVM tool the binary that is compatible -is generated by the `ethereum:evmtool:installdist` target and is located -at `./ethereum/evmtool/build/install/evmtool/bin/evm` - -Why not GraalVM for everything? -------------------------------- - -Using GraalVM in execution-spec-tests results in over 20x performance -increase in execution. It will be faster to build GraalVM from scratch -and run the execution-spec-tests than to run just the Java version. - -It is demonstrably faster to run the Java version for a node. -All the test execution gains are the result of reduced startup -penalties. Larger benchmarks will show that performance intensive EVM -code will be slower in GraalVM than the Java version due to the adaptive -compiler. - -For contracts that execute 30 million gas in small operations it is -often faster to run the Java EVMTool than the GraalVM EVMTool, including -startup penalty. The execution tests focus on smaller VM tests that -demonstrate specification conformance. - -We would also need to reconsider some library choices. GraalVM does not -work with Log4J, and we would have to ban that library across Besu and -all dependents. Libraries such as Netty also have some problematic entry -points that interact poorly with how SLF4J needs to initialize. - diff --git a/ethereum/evmtool/build.gradle b/ethereum/evmtool/build.gradle index 0d1700082..aaddc354d 100644 --- a/ethereum/evmtool/build.gradle +++ b/ethereum/evmtool/build.gradle @@ -72,16 +72,6 @@ dependencies { mainClassName = 'org.hyperledger.besu.evmtool.EvmTool' -startScripts { - applicationName = 'evm' - defaultJvmOpts = [ - "-Dsecp256k1.randomize=false" - ] - doLast { - unixScript.text = unixScript.text.replace('BESU_HOME', '\$APP_HOME') - windowsScript.text = windowsScript.text.replace('BESU_HOME', '%~dp0..') - } -} // rename the top level dir from besu- to besu and this makes it really // simple for use in docker @@ -148,34 +138,3 @@ tasks.register('dockerUpload', Exec) { executable "sh" args "-c", cmd } - -graalvmNative { - binaries { - main { - sharedLibrary = false - buildArgs.addAll( - "-H:ReflectionConfigurationFiles=${projectDir}/src/main/graal/reflection-config.json", - "-H:AdditionalSecurityProviders=org.bouncycastle.jce.provider.BouncyCastleProvider", - '-H:+TraceSecurityServices' - ) - - - // Netty drags in older versions of bouncy castle, exclude it so there are no conflicts - excludeConfig.put("io.netty:netty-buffer", [".*"]) - } - } -} - - -configurations.nativeImageClasspath { - // netty statically allocates some problematic classes - exclude group: 'io.netty', module: 'netty-buffer' - exclude group: 'io.netty', module: 'netty-common' - exclude group: 'io.netty', module: 'netty-transport' - - // keep log4j from sneaking in. GraalVM has an aleric reaction if it sees even one class - exclude group: 'org.slf4j', module: 'log4j-over-slf4j:1.7.36' - exclude group: "log4j", module: "log4j" - exclude group: "org.apache.logging.log4j" - exclude group: 'org.bouncycastle', module: 'bcprov-jdk18on' -} diff --git a/ethereum/evmtool/src/main/docker/Dockerfile b/ethereum/evmtool/src/main/docker/Dockerfile index 9d9bf4aaf..9d7b48d3c 100644 --- a/ethereum/evmtool/src/main/docker/Dockerfile +++ b/ethereum/evmtool/src/main/docker/Dockerfile @@ -9,7 +9,7 @@ RUN apt-get update $NO_PROXY_CACHE && \ apt-get -o Acquire::BrokenProxy=true -o Acquire::http::No-Cache=true -o Acquire::http::Pipeline-Depth=0 \ --no-install-recommends -q --assume-yes install ca-certificates-java=20190909* && \ apt-get -o Acquire::BrokenProxy=true -o Acquire::http::No-Cache=true -o Acquire::http::Pipeline-Depth=0 \ - --no-install-recommends -q --assume-yes install openjdk-17-jre-headless=17* && \ + --no-install-recommends -q --assume-yes install openjdk-21-jre-headless=21* && \ # Clean apt cache \ apt-get clean && \ rm -rf /var/cache/apt/archives/* /var/cache/apt/archives/partial/* && \ From fa63fc45b469b309fb6a4c66e438e22f33a198a0 Mon Sep 17 00:00:00 2001 From: Usman Saleem Date: Sat, 29 Jun 2024 02:55:47 +1000 Subject: [PATCH 27/58] javadoc - Add missing javadoc for evmtool module (#7277) Signed-off-by: Usman Saleem --- build.gradle | 2 - .../besu/evmtool/B11rSubCommand.java | 11 ++++ .../besu/evmtool/BenchmarkSubCommand.java | 15 +++++ .../besu/evmtool/BlockchainModule.java | 8 +++ .../besu/evmtool/CodeValidateSubCommand.java | 22 +++++++ .../besu/evmtool/DataStoreModule.java | 11 ++++ .../besu/evmtool/EOFTestSubCommand.java | 15 +++++ .../org/hyperledger/besu/evmtool/EvmTool.java | 9 +++ .../besu/evmtool/EvmToolCommand.java | 43 ++++++++++++ .../evmtool/EvmToolCommandOptionsModule.java | 13 ++++ .../besu/evmtool/EvmToolComponent.java | 47 +++++++++++++ .../besu/evmtool/GenesisFileModule.java | 15 +++++ .../hyperledger/besu/evmtool/JsonUtils.java | 6 ++ .../besu/evmtool/PrettyPrintSubCommand.java | 28 ++++++++ .../besu/evmtool/ProtocolModule.java | 15 +++++ .../besu/evmtool/StateTestSubCommand.java | 21 ++++++ .../hyperledger/besu/evmtool/T8nExecutor.java | 66 ++++++++++++++++++- .../besu/evmtool/T8nServerSubCommand.java | 17 +++++ .../besu/evmtool/T8nSubCommand.java | 23 +++++++ .../besu/evmtool/VersionProvider.java | 18 +++++ 20 files changed, 402 insertions(+), 3 deletions(-) diff --git a/build.gradle b/build.gradle index 1adc3b992..7d2293b61 100644 --- a/build.gradle +++ b/build.gradle @@ -401,8 +401,6 @@ allprojects { '-org.hyperledger.besu.ethereum.eth.*,' + '-org.hyperledger.besu.ethereum.eth,' + '-org.hyperledger.besu.consensus.merge,' + - // evmtool module - '-org.hyperledger.besu.evmtool,' + // p2p module '-org.hyperledger.besu.ethereum.p2p,' + '-org.hyperledger.besu.ethereum.p2p.*,' + diff --git a/ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/B11rSubCommand.java b/ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/B11rSubCommand.java index 9a27a8a40..0bb794975 100644 --- a/ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/B11rSubCommand.java +++ b/ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/B11rSubCommand.java @@ -51,6 +51,11 @@ import picocli.CommandLine.Option; import picocli.CommandLine.Parameters; import picocli.CommandLine.ParentCommand; +/** + * This class implements the Runnable interface and represents the B11rSubCommand. It is responsible + * for handling the block builder subcommand in the EVM tool. It provides methods to read headers, + * move fields, and run the command. + */ @Command( name = COMMAND_NAME, aliases = {COMMAND_ALIAS}, @@ -138,12 +143,18 @@ public class B11rSubCommand implements Runnable { } } + /** Default constructor for the B11rSubCommand class. This is required by PicoCLI. */ @SuppressWarnings("unused") public B11rSubCommand() { // PicoCLI requires this parentCommand = null; } + /** + * Constructs a new B11rSubCommand with the given parent command. + * + * @param parentCommand the parent command of this subcommand + */ @SuppressWarnings("unused") public B11rSubCommand(final EvmToolCommand parentCommand) { // PicoCLI requires this too diff --git a/ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/BenchmarkSubCommand.java b/ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/BenchmarkSubCommand.java index 05d90a7b3..829bf2d58 100644 --- a/ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/BenchmarkSubCommand.java +++ b/ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/BenchmarkSubCommand.java @@ -33,13 +33,22 @@ import picocli.CommandLine.Option; import picocli.CommandLine.Parameters; import picocli.CommandLine.ParentCommand; +/** + * This class represents the BenchmarkSubCommand. It is responsible for executing an Ethereum State + * Test. + */ @CommandLine.Command( name = COMMAND_NAME, description = "Execute an Ethereum State Test.", mixinStandardHelpOptions = true, versionProvider = VersionProvider.class) public class BenchmarkSubCommand implements Runnable { + /** + * The command name for the BenchmarkSubCommand. This constant is used as the name attribute in + * the {@code CommandLine.Command} annotation. + */ public static final String COMMAND_NAME = "benchmark"; + private final PrintStream output; enum Benchmark { @@ -68,11 +77,17 @@ public class BenchmarkSubCommand implements Runnable { @ParentCommand EvmToolCommand parentCommand; + /** Default constructor for the BenchmarkSubCommand class. This is required by PicoCLI. */ public BenchmarkSubCommand() { // PicoCLI requires this this(System.out); } + /** + * Constructs a new BenchmarkSubCommand with the given output stream. + * + * @param output the output stream to be used + */ public BenchmarkSubCommand(final PrintStream output) { this.output = output; } diff --git a/ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/BlockchainModule.java b/ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/BlockchainModule.java index b3a153113..7b463fe08 100644 --- a/ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/BlockchainModule.java +++ b/ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/BlockchainModule.java @@ -39,10 +39,18 @@ import dagger.Module; import dagger.Provides; import org.apache.tuweni.bytes.Bytes32; +/** + * This class is a Dagger module that provides dependencies related to the blockchain. It includes + * the GenesisFileModule and DataStoreModule for providing the genesis block and data store + * respectively. The class is annotated with {@code @Module} to indicate that it is a Dagger module. + */ @SuppressWarnings("WeakerAccess") @Module(includes = {GenesisFileModule.class, DataStoreModule.class}) public class BlockchainModule { + /** Default constructor for the BlockchainModule class. */ + public BlockchainModule() {} + @Singleton @Provides Blockchain provideBlockchain( diff --git a/ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/CodeValidateSubCommand.java b/ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/CodeValidateSubCommand.java index 10e167f40..e16d4014f 100644 --- a/ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/CodeValidateSubCommand.java +++ b/ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/CodeValidateSubCommand.java @@ -40,6 +40,11 @@ import org.apache.tuweni.bytes.Bytes; import picocli.CommandLine; import picocli.CommandLine.ParentCommand; +/** + * This class represents the CodeValidateSubCommand. It is responsible for validating EVM code for + * fuzzing. It implements the Runnable interface and is annotated with the {@code + * CommandLine.Command} annotation. + */ @SuppressWarnings({"ConstantValue", "DataFlowIssue"}) @CommandLine.Command( name = COMMAND_NAME, @@ -47,6 +52,10 @@ import picocli.CommandLine.ParentCommand; mixinStandardHelpOptions = true, versionProvider = VersionProvider.class) public class CodeValidateSubCommand implements Runnable { + /** + * The command name for the CodeValidateSubCommand. This constant is used as the name attribute in + * the CommandLine.Command annotation. + */ public static final String COMMAND_NAME = "code-validate"; @ParentCommand EvmToolCommand parentCommand; @@ -62,6 +71,7 @@ public class CodeValidateSubCommand implements Runnable { @CommandLine.Parameters private final List cliCode = new ArrayList<>(); + /** Default constructor for the CodeValidateSubCommand class. This is required by PicoCLI. */ @SuppressWarnings("unused") public CodeValidateSubCommand() { // PicoCLI requires this @@ -111,6 +121,18 @@ public class CodeValidateSubCommand implements Runnable { } } + /** + * This method is responsible for validating the EVM code. It takes a hexadecimal string + * representation of the EVM code as input. The method first converts the hexadecimal string to + * Bytes. It then checks if the code follows the EOF layout. If the layout is valid, it retrieves + * the code from the EVM. If the code is invalid, it returns an error message with the reason for + * the invalidity. If the code is valid, it returns a string with "OK" followed by the hexadecimal + * string representation of each code section. + * + * @param hexCode the hexadecimal string representation of the EVM code + * @return a string indicating whether the code is valid or not, and in case of validity, the + * hexadecimal string representation of each code section + */ public String considerCode(final String hexCode) { Bytes codeBytes; try { diff --git a/ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/DataStoreModule.java b/ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/DataStoreModule.java index 28b212024..7629b3184 100644 --- a/ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/DataStoreModule.java +++ b/ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/DataStoreModule.java @@ -38,6 +38,14 @@ import com.google.common.base.Suppliers; import dagger.Module; import dagger.Provides; +/** + * This class is a Dagger module that provides dependencies related to the data store. It includes + * the GenesisFileModule for providing the genesis block. The class is annotated with + * {@code @Module} to indicate that it is a Dagger module. It provides various key-value storages + * such as variables, blockchain, world state, world state preimage, and pruning. The type of + * key-value storage (e.g., rocksdb, memory) can be specified. The class also provides a + * BlockchainStorage which is a prefixed key blockchain storage. + */ @SuppressWarnings({"CloseableProvides"}) @Module(includes = GenesisFileModule.class) public class DataStoreModule { @@ -50,6 +58,9 @@ public class DataStoreModule { List.of(KeyValueSegmentIdentifier.values()), RocksDBMetricsFactory.PUBLIC_ROCKS_DB_METRICS)); + /** Default constructor for the DataStoreModule class. */ + public DataStoreModule() {} + @Provides @Singleton @Named("variables") diff --git a/ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/EOFTestSubCommand.java b/ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/EOFTestSubCommand.java index ab53b41e1..bfa873e61 100644 --- a/ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/EOFTestSubCommand.java +++ b/ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/EOFTestSubCommand.java @@ -45,13 +45,16 @@ import com.fasterxml.jackson.databind.ObjectMapper; import org.apache.tuweni.bytes.Bytes; import picocli.CommandLine; +/** A PicoCli annotated command for running EOF validation reference tests. */ @CommandLine.Command( name = COMMAND_NAME, description = "Runs EOF validation reference tests", mixinStandardHelpOptions = true, versionProvider = VersionProvider.class) public class EOFTestSubCommand implements Runnable { + /** The name of the EOF validation reference test command. */ public static final String COMMAND_NAME = "eof-test"; + @CommandLine.ParentCommand private final EvmToolCommand parentCommand; // picocli does it magically @@ -65,10 +68,16 @@ public class EOFTestSubCommand implements Runnable { EVM evm; String fork = null; + /** Default constructor for the EOFTestSubCommand class. Sets the parent command to null. */ public EOFTestSubCommand() { this(null); } + /** + * Constructor for the EOFTestSubCommand class with a parent command. + * + * @param parentCommand The parent command for this sub command. + */ public EOFTestSubCommand(final EvmToolCommand parentCommand) { this.parentCommand = parentCommand; } @@ -199,6 +208,12 @@ public class EOFTestSubCommand implements Runnable { } } + /** + * Considers the given hexadecimal code string for EOF validation. + * + * @param hexCode The hexadecimal string representation of the code to be considered. + * @return The result of the EOF validation test. + */ public TestResult considerCode(final String hexCode) { Bytes codeBytes; try { diff --git a/ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/EvmTool.java b/ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/EvmTool.java index 43c1a666d..dec055564 100644 --- a/ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/EvmTool.java +++ b/ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/EvmTool.java @@ -16,8 +16,17 @@ package org.hyperledger.besu.evmtool; import org.hyperledger.besu.util.LogConfigurator; +/** The main entry point for the EVM (Ethereum Virtual Machine) tool. */ public final class EvmTool { + /** Default constructor for the EvmTool class. */ + public EvmTool() {} + + /** + * The main entry point for the EVM (Ethereum Virtual Machine) tool. + * + * @param args The command line arguments. + */ public static void main(final String... args) { LogConfigurator.setLevel("", "DEBUG"); final EvmToolCommand evmToolCommand = new EvmToolCommand(); diff --git a/ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/EvmToolCommand.java b/ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/EvmToolCommand.java index 90afdcdeb..a3bed6b54 100644 --- a/ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/EvmToolCommand.java +++ b/ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/EvmToolCommand.java @@ -70,6 +70,21 @@ import picocli.CommandLine; import picocli.CommandLine.Command; import picocli.CommandLine.Option; +/** + * This class, EvmToolCommand, serves as the main command for the EVM (Ethereum Virtual Machine) + * tool. The EVM tool is used to execute Ethereum transactions and contracts in a local environment. + * + *

EvmToolCommand implements the Runnable interface, making it the entrypoint for PicoCLI to + * execute this command. + * + *

The class provides various options for setting up and executing EVM transactions. These + * options include, but are not limited to, setting the gas price, sender address, receiver address, + * and the data to be sent with the transaction. + * + *

Key methods in this class include 'run()' for executing the command, 'execute()' for setting + * up and running the EVM transaction, and 'dumpWorldState()' for outputting the current state of + * the Ethereum world state. + */ @Command( description = "This command evaluates EVM transactions.", abbreviateSynopsis = true, @@ -247,12 +262,22 @@ public class EvmToolCommand implements Runnable { PrintWriter out; InputStream in; + /** + * Default constructor for the EvmToolCommand class. It initializes the input stream with an empty + * byte array and the output stream with the standard output. + */ public EvmToolCommand() { this( new ByteArrayInputStream(new byte[0]), new PrintWriter(new BufferedWriter(new OutputStreamWriter(System.out, UTF_8)), true)); } + /** + * Constructor for the EvmToolCommand class with custom input and output streams. + * + * @param in The input stream to be used. + * @param out The output stream to be used. + */ public EvmToolCommand(final InputStream in, final PrintWriter out) { this.in = in; this.out = out; @@ -322,10 +347,21 @@ public class EvmToolCommand implements Runnable { subCommandLine.setHelpSectionKeys(keys); } + /** + * Returns the fork name provided by the Dagger options. If no fork is provided, it returns the + * name of the default EVM specification version. + * + * @return The fork name. + */ public String getFork() { return daggerOptions.provideFork().orElse(EvmSpecVersion.defaultVersion().getName()); } + /** + * Checks if a fork is provided in the Dagger options. + * + * @return True if a fork is provided, false otherwise. + */ public boolean hasFork() { return daggerOptions.provideFork().isPresent(); } @@ -506,6 +542,13 @@ public class EvmToolCommand implements Runnable { } } + /** + * Dumps the current state of the Ethereum world state to the provided PrintWriter. The state + * includes account balances, nonces, codes, and storage. The output is in JSON format. + * + * @param worldState The Ethereum world state to be dumped. + * @param out The PrintWriter to which the state is dumped. + */ public static void dumpWorldState(final MutableWorldState worldState, final PrintWriter out) { out.println("{"); worldState diff --git a/ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/EvmToolCommandOptionsModule.java b/ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/EvmToolCommandOptionsModule.java index fe229dc3c..820b11442 100644 --- a/ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/EvmToolCommandOptionsModule.java +++ b/ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/EvmToolCommandOptionsModule.java @@ -32,6 +32,16 @@ import dagger.Provides; import picocli.CommandLine; import picocli.CommandLine.Option; +/** + * This class, EvmToolCommandOptionsModule, is a Dagger module that provides dependencies for the + * EvmToolCommand. It contains options for setting up the EVM tool, such as whether revert reasons + * should be persisted, the fork to evaluate, the key-value storage to be used, the data path, the + * block number to evaluate against, and the world state update mode. + * + *

The class uses PicoCLI annotations to define these options, which can be provided via the + * command line when running the EVM tool. Each option has a corresponding provider method that + * Dagger uses to inject the option's value where needed. + */ @SuppressWarnings("WeakerAccess") @Module public class EvmToolCommandOptionsModule { @@ -133,4 +143,7 @@ public class EvmToolCommandOptionsModule { EvmConfiguration provideEvmConfiguration() { return new EvmConfiguration(jumpDestCacheWeightKilobytes, worldstateUpdateMode); } + + /** Default constructor for the EvmToolCommandOptionsModule class. */ + public EvmToolCommandOptionsModule() {} } diff --git a/ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/EvmToolComponent.java b/ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/EvmToolComponent.java index 176700ee8..cc84b5948 100644 --- a/ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/EvmToolComponent.java +++ b/ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/EvmToolComponent.java @@ -26,6 +26,22 @@ import javax.inject.Singleton; import dagger.Component; +/** + * This is a Dagger component interface for the EVM (Ethereum Virtual Machine) tool. It is annotated + * with @Singleton to ensure that only a single instance of this component exists within the Dagger + * component graph. + * + *

The component is composed of several modules that provide the necessary dependencies for the + * EVM tool: - ProtocolModule: Provides the protocol specification. - GenesisFileModule: Provides + * the genesis file for the blockchain. - DataStoreModule: Provides the data store for blockchain + * data. - BlockchainModule: Provides the blockchain instance. - EvmToolCommandOptionsModule: + * Provides the command options for the EVM tool. - MetricsConfigurationModule and + * MetricsSystemModule: Provide the metrics system and its configuration. + * + *

The interface defines methods to get instances of key classes like ProtocolSpec, EVM, + * WorldUpdater, MutableWorldState, and Blockchain. These methods are used by Dagger to inject the + * returned instances where needed. + */ @Singleton @Component( modules = { @@ -39,13 +55,44 @@ import dagger.Component; }) public interface EvmToolComponent { + /** + * Retrieves the ProtocolSpec instance. ProtocolSpec defines the Ethereum protocol specifications, + * which includes the precompiled contracts, the gas calculator, the EVM, and the private nonce + * calculator. + * + * @return The ProtocolSpec instance. + */ ProtocolSpec getProtocolSpec(); + /** + * Retrieves the EVM instance. EVM (Ethereum Virtual Machine) is responsible for executing the + * bytecode of smart contracts in Ethereum. + * + * @return The EVM instance. + */ EVM getEVM(); + /** + * Retrieves the WorldUpdater instance. WorldUpdater is used to modify the world state, which + * includes the accounts and their associated storage and code. + * + * @return The WorldUpdater instance. + */ WorldUpdater getWorldUpdater(); + /** + * Retrieves the MutableWorldState instance. MutableWorldState represents the world state of + * Ethereum, which includes all accounts, their balances, nonces, codes, and storage. + * + * @return The MutableWorldState instance. + */ MutableWorldState getWorldState(); + /** + * Retrieves the Blockchain instance. Blockchain represents the Ethereum blockchain, which + * includes blocks, transactions, and the world state. + * + * @return The Blockchain instance. + */ Blockchain getBlockchain(); } diff --git a/ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/GenesisFileModule.java b/ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/GenesisFileModule.java index 506c3911d..1283ec039 100644 --- a/ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/GenesisFileModule.java +++ b/ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/GenesisFileModule.java @@ -36,11 +36,26 @@ import dagger.Module; import dagger.Provides; import io.vertx.core.json.JsonObject; +/** + * This class, GenesisFileModule, is a Dagger module that provides dependencies for the GenesisFile. + * It contains options for setting up the GenesisFile, such as the genesis configuration, genesis + * state, block header functions, and the genesis block. + * + *

The class uses Dagger annotations to define these options, which can be provided via the + * command line when running the EVM tool. Each option has a corresponding provider method that + * Dagger uses to inject the option's value where needed. + */ @Module public class GenesisFileModule { private final String genesisConfig; + /** + * Constructs a new GenesisFileModule with the specified genesis configuration. + * + * @param genesisConfig The configuration for the genesis file. This is typically a JSON string + * that specifies various parameters for the genesis block of the blockchain. + */ protected GenesisFileModule(final String genesisConfig) { this.genesisConfig = genesisConfig; } diff --git a/ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/JsonUtils.java b/ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/JsonUtils.java index 42da8fd95..7af31054a 100644 --- a/ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/JsonUtils.java +++ b/ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/JsonUtils.java @@ -24,6 +24,12 @@ import com.fasterxml.jackson.databind.module.SimpleModule; import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; import org.apache.tuweni.bytes.Bytes; +/** + * Utility class for JSON related operations. This class provides a method to create an ObjectMapper + * with standard configurations needed for evmtool. The ObjectMapper is configured to match the + * standard JSON output of Go, and it does not auto close the source. It also registers serializers + * for Address and Bytes classes. This class is not meant to be instantiated. + */ public class JsonUtils { private JsonUtils() {} diff --git a/ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/PrettyPrintSubCommand.java b/ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/PrettyPrintSubCommand.java index 10d31960a..465f2c489 100644 --- a/ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/PrettyPrintSubCommand.java +++ b/ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/PrettyPrintSubCommand.java @@ -30,13 +30,31 @@ import java.util.List; import org.apache.tuweni.bytes.Bytes; import picocli.CommandLine; +/** + * This class, PrettyPrintSubCommand, is a command-line interface (CLI) command that pretty prints + * EOF (Ethereum Object Format) code. It implements the Runnable interface, meaning it can be used + * in a thread of execution. + * + *

The class is annotated with {@code @CommandLine.Command}, which is a PicoCLI annotation that + * designates this class as a command-line command. The annotation parameters define the command's + * name, description, whether it includes standard help options, and the version provider. + * + *

The command's functionality is defined in the run() method, which is overridden from the + * Runnable interface. + */ @CommandLine.Command( name = COMMAND_NAME, description = "Pretty Prints EOF Code", mixinStandardHelpOptions = true, versionProvider = VersionProvider.class) public class PrettyPrintSubCommand implements Runnable { + /** + * The name of the command for the PrettyPrintSubCommand. This constant is used as the name + * parameter in the @CommandLine.Command annotation. It defines the command name that users should + * enter on the command line to invoke this command. + */ public static final String COMMAND_NAME = "pretty-print"; + @CommandLine.ParentCommand private final EvmToolCommand parentCommand; @CommandLine.Option( @@ -48,10 +66,20 @@ public class PrettyPrintSubCommand implements Runnable { // picocli does it magically @CommandLine.Parameters private final List codeList = new ArrayList<>(); + /** + * Default constructor for the PrettyPrintSubCommand class. This constructor initializes the + * parentCommand to null. + */ public PrettyPrintSubCommand() { this(null); } + /** + * Constructs a new PrettyPrintSubCommand with the specified parent command. + * + * @param parentCommand The parent command for this subcommand. This is typically an instance of + * EvmToolCommand. + */ public PrettyPrintSubCommand(final EvmToolCommand parentCommand) { this.parentCommand = parentCommand; } diff --git a/ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/ProtocolModule.java b/ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/ProtocolModule.java index 1b8f557b3..a196a35f5 100644 --- a/ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/ProtocolModule.java +++ b/ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/ProtocolModule.java @@ -24,10 +24,25 @@ import javax.inject.Singleton; import dagger.Module; import dagger.Provides; +/** + * This class, ProtocolModule, is a Dagger module that provides dependencies for the ProtocolSpec + * and EVM. It includes the GenesisFileModule, which provides the genesis configuration for the + * blockchain. + * + *

The class uses Dagger annotations to define these dependencies, which can be provided via the + * command line when running the EVM tool. Each dependency has a corresponding provider method that + * Dagger uses to inject the dependency's value where needed. + */ @SuppressWarnings("WeakerAccess") @Module(includes = GenesisFileModule.class) public class ProtocolModule { + /** + * Default constructor for the ProtocolModule class. This constructor doesn't take any arguments + * and doesn't perform any initialization. + */ + public ProtocolModule() {} + @Provides @Singleton ProtocolSpec getProtocolSpec(final ProtocolSchedule protocolSchedule) { diff --git a/ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/StateTestSubCommand.java b/ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/StateTestSubCommand.java index 60a09b26e..064a093e8 100644 --- a/ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/StateTestSubCommand.java +++ b/ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/StateTestSubCommand.java @@ -65,12 +65,29 @@ import picocli.CommandLine.Option; import picocli.CommandLine.Parameters; import picocli.CommandLine.ParentCommand; +/** + * This class, StateTestSubCommand, is a command-line interface (CLI) command that executes an + * Ethereum State Test. It implements the Runnable interface, meaning it can be used in a thread of + * execution. + * + *

The class is annotated with @CommandLine.Command, which is a PicoCLI annotation that + * designates this class as a command-line command. The annotation parameters define the command's + * name, description, whether it includes standard help options, and the version provider. + * + *

The command's functionality is defined in the run() method, which is overridden from the + * Runnable interface. + */ @Command( name = COMMAND_NAME, description = "Execute an Ethereum State Test.", mixinStandardHelpOptions = true, versionProvider = VersionProvider.class) public class StateTestSubCommand implements Runnable { + /** + * The name of the command for the StateTestSubCommand. This constant is used as the name + * parameter in the @CommandLine.Command annotation. It defines the command name that users should + * enter on the command line to invoke this command. + */ public static final String COMMAND_NAME = "state-test"; static final Supplier referenceTestProtocolSchedules = @@ -112,6 +129,10 @@ public class StateTestSubCommand implements Runnable { // picocli does it magically @Parameters private final List stateTestFiles = new ArrayList<>(); + /** + * Default constructor for the StateTestSubCommand class. This constructor doesn't take any + * arguments and initializes the parentCommand to null. PicoCLI requires this constructor. + */ @SuppressWarnings("unused") public StateTestSubCommand() { // PicoCLI requires this diff --git a/ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/T8nExecutor.java b/ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/T8nExecutor.java index caa5cb367..40c73e383 100644 --- a/ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/T8nExecutor.java +++ b/ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/T8nExecutor.java @@ -86,12 +86,43 @@ import org.apache.tuweni.bytes.Bytes; import org.apache.tuweni.bytes.Bytes32; import org.apache.tuweni.units.bigints.UInt256; +/** + * The T8nExecutor class is responsible for executing transactions in the context of the Ethereum + * Virtual Machine (EVM). It extracts transactions from a given input, runs tests on them, and + * generates results including stateRoot, txRoot, receiptsRoot, and logsHash. It also handles block + * rewards and withdrawal processing. This class is part of the EVM tooling within the Hyperledger + * Besu project. + */ public class T8nExecutor { private static final Set

EMPTY_ADDRESS_SET = Set.of(); + /** + * A record that represents a transaction that has been rejected. It contains the index of the + * transaction and the error message explaining why it was rejected. + * + * @param index The index of the rejected transaction. + * @param error The error message explaining why the transaction was rejected. + */ public record RejectedTransaction(int index, String error) {} + /** + * Default constructor for the T8nExecutor class. This constructor does not perform any + * operations. + */ + public T8nExecutor() {} + + /** + * Extracts transactions from a given JSON iterator and adds them to the provided transactions + * list. If a transaction cannot be parsed or is invalid, it is added to the rejections list with + * its index and error message. + * + * @param out PrintWriter used for outputting information or errors. + * @param it Iterator over JSON nodes, each representing a transaction. + * @param transactions List of transactions to which parsed transactions are added. + * @param rejections List of RejectedTransaction records to which rejected transactions are added. + * @return The updated list of transactions after parsing and validation. + */ protected static List extractTransactions( final PrintWriter out, final Iterator it, @@ -547,12 +578,45 @@ public class T8nExecutor { return new T8nResult(allocObject, bodyBytes, resultObject); } - interface TracerManager { + /** + * The TracerManager interface provides methods for managing OperationTracer instances. It is used + * in the context of Ethereum Virtual Machine (EVM) execution to trace operations. + * + *

The interface defines two methods: - getManagedTracer: This method is used to get a managed + * OperationTracer instance for a specific transaction. - disposeTracer: This method is used to + * dispose of an OperationTracer instance when it is no longer needed. + */ + public interface TracerManager { + + /** + * Retrieves a managed OperationTracer instance for a specific transaction. + * + * @param txIndex The index of the transaction for which the tracer is to be retrieved. + * @param txHash The hash of the transaction for which the tracer is to be retrieved. + * @return The managed OperationTracer instance. + * @throws Exception If an error occurs while retrieving the tracer. + */ OperationTracer getManagedTracer(int txIndex, Hash txHash) throws Exception; + /** + * Disposes of an OperationTracer instance when it is no longer needed. + * + * @param tracer The OperationTracer instance to be disposed. + * @throws IOException If an error occurs while disposing the tracer. + */ void disposeTracer(OperationTracer tracer) throws IOException; } + /** + * A record that represents the result of a transaction test run in the Ethereum Virtual Machine + * (EVM). It contains the final state of the accounts (allocObject), the raw bytes of the + * transactions (bodyBytes), and the result of the test run (resultObject). + * + * @param allocObject The final state of the accounts after the test run. + * @param bodyBytes The raw bytes of the transactions that were run. + * @param resultObject The result of the test run, including stateRoot, txRoot, receiptsRoot, + * logsHash, and other details. + */ @SuppressWarnings("unused") record T8nResult(ObjectNode allocObject, TextNode bodyBytes, ObjectNode resultObject) {} } diff --git a/ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/T8nServerSubCommand.java b/ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/T8nServerSubCommand.java index 1c0a49438..ffa6e67b7 100644 --- a/ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/T8nServerSubCommand.java +++ b/ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/T8nServerSubCommand.java @@ -55,6 +55,19 @@ import io.vertx.core.http.HttpServerRequest; import picocli.CommandLine; import picocli.CommandLine.ParentCommand; +/** + * The T8nServerSubCommand class is responsible for running an Ethereum State Test server. It reads + * the initial state, transactions, and environment from input files or stdin, executes the + * transactions in the Ethereum Virtual Machine (EVM), and writes the final state, transaction + * results, and traces to output files or stdout. + * + *

The class uses the Vert.x library for handling HTTP requests and the picocli library for + * command line argument parsing. It includes options for specifying the host and port to bind to, + * and the base directory for output. + * + *

The class also includes a TracerManager for managing OperationTracer instances, which are used + * to trace EVM operations when the --json flag is specified. + */ @SuppressWarnings("java:S106") // using standard output is the point of this class @CommandLine.Command( name = "t8n-server", @@ -80,6 +93,10 @@ public class T8nServerSubCommand implements Runnable { @ParentCommand private final EvmToolCommand parentCommand; + /** + * Default constructor for the T8nServerSubCommand class. This constructor is required by PicoCLI + * and assigns null to parentCommand. + */ @SuppressWarnings("unused") public T8nServerSubCommand() { // PicoCLI requires this diff --git a/ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/T8nSubCommand.java b/ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/T8nSubCommand.java index 95dabb318..d6db1a1e8 100644 --- a/ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/T8nSubCommand.java +++ b/ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/T8nSubCommand.java @@ -59,6 +59,19 @@ import picocli.CommandLine.ParameterException; import picocli.CommandLine.Parameters; import picocli.CommandLine.ParentCommand; +/** + * The T8nSubCommand class is responsible for executing an Ethereum State Test. It reads the initial + * state, transactions, and environment from input files or stdin, executes the transactions in the + * Ethereum Virtual Machine (EVM), and writes the final state, transaction results, and traces to + * output files or stdout. + * + *

The class uses the picocli library for command line argument parsing and includes options for + * specifying the input and output files, the fork to run the transition against, the chain ID, and + * the block reward. + * + *

The class also includes a TracerManager for managing OperationTracer instances, which are used + * to trace EVM operations when the --json flag is specified. + */ @Command( name = COMMAND_NAME, aliases = COMMAND_ALIAS, @@ -154,12 +167,22 @@ public class T8nSubCommand implements Runnable { } } + /** + * Default constructor for the T8nSubCommand class. This constructor is required by PicoCLI and + * assigns parent command to 'null'. + */ @SuppressWarnings("unused") public T8nSubCommand() { // PicoCLI requires this parentCommand = null; } + /** + * Constructor for the T8nSubCommand class with a parent command. This constructor is required by + * PicoCLI. + * + * @param parentCommand The parent command for this sub command. + */ @SuppressWarnings("unused") public T8nSubCommand(final EvmToolCommand parentCommand) { // PicoCLI requires this too diff --git a/ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/VersionProvider.java b/ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/VersionProvider.java index d97fded88..6f3ff3307 100644 --- a/ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/VersionProvider.java +++ b/ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/VersionProvider.java @@ -18,8 +18,26 @@ import org.hyperledger.besu.BesuInfo; import picocli.CommandLine; +/** + * The VersionProvider class is responsible for providing the version of the Hyperledger Besu EVM + * tool. It implements the IVersionProvider interface from the picocli library. + * + *

The getVersion method returns a string array containing the version of the Hyperledger Besu + * EVM tool. + */ public class VersionProvider implements CommandLine.IVersionProvider { + /** + * Default constructor for the VersionProvider class. This constructor does not perform any + * operations. + */ + public VersionProvider() {} + + /** + * This method returns the version of the Hyperledger Besu EVM tool. + * + * @return A string array containing the version of the Hyperledger Besu EVM tool. + */ @Override public String[] getVersion() { return new String[] {"Hyperledger Besu evm " + BesuInfo.shortVersion()}; From 20b82a40c9be873cd8ace5f1ae76ae564b00d789 Mon Sep 17 00:00:00 2001 From: Danno Ferrin Date: Fri, 28 Jun 2024 17:07:26 -0600 Subject: [PATCH 28/58] Rename ValidatorPublicKey to ValidatorPubKey (#7280) Adapt to EIP-7002 name change for validator public key in all places. Signed-off-by: Danno Ferrin --- .../WithdrawalRequestParameter.java | 2 +- .../besu/ethereum/core/WithdrawalRequest.java | 18 ++++---- .../encoding/WithdrawalRequestDecoder.java | 4 +- .../encoding/WithdrawalRequestEncoder.java | 2 +- .../WithdrawalRequestContractHelper.java | 4 +- .../WithdrawalRequestContractHelperTest.java | 22 +++++----- .../hyperledger/besu/evmtool/T8nExecutor.java | 6 ++- .../besu/evmtool/t8n/prague-deposit.json | 8 +--- .../besu/evmtool/t8n/prague-withdrawal.json | 42 +++++++++++-------- plugin-api/build.gradle | 2 +- .../besu/plugin/data/WithdrawalRequest.java | 2 +- 11 files changed, 56 insertions(+), 56 deletions(-) diff --git a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/parameters/WithdrawalRequestParameter.java b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/parameters/WithdrawalRequestParameter.java index 67fa13f3f..3561da37a 100644 --- a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/parameters/WithdrawalRequestParameter.java +++ b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/parameters/WithdrawalRequestParameter.java @@ -45,7 +45,7 @@ public class WithdrawalRequestParameter { final WithdrawalRequest withdrawalRequest) { return new WithdrawalRequestParameter( withdrawalRequest.getSourceAddress().toHexString(), - withdrawalRequest.getValidatorPublicKey().toHexString(), + withdrawalRequest.getValidatorPubkey().toHexString(), withdrawalRequest.getAmount().toShortHexString()); } diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/WithdrawalRequest.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/WithdrawalRequest.java index decdf22c7..0e7afc159 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/WithdrawalRequest.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/WithdrawalRequest.java @@ -26,13 +26,13 @@ public class WithdrawalRequest extends Request implements org.hyperledger.besu.plugin.data.WithdrawalRequest { private final Address sourceAddress; - private final BLSPublicKey validatorPublicKey; + private final BLSPublicKey validatorPubkey; private final GWei amount; public WithdrawalRequest( - final Address sourceAddress, final BLSPublicKey validatorPublicKey, final GWei amount) { + final Address sourceAddress, final BLSPublicKey validatorPubkey, final GWei amount) { this.sourceAddress = sourceAddress; - this.validatorPublicKey = validatorPublicKey; + this.validatorPubkey = validatorPubkey; this.amount = amount; } @@ -47,8 +47,8 @@ public class WithdrawalRequest extends Request } @Override - public PublicKey getValidatorPublicKey() { - return validatorPublicKey; + public PublicKey getValidatorPubkey() { + return validatorPubkey; } @Override @@ -61,8 +61,8 @@ public class WithdrawalRequest extends Request return "WithdrawalRequest{" + "sourceAddress=" + sourceAddress - + " validatorPublicKey=" - + validatorPublicKey + + " validatorPubkey=" + + validatorPubkey + " amount=" + amount + '}'; @@ -78,12 +78,12 @@ public class WithdrawalRequest extends Request } final WithdrawalRequest that = (WithdrawalRequest) o; return Objects.equals(sourceAddress, that.sourceAddress) - && Objects.equals(validatorPublicKey, that.validatorPublicKey) + && Objects.equals(validatorPubkey, that.validatorPubkey) && Objects.equals(amount, that.amount); } @Override public int hashCode() { - return Objects.hash(sourceAddress, validatorPublicKey, amount); + return Objects.hash(sourceAddress, validatorPubkey, amount); } } diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/encoding/WithdrawalRequestDecoder.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/encoding/WithdrawalRequestDecoder.java index 7ade9947b..031209284 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/encoding/WithdrawalRequestDecoder.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/encoding/WithdrawalRequestDecoder.java @@ -28,11 +28,11 @@ public class WithdrawalRequestDecoder { public static WithdrawalRequest decode(final RLPInput rlpInput) { rlpInput.enterList(); final Address sourceAddress = Address.readFrom(rlpInput); - final BLSPublicKey validatorPublicKey = BLSPublicKey.readFrom(rlpInput); + final BLSPublicKey validatorPubkey = BLSPublicKey.readFrom(rlpInput); final GWei amount = GWei.of(rlpInput.readUInt64Scalar()); rlpInput.leaveList(); - return new WithdrawalRequest(sourceAddress, validatorPublicKey, amount); + return new WithdrawalRequest(sourceAddress, validatorPubkey, amount); } public static WithdrawalRequest decodeOpaqueBytes(final Bytes input) { diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/encoding/WithdrawalRequestEncoder.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/encoding/WithdrawalRequestEncoder.java index 26be22d48..c9fdb37fc 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/encoding/WithdrawalRequestEncoder.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/encoding/WithdrawalRequestEncoder.java @@ -48,7 +48,7 @@ public class WithdrawalRequestEncoder { final WithdrawalRequest withdrawalRequest, final RLPOutput rlpOutput) { rlpOutput.startList(); rlpOutput.writeBytes(withdrawalRequest.getSourceAddress()); - rlpOutput.writeBytes(withdrawalRequest.getValidatorPublicKey()); + rlpOutput.writeBytes(withdrawalRequest.getValidatorPubkey()); rlpOutput.writeUInt64Scalar(withdrawalRequest.getAmount()); rlpOutput.endList(); } diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/WithdrawalRequestContractHelper.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/WithdrawalRequestContractHelper.java index 6bb0e81a7..c0b7302e8 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/WithdrawalRequestContractHelper.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/WithdrawalRequestContractHelper.java @@ -153,7 +153,7 @@ public class WithdrawalRequestContractHelper { queueHeadIndex.plus(i).multiply(WITHDRAWAL_REQUEST_STORAGE_SLOT_SIZE)); final Address sourceAddress = Address.wrap(account.getStorageValue(queueStorageSlot).toBytes().slice(12, 20)); - final BLSPublicKey validatorPublicKey = + final BLSPublicKey validatorPubkey = BLSPublicKey.wrap( Bytes.concatenate( account @@ -165,7 +165,7 @@ public class WithdrawalRequestContractHelper { UInt64.fromBytes(account.getStorageValue(queueStorageSlot.plus(2)).slice(16, 8)); withdrawalRequests.add( - new WithdrawalRequest(sourceAddress, validatorPublicKey, GWei.of(amount))); + new WithdrawalRequest(sourceAddress, validatorPubkey, GWei.of(amount))); } return withdrawalRequests; diff --git a/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/WithdrawalRequestContractHelperTest.java b/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/WithdrawalRequestContractHelperTest.java index 6d21744e7..7e1e85713 100644 --- a/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/WithdrawalRequestContractHelperTest.java +++ b/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/WithdrawalRequestContractHelperTest.java @@ -31,7 +31,6 @@ import org.hyperledger.besu.evm.account.MutableAccount; import org.hyperledger.besu.evm.worldstate.WorldUpdater; import java.util.List; -import java.util.stream.Collectors; import java.util.stream.IntStream; import org.apache.tuweni.bytes.Bytes; @@ -47,12 +46,12 @@ class WithdrawalRequestContractHelperTest { private MutableAccount contract; @BeforeEach - public void setUp() { + void setUp() { worldState = createInMemoryWorldStateArchive().getMutable(); } @Test - public void popWithdrawalRequestsFromQueue_ReadWithdrawalRequestsCorrectly() { + void popWithdrawalRequestsFromQueue_ReadWithdrawalRequestsCorrectly() { final List validatorWithdrawalRequests = List.of(createExit(), createExit(), createExit()); loadContractStorage(worldState, validatorWithdrawalRequests); @@ -64,7 +63,7 @@ class WithdrawalRequestContractHelperTest { } @Test - public void + void popWithdrawalRequestsFromQueue_whenContractCodeIsEmpty_ReturnsEmptyListOfWithdrawalRequests() { // Create account with empty code final WorldUpdater updater = worldState.updater(); @@ -76,10 +75,10 @@ class WithdrawalRequestContractHelperTest { } @Test - public void popWithdrawalRequestsFromQueue_WhenMoreWithdrawalRequests_UpdatesQueuePointers() { + void popWithdrawalRequestsFromQueue_WhenMoreWithdrawalRequests_UpdatesQueuePointers() { // Loading contract with more than 16 WithdrawalRequests final List validatorWithdrawalRequests = - IntStream.range(0, 30).mapToObj(__ -> createExit()).collect(Collectors.toList()); + IntStream.range(0, 30).mapToObj(__ -> createExit()).toList(); loadContractStorage(worldState, validatorWithdrawalRequests); // After loading the contract, the WithdrawalRequests count since last block should match the // size of the list @@ -102,7 +101,7 @@ class WithdrawalRequestContractHelperTest { } @Test - public void popWithdrawalRequestsFromQueue_WhenNoMoreWithdrawalRequests_ZeroQueuePointers() { + void popWithdrawalRequestsFromQueue_WhenNoMoreWithdrawalRequests_ZeroQueuePointers() { final List withdrawalRequests = List.of(createExit(), createExit(), createExit()); loadContractStorage(worldState, withdrawalRequests); @@ -126,7 +125,7 @@ class WithdrawalRequestContractHelperTest { } @Test - public void popWithdrawalRequestsFromQueue_WhenNoWithdrawalRequests_DoesNothing() { + void popWithdrawalRequestsFromQueue_WhenNoWithdrawalRequests_DoesNothing() { // Loading contract with 0 WithdrawalRequests loadContractStorage(worldState, List.of()); // After loading storage, we have the WithdrawalRequests count as zero because no @@ -135,7 +134,7 @@ class WithdrawalRequestContractHelperTest { final List poppedWithdrawalRequests = WithdrawalRequestContractHelper.popWithdrawalRequestsFromQueue(worldState); - assertThat(poppedWithdrawalRequests).hasSize(0); + assertThat(poppedWithdrawalRequests).isEmpty(); // Check that queue pointers are correct (head and tail are zero) assertContractStorageValue(WITHDRAWAL_REQUEST_QUEUE_HEAD_STORAGE_SLOT, 0); @@ -186,14 +185,13 @@ class WithdrawalRequestContractHelperTest { Bytes.fromHexString("0x000000000000000000000000"), request.getSourceAddress()))); // validator_pubkey contract.setStorageValue( - UInt256.valueOf(offset++), - UInt256.fromBytes(request.getValidatorPublicKey().slice(0, 32))); + UInt256.valueOf(offset++), UInt256.fromBytes(request.getValidatorPubkey().slice(0, 32))); contract.setStorageValue( // set public key to slot, with 16 bytes padding on the right UInt256.valueOf(offset++), UInt256.fromBytes( Bytes.concatenate( - request.getValidatorPublicKey().slice(32, 16), + request.getValidatorPubkey().slice(32, 16), request.getAmount().toBytes(), // 8 bytes for amount Bytes.fromHexString("0x0000000000000000")))); } diff --git a/ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/T8nExecutor.java b/ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/T8nExecutor.java index 40c73e383..d52398488 100644 --- a/ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/T8nExecutor.java +++ b/ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/T8nExecutor.java @@ -110,7 +110,9 @@ public class T8nExecutor { * Default constructor for the T8nExecutor class. This constructor does not perform any * operations. */ - public T8nExecutor() {} + public T8nExecutor() { + // Default constructor required for Javadoc linting + } /** * Extracts transactions from a given JSON iterator and adds them to the provided transactions @@ -531,7 +533,7 @@ public class T8nExecutor { wr -> { var obj = withdrawlRequests.addObject(); obj.put("sourceAddress", wr.getSourceAddress().toHexString()); - obj.put("validatorPublicKey", wr.getValidatorPublicKey().toHexString()); + obj.put("validatorPubkey", wr.getValidatorPubkey().toHexString()); obj.put("amount", wr.getAmount().toHexString()); }); } diff --git a/ethereum/evmtool/src/test/resources/org/hyperledger/besu/evmtool/t8n/prague-deposit.json b/ethereum/evmtool/src/test/resources/org/hyperledger/besu/evmtool/t8n/prague-deposit.json index 80e415b3f..034325fbe 100644 --- a/ethereum/evmtool/src/test/resources/org/hyperledger/besu/evmtool/t8n/prague-deposit.json +++ b/ethereum/evmtool/src/test/resources/org/hyperledger/besu/evmtool/t8n/prague-deposit.json @@ -180,12 +180,6 @@ "balance": "0x0", "nonce": "0x1" }, - "0x25a219378dad9b3503c8268c9ca836a52427a4fb": { - "storage": { - "0x0000000000000000000000000000000000000000000000000000000000000000": "0xe4fb5d47f70d54b4f36777ea4c882cf767f93d8f8170285d97a1b8275dfe4dbb" - }, - "balance": "0x0" - }, "0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b": { "balance": "0xaa00be18c288efd690", "nonce": "0x2" @@ -193,7 +187,7 @@ }, "body": "0xf90404f901ff8007830f42409400000000219ab540356cbb839cbe05303d7705fa8901bc16d674ec800000b9019422895118000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000d0000000000000000000000000000000000000000000000000000000000000011085acb6376c2707b118225da41825974c12b5924a05c6a53b988c9cbc33c55b05000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000325a0ffeb1d6e7ef8e9ee9b64dcdc3b056f9a1d2b94c1572f1949954e712364604575a03d0f42bad795205de84db8d4ab10b9abd0d081ffe560cbf45f6c281768112a69f901ff0107830f42409400000000219ab540356cbb839cbe05303d7705fa8901bc16d674ec800000b9019422895118000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000d0000000000000000000000000000000000000000000000000000000000000011085acb6376c2707b118225da41825974c12b5924a05c6a53b988c9cbc33c55b05000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000326a05bb08e348c9c4b0a2e15d04f4a89d1a210d013205de8d3d93e38e5c1b0c8d8aba04300c0f575d9908d2cbc3413ab82895678bb8f3ef356224dd1e7cb972f2c4855", "result": { - "stateRoot": "0x0dd3e32e0081ff7ca5a0236b257676f277999ec2b8da5b31e19400715de907f1", + "stateRoot": "0x83bc620ec3d5ff77109b241f561e233a5c4f35bfc3337594c12958f51ff2c1c8", "txRoot": "0x2b790bf82ef7259a0e4513d1b89a77d81e99672ba68758ef2ba3fde32851d023", "receiptsRoot": "0x9c8d7a917ecb3ff2566f264abbf39131e51b08b07eb2b69cb46989d79d985593", "logsHash": "0x43e31613bfefc1f55d8b3ca2b61f933f3838d523dc11cb5d7ffdd2ecf0ab5d49", diff --git a/ethereum/evmtool/src/test/resources/org/hyperledger/besu/evmtool/t8n/prague-withdrawal.json b/ethereum/evmtool/src/test/resources/org/hyperledger/besu/evmtool/t8n/prague-withdrawal.json index 85ad0d7e9..cf593cbb7 100644 --- a/ethereum/evmtool/src/test/resources/org/hyperledger/besu/evmtool/t8n/prague-withdrawal.json +++ b/ethereum/evmtool/src/test/resources/org/hyperledger/besu/evmtool/t8n/prague-withdrawal.json @@ -64,6 +64,12 @@ "code": "0x3373fffffffffffffffffffffffffffffffffffffffe14604d57602036146024575f5ffd5b5f35801560495762001fff810690815414603c575f5ffd5b62001fff01545f5260205ff35b5f5ffd5b62001fff42064281555f359062001fff015500", "storage": {} }, + "0x25a219378dad9b3503c8268c9ca836a52427a4fb": { + "nonce": "0x00", + "balance": "0x1", + "code": "0x", + "storage": {} + }, "0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b": { "nonce": "0x00", "balance": "0xad78ebc5ac62000000", @@ -213,7 +219,7 @@ "storage": { "0x0000000000000000000000000000000000000000000000000000000000000000": "0x10715cfbefdb8a0cb2f7d7ca5ee6d1ea65515ecb41cff0a22d1e11716a9d27fb" }, - "balance": "0x0" + "balance": "0x1" }, "0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b": { "balance": "0xad78ebc5ac619bbcea", @@ -222,7 +228,7 @@ }, "body": "0xf903e5f903e28007830f424094000000000000000000000000000000000000020080b90380000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001fffffffffffffffe0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003fffffffffffffffe0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005fffffffffffffffe0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007fffffffffffffffe0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009fffffffffffffffe00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000bfffffffffffffffe00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000dfffffffffffffffe00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffe000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000026a0963cb6620fe5828cbc93bb7139d3f4501067d76275dff648bf48c3c100ca8dd4a04ac396104a5be4643406718f59a6e74d62a32777f5f6135e55e805e87612013c", "result": { - "stateRoot": "0xf682e4f8f820f44fb43a20c3db274bc3c9fcb9e52cc1af3c3ea7cb21fdb2250b", + "stateRoot": "0x69dc2041a0a7e71f9e5f916c26cb6b2d7d1e255509af793337d4010d19b4b87c", "txRoot": "0x8521df63211790726b6f1a437bb0fd4b27c00e13e7678d324c4cfddb8d834ad2", "receiptsRoot": "0x4bd8bd5580caf4ed45f873794ad7ff9d6fd2363ae529269b17b891b68d349d75", "logsHash": "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347", @@ -252,82 +258,82 @@ "withdrawalRequests": [ { "sourceAddress": "0x0000000000000000000000000000000000000200", - "validatorPublicKey": "0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001", + "validatorPubkey": "0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001", "amount": "0xfffffffffffffffe" }, { "sourceAddress": "0x0000000000000000000000000000000000000200", - "validatorPublicKey": "0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002", + "validatorPubkey": "0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002", "amount": "0x0000000000000000" }, { "sourceAddress": "0x0000000000000000000000000000000000000200", - "validatorPublicKey": "0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003", + "validatorPubkey": "0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003", "amount": "0xfffffffffffffffe" }, { "sourceAddress": "0x0000000000000000000000000000000000000200", - "validatorPublicKey": "0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004", + "validatorPubkey": "0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004", "amount": "0x0000000000000000" }, { "sourceAddress": "0x0000000000000000000000000000000000000200", - "validatorPublicKey": "0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005", + "validatorPubkey": "0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005", "amount": "0xfffffffffffffffe" }, { "sourceAddress": "0x0000000000000000000000000000000000000200", - "validatorPublicKey": "0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006", + "validatorPubkey": "0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006", "amount": "0x0000000000000000" }, { "sourceAddress": "0x0000000000000000000000000000000000000200", - "validatorPublicKey": "0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007", + "validatorPubkey": "0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007", "amount": "0xfffffffffffffffe" }, { "sourceAddress": "0x0000000000000000000000000000000000000200", - "validatorPublicKey": "0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008", + "validatorPubkey": "0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008", "amount": "0x0000000000000000" }, { "sourceAddress": "0x0000000000000000000000000000000000000200", - "validatorPublicKey": "0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009", + "validatorPubkey": "0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009", "amount": "0xfffffffffffffffe" }, { "sourceAddress": "0x0000000000000000000000000000000000000200", - "validatorPublicKey": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a", + "validatorPubkey": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a", "amount": "0x0000000000000000" }, { "sourceAddress": "0x0000000000000000000000000000000000000200", - "validatorPublicKey": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b", + "validatorPubkey": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b", "amount": "0xfffffffffffffffe" }, { "sourceAddress": "0x0000000000000000000000000000000000000200", - "validatorPublicKey": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c", + "validatorPubkey": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c", "amount": "0x0000000000000000" }, { "sourceAddress": "0x0000000000000000000000000000000000000200", - "validatorPublicKey": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d", + "validatorPubkey": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d", "amount": "0xfffffffffffffffe" }, { "sourceAddress": "0x0000000000000000000000000000000000000200", - "validatorPublicKey": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e", + "validatorPubkey": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e", "amount": "0x0000000000000000" }, { "sourceAddress": "0x0000000000000000000000000000000000000200", - "validatorPublicKey": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f", + "validatorPubkey": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f", "amount": "0xfffffffffffffffe" }, { "sourceAddress": "0x0000000000000000000000000000000000000200", - "validatorPublicKey": "0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010", + "validatorPubkey": "0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010", "amount": "0x0000000000000000" } ] diff --git a/plugin-api/build.gradle b/plugin-api/build.gradle index fd7f3291b..dbbb5e4f2 100644 --- a/plugin-api/build.gradle +++ b/plugin-api/build.gradle @@ -70,7 +70,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 = 'p8jZoKgvi9o8JpVLXTlwh9HoIot4A62hKFHwSOaTF+k=' + knownHash = 'Q6EK5By3BNKNa/JYqYjFw43VXWL0KVBUV3dGEQBjZ70=' } check.dependsOn('checkAPIChanges') diff --git a/plugin-api/src/main/java/org/hyperledger/besu/plugin/data/WithdrawalRequest.java b/plugin-api/src/main/java/org/hyperledger/besu/plugin/data/WithdrawalRequest.java index eeadd8041..f07d0d08d 100644 --- a/plugin-api/src/main/java/org/hyperledger/besu/plugin/data/WithdrawalRequest.java +++ b/plugin-api/src/main/java/org/hyperledger/besu/plugin/data/WithdrawalRequest.java @@ -38,7 +38,7 @@ public interface WithdrawalRequest { * * @return public key of validator */ - PublicKey getValidatorPublicKey(); + PublicKey getValidatorPubkey(); /** * The amount for withdrawal From 08772b466ef4681bd91503805789b4af311ed9cd Mon Sep 17 00:00:00 2001 From: Matt Whitehead Date: Mon, 1 Jul 2024 08:48:21 +0100 Subject: [PATCH 29/58] Add info-level diagnostic logs to aid with resolving stalled BFT chains (#7271) * Add info-level diagnostic logs to aid with resolving stalled BFT chains Signed-off-by: Matthew Whitehead * Add javadoc Signed-off-by: Matthew Whitehead --------- Signed-off-by: Matthew Whitehead Signed-off-by: Matt Whitehead --- CHANGELOG.md | 1 + .../besu/consensus/common/bft/RoundTimer.java | 16 +++++++++ .../statemachine/QbftBlockHeightManager.java | 13 +++++-- .../QbftBlockHeightManagerFactory.java | 3 +- .../qbft/statemachine/RoundChangeManager.java | 34 ++++++++++++++++++- 5 files changed, 63 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5ba6b4dc5..819bb05a7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -24,6 +24,7 @@ - Refactored how code, initcode, and max stack size are configured in forks. [#7245](https://github.com/hyperledger/besu/pull/7245) - Nodes in a permissioned chain maintain (and retry) connections to bootnodes [#7257](https://github.com/hyperledger/besu/pull/7257) - Promote experimental `besu storage x-trie-log` subcommand to production-ready [#7278](https://github.com/hyperledger/besu/pull/7278) +- Enhanced BFT round-change diagnostics [#7271](https://github.com/hyperledger/besu/pull/7271) ### Bug fixes - Validation errors ignored in accounts-allowlist and empty list [#7138](https://github.com/hyperledger/besu/issues/7138) diff --git a/consensus/common/src/main/java/org/hyperledger/besu/consensus/common/bft/RoundTimer.java b/consensus/common/src/main/java/org/hyperledger/besu/consensus/common/bft/RoundTimer.java index a500a1ad7..6a8b02991 100644 --- a/consensus/common/src/main/java/org/hyperledger/besu/consensus/common/bft/RoundTimer.java +++ b/consensus/common/src/main/java/org/hyperledger/besu/consensus/common/bft/RoundTimer.java @@ -20,8 +20,14 @@ import java.util.Optional; import java.util.concurrent.ScheduledFuture; import java.util.concurrent.TimeUnit; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + /** Class for starting and keeping organised round timers */ public class RoundTimer { + + private static final Logger LOG = LoggerFactory.getLogger(RoundTimer.class); + private final BftExecutors bftExecutors; private Optional> currentTimerTask; private final BftEventQueue queue; @@ -71,6 +77,16 @@ public class RoundTimer { final ScheduledFuture newTimerTask = bftExecutors.scheduleTask(newTimerRunnable, expiryTime, TimeUnit.MILLISECONDS); + + // Once we are up to round 2 start logging round expiries + if (round.getRoundNumber() >= 2) { + LOG.info( + "QBFT round {} expired. Moved to round {} which will expire in {} seconds", + round.getRoundNumber() - 1, + round.getRoundNumber(), + (expiryTime / 1000)); + } + currentTimerTask = Optional.of(newTimerTask); } } diff --git a/consensus/qbft/src/main/java/org/hyperledger/besu/consensus/qbft/statemachine/QbftBlockHeightManager.java b/consensus/qbft/src/main/java/org/hyperledger/besu/consensus/qbft/statemachine/QbftBlockHeightManager.java index 0940d35df..f79537cc0 100644 --- a/consensus/qbft/src/main/java/org/hyperledger/besu/consensus/qbft/statemachine/QbftBlockHeightManager.java +++ b/consensus/qbft/src/main/java/org/hyperledger/besu/consensus/qbft/statemachine/QbftBlockHeightManager.java @@ -274,17 +274,26 @@ public class QbftBlockHeightManager implements BaseQbftBlockHeightManager { @Override public void handleRoundChangePayload(final RoundChange message) { final ConsensusRoundIdentifier targetRound = message.getRoundIdentifier(); - LOG.trace("Received a RoundChange Payload for {}", targetRound); + + LOG.debug( + "Round change from {}: block {}, round {}", + message.getAuthor(), + message.getRoundIdentifier().getSequenceNumber(), + message.getRoundIdentifier().getRoundNumber()); + + // Diagnostic logging (only logs anything if the chain has stalled) + roundChangeManager.storeAndLogRoundChangeSummary(message); final MessageAge messageAge = determineAgeOfPayload(message.getRoundIdentifier().getRoundNumber()); if (messageAge == MessageAge.PRIOR_ROUND) { - LOG.trace("Received RoundChange Payload for a prior round. targetRound={}", targetRound); + LOG.debug("Received RoundChange Payload for a prior round. targetRound={}", targetRound); return; } final Optional> result = roundChangeManager.appendRoundChangeMessage(message); + if (result.isPresent()) { LOG.debug( "Received sufficient RoundChange messages to change round to targetRound={}", diff --git a/consensus/qbft/src/main/java/org/hyperledger/besu/consensus/qbft/statemachine/QbftBlockHeightManagerFactory.java b/consensus/qbft/src/main/java/org/hyperledger/besu/consensus/qbft/statemachine/QbftBlockHeightManagerFactory.java index 0d306b1fc..889f83f98 100644 --- a/consensus/qbft/src/main/java/org/hyperledger/besu/consensus/qbft/statemachine/QbftBlockHeightManagerFactory.java +++ b/consensus/qbft/src/main/java/org/hyperledger/besu/consensus/qbft/statemachine/QbftBlockHeightManagerFactory.java @@ -86,7 +86,8 @@ public class QbftBlockHeightManagerFactory { new RoundChangeManager( BftHelpers.calculateRequiredValidatorQuorum(finalState.getValidators().size()), messageValidatorFactory.createRoundChangeMessageValidator( - parentHeader.getNumber() + 1L, parentHeader)), + parentHeader.getNumber() + 1L, parentHeader), + finalState.getLocalAddress()), roundFactory, finalState.getClock(), messageValidatorFactory, diff --git a/consensus/qbft/src/main/java/org/hyperledger/besu/consensus/qbft/statemachine/RoundChangeManager.java b/consensus/qbft/src/main/java/org/hyperledger/besu/consensus/qbft/statemachine/RoundChangeManager.java index ca671a6f5..89e288839 100644 --- a/consensus/qbft/src/main/java/org/hyperledger/besu/consensus/qbft/statemachine/RoundChangeManager.java +++ b/consensus/qbft/src/main/java/org/hyperledger/besu/consensus/qbft/statemachine/RoundChangeManager.java @@ -100,19 +100,51 @@ public class RoundChangeManager { @VisibleForTesting final Map roundChangeCache = Maps.newHashMap(); + /** A summary of the latest round each validator is on, for diagnostic purposes only */ + private final Map roundSummary = Maps.newHashMap(); + private final long quorum; private final RoundChangeMessageValidator roundChangeMessageValidator; + private final Address localAddress; /** * Instantiates a new Round change manager. * * @param quorum the quorum * @param roundChangeMessageValidator the round change message validator + * @param localAddress this node's address */ public RoundChangeManager( - final long quorum, final RoundChangeMessageValidator roundChangeMessageValidator) { + final long quorum, + final RoundChangeMessageValidator roundChangeMessageValidator, + final Address localAddress) { this.quorum = quorum; this.roundChangeMessageValidator = roundChangeMessageValidator; + this.localAddress = localAddress; + } + + /** + * Store the latest round for a node, and if chain is stalled log a summary of which round each + * address is on + * + * @param message the round-change message that has just been received + */ + public void storeAndLogRoundChangeSummary(final RoundChange message) { + roundSummary.put(message.getAuthor(), message.getRoundIdentifier()); + if (roundChangeCache.keySet().stream() + .findFirst() + .orElse(new ConsensusRoundIdentifier(0, 0)) + .getRoundNumber() + >= 2) { + LOG.info("BFT round summary (quorum = {})", quorum); + for (Map.Entry nextEntry : roundSummary.entrySet()) { + LOG.info( + "Address: {} Round: {} {}", + nextEntry.getKey(), + nextEntry.getValue().getRoundNumber(), + nextEntry.getKey().equals(localAddress) ? "(Local node)" : ""); + } + } } /** From c0efeef89a1befb23d53323f38f9c3f8b62ea785 Mon Sep 17 00:00:00 2001 From: Danno Ferrin Date: Mon, 1 Jul 2024 09:58:40 -0600 Subject: [PATCH 30/58] Update EIP-2935 contract (#7281) Use the updated contract and address for EIP-2539. Signed-off-by: Danno Ferrin --- .../blockhash/PragueBlockHashProcessor.java | 2 +- .../besu/ethereum/chain/genesis_prague2.json | 4 ++-- .../besu/evmtool/t8n/prague-deposit.json | 15 ++++++++++++++- .../besu/evmtool/t8n/prague-withdrawal.json | 17 +++++++++-------- 4 files changed, 26 insertions(+), 12 deletions(-) diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/blockhash/PragueBlockHashProcessor.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/blockhash/PragueBlockHashProcessor.java index 634a74415..b6b38b37d 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/blockhash/PragueBlockHashProcessor.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/blockhash/PragueBlockHashProcessor.java @@ -36,7 +36,7 @@ public class PragueBlockHashProcessor extends CancunBlockHashProcessor { private static final Logger LOG = LoggerFactory.getLogger(PragueBlockHashProcessor.class); public static final Address HISTORY_STORAGE_ADDRESS = - Address.fromHexString("0x25a219378dad9b3503c8268c9ca836a52427a4fb"); + Address.fromHexString("0x0aae40965e6800cd9b1f4b05ff21581047e3f91e"); /** The HISTORY_SERVE_WINDOW */ public static final long HISTORY_SERVE_WINDOW = 8192; diff --git a/ethereum/core/src/test/resources/org/hyperledger/besu/ethereum/chain/genesis_prague2.json b/ethereum/core/src/test/resources/org/hyperledger/besu/ethereum/chain/genesis_prague2.json index e7bccadac..cdb755ace 100644 --- a/ethereum/core/src/test/resources/org/hyperledger/besu/ethereum/chain/genesis_prague2.json +++ b/ethereum/core/src/test/resources/org/hyperledger/besu/ethereum/chain/genesis_prague2.json @@ -73,8 +73,8 @@ "balance": "0x0", "nonce": "0x1" }, - "25a219378dad9b3503c8268c9ca836a52427a4fb": { - "code": "0x60203611603157600143035f35116029575f356120000143116029576120005f3506545f5260205ff35b5f5f5260205ff35b5f5ffd00", + "0x0aae40965e6800cd9b1f4b05ff21581047e3f91e": { + "code": "0x3373fffffffffffffffffffffffffffffffffffffffe1460575767ffffffffffffffff5f3511605357600143035f3511604b575f35612000014311604b57611fff5f3516545f5260205ff35b5f5f5260205ff35b5f5ffd5b5f35611fff60014303165500", "balance": "0x0", "nonce": "0x1" }, diff --git a/ethereum/evmtool/src/test/resources/org/hyperledger/besu/evmtool/t8n/prague-deposit.json b/ethereum/evmtool/src/test/resources/org/hyperledger/besu/evmtool/t8n/prague-deposit.json index 034325fbe..d48fc66c7 100644 --- a/ethereum/evmtool/src/test/resources/org/hyperledger/besu/evmtool/t8n/prague-deposit.json +++ b/ethereum/evmtool/src/test/resources/org/hyperledger/besu/evmtool/t8n/prague-deposit.json @@ -63,6 +63,11 @@ "code": "0x3373fffffffffffffffffffffffffffffffffffffffe14604d57602036146024575f5ffd5b5f35801560495762001fff810690815414603c575f5ffd5b62001fff01545f5260205ff35b5f5ffd5b62001fff42064281555f359062001fff015500", "storage": {} }, + "0x0aae40965e6800cd9b1f4b05ff21581047e3f91e": { + "code": "0x3373fffffffffffffffffffffffffffffffffffffffe1460575767ffffffffffffffff5f3511605357600143035f3511604b575f35612000014311604b57611fff5f3516545f5260205ff35b5f5f5260205ff35b5f5ffd5b5f35611fff60014303165500", + "balance": "0x0", + "nonce": "0x1" + }, "0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b": { "nonce": "0x00", "balance": "0xad78ebc5ac62000000", @@ -180,6 +185,14 @@ "balance": "0x0", "nonce": "0x1" }, + "0x0aae40965e6800cd9b1f4b05ff21581047e3f91e": { + "code": "0x3373fffffffffffffffffffffffffffffffffffffffe1460575767ffffffffffffffff5f3511605357600143035f3511604b575f35612000014311604b57611fff5f3516545f5260205ff35b5f5f5260205ff35b5f5ffd5b5f35611fff60014303165500", + "storage": { + "0x0000000000000000000000000000000000000000000000000000000000000000": "0xe4fb5d47f70d54b4f36777ea4c882cf767f93d8f8170285d97a1b8275dfe4dbb" + }, + "balance": "0x0", + "nonce": "0x1" + }, "0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b": { "balance": "0xaa00be18c288efd690", "nonce": "0x2" @@ -187,7 +200,7 @@ }, "body": "0xf90404f901ff8007830f42409400000000219ab540356cbb839cbe05303d7705fa8901bc16d674ec800000b9019422895118000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000d0000000000000000000000000000000000000000000000000000000000000011085acb6376c2707b118225da41825974c12b5924a05c6a53b988c9cbc33c55b05000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000325a0ffeb1d6e7ef8e9ee9b64dcdc3b056f9a1d2b94c1572f1949954e712364604575a03d0f42bad795205de84db8d4ab10b9abd0d081ffe560cbf45f6c281768112a69f901ff0107830f42409400000000219ab540356cbb839cbe05303d7705fa8901bc16d674ec800000b9019422895118000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000d0000000000000000000000000000000000000000000000000000000000000011085acb6376c2707b118225da41825974c12b5924a05c6a53b988c9cbc33c55b05000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000326a05bb08e348c9c4b0a2e15d04f4a89d1a210d013205de8d3d93e38e5c1b0c8d8aba04300c0f575d9908d2cbc3413ab82895678bb8f3ef356224dd1e7cb972f2c4855", "result": { - "stateRoot": "0x83bc620ec3d5ff77109b241f561e233a5c4f35bfc3337594c12958f51ff2c1c8", + "stateRoot": "0x3aa7839837ee1564276a0a05554e35215353a97c4e255c3aacbcd7c7819daefa", "txRoot": "0x2b790bf82ef7259a0e4513d1b89a77d81e99672ba68758ef2ba3fde32851d023", "receiptsRoot": "0x9c8d7a917ecb3ff2566f264abbf39131e51b08b07eb2b69cb46989d79d985593", "logsHash": "0x43e31613bfefc1f55d8b3ca2b61f933f3838d523dc11cb5d7ffdd2ecf0ab5d49", diff --git a/ethereum/evmtool/src/test/resources/org/hyperledger/besu/evmtool/t8n/prague-withdrawal.json b/ethereum/evmtool/src/test/resources/org/hyperledger/besu/evmtool/t8n/prague-withdrawal.json index cf593cbb7..66dcf3e85 100644 --- a/ethereum/evmtool/src/test/resources/org/hyperledger/besu/evmtool/t8n/prague-withdrawal.json +++ b/ethereum/evmtool/src/test/resources/org/hyperledger/besu/evmtool/t8n/prague-withdrawal.json @@ -64,11 +64,10 @@ "code": "0x3373fffffffffffffffffffffffffffffffffffffffe14604d57602036146024575f5ffd5b5f35801560495762001fff810690815414603c575f5ffd5b62001fff01545f5260205ff35b5f5ffd5b62001fff42064281555f359062001fff015500", "storage": {} }, - "0x25a219378dad9b3503c8268c9ca836a52427a4fb": { - "nonce": "0x00", - "balance": "0x1", - "code": "0x", - "storage": {} + "0x0aae40965e6800cd9b1f4b05ff21581047e3f91e": { + "code": "0x3373fffffffffffffffffffffffffffffffffffffffe1460575767ffffffffffffffff5f3511605357600143035f3511604b575f35612000014311604b57611fff5f3516545f5260205ff35b5f5f5260205ff35b5f5ffd5b5f35611fff60014303165500", + "balance": "0x0", + "nonce": "0x1" }, "0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b": { "nonce": "0x00", @@ -215,11 +214,13 @@ "balance": "0x10", "nonce": "0x1" }, - "0x25a219378dad9b3503c8268c9ca836a52427a4fb": { + "0x0aae40965e6800cd9b1f4b05ff21581047e3f91e": { + "code": "0x3373fffffffffffffffffffffffffffffffffffffffe1460575767ffffffffffffffff5f3511605357600143035f3511604b575f35612000014311604b57611fff5f3516545f5260205ff35b5f5f5260205ff35b5f5ffd5b5f35611fff60014303165500", "storage": { "0x0000000000000000000000000000000000000000000000000000000000000000": "0x10715cfbefdb8a0cb2f7d7ca5ee6d1ea65515ecb41cff0a22d1e11716a9d27fb" }, - "balance": "0x1" + "balance": "0x0", + "nonce": "0x1" }, "0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b": { "balance": "0xad78ebc5ac619bbcea", @@ -228,7 +229,7 @@ }, "body": "0xf903e5f903e28007830f424094000000000000000000000000000000000000020080b90380000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001fffffffffffffffe0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003fffffffffffffffe0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005fffffffffffffffe0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007fffffffffffffffe0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009fffffffffffffffe00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000bfffffffffffffffe00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000dfffffffffffffffe00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffe000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000026a0963cb6620fe5828cbc93bb7139d3f4501067d76275dff648bf48c3c100ca8dd4a04ac396104a5be4643406718f59a6e74d62a32777f5f6135e55e805e87612013c", "result": { - "stateRoot": "0x69dc2041a0a7e71f9e5f916c26cb6b2d7d1e255509af793337d4010d19b4b87c", + "stateRoot": "0xdba3aee0733886dac565d2a654d8fac1953fd913261f44b3aa31f153e159e98a", "txRoot": "0x8521df63211790726b6f1a437bb0fd4b27c00e13e7678d324c4cfddb8d834ad2", "receiptsRoot": "0x4bd8bd5580caf4ed45f873794ad7ff9d6fd2363ae529269b17b891b68d349d75", "logsHash": "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347", From 264e7d9facffe1c881d6de090ad99e807f4d836b Mon Sep 17 00:00:00 2001 From: Danno Ferrin Date: Mon, 1 Jul 2024 16:32:12 -0600 Subject: [PATCH 31/58] Deeper tracing of self-destructed accounts (#7284) Consider previously self-destructed accounts when creating accounts. Signed-off-by: Danno Ferrin --- .../evm/worldstate/UpdateTrackingAccount.java | 1 - .../besu/evm/worldstate/WorldUpdater.java | 27 +++++++++++++++++-- 2 files changed, 25 insertions(+), 3 deletions(-) diff --git a/evm/src/main/java/org/hyperledger/besu/evm/worldstate/UpdateTrackingAccount.java b/evm/src/main/java/org/hyperledger/besu/evm/worldstate/UpdateTrackingAccount.java index f571ff2ff..9f065aee9 100644 --- a/evm/src/main/java/org/hyperledger/besu/evm/worldstate/UpdateTrackingAccount.java +++ b/evm/src/main/java/org/hyperledger/besu/evm/worldstate/UpdateTrackingAccount.java @@ -128,7 +128,6 @@ public class UpdateTrackingAccount implements MutableAccount public void setWrappedAccount(final A account) { if (this.account == null) { this.account = account; - storageWasCleared = false; } else { throw new IllegalStateException("Already tracking a wrapped account"); } diff --git a/evm/src/main/java/org/hyperledger/besu/evm/worldstate/WorldUpdater.java b/evm/src/main/java/org/hyperledger/besu/evm/worldstate/WorldUpdater.java index 9b57b6ab9..4cbda7327 100644 --- a/evm/src/main/java/org/hyperledger/besu/evm/worldstate/WorldUpdater.java +++ b/evm/src/main/java/org/hyperledger/besu/evm/worldstate/WorldUpdater.java @@ -24,6 +24,8 @@ import java.util.ArrayList; import java.util.Collection; import java.util.Optional; +import org.apache.tuweni.bytes.Bytes; + /** * An object that buffers updates made over a particular {@link WorldView}. * @@ -73,8 +75,29 @@ public interface WorldUpdater extends MutableWorldView { * #createAccount(Address)} (and thus all his fields will be zero/empty). */ default MutableAccount getOrCreate(final Address address) { - final MutableAccount account = getAccount(address); - return account == null ? createAccount(address) : account; + MutableAccount account = getAccount(address); + if (account == null) { + account = createAccount(address); + if (parentUpdater().isPresent() && parentUpdater().get().isDeleted(address)) { + account.clearStorage(); + account.setCode(Bytes.EMPTY); + } + } + return account; + } + + /** + * Check this and parent updaters to see if an address has been deleted since the last persist + * + * @param address address to check + * @return true if any updaters have marked the address as deleted. + */ + default boolean isDeleted(final Address address) { + if (getDeletedAccountAddresses().contains(address)) { + return true; + } else { + return parentUpdater().map(wu -> wu.isDeleted(address)).orElse(false); + } } /** From 3a73dccd619ed5ab1caf1548ec3a84aeb30a2d58 Mon Sep 17 00:00:00 2001 From: garyschulte Date: Mon, 1 Jul 2024 16:06:55 -0700 Subject: [PATCH 32/58] next release version after 24.7.0 (#7285) Signed-off-by: garyschulte --- CHANGELOG.md | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 819bb05a7..d14b3e0fc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,14 @@ # Changelog -## Next Release +## Next release + +### Breaking Changes + +### Additions and Improvements + +### Bug fixes + +## 24.7.0 ### Upcoming Breaking Changes - Receipt compaction will be enabled by default in a future version of Besu. After this change it will not be possible to downgrade to the previous Besu version. @@ -32,6 +40,8 @@ - Fix "Could not confirm best peer had pivot block" [#7109](https://github.com/hyperledger/besu/issues/7109) - Fix "Chain Download Halt" [#6884](https://github.com/hyperledger/besu/issues/6884) + + ## 24.6.0 ### Breaking Changes From 8ca7129b0be3ba26b60ceb8920c01f717d5f5aca Mon Sep 17 00:00:00 2001 From: Matt Whitehead Date: Tue, 2 Jul 2024 09:39:59 +0100 Subject: [PATCH 33/58] Add experimental `--Xsnapsync-bft-enabled` which enables snap sync for BFT chains (#7140) * Create a BFT-specific pivot block handler Signed-off-by: Matthew Whitehead * Change visibility Signed-off-by: Matthew Whitehead * Refactor sync-peer-count internal variable to match name, add experimental flag to enabled snap + BFT Signed-off-by: Matthew Whitehead * Merge with main Signed-off-by: Matthew Whitehead * Fix uppercase Signed-off-by: Matthew Whitehead * Address synchronization issue with trie pruning. Create BFT-specific account range handler. Add pipeline name and logs Signed-off-by: Matthew Whitehead * Remove debug log Signed-off-by: Matthew Whitehead * fixing snapsync for empty state Signed-off-by: Karim Taam * Don't queue up events we can't handle Signed-off-by: Matthew Whitehead * Fix timing window where a validator with an empty data dir sometimes falls back to full sync if peer status isn't received quickly enough Signed-off-by: Matthew Whitehead * Remove BFT-specific account request class. Not needed Signed-off-by: Matthew Whitehead * Refactor some more 'fast' sync variables that are common to all pivot-based sync types Signed-off-by: Matthew Whitehead * In FULL sync mode, disable bonsai-limit-trie-logs-enabled instead of failing to start Signed-off-by: Matthew Whitehead * Add javadoc comments, clarify overriding bonsai-limit-trie-logs-enabled Signed-off-by: Matthew Whitehead * Add BFT pivot block selector tests Signed-off-by: Matthew Whitehead * Fix failure error message Signed-off-by: Matthew Whitehead * Remove the unnamed Pipe constructor and update tests to set a pipe name Signed-off-by: Matthew Whitehead * Revert some info logs back to debug given the feedback on noise in the logs syncing with holesky Signed-off-by: Matthew Whitehead * Refactor fastSyncPivotDistance to syncPivotDistance Signed-off-by: Matthew Whitehead * Incomplete refactoring Signed-off-by: Matthew Whitehead * Update BFT event queueing tests Signed-off-by: Matthew Whitehead * Event queue test fixes Signed-off-by: Matthew Whitehead * Remove automatic setting of bonsai-limit-trie-logs-enabled to false if sync-mode = FULL (moving to another PR) Signed-off-by: Matthew Whitehead --------- Signed-off-by: Matthew Whitehead Signed-off-by: Karim Taam Signed-off-by: Matt Whitehead Co-authored-by: Karim Taam --- CHANGELOG.md | 1 + .../org/hyperledger/besu/cli/BesuCommand.java | 16 +- .../cli/ConfigurationOverviewBuilder.java | 16 ++ .../options/unstable/SynchronizerOptions.java | 29 +++- .../controller/BesuControllerBuilder.java | 21 ++- .../java/org/hyperledger/besu/RunnerTest.java | 4 +- .../hyperledger/besu/cli/BesuCommandTest.java | 8 +- .../cli/CascadingDefaultProviderTest.java | 4 +- .../cli/options/SynchronizerOptionsTest.java | 6 +- .../consensus/common/bft/BftEventQueue.java | 27 ++- .../consensus/common/bft/BftProcessor.java | 3 + .../common/validator/ValidatorProvider.java | 12 ++ .../common/bft/BftEventQueueTest.java | 69 +++++++- .../common/bft/BftProcessorTest.java | 1 + .../consensus/common/bft/RoundTimerTest.java | 1 + .../BftMiningCoordinatorTest.java | 1 + .../qbft/BFTPivotSelectorFromPeers.java | 160 ++++++++++++++++++ .../qbft/sync/QbftPivotSelectorTest.java | 159 +++++++++++++++++ .../common/trielog/TrieLogPruner.java | 4 +- .../ethereum/eth/manager/snap/SnapServer.java | 18 +- .../eth/sync/DefaultSynchronizer.java | 29 ++-- .../eth/sync/SynchronizerConfiguration.java | 44 ++--- .../eth/sync/fastsync/FastSyncActions.java | 4 +- .../eth/sync/fastsync/FastSyncDownloader.java | 10 +- .../fastsync/NoSyncRequiredException.java | 17 ++ .../sync/fastsync/NoSyncRequiredState.java | 17 ++ .../sync/fastsync/PivotSelectorFromPeers.java | 16 +- .../sync/snapsync/SnapSyncConfiguration.java | 7 + .../request/AccountRangeDataRequest.java | 16 +- .../sync/fastsync/FastSyncActionsTest.java | 42 ++--- .../worldstate/LoadLocalDataStepTest.java | 2 +- .../sync/snapsync/LoadLocalDataStepTest.java | 2 +- .../trie/patricia/TrieNodeDecoder.java | 4 + .../pipeline/AsyncOperationProcessor.java | 2 +- .../besu/services/pipeline/Pipe.java | 19 ++- .../besu/services/pipeline/Pipeline.java | 13 ++ .../services/pipeline/PipelineBuilder.java | 3 +- .../pipeline/BatchingReadPipeTest.java | 3 +- .../services/pipeline/CompleterStageTest.java | 3 +- .../pipeline/FlatMapProcessorTest.java | 6 +- .../pipeline/IteratorSourceStageTest.java | 3 +- .../services/pipeline/MapProcessorTest.java | 6 +- .../besu/services/pipeline/PipeTest.java | 3 +- .../pipeline/ProcessingStageTest.java | 4 +- 44 files changed, 708 insertions(+), 127 deletions(-) create mode 100644 consensus/qbft/src/main/java/org/hyperledger/besu/consensus/qbft/BFTPivotSelectorFromPeers.java create mode 100644 consensus/qbft/src/test/java/org/hyperledger/besu/consensus/qbft/sync/QbftPivotSelectorTest.java create mode 100644 ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/sync/fastsync/NoSyncRequiredException.java create mode 100644 ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/sync/fastsync/NoSyncRequiredState.java diff --git a/CHANGELOG.md b/CHANGELOG.md index d14b3e0fc..4d29b8f8a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -33,6 +33,7 @@ - Nodes in a permissioned chain maintain (and retry) connections to bootnodes [#7257](https://github.com/hyperledger/besu/pull/7257) - Promote experimental `besu storage x-trie-log` subcommand to production-ready [#7278](https://github.com/hyperledger/besu/pull/7278) - Enhanced BFT round-change diagnostics [#7271](https://github.com/hyperledger/besu/pull/7271) +- `--Xsnapsync-bft-enabled` option enables experimental support for snap sync with IBFT/QBFT permissioned Bonsai-DB chains [#7140](https://github.com/hyperledger/besu/pull/7140) ### Bug fixes - Validation errors ignored in accounts-allowlist and empty list [#7138](https://github.com/hyperledger/besu/issues/7138) diff --git a/besu/src/main/java/org/hyperledger/besu/cli/BesuCommand.java b/besu/src/main/java/org/hyperledger/besu/cli/BesuCommand.java index 7e1be15fb..12752f2e9 100644 --- a/besu/src/main/java/org/hyperledger/besu/cli/BesuCommand.java +++ b/besu/src/main/java/org/hyperledger/besu/cli/BesuCommand.java @@ -1552,10 +1552,11 @@ public class BesuCommand implements DefaultCommandValues, Runnable { } private void validateConsensusSyncCompatibilityOptions() { - // snap and checkpoint can't be used with BFT but can for clique - if (genesisConfigOptionsSupplier.get().isIbftLegacy() - || genesisConfigOptionsSupplier.get().isIbft2() - || genesisConfigOptionsSupplier.get().isQbft()) { + // snap and checkpoint are experimental for BFT + if ((genesisConfigOptionsSupplier.get().isIbftLegacy() + || genesisConfigOptionsSupplier.get().isIbft2() + || genesisConfigOptionsSupplier.get().isQbft()) + && !unstableSynchronizerOptions.isSnapSyncBftEnabled()) { final String errorSuffix = "can't be used with BFT networks"; if (SyncMode.CHECKPOINT.equals(syncMode) || SyncMode.X_CHECKPOINT.equals(syncMode)) { throw new ParameterException( @@ -2181,7 +2182,7 @@ public class BesuCommand implements DefaultCommandValues, Runnable { return unstableSynchronizerOptions .toDomainObject() .syncMode(syncMode) - .fastSyncMinimumPeerCount(syncMinPeerCount) + .syncMinimumPeerCount(syncMinPeerCount) .build(); } @@ -2194,14 +2195,14 @@ public class BesuCommand implements DefaultCommandValues, Runnable { .saveFile((dataPath.resolve(txPoolConf.getSaveFile().getPath()).toFile())); if (genesisConfigOptionsSupplier.get().isZeroBaseFee()) { - logger.info( + logger.warn( "Forcing price bump for transaction replacement to 0, since we are on a zero basefee network"); txPoolConfBuilder.priceBump(Percentage.ZERO); } if (miningParametersSupplier.get().getMinTransactionGasPrice().equals(Wei.ZERO) && !transactionPoolOptions.isPriceBumpSet(commandLine)) { - logger.info( + logger.warn( "Forcing price bump for transaction replacement to 0, since min-gas-price is set to 0"); txPoolConfBuilder.priceBump(Percentage.ZERO); } @@ -2810,6 +2811,7 @@ public class BesuCommand implements DefaultCommandValues, Runnable { } builder.setSnapServerEnabled(this.unstableSynchronizerOptions.isSnapsyncServerEnabled()); + builder.setSnapSyncBftEnabled(this.unstableSynchronizerOptions.isSnapSyncBftEnabled()); builder.setTxPoolImplementation(buildTransactionPoolConfiguration().getTxPoolImplementation()); builder.setWorldStateUpdateMode(unstableEvmOptions.toDomainObject().worldUpdaterMode()); diff --git a/besu/src/main/java/org/hyperledger/besu/cli/ConfigurationOverviewBuilder.java b/besu/src/main/java/org/hyperledger/besu/cli/ConfigurationOverviewBuilder.java index 2d74ae8d2..b2f89a349 100644 --- a/besu/src/main/java/org/hyperledger/besu/cli/ConfigurationOverviewBuilder.java +++ b/besu/src/main/java/org/hyperledger/besu/cli/ConfigurationOverviewBuilder.java @@ -56,6 +56,7 @@ public class ConfigurationOverviewBuilder { private long trieLogRetentionLimit = 0; private Integer trieLogsPruningWindowSize = null; private boolean isSnapServerEnabled = false; + private boolean isSnapSyncBftEnabled = false; private TransactionPoolConfiguration.Implementation txPoolImplementation; private EvmConfiguration.WorldUpdaterMode worldStateUpdateMode; private Map environment; @@ -233,6 +234,17 @@ public class ConfigurationOverviewBuilder { return this; } + /** + * Sets snap sync BFT enabled/disabled + * + * @param snapSyncBftEnabled bool to indicate if snap sync for BFT is enabled + * @return the builder + */ + public ConfigurationOverviewBuilder setSnapSyncBftEnabled(final boolean snapSyncBftEnabled) { + isSnapSyncBftEnabled = snapSyncBftEnabled; + return this; + } + /** * Sets trie logs pruning window size * @@ -357,6 +369,10 @@ public class ConfigurationOverviewBuilder { lines.add("Experimental Snap Sync server enabled"); } + if (isSnapSyncBftEnabled) { + lines.add("Experimental Snap Sync for BFT enabled"); + } + if (isBonsaiLimitTrieLogsEnabled) { final StringBuilder trieLogPruningString = new StringBuilder(); trieLogPruningString diff --git a/besu/src/main/java/org/hyperledger/besu/cli/options/unstable/SynchronizerOptions.java b/besu/src/main/java/org/hyperledger/besu/cli/options/unstable/SynchronizerOptions.java index e52839cce..95bbe0a2b 100644 --- a/besu/src/main/java/org/hyperledger/besu/cli/options/unstable/SynchronizerOptions.java +++ b/besu/src/main/java/org/hyperledger/besu/cli/options/unstable/SynchronizerOptions.java @@ -85,6 +85,8 @@ public class SynchronizerOptions implements CLIOptions

validatorList = new ArrayList<>(); + validatorList.add(Address.ZERO); + validatorList.add(Address.ZERO); + validatorList.add(Address.ZERO); + + when(ethContext.getEthPeers()).thenReturn(ethPeers); + when(validatorProvider.nodeIsValidator(any())).thenReturn(true); + when(validatorProvider.getValidatorsAtHead()).thenReturn(validatorList); + BFTPivotSelectorFromPeers pivotSelector = + new BFTPivotSelectorFromPeers( + ethContext, + syncConfig, + syncState, + metricsSystem, + protocolContext, + nodeKey, + blockHeader); + Optional pivotState = pivotSelector.selectNewPivotBlock(); + assertThat(pivotState.isEmpty()).isTrue(); + } + + @Test + @SuppressWarnings("unused") + public void returnNoSyncRequiredIfOnlyValidatorAndNoPeers() { + + // We're the only validator so just put us in the list + List
validatorList = new ArrayList<>(); + validatorList.add(Address.ZERO); + + when(ethContext.getEthPeers()).thenReturn(ethPeers); + when(validatorProvider.nodeIsValidator(any())).thenReturn(true); + when(validatorProvider.getValidatorsAtHead()).thenReturn(validatorList); + BFTPivotSelectorFromPeers pivotSelector = + new BFTPivotSelectorFromPeers( + ethContext, + syncConfig, + syncState, + metricsSystem, + protocolContext, + nodeKey, + blockHeader); + + try { + Optional pivotState = pivotSelector.selectNewPivotBlock(); + fail("Expected NoSyncRequiredException but none thrown"); + } catch (NoSyncRequiredException e) { + // Ignore - just make sure we get here + } + } + + @Test + public void returnEmptySyncStateIfNonValidatorWithNoBestPeer() { + when(ethContext.getEthPeers()).thenReturn(ethPeers); + when(validatorProvider.nodeIsValidator(any())).thenReturn(false); + BFTPivotSelectorFromPeers pivotSelector = + new BFTPivotSelectorFromPeers( + ethContext, + syncConfig, + syncState, + metricsSystem, + protocolContext, + nodeKey, + blockHeader); + + Optional pivotState = pivotSelector.selectNewPivotBlock(); + assertThat(pivotState.isEmpty()).isTrue(); + } + + @Test + public void returnEmptySyncStateIfValidatorAndNotAtGenesisAndOtherValidators() { + when(ethContext.getEthPeers()).thenReturn(ethPeers); + when(validatorProvider.nodeIsValidator(any())).thenReturn(false); + when(blockHeader.getNumber()).thenReturn(10L); + BFTPivotSelectorFromPeers pivotSelector = + new BFTPivotSelectorFromPeers( + ethContext, + syncConfig, + syncState, + metricsSystem, + protocolContext, + nodeKey, + blockHeader); + + Optional pivotState = pivotSelector.selectNewPivotBlock(); + assertThat(pivotState.isEmpty()).isTrue(); + } +} diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/trie/diffbased/common/trielog/TrieLogPruner.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/trie/diffbased/common/trielog/TrieLogPruner.java index 4a5cc8751..6f347be03 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/trie/diffbased/common/trielog/TrieLogPruner.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/trie/diffbased/common/trielog/TrieLogPruner.java @@ -99,7 +99,7 @@ public class TrieLogPruner implements TrieLogEvent.TrieLogObserver { } } - public void addToPruneQueue(final long blockNumber, final Hash blockHash) { + public synchronized void addToPruneQueue(final long blockNumber, final Hash blockHash) { LOG.atTrace() .setMessage("adding trie log to queue for later pruning blockNumber {}; blockHash {}") .addArgument(blockNumber) @@ -108,7 +108,7 @@ public class TrieLogPruner implements TrieLogEvent.TrieLogObserver { trieLogBlocksAndForksByDescendingBlockNumber.put(blockNumber, blockHash); } - public int pruneFromQueue() { + public synchronized int pruneFromQueue() { final long retainAboveThisBlock = blockchain.getChainHeadBlockNumber() - numBlocksToRetain; final Optional finalized = blockchain.getFinalized(); if (requireFinalizedBlock && finalized.isEmpty()) { diff --git a/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/manager/snap/SnapServer.java b/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/manager/snap/SnapServer.java index 49f725d82..d6bfe900d 100644 --- a/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/manager/snap/SnapServer.java +++ b/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/manager/snap/SnapServer.java @@ -32,6 +32,7 @@ import org.hyperledger.besu.ethereum.p2p.rlpx.wire.MessageData; import org.hyperledger.besu.ethereum.proof.WorldStateProofProvider; import org.hyperledger.besu.ethereum.rlp.BytesValueRLPOutput; import org.hyperledger.besu.ethereum.trie.CompactEncoding; +import org.hyperledger.besu.ethereum.trie.MerkleTrie; import org.hyperledger.besu.ethereum.trie.diffbased.bonsai.BonsaiWorldStateProvider; import org.hyperledger.besu.ethereum.trie.diffbased.bonsai.storage.BonsaiWorldStateKeyValueStorage; import org.hyperledger.besu.ethereum.worldstate.FlatDbMode; @@ -225,6 +226,9 @@ class SnapServer implements BesuEvents.InitialSyncCompletionListener { .addArgument(() -> asLogHash(range.endKeyHash())) .log(); try { + if (range.worldStateRootHash().equals(Hash.EMPTY_TRIE_HASH)) { + return AccountRangeMessage.create(new HashMap<>(), List.of(MerkleTrie.EMPTY_TRIE_NODE)); + } return worldStateStorageProvider .apply(range.worldStateRootHash()) .map( @@ -509,8 +513,11 @@ class SnapServer implements BesuEvents.InitialSyncCompletionListener { // first element in paths is account if (triePath.size() == 1) { // if there is only one path, presume it should be compact encoded account path - var optStorage = - storage.getTrieNodeUnsafe(CompactEncoding.decode(triePath.get(0))); + final Bytes location = CompactEncoding.decode(triePath.get(0)); + var optStorage = storage.getTrieNodeUnsafe(location); + if (optStorage.isEmpty() && location.isEmpty()) { + optStorage = Optional.of(MerkleTrie.EMPTY_TRIE_NODE); + } if (optStorage.isPresent()) { if (!trieNodes.isEmpty() && (sumListBytes(trieNodes) + optStorage.get().size() > maxResponseBytes @@ -534,9 +541,12 @@ class SnapServer implements BesuEvents.InitialSyncCompletionListener { List storagePaths = triePath.subList(1, triePath.size()); for (var path : storagePaths) { + final Bytes location = CompactEncoding.decode(path); var optStorage = - storage.getTrieNodeUnsafe( - Bytes.concatenate(accountPrefix, CompactEncoding.decode(path))); + storage.getTrieNodeUnsafe(Bytes.concatenate(accountPrefix, location)); + if (optStorage.isEmpty() && location.isEmpty()) { + optStorage = Optional.of(MerkleTrie.EMPTY_TRIE_NODE); + } if (optStorage.isPresent()) { if (!trieNodes.isEmpty() && sumListBytes(trieNodes) + optStorage.get().size() diff --git a/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/sync/DefaultSynchronizer.java b/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/sync/DefaultSynchronizer.java index af35898ac..5e596576a 100644 --- a/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/sync/DefaultSynchronizer.java +++ b/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/sync/DefaultSynchronizer.java @@ -25,6 +25,7 @@ import org.hyperledger.besu.ethereum.eth.manager.EthContext; import org.hyperledger.besu.ethereum.eth.sync.checkpointsync.CheckpointDownloaderFactory; import org.hyperledger.besu.ethereum.eth.sync.fastsync.FastSyncDownloader; import org.hyperledger.besu.ethereum.eth.sync.fastsync.FastSyncState; +import org.hyperledger.besu.ethereum.eth.sync.fastsync.NoSyncRequiredState; import org.hyperledger.besu.ethereum.eth.sync.fastsync.worldstate.FastDownloaderFactory; import org.hyperledger.besu.ethereum.eth.sync.fullsync.FullSyncDownloader; import org.hyperledger.besu.ethereum.eth.sync.fullsync.SyncTerminationCondition; @@ -242,16 +243,24 @@ public class DefaultSynchronizer implements Synchronizer, UnverifiedForkchoiceLi // We've been shutdown which will have triggered the fast sync future to complete return CompletableFuture.completedFuture(null); } - fastSyncDownloader.ifPresent(FastSyncDownloader::deleteFastSyncState); - result - .getPivotBlockHeader() - .ifPresent( - blockHeader -> protocolContext.getWorldStateArchive().resetArchiveStateTo(blockHeader)); - LOG.info( - "Sync completed successfully with pivot block {}", - result.getPivotBlockNumber().getAsLong()); - pivotBlockSelector.close(); - syncState.markInitialSyncPhaseAsDone(); + + if (result instanceof NoSyncRequiredState) { + LOG.info("Sync ended (no sync required)"); + syncState.markInitialSyncPhaseAsDone(); + } else { + fastSyncDownloader.ifPresent(FastSyncDownloader::deleteFastSyncState); + result + .getPivotBlockHeader() + .ifPresent( + blockHeader -> + protocolContext.getWorldStateArchive().resetArchiveStateTo(blockHeader)); + if (result.hasPivotBlockHash()) + LOG.info( + "Sync completed successfully with pivot block {}", + result.getPivotBlockNumber().getAsLong()); + pivotBlockSelector.close(); + syncState.markInitialSyncPhaseAsDone(); + } if (terminationCondition.shouldContinueDownload()) { return startFullSync(); 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 28f8bee6d..d46da85dc 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 @@ -29,7 +29,7 @@ public class SynchronizerConfiguration { public static final int DEFAULT_PIVOT_DISTANCE_FROM_HEAD = 50; public static final float DEFAULT_FULL_VALIDATION_RATE = .1f; - public static final int DEFAULT_FAST_SYNC_MINIMUM_PEERS = 5; + public static final int DEFAULT_SYNC_MINIMUM_PEERS = 5; public static final int DEFAULT_WORLD_STATE_HASH_COUNT_PER_REQUEST = 384; public static final int DEFAULT_WORLD_STATE_REQUEST_PARALLELISM = 10; public static final int DEFAULT_WORLD_STATE_MAX_REQUESTS_WITHOUT_PROGRESS = 1000; @@ -53,9 +53,9 @@ public class SynchronizerConfiguration { public static final boolean DEFAULT_CHECKPOINT_POST_MERGE_ENABLED = false; // Fast sync config - private final int fastSyncPivotDistance; + private final int syncPivotDistance; private final float fastSyncFullValidationRate; - private final int fastSyncMinimumPeerCount; + private final int syncMinimumPeerCount; private final int worldStateHashCountPerRequest; private final int worldStateRequestParallelism; private final int worldStateMaxRequestsWithoutProgress; @@ -87,9 +87,9 @@ public class SynchronizerConfiguration { private final long propagationManagerGetBlockTimeoutMillis; private SynchronizerConfiguration( - final int fastSyncPivotDistance, + final int syncPivotDistance, final float fastSyncFullValidationRate, - final int fastSyncMinimumPeerCount, + final int syncMinimumPeerCount, final int worldStateHashCountPerRequest, final int worldStateRequestParallelism, final int worldStateMaxRequestsWithoutProgress, @@ -109,9 +109,9 @@ public class SynchronizerConfiguration { final int maxTrailingPeers, final long propagationManagerGetBlockTimeoutMillis, final boolean checkpointPostMergeEnabled) { - this.fastSyncPivotDistance = fastSyncPivotDistance; + this.syncPivotDistance = syncPivotDistance; this.fastSyncFullValidationRate = fastSyncFullValidationRate; - this.fastSyncMinimumPeerCount = fastSyncMinimumPeerCount; + this.syncMinimumPeerCount = syncMinimumPeerCount; this.worldStateHashCountPerRequest = worldStateHashCountPerRequest; this.worldStateRequestParallelism = worldStateRequestParallelism; this.worldStateMaxRequestsWithoutProgress = worldStateMaxRequestsWithoutProgress; @@ -171,12 +171,14 @@ public class SynchronizerConfiguration { } /** - * The distance from the chain head at which we should switch from fast sync to full sync. + * The distance from the chain head at which we should switch from fast, snap, or checkpoint sync + * to full sync. * - * @return distance from the chain head at which we should switch from fast sync to full sync. + * @return distance from the chain head at which we should switch from fast, snap or checkpoint + * sync to full sync. */ - public int getFastSyncPivotDistance() { - return fastSyncPivotDistance; + public int getSyncPivotDistance() { + return syncPivotDistance; } public long getDownloaderChangeTargetThresholdByHeight() { @@ -222,8 +224,8 @@ public class SynchronizerConfiguration { return fastSyncFullValidationRate; } - public int getFastSyncMinimumPeerCount() { - return fastSyncMinimumPeerCount; + public int getSyncMinimumPeerCount() { + return syncMinimumPeerCount; } public int getWorldStateHashCountPerRequest() { @@ -256,7 +258,7 @@ public class SynchronizerConfiguration { public static class Builder { private SyncMode syncMode = SyncMode.FULL; - private int fastSyncMinimumPeerCount = DEFAULT_FAST_SYNC_MINIMUM_PEERS; + private int syncMinimumPeerCount = DEFAULT_SYNC_MINIMUM_PEERS; private int maxTrailingPeers = Integer.MAX_VALUE; private Range blockPropagationRange = DEFAULT_BLOCK_PROPAGATION_RANGE; private long downloaderChangeTargetThresholdByHeight = @@ -270,7 +272,7 @@ public class SynchronizerConfiguration { private int downloaderParallelism = DEFAULT_DOWNLOADER_PARALLELISM; private int transactionsParallelism = DEFAULT_TRANSACTIONS_PARALLELISM; private int computationParallelism = DEFAULT_COMPUTATION_PARALLELISM; - private int fastSyncPivotDistance = DEFAULT_PIVOT_DISTANCE_FROM_HEAD; + private int syncPivotDistance = DEFAULT_PIVOT_DISTANCE_FROM_HEAD; private float fastSyncFullValidationRate = DEFAULT_FULL_VALIDATION_RATE; private int worldStateHashCountPerRequest = DEFAULT_WORLD_STATE_HASH_COUNT_PER_REQUEST; private int worldStateRequestParallelism = DEFAULT_WORLD_STATE_REQUEST_PARALLELISM; @@ -283,8 +285,8 @@ public class SynchronizerConfiguration { DEFAULT_PROPAGATION_MANAGER_GET_BLOCK_TIMEOUT_MILLIS; private boolean checkpointPostMergeEnabled = DEFAULT_CHECKPOINT_POST_MERGE_ENABLED; - public Builder fastSyncPivotDistance(final int distance) { - fastSyncPivotDistance = distance; + public Builder syncPivotDistance(final int distance) { + syncPivotDistance = distance; return this; } @@ -357,8 +359,8 @@ public class SynchronizerConfiguration { return this; } - public Builder fastSyncMinimumPeerCount(final int fastSyncMinimumPeerCount) { - this.fastSyncMinimumPeerCount = fastSyncMinimumPeerCount; + public Builder syncMinimumPeerCount(final int syncMinimumPeerCount) { + this.syncMinimumPeerCount = syncMinimumPeerCount; return this; } @@ -406,9 +408,9 @@ public class SynchronizerConfiguration { public SynchronizerConfiguration build() { return new SynchronizerConfiguration( - fastSyncPivotDistance, + syncPivotDistance, fastSyncFullValidationRate, - fastSyncMinimumPeerCount, + syncMinimumPeerCount, worldStateHashCountPerRequest, worldStateRequestParallelism, worldStateMaxRequestsWithoutProgress, diff --git a/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/sync/fastsync/FastSyncActions.java b/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/sync/fastsync/FastSyncActions.java index 52d384acf..06bf8aace 100644 --- a/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/sync/fastsync/FastSyncActions.java +++ b/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/sync/fastsync/FastSyncActions.java @@ -142,8 +142,8 @@ public class FastSyncActions { ethContext, metricsSystem, currentState.getPivotBlockNumber().getAsLong(), - syncConfig.getFastSyncMinimumPeerCount(), - syncConfig.getFastSyncPivotDistance()) + syncConfig.getSyncMinimumPeerCount(), + syncConfig.getSyncPivotDistance()) .downloadPivotBlockHeader())); } diff --git a/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/sync/fastsync/FastSyncDownloader.java b/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/sync/fastsync/FastSyncDownloader.java index 7b64f885c..565824a78 100644 --- a/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/sync/fastsync/FastSyncDownloader.java +++ b/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/sync/fastsync/FastSyncDownloader.java @@ -1,5 +1,5 @@ /* - * Copyright ConsenSys AG. + * Copyright contributors to Hyperledger Besu. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at @@ -80,7 +80,7 @@ public class FastSyncDownloader { if (!running.compareAndSet(false, true)) { throw new IllegalStateException("SyncDownloader already running"); } - LOG.info("Starting sync"); + LOG.info("Starting pivot-based sync"); return start(initialFastSyncState); } @@ -94,7 +94,7 @@ public class FastSyncDownloader { onBonsai.clearFlatDatabase(); onBonsai.clearTrieLog(); }); - LOG.debug("Start sync with initial sync state {}", fastSyncState); + LOG.debug("Start fast sync with initial sync state {}", fastSyncState); return findPivotBlock(fastSyncState, fss -> downloadChainAndWorldState(fastSyncActions, fss)); } @@ -114,7 +114,9 @@ public class FastSyncDownloader { protected CompletableFuture handleFailure(final Throwable error) { trailingPeerRequirements = Optional.empty(); Throwable rootCause = ExceptionUtils.rootCause(error); - if (rootCause instanceof SyncException) { + if (rootCause instanceof NoSyncRequiredException) { + return CompletableFuture.completedFuture(new NoSyncRequiredState()); + } else if (rootCause instanceof SyncException) { return CompletableFuture.failedFuture(error); } else if (rootCause instanceof StalledDownloadException) { LOG.debug("Stalled sync re-pivoting to newer block."); diff --git a/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/sync/fastsync/NoSyncRequiredException.java b/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/sync/fastsync/NoSyncRequiredException.java new file mode 100644 index 000000000..caa45abdc --- /dev/null +++ b/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/sync/fastsync/NoSyncRequiredException.java @@ -0,0 +1,17 @@ +/* + * Copyright contributors to Hyperledger Besu. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on + * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the + * specific language governing permissions and limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + */ +package org.hyperledger.besu.ethereum.eth.sync.fastsync; + +public class NoSyncRequiredException extends RuntimeException {} diff --git a/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/sync/fastsync/NoSyncRequiredState.java b/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/sync/fastsync/NoSyncRequiredState.java new file mode 100644 index 000000000..9cefe78ed --- /dev/null +++ b/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/sync/fastsync/NoSyncRequiredState.java @@ -0,0 +1,17 @@ +/* + * Copyright contributors to Hyperledger Besu. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on + * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the + * specific language governing permissions and limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + */ +package org.hyperledger.besu.ethereum.eth.sync.fastsync; + +public class NoSyncRequiredState extends FastSyncState {} diff --git a/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/sync/fastsync/PivotSelectorFromPeers.java b/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/sync/fastsync/PivotSelectorFromPeers.java index 6402b58d1..16f7e09d6 100644 --- a/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/sync/fastsync/PivotSelectorFromPeers.java +++ b/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/sync/fastsync/PivotSelectorFromPeers.java @@ -35,8 +35,8 @@ public class PivotSelectorFromPeers implements PivotBlockSelector { private static final Logger LOG = LoggerFactory.getLogger(PivotSelectorFromPeers.class); - private final EthContext ethContext; - private final SynchronizerConfiguration syncConfig; + protected final EthContext ethContext; + protected final SynchronizerConfiguration syncConfig; private final SyncState syncState; private final MetricsSystem metricsSystem; @@ -66,7 +66,7 @@ public class PivotSelectorFromPeers implements PivotBlockSelector { conservativelyEstimatedPivotBlock(), syncConfig.getMaxTrailingPeers())); trailingPeerLimiter.enforceTrailingPeerLimit(); - return waitForPeers(syncConfig.getFastSyncMinimumPeerCount()); + return waitForPeers(syncConfig.getSyncMinimumPeerCount()); } @Override @@ -74,9 +74,9 @@ public class PivotSelectorFromPeers implements PivotBlockSelector { return syncState.bestChainHeight(); } - private Optional fromBestPeer(final EthPeer peer) { + protected Optional fromBestPeer(final EthPeer peer) { final long pivotBlockNumber = - peer.chainState().getEstimatedHeight() - syncConfig.getFastSyncPivotDistance(); + peer.chainState().getEstimatedHeight() - syncConfig.getSyncPivotDistance(); if (pivotBlockNumber <= BlockHeader.GENESIS_BLOCK_NUMBER) { // Peer's chain isn't long enough, return an empty value, so we can try again. LOG.info("Waiting for peers with sufficient chain height"); @@ -86,7 +86,7 @@ public class PivotSelectorFromPeers implements PivotBlockSelector { return Optional.of(new FastSyncState(pivotBlockNumber)); } - private Optional selectBestPeer() { + protected Optional selectBestPeer() { return ethContext .getEthPeers() .bestPeerMatchingCriteria(this::canPeerDeterminePivotBlock) @@ -96,7 +96,7 @@ public class PivotSelectorFromPeers implements PivotBlockSelector { private boolean enoughFastSyncPeersArePresent() { final long peerCount = countPeersThatCanDeterminePivotBlock(); - final int minPeerCount = syncConfig.getFastSyncMinimumPeerCount(); + final int minPeerCount = syncConfig.getSyncMinimumPeerCount(); if (peerCount < minPeerCount) { LOG.info( "Waiting for valid peers with chain height information. {} / {} required peers currently available.", @@ -126,7 +126,7 @@ public class PivotSelectorFromPeers implements PivotBlockSelector { private long conservativelyEstimatedPivotBlock() { final long estimatedNextPivot = - syncState.getLocalChainHeight() + syncConfig.getFastSyncPivotDistance(); + syncState.getLocalChainHeight() + syncConfig.getSyncPivotDistance(); return Math.min(syncState.bestChainHeight(), estimatedNextPivot); } diff --git a/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/sync/snapsync/SnapSyncConfiguration.java b/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/sync/snapsync/SnapSyncConfiguration.java index 669287cfe..dbe043b92 100644 --- a/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/sync/snapsync/SnapSyncConfiguration.java +++ b/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/sync/snapsync/SnapSyncConfiguration.java @@ -38,6 +38,8 @@ public class SnapSyncConfiguration { public static final Boolean DEFAULT_SNAP_SERVER_ENABLED = Boolean.FALSE; + public static final Boolean DEFAULT_SNAP_SYNC_BFT_ENABLED = Boolean.FALSE; + public static SnapSyncConfiguration getDefault() { return ImmutableSnapSyncConfiguration.builder().build(); } @@ -81,4 +83,9 @@ public class SnapSyncConfiguration { public Boolean isSnapServerEnabled() { return DEFAULT_SNAP_SERVER_ENABLED; } + + @Value.Default + public Boolean isSnapSyncBftEnabled() { + return DEFAULT_SNAP_SYNC_BFT_ENABLED; + } } diff --git a/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/sync/snapsync/request/AccountRangeDataRequest.java b/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/sync/snapsync/request/AccountRangeDataRequest.java index 213912a1a..21a707e9a 100644 --- a/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/sync/snapsync/request/AccountRangeDataRequest.java +++ b/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/sync/snapsync/request/AccountRangeDataRequest.java @@ -58,12 +58,12 @@ public class AccountRangeDataRequest extends SnapDataRequest { private static final Logger LOG = LoggerFactory.getLogger(AccountRangeDataRequest.class); - private final Bytes32 startKeyHash; - private final Bytes32 endKeyHash; - private final Optional startStorageRange; - private final Optional endStorageRange; + protected final Bytes32 startKeyHash; + protected final Bytes32 endKeyHash; + protected final Optional startStorageRange; + protected final Optional endStorageRange; - private final StackTrie stackTrie; + protected final StackTrie stackTrie; private Optional isProofValid; protected AccountRangeDataRequest( @@ -170,6 +170,12 @@ public class AccountRangeDataRequest extends SnapDataRequest { } else { stackTrie.addElement(startKeyHash, proofs, accounts); isProofValid = Optional.of(true); + LOG.atDebug() + .setMessage("{} accounts received during sync for account range {} {}") + .addArgument(accounts.size()) + .addArgument(startKeyHash) + .addArgument(endKeyHash) + .log(); } } } diff --git a/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/sync/fastsync/FastSyncActionsTest.java b/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/sync/fastsync/FastSyncActionsTest.java index e060bab6f..d29bb7260 100644 --- a/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/sync/fastsync/FastSyncActionsTest.java +++ b/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/sync/fastsync/FastSyncActionsTest.java @@ -62,7 +62,7 @@ import org.junit.jupiter.params.provider.ArgumentsSource; public class FastSyncActionsTest { private final SynchronizerConfiguration.Builder syncConfigBuilder = - new SynchronizerConfiguration.Builder().syncMode(SyncMode.FAST).fastSyncPivotDistance(1000); + new SynchronizerConfiguration.Builder().syncMode(SyncMode.FAST).syncPivotDistance(1000); private final WorldStateStorageCoordinator worldStateStorageCoordinator = mock(WorldStateStorageCoordinator.class); @@ -113,9 +113,9 @@ public class FastSyncActionsTest { public void waitForPeersShouldSucceedIfEnoughPeersAreFound( final DataStorageFormat storageFormat) { setUp(storageFormat); - for (int i = 0; i < syncConfig.getFastSyncMinimumPeerCount(); i++) { + for (int i = 0; i < syncConfig.getSyncMinimumPeerCount(); i++) { EthProtocolManagerTestUtil.createPeer( - ethProtocolManager, syncConfig.getFastSyncPivotDistance() + i + 1); + ethProtocolManager, syncConfig.getSyncPivotDistance() + i + 1); } final CompletableFuture result = fastSyncActions.selectPivotBlock(FastSyncState.EMPTY_SYNC_STATE); @@ -153,7 +153,7 @@ public class FastSyncActionsTest { final DataStorageFormat storageFormat) { setUp(storageFormat); final int minPeers = 1; - syncConfigBuilder.fastSyncMinimumPeerCount(minPeers); + syncConfigBuilder.syncMinimumPeerCount(minPeers); syncConfig = syncConfigBuilder.build(); fastSyncActions = createFastSyncActions( @@ -174,7 +174,7 @@ public class FastSyncActionsTest { final DataStorageFormat storageFormat) { setUp(storageFormat); final int minPeers = 1; - syncConfigBuilder.fastSyncMinimumPeerCount(minPeers); + syncConfigBuilder.syncMinimumPeerCount(minPeers); syncConfig = syncConfigBuilder.build(); fastSyncActions = createFastSyncActions( @@ -197,7 +197,7 @@ public class FastSyncActionsTest { setUp(storageFormat); EthProtocolManagerTestUtil.disableEthSchedulerAutoRun(ethProtocolManager); final int minPeers = 2; - syncConfigBuilder.fastSyncMinimumPeerCount(minPeers); + syncConfigBuilder.syncMinimumPeerCount(minPeers); syncConfig = syncConfigBuilder.build(); fastSyncActions = createFastSyncActions( @@ -228,13 +228,13 @@ public class FastSyncActionsTest { final DataStorageFormat storageFormat) { setUp(storageFormat); final int minPeers = 3; - syncConfigBuilder.fastSyncMinimumPeerCount(minPeers); + syncConfigBuilder.syncMinimumPeerCount(minPeers); syncConfig = syncConfigBuilder.build(); fastSyncActions = createFastSyncActions( syncConfig, new PivotSelectorFromPeers(ethContext, syncConfig, syncState, metricsSystem)); - final long minPivotHeight = syncConfig.getFastSyncPivotDistance() + 1L; + final long minPivotHeight = syncConfig.getSyncPivotDistance() + 1L; EthProtocolManagerTestUtil.disableEthSchedulerAutoRun(ethProtocolManager); // Create peers without chain height estimates @@ -267,7 +267,7 @@ public class FastSyncActionsTest { final long bestPeerHeight = minPivotHeight + 1; peers.get(minPeers - 1).getEthPeer().chainState().updateHeightEstimate(bestPeerHeight); final FastSyncState expected = - new FastSyncState(bestPeerHeight - syncConfig.getFastSyncPivotDistance()); + new FastSyncState(bestPeerHeight - syncConfig.getSyncPivotDistance()); EthProtocolManagerTestUtil.runPendingFutures(ethProtocolManager); assertThat(result).isCompletedWithValue(expected); } @@ -279,13 +279,13 @@ public class FastSyncActionsTest { setUp(storageFormat); final int minPeers = 3; final PeerValidator validator = mock(PeerValidator.class); - syncConfigBuilder.fastSyncMinimumPeerCount(minPeers); + syncConfigBuilder.syncMinimumPeerCount(minPeers); syncConfig = syncConfigBuilder.build(); fastSyncActions = createFastSyncActions( syncConfig, new PivotSelectorFromPeers(ethContext, syncConfig, syncState, metricsSystem)); - final long minPivotHeight = syncConfig.getFastSyncPivotDistance() + 1L; + final long minPivotHeight = syncConfig.getSyncPivotDistance() + 1L; EthProtocolManagerTestUtil.disableEthSchedulerAutoRun(ethProtocolManager); // Create peers that are not validated @@ -319,7 +319,7 @@ public class FastSyncActionsTest { bestPeer.chainState().updateHeightEstimate(bestPeerHeight); bestPeer.markValidated(validator); final FastSyncState expected = - new FastSyncState(bestPeerHeight - syncConfig.getFastSyncPivotDistance()); + new FastSyncState(bestPeerHeight - syncConfig.getSyncPivotDistance()); EthProtocolManagerTestUtil.runPendingFutures(ethProtocolManager); assertThat(result).isCompletedWithValue(expected); } @@ -351,13 +351,13 @@ public class FastSyncActionsTest { final boolean bestMissingHeight, final boolean bestNotValidated) { final int minPeers = 3; final int peerCount = minPeers + 1; - syncConfigBuilder.fastSyncMinimumPeerCount(minPeers); + syncConfigBuilder.syncMinimumPeerCount(minPeers); syncConfig = syncConfigBuilder.build(); fastSyncActions = createFastSyncActions( syncConfig, new PivotSelectorFromPeers(ethContext, syncConfig, syncState, metricsSystem)); - final long minPivotHeight = syncConfig.getFastSyncPivotDistance() + 1L; + final long minPivotHeight = syncConfig.getSyncPivotDistance() + 1L; EthProtocolManagerTestUtil.disableEthSchedulerAutoRun(ethProtocolManager); // Create peers without chain height estimates @@ -392,7 +392,7 @@ public class FastSyncActionsTest { final long expectedBestChainHeight = peers.get(1).getEthPeer().chainState().getEstimatedHeight(); final FastSyncState expected = - new FastSyncState(expectedBestChainHeight - syncConfig.getFastSyncPivotDistance()); + new FastSyncState(expectedBestChainHeight - syncConfig.getSyncPivotDistance()); EthProtocolManagerTestUtil.runPendingFutures(ethProtocolManager); assertThat(result).isCompletedWithValue(expected); } @@ -403,13 +403,13 @@ public class FastSyncActionsTest { final DataStorageFormat storageFormat) { setUp(storageFormat); final int minPeers = 1; - syncConfigBuilder.fastSyncMinimumPeerCount(minPeers); + syncConfigBuilder.syncMinimumPeerCount(minPeers); syncConfig = syncConfigBuilder.build(); fastSyncActions = createFastSyncActions( syncConfig, new PivotSelectorFromPeers(ethContext, syncConfig, syncState, metricsSystem)); - final long pivotDistance = syncConfig.getFastSyncPivotDistance(); + final long pivotDistance = syncConfig.getSyncPivotDistance(); EthProtocolManagerTestUtil.disableEthSchedulerAutoRun(ethProtocolManager); EthProtocolManagerTestUtil.createPeer(ethProtocolManager, pivotDistance - 1); @@ -432,10 +432,10 @@ public class FastSyncActionsTest { public void selectPivotBlockShouldRetryIfBestPeerChainIsEqualToPivotDistance( final DataStorageFormat storageFormat) { setUp(storageFormat); - final long pivotDistance = syncConfig.getFastSyncPivotDistance(); + final long pivotDistance = syncConfig.getSyncPivotDistance(); EthProtocolManagerTestUtil.disableEthSchedulerAutoRun(ethProtocolManager); // Create peers with chains that are too short - for (int i = 0; i < syncConfig.getFastSyncMinimumPeerCount(); i++) { + for (int i = 0; i < syncConfig.getSyncMinimumPeerCount(); i++) { EthProtocolManagerTestUtil.createPeer(ethProtocolManager, pivotDistance); } @@ -467,7 +467,7 @@ public class FastSyncActionsTest { public void downloadPivotBlockHeaderShouldRetrievePivotBlockHeader( final DataStorageFormat storageFormat) { setUp(storageFormat); - syncConfig = SynchronizerConfiguration.builder().fastSyncMinimumPeerCount(1).build(); + syncConfig = SynchronizerConfiguration.builder().syncMinimumPeerCount(1).build(); fastSyncActions = createFastSyncActions( syncConfig, @@ -489,7 +489,7 @@ public class FastSyncActionsTest { public void downloadPivotBlockHeaderShouldRetrievePivotBlockHash( final DataStorageFormat storageFormat) { setUp(storageFormat); - syncConfig = SynchronizerConfiguration.builder().fastSyncMinimumPeerCount(1).build(); + syncConfig = SynchronizerConfiguration.builder().syncMinimumPeerCount(1).build(); GenesisConfigOptions genesisConfig = mock(GenesisConfigOptions.class); when(genesisConfig.getTerminalBlockNumber()).thenReturn(OptionalLong.of(10L)); diff --git a/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/sync/fastsync/worldstate/LoadLocalDataStepTest.java b/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/sync/fastsync/worldstate/LoadLocalDataStepTest.java index 6707ed970..582bdff63 100644 --- a/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/sync/fastsync/worldstate/LoadLocalDataStepTest.java +++ b/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/sync/fastsync/worldstate/LoadLocalDataStepTest.java @@ -51,7 +51,7 @@ public class LoadLocalDataStepTest { private final Task task = new StubTask(request); private final Pipe> completedTasks = - new Pipe<>(10, NO_OP_COUNTER, NO_OP_COUNTER, NO_OP_COUNTER); + new Pipe<>(10, NO_OP_COUNTER, NO_OP_COUNTER, NO_OP_COUNTER, "test_pipe"); private final LoadLocalDataStep loadLocalDataStep = new LoadLocalDataStep( new WorldStateStorageCoordinator(worldStateKeyValueStorage), new NoOpMetricsSystem()); diff --git a/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/sync/snapsync/LoadLocalDataStepTest.java b/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/sync/snapsync/LoadLocalDataStepTest.java index 9027538ce..06f92460c 100644 --- a/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/sync/snapsync/LoadLocalDataStepTest.java +++ b/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/sync/snapsync/LoadLocalDataStepTest.java @@ -55,7 +55,7 @@ public class LoadLocalDataStepTest { private final Task task = new StubTask(request); private final Pipe> completedTasks = - new Pipe<>(10, NO_OP_COUNTER, NO_OP_COUNTER, NO_OP_COUNTER); + new Pipe<>(10, NO_OP_COUNTER, NO_OP_COUNTER, NO_OP_COUNTER, "test_pipe"); private final SnapSyncProcessState snapSyncState = mock(SnapSyncProcessState.class); private final SnapWorldDownloadState downloadState = mock(SnapWorldDownloadState.class); diff --git a/ethereum/trie/src/main/java/org/hyperledger/besu/ethereum/trie/patricia/TrieNodeDecoder.java b/ethereum/trie/src/main/java/org/hyperledger/besu/ethereum/trie/patricia/TrieNodeDecoder.java index b3476337a..6179f45fc 100644 --- a/ethereum/trie/src/main/java/org/hyperledger/besu/ethereum/trie/patricia/TrieNodeDecoder.java +++ b/ethereum/trie/src/main/java/org/hyperledger/besu/ethereum/trie/patricia/TrieNodeDecoder.java @@ -16,6 +16,7 @@ package org.hyperledger.besu.ethereum.trie.patricia; import static com.google.common.base.Preconditions.checkArgument; +import org.hyperledger.besu.ethereum.trie.MerkleTrie; import org.hyperledger.besu.ethereum.trie.Node; import org.hyperledger.besu.ethereum.trie.NodeLoader; import org.hyperledger.besu.ethereum.trie.NullNode; @@ -59,6 +60,9 @@ public class TrieNodeDecoder { * @return A list of nodes and node references embedded in the given rlp. */ public static List> decodeNodes(final Bytes location, final Bytes nodeRlp) { + if (nodeRlp.equals(MerkleTrie.EMPTY_TRIE_NODE)) { + return new ArrayList<>(); + } final Node node = decode(location, nodeRlp); final List> nodes = new ArrayList<>(); nodes.add(node); diff --git a/services/pipeline/src/main/java/org/hyperledger/besu/services/pipeline/AsyncOperationProcessor.java b/services/pipeline/src/main/java/org/hyperledger/besu/services/pipeline/AsyncOperationProcessor.java index f64454fa9..c8c7e5905 100644 --- a/services/pipeline/src/main/java/org/hyperledger/besu/services/pipeline/AsyncOperationProcessor.java +++ b/services/pipeline/src/main/java/org/hyperledger/besu/services/pipeline/AsyncOperationProcessor.java @@ -83,7 +83,7 @@ class AsyncOperationProcessor implements Processor { waitForAnyFutureToComplete(); outputCompletedTasks(outputPipe); } catch (final InterruptedException e) { - LOG.trace("Interrupted while waiting for processing to complete", e); + LOG.trace("Interrupted while waiting for processing to complete", e.getMessage()); } catch (final ExecutionException e) { throw new AsyncOperationException("Async operation failed. " + e.getMessage(), e); } catch (final TimeoutException e) { diff --git a/services/pipeline/src/main/java/org/hyperledger/besu/services/pipeline/Pipe.java b/services/pipeline/src/main/java/org/hyperledger/besu/services/pipeline/Pipe.java index 3697e0e3b..63fb01bad 100644 --- a/services/pipeline/src/main/java/org/hyperledger/besu/services/pipeline/Pipe.java +++ b/services/pipeline/src/main/java/org/hyperledger/besu/services/pipeline/Pipe.java @@ -44,6 +44,7 @@ public class Pipe implements ReadPipe, WritePipe { private final Counter abortedItemCounter; private final AtomicBoolean closed = new AtomicBoolean(); private final AtomicBoolean aborted = new AtomicBoolean(); + private String pipeName = ""; /** * Instantiates a new Pipe. @@ -52,16 +53,28 @@ public class Pipe implements ReadPipe, WritePipe { * @param inputCounter the input counter * @param outputCounter the output counter * @param abortedItemCounter the aborted item counter + * @param pipeName the name of the pipe */ public Pipe( final int capacity, final Counter inputCounter, final Counter outputCounter, - final Counter abortedItemCounter) { + final Counter abortedItemCounter, + final String pipeName) { queue = new ArrayBlockingQueue<>(capacity); this.inputCounter = inputCounter; this.outputCounter = outputCounter; this.abortedItemCounter = abortedItemCounter; + this.pipeName = pipeName; + } + + /** + * Get the name of this pipe + * + * @return the name of the pipe + */ + public String getPipeName() { + return pipeName; } @Override @@ -110,7 +123,7 @@ public class Pipe implements ReadPipe, WritePipe { } } } catch (final InterruptedException e) { - LOG.trace("Interrupted while waiting for next item", e); + LOG.trace("Interrupted while waiting for next item from pipe {}", pipeName); } return null; } @@ -140,7 +153,7 @@ public class Pipe implements ReadPipe, WritePipe { return; } } catch (final InterruptedException e) { - LOG.trace("Interrupted while waiting to add to output", e); + LOG.trace("Interrupted while waiting to add to output to pipe {}", pipeName); } } } diff --git a/services/pipeline/src/main/java/org/hyperledger/besu/services/pipeline/Pipeline.java b/services/pipeline/src/main/java/org/hyperledger/besu/services/pipeline/Pipeline.java index 7f37a4bac..507e87a8c 100644 --- a/services/pipeline/src/main/java/org/hyperledger/besu/services/pipeline/Pipeline.java +++ b/services/pipeline/src/main/java/org/hyperledger/besu/services/pipeline/Pipeline.java @@ -89,6 +89,19 @@ public class Pipeline { this.stages = stages; this.pipes = pipes; this.completerStage = completerStage; + + if (LOG.isTraceEnabled()) { + StringBuilder sb = new StringBuilder(); + sb.append("Building pipeline "); + sb.append(name); + sb.append(". Stages: "); + for (Stage nextStage : stages) { + sb.append(nextStage.getName()); + sb.append(" -> "); + } + sb.append("END"); + LOG.trace("{}", sb.toString()); + } } /** diff --git a/services/pipeline/src/main/java/org/hyperledger/besu/services/pipeline/PipelineBuilder.java b/services/pipeline/src/main/java/org/hyperledger/besu/services/pipeline/PipelineBuilder.java index 3bc6656e7..aaf68f5e3 100644 --- a/services/pipeline/src/main/java/org/hyperledger/besu/services/pipeline/PipelineBuilder.java +++ b/services/pipeline/src/main/java/org/hyperledger/besu/services/pipeline/PipelineBuilder.java @@ -421,6 +421,7 @@ public class PipelineBuilder { newBufferSize, outputCounter.labels(labelName, "added"), outputCounter.labels(labelName, "removed"), - outputCounter.labels(labelName, "aborted")); + outputCounter.labels(labelName, "aborted"), + stageName); } } diff --git a/services/pipeline/src/test/java/org/hyperledger/besu/services/pipeline/BatchingReadPipeTest.java b/services/pipeline/src/test/java/org/hyperledger/besu/services/pipeline/BatchingReadPipeTest.java index fb90128fb..da0908e81 100644 --- a/services/pipeline/src/test/java/org/hyperledger/besu/services/pipeline/BatchingReadPipeTest.java +++ b/services/pipeline/src/test/java/org/hyperledger/besu/services/pipeline/BatchingReadPipeTest.java @@ -31,7 +31,8 @@ import org.junit.jupiter.api.Test; public class BatchingReadPipeTest { - private final Pipe source = new Pipe<>(10, NO_OP_COUNTER, NO_OP_COUNTER, NO_OP_COUNTER); + private final Pipe source = + new Pipe<>(10, NO_OP_COUNTER, NO_OP_COUNTER, NO_OP_COUNTER, "source_pipe"); private final Counter batchCounter = mock(Counter.class); private final BatchingReadPipe batchingPipe = new BatchingReadPipe<>(source, 3, batchCounter); diff --git a/services/pipeline/src/test/java/org/hyperledger/besu/services/pipeline/CompleterStageTest.java b/services/pipeline/src/test/java/org/hyperledger/besu/services/pipeline/CompleterStageTest.java index ef3e29afe..ea4a81a9d 100644 --- a/services/pipeline/src/test/java/org/hyperledger/besu/services/pipeline/CompleterStageTest.java +++ b/services/pipeline/src/test/java/org/hyperledger/besu/services/pipeline/CompleterStageTest.java @@ -24,7 +24,8 @@ import org.junit.jupiter.api.Test; public class CompleterStageTest { - private final Pipe pipe = new Pipe<>(10, NO_OP_COUNTER, NO_OP_COUNTER, NO_OP_COUNTER); + private final Pipe pipe = + new Pipe<>(10, NO_OP_COUNTER, NO_OP_COUNTER, NO_OP_COUNTER, "test_pipe"); private final List output = new ArrayList<>(); private final CompleterStage stage = new CompleterStage<>("name", pipe, output::add); diff --git a/services/pipeline/src/test/java/org/hyperledger/besu/services/pipeline/FlatMapProcessorTest.java b/services/pipeline/src/test/java/org/hyperledger/besu/services/pipeline/FlatMapProcessorTest.java index 1012d3b01..4e3b8cfa5 100644 --- a/services/pipeline/src/test/java/org/hyperledger/besu/services/pipeline/FlatMapProcessorTest.java +++ b/services/pipeline/src/test/java/org/hyperledger/besu/services/pipeline/FlatMapProcessorTest.java @@ -28,8 +28,10 @@ import org.junit.jupiter.api.Test; public class FlatMapProcessorTest { - private final Pipe input = new Pipe<>(10, NO_OP_COUNTER, NO_OP_COUNTER, NO_OP_COUNTER); - private final Pipe output = new Pipe<>(10, NO_OP_COUNTER, NO_OP_COUNTER, NO_OP_COUNTER); + private final Pipe input = + new Pipe<>(10, NO_OP_COUNTER, NO_OP_COUNTER, NO_OP_COUNTER, "input_pipe"); + private final Pipe output = + new Pipe<>(10, NO_OP_COUNTER, NO_OP_COUNTER, NO_OP_COUNTER, "output_pipe"); @SuppressWarnings("unchecked") private final Function> mapper = mock(Function.class); diff --git a/services/pipeline/src/test/java/org/hyperledger/besu/services/pipeline/IteratorSourceStageTest.java b/services/pipeline/src/test/java/org/hyperledger/besu/services/pipeline/IteratorSourceStageTest.java index 02052615b..915a90b1f 100644 --- a/services/pipeline/src/test/java/org/hyperledger/besu/services/pipeline/IteratorSourceStageTest.java +++ b/services/pipeline/src/test/java/org/hyperledger/besu/services/pipeline/IteratorSourceStageTest.java @@ -22,7 +22,8 @@ import org.junit.jupiter.api.Test; public class IteratorSourceStageTest { - private final Pipe output = new Pipe<>(10, NO_OP_COUNTER, NO_OP_COUNTER, NO_OP_COUNTER); + private final Pipe output = + new Pipe<>(10, NO_OP_COUNTER, NO_OP_COUNTER, NO_OP_COUNTER, "output_pipe"); private final IteratorSourceStage stage = new IteratorSourceStage<>("name", Iterators.forArray("a", "b", "c", "d"), output); diff --git a/services/pipeline/src/test/java/org/hyperledger/besu/services/pipeline/MapProcessorTest.java b/services/pipeline/src/test/java/org/hyperledger/besu/services/pipeline/MapProcessorTest.java index 0d7a913c3..7698e8d32 100644 --- a/services/pipeline/src/test/java/org/hyperledger/besu/services/pipeline/MapProcessorTest.java +++ b/services/pipeline/src/test/java/org/hyperledger/besu/services/pipeline/MapProcessorTest.java @@ -27,8 +27,10 @@ import org.junit.jupiter.api.Test; public class MapProcessorTest { - private final Pipe input = new Pipe<>(10, NO_OP_COUNTER, NO_OP_COUNTER, NO_OP_COUNTER); - private final Pipe output = new Pipe<>(10, NO_OP_COUNTER, NO_OP_COUNTER, NO_OP_COUNTER); + private final Pipe input = + new Pipe<>(10, NO_OP_COUNTER, NO_OP_COUNTER, NO_OP_COUNTER, "intput_pipe"); + private final Pipe output = + new Pipe<>(10, NO_OP_COUNTER, NO_OP_COUNTER, NO_OP_COUNTER, "output_pipe"); @SuppressWarnings("unchecked") private final Function processor = mock(Function.class); diff --git a/services/pipeline/src/test/java/org/hyperledger/besu/services/pipeline/PipeTest.java b/services/pipeline/src/test/java/org/hyperledger/besu/services/pipeline/PipeTest.java index c838bc887..c4a7a88b5 100644 --- a/services/pipeline/src/test/java/org/hyperledger/besu/services/pipeline/PipeTest.java +++ b/services/pipeline/src/test/java/org/hyperledger/besu/services/pipeline/PipeTest.java @@ -30,7 +30,8 @@ public class PipeTest { private final Counter inputCounter = mock(Counter.class); private final Counter outputCounter = mock(Counter.class); private final Counter abortedItemCounter = mock(Counter.class); - private final Pipe pipe = new Pipe<>(5, inputCounter, outputCounter, abortedItemCounter); + private final Pipe pipe = + new Pipe<>(5, inputCounter, outputCounter, abortedItemCounter, "test_pipe"); @Test public void shouldNotHaveMoreWhenEmptyAndClosed() { diff --git a/services/pipeline/src/test/java/org/hyperledger/besu/services/pipeline/ProcessingStageTest.java b/services/pipeline/src/test/java/org/hyperledger/besu/services/pipeline/ProcessingStageTest.java index efbe16da6..a07530f54 100644 --- a/services/pipeline/src/test/java/org/hyperledger/besu/services/pipeline/ProcessingStageTest.java +++ b/services/pipeline/src/test/java/org/hyperledger/besu/services/pipeline/ProcessingStageTest.java @@ -34,9 +34,9 @@ import org.mockito.junit.jupiter.MockitoExtension; public class ProcessingStageTest { private final Pipe inputPipe = - new Pipe<>(10, NO_OP_COUNTER, NO_OP_COUNTER, NO_OP_COUNTER); + new Pipe<>(10, NO_OP_COUNTER, NO_OP_COUNTER, NO_OP_COUNTER, "input_pipe"); private final Pipe outputPipe = - new Pipe<>(10, NO_OP_COUNTER, NO_OP_COUNTER, NO_OP_COUNTER); + new Pipe<>(10, NO_OP_COUNTER, NO_OP_COUNTER, NO_OP_COUNTER, "output_pipe"); @Mock private Processor singleStep; private ProcessingStage stage; From 8d8dbf05b51ed4c3b1a18a4956ac9bdeb2fa2325 Mon Sep 17 00:00:00 2001 From: Chaminda Divitotawela Date: Wed, 3 Jul 2024 11:49:26 +1000 Subject: [PATCH 34/58] Turn off CicleCI for Besu (#7291) All the CI jobs run in GitHub actions and Circle CI it no longer needed in Besu project Signed-off-by: Chaminda Divitotawela --- .circleci/config.yml | 502 ------------------------------------------- 1 file changed, 502 deletions(-) delete mode 100644 .circleci/config.yml diff --git a/.circleci/config.yml b/.circleci/config.yml deleted file mode 100644 index 45aa3beb2..000000000 --- a/.circleci/config.yml +++ /dev/null @@ -1,502 +0,0 @@ ---- -version: 2.1 -orbs: - win: circleci/windows@5.0 - -executors: - besu_executor_med: # 2cpu, 4G ram - docker: - - image: cimg/openjdk:21.0 - resource_class: medium - working_directory: ~/project - environment: - architecture: "amd64" - GRADLE_OPTS: -Dorg.gradle.daemon=false -Dorg.gradle.parallel=true -Dorg.gradle.workers.max=2 - - besu_arm64_executor_med: # 2cpu, 8G ram - machine: #https://circleci.com/developer/machine/image/ubuntu-2204 - image: ubuntu-2204:2022.10.2 - resource_class: arm.medium - working_directory: ~/project - environment: - architecture: "arm64" - GRADLE_OPTS: -Dorg.gradle.daemon=false -Dorg.gradle.parallel=true -Dorg.gradle.workers.max=2 - - besu_executor_xl: # 8cpu, 16G ram - docker: - - image: cimg/openjdk:21.0 - resource_class: xlarge - working_directory: ~/project - environment: - GRADLE_OPTS: -Dorg.gradle.daemon=false -Dorg.gradle.parallel=true -Dorg.gradle.workers.max=4 - - xl_machine_executor: - machine: #https://circleci.com/developer/machine/image/ubuntu-2204 - image: ubuntu-2204:2022.10.2 - resource_class: xlarge - - trivy_executor: - docker: - - image: docker:stable-git - resource_class: small - working_directory: ~/project - -commands: - prepare: - description: "Prepare" - steps: - - checkout - - run: - name: Install Packages - LibSodium, nssdb - command: | - sudo apt-get update - sudo apt-get install -y libsodium23 libsodium-dev libjemalloc-dev apt-transport-https haveged libnss3-tools - sudo service haveged restart - java --version - - restore_gradle_cache - restore_gradle_cache: - description: "Restore Gradle cache" - steps: - - restore_cache: - name: Restore cached gradle dependencies - keys: - - deps-{{ checksum "gradle/versions.gradle" }}-{{ .Branch }}-{{ .Revision }} - - deps-{{ checksum "gradle/versions.gradle" }} - - deps- - - capture_test_results: - description: "Capture test results" - steps: - - run: - name: Jacoco - command: | - ./gradlew --no-daemon jacocoTestReport - - run: - name: Gather test results - when: always - command: | - FILES=`find . -name test-results` - for FILE in $FILES - do - MODULE=`echo "$FILE" | sed -e 's@./\(.*\)/build/test-results@\1@'` - TARGET="build/test-results/$MODULE" - mkdir -p "$TARGET" - cp -rf ${FILE}/*/* "$TARGET" - done - - store_test_results: - path: build/test-results - - store_artifacts: - path: besu/build/reports/jacoco - - capture_test_logs: - description: "Capture test logs" - steps: - - store_artifacts: - path: acceptance-tests/tests/build/acceptanceTestLogs - destination: acceptance-tests-logs - - store_artifacts: - path: acceptance-tests/tests/build/jvmErrorLogs - -jobs: - assemble: - executor: besu_executor_xl - steps: - - prepare - - run: - name: Assemble - command: | - ./gradlew --no-daemon clean compileJava compileTestJava assemble - - save_cache: - name: Caching gradle dependencies - key: deps-{{ checksum "gradle/versions.gradle" }}-{{ .Branch }}-{{ .Revision }} - paths: - - .gradle - - ~/.gradle - - persist_to_workspace: - root: ~/project - paths: - - ./ - - store_artifacts: - name: Distribution artifacts - path: build/distributions - destination: distributions - when: always - - testWindows: - executor: win/default - steps: - - attach_workspace: - at: ~/project - - run: - name: Unzip Windows build - no_output_timeout: 20m - command: | - cd build/distributions - unzip besu-*.zip -d besu-tmp - cd besu-tmp - mv besu-* ../besu - - run: - name: Test Besu Windows executable - no_output_timeout: 10m - command: | - build\distributions\besu\bin\besu.bat --help - build\distributions\besu\bin\besu.bat --version - - dockerScan: - executor: trivy_executor - steps: - - checkout - - restore_gradle_cache - - setup_remote_docker: - docker_layer_caching: true - - run: - name: Install trivy - command: | - apk add --update-cache --upgrade curl bash - curl -sfL https://raw.githubusercontent.com/aquasecurity/trivy/main/contrib/install.sh | sh -s -- -b /usr/local/bin - - run: - name: Scan with trivy - shell: /bin/sh - command: | - for FILE in $(ls docker) - do - if [[ $FILE == "test.sh" || $FILE == "tests" ]]; then - continue - fi - docker pull -q "hyperledger/besu:develop-$FILE" - trivy -q image --exit-code 1 --no-progress --severity HIGH,CRITICAL "hyperledger/besu:develop-$FILE" - done - - unitTests: - executor: besu_executor_xl - steps: - - prepare - - attach_workspace: - at: ~/project - - run: - name: Build - no_output_timeout: 20m - command: | - ./gradlew --no-daemon build - - capture_test_results - - integrationTests: - executor: xl_machine_executor # needs the machine executor since privacy test uses container tests (docker) - steps: - - prepare - - attach_workspace: - at: ~/project - - run: - name: IntegrationTests - command: | - ./gradlew --no-daemon integrationTest - - run: - name: CompileJmh - command: | - ./gradlew --no-daemon compileJmh - - capture_test_results - - referenceTests: - executor: besu_executor_xl - steps: - - prepare - - attach_workspace: - at: ~/project - - run: - name: ReferenceTests - no_output_timeout: 40m - command: | - git submodule update --init --recursive - ./gradlew --no-daemon referenceTest - - capture_test_results - - acceptanceTests: - parallelism: 4 - executor: xl_machine_executor # needs the machine executor since privacy test uses container tests (docker) - steps: - - prepare - - attach_workspace: - at: ~/project - - run: - name: AcceptanceTests (Mainnet) - no_output_timeout: 20m - command: | - CLASSNAMES=$(circleci tests glob "acceptance-tests/tests/src/test/java/**/*.java" \ - | sed 's@.*/src/test/java/@@' \ - | sed 's@/@.@g' \ - | sed 's/.\{5\}$//' \ - | circleci tests split --split-by=timings --timings-type=classname) - # Format the arguments to "./gradlew test" - GRADLE_ARGS=$(echo $CLASSNAMES | awk '{for (i=1; i<=NF; i++) print "--tests",$i}') - ./gradlew --no-daemon acceptanceTestMainnet $GRADLE_ARGS - - capture_test_results - - capture_test_logs - - acceptanceTestsCliqueBft: - executor: besu_executor_med - steps: - - prepare - - attach_workspace: - at: ~/project - - run: - name: AcceptanceTests (Non-Mainnet) - no_output_timeout: 30m - command: | - ./gradlew --no-daemon --max-workers=1 acceptanceTestCliqueBft - - capture_test_results - - capture_test_logs - - acceptanceTestsPrivacy: - parallelism: 4 - executor: xl_machine_executor # needs the machine executor since it uses container tests (docker) - steps: - - prepare - - attach_workspace: - at: ~/project - - run: - name: AcceptanceTests (Non-Mainnet) - no_output_timeout: 20m - command: | - CLASSNAMES=$(circleci tests glob "acceptance-tests/tests/src/test/java/**/*.java" \ - | sed 's@.*/src/test/java/@@' \ - | sed 's@/@.@g' \ - | sed 's/.\{5\}$//' \ - | circleci tests split --split-by=timings --timings-type=classname) - # Format the arguments to "./gradlew test" - GRADLE_ARGS=$(echo $CLASSNAMES | awk '{for (i=1; i<=NF; i++) print "--tests",$i}') - ./gradlew --no-daemon acceptanceTestPrivacy $GRADLE_ARGS - - capture_test_results - - capture_test_logs - - acceptanceTestsPermissioning: - executor: besu_executor_med - steps: - - prepare - - attach_workspace: - at: ~/project - - run: - name: AcceptanceTests (Non-Mainnet) - no_output_timeout: 20m - command: | - ./gradlew --no-daemon --max-workers=1 acceptanceTestPermissioning - - capture_test_results - - capture_test_logs - - buildDocker: - executor: besu_executor_med - steps: - - prepare - - attach_workspace: - at: ~/project - - setup_remote_docker - - run: - name: hadoLint_openjdk_17 - command: | - docker run --rm -i hadolint/hadolint < docker/openjdk-17/Dockerfile - - run: - name: hadoLint_openjdk_17_debug - command: | - docker run --rm -i hadolint/hadolint < docker/openjdk-17-debug/Dockerfile - - run: - name: hadoLint_openjdk_latest - command: | - docker run --rm -i hadolint/hadolint < docker/openjdk-latest/Dockerfile - - run: - name: hadoLint_graalvm - command: | - docker run --rm -i hadolint/hadolint < docker/graalvm/Dockerfile - - run: - name: build image - command: | - ./gradlew --no-daemon distDocker - - run: - name: test image - command: | - mkdir -p docker/reports - curl -L https://github.com/aelsabbahy/goss/releases/download/v0.3.9/goss-linux-amd64 -o ./docker/tests/goss-linux-amd64 - ./gradlew --no-daemon testDocker - - buildArm64Docker: - executor: besu_arm64_executor_med - steps: - - prepare - - attach_workspace: - at: ~/project - - run: - name: hadoLint_openjdk_17 - command: | - docker run --rm -i hadolint/hadolint < docker/openjdk-17/Dockerfile - - run: - name: hadoLint_openjdk_latest - command: | - docker run --rm -i hadolint/hadolint < docker/openjdk-latest/Dockerfile - - run: - name: hadoLint_graalvm - command: | - docker run --rm -i hadolint/hadolint < docker/graalvm/Dockerfile - - run: - name: Java_17 - command: | - sudo apt install -q --assume-yes openjdk-17-jre-headless openjdk-17-jdk-headless - sudo update-java-alternatives -a - - run: - name: build image - command: | - ./gradlew --no-daemon distDocker - - run: - name: test image - command: | - mkdir -p docker/reports - curl -L https://github.com/aelsabbahy/goss/releases/download/v0.3.9/goss-linux-arm -o ./docker/tests/goss-linux-arm64 - ./gradlew --no-daemon testDocker - - publish: - executor: besu_executor_med - steps: - - prepare - - attach_workspace: - at: ~/project - - run: - name: Publish - command: | - ./gradlew --no-daemon artifactoryPublish - - publishDocker: - executor: besu_executor_med - steps: - - prepare - - attach_workspace: - at: ~/project - - setup_remote_docker - - run: - name: Publish Docker - command: | - docker login --username "${DOCKER_USER_RW}" --password "${DOCKER_PASSWORD_RW}" - ./gradlew --no-daemon "-Pbranch=${CIRCLE_BRANCH}" dockerUpload - - publishArm64Docker: - executor: besu_arm64_executor_med - steps: - - prepare - - attach_workspace: - at: ~/project - - run: - name: Java_17 - command: | - sudo apt install -q --assume-yes openjdk-17-jre-headless openjdk-17-jdk-headless - sudo update-java-alternatives -a - - run: - name: Publish Docker - command: | - docker login --username "${DOCKER_USER_RW}" --password "${DOCKER_PASSWORD_RW}" - ./gradlew --no-daemon "-Pbranch=${CIRCLE_BRANCH}" dockerUpload - manifestDocker: - executor: besu_executor_med - steps: - - prepare - - setup_remote_docker - - run: - name: Create and publish docker manifest - command: | - docker login --username "${DOCKER_USER_RW}" --password "${DOCKER_PASSWORD_RW}" - ./gradlew --no-daemon "-Pbranch=${CIRCLE_BRANCH}" --parallel manifestDocker - -workflows: - version: 2 - default: - jobs: - - assemble - - unitTests: - requires: - - assemble - - testWindows: - requires: - - assemble - - referenceTests: - requires: - - assemble - - integrationTests: - requires: - - assemble - - acceptanceTests: - requires: - - assemble - - acceptanceTestsCliqueBft: - requires: - - assemble - - acceptanceTests - - acceptanceTestsPermissioning: - requires: - - assemble - - buildDocker: - requires: - - assemble - - buildArm64Docker: - requires: - - buildDocker - - assemble - - publish: - filters: - branches: - only: - - main - - /^release-.*/ - requires: - - assemble - - integrationTests - - unitTests - - acceptanceTests - - referenceTests - - buildDocker - - publishDocker: - filters: - branches: - only: - - main - - /^release-.*/ - requires: - - assemble - - integrationTests - - unitTests - - acceptanceTests - - referenceTests - - buildDocker - context: - - besu-dockerhub-rw - - publishArm64Docker: - filters: - branches: - only: - - main - - /^release-.*/ - requires: - - integrationTests - - unitTests - - acceptanceTests - - referenceTests - - buildArm64Docker - context: - - besu-dockerhub-rw - - manifestDocker: - filters: - branches: - only: - - main - - /^release-.*/ - requires: - - publishDocker - - publishArm64Docker - context: - - besu-dockerhub-rw - - nightly: - triggers: - - schedule: - cron: "0 19 * * *" - filters: - branches: - only: - - main - jobs: - - assemble - - dockerScan From 8a9a84ad58fa5930208ec8da63c3f0f25f858d98 Mon Sep 17 00:00:00 2001 From: Stefan Pingel <16143240+pinges@users.noreply.github.com> Date: Wed, 3 Jul 2024 15:17:13 +1000 Subject: [PATCH 35/58] Check for snap server (#6609) * EthPeer add isServingSnap to be able to make sure that we have enough snap servers connected when we are snap syncing Signed-off-by: stefan.pingel@consensys.net Signed-off-by: Sally MacFarlane Co-authored-by: Sally MacFarlane --- .../org/hyperledger/besu/RunnerBuilder.java | 10 +- .../controller/BesuControllerBuilder.java | 36 +- ...onsensusScheduleBesuControllerBuilder.java | 7 +- .../MergeBesuControllerBuilder.java | 7 +- .../TransitionBesuControllerBuilder.java | 27 +- .../bft/protocol/BftProtocolManager.java | 6 - .../besu/ethereum/forkid/ForkIdManager.java | 6 +- .../besu/ethereum/eth/manager/EthPeer.java | 20 +- .../besu/ethereum/eth/manager/EthPeers.java | 375 +++++++++++++----- .../eth/manager/EthProtocolManager.java | 63 +-- .../ethereum/eth/manager/PeerRequest.java | 4 + .../eth/manager/PendingPeerRequest.java | 1 + .../snap/GetAccountRangeFromPeerTask.java | 39 +- .../manager/snap/GetBytecodeFromPeerTask.java | 32 +- .../snap/GetStorageRangeFromPeerTask.java | 41 +- .../manager/snap/GetTrieNodeFromPeerTask.java | 31 +- .../RetryingGetAccountRangeFromPeerTask.java | 6 + .../snap/RetryingGetBytecodeFromPeerTask.java | 5 + .../RetryingGetStorageRangeFromPeerTask.java | 5 + .../snap/RetryingGetTrieNodeFromPeerTask.java | 5 + .../eth/manager/snap/SnapProtocolManager.java | 6 - .../task/AbstractRetryingPeerTask.java | 20 +- .../AbstractRetryingSwitchingPeerTask.java | 17 +- .../ethereum/eth/sync/ChainHeadTracker.java | 75 ++-- .../eth/sync/DefaultSynchronizer.java | 7 +- .../ethereum/eth/sync/SnapServerChecker.java | 86 ++++ .../besu/ethereum/eth/sync/SyncMode.java | 4 + .../eth/sync/fastsync/SyncTargetManager.java | 9 +- .../ethereum/eth/manager/EthPeersTest.java | 89 ++++- .../eth/manager/EthProtocolManagerTest.java | 9 +- .../manager/EthProtocolManagerTestUtil.java | 69 +++- .../eth/manager/RespondingEthPeer.java | 36 +- .../ethtaskutils/AbstractMessageTaskTest.java | 7 +- .../AbstractBlockPropagationManagerTest.java | 11 +- .../eth/sync/ChainHeadTrackerTest.java | 6 +- .../fastsync/PivotBlockRetrieverTest.java | 6 +- .../ethereum/eth/transactions/TestNode.java | 28 +- .../TransactionPoolFactoryTest.java | 9 +- .../ethereum/p2p/network/NetworkRunner.java | 19 +- .../ethereum/p2p/network/ProtocolManager.java | 10 - .../rlpx/wire/messages/DisconnectMessage.java | 4 +- .../ethereum/retesteth/RetestethContext.java | 7 +- 42 files changed, 942 insertions(+), 318 deletions(-) create mode 100644 ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/sync/SnapServerChecker.java diff --git a/besu/src/main/java/org/hyperledger/besu/RunnerBuilder.java b/besu/src/main/java/org/hyperledger/besu/RunnerBuilder.java index e9f9ef626..7ed627cfc 100644 --- a/besu/src/main/java/org/hyperledger/besu/RunnerBuilder.java +++ b/besu/src/main/java/org/hyperledger/besu/RunnerBuilder.java @@ -688,13 +688,14 @@ public class RunnerBuilder { .map(nodePerms -> PeerPermissions.combine(nodePerms, defaultPeerPermissions)) .orElse(defaultPeerPermissions); + final EthPeers ethPeers = besuController.getEthPeers(); + LOG.info("Detecting NAT service."); final boolean fallbackEnabled = natMethod == NatMethod.AUTO || natMethodFallbackEnabled; final NatService natService = new NatService(buildNatManager(natMethod), fallbackEnabled); final NetworkBuilder inactiveNetwork = caps -> new NoopP2PNetwork(); final NetworkBuilder activeNetwork = caps -> { - final EthPeers ethPeers = besuController.getEthPeers(); return DefaultP2PNetwork.builder() .vertx(vertx) .nodeKey(nodeKey) @@ -709,8 +710,8 @@ public class RunnerBuilder { .blockchain(context.getBlockchain()) .blockNumberForks(besuController.getGenesisConfigOptions().getForkBlockNumbers()) .timestampForks(besuController.getGenesisConfigOptions().getForkBlockTimestamps()) - .allConnectionsSupplier(ethPeers::getAllConnections) - .allActiveConnectionsSupplier(ethPeers::getAllActiveConnections) + .allConnectionsSupplier(ethPeers::streamAllConnections) + .allActiveConnectionsSupplier(ethPeers::streamAllActiveConnections) .maxPeers(ethPeers.getMaxPeers()) .build(); }; @@ -721,9 +722,10 @@ public class RunnerBuilder { .subProtocols(subProtocols) .network(p2pEnabled ? activeNetwork : inactiveNetwork) .metricsSystem(metricsSystem) + .ethPeersShouldConnect(ethPeers::shouldTryToConnect) .build(); - besuController.getEthPeers().setRlpxAgent(networkRunner.getRlpxAgent()); + ethPeers.setRlpxAgent(networkRunner.getRlpxAgent()); final P2PNetwork network = networkRunner.getNetwork(); // ForkId in Ethereum Node Record needs updating when we transition to a new protocol spec diff --git a/besu/src/main/java/org/hyperledger/besu/controller/BesuControllerBuilder.java b/besu/src/main/java/org/hyperledger/besu/controller/BesuControllerBuilder.java index ac0fa25fd..6123535f6 100644 --- a/besu/src/main/java/org/hyperledger/besu/controller/BesuControllerBuilder.java +++ b/besu/src/main/java/org/hyperledger/besu/controller/BesuControllerBuilder.java @@ -46,7 +46,6 @@ import org.hyperledger.besu.ethereum.core.BlockHeader; import org.hyperledger.besu.ethereum.core.Difficulty; import org.hyperledger.besu.ethereum.core.MiningParameters; import org.hyperledger.besu.ethereum.core.PrivacyParameters; -import org.hyperledger.besu.ethereum.core.Synchronizer; import org.hyperledger.besu.ethereum.eth.EthProtocol; import org.hyperledger.besu.ethereum.eth.EthProtocolConfiguration; import org.hyperledger.besu.ethereum.eth.SnapProtocol; @@ -77,6 +76,7 @@ import org.hyperledger.besu.ethereum.eth.transactions.BlobCache; import org.hyperledger.besu.ethereum.eth.transactions.TransactionPool; import org.hyperledger.besu.ethereum.eth.transactions.TransactionPoolConfiguration; import org.hyperledger.besu.ethereum.eth.transactions.TransactionPoolFactory; +import org.hyperledger.besu.ethereum.forkid.ForkIdManager; import org.hyperledger.besu.ethereum.mainnet.ProtocolSchedule; import org.hyperledger.besu.ethereum.mainnet.ProtocolSpec; import org.hyperledger.besu.ethereum.p2p.config.NetworkingConfiguration; @@ -604,6 +604,12 @@ public abstract class BesuControllerBuilder implements MiningParameterOverrides final int maxMessageSize = ethereumWireProtocolConfiguration.getMaxMessageSize(); final Supplier currentProtocolSpecSupplier = () -> protocolSchedule.getByBlockHeader(blockchain.getChainHeadHeader()); + final ForkIdManager forkIdManager = + new ForkIdManager( + blockchain, + genesisConfigOptions.getForkBlockNumbers(), + genesisConfigOptions.getForkBlockTimestamps(), + ethereumWireProtocolConfiguration.isLegacyEth64ForkIdEnabled()); final EthPeers ethPeers = new EthPeers( getSupportedProtocol(), @@ -615,7 +621,9 @@ public abstract class BesuControllerBuilder implements MiningParameterOverrides nodeKey.getPublicKey().getEncodedBytes(), maxPeers, maxRemotelyInitiatedPeers, - randomPeerPriority); + randomPeerPriority, + syncConfig.getSyncMode(), + forkIdManager); final EthMessages ethMessages = new EthMessages(); final EthMessages snapMessages = new EthMessages(); @@ -681,13 +689,14 @@ public abstract class BesuControllerBuilder implements MiningParameterOverrides ethMessages, scheduler, peerValidators, - Optional.empty()); + Optional.empty(), + forkIdManager); final PivotBlockSelector pivotBlockSelector = createPivotSelector( protocolSchedule, protocolContext, ethContext, syncState, metricsSystem, blockchain); - final Synchronizer synchronizer = + final DefaultSynchronizer synchronizer = createSynchronizer( protocolSchedule, worldStateStorageCoordinator, @@ -697,6 +706,16 @@ public abstract class BesuControllerBuilder implements MiningParameterOverrides ethProtocolManager, pivotBlockSelector); + ethPeers.setTrailingPeerRequirementsSupplier(synchronizer::calculateTrailingPeerRequirements); + + if (SyncMode.isSnapSync(syncConfig.getSyncMode()) + || SyncMode.isCheckpointSync(syncConfig.getSyncMode())) { + synchronizer.subscribeInSync((b) -> ethPeers.snapServerPeersNeeded(!b)); + ethPeers.snapServerPeersNeeded(true); + } else { + ethPeers.snapServerPeersNeeded(false); + } + protocolContext.setSynchronizer(Optional.of(synchronizer)); final Optional maybeSnapProtocolManager = @@ -809,7 +828,7 @@ public abstract class BesuControllerBuilder implements MiningParameterOverrides * @param pivotBlockSelector the pivot block selector * @return the synchronizer */ - protected Synchronizer createSynchronizer( + protected DefaultSynchronizer createSynchronizer( final ProtocolSchedule protocolSchedule, final WorldStateStorageCoordinator worldStateStorageCoordinator, final ProtocolContext protocolContext, @@ -1000,6 +1019,7 @@ public abstract class BesuControllerBuilder implements MiningParameterOverrides * @param scheduler the scheduler * @param peerValidators the peer validators * @param mergePeerFilter the merge peer filter + * @param forkIdManager the fork id manager * @return the eth protocol manager */ protected EthProtocolManager createEthProtocolManager( @@ -1012,7 +1032,8 @@ public abstract class BesuControllerBuilder implements MiningParameterOverrides final EthMessages ethMessages, final EthScheduler scheduler, final List peerValidators, - final Optional mergePeerFilter) { + final Optional mergePeerFilter, + final ForkIdManager forkIdManager) { return new EthProtocolManager( protocolContext.getBlockchain(), networkId, @@ -1026,8 +1047,7 @@ public abstract class BesuControllerBuilder implements MiningParameterOverrides mergePeerFilter, synchronizerConfiguration, scheduler, - genesisConfigOptions.getForkBlockNumbers(), - genesisConfigOptions.getForkBlockTimestamps()); + forkIdManager); } /** diff --git a/besu/src/main/java/org/hyperledger/besu/controller/ConsensusScheduleBesuControllerBuilder.java b/besu/src/main/java/org/hyperledger/besu/controller/ConsensusScheduleBesuControllerBuilder.java index d138c96a2..af59a7625 100644 --- a/besu/src/main/java/org/hyperledger/besu/controller/ConsensusScheduleBesuControllerBuilder.java +++ b/besu/src/main/java/org/hyperledger/besu/controller/ConsensusScheduleBesuControllerBuilder.java @@ -49,6 +49,7 @@ import org.hyperledger.besu.ethereum.eth.sync.SynchronizerConfiguration; import org.hyperledger.besu.ethereum.eth.sync.state.SyncState; import org.hyperledger.besu.ethereum.eth.transactions.TransactionPool; import org.hyperledger.besu.ethereum.eth.transactions.TransactionPoolConfiguration; +import org.hyperledger.besu.ethereum.forkid.ForkIdManager; import org.hyperledger.besu.ethereum.mainnet.ProtocolSchedule; import org.hyperledger.besu.ethereum.p2p.config.SubProtocolConfiguration; import org.hyperledger.besu.ethereum.storage.StorageProvider; @@ -242,7 +243,8 @@ public class ConsensusScheduleBesuControllerBuilder extends BesuControllerBuilde final EthMessages ethMessages, final EthScheduler scheduler, final List peerValidators, - final Optional mergePeerFilter) { + final Optional mergePeerFilter, + final ForkIdManager forkIdManager) { return besuControllerBuilderSchedule .get(0L) .createEthProtocolManager( @@ -255,7 +257,8 @@ public class ConsensusScheduleBesuControllerBuilder extends BesuControllerBuilde ethMessages, scheduler, peerValidators, - mergePeerFilter); + mergePeerFilter, + forkIdManager); } @Override diff --git a/besu/src/main/java/org/hyperledger/besu/controller/MergeBesuControllerBuilder.java b/besu/src/main/java/org/hyperledger/besu/controller/MergeBesuControllerBuilder.java index 1e8da674a..cdd46ea5b 100644 --- a/besu/src/main/java/org/hyperledger/besu/controller/MergeBesuControllerBuilder.java +++ b/besu/src/main/java/org/hyperledger/besu/controller/MergeBesuControllerBuilder.java @@ -41,6 +41,7 @@ import org.hyperledger.besu.ethereum.eth.sync.backwardsync.BackwardChain; import org.hyperledger.besu.ethereum.eth.sync.backwardsync.BackwardSyncContext; import org.hyperledger.besu.ethereum.eth.sync.state.SyncState; import org.hyperledger.besu.ethereum.eth.transactions.TransactionPool; +import org.hyperledger.besu.ethereum.forkid.ForkIdManager; import org.hyperledger.besu.ethereum.mainnet.ProtocolSchedule; import org.hyperledger.besu.ethereum.mainnet.ScheduleBasedBlockHeaderFunctions; import org.hyperledger.besu.ethereum.worldstate.WorldStateArchive; @@ -97,7 +98,8 @@ public class MergeBesuControllerBuilder extends BesuControllerBuilder { final EthMessages ethMessages, final EthScheduler scheduler, final List peerValidators, - final Optional mergePeerFilter) { + final Optional mergePeerFilter, + final ForkIdManager forkIdManager) { var mergeContext = protocolContext.getConsensusContext(MergeContext.class); @@ -126,7 +128,8 @@ public class MergeBesuControllerBuilder extends BesuControllerBuilder { ethMessages, scheduler, peerValidators, - filterToUse); + filterToUse, + forkIdManager); return ethProtocolManager; } diff --git a/besu/src/main/java/org/hyperledger/besu/controller/TransitionBesuControllerBuilder.java b/besu/src/main/java/org/hyperledger/besu/controller/TransitionBesuControllerBuilder.java index a2f52c90e..4f084f3c1 100644 --- a/besu/src/main/java/org/hyperledger/besu/controller/TransitionBesuControllerBuilder.java +++ b/besu/src/main/java/org/hyperledger/besu/controller/TransitionBesuControllerBuilder.java @@ -33,7 +33,6 @@ import org.hyperledger.besu.ethereum.chain.Blockchain; import org.hyperledger.besu.ethereum.chain.MutableBlockchain; import org.hyperledger.besu.ethereum.core.MiningParameters; import org.hyperledger.besu.ethereum.core.PrivacyParameters; -import org.hyperledger.besu.ethereum.core.Synchronizer; import org.hyperledger.besu.ethereum.eth.EthProtocolConfiguration; import org.hyperledger.besu.ethereum.eth.manager.EthContext; import org.hyperledger.besu.ethereum.eth.manager.EthMessages; @@ -49,6 +48,7 @@ import org.hyperledger.besu.ethereum.eth.sync.backwardsync.BackwardSyncContext; import org.hyperledger.besu.ethereum.eth.sync.state.SyncState; import org.hyperledger.besu.ethereum.eth.transactions.TransactionPool; import org.hyperledger.besu.ethereum.eth.transactions.TransactionPoolConfiguration; +import org.hyperledger.besu.ethereum.forkid.ForkIdManager; import org.hyperledger.besu.ethereum.mainnet.ProtocolSchedule; import org.hyperledger.besu.ethereum.storage.StorageProvider; import org.hyperledger.besu.ethereum.worldstate.DataStorageConfiguration; @@ -156,7 +156,8 @@ public class TransitionBesuControllerBuilder extends BesuControllerBuilder { final EthMessages ethMessages, final EthScheduler scheduler, final List peerValidators, - final Optional mergePeerFilter) { + final Optional mergePeerFilter, + final ForkIdManager forkIdManager) { return mergeBesuControllerBuilder.createEthProtocolManager( protocolContext, synchronizerConfiguration, @@ -167,7 +168,8 @@ public class TransitionBesuControllerBuilder extends BesuControllerBuilder { ethMessages, scheduler, peerValidators, - mergePeerFilter); + mergePeerFilter, + forkIdManager); } @Override @@ -212,7 +214,7 @@ public class TransitionBesuControllerBuilder extends BesuControllerBuilder { } @Override - protected Synchronizer createSynchronizer( + protected DefaultSynchronizer createSynchronizer( final ProtocolSchedule protocolSchedule, final WorldStateStorageCoordinator worldStateStorageCoordinator, final ProtocolContext protocolContext, @@ -222,15 +224,14 @@ public class TransitionBesuControllerBuilder extends BesuControllerBuilder { final PivotBlockSelector pivotBlockSelector) { DefaultSynchronizer sync = - (DefaultSynchronizer) - super.createSynchronizer( - protocolSchedule, - worldStateStorageCoordinator, - protocolContext, - ethContext, - syncState, - ethProtocolManager, - pivotBlockSelector); + super.createSynchronizer( + protocolSchedule, + worldStateStorageCoordinator, + protocolContext, + ethContext, + syncState, + ethProtocolManager, + pivotBlockSelector); if (genesisConfigOptions.getTerminalTotalDifficulty().isPresent()) { LOG.info( diff --git a/consensus/common/src/main/java/org/hyperledger/besu/consensus/common/bft/protocol/BftProtocolManager.java b/consensus/common/src/main/java/org/hyperledger/besu/consensus/common/bft/protocol/BftProtocolManager.java index 0ef72f95e..0c0dd5f67 100644 --- a/consensus/common/src/main/java/org/hyperledger/besu/consensus/common/bft/protocol/BftProtocolManager.java +++ b/consensus/common/src/main/java/org/hyperledger/besu/consensus/common/bft/protocol/BftProtocolManager.java @@ -20,7 +20,6 @@ import org.hyperledger.besu.consensus.common.bft.events.BftEvents; import org.hyperledger.besu.consensus.common.bft.network.PeerConnectionTracker; import org.hyperledger.besu.datatypes.Address; import org.hyperledger.besu.ethereum.p2p.network.ProtocolManager; -import org.hyperledger.besu.ethereum.p2p.peers.Peer; import org.hyperledger.besu.ethereum.p2p.rlpx.connections.PeerConnection; import org.hyperledger.besu.ethereum.p2p.rlpx.wire.Capability; import org.hyperledger.besu.ethereum.p2p.rlpx.wire.Message; @@ -108,11 +107,6 @@ public class BftProtocolManager implements ProtocolManager { peers.add(peerConnection); } - @Override - public boolean shouldConnect(final Peer peer, final boolean incoming) { - return false; // for now the EthProtocolManager takes care of this - } - @Override public void handleDisconnect( final PeerConnection peerConnection, diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/forkid/ForkIdManager.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/forkid/ForkIdManager.java index bae8cfc33..859fb918a 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/forkid/ForkIdManager.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/forkid/ForkIdManager.java @@ -58,7 +58,11 @@ public class ForkIdManager { checkNotNull(blockchain); checkNotNull(blockNumberForks); this.chainHeadSupplier = blockchain::getChainHeadHeader; - this.genesisHash = blockchain.getGenesisBlock().getHash(); + try { + this.genesisHash = blockchain.getGenesisBlock().getHash(); + } catch (Exception e) { + throw new RuntimeException(e); + } this.blockNumbersForkIds = new ArrayList<>(); this.timestampsForkIds = new ArrayList<>(); this.legacyEth64 = legacyEth64; diff --git a/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/manager/EthPeer.java b/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/manager/EthPeer.java index e0f0517f1..8cc907d68 100644 --- a/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/manager/EthPeer.java +++ b/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/manager/EthPeer.java @@ -103,6 +103,7 @@ public class EthPeer implements Comparable { private final PeerReputation reputation = new PeerReputation(); private final Map validationStatus = new ConcurrentHashMap<>(); private final Bytes id; + private boolean isServingSnap = false; private static final Map roundMessages; @@ -393,6 +394,14 @@ public class EthPeer implements Comparable { requestManagers.get(SnapProtocol.NAME).get(SnapV1.GET_TRIE_NODES), getTrieNodes); } + public void setIsServingSnap(final boolean isServingSnap) { + this.isServingSnap = isServingSnap; + } + + public boolean isServingSnap() { + return isServingSnap; + } + private RequestManager.ResponseStream sendRequest( final RequestManager requestManager, final MessageData messageData) throws PeerNotConnected { lastRequestTimestamp = clock.millis(); @@ -582,9 +591,9 @@ public class EthPeer implements Comparable { } /** - * Return A read-only snapshot of this peer's current {@code chainState} } + * Return A read-only snapshot of this peer's current {@code chainState} * - * @return A read-only snapshot of this peer's current {@code chainState} } + * @return A read-only snapshot of this peer's current {@code chainState} */ public ChainHeadEstimate chainStateSnapshot() { return chainHeadState.getSnapshot(); @@ -629,14 +638,17 @@ public class EthPeer implements Comparable { @Override public String toString() { return String.format( - "PeerId: %s %s, validated? %s, disconnected? %s, client: %s, %s, %s", + "PeerId: %s %s, validated? %s, disconnected? %s, client: %s, %s, %s, isServingSnap %s, has height %s, connected for %s ms", getLoggableId(), reputation, isFullyValidated(), isDisconnected(), connection.getPeerInfo().getClientId(), connection, - connection.getPeer().getEnodeURLString()); + connection.getPeer().getEnodeURLString(), + isServingSnap, + chainHeadState.getEstimatedHeight(), + System.currentTimeMillis() - connection.getInitiatedAt()); } @Nonnull diff --git a/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/manager/EthPeers.java b/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/manager/EthPeers.java index bef7a1a03..851c07529 100644 --- a/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/manager/EthPeers.java +++ b/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/manager/EthPeers.java @@ -14,8 +14,16 @@ */ package org.hyperledger.besu.ethereum.eth.manager; +import org.hyperledger.besu.ethereum.core.BlockHeader; +import org.hyperledger.besu.ethereum.eth.SnapProtocol; import org.hyperledger.besu.ethereum.eth.manager.EthPeer.DisconnectCallback; import org.hyperledger.besu.ethereum.eth.peervalidation.PeerValidator; +import org.hyperledger.besu.ethereum.eth.sync.ChainHeadTracker; +import org.hyperledger.besu.ethereum.eth.sync.SnapServerChecker; +import org.hyperledger.besu.ethereum.eth.sync.SyncMode; +import org.hyperledger.besu.ethereum.eth.sync.TrailingPeerRequirements; +import org.hyperledger.besu.ethereum.forkid.ForkId; +import org.hyperledger.besu.ethereum.forkid.ForkIdManager; import org.hyperledger.besu.ethereum.mainnet.ProtocolSpec; import org.hyperledger.besu.ethereum.p2p.peers.Peer; import org.hyperledger.besu.ethereum.p2p.rlpx.RlpxAgent; @@ -35,8 +43,10 @@ import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Optional; +import java.util.concurrent.CompletableFuture; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.CopyOnWriteArrayList; +import java.util.concurrent.TimeUnit; import java.util.function.Predicate; import java.util.function.Supplier; import java.util.stream.Collectors; @@ -72,7 +82,7 @@ public class EthPeers { public static final int NODE_ID_LENGTH = 64; public static final int USEFULL_PEER_SCORE_THRESHOLD = 102; - private final Map completeConnections = new ConcurrentHashMap<>(); + private final Map activeConnections = new ConcurrentHashMap<>(); private final Cache incompleteConnections = CacheBuilder.newBuilder() @@ -92,12 +102,22 @@ public class EthPeers { private final Boolean randomPeerPriority; private final Bytes nodeIdMask = Bytes.random(NODE_ID_LENGTH); private final Supplier currentProtocolSpecSupplier; + private final SyncMode syncMode; + private final ForkIdManager forkIdManager; + private final int snapServerTargetNumber; + private final boolean shouldLimitRemoteConnections; private Comparator bestPeerComparator; private final Bytes localNodeId; private RlpxAgent rlpxAgent; private final Counter connectedPeersCounter; + // private List protocolManagers; + private ChainHeadTracker tracker; + private SnapServerChecker snapServerChecker; + private boolean snapServerPeersNeeded = false; + private Supplier trailingPeerRequirementsSupplier = + () -> TrailingPeerRequirements.UNRESTRICTED; public EthPeers( final String protocolName, @@ -109,7 +129,9 @@ public class EthPeers { final Bytes localNodeId, final int peerUpperBound, final int maxRemotelyInitiatedConnections, - final Boolean randomPeerPriority) { + final Boolean randomPeerPriority, + final SyncMode syncMode, + final ForkIdManager forkIdManager) { this.protocolName = protocolName; this.currentProtocolSpecSupplier = currentProtocolSpecSupplier; this.clock = clock; @@ -121,11 +143,22 @@ public class EthPeers { this.maxRemotelyInitiatedConnections = maxRemotelyInitiatedConnections; this.randomPeerPriority = randomPeerPriority; LOG.trace("MaxPeers: {}, Max Remote: {}", peerUpperBound, maxRemotelyInitiatedConnections); + this.syncMode = syncMode; + this.forkIdManager = forkIdManager; + this.snapServerTargetNumber = + peerUpperBound / 2; // 50% of peers should be snap servers while snap syncing + this.shouldLimitRemoteConnections = maxRemotelyInitiatedConnections < peerUpperBound; + metricsSystem.createIntegerGauge( BesuMetricCategory.ETHEREUM, "peer_count", "The current number of peers connected", - () -> (int) streamAvailablePeers().filter(p -> p.readyForRequests()).count()); + activeConnections::size); + metricsSystem.createIntegerGauge( + BesuMetricCategory.ETHEREUM, + "peer_count_snap_server", + "The current number of peers connected that serve snap data", + () -> (int) streamAvailablePeers().filter(EthPeer::isServingSnap).count()); metricsSystem.createIntegerGauge( BesuMetricCategory.PEERS, "pending_peer_requests_current", @@ -146,7 +179,7 @@ public class EthPeers { final PeerConnection newConnection, final List peerValidators) { final Bytes id = newConnection.getPeer().getId(); synchronized (this) { - EthPeer ethPeer = completeConnections.get(id); + EthPeer ethPeer = activeConnections.get(id); if (ethPeer == null) { final Optional peerInList = incompleteConnections.asMap().values().stream() @@ -193,12 +226,12 @@ public class EthPeers { if (peer.getConnection().equals(connection)) { final Bytes id = peer.getId(); if (!peerHasIncompleteConnection(id)) { - removed = completeConnections.remove(id, peer); + removed = activeConnections.remove(id, peer); disconnectCallbacks.forEach(callback -> callback.onDisconnect(peer)); peer.handleDisconnect(); abortPendingRequestsAssignedToDisconnectedPeers(); if (peer.getReputation().getScore() > USEFULL_PEER_SCORE_THRESHOLD) { - LOG.atDebug().setMessage("Disconnected USEFULL peer {}").addArgument(peer).log(); + LOG.atDebug().setMessage("Disconnected USEFUL peer {}").addArgument(peer).log(); } else { LOG.atDebug() .setMessage("Disconnected EthPeer {}") @@ -227,7 +260,7 @@ public class EthPeers { public EthPeer peer(final PeerConnection connection) { final EthPeer ethPeer = incompleteConnections.getIfPresent(connection); - return ethPeer != null ? ethPeer : completeConnections.get(connection.getPeer().getId()); + return ethPeer != null ? ethPeer : activeConnections.get(connection.getPeer().getId()); } public PendingPeerRequest executePeerRequest( @@ -265,7 +298,7 @@ public class EthPeers { @VisibleForTesting void reattemptPendingPeerRequests() { synchronized (this) { - final List peers = streamAvailablePeers().collect(Collectors.toList()); + final List peers = streamAvailablePeers().toList(); final Iterator iterator = pendingRequests.iterator(); while (iterator.hasNext() && peers.stream().anyMatch(EthPeer::hasAvailableRequestCapacity)) { final PendingPeerRequest request = iterator.next(); @@ -290,7 +323,7 @@ public class EthPeers { public int peerCount() { removeDisconnectedPeers(); - return completeConnections.size(); + return activeConnections.size(); } public int getMaxPeers() { @@ -298,11 +331,11 @@ public class EthPeers { } public Stream streamAllPeers() { - return completeConnections.values().stream(); + return activeConnections.values().stream(); } private void removeDisconnectedPeers() { - completeConnections + activeConnections .values() .forEach( ep -> { @@ -313,9 +346,7 @@ public class EthPeers { } public Stream streamAvailablePeers() { - return streamAllPeers() - .filter(EthPeer::readyForRequests) - .filter(peer -> !peer.isDisconnected()); + return streamAllPeers().filter(peer -> !peer.isDisconnected()); } public Stream streamBestPeers() { @@ -350,53 +381,59 @@ public class EthPeers { this.rlpxAgent = rlpxAgent; } - public Stream getAllActiveConnections() { - return completeConnections.values().stream() + public Stream streamAllActiveConnections() { + return activeConnections.values().stream() .map(EthPeer::getConnection) .filter(c -> !c.isDisconnected()); } - public Stream getAllConnections() { + public Stream streamAllConnections() { return Stream.concat( - completeConnections.values().stream().map(EthPeer::getConnection), + activeConnections.values().stream().map(EthPeer::getConnection), incompleteConnections.asMap().keySet().stream()) .distinct() .filter(c -> !c.isDisconnected()); } - public boolean shouldConnect(final Peer peer, final boolean inbound) { + public boolean shouldTryToConnect(final Peer peer, final boolean inbound) { + + if (peer.getForkId().isPresent()) { + final ForkId forkId = peer.getForkId().get(); + if (!forkIdManager.peerCheck(forkId)) { + LOG.atDebug() + .setMessage("Wrong fork id, not trying to connect to peer {}") + .addArgument(peer::getId) + .log(); + + return false; + } + } + final Bytes id = peer.getId(); - if (peerCount() >= peerUpperBound && !canExceedPeerLimits(id)) { + if (alreadyConnectedOrConnecting(inbound, id)) { LOG.atTrace() - .setMessage("not connecting to peer {} - too many peers") + .setMessage("not connecting to peer {} - already connected") .addArgument(peer.getLoggableId()) .log(); return false; } - final EthPeer ethPeer = completeConnections.get(id); + + return peerCount() < getMaxPeers() || needMoreSnapServers() || canExceedPeerLimits(id); + } + + private boolean alreadyConnectedOrConnecting(final boolean inbound, final Bytes id) { + final EthPeer ethPeer = activeConnections.get(id); if (ethPeer != null && !ethPeer.isDisconnected()) { - LOG.atTrace() - .setMessage("not connecting to peer {} - already disconnected") - .addArgument(ethPeer.getLoggableId()) - .log(); - return false; + return true; } final List incompleteConnections = getIncompleteConnections(id); - if (!incompleteConnections.isEmpty()) { - if (incompleteConnections.stream() - .anyMatch(c -> !c.isDisconnected() && (!inbound || (inbound && c.inboundInitiated())))) { - LOG.atTrace() - .setMessage("not connecting to peer {} - new connection already in process") - .addArgument(peer.getLoggableId()) - .log(); - return false; - } - } - return true; + return incompleteConnections.stream() + .anyMatch(c -> !c.isDisconnected() && (!inbound || (inbound && c.inboundInitiated()))); } public void disconnectWorstUselessPeer() { streamAvailablePeers() + .filter(p -> !canExceedPeerLimits(p.getId())) .min(getBestPeerComparator()) .ifPresent( peer -> { @@ -411,6 +448,23 @@ public class EthPeers { }); } + public void setChainHeadTracker(final ChainHeadTracker tracker) { + this.tracker = tracker; + } + + public void setSnapServerChecker(final SnapServerChecker checker) { + this.snapServerChecker = checker; + } + + public void snapServerPeersNeeded(final boolean b) { + this.snapServerPeersNeeded = b; + } + + public void setTrailingPeerRequirementsSupplier( + final Supplier tprSupplier) { + this.trailingPeerRequirementsSupplier = tprSupplier; + } + @FunctionalInterface public interface ConnectCallback { void onPeerConnected(EthPeer newPeer); @@ -418,21 +472,108 @@ public class EthPeers { @Override public String toString() { - if (completeConnections.isEmpty()) { + if (activeConnections.isEmpty()) { return "0 EthPeers {}"; } final String connectionsList = - completeConnections.values().stream() + activeConnections.values().stream() .sorted() .map(EthPeer::toString) .collect(Collectors.joining(", \n")); - return completeConnections.size() + " EthPeers {\n" + connectionsList + '}'; + return activeConnections.size() + " EthPeers {\n" + connectionsList + '}'; } private void ethPeerStatusExchanged(final EthPeer peer) { - if (addPeerToEthPeers(peer)) { - connectedPeersCounter.inc(); - connectCallbacks.forEach(cb -> cb.onPeerConnected(peer)); + // We have a connection to a peer that is on the right chain and is willing to connect to us. + // Find out what the EthPeer block height is and whether it can serve snap data (if we are doing + // snap sync) + LOG.debug("Peer {} status exchanged", peer); + assert tracker != null : "ChainHeadTracker must be set before EthPeers can be used"; + CompletableFuture future = tracker.getBestHeaderFromPeer(peer); + + future.whenComplete( + (peerHeadBlockHeader, error) -> { + if (peerHeadBlockHeader == null) { + LOG.debug( + "Failed to retrieve chain head info. Disconnecting {}... {}", + peer.getLoggableId(), + error); + peer.disconnect( + DisconnectMessage.DisconnectReason.USELESS_PEER_FAILED_TO_RETRIEVE_CHAIN_HEAD); + } else { + + // we can check trailing peers now + final TrailingPeerRequirements trailingPeerRequirements = + trailingPeerRequirementsSupplier.get(); + if (trailingPeerRequirements != null) { + if (peer.chainState().getEstimatedHeight() + < trailingPeerRequirements.getMinimumHeightToBeUpToDate()) { + if (!(getNumTrailingPeers(trailingPeerRequirements.getMinimumHeightToBeUpToDate()) + < trailingPeerRequirements.getMaxTrailingPeers())) { + LOG.atTrace() + .setMessage( + "Adding trailing peer {} would exceed max trailing peers {}. Disconnecting...") + .addArgument(peer.getLoggableId()) + .addArgument(trailingPeerRequirements.getMaxTrailingPeers()) + .log(); + peer.disconnect( + DisconnectMessage.DisconnectReason.USELESS_PEER_EXCEEDS_TRAILING_PEERS); + return; + } + } + } + + peer.chainState().updateHeightEstimate(peerHeadBlockHeader.getNumber()); + CompletableFuture isServingSnapFuture; + if (SyncMode.isCheckpointSync(syncMode) || SyncMode.isSnapSync(syncMode)) { + // even if we have finished the snap sync, we still want to know if the peer is a snap + // server + isServingSnapFuture = + CompletableFuture.runAsync( + () -> { + try { + checkIsSnapServer(peer, peerHeadBlockHeader); + } catch (Exception e) { + throw new RuntimeException(e); + } + }); + } else { + isServingSnapFuture = CompletableFuture.completedFuture(null); + } + isServingSnapFuture.thenRun( + () -> { + if (!peer.getConnection().isDisconnected() && addPeerToEthPeers(peer)) { + connectedPeersCounter.inc(); + connectCallbacks.forEach(cb -> cb.onPeerConnected(peer)); + } + }); + } + }); + } + + private void checkIsSnapServer(final EthPeer peer, final BlockHeader peersHeadBlockHeader) { + if (peer.getAgreedCapabilities().contains(SnapProtocol.SNAP1)) { + if (snapServerChecker != null) { + // set that peer is a snap server for doing the test + peer.setIsServingSnap(true); + Boolean isServer; + try { + isServer = snapServerChecker.check(peer, peersHeadBlockHeader).get(6L, TimeUnit.SECONDS); + } catch (Exception e) { + LOG.atTrace() + .setMessage("Error checking if peer {} is a snap server. Setting to false.") + .addArgument(peer.getLoggableId()) + .log(); + peer.setIsServingSnap(false); + return; + } + peer.setIsServingSnap(isServer); + LOG.atTrace() + .setMessage("{}: peer {}") + .addArgument(isServer ? "Is a snap server" : "Is NOT a snap server") + .addArgument(peer.getLoggableId()) + .log(); + } } } @@ -468,7 +609,7 @@ public class EthPeers { } private void enforceRemoteConnectionLimits() { - if (!shouldLimitRemoteConnections() || peerCount() < maxRemotelyInitiatedConnections) { + if (!shouldLimitRemoteConnections || peerCount() < maxRemotelyInitiatedConnections) { // Nothing to do return; } @@ -488,7 +629,7 @@ public class EthPeers { } private Stream getActivePrioritizedPeers() { - return completeConnections.values().stream() + return activeConnections.values().stream() .filter(p -> !p.isDisconnected()) .sorted(this::comparePeerPriorities); } @@ -512,19 +653,15 @@ public class EthPeers { }); } - private boolean remoteConnectionLimitReached() { - return shouldLimitRemoteConnections() - && countUntrustedRemotelyInitiatedConnections() >= maxRemotelyInitiatedConnections; - } - - private boolean shouldLimitRemoteConnections() { - return maxRemotelyInitiatedConnections < peerUpperBound; + private boolean inboundInitiatedConnectionLimitExceeded() { + return shouldLimitRemoteConnections + && countUntrustedRemotelyInitiatedConnections() > maxRemotelyInitiatedConnections; } private long countUntrustedRemotelyInitiatedConnections() { - return completeConnections.values().stream() - .map(ep -> ep.getConnection()) - .filter(c -> c.inboundInitiated()) + return activeConnections.values().stream() + .map(EthPeer::getConnection) + .filter(PeerConnection::inboundInitiated) .filter(c -> !c.isDisconnected()) .filter(conn -> !canExceedPeerLimits(conn.getPeer().getId())) .count(); @@ -534,67 +671,123 @@ public class EthPeers { final RemovalNotification removalNotification) { if (removalNotification.wasEvicted()) { final PeerConnection peerConnectionRemoved = removalNotification.getKey(); - final PeerConnection peerConnectionOfEthPeer = removalNotification.getValue().getConnection(); - if (!peerConnectionRemoved.equals(peerConnectionOfEthPeer)) { - // If this connection is not the connection of the EthPeer by now we can disconnect - peerConnectionRemoved.disconnect(DisconnectMessage.DisconnectReason.ALREADY_CONNECTED); + final EthPeer peer = removalNotification.getValue(); + if (peer == null) { + return; + } + final PeerConnection peerConnectionOfEthPeer = peer.getConnection(); + if (peerConnectionRemoved != null) { + if (!peerConnectionRemoved.equals(peerConnectionOfEthPeer)) { + // If this connection is not the connection of the EthPeer by now we can disconnect + peerConnectionRemoved.disconnect(DisconnectMessage.DisconnectReason.ALREADY_CONNECTED); + } } } } - private boolean addPeerToEthPeers(final EthPeer peer) { + boolean addPeerToEthPeers(final EthPeer peer) { // We have a connection to a peer that is on the right chain and is willing to connect to us. - // Figure out whether we want to keep this peer and add it to the EthPeers connections. - if (completeConnections.containsValue(peer)) { + // Figure out whether we want to add it to the active connections. + final PeerConnection connection = peer.getConnection(); + if (activeConnections.containsValue(peer)) { return false; } - final PeerConnection connection = peer.getConnection(); + final Bytes id = peer.getId(); if (!randomPeerPriority) { - // Disconnect if too many peers - if (!canExceedPeerLimits(id) && peerCount() >= peerUpperBound) { - LOG.atTrace() - .setMessage("Too many peers. Disconnect connection: {}, max connections {}") - .addArgument(connection) - .addArgument(peerUpperBound) - .log(); - connection.disconnect(DisconnectMessage.DisconnectReason.TOO_MANY_PEERS); - return false; + + if (peerCount() >= peerUpperBound) { + final long numSnapServers = numberOfSnapServers(); + final boolean inboundLimitExceeded = inboundInitiatedConnectionLimitExceeded(); + // three reasons why we would disconnect an existing peer to accommodate the new peer + if (canExceedPeerLimits(id) + || (snapServerPeersNeeded + && numSnapServers < snapServerTargetNumber + && peer.isServingSnap()) + || (inboundLimitExceeded && !peer.getConnection().inboundInitiated())) { + + final boolean filterOutSnapServers = + snapServerPeersNeeded && (numSnapServers <= snapServerTargetNumber); + + // find and disconnect the least useful peer we can disconnect + activeConnections.values().stream() + .filter(p -> !canExceedPeerLimits(p.getId())) + .filter(filterOutSnapServers ? p -> !p.isServingSnap() : p -> true) + .filter(inboundLimitExceeded ? p -> p.getConnection().inboundInitiated() : p -> true) + .min(MOST_USEFUL_PEER) + .ifPresentOrElse( + pe -> { + pe.disconnect(DisconnectMessage.DisconnectReason.TOO_MANY_PEERS); + LOG.atTrace() + .setMessage("Disconnecting peer {} to be replaced by prioritised peer {}") + .addArgument(pe.getLoggableId()) + .addArgument(peer.getLoggableId()) + .log(); + }, + () -> // disconnect the least useful peer + activeConnections.values().stream() + .filter(p -> !canExceedPeerLimits(p.getId())) + .min(MOST_USEFUL_PEER) + .ifPresent( + p -> { + p.disconnect(DisconnectMessage.DisconnectReason.TOO_MANY_PEERS); + LOG.atTrace() + .setMessage( + "Disconnecting peer {} to be replaced by prioritised peer {}") + .addArgument(p.getLoggableId()) + .addArgument(peer.getLoggableId()) + .log(); + })); + } else { + LOG.atTrace() + .setMessage( + "Too many peers. Disconnect peer {} with connection: {}, max connections {}") + .addArgument(peer.getLoggableId()) + .addArgument(connection) + .addArgument(peerUpperBound) + .log(); + connection.disconnect(DisconnectMessage.DisconnectReason.TOO_MANY_PEERS); + return false; + } } - // Disconnect if too many remotely-initiated connections - if (connection.inboundInitiated() - && !canExceedPeerLimits(id) - && remoteConnectionLimitReached()) { - LOG.atTrace() - .setMessage( - "Too many remotely-initiated connections. Disconnect incoming connection: {}, maxRemote={}") - .addArgument(connection) - .addArgument(maxRemotelyInitiatedConnections) - .log(); - connection.disconnect(DisconnectMessage.DisconnectReason.TOO_MANY_PEERS); - return false; - } - final boolean added = (completeConnections.putIfAbsent(id, peer) == null); + + final boolean added = (activeConnections.putIfAbsent(id, peer) == null); if (added) { LOG.atTrace() - .setMessage("Added peer {} with connection {} to completeConnections") + .setMessage("Added peer {} with connection {} to activeConnections") .addArgument(id) .addArgument(connection) .log(); } else { LOG.atTrace() - .setMessage("Did not add peer {} with connection {} to completeConnections") + .setMessage("Did not add peer {} with connection {} to activeConnections") .addArgument(id) .addArgument(connection) .log(); } return added; + } else { // randomPeerPriority! Add the peer and if there are too many connections fix it - completeConnections.putIfAbsent(id, peer); + // TODO: random peer priority does not care yet about snap server peers -> check later + activeConnections.putIfAbsent(id, peer); enforceRemoteConnectionLimits(); enforceConnectionLimits(); - return completeConnections.containsKey(id); + return activeConnections.containsKey(id); } } + + private long getNumTrailingPeers(final long minimumHeightToBeUpToDate) { + return streamAvailablePeers() + .filter(p -> p.chainState().getEstimatedHeight() < minimumHeightToBeUpToDate) + .count(); + } + + private boolean needMoreSnapServers() { + return snapServerPeersNeeded && numberOfSnapServers() < snapServerTargetNumber; + } + + private long numberOfSnapServers() { + return activeConnections.values().stream().filter(EthPeer::isServingSnap).count(); + } } diff --git a/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/manager/EthProtocolManager.java b/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/manager/EthProtocolManager.java index c8781e73e..5532bed86 100644 --- a/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/manager/EthProtocolManager.java +++ b/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/manager/EthProtocolManager.java @@ -34,7 +34,6 @@ import org.hyperledger.besu.ethereum.eth.transactions.TransactionPool; import org.hyperledger.besu.ethereum.forkid.ForkId; import org.hyperledger.besu.ethereum.forkid.ForkIdManager; import org.hyperledger.besu.ethereum.p2p.network.ProtocolManager; -import org.hyperledger.besu.ethereum.p2p.peers.Peer; import org.hyperledger.besu.ethereum.p2p.rlpx.connections.PeerConnection; import org.hyperledger.besu.ethereum.p2p.rlpx.connections.PeerConnection.PeerNotConnected; import org.hyperledger.besu.ethereum.p2p.rlpx.wire.Capability; @@ -161,41 +160,6 @@ public class EthProtocolManager implements ProtocolManager, MinedBlockObserver { ethereumWireProtocolConfiguration.isLegacyEth64ForkIdEnabled())); } - public EthProtocolManager( - final Blockchain blockchain, - final BigInteger networkId, - final WorldStateArchive worldStateArchive, - final TransactionPool transactionPool, - final EthProtocolConfiguration ethereumWireProtocolConfiguration, - final EthPeers ethPeers, - final EthMessages ethMessages, - final EthContext ethContext, - final List peerValidators, - final Optional mergePeerFilter, - final SynchronizerConfiguration synchronizerConfiguration, - final EthScheduler scheduler, - final List blockNumberForks, - final List timestampForks) { - this( - blockchain, - networkId, - worldStateArchive, - transactionPool, - ethereumWireProtocolConfiguration, - ethPeers, - ethMessages, - ethContext, - peerValidators, - mergePeerFilter, - synchronizerConfiguration, - scheduler, - new ForkIdManager( - blockchain, - blockNumberForks, - timestampForks, - ethereumWireProtocolConfiguration.isLegacyEth64ForkIdEnabled())); - } - public EthContext ethContext() { return ethContext; } @@ -398,28 +362,6 @@ public class EthProtocolManager implements ProtocolManager, MinedBlockObserver { LOG.atTrace().setMessage("{}").addArgument(ethPeers::toString).log(); } - @Override - public boolean shouldConnect(final Peer peer, final boolean incoming) { - if (peer.getForkId().map(forkIdManager::peerCheck).orElse(true)) { - LOG.atDebug() - .setMessage("ForkId OK or not available for peer {}") - .addArgument(peer::getLoggableId) - .log(); - if (ethPeers.shouldConnect(peer, incoming)) { - return true; - } - } else { - LOG.atDebug() - .setMessage("ForkId check failed for peer {} our fork id {} theirs {}") - .addArgument(peer::getLoggableId) - .addArgument(forkIdManager.getForkIdForChainHead()) - .addArgument(peer.getForkId()) - .log(); - return false; - } - return false; - } - @Override public void handleDisconnect( final PeerConnection connection, @@ -427,11 +369,10 @@ public class EthProtocolManager implements ProtocolManager, MinedBlockObserver { final boolean initiatedByPeer) { final boolean wasActiveConnection = ethPeers.registerDisconnect(connection); LOG.atDebug() - .setMessage("Disconnect - active Connection? {} - {} - {} {} - {} {} - {} peers left") + .setMessage("Disconnect - active Connection? {} - {} - {} - {} {} - {} peers left") .addArgument(wasActiveConnection) .addArgument(initiatedByPeer ? "Inbound" : "Outbound") - .addArgument(reason::getValue) - .addArgument(reason::name) + .addArgument(reason::toString) .addArgument(() -> connection.getPeer().getLoggableId()) .addArgument(() -> connection.getPeerInfo().getClientId()) .addArgument(ethPeers::peerCount) diff --git a/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/manager/PeerRequest.java b/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/manager/PeerRequest.java index 09cbdb969..5daad56b9 100644 --- a/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/manager/PeerRequest.java +++ b/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/manager/PeerRequest.java @@ -19,4 +19,8 @@ import org.hyperledger.besu.ethereum.p2p.rlpx.connections.PeerConnection.PeerNot public interface PeerRequest { ResponseStream sendRequest(EthPeer peer) throws PeerNotConnected; + + default boolean isEthPeerSuitable(final EthPeer ethPeer) { + return true; + } } diff --git a/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/manager/PendingPeerRequest.java b/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/manager/PendingPeerRequest.java index 120b32bdf..71da1e4d2 100644 --- a/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/manager/PendingPeerRequest.java +++ b/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/manager/PendingPeerRequest.java @@ -86,6 +86,7 @@ public class PendingPeerRequest { : ethPeers .streamAvailablePeers() .filter(peer -> peer.chainState().getEstimatedHeight() >= minimumBlockNumber) + .filter(request::isEthPeerSuitable) .min(EthPeers.LEAST_TO_MOST_BUSY); } diff --git a/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/manager/snap/GetAccountRangeFromPeerTask.java b/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/manager/snap/GetAccountRangeFromPeerTask.java index 75a6183eb..8e67ff4ae 100644 --- a/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/manager/snap/GetAccountRangeFromPeerTask.java +++ b/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/manager/snap/GetAccountRangeFromPeerTask.java @@ -17,10 +17,13 @@ package org.hyperledger.besu.ethereum.eth.manager.snap; import org.hyperledger.besu.ethereum.core.BlockHeader; import org.hyperledger.besu.ethereum.eth.manager.EthContext; import org.hyperledger.besu.ethereum.eth.manager.EthPeer; +import org.hyperledger.besu.ethereum.eth.manager.PeerRequest; import org.hyperledger.besu.ethereum.eth.manager.PendingPeerRequest; +import org.hyperledger.besu.ethereum.eth.manager.RequestManager; import org.hyperledger.besu.ethereum.eth.manager.task.AbstractPeerRequestTask; import org.hyperledger.besu.ethereum.eth.messages.snap.AccountRangeMessage; import org.hyperledger.besu.ethereum.eth.messages.snap.SnapV1; +import org.hyperledger.besu.ethereum.p2p.rlpx.connections.PeerConnection; import org.hyperledger.besu.ethereum.p2p.rlpx.wire.MessageData; import org.hyperledger.besu.plugin.services.MetricsSystem; @@ -64,14 +67,34 @@ public class GetAccountRangeFromPeerTask @Override protected PendingPeerRequest sendRequest() { return sendRequestToPeer( - peer -> { - LOG.trace( - "Requesting account range [{} ,{}] for state root {} from peer {} .", - startKeyHash, - endKeyHash, - blockHeader.getStateRoot(), - peer); - return peer.getSnapAccountRange(blockHeader.getStateRoot(), startKeyHash, endKeyHash); + new PeerRequest() { + @Override + public RequestManager.ResponseStream sendRequest(final EthPeer peer) + throws PeerConnection.PeerNotConnected { + LOG.atTrace() + .setMessage("Requesting account range [{} ,{}] for state root {} from peer {} .") + .addArgument(startKeyHash) + .addArgument(endKeyHash) + .addArgument(blockHeader) + .addArgument(peer) + .log(); + if (!peer.isServingSnap()) { + LOG.atDebug() + .setMessage("EthPeer that is not serving snap called in {}, peer: {}") + .addArgument(GetAccountRangeFromPeerTask.class) + .addArgument(peer) + .log(); + throw new RuntimeException( + "EthPeer that is not serving snap called in " + + GetAccountRangeFromPeerTask.class); + } + return peer.getSnapAccountRange(blockHeader.getStateRoot(), startKeyHash, endKeyHash); + } + + @Override + public boolean isEthPeerSuitable(final EthPeer ethPeer) { + return ethPeer.isServingSnap(); + } }, blockHeader.getNumber()); } diff --git a/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/manager/snap/GetBytecodeFromPeerTask.java b/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/manager/snap/GetBytecodeFromPeerTask.java index d57acc590..1c8c1d12d 100644 --- a/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/manager/snap/GetBytecodeFromPeerTask.java +++ b/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/manager/snap/GetBytecodeFromPeerTask.java @@ -21,10 +21,13 @@ import org.hyperledger.besu.datatypes.Hash; import org.hyperledger.besu.ethereum.core.BlockHeader; import org.hyperledger.besu.ethereum.eth.manager.EthContext; import org.hyperledger.besu.ethereum.eth.manager.EthPeer; +import org.hyperledger.besu.ethereum.eth.manager.PeerRequest; import org.hyperledger.besu.ethereum.eth.manager.PendingPeerRequest; +import org.hyperledger.besu.ethereum.eth.manager.RequestManager; import org.hyperledger.besu.ethereum.eth.manager.task.AbstractPeerRequestTask; import org.hyperledger.besu.ethereum.eth.messages.snap.ByteCodesMessage; import org.hyperledger.besu.ethereum.eth.messages.snap.SnapV1; +import org.hyperledger.besu.ethereum.p2p.rlpx.connections.PeerConnection; import org.hyperledger.besu.ethereum.p2p.rlpx.wire.MessageData; import org.hyperledger.besu.plugin.services.MetricsSystem; @@ -66,9 +69,32 @@ public class GetBytecodeFromPeerTask extends AbstractPeerRequestTask { - LOG.trace("Requesting {} Bytecodes from {} .", codeHashes.size(), peer); - return peer.getSnapBytecode(blockHeader.getStateRoot(), codeHashes); + new PeerRequest() { + @Override + public RequestManager.ResponseStream sendRequest(final EthPeer peer) + throws PeerConnection.PeerNotConnected { + LOG.atTrace() + .setMessage("Requesting {} Bytecodes from {} .") + .addArgument(codeHashes.size()) + .addArgument(peer) + .log(); + if (!peer.isServingSnap()) { + LOG.atDebug() + .setMessage("EthPeer that is not serving snap called in {}, peer: {}") + .addArgument(GetAccountRangeFromPeerTask.class) + .addArgument(peer) + .log(); + throw new RuntimeException( + "EthPeer that is not serving snap called in " + + GetAccountRangeFromPeerTask.class); + } + return peer.getSnapBytecode(blockHeader.getStateRoot(), codeHashes); + } + + @Override + public boolean isEthPeerSuitable(final EthPeer ethPeer) { + return ethPeer.isServingSnap(); + } }, blockHeader.getNumber()); } diff --git a/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/manager/snap/GetStorageRangeFromPeerTask.java b/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/manager/snap/GetStorageRangeFromPeerTask.java index bcc8f23eb..cb3e4c83e 100644 --- a/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/manager/snap/GetStorageRangeFromPeerTask.java +++ b/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/manager/snap/GetStorageRangeFromPeerTask.java @@ -17,10 +17,13 @@ package org.hyperledger.besu.ethereum.eth.manager.snap; import org.hyperledger.besu.ethereum.core.BlockHeader; import org.hyperledger.besu.ethereum.eth.manager.EthContext; import org.hyperledger.besu.ethereum.eth.manager.EthPeer; +import org.hyperledger.besu.ethereum.eth.manager.PeerRequest; import org.hyperledger.besu.ethereum.eth.manager.PendingPeerRequest; +import org.hyperledger.besu.ethereum.eth.manager.RequestManager; import org.hyperledger.besu.ethereum.eth.manager.task.AbstractPeerRequestTask; import org.hyperledger.besu.ethereum.eth.messages.snap.SnapV1; import org.hyperledger.besu.ethereum.eth.messages.snap.StorageRangeMessage; +import org.hyperledger.besu.ethereum.p2p.rlpx.connections.PeerConnection; import org.hyperledger.besu.ethereum.p2p.rlpx.wire.MessageData; import org.hyperledger.besu.plugin.services.MetricsSystem; @@ -69,15 +72,35 @@ public class GetStorageRangeFromPeerTask @Override protected PendingPeerRequest sendRequest() { return sendRequestToPeer( - peer -> { - LOG.trace( - "Requesting storage range [{} ,{}] for {} accounts from peer {} .", - startKeyHash, - endKeyHash, - accountHashes.size(), - peer); - return peer.getSnapStorageRange( - blockHeader.getStateRoot(), accountHashes, startKeyHash, endKeyHash); + new PeerRequest() { + @Override + public RequestManager.ResponseStream sendRequest(final EthPeer peer) + throws PeerConnection.PeerNotConnected { + LOG.atTrace() + .setMessage("Requesting storage range [{} ,{}] for {} accounts from peer {} .") + .addArgument(startKeyHash) + .addArgument(endKeyHash) + .addArgument(accountHashes.size()) + .addArgument(peer) + .log(); + if (!peer.isServingSnap()) { + LOG.atDebug() + .setMessage("EthPeer that is not serving snap called in {}, peer: {}") + .addArgument(GetAccountRangeFromPeerTask.class) + .addArgument(peer) + .log(); + throw new RuntimeException( + "EthPeer that is not serving snap called in " + + GetAccountRangeFromPeerTask.class); + } + return peer.getSnapStorageRange( + blockHeader.getStateRoot(), accountHashes, startKeyHash, endKeyHash); + } + + @Override + public boolean isEthPeerSuitable(final EthPeer ethPeer) { + return ethPeer.isServingSnap(); + } }, blockHeader.getNumber()); } diff --git a/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/manager/snap/GetTrieNodeFromPeerTask.java b/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/manager/snap/GetTrieNodeFromPeerTask.java index 6b2e8cc6b..a060ca79d 100644 --- a/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/manager/snap/GetTrieNodeFromPeerTask.java +++ b/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/manager/snap/GetTrieNodeFromPeerTask.java @@ -20,10 +20,13 @@ import static org.slf4j.LoggerFactory.getLogger; import org.hyperledger.besu.ethereum.core.BlockHeader; import org.hyperledger.besu.ethereum.eth.manager.EthContext; import org.hyperledger.besu.ethereum.eth.manager.EthPeer; +import org.hyperledger.besu.ethereum.eth.manager.PeerRequest; import org.hyperledger.besu.ethereum.eth.manager.PendingPeerRequest; +import org.hyperledger.besu.ethereum.eth.manager.RequestManager; import org.hyperledger.besu.ethereum.eth.manager.task.AbstractPeerRequestTask; import org.hyperledger.besu.ethereum.eth.messages.snap.SnapV1; import org.hyperledger.besu.ethereum.eth.messages.snap.TrieNodesMessage; +import org.hyperledger.besu.ethereum.p2p.rlpx.connections.PeerConnection; import org.hyperledger.besu.ethereum.p2p.rlpx.wire.MessageData; import org.hyperledger.besu.plugin.services.MetricsSystem; @@ -72,9 +75,31 @@ public class GetTrieNodeFromPeerTask extends AbstractPeerRequestTask { - LOG.trace("Requesting {} trie nodes from peer {}", paths.size(), peer); - return peer.getSnapTrieNode(blockHeader.getStateRoot(), paths); + new PeerRequest() { + @Override + public RequestManager.ResponseStream sendRequest(final EthPeer peer) + throws PeerConnection.PeerNotConnected { + LOG.atTrace() + .setMessage("Requesting {} trie nodes from peer {}") + .addArgument(paths.size()) + .addArgument(peer) + .log(); + if (!peer.isServingSnap()) { + LOG.debug( + "EthPeer that is not serving snap called in {}, {}", + GetAccountRangeFromPeerTask.class, + peer); + throw new RuntimeException( + "EthPeer that is not serving snap called in " + + GetAccountRangeFromPeerTask.class); + } + return peer.getSnapTrieNode(blockHeader.getStateRoot(), paths); + } + + @Override + public boolean isEthPeerSuitable(final EthPeer ethPeer) { + return ethPeer.isServingSnap(); + } }, blockHeader.getNumber()); } diff --git a/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/manager/snap/RetryingGetAccountRangeFromPeerTask.java b/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/manager/snap/RetryingGetAccountRangeFromPeerTask.java index 36d6b75e6..0624a9058 100644 --- a/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/manager/snap/RetryingGetAccountRangeFromPeerTask.java +++ b/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/manager/snap/RetryingGetAccountRangeFromPeerTask.java @@ -31,6 +31,7 @@ public class RetryingGetAccountRangeFromPeerTask extends AbstractRetryingPeerTask { public static final int MAX_RETRIES = 4; + private final EthContext ethContext; private final Bytes32 startKeyHash; private final Bytes32 endKeyHash; @@ -79,4 +80,9 @@ public class RetryingGetAccountRangeFromPeerTask return peerResult.getResult(); }); } + + @Override + protected boolean isSuitablePeer(final EthPeer peer) { + return peer.isServingSnap(); + } } diff --git a/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/manager/snap/RetryingGetBytecodeFromPeerTask.java b/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/manager/snap/RetryingGetBytecodeFromPeerTask.java index 9b340c8cd..3258298f2 100644 --- a/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/manager/snap/RetryingGetBytecodeFromPeerTask.java +++ b/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/manager/snap/RetryingGetBytecodeFromPeerTask.java @@ -69,4 +69,9 @@ public class RetryingGetBytecodeFromPeerTask extends AbstractRetryingPeerTask extends AbstractEthTask { this.metricsSystem = metricsSystem; } - public void assignPeer(final EthPeer peer) { - assignedPeer = Optional.of(peer); + /** + * Assign the peer to be used for the task. + * + * @param peer The peer to assign to the task. + * @return True if the peer was assigned, false otherwise. + */ + public boolean assignPeer(final EthPeer peer) { + if (isSuitablePeer(peer)) { + assignedPeer = Optional.of(peer); + return true; + } else { + assignedPeer = Optional.empty(); + return false; + } } public Optional getAssignedPeer() { @@ -167,4 +179,8 @@ public abstract class AbstractRetryingPeerTask extends AbstractEthTask { public int getMaxRetries() { return maxRetries; } + + protected boolean isSuitablePeer(final EthPeer peer) { + return true; + } } diff --git a/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/manager/task/AbstractRetryingSwitchingPeerTask.java b/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/manager/task/AbstractRetryingSwitchingPeerTask.java index 88fe3bb6a..a10212897 100644 --- a/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/manager/task/AbstractRetryingSwitchingPeerTask.java +++ b/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/manager/task/AbstractRetryingSwitchingPeerTask.java @@ -49,9 +49,12 @@ public abstract class AbstractRetryingSwitchingPeerTask extends AbstractRetry } @Override - public void assignPeer(final EthPeer peer) { - super.assignPeer(peer); - triedPeers.add(peer); + public boolean assignPeer(final EthPeer peer) { + if (super.assignPeer(peer)) { + triedPeers.add(peer); + return true; + } + return false; } protected abstract CompletableFuture executeTaskOnCurrentPeer(final EthPeer peer); @@ -62,8 +65,7 @@ public abstract class AbstractRetryingSwitchingPeerTask extends AbstractRetry final Optional maybePeer = assignedPeer .filter(u -> getRetryCount() == 1) // first try with the assigned peer if present - .map(Optional::of) - .orElseGet(this::selectNextPeer); // otherwise, select a new one from the pool + .or(this::selectNextPeer); // otherwise select a new one from the pool if (maybePeer.isEmpty()) { LOG.atTrace() @@ -101,7 +103,7 @@ public abstract class AbstractRetryingSwitchingPeerTask extends AbstractRetry @Override protected void handleTaskError(final Throwable error) { if (isPeerFailure(error)) { - getAssignedPeer().ifPresent(peer -> failedPeers.add(peer)); + getAssignedPeer().ifPresent(failedPeers::add); } super.handleTaskError(error); } @@ -124,10 +126,11 @@ public abstract class AbstractRetryingSwitchingPeerTask extends AbstractRetry return maybeNextPeer; } - private Stream remainingPeersToTry() { + protected Stream remainingPeersToTry() { return getEthContext() .getEthPeers() .streamBestPeers() + .filter(this::isSuitablePeer) .filter(peer -> !triedPeers.contains(peer)); } diff --git a/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/sync/ChainHeadTracker.java b/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/sync/ChainHeadTracker.java index 5d563e012..67681acf6 100644 --- a/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/sync/ChainHeadTracker.java +++ b/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/sync/ChainHeadTracker.java @@ -19,24 +19,25 @@ import org.hyperledger.besu.ethereum.chain.Blockchain; import org.hyperledger.besu.ethereum.core.BlockHeader; import org.hyperledger.besu.ethereum.eth.manager.EthContext; import org.hyperledger.besu.ethereum.eth.manager.EthPeer; -import org.hyperledger.besu.ethereum.eth.manager.EthPeers.ConnectCallback; +import org.hyperledger.besu.ethereum.eth.manager.task.AbstractPeerTask; import org.hyperledger.besu.ethereum.eth.manager.task.GetHeadersFromPeerByHashTask; import org.hyperledger.besu.ethereum.mainnet.ProtocolSchedule; -import org.hyperledger.besu.ethereum.p2p.rlpx.wire.messages.DisconnectMessage.DisconnectReason; +import org.hyperledger.besu.ethereum.p2p.rlpx.wire.messages.DisconnectMessage; import org.hyperledger.besu.plugin.services.MetricsSystem; +import java.util.List; +import java.util.concurrent.CompletableFuture; import java.util.function.Supplier; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public class ChainHeadTracker implements ConnectCallback { +public class ChainHeadTracker { private static final Logger LOG = LoggerFactory.getLogger(ChainHeadTracker.class); private final EthContext ethContext; private final ProtocolSchedule protocolSchedule; - private final TrailingPeerLimiter trailingPeerLimiter; private final MetricsSystem metricsSystem; public ChainHeadTracker( @@ -46,7 +47,6 @@ public class ChainHeadTracker implements ConnectCallback { final MetricsSystem metricsSystem) { this.ethContext = ethContext; this.protocolSchedule = protocolSchedule; - this.trailingPeerLimiter = trailingPeerLimiter; this.metricsSystem = metricsSystem; } @@ -60,48 +60,53 @@ public class ChainHeadTracker implements ConnectCallback { new TrailingPeerLimiter(ethContext.getEthPeers(), trailingPeerRequirementsCalculator); final ChainHeadTracker tracker = new ChainHeadTracker(ethContext, protocolSchedule, trailingPeerLimiter, metricsSystem); - ethContext.getEthPeers().subscribeConnect(tracker); + ethContext.getEthPeers().setChainHeadTracker(tracker); blockchain.observeBlockAdded(trailingPeerLimiter); } - @Override - public void onPeerConnected(final EthPeer peer) { + public CompletableFuture getBestHeaderFromPeer(final EthPeer peer) { LOG.atDebug() .setMessage("Requesting chain head info from {}...") .addArgument(peer::getLoggableId) .log(); - GetHeadersFromPeerByHashTask.forSingleHash( + final CompletableFuture>> + bestHeaderFromPeerCompletableFuture = getBestHeaderFromPeerCompletableFuture(peer); + final CompletableFuture future = new CompletableFuture<>(); + bestHeaderFromPeerCompletableFuture.whenComplete( + (peerResult, error) -> { + if (peerResult != null && !peerResult.getResult().isEmpty()) { + final BlockHeader chainHeadHeader = peerResult.getResult().get(0); + peer.chainState().update(chainHeadHeader); + future.complete(chainHeadHeader); + LOG.atDebug() + .setMessage("Retrieved chain head info {} from {}...") + .addArgument( + () -> chainHeadHeader.getNumber() + " (" + chainHeadHeader.getBlockHash() + ")") + .addArgument(peer::getLoggableId) + .log(); + } else { + LOG.atDebug() + .setMessage("Failed to retrieve chain head info. Disconnecting {}... {}") + .addArgument(peer::getLoggableId) + .addArgument(error != null ? error : "Empty Response") + .log(); + peer.disconnect( + DisconnectMessage.DisconnectReason.USELESS_PEER_FAILED_TO_RETRIEVE_CHAIN_HEAD); + future.complete(null); + } + }); + return future; + } + + public CompletableFuture>> + getBestHeaderFromPeerCompletableFuture(final EthPeer peer) { + return GetHeadersFromPeerByHashTask.forSingleHash( protocolSchedule, ethContext, Hash.wrap(peer.chainState().getBestBlock().getHash()), 0, metricsSystem) .assignPeer(peer) - .run() - .whenComplete( - (peerResult, error) -> { - if (peerResult != null && !peerResult.getResult().isEmpty()) { - final BlockHeader chainHeadHeader = peerResult.getResult().get(0); - peer.chainState().update(chainHeadHeader); - trailingPeerLimiter.enforceTrailingPeerLimit(); - LOG.atDebug() - .setMessage("Retrieved chain head info {} from {}...") - .addArgument( - () -> - chainHeadHeader.getNumber() - + " (" - + chainHeadHeader.getBlockHash() - + ")") - .addArgument(peer::getLoggableId) - .log(); - } else { - LOG.atDebug() - .setMessage("Failed to retrieve chain head info. Disconnecting {}... {}") - .addArgument(peer::getLoggableId) - .addArgument(error) - .log(); - peer.disconnect(DisconnectReason.USELESS_PEER_FAILED_TO_RETRIEVE_CHAIN_STATE); - } - }); + .run(); } } diff --git a/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/sync/DefaultSynchronizer.java b/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/sync/DefaultSynchronizer.java index 5e596576a..7605754a6 100644 --- a/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/sync/DefaultSynchronizer.java +++ b/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/sync/DefaultSynchronizer.java @@ -99,6 +99,11 @@ public class DefaultSynchronizer implements Synchronizer, UnverifiedForkchoiceLi this::calculateTrailingPeerRequirements, metricsSystem); + if (SyncMode.isSnapSync(syncConfig.getSyncMode()) + || SyncMode.isCheckpointSync(syncConfig.getSyncMode())) { + SnapServerChecker.createAndSetSnapServerChecker(ethContext, metricsSystem); + } + this.blockPropagationManager = terminationCondition.shouldStopDownload() ? Optional.empty() @@ -187,7 +192,7 @@ public class DefaultSynchronizer implements Synchronizer, UnverifiedForkchoiceLi () -> getSyncStatus().isPresent() ? 0 : 1); } - private TrailingPeerRequirements calculateTrailingPeerRequirements() { + public TrailingPeerRequirements calculateTrailingPeerRequirements() { return fastSyncDownloader .flatMap(FastSyncDownloader::calculateTrailingPeerRequirements) .orElse( diff --git a/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/sync/SnapServerChecker.java b/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/sync/SnapServerChecker.java new file mode 100644 index 000000000..c7fa14183 --- /dev/null +++ b/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/sync/SnapServerChecker.java @@ -0,0 +1,86 @@ +/* + * Copyright ConsenSys AG. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on + * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the + * specific language governing permissions and limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + */ +package org.hyperledger.besu.ethereum.eth.sync; + +import org.hyperledger.besu.datatypes.Hash; +import org.hyperledger.besu.ethereum.core.BlockHeader; +import org.hyperledger.besu.ethereum.eth.manager.EthContext; +import org.hyperledger.besu.ethereum.eth.manager.EthPeer; +import org.hyperledger.besu.ethereum.eth.manager.snap.GetAccountRangeFromPeerTask; +import org.hyperledger.besu.ethereum.eth.manager.task.AbstractPeerTask; +import org.hyperledger.besu.ethereum.eth.messages.snap.AccountRangeMessage; +import org.hyperledger.besu.plugin.services.MetricsSystem; + +import java.util.concurrent.CompletableFuture; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class SnapServerChecker { + + private static final Logger LOG = LoggerFactory.getLogger(SnapServerChecker.class); + + private final EthContext ethContext; + private final MetricsSystem metricsSystem; + + public SnapServerChecker(final EthContext ethContext, final MetricsSystem metricsSystem) { + this.ethContext = ethContext; + this.metricsSystem = metricsSystem; + } + + public static void createAndSetSnapServerChecker( + final EthContext ethContext, final MetricsSystem metricsSystem) { + final SnapServerChecker checker = new SnapServerChecker(ethContext, metricsSystem); + ethContext.getEthPeers().setSnapServerChecker(checker); + } + + public CompletableFuture check(final EthPeer peer, final BlockHeader peersHeadHeader) { + LOG.atTrace() + .setMessage("Checking whether peer {} is a snap server ...") + .addArgument(peer::getLoggableId) + .log(); + final CompletableFuture> + snapServerCheckCompletableFuture = getAccountRangeFromPeer(peer, peersHeadHeader); + final CompletableFuture future = new CompletableFuture<>(); + snapServerCheckCompletableFuture.whenComplete( + (peerResult, error) -> { + if (peerResult != null) { + if (!peerResult.getResult().accounts().isEmpty() + || !peerResult.getResult().proofs().isEmpty()) { + LOG.atTrace() + .setMessage("Peer {} is a snap server.") + .addArgument(peer::getLoggableId) + .log(); + future.complete(true); + } else { + LOG.atTrace() + .setMessage("Peer {} is not a snap server.") + .addArgument(peer::getLoggableId) + .log(); + future.complete(false); + } + } + }); + return future; + } + + public CompletableFuture> + getAccountRangeFromPeer(final EthPeer peer, final BlockHeader header) { + return GetAccountRangeFromPeerTask.forAccountRange( + ethContext, Hash.ZERO, Hash.ZERO, header, metricsSystem) + .assignPeer(peer) + .run(); + } +} diff --git a/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/sync/SyncMode.java b/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/sync/SyncMode.java index b5d0c2570..4f3affbe5 100644 --- a/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/sync/SyncMode.java +++ b/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/sync/SyncMode.java @@ -54,4 +54,8 @@ public enum SyncMode { public static boolean isCheckpointSync(final SyncMode syncMode) { return X_CHECKPOINT.equals(syncMode) || CHECKPOINT.equals(syncMode); } + + public static boolean isSnapSync(final SyncMode syncMode) { + return X_SNAP.equals(syncMode) || SNAP.equals(syncMode); + } } diff --git a/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/sync/fastsync/SyncTargetManager.java b/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/sync/fastsync/SyncTargetManager.java index b587b18f2..2acfa54d0 100644 --- a/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/sync/fastsync/SyncTargetManager.java +++ b/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/sync/fastsync/SyncTargetManager.java @@ -42,6 +42,9 @@ import org.slf4j.LoggerFactory; public class SyncTargetManager extends AbstractSyncTargetManager { private static final Logger LOG = LoggerFactory.getLogger(SyncTargetManager.class); + + private static final int LOG_DEBUG_REPEAT_DELAY = 15; + private static final int LOG_INFO_REPEAT_DELAY = 120; private static final int SECONDS_PER_REQUEST = 6; // 5s per request + 1s wait between retries private final WorldStateStorageCoordinator worldStateStorageCoordinator; @@ -52,8 +55,6 @@ public class SyncTargetManager extends AbstractSyncTargetManager { private final FastSyncState fastSyncState; private final AtomicBoolean logDebug = new AtomicBoolean(true); private final AtomicBoolean logInfo = new AtomicBoolean(true); - private final int logDebugRepeatDelay = 15; - private final int logInfoRepeatDelay = 120; public SyncTargetManager( final SynchronizerConfiguration config, @@ -84,14 +85,14 @@ public class SyncTargetManager extends AbstractSyncTargetManager { "Unable to find sync target. Currently checking %d peers for usefulness. Pivot block: %d", ethContext.getEthPeers().peerCount(), pivotBlockHeader.getNumber()), logDebug, - logDebugRepeatDelay); + LOG_DEBUG_REPEAT_DELAY); throttledLog( LOG::info, String.format( "Unable to find sync target. Currently checking %d peers for usefulness.", ethContext.getEthPeers().peerCount()), logInfo, - logInfoRepeatDelay); + LOG_INFO_REPEAT_DELAY); return completedFuture(Optional.empty()); } else { final EthPeer bestPeer = maybeBestPeer.get(); diff --git a/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/manager/EthPeersTest.java b/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/manager/EthPeersTest.java index 59c029414..f6c635aa5 100644 --- a/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/manager/EthPeersTest.java +++ b/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/manager/EthPeersTest.java @@ -21,15 +21,18 @@ import static org.assertj.core.api.Assertions.fail; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verifyNoInteractions; import static org.mockito.Mockito.when; import org.hyperledger.besu.datatypes.Hash; +import org.hyperledger.besu.ethereum.core.BlockHeader; import org.hyperledger.besu.ethereum.core.Difficulty; import org.hyperledger.besu.ethereum.eth.manager.exceptions.NoAvailablePeersException; import org.hyperledger.besu.ethereum.eth.manager.exceptions.PeerDisconnectedException; import org.hyperledger.besu.ethereum.eth.messages.NodeDataMessage; +import org.hyperledger.besu.ethereum.eth.sync.ChainHeadTracker; import org.hyperledger.besu.ethereum.p2p.rlpx.connections.PeerConnection.PeerNotConnected; import org.hyperledger.besu.ethereum.p2p.rlpx.wire.messages.DisconnectMessage.DisconnectReason; @@ -37,6 +40,7 @@ import java.util.Collections; import java.util.Optional; import java.util.OptionalLong; import java.util.concurrent.CancellationException; +import java.util.concurrent.CompletableFuture; import java.util.function.Consumer; import org.junit.jupiter.api.BeforeEach; @@ -56,6 +60,11 @@ public class EthPeersTest { when(peerRequest.sendRequest(any())).thenReturn(responseStream); ethProtocolManager = EthProtocolManagerTestUtil.create(); ethPeers = ethProtocolManager.ethContext().getEthPeers(); + final ChainHeadTracker mock = mock(ChainHeadTracker.class); + final BlockHeader blockHeader = mock(BlockHeader.class); + when(mock.getBestHeaderFromPeer(any())) + .thenReturn(CompletableFuture.completedFuture(blockHeader)); + ethPeers.setChainHeadTracker(mock); } @Test @@ -112,6 +121,9 @@ public class EthPeersTest { @Test public void shouldExecutePeerRequestImmediatelyWhenPeerIsAvailable() throws Exception { final RespondingEthPeer peer = EthProtocolManagerTestUtil.createPeer(ethProtocolManager, 1000); + + when(peerRequest.isEthPeerSuitable(peer.getEthPeer())).thenReturn(true); + final PendingPeerRequest pendingRequest = ethPeers.executePeerRequest(peerRequest, 10, Optional.empty()); @@ -127,6 +139,8 @@ public class EthPeersTest { EthProtocolManagerTestUtil.createPeer(ethProtocolManager, 1000); useRequestSlot(workingPeer.getEthPeer()); + when(peerRequest.isEthPeerSuitable(any())).thenReturn(true); + final PendingPeerRequest pendingRequest = ethPeers.executePeerRequest(peerRequest, 10, Optional.empty()); @@ -147,6 +161,8 @@ public class EthPeersTest { assertThat(leastRecentlyUsedPeer.getEthPeer().outstandingRequests()) .isEqualTo(mostRecentlyUsedPeer.getEthPeer().outstandingRequests()); + when(peerRequest.isEthPeerSuitable(any())).thenReturn(true); + final PendingPeerRequest pendingRequest = ethPeers.executePeerRequest(peerRequest, 10, Optional.empty()); @@ -180,10 +196,13 @@ public class EthPeersTest { EthProtocolManagerTestUtil.createPeer(ethProtocolManager, 1000); useAllAvailableCapacity(suitablePeer.getEthPeer()); + when(peerRequest.isEthPeerSuitable(suitablePeer.getEthPeer())).thenReturn(true); + final PendingPeerRequest pendingRequest = ethPeers.executePeerRequest(peerRequest, 200, Optional.empty()); - verifyNoInteractions(peerRequest); + verify(peerRequest, times(0)).sendRequest(suitablePeer.getEthPeer()); + assertNotDone(pendingRequest); suitablePeer.disconnect(DisconnectReason.TOO_MANY_PEERS); @@ -194,6 +213,8 @@ public class EthPeersTest { public void shouldFailWithPeerNotConnectedIfPeerRequestThrows() throws Exception { final RespondingEthPeer peer = EthProtocolManagerTestUtil.createPeer(ethProtocolManager, 1000); when(peerRequest.sendRequest(peer.getEthPeer())).thenThrow(new PeerNotConnected("Oh dear")); + when(peerRequest.isEthPeerSuitable(any())).thenReturn(true); + final PendingPeerRequest pendingRequest = ethPeers.executePeerRequest(peerRequest, 100, Optional.empty()); @@ -205,9 +226,11 @@ public class EthPeersTest { final RespondingEthPeer peer = EthProtocolManagerTestUtil.createPeer(ethProtocolManager, 1000); useAllAvailableCapacity(peer.getEthPeer()); + when(peerRequest.isEthPeerSuitable(any())).thenReturn(true); + final PendingPeerRequest pendingRequest = ethPeers.executePeerRequest(peerRequest, 100, Optional.empty()); - verifyNoInteractions(peerRequest); + verify(peerRequest, times(0)).sendRequest(peer.getEthPeer()); freeUpCapacity(peer.getEthPeer()); @@ -221,11 +244,12 @@ public class EthPeersTest { EthProtocolManagerTestUtil.createPeer(ethProtocolManager, 10); final RespondingEthPeer peer = EthProtocolManagerTestUtil.createPeer(ethProtocolManager, 1000); + when(peerRequest.isEthPeerSuitable(peer.getEthPeer())).thenReturn(true); useAllAvailableCapacity(peer.getEthPeer()); final PendingPeerRequest pendingRequest = ethPeers.executePeerRequest(peerRequest, 100, Optional.empty()); - verifyNoInteractions(peerRequest); + verify(peerRequest, times(0)).sendRequest(peer.getEthPeer()); freeUpCapacity(peer.getEthPeer()); @@ -238,15 +262,17 @@ public class EthPeersTest { final RespondingEthPeer peer = EthProtocolManagerTestUtil.createPeer(ethProtocolManager, 1000); useAllAvailableCapacity(peer.getEthPeer()); + when(peerRequest.isEthPeerSuitable(peer.getEthPeer())).thenReturn(true); + final PendingPeerRequest pendingRequest = ethPeers.executePeerRequest(peerRequest, 100, Optional.empty()); - verifyNoInteractions(peerRequest); + verify(peerRequest, times(0)).sendRequest(peer.getEthPeer()); pendingRequest.abort(); freeUpCapacity(peer.getEthPeer()); - verifyNoInteractions(peerRequest); + verify(peerRequest, times(0)).sendRequest(peer.getEthPeer()); assertRequestFailure(pendingRequest, CancellationException.class); } @@ -349,6 +375,59 @@ public class EthPeersTest { assertThat(ethPeers.toString()).contains(peerA.getLoggableId()); } + @Test + public void snapServersPreferredWhileSyncing() { + + ethPeers.snapServerPeersNeeded(true); + + while (ethPeers.peerCount() < ethPeers.getMaxPeers()) { + final EthPeer ethPeer = + EthProtocolManagerTestUtil.createPeer( + ethProtocolManager, Difficulty.of(50), 20, false, false) + .getEthPeer(); + assertThat(ethPeers.addPeerToEthPeers(ethPeer)).isTrue(); + } + + final EthPeer nonSnapServingPeer = + EthProtocolManagerTestUtil.createPeer( + ethProtocolManager, Difficulty.of(50), 20, false, false) + .getEthPeer(); + + assertThat(ethPeers.addPeerToEthPeers(nonSnapServingPeer)).isFalse(); + assertThat(nonSnapServingPeer.getConnection().isDisconnected()).isTrue(); + + final EthPeer snapServingPeer = + EthProtocolManagerTestUtil.createPeer( + ethProtocolManager, Difficulty.of(50), 20, true, false) + .getEthPeer(); + + assertThat(ethPeers.addPeerToEthPeers(snapServingPeer)).isTrue(); + assertThat(ethPeers.peerCount()).isEqualTo(ethPeers.getMaxPeers()); + } + + @Test + public void snapServersNotPreferredWhenInSync() { + + ethPeers.snapServerPeersNeeded(false); + + while (ethPeers.peerCount() < ethPeers.getMaxPeers()) { + final EthPeer ethPeer = + EthProtocolManagerTestUtil.createPeer( + ethProtocolManager, Difficulty.of(50), 20, false, false) + .getEthPeer(); + assertThat(ethPeers.addPeerToEthPeers(ethPeer)).isTrue(); + } + + final EthPeer snapServingPeer = + EthProtocolManagerTestUtil.createPeer( + ethProtocolManager, Difficulty.of(50), 20, true, false) + .getEthPeer(); + + assertThat(ethPeers.addPeerToEthPeers(snapServingPeer)).isFalse(); + assertThat(snapServingPeer.getConnection().isDisconnected()).isTrue(); + assertThat(ethPeers.peerCount()).isEqualTo(ethPeers.getMaxPeers()); + } + private void freeUpCapacity(final EthPeer ethPeer) { ethPeers.dispatchMessage(ethPeer, new EthMessage(ethPeer, NodeDataMessage.create(emptyList()))); } diff --git a/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/manager/EthProtocolManagerTest.java b/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/manager/EthProtocolManagerTest.java index ff5d655cc..93a80be2f 100644 --- a/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/manager/EthProtocolManagerTest.java +++ b/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/manager/EthProtocolManagerTest.java @@ -528,7 +528,7 @@ public final class EthProtocolManagerTest { private MockPeerConnection setupPeer( final EthProtocolManager ethManager, final PeerSendHandler onSend) { - final MockPeerConnection peer = setupPeerWithoutStatusExchange(ethManager, onSend); + final MockPeerConnection peerConnection = setupPeerWithoutStatusExchange(ethManager, onSend); final StatusMessage statusMessage = StatusMessage.create( EthProtocolVersion.V63, @@ -536,8 +536,11 @@ public final class EthProtocolManagerTest { blockchain.getChainHead().getTotalDifficulty(), blockchain.getChainHeadHash(), blockchain.getBlockHeader(BlockHeader.GENESIS_BLOCK_NUMBER).get().getHash()); - ethManager.processMessage(EthProtocol.ETH63, new DefaultMessage(peer, statusMessage)); - return peer; + ethManager.processMessage(EthProtocol.ETH63, new DefaultMessage(peerConnection, statusMessage)); + final EthPeers ethPeers = ethManager.ethContext().getEthPeers(); + final EthPeer ethPeer = ethPeers.peer(peerConnection); + ethPeers.addPeerToEthPeers(ethPeer); + return peerConnection; } private MockPeerConnection setupPeerWithoutStatusExchange( diff --git a/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/manager/EthProtocolManagerTestUtil.java b/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/manager/EthProtocolManagerTestUtil.java index 63ada1304..0b0bd1e3e 100644 --- a/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/manager/EthProtocolManagerTestUtil.java +++ b/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/manager/EthProtocolManagerTestUtil.java @@ -16,12 +16,15 @@ package org.hyperledger.besu.ethereum.eth.manager; import static com.google.common.base.Preconditions.checkArgument; import static org.hyperledger.besu.ethereum.core.InMemoryKeyValueStorageProvider.createInMemoryBlockchain; +import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.mock; import org.hyperledger.besu.config.GenesisConfigFile; +import org.hyperledger.besu.datatypes.Hash; import org.hyperledger.besu.ethereum.chain.Blockchain; import org.hyperledger.besu.ethereum.chain.ChainHead; import org.hyperledger.besu.ethereum.chain.GenesisState; +import org.hyperledger.besu.ethereum.core.BlockHeader; import org.hyperledger.besu.ethereum.core.BlockchainSetupUtil; import org.hyperledger.besu.ethereum.core.Difficulty; import org.hyperledger.besu.ethereum.core.ProtocolScheduleFixture; @@ -29,6 +32,8 @@ import org.hyperledger.besu.ethereum.eth.EthProtocol; import org.hyperledger.besu.ethereum.eth.EthProtocolConfiguration; import org.hyperledger.besu.ethereum.eth.manager.snap.SnapProtocolManager; import org.hyperledger.besu.ethereum.eth.peervalidation.PeerValidator; +import org.hyperledger.besu.ethereum.eth.sync.ChainHeadTracker; +import org.hyperledger.besu.ethereum.eth.sync.SyncMode; import org.hyperledger.besu.ethereum.eth.sync.SynchronizerConfiguration; import org.hyperledger.besu.ethereum.eth.transactions.TransactionPool; import org.hyperledger.besu.ethereum.forkid.ForkIdManager; @@ -46,8 +51,10 @@ import java.math.BigInteger; import java.util.Collections; import java.util.Optional; import java.util.OptionalLong; +import java.util.concurrent.CompletableFuture; import org.apache.tuweni.bytes.Bytes; +import org.mockito.Mockito; public class EthProtocolManagerTestUtil { @@ -86,7 +93,13 @@ public class EthProtocolManagerTestUtil { Bytes.random(64), 25, 25, - false); + false, + SyncMode.FAST, + new ForkIdManager(blockchain, Collections.emptyList(), Collections.emptyList(), false)); + + final ChainHeadTracker chainHeadTrackerMock = getChainHeadTrackerMock(); + peers.setChainHeadTracker(chainHeadTrackerMock); + final EthMessages messages = new EthMessages(); final EthScheduler ethScheduler = new DeterministicEthScheduler(TimeoutPolicy.NEVER_TIMEOUT); final EthContext ethContext = new EthContext(peers, messages, ethScheduler); @@ -139,6 +152,8 @@ public class EthProtocolManagerTestUtil { final EthContext ethContext, final ForkIdManager forkIdManager) { + ethPeers.setChainHeadTracker(getChainHeadTrackerMock()); + final BigInteger networkId = BigInteger.ONE; return new EthProtocolManager( blockchain, @@ -205,9 +220,15 @@ public class EthProtocolManagerTestUtil { Bytes.random(64), 25, 25, - false); + false, + SyncMode.FAST, + new ForkIdManager(blockchain, Collections.emptyList(), Collections.emptyList(), false)); final EthMessages messages = new EthMessages(); + final ChainHeadTracker chtMock = getChainHeadTrackerMock(); + + peers.setChainHeadTracker(chtMock); + return create( blockchain, ethScheduler, @@ -219,6 +240,17 @@ public class EthProtocolManagerTestUtil { new EthContext(peers, messages, ethScheduler)); } + public static ChainHeadTracker getChainHeadTrackerMock() { + final ChainHeadTracker chtMock = mock(ChainHeadTracker.class); + final BlockHeader blockHeaderMock = mock(BlockHeader.class); + Mockito.lenient() + .when(chtMock.getBestHeaderFromPeer(any())) + .thenReturn(CompletableFuture.completedFuture(blockHeaderMock)); + Mockito.lenient().when(blockHeaderMock.getNumber()).thenReturn(0L); + Mockito.lenient().when(blockHeaderMock.getStateRoot()).thenReturn(Hash.ZERO); + return chtMock; + } + public static EthProtocolManager create( final ProtocolSchedule protocolSchedule, final Blockchain blockchain, @@ -239,7 +271,9 @@ public class EthProtocolManagerTestUtil { Bytes.random(64), 25, 25, - false); + false, + SyncMode.FAST, + new ForkIdManager(blockchain, Collections.emptyList(), Collections.emptyList(), false)); final EthMessages messages = new EthMessages(); return create( @@ -258,7 +292,7 @@ public class EthProtocolManagerTestUtil { final ProtocolSchedule protocolSchedule, final Blockchain blockchain, final EthScheduler ethScheduler) { - final EthPeers peers = + final EthPeers ethPeers = new EthPeers( EthProtocol.NAME, () -> protocolSchedule.getByBlockHeader(blockchain.getChainHeadHeader()), @@ -269,7 +303,13 @@ public class EthProtocolManagerTestUtil { Bytes.random(64), 25, 25, - false); + false, + SyncMode.FAST, + new ForkIdManager(blockchain, Collections.emptyList(), Collections.emptyList(), false)); + + final ChainHeadTracker chainHeadTrackerMock = getChainHeadTrackerMock(); + ethPeers.setChainHeadTracker(chainHeadTrackerMock); + final EthMessages messages = new EthMessages(); return create( @@ -278,9 +318,9 @@ public class EthProtocolManagerTestUtil { BlockchainSetupUtil.forTesting(DataStorageFormat.FOREST).getWorldArchive(), mock(TransactionPool.class), EthProtocolConfiguration.defaultConfig(), - peers, + ethPeers, messages, - new EthContext(peers, messages, ethScheduler)); + new EthContext(ethPeers, messages, ethScheduler)); } public static EthProtocolManager create() { @@ -446,4 +486,19 @@ public class EthProtocolManagerTestUtil { .estimatedHeight(blockchain.getChainHeadBlockNumber()) .build(); } + + public static RespondingEthPeer createPeer( + final EthProtocolManager ethProtocolManager, + final Difficulty td, + final int estimatedHeight, + final boolean isServingSnap, + final boolean addToEthPeers) { + return RespondingEthPeer.builder() + .ethProtocolManager(ethProtocolManager) + .totalDifficulty(td) + .estimatedHeight(estimatedHeight) + .isServingSnap(isServingSnap) + .addToEthPeers(addToEthPeers) + .build(); + } } diff --git a/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/manager/RespondingEthPeer.java b/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/manager/RespondingEthPeer.java index 742754598..58f489343 100644 --- a/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/manager/RespondingEthPeer.java +++ b/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/manager/RespondingEthPeer.java @@ -121,7 +121,9 @@ public class RespondingEthPeer { final Hash chainHeadHash, final Difficulty totalDifficulty, final OptionalLong estimatedHeight, - final List peerValidators) { + final List peerValidators, + final boolean isServingSnap, + final boolean addToEthPeers) { final EthPeers ethPeers = ethProtocolManager.ethContext().getEthPeers(); final Set caps = new HashSet<>(Collections.singletonList(EthProtocol.ETH63)); @@ -130,10 +132,24 @@ public class RespondingEthPeer { new MockPeerConnection( caps, (cap, msg, conn) -> outgoingMessages.add(new OutgoingMessage(cap, msg))); ethPeers.registerNewConnection(peerConnection, peerValidators); + final int before = ethPeers.peerCount(); final EthPeer peer = ethPeers.peer(peerConnection); peer.registerStatusReceived(chainHeadHash, totalDifficulty, 63, peerConnection); estimatedHeight.ifPresent(height -> peer.chainState().update(chainHeadHash, height)); - peer.registerStatusSent(peerConnection); + if (addToEthPeers) { + peer.registerStatusSent(peerConnection); + ethPeers.addPeerToEthPeers(peer); + while (ethPeers.peerCount() + <= before) { // this is needed to make sure that the peer is added to the active + // connections + try { + Thread.sleep(100L); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + } + } + peer.setIsServingSnap(isServingSnap); return new RespondingEthPeer( ethProtocolManager, snapProtocolManager, peerConnection, peer, outgoingMessages); @@ -396,6 +412,8 @@ public class RespondingEthPeer { private Difficulty totalDifficulty = Difficulty.of(1000L); private OptionalLong estimatedHeight = OptionalLong.of(1000L); private final List peerValidators = new ArrayList<>(); + private boolean isServingSnap = false; + private boolean addToEthPeers = true; public RespondingEthPeer build() { checkNotNull(ethProtocolManager, "Must configure EthProtocolManager"); @@ -406,7 +424,9 @@ public class RespondingEthPeer { chainHeadHash, totalDifficulty, estimatedHeight, - peerValidators); + peerValidators, + isServingSnap, + addToEthPeers); } public Builder ethProtocolManager(final EthProtocolManager ethProtocolManager) { @@ -444,6 +464,11 @@ public class RespondingEthPeer { return this; } + public Builder isServingSnap(final boolean isServingSnap) { + this.isServingSnap = isServingSnap; + return this; + } + public Builder peerValidators(final List peerValidators) { checkNotNull(peerValidators); this.peerValidators.addAll(peerValidators); @@ -454,6 +479,11 @@ public class RespondingEthPeer { peerValidators(Arrays.asList(peerValidators)); return this; } + + public Builder addToEthPeers(final boolean addToEthPeers) { + this.addToEthPeers = addToEthPeers; + return this; + } } static class OutgoingMessage { diff --git a/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/manager/ethtaskutils/AbstractMessageTaskTest.java b/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/manager/ethtaskutils/AbstractMessageTaskTest.java index 2f0657d23..6dbea259c 100644 --- a/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/manager/ethtaskutils/AbstractMessageTaskTest.java +++ b/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/manager/ethtaskutils/AbstractMessageTaskTest.java @@ -38,11 +38,13 @@ import org.hyperledger.besu.ethereum.eth.manager.EthProtocolManagerTestUtil; import org.hyperledger.besu.ethereum.eth.manager.EthScheduler; import org.hyperledger.besu.ethereum.eth.manager.RespondingEthPeer; import org.hyperledger.besu.ethereum.eth.manager.task.EthTask; +import org.hyperledger.besu.ethereum.eth.sync.SyncMode; import org.hyperledger.besu.ethereum.eth.sync.state.SyncState; import org.hyperledger.besu.ethereum.eth.transactions.BlobCache; import org.hyperledger.besu.ethereum.eth.transactions.TransactionPool; import org.hyperledger.besu.ethereum.eth.transactions.TransactionPoolConfiguration; import org.hyperledger.besu.ethereum.eth.transactions.TransactionPoolFactory; +import org.hyperledger.besu.ethereum.forkid.ForkIdManager; import org.hyperledger.besu.ethereum.mainnet.ProtocolSchedule; import org.hyperledger.besu.metrics.noop.NoOpMetricsSystem; import org.hyperledger.besu.plugin.services.MetricsSystem; @@ -121,7 +123,10 @@ public abstract class AbstractMessageTaskTest { Bytes.random(64), MAX_PEERS, MAX_PEERS, - false)); + false, + SyncMode.FAST, + new ForkIdManager( + blockchain, Collections.emptyList(), Collections.emptyList(), false))); final EthMessages ethMessages = new EthMessages(); final EthScheduler ethScheduler = diff --git a/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/sync/AbstractBlockPropagationManagerTest.java b/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/sync/AbstractBlockPropagationManagerTest.java index a91b19c8e..dcc0239f6 100644 --- a/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/sync/AbstractBlockPropagationManagerTest.java +++ b/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/sync/AbstractBlockPropagationManagerTest.java @@ -55,6 +55,7 @@ import org.hyperledger.besu.ethereum.eth.messages.NewBlockMessage; import org.hyperledger.besu.ethereum.eth.sync.BlockPropagationManager.ProcessingBlocksManager; import org.hyperledger.besu.ethereum.eth.sync.state.PendingBlocksManager; import org.hyperledger.besu.ethereum.eth.sync.state.SyncState; +import org.hyperledger.besu.ethereum.forkid.ForkIdManager; import org.hyperledger.besu.ethereum.mainnet.MainnetBlockHeaderFunctions; import org.hyperledger.besu.ethereum.mainnet.ProtocolSchedule; import org.hyperledger.besu.ethereum.mainnet.ProtocolSpec; @@ -629,7 +630,10 @@ public abstract class AbstractBlockPropagationManagerTest { Bytes.random(64), 25, 25, - false), + false, + SyncMode.SNAP, + new ForkIdManager( + blockchain, Collections.emptyList(), Collections.emptyList(), false)), new EthMessages(), ethScheduler); final BlockPropagationManager blockPropagationManager = @@ -767,7 +771,10 @@ public abstract class AbstractBlockPropagationManagerTest { Bytes.random(64), 25, 25, - false), + false, + SyncMode.SNAP, + new ForkIdManager( + blockchain, Collections.emptyList(), Collections.emptyList(), false)), new EthMessages(), ethScheduler); final BlockPropagationManager blockPropagationManager = diff --git a/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/sync/ChainHeadTrackerTest.java b/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/sync/ChainHeadTrackerTest.java index 393824af7..b46a109c1 100644 --- a/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/sync/ChainHeadTrackerTest.java +++ b/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/sync/ChainHeadTrackerTest.java @@ -98,7 +98,7 @@ public class ChainHeadTrackerTest { blockchainSetupUtil.getBlockchain(), blockchainSetupUtil.getWorldArchive(), blockchainSetupUtil.getTransactionPool()); - chainHeadTracker.onPeerConnected(respondingPeer.getEthPeer()); + chainHeadTracker.getBestHeaderFromPeer(respondingPeer.getEthPeer()); Assertions.assertThat(chainHeadState().getEstimatedHeight()).isZero(); @@ -118,7 +118,7 @@ public class ChainHeadTrackerTest { blockchainSetupUtil.getBlockchain(), blockchainSetupUtil.getWorldArchive(), blockchainSetupUtil.getTransactionPool()); - chainHeadTracker.onPeerConnected(respondingPeer.getEthPeer()); + chainHeadTracker.getBestHeaderFromPeer(respondingPeer.getEthPeer()); // Change the hash of the current known head respondingPeer.getEthPeer().chainState().statusReceived(Hash.EMPTY_TRIE_HASH, Difficulty.ONE); @@ -137,7 +137,7 @@ public class ChainHeadTrackerTest { blockchainSetupUtil.getBlockchain(), blockchainSetupUtil.getWorldArchive(), blockchainSetupUtil.getTransactionPool()); - chainHeadTracker.onPeerConnected(respondingPeer.getEthPeer()); + chainHeadTracker.getBestHeaderFromPeer(respondingPeer.getEthPeer()); Assertions.assertThat(chainHeadState().getEstimatedHeight()).isZero(); diff --git a/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/sync/fastsync/PivotBlockRetrieverTest.java b/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/sync/fastsync/PivotBlockRetrieverTest.java index ae96bbf76..41317fdab 100644 --- a/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/sync/fastsync/PivotBlockRetrieverTest.java +++ b/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/sync/fastsync/PivotBlockRetrieverTest.java @@ -288,15 +288,15 @@ public class PivotBlockRetrieverTest { final CompletableFuture future = pivotBlockRetriever.downloadPivotBlockHeader(); peerA.respond(responder); - peerB.respondTimes(emptyResponder, 3); + peerB.respondTimes(emptyResponder, 4); // PeerA should have responded, while peerB is being retried, peerC shouldn't have been queried // yet assertThat(future).isNotCompleted(); assertThat(peerC.hasOutstandingRequests()).isFalse(); - // After exhausting retries for peerB, we should try peerC - peerB.respondTimes(emptyResponder, 2); + // After exhausting retries (max retries is 5) for peerB, we should try peerC + peerB.respondTimes(emptyResponder, 1); peerC.respond(responder); assertThat(future) diff --git a/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/transactions/TestNode.java b/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/transactions/TestNode.java index 743f0b47e..8e9bda89c 100644 --- a/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/transactions/TestNode.java +++ b/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/transactions/TestNode.java @@ -18,6 +18,7 @@ import static java.util.Collections.singletonList; import static java.util.Objects.requireNonNull; import static org.hyperledger.besu.ethereum.core.InMemoryKeyValueStorageProvider.createInMemoryBlockchain; import static org.hyperledger.besu.ethereum.core.InMemoryKeyValueStorageProvider.createInMemoryWorldStateArchive; +import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyLong; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; @@ -30,6 +31,7 @@ import org.hyperledger.besu.ethereum.ProtocolContext; import org.hyperledger.besu.ethereum.chain.BadBlockManager; import org.hyperledger.besu.ethereum.chain.GenesisState; import org.hyperledger.besu.ethereum.chain.MutableBlockchain; +import org.hyperledger.besu.ethereum.core.BlockHeader; import org.hyperledger.besu.ethereum.core.BlockHeaderFunctions; import org.hyperledger.besu.ethereum.core.InMemoryKeyValueStorageProvider; import org.hyperledger.besu.ethereum.core.MiningParameters; @@ -42,8 +44,11 @@ import org.hyperledger.besu.ethereum.eth.manager.EthMessages; import org.hyperledger.besu.ethereum.eth.manager.EthPeers; import org.hyperledger.besu.ethereum.eth.manager.EthProtocolManager; import org.hyperledger.besu.ethereum.eth.manager.EthScheduler; +import org.hyperledger.besu.ethereum.eth.sync.ChainHeadTracker; +import org.hyperledger.besu.ethereum.eth.sync.SyncMode; import org.hyperledger.besu.ethereum.eth.sync.SynchronizerConfiguration; import org.hyperledger.besu.ethereum.eth.sync.state.SyncState; +import org.hyperledger.besu.ethereum.forkid.ForkIdManager; import org.hyperledger.besu.ethereum.mainnet.ProtocolSchedule; import org.hyperledger.besu.ethereum.mainnet.ScheduleBasedBlockHeaderFunctions; import org.hyperledger.besu.ethereum.p2p.config.DiscoveryConfiguration; @@ -77,6 +82,7 @@ import java.util.concurrent.CompletableFuture; import io.vertx.core.Vertx; import org.apache.tuweni.bytes.Bytes; +import org.mockito.Mockito; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -153,7 +159,12 @@ public class TestNode implements Closeable { Bytes.random(64), 25, 25, - false); + false, + SyncMode.SNAP, + new ForkIdManager(blockchain, Collections.emptyList(), Collections.emptyList(), false)); + + final ChainHeadTracker mockCHT = getChainHeadTracker(); + ethPeers.setChainHeadTracker(mockCHT); final EthScheduler scheduler = new EthScheduler(1, 1, 1, metricsSystem); final EthContext ethContext = new EthContext(ethPeers, ethMessages, scheduler); @@ -189,6 +200,7 @@ public class TestNode implements Closeable { NetworkRunner.builder() .subProtocols(EthProtocol.get()) .protocolManagers(singletonList(ethProtocolManager)) + .ethPeersShouldConnect((p, d) -> true) .network( capabilities -> DefaultP2PNetwork.builder() @@ -201,8 +213,8 @@ public class TestNode implements Closeable { .blockchain(blockchain) .blockNumberForks(Collections.emptyList()) .timestampForks(Collections.emptyList()) - .allConnectionsSupplier(ethPeers::getAllConnections) - .allActiveConnectionsSupplier(ethPeers::getAllActiveConnections) + .allConnectionsSupplier(ethPeers::streamAllConnections) + .allActiveConnectionsSupplier(ethPeers::streamAllActiveConnections) .build()) .metricsSystem(new NoOpMetricsSystem()) .build(); @@ -217,6 +229,16 @@ public class TestNode implements Closeable { selfPeer = DefaultPeer.fromEnodeURL(network.getLocalEnode().get()); } + private static ChainHeadTracker getChainHeadTracker() { + final ChainHeadTracker mockCHT = mock(ChainHeadTracker.class); + final BlockHeader mockBlockHeader = mock(BlockHeader.class); + Mockito.lenient().when(mockBlockHeader.getNumber()).thenReturn(0L); + Mockito.lenient() + .when(mockCHT.getBestHeaderFromPeer(any())) + .thenReturn(CompletableFuture.completedFuture(mockBlockHeader)); + return mockCHT; + } + public Bytes id() { return nodeKey.getPublicKey().getEncodedBytes(); } diff --git a/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/transactions/TransactionPoolFactoryTest.java b/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/transactions/TransactionPoolFactoryTest.java index d6b1b6538..ef8d07017 100644 --- a/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/transactions/TransactionPoolFactoryTest.java +++ b/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/transactions/TransactionPoolFactoryTest.java @@ -34,6 +34,7 @@ import org.hyperledger.besu.ethereum.ProtocolContext; import org.hyperledger.besu.ethereum.chain.BadBlockManager; import org.hyperledger.besu.ethereum.chain.BlockAddedObserver; import org.hyperledger.besu.ethereum.chain.MutableBlockchain; +import org.hyperledger.besu.ethereum.core.Block; import org.hyperledger.besu.ethereum.core.BlockHeaderTestFixture; import org.hyperledger.besu.ethereum.core.MiningParameters; import org.hyperledger.besu.ethereum.core.PrivacyParameters; @@ -44,6 +45,7 @@ import org.hyperledger.besu.ethereum.eth.manager.EthMessages; import org.hyperledger.besu.ethereum.eth.manager.EthPeers; import org.hyperledger.besu.ethereum.eth.manager.EthProtocolManager; import org.hyperledger.besu.ethereum.eth.manager.EthScheduler; +import org.hyperledger.besu.ethereum.eth.sync.SyncMode; import org.hyperledger.besu.ethereum.eth.sync.SynchronizerConfiguration; import org.hyperledger.besu.ethereum.eth.sync.state.SyncState; import org.hyperledger.besu.ethereum.eth.transactions.layered.LayeredPendingTransactions; @@ -102,6 +104,9 @@ public class TransactionPoolFactoryTest { @BeforeEach public void setup() { when(blockchain.getBlockHashByNumber(anyLong())).thenReturn(Optional.of(mock(Hash.class))); + final Block mockBlock = mock(Block.class); + when(mockBlock.getHash()).thenReturn(Hash.ZERO); + when(blockchain.getGenesisBlock()).thenReturn(mockBlock); when(context.getBlockchain()).thenReturn(blockchain); final NodeMessagePermissioningProvider nmpp = (destinationEnode, code) -> true; @@ -116,7 +121,9 @@ public class TransactionPoolFactoryTest { Bytes.random(64), 25, 25, - false); + false, + SyncMode.SNAP, + new ForkIdManager(blockchain, Collections.emptyList(), Collections.emptyList(), false)); when(ethContext.getEthMessages()).thenReturn(ethMessages); when(ethContext.getEthPeers()).thenReturn(ethPeers); diff --git a/ethereum/p2p/src/main/java/org/hyperledger/besu/ethereum/p2p/network/NetworkRunner.java b/ethereum/p2p/src/main/java/org/hyperledger/besu/ethereum/p2p/network/NetworkRunner.java index 028d5acd8..77e9903bb 100644 --- a/ethereum/p2p/src/main/java/org/hyperledger/besu/ethereum/p2p/network/NetworkRunner.java +++ b/ethereum/p2p/src/main/java/org/hyperledger/besu/ethereum/p2p/network/NetworkRunner.java @@ -14,6 +14,7 @@ */ package org.hyperledger.besu.ethereum.p2p.network; +import org.hyperledger.besu.ethereum.p2p.peers.Peer; import org.hyperledger.besu.ethereum.p2p.rlpx.RlpxAgent; import org.hyperledger.besu.ethereum.p2p.rlpx.wire.Capability; import org.hyperledger.besu.ethereum.p2p.rlpx.wire.SubProtocol; @@ -31,6 +32,7 @@ import java.util.List; import java.util.Map; import java.util.concurrent.CountDownLatch; import java.util.concurrent.atomic.AtomicBoolean; +import java.util.function.BiFunction; import java.util.stream.Collectors; import org.slf4j.Logger; @@ -47,15 +49,18 @@ public class NetworkRunner implements AutoCloseable { private final Map subProtocols; private final List protocolManagers; private final LabelledMetric inboundMessageCounter; + private final BiFunction ethPeersShouldConnect; private NetworkRunner( final P2PNetwork network, final Map subProtocols, final List protocolManagers, - final MetricsSystem metricsSystem) { + final MetricsSystem metricsSystem, + final BiFunction ethPeersShouldConnect) { this.network = network; this.protocolManagers = protocolManagers; this.subProtocols = subProtocols; + this.ethPeersShouldConnect = ethPeersShouldConnect; inboundMessageCounter = metricsSystem.createLabelledCounter( BesuMetricCategory.NETWORK, @@ -158,8 +163,7 @@ public class NetworkRunner implements AutoCloseable { protocolManager.handleNewConnection(connection); }); - network.subscribeConnectRequest( - (peer, incoming) -> protocolManager.shouldConnect(peer, incoming)); + network.subscribeConnectRequest(ethPeersShouldConnect::apply); network.subscribeDisconnect( (connection, disconnectReason, initiatedByPeer) -> { @@ -186,6 +190,7 @@ public class NetworkRunner implements AutoCloseable { List protocolManagers = new ArrayList<>(); List subProtocols = new ArrayList<>(); MetricsSystem metricsSystem; + private BiFunction ethPeersShouldConnect; public NetworkRunner build() { final Map subProtocolMap = new HashMap<>(); @@ -203,7 +208,8 @@ public class NetworkRunner implements AutoCloseable { } } final P2PNetwork network = networkProvider.build(caps); - return new NetworkRunner(network, subProtocolMap, protocolManagers, metricsSystem); + return new NetworkRunner( + network, subProtocolMap, protocolManagers, metricsSystem, ethPeersShouldConnect); } public Builder protocolManagers(final List protocolManagers) { @@ -230,6 +236,11 @@ public class NetworkRunner implements AutoCloseable { this.metricsSystem = metricsSystem; return this; } + + public Builder ethPeersShouldConnect(final BiFunction shouldConnect) { + this.ethPeersShouldConnect = shouldConnect; + return this; + } } @FunctionalInterface diff --git a/ethereum/p2p/src/main/java/org/hyperledger/besu/ethereum/p2p/network/ProtocolManager.java b/ethereum/p2p/src/main/java/org/hyperledger/besu/ethereum/p2p/network/ProtocolManager.java index 603464d69..c61e6d907 100644 --- a/ethereum/p2p/src/main/java/org/hyperledger/besu/ethereum/p2p/network/ProtocolManager.java +++ b/ethereum/p2p/src/main/java/org/hyperledger/besu/ethereum/p2p/network/ProtocolManager.java @@ -14,7 +14,6 @@ */ package org.hyperledger.besu.ethereum.p2p.network; -import org.hyperledger.besu.ethereum.p2p.peers.Peer; import org.hyperledger.besu.ethereum.p2p.rlpx.connections.PeerConnection; import org.hyperledger.besu.ethereum.p2p.rlpx.wire.Capability; import org.hyperledger.besu.ethereum.p2p.rlpx.wire.Message; @@ -59,15 +58,6 @@ public interface ProtocolManager extends AutoCloseable { */ void handleNewConnection(PeerConnection peerConnection); - /** - * Call this to find out whether we should try to connect to a certain peer - * - * @param peer the peer that we are trying to connect to - * @param incoming true if the connection is incoming - * @return true, if the ProtocolManager wants to connect to the peer, false otherwise - */ - boolean shouldConnect(Peer peer, final boolean incoming); - /** * Handles peer disconnects. * diff --git a/ethereum/p2p/src/main/java/org/hyperledger/besu/ethereum/p2p/rlpx/wire/messages/DisconnectMessage.java b/ethereum/p2p/src/main/java/org/hyperledger/besu/ethereum/p2p/rlpx/wire/messages/DisconnectMessage.java index 87df88c40..d951ecc5d 100644 --- a/ethereum/p2p/src/main/java/org/hyperledger/besu/ethereum/p2p/rlpx/wire/messages/DisconnectMessage.java +++ b/ethereum/p2p/src/main/java/org/hyperledger/besu/ethereum/p2p/rlpx/wire/messages/DisconnectMessage.java @@ -129,11 +129,11 @@ public final class DisconnectMessage extends AbstractMessageData { USELESS_PEER_NO_SHARED_CAPABILITIES((byte) 0x03, "No shared capabilities"), USELESS_PEER_WORLD_STATE_NOT_AVAILABLE((byte) 0x03, "World state not available"), USELESS_PEER_MISMATCHED_PIVOT_BLOCK((byte) 0x03, "Mismatched pivot block"), - USELESS_PEER_FAILED_TO_RETRIEVE_CHAIN_STATE( - (byte) 0x03, "Failed to retrieve header for chain state"), + USELESS_PEER_FAILED_TO_RETRIEVE_CHAIN_HEAD((byte) 0x03, "Failed to retrieve chain head header"), USELESS_PEER_CANNOT_CONFIRM_PIVOT_BLOCK((byte) 0x03, "Peer failed to confirm pivot block"), USELESS_PEER_BY_REPUTATION((byte) 0x03, "Lowest reputation score"), USELESS_PEER_BY_CHAIN_COMPARATOR((byte) 0x03, "Lowest by chain height comparator"), + USELESS_PEER_EXCEEDS_TRAILING_PEERS((byte) 0x03, "Adding peer would exceed max trailing peers"), TOO_MANY_PEERS((byte) 0x04), ALREADY_CONNECTED((byte) 0x05), INCOMPATIBLE_P2P_PROTOCOL_VERSION((byte) 0x06), diff --git a/ethereum/retesteth/src/main/java/org/hyperledger/besu/ethereum/retesteth/RetestethContext.java b/ethereum/retesteth/src/main/java/org/hyperledger/besu/ethereum/retesteth/RetestethContext.java index eb43f96df..fd39ef7f4 100644 --- a/ethereum/retesteth/src/main/java/org/hyperledger/besu/ethereum/retesteth/RetestethContext.java +++ b/ethereum/retesteth/src/main/java/org/hyperledger/besu/ethereum/retesteth/RetestethContext.java @@ -42,12 +42,14 @@ import org.hyperledger.besu.ethereum.eth.manager.EthContext; import org.hyperledger.besu.ethereum.eth.manager.EthMessages; import org.hyperledger.besu.ethereum.eth.manager.EthPeers; import org.hyperledger.besu.ethereum.eth.manager.EthScheduler; +import org.hyperledger.besu.ethereum.eth.sync.SyncMode; import org.hyperledger.besu.ethereum.eth.sync.state.SyncState; import org.hyperledger.besu.ethereum.eth.transactions.BlobCache; import org.hyperledger.besu.ethereum.eth.transactions.ImmutableTransactionPoolConfiguration; import org.hyperledger.besu.ethereum.eth.transactions.TransactionPool; import org.hyperledger.besu.ethereum.eth.transactions.TransactionPoolConfiguration; import org.hyperledger.besu.ethereum.eth.transactions.TransactionPoolFactory; +import org.hyperledger.besu.ethereum.forkid.ForkIdManager; import org.hyperledger.besu.ethereum.mainnet.EpochCalculator; import org.hyperledger.besu.ethereum.mainnet.HeaderValidationMode; import org.hyperledger.besu.ethereum.mainnet.MainnetBlockHeaderFunctions; @@ -73,6 +75,7 @@ import org.hyperledger.besu.util.Subscribers; import org.hyperledger.besu.util.number.Fraction; import java.util.Collections; +import java.util.List; import java.util.Optional; import java.util.concurrent.locks.ReentrantLock; import java.util.function.Supplier; @@ -239,7 +242,9 @@ public class RetestethContext { localNodeKey, MAX_PEERS, MAX_PEERS, - false); + false, + SyncMode.FAST, + new ForkIdManager(blockchain, List.of(), List.of(), false)); final SyncState syncState = new SyncState(blockchain, ethPeers); ethScheduler = new EthScheduler(1, 1, 1, 1, metricsSystem); From 4ee14eca1de3857af218311cf466970999cf0d40 Mon Sep 17 00:00:00 2001 From: Gabriel-Trintinalia Date: Thu, 4 Jul 2024 12:21:25 +1000 Subject: [PATCH 36/58] Implement System Calls (#7263) Signed-off-by: Gabriel-Trintinalia --- .../blockcreation/AbstractBlockCreator.java | 16 +- .../AbstractBlockCreatorTest.java | 4 +- .../mainnet/AbstractBlockProcessor.java | 14 +- .../mainnet/MainnetTransactionProcessor.java | 2 +- .../ethereum/mainnet/SystemCallProcessor.java | 141 ++++++++++++ .../WithdrawalRequestContractHelper.java | 197 ----------------- .../AbstractSystemCallRequestProcessor.java | 102 +++++++++ .../requests/DepositRequestProcessor.java | 7 +- .../requests/ProcessRequestContext.java | 32 +++ .../mainnet/requests/RequestProcessor.java | 6 +- .../requests/RequestProcessorCoordinator.java | 7 +- .../requests/WithdrawalRequestProcessor.java | 63 ++++-- .../requests/WithdrawalRequestValidator.java | 6 +- .../mainnet/SystemCallProcessorTest.java | 113 ++++++++++ .../WithdrawalRequestContractHelperTest.java | 205 ------------------ ...ithdrawalRequestValidatorTestFixtures.java | 2 +- .../hyperledger/besu/evmtool/T8nExecutor.java | 12 +- 17 files changed, 487 insertions(+), 442 deletions(-) create mode 100644 ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/SystemCallProcessor.java delete mode 100644 ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/WithdrawalRequestContractHelper.java create mode 100644 ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/requests/AbstractSystemCallRequestProcessor.java create mode 100644 ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/requests/ProcessRequestContext.java create mode 100644 ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/SystemCallProcessorTest.java delete mode 100644 ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/WithdrawalRequestContractHelperTest.java diff --git a/ethereum/blockcreation/src/main/java/org/hyperledger/besu/ethereum/blockcreation/AbstractBlockCreator.java b/ethereum/blockcreation/src/main/java/org/hyperledger/besu/ethereum/blockcreation/AbstractBlockCreator.java index 15f3b16d8..78c32842f 100644 --- a/ethereum/blockcreation/src/main/java/org/hyperledger/besu/ethereum/blockcreation/AbstractBlockCreator.java +++ b/ethereum/blockcreation/src/main/java/org/hyperledger/besu/ethereum/blockcreation/AbstractBlockCreator.java @@ -50,7 +50,9 @@ import org.hyperledger.besu.ethereum.mainnet.WithdrawalsProcessor; import org.hyperledger.besu.ethereum.mainnet.feemarket.BaseFeeMarket; import org.hyperledger.besu.ethereum.mainnet.feemarket.ExcessBlobGasCalculator; import org.hyperledger.besu.ethereum.mainnet.feemarket.FeeMarket; +import org.hyperledger.besu.ethereum.mainnet.requests.ProcessRequestContext; import org.hyperledger.besu.ethereum.mainnet.requests.RequestProcessorCoordinator; +import org.hyperledger.besu.ethereum.vm.CachingBlockHashLookup; import org.hyperledger.besu.evm.account.MutableAccount; import org.hyperledger.besu.evm.worldstate.WorldUpdater; import org.hyperledger.besu.plugin.services.exception.StorageException; @@ -241,10 +243,18 @@ public abstract class AbstractBlockCreator implements AsyncBlockCreator { // EIP-7685: process EL requests final Optional requestProcessor = newProtocolSpec.getRequestProcessorCoordinator(); + + ProcessRequestContext context = + new ProcessRequestContext( + processableBlockHeader, + disposableWorldState, + newProtocolSpec, + transactionResults.getReceipts(), + new CachingBlockHashLookup(processableBlockHeader, protocolContext.getBlockchain()), + operationTracer); + Optional> maybeRequests = - requestProcessor.flatMap( - processor -> - processor.process(disposableWorldState, transactionResults.getReceipts())); + requestProcessor.flatMap(processor -> processor.process(context)); throwIfStopped(); diff --git a/ethereum/blockcreation/src/test/java/org/hyperledger/besu/ethereum/blockcreation/AbstractBlockCreatorTest.java b/ethereum/blockcreation/src/test/java/org/hyperledger/besu/ethereum/blockcreation/AbstractBlockCreatorTest.java index 856bf874b..68d13987b 100644 --- a/ethereum/blockcreation/src/test/java/org/hyperledger/besu/ethereum/blockcreation/AbstractBlockCreatorTest.java +++ b/ethereum/blockcreation/src/test/java/org/hyperledger/besu/ethereum/blockcreation/AbstractBlockCreatorTest.java @@ -77,6 +77,7 @@ import org.hyperledger.besu.ethereum.mainnet.WithdrawalsProcessor; import org.hyperledger.besu.ethereum.mainnet.feemarket.CancunFeeMarket; import org.hyperledger.besu.ethereum.mainnet.requests.DepositRequestProcessor; import org.hyperledger.besu.ethereum.mainnet.requests.DepositRequestValidator; +import org.hyperledger.besu.ethereum.mainnet.requests.ProcessRequestContext; import org.hyperledger.besu.ethereum.mainnet.requests.RequestProcessorCoordinator; import org.hyperledger.besu.ethereum.mainnet.requests.RequestsValidatorCoordinator; import org.hyperledger.besu.evm.internal.EvmConfiguration; @@ -135,7 +136,8 @@ abstract class AbstractBlockCreatorTest { final List expectedDepositRequests = List.of(expectedDepositRequest); var depositRequestsFromReceipts = - new DepositRequestProcessor(DEFAULT_DEPOSIT_CONTRACT_ADDRESS).process(null, receipts); + new DepositRequestProcessor(DEFAULT_DEPOSIT_CONTRACT_ADDRESS) + .process(new ProcessRequestContext(null, null, null, receipts, null, null)); assertThat(depositRequestsFromReceipts.get()).isEqualTo(expectedDepositRequests); } diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/AbstractBlockProcessor.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/AbstractBlockProcessor.java index 888bc848f..8ecfa453d 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/AbstractBlockProcessor.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/AbstractBlockProcessor.java @@ -29,6 +29,7 @@ import org.hyperledger.besu.ethereum.core.Request; import org.hyperledger.besu.ethereum.core.Transaction; import org.hyperledger.besu.ethereum.core.TransactionReceipt; import org.hyperledger.besu.ethereum.core.Withdrawal; +import org.hyperledger.besu.ethereum.mainnet.requests.ProcessRequestContext; import org.hyperledger.besu.ethereum.mainnet.requests.RequestProcessorCoordinator; import org.hyperledger.besu.ethereum.privacy.storage.PrivateMetadataUpdater; import org.hyperledger.besu.ethereum.processing.TransactionProcessingResult; @@ -107,6 +108,7 @@ public abstract class AbstractBlockProcessor implements BlockProcessor { final ProtocolSpec protocolSpec = protocolSchedule.getByBlockHeader(blockHeader); protocolSpec.getBlockHashProcessor().processBlockHashes(blockchain, worldState, blockHeader); + final BlockHashLookup blockHashLookup = new CachingBlockHashLookup(blockHeader, blockchain); for (final Transaction transaction : transactions) { if (!hasAvailableBlockBudget(blockHeader, transaction, currentGasUsed)) { @@ -115,7 +117,6 @@ public abstract class AbstractBlockProcessor implements BlockProcessor { final WorldUpdater worldStateUpdater = worldState.updater(); - final BlockHashLookup blockHashLookup = new CachingBlockHashLookup(blockHeader, blockchain); final Address miningBeneficiary = miningBeneficiaryCalculator.calculateBeneficiary(blockHeader); @@ -197,7 +198,16 @@ public abstract class AbstractBlockProcessor implements BlockProcessor { protocolSpec.getRequestProcessorCoordinator(); Optional> maybeRequests = Optional.empty(); if (requestProcessor.isPresent()) { - maybeRequests = requestProcessor.get().process(worldState, receipts); + ProcessRequestContext context = + new ProcessRequestContext( + blockHeader, + worldState, + protocolSpec, + receipts, + blockHashLookup, + OperationTracer.NO_TRACING); + + maybeRequests = requestProcessor.get().process(context); } if (!rewardCoinbase(worldState, blockHeader, ommers, skipZeroBlockRewards)) { diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/MainnetTransactionProcessor.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/MainnetTransactionProcessor.java index d982265f2..53801d14c 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/MainnetTransactionProcessor.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/MainnetTransactionProcessor.java @@ -563,7 +563,7 @@ public class MainnetTransactionProcessor { executor.process(frame, operationTracer); } - private AbstractMessageProcessor getMessageProcessor(final MessageFrame.Type type) { + public AbstractMessageProcessor getMessageProcessor(final MessageFrame.Type type) { return switch (type) { case MESSAGE_CALL -> messageCallProcessor; case CONTRACT_CREATION -> contractCreationProcessor; diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/SystemCallProcessor.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/SystemCallProcessor.java new file mode 100644 index 000000000..f74de7944 --- /dev/null +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/SystemCallProcessor.java @@ -0,0 +1,141 @@ +/* + * Copyright contributors to Hyperledger Besu. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on + * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the + * specific language governing permissions and limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + */ +package org.hyperledger.besu.ethereum.mainnet; + +import static org.hyperledger.besu.evm.frame.MessageFrame.DEFAULT_MAX_STACK_SIZE; + +import org.hyperledger.besu.datatypes.Address; +import org.hyperledger.besu.datatypes.Wei; +import org.hyperledger.besu.ethereum.core.ProcessableBlockHeader; +import org.hyperledger.besu.evm.account.Account; +import org.hyperledger.besu.evm.code.CodeV0; +import org.hyperledger.besu.evm.frame.MessageFrame; +import org.hyperledger.besu.evm.operation.BlockHashOperation; +import org.hyperledger.besu.evm.processor.AbstractMessageProcessor; +import org.hyperledger.besu.evm.tracing.OperationTracer; +import org.hyperledger.besu.evm.worldstate.WorldUpdater; + +import java.util.Deque; +import java.util.Optional; + +import org.apache.tuweni.bytes.Bytes; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class SystemCallProcessor { + private static final Logger LOG = LoggerFactory.getLogger(SystemCallProcessor.class); + + /** The system address */ + static final Address SYSTEM_ADDRESS = + Address.fromHexString("0xfffffffffffffffffffffffffffffffffffffffe"); + + private final MainnetTransactionProcessor mainnetTransactionProcessor; + + public SystemCallProcessor(final MainnetTransactionProcessor mainnetTransactionProcessor) { + this.mainnetTransactionProcessor = mainnetTransactionProcessor; + } + + /** + * Processes a system call to a specified address, using the provided world state, block header, + * operation tracer, and block hash lookup. + * + * @param callAddress the address to call. + * @param worldState the current world state. + * @param blockHeader the current block header. + * @param operationTracer the operation tracer for tracing EVM operations. + * @param blockHashLookup the block hash lookup function. + * @return the output data from the call + */ + public Bytes process( + final Address callAddress, + final WorldUpdater worldState, + final ProcessableBlockHeader blockHeader, + final OperationTracer operationTracer, + final BlockHashOperation.BlockHashLookup blockHashLookup) { + + // if no code exists at CALL_ADDRESS, the call must fail silently + final Account maybeContract = worldState.get(callAddress); + if (maybeContract == null) { + LOG.trace("System call address not found {}", callAddress); + return null; + } + + final AbstractMessageProcessor messageProcessor = + mainnetTransactionProcessor.getMessageProcessor(MessageFrame.Type.MESSAGE_CALL); + final MessageFrame initialFrame = + createCallFrame(callAddress, worldState, blockHeader, blockHashLookup); + + return processFrame(initialFrame, messageProcessor, operationTracer, worldState); + } + + private Bytes processFrame( + final MessageFrame frame, + final AbstractMessageProcessor processor, + final OperationTracer tracer, + final WorldUpdater updater) { + + if (!frame.getCode().isValid()) { + throw new RuntimeException("System call did not execute to completion - opcode invalid"); + } + + Deque stack = frame.getMessageFrameStack(); + while (!stack.isEmpty()) { + processor.process(stack.peekFirst(), tracer); + } + + if (frame.getState() == MessageFrame.State.COMPLETED_SUCCESS) { + updater.commit(); + return frame.getOutputData(); + } + + // the call must execute to completion + throw new RuntimeException("System call did not execute to completion"); + } + + private MessageFrame createCallFrame( + final Address callAddress, + final WorldUpdater worldUpdater, + final ProcessableBlockHeader blockHeader, + final BlockHashOperation.BlockHashLookup blockHashLookup) { + + final Optional maybeContract = Optional.ofNullable(worldUpdater.get(callAddress)); + final AbstractMessageProcessor processor = + mainnetTransactionProcessor.getMessageProcessor(MessageFrame.Type.MESSAGE_CALL); + + return MessageFrame.builder() + .maxStackSize(DEFAULT_MAX_STACK_SIZE) + .worldUpdater(worldUpdater) + .initialGas(30_000_000L) + .originator(SYSTEM_ADDRESS) + .gasPrice(Wei.ZERO) + .blobGasPrice(Wei.ZERO) + .value(Wei.ZERO) + .apparentValue(Wei.ZERO) + .blockValues(blockHeader) + .completer(__ -> {}) + .miningBeneficiary(Address.ZERO) // Confirm this + .type(MessageFrame.Type.MESSAGE_CALL) + .address(callAddress) + .contract(callAddress) + .inputData(Bytes.EMPTY) + .sender(SYSTEM_ADDRESS) + .blockHashLookup(blockHashLookup) + .code( + maybeContract + .map(c -> processor.getCodeFromEVM(c.getCodeHash(), c.getCode())) + .orElse(CodeV0.EMPTY_CODE)) + .build(); + } +} diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/WithdrawalRequestContractHelper.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/WithdrawalRequestContractHelper.java deleted file mode 100644 index c0b7302e8..000000000 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/WithdrawalRequestContractHelper.java +++ /dev/null @@ -1,197 +0,0 @@ -/* - * Copyright contributors to Hyperledger Besu. - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on - * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the - * specific language governing permissions and limitations under the License. - * - * SPDX-License-Identifier: Apache-2.0 - */ -package org.hyperledger.besu.ethereum.mainnet; - -import org.hyperledger.besu.datatypes.Address; -import org.hyperledger.besu.datatypes.BLSPublicKey; -import org.hyperledger.besu.datatypes.GWei; -import org.hyperledger.besu.datatypes.Hash; -import org.hyperledger.besu.ethereum.core.MutableWorldState; -import org.hyperledger.besu.ethereum.core.WithdrawalRequest; -import org.hyperledger.besu.evm.account.Account; -import org.hyperledger.besu.evm.account.MutableAccount; -import org.hyperledger.besu.evm.worldstate.WorldUpdater; - -import java.util.ArrayList; -import java.util.List; - -import com.google.common.annotations.VisibleForTesting; -import org.apache.tuweni.bytes.Bytes; -import org.apache.tuweni.units.bigints.UInt256; -import org.apache.tuweni.units.bigints.UInt64; - -/** - * Helper for interacting with the Validator Withdrawal Request Contract - * (https://eips.ethereum.org/EIPS/eip-7002) - * - *

TODO: Please note that this is not the spec-way of interacting with the Validator Withdrawal - * Request contract. See https://github.com/hyperledger/besu/issues/6918 for more information. - */ -public class WithdrawalRequestContractHelper { - - public static final Address WITHDRAWAL_REQUEST_PREDEPLOY_ADDRESS = - Address.fromHexString("0x00A3ca265EBcb825B45F985A16CEFB49958cE017"); - - /** private constructor to prevent instantiations */ - private WithdrawalRequestContractHelper() {} - - @VisibleForTesting - // Storage slot to store the difference between number of withdrawal requests since last block and - // target withdrawal requests - // per block - static final UInt256 EXCESS_WITHDRAWAL_REQUESTS_STORAGE_SLOT = UInt256.valueOf(0L); - - @VisibleForTesting - // Storage slot to store the number of withdrawal requests added since last block - static final UInt256 WITHDRAWAL_REQUEST_COUNT_STORAGE_SLOT = UInt256.valueOf(1L); - - @VisibleForTesting - static final UInt256 WITHDRAWAL_REQUEST_QUEUE_HEAD_STORAGE_SLOT = UInt256.valueOf(2L); - - @VisibleForTesting - static final UInt256 WITHDRAWAL_REQUEST_QUEUE_TAIL_STORAGE_SLOT = UInt256.valueOf(3L); - - private static final UInt256 WITHDRAWAL_REQUEST_QUEUE_STORAGE_OFFSET = UInt256.valueOf(4L); - - // How many slots each withdrawal request occupies in the account state - private static final int WITHDRAWAL_REQUEST_STORAGE_SLOT_SIZE = 3; - - public static final int MAX_WITHDRAWAL_REQUESTS_PER_BLOCK = 16; - - private static final int TARGET_WITHDRAWAL_REQUESTS_PER_BLOCK = 2; - - private static final UInt256 INITIAL_EXCESS_WITHDRAWAL_REQUESTS_STORAGE_SLOT = - UInt256.valueOf(1181); - - // TODO-lucas Add MIN_WITHDRAWAL_REQUEST_FEE and WITHDRAWAL_REQUEST_FEE_UPDATE_FRACTION - - /* - Pop the expected list of withdrawal requests from the smart contract, updating the queue pointers and other - control variables in the contract state. - */ - public static List popWithdrawalRequestsFromQueue( - final MutableWorldState mutableWorldState) { - final WorldUpdater worldUpdater = mutableWorldState.updater(); - final MutableAccount account = worldUpdater.getAccount(WITHDRAWAL_REQUEST_PREDEPLOY_ADDRESS); - if (account == null || Hash.EMPTY.equals(account.getCodeHash())) { - return List.of(); - } - - final List withdrawalRequests = dequeueWithdrawalRequests(account); - updateExcessWithdrawalRequests(account); - resetWithdrawalRequestsCount(account); - - worldUpdater.commit(); - - return withdrawalRequests; - } - - private static List dequeueWithdrawalRequests(final MutableAccount account) { - final UInt256 queueHeadIndex = - account.getStorageValue(WITHDRAWAL_REQUEST_QUEUE_HEAD_STORAGE_SLOT); - final UInt256 queueTailIndex = - account.getStorageValue(WITHDRAWAL_REQUEST_QUEUE_TAIL_STORAGE_SLOT); - - final List withdrawalRequests = - peekExpectedWithdrawalRequests(account, queueHeadIndex, queueTailIndex); - - final UInt256 newQueueHeadIndex = queueHeadIndex.plus(withdrawalRequests.size()); - if (newQueueHeadIndex.equals(queueTailIndex)) { - // Queue is empty, reset queue pointers - account.setStorageValue(WITHDRAWAL_REQUEST_QUEUE_HEAD_STORAGE_SLOT, UInt256.valueOf(0L)); - account.setStorageValue(WITHDRAWAL_REQUEST_QUEUE_TAIL_STORAGE_SLOT, UInt256.valueOf(0L)); - } else { - account.setStorageValue(WITHDRAWAL_REQUEST_QUEUE_HEAD_STORAGE_SLOT, newQueueHeadIndex); - } - - return withdrawalRequests; - } - - /* - ;; Each stack element has the following layout: - ;; - ;; A: addr - ;; 0x00 | 00 00 00 00 00 00 00 00 00 00 00 00 aa aa aa aa - ;; 0x10 | aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa - ;; - ;; B: pk[0:32] - ;; 0x00 | bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb - ;; 0x10 | bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb - ;; - ;; C: pk[32:48] ++ am[0:8] -> pk2_am - ;; 0x00 | cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc - ;; 0x10 | dd dd dd dd dd dd dd dd 00 00 00 00 00 00 00 00 - ;; - ;; To get these three stack elements into the correct contiguous format, it is - ;; necessary to combine them in the follow form: - ;; - ;; (A[12:32] ++ B[0:12], B[12:32] ++ C[0:12], C[12:24]) - */ - private static List peekExpectedWithdrawalRequests( - final Account account, final UInt256 queueHeadIndex, final UInt256 queueTailIndex) { - final long numRequestsInQueue = queueTailIndex.subtract(queueHeadIndex).toLong(); - final long numRequestsDequeued = - Long.min(numRequestsInQueue, MAX_WITHDRAWAL_REQUESTS_PER_BLOCK); - - final List withdrawalRequests = new ArrayList<>(); - - for (int i = 0; i < numRequestsDequeued; i++) { - final UInt256 queueStorageSlot = - WITHDRAWAL_REQUEST_QUEUE_STORAGE_OFFSET.plus( - queueHeadIndex.plus(i).multiply(WITHDRAWAL_REQUEST_STORAGE_SLOT_SIZE)); - final Address sourceAddress = - Address.wrap(account.getStorageValue(queueStorageSlot).toBytes().slice(12, 20)); - final BLSPublicKey validatorPubkey = - BLSPublicKey.wrap( - Bytes.concatenate( - account - .getStorageValue(queueStorageSlot.plus(1)) - .toBytes() - .slice(0, 32), // no need to slice - account.getStorageValue(queueStorageSlot.plus(2)).toBytes().slice(0, 16))); - final UInt64 amount = - UInt64.fromBytes(account.getStorageValue(queueStorageSlot.plus(2)).slice(16, 8)); - - withdrawalRequests.add( - new WithdrawalRequest(sourceAddress, validatorPubkey, GWei.of(amount))); - } - - return withdrawalRequests; - } - - private static void updateExcessWithdrawalRequests(final MutableAccount account) { - UInt256 previousExcessRequests = - account.getStorageValue(EXCESS_WITHDRAWAL_REQUESTS_STORAGE_SLOT); - - if (previousExcessRequests.equals(INITIAL_EXCESS_WITHDRAWAL_REQUESTS_STORAGE_SLOT)) { - previousExcessRequests = UInt256.ZERO; - } - - final UInt256 requestsCount = account.getStorageValue(WITHDRAWAL_REQUEST_COUNT_STORAGE_SLOT); - - UInt256 newExcessRequests = UInt256.valueOf(0L); - if (previousExcessRequests.plus(requestsCount).toLong() - > TARGET_WITHDRAWAL_REQUESTS_PER_BLOCK) { - newExcessRequests = - previousExcessRequests.plus(requestsCount).subtract(TARGET_WITHDRAWAL_REQUESTS_PER_BLOCK); - } - - account.setStorageValue(EXCESS_WITHDRAWAL_REQUESTS_STORAGE_SLOT, newExcessRequests); - } - - private static void resetWithdrawalRequestsCount(final MutableAccount account) { - account.setStorageValue(WITHDRAWAL_REQUEST_COUNT_STORAGE_SLOT, UInt256.valueOf(0L)); - } -} diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/requests/AbstractSystemCallRequestProcessor.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/requests/AbstractSystemCallRequestProcessor.java new file mode 100644 index 000000000..a7d959f4b --- /dev/null +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/requests/AbstractSystemCallRequestProcessor.java @@ -0,0 +1,102 @@ +/* + * Copyright contributors to Hyperledger Besu. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on + * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the + * specific language governing permissions and limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + */ +package org.hyperledger.besu.ethereum.mainnet.requests; + +import org.hyperledger.besu.datatypes.Address; +import org.hyperledger.besu.ethereum.core.Request; +import org.hyperledger.besu.ethereum.mainnet.SystemCallProcessor; + +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; + +import org.apache.tuweni.bytes.Bytes; + +/** + * Abstract base class for processing system call requests. + * + * @param The type of request to be processed. + */ +public abstract class AbstractSystemCallRequestProcessor + implements RequestProcessor { + + /** + * Processes a system call and converts the result into requests of type T. + * + * @param context The request context being processed. + * @return An {@link Optional} containing a list of {@link T} objects if any are found + */ + @Override + public Optional> process(final ProcessRequestContext context) { + + SystemCallProcessor systemCallProcessor = + new SystemCallProcessor(context.protocolSpec().getTransactionProcessor()); + + Bytes systemCallOutput = + systemCallProcessor.process( + getCallAddress(), + context.mutableWorldState().updater(), + context.blockHeader(), + context.operationTracer(), + context.blockHashLookup()); + + List requests = parseRequests(systemCallOutput); + return Optional.ofNullable(requests); + } + + /** + * Parses the provided bytes into a list of {@link T} objects. + * + * @param bytes The bytes representing requests. + * @return A list of parsed {@link T} objects. + */ + protected List parseRequests(final Bytes bytes) { + if (bytes == null) { + return null; + } + final List requests = new ArrayList<>(); + if (bytes.isEmpty()) { + return requests; + } + int count = bytes.size() / getRequestBytesSize(); + for (int i = 0; i < count; i++) { + Bytes requestBytes = bytes.slice(i * getRequestBytesSize(), getRequestBytesSize()); + requests.add(parseRequest(requestBytes)); + } + return requests; + } + + /** + * Parses a single request from the provided bytes. + * + * @param requestBytes The bytes representing a single request. + * @return A parsed {@link T} object. + */ + protected abstract T parseRequest(final Bytes requestBytes); + + /** + * Gets the call address for the specific request type. + * + * @return The call address. + */ + protected abstract Address getCallAddress(); + + /** + * Gets the size of the bytes representing a single request. + * + * @return The size of the bytes representing a single request. + */ + protected abstract int getRequestBytesSize(); +} diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/requests/DepositRequestProcessor.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/requests/DepositRequestProcessor.java index ce3ed6a5f..8902ecc51 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/requests/DepositRequestProcessor.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/requests/DepositRequestProcessor.java @@ -16,7 +16,6 @@ package org.hyperledger.besu.ethereum.mainnet.requests; import org.hyperledger.besu.datatypes.Address; import org.hyperledger.besu.ethereum.core.DepositRequest; -import org.hyperledger.besu.ethereum.core.MutableWorldState; import org.hyperledger.besu.ethereum.core.Request; import org.hyperledger.besu.ethereum.core.TransactionReceipt; import org.hyperledger.besu.ethereum.core.encoding.DepositRequestDecoder; @@ -39,12 +38,12 @@ public class DepositRequestProcessor implements RequestProcessor { } @Override - public Optional> process( - final MutableWorldState ignored, final List transactionReceipts) { + public Optional> process(final ProcessRequestContext context) { if (depositContractAddress.isEmpty()) { return Optional.empty(); } - List depositRequests = findDepositRequestsFromReceipts(transactionReceipts); + List depositRequests = + findDepositRequestsFromReceipts(context.transactionReceipts()); return Optional.of(depositRequests); } diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/requests/ProcessRequestContext.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/requests/ProcessRequestContext.java new file mode 100644 index 000000000..63f4a8d51 --- /dev/null +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/requests/ProcessRequestContext.java @@ -0,0 +1,32 @@ +/* + * Copyright contributors to Hyperledger Besu. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on + * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the + * specific language governing permissions and limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + */ +package org.hyperledger.besu.ethereum.mainnet.requests; + +import org.hyperledger.besu.ethereum.core.MutableWorldState; +import org.hyperledger.besu.ethereum.core.ProcessableBlockHeader; +import org.hyperledger.besu.ethereum.core.TransactionReceipt; +import org.hyperledger.besu.ethereum.mainnet.ProtocolSpec; +import org.hyperledger.besu.evm.operation.BlockHashOperation.BlockHashLookup; +import org.hyperledger.besu.evm.tracing.OperationTracer; + +import java.util.List; + +public record ProcessRequestContext( + ProcessableBlockHeader blockHeader, + MutableWorldState mutableWorldState, + ProtocolSpec protocolSpec, + List transactionReceipts, + BlockHashLookup blockHashLookup, + OperationTracer operationTracer) {} diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/requests/RequestProcessor.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/requests/RequestProcessor.java index d09b3c47d..55f3cd417 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/requests/RequestProcessor.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/requests/RequestProcessor.java @@ -14,15 +14,11 @@ */ package org.hyperledger.besu.ethereum.mainnet.requests; -import org.hyperledger.besu.ethereum.core.MutableWorldState; import org.hyperledger.besu.ethereum.core.Request; -import org.hyperledger.besu.ethereum.core.TransactionReceipt; import java.util.List; import java.util.Optional; public interface RequestProcessor { - Optional> process( - final MutableWorldState mutableWorldState, - final List transactionReceipts); + Optional> process(final ProcessRequestContext context); } diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/requests/RequestProcessorCoordinator.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/requests/RequestProcessorCoordinator.java index b72674b4d..b98274729 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/requests/RequestProcessorCoordinator.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/requests/RequestProcessorCoordinator.java @@ -15,9 +15,7 @@ package org.hyperledger.besu.ethereum.mainnet.requests; import org.hyperledger.besu.datatypes.RequestType; -import org.hyperledger.besu.ethereum.core.MutableWorldState; import org.hyperledger.besu.ethereum.core.Request; -import org.hyperledger.besu.ethereum.core.TransactionReceipt; import java.util.ArrayList; import java.util.List; @@ -39,11 +37,10 @@ public class RequestProcessorCoordinator { this.processors = processors; } - public Optional> process( - final MutableWorldState mutableWorldState, final List receipts) { + public Optional> process(final ProcessRequestContext context) { List requests = null; for (RequestProcessor requestProcessor : processors.values()) { - var r = requestProcessor.process(mutableWorldState, receipts); + var r = requestProcessor.process(context); if (r.isPresent()) { if (requests == null) { requests = new ArrayList<>(); diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/requests/WithdrawalRequestProcessor.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/requests/WithdrawalRequestProcessor.java index 9803f23f3..b230a6d61 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/requests/WithdrawalRequestProcessor.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/requests/WithdrawalRequestProcessor.java @@ -14,25 +14,60 @@ */ package org.hyperledger.besu.ethereum.mainnet.requests; -import org.hyperledger.besu.ethereum.core.MutableWorldState; -import org.hyperledger.besu.ethereum.core.Request; -import org.hyperledger.besu.ethereum.core.TransactionReceipt; +import org.hyperledger.besu.datatypes.Address; +import org.hyperledger.besu.datatypes.BLSPublicKey; +import org.hyperledger.besu.datatypes.GWei; import org.hyperledger.besu.ethereum.core.WithdrawalRequest; -import org.hyperledger.besu.ethereum.mainnet.WithdrawalRequestContractHelper; -import java.util.List; -import java.util.Optional; +import org.apache.tuweni.bytes.Bytes; +import org.apache.tuweni.units.bigints.UInt64; -public class WithdrawalRequestProcessor implements RequestProcessor { +/** Processor for handling withdrawal requests. */ +public class WithdrawalRequestProcessor + extends AbstractSystemCallRequestProcessor { + + public static final Address WITHDRAWAL_REQUEST_PREDEPLOY_ADDRESS = + Address.fromHexString("0x00A3ca265EBcb825B45F985A16CEFB49958cE017"); + + private static final int ADDRESS_BYTES = 20; + private static final int PUBLIC_KEY_BYTES = 48; + private static final int AMOUNT_BYTES = 8; + private static final int WITHDRAWAL_REQUEST_BYTES_SIZE = + ADDRESS_BYTES + PUBLIC_KEY_BYTES + AMOUNT_BYTES; + + /** + * Gets the call address for withdrawal requests. + * + * @return The call address. + */ @Override - public Optional> process( - final MutableWorldState mutableWorldState, - final List transactionReceipts) { + protected Address getCallAddress() { + return WITHDRAWAL_REQUEST_PREDEPLOY_ADDRESS; + } - List withdrawalRequests = - WithdrawalRequestContractHelper.popWithdrawalRequestsFromQueue(mutableWorldState).stream() - .toList(); + /** + * Gets the size of the bytes representing a single withdrawal request. + * + * @return The size of the bytes representing a single withdrawal request. + */ + @Override + protected int getRequestBytesSize() { + return WITHDRAWAL_REQUEST_BYTES_SIZE; + } - return Optional.of(withdrawalRequests); + /** + * Parses a single withdrawal request from the provided bytes. + * + * @param requestBytes The bytes representing a single withdrawal request. + * @return A parsed {@link WithdrawalRequest} object. + */ + @Override + protected WithdrawalRequest parseRequest(final Bytes requestBytes) { + final Address sourceAddress = Address.wrap(requestBytes.slice(0, ADDRESS_BYTES)); + final BLSPublicKey validatorPublicKey = + BLSPublicKey.wrap(requestBytes.slice(ADDRESS_BYTES, PUBLIC_KEY_BYTES)); + final UInt64 amount = + UInt64.fromBytes(requestBytes.slice(ADDRESS_BYTES + PUBLIC_KEY_BYTES, AMOUNT_BYTES)); + return new WithdrawalRequest(sourceAddress, validatorPublicKey, GWei.of(amount)); } } diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/requests/WithdrawalRequestValidator.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/requests/WithdrawalRequestValidator.java index d5f04e6ef..fc108b798 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/requests/WithdrawalRequestValidator.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/requests/WithdrawalRequestValidator.java @@ -21,7 +21,6 @@ import org.hyperledger.besu.ethereum.core.Block; import org.hyperledger.besu.ethereum.core.Request; import org.hyperledger.besu.ethereum.core.TransactionReceipt; import org.hyperledger.besu.ethereum.core.WithdrawalRequest; -import org.hyperledger.besu.ethereum.mainnet.WithdrawalRequestContractHelper; import java.util.Collections; import java.util.List; @@ -32,6 +31,8 @@ import org.slf4j.LoggerFactory; public class WithdrawalRequestValidator implements RequestValidator { + public static final int MAX_WITHDRAWAL_REQUESTS_PER_BLOCK = 16; + private static final Logger LOG = LoggerFactory.getLogger(WithdrawalRequestValidator.class); private boolean validateWithdrawalRequestParameter( @@ -51,8 +52,7 @@ public class WithdrawalRequestValidator implements RequestValidator { .orElse(Collections.emptyList()); // TODO Do we need to allow for customization? (e.g. if the value changes in the next fork) - if (withdrawalRequestsInBlock.size() - > WithdrawalRequestContractHelper.MAX_WITHDRAWAL_REQUESTS_PER_BLOCK) { + if (withdrawalRequestsInBlock.size() > MAX_WITHDRAWAL_REQUESTS_PER_BLOCK) { LOG.warn( "Block {} has more than the allowed maximum number of withdrawal requests", blockHash); return false; diff --git a/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/SystemCallProcessorTest.java b/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/SystemCallProcessorTest.java new file mode 100644 index 000000000..e1d3906e7 --- /dev/null +++ b/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/SystemCallProcessorTest.java @@ -0,0 +1,113 @@ +/* + * Copyright contributors to Hyperledger Besu. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on + * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the + * specific language governing permissions and limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + */ +package org.hyperledger.besu.ethereum.mainnet; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.doAnswer; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +import org.hyperledger.besu.datatypes.Address; +import org.hyperledger.besu.ethereum.core.InMemoryKeyValueStorageProvider; +import org.hyperledger.besu.ethereum.core.MutableWorldState; +import org.hyperledger.besu.ethereum.core.ProcessableBlockHeader; +import org.hyperledger.besu.evm.frame.MessageFrame; +import org.hyperledger.besu.evm.operation.BlockHashOperation; +import org.hyperledger.besu.evm.processor.AbstractMessageProcessor; +import org.hyperledger.besu.evm.processor.MessageCallProcessor; +import org.hyperledger.besu.evm.tracing.OperationTracer; +import org.hyperledger.besu.evm.worldstate.WorldUpdater; + +import org.apache.tuweni.bytes.Bytes; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +public class SystemCallProcessorTest { + private static final Address CALL_ADDRESS = Address.fromHexString("0x1"); + private static final Bytes EXPECTED_OUTPUT = Bytes.fromHexString("0x01"); + private ProcessableBlockHeader mockBlockHeader; + private MainnetTransactionProcessor mockTransactionProcessor; + private BlockHashOperation.BlockHashLookup mockBlockHashLookup; + private AbstractMessageProcessor mockMessageCallProcessor; + + @BeforeEach + public void setUp() { + mockBlockHeader = mock(ProcessableBlockHeader.class); + mockTransactionProcessor = mock(MainnetTransactionProcessor.class); + mockMessageCallProcessor = mock(MessageCallProcessor.class); + mockBlockHashLookup = mock(BlockHashOperation.BlockHashLookup.class); + when(mockTransactionProcessor.getMessageProcessor(any())).thenReturn(mockMessageCallProcessor); + } + + @Test + void shouldProcessSuccessfully() { + doAnswer( + invocation -> { + MessageFrame messageFrame = invocation.getArgument(0); + messageFrame.setOutputData(EXPECTED_OUTPUT); + messageFrame.getMessageFrameStack().pop(); + messageFrame.setState(MessageFrame.State.COMPLETED_SUCCESS); + return null; + }) + .when(mockMessageCallProcessor) + .process(any(), any()); + final MutableWorldState worldState = createWorldState(CALL_ADDRESS); + Bytes actualOutput = processSystemCall(worldState); + assertThat(actualOutput).isEqualTo(EXPECTED_OUTPUT); + } + + @Test + void shouldThrowExceptionOnFailedExecution() { + doAnswer( + invocation -> { + MessageFrame messageFrame = invocation.getArgument(0); + messageFrame.getMessageFrameStack().pop(); + messageFrame.setState(MessageFrame.State.COMPLETED_FAILED); + return null; + }) + .when(mockMessageCallProcessor) + .process(any(), any()); + final MutableWorldState worldState = createWorldState(CALL_ADDRESS); + var exception = assertThrows(RuntimeException.class, () -> processSystemCall(worldState)); + assertThat(exception.getMessage()).isEqualTo("System call did not execute to completion"); + } + + @Test + void shouldReturnNullWhenContractDoesNotExist() { + final MutableWorldState worldState = InMemoryKeyValueStorageProvider.createInMemoryWorldState(); + Bytes actualOutput = processSystemCall(worldState); + assertThat(actualOutput).isNull(); + } + + Bytes processSystemCall(final MutableWorldState worldState) { + SystemCallProcessor systemCallProcessor = new SystemCallProcessor(mockTransactionProcessor); + return systemCallProcessor.process( + CALL_ADDRESS, + worldState.updater(), + mockBlockHeader, + OperationTracer.NO_TRACING, + mockBlockHashLookup); + } + + private MutableWorldState createWorldState(final Address address) { + final MutableWorldState worldState = InMemoryKeyValueStorageProvider.createInMemoryWorldState(); + final WorldUpdater updater = worldState.updater(); + updater.getOrCreate(address); + updater.commit(); + return worldState; + } +} diff --git a/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/WithdrawalRequestContractHelperTest.java b/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/WithdrawalRequestContractHelperTest.java deleted file mode 100644 index 7e1e85713..000000000 --- a/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/WithdrawalRequestContractHelperTest.java +++ /dev/null @@ -1,205 +0,0 @@ -/* - * Copyright contributors to Hyperledger Besu. - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on - * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the - * specific language governing permissions and limitations under the License. - * - * SPDX-License-Identifier: Apache-2.0 - */ -package org.hyperledger.besu.ethereum.mainnet; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.hyperledger.besu.ethereum.core.InMemoryKeyValueStorageProvider.createInMemoryWorldStateArchive; -import static org.hyperledger.besu.ethereum.mainnet.WithdrawalRequestContractHelper.EXCESS_WITHDRAWAL_REQUESTS_STORAGE_SLOT; -import static org.hyperledger.besu.ethereum.mainnet.WithdrawalRequestContractHelper.WITHDRAWAL_REQUEST_COUNT_STORAGE_SLOT; -import static org.hyperledger.besu.ethereum.mainnet.WithdrawalRequestContractHelper.WITHDRAWAL_REQUEST_PREDEPLOY_ADDRESS; -import static org.hyperledger.besu.ethereum.mainnet.WithdrawalRequestContractHelper.WITHDRAWAL_REQUEST_QUEUE_HEAD_STORAGE_SLOT; -import static org.hyperledger.besu.ethereum.mainnet.WithdrawalRequestContractHelper.WITHDRAWAL_REQUEST_QUEUE_TAIL_STORAGE_SLOT; - -import org.hyperledger.besu.datatypes.Address; -import org.hyperledger.besu.datatypes.BLSPublicKey; -import org.hyperledger.besu.datatypes.GWei; -import org.hyperledger.besu.ethereum.core.MutableWorldState; -import org.hyperledger.besu.ethereum.core.WithdrawalRequest; -import org.hyperledger.besu.evm.account.MutableAccount; -import org.hyperledger.besu.evm.worldstate.WorldUpdater; - -import java.util.List; -import java.util.stream.IntStream; - -import org.apache.tuweni.bytes.Bytes; -import org.apache.tuweni.bytes.Bytes32; -import org.apache.tuweni.bytes.Bytes48; -import org.apache.tuweni.units.bigints.UInt256; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; - -class WithdrawalRequestContractHelperTest { - - private MutableWorldState worldState; - private MutableAccount contract; - - @BeforeEach - void setUp() { - worldState = createInMemoryWorldStateArchive().getMutable(); - } - - @Test - void popWithdrawalRequestsFromQueue_ReadWithdrawalRequestsCorrectly() { - final List validatorWithdrawalRequests = - List.of(createExit(), createExit(), createExit()); - loadContractStorage(worldState, validatorWithdrawalRequests); - - final List poppedWithdrawalRequests = - WithdrawalRequestContractHelper.popWithdrawalRequestsFromQueue(worldState); - - assertThat(poppedWithdrawalRequests).isEqualTo(validatorWithdrawalRequests); - } - - @Test - void - popWithdrawalRequestsFromQueue_whenContractCodeIsEmpty_ReturnsEmptyListOfWithdrawalRequests() { - // Create account with empty code - final WorldUpdater updater = worldState.updater(); - updater.createAccount(WITHDRAWAL_REQUEST_PREDEPLOY_ADDRESS); - updater.commit(); - - assertThat(WithdrawalRequestContractHelper.popWithdrawalRequestsFromQueue(worldState)) - .isEmpty(); - } - - @Test - void popWithdrawalRequestsFromQueue_WhenMoreWithdrawalRequests_UpdatesQueuePointers() { - // Loading contract with more than 16 WithdrawalRequests - final List validatorWithdrawalRequests = - IntStream.range(0, 30).mapToObj(__ -> createExit()).toList(); - loadContractStorage(worldState, validatorWithdrawalRequests); - // After loading the contract, the WithdrawalRequests count since last block should match the - // size of the list - assertContractStorageValue( - WITHDRAWAL_REQUEST_COUNT_STORAGE_SLOT, validatorWithdrawalRequests.size()); - - final List poppedWithdrawalRequests = - WithdrawalRequestContractHelper.popWithdrawalRequestsFromQueue(worldState); - assertThat(poppedWithdrawalRequests).hasSize(16); - - // Check that queue pointers were updated successfully (head advanced to index 16) - assertContractStorageValue(WITHDRAWAL_REQUEST_QUEUE_HEAD_STORAGE_SLOT, 16); - assertContractStorageValue(WITHDRAWAL_REQUEST_QUEUE_TAIL_STORAGE_SLOT, 30); - - // We had 30 WithdrawalRequests in the queue, and target per block is 2, so we have 28 excess - assertContractStorageValue(EXCESS_WITHDRAWAL_REQUESTS_STORAGE_SLOT, 28); - - // We always reset the WithdrawalRequests count after processing the queue - assertContractStorageValue(WITHDRAWAL_REQUEST_COUNT_STORAGE_SLOT, 0); - } - - @Test - void popWithdrawalRequestsFromQueue_WhenNoMoreWithdrawalRequests_ZeroQueuePointers() { - final List withdrawalRequests = - List.of(createExit(), createExit(), createExit()); - loadContractStorage(worldState, withdrawalRequests); - // After loading the contract, the exit count since last block should match the size of the list - assertContractStorageValue(WITHDRAWAL_REQUEST_COUNT_STORAGE_SLOT, withdrawalRequests.size()); - - final List poppedWithdrawalRequests = - WithdrawalRequestContractHelper.popWithdrawalRequestsFromQueue(worldState); - assertThat(poppedWithdrawalRequests).hasSize(3); - - // Check that queue pointers were updated successfully (head and tail zero because queue is - // empty) - assertContractStorageValue(WITHDRAWAL_REQUEST_QUEUE_HEAD_STORAGE_SLOT, 0); - assertContractStorageValue(WITHDRAWAL_REQUEST_QUEUE_TAIL_STORAGE_SLOT, 0); - - // We had 3 WithdrawalRequests in the queue, target per block is 2, so we have 1 excess - assertContractStorageValue(EXCESS_WITHDRAWAL_REQUESTS_STORAGE_SLOT, 1); - - // We always reset the WithdrawalRequests count after processing the queue - assertContractStorageValue(WITHDRAWAL_REQUEST_COUNT_STORAGE_SLOT, 0); - } - - @Test - void popWithdrawalRequestsFromQueue_WhenNoWithdrawalRequests_DoesNothing() { - // Loading contract with 0 WithdrawalRequests - loadContractStorage(worldState, List.of()); - // After loading storage, we have the WithdrawalRequests count as zero because no - // WithdrawalRequests were added - assertContractStorageValue(WITHDRAWAL_REQUEST_COUNT_STORAGE_SLOT, 0); - - final List poppedWithdrawalRequests = - WithdrawalRequestContractHelper.popWithdrawalRequestsFromQueue(worldState); - assertThat(poppedWithdrawalRequests).isEmpty(); - - // Check that queue pointers are correct (head and tail are zero) - assertContractStorageValue(WITHDRAWAL_REQUEST_QUEUE_HEAD_STORAGE_SLOT, 0); - assertContractStorageValue(WITHDRAWAL_REQUEST_QUEUE_TAIL_STORAGE_SLOT, 0); - - // We had 0 WithdrawalRequests in the queue, and target per block is 2, so we have 0 excess - assertContractStorageValue(EXCESS_WITHDRAWAL_REQUESTS_STORAGE_SLOT, 0); - - // We always reset the exit count after processing the queue - assertContractStorageValue(WITHDRAWAL_REQUEST_COUNT_STORAGE_SLOT, 0); - } - - private void assertContractStorageValue(final UInt256 slot, final int expectedValue) { - assertContractStorageValue(slot, UInt256.valueOf(expectedValue)); - } - - private void assertContractStorageValue(final UInt256 slot, final UInt256 expectedValue) { - assertThat(worldState.get(WITHDRAWAL_REQUEST_PREDEPLOY_ADDRESS).getStorageValue(slot)) - .isEqualTo(expectedValue); - } - - private void loadContractStorage( - final MutableWorldState worldState, final List withdrawalRequests) { - final WorldUpdater updater = worldState.updater(); - contract = updater.getOrCreate(WITHDRAWAL_REQUEST_PREDEPLOY_ADDRESS); - - contract.setCode( - Bytes.fromHexString( - "0x61013680600a5f395ff33373fffffffffffffffffffffffffffffffffffffffe146090573615156028575f545f5260205ff35b36603014156101325760115f54600182026001905f5b5f82111560595781019083028483029004916001019190603e565b90939004341061013257600154600101600155600354806003026004013381556001015f3581556001016020359055600101600355005b6003546002548082038060101160a4575060105b5f5b81811460ed5780604402838201600302600401805490600101805490600101549160601b8160a01c17835260601b8160a01c17826020015260601b906040015260010160a6565b910180921460fe5790600255610109565b90505f6002555f6003555b5f546001546002828201116101205750505f610126565b01600290035b5f555f6001556044025ff35b5f5ffd")); - // excess requests - contract.setStorageValue(UInt256.valueOf(0), UInt256.valueOf(0)); - // requests count - contract.setStorageValue(UInt256.valueOf(1), UInt256.valueOf(withdrawalRequests.size())); - // requests queue head pointer - contract.setStorageValue(UInt256.valueOf(2), UInt256.valueOf(0)); - // requests queue tail pointer - contract.setStorageValue(UInt256.valueOf(3), UInt256.valueOf(withdrawalRequests.size())); - - int offset = 4; - for (int i = 0; i < withdrawalRequests.size(); i++) { - final WithdrawalRequest request = withdrawalRequests.get(i); - // source_account - contract.setStorageValue( - // set account to slot, with 12 bytes padding on the left - UInt256.valueOf(offset++), - UInt256.fromBytes( - Bytes.concatenate( - Bytes.fromHexString("0x000000000000000000000000"), request.getSourceAddress()))); - // validator_pubkey - contract.setStorageValue( - UInt256.valueOf(offset++), UInt256.fromBytes(request.getValidatorPubkey().slice(0, 32))); - contract.setStorageValue( - // set public key to slot, with 16 bytes padding on the right - UInt256.valueOf(offset++), - UInt256.fromBytes( - Bytes.concatenate( - request.getValidatorPubkey().slice(32, 16), - request.getAmount().toBytes(), // 8 bytes for amount - Bytes.fromHexString("0x0000000000000000")))); - } - updater.commit(); - } - - private WithdrawalRequest createExit() { - return new WithdrawalRequest( - Address.extract(Bytes32.random()), BLSPublicKey.wrap(Bytes48.random()), GWei.ONE); - } -} diff --git a/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/WithdrawalRequestValidatorTestFixtures.java b/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/WithdrawalRequestValidatorTestFixtures.java index 7b8b440bb..e719810c2 100644 --- a/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/WithdrawalRequestValidatorTestFixtures.java +++ b/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/WithdrawalRequestValidatorTestFixtures.java @@ -14,7 +14,7 @@ */ package org.hyperledger.besu.ethereum.mainnet; -import static org.hyperledger.besu.ethereum.mainnet.WithdrawalRequestContractHelper.MAX_WITHDRAWAL_REQUESTS_PER_BLOCK; +import static org.hyperledger.besu.ethereum.mainnet.requests.WithdrawalRequestValidator.MAX_WITHDRAWAL_REQUESTS_PER_BLOCK; import org.hyperledger.besu.datatypes.Address; import org.hyperledger.besu.datatypes.BLSPublicKey; diff --git a/ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/T8nExecutor.java b/ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/T8nExecutor.java index d52398488..32ffbe109 100644 --- a/ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/T8nExecutor.java +++ b/ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/T8nExecutor.java @@ -42,6 +42,7 @@ import org.hyperledger.besu.ethereum.mainnet.MainnetTransactionProcessor; import org.hyperledger.besu.ethereum.mainnet.ProtocolSchedule; import org.hyperledger.besu.ethereum.mainnet.ProtocolSpec; import org.hyperledger.besu.ethereum.mainnet.TransactionValidationParams; +import org.hyperledger.besu.ethereum.mainnet.requests.ProcessRequestContext; import org.hyperledger.besu.ethereum.mainnet.requests.RequestUtil; import org.hyperledger.besu.ethereum.processing.TransactionProcessingResult; import org.hyperledger.besu.ethereum.referencetests.BonsaiReferenceTestWorldState; @@ -52,6 +53,7 @@ import org.hyperledger.besu.ethereum.rlp.BytesValueRLPInput; import org.hyperledger.besu.ethereum.rlp.BytesValueRLPOutput; import org.hyperledger.besu.ethereum.rlp.RLP; import org.hyperledger.besu.ethereum.trie.diffbased.common.DiffBasedAccount; +import org.hyperledger.besu.ethereum.vm.CachingBlockHashLookup; import org.hyperledger.besu.evm.account.Account; import org.hyperledger.besu.evm.gascalculator.GasCalculator; import org.hyperledger.besu.evm.log.Log; @@ -511,7 +513,15 @@ public class T8nExecutor { var requestProcessorCoordinator = protocolSpec.getRequestProcessorCoordinator(); if (requestProcessorCoordinator.isPresent()) { var rpc = requestProcessorCoordinator.get(); - Optional> maybeRequests = rpc.process(worldState, receipts); + ProcessRequestContext context = + new ProcessRequestContext( + blockHeader, + worldState, + protocolSpec, + receipts, + new CachingBlockHashLookup(blockHeader, blockchain), + OperationTracer.NO_TRACING); + Optional> maybeRequests = rpc.process(context); Hash requestRoot = BodyValidation.requestsRoot(maybeRequests.orElse(List.of())); resultObject.put("requestsRoot", requestRoot.toHexString()); From d2b42d56d84e41e2be0b77c0ba4c842fba027455 Mon Sep 17 00:00:00 2001 From: Simon Dudley Date: Thu, 4 Jul 2024 21:10:44 +1000 Subject: [PATCH 37/58] Update limit trie logs validation message for sync-mode=FULL (#7279) Signed-off-by: Simon Dudley Co-authored-by: Sally MacFarlane --- .../besu/cli/options/stable/DataStorageOptions.java | 6 ++++-- .../besu/cli/options/stable/DataStorageOptionsTest.java | 8 ++++++++ 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/besu/src/main/java/org/hyperledger/besu/cli/options/stable/DataStorageOptions.java b/besu/src/main/java/org/hyperledger/besu/cli/options/stable/DataStorageOptions.java index d1cb4f721..69cf819cb 100644 --- a/besu/src/main/java/org/hyperledger/besu/cli/options/stable/DataStorageOptions.java +++ b/besu/src/main/java/org/hyperledger/besu/cli/options/stable/DataStorageOptions.java @@ -147,8 +147,10 @@ public class DataStorageOptions implements CLIOptions throw new CommandLine.ParameterException( commandLine, String.format( - "Cannot enable " + BONSAI_LIMIT_TRIE_LOGS_ENABLED + " with sync-mode %s", - syncMode)); + "Cannot enable %s with sync-mode %s. You must set %s or use a different sync-mode", + BONSAI_LIMIT_TRIE_LOGS_ENABLED, + SyncMode.FULL, + BONSAI_LIMIT_TRIE_LOGS_ENABLED + "=false")); } if (bonsaiMaxLayersToLoad < MINIMUM_BONSAI_TRIE_LOG_RETENTION_LIMIT) { throw new CommandLine.ParameterException( diff --git a/besu/src/test/java/org/hyperledger/besu/cli/options/stable/DataStorageOptionsTest.java b/besu/src/test/java/org/hyperledger/besu/cli/options/stable/DataStorageOptionsTest.java index 208638182..5ab2757f8 100644 --- a/besu/src/test/java/org/hyperledger/besu/cli/options/stable/DataStorageOptionsTest.java +++ b/besu/src/test/java/org/hyperledger/besu/cli/options/stable/DataStorageOptionsTest.java @@ -55,6 +55,14 @@ public class DataStorageOptionsTest "--bonsai-limit-trie-logs-enabled=false"); } + @Test + public void bonsaiTrieLogPruningWindowSizeShouldBePositive2() { + internalTestFailure( + "Cannot enable --bonsai-limit-trie-logs-enabled with sync-mode FULL. You must set --bonsai-limit-trie-logs-enabled=false or use a different sync-mode", + "--sync-mode", + "FULL"); + } + @Test public void bonsaiTrieLogPruningWindowSizeShouldBePositive() { internalTestFailure( From 6673287b177308416f6b93d08b408736258b311c Mon Sep 17 00:00:00 2001 From: Gabriel-Trintinalia Date: Sat, 6 Jul 2024 00:42:47 +1000 Subject: [PATCH 38/58] Execute requests before block persist (#7295) Signed-off-by: Gabriel-Trintinalia --- .../hyperledger/besu/evmtool/T8nExecutor.java | 76 +++++++++---------- 1 file changed, 38 insertions(+), 38 deletions(-) diff --git a/ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/T8nExecutor.java b/ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/T8nExecutor.java index 32ffbe109..429ad5944 100644 --- a/ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/T8nExecutor.java +++ b/ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/T8nExecutor.java @@ -468,6 +468,44 @@ public class T8nExecutor { } } + var requestProcessorCoordinator = protocolSpec.getRequestProcessorCoordinator(); + if (requestProcessorCoordinator.isPresent()) { + var rpc = requestProcessorCoordinator.get(); + ProcessRequestContext context = + new ProcessRequestContext( + blockHeader, + worldState, + protocolSpec, + receipts, + new CachingBlockHashLookup(blockHeader, blockchain), + OperationTracer.NO_TRACING); + Optional> maybeRequests = rpc.process(context); + Hash requestRoot = BodyValidation.requestsRoot(maybeRequests.orElse(List.of())); + + resultObject.put("requestsRoot", requestRoot.toHexString()); + var deposits = resultObject.putArray("depositRequests"); + RequestUtil.filterRequestsOfType(maybeRequests.orElse(List.of()), DepositRequest.class) + .forEach( + deposit -> { + var obj = deposits.addObject(); + obj.put("pubkey", deposit.getPubkey().toHexString()); + obj.put("withdrawalCredentials", deposit.getWithdrawalCredentials().toHexString()); + obj.put("amount", deposit.getAmount().toHexString()); + obj.put("signature", deposit.getSignature().toHexString()); + obj.put("index", deposit.getIndex().toHexString()); + }); + + var withdrawlRequests = resultObject.putArray("withdrawalRequests"); + RequestUtil.filterRequestsOfType(maybeRequests.orElse(List.of()), WithdrawalRequest.class) + .forEach( + wr -> { + var obj = withdrawlRequests.addObject(); + obj.put("sourceAddress", wr.getSourceAddress().toHexString()); + obj.put("validatorPubkey", wr.getValidatorPubkey().toHexString()); + obj.put("amount", wr.getAmount().toHexString()); + }); + } + worldState.persist(blockHeader); resultObject.put("stateRoot", worldState.rootHash().toHexString()); @@ -510,44 +548,6 @@ public class T8nExecutor { resultObject.put("blobGasUsed", Bytes.ofUnsignedLong(blobGasUsed).toQuantityHexString()); } - var requestProcessorCoordinator = protocolSpec.getRequestProcessorCoordinator(); - if (requestProcessorCoordinator.isPresent()) { - var rpc = requestProcessorCoordinator.get(); - ProcessRequestContext context = - new ProcessRequestContext( - blockHeader, - worldState, - protocolSpec, - receipts, - new CachingBlockHashLookup(blockHeader, blockchain), - OperationTracer.NO_TRACING); - Optional> maybeRequests = rpc.process(context); - Hash requestRoot = BodyValidation.requestsRoot(maybeRequests.orElse(List.of())); - - resultObject.put("requestsRoot", requestRoot.toHexString()); - var deposits = resultObject.putArray("depositRequests"); - RequestUtil.filterRequestsOfType(maybeRequests.orElse(List.of()), DepositRequest.class) - .forEach( - deposit -> { - var obj = deposits.addObject(); - obj.put("pubkey", deposit.getPubkey().toHexString()); - obj.put("withdrawalCredentials", deposit.getWithdrawalCredentials().toHexString()); - obj.put("amount", deposit.getAmount().toHexString()); - obj.put("signature", deposit.getSignature().toHexString()); - obj.put("index", deposit.getIndex().toHexString()); - }); - - var withdrawlRequests = resultObject.putArray("withdrawalRequests"); - RequestUtil.filterRequestsOfType(maybeRequests.orElse(List.of()), WithdrawalRequest.class) - .forEach( - wr -> { - var obj = withdrawlRequests.addObject(); - obj.put("sourceAddress", wr.getSourceAddress().toHexString()); - obj.put("validatorPubkey", wr.getValidatorPubkey().toHexString()); - obj.put("amount", wr.getAmount().toHexString()); - }); - } - ObjectNode allocObject = objectMapper.createObjectNode(); worldState .streamAccounts(Bytes32.ZERO, Integer.MAX_VALUE) From 33f2ae272619304243b860fc7e5fc07efce26763 Mon Sep 17 00:00:00 2001 From: gringsam Date: Tue, 9 Jul 2024 22:26:51 -0400 Subject: [PATCH 39/58] Fixed outdated tech redirect link. (#7297) * fix wiki link Signed-off-by: Snazzy * fix format Signed-off-by: Snazzy * change knownHash Signed-off-by: Snazzy --------- Signed-off-by: Snazzy --- plugin-api/build.gradle | 2 +- .../java/org/hyperledger/besu/plugin/services/BesuEvents.java | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/plugin-api/build.gradle b/plugin-api/build.gradle index dbbb5e4f2..d55efa7fc 100644 --- a/plugin-api/build.gradle +++ b/plugin-api/build.gradle @@ -70,7 +70,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 = 'Q6EK5By3BNKNa/JYqYjFw43VXWL0KVBUV3dGEQBjZ70=' + knownHash = 'yH50m+z1tnzshJQPdwR86pb2EU3m6iZxwkqoy/5spcs=' } check.dependsOn('checkAPIChanges') diff --git a/plugin-api/src/main/java/org/hyperledger/besu/plugin/services/BesuEvents.java b/plugin-api/src/main/java/org/hyperledger/besu/plugin/services/BesuEvents.java index ab9c4eb78..110a66dee 100644 --- a/plugin-api/src/main/java/org/hyperledger/besu/plugin/services/BesuEvents.java +++ b/plugin-api/src/main/java/org/hyperledger/besu/plugin/services/BesuEvents.java @@ -258,7 +258,8 @@ public interface BesuEvents extends BesuService { /** * Invoked for each log (both added and removed) when a new block is added to the blockchain. * - * @param logWithMetadata the log with associated metadata. see https://eth.wiki/json-rpc/API + * @param logWithMetadata the log with associated metadata. see + * https://ethereum.org/en/developers/docs/apis/json-rpc/ */ void onLogEmitted(LogWithMetadata logWithMetadata); } From 5660ebc1cecdd05333dd8675862281a9421a95a6 Mon Sep 17 00:00:00 2001 From: George Tebrean <99179176+gtebrean@users.noreply.github.com> Date: Wed, 10 Jul 2024 06:51:53 +0300 Subject: [PATCH 40/58] Increment private nonce even if transaction failed. (#6593) Increment private nonce even if transaction failed Signed-off-by: George Tebrean Signed-off-by: stefan.pingel@consensys.net Co-authored-by: stefan.pingel@consensys.net Co-authored-by: Stefan Pingel <16143240+pinges@users.noreply.github.com> --- CHANGELOG.md | 1 + .../dsl/node/ProcessBesuNodeRunner.java | 3 + .../node/configuration/BesuNodeFactory.java | 4 +- .../MultiTenancyAcceptanceTest.java | 1 + ...tiTenancyPrivateNonceIncrementingTest.java | 241 ++++++++++++++++++ ...tiTenancyValidationFailAcceptanceTest.java | 1 + .../org/hyperledger/besu/cli/BesuCommand.java | 9 + .../src/test/resources/everything_config.toml | 1 + ...acyPrecompiledContractIntegrationTest.java | 1 + .../besu/ethereum/core/PrivacyParameters.java | 18 ++ .../FlexiblePrivacyPrecompiledContract.java | 7 +- .../privacy/PrivacyPrecompiledContract.java | 27 +- ...lexiblePrivacyPrecompiledContractTest.java | 6 +- .../PrivacyPrecompiledContractTest.java | 4 +- 14 files changed, 314 insertions(+), 10 deletions(-) create mode 100644 acceptance-tests/tests/src/test/java/org/hyperledger/besu/tests/acceptance/privacy/multitenancy/MultiTenancyPrivateNonceIncrementingTest.java diff --git a/CHANGELOG.md b/CHANGELOG.md index 4d29b8f8a..1cbfa4cbd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -34,6 +34,7 @@ - Promote experimental `besu storage x-trie-log` subcommand to production-ready [#7278](https://github.com/hyperledger/besu/pull/7278) - Enhanced BFT round-change diagnostics [#7271](https://github.com/hyperledger/besu/pull/7271) - `--Xsnapsync-bft-enabled` option enables experimental support for snap sync with IBFT/QBFT permissioned Bonsai-DB chains [#7140](https://github.com/hyperledger/besu/pull/7140) +- `privacy-nonce-always-increments` option enables private transactions to always increment the nonce, even if the transaction is invalid [#6593](https://github.com/hyperledger/besu/pull/6593) ### Bug fixes - Validation errors ignored in accounts-allowlist and empty list [#7138](https://github.com/hyperledger/besu/issues/7138) diff --git a/acceptance-tests/dsl/src/main/java/org/hyperledger/besu/tests/acceptance/dsl/node/ProcessBesuNodeRunner.java b/acceptance-tests/dsl/src/main/java/org/hyperledger/besu/tests/acceptance/dsl/node/ProcessBesuNodeRunner.java index 583992718..37906761d 100644 --- a/acceptance-tests/dsl/src/main/java/org/hyperledger/besu/tests/acceptance/dsl/node/ProcessBesuNodeRunner.java +++ b/acceptance-tests/dsl/src/main/java/org/hyperledger/besu/tests/acceptance/dsl/node/ProcessBesuNodeRunner.java @@ -166,6 +166,9 @@ public class ProcessBesuNodeRunner implements BesuNodeRunner { if (node.getPrivacyParameters().isPrivacyPluginEnabled()) { params.add("--Xprivacy-plugin-enabled"); } + if (node.getPrivacyParameters().isPrivateNonceAlwaysIncrementsEnabled()) { + params.add("privacy-nonce-always-increments"); + } } if (!node.getBootnodes().isEmpty()) { diff --git a/acceptance-tests/dsl/src/main/java/org/hyperledger/besu/tests/acceptance/dsl/node/configuration/BesuNodeFactory.java b/acceptance-tests/dsl/src/main/java/org/hyperledger/besu/tests/acceptance/dsl/node/configuration/BesuNodeFactory.java index 96ab9cf62..1ea29388b 100644 --- a/acceptance-tests/dsl/src/main/java/org/hyperledger/besu/tests/acceptance/dsl/node/configuration/BesuNodeFactory.java +++ b/acceptance-tests/dsl/src/main/java/org/hyperledger/besu/tests/acceptance/dsl/node/configuration/BesuNodeFactory.java @@ -287,7 +287,8 @@ public class BesuNodeFactory { final String enclaveUrl, final String authFile, final String privTransactionSigningKey, - final boolean enableFlexiblePrivacy) + final boolean enableFlexiblePrivacy, + final boolean enablePrivateNonceAlwaysIncrements) throws IOException, URISyntaxException { final PrivacyParameters.Builder privacyParametersBuilder = new PrivacyParameters.Builder(); final PrivacyParameters privacyParameters = @@ -298,6 +299,7 @@ public class BesuNodeFactory { .setStorageProvider(new InMemoryPrivacyStorageProvider()) .setEnclaveFactory(new EnclaveFactory(Vertx.vertx())) .setEnclaveUrl(URI.create(enclaveUrl)) + .setPrivateNonceAlwaysIncrementsEnabled(enablePrivateNonceAlwaysIncrements) .setPrivateKeyPath( Paths.get(ClassLoader.getSystemResource(privTransactionSigningKey).toURI())) .build(); diff --git a/acceptance-tests/tests/src/test/java/org/hyperledger/besu/tests/acceptance/privacy/multitenancy/MultiTenancyAcceptanceTest.java b/acceptance-tests/tests/src/test/java/org/hyperledger/besu/tests/acceptance/privacy/multitenancy/MultiTenancyAcceptanceTest.java index e2fdd2188..b1c175f64 100644 --- a/acceptance-tests/tests/src/test/java/org/hyperledger/besu/tests/acceptance/privacy/multitenancy/MultiTenancyAcceptanceTest.java +++ b/acceptance-tests/tests/src/test/java/org/hyperledger/besu/tests/acceptance/privacy/multitenancy/MultiTenancyAcceptanceTest.java @@ -104,6 +104,7 @@ public class MultiTenancyAcceptanceTest extends AcceptanceTestBase { "http://127.0.0.1:" + wireMockRule.port(), "authentication/auth_priv.toml", "authentication/auth_priv_key", + false, false); multiTenancyCluster.start(node); final String token = diff --git a/acceptance-tests/tests/src/test/java/org/hyperledger/besu/tests/acceptance/privacy/multitenancy/MultiTenancyPrivateNonceIncrementingTest.java b/acceptance-tests/tests/src/test/java/org/hyperledger/besu/tests/acceptance/privacy/multitenancy/MultiTenancyPrivateNonceIncrementingTest.java new file mode 100644 index 000000000..11c405c37 --- /dev/null +++ b/acceptance-tests/tests/src/test/java/org/hyperledger/besu/tests/acceptance/privacy/multitenancy/MultiTenancyPrivateNonceIncrementingTest.java @@ -0,0 +1,241 @@ +/* + * Copyright contributors to Hyperledger Besu. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on + * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the + * specific language governing permissions and limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + */ +package org.hyperledger.besu.tests.acceptance.privacy.multitenancy; + +import static com.github.tomakehurst.wiremock.client.WireMock.ok; +import static com.github.tomakehurst.wiremock.client.WireMock.post; +import static com.github.tomakehurst.wiremock.client.WireMock.stubFor; +import static com.github.tomakehurst.wiremock.core.WireMockConfiguration.options; +import static java.nio.charset.StandardCharsets.UTF_8; + +import org.hyperledger.besu.crypto.KeyPair; +import org.hyperledger.besu.crypto.SignatureAlgorithm; +import org.hyperledger.besu.crypto.SignatureAlgorithmFactory; +import org.hyperledger.besu.datatypes.Address; +import org.hyperledger.besu.datatypes.Hash; +import org.hyperledger.besu.datatypes.Wei; +import org.hyperledger.besu.enclave.types.PrivacyGroup; +import org.hyperledger.besu.enclave.types.ReceiveResponse; +import org.hyperledger.besu.enclave.types.SendResponse; +import org.hyperledger.besu.ethereum.privacy.PrivateTransaction; +import org.hyperledger.besu.ethereum.rlp.BytesValueRLPOutput; +import org.hyperledger.besu.plugin.data.Restriction; +import org.hyperledger.besu.tests.acceptance.dsl.AcceptanceTestBase; +import org.hyperledger.besu.tests.acceptance.dsl.node.BesuNode; +import org.hyperledger.besu.tests.acceptance.dsl.node.cluster.Cluster; +import org.hyperledger.besu.tests.acceptance.dsl.node.cluster.ClusterConfiguration; +import org.hyperledger.besu.tests.acceptance.dsl.node.cluster.ClusterConfigurationBuilder; + +import java.math.BigInteger; +import java.util.List; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.github.tomakehurst.wiremock.junit.WireMockRule; +import com.google.common.base.Supplier; +import com.google.common.base.Suppliers; +import org.apache.tuweni.bytes.Bytes; +import org.junit.After; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; + +public class MultiTenancyPrivateNonceIncrementingTest extends AcceptanceTestBase { + private BesuNode node; + private final ObjectMapper mapper = new ObjectMapper(); + private Cluster multiTenancyCluster; + + private static final Supplier SIGNATURE_ALGORITHM = + Suppliers.memoize(SignatureAlgorithmFactory::getInstance); + private static final KeyPair TEST_KEY = + SIGNATURE_ALGORITHM + .get() + .createKeyPair( + SIGNATURE_ALGORITHM + .get() + .createPrivateKey( + new BigInteger( + "853d7f0010fd86d0d7811c1f9d968ea89a24484a8127b4a483ddf5d2cfec766d", 16))); + private static final String PRIVACY_GROUP_ID = "B1aVtMxLCUHmBVHXoZzzBgPbW/wj5axDpW9X8l91SGo="; + private static final String PARTICIPANT_ENCLAVE_KEY0 = + "A1aVtMxLCUHmBVHXoZzzBgPbW/wj5axDpW9X8l91SGo="; + private static final String PARTICIPANT_ENCLAVE_KEY1 = + "sgFkVOyFndZe/5SAZJO5UYbrl7pezHetveriBBWWnE8="; + private final Address senderAddress = + Address.wrap(Bytes.fromHexString(accounts.getPrimaryBenefactor().getAddress())); + + @Rule public WireMockRule wireMockRule = new WireMockRule(options().dynamicPort()); + + @Before + public void setUp() throws Exception { + final ClusterConfiguration clusterConfiguration = + new ClusterConfigurationBuilder().awaitPeerDiscovery(false).build(); + multiTenancyCluster = new Cluster(clusterConfiguration, net); + node = + besu.createNodeWithMultiTenantedPrivacy( + "node1", + "http://127.0.0.1:" + wireMockRule.port(), + "authentication/auth_priv.toml", + "authentication/auth_priv_key", + false, + true); + multiTenancyCluster.start(node); + final String token = + node.execute(permissioningTransactions.createSuccessfulLogin("user", "pegasys")); + node.useAuthenticationTokenInHeaderForJsonRpc(token); + } + + @After + public void tearDown() { + multiTenancyCluster.close(); + } + + @Test + public void validateUnsuccessfulPrivateTransactionsNonceIncrementation() + throws JsonProcessingException { + executePrivateFailingTransaction(0, 0, 1); + executePrivateValidTransaction(1, 1, 2); + executePrivateFailingTransaction(2, 2, 3); + executePrivateFailingTransaction(3, 3, 4); + executePrivateValidTransaction(4, 4, 5); + } + + private void executePrivateValidTransaction( + final int nonce, + final int expectedTransactionCountBeforeExecution, + final int expectedTransactionCountAfterExecution) + throws JsonProcessingException { + final PrivateTransaction validSignedPrivateTransaction = + getValidSignedPrivateTransaction(senderAddress, nonce); + + final String accountAddress = validSignedPrivateTransaction.getSender().toHexString(); + final BytesValueRLPOutput rlpOutput = getRLPOutput(validSignedPrivateTransaction); + + processEnclaveStub(validSignedPrivateTransaction); + + node.verify( + priv.getTransactionCount( + accountAddress, PRIVACY_GROUP_ID, expectedTransactionCountBeforeExecution)); + + final Hash transactionReceipt = + node.execute(privacyTransactions.sendRawTransaction(rlpOutput.encoded().toHexString())); + + node.verify(priv.getSuccessfulTransactionReceipt(transactionReceipt)); + node.verify( + priv.getTransactionCount( + accountAddress, PRIVACY_GROUP_ID, expectedTransactionCountAfterExecution)); + } + + private void executePrivateFailingTransaction( + final int nonce, + final int expectedTransactionCountBeforeExecution, + final int expectedTransactionCountAfterExecution) + throws JsonProcessingException { + final PrivateTransaction invalidSignedPrivateTransaction = + getInvalidSignedPrivateTransaction(senderAddress, nonce); + final String accountAddress = invalidSignedPrivateTransaction.getSender().toHexString(); + final BytesValueRLPOutput invalidTxRlp = getRLPOutput(invalidSignedPrivateTransaction); + + processEnclaveStub(invalidSignedPrivateTransaction); + + node.verify( + priv.getTransactionCount( + accountAddress, PRIVACY_GROUP_ID, expectedTransactionCountBeforeExecution)); + final Hash invalidTransactionReceipt = + node.execute(privacyTransactions.sendRawTransaction(invalidTxRlp.encoded().toHexString())); + + node.verify(priv.getFailedTransactionReceipt(invalidTransactionReceipt)); + node.verify( + priv.getTransactionCount( + accountAddress, PRIVACY_GROUP_ID, expectedTransactionCountAfterExecution)); + } + + private void processEnclaveStub(final PrivateTransaction validSignedPrivateTransaction) + throws JsonProcessingException { + retrievePrivacyGroupEnclaveStub(); + sendEnclaveStub(); + receiveEnclaveStub(validSignedPrivateTransaction); + } + + private void retrievePrivacyGroupEnclaveStub() throws JsonProcessingException { + final String retrieveGroupResponse = + mapper.writeValueAsString( + createPrivacyGroup( + List.of(PARTICIPANT_ENCLAVE_KEY0, PARTICIPANT_ENCLAVE_KEY1), + PrivacyGroup.Type.PANTHEON)); + stubFor(post("/retrievePrivacyGroup").willReturn(ok(retrieveGroupResponse))); + } + + private void sendEnclaveStub() throws JsonProcessingException { + final String sendResponse = + mapper.writeValueAsString(new SendResponse(PARTICIPANT_ENCLAVE_KEY1)); + stubFor(post("/send").willReturn(ok(sendResponse))); + } + + private void receiveEnclaveStub(final PrivateTransaction privTx) throws JsonProcessingException { + final BytesValueRLPOutput rlpOutput = getRLPOutput(privTx); + final String senderKey = privTx.getPrivateFrom().toBase64String(); + final String receiveResponse = + mapper.writeValueAsString( + new ReceiveResponse( + rlpOutput.encoded().toBase64String().getBytes(UTF_8), PRIVACY_GROUP_ID, senderKey)); + stubFor(post("/receive").willReturn(ok(receiveResponse))); + } + + private BytesValueRLPOutput getRLPOutput(final PrivateTransaction privateTransaction) { + final BytesValueRLPOutput bvrlpo = new BytesValueRLPOutput(); + privateTransaction.writeTo(bvrlpo); + return bvrlpo; + } + + private PrivacyGroup createPrivacyGroup( + final List groupMembers, final PrivacyGroup.Type groupType) { + return new PrivacyGroup(PRIVACY_GROUP_ID, groupType, "test", "testGroup", groupMembers); + } + + private static PrivateTransaction getInvalidSignedPrivateTransaction( + final Address senderAddress, final int nonce) { + return PrivateTransaction.builder() + .nonce(nonce) + .gasPrice(Wei.ZERO) + .gasLimit(3000000) + .to(null) + .value(Wei.ZERO) + .payload(Bytes.fromHexString("0x1234")) + .sender(senderAddress) + .chainId(BigInteger.valueOf(1337)) + .privateFrom(Bytes.fromBase64String(PARTICIPANT_ENCLAVE_KEY0)) + .restriction(Restriction.RESTRICTED) + .privacyGroupId(Bytes.fromBase64String(PRIVACY_GROUP_ID)) + .signAndBuild(TEST_KEY); + } + + private static PrivateTransaction getValidSignedPrivateTransaction( + final Address senderAddress, final int nonce) { + return PrivateTransaction.builder() + .nonce(nonce) + .gasPrice(Wei.ZERO) + .gasLimit(3000000) + .to(null) + .value(Wei.ZERO) + .payload(Bytes.wrap(new byte[] {})) + .sender(senderAddress) + .chainId(BigInteger.valueOf(1337)) + .privateFrom(Bytes.fromBase64String(PARTICIPANT_ENCLAVE_KEY0)) + .restriction(Restriction.RESTRICTED) + .privacyGroupId(Bytes.fromBase64String(PRIVACY_GROUP_ID)) + .signAndBuild(TEST_KEY); + } +} diff --git a/acceptance-tests/tests/src/test/java/org/hyperledger/besu/tests/acceptance/privacy/multitenancy/MultiTenancyValidationFailAcceptanceTest.java b/acceptance-tests/tests/src/test/java/org/hyperledger/besu/tests/acceptance/privacy/multitenancy/MultiTenancyValidationFailAcceptanceTest.java index 84e6fa7ea..28bf140bb 100644 --- a/acceptance-tests/tests/src/test/java/org/hyperledger/besu/tests/acceptance/privacy/multitenancy/MultiTenancyValidationFailAcceptanceTest.java +++ b/acceptance-tests/tests/src/test/java/org/hyperledger/besu/tests/acceptance/privacy/multitenancy/MultiTenancyValidationFailAcceptanceTest.java @@ -78,6 +78,7 @@ public class MultiTenancyValidationFailAcceptanceTest extends AcceptanceTestBase "http://127.0.0.1:" + wireMockRule.port(), "authentication/auth_priv.toml", "authentication/auth_priv_key", + false, false); multiTenancyCluster.start(node); diff --git a/besu/src/main/java/org/hyperledger/besu/cli/BesuCommand.java b/besu/src/main/java/org/hyperledger/besu/cli/BesuCommand.java index 12752f2e9..8b123e70d 100644 --- a/besu/src/main/java/org/hyperledger/besu/cli/BesuCommand.java +++ b/besu/src/main/java/org/hyperledger/besu/cli/BesuCommand.java @@ -715,6 +715,13 @@ public class BesuCommand implements DefaultCommandValues, Runnable { names = {"--privacy-flexible-groups-enabled"}, description = "Enable flexible privacy groups (default: ${DEFAULT-VALUE})") private final Boolean isFlexiblePrivacyGroupsEnabled = false; + + @Option( + names = {"--privacy-nonce-always-increments"}, + description = + "Enable private nonce " + + "incrementation even if the transaction didn't succeeded (default: ${DEFAULT-VALUE})") + private final Boolean isPrivateNonceAlwaysIncrementsEnabled = false; } // Metrics Option Group @@ -2062,6 +2069,8 @@ public class BesuCommand implements DefaultCommandValues, Runnable { privacyOptionGroup.isFlexiblePrivacyGroupsEnabled); privacyParametersBuilder.setPrivacyPluginEnabled( unstablePrivacyPluginOptions.isPrivacyPluginEnabled()); + privacyParametersBuilder.setPrivateNonceAlwaysIncrementsEnabled( + privacyOptionGroup.isPrivateNonceAlwaysIncrementsEnabled); final boolean hasPrivacyPublicKey = privacyOptionGroup.privacyPublicKeyFile != null; diff --git a/besu/src/test/resources/everything_config.toml b/besu/src/test/resources/everything_config.toml index d5cc29123..a5e03bd59 100644 --- a/besu/src/test/resources/everything_config.toml +++ b/besu/src/test/resources/everything_config.toml @@ -172,6 +172,7 @@ privacy-multi-tenancy-enabled=true privacy-marker-transaction-signing-key-file="./signerKey" privacy-enable-database-migration=false privacy-flexible-groups-enabled=false +privacy-nonce-always-increments=false # Transaction Pool tx-pool="layered" diff --git a/ethereum/core/src/integration-test/java/org/hyperledger/besu/ethereum/mainnet/precompiles/privacy/PrivacyPrecompiledContractIntegrationTest.java b/ethereum/core/src/integration-test/java/org/hyperledger/besu/ethereum/mainnet/precompiles/privacy/PrivacyPrecompiledContractIntegrationTest.java index 090c24e26..a5ee5f068 100644 --- a/ethereum/core/src/integration-test/java/org/hyperledger/besu/ethereum/mainnet/precompiles/privacy/PrivacyPrecompiledContractIntegrationTest.java +++ b/ethereum/core/src/integration-test/java/org/hyperledger/besu/ethereum/mainnet/precompiles/privacy/PrivacyPrecompiledContractIntegrationTest.java @@ -205,6 +205,7 @@ public class PrivacyPrecompiledContractIntegrationTest { new PrivateStateRootResolver(privateStateStorage), new PrivateStateGenesisAllocator( false, (privacyGroupId, blockNumber) -> Collections::emptyList), + false, "IntegrationTest"); privacyPrecompiledContract.setPrivateTransactionProcessor(mockPrivateTxProcessor()); diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/PrivacyParameters.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/PrivacyParameters.java index 349ff8ffb..775634a41 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/PrivacyParameters.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/PrivacyParameters.java @@ -77,6 +77,7 @@ public class PrivacyParameters { private PrivateStateRootResolver privateStateRootResolver; private PrivateWorldStateReader privateWorldStateReader; private PrivacyPluginService privacyPluginService; + private boolean privateNonceAlwaysIncrementsEnabled; public Address getPrivacyAddress() { if (isPrivacyPluginEnabled()) { @@ -228,6 +229,15 @@ public class PrivacyParameters { } } + public boolean isPrivateNonceAlwaysIncrementsEnabled() { + return privateNonceAlwaysIncrementsEnabled; + } + + public void setPrivateNonceAlwaysIncrementsEnabled( + final boolean privateNonceAlwaysIncrementsEnabled) { + this.privateNonceAlwaysIncrementsEnabled = privateNonceAlwaysIncrementsEnabled; + } + @Override public String toString() { return "PrivacyParameters{" @@ -263,6 +273,7 @@ public class PrivacyParameters { private boolean flexiblePrivacyGroupsEnabled; private boolean privacyPluginEnabled; private PrivacyPluginService privacyPluginService; + private boolean privateNonceAlwaysIncrementsEnabled; public Builder setEnclaveUrl(final URI enclaveUrl) { this.enclaveUrl = enclaveUrl; @@ -314,6 +325,12 @@ public class PrivacyParameters { return this; } + public Builder setPrivateNonceAlwaysIncrementsEnabled( + final boolean isPrivateNonceAlwaysIncrementsEnabled) { + this.privateNonceAlwaysIncrementsEnabled = isPrivateNonceAlwaysIncrementsEnabled; + return this; + } + public Builder setPrivacyPluginEnabled(final boolean privacyPluginEnabled) { this.privacyPluginEnabled = privacyPluginEnabled; return this; @@ -382,6 +399,7 @@ public class PrivacyParameters { config.setMultiTenancyEnabled(multiTenancyEnabled); config.setFlexiblePrivacyGroupsEnabled(flexiblePrivacyGroupsEnabled); config.setPrivacyPluginEnabled(privacyPluginEnabled); + config.setPrivateNonceAlwaysIncrementsEnabled(privateNonceAlwaysIncrementsEnabled); return config; } } diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/precompiles/privacy/FlexiblePrivacyPrecompiledContract.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/precompiles/privacy/FlexiblePrivacyPrecompiledContract.java index 0dd6863f9..98709a4ea 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/precompiles/privacy/FlexiblePrivacyPrecompiledContract.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/precompiles/privacy/FlexiblePrivacyPrecompiledContract.java @@ -70,13 +70,15 @@ public class FlexiblePrivacyPrecompiledContract extends PrivacyPrecompiledContra final Enclave enclave, final WorldStateArchive worldStateArchive, final PrivateStateRootResolver privateStateRootResolver, - final PrivateStateGenesisAllocator privateStateGenesisAllocator) { + final PrivateStateGenesisAllocator privateStateGenesisAllocator, + final boolean alwaysIncrementPrivateNonce) { super( gasCalculator, enclave, worldStateArchive, privateStateRootResolver, privateStateGenesisAllocator, + alwaysIncrementPrivateNonce, "FlexiblePrivacy"); } @@ -87,7 +89,8 @@ public class FlexiblePrivacyPrecompiledContract extends PrivacyPrecompiledContra privacyParameters.getEnclave(), privacyParameters.getPrivateWorldStateArchive(), privacyParameters.getPrivateStateRootResolver(), - privacyParameters.getPrivateStateGenesisAllocator()); + privacyParameters.getPrivateStateGenesisAllocator(), + privacyParameters.isPrivateNonceAlwaysIncrementsEnabled()); } public long addPrivateTransactionObserver(final PrivateTransactionObserver observer) { diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/precompiles/privacy/PrivacyPrecompiledContract.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/precompiles/privacy/PrivacyPrecompiledContract.java index b1a754c9f..7e9bfa1ac 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/precompiles/privacy/PrivacyPrecompiledContract.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/precompiles/privacy/PrivacyPrecompiledContract.java @@ -19,6 +19,7 @@ import static org.hyperledger.besu.ethereum.mainnet.PrivateStateUtils.KEY_PRIVAT import static org.hyperledger.besu.ethereum.mainnet.PrivateStateUtils.KEY_TRANSACTION_HASH; import static org.hyperledger.besu.ethereum.privacy.PrivateStateRootResolver.EMPTY_ROOT_HASH; +import org.hyperledger.besu.datatypes.Address; import org.hyperledger.besu.datatypes.Hash; import org.hyperledger.besu.enclave.Enclave; import org.hyperledger.besu.enclave.EnclaveClientException; @@ -40,6 +41,7 @@ import org.hyperledger.besu.ethereum.privacy.storage.PrivateTransactionMetadata; import org.hyperledger.besu.ethereum.processing.TransactionProcessingResult; import org.hyperledger.besu.ethereum.rlp.BytesValueRLPInput; import org.hyperledger.besu.ethereum.worldstate.WorldStateArchive; +import org.hyperledger.besu.evm.account.MutableAccount; import org.hyperledger.besu.evm.frame.BlockValues; import org.hyperledger.besu.evm.frame.MessageFrame; import org.hyperledger.besu.evm.gascalculator.GasCalculator; @@ -61,6 +63,7 @@ public class PrivacyPrecompiledContract extends AbstractPrecompiledContract { final WorldStateArchive privateWorldStateArchive; final PrivateStateRootResolver privateStateRootResolver; private final PrivateStateGenesisAllocator privateStateGenesisAllocator; + final boolean alwaysIncrementPrivateNonce; PrivateTransactionProcessor privateTransactionProcessor; private static final Logger LOG = LoggerFactory.getLogger(PrivacyPrecompiledContract.class); @@ -79,6 +82,7 @@ public class PrivacyPrecompiledContract extends AbstractPrecompiledContract { privacyParameters.getPrivateWorldStateArchive(), privacyParameters.getPrivateStateRootResolver(), privacyParameters.getPrivateStateGenesisAllocator(), + privacyParameters.isPrivateNonceAlwaysIncrementsEnabled(), name); } @@ -88,12 +92,14 @@ public class PrivacyPrecompiledContract extends AbstractPrecompiledContract { final WorldStateArchive worldStateArchive, final PrivateStateRootResolver privateStateRootResolver, final PrivateStateGenesisAllocator privateStateGenesisAllocator, + final boolean alwaysIncrementPrivateNonce, final String name) { super(name, gasCalculator); this.enclave = enclave; this.privateWorldStateArchive = worldStateArchive; this.privateStateRootResolver = privateStateRootResolver; this.privateStateGenesisAllocator = privateStateGenesisAllocator; + this.alwaysIncrementPrivateNonce = alwaysIncrementPrivateNonce; } public void setPrivateTransactionProcessor( @@ -181,18 +187,31 @@ public class PrivacyPrecompiledContract extends AbstractPrecompiledContract { processPrivateTransaction( messageFrame, privateTransaction, privacyGroupId, privateWorldStateUpdater); - if (result.isInvalid() || !result.isSuccessful()) { + final Boolean isPersistingPrivateState = + messageFrame.getContextVariable(KEY_IS_PERSISTING_PRIVATE_STATE, false); + + if (!result.isSuccessful()) { LOG.error( "Failed to process private transaction {}: {}", pmtHash, result.getValidationResult().getErrorMessage()); + if (isPersistingPrivateState && alwaysIncrementPrivateNonce) { + final Address senderAddress = privateTransaction.getSender(); + final MutableAccount senderAccount = privateWorldStateUpdater.getOrCreate(senderAddress); + senderAccount.incrementNonce(); + // we can safely commit the updater here, because it is only changed if the transaction is + // successful, + // so we can be sure that the only change is the incremented nonce + privateWorldStateUpdater.commit(); + disposablePrivateState.persist(null); - privateMetadataUpdater.putTransactionReceipt(pmtHash, new PrivateTransactionReceipt(result)); - + storePrivateMetadata( + pmtHash, privacyGroupId, disposablePrivateState, privateMetadataUpdater, result); + } return NO_RESULT; } - if (messageFrame.getContextVariable(KEY_IS_PERSISTING_PRIVATE_STATE, false)) { + if (isPersistingPrivateState) { privateWorldStateUpdater.commit(); disposablePrivateState.persist(null); diff --git a/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/precompiles/privacy/FlexiblePrivacyPrecompiledContractTest.java b/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/precompiles/privacy/FlexiblePrivacyPrecompiledContractTest.java index 3c4711a19..fc08f519d 100644 --- a/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/precompiles/privacy/FlexiblePrivacyPrecompiledContractTest.java +++ b/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/precompiles/privacy/FlexiblePrivacyPrecompiledContractTest.java @@ -383,7 +383,8 @@ public class FlexiblePrivacyPrecompiledContractTest { enclave, worldStateArchive, privateStateRootResolver, - privateStateGenesisAllocator); + privateStateGenesisAllocator, + false); contract.setPrivateTransactionProcessor( mockPrivateTxProcessor( @@ -427,6 +428,7 @@ public class FlexiblePrivacyPrecompiledContractTest { enclave, worldStateArchive, privateStateRootResolver, - privateStateGenesisAllocator); + privateStateGenesisAllocator, + false); } } diff --git a/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/precompiles/privacy/PrivacyPrecompiledContractTest.java b/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/precompiles/privacy/PrivacyPrecompiledContractTest.java index 134cfa9ea..7d253057a 100644 --- a/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/precompiles/privacy/PrivacyPrecompiledContractTest.java +++ b/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/precompiles/privacy/PrivacyPrecompiledContractTest.java @@ -302,6 +302,7 @@ public class PrivacyPrecompiledContractTest { worldStateArchive, privateStateRootResolver, privateStateGenesisAllocator, + false, "RestrictedPrivacyTest"); contract.setPrivateTransactionProcessor( @@ -328,7 +329,7 @@ public class PrivacyPrecompiledContractTest { @Test public void testSimulatedPublicTransactionIsSkipped() { final PrivacyPrecompiledContract emptyContract = - new PrivacyPrecompiledContract(null, null, null, null, null, null); + new PrivacyPrecompiledContract(null, null, null, null, null, false, null); // A simulated public transaction doesn't contain a PrivateMetadataUpdater final MessageFrame frame = mock(MessageFrame.class); @@ -355,6 +356,7 @@ public class PrivacyPrecompiledContractTest { worldStateArchive, privateStateRootResolver, privateStateGenesisAllocator, + false, "PrivacyTests"); } } From ae7ddd1c9adb750026d5314554e8366fda8a97a0 Mon Sep 17 00:00:00 2001 From: Usman Saleem Date: Wed, 10 Jul 2024 14:20:51 +1000 Subject: [PATCH 41/58] feat: Enhance --profile to load external profiles (#7292) * feat: --profile can load external profiles * fix external profile name method * fix ProfilesCompletionCandidate * test: Add unit tests * changelog: Update changelog * test: Fix TomlConfigurationDefaultProviderTest * test: Fix BesuCommandTest --------- Signed-off-by: Usman Saleem --- CHANGELOG.md | 1 + .../org/hyperledger/besu/cli/BesuCommand.java | 7 +- ...fileName.java => InternalProfileName.java} | 38 +++++++- .../config/ProfilesCompletionCandidates.java | 37 +++++++ .../subcommands/ValidateConfigSubCommand.java | 2 +- .../besu/cli/util/ProfileFinder.java | 94 +++++++++++++++--- .../TomlConfigurationDefaultProvider.java | 19 ++-- .../hyperledger/besu/cli/BesuCommandTest.java | 2 +- .../cli/ConfigurationOverviewBuilderTest.java | 4 +- .../hyperledger/besu/cli/ProfilesTest.java | 97 +++++++++++++++++-- .../TomlConfigurationDefaultProviderTest.java | 2 +- .../ProfilesCompletionCandidatesTest.java | 91 +++++++++++++++++ 12 files changed, 355 insertions(+), 39 deletions(-) rename besu/src/main/java/org/hyperledger/besu/cli/config/{ProfileName.java => InternalProfileName.java} (59%) create mode 100644 besu/src/main/java/org/hyperledger/besu/cli/config/ProfilesCompletionCandidates.java create mode 100644 besu/src/test/java/org/hyperledger/besu/cli/config/ProfilesCompletionCandidatesTest.java diff --git a/CHANGELOG.md b/CHANGELOG.md index 1cbfa4cbd..1306de83d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,7 @@ ### Breaking Changes ### Additions and Improvements +- Add support to load external profiles using `--profile` [#7265](https://github.com/hyperledger/besu/issues/7265) ### Bug fixes diff --git a/besu/src/main/java/org/hyperledger/besu/cli/BesuCommand.java b/besu/src/main/java/org/hyperledger/besu/cli/BesuCommand.java index 8b123e70d..427cac924 100644 --- a/besu/src/main/java/org/hyperledger/besu/cli/BesuCommand.java +++ b/besu/src/main/java/org/hyperledger/besu/cli/BesuCommand.java @@ -39,7 +39,7 @@ import org.hyperledger.besu.chainimport.JsonBlockImporter; import org.hyperledger.besu.chainimport.RlpBlockImporter; import org.hyperledger.besu.cli.config.EthNetworkConfig; import org.hyperledger.besu.cli.config.NetworkName; -import org.hyperledger.besu.cli.config.ProfileName; +import org.hyperledger.besu.cli.config.ProfilesCompletionCandidates; import org.hyperledger.besu.cli.converter.MetricCategoryConverter; import org.hyperledger.besu.cli.converter.PercentageConverter; import org.hyperledger.besu.cli.converter.SubnetInfoConverter; @@ -565,9 +565,10 @@ public class BesuCommand implements DefaultCommandValues, Runnable { @Option( names = {PROFILE_OPTION_NAME}, paramLabel = PROFILE_FORMAT_HELP, + completionCandidates = ProfilesCompletionCandidates.class, description = "Overwrite default settings. Possible values are ${COMPLETION-CANDIDATES}. (default: none)") - private final ProfileName profile = null; + private String profile = null; // don't set it as final due to picocli completion candidates @Option( names = {"--nat-method"}, @@ -2773,7 +2774,7 @@ public class BesuCommand implements DefaultCommandValues, Runnable { } if (profile != null) { - builder.setProfile(profile.toString()); + builder.setProfile(profile); } builder.setHasCustomGenesis(genesisFile != null); diff --git a/besu/src/main/java/org/hyperledger/besu/cli/config/ProfileName.java b/besu/src/main/java/org/hyperledger/besu/cli/config/InternalProfileName.java similarity index 59% rename from besu/src/main/java/org/hyperledger/besu/cli/config/ProfileName.java rename to besu/src/main/java/org/hyperledger/besu/cli/config/InternalProfileName.java index 8c17dfb4f..efac7a520 100644 --- a/besu/src/main/java/org/hyperledger/besu/cli/config/ProfileName.java +++ b/besu/src/main/java/org/hyperledger/besu/cli/config/InternalProfileName.java @@ -14,10 +14,18 @@ */ package org.hyperledger.besu.cli.config; +import java.util.Arrays; +import java.util.Optional; +import java.util.Set; +import java.util.stream.Collectors; + import org.apache.commons.lang3.StringUtils; -/** Enum for profile names. Each profile corresponds to a configuration file. */ -public enum ProfileName { +/** + * Enum for profile names which are bundled. Each profile corresponds to a bundled configuration + * file. + */ +public enum InternalProfileName { /** The 'STAKER' profile */ STAKER("profiles/staker.toml"), /** The 'MINIMALIST_STAKER' profile */ @@ -31,12 +39,36 @@ public enum ProfileName { private final String configFile; + /** + * Returns the InternalProfileName that matches the given name, ignoring case. + * + * @param name The profile name + * @return Optional InternalProfileName if found, otherwise empty + */ + public static Optional valueOfIgnoreCase(final String name) { + return Arrays.stream(values()) + .filter(profile -> profile.name().equalsIgnoreCase(name)) + .findFirst(); + } + + /** + * Returns the set of internal profile names as lowercase. + * + * @return Set of internal profile names + */ + public static Set getInternalProfileNames() { + return Arrays.stream(InternalProfileName.values()) + .map(InternalProfileName::name) + .map(String::toLowerCase) + .collect(Collectors.toSet()); + } + /** * Constructs a new ProfileName. * * @param configFile the configuration file corresponding to the profile */ - ProfileName(final String configFile) { + InternalProfileName(final String configFile) { this.configFile = configFile; } diff --git a/besu/src/main/java/org/hyperledger/besu/cli/config/ProfilesCompletionCandidates.java b/besu/src/main/java/org/hyperledger/besu/cli/config/ProfilesCompletionCandidates.java new file mode 100644 index 000000000..51e9c49a0 --- /dev/null +++ b/besu/src/main/java/org/hyperledger/besu/cli/config/ProfilesCompletionCandidates.java @@ -0,0 +1,37 @@ +/* + * Copyright contributors to Hyperledger Besu. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on + * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the + * specific language governing permissions and limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + */ +package org.hyperledger.besu.cli.config; + +import org.hyperledger.besu.cli.util.ProfileFinder; + +import java.util.Iterator; +import java.util.Set; +import java.util.TreeSet; + +/** Provides a list of profile names that can be used for command line completion. */ +public class ProfilesCompletionCandidates implements Iterable { + /** + * Create a new instance of ProfilesCompletionCandidates. This constructor is required for + * Picocli. + */ + public ProfilesCompletionCandidates() {} + + @Override + public Iterator iterator() { + final Set profileNames = new TreeSet<>(InternalProfileName.getInternalProfileNames()); + profileNames.addAll(ProfileFinder.getExternalProfileNames()); + return profileNames.iterator(); + } +} diff --git a/besu/src/main/java/org/hyperledger/besu/cli/subcommands/ValidateConfigSubCommand.java b/besu/src/main/java/org/hyperledger/besu/cli/subcommands/ValidateConfigSubCommand.java index f17f1a09f..12500748c 100644 --- a/besu/src/main/java/org/hyperledger/besu/cli/subcommands/ValidateConfigSubCommand.java +++ b/besu/src/main/java/org/hyperledger/besu/cli/subcommands/ValidateConfigSubCommand.java @@ -70,7 +70,7 @@ public class ValidateConfigSubCommand implements Runnable { checkNotNull(parentCommand); try { TomlConfigurationDefaultProvider.fromFile(commandLine, dataPath.toFile()) - .loadConfigurationFromFile(); + .loadConfigurationIfNotLoaded(); } catch (Exception e) { this.out.println(e); return; diff --git a/besu/src/main/java/org/hyperledger/besu/cli/util/ProfileFinder.java b/besu/src/main/java/org/hyperledger/besu/cli/util/ProfileFinder.java index edb94f667..ba35f6b69 100644 --- a/besu/src/main/java/org/hyperledger/besu/cli/util/ProfileFinder.java +++ b/besu/src/main/java/org/hyperledger/besu/cli/util/ProfileFinder.java @@ -16,11 +16,19 @@ package org.hyperledger.besu.cli.util; import static org.hyperledger.besu.cli.DefaultCommandValues.PROFILE_OPTION_NAME; -import org.hyperledger.besu.cli.config.ProfileName; +import org.hyperledger.besu.cli.config.InternalProfileName; +import java.io.IOException; import java.io.InputStream; +import java.io.UncheckedIOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; import java.util.Map; import java.util.Optional; +import java.util.Set; +import java.util.stream.Collectors; +import java.util.stream.Stream; import picocli.CommandLine; @@ -50,30 +58,94 @@ public class ProfileFinder extends AbstractConfigurationFinder { @Override public Optional getFromOption( final CommandLine.ParseResult parseResult, final CommandLine commandLine) { + final String profileName; try { - return getProfile(parseResult.matchedOption(PROFILE_OPTION_NAME).getter().get(), commandLine); - } catch (Exception e) { - throw new RuntimeException(e); + profileName = parseResult.matchedOption(PROFILE_OPTION_NAME).getter().get(); + } catch (final Exception e) { + throw new CommandLine.ParameterException( + commandLine, "Unexpected error in obtaining value of --profile", e); } + return getProfile(profileName, commandLine); } @Override public Optional getFromEnvironment( final Map environment, final CommandLine commandLine) { - return getProfile(ProfileName.valueOf(environment.get(PROFILE_ENV_NAME)), commandLine); + return getProfile(environment.get(PROFILE_ENV_NAME), commandLine); } private static Optional getProfile( - final ProfileName profileName, final CommandLine commandLine) { - return Optional.of(getTomlFile(commandLine, profileName.getConfigFile())); + final String profileName, final CommandLine commandLine) { + final Optional internalProfileConfigPath = + InternalProfileName.valueOfIgnoreCase(profileName).map(InternalProfileName::getConfigFile); + if (internalProfileConfigPath.isPresent()) { + return Optional.of(getTomlFileFromClasspath(internalProfileConfigPath.get())); + } else { + final Path externalProfileFile = defaultProfilesDir().resolve(profileName + ".toml"); + if (Files.exists(externalProfileFile)) { + try { + return Optional.of(Files.newInputStream(externalProfileFile)); + } catch (IOException e) { + throw new CommandLine.ParameterException( + commandLine, "Error reading external profile: " + profileName); + } + } else { + throw new CommandLine.ParameterException( + commandLine, "Unable to load external profile: " + profileName); + } + } } - private static InputStream getTomlFile(final CommandLine commandLine, final String file) { - InputStream resourceUrl = ProfileFinder.class.getClassLoader().getResourceAsStream(file); + private static InputStream getTomlFileFromClasspath(final String profileConfigFile) { + InputStream resourceUrl = + ProfileFinder.class.getClassLoader().getResourceAsStream(profileConfigFile); + // this is not meant to happen, because for each InternalProfileName there is a corresponding + // TOML file in resources if (resourceUrl == null) { - throw new CommandLine.ParameterException( - commandLine, String.format("TOML file %s not found", file)); + throw new IllegalStateException( + String.format("Internal Profile TOML %s not found", profileConfigFile)); } return resourceUrl; } + + /** + * Returns the external profile names which are file names without extension in the default + * profiles directory. + * + * @return Set of external profile names + */ + public static Set getExternalProfileNames() { + final Path profilesDir = defaultProfilesDir(); + if (!Files.exists(profilesDir)) { + return Set.of(); + } + + try (Stream pathStream = Files.list(profilesDir)) { + return pathStream + .filter(Files::isRegularFile) + .filter(path -> path.toString().endsWith(".toml")) + .map( + path -> + path.getFileName() + .toString() + .substring(0, path.getFileName().toString().length() - 5)) + .collect(Collectors.toSet()); + } catch (IOException e) { + throw new UncheckedIOException(e); + } + } + + /** + * Return default profiles directory location + * + * @return Path to default profiles directory + */ + private static Path defaultProfilesDir() { + final String profilesDir = System.getProperty("besu.profiles.dir"); + if (profilesDir == null) { + return Paths.get(System.getProperty("besu.home", "."), "profiles"); + } else { + return Paths.get(profilesDir); + } + } } diff --git a/besu/src/main/java/org/hyperledger/besu/cli/util/TomlConfigurationDefaultProvider.java b/besu/src/main/java/org/hyperledger/besu/cli/util/TomlConfigurationDefaultProvider.java index 1747f461d..ca76b40b6 100644 --- a/besu/src/main/java/org/hyperledger/besu/cli/util/TomlConfigurationDefaultProvider.java +++ b/besu/src/main/java/org/hyperledger/besu/cli/util/TomlConfigurationDefaultProvider.java @@ -96,7 +96,7 @@ public class TomlConfigurationDefaultProvider implements IDefaultValueProvider { @Override public String defaultValue(final ArgSpec argSpec) { - loadConfigurationFromFile(); + loadConfigurationIfNotLoaded(); // only options can be used in config because a name is needed for the key // so we skip default for positional params @@ -227,10 +227,10 @@ public class TomlConfigurationDefaultProvider implements IDefaultValueProvider { } private void checkConfigurationValidity() { - if (result == null || result.isEmpty()) + if (result == null || result.isEmpty()) { throw new ParameterException( - commandLine, - String.format("Unable to read TOML configuration file %s", configurationInputStream)); + commandLine, "Unable to read from empty TOML configuration file."); + } if (!isUnknownOptionsChecked && !commandLine.isUnmatchedArgumentsAllowed()) { checkUnknownOptions(result); @@ -239,8 +239,7 @@ public class TomlConfigurationDefaultProvider implements IDefaultValueProvider { } /** Load configuration from file. */ - public void loadConfigurationFromFile() { - + public void loadConfigurationIfNotLoaded() { if (result == null) { try { final TomlParseResult result = Toml.parse(configurationInputStream); @@ -289,12 +288,12 @@ public class TomlConfigurationDefaultProvider implements IDefaultValueProvider { .collect(Collectors.toSet()); if (!unknownOptionsList.isEmpty()) { - final String options = unknownOptionsList.size() > 1 ? "options" : "option"; - final String csvUnknownOptions = - unknownOptionsList.stream().collect(Collectors.joining(", ")); + final String csvUnknownOptions = String.join(", ", unknownOptionsList); throw new ParameterException( commandLine, - String.format("Unknown %s in TOML configuration file: %s", options, csvUnknownOptions)); + String.format( + "Unknown option%s in TOML configuration file: %s", + unknownOptionsList.size() > 1 ? "s" : "", csvUnknownOptions)); } } } diff --git a/besu/src/test/java/org/hyperledger/besu/cli/BesuCommandTest.java b/besu/src/test/java/org/hyperledger/besu/cli/BesuCommandTest.java index 641e69dba..c6ffbdc17 100644 --- a/besu/src/test/java/org/hyperledger/besu/cli/BesuCommandTest.java +++ b/besu/src/test/java/org/hyperledger/besu/cli/BesuCommandTest.java @@ -259,7 +259,7 @@ public class BesuCommandTest extends CommandTestAbstract { final Path tempConfigFilePath = createTempFile("an-invalid-file-name-without-extension", ""); parseCommand("--config-file", tempConfigFilePath.toString()); - final String expectedOutputStart = "Unable to read TOML configuration file"; + final String expectedOutputStart = "Unable to read from empty TOML configuration file."; assertThat(commandErrorOutput.toString(UTF_8)).startsWith(expectedOutputStart); assertThat(commandOutput.toString(UTF_8)).isEmpty(); } diff --git a/besu/src/test/java/org/hyperledger/besu/cli/ConfigurationOverviewBuilderTest.java b/besu/src/test/java/org/hyperledger/besu/cli/ConfigurationOverviewBuilderTest.java index 07e440430..841c66800 100644 --- a/besu/src/test/java/org/hyperledger/besu/cli/ConfigurationOverviewBuilderTest.java +++ b/besu/src/test/java/org/hyperledger/besu/cli/ConfigurationOverviewBuilderTest.java @@ -20,7 +20,7 @@ import static org.hyperledger.besu.ethereum.eth.transactions.TransactionPoolConf import static org.hyperledger.besu.ethereum.eth.transactions.TransactionPoolConfiguration.Implementation.SEQUENCED; import static org.mockito.Mockito.mock; -import org.hyperledger.besu.cli.config.ProfileName; +import org.hyperledger.besu.cli.config.InternalProfileName; import org.hyperledger.besu.evm.internal.EvmConfiguration; import java.math.BigInteger; @@ -213,7 +213,7 @@ class ConfigurationOverviewBuilderTest { @Test void setProfile() { - builder.setProfile(ProfileName.DEV.name()); + builder.setProfile(InternalProfileName.DEV.name()); final String profileSelected = builder.build(); assertThat(profileSelected).contains("Profile: DEV"); } diff --git a/besu/src/test/java/org/hyperledger/besu/cli/ProfilesTest.java b/besu/src/test/java/org/hyperledger/besu/cli/ProfilesTest.java index cdfe09964..019ff7a7e 100644 --- a/besu/src/test/java/org/hyperledger/besu/cli/ProfilesTest.java +++ b/besu/src/test/java/org/hyperledger/besu/cli/ProfilesTest.java @@ -17,21 +17,104 @@ package org.hyperledger.besu.cli; import static java.nio.charset.StandardCharsets.UTF_8; import static org.assertj.core.api.Assertions.assertThat; -import org.hyperledger.besu.cli.config.ProfileName; +import org.hyperledger.besu.cli.config.InternalProfileName; +import org.hyperledger.besu.cli.util.ProfileFinder; +import java.io.IOException; +import java.io.InputStream; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.Set; +import java.util.TreeSet; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.TempDir; import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.EnumSource; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; public class ProfilesTest extends CommandTestAbstract { + @TempDir private static Path tempProfilesDir; + private static String originalProfilesDirProperty; + + @BeforeAll + public static void copyExternalProfiles() throws IOException { + for (String internalProfileName : InternalProfileName.getInternalProfileNames()) { + final Path profilePath = tempProfilesDir.resolve(internalProfileName + "_external.toml"); + + String profileConfigFile = + InternalProfileName.valueOfIgnoreCase(internalProfileName).get().getConfigFile(); + try (InputStream resourceUrl = + ProfileFinder.class.getClassLoader().getResourceAsStream(profileConfigFile)) { + if (resourceUrl != null) { + Files.copy(resourceUrl, profilePath); + } + } + } + + // add an empty external profile + Files.createFile(tempProfilesDir.resolve("empty_external.toml")); + } + + @BeforeAll + public static void setupSystemProperty() { + originalProfilesDirProperty = System.getProperty("besu.profiles.dir"); + // sets the system property for the test + System.setProperty("besu.profiles.dir", tempProfilesDir.toString()); + } + + static Stream profileNameProvider() { + final Set profileNames = new TreeSet<>(InternalProfileName.getInternalProfileNames()); + final Set externalProfileNames = + InternalProfileName.getInternalProfileNames().stream() + .map(name -> name + "_external") + .collect(Collectors.toSet()); + profileNames.addAll(externalProfileNames); + return profileNames.stream().map(Arguments::of); + } /** Test if besu will validate the combination of options within the given profile. */ - @ParameterizedTest - @EnumSource(ProfileName.class) - public void testProfileWithNoOverrides_doesNotError(final ProfileName profileName) { - - parseCommand("--profile", profileName.name()); + @ParameterizedTest(name = "{index} - Profile Name override: {0}") + @DisplayName("Valid Profile with overrides does not error") + @MethodSource("profileNameProvider") + public void testProfileWithNoOverrides_doesNotError(final String profileName) { + parseCommand("--profile", profileName); assertThat(commandOutput.toString(UTF_8)).isEmpty(); assertThat(commandErrorOutput.toString(UTF_8)).isEmpty(); } + + @Test + @DisplayName("Empty external profile file results in error") + public void emptyProfileFile_ShouldResultInError() { + parseCommand("--profile", "empty_external"); + + assertThat(commandOutput.toString(UTF_8)).isEmpty(); + assertThat(commandErrorOutput.toString(UTF_8)) + .contains("Unable to read from empty TOML configuration file."); + } + + @Test + @DisplayName("Non Existing profile results in error") + public void nonExistentProfileFile_ShouldResultInError() { + parseCommand("--profile", "non_existent_profile"); + + assertThat(commandOutput.toString(UTF_8)).isEmpty(); + assertThat(commandErrorOutput.toString(UTF_8)) + .contains("Unable to load external profile: non_existent_profile"); + } + + @AfterAll + public static void clearSystemProperty() { + if (originalProfilesDirProperty != null) { + System.setProperty("besu.profiles.dir", originalProfilesDirProperty); + } else { + System.clearProperty("besu.profiles.dir"); + } + } } diff --git a/besu/src/test/java/org/hyperledger/besu/cli/TomlConfigurationDefaultProviderTest.java b/besu/src/test/java/org/hyperledger/besu/cli/TomlConfigurationDefaultProviderTest.java index 0b47654f5..983e92cec 100644 --- a/besu/src/test/java/org/hyperledger/besu/cli/TomlConfigurationDefaultProviderTest.java +++ b/besu/src/test/java/org/hyperledger/besu/cli/TomlConfigurationDefaultProviderTest.java @@ -241,7 +241,7 @@ public class TomlConfigurationDefaultProviderTest { providerUnderTest.defaultValue( OptionSpec.builder("an-option").type(String.class).build())) .isInstanceOf(ParameterException.class) - .hasMessageContaining("Unable to read TOML configuration file"); + .hasMessageContaining("Unable to read from empty TOML configuration file."); } @Test diff --git a/besu/src/test/java/org/hyperledger/besu/cli/config/ProfilesCompletionCandidatesTest.java b/besu/src/test/java/org/hyperledger/besu/cli/config/ProfilesCompletionCandidatesTest.java new file mode 100644 index 000000000..69cbf1de7 --- /dev/null +++ b/besu/src/test/java/org/hyperledger/besu/cli/config/ProfilesCompletionCandidatesTest.java @@ -0,0 +1,91 @@ +/* + * Copyright contributors to Hyperledger Besu. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on + * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the + * specific language governing permissions and limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + */ +package org.hyperledger.besu.cli.config; + +import org.hyperledger.besu.cli.util.ProfileFinder; + +import java.io.IOException; +import java.io.InputStream; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.Set; +import java.util.TreeSet; +import java.util.stream.Collectors; + +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.TempDir; + +class ProfilesCompletionCandidatesTest { + @TempDir private static Path tempProfilesDir; + private static String originalProfilesDirProperty; + + @BeforeAll + public static void copyExternalProfiles() throws IOException { + for (String internalProfileName : InternalProfileName.getInternalProfileNames()) { + final Path profilePath = tempProfilesDir.resolve(internalProfileName + "_external.toml"); + + String profileConfigFile = + InternalProfileName.valueOfIgnoreCase(internalProfileName).get().getConfigFile(); + try (InputStream resourceUrl = + ProfileFinder.class.getClassLoader().getResourceAsStream(profileConfigFile)) { + if (resourceUrl != null) { + Files.copy(resourceUrl, profilePath); + } + } + } + } + + @BeforeAll + public static void setupSystemProperty() { + originalProfilesDirProperty = System.getProperty("besu.profiles.dir"); + // sets the system property for the test + System.setProperty("besu.profiles.dir", tempProfilesDir.toString()); + } + + @Test + void profileCompletionCandidates_shouldIncludeInternalAndExternalProfiles() { + Iterator candidates = new ProfilesCompletionCandidates().iterator(); + // convert Iterator to List + List candidatesList = new ArrayList<>(); + candidates.forEachRemaining(candidatesList::add); + + Assertions.assertThat(candidatesList).containsExactlyInAnyOrderElementsOf(allProfileNames()); + } + + static Set allProfileNames() { + final Set profileNames = new TreeSet<>(InternalProfileName.getInternalProfileNames()); + final Set externalProfileNames = + InternalProfileName.getInternalProfileNames().stream() + .map(name -> name + "_external") + .collect(Collectors.toSet()); + profileNames.addAll(externalProfileNames); + return profileNames; + } + + @AfterAll + public static void clearSystemProperty() { + if (originalProfilesDirProperty != null) { + System.setProperty("besu.profiles.dir", originalProfilesDirProperty); + } else { + System.clearProperty("besu.profiles.dir"); + } + } +} From 3117f15a3a3497fe8d4ccc553b739e5f390001ac Mon Sep 17 00:00:00 2001 From: Chaminda Divitotawela Date: Wed, 10 Jul 2024 18:43:07 +1000 Subject: [PATCH 42/58] Fix status badge for documentation (#7304) Documentation has been moved to GitHub pages and no longer use readthedocs. Updated the README status badge for docs with correct link Signed-off-by: Chaminda Divitotawela --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 2a2262086..d54b6bb32 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Besu Ethereum Client [![CircleCI](https://circleci.com/gh/hyperledger/besu/tree/main.svg?style=svg)](https://circleci.com/gh/hyperledger/besu/tree/main) - [![Documentation Status](https://readthedocs.org/projects/hyperledger-besu/badge/?version=latest)](https://besu.hyperledger.org/en/latest/?badge=latest) + [![Documentation](https://img.shields.io/github/actions/workflow/status/hyperledger/besu-docs/publish-main-docs.yml?branch=main&label=docs)](https://github.com/hyperledger/besu-docs/actions/workflows/publish-main-docs.yml) [![CII Best Practices](https://bestpractices.coreinfrastructure.org/projects/3174/badge)](https://bestpractices.coreinfrastructure.org/projects/3174) [![License](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](https://github.com/hyperledger/besu/blob/main/LICENSE) [![Discord](https://img.shields.io/discord/905194001349627914?logo=Hyperledger&style=plastic)](https://discord.gg/hyperledger) From 3f00bad598e99ea51d17456e9693abb3cd999b76 Mon Sep 17 00:00:00 2001 From: Sally MacFarlane Date: Thu, 11 Jul 2024 09:49:37 +1000 Subject: [PATCH 43/58] [MINOR] Fixed some typos (#7299) * typos Signed-off-by: Sally MacFarlane --------- Signed-off-by: Sally MacFarlane --- .github/workflows/container-security-scan.yml | 2 +- .../besu/ethereum/mainnet/MainnetProtocolSpecs.java | 4 ++-- .../besu/ethereum/eth/manager/snap/SnapProtocolManager.java | 2 +- .../java/org/hyperledger/besu/ethereum/trie/MerkleTrie.java | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/container-security-scan.yml b/.github/workflows/container-security-scan.yml index f945d1322..9d41e819b 100644 --- a/.github/workflows/container-security-scan.yml +++ b/.github/workflows/container-security-scan.yml @@ -8,7 +8,7 @@ on: required: false default: 'develop' schedule: - # Start of the hour is the busy time. Scheule it to run 8:17am UTC + # Start of the hour is the busy time. Schedule it to run 8:17am UTC - cron: '17 8 * * *' jobs: diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/MainnetProtocolSpecs.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/MainnetProtocolSpecs.java index b4a75c49c..4ae30f8de 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/MainnetProtocolSpecs.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/MainnetProtocolSpecs.java @@ -642,9 +642,9 @@ public abstract class MainnetProtocolSpecs { return cancunDefinition( chainId, enableRevertReason, genesisConfigOptions, evmConfiguration, miningParameters) - // EIP-3074 AUTH and AUTCALL gas + // EIP-3074 AUTH and AUTHCALL gas .gasCalculator(PragueGasCalculator::new) - // EIP-3074 AUTH and AUTCALL + // EIP-3074 AUTH and AUTHCALL .evmBuilder( (gasCalculator, jdCacheConfig) -> MainnetEVMs.prague( diff --git a/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/manager/snap/SnapProtocolManager.java b/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/manager/snap/SnapProtocolManager.java index 2c717d77a..c65a1c6b0 100644 --- a/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/manager/snap/SnapProtocolManager.java +++ b/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/manager/snap/SnapProtocolManager.java @@ -84,7 +84,7 @@ public class SnapProtocolManager implements ProtocolManager { public void awaitStop() throws InterruptedException {} /** - * This function is called by the P2P framework when an "SNAP message has been received. + * This function is called by the P2P framework when a SNAP message has been received. * * @param cap The capability under which the message was transmitted. * @param message The message to be decoded. diff --git a/ethereum/trie/src/main/java/org/hyperledger/besu/ethereum/trie/MerkleTrie.java b/ethereum/trie/src/main/java/org/hyperledger/besu/ethereum/trie/MerkleTrie.java index 2fdb49470..c9442e268 100644 --- a/ethereum/trie/src/main/java/org/hyperledger/besu/ethereum/trie/MerkleTrie.java +++ b/ethereum/trie/src/main/java/org/hyperledger/besu/ethereum/trie/MerkleTrie.java @@ -28,7 +28,7 @@ import java.util.function.Function; import org.apache.tuweni.bytes.Bytes; import org.apache.tuweni.bytes.Bytes32; -/** An Merkle Patricial Trie. */ +/** A Merkle Patricia Trie. */ public interface MerkleTrie { Bytes EMPTY_TRIE_NODE = RLP.NULL; From 812dc747424a0c984e483b2a01fdaab97d50a42c Mon Sep 17 00:00:00 2001 From: Danno Ferrin Date: Thu, 11 Jul 2024 21:19:50 -0600 Subject: [PATCH 44/58] Add evmtool block-test subcommand (#7293) * Add evmtool block-test subcommand Add an evmtool subcommand that will run non-hive blockchain tests. Signed-off-by: Danno Ferrin --- CHANGELOG.md | 5 +- .../evmtool/BlockchainTestSubCommand.java | 254 ++++++++++++++++++ .../besu/evmtool/EvmToolCommand.java | 16 +- .../besu/evmtool/EvmToolSpecTests.java | 13 +- .../evmtool/block-test/prague-eof-rjump.json | 250 +++++++++++++++++ .../referencetests/EOFTestCaseSpec.java | 3 +- 6 files changed, 531 insertions(+), 10 deletions(-) create mode 100644 ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/BlockchainTestSubCommand.java create mode 100644 ethereum/evmtool/src/test/resources/org/hyperledger/besu/evmtool/block-test/prague-eof-rjump.json diff --git a/CHANGELOG.md b/CHANGELOG.md index 1306de83d..0b783b1dc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,7 +5,10 @@ ### Breaking Changes ### Additions and Improvements +- `--Xsnapsync-bft-enabled` option enables experimental support for snap sync with IBFT/QBFT permissioned Bonsai-DB chains [#7140](https://github.com/hyperledger/besu/pull/7140) - Add support to load external profiles using `--profile` [#7265](https://github.com/hyperledger/besu/issues/7265) +- `privacy-nonce-always-increments` option enables private transactions to always increment the nonce, even if the transaction is invalid [#6593](https://github.com/hyperledger/besu/pull/6593) +- Added `block-test` subcommand to the evmtool which runs blockchain reference tests [#7293](https://github.com/hyperledger/besu/pull/7293) ### Bug fixes @@ -34,8 +37,6 @@ - Nodes in a permissioned chain maintain (and retry) connections to bootnodes [#7257](https://github.com/hyperledger/besu/pull/7257) - Promote experimental `besu storage x-trie-log` subcommand to production-ready [#7278](https://github.com/hyperledger/besu/pull/7278) - Enhanced BFT round-change diagnostics [#7271](https://github.com/hyperledger/besu/pull/7271) -- `--Xsnapsync-bft-enabled` option enables experimental support for snap sync with IBFT/QBFT permissioned Bonsai-DB chains [#7140](https://github.com/hyperledger/besu/pull/7140) -- `privacy-nonce-always-increments` option enables private transactions to always increment the nonce, even if the transaction is invalid [#6593](https://github.com/hyperledger/besu/pull/6593) ### Bug fixes - Validation errors ignored in accounts-allowlist and empty list [#7138](https://github.com/hyperledger/besu/issues/7138) diff --git a/ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/BlockchainTestSubCommand.java b/ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/BlockchainTestSubCommand.java new file mode 100644 index 000000000..5b9bc2cdf --- /dev/null +++ b/ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/BlockchainTestSubCommand.java @@ -0,0 +1,254 @@ +/* + * Copyright ConsenSys AG. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on + * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the + * specific language governing permissions and limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + */ +package org.hyperledger.besu.evmtool; + +import static java.nio.charset.StandardCharsets.UTF_8; +import static org.hyperledger.besu.evmtool.BlockchainTestSubCommand.COMMAND_NAME; + +import org.hyperledger.besu.crypto.SignatureAlgorithmFactory; +import org.hyperledger.besu.ethereum.ProtocolContext; +import org.hyperledger.besu.ethereum.chain.MutableBlockchain; +import org.hyperledger.besu.ethereum.core.Block; +import org.hyperledger.besu.ethereum.core.BlockHeader; +import org.hyperledger.besu.ethereum.core.BlockImporter; +import org.hyperledger.besu.ethereum.core.MutableWorldState; +import org.hyperledger.besu.ethereum.mainnet.BlockImportResult; +import org.hyperledger.besu.ethereum.mainnet.HeaderValidationMode; +import org.hyperledger.besu.ethereum.mainnet.ProtocolSchedule; +import org.hyperledger.besu.ethereum.mainnet.ProtocolSpec; +import org.hyperledger.besu.ethereum.referencetests.BlockchainReferenceTestCaseSpec; +import org.hyperledger.besu.ethereum.referencetests.ReferenceTestProtocolSchedules; +import org.hyperledger.besu.ethereum.rlp.RLPException; +import org.hyperledger.besu.evm.EVM; +import org.hyperledger.besu.evm.EvmSpecVersion; +import org.hyperledger.besu.evm.account.AccountState; +import org.hyperledger.besu.evm.internal.EvmConfiguration.WorldUpdaterMode; + +import java.io.BufferedReader; +import java.io.File; +import java.io.IOException; +import java.io.InputStreamReader; +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.function.Supplier; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.JavaType; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.google.common.base.Suppliers; +import org.apache.tuweni.bytes.Bytes32; +import picocli.CommandLine.Command; +import picocli.CommandLine.Option; +import picocli.CommandLine.Parameters; +import picocli.CommandLine.ParentCommand; + +/** + * This class, BlockchainTestSubCommand, is a command-line interface (CLI) command that executes an + * Ethereum State Test. It implements the Runnable interface, meaning it can be used in a thread of + * execution. + * + *

The class is annotated with @CommandLine.Command, which is a PicoCLI annotation that + * designates this class as a command-line command. The annotation parameters define the command's + * name, description, whether it includes standard help options, and the version provider. + * + *

validators, - final Bytes cms) { - super(vanityData, seals, vote, round, validators); - this.cms = cms; - } - - /** - * Instantiates a new Pki Qbft extra data. - * - * @param bftExtraData the bft extra data - * @param cms the cms - */ - public PkiQbftExtraData(final BftExtraData bftExtraData, final Bytes cms) { - this( - bftExtraData.getVanityData(), - bftExtraData.getSeals(), - bftExtraData.getVote(), - bftExtraData.getRound(), - bftExtraData.getValidators(), - cms); - } - - /** - * Gets cms. - * - * @return the cms - */ - public Bytes getCms() { - return cms; - } -} diff --git a/consensus/qbft/src/main/java/org/hyperledger/besu/consensus/qbft/pki/PkiQbftExtraDataCodec.java b/consensus/qbft/src/main/java/org/hyperledger/besu/consensus/qbft/pki/PkiQbftExtraDataCodec.java deleted file mode 100644 index 655ea9169..000000000 --- a/consensus/qbft/src/main/java/org/hyperledger/besu/consensus/qbft/pki/PkiQbftExtraDataCodec.java +++ /dev/null @@ -1,95 +0,0 @@ -/* - * Copyright ConsenSys AG. - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on - * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the - * specific language governing permissions and limitations under the License. - * - * SPDX-License-Identifier: Apache-2.0 - */ -package org.hyperledger.besu.consensus.qbft.pki; - -import org.hyperledger.besu.consensus.common.bft.BftExtraData; -import org.hyperledger.besu.consensus.qbft.QbftExtraDataCodec; -import org.hyperledger.besu.ethereum.rlp.BytesValueRLPInput; -import org.hyperledger.besu.ethereum.rlp.BytesValueRLPOutput; -import org.hyperledger.besu.ethereum.rlp.RLPInput; - -import java.util.List; - -import org.apache.tuweni.bytes.Bytes; - -/** - * The PkiQbftExtraData encoding format is different from the "regular" QbftExtraData encoding. We - * have an extra bytes element in the end of the list. - */ -public class PkiQbftExtraDataCodec extends QbftExtraDataCodec { - - /** The constant QBFT_EXTRA_DATA_LIST_SIZE. */ - public static final int QBFT_EXTRA_DATA_LIST_SIZE = 5; - - /** Default constructor */ - public PkiQbftExtraDataCodec() {} - - @Override - public BftExtraData decodeRaw(final Bytes input) { - if (input.isEmpty()) { - throw new IllegalArgumentException("Invalid Bytes supplied - Bft Extra Data required."); - } - - final BftExtraData bftExtraData = super.decodeRaw(input); - - final RLPInput rlpInput = new BytesValueRLPInput(input, false); - - final Bytes cms; - final List elements = rlpInput.readList(RLPInput::readAsRlp); - if (elements.size() > QBFT_EXTRA_DATA_LIST_SIZE) { - final RLPInput cmsElement = elements.get(elements.size() - 1); - cms = cmsElement.readBytes(); - } else { - cms = Bytes.EMPTY; - } - - return new PkiQbftExtraData(bftExtraData, cms); - } - - @Override - protected Bytes encode(final BftExtraData bftExtraData, final EncodingType encodingType) { - return encode(bftExtraData, encodingType, true); - } - - private Bytes encode( - final BftExtraData bftExtraData, final EncodingType encodingType, final boolean includeCms) { - final Bytes encoded = super.encode(bftExtraData, encodingType); - if (!(bftExtraData instanceof PkiQbftExtraData) || !includeCms) { - return encoded; - } - - final BytesValueRLPOutput rlpOutput = new BytesValueRLPOutput(); - rlpOutput.startList(); - // Read through extraData RLP list elements and write them to the new RLP output - new BytesValueRLPInput(encoded, false) - .readList(RLPInput::readAsRlp).stream() - .map(RLPInput::raw) - .forEach(rlpOutput::writeRLPBytes); - rlpOutput.writeBytes(((PkiQbftExtraData) bftExtraData).getCms()); - rlpOutput.endList(); - - return rlpOutput.encoded(); - } - - /** - * Encode without cms. - * - * @param bftExtraData the bft extra data - * @return the bytes - */ - public Bytes encodeWithoutCms(final BftExtraData bftExtraData) { - return encode(bftExtraData, EncodingType.ALL, false); - } -} diff --git a/consensus/qbft/src/main/java/org/hyperledger/besu/consensus/qbft/validation/ProposalPayloadValidator.java b/consensus/qbft/src/main/java/org/hyperledger/besu/consensus/qbft/validation/ProposalPayloadValidator.java index 640216e9a..3d04f699c 100644 --- a/consensus/qbft/src/main/java/org/hyperledger/besu/consensus/qbft/validation/ProposalPayloadValidator.java +++ b/consensus/qbft/src/main/java/org/hyperledger/besu/consensus/qbft/validation/ProposalPayloadValidator.java @@ -16,24 +16,14 @@ package org.hyperledger.besu.consensus.qbft.validation; import static com.google.common.base.Preconditions.checkState; -import org.hyperledger.besu.consensus.common.bft.BftBlockInterface; -import org.hyperledger.besu.consensus.common.bft.BftExtraDataCodec; import org.hyperledger.besu.consensus.common.bft.ConsensusRoundIdentifier; import org.hyperledger.besu.consensus.common.bft.payload.SignedData; -import org.hyperledger.besu.consensus.qbft.QbftContext; import org.hyperledger.besu.consensus.qbft.payload.ProposalPayload; -import org.hyperledger.besu.consensus.qbft.pki.PkiQbftBlockHeaderFunctions; -import org.hyperledger.besu.consensus.qbft.pki.PkiQbftExtraData; -import org.hyperledger.besu.consensus.qbft.pki.PkiQbftExtraDataCodec; import org.hyperledger.besu.datatypes.Address; -import org.hyperledger.besu.datatypes.Hash; import org.hyperledger.besu.ethereum.BlockValidator; import org.hyperledger.besu.ethereum.ProtocolContext; import org.hyperledger.besu.ethereum.core.Block; import org.hyperledger.besu.ethereum.mainnet.HeaderValidationMode; -import org.hyperledger.besu.pki.cms.CmsValidator; - -import java.util.Optional; import com.google.common.annotations.VisibleForTesting; import org.slf4j.Logger; @@ -49,8 +39,6 @@ public class ProposalPayloadValidator { private final ConsensusRoundIdentifier targetRound; private final BlockValidator blockValidator; private final ProtocolContext protocolContext; - private final BftExtraDataCodec bftExtraDataCodec; - private final Optional cmsValidator; /** * Instantiates a new Proposal payload validator. @@ -59,50 +47,17 @@ public class ProposalPayloadValidator { * @param targetRound the target round * @param blockValidator the block validator * @param protocolContext the protocol context - * @param bftExtraDataCodec the bft extra data codec - */ - public ProposalPayloadValidator( - final Address expectedProposer, - final ConsensusRoundIdentifier targetRound, - final BlockValidator blockValidator, - final ProtocolContext protocolContext, - final BftExtraDataCodec bftExtraDataCodec) { - this( - expectedProposer, - targetRound, - blockValidator, - protocolContext, - bftExtraDataCodec, - protocolContext - .getConsensusContext(QbftContext.class) - .getPkiBlockCreationConfiguration() - .map(config -> new CmsValidator(config.getTrustStore()))); - } - - /** - * Instantiates a new Proposal payload validator. - * - * @param expectedProposer the expected proposer - * @param targetRound the target round - * @param blockValidator the block validator - * @param protocolContext the protocol context - * @param bftExtraDataCodec the bft extra data codec - * @param cmsValidator the cms validator */ @VisibleForTesting public ProposalPayloadValidator( final Address expectedProposer, final ConsensusRoundIdentifier targetRound, final BlockValidator blockValidator, - final ProtocolContext protocolContext, - final BftExtraDataCodec bftExtraDataCodec, - final Optional cmsValidator) { + final ProtocolContext protocolContext) { this.expectedProposer = expectedProposer; this.targetRound = targetRound; this.blockValidator = blockValidator; this.protocolContext = protocolContext; - this.bftExtraDataCodec = bftExtraDataCodec; - this.cmsValidator = cmsValidator; } /** @@ -135,13 +90,6 @@ public class ProposalPayloadValidator { return false; } - if (cmsValidator.isPresent()) { - return validateCms( - block, - protocolContext.getConsensusContext(QbftContext.class).getBlockInterface(), - cmsValidator.get()); - } - return true; } @@ -162,26 +110,4 @@ public class ProposalPayloadValidator { return true; } - - private boolean validateCms( - final Block block, - final BftBlockInterface bftBlockInterface, - final CmsValidator cmsValidator) { - final PkiQbftExtraData pkiExtraData = - (PkiQbftExtraData) bftBlockInterface.getExtraData(block.getHeader()); - - final Hash hashWithoutCms = - PkiQbftBlockHeaderFunctions.forCmsSignature((PkiQbftExtraDataCodec) bftExtraDataCodec) - .hash(block.getHeader()); - - LOG.debug("Validating CMS with signed hash {} in block {}", hashWithoutCms, block.getHash()); - - if (!cmsValidator.validate(pkiExtraData.getCms(), hashWithoutCms)) { - LOG.info("{}: invalid CMS in block {}", ERROR_PREFIX, block.getHash()); - return false; - } else { - LOG.trace("Valid CMS in block {}", block.getHash()); - return true; - } - } } diff --git a/consensus/qbft/src/main/java/org/hyperledger/besu/consensus/qbft/validation/ProposalValidator.java b/consensus/qbft/src/main/java/org/hyperledger/besu/consensus/qbft/validation/ProposalValidator.java index 53f81fa25..81cbffdff 100644 --- a/consensus/qbft/src/main/java/org/hyperledger/besu/consensus/qbft/validation/ProposalValidator.java +++ b/consensus/qbft/src/main/java/org/hyperledger/besu/consensus/qbft/validation/ProposalValidator.java @@ -98,7 +98,7 @@ public class ProposalValidator { final ProposalPayloadValidator payloadValidator = new ProposalPayloadValidator( - expectedProposer, roundIdentifier, blockValidator, protocolContext, bftExtraDataCodec); + expectedProposer, roundIdentifier, blockValidator, protocolContext); if (!payloadValidator.validate(msg.getSignedPayload())) { LOG.info("{}: invalid proposal payload in proposal message", ERROR_PREFIX); diff --git a/consensus/qbft/src/test/java/org/hyperledger/besu/consensus/qbft/validation/ProposalPayloadValidatorTest.java b/consensus/qbft/src/test/java/org/hyperledger/besu/consensus/qbft/validation/ProposalPayloadValidatorTest.java index 182393484..9c9422e10 100644 --- a/consensus/qbft/src/test/java/org/hyperledger/besu/consensus/qbft/validation/ProposalPayloadValidatorTest.java +++ b/consensus/qbft/src/test/java/org/hyperledger/besu/consensus/qbft/validation/ProposalPayloadValidatorTest.java @@ -21,8 +21,6 @@ import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.verifyNoMoreInteractions; import static org.mockito.Mockito.when; -import org.hyperledger.besu.consensus.common.bft.BftBlockHeaderFunctions; -import org.hyperledger.besu.consensus.common.bft.BftExtraDataCodec; import org.hyperledger.besu.consensus.common.bft.ConsensusRoundHelpers; import org.hyperledger.besu.consensus.common.bft.ConsensusRoundIdentifier; import org.hyperledger.besu.consensus.common.bft.ProposedBlockHelpers; @@ -30,31 +28,21 @@ import org.hyperledger.besu.consensus.qbft.QbftContext; import org.hyperledger.besu.consensus.qbft.QbftExtraDataCodec; import org.hyperledger.besu.consensus.qbft.messagewrappers.Proposal; import org.hyperledger.besu.consensus.qbft.payload.MessageFactory; -import org.hyperledger.besu.consensus.qbft.pki.PkiQbftBlockHeaderFunctions; -import org.hyperledger.besu.consensus.qbft.pki.PkiQbftExtraData; -import org.hyperledger.besu.consensus.qbft.pki.PkiQbftExtraDataCodec; import org.hyperledger.besu.cryptoservices.NodeKey; import org.hyperledger.besu.cryptoservices.NodeKeyUtils; import org.hyperledger.besu.datatypes.Address; -import org.hyperledger.besu.datatypes.Hash; import org.hyperledger.besu.ethereum.BlockProcessingResult; import org.hyperledger.besu.ethereum.BlockValidator; import org.hyperledger.besu.ethereum.ProtocolContext; import org.hyperledger.besu.ethereum.chain.BadBlockManager; import org.hyperledger.besu.ethereum.chain.MutableBlockchain; import org.hyperledger.besu.ethereum.core.Block; -import org.hyperledger.besu.ethereum.core.BlockDataGenerator; -import org.hyperledger.besu.ethereum.core.BlockDataGenerator.BlockOptions; import org.hyperledger.besu.ethereum.core.Util; import org.hyperledger.besu.ethereum.mainnet.HeaderValidationMode; import org.hyperledger.besu.ethereum.worldstate.WorldStateArchive; -import org.hyperledger.besu.pki.cms.CmsValidator; -import java.util.Collections; -import java.util.List; import java.util.Optional; -import org.apache.tuweni.bytes.Bytes; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -67,7 +55,6 @@ public class ProposalPayloadValidatorTest { @Mock private BlockValidator blockValidator; @Mock private MutableBlockchain blockChain; @Mock private WorldStateArchive worldStateArchive; - @Mock private CmsValidator cmsValidator; private ProtocolContext protocolContext; private static final int CHAIN_HEIGHT = 3; @@ -95,7 +82,7 @@ public class ProposalPayloadValidatorTest { public void validationPassesWhenProposerAndRoundMatchAndBlockIsValid() { final ProposalPayloadValidator payloadValidator = new ProposalPayloadValidator( - expectedProposer, roundIdentifier, blockValidator, protocolContext, bftExtraDataCodec); + expectedProposer, roundIdentifier, blockValidator, protocolContext); final Block block = ProposedBlockHelpers.createProposalBlock(emptyList(), roundIdentifier, bftExtraDataCodec); final Proposal proposal = @@ -116,7 +103,7 @@ public class ProposalPayloadValidatorTest { public void validationPassesWhenBlockRoundDoesNotMatchProposalRound() { final ProposalPayloadValidator payloadValidator = new ProposalPayloadValidator( - expectedProposer, roundIdentifier, blockValidator, protocolContext, bftExtraDataCodec); + expectedProposer, roundIdentifier, blockValidator, protocolContext); final Block block = ProposedBlockHelpers.createProposalBlock( @@ -144,7 +131,7 @@ public class ProposalPayloadValidatorTest { final ProposalPayloadValidator payloadValidator = new ProposalPayloadValidator( - expectedProposer, roundIdentifier, blockValidator, protocolContext, bftExtraDataCodec); + expectedProposer, roundIdentifier, blockValidator, protocolContext); final Block block = ProposedBlockHelpers.createProposalBlock(emptyList(), roundIdentifier, bftExtraDataCodec); final Proposal proposal = @@ -165,11 +152,7 @@ public class ProposalPayloadValidatorTest { public void validationFailsWhenExpectedProposerDoesNotMatchPayloadsAuthor() { final ProposalPayloadValidator payloadValidator = new ProposalPayloadValidator( - Address.fromHexString("0x1"), - roundIdentifier, - blockValidator, - protocolContext, - bftExtraDataCodec); + Address.fromHexString("0x1"), roundIdentifier, blockValidator, protocolContext); final Block block = ProposedBlockHelpers.createProposalBlock(emptyList(), roundIdentifier); final Proposal proposal = messageFactory.createProposal(roundIdentifier, block, emptyList(), emptyList()); @@ -182,7 +165,7 @@ public class ProposalPayloadValidatorTest { public void validationFailsWhenMessageMismatchesExpectedRound() { final ProposalPayloadValidator payloadValidator = new ProposalPayloadValidator( - expectedProposer, roundIdentifier, blockValidator, protocolContext, bftExtraDataCodec); + expectedProposer, roundIdentifier, blockValidator, protocolContext); final Block block = ProposedBlockHelpers.createProposalBlock(emptyList(), roundIdentifier); final Proposal proposal = @@ -200,7 +183,7 @@ public class ProposalPayloadValidatorTest { public void validationFailsWhenMessageMismatchesExpectedHeight() { final ProposalPayloadValidator payloadValidator = new ProposalPayloadValidator( - expectedProposer, roundIdentifier, blockValidator, protocolContext, bftExtraDataCodec); + expectedProposer, roundIdentifier, blockValidator, protocolContext); final Block block = ProposedBlockHelpers.createProposalBlock(emptyList(), roundIdentifier); final Proposal proposal = @@ -218,7 +201,7 @@ public class ProposalPayloadValidatorTest { public void validationFailsForBlockWithIncorrectHeight() { final ProposalPayloadValidator payloadValidator = new ProposalPayloadValidator( - expectedProposer, roundIdentifier, blockValidator, protocolContext, bftExtraDataCodec); + expectedProposer, roundIdentifier, blockValidator, protocolContext); final Block block = ProposedBlockHelpers.createProposalBlock( emptyList(), @@ -237,104 +220,4 @@ public class ProposalPayloadValidatorTest { assertThat(payloadValidator.validate(proposal.getSignedPayload())).isFalse(); } - - @Test - public void validationForCmsFailsWhenCmsFailsValidation() { - final PkiQbftExtraDataCodec pkiQbftExtraDataCodec = new PkiQbftExtraDataCodec(); - final QbftContext qbftContext = - setupContextWithBftExtraDataEncoder(QbftContext.class, emptyList(), pkiQbftExtraDataCodec); - final Bytes cms = Bytes.fromHexStringLenient("0x1"); - final ProtocolContext protocolContext = - new ProtocolContext(blockChain, worldStateArchive, qbftContext, new BadBlockManager()); - - final ProposalPayloadValidator payloadValidator = - new ProposalPayloadValidator( - expectedProposer, - roundIdentifier, - blockValidator, - protocolContext, - pkiQbftExtraDataCodec, - Optional.of(cmsValidator)); - final Block block = - createPkiProposalBlock(emptyList(), roundIdentifier, pkiQbftExtraDataCodec, cms); - final Proposal proposal = - messageFactory.createProposal(roundIdentifier, block, emptyList(), emptyList()); - final Hash hashWithoutCms = - PkiQbftBlockHeaderFunctions.forCmsSignature(pkiQbftExtraDataCodec).hash(block.getHeader()); - - when(blockValidator.validateAndProcessBlock( - eq(protocolContext), - eq(block), - eq(HeaderValidationMode.LIGHT), - eq(HeaderValidationMode.FULL), - eq(false))) - .thenReturn(new BlockProcessingResult(Optional.empty())); - when(cmsValidator.validate(eq(cms), eq(hashWithoutCms))).thenReturn(false); - - assertThat(payloadValidator.validate(proposal.getSignedPayload())).isFalse(); - } - - @Test - public void validationForCmsPassesWhenCmsIsValid() { - final PkiQbftExtraDataCodec pkiQbftExtraDataCodec = new PkiQbftExtraDataCodec(); - final QbftContext qbftContext = - setupContextWithBftExtraDataEncoder(QbftContext.class, emptyList(), pkiQbftExtraDataCodec); - final Bytes cms = Bytes.fromHexStringLenient("0x1"); - final ProtocolContext protocolContext = - new ProtocolContext(blockChain, worldStateArchive, qbftContext, new BadBlockManager()); - - final ProposalPayloadValidator payloadValidator = - new ProposalPayloadValidator( - expectedProposer, - roundIdentifier, - blockValidator, - protocolContext, - pkiQbftExtraDataCodec, - Optional.of(cmsValidator)); - final Block block = - createPkiProposalBlock(emptyList(), roundIdentifier, pkiQbftExtraDataCodec, cms); - final Proposal proposal = - messageFactory.createProposal(roundIdentifier, block, emptyList(), emptyList()); - final Hash hashWithoutCms = - PkiQbftBlockHeaderFunctions.forCmsSignature(pkiQbftExtraDataCodec).hash(block.getHeader()); - - when(blockValidator.validateAndProcessBlock( - eq(protocolContext), - eq(block), - eq(HeaderValidationMode.LIGHT), - eq(HeaderValidationMode.FULL), - eq(false))) - .thenReturn(new BlockProcessingResult(Optional.empty())); - when(cmsValidator.validate(eq(cms), eq(hashWithoutCms))).thenReturn(true); - - assertThat(payloadValidator.validate(proposal.getSignedPayload())).isTrue(); - } - - public static Block createPkiProposalBlock( - final List
validators, - final ConsensusRoundIdentifier roundId, - final BftExtraDataCodec bftExtraDataCodec, - final Bytes cms) { - final Bytes extraData = - bftExtraDataCodec.encode( - new PkiQbftExtraData( - Bytes.wrap(new byte[32]), - Collections.emptyList(), - Optional.empty(), - roundId.getRoundNumber(), - validators, - cms)); - final BlockOptions blockOptions = - BlockOptions.create() - .setExtraData(extraData) - .setBlockNumber(roundId.getSequenceNumber()) - .setBlockHeaderFunctions(BftBlockHeaderFunctions.forCommittedSeal(bftExtraDataCodec)) - .hasOmmers(false) - .hasTransactions(false); - - if (validators.size() > 0) { - blockOptions.setCoinbase(validators.get(0)); - } - return new BlockDataGenerator().block(blockOptions); - } } From 223f1bc3bb68267fb4841601d86fbb7b76ec0cf2 Mon Sep 17 00:00:00 2001 From: Sally MacFarlane Date: Tue, 16 Jul 2024 10:44:06 +1000 Subject: [PATCH 55/58] EIP-7251 add consolidation request type (#7266) * add request type for consolidations, encoder, decoder and tests * added raw tx for consolidation * add consolidation reqs to EngineGetPayloadResultV4 * set storage slot value to 0 initially and value for tx * updates plugin api Signed-off-by: Justin Florentine Signed-off-by: Sally MacFarlane --------- Signed-off-by: Sally MacFarlane Signed-off-by: Justin Florentine Co-authored-by: Justin Florentine --- .../jsonrpc/engine/prague/genesis.json | 16 ++- .../test-cases/00_get_genesis_block_info.json | 43 ++++++ .../test-cases/01_cancun_prepare_payload.json | 8 +- .../test-cases/02_cancun_getPayloadV3.json | 8 +- .../test-cases/03_cancun_newPayloadV3.json | 8 +- .../04_cancun_forkchoiceUpdatedV3.json | 8 +- .../05_prague_forkchoiceUpdatedV3.json | 10 +- .../test-cases/06_prague_getPayloadV4.json | 9 +- ...invalid_null_deposits_execute_payload.json | 2 +- .../test-cases/09_prague_newPayloadV4.json | 9 +- .../10_prague_forkchoiceUpdatedV3.json | 10 +- .../test-cases/11_prague_getPayloadV4.json | 9 +- ...oadV4.json => 12_cancun_newPayloadV3.json} | 8 +- ...raw_transaction_consolidation_request.json | 14 ++ ...son => 15_prague_forkchoiceUpdatedV3.json} | 10 +- ...oadV4.json => 16_prague_getPayloadV4.json} | 24 ++-- .../besu/datatypes/RequestType.java | 5 +- .../engine/AbstractEngineNewPayload.java | 19 ++- .../engine/RequestValidatorProvider.java | 6 + .../ConsolidationRequestParameter.java | 102 +++++++++++++ .../parameters/EnginePayloadParameter.java | 11 +- .../internal/results/BlockResultFactory.java | 2 + .../results/EngineGetPayloadResultV4.java | 30 +++- .../engine/AbstractEngineNewPayloadTest.java | 9 +- .../engine/EngineGetPayloadV4Test.java | 1 + .../engine/EngineNewPayloadV2Test.java | 14 +- .../engine/EngineNewPayloadV3Test.java | 8 +- .../engine/EngineNewPayloadV4Test.java | 16 ++- .../ethereum/core/ConsolidationRequest.java | 90 ++++++++++++ .../encoding/ConsolidationRequestDecoder.java | 40 ++++++ .../encoding/ConsolidationRequestEncoder.java | 60 ++++++++ .../core/encoding/RequestDecoder.java | 4 +- .../core/encoding/RequestEncoder.java | 4 +- .../ConsolidationRequestProcessor.java | 68 +++++++++ .../ConsolidationRequestValidator.java | 92 ++++++++++++ .../requests/MainnetRequestsValidator.java | 2 + .../mainnet/requests/RequestUtil.java | 21 ++- .../ConsolidationRequestDecoderTest.java | 46 ++++++ .../ConsolidationRequestEncoderTest.java | 55 +++++++ ...st.java => DepositRequestDecoderTest.java} | 2 +- ...st.java => DepositRequestEncoderTest.java} | 2 +- ...olidationRequestValidatorTestFixtures.java | 136 ++++++++++++++++++ ...agueConsolidationRequestValidatorTest.java | 76 ++++++++++ .../hyperledger/besu/evmtool/T8nExecutor.java | 15 +- .../besu/evmtool/t8n/prague-deposit.json | 13 +- .../besu/evmtool/t8n/prague-withdrawal.json | 1 + .../vm/BlockchainReferenceTestTools.java | 4 +- plugin-api/build.gradle | 2 +- .../plugin/data/ConsolidationRequest.java | 45 ++++++ 49 files changed, 1099 insertions(+), 98 deletions(-) create mode 100644 acceptance-tests/tests/src/test/resources/jsonrpc/engine/prague/test-cases/00_get_genesis_block_info.json rename acceptance-tests/tests/src/test/resources/jsonrpc/engine/prague/test-cases/{12_cancun_newPayloadV4.json => 12_cancun_newPayloadV3.json} (80%) create mode 100644 acceptance-tests/tests/src/test/resources/jsonrpc/engine/prague/test-cases/14_prague_send_raw_transaction_consolidation_request.json rename acceptance-tests/tests/src/test/resources/jsonrpc/engine/prague/test-cases/{14_prague_forkchoiceUpdatedV3.json => 15_prague_forkchoiceUpdatedV3.json} (61%) rename acceptance-tests/tests/src/test/resources/jsonrpc/engine/prague/test-cases/{15_prague_getPayloadV4.json => 16_prague_getPayloadV4.json} (62%) create mode 100644 ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/parameters/ConsolidationRequestParameter.java create mode 100644 ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/ConsolidationRequest.java create mode 100644 ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/encoding/ConsolidationRequestDecoder.java create mode 100644 ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/encoding/ConsolidationRequestEncoder.java create mode 100644 ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/requests/ConsolidationRequestProcessor.java create mode 100644 ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/requests/ConsolidationRequestValidator.java create mode 100644 ethereum/core/src/test/java/org/hyperledger/besu/ethereum/core/encoding/ConsolidationRequestDecoderTest.java create mode 100644 ethereum/core/src/test/java/org/hyperledger/besu/ethereum/core/encoding/ConsolidationRequestEncoderTest.java rename ethereum/core/src/test/java/org/hyperledger/besu/ethereum/core/encoding/{DepositRequestRequestDecoderTest.java => DepositRequestDecoderTest.java} (99%) rename ethereum/core/src/test/java/org/hyperledger/besu/ethereum/core/encoding/{DepositRequestRequestEncoderTest.java => DepositRequestEncoderTest.java} (98%) create mode 100644 ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/ConsolidationRequestValidatorTestFixtures.java create mode 100644 ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/PragueConsolidationRequestValidatorTest.java create mode 100644 plugin-api/src/main/java/org/hyperledger/besu/plugin/data/ConsolidationRequest.java diff --git a/acceptance-tests/tests/src/test/resources/jsonrpc/engine/prague/genesis.json b/acceptance-tests/tests/src/test/resources/jsonrpc/engine/prague/genesis.json index 3f2645d4d..ac474c024 100644 --- a/acceptance-tests/tests/src/test/resources/jsonrpc/engine/prague/genesis.json +++ b/acceptance-tests/tests/src/test/resources/jsonrpc/engine/prague/genesis.json @@ -33,7 +33,7 @@ "balance": "1000000000000000000000000000" }, "0x23618e81E3f5cdF7f54C3d65f7FBc0aBf5B21E8f": { - "comment": "This is the account used to sign the transaction that creates a validator exit", + "comment": "This is the account used to sign the transactions that create a validator exit, and consolidation request", "balance": "1000000000000000000000000000" }, "0x00A3ca265EBcb825B45F985A16CEFB49958cE017": { @@ -50,6 +50,20 @@ "0x0000000000000000000000000000000000000000000000000000000000000006": "5d8601f0cb3bcc4ce1af9864779a416e00000000000000000000000000000000" } }, + "0x00b42dbF2194e931E80326D950320f7d9Dbeac02": { + "comment": "This is the runtime bytecode for the Consolidation Request Smart Contract. It was created from the deployment transaction in EIP-7251 (https://eips.ethereum.org/EIPS/eip-7251#deployment)", + "balance": "0", + "code": "0x3373fffffffffffffffffffffffffffffffffffffffe146098573615156028575f545f5260205ff35b36606014156101445760115f54600182026001905f5b5f82111560595781019083028483029004916001019190603e565b90939004341061014457600154600101600155600354806004026004013381556001015f35815560010160203581556001016040359055600101600355005b6003546002548082038060011160ac575060015b5f5b81811460f15780607402838201600402600401805490600101805490600101805490600101549260601b84529083601401528260340152906054015260010160ae565b9101809214610103579060025561010e565b90505f6002555f6003555b5f548061049d141561011d57505f5b6001546001828201116101325750505f610138565b01600190035b5f555f6001556074025ff35b5f5ffd", + "storage": { + "0x0000000000000000000000000000000000000000000000000000000000000000": "0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000001": "0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000002": "0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000003": "0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000004": "0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000005": "0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000006": "0000000000000000000000000000000000000000000000000000000000000000" + } + }, "0x4242424242424242424242424242424242424242": { "balance": "0", "code": "0x60806040526004361061003f5760003560e01c806301ffc9a71461004457806322895118146100a4578063621fd130146101ba578063c5f2892f14610244575b600080fd5b34801561005057600080fd5b506100906004803603602081101561006757600080fd5b50357fffffffff000000000000000000000000000000000000000000000000000000001661026b565b604080519115158252519081900360200190f35b6101b8600480360360808110156100ba57600080fd5b8101906020810181356401000000008111156100d557600080fd5b8201836020820111156100e757600080fd5b8035906020019184600183028401116401000000008311171561010957600080fd5b91939092909160208101903564010000000081111561012757600080fd5b82018360208201111561013957600080fd5b8035906020019184600183028401116401000000008311171561015b57600080fd5b91939092909160208101903564010000000081111561017957600080fd5b82018360208201111561018b57600080fd5b803590602001918460018302840111640100000000831117156101ad57600080fd5b919350915035610304565b005b3480156101c657600080fd5b506101cf6110b5565b6040805160208082528351818301528351919283929083019185019080838360005b838110156102095781810151838201526020016101f1565b50505050905090810190601f1680156102365780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561025057600080fd5b506102596110c7565b60408051918252519081900360200190f35b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a70000000000000000000000000000000000000000000000000000000014806102fe57507fffffffff0000000000000000000000000000000000000000000000000000000082167f8564090700000000000000000000000000000000000000000000000000000000145b92915050565b6030861461035d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806118056026913960400191505060405180910390fd5b602084146103b6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603681526020018061179c6036913960400191505060405180910390fd5b6060821461040f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260298152602001806118786029913960400191505060405180910390fd5b670de0b6b3a7640000341015610470576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806118526026913960400191505060405180910390fd5b633b9aca003406156104cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260338152602001806117d26033913960400191505060405180910390fd5b633b9aca00340467ffffffffffffffff811115610535576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602781526020018061182b6027913960400191505060405180910390fd5b6060610540826114ba565b90507f649bbc62d0e31342afea4e5cd82d4049e7e1ee912fc0889aa790803be39038c589898989858a8a6105756020546114ba565b6040805160a0808252810189905290819060208201908201606083016080840160c085018e8e80828437600083820152601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01690910187810386528c815260200190508c8c808284376000838201819052601f9091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01690920188810386528c5181528c51602091820193918e019250908190849084905b83811015610648578181015183820152602001610630565b50505050905090810190601f1680156106755780820380516001836020036101000a031916815260200191505b5086810383528881526020018989808284376000838201819052601f9091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169092018881038452895181528951602091820193918b019250908190849084905b838110156106ef5781810151838201526020016106d7565b50505050905090810190601f16801561071c5780820380516001836020036101000a031916815260200191505b509d505050505050505050505050505060405180910390a1600060028a8a600060801b604051602001808484808284377fffffffffffffffffffffffffffffffff0000000000000000000000000000000090941691909301908152604080517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0818403018152601090920190819052815191955093508392506020850191508083835b602083106107fc57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016107bf565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa158015610859573d6000803e3d6000fd5b5050506040513d602081101561086e57600080fd5b5051905060006002806108846040848a8c6116fe565b6040516020018083838082843780830192505050925050506040516020818303038152906040526040518082805190602001908083835b602083106108f857805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016108bb565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa158015610955573d6000803e3d6000fd5b5050506040513d602081101561096a57600080fd5b5051600261097b896040818d6116fe565b60405160009060200180848480828437919091019283525050604080518083038152602092830191829052805190945090925082918401908083835b602083106109f457805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016109b7565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa158015610a51573d6000803e3d6000fd5b5050506040513d6020811015610a6657600080fd5b5051604080516020818101949094528082019290925280518083038201815260609092019081905281519192909182918401908083835b60208310610ada57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610a9d565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa158015610b37573d6000803e3d6000fd5b5050506040513d6020811015610b4c57600080fd5b50516040805160208101858152929350600092600292839287928f928f92018383808284378083019250505093505050506040516020818303038152906040526040518082805190602001908083835b60208310610bd957805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610b9c565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa158015610c36573d6000803e3d6000fd5b5050506040513d6020811015610c4b57600080fd5b50516040518651600291889160009188916020918201918291908601908083835b60208310610ca957805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610c6c565b6001836020036101000a0380198251168184511680821785525050505050509050018367ffffffffffffffff191667ffffffffffffffff1916815260180182815260200193505050506040516020818303038152906040526040518082805190602001908083835b60208310610d4e57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610d11565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa158015610dab573d6000803e3d6000fd5b5050506040513d6020811015610dc057600080fd5b5051604080516020818101949094528082019290925280518083038201815260609092019081905281519192909182918401908083835b60208310610e3457805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610df7565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa158015610e91573d6000803e3d6000fd5b5050506040513d6020811015610ea657600080fd5b50519050858114610f02576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260548152602001806117486054913960600191505060405180910390fd5b60205463ffffffff11610f60576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806117276021913960400191505060405180910390fd5b602080546001019081905560005b60208110156110a9578160011660011415610fa0578260008260208110610f9157fe5b0155506110ac95505050505050565b600260008260208110610faf57fe5b01548460405160200180838152602001828152602001925050506040516020818303038152906040526040518082805190602001908083835b6020831061102557805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610fe8565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa158015611082573d6000803e3d6000fd5b5050506040513d602081101561109757600080fd5b50519250600282049150600101610f6e565b50fe5b50505050505050565b60606110c26020546114ba565b905090565b6020546000908190815b60208110156112f05781600116600114156111e6576002600082602081106110f557fe5b01548460405160200180838152602001828152602001925050506040516020818303038152906040526040518082805190602001908083835b6020831061116b57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909201916020918201910161112e565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa1580156111c8573d6000803e3d6000fd5b5050506040513d60208110156111dd57600080fd5b505192506112e2565b600283602183602081106111f657fe5b015460405160200180838152602001828152602001925050506040516020818303038152906040526040518082805190602001908083835b6020831061126b57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909201916020918201910161122e565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa1580156112c8573d6000803e3d6000fd5b5050506040513d60208110156112dd57600080fd5b505192505b6002820491506001016110d1565b506002826112ff6020546114ba565b600060401b6040516020018084815260200183805190602001908083835b6020831061135a57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909201916020918201910161131d565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790527fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000095909516920191825250604080518083037ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8018152601890920190819052815191955093508392850191508083835b6020831061143f57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101611402565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa15801561149c573d6000803e3d6000fd5b5050506040513d60208110156114b157600080fd5b50519250505090565b60408051600880825281830190925260609160208201818036833701905050905060c082901b8060071a60f81b826000815181106114f457fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508060061a60f81b8260018151811061153757fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508060051a60f81b8260028151811061157a57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508060041a60f81b826003815181106115bd57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508060031a60f81b8260048151811061160057fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508060021a60f81b8260058151811061164357fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508060011a60f81b8260068151811061168657fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508060001a60f81b826007815181106116c957fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535050919050565b6000808585111561170d578182fd5b83861115611719578182fd5b505082019391909203915056fe4465706f736974436f6e74726163743a206d65726b6c6520747265652066756c6c4465706f736974436f6e74726163743a207265636f6e7374727563746564204465706f7369744461746120646f6573206e6f74206d6174636820737570706c696564206465706f7369745f646174615f726f6f744465706f736974436f6e74726163743a20696e76616c6964207769746864726177616c5f63726564656e7469616c73206c656e6774684465706f736974436f6e74726163743a206465706f7369742076616c7565206e6f74206d756c7469706c65206f6620677765694465706f736974436f6e74726163743a20696e76616c6964207075626b6579206c656e6774684465706f736974436f6e74726163743a206465706f7369742076616c756520746f6f20686967684465706f736974436f6e74726163743a206465706f7369742076616c756520746f6f206c6f774465706f736974436f6e74726163743a20696e76616c6964207369676e6174757265206c656e677468a26469706673582212201dd26f37a621703009abf16e77e69c93dc50c79db7f6cc37543e3e0e3decdc9764736f6c634300060b0033", diff --git a/acceptance-tests/tests/src/test/resources/jsonrpc/engine/prague/test-cases/00_get_genesis_block_info.json b/acceptance-tests/tests/src/test/resources/jsonrpc/engine/prague/test-cases/00_get_genesis_block_info.json new file mode 100644 index 000000000..d1a18826a --- /dev/null +++ b/acceptance-tests/tests/src/test/resources/jsonrpc/engine/prague/test-cases/00_get_genesis_block_info.json @@ -0,0 +1,43 @@ +{ + "request": { + "jsonrpc": "2.0", + "method": "eth_getBlockByNumber", + "params": [ + "0x00", true + ], + "id": 67 + }, + "response": { + "jsonrpc": "2.0", + "id": 67, + "result": { + "number": "0x0", + "hash" : "0x38d7daa68e8bac41a0a237b7cbfcef480cb9bd9adc7b282d7b0d23ff4eb8d6e5", + "mixHash" : "0x0000000000000000000000000000000000000000000000000000000000000000", + "parentHash" : "0x0000000000000000000000000000000000000000000000000000000000000000", + "nonce" : "0x0000000000000042", + "sha3Uncles" : "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347", + "logsBloom" : "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "transactionsRoot" : "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "stateRoot" : "0x3ed8435adb5f3526144e6babdd3fc8c661a86097cf7e743441b41fda096fc4dd", + "receiptsRoot" : "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "miner" : "0x0000000000000000000000000000000000000000", + "difficulty" : "0x400000000", + "totalDifficulty" : "0x400000000", + "extraData" : "0x0000000000000000000000000000000000000000000000000000000000000000a94f5374fce5edbc8e2a8697c15331677e6ebf0b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "baseFeePerGas" : "0x7", + "size" : "0x2ba", + "gasLimit" : "0x1c9c380", + "gasUsed" : "0x0", + "timestamp" : "0x0", + "uncles" : [ ], + "transactions" : [ ], + "withdrawalsRoot" : "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "withdrawals" : [ ], + "blobGasUsed" : "0x0", + "excessBlobGas" : "0x0", + "parentBeaconBlockRoot" : "0x0000000000000000000000000000000000000000000000000000000000000000" + } + }, + "statusCode": 200 +} \ No newline at end of file diff --git a/acceptance-tests/tests/src/test/resources/jsonrpc/engine/prague/test-cases/01_cancun_prepare_payload.json b/acceptance-tests/tests/src/test/resources/jsonrpc/engine/prague/test-cases/01_cancun_prepare_payload.json index 21a2e70a4..ad4b9be2d 100644 --- a/acceptance-tests/tests/src/test/resources/jsonrpc/engine/prague/test-cases/01_cancun_prepare_payload.json +++ b/acceptance-tests/tests/src/test/resources/jsonrpc/engine/prague/test-cases/01_cancun_prepare_payload.json @@ -4,8 +4,8 @@ "method": "engine_forkchoiceUpdatedV3", "params": [ { - "headBlockHash": "0x3ca89f1d6b71aeb56389ac8270e9ae369d0bb8edeea747f2d868a5eb31892b04", - "safeBlockHash": "0x3ca89f1d6b71aeb56389ac8270e9ae369d0bb8edeea747f2d868a5eb31892b04", + "headBlockHash": "0x38d7daa68e8bac41a0a237b7cbfcef480cb9bd9adc7b282d7b0d23ff4eb8d6e5", + "safeBlockHash": "0x38d7daa68e8bac41a0a237b7cbfcef480cb9bd9adc7b282d7b0d23ff4eb8d6e5", "finalizedBlockHash": "0x0000000000000000000000000000000000000000000000000000000000000000" }, { @@ -24,10 +24,10 @@ "result": { "payloadStatus": { "status": "VALID", - "latestValidHash": "0x3ca89f1d6b71aeb56389ac8270e9ae369d0bb8edeea747f2d868a5eb31892b04", + "latestValidHash": "0x38d7daa68e8bac41a0a237b7cbfcef480cb9bd9adc7b282d7b0d23ff4eb8d6e5", "validationError": null }, - "payloadId": "0x282643d318bdab11" + "payloadId": "0x28264396eca1deef" } }, "statusCode": 200 diff --git a/acceptance-tests/tests/src/test/resources/jsonrpc/engine/prague/test-cases/02_cancun_getPayloadV3.json b/acceptance-tests/tests/src/test/resources/jsonrpc/engine/prague/test-cases/02_cancun_getPayloadV3.json index 0c9281fc6..63cfeec26 100644 --- a/acceptance-tests/tests/src/test/resources/jsonrpc/engine/prague/test-cases/02_cancun_getPayloadV3.json +++ b/acceptance-tests/tests/src/test/resources/jsonrpc/engine/prague/test-cases/02_cancun_getPayloadV3.json @@ -3,7 +3,7 @@ "jsonrpc": "2.0", "method": "engine_getPayloadV3", "params": [ - "0x282643d318bdab11" + "0x28264396eca1deef" ], "id": 67 }, @@ -12,9 +12,9 @@ "id": 67, "result": { "executionPayload": { - "parentHash": "0x3ca89f1d6b71aeb56389ac8270e9ae369d0bb8edeea747f2d868a5eb31892b04", + "parentHash": "0x38d7daa68e8bac41a0a237b7cbfcef480cb9bd9adc7b282d7b0d23ff4eb8d6e5", "feeRecipient": "0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b", - "stateRoot": "0x2b6a1166ce24fe0af741c7313e6049e9e19351742bfaf4179154bc594ca9eb90", + "stateRoot": "0x3ed8435adb5f3526144e6babdd3fc8c661a86097cf7e743441b41fda096fc4dd", "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000", "gasLimit": "0x1c9c380", @@ -29,7 +29,7 @@ "blockNumber": "0x1", "receiptsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", "blobGasUsed": "0x0", - "blockHash": "0x74e8ce9d96d325a605675a34175adfa34581f35091dcd7b107c525a82b0b9950" + "blockHash": "0x8082deff44f79489ea92415be59afb48b6f46b939553f855479828a6f87f9593" }, "blockValue": "0x0", "blobsBundle": { diff --git a/acceptance-tests/tests/src/test/resources/jsonrpc/engine/prague/test-cases/03_cancun_newPayloadV3.json b/acceptance-tests/tests/src/test/resources/jsonrpc/engine/prague/test-cases/03_cancun_newPayloadV3.json index 583bdc1a2..9f984b2f3 100644 --- a/acceptance-tests/tests/src/test/resources/jsonrpc/engine/prague/test-cases/03_cancun_newPayloadV3.json +++ b/acceptance-tests/tests/src/test/resources/jsonrpc/engine/prague/test-cases/03_cancun_newPayloadV3.json @@ -4,9 +4,9 @@ "method": "engine_newPayloadV3", "params": [ { - "parentHash": "0x3ca89f1d6b71aeb56389ac8270e9ae369d0bb8edeea747f2d868a5eb31892b04", + "parentHash": "0x38d7daa68e8bac41a0a237b7cbfcef480cb9bd9adc7b282d7b0d23ff4eb8d6e5", "feeRecipient": "0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b", - "stateRoot": "0x2b6a1166ce24fe0af741c7313e6049e9e19351742bfaf4179154bc594ca9eb90", + "stateRoot": "0x3ed8435adb5f3526144e6babdd3fc8c661a86097cf7e743441b41fda096fc4dd", "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000", "gasLimit": "0x1c9c380", @@ -17,7 +17,7 @@ "transactions": [], "withdrawals": [], "blockNumber": "0x1", - "blockHash": "0x74e8ce9d96d325a605675a34175adfa34581f35091dcd7b107c525a82b0b9950", + "blockHash": "0x8082deff44f79489ea92415be59afb48b6f46b939553f855479828a6f87f9593", "receiptsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", "excessBlobGas": "0x0", "blobGasUsed": "0x0" @@ -32,7 +32,7 @@ "id": 67, "result": { "status": "VALID", - "latestValidHash": "0x74e8ce9d96d325a605675a34175adfa34581f35091dcd7b107c525a82b0b9950", + "latestValidHash": "0x8082deff44f79489ea92415be59afb48b6f46b939553f855479828a6f87f9593", "validationError": null } }, diff --git a/acceptance-tests/tests/src/test/resources/jsonrpc/engine/prague/test-cases/04_cancun_forkchoiceUpdatedV3.json b/acceptance-tests/tests/src/test/resources/jsonrpc/engine/prague/test-cases/04_cancun_forkchoiceUpdatedV3.json index 229ca2cf5..b0ce0f70c 100644 --- a/acceptance-tests/tests/src/test/resources/jsonrpc/engine/prague/test-cases/04_cancun_forkchoiceUpdatedV3.json +++ b/acceptance-tests/tests/src/test/resources/jsonrpc/engine/prague/test-cases/04_cancun_forkchoiceUpdatedV3.json @@ -4,9 +4,9 @@ "method": "engine_forkchoiceUpdatedV3", "params": [ { - "headBlockHash": "0x74e8ce9d96d325a605675a34175adfa34581f35091dcd7b107c525a82b0b9950", - "safeBlockHash": "0x74e8ce9d96d325a605675a34175adfa34581f35091dcd7b107c525a82b0b9950", - "finalizedBlockHash": "0x74e8ce9d96d325a605675a34175adfa34581f35091dcd7b107c525a82b0b9950" + "headBlockHash": "0x8082deff44f79489ea92415be59afb48b6f46b939553f855479828a6f87f9593", + "safeBlockHash": "0x8082deff44f79489ea92415be59afb48b6f46b939553f855479828a6f87f9593", + "finalizedBlockHash": "0x8082deff44f79489ea92415be59afb48b6f46b939553f855479828a6f87f9593" }, null ], @@ -18,7 +18,7 @@ "result": { "payloadStatus": { "status": "VALID", - "latestValidHash": "0x74e8ce9d96d325a605675a34175adfa34581f35091dcd7b107c525a82b0b9950", + "latestValidHash": "0x8082deff44f79489ea92415be59afb48b6f46b939553f855479828a6f87f9593", "validationError": null }, "payloadId": null diff --git a/acceptance-tests/tests/src/test/resources/jsonrpc/engine/prague/test-cases/05_prague_forkchoiceUpdatedV3.json b/acceptance-tests/tests/src/test/resources/jsonrpc/engine/prague/test-cases/05_prague_forkchoiceUpdatedV3.json index 721a625b6..1eae1c881 100644 --- a/acceptance-tests/tests/src/test/resources/jsonrpc/engine/prague/test-cases/05_prague_forkchoiceUpdatedV3.json +++ b/acceptance-tests/tests/src/test/resources/jsonrpc/engine/prague/test-cases/05_prague_forkchoiceUpdatedV3.json @@ -4,9 +4,9 @@ "method": "engine_forkchoiceUpdatedV3", "params": [ { - "headBlockHash": "0x74e8ce9d96d325a605675a34175adfa34581f35091dcd7b107c525a82b0b9950", - "safeBlockHash": "0x74e8ce9d96d325a605675a34175adfa34581f35091dcd7b107c525a82b0b9950", - "finalizedBlockHash": "0x74e8ce9d96d325a605675a34175adfa34581f35091dcd7b107c525a82b0b9950" + "headBlockHash": "0x8082deff44f79489ea92415be59afb48b6f46b939553f855479828a6f87f9593", + "safeBlockHash": "0x8082deff44f79489ea92415be59afb48b6f46b939553f855479828a6f87f9593", + "finalizedBlockHash": "0x8082deff44f79489ea92415be59afb48b6f46b939553f855479828a6f87f9593" }, { "timestamp": "0x20", @@ -24,10 +24,10 @@ "result": { "payloadStatus": { "status": "VALID", - "latestValidHash": "0x74e8ce9d96d325a605675a34175adfa34581f35091dcd7b107c525a82b0b9950", + "latestValidHash": "0x8082deff44f79489ea92415be59afb48b6f46b939553f855479828a6f87f9593", "validationError": null }, - "payloadId": "0x282643c6d89e12df" + "payloadId": "0x282643d3a905e721" } }, "statusCode": 200 diff --git a/acceptance-tests/tests/src/test/resources/jsonrpc/engine/prague/test-cases/06_prague_getPayloadV4.json b/acceptance-tests/tests/src/test/resources/jsonrpc/engine/prague/test-cases/06_prague_getPayloadV4.json index 6ff3614cd..4cb85d5f5 100644 --- a/acceptance-tests/tests/src/test/resources/jsonrpc/engine/prague/test-cases/06_prague_getPayloadV4.json +++ b/acceptance-tests/tests/src/test/resources/jsonrpc/engine/prague/test-cases/06_prague_getPayloadV4.json @@ -3,7 +3,7 @@ "jsonrpc": "2.0", "method": "engine_getPayloadV4", "params": [ - "0x282643c6d89e12df" + "0x282643d3a905e721" ], "id": 67 }, @@ -12,9 +12,9 @@ "id": 67, "result": { "executionPayload": { - "parentHash": "0x74e8ce9d96d325a605675a34175adfa34581f35091dcd7b107c525a82b0b9950", + "parentHash": "0x8082deff44f79489ea92415be59afb48b6f46b939553f855479828a6f87f9593", "feeRecipient": "0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b", - "stateRoot": "0x546ac65b9d37c72d7185f8dd67419803c636dd4e5ddf9b325fb64e9ecf570871", + "stateRoot": "0x2e59916a57b535875bcd80d8472aeaa0027aa685d159804e8caa2f12d060155e", "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000", "gasLimit": "0x1c9c380", @@ -34,8 +34,9 @@ "amount": "0x0" } ], + "consolidationRequests" : [], "blockNumber": "0x2", - "blockHash": "0xa7a92cc82e1d876476ad6433538599b0d592f88ba0823c23e80af93fb1748f14", + "blockHash": "0x27a2bc2ac21b3fc796f636bec1ec9cba100435f9a793176a83a5d4fa7cc13006", "receiptsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", "blobGasUsed": "0x0" }, diff --git a/acceptance-tests/tests/src/test/resources/jsonrpc/engine/prague/test-cases/08_prague_invalid_null_deposits_execute_payload.json b/acceptance-tests/tests/src/test/resources/jsonrpc/engine/prague/test-cases/08_prague_invalid_null_deposits_execute_payload.json index 7263aea00..ed75e54aa 100644 --- a/acceptance-tests/tests/src/test/resources/jsonrpc/engine/prague/test-cases/08_prague_invalid_null_deposits_execute_payload.json +++ b/acceptance-tests/tests/src/test/resources/jsonrpc/engine/prague/test-cases/08_prague_invalid_null_deposits_execute_payload.json @@ -4,7 +4,7 @@ "method": "engine_newPayloadV4", "params": [ { - "parentHash": "0xa7a92cc82e1d876476ad6433538599b0d592f88ba0823c23e80af93fb1748f14", + "parentHash": "0x27a2bc2ac21b3fc796f636bec1ec9cba100435f9a793176a83a5d4fa7cc13006", "feeRecipient": "0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b", "stateRoot": "0x9b8c4a9a86cb49252075c0db2f0e72fb1e49350a0f70ea36f26f700201961e62", "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", diff --git a/acceptance-tests/tests/src/test/resources/jsonrpc/engine/prague/test-cases/09_prague_newPayloadV4.json b/acceptance-tests/tests/src/test/resources/jsonrpc/engine/prague/test-cases/09_prague_newPayloadV4.json index a5ff6fa7e..17496f9ed 100644 --- a/acceptance-tests/tests/src/test/resources/jsonrpc/engine/prague/test-cases/09_prague_newPayloadV4.json +++ b/acceptance-tests/tests/src/test/resources/jsonrpc/engine/prague/test-cases/09_prague_newPayloadV4.json @@ -4,9 +4,9 @@ "method": "engine_newPayloadV4", "params": [ { - "parentHash": "0x74e8ce9d96d325a605675a34175adfa34581f35091dcd7b107c525a82b0b9950", + "parentHash": "0x8082deff44f79489ea92415be59afb48b6f46b939553f855479828a6f87f9593", "feeRecipient": "0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b", - "stateRoot": "0xdb2a9bb9097dd6946525203a14437cd925ef549289e1fe17c6ed845c53647a26", + "stateRoot": "0x961878fdcdff52ea42db0026f59aa414a5ec2835e56ed1a8ae50c80a9fe3a04b", "logsBloom": "0x10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000", "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000", "gasLimit": "0x1c9c380", @@ -35,8 +35,9 @@ "validatorPubkey": "0xb10a4a15bf67b328c9b101d09e5c6ee6672978fdad9ef0d9e2ceffaee99223555d8601f0cb3bcc4ce1af9864779a416e" } ], + "consolidationRequests": [], "blockNumber": "0x2", - "blockHash": "0x5200df2eb24d08e7bceec64194d073e81a6e9c00c4f61d323fad5d70b40e6d6d", + "blockHash": "0xc67a660f5d3c20ee603911bdff1e409e976f306883dff8ef4999dca3176f7dca", "receiptsRoot": "0x79ee3424eb720a3ad4b1c5a372bb8160580cbe4d893778660f34213c685627a9", "blobGasUsed": "0x0" }, @@ -50,7 +51,7 @@ "id": 67, "result": { "status": "VALID", - "latestValidHash": "0x5200df2eb24d08e7bceec64194d073e81a6e9c00c4f61d323fad5d70b40e6d6d", + "latestValidHash": "0xc67a660f5d3c20ee603911bdff1e409e976f306883dff8ef4999dca3176f7dca", "validationError": null } }, diff --git a/acceptance-tests/tests/src/test/resources/jsonrpc/engine/prague/test-cases/10_prague_forkchoiceUpdatedV3.json b/acceptance-tests/tests/src/test/resources/jsonrpc/engine/prague/test-cases/10_prague_forkchoiceUpdatedV3.json index d8594f628..ba0f1e8e5 100644 --- a/acceptance-tests/tests/src/test/resources/jsonrpc/engine/prague/test-cases/10_prague_forkchoiceUpdatedV3.json +++ b/acceptance-tests/tests/src/test/resources/jsonrpc/engine/prague/test-cases/10_prague_forkchoiceUpdatedV3.json @@ -4,9 +4,9 @@ "method": "engine_forkchoiceUpdatedV3", "params": [ { - "headBlockHash": "0x5200df2eb24d08e7bceec64194d073e81a6e9c00c4f61d323fad5d70b40e6d6d", - "safeBlockHash": "0x5200df2eb24d08e7bceec64194d073e81a6e9c00c4f61d323fad5d70b40e6d6d", - "finalizedBlockHash": "0x5200df2eb24d08e7bceec64194d073e81a6e9c00c4f61d323fad5d70b40e6d6d" + "headBlockHash": "0xc67a660f5d3c20ee603911bdff1e409e976f306883dff8ef4999dca3176f7dca", + "safeBlockHash": "0xc67a660f5d3c20ee603911bdff1e409e976f306883dff8ef4999dca3176f7dca", + "finalizedBlockHash": "0xc67a660f5d3c20ee603911bdff1e409e976f306883dff8ef4999dca3176f7dca" }, { "timestamp": "0x30", @@ -24,10 +24,10 @@ "result": { "payloadStatus": { "status": "VALID", - "latestValidHash": "0x5200df2eb24d08e7bceec64194d073e81a6e9c00c4f61d323fad5d70b40e6d6d", + "latestValidHash": "0xc67a660f5d3c20ee603911bdff1e409e976f306883dff8ef4999dca3176f7dca", "validationError": null }, - "payloadId": "0x282643e2da21a7cf" + "payloadId": "0x282643a16a58b5cf" } }, "statusCode": 200 diff --git a/acceptance-tests/tests/src/test/resources/jsonrpc/engine/prague/test-cases/11_prague_getPayloadV4.json b/acceptance-tests/tests/src/test/resources/jsonrpc/engine/prague/test-cases/11_prague_getPayloadV4.json index 6a22938a6..3b76fac10 100644 --- a/acceptance-tests/tests/src/test/resources/jsonrpc/engine/prague/test-cases/11_prague_getPayloadV4.json +++ b/acceptance-tests/tests/src/test/resources/jsonrpc/engine/prague/test-cases/11_prague_getPayloadV4.json @@ -3,7 +3,7 @@ "jsonrpc": "2.0", "method": "engine_getPayloadV4", "params": [ - "0x282643e2da21a7cf" + "0x282643a16a58b5cf" ], "id": 67 }, @@ -12,9 +12,9 @@ "id": 67, "result": { "executionPayload": { - "parentHash": "0x5200df2eb24d08e7bceec64194d073e81a6e9c00c4f61d323fad5d70b40e6d6d", + "parentHash": "0xc67a660f5d3c20ee603911bdff1e409e976f306883dff8ef4999dca3176f7dca", "feeRecipient": "0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b", - "stateRoot": "0xcd9f15de5f17cf87a02bf795a0dc98c108eead4651eca57fc7195bda0d9c20ee", + "stateRoot": "0x5fc31c01a451fe02f0e938de7ec7044aaba1159a81a1be64357bc70af226f304", "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000", "gasLimit": "0x1c9c380", @@ -28,8 +28,9 @@ "withdrawals": [], "depositRequests": [], "withdrawalRequests": [], + "consolidationRequests" : [], "blockNumber": "0x3", - "blockHash": "0x79858f6eb8e82f0ec11087983ce4eb8c7edc10c9363a2a124dd78fd2c305dc42", + "blockHash": "0xdbb55a049f14b8152695bf3bbd754aa1fd55bbe10b306eb49caa4bd7d7fcb634", "receiptsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", "blobGasUsed": "0x0" }, diff --git a/acceptance-tests/tests/src/test/resources/jsonrpc/engine/prague/test-cases/12_cancun_newPayloadV4.json b/acceptance-tests/tests/src/test/resources/jsonrpc/engine/prague/test-cases/12_cancun_newPayloadV3.json similarity index 80% rename from acceptance-tests/tests/src/test/resources/jsonrpc/engine/prague/test-cases/12_cancun_newPayloadV4.json rename to acceptance-tests/tests/src/test/resources/jsonrpc/engine/prague/test-cases/12_cancun_newPayloadV3.json index 5d9f96c53..546872807 100644 --- a/acceptance-tests/tests/src/test/resources/jsonrpc/engine/prague/test-cases/12_cancun_newPayloadV4.json +++ b/acceptance-tests/tests/src/test/resources/jsonrpc/engine/prague/test-cases/12_cancun_newPayloadV3.json @@ -4,9 +4,9 @@ "method": "engine_newPayloadV3", "params": [ { - "parentHash": "0x5200df2eb24d08e7bceec64194d073e81a6e9c00c4f61d323fad5d70b40e6d6d", + "parentHash": "0xc67a660f5d3c20ee603911bdff1e409e976f306883dff8ef4999dca3176f7dca", "feeRecipient": "0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b", - "stateRoot": "0xcd9f15de5f17cf87a02bf795a0dc98c108eead4651eca57fc7195bda0d9c20ee", + "stateRoot": "0x5fc31c01a451fe02f0e938de7ec7044aaba1159a81a1be64357bc70af226f304", "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000", "gasLimit": "0x1c9c380", @@ -19,7 +19,7 @@ "depositRequests": [], "withdrawalRequests": [], "blockNumber": "0x3", - "blockHash": "0x79858f6eb8e82f0ec11087983ce4eb8c7edc10c9363a2a124dd78fd2c305dc42", + "blockHash": "0xdbb55a049f14b8152695bf3bbd754aa1fd55bbe10b306eb49caa4bd7d7fcb634", "receiptsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", "excessBlobGas": "0x0", "blobGasUsed": "0x0" @@ -34,7 +34,7 @@ "id": 67, "result": { "status": "VALID", - "latestValidHash": "0x79858f6eb8e82f0ec11087983ce4eb8c7edc10c9363a2a124dd78fd2c305dc42", + "latestValidHash": "0xdbb55a049f14b8152695bf3bbd754aa1fd55bbe10b306eb49caa4bd7d7fcb634", "validationError": null } }, diff --git a/acceptance-tests/tests/src/test/resources/jsonrpc/engine/prague/test-cases/14_prague_send_raw_transaction_consolidation_request.json b/acceptance-tests/tests/src/test/resources/jsonrpc/engine/prague/test-cases/14_prague_send_raw_transaction_consolidation_request.json new file mode 100644 index 000000000..85c41f299 --- /dev/null +++ b/acceptance-tests/tests/src/test/resources/jsonrpc/engine/prague/test-cases/14_prague_send_raw_transaction_consolidation_request.json @@ -0,0 +1,14 @@ +{ + "request": { + "jsonrpc": "2.0", + "method": "eth_sendRawTransaction", + "params": ["0xf8c80185e8d4a51000832dc6c09400b42dbf2194e931e80326d950320f7d9dbeac0201b860fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe822fe0a05b88b593926d340f448918ef1c6263356c37f2434774e0fdb1cb9d90cfa5a23ba003a86aac4adb774181ba51eda17efb5fbed99ad57895e6eb56ccdf508a88a7cc"], + "id": 67 + }, + "response": { + "jsonrpc": "2.0", + "id": 67, + "result": "0xa4252f576c4e16cb020f86f8a30d4fa990ee0cbfc84198a6d0eb118dd2f8b72d" + }, + "statusCode": 200 +} \ No newline at end of file diff --git a/acceptance-tests/tests/src/test/resources/jsonrpc/engine/prague/test-cases/14_prague_forkchoiceUpdatedV3.json b/acceptance-tests/tests/src/test/resources/jsonrpc/engine/prague/test-cases/15_prague_forkchoiceUpdatedV3.json similarity index 61% rename from acceptance-tests/tests/src/test/resources/jsonrpc/engine/prague/test-cases/14_prague_forkchoiceUpdatedV3.json rename to acceptance-tests/tests/src/test/resources/jsonrpc/engine/prague/test-cases/15_prague_forkchoiceUpdatedV3.json index bf2b3dca5..61750afbe 100644 --- a/acceptance-tests/tests/src/test/resources/jsonrpc/engine/prague/test-cases/14_prague_forkchoiceUpdatedV3.json +++ b/acceptance-tests/tests/src/test/resources/jsonrpc/engine/prague/test-cases/15_prague_forkchoiceUpdatedV3.json @@ -4,9 +4,9 @@ "method": "engine_forkchoiceUpdatedV3", "params": [ { - "headBlockHash": "0x79858f6eb8e82f0ec11087983ce4eb8c7edc10c9363a2a124dd78fd2c305dc42", - "safeBlockHash": "0x79858f6eb8e82f0ec11087983ce4eb8c7edc10c9363a2a124dd78fd2c305dc42", - "finalizedBlockHash": "0x79858f6eb8e82f0ec11087983ce4eb8c7edc10c9363a2a124dd78fd2c305dc42" + "headBlockHash": "0xdbb55a049f14b8152695bf3bbd754aa1fd55bbe10b306eb49caa4bd7d7fcb634", + "safeBlockHash": "0xdbb55a049f14b8152695bf3bbd754aa1fd55bbe10b306eb49caa4bd7d7fcb634", + "finalizedBlockHash": "0xdbb55a049f14b8152695bf3bbd754aa1fd55bbe10b306eb49caa4bd7d7fcb634" }, { "timestamp": "0x40", @@ -24,10 +24,10 @@ "result": { "payloadStatus": { "status": "VALID", - "latestValidHash": "0x79858f6eb8e82f0ec11087983ce4eb8c7edc10c9363a2a124dd78fd2c305dc42", + "latestValidHash": "0xdbb55a049f14b8152695bf3bbd754aa1fd55bbe10b306eb49caa4bd7d7fcb634", "validationError": null }, - "payloadId": "0x282643de0e3d43bf" + "payloadId": "0x28264396a9634d41" } }, "statusCode": 200 diff --git a/acceptance-tests/tests/src/test/resources/jsonrpc/engine/prague/test-cases/15_prague_getPayloadV4.json b/acceptance-tests/tests/src/test/resources/jsonrpc/engine/prague/test-cases/16_prague_getPayloadV4.json similarity index 62% rename from acceptance-tests/tests/src/test/resources/jsonrpc/engine/prague/test-cases/15_prague_getPayloadV4.json rename to acceptance-tests/tests/src/test/resources/jsonrpc/engine/prague/test-cases/16_prague_getPayloadV4.json index c287cfaed..c3fdd33ad 100644 --- a/acceptance-tests/tests/src/test/resources/jsonrpc/engine/prague/test-cases/15_prague_getPayloadV4.json +++ b/acceptance-tests/tests/src/test/resources/jsonrpc/engine/prague/test-cases/16_prague_getPayloadV4.json @@ -3,7 +3,7 @@ "jsonrpc": "2.0", "method": "engine_getPayloadV4", "params": [ - "0x282643de0e3d43bf" + "0x28264396a9634d41" ], "id": 67 }, @@ -12,20 +12,21 @@ "id": 67, "result": { "executionPayload": { - "parentHash": "0x79858f6eb8e82f0ec11087983ce4eb8c7edc10c9363a2a124dd78fd2c305dc42", + "parentHash": "0xdbb55a049f14b8152695bf3bbd754aa1fd55bbe10b306eb49caa4bd7d7fcb634", "feeRecipient": "0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b", - "stateRoot": "0xe4642cc58d61f2392fe056042c226e286f22a25e3104f4a4acb423dad9a43311", + "stateRoot": "0x49df1f1a1d28a23fa752230d442077768787d392e9edb70c83d727d31e55eaac", "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "prevRandao": "0x0000000000000000000000000000000000000000000000000000000000000000", "gasLimit": "0x1c9c380", - "gasUsed": "0x145d3", + "gasUsed": "0x3ad4d", "timestamp": "0x40", "extraData": "0x", "baseFeePerGas": "0x7", "excessBlobGas": "0x0", "parentBeaconBlockRoot": "0x0000000000000000000000000000000000000000000000000000000000000000", "transactions": [ - "0xf8a08085e8d4a51000832dc6c09400a3ca265ebcb825b45f985a16cefb49958ce01702b8388706d19a62f28a6a6549f96c5adaebac9124a61d44868ec94f6d2d707c6a2f82c9162071231dfeb40e24bfde4ffdf2430000000000000000822fdfa00476c1a81f80f4c130acb5f8b8075468ba0893d766b7ec51a8d9723c573ad034a03bd3eaedabbaaf745f15023185ba66584ad3ee8bb40b9bef8c0b9ed27f8b1959" + "0xf8a08085e8d4a51000832dc6c09400a3ca265ebcb825b45f985a16cefb49958ce01702b8388706d19a62f28a6a6549f96c5adaebac9124a61d44868ec94f6d2d707c6a2f82c9162071231dfeb40e24bfde4ffdf2430000000000000000822fdfa00476c1a81f80f4c130acb5f8b8075468ba0893d766b7ec51a8d9723c573ad034a03bd3eaedabbaaf745f15023185ba66584ad3ee8bb40b9bef8c0b9ed27f8b1959", + "0xf8c80185e8d4a51000832dc6c09400b42dbf2194e931e80326d950320f7d9dbeac0201b860fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe822fe0a05b88b593926d340f448918ef1c6263356c37f2434774e0fdb1cb9d90cfa5a23ba003a86aac4adb774181ba51eda17efb5fbed99ad57895e6eb56ccdf508a88a7cc" ], "withdrawals": [], "depositRequests": [], @@ -36,12 +37,19 @@ "validatorPubkey": "0x8706d19a62f28a6a6549f96c5adaebac9124a61d44868ec94f6d2d707c6a2f82c9162071231dfeb40e24bfde4ffdf243" } ], + "consolidationRequests": [ + { + "sourceAddress": "0x23618e81e3f5cdf7f54c3d65f7fbc0abf5b21e8f", + "sourcePubKey": "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "targetPubKey": "0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe" + } + ], "blockNumber": "0x4", - "receiptsRoot": "0x765bd9d63cc10fa47117d6cc0958f15e55a3bde540d4ed15d220f573fbb82cba", + "receiptsRoot": "0x970fc81bb3e7fb21435f9a65a184aa9e3fd2f52b89fd859302b46954354266b5", "blobGasUsed": "0x0", - "blockHash": "0xb2d60adb2a0c73313ebdacf425b1d6bbd810c3ec6b28ad0d62a73cdc34cb696a" + "blockHash": "0x93df6f3484202f24c692354e2ab96e9948ae45eea6ad85faea121a389e468ea8" }, - "blockValue": "0x12855dcd153473b", + "blockValue": "0x3581baab15c12e5", "blobsBundle": { "commitments": [], "proofs": [], diff --git a/datatypes/src/main/java/org/hyperledger/besu/datatypes/RequestType.java b/datatypes/src/main/java/org/hyperledger/besu/datatypes/RequestType.java index 628baa6d5..5a8fe97a3 100644 --- a/datatypes/src/main/java/org/hyperledger/besu/datatypes/RequestType.java +++ b/datatypes/src/main/java/org/hyperledger/besu/datatypes/RequestType.java @@ -19,7 +19,9 @@ public enum RequestType { /** DEPOSITS */ DEPOSIT(0x00), /** WITHDRAWAL */ - WITHDRAWAL(0x01); + WITHDRAWAL(0x01), + /** CONSOLIDATION */ + CONSOLIDATION(0x02); private final int typeValue; @@ -48,6 +50,7 @@ public enum RequestType { return switch (serializedTypeValue) { case 0x00 -> DEPOSIT; case 0x01 -> WITHDRAWAL; + case 0x02 -> CONSOLIDATION; default -> throw new IllegalArgumentException( String.format("Unsupported request type: 0x%02X", serializedTypeValue)); 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 e8134fdb1..543c965c8 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 @@ -20,6 +20,7 @@ import static org.hyperledger.besu.ethereum.api.jsonrpc.internal.methods.Executi import static org.hyperledger.besu.ethereum.api.jsonrpc.internal.methods.ExecutionEngineJsonRpcMethod.EngineStatus.INVALID_BLOCK_HASH; import static org.hyperledger.besu.ethereum.api.jsonrpc.internal.methods.ExecutionEngineJsonRpcMethod.EngineStatus.SYNCING; import static org.hyperledger.besu.ethereum.api.jsonrpc.internal.methods.ExecutionEngineJsonRpcMethod.EngineStatus.VALID; +import static org.hyperledger.besu.ethereum.api.jsonrpc.internal.methods.engine.RequestValidatorProvider.getConsolidationRequestValidator; import static org.hyperledger.besu.ethereum.api.jsonrpc.internal.methods.engine.RequestValidatorProvider.getDepositRequestValidator; import static org.hyperledger.besu.ethereum.api.jsonrpc.internal.methods.engine.RequestValidatorProvider.getWithdrawalRequestValidator; import static org.hyperledger.besu.ethereum.api.jsonrpc.internal.methods.engine.WithdrawalsValidatorProvider.getWithdrawalsValidator; @@ -35,6 +36,7 @@ import org.hyperledger.besu.ethereum.BlockProcessingResult; import org.hyperledger.besu.ethereum.ProtocolContext; import org.hyperledger.besu.ethereum.api.jsonrpc.internal.JsonRpcRequestContext; import org.hyperledger.besu.ethereum.api.jsonrpc.internal.methods.ExecutionEngineJsonRpcMethod; +import org.hyperledger.besu.ethereum.api.jsonrpc.internal.parameters.ConsolidationRequestParameter; import org.hyperledger.besu.ethereum.api.jsonrpc.internal.parameters.DepositRequestParameter; import org.hyperledger.besu.ethereum.api.jsonrpc.internal.parameters.EnginePayloadParameter; import org.hyperledger.besu.ethereum.api.jsonrpc.internal.parameters.WithdrawalParameter; @@ -185,8 +187,23 @@ public abstract class AbstractEngineNewPayload extends ExecutionEngineJsonRpcMet reqId, new JsonRpcError(INVALID_PARAMS, "Invalid withdrawal request")); } + final Optional> maybeConsolidationRequests = + Optional.ofNullable(blockParam.getConsolidationRequests()) + .map( + consolidationRequest -> + consolidationRequest.stream() + .map(ConsolidationRequestParameter::toConsolidationRequest) + .collect(toList())); + if (!getConsolidationRequestValidator( + protocolSchedule.get(), blockParam.getTimestamp(), blockParam.getBlockNumber()) + .validateParameter(maybeConsolidationRequests)) { + return new JsonRpcErrorResponse( + reqId, new JsonRpcError(INVALID_PARAMS, "Invalid consolidation request")); + } + Optional> maybeRequests = - RequestUtil.combine(maybeDepositRequests, maybeWithdrawalRequests); + RequestUtil.combine( + maybeDepositRequests, maybeWithdrawalRequests, maybeConsolidationRequests); if (mergeContext.get().isSyncing()) { LOG.debug("We are syncing"); diff --git a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/RequestValidatorProvider.java b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/RequestValidatorProvider.java index 505d36951..c3d9c8376 100644 --- a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/RequestValidatorProvider.java +++ b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/RequestValidatorProvider.java @@ -38,6 +38,12 @@ public class RequestValidatorProvider { protocolSchedule, blockTimestamp, blockNumber, RequestType.WITHDRAWAL); } + public static RequestValidator getConsolidationRequestValidator( + final ProtocolSchedule protocolSchedule, final long blockTimestamp, final long blockNumber) { + return getRequestValidator( + protocolSchedule, blockTimestamp, blockNumber, RequestType.CONSOLIDATION); + } + private static RequestValidator getRequestValidator( final ProtocolSchedule protocolSchedule, final long blockTimestamp, diff --git a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/parameters/ConsolidationRequestParameter.java b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/parameters/ConsolidationRequestParameter.java new file mode 100644 index 000000000..d33b12c6a --- /dev/null +++ b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/parameters/ConsolidationRequestParameter.java @@ -0,0 +1,102 @@ +/* + * Copyright contributors to Hyperledger Besu. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on + * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the + * specific language governing permissions and limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + */ +package org.hyperledger.besu.ethereum.api.jsonrpc.internal.parameters; + +import org.hyperledger.besu.datatypes.Address; +import org.hyperledger.besu.datatypes.BLSPublicKey; +import org.hyperledger.besu.ethereum.core.ConsolidationRequest; + +import java.util.Objects; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonGetter; +import com.fasterxml.jackson.annotation.JsonProperty; + +public class ConsolidationRequestParameter { + + private final String sourceAddress; + private final String sourcePubkey; + private final String targetPubkey; + + @JsonCreator + public ConsolidationRequestParameter( + @JsonProperty("sourceAddress") final String sourceAddress, + @JsonProperty("sourcePubkey") final String sourcePubkey, + @JsonProperty("targetPubkey") final String targetPubkey) { + this.sourceAddress = sourceAddress; + this.sourcePubkey = sourcePubkey; + this.targetPubkey = targetPubkey; + } + + public static ConsolidationRequestParameter fromConsolidationRequest( + final ConsolidationRequest consolidationRequest) { + return new ConsolidationRequestParameter( + consolidationRequest.getSourceAddress().toHexString(), + consolidationRequest.getSourcePubkey().toHexString(), + consolidationRequest.getTargetPubkey().toHexString()); + } + + public ConsolidationRequest toConsolidationRequest() { + return new ConsolidationRequest( + Address.fromHexString(sourceAddress), + BLSPublicKey.fromHexString(sourcePubkey), + BLSPublicKey.fromHexString(targetPubkey)); + } + + @JsonGetter + public String getSourceAddress() { + return sourceAddress; + } + + @JsonGetter + public String getSourcePubKey() { + return sourcePubkey; + } + + @JsonGetter + public String getTargetPubKey() { + return targetPubkey; + } + + @Override + public boolean equals(final Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + final ConsolidationRequestParameter that = (ConsolidationRequestParameter) o; + return Objects.equals(sourceAddress, that.sourceAddress) + && Objects.equals(sourcePubkey, that.sourcePubkey) + && Objects.equals(targetPubkey, that.targetPubkey); + } + + @Override + public int hashCode() { + return Objects.hash(sourceAddress, sourcePubkey, targetPubkey); + } + + @Override + public String toString() { + return "ConsolidationRequestParameter{" + + "sourceAddress='" + + sourceAddress + + '\'' + + ", sourcePubkey='" + + sourcePubkey + + '\'' + + ", targetPubkey='" + + targetPubkey + + '\'' + + '}'; + } +} diff --git a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/parameters/EnginePayloadParameter.java b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/parameters/EnginePayloadParameter.java index 4fd24e15a..fdcec45c6 100644 --- a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/parameters/EnginePayloadParameter.java +++ b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/parameters/EnginePayloadParameter.java @@ -45,6 +45,7 @@ public class EnginePayloadParameter { private final String excessBlobGas; private final List depositRequests; private final List withdrawalRequests; + private final List consolidationRequests; /** * Creates an instance of EnginePayloadParameter. @@ -68,6 +69,7 @@ public class EnginePayloadParameter { * @param excessBlobGas QUANTITY, 64 Bits * @param depositRequests List of deposit parameters. * @param withdrawalRequestParameters List of withdrawal requests parameters. + * @param consolidationRequests List of consolidation requests parameters. */ @JsonCreator public EnginePayloadParameter( @@ -90,7 +92,9 @@ public class EnginePayloadParameter { @JsonProperty("excessBlobGas") final String excessBlobGas, @JsonProperty("depositRequests") final List depositRequests, @JsonProperty("withdrawalRequests") - final List withdrawalRequestParameters) { + final List withdrawalRequestParameters, + @JsonProperty("consolidationRequests") + final List consolidationRequests) { this.blockHash = blockHash; this.parentHash = parentHash; this.feeRecipient = feeRecipient; @@ -110,6 +114,7 @@ public class EnginePayloadParameter { this.excessBlobGas = excessBlobGas; this.depositRequests = depositRequests; this.withdrawalRequests = withdrawalRequestParameters; + this.consolidationRequests = consolidationRequests; } public Hash getBlockHash() { @@ -187,4 +192,8 @@ public class EnginePayloadParameter { public List getWithdrawalRequests() { return withdrawalRequests; } + + public List getConsolidationRequests() { + return consolidationRequests; + } } diff --git a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/results/BlockResultFactory.java b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/results/BlockResultFactory.java index 2f89ef12c..b8111c00c 100644 --- a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/results/BlockResultFactory.java +++ b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/results/BlockResultFactory.java @@ -14,6 +14,7 @@ */ package org.hyperledger.besu.ethereum.api.jsonrpc.internal.results; +import static org.hyperledger.besu.ethereum.mainnet.requests.RequestUtil.getConsolidationRequests; import static org.hyperledger.besu.ethereum.mainnet.requests.RequestUtil.getDepositRequests; import static org.hyperledger.besu.ethereum.mainnet.requests.RequestUtil.getWithdrawalRequests; @@ -170,6 +171,7 @@ public class BlockResultFactory { blockWithReceipts.getBlock().getBody().getWithdrawals(), getDepositRequests(blockWithReceipts.getBlock().getBody().getRequests()), getWithdrawalRequests(blockWithReceipts.getBlock().getBody().getRequests()), + getConsolidationRequests(blockWithReceipts.getBlock().getBody().getRequests()), Quantity.create(payload.blockValue()), blobsBundleV1); } diff --git a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/results/EngineGetPayloadResultV4.java b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/results/EngineGetPayloadResultV4.java index 133fbabe6..39772ff7d 100644 --- a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/results/EngineGetPayloadResultV4.java +++ b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/results/EngineGetPayloadResultV4.java @@ -14,10 +14,12 @@ */ package org.hyperledger.besu.ethereum.api.jsonrpc.internal.results; +import org.hyperledger.besu.ethereum.api.jsonrpc.internal.parameters.ConsolidationRequestParameter; import org.hyperledger.besu.ethereum.api.jsonrpc.internal.parameters.DepositRequestParameter; import org.hyperledger.besu.ethereum.api.jsonrpc.internal.parameters.WithdrawalParameter; import org.hyperledger.besu.ethereum.api.jsonrpc.internal.parameters.WithdrawalRequestParameter; import org.hyperledger.besu.ethereum.core.BlockHeader; +import org.hyperledger.besu.ethereum.core.ConsolidationRequest; import org.hyperledger.besu.ethereum.core.DepositRequest; import org.hyperledger.besu.ethereum.core.Withdrawal; import org.hyperledger.besu.ethereum.core.WithdrawalRequest; @@ -44,10 +46,17 @@ public class EngineGetPayloadResultV4 { final Optional> withdrawals, final Optional> depositRequests, final Optional> withdrawalRequests, + final Optional> consolidationRequests, final String blockValue, final BlobsBundleV1 blobsBundle) { this.executionPayload = - new PayloadResult(header, transactions, withdrawals, depositRequests, withdrawalRequests); + new PayloadResult( + header, + transactions, + withdrawals, + depositRequests, + withdrawalRequests, + consolidationRequests); this.blockValue = blockValue; this.blobsBundle = blobsBundle; this.shouldOverrideBuilder = false; @@ -96,13 +105,15 @@ public class EngineGetPayloadResultV4 { private final List withdrawals; private final List depositRequests; private final List withdrawalRequests; + private final List consolidationRequests; public PayloadResult( final BlockHeader header, final List transactions, final Optional> withdrawals, final Optional> depositRequests, - final Optional> withdrawalRequests) { + final Optional> withdrawalRequests, + final Optional> consolidationRequests) { this.blockNumber = Quantity.create(header.getNumber()); this.blockHash = header.getHash().toString(); this.parentHash = header.getParentHash().toString(); @@ -141,6 +152,14 @@ public class EngineGetPayloadResultV4 { .map(WithdrawalRequestParameter::fromWithdrawalRequest) .collect(Collectors.toList())) .orElse(null); + this.consolidationRequests = + consolidationRequests + .map( + wr -> + wr.stream() + .map(ConsolidationRequestParameter::fromConsolidationRequest) + .collect(Collectors.toList())) + .orElse(null); this.blobGasUsed = header.getBlobGasUsed().map(Quantity::create).orElse(Quantity.HEX_ZERO); this.excessBlobGas = header.getExcessBlobGas().map(Quantity::create).orElse(Quantity.HEX_ZERO); @@ -228,6 +247,11 @@ public class EngineGetPayloadResultV4 { return withdrawalRequests; } + @JsonGetter(value = "consolidationRequests") + public List getConsolidationRequests() { + return consolidationRequests; + } + @JsonGetter(value = "feeRecipient") @JsonInclude(JsonInclude.Include.NON_NULL) public String getFeeRecipient() { @@ -240,7 +264,7 @@ public class EngineGetPayloadResultV4 { } @JsonGetter(value = "blobGasUsed") - public String getBlobGasUseds() { + public String getBlobGasUsed() { return blobGasUsed; } diff --git a/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/AbstractEngineNewPayloadTest.java b/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/AbstractEngineNewPayloadTest.java index 26d0dad95..10da8a448 100644 --- a/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/AbstractEngineNewPayloadTest.java +++ b/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/AbstractEngineNewPayloadTest.java @@ -38,6 +38,7 @@ import org.hyperledger.besu.ethereum.ProtocolContext; import org.hyperledger.besu.ethereum.api.jsonrpc.internal.JsonRpcRequest; import org.hyperledger.besu.ethereum.api.jsonrpc.internal.JsonRpcRequestContext; import org.hyperledger.besu.ethereum.api.jsonrpc.internal.methods.ExecutionEngineJsonRpcMethod; +import org.hyperledger.besu.ethereum.api.jsonrpc.internal.parameters.ConsolidationRequestParameter; import org.hyperledger.besu.ethereum.api.jsonrpc.internal.parameters.DepositRequestParameter; import org.hyperledger.besu.ethereum.api.jsonrpc.internal.parameters.EnginePayloadParameter; import org.hyperledger.besu.ethereum.api.jsonrpc.internal.parameters.UnsignedLongParameter; @@ -403,7 +404,7 @@ public abstract class AbstractEngineNewPayloadTest extends AbstractScheduledApiT protected EnginePayloadParameter mockEnginePayload( final BlockHeader header, final List txs) { - return mockEnginePayload(header, txs, null, null, null); + return mockEnginePayload(header, txs, null, null, null, null); } protected EnginePayloadParameter mockEnginePayload( @@ -411,7 +412,8 @@ public abstract class AbstractEngineNewPayloadTest extends AbstractScheduledApiT final List txs, final List withdrawals, final List depositRequests, - final List withdrawalRequests) { + final List withdrawalRequests, + final List consolidationRequests) { return new EnginePayloadParameter( header.getHash(), header.getParentHash(), @@ -431,7 +433,8 @@ public abstract class AbstractEngineNewPayloadTest extends AbstractScheduledApiT header.getBlobGasUsed().map(UnsignedLongParameter::new).orElse(null), header.getExcessBlobGas().map(BlobGas::toHexString).orElse(null), depositRequests, - withdrawalRequests); + withdrawalRequests, + consolidationRequests); } protected BlockHeader setupValidPayload( diff --git a/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/EngineGetPayloadV4Test.java b/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/EngineGetPayloadV4Test.java index 535b2c998..134c7a2c0 100644 --- a/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/EngineGetPayloadV4Test.java +++ b/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/EngineGetPayloadV4Test.java @@ -150,6 +150,7 @@ public class EngineGetPayloadV4Test extends AbstractEngineGetPayloadTest { assertThat(res.getExecutionPayload().getWithdrawals()).isNotNull(); assertThat(res.getExecutionPayload().getDepositRequests()).isNotNull(); assertThat(res.getExecutionPayload().getWithdrawalRequests()).isNotNull(); + assertThat(res.getExecutionPayload().getConsolidationRequests()).isNotNull(); assertThat(res.getExecutionPayload().getHash()) .isEqualTo(header.getHash().toString()); assertThat(res.getBlockValue()).isEqualTo(Quantity.create(0)); diff --git a/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/EngineNewPayloadV2Test.java b/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/EngineNewPayloadV2Test.java index 1d7941702..412dc6f89 100644 --- a/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/EngineNewPayloadV2Test.java +++ b/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/EngineNewPayloadV2Test.java @@ -87,7 +87,9 @@ public class EngineNewPayloadV2Test extends AbstractEngineNewPayloadTest { .when(blockchain.getBlockHeader(mockHeader.getParentHash())) .thenReturn(Optional.of(mock(BlockHeader.class))); var resp = - resp(mockEnginePayload(mockHeader, Collections.emptyList(), withdrawalsParam, null, null)); + resp( + mockEnginePayload( + mockHeader, Collections.emptyList(), withdrawalsParam, null, null, null)); assertValidResponse(mockHeader, resp); } @@ -107,7 +109,7 @@ public class EngineNewPayloadV2Test extends AbstractEngineNewPayloadTest { .when(blockchain.getBlockHeader(mockHeader.getParentHash())) .thenReturn(Optional.of(mock(BlockHeader.class))); var resp = - resp(mockEnginePayload(mockHeader, Collections.emptyList(), withdrawals, null, null)); + resp(mockEnginePayload(mockHeader, Collections.emptyList(), withdrawals, null, null, null)); assertValidResponse(mockHeader, resp); } @@ -127,6 +129,7 @@ public class EngineNewPayloadV2Test extends AbstractEngineNewPayloadTest { Collections.emptyList(), withdrawals, null, + null, null)); final JsonRpcError jsonRpcError = fromErrorResp(resp); @@ -143,7 +146,8 @@ public class EngineNewPayloadV2Test extends AbstractEngineNewPayloadTest { .blobGasUsed(100L) .buildHeader(); - var resp = resp(mockEnginePayload(blockHeader, Collections.emptyList(), List.of(), null, null)); + var resp = + resp(mockEnginePayload(blockHeader, Collections.emptyList(), List.of(), null, null, null)); final JsonRpcError jsonRpcError = fromErrorResp(resp); assertThat(jsonRpcError.getCode()).isEqualTo(INVALID_PARAMS.getCode()); assertThat(jsonRpcError.getData()).isEqualTo("non-null BlobGasUsed pre-cancun"); @@ -159,7 +163,8 @@ public class EngineNewPayloadV2Test extends AbstractEngineNewPayloadTest { .excessBlobGas(BlobGas.MAX_BLOB_GAS) .buildHeader(); - var resp = resp(mockEnginePayload(blockHeader, Collections.emptyList(), List.of(), null, null)); + var resp = + resp(mockEnginePayload(blockHeader, Collections.emptyList(), List.of(), null, null, null)); final JsonRpcError jsonRpcError = fromErrorResp(resp); assertThat(jsonRpcError.getCode()).isEqualTo(INVALID_PARAMS.getCode()); @@ -180,6 +185,7 @@ public class EngineNewPayloadV2Test extends AbstractEngineNewPayloadTest { Collections.emptyList(), withdrawals, null, + null, null)); assertThat(fromErrorResp(resp).getCode()).isEqualTo(INVALID_PARAMS.getCode()); diff --git a/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/EngineNewPayloadV3Test.java b/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/EngineNewPayloadV3Test.java index 98a71ebf3..c19bb8fbc 100644 --- a/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/EngineNewPayloadV3Test.java +++ b/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/EngineNewPayloadV3Test.java @@ -137,7 +137,7 @@ public class EngineNewPayloadV3Test extends EngineNewPayloadV2Test { Optional.empty(), Optional.empty()); final EnginePayloadParameter payload = - mockEnginePayload(mockHeader, Collections.emptyList(), null, null, null); + mockEnginePayload(mockHeader, Collections.emptyList(), null, null, null, null); ValidationResult res = method.validateParameters( @@ -193,7 +193,8 @@ public class EngineNewPayloadV3Test extends EngineNewPayloadV2Test { .blobGasUsed(null) .buildHeader(); - var resp = resp(mockEnginePayload(blockHeader, Collections.emptyList(), List.of(), null, null)); + var resp = + resp(mockEnginePayload(blockHeader, Collections.emptyList(), List.of(), null, null, null)); final JsonRpcError jsonRpcError = fromErrorResp(resp); assertThat(jsonRpcError.getCode()).isEqualTo(INVALID_PARAMS.getCode()); @@ -212,7 +213,8 @@ public class EngineNewPayloadV3Test extends EngineNewPayloadV2Test { .blobGasUsed(100L) .buildHeader(); - var resp = resp(mockEnginePayload(blockHeader, Collections.emptyList(), List.of(), null, null)); + var resp = + resp(mockEnginePayload(blockHeader, Collections.emptyList(), List.of(), null, null, null)); final JsonRpcError jsonRpcError = fromErrorResp(resp); assertThat(jsonRpcError.getCode()).isEqualTo(INVALID_PARAMS.getCode()); diff --git a/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/EngineNewPayloadV4Test.java b/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/EngineNewPayloadV4Test.java index 86b096cf1..9ea172130 100644 --- a/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/EngineNewPayloadV4Test.java +++ b/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/EngineNewPayloadV4Test.java @@ -109,7 +109,9 @@ public class EngineNewPayloadV4Test extends EngineNewPayloadV3Test { .thenReturn(Optional.of(mockHeader.getHash())); var resp = - resp(mockEnginePayload(mockHeader, Collections.emptyList(), null, depositRequests, null)); + resp( + mockEnginePayload( + mockHeader, Collections.emptyList(), null, depositRequests, null, null)); assertValidResponse(mockHeader, resp); } @@ -125,6 +127,7 @@ public class EngineNewPayloadV4Test extends EngineNewPayloadV3Test { Collections.emptyList(), null, depositRequests, + null, null)); assertThat(fromErrorResp(resp).getCode()).isEqualTo(INVALID_PARAMS.getCode()); @@ -152,7 +155,7 @@ public class EngineNewPayloadV4Test extends EngineNewPayloadV3Test { var resp = resp( mockEnginePayload( - mockHeader, Collections.emptyList(), null, depositRequestsParam, null)); + mockHeader, Collections.emptyList(), null, depositRequestsParam, null, null)); assertValidResponse(mockHeader, resp); } @@ -172,6 +175,7 @@ public class EngineNewPayloadV4Test extends EngineNewPayloadV3Test { Collections.emptyList(), null, depositRequests, + null, null)); final JsonRpcError jsonRpcError = fromErrorResp(resp); @@ -195,7 +199,7 @@ public class EngineNewPayloadV4Test extends EngineNewPayloadV3Test { when(mergeCoordinator.getLatestValidAncestor(mockHeader)) .thenReturn(Optional.of(mockHeader.getHash())); - var resp = resp(mockEnginePayload(mockHeader, Collections.emptyList(), null, null, null)); + var resp = resp(mockEnginePayload(mockHeader, Collections.emptyList(), null, null, null, null)); assertValidResponse(mockHeader, resp); } @@ -211,6 +215,7 @@ public class EngineNewPayloadV4Test extends EngineNewPayloadV3Test { Collections.emptyList(), null, null, + null, null)); assertThat(fromErrorResp(resp).getCode()).isEqualTo(INVALID_PARAMS.getCode()); @@ -239,7 +244,7 @@ public class EngineNewPayloadV4Test extends EngineNewPayloadV3Test { var resp = resp( mockEnginePayload( - mockHeader, Collections.emptyList(), null, null, withdrawalRequestsParams)); + mockHeader, Collections.emptyList(), null, null, withdrawalRequestsParams, null)); assertValidResponse(mockHeader, resp); } @@ -258,7 +263,8 @@ public class EngineNewPayloadV4Test extends EngineNewPayloadV3Test { Collections.emptyList(), null, null, - withdrawalRequests)); + withdrawalRequests, + null)); final JsonRpcError jsonRpcError = fromErrorResp(resp); assertThat(jsonRpcError.getCode()).isEqualTo(INVALID_PARAMS.getCode()); diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/ConsolidationRequest.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/ConsolidationRequest.java new file mode 100644 index 000000000..38345d1a3 --- /dev/null +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/ConsolidationRequest.java @@ -0,0 +1,90 @@ +/* + * Copyright contributors to Hyperledger Besu. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on + * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the + * specific language governing permissions and limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + */ +package org.hyperledger.besu.ethereum.core; + +import org.hyperledger.besu.datatypes.Address; +import org.hyperledger.besu.datatypes.BLSPublicKey; +import org.hyperledger.besu.datatypes.PublicKey; +import org.hyperledger.besu.datatypes.RequestType; + +import java.util.Objects; + +public class ConsolidationRequest extends Request + implements org.hyperledger.besu.plugin.data.ConsolidationRequest { + + private final Address sourceAddress; + private final BLSPublicKey sourcePubkey; + private final BLSPublicKey targetPubkey; + + public ConsolidationRequest( + final Address sourceAddress, + final BLSPublicKey sourcePubkey, + final BLSPublicKey targetPubkey) { + this.sourceAddress = sourceAddress; + this.sourcePubkey = sourcePubkey; + this.targetPubkey = targetPubkey; + } + + @Override + public RequestType getType() { + return RequestType.CONSOLIDATION; + } + + @Override + public Address getSourceAddress() { + return sourceAddress; + } + + @Override + public PublicKey getSourcePubkey() { + return sourcePubkey; + } + + @Override + public PublicKey getTargetPubkey() { + return targetPubkey; + } + + @Override + public String toString() { + return "ConsolidationRequest{" + + "sourceAddress=" + + sourceAddress + + " sourcePubkey=" + + sourcePubkey + + " targetPubkey=" + + targetPubkey + + '}'; + } + + @Override + public boolean equals(final Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + final ConsolidationRequest that = (ConsolidationRequest) o; + return Objects.equals(sourceAddress, that.sourceAddress) + && Objects.equals(sourcePubkey, that.sourcePubkey) + && Objects.equals(targetPubkey, that.targetPubkey); + } + + @Override + public int hashCode() { + return Objects.hash(sourceAddress, sourcePubkey, targetPubkey); + } +} diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/encoding/ConsolidationRequestDecoder.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/encoding/ConsolidationRequestDecoder.java new file mode 100644 index 000000000..29be31f46 --- /dev/null +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/encoding/ConsolidationRequestDecoder.java @@ -0,0 +1,40 @@ +/* + * Copyright contributors to Hyperledger Besu. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on + * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the + * specific language governing permissions and limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + */ +package org.hyperledger.besu.ethereum.core.encoding; + +import org.hyperledger.besu.datatypes.Address; +import org.hyperledger.besu.datatypes.BLSPublicKey; +import org.hyperledger.besu.ethereum.core.ConsolidationRequest; +import org.hyperledger.besu.ethereum.rlp.RLP; +import org.hyperledger.besu.ethereum.rlp.RLPInput; + +import org.apache.tuweni.bytes.Bytes; + +public class ConsolidationRequestDecoder { + + public static ConsolidationRequest decode(final RLPInput rlpInput) { + rlpInput.enterList(); + final Address sourceAddress = Address.readFrom(rlpInput); + final BLSPublicKey sourcePublicKey = BLSPublicKey.readFrom(rlpInput); + final BLSPublicKey targetPublicKey = BLSPublicKey.readFrom(rlpInput); + rlpInput.leaveList(); + + return new ConsolidationRequest(sourceAddress, sourcePublicKey, targetPublicKey); + } + + public static ConsolidationRequest decodeOpaqueBytes(final Bytes input) { + return decode(RLP.input(input)); + } +} diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/encoding/ConsolidationRequestEncoder.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/encoding/ConsolidationRequestEncoder.java new file mode 100644 index 000000000..9551f7b97 --- /dev/null +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/encoding/ConsolidationRequestEncoder.java @@ -0,0 +1,60 @@ +/* + * Copyright contributors to Hyperledger Besu. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on + * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the + * specific language governing permissions and limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + */ +package org.hyperledger.besu.ethereum.core.encoding; + +import org.hyperledger.besu.datatypes.RequestType; +import org.hyperledger.besu.ethereum.core.ConsolidationRequest; +import org.hyperledger.besu.ethereum.core.Request; +import org.hyperledger.besu.ethereum.rlp.RLP; +import org.hyperledger.besu.ethereum.rlp.RLPOutput; + +import org.apache.tuweni.bytes.Bytes; + +public class ConsolidationRequestEncoder { + + /** + * Encodes a Request into RLP format if it is a ConsolidationRequest. + * + * @param request The Request to encode, which must be a ConsolidationRequest. + * @param rlpOutput The RLPOutput to write the encoded data to. + * @throws IllegalArgumentException if the provided request is not a ConsolidationRequest. + */ + public static void encode(final Request request, final RLPOutput rlpOutput) { + if (!request.getType().equals(RequestType.CONSOLIDATION)) { + throw new IllegalArgumentException( + "The provided request is not of type ConsolidationRequest."); + } + encodeConsolidationRequest((ConsolidationRequest) request, rlpOutput); + } + + /** + * Encodes the details of a ConsolidationRequest into RLP format. + * + * @param consolidationRequest The ConsolidationRequest to encode. + * @param rlpOutput The RLPOutput to write the encoded data to. + */ + private static void encodeConsolidationRequest( + final ConsolidationRequest consolidationRequest, final RLPOutput rlpOutput) { + rlpOutput.startList(); + rlpOutput.writeBytes(consolidationRequest.getSourceAddress()); + rlpOutput.writeBytes(consolidationRequest.getSourcePubkey()); + rlpOutput.writeBytes(consolidationRequest.getTargetPubkey()); + rlpOutput.endList(); + } + + public static Bytes encodeOpaqueBytes(final Request consolidationRequest) { + return RLP.encode(rlpOutput -> encode(consolidationRequest, rlpOutput)); + } +} diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/encoding/RequestDecoder.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/encoding/RequestDecoder.java index 4953cbb84..64191e104 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/encoding/RequestDecoder.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/encoding/RequestDecoder.java @@ -41,7 +41,9 @@ public class RequestDecoder { RequestType.WITHDRAWAL, WithdrawalRequestDecoder::decode, RequestType.DEPOSIT, - DepositRequestDecoder::decode); + DepositRequestDecoder::decode, + RequestType.CONSOLIDATION, + ConsolidationRequestDecoder::decode); /** * Decodes a request from its RLP encoded bytes. diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/encoding/RequestEncoder.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/encoding/RequestEncoder.java index 4f79da453..3c61a77ac 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/encoding/RequestEncoder.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/encoding/RequestEncoder.java @@ -38,7 +38,9 @@ public class RequestEncoder { RequestType.WITHDRAWAL, WithdrawalRequestEncoder::encode, RequestType.DEPOSIT, - DepositRequestEncoder::encode); + DepositRequestEncoder::encode, + RequestType.CONSOLIDATION, + ConsolidationRequestEncoder::encode); /** * Encodes a Request into the provided RLPOutput. diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/requests/ConsolidationRequestProcessor.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/requests/ConsolidationRequestProcessor.java new file mode 100644 index 000000000..0a48d8278 --- /dev/null +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/requests/ConsolidationRequestProcessor.java @@ -0,0 +1,68 @@ +/* + * Copyright contributors to Hyperledger Besu. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on + * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the + * specific language governing permissions and limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + */ +package org.hyperledger.besu.ethereum.mainnet.requests; + +import org.hyperledger.besu.datatypes.Address; +import org.hyperledger.besu.datatypes.BLSPublicKey; +import org.hyperledger.besu.ethereum.core.ConsolidationRequest; + +import org.apache.tuweni.bytes.Bytes; + +public class ConsolidationRequestProcessor + extends AbstractSystemCallRequestProcessor { + public static final Address CONSOLIDATION_REQUEST_PREDEPLOY_ADDRESS = + Address.fromHexString("0x00b42dbF2194e931E80326D950320f7d9Dbeac02"); + + private static final int ADDRESS_BYTES = 20; + private static final int PUBLIC_KEY_BYTES = 48; + private static final int CONSOLIDATION_REQUEST_BYTES_SIZE = + ADDRESS_BYTES + PUBLIC_KEY_BYTES + PUBLIC_KEY_BYTES; + + /** + * Gets the call address for consolidation requests. + * + * @return The call address. + */ + @Override + protected Address getCallAddress() { + return CONSOLIDATION_REQUEST_PREDEPLOY_ADDRESS; + } + + /** + * Gets the size of the bytes representing a single consolidation request. + * + * @return The size of the bytes representing a single consolidation request. + */ + @Override + protected int getRequestBytesSize() { + return CONSOLIDATION_REQUEST_BYTES_SIZE; + } + + /** + * Parses a single consolidation request from the provided bytes. + * + * @param requestBytes The bytes representing a single consolidation request. + * @return A parsed {@link ConsolidationRequest} object. + */ + @Override + protected ConsolidationRequest parseRequest(final Bytes requestBytes) { + final Address sourceAddress = Address.wrap(requestBytes.slice(0, ADDRESS_BYTES)); + final BLSPublicKey sourcePublicKey = + BLSPublicKey.wrap(requestBytes.slice(ADDRESS_BYTES, PUBLIC_KEY_BYTES)); + final BLSPublicKey targetPublicKey = + BLSPublicKey.wrap(requestBytes.slice(ADDRESS_BYTES + PUBLIC_KEY_BYTES, PUBLIC_KEY_BYTES)); + return new ConsolidationRequest(sourceAddress, sourcePublicKey, targetPublicKey); + } +} diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/requests/ConsolidationRequestValidator.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/requests/ConsolidationRequestValidator.java new file mode 100644 index 000000000..f03de5e6b --- /dev/null +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/requests/ConsolidationRequestValidator.java @@ -0,0 +1,92 @@ +/* + * Copyright contributors to Hyperledger Besu. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on + * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the + * specific language governing permissions and limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + */ +package org.hyperledger.besu.ethereum.mainnet.requests; + +import static org.hyperledger.besu.ethereum.mainnet.requests.RequestUtil.getConsolidationRequests; + +import org.hyperledger.besu.datatypes.Hash; +import org.hyperledger.besu.ethereum.core.Block; +import org.hyperledger.besu.ethereum.core.ConsolidationRequest; +import org.hyperledger.besu.ethereum.core.Request; +import org.hyperledger.besu.ethereum.core.TransactionReceipt; + +import java.util.Collections; +import java.util.List; +import java.util.Optional; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class ConsolidationRequestValidator implements RequestValidator { + + private static final Logger LOG = LoggerFactory.getLogger(ConsolidationRequestValidator.class); + + public static final int MAX_CONSOLIDATION_REQUESTS_PER_BLOCK = 1; + + private boolean validateConsolidationRequestParameter( + final Optional> consolidationRequests) { + return consolidationRequests.isPresent(); + } + + private boolean validateConsolidationRequestsInBlock( + final Block block, final List consolidationRequests) { + final Hash blockHash = block.getHash(); + + final List consolidationRequestsInBlock = + block + .getBody() + .getRequests() + .flatMap(requests -> getConsolidationRequests(Optional.of(requests))) + .orElse(Collections.emptyList()); + + if (consolidationRequestsInBlock.size() > MAX_CONSOLIDATION_REQUESTS_PER_BLOCK) { + LOG.warn( + "Block {} has more than the allowed maximum number of consolidation requests", blockHash); + return false; + } + + // Validate ConsolidationRequests + final boolean expectedConsolidationRequestMatch = + consolidationRequests.equals(consolidationRequestsInBlock); + if (!expectedConsolidationRequestMatch) { + LOG.warn( + "Block {} has a mismatch between block consolidations and RPC consolidation requests (in_block = {}, " + + "expected = {})", + blockHash, + consolidationRequestsInBlock, + consolidationRequests); + return false; + } + return true; + } + + @Override + public boolean validate( + final Block block, final List requests, final List receipts) { + var consolidationRequests = + getConsolidationRequests(Optional.of(requests)).orElse(Collections.emptyList()); + return validateConsolidationRequestsInBlock(block, consolidationRequests); + } + + @Override + public boolean validateParameter(final Optional> request) { + if (request.isEmpty()) { + return true; + } + var consolidationRequests = + RequestUtil.filterRequestsOfType(request.get(), ConsolidationRequest.class); + return validateConsolidationRequestParameter(Optional.of(consolidationRequests)); + } +} diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/requests/MainnetRequestsValidator.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/requests/MainnetRequestsValidator.java index 56e47aea5..d855544ed 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/requests/MainnetRequestsValidator.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/requests/MainnetRequestsValidator.java @@ -22,6 +22,7 @@ public class MainnetRequestsValidator { final Address depositContractAddress) { return new RequestsValidatorCoordinator.Builder() .addValidator(RequestType.WITHDRAWAL, new WithdrawalRequestValidator()) + .addValidator(RequestType.CONSOLIDATION, new ConsolidationRequestValidator()) .addValidator(RequestType.DEPOSIT, new DepositRequestValidator(depositContractAddress)) .build(); } @@ -30,6 +31,7 @@ public class MainnetRequestsValidator { final Address depositContractAddress) { return new RequestProcessorCoordinator.Builder() .addProcessor(RequestType.WITHDRAWAL, new WithdrawalRequestProcessor()) + .addProcessor(RequestType.CONSOLIDATION, new ConsolidationRequestProcessor()) .addProcessor(RequestType.DEPOSIT, new DepositRequestProcessor(depositContractAddress)) .build(); } diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/requests/RequestUtil.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/requests/RequestUtil.java index 459fdbe11..f3a10161a 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/requests/RequestUtil.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/requests/RequestUtil.java @@ -14,6 +14,7 @@ */ package org.hyperledger.besu.ethereum.mainnet.requests; +import org.hyperledger.besu.ethereum.core.ConsolidationRequest; import org.hyperledger.besu.ethereum.core.DepositRequest; import org.hyperledger.besu.ethereum.core.Request; import org.hyperledger.besu.ethereum.core.WithdrawalRequest; @@ -52,23 +53,33 @@ public class RequestUtil { return requests.map(r -> filterRequestsOfType(r, WithdrawalRequest.class)); } + public static Optional> getConsolidationRequests( + final Optional> requests) { + return requests.map(r -> filterRequestsOfType(r, ConsolidationRequest.class)); + } + /** - * Combines two optional lists of requests into a single optional list. + * Combines multiple optional lists of requests into a single optional list. * * @param maybeDepositRequests Optional list of deposit requests. * @param maybeWithdrawalRequest Optional list of withdrawal requests. - * @return An Optional containing the combined list of requests, or an empty Optional if both - * inputs are empty. + * @param maybeConsolidationRequest Optional list of withdrawal requests. + * @return An Optional containing the combined list of requests, or an empty Optional if all input + * lists are empty. */ public static Optional> combine( final Optional> maybeDepositRequests, - final Optional> maybeWithdrawalRequest) { - if (maybeDepositRequests.isEmpty() && maybeWithdrawalRequest.isEmpty()) { + final Optional> maybeWithdrawalRequest, + final Optional> maybeConsolidationRequest) { + if (maybeDepositRequests.isEmpty() + && maybeWithdrawalRequest.isEmpty() + && maybeConsolidationRequest.isEmpty()) { return Optional.empty(); } List requests = new ArrayList<>(); maybeDepositRequests.ifPresent(requests::addAll); maybeWithdrawalRequest.ifPresent(requests::addAll); + maybeConsolidationRequest.ifPresent(requests::addAll); return Optional.of(requests); } } diff --git a/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/core/encoding/ConsolidationRequestDecoderTest.java b/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/core/encoding/ConsolidationRequestDecoderTest.java new file mode 100644 index 000000000..bb264dfa2 --- /dev/null +++ b/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/core/encoding/ConsolidationRequestDecoderTest.java @@ -0,0 +1,46 @@ +/* + * Copyright contributors to Hyperledger Besu. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on + * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the + * specific language governing permissions and limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + */ +package org.hyperledger.besu.ethereum.core.encoding; + +import org.hyperledger.besu.datatypes.Address; +import org.hyperledger.besu.datatypes.BLSPublicKey; +import org.hyperledger.besu.ethereum.core.ConsolidationRequest; +import org.hyperledger.besu.ethereum.core.Request; +import org.hyperledger.besu.ethereum.rlp.BytesValueRLPOutput; +import org.hyperledger.besu.ethereum.rlp.RLP; + +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.Test; + +class ConsolidationRequestDecoderTest { + + @Test + public void shouldDecodeWithdrawalRequest() { + final ConsolidationRequest expectedConsolidationRequest = + new ConsolidationRequest( + Address.fromHexString("0x814FaE9f487206471B6B0D713cD51a2D35980000"), + BLSPublicKey.fromHexString( + "0xb10a4a15bf67b328c9b101d09e5c6ee6672978fdad9ef0d9e2ceffaee99223555d8601f0cb3bcc4ce1af9864779a416e"), + BLSPublicKey.fromHexString( + "0xa09a4a15bf67b328c9b101d09e5c6ee6672978f7ad9ef0d9e2c457aee99223555d8601f0cb3bcc4ce1af9864779a416e")); + + final BytesValueRLPOutput out = new BytesValueRLPOutput(); + expectedConsolidationRequest.writeTo(out); + + final Request decodedWithdrawalRequest = RequestDecoder.decode(RLP.input(out.encoded())); + + Assertions.assertThat(decodedWithdrawalRequest).isEqualTo(expectedConsolidationRequest); + } +} diff --git a/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/core/encoding/ConsolidationRequestEncoderTest.java b/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/core/encoding/ConsolidationRequestEncoderTest.java new file mode 100644 index 000000000..10a53379b --- /dev/null +++ b/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/core/encoding/ConsolidationRequestEncoderTest.java @@ -0,0 +1,55 @@ +/* + * Copyright contributors to Hyperledger Besu. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on + * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the + * specific language governing permissions and limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + */ +package org.hyperledger.besu.ethereum.core.encoding; + +import static org.assertj.core.api.Assertions.assertThat; + +import org.hyperledger.besu.datatypes.Address; +import org.hyperledger.besu.datatypes.BLSPublicKey; +import org.hyperledger.besu.ethereum.core.ConsolidationRequest; + +import org.apache.tuweni.bytes.Bytes; +import org.junit.jupiter.api.Test; + +class ConsolidationRequestEncoderTest { + + private final String expectedEncodedBytes = + "f87794763c396673f9c391dce3361a9a71c8e161388000b0b10a4a15bf67b328c9b101d09e5c6ee6672978fdad9ef0d9e2ceffaee99223555d8601f0cb3bcc4ce1af9864779a416eb0a09a4a15bf67b328c9b101d09e5c6ee6672978f7ad9ef0d9e2c457aee99223555d8601f0cb3bcc4ce1af9864779a416e"; + + final ConsolidationRequest consolidationRequest = + new ConsolidationRequest( + Address.fromHexString("0x763c396673F9c391DCe3361A9A71C8E161388000"), + BLSPublicKey.fromHexString( + "0xb10a4a15bf67b328c9b101d09e5c6ee6672978fdad9ef0d9e2ceffaee99223555d8601f0cb3bcc4ce1af9864779a416e"), + BLSPublicKey.fromHexString( + "0xa09a4a15bf67b328c9b101d09e5c6ee6672978f7ad9ef0d9e2c457aee99223555d8601f0cb3bcc4ce1af9864779a416e")); + + @Test + void shouldEncodeConsolidationRequest() { + final Bytes encoded = ConsolidationRequestEncoder.encodeOpaqueBytes(consolidationRequest); + assertThat(encoded).isEqualTo(Bytes.fromHexString(expectedEncodedBytes)); + } + + @Test + void shouldEncodeRequest() { + final Bytes encoded = RequestEncoder.encodeOpaqueBytes(consolidationRequest); + assertThat(encoded) + .isEqualTo( + Bytes.fromHexString( + String.format( + "0x%02X%s", + consolidationRequest.getType().getSerializedType(), expectedEncodedBytes))); + } +} diff --git a/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/core/encoding/DepositRequestRequestDecoderTest.java b/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/core/encoding/DepositRequestDecoderTest.java similarity index 99% rename from ethereum/core/src/test/java/org/hyperledger/besu/ethereum/core/encoding/DepositRequestRequestDecoderTest.java rename to ethereum/core/src/test/java/org/hyperledger/besu/ethereum/core/encoding/DepositRequestDecoderTest.java index 0a6cee956..622bd8975 100644 --- a/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/core/encoding/DepositRequestRequestDecoderTest.java +++ b/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/core/encoding/DepositRequestDecoderTest.java @@ -31,7 +31,7 @@ import org.apache.tuweni.bytes.Bytes32; import org.apache.tuweni.units.bigints.UInt64; import org.junit.jupiter.api.Test; -class DepositRequestRequestDecoderTest { +class DepositRequestDecoderTest { @Test void shouldDecodeDeposit() { final DepositRequest expectedDepositRequest = diff --git a/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/core/encoding/DepositRequestRequestEncoderTest.java b/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/core/encoding/DepositRequestEncoderTest.java similarity index 98% rename from ethereum/core/src/test/java/org/hyperledger/besu/ethereum/core/encoding/DepositRequestRequestEncoderTest.java rename to ethereum/core/src/test/java/org/hyperledger/besu/ethereum/core/encoding/DepositRequestEncoderTest.java index 8f0de595f..1e6dde6aa 100644 --- a/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/core/encoding/DepositRequestRequestEncoderTest.java +++ b/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/core/encoding/DepositRequestEncoderTest.java @@ -26,7 +26,7 @@ import org.apache.tuweni.bytes.Bytes32; import org.apache.tuweni.units.bigints.UInt64; import org.junit.jupiter.api.Test; -class DepositRequestRequestEncoderTest { +class DepositRequestEncoderTest { private final String expectedDepositEncodedBytes = "f8bbb0b10a4a15bf67b328c9b101d09e5c6ee6672978fdad9ef0d9e2ceffaee99223555d8601f0cb3bcc4ce1af9864779a416ea00017a7fcf06faf493d30bbe2632ea7c2383cd86825e12797165de7aa35589483850773594000b860a889db8300194050a2636c92a95bc7160515867614b7971a9500cdb62f9c0890217d2901c3241f86fac029428fc106930606154bd9e406d7588934a5f15b837180b17194d6e44bd6de23e43b163dfe12e369dcc75a3852cd997963f158217eb501"; diff --git a/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/ConsolidationRequestValidatorTestFixtures.java b/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/ConsolidationRequestValidatorTestFixtures.java new file mode 100644 index 000000000..fbd304d1c --- /dev/null +++ b/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/ConsolidationRequestValidatorTestFixtures.java @@ -0,0 +1,136 @@ +/* + * Copyright contributors to Hyperledger Besu. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on + * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the + * specific language governing permissions and limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + */ +package org.hyperledger.besu.ethereum.mainnet; + +import static org.hyperledger.besu.ethereum.mainnet.requests.ConsolidationRequestValidator.MAX_CONSOLIDATION_REQUESTS_PER_BLOCK; + +import org.hyperledger.besu.datatypes.Address; +import org.hyperledger.besu.datatypes.BLSPublicKey; +import org.hyperledger.besu.ethereum.core.Block; +import org.hyperledger.besu.ethereum.core.BlockDataGenerator; +import org.hyperledger.besu.ethereum.core.ConsolidationRequest; +import org.hyperledger.besu.ethereum.core.Request; + +import java.util.List; +import java.util.Optional; +import java.util.stream.IntStream; + +import org.apache.tuweni.bytes.Bytes32; +import org.apache.tuweni.bytes.Bytes48; + +public class ConsolidationRequestValidatorTestFixtures { + + private static final BlockDataGenerator blockDataGenerator = new BlockDataGenerator(); + + static ConsolidationRequestTestParameter + blockWithConsolidationRequestsAndWithdrawalRequestsRoot() { + final ConsolidationRequest consolidationRequest = createConsolidationRequest(); + final Optional> maybeConsolidationRequests = + Optional.of(List.of(consolidationRequest)); + + final BlockDataGenerator.BlockOptions blockOptions = + BlockDataGenerator.BlockOptions.create() + .setRequestsRoot(BodyValidation.requestsRoot(maybeConsolidationRequests.get())) + .setRequests(maybeConsolidationRequests); + final Block block = blockDataGenerator.block(blockOptions); + + return new ConsolidationRequestTestParameter( + "Block with consolidation requests and withdrawal_requests_root", + block, + Optional.of(List.of(consolidationRequest))); + } + + static ConsolidationRequestTestParameter blockWithConsolidationRequestsMismatch() { + final ConsolidationRequest consolidationRequest = createConsolidationRequest(); + + final Optional> requests = + Optional.of(List.of(consolidationRequest, consolidationRequest)); + + final BlockDataGenerator.BlockOptions blockOptions = + BlockDataGenerator.BlockOptions.create() + .setRequestsRoot(BodyValidation.requestsRoot(requests.get())) + .setRequests(requests); + final Block block = blockDataGenerator.block(blockOptions); + + return new ConsolidationRequestTestParameter( + "Block with consolidation requests mismatch", + block, + Optional.of(List.of(consolidationRequest, consolidationRequest)), + List.of(createConsolidationRequest())); + } + + static ConsolidationRequestTestParameter blockWithMoreThanMaximumConsolidationRequests() { + final List consolidationRequests = + IntStream.range(0, MAX_CONSOLIDATION_REQUESTS_PER_BLOCK + 1) + .mapToObj(__ -> createConsolidationRequest()) + .toList(); + + final Optional> maybeConsolidationRequest = + Optional.of(consolidationRequests); + final Optional> maybeRequests = + Optional.of(consolidationRequests.stream().map(r -> (Request) r).toList()); + + final BlockDataGenerator.BlockOptions blockOptions = + BlockDataGenerator.BlockOptions.create() + .setRequestsRoot(BodyValidation.requestsRoot(maybeRequests.get())) + .setRequests(maybeRequests); + final Block block = blockDataGenerator.block(blockOptions); + + return new ConsolidationRequestTestParameter( + "Block with more than maximum consolidation requests", block, maybeConsolidationRequest); + } + + static ConsolidationRequest createConsolidationRequest() { + return new ConsolidationRequest( + Address.extract(Bytes32.random()), + BLSPublicKey.wrap(Bytes48.random()), + BLSPublicKey.wrap(Bytes48.random())); + } + + static class ConsolidationRequestTestParameter { + + String description; + Block block; + Optional> maybeConsolidationRequest; + List expectedConsolidationRequest; + + public ConsolidationRequestTestParameter( + final String description, + final Block block, + final Optional> maybeConsolidationRequest) { + this( + description, + block, + maybeConsolidationRequest, + maybeConsolidationRequest.orElseGet(List::of)); + } + + public ConsolidationRequestTestParameter( + final String description, + final Block block, + final Optional> maybeConsolidationRequest, + final List expectedConsolidationRequest) { + this.description = description; + this.block = block; + this.maybeConsolidationRequest = maybeConsolidationRequest; + this.expectedConsolidationRequest = expectedConsolidationRequest; + } + + @Override + public String toString() { + return description; + } + } +} diff --git a/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/PragueConsolidationRequestValidatorTest.java b/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/PragueConsolidationRequestValidatorTest.java new file mode 100644 index 000000000..9d0c9588c --- /dev/null +++ b/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/PragueConsolidationRequestValidatorTest.java @@ -0,0 +1,76 @@ +/* + * Copyright contributors to Hyperledger Besu. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on + * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the + * specific language governing permissions and limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + */ +package org.hyperledger.besu.ethereum.mainnet; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.hyperledger.besu.ethereum.mainnet.ConsolidationRequestValidatorTestFixtures.blockWithConsolidationRequestsAndWithdrawalRequestsRoot; +import static org.hyperledger.besu.ethereum.mainnet.ConsolidationRequestValidatorTestFixtures.blockWithConsolidationRequestsMismatch; +import static org.hyperledger.besu.ethereum.mainnet.ConsolidationRequestValidatorTestFixtures.blockWithMoreThanMaximumConsolidationRequests; + +import org.hyperledger.besu.ethereum.core.Request; +import org.hyperledger.besu.ethereum.mainnet.ConsolidationRequestValidatorTestFixtures.ConsolidationRequestTestParameter; +import org.hyperledger.besu.ethereum.mainnet.requests.ConsolidationRequestValidator; + +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; +import java.util.stream.Stream; + +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; + +class PragueConsolidationRequestValidatorTest { + + @ParameterizedTest(name = "{index}: {0}") + @MethodSource("paramsForValidateConsolidationRequestParameter") + public void validateConsolidationRequestParameter( + final String description, + final Optional> maybeRequests, + final boolean expectedValidity) { + assertThat(new ConsolidationRequestValidator().validateParameter(maybeRequests)) + .isEqualTo(expectedValidity); + } + + private static Stream paramsForValidateConsolidationRequestParameter() { + return Stream.of( + Arguments.of( + "Allowed ConsolidationRequests - validating empty ConsolidationRequests", + Optional.empty(), + true), + Arguments.of( + "Allowed ConsolidationRequests - validating present ConsolidationRequests", + Optional.of(List.of()), + true)); + } + + @ParameterizedTest(name = "{index}: {0}") + @MethodSource("validateConsolidationRequestsInBlockParamsForPrague") + public void validateConsolidationRequestsInBlock_WhenPrague( + final ConsolidationRequestTestParameter param, final boolean expectedValidity) { + assertThat( + new ConsolidationRequestValidator() + .validate( + param.block, new ArrayList<>(param.expectedConsolidationRequest), List.of())) + .isEqualTo(expectedValidity); + } + + private static Stream validateConsolidationRequestsInBlockParamsForPrague() { + return Stream.of( + Arguments.of(blockWithConsolidationRequestsAndWithdrawalRequestsRoot(), true), + Arguments.of(blockWithConsolidationRequestsMismatch(), false), + Arguments.of(blockWithMoreThanMaximumConsolidationRequests(), false)); + } +} diff --git a/ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/T8nExecutor.java b/ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/T8nExecutor.java index 429ad5944..ee6c5d5f7 100644 --- a/ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/T8nExecutor.java +++ b/ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/T8nExecutor.java @@ -32,6 +32,7 @@ import org.hyperledger.besu.datatypes.VersionedHash; import org.hyperledger.besu.datatypes.Wei; import org.hyperledger.besu.ethereum.chain.Blockchain; import org.hyperledger.besu.ethereum.core.BlockHeader; +import org.hyperledger.besu.ethereum.core.ConsolidationRequest; import org.hyperledger.besu.ethereum.core.DepositRequest; import org.hyperledger.besu.ethereum.core.Request; import org.hyperledger.besu.ethereum.core.Transaction; @@ -495,15 +496,25 @@ public class T8nExecutor { obj.put("index", deposit.getIndex().toHexString()); }); - var withdrawlRequests = resultObject.putArray("withdrawalRequests"); + var withdrawalRequests = resultObject.putArray("withdrawalRequests"); RequestUtil.filterRequestsOfType(maybeRequests.orElse(List.of()), WithdrawalRequest.class) .forEach( wr -> { - var obj = withdrawlRequests.addObject(); + var obj = withdrawalRequests.addObject(); obj.put("sourceAddress", wr.getSourceAddress().toHexString()); obj.put("validatorPubkey", wr.getValidatorPubkey().toHexString()); obj.put("amount", wr.getAmount().toHexString()); }); + + var consolidationRequests = resultObject.putArray("consolidationRequests"); + RequestUtil.filterRequestsOfType(maybeRequests.orElse(List.of()), ConsolidationRequest.class) + .forEach( + cr -> { + var obj = consolidationRequests.addObject(); + obj.put("sourceAddress", cr.getSourceAddress().toHexString()); + obj.put("sourcePubkey", cr.getSourcePubkey().toHexString()); + obj.put("targetPubkey", cr.getTargetPubkey().toHexString()); + }); } worldState.persist(blockHeader); diff --git a/ethereum/evmtool/src/test/resources/org/hyperledger/besu/evmtool/t8n/prague-deposit.json b/ethereum/evmtool/src/test/resources/org/hyperledger/besu/evmtool/t8n/prague-deposit.json index d48fc66c7..1a32e50e8 100644 --- a/ethereum/evmtool/src/test/resources/org/hyperledger/besu/evmtool/t8n/prague-deposit.json +++ b/ethereum/evmtool/src/test/resources/org/hyperledger/besu/evmtool/t8n/prague-deposit.json @@ -172,6 +172,11 @@ "balance": "0x3782dace9d9000000", "nonce": "0x1" }, + "0x00a3ca265ebcb825b45f985a16cefb49958ce017": { + "code": "0x3373fffffffffffffffffffffffffffffffffffffffe146090573615156028575f545f5260205ff35b366038141561012e5760115f54600182026001905f5b5f82111560595781019083028483029004916001019190603e565b90939004341061012e57600154600101600155600354806003026004013381556001015f3581556001016020359055600101600355005b6003546002548082038060101160a4575060105b5f5b81811460dd5780604c02838201600302600401805490600101805490600101549160601b83528260140152906034015260010160a6565b910180921460ed579060025560f8565b90505f6002555f6003555b5f548061049d141561010757505f5b60015460028282011161011c5750505f610122565b01600290035b5f555f600155604c025ff35b5f5ffd", + "balance": "0x0", + "nonce": "0x1" + }, "0x000f3df6d732807ef1319fb7b8bb8522d0beac02": { "code": "0x3373fffffffffffffffffffffffffffffffffffffffe14604d57602036146024575f5ffd5b5f35801560495762001fff810690815414603c575f5ffd5b62001fff01545f5260205ff35b5f5ffd5b62001fff42064281555f359062001fff015500", "storage": { @@ -180,11 +185,6 @@ "balance": "0x0", "nonce": "0x1" }, - "0x00a3ca265ebcb825b45f985a16cefb49958ce017": { - "code": "0x3373fffffffffffffffffffffffffffffffffffffffe146090573615156028575f545f5260205ff35b366038141561012e5760115f54600182026001905f5b5f82111560595781019083028483029004916001019190603e565b90939004341061012e57600154600101600155600354806003026004013381556001015f3581556001016020359055600101600355005b6003546002548082038060101160a4575060105b5f5b81811460dd5780604c02838201600302600401805490600101805490600101549160601b83528260140152906034015260010160a6565b910180921460ed579060025560f8565b90505f6002555f6003555b5f548061049d141561010757505f5b60015460028282011161011c5750505f610122565b01600290035b5f555f600155604c025ff35b5f5ffd", - "balance": "0x0", - "nonce": "0x1" - }, "0x0aae40965e6800cd9b1f4b05ff21581047e3f91e": { "code": "0x3373fffffffffffffffffffffffffffffffffffffffe1460575767ffffffffffffffff5f3511605357600143035f3511604b575f35612000014311604b57611fff5f3516545f5260205ff35b5f5f5260205ff35b5f5ffd5b5f35611fff60014303165500", "storage": { @@ -282,7 +282,8 @@ "index": "0x0000000000000001" } ], - "withdrawalRequests": [] + "withdrawalRequests": [], + "consolidationRequests":[] } } } \ No newline at end of file diff --git a/ethereum/evmtool/src/test/resources/org/hyperledger/besu/evmtool/t8n/prague-withdrawal.json b/ethereum/evmtool/src/test/resources/org/hyperledger/besu/evmtool/t8n/prague-withdrawal.json index cc8958b07..148c7a23e 100644 --- a/ethereum/evmtool/src/test/resources/org/hyperledger/besu/evmtool/t8n/prague-withdrawal.json +++ b/ethereum/evmtool/src/test/resources/org/hyperledger/besu/evmtool/t8n/prague-withdrawal.json @@ -314,6 +314,7 @@ "amount": "0x0000000000000000" } ], + "consolidationRequests":[], "stateRoot": "0xf63d7552dc407993393315e99272781d04eedfcf369a1acd3e386d1e6710229d", "txRoot": "0x8521df63211790726b6f1a437bb0fd4b27c00e13e7678d324c4cfddb8d834ad2", "receiptsRoot": "0x4bd8bd5580caf4ed45f873794ad7ff9d6fd2363ae529269b17b891b68d349d75", diff --git a/ethereum/referencetests/src/reference-test/java/org/hyperledger/besu/ethereum/vm/BlockchainReferenceTestTools.java b/ethereum/referencetests/src/reference-test/java/org/hyperledger/besu/ethereum/vm/BlockchainReferenceTestTools.java index 5512923c6..1d9ce8eef 100644 --- a/ethereum/referencetests/src/reference-test/java/org/hyperledger/besu/ethereum/vm/BlockchainReferenceTestTools.java +++ b/ethereum/referencetests/src/reference-test/java/org/hyperledger/besu/ethereum/vm/BlockchainReferenceTestTools.java @@ -90,10 +90,10 @@ public class BlockchainReferenceTestTools { params.ignore( "UncleFromSideChain_(Merge|Paris|Shanghai|Cancun|Prague|Osaka|Amsterdam|Bogota|Polis|Bangkok)"); - // EOF tests don't have Prague stuff like deopsits right now + // EOF tests don't have Prague stuff like deposits right now params.ignore("/stEOF/"); - // None of the Prague tests have withdrawls and deposits handling + // None of the Prague tests have withdrawals and deposits handling params.ignore("\\[Prague\\]"); } diff --git a/plugin-api/build.gradle b/plugin-api/build.gradle index d55efa7fc..30ab85d37 100644 --- a/plugin-api/build.gradle +++ b/plugin-api/build.gradle @@ -70,7 +70,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 = 'yH50m+z1tnzshJQPdwR86pb2EU3m6iZxwkqoy/5spcs=' + knownHash = 'Yv6CY8fh0yrIz3Q8Moy/j1TNGL+O8Mewp4SIgM1JE6M=' } check.dependsOn('checkAPIChanges') diff --git a/plugin-api/src/main/java/org/hyperledger/besu/plugin/data/ConsolidationRequest.java b/plugin-api/src/main/java/org/hyperledger/besu/plugin/data/ConsolidationRequest.java new file mode 100644 index 000000000..5d7e66b4a --- /dev/null +++ b/plugin-api/src/main/java/org/hyperledger/besu/plugin/data/ConsolidationRequest.java @@ -0,0 +1,45 @@ +/* + * Copyright contributors to Hyperledger Besu. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on + * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the + * specific language governing permissions and limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + */ +package org.hyperledger.besu.plugin.data; + +import org.hyperledger.besu.datatypes.Address; +import org.hyperledger.besu.datatypes.PublicKey; +import org.hyperledger.besu.plugin.Unstable; + +/** A consolidation request is an operation sent to the Beacon Node for processing. */ +@Unstable +public interface ConsolidationRequest { + + /** + * Withdrawal credential (0x01) associated with the validator + * + * @return withdrawal credential address + */ + Address getSourceAddress(); + + /** + * Public key of the address that sends the consolidation + * + * @return public key of sender + */ + PublicKey getSourcePubkey(); + + /** + * Public key of the address to receives the consolidation + * + * @return public key of target + */ + PublicKey getTargetPubkey(); +} From 3366f79c958acc559716629ae0c8a58e1dc11dec Mon Sep 17 00:00:00 2001 From: Usman Saleem Date: Tue, 16 Jul 2024 19:19:22 +1000 Subject: [PATCH 56/58] fix: `eth_call` deserialization to correctly ignore unknown fields in the transaction object (#7323) * fix: Use Builder for JsonCallParameter * changelog * add additional unit tests * fix: Update builder to withGas to match the json eth_call --------- Signed-off-by: Usman Saleem --- CHANGELOG.md | 1 + .../fork/frontier/EthCallIntegrationTest.java | 291 +++++---------- .../EthCreateAccessListIntegrationTest.java | 128 +++---- .../EthEstimateGasIntegrationTest.java | 98 ++--- .../fork/london/EthCallIntegrationTest.java | 190 ++++------ .../london/EthEstimateGasIntegrationTest.java | 84 ++--- .../internal/methods/AbstractEstimateGas.java | 11 - .../internal/methods/EthCreateAccessList.java | 2 + .../internal/methods/EthEstimateGas.java | 2 + .../parameters/JsonCallParameter.java | 344 ++++++++++++++++-- .../jsonrpc/internal/methods/EthCallTest.java | 27 +- .../methods/EthCreateAccessListTest.java | 50 ++- .../internal/methods/EthEstimateGasTest.java | 49 +-- .../parameters/JsonCallParameterTest.java | 80 +++- .../privacy/methods/priv/PrivCallTest.java | 60 +-- 15 files changed, 725 insertions(+), 692 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e2b3ea072..bee462006 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,7 @@ - Implement gnark-crypto for eip-2537 [#7316](https://github.com/hyperledger/besu/pull/7316) ### Bug fixes +- Fix `eth_call` deserialization to correctly ignore unknown fields in the transaction object. [#7323](https://github.com/hyperledger/besu/pull/7323) ## 24.7.0 diff --git a/ethereum/api/src/integration-test/java/org/hyperledger/besu/ethereum/api/jsonrpc/methods/fork/frontier/EthCallIntegrationTest.java b/ethereum/api/src/integration-test/java/org/hyperledger/besu/ethereum/api/jsonrpc/methods/fork/frontier/EthCallIntegrationTest.java index 14aa15c5c..886f7bc01 100644 --- a/ethereum/api/src/integration-test/java/org/hyperledger/besu/ethereum/api/jsonrpc/methods/fork/frontier/EthCallIntegrationTest.java +++ b/ethereum/api/src/integration-test/java/org/hyperledger/besu/ethereum/api/jsonrpc/methods/fork/frontier/EthCallIntegrationTest.java @@ -64,20 +64,12 @@ public class EthCallIntegrationTest { @Test public void shouldReturnExpectedResultForCallAtLatestBlock() { final JsonCallParameter callParameter = - new JsonCallParameter( - Address.fromHexString("0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b"), - Address.fromHexString("0x6295ee1b4f6dd65047762f924ecd367c17eabf8f"), - null, - null, - null, - null, - null, - Bytes.fromHexString("0x12a7b914"), - null, - null, - null, - null, - null); + new JsonCallParameter.JsonCallParameterBuilder() + .withFrom(Address.fromHexString("0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b")) + .withTo(Address.fromHexString("0x6295ee1b4f6dd65047762f924ecd367c17eabf8f")) + .withInput(Bytes.fromHexString("0x12a7b914")) + .build(); + final JsonRpcRequestContext request = requestWithParams(callParameter, "latest"); final JsonRpcResponse expectedResponse = new JsonRpcSuccessResponse( @@ -91,20 +83,12 @@ public class EthCallIntegrationTest { @Test public void shouldReturnExpectedResultForCallAtSpecificBlock() { final JsonCallParameter callParameter = - new JsonCallParameter( - Address.fromHexString("0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b"), - Address.fromHexString("0x6295ee1b4f6dd65047762f924ecd367c17eabf8f"), - null, - null, - null, - null, - null, - Bytes.fromHexString("0x12a7b914"), - null, - null, - null, - null, - null); + new JsonCallParameter.JsonCallParameterBuilder() + .withFrom(Address.fromHexString("0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b")) + .withTo(Address.fromHexString("0x6295ee1b4f6dd65047762f924ecd367c17eabf8f")) + .withInput(Bytes.fromHexString("0x12a7b914")) + .build(); + final JsonRpcRequestContext request = requestWithParams(callParameter, "0x8"); final JsonRpcResponse expectedResponse = new JsonRpcSuccessResponse( @@ -118,21 +102,13 @@ public class EthCallIntegrationTest { @Test public void shouldReturnSuccessWhenCreatingContract() { final JsonCallParameter callParameter = - new JsonCallParameter( - Address.fromHexString("0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b"), - null, - null, - null, - null, - null, - null, - Bytes.fromHexString( - "0x608060405234801561001057600080fd5b50610157806100206000396000f30060806040526004361061004c576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680633bdab8bf146100515780639ae97baa14610068575b600080fd5b34801561005d57600080fd5b5061006661007f565b005b34801561007457600080fd5b5061007d6100b9565b005b7fa53887c1eed04528e23301f55ad49a91634ef5021aa83a97d07fd16ed71c039a60016040518082815260200191505060405180910390a1565b7fa53887c1eed04528e23301f55ad49a91634ef5021aa83a97d07fd16ed71c039a60026040518082815260200191505060405180910390a17fa53887c1eed04528e23301f55ad49a91634ef5021aa83a97d07fd16ed71c039a60036040518082815260200191505060405180910390a15600a165627a7a7230582010ddaa52e73a98c06dbcd22b234b97206c1d7ed64a7c048e10c2043a3d2309cb0029"), - null, - null, - null, - null, - null); + new JsonCallParameter.JsonCallParameterBuilder() + .withFrom(Address.fromHexString("0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b")) + .withInput( + Bytes.fromHexString( + "0x608060405234801561001057600080fd5b50610157806100206000396000f30060806040526004361061004c576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680633bdab8bf146100515780639ae97baa14610068575b600080fd5b34801561005d57600080fd5b5061006661007f565b005b34801561007457600080fd5b5061007d6100b9565b005b7fa53887c1eed04528e23301f55ad49a91634ef5021aa83a97d07fd16ed71c039a60016040518082815260200191505060405180910390a1565b7fa53887c1eed04528e23301f55ad49a91634ef5021aa83a97d07fd16ed71c039a60026040518082815260200191505060405180910390a17fa53887c1eed04528e23301f55ad49a91634ef5021aa83a97d07fd16ed71c039a60036040518082815260200191505060405180910390a15600a165627a7a7230582010ddaa52e73a98c06dbcd22b234b97206c1d7ed64a7c048e10c2043a3d2309cb0029")) + .build(); + final JsonRpcRequestContext request = requestWithParams(callParameter, "latest"); final JsonRpcResponse expectedResponse = new JsonRpcSuccessResponse( @@ -147,20 +123,13 @@ public class EthCallIntegrationTest { @Test public void shouldReturnErrorWithGasLimitTooLow() { final JsonCallParameter callParameter = - new JsonCallParameter( - Address.fromHexString("0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b"), - Address.fromHexString("0x6295ee1b4f6dd65047762f924ecd367c17eabf8f"), - 0L, - null, - null, - null, - null, - Bytes.fromHexString("0x12a7b914"), - null, - null, - null, - null, - null); + new JsonCallParameter.JsonCallParameterBuilder() + .withFrom(Address.fromHexString("0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b")) + .withTo(Address.fromHexString("0x6295ee1b4f6dd65047762f924ecd367c17eabf8f")) + .withGas(0L) + .withInput(Bytes.fromHexString("0x12a7b914")) + .build(); + final JsonRpcRequestContext request = requestWithParams(callParameter, "latest"); final JsonRpcResponse expectedResponse = new JsonRpcErrorResponse(null, RpcErrorType.INTRINSIC_GAS_EXCEEDS_LIMIT); @@ -173,20 +142,14 @@ public class EthCallIntegrationTest { @Test public void shouldReturnErrorWithGasPriceTooHighAndStrict() { final JsonCallParameter callParameter = - new JsonCallParameter( - Address.fromHexString("0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b"), - Address.fromHexString("0x6295ee1b4f6dd65047762f924ecd367c17eabf8f"), - null, - Wei.fromHexString("0x10000000000000"), - null, - null, - null, - Bytes.fromHexString("0x12a7b914"), - null, - true, - null, - null, - null); + new JsonCallParameter.JsonCallParameterBuilder() + .withFrom(Address.fromHexString("0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b")) + .withTo(Address.fromHexString("0x6295ee1b4f6dd65047762f924ecd367c17eabf8f")) + .withGasPrice(Wei.fromHexString("0x10000000000000")) + .withInput(Bytes.fromHexString("0x12a7b914")) + .withStrict(true) + .build(); + final JsonRpcRequestContext request = requestWithParams(callParameter, "latest"); final JsonRpcResponse expectedResponse = new JsonRpcErrorResponse(null, RpcErrorType.TRANSACTION_UPFRONT_COST_EXCEEDS_BALANCE); @@ -199,20 +162,14 @@ public class EthCallIntegrationTest { @Test public void shouldReturnSuccessWithGasPriceTooHighNotStrict() { final JsonCallParameter callParameter = - new JsonCallParameter( - Address.fromHexString("0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b"), - Address.fromHexString("0x6295ee1b4f6dd65047762f924ecd367c17eabf8f"), - null, - Wei.fromHexString("0x10000000000000"), - null, - null, - null, - Bytes.fromHexString("0x12a7b914"), - null, - false, - null, - null, - null); + new JsonCallParameter.JsonCallParameterBuilder() + .withFrom(Address.fromHexString("0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b")) + .withTo(Address.fromHexString("0x6295ee1b4f6dd65047762f924ecd367c17eabf8f")) + .withGasPrice(Wei.fromHexString("0x10000000000000")) + .withInput(Bytes.fromHexString("0x12a7b914")) + .withStrict(false) + .build(); + final JsonRpcRequestContext request = requestWithParams(callParameter, "latest"); final JsonRpcResponse expectedResponse = new JsonRpcSuccessResponse( @@ -226,20 +183,13 @@ public class EthCallIntegrationTest { @Test public void shouldReturnErrorWithGasPriceTooHigh() { final JsonCallParameter callParameter = - new JsonCallParameter( - Address.fromHexString("0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b"), - Address.fromHexString("0x6295ee1b4f6dd65047762f924ecd367c17eabf8f"), - null, - Wei.fromHexString("0x10000000000000"), - null, - null, - null, - Bytes.fromHexString("0x12a7b914"), - null, - null, - null, - null, - null); + new JsonCallParameter.JsonCallParameterBuilder() + .withFrom(Address.fromHexString("0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b")) + .withTo(Address.fromHexString("0x6295ee1b4f6dd65047762f924ecd367c17eabf8f")) + .withGasPrice(Wei.fromHexString("0x10000000000000")) + .withInput(Bytes.fromHexString("0x12a7b914")) + .build(); + final JsonRpcRequestContext request = requestWithParams(callParameter, "latest"); final JsonRpcResponse expectedResponse = new JsonRpcErrorResponse(null, RpcErrorType.TRANSACTION_UPFRONT_COST_EXCEEDS_BALANCE); @@ -252,20 +202,13 @@ public class EthCallIntegrationTest { @Test public void shouldReturnSuccessWithValidGasPrice() { final JsonCallParameter callParameter = - new JsonCallParameter( - Address.fromHexString("0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b"), - Address.fromHexString("0x6295ee1b4f6dd65047762f924ecd367c17eabf8f"), - null, - Wei.fromHexString("0x10"), - null, - null, - null, - Bytes.fromHexString("0x12a7b914"), - null, - null, - null, - null, - null); + new JsonCallParameter.JsonCallParameterBuilder() + .withFrom(Address.fromHexString("0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b")) + .withTo(Address.fromHexString("0x6295ee1b4f6dd65047762f924ecd367c17eabf8f")) + .withGasPrice(Wei.fromHexString("0x10")) + .withInput(Bytes.fromHexString("0x12a7b914")) + .build(); + final JsonRpcRequestContext request = requestWithParams(callParameter, "latest"); final JsonRpcResponse expectedResponse = new JsonRpcSuccessResponse( @@ -279,20 +222,13 @@ public class EthCallIntegrationTest { @Test public void shouldReturnErrorWithGasPriceAndEmptyBalance() { final JsonCallParameter callParameter = - new JsonCallParameter( - Address.fromHexString("0xdeadbeef00000000000000000000000000000000"), - Address.fromHexString("0x6295ee1b4f6dd65047762f924ecd367c17eabf8f"), - null, - Wei.fromHexString("0x10"), - null, - null, - null, - Bytes.fromHexString("0x12a7b914"), - null, - null, - null, - null, - null); + new JsonCallParameter.JsonCallParameterBuilder() + .withFrom(Address.fromHexString("0xdeadbeef00000000000000000000000000000000")) + .withTo(Address.fromHexString("0x6295ee1b4f6dd65047762f924ecd367c17eabf8f")) + .withGasPrice(Wei.fromHexString("0x10")) + .withInput(Bytes.fromHexString("0x12a7b914")) + .build(); + final JsonRpcRequestContext request = requestWithParams(callParameter, "latest"); final JsonRpcResponse expectedResponse = new JsonRpcErrorResponse(null, RpcErrorType.TRANSACTION_UPFRONT_COST_EXCEEDS_BALANCE); @@ -305,20 +241,13 @@ public class EthCallIntegrationTest { @Test public void shouldReturnSuccessWithZeroGasPriceAndEmptyBalance() { final JsonCallParameter callParameter = - new JsonCallParameter( - Address.fromHexString("0xdeadbeef00000000000000000000000000000000"), - Address.fromHexString("0x6295ee1b4f6dd65047762f924ecd367c17eabf8f"), - null, - Wei.fromHexString("0x0"), - null, - null, - null, - Bytes.fromHexString("0x12a7b914"), - null, - null, - null, - null, - null); + new JsonCallParameter.JsonCallParameterBuilder() + .withFrom(Address.fromHexString("0xdeadbeef00000000000000000000000000000000")) + .withTo(Address.fromHexString("0x6295ee1b4f6dd65047762f924ecd367c17eabf8f")) + .withGasPrice(Wei.fromHexString("0x0")) + .withInput(Bytes.fromHexString("0x12a7b914")) + .build(); + final JsonRpcRequestContext request = requestWithParams(callParameter, "latest"); final JsonRpcResponse expectedResponse = new JsonRpcSuccessResponse( @@ -332,20 +261,12 @@ public class EthCallIntegrationTest { @Test public void shouldReturnSuccessWithoutGasPriceAndEmptyBalance() { final JsonCallParameter callParameter = - new JsonCallParameter( - Address.fromHexString("0xdeadbeef00000000000000000000000000000000"), - Address.fromHexString("0x6295ee1b4f6dd65047762f924ecd367c17eabf8f"), - null, - null, - null, - null, - null, - Bytes.fromHexString("0x12a7b914"), - null, - null, - null, - null, - null); + new JsonCallParameter.JsonCallParameterBuilder() + .withFrom(Address.fromHexString("0xdeadbeef00000000000000000000000000000000")) + .withTo(Address.fromHexString("0x6295ee1b4f6dd65047762f924ecd367c17eabf8f")) + .withInput(Bytes.fromHexString("0x12a7b914")) + .build(); + final JsonRpcRequestContext request = requestWithParams(callParameter, "latest"); final JsonRpcResponse expectedResponse = new JsonRpcSuccessResponse( @@ -359,20 +280,13 @@ public class EthCallIntegrationTest { @Test public void shouldReturnSuccessWithInvalidGasPricingAndEmptyBalance() { final JsonCallParameter callParameter = - new JsonCallParameter( - Address.fromHexString("0xdeadbeef00000000000000000000000000000000"), - Address.fromHexString("0x6295ee1b4f6dd65047762f924ecd367c17eabf8f"), - null, - null, - Wei.fromHexString("0x0A"), - null, - null, - Bytes.fromHexString("0x12a7b914"), - null, - null, - null, - null, - null); + new JsonCallParameter.JsonCallParameterBuilder() + .withFrom(Address.fromHexString("0xdeadbeef00000000000000000000000000000000")) + .withTo(Address.fromHexString("0x6295ee1b4f6dd65047762f924ecd367c17eabf8f")) + .withMaxPriorityFeePerGas(Wei.fromHexString("0x0A")) + .withInput(Bytes.fromHexString("0x12a7b914")) + .build(); + final JsonRpcRequestContext request = requestWithParams(callParameter, "latest"); final JsonRpcResponse expectedResponse = new JsonRpcSuccessResponse( @@ -386,20 +300,10 @@ public class EthCallIntegrationTest { @Test public void shouldReturnEmptyHashResultForCallWithOnlyToField() { final JsonCallParameter callParameter = - new JsonCallParameter( - null, - Address.fromHexString("0x6295ee1b4f6dd65047762f924ecd367c17eabf8f"), - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null); + new JsonCallParameter.JsonCallParameterBuilder() + .withTo(Address.fromHexString("0x6295ee1b4f6dd65047762f924ecd367c17eabf8f")) + .build(); + final JsonRpcRequestContext request = requestWithParams(callParameter, "latest"); final JsonRpcResponse expectedResponse = new JsonRpcSuccessResponse(null, "0x"); @@ -411,20 +315,13 @@ public class EthCallIntegrationTest { @Test public void shouldReturnSuccessWithInputAndDataFieldSetToSameValue() { final JsonCallParameter callParameter = - new JsonCallParameter( - Address.fromHexString("0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b"), - Address.fromHexString("0x6295ee1b4f6dd65047762f924ecd367c17eabf8f"), - null, - null, - null, - null, - null, - Bytes.fromHexString("0x12a7b914"), - Bytes.fromHexString("0x12a7b914"), - null, - null, - null, - null); + new JsonCallParameter.JsonCallParameterBuilder() + .withFrom(Address.fromHexString("0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b")) + .withTo(Address.fromHexString("0x6295ee1b4f6dd65047762f924ecd367c17eabf8f")) + .withInput(Bytes.fromHexString("0x12a7b914")) + .withData(Bytes.fromHexString("0x12a7b914")) + .build(); + final JsonRpcRequestContext request = requestWithParams(callParameter, "latest"); final JsonRpcResponse expectedResponse = new JsonRpcSuccessResponse( diff --git a/ethereum/api/src/integration-test/java/org/hyperledger/besu/ethereum/api/jsonrpc/methods/fork/frontier/EthCreateAccessListIntegrationTest.java b/ethereum/api/src/integration-test/java/org/hyperledger/besu/ethereum/api/jsonrpc/methods/fork/frontier/EthCreateAccessListIntegrationTest.java index e68fd29d1..49b9659fd 100644 --- a/ethereum/api/src/integration-test/java/org/hyperledger/besu/ethereum/api/jsonrpc/methods/fork/frontier/EthCreateAccessListIntegrationTest.java +++ b/ethereum/api/src/integration-test/java/org/hyperledger/besu/ethereum/api/jsonrpc/methods/fork/frontier/EthCreateAccessListIntegrationTest.java @@ -79,10 +79,11 @@ public class EthCreateAccessListIntegrationTest { "0x0000000000000000000000000000000000000000000000000000000000000003")))); final JsonCallParameter callParameter = - createAccessListJsonCallParameters( - "0x658bdf435d810c91414ec09147daa6db62406379", - "0xbb00000000000000000000000000000000000000", - null); + new JsonCallParameter.JsonCallParameterBuilder() + .withFrom(Address.fromHexString("0x658bdf435d810c91414ec09147daa6db62406379")) + .withTo(Address.fromHexString("0xbb00000000000000000000000000000000000000")) + .withAccessList(null) + .build(); assertAccessListExpectedResult(callParameter, expectedAccessListEntryList, expectedGasUsed); } @@ -101,10 +102,11 @@ public class EthCreateAccessListIntegrationTest { "0x0000000000000000000000000000000000000000000000000000000000000003")))); final JsonCallParameter callParameter = - createAccessListJsonCallParameters( - "0x658bdf435d810c91414ec09147daa6db62406379", - "0xbb00000000000000000000000000000000000000", - expectedAccessListEntryList); + new JsonCallParameter.JsonCallParameterBuilder() + .withFrom(Address.fromHexString("0x658bdf435d810c91414ec09147daa6db62406379")) + .withTo(Address.fromHexString("0xbb00000000000000000000000000000000000000")) + .withAccessList(expectedAccessListEntryList) + .build(); assertAccessListExpectedResult(callParameter, expectedAccessListEntryList, expectedGasUsed); } @@ -115,10 +117,11 @@ public class EthCreateAccessListIntegrationTest { final List expectedAccessListEntryList = new ArrayList<>(); final JsonCallParameter callParameter = - createAccessListJsonCallParameters( - "0x658bdf435d810c91414ec09147daa6db62406379", - "0x0100000000000000000000000000000000000000", - expectedAccessListEntryList); + new JsonCallParameter.JsonCallParameterBuilder() + .withFrom(Address.fromHexString("0x658bdf435d810c91414ec09147daa6db62406379")) + .withTo(Address.fromHexString("0x0100000000000000000000000000000000000000")) + .withAccessList(expectedAccessListEntryList) + .build(); assertAccessListExpectedResult(callParameter, expectedAccessListEntryList, expectedGasUsed); } @@ -129,10 +132,11 @@ public class EthCreateAccessListIntegrationTest { final List expectedAccessListEntryList = new ArrayList<>(); final JsonCallParameter callParameter = - createAccessListJsonCallParameters( - "0x658bdf435d810c91414ec09147daa6db62406379", - "0xaa00000000000000000000000000000000000000", - null); + new JsonCallParameter.JsonCallParameterBuilder() + .withFrom(Address.fromHexString("0x658bdf435d810c91414ec09147daa6db62406379")) + .withTo(Address.fromHexString("0xaa00000000000000000000000000000000000000")) + .withAccessList(null) + .build(); assertAccessListExpectedResult(callParameter, expectedAccessListEntryList, expectedGasUsed); } @@ -140,8 +144,8 @@ public class EthCreateAccessListIntegrationTest { @Test public void shouldReturnExpectedValueForEmptyCallParameter() { final JsonCallParameter callParameter = - new JsonCallParameter( - null, null, null, null, null, null, null, null, null, null, null, null, null); + new JsonCallParameter.JsonCallParameterBuilder().build(); + final JsonRpcRequestContext request = requestWithParams(callParameter); final JsonRpcResponse expectedResponse = new JsonRpcSuccessResponse(null, new CreateAccessListResult(new ArrayList<>(), 0xcf08)); @@ -154,20 +158,12 @@ public class EthCreateAccessListIntegrationTest { @Test public void shouldReturnExpectedValueForTransfer() { final JsonCallParameter callParameter = - new JsonCallParameter( - Address.fromHexString("0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b"), - Address.fromHexString("0x8888f1f195afa192cfee860698584c030f4c9db1"), - null, - null, - null, - null, - Wei.ZERO, - null, - null, - null, - null, - null, - null); + new JsonCallParameter.JsonCallParameterBuilder() + .withFrom(Address.fromHexString("0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b")) + .withTo(Address.fromHexString("0x8888f1f195afa192cfee860698584c030f4c9db1")) + .withValue(Wei.ZERO) + .build(); + final JsonRpcRequestContext request = requestWithParams(callParameter); final JsonRpcResponse expectedResponse = new JsonRpcSuccessResponse(null, new CreateAccessListResult(new ArrayList<>(), 0x5208)); @@ -180,21 +176,13 @@ public class EthCreateAccessListIntegrationTest { @Test public void shouldReturnExpectedValueForContractDeploy() { final JsonCallParameter callParameter = - new JsonCallParameter( - Address.fromHexString("0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b"), - null, - null, - null, - null, - null, - null, - Bytes.fromHexString( - "0x608060405234801561001057600080fd5b50610157806100206000396000f30060806040526004361061004c576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680633bdab8bf146100515780639ae97baa14610068575b600080fd5b34801561005d57600080fd5b5061006661007f565b005b34801561007457600080fd5b5061007d6100b9565b005b7fa53887c1eed04528e23301f55ad49a91634ef5021aa83a97d07fd16ed71c039a60016040518082815260200191505060405180910390a1565b7fa53887c1eed04528e23301f55ad49a91634ef5021aa83a97d07fd16ed71c039a60026040518082815260200191505060405180910390a17fa53887c1eed04528e23301f55ad49a91634ef5021aa83a97d07fd16ed71c039a60036040518082815260200191505060405180910390a15600a165627a7a7230582010ddaa52e73a98c06dbcd22b234b97206c1d7ed64a7c048e10c2043a3d2309cb0029"), - null, - null, - null, - null, - null); + new JsonCallParameter.JsonCallParameterBuilder() + .withFrom(Address.fromHexString("0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b")) + .withInput( + Bytes.fromHexString( + "0x608060405234801561001057600080fd5b50610157806100206000396000f30060806040526004361061004c576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680633bdab8bf146100515780639ae97baa14610068575b600080fd5b34801561005d57600080fd5b5061006661007f565b005b34801561007457600080fd5b5061007d6100b9565b005b7fa53887c1eed04528e23301f55ad49a91634ef5021aa83a97d07fd16ed71c039a60016040518082815260200191505060405180910390a1565b7fa53887c1eed04528e23301f55ad49a91634ef5021aa83a97d07fd16ed71c039a60026040518082815260200191505060405180910390a17fa53887c1eed04528e23301f55ad49a91634ef5021aa83a97d07fd16ed71c039a60036040518082815260200191505060405180910390a15600a165627a7a7230582010ddaa52e73a98c06dbcd22b234b97206c1d7ed64a7c048e10c2043a3d2309cb0029")) + .build(); + final JsonRpcRequestContext request = requestWithParams(callParameter); final JsonRpcResponse expectedResponse = new JsonRpcSuccessResponse(null, new CreateAccessListResult(new ArrayList<>(), 0x1f081)); @@ -207,21 +195,16 @@ public class EthCreateAccessListIntegrationTest { @Test public void shouldIgnoreSenderBalanceAccountWhenStrictModeDisabledAndReturnExpectedValue() { final JsonCallParameter callParameter = - new JsonCallParameter( - Address.fromHexString("0x0000000000000000000000000000000000000000"), - null, - 1L, - Wei.fromHexString("0x9999999999"), - null, - null, - null, - Bytes.fromHexString( - "0x608060405234801561001057600080fd5b50610157806100206000396000f30060806040526004361061004c576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680633bdab8bf146100515780639ae97baa14610068575b600080fd5b34801561005d57600080fd5b5061006661007f565b005b34801561007457600080fd5b5061007d6100b9565b005b7fa53887c1eed04528e23301f55ad49a91634ef5021aa83a97d07fd16ed71c039a60016040518082815260200191505060405180910390a1565b7fa53887c1eed04528e23301f55ad49a91634ef5021aa83a97d07fd16ed71c039a60026040518082815260200191505060405180910390a17fa53887c1eed04528e23301f55ad49a91634ef5021aa83a97d07fd16ed71c039a60036040518082815260200191505060405180910390a15600a165627a7a7230582010ddaa52e73a98c06dbcd22b234b97206c1d7ed64a7c048e10c2043a3d2309cb0029"), - null, - false, - null, - null, - null); + new JsonCallParameter.JsonCallParameterBuilder() + .withFrom(Address.fromHexString("0x0000000000000000000000000000000000000000")) + .withGas(1L) + .withGasPrice(Wei.fromHexString("0x9999999999")) + .withInput( + Bytes.fromHexString( + "0x608060405234801561001057600080fd5b50610157806100206000396000f30060806040526004361061004c576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680633bdab8bf146100515780639ae97baa14610068575b600080fd5b34801561005d57600080fd5b5061006661007f565b005b34801561007457600080fd5b5061007d6100b9565b005b7fa53887c1eed04528e23301f55ad49a91634ef5021aa83a97d07fd16ed71c039a60016040518082815260200191505060405180910390a1565b7fa53887c1eed04528e23301f55ad49a91634ef5021aa83a97d07fd16ed71c039a60026040518082815260200191505060405180910390a17fa53887c1eed04528e23301f55ad49a91634ef5021aa83a97d07fd16ed71c039a60036040518082815260200191505060405180910390a15600a165627a7a7230582010ddaa52e73a98c06dbcd22b234b97206c1d7ed64a7c048e10c2043a3d2309cb0029")) + .withStrict(false) + .build(); + final JsonRpcRequestContext request = requestWithParams(callParameter); final JsonRpcResponse expectedResponse = new JsonRpcSuccessResponse(null, new CreateAccessListResult(new ArrayList<>(), 0x1f081)); @@ -234,8 +217,7 @@ public class EthCreateAccessListIntegrationTest { @Test public void shouldReturnExpectedValueForInsufficientGas() { final JsonCallParameter callParameter = - new JsonCallParameter( - null, null, 1L, null, null, null, null, null, null, null, null, null, null); + new JsonCallParameter.JsonCallParameterBuilder().withGas(1L).build(); final JsonRpcRequestContext request = requestWithParams(callParameter); final JsonRpcResponse expectedResponse = new JsonRpcSuccessResponse(null, new CreateAccessListResult(new ArrayList<>(), 0xcf08)); @@ -257,24 +239,6 @@ public class EthCreateAccessListIntegrationTest { assertThat(response).usingRecursiveComparison().isEqualTo(expectedResponse); } - private JsonCallParameter createAccessListJsonCallParameters( - final String from, final String to, final List accessList) { - return new JsonCallParameter( - Address.fromHexString(from), - Address.fromHexString(to), - null, - null, - null, - null, - null, - null, - null, - null, - accessList, - null, - null); - } - private JsonRpcRequestContext requestWithParams(final Object... params) { return new JsonRpcRequestContext(new JsonRpcRequest("2.0", "eth_createAccessList", params)); } diff --git a/ethereum/api/src/integration-test/java/org/hyperledger/besu/ethereum/api/jsonrpc/methods/fork/frontier/EthEstimateGasIntegrationTest.java b/ethereum/api/src/integration-test/java/org/hyperledger/besu/ethereum/api/jsonrpc/methods/fork/frontier/EthEstimateGasIntegrationTest.java index a46153903..d17a2774e 100644 --- a/ethereum/api/src/integration-test/java/org/hyperledger/besu/ethereum/api/jsonrpc/methods/fork/frontier/EthEstimateGasIntegrationTest.java +++ b/ethereum/api/src/integration-test/java/org/hyperledger/besu/ethereum/api/jsonrpc/methods/fork/frontier/EthEstimateGasIntegrationTest.java @@ -66,8 +66,7 @@ public class EthEstimateGasIntegrationTest { @Test public void shouldReturnExpectedValueForEmptyCallParameter() { final JsonCallParameter callParameter = - new JsonCallParameter( - null, null, null, null, null, null, null, null, null, null, null, null, null); + new JsonCallParameter.JsonCallParameterBuilder().build(); final JsonRpcRequestContext request = requestWithParams(callParameter); final JsonRpcResponse expectedResponse = new JsonRpcSuccessResponse(null, "0x5208"); @@ -79,20 +78,12 @@ public class EthEstimateGasIntegrationTest { @Test public void shouldReturnExpectedValueForTransfer() { final JsonCallParameter callParameter = - new JsonCallParameter( - Address.fromHexString("0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b"), - Address.fromHexString("0x8888f1f195afa192cfee860698584c030f4c9db1"), - null, - null, - null, - null, - Wei.ONE, - null, - null, - null, - null, - null, - null); + new JsonCallParameter.JsonCallParameterBuilder() + .withFrom(Address.fromHexString("0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b")) + .withTo(Address.fromHexString("0x8888f1f195afa192cfee860698584c030f4c9db1")) + .withValue(Wei.ONE) + .build(); + final JsonRpcRequestContext request = requestWithParams(callParameter); final JsonRpcResponse expectedResponse = new JsonRpcSuccessResponse(null, "0x5208"); @@ -104,21 +95,13 @@ public class EthEstimateGasIntegrationTest { @Test public void shouldReturnExpectedValueForContractDeploy() { final JsonCallParameter callParameter = - new JsonCallParameter( - Address.fromHexString("0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b"), - null, - null, - null, - null, - null, - null, - Bytes.fromHexString( - "0x608060405234801561001057600080fd5b50610157806100206000396000f30060806040526004361061004c576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680633bdab8bf146100515780639ae97baa14610068575b600080fd5b34801561005d57600080fd5b5061006661007f565b005b34801561007457600080fd5b5061007d6100b9565b005b7fa53887c1eed04528e23301f55ad49a91634ef5021aa83a97d07fd16ed71c039a60016040518082815260200191505060405180910390a1565b7fa53887c1eed04528e23301f55ad49a91634ef5021aa83a97d07fd16ed71c039a60026040518082815260200191505060405180910390a17fa53887c1eed04528e23301f55ad49a91634ef5021aa83a97d07fd16ed71c039a60036040518082815260200191505060405180910390a15600a165627a7a7230582010ddaa52e73a98c06dbcd22b234b97206c1d7ed64a7c048e10c2043a3d2309cb0029"), - null, - null, - null, - null, - null); + new JsonCallParameter.JsonCallParameterBuilder() + .withFrom(Address.fromHexString("0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b")) + .withInput( + Bytes.fromHexString( + "0x608060405234801561001057600080fd5b50610157806100206000396000f30060806040526004361061004c576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680633bdab8bf146100515780639ae97baa14610068575b600080fd5b34801561005d57600080fd5b5061006661007f565b005b34801561007457600080fd5b5061007d6100b9565b005b7fa53887c1eed04528e23301f55ad49a91634ef5021aa83a97d07fd16ed71c039a60016040518082815260200191505060405180910390a1565b7fa53887c1eed04528e23301f55ad49a91634ef5021aa83a97d07fd16ed71c039a60026040518082815260200191505060405180910390a17fa53887c1eed04528e23301f55ad49a91634ef5021aa83a97d07fd16ed71c039a60036040518082815260200191505060405180910390a15600a165627a7a7230582010ddaa52e73a98c06dbcd22b234b97206c1d7ed64a7c048e10c2043a3d2309cb0029")) + .build(); + final JsonRpcRequestContext request = requestWithParams(callParameter); final JsonRpcResponse expectedResponse = new JsonRpcSuccessResponse(null, "0x1b551"); @@ -130,21 +113,16 @@ public class EthEstimateGasIntegrationTest { @Test public void shouldIgnoreSenderBalanceAccountWhenStrictModeDisabledAndReturnExpectedValue() { final JsonCallParameter callParameter = - new JsonCallParameter( - Address.fromHexString("0x0000000000000000000000000000000000000000"), - null, - 1L, - Wei.fromHexString("0x9999999999"), - null, - null, - null, - Bytes.fromHexString( - "0x608060405234801561001057600080fd5b50610157806100206000396000f30060806040526004361061004c576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680633bdab8bf146100515780639ae97baa14610068575b600080fd5b34801561005d57600080fd5b5061006661007f565b005b34801561007457600080fd5b5061007d6100b9565b005b7fa53887c1eed04528e23301f55ad49a91634ef5021aa83a97d07fd16ed71c039a60016040518082815260200191505060405180910390a1565b7fa53887c1eed04528e23301f55ad49a91634ef5021aa83a97d07fd16ed71c039a60026040518082815260200191505060405180910390a17fa53887c1eed04528e23301f55ad49a91634ef5021aa83a97d07fd16ed71c039a60036040518082815260200191505060405180910390a15600a165627a7a7230582010ddaa52e73a98c06dbcd22b234b97206c1d7ed64a7c048e10c2043a3d2309cb0029"), - null, - false, - null, - null, - null); + new JsonCallParameter.JsonCallParameterBuilder() + .withFrom(Address.fromHexString("0x0000000000000000000000000000000000000000")) + .withGas(1L) + .withGasPrice(Wei.fromHexString("0x9999999999")) + .withInput( + Bytes.fromHexString( + "0x608060405234801561001057600080fd5b50610157806100206000396000f30060806040526004361061004c576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680633bdab8bf146100515780639ae97baa14610068575b600080fd5b34801561005d57600080fd5b5061006661007f565b005b34801561007457600080fd5b5061007d6100b9565b005b7fa53887c1eed04528e23301f55ad49a91634ef5021aa83a97d07fd16ed71c039a60016040518082815260200191505060405180910390a1565b7fa53887c1eed04528e23301f55ad49a91634ef5021aa83a97d07fd16ed71c039a60026040518082815260200191505060405180910390a17fa53887c1eed04528e23301f55ad49a91634ef5021aa83a97d07fd16ed71c039a60036040518082815260200191505060405180910390a15600a165627a7a7230582010ddaa52e73a98c06dbcd22b234b97206c1d7ed64a7c048e10c2043a3d2309cb0029")) + .withStrict(false) + .build(); + final JsonRpcRequestContext request = requestWithParams(callParameter); final JsonRpcResponse expectedResponse = new JsonRpcSuccessResponse(null, "0x1b551"); @@ -156,21 +134,16 @@ public class EthEstimateGasIntegrationTest { @Test public void shouldNotIgnoreSenderBalanceAccountWhenStrictModeDisabledAndThrowError() { final JsonCallParameter callParameter = - new JsonCallParameter( - Address.fromHexString("0x6295ee1b4f6dd65047762f924ecd367c17eabf8f"), - null, - 1L, - Wei.fromHexString("0x9999999999"), - null, - null, - null, - Bytes.fromHexString( - "0x608060405234801561001057600080fd5b50610157806100206000396000f30060806040526004361061004c576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680633bdab8bf146100515780639ae97baa14610068575b600080fd5b34801561005d57600080fd5b5061006661007f565b005b34801561007457600080fd5b5061007d6100b9565b005b7fa53887c1eed04528e23301f55ad49a91634ef5021aa83a97d07fd16ed71c039a60016040518082815260200191505060405180910390a1565b7fa53887c1eed04528e23301f55ad49a91634ef5021aa83a97d07fd16ed71c039a60026040518082815260200191505060405180910390a17fa53887c1eed04528e23301f55ad49a91634ef5021aa83a97d07fd16ed71c039a60036040518082815260200191505060405180910390a15600a165627a7a7230582010ddaa52e73a98c06dbcd22b234b97206c1d7ed64a7c048e10c2043a3d2309cb0029"), - null, - true, - null, - null, - null); + new JsonCallParameter.JsonCallParameterBuilder() + .withFrom(Address.fromHexString("0x6295ee1b4f6dd65047762f924ecd367c17eabf8f")) + .withGas(1L) + .withGasPrice(Wei.fromHexString("0x9999999999")) + .withInput( + Bytes.fromHexString( + "0x608060405234801561001057600080fd5b50610157806100206000396000f30060806040526004361061004c576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680633bdab8bf146100515780639ae97baa14610068575b600080fd5b34801561005d57600080fd5b5061006661007f565b005b34801561007457600080fd5b5061007d6100b9565b005b7fa53887c1eed04528e23301f55ad49a91634ef5021aa83a97d07fd16ed71c039a60016040518082815260200191505060405180910390a1565b7fa53887c1eed04528e23301f55ad49a91634ef5021aa83a97d07fd16ed71c039a60026040518082815260200191505060405180910390a17fa53887c1eed04528e23301f55ad49a91634ef5021aa83a97d07fd16ed71c039a60036040518082815260200191505060405180910390a15600a165627a7a7230582010ddaa52e73a98c06dbcd22b234b97206c1d7ed64a7c048e10c2043a3d2309cb0029")) + .withStrict(true) + .build(); + final JsonRpcRequestContext request = requestWithParams(callParameter); final ValidationResult validationResult = ValidationResult.invalid( @@ -186,8 +159,7 @@ public class EthEstimateGasIntegrationTest { @Test public void shouldReturnExpectedValueForInsufficientGas() { final JsonCallParameter callParameter = - new JsonCallParameter( - null, null, 1L, null, null, null, null, null, null, null, null, null, null); + new JsonCallParameter.JsonCallParameterBuilder().withGas(1L).build(); final JsonRpcRequestContext request = requestWithParams(callParameter); final JsonRpcResponse expectedResponse = new JsonRpcSuccessResponse(null, "0x5208"); diff --git a/ethereum/api/src/integration-test/java/org/hyperledger/besu/ethereum/api/jsonrpc/methods/fork/london/EthCallIntegrationTest.java b/ethereum/api/src/integration-test/java/org/hyperledger/besu/ethereum/api/jsonrpc/methods/fork/london/EthCallIntegrationTest.java index e92076123..5f03d7f4d 100644 --- a/ethereum/api/src/integration-test/java/org/hyperledger/besu/ethereum/api/jsonrpc/methods/fork/london/EthCallIntegrationTest.java +++ b/ethereum/api/src/integration-test/java/org/hyperledger/besu/ethereum/api/jsonrpc/methods/fork/london/EthCallIntegrationTest.java @@ -64,20 +64,12 @@ public class EthCallIntegrationTest { @Test public void shouldReturnSuccessWithoutGasPriceAndEmptyBalance() { final JsonCallParameter callParameter = - new JsonCallParameter( - Address.fromHexString("0xdeadbeef00000000000000000000000000000000"), - Address.fromHexString("0x9b8397f1b0fecd3a1a40cdd5e8221fa461898517"), - null, - null, - null, - null, - null, - Bytes.fromHexString("0x2e64cec1"), - null, - null, - null, - null, - null); + new JsonCallParameter.JsonCallParameterBuilder() + .withFrom(Address.fromHexString("0xdeadbeef00000000000000000000000000000000")) + .withTo(Address.fromHexString("0x9b8397f1b0fecd3a1a40cdd5e8221fa461898517")) + .withInput(Bytes.fromHexString("0x2e64cec1")) + .build(); + final JsonRpcRequestContext request = requestWithParams(callParameter, "latest"); final JsonRpcResponse expectedResponse = new JsonRpcSuccessResponse( @@ -91,20 +83,13 @@ public class EthCallIntegrationTest { @Test public void shouldReturnErrorWithGasPriceTooHigh() { final JsonCallParameter callParameter = - new JsonCallParameter( - Address.fromHexString("0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b"), - Address.fromHexString("0x9b8397f1b0fecd3a1a40cdd5e8221fa461898517"), - null, - Wei.fromHexString("0x10000000000000"), - null, - null, - null, - Bytes.fromHexString("0x2e64cec1"), - null, - null, - null, - null, - null); + new JsonCallParameter.JsonCallParameterBuilder() + .withFrom(Address.fromHexString("0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b")) + .withTo(Address.fromHexString("0x9b8397f1b0fecd3a1a40cdd5e8221fa461898517")) + .withGasPrice(Wei.fromHexString("0x10000000000000")) + .withInput(Bytes.fromHexString("0x2e64cec1")) + .build(); + final JsonRpcRequestContext request = requestWithParams(callParameter, "latest"); final JsonRpcResponse expectedResponse = new JsonRpcErrorResponse(null, RpcErrorType.TRANSACTION_UPFRONT_COST_EXCEEDS_BALANCE); @@ -117,20 +102,13 @@ public class EthCallIntegrationTest { @Test public void shouldReturnSuccessWithValidGasPrice() { final JsonCallParameter callParameter = - new JsonCallParameter( - Address.fromHexString("0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b"), - Address.fromHexString("0x9b8397f1b0fecd3a1a40cdd5e8221fa461898517"), - null, - Wei.fromHexString("0x3B9ACA01"), - null, - null, - null, - Bytes.fromHexString("0x2e64cec1"), - null, - null, - null, - null, - null); + new JsonCallParameter.JsonCallParameterBuilder() + .withFrom(Address.fromHexString("0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b")) + .withTo(Address.fromHexString("0x9b8397f1b0fecd3a1a40cdd5e8221fa461898517")) + .withGasPrice(Wei.fromHexString("0x3B9ACA01")) + .withInput(Bytes.fromHexString("0x2e64cec1")) + .build(); + final JsonRpcRequestContext request = requestWithParams(callParameter, "latest"); final JsonRpcResponse expectedResponse = new JsonRpcSuccessResponse( @@ -144,20 +122,13 @@ public class EthCallIntegrationTest { @Test public void shouldReturnErrorWithGasPriceLessThanCurrentBaseFee() { final JsonCallParameter callParameter = - new JsonCallParameter( - Address.fromHexString("0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b"), - Address.fromHexString("0x9b8397f1b0fecd3a1a40cdd5e8221fa461898517"), - null, - Wei.fromHexString("0x0A"), - null, - null, - null, - Bytes.fromHexString("0x2e64cec1"), - null, - null, - null, - null, - null); + new JsonCallParameter.JsonCallParameterBuilder() + .withFrom(Address.fromHexString("0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b")) + .withTo(Address.fromHexString("0x9b8397f1b0fecd3a1a40cdd5e8221fa461898517")) + .withGasPrice(Wei.fromHexString("0x0A")) + .withInput(Bytes.fromHexString("0x2e64cec1")) + .build(); + final JsonRpcRequestContext request = requestWithParams(callParameter, "latest"); final JsonRpcResponse expectedResponse = new JsonRpcErrorResponse(null, RpcErrorType.GAS_PRICE_BELOW_CURRENT_BASE_FEE); @@ -170,20 +141,13 @@ public class EthCallIntegrationTest { @Test public void shouldReturnSuccessWithValidMaxFeePerGas() { final JsonCallParameter callParameter = - new JsonCallParameter( - Address.fromHexString("0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b"), - Address.fromHexString("0x9b8397f1b0fecd3a1a40cdd5e8221fa461898517"), - null, - null, - null, - Wei.fromHexString("0x3B9ACA01"), - null, - Bytes.fromHexString("0x2e64cec1"), - null, - null, - null, - null, - null); + new JsonCallParameter.JsonCallParameterBuilder() + .withFrom(Address.fromHexString("0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b")) + .withTo(Address.fromHexString("0x9b8397f1b0fecd3a1a40cdd5e8221fa461898517")) + .withMaxFeePerGas(Wei.fromHexString("0x3B9ACA01")) + .withInput(Bytes.fromHexString("0x2e64cec1")) + .build(); + final JsonRpcRequestContext request = requestWithParams(callParameter, "latest"); final JsonRpcResponse expectedResponse = new JsonRpcSuccessResponse( @@ -197,20 +161,14 @@ public class EthCallIntegrationTest { @Test public void shouldReturnSuccessWithValidMaxFeePerGasAndMaxPriorityFeePerGas() { final JsonCallParameter callParameter = - new JsonCallParameter( - Address.fromHexString("0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b"), - Address.fromHexString("0x9b8397f1b0fecd3a1a40cdd5e8221fa461898517"), - null, - null, - Wei.fromHexString("0x3B9ACA00"), - Wei.fromHexString("0x3B9ACA01"), - null, - Bytes.fromHexString("0x2e64cec1"), - null, - null, - null, - null, - null); + new JsonCallParameter.JsonCallParameterBuilder() + .withFrom(Address.fromHexString("0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b")) + .withTo(Address.fromHexString("0x9b8397f1b0fecd3a1a40cdd5e8221fa461898517")) + .withMaxPriorityFeePerGas(Wei.fromHexString("0x3B9ACA00")) + .withMaxFeePerGas(Wei.fromHexString("0x3B9ACA01")) + .withInput(Bytes.fromHexString("0x2e64cec1")) + .build(); + final JsonRpcRequestContext request = requestWithParams(callParameter, "latest"); final JsonRpcResponse expectedResponse = new JsonRpcSuccessResponse( @@ -224,20 +182,13 @@ public class EthCallIntegrationTest { @Test public void shouldReturnErrorWithValidMaxFeePerGasLessThanCurrentBaseFee() { final JsonCallParameter callParameter = - new JsonCallParameter( - Address.fromHexString("0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b"), - Address.fromHexString("0x9b8397f1b0fecd3a1a40cdd5e8221fa461898517"), - null, - null, - null, - Wei.fromHexString("0x0A"), - null, - Bytes.fromHexString("0x2e64cec1"), - null, - null, - null, - null, - null); + new JsonCallParameter.JsonCallParameterBuilder() + .withFrom(Address.fromHexString("0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b")) + .withTo(Address.fromHexString("0x9b8397f1b0fecd3a1a40cdd5e8221fa461898517")) + .withMaxFeePerGas(Wei.fromHexString("0x0A")) + .withInput(Bytes.fromHexString("0x2e64cec1")) + .build(); + final JsonRpcRequestContext request = requestWithParams(callParameter, "latest"); final JsonRpcResponse expectedResponse = new JsonRpcErrorResponse(null, RpcErrorType.GAS_PRICE_BELOW_CURRENT_BASE_FEE); @@ -250,20 +201,14 @@ public class EthCallIntegrationTest { @Test public void shouldReturnErrorWithValidMaxFeePerGasLessThanMaxPriorityFeePerGas() { final JsonCallParameter callParameter = - new JsonCallParameter( - Address.fromHexString("0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b"), - Address.fromHexString("0x9b8397f1b0fecd3a1a40cdd5e8221fa461898517"), - null, - null, - Wei.fromHexString("0x3B9ACA02"), - Wei.fromHexString("0x3B9ACA01"), - null, - Bytes.fromHexString("0x2e64cec1"), - null, - null, - null, - null, - null); + new JsonCallParameter.JsonCallParameterBuilder() + .withFrom(Address.fromHexString("0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b")) + .withTo(Address.fromHexString("0x9b8397f1b0fecd3a1a40cdd5e8221fa461898517")) + .withMaxPriorityFeePerGas(Wei.fromHexString("0x3B9ACA02")) + .withMaxFeePerGas(Wei.fromHexString("0x3B9ACA01")) + .withInput(Bytes.fromHexString("0x2e64cec1")) + .build(); + final JsonRpcRequestContext request = requestWithParams(callParameter, "latest"); final JsonRpcResponse expectedResponse = new JsonRpcErrorResponse( @@ -277,20 +222,13 @@ public class EthCallIntegrationTest { @Test public void shouldReturnErrorWithMaxFeePerGasAndEmptyBalance() { final JsonCallParameter callParameter = - new JsonCallParameter( - Address.fromHexString("0xdeadbeef00000000000000000000000000000000"), - Address.fromHexString("0x9b8397f1b0fecd3a1a40cdd5e8221fa461898517"), - null, - null, - null, - Wei.fromHexString("0x3B9ACA01"), - null, - Bytes.fromHexString("0x2e64cec1"), - null, - null, - null, - null, - null); + new JsonCallParameter.JsonCallParameterBuilder() + .withFrom(Address.fromHexString("0xdeadbeef00000000000000000000000000000000")) + .withTo(Address.fromHexString("0x9b8397f1b0fecd3a1a40cdd5e8221fa461898517")) + .withMaxFeePerGas(Wei.fromHexString("0x3B9ACA01")) + .withInput(Bytes.fromHexString("0x2e64cec1")) + .build(); + final JsonRpcRequestContext request = requestWithParams(callParameter, "latest"); final JsonRpcResponse expectedResponse = new JsonRpcErrorResponse(null, RpcErrorType.TRANSACTION_UPFRONT_COST_EXCEEDS_BALANCE); diff --git a/ethereum/api/src/integration-test/java/org/hyperledger/besu/ethereum/api/jsonrpc/methods/fork/london/EthEstimateGasIntegrationTest.java b/ethereum/api/src/integration-test/java/org/hyperledger/besu/ethereum/api/jsonrpc/methods/fork/london/EthEstimateGasIntegrationTest.java index 0a3ba1be7..84447dfc9 100644 --- a/ethereum/api/src/integration-test/java/org/hyperledger/besu/ethereum/api/jsonrpc/methods/fork/london/EthEstimateGasIntegrationTest.java +++ b/ethereum/api/src/integration-test/java/org/hyperledger/besu/ethereum/api/jsonrpc/methods/fork/london/EthEstimateGasIntegrationTest.java @@ -67,20 +67,11 @@ public class EthEstimateGasIntegrationTest { @Test public void shouldReturnExpectedValueForTransfer() { final JsonCallParameter callParameter = - new JsonCallParameter( - Address.fromHexString("0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b"), - Address.fromHexString("0x8888f1f195afa192cfee860698584c030f4c9db1"), - null, - null, - null, - null, - Wei.ONE, - null, - null, - null, - null, - null, - null); + new JsonCallParameter.JsonCallParameterBuilder() + .withFrom(Address.fromHexString("0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b")) + .withTo(Address.fromHexString("0x8888f1f195afa192cfee860698584c030f4c9db1")) + .withValue(Wei.ONE) + .build(); final JsonRpcResponse response = method.response(requestWithParams(callParameter)); final JsonRpcResponse expectedResponse = new JsonRpcSuccessResponse(null, "0x5208"); @@ -89,22 +80,13 @@ public class EthEstimateGasIntegrationTest { @Test public void shouldReturnExpectedValueForTransfer_WithAccessList() { - final JsonCallParameter callParameter = - new JsonCallParameter( - Address.fromHexString("0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b"), - Address.fromHexString("0x8888f1f195afa192cfee860698584c030f4c9db1"), - null, - null, - null, - null, - Wei.ONE, - null, - null, - null, - createAccessList(), - null, - null); + new JsonCallParameter.JsonCallParameterBuilder() + .withFrom(Address.fromHexString("0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b")) + .withTo(Address.fromHexString("0x8888f1f195afa192cfee860698584c030f4c9db1")) + .withValue(Wei.ONE) + .withAccessList(createAccessList()) + .build(); final JsonRpcResponse response = method.response(requestWithParams(callParameter)); final JsonRpcResponse expectedResponse = new JsonRpcSuccessResponse(null, "0x62d4"); @@ -114,21 +96,13 @@ public class EthEstimateGasIntegrationTest { @Test public void shouldReturnExpectedValueForContractDeploy() { final JsonCallParameter callParameter = - new JsonCallParameter( - Address.fromHexString("0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b"), - null, - null, - null, - null, - null, - null, - Bytes.fromHexString( - "0x608060405234801561001057600080fd5b50610157806100206000396000f30060806040526004361061004c576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680633bdab8bf146100515780639ae97baa14610068575b600080fd5b34801561005d57600080fd5b5061006661007f565b005b34801561007457600080fd5b5061007d6100b9565b005b7fa53887c1eed04528e23301f55ad49a91634ef5021aa83a97d07fd16ed71c039a60016040518082815260200191505060405180910390a1565b7fa53887c1eed04528e23301f55ad49a91634ef5021aa83a97d07fd16ed71c039a60026040518082815260200191505060405180910390a17fa53887c1eed04528e23301f55ad49a91634ef5021aa83a97d07fd16ed71c039a60036040518082815260200191505060405180910390a15600a165627a7a7230582010ddaa52e73a98c06dbcd22b234b97206c1d7ed64a7c048e10c2043a3d2309cb0029"), - null, - null, - null, - null, - null); + new JsonCallParameter.JsonCallParameterBuilder() + .withFrom(Address.fromHexString("0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b")) + .withInput( + Bytes.fromHexString( + "0x608060405234801561001057600080fd5b50610157806100206000396000f30060806040526004361061004c576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680633bdab8bf146100515780639ae97baa14610068575b600080fd5b34801561005d57600080fd5b5061006661007f565b005b34801561007457600080fd5b5061007d6100b9565b005b7fa53887c1eed04528e23301f55ad49a91634ef5021aa83a97d07fd16ed71c039a60016040518082815260200191505060405180910390a1565b7fa53887c1eed04528e23301f55ad49a91634ef5021aa83a97d07fd16ed71c039a60026040518082815260200191505060405180910390a17fa53887c1eed04528e23301f55ad49a91634ef5021aa83a97d07fd16ed71c039a60036040518082815260200191505060405180910390a15600a165627a7a7230582010ddaa52e73a98c06dbcd22b234b97206c1d7ed64a7c048e10c2043a3d2309cb0029")) + .build(); + final JsonRpcResponse response = method.response(requestWithParams(callParameter)); final JsonRpcResponse expectedResponse = new JsonRpcSuccessResponse(null, "0x1f081"); assertThat(response).usingRecursiveComparison().isEqualTo(expectedResponse); @@ -137,21 +111,13 @@ public class EthEstimateGasIntegrationTest { @Test public void shouldReturnExpectedValueForContractDeploy_WithAccessList() { final JsonCallParameter callParameter = - new JsonCallParameter( - Address.fromHexString("0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b"), - null, - null, - null, - null, - null, - null, - Bytes.fromHexString( - "0x608060405234801561001057600080fd5b50610157806100206000396000f30060806040526004361061004c576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680633bdab8bf146100515780639ae97baa14610068575b600080fd5b34801561005d57600080fd5b5061006661007f565b005b34801561007457600080fd5b5061007d6100b9565b005b7fa53887c1eed04528e23301f55ad49a91634ef5021aa83a97d07fd16ed71c039a60016040518082815260200191505060405180910390a1565b7fa53887c1eed04528e23301f55ad49a91634ef5021aa83a97d07fd16ed71c039a60026040518082815260200191505060405180910390a17fa53887c1eed04528e23301f55ad49a91634ef5021aa83a97d07fd16ed71c039a60036040518082815260200191505060405180910390a15600a165627a7a7230582010ddaa52e73a98c06dbcd22b234b97206c1d7ed64a7c048e10c2043a3d2309cb0029"), - null, - null, - createAccessList(), - null, - null); + new JsonCallParameter.JsonCallParameterBuilder() + .withFrom(Address.fromHexString("0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b")) + .withInput( + Bytes.fromHexString( + "0x608060405234801561001057600080fd5b50610157806100206000396000f30060806040526004361061004c576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680633bdab8bf146100515780639ae97baa14610068575b600080fd5b34801561005d57600080fd5b5061006661007f565b005b34801561007457600080fd5b5061007d6100b9565b005b7fa53887c1eed04528e23301f55ad49a91634ef5021aa83a97d07fd16ed71c039a60016040518082815260200191505060405180910390a1565b7fa53887c1eed04528e23301f55ad49a91634ef5021aa83a97d07fd16ed71c039a60026040518082815260200191505060405180910390a17fa53887c1eed04528e23301f55ad49a91634ef5021aa83a97d07fd16ed71c039a60036040518082815260200191505060405180910390a15600a165627a7a7230582010ddaa52e73a98c06dbcd22b234b97206c1d7ed64a7c048e10c2043a3d2309cb0029")) + .withAccessList(createAccessList()) + .build(); final JsonRpcResponse response = method.response(requestWithParams(callParameter)); final JsonRpcResponse expectedResponse = new JsonRpcSuccessResponse(null, "0x2014d"); diff --git a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/AbstractEstimateGas.java b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/AbstractEstimateGas.java index 237eef2e0..ef8ca5b31 100644 --- a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/AbstractEstimateGas.java +++ b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/AbstractEstimateGas.java @@ -17,7 +17,6 @@ package org.hyperledger.besu.ethereum.api.jsonrpc.internal.methods; import org.hyperledger.besu.datatypes.Wei; import org.hyperledger.besu.ethereum.api.jsonrpc.JsonRpcErrorConverter; import org.hyperledger.besu.ethereum.api.jsonrpc.internal.JsonRpcRequestContext; -import org.hyperledger.besu.ethereum.api.jsonrpc.internal.exception.InvalidJsonRpcParameters; import org.hyperledger.besu.ethereum.api.jsonrpc.internal.parameters.JsonCallParameter; import org.hyperledger.besu.ethereum.api.jsonrpc.internal.response.JsonRpcError; import org.hyperledger.besu.ethereum.api.jsonrpc.internal.response.JsonRpcErrorResponse; @@ -94,16 +93,6 @@ public abstract class AbstractEstimateGas implements JsonRpcMethod { return ((long) ((gasUsedByTransaction + gasStipend) * subCallMultiplier)); } - protected JsonCallParameter validateAndGetCallParams(final JsonRpcRequestContext request) { - final JsonCallParameter callParams = request.getRequiredParameter(0, JsonCallParameter.class); - if (callParams.getGasPrice() != null - && (callParams.getMaxFeePerGas().isPresent() - || callParams.getMaxPriorityFeePerGas().isPresent())) { - throw new InvalidJsonRpcParameters("gasPrice cannot be used with baseFee or maxFeePerGas"); - } - return callParams; - } - protected JsonRpcErrorResponse errorResponse( final JsonRpcRequestContext request, final TransactionSimulatorResult result) { diff --git a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/EthCreateAccessList.java b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/EthCreateAccessList.java index b6b9f5171..2be5047a2 100644 --- a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/EthCreateAccessList.java +++ b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/EthCreateAccessList.java @@ -14,6 +14,8 @@ */ package org.hyperledger.besu.ethereum.api.jsonrpc.internal.methods; +import static org.hyperledger.besu.ethereum.api.jsonrpc.internal.methods.JsonCallParameterUtil.validateAndGetCallParams; + import org.hyperledger.besu.datatypes.AccessListEntry; import org.hyperledger.besu.datatypes.Wei; import org.hyperledger.besu.ethereum.api.jsonrpc.RpcMethod; diff --git a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/EthEstimateGas.java b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/EthEstimateGas.java index c0631bf44..ca084ba0f 100644 --- a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/EthEstimateGas.java +++ b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/EthEstimateGas.java @@ -14,6 +14,8 @@ */ package org.hyperledger.besu.ethereum.api.jsonrpc.internal.methods; +import static org.hyperledger.besu.ethereum.api.jsonrpc.internal.methods.JsonCallParameterUtil.validateAndGetCallParams; + import org.hyperledger.besu.ethereum.api.jsonrpc.RpcMethod; import org.hyperledger.besu.ethereum.api.jsonrpc.internal.JsonRpcRequestContext; import org.hyperledger.besu.ethereum.api.jsonrpc.internal.parameters.JsonCallParameter; diff --git a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/parameters/JsonCallParameter.java b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/parameters/JsonCallParameter.java index b084ebc91..987b68c2e 100644 --- a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/parameters/JsonCallParameter.java +++ b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/parameters/JsonCallParameter.java @@ -26,68 +26,338 @@ import java.util.List; import java.util.Optional; import com.fasterxml.jackson.annotation.JsonAnySetter; -import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import org.apache.tuweni.bytes.Bytes; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +/** + * This class is used to deserialize JSON parameters for a call to the JSON-RPC method eth_call. It + * extends {@link CallParameter} by adding support for JSON-specific fields such as strict mode, + * access lists, and blob versioned hashes. It also handles unknown JSON properties gracefully. + * + *

To build an instance of this class, use the {@link JsonCallParameterBuilder}: + * + *

{@code
+ * JsonCallParameter param = new JsonCallParameter.JsonCallParameterBuilder()
+ *     .withFrom(Address.fromHexString("0x..."))
+ *     .withTo(Address.fromHexString("0x..."))
+ *     .withGas(21000L)
+ *     .withGasPrice(Wei.of(1000000000L))
+ *     .withValue(Wei.ZERO)
+ *     .withInput(Bytes.fromHexString("0x..."))
+ *     .withStrict(true) // Optional
+ *     .withAccessList(accessList) // Optional
+ *     .withMaxFeePerGas(Wei.of(2)) // Optional
+ *     .withMaxPriorityFeePerGas(Wei.of(1)) // Optional
+ *     .withMaxFeePerBlobGas(Wei.of(3)) // Optional
+ *     .withBlobVersionedHashes(blobVersionedHashes) // Optional
+ *     .build();
+ * }
+ * + *

Note: Only one of 'data' or 'input' should be provided to the builder. If both are provided + * and their values differ, an {@link IllegalArgumentException} is thrown. + * + *

Unknown JSON properties encountered during deserialization are logged but do not affect the + * deserialization process, allowing for flexibility in JSON formats. + */ @JsonIgnoreProperties(ignoreUnknown = true) +@JsonDeserialize(builder = JsonCallParameter.JsonCallParameterBuilder.class) public class JsonCallParameter extends CallParameter { private static final Logger LOG = LoggerFactory.getLogger(JsonCallParameter.class); private final Optional strict; - @JsonCreator - public JsonCallParameter( - @JsonProperty("from") final Address from, - @JsonProperty("to") final Address to, - @JsonDeserialize(using = GasDeserializer.class) @JsonProperty("gas") final Long gasLimit, - @JsonProperty("gasPrice") final Wei gasPrice, - @JsonProperty("maxPriorityFeePerGas") final Wei maxPriorityFeePerGas, - @JsonProperty("maxFeePerGas") final Wei maxFeePerGas, - @JsonProperty("value") final Wei value, - @JsonDeserialize(using = HexStringDeserializer.class) @JsonProperty("data") final Bytes data, - @JsonDeserialize(using = HexStringDeserializer.class) @JsonProperty("input") - final Bytes input, - @JsonProperty("strict") final Boolean strict, - @JsonProperty("accessList") final List accessList, - @JsonProperty("maxFeePerBlobGas") final Wei maxFeePerBlobGas, - @JsonProperty("blobVersionedHashes") final List blobVersionedHashes) { + private JsonCallParameter( + final Address from, + final Address to, + final Long gasLimit, + final Wei gasPrice, + final Optional maxPriorityFeePerGas, + final Optional maxFeePerGas, + final Wei value, + final Bytes payload, + final Optional strict, + final Optional> accessList, + final Optional maxFeePerBlobGas, + final Optional> blobVersionedHashes) { super( from, to, - gasLimit != null ? gasLimit : -1L, + gasLimit, gasPrice, - Optional.ofNullable(maxPriorityFeePerGas), - Optional.ofNullable(maxFeePerGas), + maxPriorityFeePerGas, + maxFeePerGas, value, - Optional.ofNullable(input != null ? input : data).orElse(null), - Optional.ofNullable(accessList), - Optional.ofNullable(maxFeePerBlobGas), - Optional.ofNullable(blobVersionedHashes)); + payload, + accessList, + maxFeePerBlobGas, + blobVersionedHashes); - if (input != null && data != null && !input.equals(data)) { - throw new IllegalArgumentException("Only one of 'input' or 'data' should be provided"); - } - - this.strict = Optional.ofNullable(strict); + this.strict = strict; } + /** + * Returns whether the call should be executed in strict mode. + * + * @return Optional strict mode flag + */ public Optional isMaybeStrict() { return strict; } - @JsonAnySetter - public void logUnknownProperties(final String key, final Object value) { - LOG.debug( - "unknown property - {} with value - {} and type - {} caught during serialization", - key, - value, - value.getClass()); + /** + * Builder for {@link JsonCallParameter}. Used by Jackson to deserialize {@code + * JsonCallParameter}. + */ + public static final class JsonCallParameterBuilder { + private Optional strict = Optional.empty(); + private Address from; + private Address to; + private long gas = -1; + private Optional maxPriorityFeePerGas = Optional.empty(); + private Optional maxFeePerGas = Optional.empty(); + private Optional maxFeePerBlobGas = Optional.empty(); + private Wei gasPrice; + private Wei value; + private Bytes data; + private Bytes input; + private Optional> accessList = Optional.empty(); + private Optional> blobVersionedHashes = Optional.empty(); + + /** Default constructor. */ + public JsonCallParameterBuilder() {} + + /** + * Sets the strict mode for the {@link JsonCallParameter}. If strict mode is enabled, the call + * will be executed with stricter validation rules. This is optional and defaults to not being + * in strict mode if not specified. + * + * @param strict the strict mode flag, can be {@code null} to indicate the absence of a strict + * mode preference + * @return the {@link JsonCallParameterBuilder} instance for chaining + */ + public JsonCallParameterBuilder withStrict(final Boolean strict) { + this.strict = Optional.ofNullable(strict); + return this; + } + + /** + * Sets the "from" address for the {@link JsonCallParameter}. This address represents the sender + * of the call. + * + * @param from the sender's address + * @return the {@link JsonCallParameterBuilder} instance for chaining + */ + public JsonCallParameterBuilder withFrom(final Address from) { + this.from = from; + return this; + } + + /** + * Sets the "to" address for the {@link JsonCallParameter}. This address represents the + * recipient of the call. It can be null for contract creation transactions. + * + * @param to the recipient's address + * @return the {@link JsonCallParameterBuilder} instance for chaining + */ + public JsonCallParameterBuilder withTo(final Address to) { + this.to = to; + return this; + } + + /** + * Sets the gas for the {@link JsonCallParameter} used for transaction execution. eth_call uses + * 0 gas but this parameter may be needed by some executions. By default, if not specified, the + * gas is set to -1, indicating that it is not set. + * + * @param gas the gas limit for the call, can be {@code null} to indicate that the gas limit is + * not set + * @return the {@link JsonCallParameterBuilder} instance for chaining + */ + @JsonDeserialize(using = GasDeserializer.class) + public JsonCallParameterBuilder withGas(final Long gas) { + this.gas = Optional.ofNullable(gas).orElse(-1L); + return this; + } + + /** + * Sets the maximum priority fee per gas for the {@link JsonCallParameter}. This fee is used to + * incentivize miners to include the transaction in a block. It is an optional parameter, and if + * not specified, it defaults to an empty {@link Optional}. + * + * @param maxPriorityFeePerGas the maximum priority fee per gas, can be {@code null} to indicate + * no preference + * @return the {@link JsonCallParameterBuilder} instance for chaining + */ + public JsonCallParameterBuilder withMaxPriorityFeePerGas(final Wei maxPriorityFeePerGas) { + this.maxPriorityFeePerGas = Optional.ofNullable(maxPriorityFeePerGas); + return this; + } + + /** + * Sets the maximum fee per gas for the {@link JsonCallParameter}. This fee represents the + * maximum amount of gas that the sender is willing to pay. It is an optional parameter, and if + * not specified, it defaults to an empty {@link Optional}. + * + * @param maxFeePerGas the maximum fee per gas, can be {@code null} to indicate no preference + * @return the {@link JsonCallParameterBuilder} instance for chaining + */ + public JsonCallParameterBuilder withMaxFeePerGas(final Wei maxFeePerGas) { + this.maxFeePerGas = Optional.ofNullable(maxFeePerGas); + return this; + } + + /** + * Sets the maximum fee per blob gas for the {@link JsonCallParameter}. This fee is specific to + * certain types of transactions and is an optional parameter. If not specified, it defaults to + * an empty {@link Optional}. + * + * @param maxFeePerBlobGas the maximum fee per blob gas, can be {@code null} to indicate no + * preference + * @return the {@link JsonCallParameterBuilder} instance for chaining + */ + public JsonCallParameterBuilder withMaxFeePerBlobGas(final Wei maxFeePerBlobGas) { + this.maxFeePerBlobGas = Optional.ofNullable(maxFeePerBlobGas); + return this; + } + + /** + * Sets the gas price for the {@link JsonCallParameter}. The gas price is used to calculate the + * transaction fee as the product of gas price and gas used. It is an optional parameter, and if + * not specified, it defaults to the network's current gas price. + * + * @param gasPrice the gas price, can be {@code null} to indicate that the network's current gas + * price should be used + * @return the {@link JsonCallParameterBuilder} instance for chaining + */ + public JsonCallParameterBuilder withGasPrice(final Wei gasPrice) { + this.gasPrice = gasPrice; + return this; + } + + /** + * Sets the value to be transferred with the call for the {@link JsonCallParameter}. This value + * is the amount of Wei to be transferred from the sender to the recipient. It is an optional + * parameter, and if not specified, it defaults to 0, indicating that no value is transferred. + * + * @param value the value to be transferred, can be {@code null} to indicate no value is + * transferred + * @return the {@link JsonCallParameterBuilder} instance for chaining + */ + public JsonCallParameterBuilder withValue(final Wei value) { + this.value = value; + return this; + } + + /** + * Sets the data for the {@link JsonCallParameter}. This data represents the payload of the + * call. Note: Only one of 'data' or 'input' should be provided. If both are provided and their + * values differ, an exception will be thrown during the build process. + * + * @param data the payload data + * @return the {@link JsonCallParameterBuilder} instance for chaining + */ + @JsonDeserialize(using = HexStringDeserializer.class) + public JsonCallParameterBuilder withData(final Bytes data) { + this.data = data; + return this; + } + + /** + * Sets the input for the {@link JsonCallParameter}. This input is an alternative representation + * of the payload for the call. Note: Only one of 'input' or 'data' should be provided. If both + * are provided and their values differ, an exception will be thrown during the build process. + * + * @param input the payload input + * @return the {@link JsonCallParameterBuilder} instance for chaining + */ + @JsonDeserialize(using = HexStringDeserializer.class) + public JsonCallParameterBuilder withInput(final Bytes input) { + this.input = input; + return this; + } + + /** + * Sets the access list for the {@link JsonCallParameter}. The access list is a list of + * addresses and storage keys that the transaction plans to access. This is an optional + * parameter, and if not specified, it defaults to an empty {@link Optional}. + * + * @param accessList the access list, can be {@code null} to indicate no access list is provided + * @return the {@link JsonCallParameterBuilder} instance for chaining + */ + public JsonCallParameterBuilder withAccessList(final List accessList) { + this.accessList = Optional.ofNullable(accessList); + return this; + } + + /** + * Sets the blob versioned hashes for the {@link JsonCallParameter}. This is a list of versioned + * hashes related to blob transactions, allowing for more complex transaction types. It is an + * optional parameter, and if not specified, it defaults to an empty {@link Optional}. + * + * @param blobVersionedHashes the list of versioned hashes, can be {@code null} to indicate no + * versioned hashes are provided + * @return the {@link JsonCallParameterBuilder} instance for chaining + */ + public JsonCallParameterBuilder withBlobVersionedHashes( + final List blobVersionedHashes) { + this.blobVersionedHashes = Optional.ofNullable(blobVersionedHashes); + return this; + } + + /** + * Handles unknown JSON properties during deserialization. This method is invoked when an + * unknown property is encountered in the JSON being deserialized into a {@link + * JsonCallParameter} object. It logs the unknown property's key, value, and the value's type if + * the value is not null. This allows for flexibility in JSON formats and aids in debugging + * issues related to unexpected properties. + * + * @param key the key of the unknown property + * @param value the value of the unknown property, which can be any type + */ + @JsonAnySetter + public void withUnknownProperties(final String key, final Object value) { + LOG.debug( + "unknown property - {} with value - {} and type - {} caught during serialization", + key, + value, + value != null ? value.getClass() : "NULL"); + } + + /** + * Builds a {@link JsonCallParameter} instance based on the provided parameters. This method + * also validates that only one of 'input' or 'data' is provided. If both are provided and their + * values differ, an {@link IllegalArgumentException} is thrown. This ensures the integrity of + * the payload data for the call. + * + * @return a new {@link JsonCallParameter} instance with the specified configuration + * @throws IllegalArgumentException if both 'input' and 'data' are provided and their values are + * not equal + */ + public JsonCallParameter build() { + if (input != null && data != null && !input.equals(data)) { + throw new IllegalArgumentException("Only one of 'input' or 'data' should be provided"); + } + + final Bytes payload = input != null ? input : data; + + return new JsonCallParameter( + from, + to, + gas, + gasPrice, + maxPriorityFeePerGas, + maxFeePerGas, + value, + payload, + strict, + accessList, + maxFeePerBlobGas, + blobVersionedHashes); + } } } diff --git a/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/EthCallTest.java b/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/EthCallTest.java index 261f8de50..7570fe342 100644 --- a/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/EthCallTest.java +++ b/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/EthCallTest.java @@ -115,8 +115,7 @@ public class EthCallTest { @Test public void shouldAcceptRequestWhenMissingOptionalFields() { final JsonCallParameter callParameter = - new JsonCallParameter( - null, null, null, null, null, null, null, null, null, Boolean.FALSE, null, null, null); + new JsonCallParameter.JsonCallParameterBuilder().withStrict(Boolean.FALSE).build(); final JsonRpcRequestContext request = ethCallRequest(callParameter, "latest"); final JsonRpcResponse expectedResponse = new JsonRpcSuccessResponse(null, Bytes.of().toString()); @@ -444,20 +443,16 @@ public class EthCallTest { private JsonCallParameter callParameter( final Wei gasPrice, final Wei maxFeesPerGas, final Wei maxPriorityFeesPerGas) { - return new JsonCallParameter( - Address.fromHexString("0x0"), - Address.fromHexString("0x0"), - 0L, - gasPrice, - maxFeesPerGas, - maxPriorityFeesPerGas, - Wei.ZERO, - Bytes.EMPTY, - null, - null, - null, - null, - null); + return new JsonCallParameter.JsonCallParameterBuilder() + .withFrom(Address.fromHexString("0x0")) + .withTo(Address.fromHexString("0x0")) + .withGas(0L) + .withGasPrice(gasPrice) + .withMaxFeePerGas(maxFeesPerGas) + .withMaxPriorityFeePerGas(maxPriorityFeesPerGas) + .withValue(Wei.ZERO) + .withInput(Bytes.EMPTY) + .build(); } private JsonRpcRequestContext ethCallRequest( diff --git a/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/EthCreateAccessListTest.java b/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/EthCreateAccessListTest.java index d23c10f23..8812a1e0a 100644 --- a/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/EthCreateAccessListTest.java +++ b/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/EthCreateAccessListTest.java @@ -142,7 +142,7 @@ public class EthCreateAccessListTest { Assertions.assertThatThrownBy(() -> method.response(request)) .isInstanceOf(InvalidJsonRpcParameters.class) - .hasMessageContaining("gasPrice cannot be used with baseFee or maxFeePerGas"); + .hasMessageContaining("gasPrice cannot be used with maxFeePerGas or maxPriorityFeePerGas"); } @Test @@ -305,20 +305,15 @@ public class EthCreateAccessListTest { } private JsonCallParameter legacyTransactionCallParameter(final Wei gasPrice) { - return new JsonCallParameter( - Address.fromHexString("0x0"), - Address.fromHexString("0x0"), - 0L, - gasPrice, - null, - null, - Wei.ZERO, - Bytes.EMPTY, - null, - false, - null, - null, - null); + return new JsonCallParameter.JsonCallParameterBuilder() + .withFrom(Address.fromHexString("0x0")) + .withTo(Address.fromHexString("0x0")) + .withGas(0L) + .withGasPrice(gasPrice) + .withValue(Wei.ZERO) + .withInput(Bytes.EMPTY) + .withStrict(Boolean.FALSE) + .build(); } private CallParameter eip1559TransactionCallParameter() { @@ -336,20 +331,17 @@ public class EthCreateAccessListTest { private JsonCallParameter eip1559TransactionCallParameter( final Optional gasPrice, final List accessListEntries) { - return new JsonCallParameter( - Address.fromHexString("0x0"), - Address.fromHexString("0x0"), - null, - gasPrice.orElse(null), - Wei.fromHexString("0x10"), - Wei.fromHexString("0x10"), - Wei.ZERO, - Bytes.EMPTY, - null, - false, - accessListEntries, - null, - null); + return new JsonCallParameter.JsonCallParameterBuilder() + .withFrom(Address.fromHexString("0x0")) + .withTo(Address.fromHexString("0x0")) + .withGasPrice(gasPrice.orElse(null)) + .withMaxFeePerGas(Wei.fromHexString("0x10")) + .withMaxPriorityFeePerGas(Wei.fromHexString("0x10")) + .withValue(Wei.ZERO) + .withInput(Bytes.EMPTY) + .withStrict(Boolean.FALSE) + .withAccessList(accessListEntries) + .build(); } private List createAccessList() { diff --git a/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/EthEstimateGasTest.java b/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/EthEstimateGasTest.java index aa52a31c1..a6f5008b2 100644 --- a/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/EthEstimateGasTest.java +++ b/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/EthEstimateGasTest.java @@ -167,7 +167,7 @@ public class EthEstimateGasTest { mockTransientProcessorResultGasEstimate(1L, false, false); Assertions.assertThatThrownBy(() -> method.response(request)) .isInstanceOf(InvalidJsonRpcParameters.class) - .hasMessageContaining("gasPrice cannot be used with baseFee or maxFeePerGas"); + .hasMessageContaining("gasPrice cannot be used with maxFeePerGas or maxPriorityFeePerGas"); } @Test @@ -465,20 +465,15 @@ public class EthEstimateGasTest { private JsonCallParameter legacyTransactionCallParameter( final Wei gasPrice, final boolean isStrict) { - return new JsonCallParameter( - Address.fromHexString("0x0"), - Address.fromHexString("0x0"), - 0L, - gasPrice, - null, - null, - Wei.ZERO, - Bytes.EMPTY, - null, - isStrict, - null, - null, - null); + return new JsonCallParameter.JsonCallParameterBuilder() + .withFrom(Address.fromHexString("0x0")) + .withTo(Address.fromHexString("0x0")) + .withGas(0L) + .withGasPrice(gasPrice) + .withValue(Wei.ZERO) + .withInput(Bytes.EMPTY) + .withStrict(isStrict) + .build(); } private CallParameter modifiedLegacyTransactionCallParameter(final Wei gasPrice) { @@ -499,20 +494,16 @@ public class EthEstimateGasTest { } private JsonCallParameter eip1559TransactionCallParameter(final Optional gasPrice) { - return new JsonCallParameter( - Address.fromHexString("0x0"), - Address.fromHexString("0x0"), - null, - gasPrice.orElse(null), - Wei.fromHexString("0x10"), - Wei.fromHexString("0x10"), - Wei.ZERO, - Bytes.EMPTY, - null, - false, - null, - null, - null); + return new JsonCallParameter.JsonCallParameterBuilder() + .withFrom(Address.fromHexString("0x0")) + .withTo(Address.fromHexString("0x0")) + .withGasPrice(gasPrice.orElse(null)) + .withMaxPriorityFeePerGas(Wei.fromHexString("0x10")) + .withMaxFeePerGas(Wei.fromHexString("0x10")) + .withValue(Wei.ZERO) + .withInput(Bytes.EMPTY) + .withStrict(false) + .build(); } private CallParameter modifiedEip1559TransactionCallParameter() { diff --git a/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/parameters/JsonCallParameterTest.java b/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/parameters/JsonCallParameterTest.java index b74c68f97..97d7feeeb 100644 --- a/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/parameters/JsonCallParameterTest.java +++ b/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/parameters/JsonCallParameterTest.java @@ -15,9 +15,12 @@ package org.hyperledger.besu.ethereum.api.jsonrpc.internal.parameters; import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatExceptionOfType; import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.JsonMappingException; import com.fasterxml.jackson.databind.ObjectMapper; +import org.apache.tuweni.bytes.Bytes; import org.junit.jupiter.api.Test; public class JsonCallParameterTest { @@ -25,7 +28,7 @@ public class JsonCallParameterTest { private final ObjectMapper objectMapper = new ObjectMapper(); @Test - public void acceptsAndCapMaxValueForGasLimit() throws JsonProcessingException { + public void acceptsAndCapMaxValueForGas() throws JsonProcessingException { final String json = """ { @@ -37,4 +40,79 @@ public class JsonCallParameterTest { assertThat(callParameter.getGasLimit()).isEqualTo(Long.MAX_VALUE); } + + @Test + public void dataAsPayLoad() throws JsonProcessingException { + final String json = + """ + { + "data": "0x1234" + } + """; + + final JsonCallParameter callParameter = objectMapper.readValue(json, JsonCallParameter.class); + + assertThat(callParameter.getPayload()).isEqualTo(Bytes.fromHexString("0x1234")); + } + + @Test + public void inputAsPayLoad() throws JsonProcessingException { + final String json = + """ + { + "input": "0x1234" + } + """; + + final JsonCallParameter callParameter = objectMapper.readValue(json, JsonCallParameter.class); + + assertThat(callParameter.getPayload()).isEqualTo(Bytes.fromHexString("0x1234")); + } + + @Test + public void inputAndDataWithSameValueAsPayLoad() throws JsonProcessingException { + final String json = + """ + { + "input": "0x1234", + "data": "0x1234" + } + """; + + final JsonCallParameter callParameter = objectMapper.readValue(json, JsonCallParameter.class); + + assertThat(callParameter.getPayload()).isEqualTo(Bytes.fromHexString("0x1234")); + } + + @Test + public void inputAndDataWithDifferentValueAsPayLoadCauseException() { + final String json = + """ + { + "input": "0x1234", + "data": "0x1235" + } + """; + + assertThatExceptionOfType(JsonMappingException.class) + .isThrownBy(() -> objectMapper.readValue(json, JsonCallParameter.class)) + .withMessageContaining("problem: Only one of 'input' or 'data' should be provided"); + } + + @Test + public void extraParametersAreIgnored() throws JsonProcessingException { + // 0x96 = 150 + final String json = + """ + { + "gas": "0x96", + "gasLimit": "0xfa", + "extraField": "extra" + } + """; + + final JsonCallParameter callParameter = objectMapper.readValue(json, JsonCallParameter.class); + + assertThat(callParameter.getGasLimit()).isEqualTo(150); + } } diff --git a/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/privacy/methods/priv/PrivCallTest.java b/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/privacy/methods/priv/PrivCallTest.java index 8456fa284..0919ea48e 100644 --- a/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/privacy/methods/priv/PrivCallTest.java +++ b/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/privacy/methods/priv/PrivCallTest.java @@ -75,20 +75,13 @@ public class PrivCallTest { @Test public void shouldThrowInvalidJsonRpcParametersExceptionWhenMissingToField() { final JsonCallParameter callParameter = - new JsonCallParameter( - Address.fromHexString("0x0"), - null, - 0L, - Wei.ZERO, - null, - null, - Wei.ZERO, - Bytes.EMPTY, - null, - null, - null, - null, - null); + new JsonCallParameter.JsonCallParameterBuilder() + .withFrom(Address.fromHexString("0x0")) + .withGas(0L) + .withGasPrice(Wei.ZERO) + .withValue(Wei.ZERO) + .withInput(Bytes.EMPTY) + .build(); final JsonRpcRequestContext request = ethCallRequest(privacyGroupId, callParameter, "latest"); final Throwable thrown = catchThrowable(() -> method.response(request)); @@ -113,20 +106,9 @@ public class PrivCallTest { @Test public void shouldAcceptRequestWhenMissingOptionalFields() { final JsonCallParameter callParameter = - new JsonCallParameter( - null, - Address.fromHexString("0x0"), - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null); + new JsonCallParameter.JsonCallParameterBuilder() + .withTo(Address.fromHexString("0x0")) + .build(); final JsonRpcRequestContext request = ethCallRequest(privacyGroupId, callParameter, "latest"); final JsonRpcResponse expectedResponse = new JsonRpcSuccessResponse(null, Bytes.of().toString()); @@ -196,20 +178,14 @@ public class PrivCallTest { } private JsonCallParameter callParameter() { - return new JsonCallParameter( - Address.fromHexString("0x0"), - Address.fromHexString("0x0"), - 0L, - Wei.ZERO, - null, - null, - Wei.ZERO, - Bytes.EMPTY, - null, - null, - null, - null, - null); + return new JsonCallParameter.JsonCallParameterBuilder() + .withFrom(Address.fromHexString("0x0")) + .withTo(Address.fromHexString("0x0")) + .withGas(0L) + .withGasPrice(Wei.ZERO) + .withValue(Wei.ZERO) + .withInput(Bytes.EMPTY) + .build(); } private JsonRpcRequestContext ethCallRequest( From 782553eb039a37eaa097dcf55182c610044864ae Mon Sep 17 00:00:00 2001 From: Fabio Di Fabio Date: Tue, 16 Jul 2024 11:47:16 +0200 Subject: [PATCH 57/58] Stop transaction selection on TX_EVALUATION_TOO_LONG (#7330) Signed-off-by: Fabio Di Fabio --- plugin-api/build.gradle | 2 +- .../besu/plugin/data/TransactionSelectionResult.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/plugin-api/build.gradle b/plugin-api/build.gradle index 30ab85d37..dff6cc909 100644 --- a/plugin-api/build.gradle +++ b/plugin-api/build.gradle @@ -70,7 +70,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 = 'Yv6CY8fh0yrIz3Q8Moy/j1TNGL+O8Mewp4SIgM1JE6M=' + knownHash = 'MOOKIka8Q1D64m0lU29Leq+zf1vcgeLoDVukBVQXhnY=' } check.dependsOn('checkAPIChanges') diff --git a/plugin-api/src/main/java/org/hyperledger/besu/plugin/data/TransactionSelectionResult.java b/plugin-api/src/main/java/org/hyperledger/besu/plugin/data/TransactionSelectionResult.java index 112df57a4..839c4120d 100644 --- a/plugin-api/src/main/java/org/hyperledger/besu/plugin/data/TransactionSelectionResult.java +++ b/plugin-api/src/main/java/org/hyperledger/besu/plugin/data/TransactionSelectionResult.java @@ -55,7 +55,7 @@ public class TransactionSelectionResult { BLOCK_FULL(true, false), BLOCK_OCCUPANCY_ABOVE_THRESHOLD(true, false), BLOCK_SELECTION_TIMEOUT(true, false), - TX_EVALUATION_TOO_LONG(false, true), + TX_EVALUATION_TOO_LONG(true, true), INVALID_TRANSIENT(false, false), INVALID(false, true); From 465fd1cbe56f1d50c7a2501caea444cec81fca2b Mon Sep 17 00:00:00 2001 From: Fabio Di Fabio Date: Tue, 16 Jul 2024 13:09:10 +0200 Subject: [PATCH 58/58] Fix and restore disabled block creation unit tests (#7331) Signed-off-by: Fabio Di Fabio --- .../AbstractBlockCreatorTest.java | 69 +++++++++++--- ...FeeMarketBlockTransactionSelectorTest.java | 4 - .../blockcreation/PoWBlockCreatorTest.java | 94 ++++++++++++------- ...ock-creation-fixed-difficulty-genesis.json | 34 +++++++ .../resources/block-creation-genesis.json | 32 +++++++ .../vm/TraceTransactionIntegrationTest.java | 5 +- .../resources/genesis-it.json | 13 +++ .../operations/OperationBenchmarkHelper.java | 5 +- .../core/src/jmh/resources/genesis-jmh.json | 13 +++ .../core/ExecutionContextTestFixture.java | 18 ++-- .../AbstractTransactionPoolTest.java | 9 +- .../test/resources/txpool-test-genesis.json | 15 +++ 12 files changed, 246 insertions(+), 65 deletions(-) create mode 100644 ethereum/blockcreation/src/test/resources/block-creation-fixed-difficulty-genesis.json create mode 100644 ethereum/blockcreation/src/test/resources/block-creation-genesis.json create mode 100644 ethereum/core/src/integration-test/resources/genesis-it.json create mode 100644 ethereum/core/src/jmh/resources/genesis-jmh.json create mode 100644 ethereum/eth/src/test/resources/txpool-test-genesis.json diff --git a/ethereum/blockcreation/src/test/java/org/hyperledger/besu/ethereum/blockcreation/AbstractBlockCreatorTest.java b/ethereum/blockcreation/src/test/java/org/hyperledger/besu/ethereum/blockcreation/AbstractBlockCreatorTest.java index 68d13987b..2444d9db7 100644 --- a/ethereum/blockcreation/src/test/java/org/hyperledger/besu/ethereum/blockcreation/AbstractBlockCreatorTest.java +++ b/ethereum/blockcreation/src/test/java/org/hyperledger/besu/ethereum/blockcreation/AbstractBlockCreatorTest.java @@ -26,8 +26,9 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import org.hyperledger.besu.config.GenesisConfigFile; -import org.hyperledger.besu.config.GenesisConfigOptions; import org.hyperledger.besu.crypto.KeyPair; +import org.hyperledger.besu.crypto.SECPPrivateKey; +import org.hyperledger.besu.crypto.SignatureAlgorithm; import org.hyperledger.besu.crypto.SignatureAlgorithmFactory; import org.hyperledger.besu.datatypes.Address; import org.hyperledger.besu.datatypes.BLSPublicKey; @@ -73,13 +74,18 @@ import org.hyperledger.besu.ethereum.mainnet.BodyValidation; import org.hyperledger.besu.ethereum.mainnet.ProtocolSchedule; import org.hyperledger.besu.ethereum.mainnet.ProtocolScheduleBuilder; import org.hyperledger.besu.ethereum.mainnet.ProtocolSpecAdapters; +import org.hyperledger.besu.ethereum.mainnet.TransactionValidationParams; +import org.hyperledger.besu.ethereum.mainnet.TransactionValidator; +import org.hyperledger.besu.ethereum.mainnet.TransactionValidatorFactory; +import org.hyperledger.besu.ethereum.mainnet.ValidationResult; import org.hyperledger.besu.ethereum.mainnet.WithdrawalsProcessor; -import org.hyperledger.besu.ethereum.mainnet.feemarket.CancunFeeMarket; import org.hyperledger.besu.ethereum.mainnet.requests.DepositRequestProcessor; import org.hyperledger.besu.ethereum.mainnet.requests.DepositRequestValidator; import org.hyperledger.besu.ethereum.mainnet.requests.ProcessRequestContext; import org.hyperledger.besu.ethereum.mainnet.requests.RequestProcessorCoordinator; import org.hyperledger.besu.ethereum.mainnet.requests.RequestsValidatorCoordinator; +import org.hyperledger.besu.ethereum.transaction.TransactionInvalidReason; +import org.hyperledger.besu.evm.account.Account; import org.hyperledger.besu.evm.internal.EvmConfiguration; import org.hyperledger.besu.evm.log.Log; import org.hyperledger.besu.evm.log.LogTopic; @@ -89,13 +95,13 @@ import org.hyperledger.besu.testutil.DeterministicEthScheduler; import java.math.BigInteger; import java.time.Clock; import java.util.List; -import java.util.Map; import java.util.Optional; +import com.google.common.base.Supplier; +import com.google.common.base.Suppliers; import org.apache.tuweni.bytes.Bytes; import org.apache.tuweni.bytes.Bytes32; import org.apache.tuweni.units.bigints.UInt64; -import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; @@ -103,6 +109,17 @@ import org.mockito.junit.jupiter.MockitoExtension; @ExtendWith(MockitoExtension.class) abstract class AbstractBlockCreatorTest { + private static final Supplier SIGNATURE_ALGORITHM = + Suppliers.memoize(SignatureAlgorithmFactory::getInstance); + private static final SECPPrivateKey PRIVATE_KEY1 = + SIGNATURE_ALGORITHM + .get() + .createPrivateKey( + Bytes32.fromHexString( + "8f2a55949038a9610f50fb23b5883af3b4ecb3c3bb792cbcefbd1542c692be63")); + private static final KeyPair KEYS1 = + new KeyPair(PRIVATE_KEY1, SIGNATURE_ALGORITHM.get().createPublicKey(PRIVATE_KEY1)); + @Mock private WithdrawalsProcessor withdrawalsProcessor; protected EthScheduler ethScheduler = new DeterministicEthScheduler(); @@ -301,10 +318,8 @@ abstract class AbstractBlockCreatorTest { assertThat(blockCreationResult.getBlock().getBody().getWithdrawals()).isEmpty(); } - @Disabled @Test public void computesGasUsageFromIncludedTransactions() { - final KeyPair senderKeys = SignatureAlgorithmFactory.getInstance().generateKeyPair(); final AbstractBlockCreator blockCreator = blockCreatorWithBlobGasSupport(); BlobTestFixture blobTestFixture = new BlobTestFixture(); BlobsWithCommitments bwc = blobTestFixture.createBlobsWithCommitments(6); @@ -313,13 +328,14 @@ abstract class AbstractBlockCreatorTest { ttf.to(Optional.of(Address.ZERO)) .type(TransactionType.BLOB) .chainId(Optional.of(BigInteger.valueOf(42))) + .gasLimit(21000) .maxFeePerGas(Optional.of(Wei.of(15))) .maxFeePerBlobGas(Optional.of(Wei.of(128))) .maxPriorityFeePerGas(Optional.of(Wei.of(1))) .versionedHashes(Optional.of(bwc.getVersionedHashes())) - .createTransaction(senderKeys); + .blobsWithCommitments(Optional.of(bwc)) + .createTransaction(KEYS1); - ttf.blobsWithCommitments(Optional.of(bwc)); final BlockCreationResult blockCreationResult = blockCreator.createBlock( Optional.of(List.of(fullOfBlobs)), @@ -336,13 +352,17 @@ abstract class AbstractBlockCreatorTest { } private AbstractBlockCreator blockCreatorWithBlobGasSupport() { + final var alwaysValidTransactionValidatorFactory = mock(TransactionValidatorFactory.class); + when(alwaysValidTransactionValidatorFactory.get()) + .thenReturn(new AlwaysValidTransactionValidator()); final ProtocolSpecAdapters protocolSpecAdapters = ProtocolSpecAdapters.create( 0, specBuilder -> { - specBuilder.feeMarket(new CancunFeeMarket(0, Optional.empty())); specBuilder.isReplayProtectionSupported(true); specBuilder.withdrawalsProcessor(withdrawalsProcessor); + specBuilder.transactionValidatorFactoryBuilder( + (evm, gasLimitCalculator, feeMarket) -> alwaysValidTransactionValidatorFactory); return specBuilder; }); return createBlockCreator(protocolSpecAdapters); @@ -356,16 +376,19 @@ abstract class AbstractBlockCreatorTest { } private AbstractBlockCreator blockCreatorWithoutWithdrawalsProcessor() { - return createBlockCreator(new ProtocolSpecAdapters(Map.of())); + final ProtocolSpecAdapters protocolSpecAdapters = + ProtocolSpecAdapters.create(0, specBuilder -> specBuilder.withdrawalsProcessor(null)); + return createBlockCreator(protocolSpecAdapters); } private AbstractBlockCreator createBlockCreator(final ProtocolSpecAdapters protocolSpecAdapters) { - final GenesisConfigOptions genesisConfigOptions = GenesisConfigFile.DEFAULT.getConfigOptions(); + + final var genesisConfigFile = GenesisConfigFile.fromResource("/block-creation-genesis.json"); final ExecutionContextTestFixture executionContextTestFixture = - ExecutionContextTestFixture.builder() + ExecutionContextTestFixture.builder(genesisConfigFile) .protocolSchedule( new ProtocolScheduleBuilder( - genesisConfigOptions, + genesisConfigFile.getConfigOptions(), BigInteger.valueOf(42), protocolSpecAdapters, PrivacyParameters.DEFAULT, @@ -452,4 +475,24 @@ abstract class AbstractBlockCreatorTest { .buildBlockHeader(); } } + + static class AlwaysValidTransactionValidator implements TransactionValidator { + + @Override + public ValidationResult validate( + final Transaction transaction, + final Optional baseFee, + final Optional blobBaseFee, + final TransactionValidationParams transactionValidationParams) { + return ValidationResult.valid(); + } + + @Override + public ValidationResult validateForSender( + final Transaction transaction, + final Account sender, + final TransactionValidationParams validationParams) { + return ValidationResult.valid(); + } + } } diff --git a/ethereum/blockcreation/src/test/java/org/hyperledger/besu/ethereum/blockcreation/LegacyFeeMarketBlockTransactionSelectorTest.java b/ethereum/blockcreation/src/test/java/org/hyperledger/besu/ethereum/blockcreation/LegacyFeeMarketBlockTransactionSelectorTest.java index 3b1ae938f..620638453 100644 --- a/ethereum/blockcreation/src/test/java/org/hyperledger/besu/ethereum/blockcreation/LegacyFeeMarketBlockTransactionSelectorTest.java +++ b/ethereum/blockcreation/src/test/java/org/hyperledger/besu/ethereum/blockcreation/LegacyFeeMarketBlockTransactionSelectorTest.java @@ -42,10 +42,6 @@ import org.hyperledger.besu.util.number.Fraction; import java.time.ZoneId; import java.util.function.Function; -import org.junit.jupiter.api.Disabled; - -@Disabled( - "disabled since it's flaky with a timeout see https://github.com/hyperledger/besu/issues/6850") public class LegacyFeeMarketBlockTransactionSelectorTest extends AbstractBlockTransactionSelectorTest { diff --git a/ethereum/blockcreation/src/test/java/org/hyperledger/besu/ethereum/blockcreation/PoWBlockCreatorTest.java b/ethereum/blockcreation/src/test/java/org/hyperledger/besu/ethereum/blockcreation/PoWBlockCreatorTest.java index f7fd4486d..2cd5bc5e9 100644 --- a/ethereum/blockcreation/src/test/java/org/hyperledger/besu/ethereum/blockcreation/PoWBlockCreatorTest.java +++ b/ethereum/blockcreation/src/test/java/org/hyperledger/besu/ethereum/blockcreation/PoWBlockCreatorTest.java @@ -21,7 +21,6 @@ import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; import org.hyperledger.besu.config.GenesisConfigFile; -import org.hyperledger.besu.config.GenesisConfigOptions; import org.hyperledger.besu.datatypes.Address; import org.hyperledger.besu.datatypes.Hash; import org.hyperledger.besu.datatypes.Wei; @@ -38,6 +37,7 @@ import org.hyperledger.besu.ethereum.core.MiningParameters; import org.hyperledger.besu.ethereum.core.MutableWorldState; import org.hyperledger.besu.ethereum.core.PrivacyParameters; import org.hyperledger.besu.ethereum.core.ProcessableBlockHeader; +import org.hyperledger.besu.ethereum.difficulty.fixed.FixedDifficultyCalculators; import org.hyperledger.besu.ethereum.eth.manager.EthContext; import org.hyperledger.besu.ethereum.eth.transactions.ImmutableTransactionPoolConfiguration; import org.hyperledger.besu.ethereum.eth.transactions.TransactionBroadcaster; @@ -75,6 +75,7 @@ class PoWBlockCreatorTest extends AbstractBlockCreatorTest { private static final long BLOCK_1_TIMESTAMP = Long.parseUnsignedLong("55ba4224", 16); private static final long BLOCK_1_NONCE = Long.parseLong("539bd4979fef1ec4", 16); + private static final long FIXED_DIFFICULTY_NONCE = 26; private static final Bytes BLOCK_1_EXTRA_DATA = Bytes.fromHexString("0x476574682f76312e302e302f6c696e75782f676f312e342e32"); @@ -82,24 +83,25 @@ class PoWBlockCreatorTest extends AbstractBlockCreatorTest { @Test void createMainnetBlock1() throws IOException { - final GenesisConfigOptions genesisConfigOptions = GenesisConfigFile.DEFAULT.getConfigOptions(); + final var genesisConfigFile = GenesisConfigFile.mainnet(); + + final MiningParameters miningParameters = createMiningParameters(BLOCK_1_NONCE); + final ExecutionContextTestFixture executionContextTestFixture = - ExecutionContextTestFixture.builder() + ExecutionContextTestFixture.builder(genesisConfigFile) .protocolSchedule( new ProtocolScheduleBuilder( - genesisConfigOptions, + genesisConfigFile.getConfigOptions(), BigInteger.valueOf(42), ProtocolSpecAdapters.create(0, Function.identity()), PrivacyParameters.DEFAULT, false, EvmConfiguration.DEFAULT, - MiningParameters.MINING_DISABLED, + miningParameters, new BadBlockManager()) .createProtocolSchedule()) .build(); - final MiningParameters miningParameters = createMiningParameters(); - final PoWSolver solver = new PoWSolver( miningParameters, @@ -136,26 +138,31 @@ class PoWBlockCreatorTest extends AbstractBlockCreatorTest { @Test void createMainnetBlock1_fixedDifficulty1() { - final GenesisConfigOptions genesisConfigOptions = - GenesisConfigFile.fromConfig("{\"config\": {\"ethash\": {\"fixeddifficulty\":1}}}") - .getConfigOptions(); + final var genesisConfigFile = + GenesisConfigFile.fromResource("/block-creation-fixed-difficulty-genesis.json"); + + final MiningParameters miningParameters = createMiningParameters(FIXED_DIFFICULTY_NONCE); + final ExecutionContextTestFixture executionContextTestFixture = - ExecutionContextTestFixture.builder() + ExecutionContextTestFixture.builder(genesisConfigFile) .protocolSchedule( new ProtocolScheduleBuilder( - genesisConfigOptions, + genesisConfigFile.getConfigOptions(), BigInteger.valueOf(42), - ProtocolSpecAdapters.create(0, Function.identity()), + ProtocolSpecAdapters.create( + 0, + specBuilder -> + specBuilder.difficultyCalculator( + FixedDifficultyCalculators.calculator( + genesisConfigFile.getConfigOptions()))), PrivacyParameters.DEFAULT, false, EvmConfiguration.DEFAULT, - MiningParameters.MINING_DISABLED, + miningParameters, new BadBlockManager()) .createProtocolSchedule()) .build(); - final MiningParameters miningParameters = createMiningParameters(); - final PoWSolver solver = new PoWSolver( miningParameters, @@ -184,24 +191,31 @@ class PoWBlockCreatorTest extends AbstractBlockCreatorTest { @Test void rewardBeneficiary_zeroReward_skipZeroRewardsFalse() { - final GenesisConfigOptions genesisConfigOptions = - GenesisConfigFile.fromConfig("{\"config\": {\"ethash\": {\"fixeddifficulty\":1}}}") - .getConfigOptions(); + final var genesisConfigFile = + GenesisConfigFile.fromResource("/block-creation-fixed-difficulty-genesis.json"); + + final MiningParameters miningParameters = createMiningParameters(FIXED_DIFFICULTY_NONCE); + ProtocolSchedule protocolSchedule = new ProtocolScheduleBuilder( - genesisConfigOptions, + genesisConfigFile.getConfigOptions(), BigInteger.valueOf(42), - ProtocolSpecAdapters.create(0, Function.identity()), + ProtocolSpecAdapters.create( + 0, + specBuilder -> + specBuilder.difficultyCalculator( + FixedDifficultyCalculators.calculator( + genesisConfigFile.getConfigOptions()))), PrivacyParameters.DEFAULT, false, EvmConfiguration.DEFAULT, - MiningParameters.MINING_DISABLED, + miningParameters, new BadBlockManager()) .createProtocolSchedule(); final ExecutionContextTestFixture executionContextTestFixture = - ExecutionContextTestFixture.builder().protocolSchedule(protocolSchedule).build(); - - final MiningParameters miningParameters = createMiningParameters(); + ExecutionContextTestFixture.builder(genesisConfigFile) + .protocolSchedule(protocolSchedule) + .build(); final PoWSolver solver = new PoWSolver( @@ -253,24 +267,31 @@ class PoWBlockCreatorTest extends AbstractBlockCreatorTest { @Test void rewardBeneficiary_zeroReward_skipZeroRewardsTrue() { - final GenesisConfigOptions genesisConfigOptions = - GenesisConfigFile.fromConfig("{\"config\": {\"ethash\": {\"fixeddifficulty\":1}}}") - .getConfigOptions(); + final var genesisConfigFile = + GenesisConfigFile.fromResource("/block-creation-fixed-difficulty-genesis.json"); + + final MiningParameters miningParameters = createMiningParameters(FIXED_DIFFICULTY_NONCE); + ProtocolSchedule protocolSchedule = new ProtocolScheduleBuilder( - genesisConfigOptions, + genesisConfigFile.getConfigOptions(), BigInteger.valueOf(42), - ProtocolSpecAdapters.create(0, Function.identity()), + ProtocolSpecAdapters.create( + 0, + specBuilder -> + specBuilder.difficultyCalculator( + FixedDifficultyCalculators.calculator( + genesisConfigFile.getConfigOptions()))), PrivacyParameters.DEFAULT, false, EvmConfiguration.DEFAULT, - MiningParameters.MINING_DISABLED, + miningParameters, new BadBlockManager()) .createProtocolSchedule(); final ExecutionContextTestFixture executionContextTestFixture = - ExecutionContextTestFixture.builder().protocolSchedule(protocolSchedule).build(); - - final MiningParameters miningParameters = createMiningParameters(); + ExecutionContextTestFixture.builder(genesisConfigFile) + .protocolSchedule(protocolSchedule) + .build(); final PoWSolver solver = new PoWSolver( @@ -348,11 +369,12 @@ class PoWBlockCreatorTest extends AbstractBlockCreatorTest { return transactionPool; } - private MiningParameters createMiningParameters() { + private MiningParameters createMiningParameters(final long nonce) { return ImmutableMiningParameters.builder() .mutableInitValues( MutableInitValues.builder() - .nonceGenerator(Lists.newArrayList(BLOCK_1_NONCE)) + .nonceGenerator(Lists.newArrayList(nonce)) + // .nonceGenerator(new IncrementingNonceGenerator(0)) .extraData(BLOCK_1_EXTRA_DATA) .minTransactionGasPrice(Wei.ONE) .coinbase(BLOCK_1_COINBASE) diff --git a/ethereum/blockcreation/src/test/resources/block-creation-fixed-difficulty-genesis.json b/ethereum/blockcreation/src/test/resources/block-creation-fixed-difficulty-genesis.json new file mode 100644 index 000000000..5f9a821a8 --- /dev/null +++ b/ethereum/blockcreation/src/test/resources/block-creation-fixed-difficulty-genesis.json @@ -0,0 +1,34 @@ +{ + "config": { + "chainId": 42, + "frontierBlock": 0, + "ethash": { + "fixeddifficulty":10 + } + }, + "nonce": "0x42", + "timestamp": "0x0", + "extraData": "", + "gasLimit": "0x1fffffffffffff", + "difficulty": "0x1", + "mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "coinbase": "0x0000000000000000000000000000000000000000", + "baseFeePerGas": "0x7", + "alloc": { + "fe3b557e8fb62b89f4916b721be55ceb828dbd73": { + "privateKey": "8f2a55949038a9610f50fb23b5883af3b4ecb3c3bb792cbcefbd1542c692be63", + "comment": "private key and this comment are ignored. In a real chain, the private key should NOT be stored", + "balance": "0xad78ebc5ac6200000" + }, + "627306090abaB3A6e1400e9345bC60c78a8BEf57": { + "privateKey": "c87509a1c067bbde78beb793e6fa76530b6382a4c0241e5e4a9ec0a0f44dc0d3", + "comment": "private key and this comment are ignored. In a real chain, the private key should NOT be stored", + "balance": "90000000000000000000000" + }, + "f17f52151EbEF6C7334FAD080c5704D77216b732": { + "privateKey": "ae6ae8e5ccbfb04590405997ee2d52d2b330726137b875053c36d94e974d162f", + "comment": "private key and this comment are ignored. In a real chain, the private key should NOT be stored", + "balance": "90000000000000000000000" + } + } +} diff --git a/ethereum/blockcreation/src/test/resources/block-creation-genesis.json b/ethereum/blockcreation/src/test/resources/block-creation-genesis.json new file mode 100644 index 000000000..4a26c5ae0 --- /dev/null +++ b/ethereum/blockcreation/src/test/resources/block-creation-genesis.json @@ -0,0 +1,32 @@ +{ + "config": { + "chainId": 42, + "cancunTime": 0, + "terminalTotalDifficulty": 0 + }, + "nonce": "0x42", + "timestamp": "0x0", + "extraData": "", + "gasLimit": "0x1fffffffffffff", + "difficulty": "0x10000", + "mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "coinbase": "0x0000000000000000000000000000000000000000", + "baseFeePerGas": "0x7", + "alloc": { + "fe3b557e8fb62b89f4916b721be55ceb828dbd73": { + "privateKey": "8f2a55949038a9610f50fb23b5883af3b4ecb3c3bb792cbcefbd1542c692be63", + "comment": "private key and this comment are ignored. In a real chain, the private key should NOT be stored", + "balance": "0xad78ebc5ac6200000" + }, + "627306090abaB3A6e1400e9345bC60c78a8BEf57": { + "privateKey": "c87509a1c067bbde78beb793e6fa76530b6382a4c0241e5e4a9ec0a0f44dc0d3", + "comment": "private key and this comment are ignored. In a real chain, the private key should NOT be stored", + "balance": "90000000000000000000000" + }, + "f17f52151EbEF6C7334FAD080c5704D77216b732": { + "privateKey": "ae6ae8e5ccbfb04590405997ee2d52d2b330726137b875053c36d94e974d162f", + "comment": "private key and this comment are ignored. In a real chain, the private key should NOT be stored", + "balance": "90000000000000000000000" + } + } +} diff --git a/ethereum/core/src/integration-test/java/org/hyperledger/besu/ethereum/vm/TraceTransactionIntegrationTest.java b/ethereum/core/src/integration-test/java/org/hyperledger/besu/ethereum/vm/TraceTransactionIntegrationTest.java index edae52f35..a029c4b4a 100644 --- a/ethereum/core/src/integration-test/java/org/hyperledger/besu/ethereum/vm/TraceTransactionIntegrationTest.java +++ b/ethereum/core/src/integration-test/java/org/hyperledger/besu/ethereum/vm/TraceTransactionIntegrationTest.java @@ -18,6 +18,7 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.entry; import static org.hyperledger.besu.evm.operation.BlockHashOperation.BlockHashLookup; +import org.hyperledger.besu.config.GenesisConfigFile; import org.hyperledger.besu.crypto.KeyPair; import org.hyperledger.besu.crypto.SignatureAlgorithmFactory; import org.hyperledger.besu.datatypes.TransactionType; @@ -68,7 +69,9 @@ public class TraceTransactionIntegrationTest { @BeforeEach public void setUp() { - final ExecutionContextTestFixture contextTestFixture = ExecutionContextTestFixture.create(); + final ExecutionContextTestFixture contextTestFixture = + ExecutionContextTestFixture.builder(GenesisConfigFile.fromResource("/genesis-it.json")) + .build(); genesisBlock = contextTestFixture.getGenesis(); blockchain = contextTestFixture.getBlockchain(); worldStateArchive = contextTestFixture.getStateArchive(); diff --git a/ethereum/core/src/integration-test/resources/genesis-it.json b/ethereum/core/src/integration-test/resources/genesis-it.json new file mode 100644 index 000000000..70c42b39f --- /dev/null +++ b/ethereum/core/src/integration-test/resources/genesis-it.json @@ -0,0 +1,13 @@ +{ + "config": { + "petersburgBlock": 0 + }, + "coinbase": "0x0000000000000000000000000000000000000000", + "difficulty": "0x0000001", + "extraData": "", + "gasLimit": "0x2fefd8", + "nonce": "0x0000000000000107", + "mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "timestamp": "0x00" +} diff --git a/ethereum/core/src/jmh/java/org/hyperledger/besu/ethereum/vm/operations/OperationBenchmarkHelper.java b/ethereum/core/src/jmh/java/org/hyperledger/besu/ethereum/vm/operations/OperationBenchmarkHelper.java index 8307a8fef..4289a91a3 100644 --- a/ethereum/core/src/jmh/java/org/hyperledger/besu/ethereum/vm/operations/OperationBenchmarkHelper.java +++ b/ethereum/core/src/jmh/java/org/hyperledger/besu/ethereum/vm/operations/OperationBenchmarkHelper.java @@ -16,6 +16,7 @@ package org.hyperledger.besu.ethereum.vm.operations; import static java.util.Collections.emptyList; +import org.hyperledger.besu.config.GenesisConfigFile; import org.hyperledger.besu.ethereum.chain.Blockchain; import org.hyperledger.besu.ethereum.chain.MutableBlockchain; import org.hyperledger.besu.ethereum.core.Block; @@ -74,7 +75,9 @@ public class OperationBenchmarkHelper { KeyValueSegmentIdentifier.BLOCKCHAIN, optimisticRocksDBColumnarKeyValueStorage); final ExecutionContextTestFixture executionContext = - ExecutionContextTestFixture.builder().blockchainKeyValueStorage(keyValueStorage).build(); + ExecutionContextTestFixture.builder(GenesisConfigFile.fromResource("/genesis-jmh.json")) + .blockchainKeyValueStorage(keyValueStorage) + .build(); final MutableBlockchain blockchain = executionContext.getBlockchain(); for (int i = 1; i < 256; i++) { diff --git a/ethereum/core/src/jmh/resources/genesis-jmh.json b/ethereum/core/src/jmh/resources/genesis-jmh.json new file mode 100644 index 000000000..70c42b39f --- /dev/null +++ b/ethereum/core/src/jmh/resources/genesis-jmh.json @@ -0,0 +1,13 @@ +{ + "config": { + "petersburgBlock": 0 + }, + "coinbase": "0x0000000000000000000000000000000000000000", + "difficulty": "0x0000001", + "extraData": "", + "gasLimit": "0x2fefd8", + "nonce": "0x0000000000000107", + "mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "timestamp": "0x00" +} diff --git a/ethereum/core/src/test-support/java/org/hyperledger/besu/ethereum/core/ExecutionContextTestFixture.java b/ethereum/core/src/test-support/java/org/hyperledger/besu/ethereum/core/ExecutionContextTestFixture.java index 3aa483e1a..5aa00d0ed 100644 --- a/ethereum/core/src/test-support/java/org/hyperledger/besu/ethereum/core/ExecutionContextTestFixture.java +++ b/ethereum/core/src/test-support/java/org/hyperledger/besu/ethereum/core/ExecutionContextTestFixture.java @@ -17,7 +17,6 @@ package org.hyperledger.besu.ethereum.core; import static org.hyperledger.besu.ethereum.core.InMemoryKeyValueStorageProvider.createInMemoryWorldStateArchive; import org.hyperledger.besu.config.GenesisConfigFile; -import org.hyperledger.besu.config.StubGenesisConfigOptions; import org.hyperledger.besu.ethereum.ProtocolContext; import org.hyperledger.besu.ethereum.chain.BadBlockManager; import org.hyperledger.besu.ethereum.chain.DefaultBlockchain; @@ -48,9 +47,9 @@ public class ExecutionContextTestFixture { private final ProtocolSchedule protocolSchedule; private final ProtocolContext protocolContext; - private static final GenesisConfigFile genesisConfigFile = GenesisConfigFile.mainnet(); private ExecutionContextTestFixture( + final GenesisConfigFile genesisConfigFile, final ProtocolSchedule protocolSchedule, final KeyValueStorage blockchainKeyValueStorage, final KeyValueStorage variablesKeyValueStorage) { @@ -76,11 +75,11 @@ public class ExecutionContextTestFixture { } public static ExecutionContextTestFixture create() { - return new Builder().build(); + return new Builder(GenesisConfigFile.mainnet()).build(); } - public static Builder builder() { - return new Builder(); + public static Builder builder(final GenesisConfigFile genesisConfigFile) { + return new Builder(genesisConfigFile); } public Block getGenesis() { @@ -112,10 +111,15 @@ public class ExecutionContextTestFixture { } public static class Builder { + private final GenesisConfigFile genesisConfigFile; private KeyValueStorage variablesKeyValueStorage; private KeyValueStorage blockchainKeyValueStorage; private ProtocolSchedule protocolSchedule; + public Builder(final GenesisConfigFile genesisConfigFile) { + this.genesisConfigFile = genesisConfigFile; + } + public Builder variablesKeyValueStorage(final KeyValueStorage keyValueStorage) { this.variablesKeyValueStorage = keyValueStorage; return this; @@ -135,7 +139,7 @@ public class ExecutionContextTestFixture { if (protocolSchedule == null) { protocolSchedule = new ProtocolScheduleBuilder( - new StubGenesisConfigOptions().petersburgBlock(0), + genesisConfigFile.getConfigOptions(), BigInteger.valueOf(42), ProtocolSpecAdapters.create(0, Function.identity()), new PrivacyParameters(), @@ -152,7 +156,7 @@ public class ExecutionContextTestFixture { variablesKeyValueStorage = new InMemoryKeyValueStorage(); } return new ExecutionContextTestFixture( - protocolSchedule, variablesKeyValueStorage, blockchainKeyValueStorage); + genesisConfigFile, protocolSchedule, variablesKeyValueStorage, blockchainKeyValueStorage); } } } diff --git a/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/transactions/AbstractTransactionPoolTest.java b/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/transactions/AbstractTransactionPoolTest.java index 39b47bf9d..23eb9d02b 100644 --- a/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/transactions/AbstractTransactionPoolTest.java +++ b/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/transactions/AbstractTransactionPoolTest.java @@ -43,7 +43,7 @@ import static org.mockito.Mockito.verifyNoMoreInteractions; import static org.mockito.Mockito.when; import static org.mockito.quality.Strictness.LENIENT; -import org.hyperledger.besu.config.StubGenesisConfigOptions; +import org.hyperledger.besu.config.GenesisConfigFile; import org.hyperledger.besu.crypto.KeyPair; import org.hyperledger.besu.crypto.SignatureAlgorithmFactory; import org.hyperledger.besu.datatypes.Address; @@ -191,9 +191,10 @@ public abstract class AbstractTransactionPoolTest { protected abstract ExecutionContextTestFixture createExecutionContextTestFixture(); protected static ExecutionContextTestFixture createExecutionContextTestFixtureBaseFeeMarket() { + final var genesisConfigFile = GenesisConfigFile.fromResource("/txpool-test-genesis.json"); final ProtocolSchedule protocolSchedule = new ProtocolScheduleBuilder( - new StubGenesisConfigOptions().londonBlock(0L).baseFeePerGas(10L), + genesisConfigFile.getConfigOptions(), BigInteger.valueOf(1), ProtocolSpecAdapters.create(0, Function.identity()), new PrivacyParameters(), @@ -203,7 +204,9 @@ public abstract class AbstractTransactionPoolTest { new BadBlockManager()) .createProtocolSchedule(); final ExecutionContextTestFixture executionContextTestFixture = - ExecutionContextTestFixture.builder().protocolSchedule(protocolSchedule).build(); + ExecutionContextTestFixture.builder(genesisConfigFile) + .protocolSchedule(protocolSchedule) + .build(); final Block block = new Block( diff --git a/ethereum/eth/src/test/resources/txpool-test-genesis.json b/ethereum/eth/src/test/resources/txpool-test-genesis.json new file mode 100644 index 000000000..d6a19fe70 --- /dev/null +++ b/ethereum/eth/src/test/resources/txpool-test-genesis.json @@ -0,0 +1,15 @@ +{ + "config": { + "chainId": 1, + "cancunTime": 0, + "terminalTotalDifficulty": 0 + }, + "nonce": "0x42", + "timestamp": "0x0", + "extraData": "", + "gasLimit": "0x1fffffffffffff", + "difficulty": "0x10000", + "mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "coinbase": "0x0000000000000000000000000000000000000000", + "baseFeePerGas": "0xA" +}

The command's functionality is defined in the run() method, which is overridden from the + * Runnable interface. + */ +@Command( + name = COMMAND_NAME, + description = "Execute an Ethereum Blockchain Test.", + mixinStandardHelpOptions = true, + versionProvider = VersionProvider.class) +public class BlockchainTestSubCommand implements Runnable { + /** + * The name of the command for the BlockchainTestSubCommand. This constant is used as the name + * parameter in the @CommandLine.Command annotation. It defines the command name that users should + * enter on the command line to invoke this command. + */ + public static final String COMMAND_NAME = "block-test"; + + static final Supplier referenceTestProtocolSchedules = + Suppliers.memoize(ReferenceTestProtocolSchedules::create); + + @Option( + names = {"--test-name"}, + description = "Limit execution to one named test.") + private String testName = null; + + @ParentCommand private final EvmToolCommand parentCommand; + + // picocli does it magically + @Parameters private final List blockchainTestFiles = new ArrayList<>(); + + /** + * Default constructor for the BlockchainTestSubCommand class. This constructor doesn't take any + * arguments and initializes the parentCommand to null. PicoCLI requires this constructor. + */ + @SuppressWarnings("unused") + public BlockchainTestSubCommand() { + // PicoCLI requires this + this(null); + } + + BlockchainTestSubCommand(final EvmToolCommand parentCommand) { + this.parentCommand = parentCommand; + } + + @Override + public void run() { + // presume ethereum mainnet for reference and state tests + SignatureAlgorithmFactory.setDefaultInstance(); + final ObjectMapper blockchainTestMapper = JsonUtils.createObjectMapper(); + + final JavaType javaType = + blockchainTestMapper + .getTypeFactory() + .constructParametricType( + Map.class, String.class, BlockchainReferenceTestCaseSpec.class); + try { + if (blockchainTestFiles.isEmpty()) { + // if no state tests were specified, use standard input to get filenames + final BufferedReader in = + new BufferedReader(new InputStreamReader(parentCommand.in, UTF_8)); + while (true) { + final String fileName = in.readLine(); + if (fileName == null) { + // Reached end-of-file. Stop the loop. + break; + } + final File file = new File(fileName); + if (file.isFile()) { + final Map blockchainTests = + blockchainTestMapper.readValue(file, javaType); + executeBlockchainTest(blockchainTests); + } else { + parentCommand.out.println("File not found: " + fileName); + } + } + } else { + for (final Path blockchainTestFile : blockchainTestFiles) { + final Map blockchainTests; + if ("stdin".equals(blockchainTestFile.toString())) { + blockchainTests = blockchainTestMapper.readValue(parentCommand.in, javaType); + } else { + blockchainTests = blockchainTestMapper.readValue(blockchainTestFile.toFile(), javaType); + } + executeBlockchainTest(blockchainTests); + } + } + } catch (final JsonProcessingException jpe) { + parentCommand.out.println("File content error: " + jpe); + } catch (final IOException e) { + System.err.println("Unable to read state file"); + e.printStackTrace(System.err); + } + } + + private void executeBlockchainTest( + final Map blockchainTests) { + blockchainTests.forEach(this::traceTestSpecs); + } + + private void traceTestSpecs(final String test, final BlockchainReferenceTestCaseSpec spec) { + if (testName != null && !testName.equals(test)) { + parentCommand.out.println("Skipping test: " + test); + return; + } + parentCommand.out.println("Considering " + test); + + final BlockHeader genesisBlockHeader = spec.getGenesisBlockHeader(); + final MutableWorldState worldState = + spec.getWorldStateArchive() + .getMutable(genesisBlockHeader.getStateRoot(), genesisBlockHeader.getHash()) + .orElseThrow(); + + final ProtocolSchedule schedule = + referenceTestProtocolSchedules.get().getByName(spec.getNetwork()); + + final MutableBlockchain blockchain = spec.getBlockchain(); + final ProtocolContext context = spec.getProtocolContext(); + + for (final BlockchainReferenceTestCaseSpec.CandidateBlock candidateBlock : + spec.getCandidateBlocks()) { + if (!candidateBlock.isExecutable()) { + return; + } + + try { + final Block block = candidateBlock.getBlock(); + + final ProtocolSpec protocolSpec = schedule.getByBlockHeader(block.getHeader()); + final BlockImporter blockImporter = protocolSpec.getBlockImporter(); + + verifyJournaledEVMAccountCompatability(worldState, protocolSpec); + + final HeaderValidationMode validationMode = + "NoProof".equalsIgnoreCase(spec.getSealEngine()) + ? HeaderValidationMode.LIGHT + : HeaderValidationMode.FULL; + final BlockImportResult importResult = + blockImporter.importBlock(context, block, validationMode, validationMode); + + if (importResult.isImported() != candidateBlock.isValid()) { + parentCommand.out.printf( + "Block %d (%s) %s%n", + block.getHeader().getNumber(), + block.getHash(), + importResult.isImported() ? "Failed to be rejected" : "Failed to import"); + } else { + parentCommand.out.printf( + "Block %d (%s) %s%n", + block.getHeader().getNumber(), + block.getHash(), + importResult.isImported() ? "Imported" : "Rejected (correctly)"); + } + } catch (final RLPException e) { + if (candidateBlock.isValid()) { + parentCommand.out.printf( + "Block %d (%s) should have imported but had an RLP exception %s%n", + candidateBlock.getBlock().getHeader().getNumber(), + candidateBlock.getBlock().getHash(), + e.getMessage()); + } + } + } + if (!blockchain.getChainHeadHash().equals(spec.getLastBlockHash())) { + parentCommand.out.printf( + "Chain header mismatch, have %s want %s - %s%n", + blockchain.getChainHeadHash(), spec.getLastBlockHash(), test); + } else { + parentCommand.out.println("Chain import successful - " + test); + } + } + + void verifyJournaledEVMAccountCompatability( + final MutableWorldState worldState, final ProtocolSpec protocolSpec) { + EVM evm = protocolSpec.getEvm(); + if (evm.getEvmConfiguration().worldUpdaterMode() == WorldUpdaterMode.JOURNALED) { + if (worldState + .streamAccounts(Bytes32.ZERO, Integer.MAX_VALUE) + .anyMatch(AccountState::isEmpty)) { + parentCommand.out.println("Journaled account configured and empty account detected"); + } + + if (EvmSpecVersion.SPURIOUS_DRAGON.compareTo(evm.getEvmVersion()) > 0) { + parentCommand.out.println( + "Journaled account configured and fork prior to the merge specified"); + } + } + } +} diff --git a/ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/EvmToolCommand.java b/ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/EvmToolCommand.java index a3bed6b54..898f1dd4b 100644 --- a/ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/EvmToolCommand.java +++ b/ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/EvmToolCommand.java @@ -101,6 +101,7 @@ import picocli.CommandLine.Option; subcommands = { BenchmarkSubCommand.class, B11rSubCommand.class, + BlockchainTestSubCommand.class, CodeValidateSubCommand.class, EOFTestSubCommand.class, PrettyPrintSubCommand.class, @@ -370,15 +371,18 @@ public class EvmToolCommand implements Runnable { public void run() { LogConfigurator.setLevel("", "OFF"); try { + GenesisFileModule genesisFileModule; + if (network != null) { + genesisFileModule = GenesisFileModule.createGenesisModule(network); + } else if (genesisFile != null) { + genesisFileModule = GenesisFileModule.createGenesisModule(genesisFile); + } else { + genesisFileModule = GenesisFileModule.createGenesisModule(NetworkName.DEV); + } final EvmToolComponent component = DaggerEvmToolComponent.builder() .dataStoreModule(new DataStoreModule()) - .genesisFileModule( - network == null - ? genesisFile == null - ? GenesisFileModule.createGenesisModule(NetworkName.DEV) - : GenesisFileModule.createGenesisModule(genesisFile) - : GenesisFileModule.createGenesisModule(network)) + .genesisFileModule(genesisFileModule) .evmToolCommandOptionsModule(daggerOptions) .metricsSystemModule(new MetricsSystemModule()) .build(); diff --git a/ethereum/evmtool/src/test/java/org/hyperledger/besu/evmtool/EvmToolSpecTests.java b/ethereum/evmtool/src/test/java/org/hyperledger/besu/evmtool/EvmToolSpecTests.java index 1892a472b..66efb574f 100644 --- a/ethereum/evmtool/src/test/java/org/hyperledger/besu/evmtool/EvmToolSpecTests.java +++ b/ethereum/evmtool/src/test/java/org/hyperledger/besu/evmtool/EvmToolSpecTests.java @@ -53,6 +53,10 @@ public class EvmToolSpecTests { static final ObjectMapper objectMapper = new ObjectMapper(); static final ObjectReader specReader = objectMapper.reader(); + public static Object[][] blocktestTests() { + return findSpecFiles(new String[] {"block-test"}); + } + public static Object[][] b11rTests() { return findSpecFiles(new String[] {"b11r"}); } @@ -114,7 +118,14 @@ public class EvmToolSpecTests { } @ParameterizedTest(name = "{0}") - @MethodSource({"b11rTests", "prettyPrintTests", "stateTestTests", "t8nTests", "traceTests"}) + @MethodSource({ + "blocktestTests", + "b11rTests", + "prettyPrintTests", + "stateTestTests", + "t8nTests", + "traceTests" + }) void testBySpec( final String file, final JsonNode cliNode, diff --git a/ethereum/evmtool/src/test/resources/org/hyperledger/besu/evmtool/block-test/prague-eof-rjump.json b/ethereum/evmtool/src/test/resources/org/hyperledger/besu/evmtool/block-test/prague-eof-rjump.json new file mode 100644 index 000000000..b9d2e5417 --- /dev/null +++ b/ethereum/evmtool/src/test/resources/org/hyperledger/besu/evmtool/block-test/prague-eof-rjump.json @@ -0,0 +1,250 @@ +{ + "cli": [ + "block-test", + "stdin" + ], + "stdin": { + "tests/prague/eip7692_eof_v1/eip4200_relative_jumps/test_rjump.py::test_rjump_zero[fork_PragueEIP7692-blockchain_test]": { + "network": "Prague", + "genesisBlockHeader": { + "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "uncleHash": "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347", + "coinbase": "0x0000000000000000000000000000000000000000", + "stateRoot": "0x34ccf8774a5b8833da9451a3f7f8a0af0147956c058f0831dab07c348d7ac0d9", + "transactionsTrie": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "receiptTrie": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "bloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "difficulty": "0x00", + "number": "0x00", + "gasLimit": "0x016345785d8a0000", + "gasUsed": "0x00", + "timestamp": "0x00", + "extraData": "0x00", + "mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "nonce": "0x0000000000000000", + "baseFeePerGas": "0x07", + "withdrawalsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "blobGasUsed": "0x00", + "excessBlobGas": "0x00", + "parentBeaconBlockRoot": "0x0000000000000000000000000000000000000000000000000000000000000000", + "requestsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "hash": "0xc9397e8a1b99cbb2b885852fde56de8fa686091a4f4430163f5237d7aaf33a14" + }, + "pre": { + "0x00000000219ab540356cbb839cbe05303d7705fa": { + "nonce": "0x01", + "balance": "0x00", + "code": "0x60806040526004361061003f5760003560e01c806301ffc9a71461004457806322895118146100a4578063621fd130146101ba578063c5f2892f14610244575b600080fd5b34801561005057600080fd5b506100906004803603602081101561006757600080fd5b50357fffffffff000000000000000000000000000000000000000000000000000000001661026b565b604080519115158252519081900360200190f35b6101b8600480360360808110156100ba57600080fd5b8101906020810181356401000000008111156100d557600080fd5b8201836020820111156100e757600080fd5b8035906020019184600183028401116401000000008311171561010957600080fd5b91939092909160208101903564010000000081111561012757600080fd5b82018360208201111561013957600080fd5b8035906020019184600183028401116401000000008311171561015b57600080fd5b91939092909160208101903564010000000081111561017957600080fd5b82018360208201111561018b57600080fd5b803590602001918460018302840111640100000000831117156101ad57600080fd5b919350915035610304565b005b3480156101c657600080fd5b506101cf6110b5565b6040805160208082528351818301528351919283929083019185019080838360005b838110156102095781810151838201526020016101f1565b50505050905090810190601f1680156102365780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561025057600080fd5b506102596110c7565b60408051918252519081900360200190f35b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a70000000000000000000000000000000000000000000000000000000014806102fe57507fffffffff0000000000000000000000000000000000000000000000000000000082167f8564090700000000000000000000000000000000000000000000000000000000145b92915050565b6030861461035d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806118056026913960400191505060405180910390fd5b602084146103b6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603681526020018061179c6036913960400191505060405180910390fd5b6060821461040f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260298152602001806118786029913960400191505060405180910390fd5b670de0b6b3a7640000341015610470576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806118526026913960400191505060405180910390fd5b633b9aca003406156104cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260338152602001806117d26033913960400191505060405180910390fd5b633b9aca00340467ffffffffffffffff811115610535576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602781526020018061182b6027913960400191505060405180910390fd5b6060610540826114ba565b90507f649bbc62d0e31342afea4e5cd82d4049e7e1ee912fc0889aa790803be39038c589898989858a8a6105756020546114ba565b6040805160a0808252810189905290819060208201908201606083016080840160c085018e8e80828437600083820152601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01690910187810386528c815260200190508c8c808284376000838201819052601f9091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01690920188810386528c5181528c51602091820193918e019250908190849084905b83811015610648578181015183820152602001610630565b50505050905090810190601f1680156106755780820380516001836020036101000a031916815260200191505b5086810383528881526020018989808284376000838201819052601f9091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169092018881038452895181528951602091820193918b019250908190849084905b838110156106ef5781810151838201526020016106d7565b50505050905090810190601f16801561071c5780820380516001836020036101000a031916815260200191505b509d505050505050505050505050505060405180910390a1600060028a8a600060801b604051602001808484808284377fffffffffffffffffffffffffffffffff0000000000000000000000000000000090941691909301908152604080517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0818403018152601090920190819052815191955093508392506020850191508083835b602083106107fc57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016107bf565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa158015610859573d6000803e3d6000fd5b5050506040513d602081101561086e57600080fd5b5051905060006002806108846040848a8c6116fe565b6040516020018083838082843780830192505050925050506040516020818303038152906040526040518082805190602001908083835b602083106108f857805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016108bb565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa158015610955573d6000803e3d6000fd5b5050506040513d602081101561096a57600080fd5b5051600261097b896040818d6116fe565b60405160009060200180848480828437919091019283525050604080518083038152602092830191829052805190945090925082918401908083835b602083106109f457805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016109b7565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa158015610a51573d6000803e3d6000fd5b5050506040513d6020811015610a6657600080fd5b5051604080516020818101949094528082019290925280518083038201815260609092019081905281519192909182918401908083835b60208310610ada57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610a9d565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa158015610b37573d6000803e3d6000fd5b5050506040513d6020811015610b4c57600080fd5b50516040805160208101858152929350600092600292839287928f928f92018383808284378083019250505093505050506040516020818303038152906040526040518082805190602001908083835b60208310610bd957805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610b9c565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa158015610c36573d6000803e3d6000fd5b5050506040513d6020811015610c4b57600080fd5b50516040518651600291889160009188916020918201918291908601908083835b60208310610ca957805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610c6c565b6001836020036101000a0380198251168184511680821785525050505050509050018367ffffffffffffffff191667ffffffffffffffff1916815260180182815260200193505050506040516020818303038152906040526040518082805190602001908083835b60208310610d4e57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610d11565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa158015610dab573d6000803e3d6000fd5b5050506040513d6020811015610dc057600080fd5b5051604080516020818101949094528082019290925280518083038201815260609092019081905281519192909182918401908083835b60208310610e3457805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610df7565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa158015610e91573d6000803e3d6000fd5b5050506040513d6020811015610ea657600080fd5b50519050858114610f02576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260548152602001806117486054913960600191505060405180910390fd5b60205463ffffffff11610f60576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806117276021913960400191505060405180910390fd5b602080546001019081905560005b60208110156110a9578160011660011415610fa0578260008260208110610f9157fe5b0155506110ac95505050505050565b600260008260208110610faf57fe5b01548460405160200180838152602001828152602001925050506040516020818303038152906040526040518082805190602001908083835b6020831061102557805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610fe8565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa158015611082573d6000803e3d6000fd5b5050506040513d602081101561109757600080fd5b50519250600282049150600101610f6e565b50fe5b50505050505050565b60606110c26020546114ba565b905090565b6020546000908190815b60208110156112f05781600116600114156111e6576002600082602081106110f557fe5b01548460405160200180838152602001828152602001925050506040516020818303038152906040526040518082805190602001908083835b6020831061116b57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909201916020918201910161112e565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa1580156111c8573d6000803e3d6000fd5b5050506040513d60208110156111dd57600080fd5b505192506112e2565b600283602183602081106111f657fe5b015460405160200180838152602001828152602001925050506040516020818303038152906040526040518082805190602001908083835b6020831061126b57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909201916020918201910161122e565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa1580156112c8573d6000803e3d6000fd5b5050506040513d60208110156112dd57600080fd5b505192505b6002820491506001016110d1565b506002826112ff6020546114ba565b600060401b6040516020018084815260200183805190602001908083835b6020831061135a57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909201916020918201910161131d565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790527fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000095909516920191825250604080518083037ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8018152601890920190819052815191955093508392850191508083835b6020831061143f57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101611402565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa15801561149c573d6000803e3d6000fd5b5050506040513d60208110156114b157600080fd5b50519250505090565b60408051600880825281830190925260609160208201818036833701905050905060c082901b8060071a60f81b826000815181106114f457fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508060061a60f81b8260018151811061153757fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508060051a60f81b8260028151811061157a57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508060041a60f81b826003815181106115bd57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508060031a60f81b8260048151811061160057fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508060021a60f81b8260058151811061164357fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508060011a60f81b8260068151811061168657fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508060001a60f81b826007815181106116c957fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535050919050565b6000808585111561170d578182fd5b83861115611719578182fd5b505082019391909203915056fe4465706f736974436f6e74726163743a206d65726b6c6520747265652066756c6c4465706f736974436f6e74726163743a207265636f6e7374727563746564204465706f7369744461746120646f6573206e6f74206d6174636820737570706c696564206465706f7369745f646174615f726f6f744465706f736974436f6e74726163743a20696e76616c6964207769746864726177616c5f63726564656e7469616c73206c656e6774684465706f736974436f6e74726163743a206465706f7369742076616c7565206e6f74206d756c7469706c65206f6620677765694465706f736974436f6e74726163743a20696e76616c6964207075626b6579206c656e6774684465706f736974436f6e74726163743a206465706f7369742076616c756520746f6f20686967684465706f736974436f6e74726163743a206465706f7369742076616c756520746f6f206c6f774465706f736974436f6e74726163743a20696e76616c6964207369676e6174757265206c656e677468a2646970667358221220dceca8706b29e917dacf25fceef95acac8d90d765ac926663ce4096195952b6164736f6c634300060b0033", + "storage": { + "0x22": "0xf5a5fd42d16a20302798ef6ed309979b43003d2320d9f0e8ea9831a92759fb4b", + "0x23": "0xdb56114e00fdd4c1f85c892bf35ac9a89289aaecb1ebd0a96cde606a748b5d71", + "0x24": "0xc78009fdf07fc56a11f122370658a353aaa542ed63e44c4bc15ff4cd105ab33c", + "0x25": "0x536d98837f2dd165a55d5eeae91485954472d56f246df256bf3cae19352a123c", + "0x26": "0x9efde052aa15429fae05bad4d0b1d7c64da64d03d7a1854a588c2cb8430c0d30", + "0x27": "0xd88ddfeed400a8755596b21942c1497e114c302e6118290f91e6772976041fa1", + "0x28": "0x87eb0ddba57e35f6d286673802a4af5975e22506c7cf4c64bb6be5ee11527f2c", + "0x29": "0x26846476fd5fc54a5d43385167c95144f2643f533cc85bb9d16b782f8d7db193", + "0x2a": "0x506d86582d252405b840018792cad2bf1259f1ef5aa5f887e13cb2f0094f51e1", + "0x2b": "0xffff0ad7e659772f9534c195c815efc4014ef1e1daed4404c06385d11192e92b", + "0x2c": "0x6cf04127db05441cd833107a52be852868890e4317e6a02ab47683aa75964220", + "0x2d": "0xb7d05f875f140027ef5118a2247bbb84ce8f2f0f1123623085daf7960c329f5f", + "0x2e": "0xdf6af5f5bbdb6be9ef8aa618e4bf8073960867171e29676f8b284dea6a08a85e", + "0x2f": "0xb58d900f5e182e3c50ef74969ea16c7726c549757cc23523c369587da7293784", + "0x30": "0xd49a7502ffcfb0340b1d7885688500ca308161a7f96b62df9d083b71fcc8f2bb", + "0x31": "0x8fe6b1689256c0d385f42f5bbe2027a22c1996e110ba97c171d3e5948de92beb", + "0x32": "0x8d0d63c39ebade8509e0ae3c9c3876fb5fa112be18f905ecacfecb92057603ab", + "0x33": "0x95eec8b2e541cad4e91de38385f2e046619f54496c2382cb6cacd5b98c26f5a4", + "0x34": "0xf893e908917775b62bff23294dbbe3a1cd8e6cc1c35b4801887b646a6f81f17f", + "0x35": "0xcddba7b592e3133393c16194fac7431abf2f5485ed711db282183c819e08ebaa", + "0x36": "0x8a8d7fe3af8caa085a7639a832001457dfb9128a8061142ad0335629ff23ff9c", + "0x37": "0xfeb3c337d7a51a6fbf00b9e34c52e1c9195c969bd4e7a0bfd51d5c5bed9c1167", + "0x38": "0xe71f0aa83cc32edfbefa9f4d3e0174ca85182eec9f3a09f6a6c0df6377a510d7", + "0x39": "0x31206fa80a50bb6abe29085058f16212212a60eec8f049fecb92d8c8e0a84bc0", + "0x3a": "0x21352bfecbeddde993839f614c3dac0a3ee37543f9b412b16199dc158e23b544", + "0x3b": "0x619e312724bb6d7c3153ed9de791d764a366b389af13c58bf8a8d90481a46765", + "0x3c": "0x7cdd2986268250628d0c10e385c58c6191e6fbe05191bcc04f133f2cea72c1c4", + "0x3d": "0x848930bd7ba8cac54661072113fb278869e07bb8587f91392933374d017bcbe1", + "0x3e": "0x8869ff2c22b28cc10510d9853292803328be4fb0e80495e8bb8d271f5b889636", + "0x3f": "0xb5fe28e79f1b850f8658246ce9b6a1e7b49fc06db7143e8fe0b4f2b0c5523a5c", + "0x40": "0x985e929f70af28d0bdd1a90a808f977f597c7c778c489e98d3bd8910d31ac0f7" + } + }, + "0x00a3ca265ebcb825b45f985a16cefb49958ce017": { + "nonce": "0x01", + "balance": "0x00", + "code": "0x3373fffffffffffffffffffffffffffffffffffffffe146090573615156028575f545f5260205ff35b366038141561012e5760115f54600182026001905f5b5f82111560595781019083028483029004916001019190603e565b90939004341061012e57600154600101600155600354806003026004013381556001015f3581556001016020359055600101600355005b6003546002548082038060101160a4575060105b5f5b81811460dd5780604c02838201600302600401805490600101805490600101549160601b83528260140152906034015260010160a6565b910180921460ed579060025560f8565b90505f6002555f6003555b5f548061049d141561010757505f5b60015460028282011161011c5750505f610122565b01600290035b5f555f600155604c025ff35b5f5ffd", + "storage": {} + }, + "0x0aae40965e6800cd9b1f4b05ff21581047e3f91e": { + "nonce": "0x01", + "balance": "0x00", + "code": "0x3373fffffffffffffffffffffffffffffffffffffffe1460575767ffffffffffffffff5f3511605357600143035f3511604b575f35612000014311604b57611fff5f3516545f5260205ff35b5f5f5260205ff35b5f5ffd5b5f35611fff60014303165500", + "storage": {} + }, + "0x000f3df6d732807ef1319fb7b8bb8522d0beac02": { + "nonce": "0x01", + "balance": "0x00", + "code": "0x3373fffffffffffffffffffffffffffffffffffffffe14604d57602036146024575f5ffd5b5f35801560495762001fff810690815414603c575f5ffd5b62001fff01545f5260205ff35b5f5ffd5b62001fff42064281555f359062001fff015500", + "storage": {} + }, + "0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b": { + "nonce": "0x00", + "balance": "0x3635c9adc5dea00000", + "code": "0x", + "storage": {} + }, + "0x0000000000000000000000000000000000001000": { + "nonce": "0x01", + "balance": "0x00", + "code": "0xef0001010004020001000a0400000000800002e0000061201560015500", + "storage": {} + } + }, + "postState": { + "0x0000000000000000000000000000000000001000": { + "nonce": "0x01", + "balance": "0x00", + "code": "0xef0001010004020001000a0400000000800002e0000061201560015500", + "storage": { + "0x01": "0x2015" + } + }, + "0x00000000219ab540356cbb839cbe05303d7705fa": { + "nonce": "0x01", + "balance": "0x00", + "code": "0x60806040526004361061003f5760003560e01c806301ffc9a71461004457806322895118146100a4578063621fd130146101ba578063c5f2892f14610244575b600080fd5b34801561005057600080fd5b506100906004803603602081101561006757600080fd5b50357fffffffff000000000000000000000000000000000000000000000000000000001661026b565b604080519115158252519081900360200190f35b6101b8600480360360808110156100ba57600080fd5b8101906020810181356401000000008111156100d557600080fd5b8201836020820111156100e757600080fd5b8035906020019184600183028401116401000000008311171561010957600080fd5b91939092909160208101903564010000000081111561012757600080fd5b82018360208201111561013957600080fd5b8035906020019184600183028401116401000000008311171561015b57600080fd5b91939092909160208101903564010000000081111561017957600080fd5b82018360208201111561018b57600080fd5b803590602001918460018302840111640100000000831117156101ad57600080fd5b919350915035610304565b005b3480156101c657600080fd5b506101cf6110b5565b6040805160208082528351818301528351919283929083019185019080838360005b838110156102095781810151838201526020016101f1565b50505050905090810190601f1680156102365780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561025057600080fd5b506102596110c7565b60408051918252519081900360200190f35b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a70000000000000000000000000000000000000000000000000000000014806102fe57507fffffffff0000000000000000000000000000000000000000000000000000000082167f8564090700000000000000000000000000000000000000000000000000000000145b92915050565b6030861461035d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806118056026913960400191505060405180910390fd5b602084146103b6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603681526020018061179c6036913960400191505060405180910390fd5b6060821461040f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260298152602001806118786029913960400191505060405180910390fd5b670de0b6b3a7640000341015610470576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806118526026913960400191505060405180910390fd5b633b9aca003406156104cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260338152602001806117d26033913960400191505060405180910390fd5b633b9aca00340467ffffffffffffffff811115610535576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602781526020018061182b6027913960400191505060405180910390fd5b6060610540826114ba565b90507f649bbc62d0e31342afea4e5cd82d4049e7e1ee912fc0889aa790803be39038c589898989858a8a6105756020546114ba565b6040805160a0808252810189905290819060208201908201606083016080840160c085018e8e80828437600083820152601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01690910187810386528c815260200190508c8c808284376000838201819052601f9091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01690920188810386528c5181528c51602091820193918e019250908190849084905b83811015610648578181015183820152602001610630565b50505050905090810190601f1680156106755780820380516001836020036101000a031916815260200191505b5086810383528881526020018989808284376000838201819052601f9091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169092018881038452895181528951602091820193918b019250908190849084905b838110156106ef5781810151838201526020016106d7565b50505050905090810190601f16801561071c5780820380516001836020036101000a031916815260200191505b509d505050505050505050505050505060405180910390a1600060028a8a600060801b604051602001808484808284377fffffffffffffffffffffffffffffffff0000000000000000000000000000000090941691909301908152604080517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0818403018152601090920190819052815191955093508392506020850191508083835b602083106107fc57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016107bf565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa158015610859573d6000803e3d6000fd5b5050506040513d602081101561086e57600080fd5b5051905060006002806108846040848a8c6116fe565b6040516020018083838082843780830192505050925050506040516020818303038152906040526040518082805190602001908083835b602083106108f857805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016108bb565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa158015610955573d6000803e3d6000fd5b5050506040513d602081101561096a57600080fd5b5051600261097b896040818d6116fe565b60405160009060200180848480828437919091019283525050604080518083038152602092830191829052805190945090925082918401908083835b602083106109f457805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016109b7565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa158015610a51573d6000803e3d6000fd5b5050506040513d6020811015610a6657600080fd5b5051604080516020818101949094528082019290925280518083038201815260609092019081905281519192909182918401908083835b60208310610ada57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610a9d565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa158015610b37573d6000803e3d6000fd5b5050506040513d6020811015610b4c57600080fd5b50516040805160208101858152929350600092600292839287928f928f92018383808284378083019250505093505050506040516020818303038152906040526040518082805190602001908083835b60208310610bd957805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610b9c565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa158015610c36573d6000803e3d6000fd5b5050506040513d6020811015610c4b57600080fd5b50516040518651600291889160009188916020918201918291908601908083835b60208310610ca957805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610c6c565b6001836020036101000a0380198251168184511680821785525050505050509050018367ffffffffffffffff191667ffffffffffffffff1916815260180182815260200193505050506040516020818303038152906040526040518082805190602001908083835b60208310610d4e57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610d11565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa158015610dab573d6000803e3d6000fd5b5050506040513d6020811015610dc057600080fd5b5051604080516020818101949094528082019290925280518083038201815260609092019081905281519192909182918401908083835b60208310610e3457805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610df7565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa158015610e91573d6000803e3d6000fd5b5050506040513d6020811015610ea657600080fd5b50519050858114610f02576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260548152602001806117486054913960600191505060405180910390fd5b60205463ffffffff11610f60576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806117276021913960400191505060405180910390fd5b602080546001019081905560005b60208110156110a9578160011660011415610fa0578260008260208110610f9157fe5b0155506110ac95505050505050565b600260008260208110610faf57fe5b01548460405160200180838152602001828152602001925050506040516020818303038152906040526040518082805190602001908083835b6020831061102557805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610fe8565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa158015611082573d6000803e3d6000fd5b5050506040513d602081101561109757600080fd5b50519250600282049150600101610f6e565b50fe5b50505050505050565b60606110c26020546114ba565b905090565b6020546000908190815b60208110156112f05781600116600114156111e6576002600082602081106110f557fe5b01548460405160200180838152602001828152602001925050506040516020818303038152906040526040518082805190602001908083835b6020831061116b57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909201916020918201910161112e565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa1580156111c8573d6000803e3d6000fd5b5050506040513d60208110156111dd57600080fd5b505192506112e2565b600283602183602081106111f657fe5b015460405160200180838152602001828152602001925050506040516020818303038152906040526040518082805190602001908083835b6020831061126b57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909201916020918201910161122e565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa1580156112c8573d6000803e3d6000fd5b5050506040513d60208110156112dd57600080fd5b505192505b6002820491506001016110d1565b506002826112ff6020546114ba565b600060401b6040516020018084815260200183805190602001908083835b6020831061135a57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909201916020918201910161131d565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790527fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000095909516920191825250604080518083037ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8018152601890920190819052815191955093508392850191508083835b6020831061143f57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101611402565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa15801561149c573d6000803e3d6000fd5b5050506040513d60208110156114b157600080fd5b50519250505090565b60408051600880825281830190925260609160208201818036833701905050905060c082901b8060071a60f81b826000815181106114f457fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508060061a60f81b8260018151811061153757fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508060051a60f81b8260028151811061157a57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508060041a60f81b826003815181106115bd57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508060031a60f81b8260048151811061160057fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508060021a60f81b8260058151811061164357fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508060011a60f81b8260068151811061168657fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508060001a60f81b826007815181106116c957fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535050919050565b6000808585111561170d578182fd5b83861115611719578182fd5b505082019391909203915056fe4465706f736974436f6e74726163743a206d65726b6c6520747265652066756c6c4465706f736974436f6e74726163743a207265636f6e7374727563746564204465706f7369744461746120646f6573206e6f74206d6174636820737570706c696564206465706f7369745f646174615f726f6f744465706f736974436f6e74726163743a20696e76616c6964207769746864726177616c5f63726564656e7469616c73206c656e6774684465706f736974436f6e74726163743a206465706f7369742076616c7565206e6f74206d756c7469706c65206f6620677765694465706f736974436f6e74726163743a20696e76616c6964207075626b6579206c656e6774684465706f736974436f6e74726163743a206465706f7369742076616c756520746f6f20686967684465706f736974436f6e74726163743a206465706f7369742076616c756520746f6f206c6f774465706f736974436f6e74726163743a20696e76616c6964207369676e6174757265206c656e677468a2646970667358221220dceca8706b29e917dacf25fceef95acac8d90d765ac926663ce4096195952b6164736f6c634300060b0033", + "storage": { + "0x22": "0xf5a5fd42d16a20302798ef6ed309979b43003d2320d9f0e8ea9831a92759fb4b", + "0x23": "0xdb56114e00fdd4c1f85c892bf35ac9a89289aaecb1ebd0a96cde606a748b5d71", + "0x24": "0xc78009fdf07fc56a11f122370658a353aaa542ed63e44c4bc15ff4cd105ab33c", + "0x25": "0x536d98837f2dd165a55d5eeae91485954472d56f246df256bf3cae19352a123c", + "0x26": "0x9efde052aa15429fae05bad4d0b1d7c64da64d03d7a1854a588c2cb8430c0d30", + "0x27": "0xd88ddfeed400a8755596b21942c1497e114c302e6118290f91e6772976041fa1", + "0x28": "0x87eb0ddba57e35f6d286673802a4af5975e22506c7cf4c64bb6be5ee11527f2c", + "0x29": "0x26846476fd5fc54a5d43385167c95144f2643f533cc85bb9d16b782f8d7db193", + "0x2a": "0x506d86582d252405b840018792cad2bf1259f1ef5aa5f887e13cb2f0094f51e1", + "0x2b": "0xffff0ad7e659772f9534c195c815efc4014ef1e1daed4404c06385d11192e92b", + "0x2c": "0x6cf04127db05441cd833107a52be852868890e4317e6a02ab47683aa75964220", + "0x2d": "0xb7d05f875f140027ef5118a2247bbb84ce8f2f0f1123623085daf7960c329f5f", + "0x2e": "0xdf6af5f5bbdb6be9ef8aa618e4bf8073960867171e29676f8b284dea6a08a85e", + "0x2f": "0xb58d900f5e182e3c50ef74969ea16c7726c549757cc23523c369587da7293784", + "0x30": "0xd49a7502ffcfb0340b1d7885688500ca308161a7f96b62df9d083b71fcc8f2bb", + "0x31": "0x8fe6b1689256c0d385f42f5bbe2027a22c1996e110ba97c171d3e5948de92beb", + "0x32": "0x8d0d63c39ebade8509e0ae3c9c3876fb5fa112be18f905ecacfecb92057603ab", + "0x33": "0x95eec8b2e541cad4e91de38385f2e046619f54496c2382cb6cacd5b98c26f5a4", + "0x34": "0xf893e908917775b62bff23294dbbe3a1cd8e6cc1c35b4801887b646a6f81f17f", + "0x35": "0xcddba7b592e3133393c16194fac7431abf2f5485ed711db282183c819e08ebaa", + "0x36": "0x8a8d7fe3af8caa085a7639a832001457dfb9128a8061142ad0335629ff23ff9c", + "0x37": "0xfeb3c337d7a51a6fbf00b9e34c52e1c9195c969bd4e7a0bfd51d5c5bed9c1167", + "0x38": "0xe71f0aa83cc32edfbefa9f4d3e0174ca85182eec9f3a09f6a6c0df6377a510d7", + "0x39": "0x31206fa80a50bb6abe29085058f16212212a60eec8f049fecb92d8c8e0a84bc0", + "0x3a": "0x21352bfecbeddde993839f614c3dac0a3ee37543f9b412b16199dc158e23b544", + "0x3b": "0x619e312724bb6d7c3153ed9de791d764a366b389af13c58bf8a8d90481a46765", + "0x3c": "0x7cdd2986268250628d0c10e385c58c6191e6fbe05191bcc04f133f2cea72c1c4", + "0x3d": "0x848930bd7ba8cac54661072113fb278869e07bb8587f91392933374d017bcbe1", + "0x3e": "0x8869ff2c22b28cc10510d9853292803328be4fb0e80495e8bb8d271f5b889636", + "0x3f": "0xb5fe28e79f1b850f8658246ce9b6a1e7b49fc06db7143e8fe0b4f2b0c5523a5c", + "0x40": "0x985e929f70af28d0bdd1a90a808f977f597c7c778c489e98d3bd8910d31ac0f7" + } + }, + "0x000f3df6d732807ef1319fb7b8bb8522d0beac02": { + "nonce": "0x01", + "balance": "0x00", + "code": "0x3373fffffffffffffffffffffffffffffffffffffffe14604d57602036146024575f5ffd5b5f35801560495762001fff810690815414603c575f5ffd5b62001fff01545f5260205ff35b5f5ffd5b62001fff42064281555f359062001fff015500", + "storage": { + "0x03e8": "0x03e8" + } + }, + "0x00a3ca265ebcb825b45f985a16cefb49958ce017": { + "nonce": "0x01", + "balance": "0x00", + "code": "0x3373fffffffffffffffffffffffffffffffffffffffe146090573615156028575f545f5260205ff35b366038141561012e5760115f54600182026001905f5b5f82111560595781019083028483029004916001019190603e565b90939004341061012e57600154600101600155600354806003026004013381556001015f3581556001016020359055600101600355005b6003546002548082038060101160a4575060105b5f5b81811460dd5780604c02838201600302600401805490600101805490600101549160601b83528260140152906034015260010160a6565b910180921460ed579060025560f8565b90505f6002555f6003555b5f548061049d141561010757505f5b60015460028282011161011c5750505f610122565b01600290035b5f555f600155604c025ff35b5f5ffd", + "storage": {} + }, + "0x0aae40965e6800cd9b1f4b05ff21581047e3f91e": { + "nonce": "0x01", + "balance": "0x00", + "code": "0x3373fffffffffffffffffffffffffffffffffffffffe1460575767ffffffffffffffff5f3511605357600143035f3511604b575f35612000014311604b57611fff5f3516545f5260205ff35b5f5f5260205ff35b5f5ffd5b5f35611fff60014303165500", + "storage": { + "0x00": "0xc9397e8a1b99cbb2b885852fde56de8fa686091a4f4430163f5237d7aaf33a14" + } + }, + "0x2adc25665018aa1fe0e6bc666dac8fc2697ff9ba": { + "nonce": "0x00", + "balance": "0x01f92c", + "code": "0x", + "storage": {} + }, + "0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b": { + "nonce": "0x01", + "balance": "0x3635c9adc5de996c18", + "code": "0x", + "storage": {} + } + }, + "genesisRLP": "0xf90262f9025ba00000000000000000000000000000000000000000000000000000000000000000a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347940000000000000000000000000000000000000000a034ccf8774a5b8833da9451a3f7f8a0af0147956c058f0831dab07c348d7ac0d9a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000808088016345785d8a0000808000a0000000000000000000000000000000000000000000000000000000000000000088000000000000000007a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b4218080a00000000000000000000000000000000000000000000000000000000000000000a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421c0c0c0c0", + "blocks": [ + { + "blockHeader": { + "parentHash": "0xc9397e8a1b99cbb2b885852fde56de8fa686091a4f4430163f5237d7aaf33a14", + "uncleHash": "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347", + "coinbase": "0x2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "stateRoot": "0x1a4885d1f64bac16e5ab17fb13e23fb5d1a0ec2ca4519c81714683f69c8d9a84", + "transactionsTrie": "0xec9d10cff79619f2df45db8c66526ef3fbd32d283fdd2dcc9b55c0efe643d8c3", + "receiptTrie": "0x9593f56abf23bcbb26d27b0c6e46a56415d9103ed6b4d8ac7b4182f9f250cafa", + "bloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "difficulty": "0x00", + "number": "0x01", + "gasLimit": "0x016345785d8a0000", + "gasUsed": "0xa864", + "timestamp": "0x03e8", + "extraData": "0x00", + "mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "nonce": "0x0000000000000000", + "baseFeePerGas": "0x07", + "withdrawalsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "blobGasUsed": "0x00", + "excessBlobGas": "0x00", + "parentBeaconBlockRoot": "0x0000000000000000000000000000000000000000000000000000000000000000", + "requestsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "hash": "0x879cf54bf493b6585db592b1b24ec30a8a7fbe3b9146d3fb20ca36200f2aca87" + }, + "transactions": [ + { + "type": "0x00", + "chainId": "0x01", + "nonce": "0x00", + "gasPrice": "0x0a", + "gasLimit": "0x989680", + "to": "0x0000000000000000000000000000000000001000", + "value": "0x00", + "data": "0x", + "v": "0x26", + "r": "0xe5d462429669f661291a8dc4c49a092cfd4922b6f3f31c9189a2f4adf5ecd730", + "s": "0x01494afaf472fbb80bcb107ffeb918a2b9115f454027840615d6d20d63c69ac0", + "sender": "0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b" + } + ], + "uncleHeaders": [], + "withdrawals": [], + "depositRequests": [], + "withdrawalRequests": [], + "rlp": "0xf902c9f9025fa0c9397e8a1b99cbb2b885852fde56de8fa686091a4f4430163f5237d7aaf33a14a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347942adc25665018aa1fe0e6bc666dac8fc2697ff9baa01a4885d1f64bac16e5ab17fb13e23fb5d1a0ec2ca4519c81714683f69c8d9a84a0ec9d10cff79619f2df45db8c66526ef3fbd32d283fdd2dcc9b55c0efe643d8c3a09593f56abf23bcbb26d27b0c6e46a56415d9103ed6b4d8ac7b4182f9f250cafab9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800188016345785d8a000082a8648203e800a0000000000000000000000000000000000000000000000000000000000000000088000000000000000007a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b4218080a00000000000000000000000000000000000000000000000000000000000000000a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421f862f860800a83989680940000000000000000000000000000000000001000808026a0e5d462429669f661291a8dc4c49a092cfd4922b6f3f31c9189a2f4adf5ecd730a001494afaf472fbb80bcb107ffeb918a2b9115f454027840615d6d20d63c69ac0c0c0c0", + "blocknumber": "1" + } + ], + "lastblockhash": "0x879cf54bf493b6585db592b1b24ec30a8a7fbe3b9146d3fb20ca36200f2aca87", + "sealEngine": "NoProof", + "_info": { + "hash": "0xbfd1223f9b5b8dbf202178f7c1f18dc089cb24e54c9cb7fc9831907547e937c4", + "comment": "`execution-spec-tests` generated test", + "filling-transition-tool": "Hyperledger Besu evm 24.7-develop-8ca7129", + "description": "Test function documentation:\nEOF1V4200_0002 (Valid) EOF code containing RJUMP (Zero)", + "url": "https://github.com/ethereum/execution-spec-tests/blob/891a6111370c89d4ce89bf91589c6d5ff6785158/tests/prague/eip7692_eof_v1/eip4200_relative_jumps/test_rjump.py#L63", + "reference-spec": "https://github.com/ethereum/EIPs/blob/master/EIPS/eip-4200.md", + "reference-spec-version": "17d4a8d12d2b5e0f2985c866376c16c8c6df7cba" + } + } + }, + "stdout": "Considering tests/prague/eip7692_eof_v1/eip4200_relative_jumps/test_rjump.py::test_rjump_zero[fork_PragueEIP7692-blockchain_test]\nBlock 1 (0x879cf54bf493b6585db592b1b24ec30a8a7fbe3b9146d3fb20ca36200f2aca87) Imported\nChain import successful - tests/prague/eip7692_eof_v1/eip4200_relative_jumps/test_rjump.py::test_rjump_zero[fork_PragueEIP7692-blockchain_test]\n" +} diff --git a/ethereum/referencetests/src/main/java/org/hyperledger/besu/ethereum/referencetests/EOFTestCaseSpec.java b/ethereum/referencetests/src/main/java/org/hyperledger/besu/ethereum/referencetests/EOFTestCaseSpec.java index e67ec2091..48fae5277 100644 --- a/ethereum/referencetests/src/main/java/org/hyperledger/besu/ethereum/referencetests/EOFTestCaseSpec.java +++ b/ethereum/referencetests/src/main/java/org/hyperledger/besu/ethereum/referencetests/EOFTestCaseSpec.java @@ -25,7 +25,8 @@ public class EOFTestCaseSpec { public record TestVector( @JsonProperty("code") String code, - @JsonProperty("results") NavigableMap results) {} + @JsonProperty("results") NavigableMap results, + @JsonProperty("containerKind") String containerKind) {} public record TestResult( @JsonProperty("exception") String exception, @JsonProperty("result") boolean result) { From d35c6d787521949f4991cb278217c3555adb1be6 Mon Sep 17 00:00:00 2001 From: Stefan Pingel <16143240+pinges@users.noreply.github.com> Date: Fri, 12 Jul 2024 15:29:19 +1000 Subject: [PATCH 45/58] Make the retrying snap tasks switching (#7307) * make snap tasks switching Signed-off-by: stefan.pingel@consensys.net --- .../RetryingGetAccountRangeFromPeerTask.java | 15 +++++++-------- .../snap/RetryingGetBytecodeFromPeerTask.java | 15 ++++++++------- .../RetryingGetStorageRangeFromPeerTask.java | 19 ++++++++++++------- .../snap/RetryingGetTrieNodeFromPeerTask.java | 15 ++++++++------- .../pipeline/AsyncOperationProcessor.java | 6 +++++- 5 files changed, 40 insertions(+), 30 deletions(-) diff --git a/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/manager/snap/RetryingGetAccountRangeFromPeerTask.java b/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/manager/snap/RetryingGetAccountRangeFromPeerTask.java index 0624a9058..ef48dcf95 100644 --- a/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/manager/snap/RetryingGetAccountRangeFromPeerTask.java +++ b/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/manager/snap/RetryingGetAccountRangeFromPeerTask.java @@ -17,18 +17,17 @@ package org.hyperledger.besu.ethereum.eth.manager.snap; import org.hyperledger.besu.ethereum.core.BlockHeader; import org.hyperledger.besu.ethereum.eth.manager.EthContext; import org.hyperledger.besu.ethereum.eth.manager.EthPeer; -import org.hyperledger.besu.ethereum.eth.manager.task.AbstractRetryingPeerTask; +import org.hyperledger.besu.ethereum.eth.manager.task.AbstractRetryingSwitchingPeerTask; import org.hyperledger.besu.ethereum.eth.manager.task.EthTask; import org.hyperledger.besu.ethereum.eth.messages.snap.AccountRangeMessage; import org.hyperledger.besu.plugin.services.MetricsSystem; -import java.util.Optional; import java.util.concurrent.CompletableFuture; import org.apache.tuweni.bytes.Bytes32; public class RetryingGetAccountRangeFromPeerTask - extends AbstractRetryingPeerTask { + extends AbstractRetryingSwitchingPeerTask { public static final int MAX_RETRIES = 4; @@ -46,9 +45,9 @@ public class RetryingGetAccountRangeFromPeerTask final MetricsSystem metricsSystem) { super( ethContext, - MAX_RETRIES, + metricsSystem, data -> data.accounts().isEmpty() && data.proofs().isEmpty(), - metricsSystem); + MAX_RETRIES); this.ethContext = ethContext; this.startKeyHash = startKeyHash; this.endKeyHash = endKeyHash; @@ -67,12 +66,12 @@ public class RetryingGetAccountRangeFromPeerTask } @Override - protected CompletableFuture executePeerTask( - final Optional assignedPeer) { + protected CompletableFuture executeTaskOnCurrentPeer( + final EthPeer peer) { final GetAccountRangeFromPeerTask task = GetAccountRangeFromPeerTask.forAccountRange( ethContext, startKeyHash, endKeyHash, blockHeader, metricsSystem); - assignedPeer.ifPresent(task::assignPeer); + task.assignPeer(peer); return executeSubTask(task::run) .thenApply( peerResult -> { diff --git a/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/manager/snap/RetryingGetBytecodeFromPeerTask.java b/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/manager/snap/RetryingGetBytecodeFromPeerTask.java index 3258298f2..e30d06259 100644 --- a/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/manager/snap/RetryingGetBytecodeFromPeerTask.java +++ b/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/manager/snap/RetryingGetBytecodeFromPeerTask.java @@ -17,19 +17,21 @@ package org.hyperledger.besu.ethereum.eth.manager.snap; import org.hyperledger.besu.ethereum.core.BlockHeader; import org.hyperledger.besu.ethereum.eth.manager.EthContext; import org.hyperledger.besu.ethereum.eth.manager.EthPeer; -import org.hyperledger.besu.ethereum.eth.manager.task.AbstractRetryingPeerTask; +import org.hyperledger.besu.ethereum.eth.manager.task.AbstractRetryingSwitchingPeerTask; import org.hyperledger.besu.ethereum.eth.manager.task.EthTask; import org.hyperledger.besu.plugin.services.MetricsSystem; import java.util.List; import java.util.Map; -import java.util.Optional; import java.util.concurrent.CompletableFuture; import org.apache.tuweni.bytes.Bytes; import org.apache.tuweni.bytes.Bytes32; -public class RetryingGetBytecodeFromPeerTask extends AbstractRetryingPeerTask> { +public class RetryingGetBytecodeFromPeerTask + extends AbstractRetryingSwitchingPeerTask> { + + public static final int MAX_RETRIES = 4; private final EthContext ethContext; private final List codeHashes; @@ -41,7 +43,7 @@ public class RetryingGetBytecodeFromPeerTask extends AbstractRetryingPeerTask codeHashes, final BlockHeader blockHeader, final MetricsSystem metricsSystem) { - super(ethContext, 4, Map::isEmpty, metricsSystem); + super(ethContext, metricsSystem, Map::isEmpty, MAX_RETRIES); this.ethContext = ethContext; this.codeHashes = codeHashes; this.blockHeader = blockHeader; @@ -57,11 +59,10 @@ public class RetryingGetBytecodeFromPeerTask extends AbstractRetryingPeerTask> executePeerTask( - final Optional assignedPeer) { + protected CompletableFuture> executeTaskOnCurrentPeer(final EthPeer peer) { final GetBytecodeFromPeerTask task = GetBytecodeFromPeerTask.forBytecode(ethContext, codeHashes, blockHeader, metricsSystem); - assignedPeer.ifPresent(task::assignPeer); + task.assignPeer(peer); return executeSubTask(task::run) .thenApply( peerResult -> { diff --git a/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/manager/snap/RetryingGetStorageRangeFromPeerTask.java b/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/manager/snap/RetryingGetStorageRangeFromPeerTask.java index 731b0b762..6e977bb4e 100644 --- a/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/manager/snap/RetryingGetStorageRangeFromPeerTask.java +++ b/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/manager/snap/RetryingGetStorageRangeFromPeerTask.java @@ -17,19 +17,20 @@ package org.hyperledger.besu.ethereum.eth.manager.snap; import org.hyperledger.besu.ethereum.core.BlockHeader; import org.hyperledger.besu.ethereum.eth.manager.EthContext; import org.hyperledger.besu.ethereum.eth.manager.EthPeer; -import org.hyperledger.besu.ethereum.eth.manager.task.AbstractRetryingPeerTask; +import org.hyperledger.besu.ethereum.eth.manager.task.AbstractRetryingSwitchingPeerTask; import org.hyperledger.besu.ethereum.eth.manager.task.EthTask; import org.hyperledger.besu.ethereum.eth.messages.snap.StorageRangeMessage; import org.hyperledger.besu.plugin.services.MetricsSystem; import java.util.List; -import java.util.Optional; import java.util.concurrent.CompletableFuture; import org.apache.tuweni.bytes.Bytes32; public class RetryingGetStorageRangeFromPeerTask - extends AbstractRetryingPeerTask { + extends AbstractRetryingSwitchingPeerTask { + + public static final int MAX_RETRIES = 4; private final EthContext ethContext; private final List accountHashes; @@ -45,7 +46,11 @@ public class RetryingGetStorageRangeFromPeerTask final Bytes32 endKeyHash, final BlockHeader blockHeader, final MetricsSystem metricsSystem) { - super(ethContext, 4, data -> data.proofs().isEmpty() && data.slots().isEmpty(), metricsSystem); + super( + ethContext, + metricsSystem, + data -> data.proofs().isEmpty() && data.slots().isEmpty(), + MAX_RETRIES); this.ethContext = ethContext; this.accountHashes = accountHashes; this.startKeyHash = startKeyHash; @@ -66,12 +71,12 @@ public class RetryingGetStorageRangeFromPeerTask } @Override - protected CompletableFuture executePeerTask( - final Optional assignedPeer) { + protected CompletableFuture executeTaskOnCurrentPeer( + final EthPeer peer) { final GetStorageRangeFromPeerTask task = GetStorageRangeFromPeerTask.forStorageRange( ethContext, accountHashes, startKeyHash, endKeyHash, blockHeader, metricsSystem); - assignedPeer.ifPresent(task::assignPeer); + task.assignPeer(peer); return executeSubTask(task::run) .thenApply( peerResult -> { diff --git a/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/manager/snap/RetryingGetTrieNodeFromPeerTask.java b/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/manager/snap/RetryingGetTrieNodeFromPeerTask.java index 1abf0d723..152fd9171 100644 --- a/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/manager/snap/RetryingGetTrieNodeFromPeerTask.java +++ b/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/manager/snap/RetryingGetTrieNodeFromPeerTask.java @@ -17,18 +17,20 @@ package org.hyperledger.besu.ethereum.eth.manager.snap; import org.hyperledger.besu.ethereum.core.BlockHeader; import org.hyperledger.besu.ethereum.eth.manager.EthContext; import org.hyperledger.besu.ethereum.eth.manager.EthPeer; -import org.hyperledger.besu.ethereum.eth.manager.task.AbstractRetryingPeerTask; +import org.hyperledger.besu.ethereum.eth.manager.task.AbstractRetryingSwitchingPeerTask; import org.hyperledger.besu.ethereum.eth.manager.task.EthTask; import org.hyperledger.besu.plugin.services.MetricsSystem; import java.util.List; import java.util.Map; -import java.util.Optional; import java.util.concurrent.CompletableFuture; import org.apache.tuweni.bytes.Bytes; -public class RetryingGetTrieNodeFromPeerTask extends AbstractRetryingPeerTask> { +public class RetryingGetTrieNodeFromPeerTask + extends AbstractRetryingSwitchingPeerTask> { + + public static final int MAX_RETRIES = 4; private final EthContext ethContext; private final Map> paths; @@ -40,7 +42,7 @@ public class RetryingGetTrieNodeFromPeerTask extends AbstractRetryingPeerTask> paths, final BlockHeader blockHeader, final MetricsSystem metricsSystem) { - super(ethContext, 4, Map::isEmpty, metricsSystem); + super(ethContext, metricsSystem, Map::isEmpty, MAX_RETRIES); this.ethContext = ethContext; this.paths = paths; this.blockHeader = blockHeader; @@ -56,11 +58,10 @@ public class RetryingGetTrieNodeFromPeerTask extends AbstractRetryingPeerTask> executePeerTask( - final Optional assignedPeer) { + protected CompletableFuture> executeTaskOnCurrentPeer(final EthPeer peer) { final GetTrieNodeFromPeerTask task = GetTrieNodeFromPeerTask.forTrieNodes(ethContext, paths, blockHeader, metricsSystem); - assignedPeer.ifPresent(task::assignPeer); + task.assignPeer(peer); return executeSubTask(task::run) .thenApply( peerResult -> { diff --git a/services/pipeline/src/main/java/org/hyperledger/besu/services/pipeline/AsyncOperationProcessor.java b/services/pipeline/src/main/java/org/hyperledger/besu/services/pipeline/AsyncOperationProcessor.java index c8c7e5905..e17296c02 100644 --- a/services/pipeline/src/main/java/org/hyperledger/besu/services/pipeline/AsyncOperationProcessor.java +++ b/services/pipeline/src/main/java/org/hyperledger/besu/services/pipeline/AsyncOperationProcessor.java @@ -83,7 +83,11 @@ class AsyncOperationProcessor implements Processor { waitForAnyFutureToComplete(); outputCompletedTasks(outputPipe); } catch (final InterruptedException e) { - LOG.trace("Interrupted while waiting for processing to complete", e.getMessage()); + LOG.atTrace() + .setMessage("Interrupted while waiting for processing to complete: Message=({})") + .addArgument(e.getMessage()) + .setCause(e) + .log(); } catch (final ExecutionException e) { throw new AsyncOperationException("Async operation failed. " + e.getMessage(), e); } catch (final TimeoutException e) { From 41f007fb804e0ac8fb4fd11f2e2801035cce514c Mon Sep 17 00:00:00 2001 From: Matilda-Clerke Date: Fri, 12 Jul 2024 16:28:56 +1000 Subject: [PATCH 46/58] 6612: Remove deprecated sync modes and related helper methods (#7309) * 6612: Remove deprecated sync modes and related helper methods Signed-off-by: Matilda-Clerke --- .../org/hyperledger/besu/cli/BesuCommand.java | 10 +++---- .../besu/controller/BesuController.java | 4 +-- .../controller/BesuControllerBuilder.java | 6 ++--- .../hyperledger/besu/cli/BesuCommandTest.java | 2 +- .../besu/ethereum/eth/manager/EthPeers.java | 2 +- .../eth/sync/DefaultSynchronizer.java | 6 ++--- .../besu/ethereum/eth/sync/SyncMode.java | 26 ++----------------- 7 files changed, 16 insertions(+), 40 deletions(-) diff --git a/besu/src/main/java/org/hyperledger/besu/cli/BesuCommand.java b/besu/src/main/java/org/hyperledger/besu/cli/BesuCommand.java index 427cac924..118e586b1 100644 --- a/besu/src/main/java/org/hyperledger/besu/cli/BesuCommand.java +++ b/besu/src/main/java/org/hyperledger/besu/cli/BesuCommand.java @@ -1566,11 +1566,11 @@ public class BesuCommand implements DefaultCommandValues, Runnable { || genesisConfigOptionsSupplier.get().isQbft()) && !unstableSynchronizerOptions.isSnapSyncBftEnabled()) { final String errorSuffix = "can't be used with BFT networks"; - if (SyncMode.CHECKPOINT.equals(syncMode) || SyncMode.X_CHECKPOINT.equals(syncMode)) { + if (SyncMode.CHECKPOINT.equals(syncMode)) { throw new ParameterException( commandLine, String.format("%s %s", "Checkpoint sync", errorSuffix)); } - if (syncMode == SyncMode.SNAP || syncMode == SyncMode.X_SNAP) { + if (syncMode == SyncMode.SNAP) { throw new ParameterException(commandLine, String.format("%s %s", "Snap sync", errorSuffix)); } } @@ -1753,7 +1753,7 @@ public class BesuCommand implements DefaultCommandValues, Runnable { CommandLineUtils.failIfOptionDoesntMeetRequirement( commandLine, "--Xcheckpoint-post-merge-enabled can only be used with CHECKPOINT sync-mode", - SyncMode.isCheckpointSync(getDefaultSyncModeIfNotSet()), + getDefaultSyncModeIfNotSet() == SyncMode.CHECKPOINT, singletonList("--Xcheckpoint-post-merge-enabled")); CommandLineUtils.failIfOptionDoesntMeetRequirement( @@ -2043,10 +2043,10 @@ public class BesuCommand implements DefaultCommandValues, Runnable { if (syncMode == SyncMode.FAST) { throw new ParameterException(commandLine, String.format("%s %s", "Fast sync", errorSuffix)); } - if (syncMode == SyncMode.SNAP || syncMode == SyncMode.X_SNAP) { + if (syncMode == SyncMode.SNAP) { throw new ParameterException(commandLine, String.format("%s %s", "Snap sync", errorSuffix)); } - if (syncMode == SyncMode.CHECKPOINT || syncMode == SyncMode.X_CHECKPOINT) { + if (syncMode == SyncMode.CHECKPOINT) { throw new ParameterException( commandLine, String.format("%s %s", "Checkpoint sync", errorSuffix)); } diff --git a/besu/src/main/java/org/hyperledger/besu/controller/BesuController.java b/besu/src/main/java/org/hyperledger/besu/controller/BesuController.java index 6942fda31..fb9931890 100644 --- a/besu/src/main/java/org/hyperledger/besu/controller/BesuController.java +++ b/besu/src/main/java/org/hyperledger/besu/controller/BesuController.java @@ -14,8 +14,6 @@ */ package org.hyperledger.besu.controller; -import static org.hyperledger.besu.ethereum.eth.sync.SyncMode.isCheckpointSync; - import org.hyperledger.besu.cli.config.EthNetworkConfig; import org.hyperledger.besu.config.GenesisConfigFile; import org.hyperledger.besu.config.GenesisConfigOptions; @@ -361,7 +359,7 @@ public class BesuController implements java.io.Closeable { // wrap with TransitionBesuControllerBuilder if we have a terminal total difficulty: if (configOptions.getTerminalTotalDifficulty().isPresent()) { // Enable start with vanilla MergeBesuControllerBuilder for PoS checkpoint block - if (isCheckpointSync(syncMode) && isCheckpointPoSBlock(configOptions)) { + if (syncMode == SyncMode.CHECKPOINT && isCheckpointPoSBlock(configOptions)) { return new MergeBesuControllerBuilder().genesisConfigFile(genesisConfigFile); } else { // TODO this should be changed to vanilla MergeBesuControllerBuilder and the Transition* diff --git a/besu/src/main/java/org/hyperledger/besu/controller/BesuControllerBuilder.java b/besu/src/main/java/org/hyperledger/besu/controller/BesuControllerBuilder.java index 6123535f6..73bc76608 100644 --- a/besu/src/main/java/org/hyperledger/besu/controller/BesuControllerBuilder.java +++ b/besu/src/main/java/org/hyperledger/besu/controller/BesuControllerBuilder.java @@ -708,8 +708,8 @@ public abstract class BesuControllerBuilder implements MiningParameterOverrides ethPeers.setTrailingPeerRequirementsSupplier(synchronizer::calculateTrailingPeerRequirements); - if (SyncMode.isSnapSync(syncConfig.getSyncMode()) - || SyncMode.isCheckpointSync(syncConfig.getSyncMode())) { + if (syncConfig.getSyncMode() == SyncMode.SNAP + || syncConfig.getSyncMode() == SyncMode.CHECKPOINT) { synchronizer.subscribeInSync((b) -> ethPeers.snapServerPeersNeeded(!b)); ethPeers.snapServerPeersNeeded(true); } else { @@ -1157,7 +1157,7 @@ public abstract class BesuControllerBuilder implements MiningParameterOverrides final CheckpointConfigOptions checkpointConfigOptions = genesisConfigOptions.getCheckpointOptions(); - if (SyncMode.isCheckpointSync(syncConfig.getSyncMode()) && checkpointConfigOptions.isValid()) { + if (syncConfig.getSyncMode() == SyncMode.CHECKPOINT && checkpointConfigOptions.isValid()) { validators.add( new CheckpointBlocksPeerValidator( protocolSchedule, diff --git a/besu/src/test/java/org/hyperledger/besu/cli/BesuCommandTest.java b/besu/src/test/java/org/hyperledger/besu/cli/BesuCommandTest.java index c6ffbdc17..efeff412d 100644 --- a/besu/src/test/java/org/hyperledger/besu/cli/BesuCommandTest.java +++ b/besu/src/test/java/org/hyperledger/besu/cli/BesuCommandTest.java @@ -1107,7 +1107,7 @@ public class BesuCommandTest extends CommandTestAbstract { assertThat(commandOutput.toString(UTF_8)).isEmpty(); assertThat(commandErrorOutput.toString(UTF_8)) .contains( - "Invalid value for option '--sync-mode': expected one of [FULL, FAST, SNAP, CHECKPOINT, X_SNAP, X_CHECKPOINT] (case-insensitive) but was 'bogus'"); + "Invalid value for option '--sync-mode': expected one of [FULL, FAST, SNAP, CHECKPOINT] (case-insensitive) but was 'bogus'"); } @Test diff --git a/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/manager/EthPeers.java b/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/manager/EthPeers.java index 851c07529..d1a54d4d3 100644 --- a/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/manager/EthPeers.java +++ b/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/manager/EthPeers.java @@ -525,7 +525,7 @@ public class EthPeers { peer.chainState().updateHeightEstimate(peerHeadBlockHeader.getNumber()); CompletableFuture isServingSnapFuture; - if (SyncMode.isCheckpointSync(syncMode) || SyncMode.isSnapSync(syncMode)) { + if (syncMode == SyncMode.SNAP || syncMode == SyncMode.CHECKPOINT) { // even if we have finished the snap sync, we still want to know if the peer is a snap // server isServingSnapFuture = diff --git a/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/sync/DefaultSynchronizer.java b/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/sync/DefaultSynchronizer.java index 7605754a6..a41ad1812 100644 --- a/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/sync/DefaultSynchronizer.java +++ b/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/sync/DefaultSynchronizer.java @@ -99,8 +99,8 @@ public class DefaultSynchronizer implements Synchronizer, UnverifiedForkchoiceLi this::calculateTrailingPeerRequirements, metricsSystem); - if (SyncMode.isSnapSync(syncConfig.getSyncMode()) - || SyncMode.isCheckpointSync(syncConfig.getSyncMode())) { + if (syncConfig.getSyncMode() == SyncMode.SNAP + || syncConfig.getSyncMode() == SyncMode.CHECKPOINT) { SnapServerChecker.createAndSetSnapServerChecker(ethContext, metricsSystem); } @@ -145,7 +145,7 @@ public class DefaultSynchronizer implements Synchronizer, UnverifiedForkchoiceLi worldStateStorageCoordinator, syncState, clock); - } else if (SyncMode.isCheckpointSync(syncConfig.getSyncMode())) { + } else if (syncConfig.getSyncMode() == SyncMode.CHECKPOINT) { this.fastSyncFactory = () -> CheckpointDownloaderFactory.createCheckpointDownloader( diff --git a/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/sync/SyncMode.java b/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/sync/SyncMode.java index 4f3affbe5..c69a128c5 100644 --- a/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/sync/SyncMode.java +++ b/ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/sync/SyncMode.java @@ -27,35 +27,13 @@ public enum SyncMode { // Perform snapsync SNAP, // Perform snapsync but starting from a checkpoint instead of starting from genesis - CHECKPOINT, - // Deprecated and will be removed in 24.4.0 (X_SNAP and X_CHECKPOINT) - X_SNAP, - X_CHECKPOINT; + CHECKPOINT; public String normalize() { - if (this.toString().startsWith("X_")) { - // removes X_ at the beginning - return StringUtils.capitalize(this.toString().substring(2).toLowerCase(Locale.ROOT)); - } - return StringUtils.capitalize(this.toString().toLowerCase(Locale.ROOT)); } public static boolean isFullSync(final SyncMode syncMode) { - return !EnumSet.of( - SyncMode.FAST, - SyncMode.SNAP, - SyncMode.X_SNAP, - SyncMode.CHECKPOINT, - SyncMode.X_CHECKPOINT) - .contains(syncMode); - } - - public static boolean isCheckpointSync(final SyncMode syncMode) { - return X_CHECKPOINT.equals(syncMode) || CHECKPOINT.equals(syncMode); - } - - public static boolean isSnapSync(final SyncMode syncMode) { - return X_SNAP.equals(syncMode) || SNAP.equals(syncMode); + return !EnumSet.of(SyncMode.FAST, SyncMode.SNAP, SyncMode.CHECKPOINT).contains(syncMode); } } From 965e757d81072f31d2a44bb5757ff46f7d102e36 Mon Sep 17 00:00:00 2001 From: Danno Ferrin Date: Fri, 12 Jul 2024 08:43:44 -0600 Subject: [PATCH 47/58] EOF Reference Test Fixes (#7306) Fix a number of issues found in reference tests and evmone tests. - Be tolerant of more nulls in json - Support ContainerKind in reference tests - re-order EXTCALL oeprands - correct return value for REVERT in EXT*CALL - re-order EOFCREATE code validation Signed-off-by: Danno Ferrin --- .../GeneralStateTestCaseSpec.java | 6 +- .../ReferenceTestProtocolSchedules.java | 5 ++ .../ethereum/eof/EOFReferenceTestTools.java | 70 ++++++++++++++----- .../templates/EOFReferenceTest.java.template | 3 +- .../besu/evm/code/CodeFactory.java | 4 ++ .../org/hyperledger/besu/evm/code/CodeV1.java | 2 +- .../hyperledger/besu/evm/code/EOFLayout.java | 12 +++- .../operation/AbstractCreateOperation.java | 28 ++++---- .../operation/AbstractExtCallOperation.java | 6 ++ .../besu/evm/operation/ExtCallOperation.java | 4 +- .../operation/ExtDelegateCallOperation.java | 3 - .../evm/operation/ExtStaticCallOperation.java | 3 - .../evm/operations/ExtCallOperationTest.java | 4 +- .../besu/testutil/JsonTestParameters.java | 8 ++- 14 files changed, 107 insertions(+), 51 deletions(-) diff --git a/ethereum/referencetests/src/main/java/org/hyperledger/besu/ethereum/referencetests/GeneralStateTestCaseSpec.java b/ethereum/referencetests/src/main/java/org/hyperledger/besu/ethereum/referencetests/GeneralStateTestCaseSpec.java index 73735fdb0..affc6e460 100644 --- a/ethereum/referencetests/src/main/java/org/hyperledger/besu/ethereum/referencetests/GeneralStateTestCaseSpec.java +++ b/ethereum/referencetests/src/main/java/org/hyperledger/besu/ethereum/referencetests/GeneralStateTestCaseSpec.java @@ -56,10 +56,12 @@ public class GeneralStateTestCaseSpec { final ReferenceTestWorldState initialWorldState, final Map> postSections, final StateTestVersionedTransaction versionedTransaction) { - + if (initialWorldState == null) { + return Map.of(); + } initialWorldState.persist(null); final Map> res = - new LinkedHashMap<>(postSections.size()); + LinkedHashMap.newLinkedHashMap(postSections.size()); for (final Map.Entry> entry : postSections.entrySet()) { final String eip = entry.getKey(); final List post = entry.getValue(); diff --git a/ethereum/referencetests/src/main/java/org/hyperledger/besu/ethereum/referencetests/ReferenceTestProtocolSchedules.java b/ethereum/referencetests/src/main/java/org/hyperledger/besu/ethereum/referencetests/ReferenceTestProtocolSchedules.java index 4d62c314a..8ac419f7a 100644 --- a/ethereum/referencetests/src/main/java/org/hyperledger/besu/ethereum/referencetests/ReferenceTestProtocolSchedules.java +++ b/ethereum/referencetests/src/main/java/org/hyperledger/besu/ethereum/referencetests/ReferenceTestProtocolSchedules.java @@ -91,6 +91,11 @@ public class ReferenceTestProtocolSchedules { "CancunToPragueAtTime15k", createSchedule(genesisStub.clone().cancunTime(0).pragueTime(15000))); builder.put("Prague", createSchedule(genesisStub.clone().pragueEOFTime(0))); + builder.put("Osaka", createSchedule(genesisStub.clone().futureEipsTime(0))); + builder.put("Amsterdam", createSchedule(genesisStub.clone().futureEipsTime(0))); + builder.put("Bogota", createSchedule(genesisStub.clone().futureEipsTime(0))); + builder.put("Polis", createSchedule(genesisStub.clone().futureEipsTime(0))); + builder.put("Bangkok", createSchedule(genesisStub.clone().futureEipsTime(0))); builder.put("Future_EIPs", createSchedule(genesisStub.clone().futureEipsTime(0))); builder.put("Experimental_EIPs", createSchedule(genesisStub.clone().experimentalEipsTime(0))); return new ReferenceTestProtocolSchedules(builder.build()); diff --git a/ethereum/referencetests/src/reference-test/java/org/hyperledger/besu/ethereum/eof/EOFReferenceTestTools.java b/ethereum/referencetests/src/reference-test/java/org/hyperledger/besu/ethereum/eof/EOFReferenceTestTools.java index 58f8c0252..a15bcb241 100644 --- a/ethereum/referencetests/src/reference-test/java/org/hyperledger/besu/ethereum/eof/EOFReferenceTestTools.java +++ b/ethereum/referencetests/src/reference-test/java/org/hyperledger/besu/ethereum/eof/EOFReferenceTestTools.java @@ -21,13 +21,19 @@ import java.util.Arrays; import java.util.Collection; import java.util.List; import java.util.Map; +import java.util.Map.Entry; + import org.apache.tuweni.bytes.Bytes; + import org.hyperledger.besu.ethereum.referencetests.EOFTestCaseSpec; +import org.hyperledger.besu.ethereum.referencetests.EOFTestCaseSpec.TestResult; import org.hyperledger.besu.ethereum.referencetests.ReferenceTestProtocolSchedules; import org.hyperledger.besu.evm.Code; import org.hyperledger.besu.evm.EVM; import org.hyperledger.besu.evm.code.CodeInvalid; +import org.hyperledger.besu.evm.code.CodeV1; import org.hyperledger.besu.evm.code.EOFLayout; +import org.hyperledger.besu.evm.code.EOFLayout.EOFContainerMode; import org.hyperledger.besu.testutil.JsonTestParameters; public class EOFReferenceTestTools { @@ -43,13 +49,18 @@ public class EOFReferenceTestTools { JsonTestParameters.create(EOFTestCaseSpec.class, EOFTestCaseSpec.TestResult.class) .generator( (testName, fullPath, eofSpec, collector) -> { + if (eofSpec.getVector() == null) { + return; + } final Path path = Path.of(fullPath).getParent().getFileName(); final String prefix = path + "/" + testName + "-"; for (final Map.Entry entry : eofSpec.getVector().entrySet()) { final String name = entry.getKey(); final Bytes code = Bytes.fromHexString(entry.getValue().code()); - for (final var result : entry.getValue().results().entrySet()) { + final String containerKind = entry.getValue().containerKind(); + for (final Entry result : + entry.getValue().results().entrySet()) { final String eip = result.getKey(); final boolean runTest = EIPS_TO_RUN.contains(eip); collector.add( @@ -57,6 +68,7 @@ public class EOFReferenceTestTools { fullPath, eip, code, + containerKind, result.getValue(), runTest); } @@ -72,7 +84,7 @@ public class EOFReferenceTestTools { params.ignore("EOF1_undefined_opcodes_186"); // embedded containers rules changed - params.ignore("efValidation/EOF1_embedded_container-Prague\\[EOF1_embedded_container_\\d+\\]"); + params.ignore("efValidation/EOF1_embedded_container-Prague\\[EOF1_embedded_container_\\d+\\]"); // truncated data is only allowed in embedded containers params.ignore("ori/validInvalid-Prague\\[validInvalid_48\\]"); @@ -101,7 +113,10 @@ public class EOFReferenceTestTools { @SuppressWarnings("java:S5960") // This is not production code, this is testing code. public static void executeTest( - final String fork, final Bytes code, final EOFTestCaseSpec.TestResult expected) { + final String fork, + final Bytes code, + final String containerKind, + final EOFTestCaseSpec.TestResult expected) { EVM evm = ReferenceTestProtocolSchedules.create().geSpecByName(fork).getEvm(); assertThat(evm).isNotNull(); @@ -112,23 +127,40 @@ public class EOFReferenceTestTools { EOFLayout layout = EOFLayout.parseEOF(code); if (layout.isValid()) { - Code parsedCode = evm.getCodeUncached(code); - assertThat(parsedCode.isValid()) - .withFailMessage( - () -> - EOFLayout.parseEOF(code).prettyPrint() - + "\nExpected exception :" - + expected.exception() - + " actual exception :" - + (parsedCode.isValid() - ? null - : ((CodeInvalid) parsedCode).getInvalidReason())) - .isEqualTo(expected.result()); + Code parsedCode; + if ("INITCODE".equals(containerKind)) { + parsedCode = evm.getCodeForCreation(code); + } else { + parsedCode = evm.getCodeUncached(code); + } + if ("EOF_IncompatibleContainerKind".equals(expected.exception()) && parsedCode.isValid()) { + EOFContainerMode expectedMode = + EOFContainerMode.valueOf(containerKind == null ? "RUNTIME" : containerKind); + EOFContainerMode containerMode = + ((CodeV1) parsedCode).getEofLayout().containerMode().get(); + EOFContainerMode actualMode = + containerMode == null ? EOFContainerMode.RUNTIME : containerMode; + assertThat(actualMode) + .withFailMessage("Code did not parse to valid containerKind of " + expectedMode) + .isNotEqualTo(expectedMode); + } else { + assertThat(parsedCode.isValid()) + .withFailMessage( + () -> + EOFLayout.parseEOF(code).prettyPrint() + + "\nExpected exception :" + + expected.exception() + + " actual exception :" + + (parsedCode.isValid() + ? null + : ((CodeInvalid) parsedCode).getInvalidReason())) + .isEqualTo(expected.result()); - if (expected.result()) { - assertThat(code) - .withFailMessage("Container round trip failed") - .isEqualTo(layout.writeContainer(null)); + if (expected.result()) { + assertThat(code) + .withFailMessage("Container round trip failed") + .isEqualTo(layout.writeContainer(null)); + } } } else { assertThat(layout.isValid()) diff --git a/ethereum/referencetests/src/reference-test/templates/EOFReferenceTest.java.template b/ethereum/referencetests/src/reference-test/templates/EOFReferenceTest.java.template index 5f5cafd67..d9e52403d 100644 --- a/ethereum/referencetests/src/reference-test/templates/EOFReferenceTest.java.template +++ b/ethereum/referencetests/src/reference-test/templates/EOFReferenceTest.java.template @@ -34,9 +34,10 @@ public class %%TESTS_NAME%% { final String name, final String fork, final Bytes code, + final String containerKind, final EOFTestCaseSpec.TestResult results, final boolean runTest) { assumeTrue(runTest, "Test " + name + " was ignored"); - executeTest(fork, code, results); + executeTest(fork, code, containerKind, results); } } diff --git a/evm/src/main/java/org/hyperledger/besu/evm/code/CodeFactory.java b/evm/src/main/java/org/hyperledger/besu/evm/code/CodeFactory.java index a0bba7037..185610012 100644 --- a/evm/src/main/java/org/hyperledger/besu/evm/code/CodeFactory.java +++ b/evm/src/main/java/org/hyperledger/besu/evm/code/CodeFactory.java @@ -15,6 +15,7 @@ package org.hyperledger.besu.evm.code; import org.hyperledger.besu.evm.Code; +import org.hyperledger.besu.evm.code.EOFLayout.EOFContainerMode; import javax.annotation.Nonnull; @@ -94,6 +95,9 @@ public class CodeFactory { } final EOFLayout layout = EOFLayout.parseEOF(bytes, !createTransaction); + if (createTransaction) { + layout.containerMode().set(EOFContainerMode.INITCODE); + } return createCode(layout); } else { return new CodeV0(bytes); diff --git a/evm/src/main/java/org/hyperledger/besu/evm/code/CodeV1.java b/evm/src/main/java/org/hyperledger/besu/evm/code/CodeV1.java index 50ffdd410..a1517d1d7 100644 --- a/evm/src/main/java/org/hyperledger/besu/evm/code/CodeV1.java +++ b/evm/src/main/java/org/hyperledger/besu/evm/code/CodeV1.java @@ -111,7 +111,7 @@ public class CodeV1 implements Code { codeToLoad = subcontainerLayout.container(); } - Code subContainerCode = evm.getCodeForCreation(codeToLoad); + Code subContainerCode = evm.getCodeUncached(codeToLoad); return subContainerCode.isValid() && subContainerCode.getEofVersion() > 0 ? Optional.of(subContainerCode) diff --git a/evm/src/main/java/org/hyperledger/besu/evm/code/EOFLayout.java b/evm/src/main/java/org/hyperledger/besu/evm/code/EOFLayout.java index 8b41a9792..401308715 100644 --- a/evm/src/main/java/org/hyperledger/besu/evm/code/EOFLayout.java +++ b/evm/src/main/java/org/hyperledger/besu/evm/code/EOFLayout.java @@ -57,9 +57,16 @@ public record EOFLayout( String invalidReason, AtomicReference containerMode) { - enum EOFContainerMode { + /** + * Enum tracking the useage mode of an EOF container. Detected either by opcode usage or + * determined by the source. + */ + public enum EOFContainerMode { + /** Usage mode is unknown */ UNKNOWN, + /** Usage mode is as init code */ INITCODE, + /** Usage mode is as deployed or runtime code */ RUNTIME } @@ -324,6 +331,9 @@ public record EOFLayout( Bytes subcontainer = container.slice(pos, subcontianerSize); pos += subcontianerSize; EOFLayout subLayout = EOFLayout.parseEOF(subcontainer, false); + if (subLayout.container.size() < subcontainer.size()) { + return invalidLayout(container, version, "excess data in subcontainer"); + } if (!subLayout.isValid()) { String invalidSubReason = subLayout.invalidReason; return invalidLayout( diff --git a/evm/src/main/java/org/hyperledger/besu/evm/operation/AbstractCreateOperation.java b/evm/src/main/java/org/hyperledger/besu/evm/operation/AbstractCreateOperation.java index f026fd711..f20c2914a 100644 --- a/evm/src/main/java/org/hyperledger/besu/evm/operation/AbstractCreateOperation.java +++ b/evm/src/main/java/org/hyperledger/besu/evm/operation/AbstractCreateOperation.java @@ -214,32 +214,32 @@ public abstract class AbstractCreateOperation extends AbstractOperation { private void complete(final MessageFrame frame, final MessageFrame childFrame, final EVM evm) { frame.setState(MessageFrame.State.CODE_EXECUTING); - Code outputCode = - (childFrame.getCreatedCode() != null) - ? childFrame.getCreatedCode() - : evm.getCodeForCreation(childFrame.getOutputData()); + frame.incrementRemainingGas(childFrame.getRemainingGas()); + frame.addLogs(childFrame.getLogs()); + frame.addSelfDestructs(childFrame.getSelfDestructs()); + frame.addCreates(childFrame.getCreates()); frame.popStackItems(getStackItemsConsumed()); - if (outputCode.isValid()) { - frame.incrementRemainingGas(childFrame.getRemainingGas()); - frame.addLogs(childFrame.getLogs()); - frame.addSelfDestructs(childFrame.getSelfDestructs()); - frame.addCreates(childFrame.getCreates()); - - if (childFrame.getState() == MessageFrame.State.COMPLETED_SUCCESS) { + if (childFrame.getState() == MessageFrame.State.COMPLETED_SUCCESS) { + Code outputCode = + (childFrame.getCreatedCode() != null) + ? childFrame.getCreatedCode() + : evm.getCodeForCreation(childFrame.getOutputData()); + if (outputCode.isValid()) { Address createdAddress = childFrame.getContractAddress(); frame.pushStackItem(Words.fromAddress(createdAddress)); + frame.setReturnData(Bytes.EMPTY); onSuccess(frame, createdAddress); } else { + frame.getWorldUpdater().deleteAccount(childFrame.getRecipientAddress()); frame.setReturnData(childFrame.getOutputData()); frame.pushStackItem(LEGACY_FAILURE_STACK_ITEM); - onFailure(frame, childFrame.getExceptionalHaltReason()); + onInvalid(frame, (CodeInvalid) outputCode); } } else { - frame.getWorldUpdater().deleteAccount(childFrame.getRecipientAddress()); frame.setReturnData(childFrame.getOutputData()); frame.pushStackItem(LEGACY_FAILURE_STACK_ITEM); - onInvalid(frame, (CodeInvalid) outputCode); + onFailure(frame, childFrame.getExceptionalHaltReason()); } final int currentPC = frame.getPC(); diff --git a/evm/src/main/java/org/hyperledger/besu/evm/operation/AbstractExtCallOperation.java b/evm/src/main/java/org/hyperledger/besu/evm/operation/AbstractExtCallOperation.java index 2c0535b19..43d7e343f 100644 --- a/evm/src/main/java/org/hyperledger/besu/evm/operation/AbstractExtCallOperation.java +++ b/evm/src/main/java/org/hyperledger/besu/evm/operation/AbstractExtCallOperation.java @@ -38,6 +38,8 @@ import org.apache.tuweni.bytes.Bytes; public abstract class AbstractExtCallOperation extends AbstractCallOperation { static final int STACK_TO = 0; + static final int STACK_INPUT_OFFSET = 1; + static final int STACK_INPUT_LENGTH = 2; /** EXT*CALL response indicating success */ public static final Bytes EOF1_SUCCESS_STACK_ITEM = Bytes.EMPTY; @@ -195,6 +197,10 @@ public abstract class AbstractExtCallOperation extends AbstractCallOperation { return switch (childFrame.getState()) { case COMPLETED_SUCCESS -> EOF1_SUCCESS_STACK_ITEM; case EXCEPTIONAL_HALT -> EOF1_EXCEPTION_STACK_ITEM; + case COMPLETED_FAILED -> + childFrame.getExceptionalHaltReason().isPresent() + ? EOF1_FAILURE_STACK_ITEM + : EOF1_EXCEPTION_STACK_ITEM; default -> EOF1_FAILURE_STACK_ITEM; }; } diff --git a/evm/src/main/java/org/hyperledger/besu/evm/operation/ExtCallOperation.java b/evm/src/main/java/org/hyperledger/besu/evm/operation/ExtCallOperation.java index bf986a572..5914f0e96 100644 --- a/evm/src/main/java/org/hyperledger/besu/evm/operation/ExtCallOperation.java +++ b/evm/src/main/java/org/hyperledger/besu/evm/operation/ExtCallOperation.java @@ -24,9 +24,7 @@ import org.hyperledger.besu.evm.gascalculator.GasCalculator; /** The Call operation. */ public class ExtCallOperation extends AbstractExtCallOperation { - static final int STACK_VALUE = 1; - static final int STACK_INPUT_OFFSET = 2; - static final int STACK_INPUT_LENGTH = 3; + static final int STACK_VALUE = 3; /** * Instantiates a new Call operation. diff --git a/evm/src/main/java/org/hyperledger/besu/evm/operation/ExtDelegateCallOperation.java b/evm/src/main/java/org/hyperledger/besu/evm/operation/ExtDelegateCallOperation.java index bddb337c7..db851ee5a 100644 --- a/evm/src/main/java/org/hyperledger/besu/evm/operation/ExtDelegateCallOperation.java +++ b/evm/src/main/java/org/hyperledger/besu/evm/operation/ExtDelegateCallOperation.java @@ -24,9 +24,6 @@ import org.hyperledger.besu.evm.gascalculator.GasCalculator; /** The Delegate call operation. */ public class ExtDelegateCallOperation extends AbstractExtCallOperation { - static final int STACK_INPUT_OFFSET = 1; - static final int STACK_INPUT_LENGTH = 2; - /** * Instantiates a new Delegate call operation. * diff --git a/evm/src/main/java/org/hyperledger/besu/evm/operation/ExtStaticCallOperation.java b/evm/src/main/java/org/hyperledger/besu/evm/operation/ExtStaticCallOperation.java index 3a202f46e..ef3dc042d 100644 --- a/evm/src/main/java/org/hyperledger/besu/evm/operation/ExtStaticCallOperation.java +++ b/evm/src/main/java/org/hyperledger/besu/evm/operation/ExtStaticCallOperation.java @@ -24,9 +24,6 @@ import org.hyperledger.besu.evm.gascalculator.GasCalculator; /** The Static call operation. */ public class ExtStaticCallOperation extends AbstractExtCallOperation { - static final int STACK_INPUT_OFFSET = 1; - static final int STACK_INPUT_LENGTH = 2; - /** * Instantiates a new Static call operation. * diff --git a/evm/src/test/java/org/hyperledger/besu/evm/operations/ExtCallOperationTest.java b/evm/src/test/java/org/hyperledger/besu/evm/operations/ExtCallOperationTest.java index 984ce2802..946dd0b52 100644 --- a/evm/src/test/java/org/hyperledger/besu/evm/operations/ExtCallOperationTest.java +++ b/evm/src/test/java/org/hyperledger/besu/evm/operations/ExtCallOperationTest.java @@ -211,9 +211,9 @@ public class ExtCallOperationTest { new TestMessageFrameBuilder() .initialGas(parentGas) .pushStackItem(CONTRACT_ADDRESS) // canary for non-returning - .pushStackItem(Bytes.EMPTY) - .pushStackItem(Bytes.EMPTY) .pushStackItem(valueSent) + .pushStackItem(Bytes.EMPTY) + .pushStackItem(Bytes.EMPTY) .pushStackItem(CONTRACT_ADDRESS) .worldUpdater(worldUpdater) .isStatic(isStatic) diff --git a/testutil/src/main/java/org/hyperledger/besu/testutil/JsonTestParameters.java b/testutil/src/main/java/org/hyperledger/besu/testutil/JsonTestParameters.java index 062e14cfc..f95ac9348 100644 --- a/testutil/src/main/java/org/hyperledger/besu/testutil/JsonTestParameters.java +++ b/testutil/src/main/java/org/hyperledger/besu/testutil/JsonTestParameters.java @@ -96,6 +96,7 @@ public class JsonTestParameters { * @param fullPath the full path of the test * @param fork the fork to be tested * @param code the code to be tested + * @param containerKind the containerKind, if specified * @param value the value * @param runTest the run test */ @@ -104,10 +105,13 @@ public class JsonTestParameters { final String fullPath, final String fork, final Bytes code, + final String containerKind, final S value, final boolean runTest) { testParameters.add( - new Object[] {name, fork, code, value, runTest && includes(name) && includes(fullPath)}); + new Object[] { + name, fork, code, containerKind, value, runTest && includes(name) && includes(fullPath) + }); } private boolean includes(final String name) { @@ -304,7 +308,7 @@ public class JsonTestParameters { final List files = new ArrayList<>(); for (final String path : paths) { final URL url = classLoader.getResource(path); - checkState(url != null, "Cannot find test directory " + path); + checkState(url != null, "Cannot find test directory %s", path); final Path dir; try { dir = Paths.get(url.toURI()); From dfee65665dcd021b81aa02a3557692df2949d99a Mon Sep 17 00:00:00 2001 From: garyschulte Date: Fri, 12 Jul 2024 10:53:16 -0700 Subject: [PATCH 48/58] test template refactor, bump besu-native to 0.9.2 (#7315) Signed-off-by: garyschulte --- ethereum/evmtool/build.gradle | 2 +- ethereum/referencetests/build.gradle | 32 ++- .../BlockchainReferenceTest.java.template | 2 +- .../ExecutionSpecStateTest.java.template | 37 --- .../templates/ExecutionSpecTest.java.template | 36 --- .../GeneralStateReferenceTest.java.template | 2 +- evm/build.gradle | 1 + gradle/verification-metadata.xml | 248 +++++++----------- gradle/versions.gradle | 3 +- 9 files changed, 122 insertions(+), 241 deletions(-) delete mode 100644 ethereum/referencetests/src/reference-test/templates/ExecutionSpecStateTest.java.template delete mode 100644 ethereum/referencetests/src/reference-test/templates/ExecutionSpecTest.java.template diff --git a/ethereum/evmtool/build.gradle b/ethereum/evmtool/build.gradle index aaddc354d..5712e7174 100644 --- a/ethereum/evmtool/build.gradle +++ b/ethereum/evmtool/build.gradle @@ -15,7 +15,7 @@ */ plugins { - id 'org.graalvm.buildtools.native' version '0.9.17' + id 'org.graalvm.buildtools.native' version '0.10.2' } apply plugin: 'java-library' diff --git a/ethereum/referencetests/build.gradle b/ethereum/referencetests/build.gradle index c023dcd69..11db6b8ee 100644 --- a/ethereum/referencetests/build.gradle +++ b/ethereum/referencetests/build.gradle @@ -34,6 +34,7 @@ def blockchainReferenceTests = tasks.register("blockchainReferenceTests") { "BlockchainTests", "$generatedTestsPath/org/hyperledger/besu/ethereum/vm/blockchain", "BlockchainReferenceTest", + "org.hyperledger.besu.ethereum.vm.blockchain", ("BlockchainTests/InvalidBlocks/bcExpectSection") // exclude test for test filling tool ) } @@ -50,6 +51,7 @@ def eipBlockchainReferenceTests = tasks.register("eipBlockchainReferenceTests") "EIPTests${File.separatorChar}BlockchainTests", "$generatedTestsPath/org/hyperledger/besu/ethereum/vm/eip", "EIPBlockchainReferenceTest", + "org.hyperledger.besu.ethereum.vm.eip", ) } @@ -65,6 +67,7 @@ def eipStateReferenceTests = tasks.register("eipStateReferenceTests") { "EIPTests${File.separatorChar}StateTests", "$generatedTestsPath/org/hyperledger/besu/ethereum/vm/eip", "EIPStateReferenceTest", + "org.hyperledger.besu.ethereum.vm.eip", ) } @@ -83,19 +86,21 @@ def executionSpecTests = tasks.register("executionSpecTests") { // generate blockchain_tests: generateTestFiles( fileTree(referenceTestsPath + "/fixtures/blockchain_tests"), - file("src/reference-test/templates/ExecutionSpecTest.java.template"), + file("src/reference-test/templates/BlockchainReferenceTest.java.template"), "fixtures", "$generatedTestsPath/org/hyperledger/besu/ethereum/vm/executionspec", - "ExecutionSpecBlockchainTest" + "ExecutionSpecBlockchainTest", + "org.hyperledger.besu.ethereum.vm.executionspec", ) // generate state_tests: generateTestFiles( fileTree(referenceTestsPath + "/fixtures/state_tests"), - file("src/reference-test/templates/ExecutionSpecStateTest.java.template"), + file("src/reference-test/templates/GeneralStateReferenceTest.java.template"), "fixtures", "$generatedTestsPath/org/hyperledger/besu/ethereum/vm/executionspec", - "ExecutionSpecStateTest" + "ExecutionSpecStateTest", + "org.hyperledger.besu.ethereum.vm.executionspec", ) } @@ -110,7 +115,8 @@ def generalstateReferenceTests = tasks.register("generalstateReferenceTests") { file("src/reference-test/templates/GeneralStateReferenceTest.java.template"), "GeneralStateTests", "$generatedTestsPath/org/hyperledger/besu/ethereum/vm/generalstate", - "GeneralStateReferenceTest" + "GeneralStateReferenceTest", + "org.hyperledger.besu.ethereum.vm.generalstate", ) } @@ -125,7 +131,8 @@ def generalstateRegressionReferenceTests = tasks.register("generalstateRegressio file("src/reference-test/templates/GeneralStateReferenceTest.java.template"), "regressions", "$generatedTestsPath/org/hyperledger/besu/ethereum/vm/generalstate", - "GeneralStateRegressionReferenceTest" + "GeneralStateRegressionReferenceTest", + "org.hyperledger.besu.ethereum.vm.generalstate" ) } @@ -140,7 +147,8 @@ def eofReferenceTests = tasks.register("eofReferenceTests") { file("src/reference-test/templates/EOFReferenceTest.java.template"), "EOFTests", "$generatedTestsPath/org/hyperledger/besu/ethereum/vm/eof", - "EOFReferenceTest" + "EOFReferenceTest", + "org.hyperledger.besu.ethereum.vm.eof" ) } @@ -259,7 +267,14 @@ following commands: } processResources.dependsOn('validateReferenceTestSubmodule') -def generateTestFiles(FileTree jsonPath, File templateFile, String pathstrip, String destination, String namePrefix, String ... excludedPath) { +def generateTestFiles( + FileTree jsonPath, + File templateFile, + String pathstrip, + String destination, + String namePrefix, + String packageString, + String ... excludedPath) { mkdir(destination) def referenceTestTemplate = templateFile.text @@ -281,6 +296,7 @@ def generateTestFiles(FileTree jsonPath, File templateFile, String pathstrip, St def testFileContents = referenceTestTemplate .replaceAll("%%TESTS_FILE%%", allPaths) .replaceAll("%%TESTS_NAME%%", namePrefix + "_" + idx) + .replaceAll("%%PACKAGE_NAME%%", packageString) testFile.newWriter().withWriter { w -> w << testFileContents } } } diff --git a/ethereum/referencetests/src/reference-test/templates/BlockchainReferenceTest.java.template b/ethereum/referencetests/src/reference-test/templates/BlockchainReferenceTest.java.template index 387fb0cc1..e7789905b 100644 --- a/ethereum/referencetests/src/reference-test/templates/BlockchainReferenceTest.java.template +++ b/ethereum/referencetests/src/reference-test/templates/BlockchainReferenceTest.java.template @@ -1,4 +1,4 @@ -package org.hyperledger.besu.ethereum.vm.blockchain; +package %%PACKAGE_NAME%%; import static org.hyperledger.besu.ethereum.vm.BlockchainReferenceTestTools.executeTest; import static org.hyperledger.besu.ethereum.vm.BlockchainReferenceTestTools.generateTestParametersForConfig; diff --git a/ethereum/referencetests/src/reference-test/templates/ExecutionSpecStateTest.java.template b/ethereum/referencetests/src/reference-test/templates/ExecutionSpecStateTest.java.template deleted file mode 100644 index 76da5d64f..000000000 --- a/ethereum/referencetests/src/reference-test/templates/ExecutionSpecStateTest.java.template +++ /dev/null @@ -1,37 +0,0 @@ -package org.hyperledger.besu.ethereum.vm.executionspec; - -import static org.hyperledger.besu.ethereum.vm.GeneralStateReferenceTestTools.executeTest; -import static org.hyperledger.besu.ethereum.vm.GeneralStateReferenceTestTools.generateTestParametersForConfig; -import static org.junit.jupiter.api.Assumptions.assumeTrue; - -import org.hyperledger.besu.ethereum.referencetests.GeneralStateTestCaseEipSpec; - -import java.util.stream.Stream; - -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.Arguments; -import org.junit.jupiter.params.provider.MethodSource; - -import static org.junit.jupiter.api.Assumptions.assumeTrue; - -/** The general state test operation testing framework entry point. */ -public class %%TESTS_NAME%% { - - private static final String[] TEST_CONFIG_FILE_DIR_PATH = new String[] {%%TESTS_FILE%%}; - - public static Stream getTestParametersForConfig() { - return generateTestParametersForConfig(TEST_CONFIG_FILE_DIR_PATH).stream().map(params -> - Arguments.of(params[0], params[1], params[2]) - ); - } - - @ParameterizedTest(name = "Name: {0}") - @MethodSource("getTestParametersForConfig") - public void execution( - final String name, - final GeneralStateTestCaseEipSpec spec, - final boolean runTest) { - assumeTrue(runTest, "Test " + name + " was ignored"); - executeTest(spec); - } -} diff --git a/ethereum/referencetests/src/reference-test/templates/ExecutionSpecTest.java.template b/ethereum/referencetests/src/reference-test/templates/ExecutionSpecTest.java.template deleted file mode 100644 index d56115f12..000000000 --- a/ethereum/referencetests/src/reference-test/templates/ExecutionSpecTest.java.template +++ /dev/null @@ -1,36 +0,0 @@ -package org.hyperledger.besu.ethereum.vm.executionspec; - -import static org.hyperledger.besu.ethereum.vm.BlockchainReferenceTestTools.executeTest; -import static org.hyperledger.besu.ethereum.vm.BlockchainReferenceTestTools.generateTestParametersForConfig; - -import org.hyperledger.besu.ethereum.referencetests.BlockchainReferenceTestCaseSpec; - -import java.util.stream.Stream; - -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.Arguments; -import org.junit.jupiter.params.provider.MethodSource; - -import static org.junit.jupiter.api.Assumptions.assumeTrue; - -/** The blockchain test operation testing framework entry point. */ -public class %%TESTS_NAME%% { - - private static final String[] TEST_CONFIG_FILE_DIR_PATH = new String[] {%%TESTS_FILE%%}; - - public static Stream getTestParametersForConfig() { - return generateTestParametersForConfig(TEST_CONFIG_FILE_DIR_PATH).stream().map(params -> - Arguments.of(params[0], params[1], params[2]) - ); - } - - @ParameterizedTest(name = "Name: {0}") - @MethodSource("getTestParametersForConfig") - public void execution( - final String name, - final BlockchainReferenceTestCaseSpec spec, - final boolean runTest) { - assumeTrue(runTest, "Test " + name + " was ignored"); - executeTest(spec); - } -} diff --git a/ethereum/referencetests/src/reference-test/templates/GeneralStateReferenceTest.java.template b/ethereum/referencetests/src/reference-test/templates/GeneralStateReferenceTest.java.template index 3d5976aff..139766a4b 100644 --- a/ethereum/referencetests/src/reference-test/templates/GeneralStateReferenceTest.java.template +++ b/ethereum/referencetests/src/reference-test/templates/GeneralStateReferenceTest.java.template @@ -1,4 +1,4 @@ -package org.hyperledger.besu.ethereum.vm.generalstate; +package %%PACKAGE_NAME%%; import static org.hyperledger.besu.ethereum.vm.GeneralStateReferenceTestTools.executeTest; import static org.hyperledger.besu.ethereum.vm.GeneralStateReferenceTestTools.generateTestParametersForConfig; diff --git a/evm/build.gradle b/evm/build.gradle index efcab24b7..b6f8ea361 100644 --- a/evm/build.gradle +++ b/evm/build.gradle @@ -44,6 +44,7 @@ dependencies { implementation 'io.tmio:tuweni-units' implementation 'org.hyperledger.besu:arithmetic' implementation 'org.hyperledger.besu:bls12-381' + implementation'org.hyperledger.besu:gnark' implementation 'tech.pegasys:jc-kzg-4844' compileOnly 'com.fasterxml.jackson.core:jackson-databind' diff --git a/gradle/verification-metadata.xml b/gradle/verification-metadata.xml index 86f65970e..bd437c3a4 100644 --- a/gradle/verification-metadata.xml +++ b/gradle/verification-metadata.xml @@ -114,9 +114,9 @@ - - - + + + @@ -134,9 +134,9 @@ - - - + + + @@ -189,12 +189,12 @@ - - - + + + - - + + @@ -221,12 +221,12 @@ - - - + + + - - + + @@ -253,12 +253,12 @@ - - - + + + - - + + @@ -1361,14 +1361,6 @@ - - - - - - - - @@ -2507,14 +2499,6 @@ - - - - - - - - @@ -2531,22 +2515,6 @@ - - - - - - - - - - - - - - - - @@ -2765,14 +2733,6 @@ - - - - - - - - @@ -3139,11 +3099,6 @@ - - - - - @@ -4603,41 +4558,41 @@ - - - + + + - - + + - - - + + + - - + + - - - + + + - - + + - - - + + + - - + + - - - + + + @@ -4677,12 +4632,12 @@ - - - + + + - - + + @@ -4693,44 +4648,52 @@ - - - + + + - - + + - - - + + + - - + + - - - + + + - - + + - - - + + + - - + + - - - + + + - - + + + + + + + + + + @@ -5060,17 +5023,6 @@ - - - - - - - - - - - @@ -5177,14 +5129,6 @@ - - - - - - - - @@ -5193,14 +5137,6 @@ - - - - - - - - @@ -5304,6 +5240,11 @@ + + + + + @@ -5312,11 +5253,6 @@ - - - - - @@ -5336,6 +5272,11 @@ + + + + + @@ -5352,11 +5293,6 @@ - - - - - diff --git a/gradle/versions.gradle b/gradle/versions.gradle index db29cfd58..0c2289233 100644 --- a/gradle/versions.gradle +++ b/gradle/versions.gradle @@ -156,13 +156,14 @@ dependencyManagement { dependency 'org.openjdk.jol:jol-core:0.17' dependency 'tech.pegasys:jc-kzg-4844:1.0.0' - dependencySet(group: 'org.hyperledger.besu', version: '0.8.5') { + dependencySet(group: 'org.hyperledger.besu', version: '0.9.2') { entry 'arithmetic' entry 'ipa-multipoint' entry 'bls12-381' entry 'secp256k1' entry 'secp256r1' entry 'blake2bf' + entry 'gnark' } dependencySet(group: 'org.immutables', version: '2.10.0') { From 45dbc8a9a3778c48a0228215533fb9a75eeb3313 Mon Sep 17 00:00:00 2001 From: garyschulte Date: Sun, 14 Jul 2024 15:46:44 -0700 Subject: [PATCH 49/58] Feature/use gnark-crypto for eip-2537 (#7316) * use gnark-crypto for bls precompiles Signed-off-by: garyschulte --- CHANGELOG.md | 1 + ethereum/core/build.gradle | 1 - .../AbstractBLS12PrecompiledContract.java | 20 +- .../BLS12G1AddPrecompiledContract.java | 4 +- .../BLS12G1MulPrecompiledContract.java | 4 +- .../BLS12G1MultiExpPrecompiledContract.java | 4 +- .../BLS12G2AddPrecompiledContract.java | 4 +- .../BLS12G2MulPrecompiledContract.java | 4 +- .../BLS12G2MultiExpPrecompiledContract.java | 4 +- .../BLS12MapFp2ToG2PrecompiledContract.java | 4 +- .../BLS12MapFpToG1PrecompiledContract.java | 4 +- .../BLS12PairingPrecompiledContract.java | 4 +- .../besu/evm/precompile/g1_add.csv | 4 +- .../besu/evm/precompile/g1_mul.csv | 4 +- .../besu/evm/precompile/g1_multiexp.csv | 8 +- .../besu/evm/precompile/g2_add.csv | 4 +- .../besu/evm/precompile/g2_mul.csv | 8 +- .../besu/evm/precompile/g2_multiexp.csv | 12 +- .../invalid_subgroup_for_pairing.csv | 200 +++++++++--------- .../besu/evm/precompile/pairing.csv | 12 +- 20 files changed, 156 insertions(+), 154 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0b783b1dc..c8a6730a9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,7 @@ - Add support to load external profiles using `--profile` [#7265](https://github.com/hyperledger/besu/issues/7265) - `privacy-nonce-always-increments` option enables private transactions to always increment the nonce, even if the transaction is invalid [#6593](https://github.com/hyperledger/besu/pull/6593) - Added `block-test` subcommand to the evmtool which runs blockchain reference tests [#7293](https://github.com/hyperledger/besu/pull/7293) +- implement gnark-crypto for eip-2537 [#7316](https://github.com/hyperledger/besu/pull/7316) ### Bug fixes diff --git a/ethereum/core/build.gradle b/ethereum/core/build.gradle index 4abde77ac..0a25fa1a4 100644 --- a/ethereum/core/build.gradle +++ b/ethereum/core/build.gradle @@ -61,7 +61,6 @@ dependencies { implementation 'io.tmio:tuweni-concurrent' implementation 'io.tmio:tuweni-units' implementation 'io.tmio:tuweni-rlp' - implementation 'org.hyperledger.besu:bls12-381' implementation 'org.immutables:value-annotations' implementation 'tech.pegasys:jc-kzg-4844' diff --git a/evm/src/main/java/org/hyperledger/besu/evm/precompile/AbstractBLS12PrecompiledContract.java b/evm/src/main/java/org/hyperledger/besu/evm/precompile/AbstractBLS12PrecompiledContract.java index 21eab01f9..67fecb92a 100644 --- a/evm/src/main/java/org/hyperledger/besu/evm/precompile/AbstractBLS12PrecompiledContract.java +++ b/evm/src/main/java/org/hyperledger/besu/evm/precompile/AbstractBLS12PrecompiledContract.java @@ -18,7 +18,7 @@ import static java.nio.charset.StandardCharsets.UTF_8; import org.hyperledger.besu.evm.frame.ExceptionalHaltReason; import org.hyperledger.besu.evm.frame.MessageFrame; -import org.hyperledger.besu.nativelib.bls12_381.LibEthPairings; +import org.hyperledger.besu.nativelib.gnark.LibGnarkEIP2537; import java.util.Optional; import javax.annotation.Nonnull; @@ -52,7 +52,7 @@ public abstract class AbstractBLS12PrecompiledContract implements PrecompiledCon private final String name; private final byte operationId; - private final int inputLen; + private final int inputLimit; /** * Instantiates a new Abstract BLS12 precompiled contract. @@ -64,7 +64,7 @@ public abstract class AbstractBLS12PrecompiledContract implements PrecompiledCon AbstractBLS12PrecompiledContract(final String name, final byte operationId, final int inputLen) { this.name = name; this.operationId = operationId; - this.inputLen = inputLen + 1; + this.inputLimit = inputLen + 1; } @Override @@ -76,16 +76,17 @@ public abstract class AbstractBLS12PrecompiledContract implements PrecompiledCon @Override public PrecompileContractResult computePrecompile( final Bytes input, @Nonnull final MessageFrame messageFrame) { - final byte[] result = new byte[LibEthPairings.EIP2537_PREALLOCATE_FOR_RESULT_BYTES]; - final byte[] error = new byte[LibEthPairings.EIP2537_PREALLOCATE_FOR_ERROR_BYTES]; + final byte[] result = new byte[LibGnarkEIP2537.EIP2537_PREALLOCATE_FOR_RESULT_BYTES]; + final byte[] error = new byte[LibGnarkEIP2537.EIP2537_PREALLOCATE_FOR_ERROR_BYTES]; final IntByReference o_len = - new IntByReference(LibEthPairings.EIP2537_PREALLOCATE_FOR_RESULT_BYTES); + new IntByReference(LibGnarkEIP2537.EIP2537_PREALLOCATE_FOR_RESULT_BYTES); final IntByReference err_len = - new IntByReference(LibEthPairings.EIP2537_PREALLOCATE_FOR_ERROR_BYTES); - final int inputSize = Math.min(inputLen, input.size()); + new IntByReference(LibGnarkEIP2537.EIP2537_PREALLOCATE_FOR_ERROR_BYTES); + + final int inputSize = Math.min(inputLimit, input.size()); final int errorNo = - LibEthPairings.eip2537_perform_operation( + LibGnarkEIP2537.eip2537_perform_operation( operationId, input.slice(0, inputSize).toArrayUnsafe(), inputSize, @@ -93,6 +94,7 @@ public abstract class AbstractBLS12PrecompiledContract implements PrecompiledCon o_len, error, err_len); + if (errorNo == 0) { return PrecompileContractResult.success(Bytes.wrap(result, 0, o_len.getValue())); } else { diff --git a/evm/src/main/java/org/hyperledger/besu/evm/precompile/BLS12G1AddPrecompiledContract.java b/evm/src/main/java/org/hyperledger/besu/evm/precompile/BLS12G1AddPrecompiledContract.java index 8f04c2d69..59e4336a0 100644 --- a/evm/src/main/java/org/hyperledger/besu/evm/precompile/BLS12G1AddPrecompiledContract.java +++ b/evm/src/main/java/org/hyperledger/besu/evm/precompile/BLS12G1AddPrecompiledContract.java @@ -14,7 +14,7 @@ */ package org.hyperledger.besu.evm.precompile; -import org.hyperledger.besu.nativelib.bls12_381.LibEthPairings; +import org.hyperledger.besu.nativelib.gnark.LibGnarkEIP2537; import org.apache.tuweni.bytes.Bytes; @@ -25,7 +25,7 @@ public class BLS12G1AddPrecompiledContract extends AbstractBLS12PrecompiledContr /** Instantiates a new BLS12G1 Add precompiled contract. */ public BLS12G1AddPrecompiledContract() { - super("BLS12_G1ADD", LibEthPairings.BLS12_G1ADD_OPERATION_RAW_VALUE, PARAMETER_LENGTH); + super("BLS12_G1ADD", LibGnarkEIP2537.BLS12_G1ADD_OPERATION_SHIM_VALUE, PARAMETER_LENGTH); } @Override diff --git a/evm/src/main/java/org/hyperledger/besu/evm/precompile/BLS12G1MulPrecompiledContract.java b/evm/src/main/java/org/hyperledger/besu/evm/precompile/BLS12G1MulPrecompiledContract.java index baf1ed35f..8c76571e1 100644 --- a/evm/src/main/java/org/hyperledger/besu/evm/precompile/BLS12G1MulPrecompiledContract.java +++ b/evm/src/main/java/org/hyperledger/besu/evm/precompile/BLS12G1MulPrecompiledContract.java @@ -14,7 +14,7 @@ */ package org.hyperledger.besu.evm.precompile; -import org.hyperledger.besu.nativelib.bls12_381.LibEthPairings; +import org.hyperledger.besu.nativelib.gnark.LibGnarkEIP2537; import org.apache.tuweni.bytes.Bytes; @@ -25,7 +25,7 @@ public class BLS12G1MulPrecompiledContract extends AbstractBLS12PrecompiledContr /** Instantiates a new BLS12G1 Mul precompiled contract. */ public BLS12G1MulPrecompiledContract() { - super("BLS12_G1MUL", LibEthPairings.BLS12_G1MUL_OPERATION_RAW_VALUE, PARAMETER_LENGTH); + super("BLS12_G1MUL", LibGnarkEIP2537.BLS12_G1MUL_OPERATION_SHIM_VALUE, PARAMETER_LENGTH); } @Override diff --git a/evm/src/main/java/org/hyperledger/besu/evm/precompile/BLS12G1MultiExpPrecompiledContract.java b/evm/src/main/java/org/hyperledger/besu/evm/precompile/BLS12G1MultiExpPrecompiledContract.java index e3366f491..353bb203e 100644 --- a/evm/src/main/java/org/hyperledger/besu/evm/precompile/BLS12G1MultiExpPrecompiledContract.java +++ b/evm/src/main/java/org/hyperledger/besu/evm/precompile/BLS12G1MultiExpPrecompiledContract.java @@ -14,7 +14,7 @@ */ package org.hyperledger.besu.evm.precompile; -import org.hyperledger.besu.nativelib.bls12_381.LibEthPairings; +import org.hyperledger.besu.nativelib.gnark.LibGnarkEIP2537; import org.apache.tuweni.bytes.Bytes; @@ -27,7 +27,7 @@ public class BLS12G1MultiExpPrecompiledContract extends AbstractBLS12Precompiled public BLS12G1MultiExpPrecompiledContract() { super( "BLS12_G1MULTIEXP", - LibEthPairings.BLS12_G1MULTIEXP_OPERATION_RAW_VALUE, + LibGnarkEIP2537.BLS12_G1MULTIEXP_OPERATION_SHIM_VALUE, Integer.MAX_VALUE / PARAMETER_LENGTH * PARAMETER_LENGTH); } diff --git a/evm/src/main/java/org/hyperledger/besu/evm/precompile/BLS12G2AddPrecompiledContract.java b/evm/src/main/java/org/hyperledger/besu/evm/precompile/BLS12G2AddPrecompiledContract.java index ec6a1bea3..3e12b5c8b 100644 --- a/evm/src/main/java/org/hyperledger/besu/evm/precompile/BLS12G2AddPrecompiledContract.java +++ b/evm/src/main/java/org/hyperledger/besu/evm/precompile/BLS12G2AddPrecompiledContract.java @@ -14,7 +14,7 @@ */ package org.hyperledger.besu.evm.precompile; -import org.hyperledger.besu.nativelib.bls12_381.LibEthPairings; +import org.hyperledger.besu.nativelib.gnark.LibGnarkEIP2537; import org.apache.tuweni.bytes.Bytes; @@ -25,7 +25,7 @@ public class BLS12G2AddPrecompiledContract extends AbstractBLS12PrecompiledContr /** Instantiates a new BLS12_G2 Add precompiled contract. */ public BLS12G2AddPrecompiledContract() { - super("BLS12_G2ADD", LibEthPairings.BLS12_G2ADD_OPERATION_RAW_VALUE, PARAMETER_LENGTH); + super("BLS12_G2ADD", LibGnarkEIP2537.BLS12_G2ADD_OPERATION_SHIM_VALUE, PARAMETER_LENGTH); } @Override diff --git a/evm/src/main/java/org/hyperledger/besu/evm/precompile/BLS12G2MulPrecompiledContract.java b/evm/src/main/java/org/hyperledger/besu/evm/precompile/BLS12G2MulPrecompiledContract.java index a33f4dc4a..441b59c5a 100644 --- a/evm/src/main/java/org/hyperledger/besu/evm/precompile/BLS12G2MulPrecompiledContract.java +++ b/evm/src/main/java/org/hyperledger/besu/evm/precompile/BLS12G2MulPrecompiledContract.java @@ -14,7 +14,7 @@ */ package org.hyperledger.besu.evm.precompile; -import org.hyperledger.besu.nativelib.bls12_381.LibEthPairings; +import org.hyperledger.besu.nativelib.gnark.LibGnarkEIP2537; import org.apache.tuweni.bytes.Bytes; @@ -25,7 +25,7 @@ public class BLS12G2MulPrecompiledContract extends AbstractBLS12PrecompiledContr /** Instantiates a new BLS12_G2Mul precompiled contract. */ public BLS12G2MulPrecompiledContract() { - super("BLS12_G2MUL", LibEthPairings.BLS12_G2MUL_OPERATION_RAW_VALUE, PARAMETER_LENGTH); + super("BLS12_G2MUL", LibGnarkEIP2537.BLS12_G2MUL_OPERATION_SHIM_VALUE, PARAMETER_LENGTH); } @Override diff --git a/evm/src/main/java/org/hyperledger/besu/evm/precompile/BLS12G2MultiExpPrecompiledContract.java b/evm/src/main/java/org/hyperledger/besu/evm/precompile/BLS12G2MultiExpPrecompiledContract.java index ee4448d40..3344f075a 100644 --- a/evm/src/main/java/org/hyperledger/besu/evm/precompile/BLS12G2MultiExpPrecompiledContract.java +++ b/evm/src/main/java/org/hyperledger/besu/evm/precompile/BLS12G2MultiExpPrecompiledContract.java @@ -14,7 +14,7 @@ */ package org.hyperledger.besu.evm.precompile; -import org.hyperledger.besu.nativelib.bls12_381.LibEthPairings; +import org.hyperledger.besu.nativelib.gnark.LibGnarkEIP2537; import org.apache.tuweni.bytes.Bytes; @@ -27,7 +27,7 @@ public class BLS12G2MultiExpPrecompiledContract extends AbstractBLS12Precompiled public BLS12G2MultiExpPrecompiledContract() { super( "BLS12_G2MULTIEXP", - LibEthPairings.BLS12_G2MULTIEXP_OPERATION_RAW_VALUE, + LibGnarkEIP2537.BLS12_G2MULTIEXP_OPERATION_SHIM_VALUE, Integer.MAX_VALUE / PARAMETER_LENGTH * PARAMETER_LENGTH); } diff --git a/evm/src/main/java/org/hyperledger/besu/evm/precompile/BLS12MapFp2ToG2PrecompiledContract.java b/evm/src/main/java/org/hyperledger/besu/evm/precompile/BLS12MapFp2ToG2PrecompiledContract.java index 650068387..ddac7627a 100644 --- a/evm/src/main/java/org/hyperledger/besu/evm/precompile/BLS12MapFp2ToG2PrecompiledContract.java +++ b/evm/src/main/java/org/hyperledger/besu/evm/precompile/BLS12MapFp2ToG2PrecompiledContract.java @@ -14,7 +14,7 @@ */ package org.hyperledger.besu.evm.precompile; -import org.hyperledger.besu.nativelib.bls12_381.LibEthPairings; +import org.hyperledger.besu.nativelib.gnark.LibGnarkEIP2537; import org.apache.tuweni.bytes.Bytes; @@ -27,7 +27,7 @@ public class BLS12MapFp2ToG2PrecompiledContract extends AbstractBLS12Precompiled public BLS12MapFp2ToG2PrecompiledContract() { super( "BLS12_MAP_FIELD_TO_CURVE", - LibEthPairings.BLS12_MAP_FP2_TO_G2_OPERATION_RAW_VALUE, + LibGnarkEIP2537.BLS12_MAP_FP2_TO_G2_OPERATION_SHIM_VALUE, PARAMETER_LENGTH); } diff --git a/evm/src/main/java/org/hyperledger/besu/evm/precompile/BLS12MapFpToG1PrecompiledContract.java b/evm/src/main/java/org/hyperledger/besu/evm/precompile/BLS12MapFpToG1PrecompiledContract.java index a512b2496..c2598358d 100644 --- a/evm/src/main/java/org/hyperledger/besu/evm/precompile/BLS12MapFpToG1PrecompiledContract.java +++ b/evm/src/main/java/org/hyperledger/besu/evm/precompile/BLS12MapFpToG1PrecompiledContract.java @@ -14,7 +14,7 @@ */ package org.hyperledger.besu.evm.precompile; -import org.hyperledger.besu.nativelib.bls12_381.LibEthPairings; +import org.hyperledger.besu.nativelib.gnark.LibGnarkEIP2537; import org.apache.tuweni.bytes.Bytes; @@ -27,7 +27,7 @@ public class BLS12MapFpToG1PrecompiledContract extends AbstractBLS12PrecompiledC public BLS12MapFpToG1PrecompiledContract() { super( "BLS12_MAP_FIELD_TO_CURVE", - LibEthPairings.BLS12_MAP_FP_TO_G1_OPERATION_RAW_VALUE, + LibGnarkEIP2537.BLS12_MAP_FP_TO_G1_OPERATION_SHIM_VALUE, PARAMETER_LENGTH); } diff --git a/evm/src/main/java/org/hyperledger/besu/evm/precompile/BLS12PairingPrecompiledContract.java b/evm/src/main/java/org/hyperledger/besu/evm/precompile/BLS12PairingPrecompiledContract.java index d275db3f9..e0e568188 100644 --- a/evm/src/main/java/org/hyperledger/besu/evm/precompile/BLS12PairingPrecompiledContract.java +++ b/evm/src/main/java/org/hyperledger/besu/evm/precompile/BLS12PairingPrecompiledContract.java @@ -14,7 +14,7 @@ */ package org.hyperledger.besu.evm.precompile; -import org.hyperledger.besu.nativelib.bls12_381.LibEthPairings; +import org.hyperledger.besu.nativelib.gnark.LibGnarkEIP2537; import org.apache.tuweni.bytes.Bytes; @@ -27,7 +27,7 @@ public class BLS12PairingPrecompiledContract extends AbstractBLS12PrecompiledCon public BLS12PairingPrecompiledContract() { super( "BLS12_PAIRING", - LibEthPairings.BLS12_PAIR_OPERATION_RAW_VALUE, + LibGnarkEIP2537.BLS12_PAIR_OPERATION_SHIM_VALUE, Integer.MAX_VALUE / PARAMETER_LENGTH * PARAMETER_LENGTH); } diff --git a/evm/src/test/resources/org/hyperledger/besu/evm/precompile/g1_add.csv b/evm/src/test/resources/org/hyperledger/besu/evm/precompile/g1_add.csv index 7b83f95da..b6714c2fc 100644 --- a/evm/src/test/resources/org/hyperledger/besu/evm/precompile/g1_add.csv +++ b/evm/src/test/resources/org/hyperledger/besu/evm/precompile/g1_add.csv @@ -101,5 +101,5 @@ input,result,gas,notes 000000000000000000000000000000000106df8eba767e90cce0eabdaacc24d8e226c6865012ef8cb1460de5a319d443fdc6b4f4e58fb668943e0528b1809da10000000000000000000000000000000019789f464c95c179af18704c0b67b881991880f75ee7b03b9feafa3eafcd0f7d30a17fdd9cf439ff7fe683adca2083b50000000000000000000000000000000017a81b957a12adf474a2913e8636f169ea9cd10be62c16b88f95f5caf661f158a032a9f7d249fdf2765caa1564bed0570000000000000000000000000000000017fbf2abc62dc2678b65d509e19c9c9c5d961c72565649a078da8dff98be6236ef314e9ff8022f639ff565353345c230,00000000000000000000000000000000002c8bc5f39b2c9fea01372429e92a9c945fad152da67174f4e478fdead734d50f6e2da867c235f1f2f11bdfee67d2a7000000000000000000000000000000000c1dd27aad9f5d48c4824da3071daedf0c7a0e2a0b0ed39c50c9d25e61334a9c96765e049542ccaa00e0eccb316eec08,500, 000000000000000000000000000000000012196c5a43d69224d8713389285f26b98f86ee910ab3dd668e413738282003cc5b7357af9a7af54bb713d62255e80f560000000000000000000000000000000006ba8102bfbeea4416b710c73e8cce3032c31c6269c44906f8ac4f7874ce99fb17559992486528963884ce429a992fee000000000000000000000000000000000001101098f5c39893765766af4512a0c74e1bb89bc7e6fdf14e3e7337d257cc0f94658179d83320b99f31ff94cd2bac0000000000000000000000000000000003e1a9f9f44ca2cdab4f43a1a3ee3470fdf90b2fc228eb3b709fcd72f014838ac82a6d797aeefed9a0804b22ed1ce8f7,,,invalid input parameters, invalid input length for G1 addition 00000000000000000000000000000012196c5a43d69224d8713389285f26b98f86ee910ab3dd668e413738282003cc5b7357af9a7af54bb713d62255e80f560000000000000000000000000000000006ba8102bfbeea4416b710c73e8cce3032c31c6269c44906f8ac4f7874ce99fb17559992486528963884ce429a992fee000000000000000000000000000000000001101098f5c39893765766af4512a0c74e1bb89bc7e6fdf14e3e7337d257cc0f94658179d83320b99f31ff94cd2bac0000000000000000000000000000000003e1a9f9f44ca2cdab4f43a1a3ee3470fdf90b2fc228eb3b709fcd72f014838ac82a6d797aeefed9a0804b22ed1ce8f7,,,invalid input parameters, invalid input length for G1 addition -0000000000000000000000000000000012196c5a43d69224d8713389285f26b98f86ee910ab3dd668e413738282003cc5b7357af9a7af54bb713d62255e80f570000000000000000000000000000000006ba8102bfbeea4416b710c73e8cce3032c31c6269c44906f8ac4f7874ce99fb17559992486528963884ce429a992fee000000000000000000000000000000000001101098f5c39893765766af4512a0c74e1bb89bc7e6fdf14e3e7337d257cc0f94658179d83320b99f31ff94cd2bac0000000000000000000000000000000003e1a9f9f44ca2cdab4f43a1a3ee3470fdf90b2fc228eb3b709fcd72f014838ac82a6d797aeefed9a0804b22ed1ce8f7,,,invalid input parameters, Point 0 is not on curve -0000000000000000000000000000000012196c5a43d69224d8713389285f26b98f86ee910ab3dd668e413738282003cc5b7357af9a7af54bb713d62255e80f560000000000000000000000000000000006ba8102bfbeea4416b710c73e8cce3032c31c6269c44906f8ac4f7874ce99fb17559992486528963884ce429a992fee000000000000000000000000000000000001101098f5c39893765766af4512a0c74e1bb89bc7e6fdf14e3e7337d257cc0f94658179d83320b99f31ff94cd2bad0000000000000000000000000000000003e1a9f9f44ca2cdab4f43a1a3ee3470fdf90b2fc228eb3b709fcd72f014838ac82a6d797aeefed9a0804b22ed1ce8f7,,,invalid input parameters, Point 1 is not on curve +0000000000000000000000000000000012196c5a43d69224d8713389285f26b98f86ee910ab3dd668e413738282003cc5b7357af9a7af54bb713d62255e80f570000000000000000000000000000000006ba8102bfbeea4416b710c73e8cce3032c31c6269c44906f8ac4f7874ce99fb17559992486528963884ce429a992fee000000000000000000000000000000000001101098f5c39893765766af4512a0c74e1bb89bc7e6fdf14e3e7337d257cc0f94658179d83320b99f31ff94cd2bac0000000000000000000000000000000003e1a9f9f44ca2cdab4f43a1a3ee3470fdf90b2fc228eb3b709fcd72f014838ac82a6d797aeefed9a0804b22ed1ce8f7,,,invalid point: point is not on curve +0000000000000000000000000000000012196c5a43d69224d8713389285f26b98f86ee910ab3dd668e413738282003cc5b7357af9a7af54bb713d62255e80f560000000000000000000000000000000006ba8102bfbeea4416b710c73e8cce3032c31c6269c44906f8ac4f7874ce99fb17559992486528963884ce429a992fee000000000000000000000000000000000001101098f5c39893765766af4512a0c74e1bb89bc7e6fdf14e3e7337d257cc0f94658179d83320b99f31ff94cd2bad0000000000000000000000000000000003e1a9f9f44ca2cdab4f43a1a3ee3470fdf90b2fc228eb3b709fcd72f014838ac82a6d797aeefed9a0804b22ed1ce8f7,,,invalid point: point is not on curve diff --git a/evm/src/test/resources/org/hyperledger/besu/evm/precompile/g1_mul.csv b/evm/src/test/resources/org/hyperledger/besu/evm/precompile/g1_mul.csv index 4ec77982a..3eb702f11 100644 --- a/evm/src/test/resources/org/hyperledger/besu/evm/precompile/g1_mul.csv +++ b/evm/src/test/resources/org/hyperledger/besu/evm/precompile/g1_mul.csv @@ -101,5 +101,5 @@ input,result,gas,notes 000000000000000000000000000000000106df8eba767e90cce0eabdaacc24d8e226c6865012ef8cb1460de5a319d443fdc6b4f4e58fb668943e0528b1809da10000000000000000000000000000000019789f464c95c179af18704c0b67b881991880f75ee7b03b9feafa3eafcd0f7d30a17fdd9cf439ff7fe683adca2083b57cf23dee8d95d94046678f3bdb4b0ea3d4e3a1a2f07f582e2a98ad6eb7562cbf,000000000000000000000000000000000bf700422a382546a74376b0292f3a49ceff5597f0d2b726b1ff099bcda7ba92238a21db12eff5c314a29dd2387bec850000000000000000000000000000000005e22e3c772f3634b1ccf4e311241977eb20e7269540ef22d379de26ab80c58461dfa3b67848e0d584fb11de1917949a,12000, 00000000000000000000000000000012196c5a43d69224d8713389285f26b98f86ee910ab3dd668e413738282003cc5b7357af9a7af54bb713d62255e80f560000000000000000000000000000000006ba8102bfbeea4416b710c73e8cce3032c31c6269c44906f8ac4f7874ce99fb17559992486528963884ce429a992feeb3c940fe79b6966489b527955de7599194a9ac69a6ff58b8d99e7b1084f0464e,,,invalid input parameters, invalid input length for G1 multiplication 000000000000000000000000000000000012196c5a43d69224d8713389285f26b98f86ee910ab3dd668e413738282003cc5b7357af9a7af54bb713d62255e80f560000000000000000000000000000000006ba8102bfbeea4416b710c73e8cce3032c31c6269c44906f8ac4f7874ce99fb17559992486528963884ce429a992feeb3c940fe79b6966489b527955de7599194a9ac69a6ff58b8d99e7b1084f0464e,,,invalid input parameters, invalid input length for G1 multiplication -0000000000000000000000000000000012196c5a43d69224d8713389285f26b98f86ee910ab3dd668e413738282003cc5b7357af9a7af54bb713d62255e80f570000000000000000000000000000000006ba8102bfbeea4416b710c73e8cce3032c31c6269c44906f8ac4f7874ce99fb17559992486528963884ce429a992feeb3c940fe79b6966489b527955de7599194a9ac69a6ff58b8d99e7b1084f0464e,,,invalid input parameters, Point is not on curve -000000000000000000000000000000000123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef00000000000000000000000000000000193fb7cedb32b2c3adc06ec11a96bc0d661869316f5e4a577a9f7c179593987beb4fb2ee424dbb2f5dd891e228b46c4a0000000000000000000000000000000000000000000000000000000000000002,,,Point is not in the expected subgroup \ No newline at end of file +0000000000000000000000000000000012196c5a43d69224d8713389285f26b98f86ee910ab3dd668e413738282003cc5b7357af9a7af54bb713d62255e80f570000000000000000000000000000000006ba8102bfbeea4416b710c73e8cce3032c31c6269c44906f8ac4f7874ce99fb17559992486528963884ce429a992feeb3c940fe79b6966489b527955de7599194a9ac69a6ff58b8d99e7b1084f0464e,,,invalid point: point is not on curve +000000000000000000000000000000000123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef00000000000000000000000000000000193fb7cedb32b2c3adc06ec11a96bc0d661869316f5e4a577a9f7c179593987beb4fb2ee424dbb2f5dd891e228b46c4a0000000000000000000000000000000000000000000000000000000000000002,,,invalid point: subgroup check failed diff --git a/evm/src/test/resources/org/hyperledger/besu/evm/precompile/g1_multiexp.csv b/evm/src/test/resources/org/hyperledger/besu/evm/precompile/g1_multiexp.csv index 413d51ee7..20ed990e6 100644 --- a/evm/src/test/resources/org/hyperledger/besu/evm/precompile/g1_multiexp.csv +++ b/evm/src/test/resources/org/hyperledger/besu/evm/precompile/g1_multiexp.csv @@ -101,8 +101,8 @@ input,result,gas,notes 0000000000000000000000000000000004acd4cb6bcfed3219c3aee9368feeb58d77a7ec81d19bea11402015f4bd0ee2d7afd86fa7ae9dd320910ca28eb6d98f0000000000000000000000000000000009fe1b0094c0c2ae80a3c5accfed5d212ce39f867aa2150b781c193a0053aecb04d06e005fbfa0a24595e5968d024be18a71abe11a893fce872f6b8a020b6d84241df03eb934b50cbf3571df4800a8330000000000000000000000000000000018cf9bf39549c35e94211b4e2d0a0157d73e1ce8a17cd724eb33c38281dac07e12eec61b27b440b220c4f21915a73a52000000000000000000000000000000000fca6d956989db84dcfe58b0310fc21b5bdc82a32838c8d9cae912d683dd9c67f68e15b3fbf9d7b430ba239c8904fdd2bbf28e5bca314391550d3a0fce50b1220965860e72c8c3865a2d4c599d31d3f1000000000000000000000000000000001897956bc232fd5a9b0ed1b533bebef8ddd9e97002513eec71d67ce1086ba8473f2c013af7d8ac548290453d9f71bd5a000000000000000000000000000000000796da5c8ac165d416c8fa36d84e11bcaa80c1bbfe18efde4b4b2c71d6d00fa24f3d51eac312cad9e854f094dcb6ec7458b208a6845aeb2bf31999042c59b7b130a7ce5297e88023953b1aef63616fe4000000000000000000000000000000000302240769257e92899da03fcc4abe1ad3944b74c3046e790e4e950f2958426b5fdc691401a1c8a531f42185d382fe5b000000000000000000000000000000000053750b58b6d2fbacae94e22b397261e541eb4abf4715b3f528dbfc3388122918b1b4b506f2fef89ea936efdef0105b3b53b6cf9e0ce1661c4960283be790abf956c2d6433529b8f3a32b92b227aebe000000000000000000000000000000000168a635a14f61734372f4bdd2fd564d77afa8588e1828d88c4c90bb50f57473b2c20585dc0e93726b84e73c61f29ef1000000000000000000000000000000000e6e92355e59304ad35b1dbfbb98db803d5fadabdef4fb1b2a54080ec9a33a7147ebb4d5219acabd949337bebbffa793b049228435ade4c4c565e65f39f13a84c747c312afcdaff352560b9fb3cfebcc000000000000000000000000000000001797bf2ac9b490cd43a346fdc64bfb22301a0a0e371bb4df8ec02342b4fcc99af43b4735665c6b1386fa04a3dc5406e3000000000000000000000000000000000fcc20f4aec04b7896ddfd86f58c2e1e9dc6f863ec3b477572c073c0f4fb07ee8dc0d5a843321446445b6e7846fbc5d556197f5ad17062d2ecbdc8887bcdd32e5ed4c48cefd9e14d622a0b800d9703300000000000000000000000000000000013ddb8ff149222a5a0a997c0b89aeee36a6ff2540de3cba8bfe6a2a64fb505f13ad956a3882082ab85bfbe72f3a3a6b600000000000000000000000000000000102c1a1085f60cd5326966a2dda0872290e1658002ff3ed95c47cc0345565076bdecdeab7082bcfb439cf7f3e445faaf721d9d7fe10104cafcad71307e785321ab87b2b69593535caecbf0e166cfda5b00000000000000000000000000000000189515e637d404ce6db58d24774609cf946074aa22066d808dc022824a26b381bf09148005c61156a976154b025d71c90000000000000000000000000000000009102e313c4517cdd3d07a66e0013eeafc996c21fbf5f0f3e7d232ad5adb781cce1657bd5750193cfc0357ff55bd012a461531ecb61365908019c1e8074a4c322df2b356eea3f3eea9aa1e0e1fc5525e0000000000000000000000000000000002e166e475ff083faad64667b683e546b2358f945b8656f9c2f3f6e87a40dc3fc087dd94874bec1c4bd5929b7c96024a00000000000000000000000000000000022bb4ba4be638d8c14a16c94522c41cd3b3ad917daa454f820b8fa35e5a48c676266feece6986e8fe920b2a5e43e4b3569c1c1ae2d18bbe36ed50db1bf30957802b09a982fbed49d4968815552e010d0000000000000000000000000000000004947bd8ea8cc3b116fb7320c573fff0f107913c18cfdba2e7e9a4c8715e334a431156f384548508df8950d681163aee0000000000000000000000000000000001e9e7494c295248184503344b8ac7bfcff41a4561de03d78691ac47980f14aa47c1eaa3cca80103f0f2ba14a2842aea2061d33b2f7e786effbd2e93101a56ba1bb62c1a773a08b72ca82f5183bea35b0000000000000000000000000000000004789b01538cfc54cad0e99538e874d13eaa7f07199af29d460927c3e622c74e0bb4185afa12c53446f56033348c332f00000000000000000000000000000000154291a8bdefbc91445ef1fe123f326b8aad652c8c54502920d4dfa912c2f42d784fbc5a16d08468d2d6ee56e7e8eaa24129b150752d2d5551a622231ab067931678454aaeb23f76168219406f0d50ee00000000000000000000000000000000029048f227fe8d1b7247a82cfd3e1b4b60cdce6b52de42c4b96641bf8fc5ba9b077e33bd4c4fce9a51b63a6a2451b427000000000000000000000000000000000c83518e1b7700d68966d592cb2e3295a2db5226eb6fef972c8a84721d1e49a30e4a8ee3494ed4bbcd2a6877e1ba597d366c32d5d3c132f32a6ac3cfe1dabb649c59ae224338f747ad98b193e83467290000000000000000000000000000000003e96431aae4330d3d204093b7af21343ace4f1960de951eeaebea51e778b1fee43ecddc46667d096edbc5ff4735586400000000000000000000000000000000183a282f4b0513be661b1b38eb5f02b51aadc591745e0bd5d2d4e5545739e26470a9ec20d78ec284268d9c54c8e4f7b6d997516cac28a3968ac6946b5bffaace0856a52e38fdcca11ddfa16cf5a568f5000000000000000000000000000000000904c85edd36dfa18ddb4e1809607708142f3c0861570f2bc8fff14c462675661f2111c10a01557fb21f7f38957bdd840000000000000000000000000000000012a3a37f34ebb23d4c9268ec9e1d53aed4747aaace497695e6ea8fdbdedd58031cb479003e8bec0d14aa1d062fa30f2ce881ec65fdc2f58e46d3ee45a06d0c5ac844ee5b62872c7ba21f6b48621a337100000000000000000000000000000000148532bffbbf8bb1688f6448854214b4273b9d5adf132aa9142c1605d1882879678b6cc70638713b9438532d427f447c0000000000000000000000000000000010971ee30d83719e10e91aad3f1f201fe35ba1a057531b1905bca3a8391a3786cd077ee0f104305eafb3c94f4546da9edcd9b95e49473277a665ca0f9a8309df9ed6ee4f25d803aa967fb8f688273e65000000000000000000000000000000000f73574aa5a06ea569de88e48fcb96e822039af296684933c1b417dde95e08d2ac9c6ad4d525b0734e24807ee99ba88a000000000000000000000000000000000523deae09e75121a6d89b45161f69f0733a9e43d88d8527a03cca8cc126aeb7a680cfaf291554403723e20440b79437334582482a9038ab906880e43a4a9d39e73b6c63604eba0c8f6399eb5c288638,000000000000000000000000000000000db91871e4cd84b3b58216b6c2e77a9521f3080182e78d3f66fe33f313013f06aec2dc5a6d483f35fadebde873bff9490000000000000000000000000000000003b9685de062b09b9e277ad5cd664d28af59064448af2b1b2b2357df6fc88e3ee7e0ac837100e0b7593944e8db43ab0f,64128, 00000000000000000000000000000012196c5a43d69224d8713389285f26b98f86ee910ab3dd668e413738282003cc5b7357af9a7af54bb713d62255e80f560000000000000000000000000000000006ba8102bfbeea4416b710c73e8cce3032c31c6269c44906f8ac4f7874ce99fb17559992486528963884ce429a992feeb3c940fe79b6966489b527955de7599194a9ac69a6ff58b8d99e7b1084f0464e00000000000000000000000000000000117dbe419018f67844f6a5e1b78a1e597283ad7b8ee7ac5e58846f5a5fd68d0da99ce235a91db3ec1cf340fe6b7afcdb0000000000000000000000000000000013316f23de032d25e912ae8dc9b54c8dba1be7cecdbb9d2228d7e8f652011d46be79089dd0a6080a73c82256ce5e4ed24d0e25bf3f6fc9f4da25d21fdc71773f1947b7a8a775b8177f7eca990b05b71d0000000000000000000000000000000008ab7b556c672db7883ec47efa6d98bb08cec7902ebb421aac1c31506b177ac444ffa2d9b400a6f1cbdc6240c607ee110000000000000000000000000000000016b7fa9adf4addc2192271ce7ad3c8d8f902d061c43b7d2e8e26922009b777855bffabe7ed1a09155819eabfa87f276f973f40c12c92b703d7b7848ef8b4466d40823aad3943a312b57432b91ff68be10000000000000000000000000000000015ff9a232d9b5a8020a85d5fe08a1dcfb73ece434258fe0e2fddf10ddef0906c42dcb5f5d62fc97f934ba900f17beb330000000000000000000000000000000009cfe4ee2241d9413c616462d7bac035a6766aeaab69c81e094d75b840df45d7e0dfac0265608b93efefb9a8728b98e44c51f97bcdda93904ae26991b471e9ea942e2b5b8ed26055da11c58bc7b5002a0000000000000000000000000000000017a17b82e3bfadf3250210d8ef572c02c3610d65ab4d7366e0b748768a28ee6a1b51f77ed686a64f087f36f641e7dca900000000000000000000000000000000077ea73d233ccea51dc4d5acecf6d9332bf17ae51598f4b394a5f62fb387e9c9aa1d6823b64a074f5873422ca57545d38964d5867927bc3e35a0b4c457482373969bff5edff8a781d65573e07fd87b89000000000000000000000000000000000c1243478f4fbdc21ea9b241655947a28accd058d0cdb4f9f0576d32f09dddaf0850464550ff07cab5927b3e4c863ce90000000000000000000000000000000015fb54db10ffac0b6cd374eb7168a8cb3df0a7d5f872d8e98c1f623deb66df5dd08ff4c3658f2905ec8bd02598bd4f90787c38b944eadbd03fd3187f450571740f6cd00e5b2e560165846eb800e5c944000000000000000000000000000000000328f09584b6d6c98a709fc22e184123994613aca95a28ac53df8523b92273eb6f4e2d9b2a7dcebb474604d54a210719000000000000000000000000000000001220ebde579911fe2e707446aaad8d3789fae96ae2e23670a4fd856ed82daaab704779eb4224027c1ed9460f39951a1baaee7ae2a237e8e53560c79e7baa9adf9c00a0ea4d6f514e7a6832eb15cef1e10000000000000000000000000000000002ebfa98aa92c32a29ebe17fcb1819ba82e686abd9371fcee8ea793b4c72b6464085044f818f1f5902396df0122830cb00000000000000000000000000000000001184715b8432ed190b459113977289a890f68f6085ea111466af15103c9c02467da33e01d6bff87fd57db6ccba442adac6ed3ef45c1d7d3028f0f89e5458797996d3294b95bebe049b76c7d0db317c0000000000000000000000000000000009d6424e002439998e91cd509f85751ad25e574830c564e7568347d19e3f38add0cab067c0b4b0801785a78bcbeaf246000000000000000000000000000000000ef6d7db03ee654503b46ff0dbc3297536a422e963bda9871a8da8f4eeb98dedebd6071c4880b4636198f4c2375dc795bb30985756c3ca075114c92f231575d6befafe4084517f1166a47376867bd1080000000000000000000000000000000002d1cdb93191d1f9f0308c2c55d0208a071f5520faca7c52ab0311dbc9ba563bd33b5dd6baa77bf45ac2c3269e945f4800000000000000000000000000000000072a52106e6d7b92c594c4dacd20ef5fab7141e45c231457cd7e71463b2254ee6e72689e516fa6a8f29f2a173ce0a190fb730105809f64ea522983d6bbb62f7e2e8cbf702685e9be10e2ef71f81876720000000000000000000000000000000000641642f6801d39a09a536f506056f72a619c50d043673d6d39aa4af11d8e3ded38b9c3bbc970dbc1bd55d68f94b50d0000000000000000000000000000000009ab050de356a24aea90007c6b319614ba2f2ed67223b972767117769e3c8e31ee4056494628fb2892d3d37afb6ac943b6a9408625b0ca8fcbfb21d34eec2d8e24e9a30d2d3b32d7a37d110b13afbfea000000000000000000000000000000000fd4893addbd58fb1bf30b8e62bef068da386edbab9541d198e8719b2de5beb9223d87387af82e8b55bd521ff3e47e2d000000000000000000000000000000000f3a923b76473d5b5a53501790cb02597bb778bdacb3805a9002b152d22241ad131d0f0d6a260739cbab2c2fe602870e3b77283d0a7bb9e17a27e66851792fdd605cc0a339028b8985390fd024374c760000000000000000000000000000000002cb4b24c8aa799fd7cb1e4ab1aab1372113200343d8526ea7bc64dfaf926baf5d90756a40e35617854a2079cd07fba40000000000000000000000000000000003327ca22bd64ebd673cc6d5b02b2a8804d5353c9d251637c4273ad08d581cc0d58da9bea27c37a0b3f4961dbafd276bdd994eae929aee7428fdda2e44f8cb12b10b91c83b22abc8bbb561310b62257c00000000000000000000000000000000024ad70f2b2105ca37112858e84c6f5e3ffd4a8b064522faae1ecba38fabd52a6274cb46b00075deb87472f11f2e67d90000000000000000000000000000000010a502c8b2a68aa30d2cb719273550b9a3c283c35b2e18a01b0b765344ffaaa5cb30a1e3e6ecd3a53ab67658a57876817010b134989c8368c7f831f9dd9f9a890e2c1435681107414f2e8637153bbf6a0000000000000000000000000000000000704cc57c8e0944326ddc7c747d9e7347a7f6918977132eea269f161461eb64066f773352f293a3ac458dc3ccd5026a000000000000000000000000000000001099d3c2bb2d082f2fdcbed013f7ac69e8624f4fcf6dfab3ee9dcf7fbbdb8c49ee79de40e887c0b6828d2496e3a6f76894c68bc8d91ac8c489ee87dbfc4b94c93c8bbd5fc04c27db8b02303f3a65905400000000000000000000000000000000130535a29392c77f045ac90e47f2e7b3cffff94494fe605aad345b41043f6663ada8e2e7ecd3d06f3b8854ef92212f42000000000000000000000000000000001699a3cc1f10cd2ed0dc68eb916b4402e4f12bf4746893bf70e26e209e605ea89e3d53e7ac52bd07713d3c8fc671931db3682accc3939283b870357cf83683350baf73aa0d3d68bda82a0f6ae7e51746,,,invalid input parameters, invalid input length for G1 multiplication 000000000000000000000000000000000012196c5a43d69224d8713389285f26b98f86ee910ab3dd668e413738282003cc5b7357af9a7af54bb713d62255e80f560000000000000000000000000000000006ba8102bfbeea4416b710c73e8cce3032c31c6269c44906f8ac4f7874ce99fb17559992486528963884ce429a992feeb3c940fe79b6966489b527955de7599194a9ac69a6ff58b8d99e7b1084f0464e00000000000000000000000000000000117dbe419018f67844f6a5e1b78a1e597283ad7b8ee7ac5e58846f5a5fd68d0da99ce235a91db3ec1cf340fe6b7afcdb0000000000000000000000000000000013316f23de032d25e912ae8dc9b54c8dba1be7cecdbb9d2228d7e8f652011d46be79089dd0a6080a73c82256ce5e4ed24d0e25bf3f6fc9f4da25d21fdc71773f1947b7a8a775b8177f7eca990b05b71d0000000000000000000000000000000008ab7b556c672db7883ec47efa6d98bb08cec7902ebb421aac1c31506b177ac444ffa2d9b400a6f1cbdc6240c607ee110000000000000000000000000000000016b7fa9adf4addc2192271ce7ad3c8d8f902d061c43b7d2e8e26922009b777855bffabe7ed1a09155819eabfa87f276f973f40c12c92b703d7b7848ef8b4466d40823aad3943a312b57432b91ff68be10000000000000000000000000000000015ff9a232d9b5a8020a85d5fe08a1dcfb73ece434258fe0e2fddf10ddef0906c42dcb5f5d62fc97f934ba900f17beb330000000000000000000000000000000009cfe4ee2241d9413c616462d7bac035a6766aeaab69c81e094d75b840df45d7e0dfac0265608b93efefb9a8728b98e44c51f97bcdda93904ae26991b471e9ea942e2b5b8ed26055da11c58bc7b5002a0000000000000000000000000000000017a17b82e3bfadf3250210d8ef572c02c3610d65ab4d7366e0b748768a28ee6a1b51f77ed686a64f087f36f641e7dca900000000000000000000000000000000077ea73d233ccea51dc4d5acecf6d9332bf17ae51598f4b394a5f62fb387e9c9aa1d6823b64a074f5873422ca57545d38964d5867927bc3e35a0b4c457482373969bff5edff8a781d65573e07fd87b89000000000000000000000000000000000c1243478f4fbdc21ea9b241655947a28accd058d0cdb4f9f0576d32f09dddaf0850464550ff07cab5927b3e4c863ce90000000000000000000000000000000015fb54db10ffac0b6cd374eb7168a8cb3df0a7d5f872d8e98c1f623deb66df5dd08ff4c3658f2905ec8bd02598bd4f90787c38b944eadbd03fd3187f450571740f6cd00e5b2e560165846eb800e5c944000000000000000000000000000000000328f09584b6d6c98a709fc22e184123994613aca95a28ac53df8523b92273eb6f4e2d9b2a7dcebb474604d54a210719000000000000000000000000000000001220ebde579911fe2e707446aaad8d3789fae96ae2e23670a4fd856ed82daaab704779eb4224027c1ed9460f39951a1baaee7ae2a237e8e53560c79e7baa9adf9c00a0ea4d6f514e7a6832eb15cef1e10000000000000000000000000000000002ebfa98aa92c32a29ebe17fcb1819ba82e686abd9371fcee8ea793b4c72b6464085044f818f1f5902396df0122830cb00000000000000000000000000000000001184715b8432ed190b459113977289a890f68f6085ea111466af15103c9c02467da33e01d6bff87fd57db6ccba442adac6ed3ef45c1d7d3028f0f89e5458797996d3294b95bebe049b76c7d0db317c0000000000000000000000000000000009d6424e002439998e91cd509f85751ad25e574830c564e7568347d19e3f38add0cab067c0b4b0801785a78bcbeaf246000000000000000000000000000000000ef6d7db03ee654503b46ff0dbc3297536a422e963bda9871a8da8f4eeb98dedebd6071c4880b4636198f4c2375dc795bb30985756c3ca075114c92f231575d6befafe4084517f1166a47376867bd1080000000000000000000000000000000002d1cdb93191d1f9f0308c2c55d0208a071f5520faca7c52ab0311dbc9ba563bd33b5dd6baa77bf45ac2c3269e945f4800000000000000000000000000000000072a52106e6d7b92c594c4dacd20ef5fab7141e45c231457cd7e71463b2254ee6e72689e516fa6a8f29f2a173ce0a190fb730105809f64ea522983d6bbb62f7e2e8cbf702685e9be10e2ef71f81876720000000000000000000000000000000000641642f6801d39a09a536f506056f72a619c50d043673d6d39aa4af11d8e3ded38b9c3bbc970dbc1bd55d68f94b50d0000000000000000000000000000000009ab050de356a24aea90007c6b319614ba2f2ed67223b972767117769e3c8e31ee4056494628fb2892d3d37afb6ac943b6a9408625b0ca8fcbfb21d34eec2d8e24e9a30d2d3b32d7a37d110b13afbfea000000000000000000000000000000000fd4893addbd58fb1bf30b8e62bef068da386edbab9541d198e8719b2de5beb9223d87387af82e8b55bd521ff3e47e2d000000000000000000000000000000000f3a923b76473d5b5a53501790cb02597bb778bdacb3805a9002b152d22241ad131d0f0d6a260739cbab2c2fe602870e3b77283d0a7bb9e17a27e66851792fdd605cc0a339028b8985390fd024374c760000000000000000000000000000000002cb4b24c8aa799fd7cb1e4ab1aab1372113200343d8526ea7bc64dfaf926baf5d90756a40e35617854a2079cd07fba40000000000000000000000000000000003327ca22bd64ebd673cc6d5b02b2a8804d5353c9d251637c4273ad08d581cc0d58da9bea27c37a0b3f4961dbafd276bdd994eae929aee7428fdda2e44f8cb12b10b91c83b22abc8bbb561310b62257c00000000000000000000000000000000024ad70f2b2105ca37112858e84c6f5e3ffd4a8b064522faae1ecba38fabd52a6274cb46b00075deb87472f11f2e67d90000000000000000000000000000000010a502c8b2a68aa30d2cb719273550b9a3c283c35b2e18a01b0b765344ffaaa5cb30a1e3e6ecd3a53ab67658a57876817010b134989c8368c7f831f9dd9f9a890e2c1435681107414f2e8637153bbf6a0000000000000000000000000000000000704cc57c8e0944326ddc7c747d9e7347a7f6918977132eea269f161461eb64066f773352f293a3ac458dc3ccd5026a000000000000000000000000000000001099d3c2bb2d082f2fdcbed013f7ac69e8624f4fcf6dfab3ee9dcf7fbbdb8c49ee79de40e887c0b6828d2496e3a6f76894c68bc8d91ac8c489ee87dbfc4b94c93c8bbd5fc04c27db8b02303f3a65905400000000000000000000000000000000130535a29392c77f045ac90e47f2e7b3cffff94494fe605aad345b41043f6663ada8e2e7ecd3d06f3b8854ef92212f42000000000000000000000000000000001699a3cc1f10cd2ed0dc68eb916b4402e4f12bf4746893bf70e26e209e605ea89e3d53e7ac52bd07713d3c8fc671931db3682accc3939283b870357cf83683350baf73aa0d3d68bda82a0f6ae7e51746,,,invalid input parameters, invalid input length for G1 multiplication -,,,invalid input parameters, Invalid number of pairs -0000000000000000000000000000000012196c5a43d69224d8713389285f26b98f86ee910ab3dd668e413738282003cc5b7357af9a7af54bb713d62255e80f570000000000000000000000000000000006ba8102bfbeea4416b710c73e8cce3032c31c6269c44906f8ac4f7874ce99fb17559992486528963884ce429a992feeb3c940fe79b6966489b527955de7599194a9ac69a6ff58b8d99e7b1084f0464e00000000000000000000000000000000117dbe419018f67844f6a5e1b78a1e597283ad7b8ee7ac5e58846f5a5fd68d0da99ce235a91db3ec1cf340fe6b7afcdb0000000000000000000000000000000013316f23de032d25e912ae8dc9b54c8dba1be7cecdbb9d2228d7e8f652011d46be79089dd0a6080a73c82256ce5e4ed24d0e25bf3f6fc9f4da25d21fdc71773f1947b7a8a775b8177f7eca990b05b71d0000000000000000000000000000000008ab7b556c672db7883ec47efa6d98bb08cec7902ebb421aac1c31506b177ac444ffa2d9b400a6f1cbdc6240c607ee110000000000000000000000000000000016b7fa9adf4addc2192271ce7ad3c8d8f902d061c43b7d2e8e26922009b777855bffabe7ed1a09155819eabfa87f276f973f40c12c92b703d7b7848ef8b4466d40823aad3943a312b57432b91ff68be10000000000000000000000000000000015ff9a232d9b5a8020a85d5fe08a1dcfb73ece434258fe0e2fddf10ddef0906c42dcb5f5d62fc97f934ba900f17beb330000000000000000000000000000000009cfe4ee2241d9413c616462d7bac035a6766aeaab69c81e094d75b840df45d7e0dfac0265608b93efefb9a8728b98e44c51f97bcdda93904ae26991b471e9ea942e2b5b8ed26055da11c58bc7b5002a0000000000000000000000000000000017a17b82e3bfadf3250210d8ef572c02c3610d65ab4d7366e0b748768a28ee6a1b51f77ed686a64f087f36f641e7dca900000000000000000000000000000000077ea73d233ccea51dc4d5acecf6d9332bf17ae51598f4b394a5f62fb387e9c9aa1d6823b64a074f5873422ca57545d38964d5867927bc3e35a0b4c457482373969bff5edff8a781d65573e07fd87b89000000000000000000000000000000000c1243478f4fbdc21ea9b241655947a28accd058d0cdb4f9f0576d32f09dddaf0850464550ff07cab5927b3e4c863ce90000000000000000000000000000000015fb54db10ffac0b6cd374eb7168a8cb3df0a7d5f872d8e98c1f623deb66df5dd08ff4c3658f2905ec8bd02598bd4f90787c38b944eadbd03fd3187f450571740f6cd00e5b2e560165846eb800e5c944000000000000000000000000000000000328f09584b6d6c98a709fc22e184123994613aca95a28ac53df8523b92273eb6f4e2d9b2a7dcebb474604d54a210719000000000000000000000000000000001220ebde579911fe2e707446aaad8d3789fae96ae2e23670a4fd856ed82daaab704779eb4224027c1ed9460f39951a1baaee7ae2a237e8e53560c79e7baa9adf9c00a0ea4d6f514e7a6832eb15cef1e10000000000000000000000000000000002ebfa98aa92c32a29ebe17fcb1819ba82e686abd9371fcee8ea793b4c72b6464085044f818f1f5902396df0122830cb00000000000000000000000000000000001184715b8432ed190b459113977289a890f68f6085ea111466af15103c9c02467da33e01d6bff87fd57db6ccba442adac6ed3ef45c1d7d3028f0f89e5458797996d3294b95bebe049b76c7d0db317c0000000000000000000000000000000009d6424e002439998e91cd509f85751ad25e574830c564e7568347d19e3f38add0cab067c0b4b0801785a78bcbeaf246000000000000000000000000000000000ef6d7db03ee654503b46ff0dbc3297536a422e963bda9871a8da8f4eeb98dedebd6071c4880b4636198f4c2375dc795bb30985756c3ca075114c92f231575d6befafe4084517f1166a47376867bd1080000000000000000000000000000000002d1cdb93191d1f9f0308c2c55d0208a071f5520faca7c52ab0311dbc9ba563bd33b5dd6baa77bf45ac2c3269e945f4800000000000000000000000000000000072a52106e6d7b92c594c4dacd20ef5fab7141e45c231457cd7e71463b2254ee6e72689e516fa6a8f29f2a173ce0a190fb730105809f64ea522983d6bbb62f7e2e8cbf702685e9be10e2ef71f81876720000000000000000000000000000000000641642f6801d39a09a536f506056f72a619c50d043673d6d39aa4af11d8e3ded38b9c3bbc970dbc1bd55d68f94b50d0000000000000000000000000000000009ab050de356a24aea90007c6b319614ba2f2ed67223b972767117769e3c8e31ee4056494628fb2892d3d37afb6ac943b6a9408625b0ca8fcbfb21d34eec2d8e24e9a30d2d3b32d7a37d110b13afbfea000000000000000000000000000000000fd4893addbd58fb1bf30b8e62bef068da386edbab9541d198e8719b2de5beb9223d87387af82e8b55bd521ff3e47e2d000000000000000000000000000000000f3a923b76473d5b5a53501790cb02597bb778bdacb3805a9002b152d22241ad131d0f0d6a260739cbab2c2fe602870e3b77283d0a7bb9e17a27e66851792fdd605cc0a339028b8985390fd024374c760000000000000000000000000000000002cb4b24c8aa799fd7cb1e4ab1aab1372113200343d8526ea7bc64dfaf926baf5d90756a40e35617854a2079cd07fba40000000000000000000000000000000003327ca22bd64ebd673cc6d5b02b2a8804d5353c9d251637c4273ad08d581cc0d58da9bea27c37a0b3f4961dbafd276bdd994eae929aee7428fdda2e44f8cb12b10b91c83b22abc8bbb561310b62257c00000000000000000000000000000000024ad70f2b2105ca37112858e84c6f5e3ffd4a8b064522faae1ecba38fabd52a6274cb46b00075deb87472f11f2e67d90000000000000000000000000000000010a502c8b2a68aa30d2cb719273550b9a3c283c35b2e18a01b0b765344ffaaa5cb30a1e3e6ecd3a53ab67658a57876817010b134989c8368c7f831f9dd9f9a890e2c1435681107414f2e8637153bbf6a0000000000000000000000000000000000704cc57c8e0944326ddc7c747d9e7347a7f6918977132eea269f161461eb64066f773352f293a3ac458dc3ccd5026a000000000000000000000000000000001099d3c2bb2d082f2fdcbed013f7ac69e8624f4fcf6dfab3ee9dcf7fbbdb8c49ee79de40e887c0b6828d2496e3a6f76894c68bc8d91ac8c489ee87dbfc4b94c93c8bbd5fc04c27db8b02303f3a65905400000000000000000000000000000000130535a29392c77f045ac90e47f2e7b3cffff94494fe605aad345b41043f6663ada8e2e7ecd3d06f3b8854ef92212f42000000000000000000000000000000001699a3cc1f10cd2ed0dc68eb916b4402e4f12bf4746893bf70e26e209e605ea89e3d53e7ac52bd07713d3c8fc671931db3682accc3939283b870357cf83683350baf73aa0d3d68bda82a0f6ae7e51746,,,invalid input parameters, Point is not on curve -0000000000000000000000000000000012196c5a43d69224d8713389285f26b98f86ee910ab3dd668e413738282003cc5b7357af9a7af54bb713d62255e80f560000000000000000000000000000000006ba8102bfbeea4416b710c73e8cce3032c31c6269c44906f8ac4f7874ce99fb17559992486528963884ce429a992feeb3c940fe79b6966489b527955de7599194a9ac69a6ff58b8d99e7b1084f0464e00000000000000000000000000000000117dbe419018f67844f6a5e1b78a1e597283ad7b8ee7ac5e58846f5a5fd68d0da99ce235a91db3ec1cf340fe6b7afcdb0000000000000000000000000000000013316f23de032d25e912ae8dc9b54c8dba1be7cecdbb9d2228d7e8f652011d46be79089dd0a6080a73c82256ce5e4ed24d0e25bf3f6fc9f4da25d21fdc71773f1947b7a8a775b8177f7eca990b05b71d0000000000000000000000000000000008ab7b556c672db7883ec47efa6d98bb08cec7902ebb421aac1c31506b177ac444ffa2d9b400a6f1cbdc6240c607ee110000000000000000000000000000000016b7fa9adf4addc2192271ce7ad3c8d8f902d061c43b7d2e8e26922009b777855bffabe7ed1a09155819eabfa87f276f973f40c12c92b703d7b7848ef8b4466d40823aad3943a312b57432b91ff68be10000000000000000000000000000000015ff9a232d9b5a8020a85d5fe08a1dcfb73ece434258fe0e2fddf10ddef0906c42dcb5f5d62fc97f934ba900f17beb330000000000000000000000000000000009cfe4ee2241d9413c616462d7bac035a6766aeaab69c81e094d75b840df45d7e0dfac0265608b93efefb9a8728b98e44c51f97bcdda93904ae26991b471e9ea942e2b5b8ed26055da11c58bc7b5002a0000000000000000000000000000000017a17b82e3bfadf3250210d8ef572c02c3610d65ab4d7366e0b748768a28ee6a1b51f77ed686a64f087f36f641e7dca900000000000000000000000000000000077ea73d233ccea51dc4d5acecf6d9332bf17ae51598f4b394a5f62fb387e9c9aa1d6823b64a074f5873422ca57545d38964d5867927bc3e35a0b4c457482373969bff5edff8a781d65573e07fd87b89000000000000000000000000000000000c1243478f4fbdc21ea9b241655947a28accd058d0cdb4f9f0576d32f09dddaf0850464550ff07cab5927b3e4c863ce90000000000000000000000000000000015fb54db10ffac0b6cd374eb7168a8cb3df0a7d5f872d8e98c1f623deb66df5dd08ff4c3658f2905ec8bd02598bd4f90787c38b944eadbd03fd3187f450571740f6cd00e5b2e560165846eb800e5c944000000000000000000000000000000000328f09584b6d6c98a709fc22e184123994613aca95a28ac53df8523b92273eb6f4e2d9b2a7dcebb474604d54a210719000000000000000000000000000000001220ebde579911fe2e707446aaad8d3789fae96ae2e23670a4fd856ed82daaab704779eb4224027c1ed9460f39951a1baaee7ae2a237e8e53560c79e7baa9adf9c00a0ea4d6f514e7a6832eb15cef1e10000000000000000000000000000000002ebfa98aa92c32a29ebe17fcb1819ba82e686abd9371fcee8ea793b4c72b6464085044f818f1f5902396df0122830cb00000000000000000000000000000000001184715b8432ed190b459113977289a890f68f6085ea111466af15103c9c02467da33e01d6bff87fd57db6ccba442adac6ed3ef45c1d7d3028f0f89e5458797996d3294b95bebe049b76c7d0db317c0000000000000000000000000000000009d6424e002439998e91cd509f85751ad25e574830c564e7568347d19e3f38add0cab067c0b4b0801785a78bcbeaf246000000000000000000000000000000000ef6d7db03ee654503b46ff0dbc3297536a422e963bda9871a8da8f4eeb98dedebd6071c4880b4636198f4c2375dc795bb30985756c3ca075114c92f231575d6befafe4084517f1166a47376867bd1080000000000000000000000000000000002d1cdb93191d1f9f0308c2c55d0208a071f5520faca7c52ab0311dbc9ba563bd33b5dd6baa77bf45ac2c3269e945f4800000000000000000000000000000000072a52106e6d7b92c594c4dacd20ef5fab7141e45c231457cd7e71463b2254ee6e72689e516fa6a8f29f2a173ce0a190fb730105809f64ea522983d6bbb62f7e2e8cbf702685e9be10e2ef71f81876720000000000000000000000000000000000641642f6801d39a09a536f506056f72a619c50d043673d6d39aa4af11d8e3ded38b9c3bbc970dbc1bd55d68f94b50d0000000000000000000000000000000009ab050de356a24aea90007c6b319614ba2f2ed67223b972767117769e3c8e31ee4056494628fb2892d3d37afb6ac943b6a9408625b0ca8fcbfb21d34eec2d8e24e9a30d2d3b32d7a37d110b13afbfea000000000000000000000000000000000fd4893addbd58fb1bf30b8e62bef068da386edbab9541d198e8719b2de5beb9223d87387af82e8b55bd521ff3e47e2d000000000000000000000000000000000f3a923b76473d5b5a53501790cb02597bb778bdacb3805a9002b152d22241ad131d0f0d6a260739cbab2c2fe602870e3b77283d0a7bb9e17a27e66851792fdd605cc0a339028b8985390fd024374c760000000000000000000000000000000002cb4b24c8aa799fd7cb1e4ab1aab1372113200343d8526ea7bc64dfaf926baf5d90756a40e35617854a2079cd07fba40000000000000000000000000000000003327ca22bd64ebd673cc6d5b02b2a8804d5353c9d251637c4273ad08d581cc0d58da9bea27c37a0b3f4961dbafd276bdd994eae929aee7428fdda2e44f8cb12b10b91c83b22abc8bbb561310b62257c00000000000000000000000000000000024ad70f2b2105ca37112858e84c6f5e3ffd4a8b064522faae1ecba38fabd52a6274cb46b00075deb87472f11f2e67d90000000000000000000000000000000010a502c8b2a68aa30d2cb719273550b9a3c283c35b2e18a01b0b765344ffaaa5cb30a1e3e6ecd3a53ab67658a57876817010b134989c8368c7f831f9dd9f9a890e2c1435681107414f2e8637153bbf6a0000000000000000000000000000000000704cc57c8e0944326ddc7c747d9e7347a7f6918977132eea269f161461eb64066f773352f293a3ac458dc3ccd5026a000000000000000000000000000000001099d3c2bb2d082f2fdcbed013f7ac69e8624f4fcf6dfab3ee9dcf7fbbdb8c49ee79de40e887c0b6828d2496e3a6f76894c68bc8d91ac8c489ee87dbfc4b94c93c8bbd5fc04c27db8b02303f3a65905400000000000000000000000000000000130535a29392c77f045ac90e47f2e7b3cffff94494fe605aad345b41043f6663ada8e2e7ecd3d06f3b8854ef92212f43000000000000000000000000000000001699a3cc1f10cd2ed0dc68eb916b4402e4f12bf4746893bf70e26e209e605ea89e3d53e7ac52bd07713d3c8fc671931db3682accc3939283b870357cf83683350baf73aa0d3d68bda82a0f6ae7e51746,,,invalid input parameters, Point is not on curve +,,,invalid input parameters, invalid number of pairs +0000000000000000000000000000000012196c5a43d69224d8713389285f26b98f86ee910ab3dd668e413738282003cc5b7357af9a7af54bb713d62255e80f570000000000000000000000000000000006ba8102bfbeea4416b710c73e8cce3032c31c6269c44906f8ac4f7874ce99fb17559992486528963884ce429a992feeb3c940fe79b6966489b527955de7599194a9ac69a6ff58b8d99e7b1084f0464e00000000000000000000000000000000117dbe419018f67844f6a5e1b78a1e597283ad7b8ee7ac5e58846f5a5fd68d0da99ce235a91db3ec1cf340fe6b7afcdb0000000000000000000000000000000013316f23de032d25e912ae8dc9b54c8dba1be7cecdbb9d2228d7e8f652011d46be79089dd0a6080a73c82256ce5e4ed24d0e25bf3f6fc9f4da25d21fdc71773f1947b7a8a775b8177f7eca990b05b71d0000000000000000000000000000000008ab7b556c672db7883ec47efa6d98bb08cec7902ebb421aac1c31506b177ac444ffa2d9b400a6f1cbdc6240c607ee110000000000000000000000000000000016b7fa9adf4addc2192271ce7ad3c8d8f902d061c43b7d2e8e26922009b777855bffabe7ed1a09155819eabfa87f276f973f40c12c92b703d7b7848ef8b4466d40823aad3943a312b57432b91ff68be10000000000000000000000000000000015ff9a232d9b5a8020a85d5fe08a1dcfb73ece434258fe0e2fddf10ddef0906c42dcb5f5d62fc97f934ba900f17beb330000000000000000000000000000000009cfe4ee2241d9413c616462d7bac035a6766aeaab69c81e094d75b840df45d7e0dfac0265608b93efefb9a8728b98e44c51f97bcdda93904ae26991b471e9ea942e2b5b8ed26055da11c58bc7b5002a0000000000000000000000000000000017a17b82e3bfadf3250210d8ef572c02c3610d65ab4d7366e0b748768a28ee6a1b51f77ed686a64f087f36f641e7dca900000000000000000000000000000000077ea73d233ccea51dc4d5acecf6d9332bf17ae51598f4b394a5f62fb387e9c9aa1d6823b64a074f5873422ca57545d38964d5867927bc3e35a0b4c457482373969bff5edff8a781d65573e07fd87b89000000000000000000000000000000000c1243478f4fbdc21ea9b241655947a28accd058d0cdb4f9f0576d32f09dddaf0850464550ff07cab5927b3e4c863ce90000000000000000000000000000000015fb54db10ffac0b6cd374eb7168a8cb3df0a7d5f872d8e98c1f623deb66df5dd08ff4c3658f2905ec8bd02598bd4f90787c38b944eadbd03fd3187f450571740f6cd00e5b2e560165846eb800e5c944000000000000000000000000000000000328f09584b6d6c98a709fc22e184123994613aca95a28ac53df8523b92273eb6f4e2d9b2a7dcebb474604d54a210719000000000000000000000000000000001220ebde579911fe2e707446aaad8d3789fae96ae2e23670a4fd856ed82daaab704779eb4224027c1ed9460f39951a1baaee7ae2a237e8e53560c79e7baa9adf9c00a0ea4d6f514e7a6832eb15cef1e10000000000000000000000000000000002ebfa98aa92c32a29ebe17fcb1819ba82e686abd9371fcee8ea793b4c72b6464085044f818f1f5902396df0122830cb00000000000000000000000000000000001184715b8432ed190b459113977289a890f68f6085ea111466af15103c9c02467da33e01d6bff87fd57db6ccba442adac6ed3ef45c1d7d3028f0f89e5458797996d3294b95bebe049b76c7d0db317c0000000000000000000000000000000009d6424e002439998e91cd509f85751ad25e574830c564e7568347d19e3f38add0cab067c0b4b0801785a78bcbeaf246000000000000000000000000000000000ef6d7db03ee654503b46ff0dbc3297536a422e963bda9871a8da8f4eeb98dedebd6071c4880b4636198f4c2375dc795bb30985756c3ca075114c92f231575d6befafe4084517f1166a47376867bd1080000000000000000000000000000000002d1cdb93191d1f9f0308c2c55d0208a071f5520faca7c52ab0311dbc9ba563bd33b5dd6baa77bf45ac2c3269e945f4800000000000000000000000000000000072a52106e6d7b92c594c4dacd20ef5fab7141e45c231457cd7e71463b2254ee6e72689e516fa6a8f29f2a173ce0a190fb730105809f64ea522983d6bbb62f7e2e8cbf702685e9be10e2ef71f81876720000000000000000000000000000000000641642f6801d39a09a536f506056f72a619c50d043673d6d39aa4af11d8e3ded38b9c3bbc970dbc1bd55d68f94b50d0000000000000000000000000000000009ab050de356a24aea90007c6b319614ba2f2ed67223b972767117769e3c8e31ee4056494628fb2892d3d37afb6ac943b6a9408625b0ca8fcbfb21d34eec2d8e24e9a30d2d3b32d7a37d110b13afbfea000000000000000000000000000000000fd4893addbd58fb1bf30b8e62bef068da386edbab9541d198e8719b2de5beb9223d87387af82e8b55bd521ff3e47e2d000000000000000000000000000000000f3a923b76473d5b5a53501790cb02597bb778bdacb3805a9002b152d22241ad131d0f0d6a260739cbab2c2fe602870e3b77283d0a7bb9e17a27e66851792fdd605cc0a339028b8985390fd024374c760000000000000000000000000000000002cb4b24c8aa799fd7cb1e4ab1aab1372113200343d8526ea7bc64dfaf926baf5d90756a40e35617854a2079cd07fba40000000000000000000000000000000003327ca22bd64ebd673cc6d5b02b2a8804d5353c9d251637c4273ad08d581cc0d58da9bea27c37a0b3f4961dbafd276bdd994eae929aee7428fdda2e44f8cb12b10b91c83b22abc8bbb561310b62257c00000000000000000000000000000000024ad70f2b2105ca37112858e84c6f5e3ffd4a8b064522faae1ecba38fabd52a6274cb46b00075deb87472f11f2e67d90000000000000000000000000000000010a502c8b2a68aa30d2cb719273550b9a3c283c35b2e18a01b0b765344ffaaa5cb30a1e3e6ecd3a53ab67658a57876817010b134989c8368c7f831f9dd9f9a890e2c1435681107414f2e8637153bbf6a0000000000000000000000000000000000704cc57c8e0944326ddc7c747d9e7347a7f6918977132eea269f161461eb64066f773352f293a3ac458dc3ccd5026a000000000000000000000000000000001099d3c2bb2d082f2fdcbed013f7ac69e8624f4fcf6dfab3ee9dcf7fbbdb8c49ee79de40e887c0b6828d2496e3a6f76894c68bc8d91ac8c489ee87dbfc4b94c93c8bbd5fc04c27db8b02303f3a65905400000000000000000000000000000000130535a29392c77f045ac90e47f2e7b3cffff94494fe605aad345b41043f6663ada8e2e7ecd3d06f3b8854ef92212f42000000000000000000000000000000001699a3cc1f10cd2ed0dc68eb916b4402e4f12bf4746893bf70e26e209e605ea89e3d53e7ac52bd07713d3c8fc671931db3682accc3939283b870357cf83683350baf73aa0d3d68bda82a0f6ae7e51746,,,invalid point: point is not on curve +0000000000000000000000000000000012196c5a43d69224d8713389285f26b98f86ee910ab3dd668e413738282003cc5b7357af9a7af54bb713d62255e80f560000000000000000000000000000000006ba8102bfbeea4416b710c73e8cce3032c31c6269c44906f8ac4f7874ce99fb17559992486528963884ce429a992feeb3c940fe79b6966489b527955de7599194a9ac69a6ff58b8d99e7b1084f0464e00000000000000000000000000000000117dbe419018f67844f6a5e1b78a1e597283ad7b8ee7ac5e58846f5a5fd68d0da99ce235a91db3ec1cf340fe6b7afcdb0000000000000000000000000000000013316f23de032d25e912ae8dc9b54c8dba1be7cecdbb9d2228d7e8f652011d46be79089dd0a6080a73c82256ce5e4ed24d0e25bf3f6fc9f4da25d21fdc71773f1947b7a8a775b8177f7eca990b05b71d0000000000000000000000000000000008ab7b556c672db7883ec47efa6d98bb08cec7902ebb421aac1c31506b177ac444ffa2d9b400a6f1cbdc6240c607ee110000000000000000000000000000000016b7fa9adf4addc2192271ce7ad3c8d8f902d061c43b7d2e8e26922009b777855bffabe7ed1a09155819eabfa87f276f973f40c12c92b703d7b7848ef8b4466d40823aad3943a312b57432b91ff68be10000000000000000000000000000000015ff9a232d9b5a8020a85d5fe08a1dcfb73ece434258fe0e2fddf10ddef0906c42dcb5f5d62fc97f934ba900f17beb330000000000000000000000000000000009cfe4ee2241d9413c616462d7bac035a6766aeaab69c81e094d75b840df45d7e0dfac0265608b93efefb9a8728b98e44c51f97bcdda93904ae26991b471e9ea942e2b5b8ed26055da11c58bc7b5002a0000000000000000000000000000000017a17b82e3bfadf3250210d8ef572c02c3610d65ab4d7366e0b748768a28ee6a1b51f77ed686a64f087f36f641e7dca900000000000000000000000000000000077ea73d233ccea51dc4d5acecf6d9332bf17ae51598f4b394a5f62fb387e9c9aa1d6823b64a074f5873422ca57545d38964d5867927bc3e35a0b4c457482373969bff5edff8a781d65573e07fd87b89000000000000000000000000000000000c1243478f4fbdc21ea9b241655947a28accd058d0cdb4f9f0576d32f09dddaf0850464550ff07cab5927b3e4c863ce90000000000000000000000000000000015fb54db10ffac0b6cd374eb7168a8cb3df0a7d5f872d8e98c1f623deb66df5dd08ff4c3658f2905ec8bd02598bd4f90787c38b944eadbd03fd3187f450571740f6cd00e5b2e560165846eb800e5c944000000000000000000000000000000000328f09584b6d6c98a709fc22e184123994613aca95a28ac53df8523b92273eb6f4e2d9b2a7dcebb474604d54a210719000000000000000000000000000000001220ebde579911fe2e707446aaad8d3789fae96ae2e23670a4fd856ed82daaab704779eb4224027c1ed9460f39951a1baaee7ae2a237e8e53560c79e7baa9adf9c00a0ea4d6f514e7a6832eb15cef1e10000000000000000000000000000000002ebfa98aa92c32a29ebe17fcb1819ba82e686abd9371fcee8ea793b4c72b6464085044f818f1f5902396df0122830cb00000000000000000000000000000000001184715b8432ed190b459113977289a890f68f6085ea111466af15103c9c02467da33e01d6bff87fd57db6ccba442adac6ed3ef45c1d7d3028f0f89e5458797996d3294b95bebe049b76c7d0db317c0000000000000000000000000000000009d6424e002439998e91cd509f85751ad25e574830c564e7568347d19e3f38add0cab067c0b4b0801785a78bcbeaf246000000000000000000000000000000000ef6d7db03ee654503b46ff0dbc3297536a422e963bda9871a8da8f4eeb98dedebd6071c4880b4636198f4c2375dc795bb30985756c3ca075114c92f231575d6befafe4084517f1166a47376867bd1080000000000000000000000000000000002d1cdb93191d1f9f0308c2c55d0208a071f5520faca7c52ab0311dbc9ba563bd33b5dd6baa77bf45ac2c3269e945f4800000000000000000000000000000000072a52106e6d7b92c594c4dacd20ef5fab7141e45c231457cd7e71463b2254ee6e72689e516fa6a8f29f2a173ce0a190fb730105809f64ea522983d6bbb62f7e2e8cbf702685e9be10e2ef71f81876720000000000000000000000000000000000641642f6801d39a09a536f506056f72a619c50d043673d6d39aa4af11d8e3ded38b9c3bbc970dbc1bd55d68f94b50d0000000000000000000000000000000009ab050de356a24aea90007c6b319614ba2f2ed67223b972767117769e3c8e31ee4056494628fb2892d3d37afb6ac943b6a9408625b0ca8fcbfb21d34eec2d8e24e9a30d2d3b32d7a37d110b13afbfea000000000000000000000000000000000fd4893addbd58fb1bf30b8e62bef068da386edbab9541d198e8719b2de5beb9223d87387af82e8b55bd521ff3e47e2d000000000000000000000000000000000f3a923b76473d5b5a53501790cb02597bb778bdacb3805a9002b152d22241ad131d0f0d6a260739cbab2c2fe602870e3b77283d0a7bb9e17a27e66851792fdd605cc0a339028b8985390fd024374c760000000000000000000000000000000002cb4b24c8aa799fd7cb1e4ab1aab1372113200343d8526ea7bc64dfaf926baf5d90756a40e35617854a2079cd07fba40000000000000000000000000000000003327ca22bd64ebd673cc6d5b02b2a8804d5353c9d251637c4273ad08d581cc0d58da9bea27c37a0b3f4961dbafd276bdd994eae929aee7428fdda2e44f8cb12b10b91c83b22abc8bbb561310b62257c00000000000000000000000000000000024ad70f2b2105ca37112858e84c6f5e3ffd4a8b064522faae1ecba38fabd52a6274cb46b00075deb87472f11f2e67d90000000000000000000000000000000010a502c8b2a68aa30d2cb719273550b9a3c283c35b2e18a01b0b765344ffaaa5cb30a1e3e6ecd3a53ab67658a57876817010b134989c8368c7f831f9dd9f9a890e2c1435681107414f2e8637153bbf6a0000000000000000000000000000000000704cc57c8e0944326ddc7c747d9e7347a7f6918977132eea269f161461eb64066f773352f293a3ac458dc3ccd5026a000000000000000000000000000000001099d3c2bb2d082f2fdcbed013f7ac69e8624f4fcf6dfab3ee9dcf7fbbdb8c49ee79de40e887c0b6828d2496e3a6f76894c68bc8d91ac8c489ee87dbfc4b94c93c8bbd5fc04c27db8b02303f3a65905400000000000000000000000000000000130535a29392c77f045ac90e47f2e7b3cffff94494fe605aad345b41043f6663ada8e2e7ecd3d06f3b8854ef92212f43000000000000000000000000000000001699a3cc1f10cd2ed0dc68eb916b4402e4f12bf4746893bf70e26e209e605ea89e3d53e7ac52bd07713d3c8fc671931db3682accc3939283b870357cf83683350baf73aa0d3d68bda82a0f6ae7e51746,,,invalid point: point is not on curve 00000000000000000000000000000000075321084f4251d524581318d27b73a8de0b156f502d8f410b3b4529435bf9a14f609da9f63ac8f338fbbdf65ebf270e000000000000000000000000000000001925396f4b5c00ac49765e17c601bd392a8a96d8d5a65e2693093e6d5699610ad699d04e083f8b248c808619d01c33bce9478f1e5d80ad0ed31dc0bd5234bc41957cb74b63ce59654181c13344a5a3ae00000000000000000000000000000000153753f25d38c68a3b92a486bb896a1b6ca9d4b81620a7a0040386838be7187e8ca73987bb260ee099793009b5cce1f500000000000000000000000000000000063f22c3bedc7ca5ce16db22f44a68a8fa529b2c6aab59c97e4b2353ed1b81da0586dbc0fa49605402da10c5ff7cad7d7d0832bc939e73d01bbb419c98abf35cfd0224f72f6d215de379bad89aedfd65000000000000000000000000000000000d3423a536fe9de27b8da74c6f82fa3fae76945d0c8e50b8de889aa0d533ed1d5b757e918d0eca5b6a8a3b34f9f1de1a000000000000000000000000000000000ae42b8bac10e922cb19169f5d91d50c249e3d81dce761cffb7cd652bde04ca17dcd0ad185fa03b722079b69ad4f4cbc3c2130dfc2b39a0e20abc3f883b4e329496dbb8bc79ea7f30c909140c4b3cd0a000000000000000000000000000000000fdb0c5e83ecf0344a69900d1a59a21bd32f4210bbb0194be6355d18433a5449a81fd2c195e353d844070ed47c88bb500000000000000000000000000000000004c27bb460768252e5d07a952ab5d204e479ff74489933ba64f80ea18799fb937dd6956112872024795eba15f48e60073590f744e04374b92ddc43d0ca3068973b5b48c48a70939fd7d047ede75fb8430000000000000000000000000000000017ff6f3ca925d18ab2afe8c39ac69975769fe0fb6980c3c1c4c678deb01ec4b6e1f5b212a1fd5983e06a372be394c52e00000000000000000000000000000000131e1351e7a7f5fcfb87dffe794934356b36ba49c7d35b99281577ac078c990576a4db6d2be8a45c562a8fc1ec0620e37fd535426244e27c586fe8e87eaae37dfd851601e0a2b001d86f094a63c234f5000000000000000000000000000000000ee908a40185717063897efe710f3f1e929dcd53db503c5e3f0d08bf0c0edf2d68a5958fefd6c0099e9c755dc9407e78000000000000000000000000000000000aa3806ad71189cc119e6d88284d476033386ea4be2f7885d5587e0d991ad88590de58c782ca0bebade6b4b111f3c4ed54e3b4eb4126abb9629e0e5144fdf73716c8654ac8ce827a18f432b5f340e53400000000000000000000000000000000153753f25d38c68a3b92a486bb896a1b6ca9d4b81620a7a0040386838be7187e8ca73987bb260ee099793009b5cce1f500000000000000000000000000000000063f22c3bedc7ca5ce16db22f44a68a8fa529b2c6aab59c97e4b2353ed1b81da0586dbc0fa49605402da10c5ff7cad7d9c5fb237ac8e79e271008eab06ddc9ab45ebaba255fae6912577d0cf1428545f00000000000000000000000000000000153753f25d38c68a3b92a486bb896a1b6ca9d4b81620a7a0040386838be7187e8ca73987bb260ee099793009b5cce1f500000000000000000000000000000000063f22c3bedc7ca5ce16db22f44a68a8fa529b2c6aab59c97e4b2353ed1b81da0586dbc0fa49605402da10c5ff7cad7d0fcca884c7c01ba517c241e44478b35196d441ab3a76b7f023e08100b45d77ff00000000000000000000000000000000153753f25d38c68a3b92a486bb896a1b6ca9d4b81620a7a0040386838be7187e8ca73987bb260ee099793009b5cce1f500000000000000000000000000000000063f22c3bedc7ca5ce16db22f44a68a8fa529b2c6aab59c97e4b2353ed1b81da0586dbc0fa49605402da10c5ff7cad7dd7f494e1b8378362ed31b0287c1b5f6912a677abc0fc392234818d4242e0239e00000000000000000000000000000000153753f25d38c68a3b92a486bb896a1b6ca9d4b81620a7a0040386838be7187e8ca73987bb260ee099793009b5cce1f500000000000000000000000000000000063f22c3bedc7ca5ce16db22f44a68a8fa529b2c6aab59c97e4b2353ed1b81da0586dbc0fa49605402da10c5ff7cad7dba8eae358d75a3dbff9e62624ef6b1c641a1fc6a31c662f13a39d2fab938b519000000000000000000000000000000000f299ebde6e6c7b4d403b10b04832dfbf65b8ef9bcfebfa5352ee3df4f18e43798a0633845822a44a4fc7ec2ba1d13770000000000000000000000000000000003c886084611cb8c95fdb4473bc00d4877dd3ca10ba40765110400c1200d0b1f4cb9b1433e26d358f78d93da63ede6eea44e84f65a823eda9c7903fd4178c9e734996be8f291949341ff2e3b09ce7605000000000000000000000000000000001812e8d91771d93bef2f087058dd26f0c1ae487de050dcab1510e6ec444473f6815d8dd9565c18e777cfce1c836a4a0b00000000000000000000000000000000041fac4c713ba9727b0d5d539ecd45524285a2c179e7620dab88bad649f1b9b40dd422ab2d40c4945bc27dcb6e0a7a96129a1ee5c960052ac3051e4e663ff4f3c83b039dac18f25d4412a07dd9b164f900000000000000000000000000000000153753f25d38c68a3b92a486bb896a1b6ca9d4b81620a7a0040386838be7187e8ca73987bb260ee099793009b5cce1f500000000000000000000000000000000063f22c3bedc7ca5ce16db22f44a68a8fa529b2c6aab59c97e4b2353ed1b81da0586dbc0fa49605402da10c5ff7cad7d5ec8616e3f6fab8a437053de12816f4ca18c1b4d42131c4800904f0c551d8d3a00000000000000000000000000000000153753f25d38c68a3b92a486bb896a1b6ca9d4b81620a7a0040386838be7187e8ca73987bb260ee099793009b5cce1f500000000000000000000000000000000063f22c3bedc7ca5ce16db22f44a68a8fa529b2c6aab59c97e4b2353ed1b81da0586dbc0fa49605402da10c5ff7cad7d0dc25e17fb0ea75c07be8123108c626000191fb5106f3e1921401acb96dcd710000000000000000000000000000000000f59f9d995d77fa65c22d5d84f277f3ccba50eabb8c404f1f9d70a39cd289b37978bfaceea2b987712507d88fae2a8f3000000000000000000000000000000000a4d6759c576fd8f54a8182a8d1191e5c010e38e33c013603b480cece6dec5cd6892972be8ee1c13500c8a601eee5dd352c4962db75fb059c2fe525270edbe9374add7df7b53f79977c9e51fa5e8952b00000000000000000000000000000000153753f25d38c68a3b92a486bb896a1b6ca9d4b81620a7a0040386838be7187e8ca73987bb260ee099793009b5cce1f500000000000000000000000000000000063f22c3bedc7ca5ce16db22f44a68a8fa529b2c6aab59c97e4b2353ed1b81da0586dbc0fa49605402da10c5ff7cad7d7cbed522a1daafa00bc82138e08f1318b629d6409bade3d0dbd1431dfa6d60f4000000000000000000000000000000000809adeabe91b3d8173fcfb1ccb80dfb5a5ce48160d915652ff193e6c79eca0b6d9bdcc484a37723db4fcd3c4463ea9f00000000000000000000000000000000130e0fe4001d5995012202bbfa42584ed476ee0decb95122a9ed61364059d5021f8ef232df6276f93ac38cce8d70ffba145ab6abb85976ae17d459441500228e246aa214cd015460aaef6d8e5e02373200000000000000000000000000000000083908343f7329e4e738aa6de69b4f1e275d41243cfb30a6b9e00f032c0459fd005c43efe5a358ef6c0118b1528f3848000000000000000000000000000000000d39c55cf915d530de551ba3bf9aa147fa24f83d51656aeb63866c38b4f206079ac4f89c7f91ae3c37de09d37713f75dd98cf9f26a404e252383a4402c17de293857da5b7b8fabd9f4c59e5bcef4c0eb00000000000000000000000000000000153753f25d38c68a3b92a486bb896a1b6ca9d4b81620a7a0040386838be7187e8ca73987bb260ee099793009b5cce1f500000000000000000000000000000000063f22c3bedc7ca5ce16db22f44a68a8fa529b2c6aab59c97e4b2353ed1b81da0586dbc0fa49605402da10c5ff7cad7d5a526d3ecc90ba9a2fe62b0673397d4af02440f44551a333fdbca4e2ea6ac0d300000000000000000000000000000000153753f25d38c68a3b92a486bb896a1b6ca9d4b81620a7a0040386838be7187e8ca73987bb260ee099793009b5cce1f500000000000000000000000000000000063f22c3bedc7ca5ce16db22f44a68a8fa529b2c6aab59c97e4b2353ed1b81da0586dbc0fa49605402da10c5ff7cad7de9f0448dd229d025e58f7afb4912ac9878029b29002fb92d4259f815a32916400000000000000000000000000000000005bab5aaedd0f007d0c3e29870e29c93d34f43c26ad57281c03bf273a5e3264fb898059addba45c54a7fbfcecf83e95600000000000000000000000000000000150fb89103ccbd4976372929d3069a0cff886103b8e942e9911f12fd3809003dd5b1aead983c0a3f705b327c73a7aace8e0fc676aeb9d7bb302be47a4efc9e5a6217eb557d6c0d8f37ebe15cd80c170b00000000000000000000000000000000153753f25d38c68a3b92a486bb896a1b6ca9d4b81620a7a0040386838be7187e8ca73987bb260ee099793009b5cce1f500000000000000000000000000000000063f22c3bedc7ca5ce16db22f44a68a8fa529b2c6aab59c97e4b2353ed1b81da0586dbc0fa49605402da10c5ff7cad7d66539fea2e9ea8285538029a644c759190f21bab23f0e98effbe59b6b4af2c5100000000000000000000000000000000153753f25d38c68a3b92a486bb896a1b6ca9d4b81620a7a0040386838be7187e8ca73987bb260ee099793009b5cce1f500000000000000000000000000000000063f22c3bedc7ca5ce16db22f44a68a8fa529b2c6aab59c97e4b2353ed1b81da0586dbc0fa49605402da10c5ff7cad7dd6683f094390667fff0a92fef389fd9ef0a77280f90f41660bbeda517219e3ef000000000000000000000000000000000a7c61050509b59909bf23a56952fded8adfa4acd2f58b5bbbc0253872dd4d542d27ee23a511de762f21f81c5593ba75000000000000000000000000000000001264e5a654cb3d9ec931f9db10cdd851360958c360e53eea634d6eae8d9922e04e7f87b4cfe99932feff5b3926f6e1efafcce5a813bc622c601c3b4cb300cd413b8b0564793556adf1189e42722ff810000000000000000000000000000000000fa6770b293f6b74109947469ac2becdd55879467c8cbbcd0451805c3202e0b6978e43c421ae07cffba10dc37cafdb3f00000000000000000000000000000000060dfe71eac6b8772bcaa2520d343d56754a7e10368637a506decee4ad549ec43d8c4966b436e0bd2c1e270fc466d3a63ee43425efb56b18114a8fc59a63da39e30b7610d02ec5075cc391db59b875e600000000000000000000000000000000000f6e95654c7f61ba0dd368000312c5ba02feb2074c84bb7790daafb3b6c2a3aab5620d43fe3818d7ad92905992b644000000000000000000000000000000000afe6028eb4c49a8bc331ef714f1e0677d7623e3e36b4b3c451e7253ea6ebe065749e6f2e2bf03718ccb067411e2c7fefc3649d0fd8f7fbdd48ab6f6fd11d5fc593426464c32f09f3515948519d99d7300000000000000000000000000000000153753f25d38c68a3b92a486bb896a1b6ca9d4b81620a7a0040386838be7187e8ca73987bb260ee099793009b5cce1f500000000000000000000000000000000063f22c3bedc7ca5ce16db22f44a68a8fa529b2c6aab59c97e4b2353ed1b81da0586dbc0fa49605402da10c5ff7cad7dd824e57eb10a192bacde897180beb87c5559e6df2512be8df9cf043ad24b1e8c00000000000000000000000000000000119ca5f3fde1801e2cef526cd4e06b1230bb4b7dbeb43d34ba059d9bc394e95fc94d9be60ea972375d66b31c4f0482140000000000000000000000000000000007f10bfcb3ced451329af6fde9e153845fca20c6f5abb30a8ae2543880baf3efe6b31b3e7001700332bfc3e1616738b7a8a514daaaf533057c54b86200a1f8d5cbdacf8e3c2d9eaa921250b6387f45a100000000000000000000000000000000180ea28fad486a20615b934640aa883e70ee60c47c6148796691c58c64d03cb80b3802256756ef9217473837bd7bccc0000000000000000000000000000000000977ddcea657c79715e6d4ae801ab6e63a7c2688c0852e229b503dc951bc9611f36a858450614204ec44472914435643604cad22d4e29aab314523cdc14b691e509f260423d28e6f176eee3b659a164100000000000000000000000000000000195c0894c937d13b865ebbd935e4c609eafd492d57115df5f14df86b3381f7f9a111a2122d79d80980ad201c138464f5000000000000000000000000000000000471746c7c57fa94c23cd5978db9c638cca6617d27c445cda89f8298c4cb998317b8bca49f4de36e1e0ce24947021dbf7b1893649115755749a9f858ffd8484d7dbcb04bd2a3ff91a3fba86fb44ab69c00000000000000000000000000000000153753f25d38c68a3b92a486bb896a1b6ca9d4b81620a7a0040386838be7187e8ca73987bb260ee099793009b5cce1f500000000000000000000000000000000063f22c3bedc7ca5ce16db22f44a68a8fa529b2c6aab59c97e4b2353ed1b81da0586dbc0fa49605402da10c5ff7cad7db7930da64294e5949772522fa980479cd419f5014412f53a082e2b35f537ac0800000000000000000000000000000000153753f25d38c68a3b92a486bb896a1b6ca9d4b81620a7a0040386838be7187e8ca73987bb260ee099793009b5cce1f500000000000000000000000000000000063f22c3bedc7ca5ce16db22f44a68a8fa529b2c6aab59c97e4b2353ed1b81da0586dbc0fa49605402da10c5ff7cad7d61abf3d5e8d8df951747925b485dfd8cbdbba2fac2ef5f72a6311f79e89d406e00000000000000000000000000000000056f92baa9ef5e1e434fb70193f924706489968123ed61b8c9938c695852ef681709553c56d979f0925bdf1a8390a8d6000000000000000000000000000000000841faa9c8e27b1e94f2a5c14988806d62d7f35de74ba9a7db0062dd444a19b1a893ef6ee2d1ebefe3631d0ee0fcbca35be3179cb22c10450325b3609d9c3366c5200c1936280b3df162c48a213dce68000000000000000000000000000000000a2398e644fb52d53f02a583e67b11e5c7ac5b8e18e96498b9bbe572c3afd4dba8cd978db48501f5cc525e6c13ce92000000000000000000000000000000000017122a21cc3b7551a787fe260c1ed80ea34bec22d3ebb67b86dd0f2f95f50db7f577732c0d0e020e1ebb4295ba9a9d2a17ca658cbd9f48739b0076f97e4b943276f558760ac051f5c67159ad83bc94410000000000000000000000000000000018b172391adc5b6c44edc54c2bd874a01554be69d848b317fe845e62282d82440ad48c4bb645553bc75a701929aa9de0000000000000000000000000000000000753f19cae676565e45b13141d12fbefdebf6ea7bff7da94ace2af135e1aa38a7d63736de76bbea093251eed8755d6e3c3c4edae42b946fe140e511563d1ffb612a0d4fff66941f66007d0ac33c547840000000000000000000000000000000015916c0f96897e0e2b43bd76a98608d0afc276c1764f458f83db94fcf13adb05f440df55f3773bb12a3c25549e57d09d0000000000000000000000000000000016c6bdf76469f51e0b5dc0f9f2b22fe552e0fd0bd7084cf92946fc4d05692ab32690196a408a87681e32237cf172f5eecd8945187d434ffede5a94aeb3fe3442aba582787eca04c0e17d640820a30399000000000000000000000000000000000ca63266caaa56c1ceb84c922afd869885a1f33512fe59e1b367fe3526d1cf47f96df769d2f7708e1b693b528a28c94100000000000000000000000000000000027dcd246ff92089013faa40b4211e0bd0fa5777457668e57c0142561847542308a51d192ac5bf603ad8aa5119c6a5bc0ccbb0d0ed90f9bf2b75879861eb24b1170c9a83f5cc479beb4cb1e8835e77f2000000000000000000000000000000000d91133d005482f27cadbf8eb2d4a90952cee2d8b4b5a49dcd79a8141bd3cc04d4721fb3e62da217a08bee294a879ef50000000000000000000000000000000003bbd0c8be4f936ce1fa7b48f9158405e52a819cc1d4bb1fbd9f309698f8cdc1b2e1a5554eba3ab8d2e92f191274ac8cfe435dd14091302d34191d6c5028c3e62ad016f5a5b6256f3aaf82e9606f21cd00000000000000000000000000000000153753f25d38c68a3b92a486bb896a1b6ca9d4b81620a7a0040386838be7187e8ca73987bb260ee099793009b5cce1f500000000000000000000000000000000063f22c3bedc7ca5ce16db22f44a68a8fa529b2c6aab59c97e4b2353ed1b81da0586dbc0fa49605402da10c5ff7cad7dabd30cf71788f338622c21204603041353f1ca6885660be7ea826e00321c262000000000000000000000000000000000153753f25d38c68a3b92a486bb896a1b6ca9d4b81620a7a0040386838be7187e8ca73987bb260ee099793009b5cce1f500000000000000000000000000000000063f22c3bedc7ca5ce16db22f44a68a8fa529b2c6aab59c97e4b2353ed1b81da0586dbc0fa49605402da10c5ff7cad7ddebd81c66b87038940c72fac5d33aaa039525bfd21c79af3e4ef46ac5e1b274500000000000000000000000000000000153753f25d38c68a3b92a486bb896a1b6ca9d4b81620a7a0040386838be7187e8ca73987bb260ee099793009b5cce1f500000000000000000000000000000000063f22c3bedc7ca5ce16db22f44a68a8fa529b2c6aab59c97e4b2353ed1b81da0586dbc0fa49605402da10c5ff7cad7d6b382e8936d65c5c6ec4a52a5e22d923ba82072682220a6a30426319584fad480000000000000000000000000000000009edfbf4cad38d597d63663abd67d6a84b5c54dad7b7b147d791c41f9316923859e6daed7e384d9049b0a2203f08607600000000000000000000000000000000168806179a9bcb0bebd363fed37a5b9cc1e8b66d270982c31ea5573b78236f75d36b04efcd2092d7684a18c13de83c512bb927549b1b512c6e6cbe1038bed00f074deda5c63a2367ffc60c5ce7b8afc500000000000000000000000000000000153753f25d38c68a3b92a486bb896a1b6ca9d4b81620a7a0040386838be7187e8ca73987bb260ee099793009b5cce1f500000000000000000000000000000000063f22c3bedc7ca5ce16db22f44a68a8fa529b2c6aab59c97e4b2353ed1b81da0586dbc0fa49605402da10c5ff7cad7dfcfb7d1fdd47912832e10e1f30ec146c120fc68ade3f3ac10604ce548847a83300000000000000000000000000000000153753f25d38c68a3b92a486bb896a1b6ca9d4b81620a7a0040386838be7187e8ca73987bb260ee099793009b5cce1f500000000000000000000000000000000063f22c3bedc7ca5ce16db22f44a68a8fa529b2c6aab59c97e4b2353ed1b81da0586dbc0fa49605402da10c5ff7cad7d1fc561e062ab6a6b015fda81de63bdcff89698bd2a7445d0c21c1b8284d8ebdd00000000000000000000000000000000153753f25d38c68a3b92a486bb896a1b6ca9d4b81620a7a0040386838be7187e8ca73987bb260ee099793009b5cce1f500000000000000000000000000000000063f22c3bedc7ca5ce16db22f44a68a8fa529b2c6aab59c97e4b2353ed1b81da0586dbc0fa49605402da10c5ff7cad7d385829683b3cce18867d07afe8c02723f906a216c7d6d59d5b42518f5999158d00000000000000000000000000000000032d01e694621f0d2821bd2a575424d11cb623e65c1bc2438392ea57f08936e9b98eceedf917f4e51afbdd30dc8c24ef0000000000000000000000000000000010d8d9f87a3c2689ea9ac9afea38a0b1b31d90f0afa71957b596cb89a9bdd414dc2954f1cc747fac377d318769467dedc7839d6bb24f8d23caddf1b6f0895a5a6432fa0843cb313c5ac57e81ff816c6f0000000000000000000000000000000015ccd632042331ff5ea5fd21697810f7c3cfe5eb1d6e7afd9f850e3fd8e5914bce3d548cea90a60ab0ed27e24e72464f0000000000000000000000000000000001d027a23c9de769d155f06b81469ad9d3ea59a93d40388215c2b5c7438fa10e77da03e26f1010dc7a225d179b9298f9852544eb6963fd0dfbede6d8cad90517c2c3dad1ee2f6c49d24d8dd155ac977000000000000000000000000000000000153753f25d38c68a3b92a486bb896a1b6ca9d4b81620a7a0040386838be7187e8ca73987bb260ee099793009b5cce1f500000000000000000000000000000000063f22c3bedc7ca5ce16db22f44a68a8fa529b2c6aab59c97e4b2353ed1b81da0586dbc0fa49605402da10c5ff7cad7d5f94eaaa4947d5d054b54792044ca1450f25da28df35db7e61b7d9efe55debac0000000000000000000000000000000015163cbe70b4f6a2d7d90a8e48ac6f8812dfc7c997add0528f17a6f0cf42faaee56b13e1e95d5b8f306696a41f426c49000000000000000000000000000000000f55f240ced8ad609c288edc4b2a888b84b101aa39473c3353163b501cd888e07d42138e5e450f16d4e1ec0414b5d28f3bdf0bb67b4d2551ea7144121412d258383ed6cb4abb93b7b56b127dd384296c0000000000000000000000000000000011db7b6d983443206e5a7962bf7e2113ae463531cc958e84296c96d0c31f4f2264c8392bfb85f164500d6b872e7890340000000000000000000000000000000008d396e251da387cea196f5b7486788b3c03240451ad437b2d306f3b6ecc6cabd7e2f4111f7321b64022d2aad51fda460aef6a4bfefd1af38ae88ca70324b583e2aaebf559301d7505db962ebae2311400000000000000000000000000000000002b319cf695dec2b8da3475991a774e1c1b01421b0ebfd11297673e0eb218448c4271e67d23bd0ee5be867126091a440000000000000000000000000000000008549085ae48aedb3c8a4bcd271a9da39fb74f528af94e588c8a0a6a2e76026f2711aac32601e944d9547876ed23de7e1a85351cd8c1e3175722cbd8f6aa3806e0d9361f09e70dd03771b6b26d2f93de00000000000000000000000000000000153753f25d38c68a3b92a486bb896a1b6ca9d4b81620a7a0040386838be7187e8ca73987bb260ee099793009b5cce1f500000000000000000000000000000000063f22c3bedc7ca5ce16db22f44a68a8fa529b2c6aab59c97e4b2353ed1b81da0586dbc0fa49605402da10c5ff7cad7d6fcd55de20c3131edb3e85f6aa82f17c5fe5b93f92fa3fd596c833549824ede500000000000000000000000000000000142095eaf85b1017dc314db46100baeb29170a35f429d1563cd7aa6714f6b1dd269ba00be1a82294b0a508f7f038e0d4000000000000000000000000000000001558399b27afcccfa6a89cfd4635a4bd8c87d7ebbb25c28649f24f90897d7fa54c207986dd854f156be69a6eda586aab431309767397001e1e32bd73f685b5f54076732c953974b446a3088f54c9e3240000000000000000000000000000000019ea6e73637995387e7c2cc1a0de3d34953242a8dd3139d8a5886863cf21249e8716a8394f4883a2af632abdd15998a60000000000000000000000000000000010c0c216f747d186300934461ed363744aa30be9e0dbb390d362cd3c71b59728b124a396c6e186ea63aaaeb4d2a454d7d92679e9ce2106708d5206d408ac3650d2046a51eb79eca4dba9416ef0f3527200000000000000000000000000000000153753f25d38c68a3b92a486bb896a1b6ca9d4b81620a7a0040386838be7187e8ca73987bb260ee099793009b5cce1f500000000000000000000000000000000063f22c3bedc7ca5ce16db22f44a68a8fa529b2c6aab59c97e4b2353ed1b81da0586dbc0fa49605402da10c5ff7cad7dfa01f7cf41925a6bbe60b14586586fe0d4ba146c5aa6f02c14d41cd791878554000000000000000000000000000000000e7a795c2e6d4ac210d0fb92e94cd76ff97193ef7bd79446afafa7185df8959389801ac16f846360c8509bd407d28da40000000000000000000000000000000013e260782a41a63ce7c4048109fae191aeb7448fceb79e06c37223de72ded540931ba81ecdcb46423bdc7d564d27ee0aa5138547028a8868888087c4abb44f421757cb5583a6eba82b58504655162463000000000000000000000000000000000ca32c6c4b8746170ef22461dca8893855af15fdabb27a293d2620a20088f3892018e3c10dcf80f67f5227b14a808fb90000000000000000000000000000000001e88d80946624429dfb26f20236fe03680a359f1522a9075d48f27c84de9008bb558a645192bded688197e55b29c1cb5444536040fd8d54b8497d86600a5ed467a4207dead453c71781ce03552fc18500000000000000000000000000000000153753f25d38c68a3b92a486bb896a1b6ca9d4b81620a7a0040386838be7187e8ca73987bb260ee099793009b5cce1f500000000000000000000000000000000063f22c3bedc7ca5ce16db22f44a68a8fa529b2c6aab59c97e4b2353ed1b81da0586dbc0fa49605402da10c5ff7cad7d49e2561d0364b0069838bf24bd021d1e4a95cb0bd5aa7a94a506189f4f5ce5b000000000000000000000000000000000153753f25d38c68a3b92a486bb896a1b6ca9d4b81620a7a0040386838be7187e8ca73987bb260ee099793009b5cce1f500000000000000000000000000000000063f22c3bedc7ca5ce16db22f44a68a8fa529b2c6aab59c97e4b2353ed1b81da0586dbc0fa49605402da10c5ff7cad7dcd2d6f115ac393d6d5733cd0f6e6d3f0231cd825bf899902c50c917d0a56aff000000000000000000000000000000000153753f25d38c68a3b92a486bb896a1b6ca9d4b81620a7a0040386838be7187e8ca73987bb260ee099793009b5cce1f500000000000000000000000000000000063f22c3bedc7ca5ce16db22f44a68a8fa529b2c6aab59c97e4b2353ed1b81da0586dbc0fa49605402da10c5ff7cad7d59d2bd9bc3e12e5d50c9e4c768c2f8c65ce771a11cfbe46da73d80786e027b58000000000000000000000000000000000fdbd45fd634a2f233ff8ef90d5947977023d9ddfa69f3ce6b1dc6abb17bcdcbe97bc4be5059bfd2ab1aa91d17821024000000000000000000000000000000001435c723d4563d17a9c12090347929487409efb3d29119ccc967a6c5e9cc00e20e537a3e05e385cd8efa555dd3f2b722ff0a56d2dcabac5932c5d959f2f036d9ba5c71cffb7e686d319bdc8d1e83093f000000000000000000000000000000000be1163dbc97bc79f8434c744dc0e2c638c9d524903738ebea3cb86b79438ea2fb0238451da6e962b412be9a0e7611f800000000000000000000000000000000022a59b0eb1ca7d35ae94bcdc64f50b443260f8cf7c8003d99c3ae198a7c2fcbee4653566b485f33357d8eb1a6db1511f7adbee3c265263c30e3662a1bd35fdb466bb3677d6d09efe99cd1a7a468548300000000000000000000000000000000153753f25d38c68a3b92a486bb896a1b6ca9d4b81620a7a0040386838be7187e8ca73987bb260ee099793009b5cce1f500000000000000000000000000000000063f22c3bedc7ca5ce16db22f44a68a8fa529b2c6aab59c97e4b2353ed1b81da0586dbc0fa49605402da10c5ff7cad7d6448a9f68973305afe0622c12998037252fc8183296ebd0f29456159b8275e03000000000000000000000000000000001947d6e595915bd7ae4e538306d208a2d312de5de42f0d3bb735916aa741f47ba44834b3965f2aa9b5405c10c2b6b992000000000000000000000000000000000eabf37c5ebf82bf038d3eb58b72a5a584d69ce3e7de1d9668ab5df2abda5797e567321ee43d1aaa15f057048567f7c6f94018c9aa0307288e5126c736b8bc6f270836028ff850de60261bff338b7d7d00000000000000000000000000000000153753f25d38c68a3b92a486bb896a1b6ca9d4b81620a7a0040386838be7187e8ca73987bb260ee099793009b5cce1f500000000000000000000000000000000063f22c3bedc7ca5ce16db22f44a68a8fa529b2c6aab59c97e4b2353ed1b81da0586dbc0fa49605402da10c5ff7cad7d7037d0654ed51af22b5b324e23ca1065dd8cd3408a675ec204cecdfe687bcd8a0000000000000000000000000000000005d727a52fe6676e8508bd7d3a27c79cc4836d412cd5720063ea0ce5ca245cdc6dbd6fdaa26ff502d3ccc6e27701395e000000000000000000000000000000000ffa9dc48cbbf1ba32bf5de2ad98e8f4f1842f1e219660c00ef9702a72aa1166d46b9731b8c80581a795c0a09693cbeea5616463a00009079c228b8a92059926e3e26170c7bf1514823eaa8bc0e6ffa5000000000000000000000000000000001220a1e08ceb679bb165a3c9be882b6429c36ab83a7324ddc07ef7f2d0a4408d741e84791a33775ad4565cf816a4e9b70000000000000000000000000000000001496ad90c53c27392ee8849601aaa5b2c89700112a324864472c1a8d49804fde78e761adfd9c7755ac2d8d7d215c0b53c1cd4a2a7ab5eca1ddcda8887fb2aef01cb454a97bd39f2e0680915be270b970000000000000000000000000000000012b40bf0cbdc9e374ac4162b638403109a79803a726509f9326b85d3f2b20dd2a09015c30a2bcb1156bf7bb888f010c0000000000000000000000000000000000f3bb973815c39b95fb1398d80ebf1530060e31495a96c736b0235c78c5e041ff69e2564746b07d7a270bd45258e4aa7627af6cb2e8a90102e79d2cb19aaf0b6c18dedfdc736894732c7403036f0324600000000000000000000000000000000153753f25d38c68a3b92a486bb896a1b6ca9d4b81620a7a0040386838be7187e8ca73987bb260ee099793009b5cce1f500000000000000000000000000000000063f22c3bedc7ca5ce16db22f44a68a8fa529b2c6aab59c97e4b2353ed1b81da0586dbc0fa49605402da10c5ff7cad7db4371b02a3681f7f8f53acf22cbf8307d6e5276a5a23ec74fe02cc7aad62e98200000000000000000000000000000000007c2f86b037c3a7b67995d96bf4313ab6c20f472994372b40b78a3dfdba4c7616ead79026738d0ec398364806a57189000000000000000000000000000000000e752c8490fa323e0c74f9ffdffcc9ada27016388144bc95445341a6eaa82fa9a10d59c11bd8dce3b9cb0489ab1a5447ddb739a79265fb03de61859590978af384fd44243aa33806a1c7a3e20f37365500000000000000000000000000000000048afef5dd0565942320a985cf8d555408cae3edc40b7a5456ec86308d5f11db5592fe37e058dc6bed42346b42fc4abe0000000000000000000000000000000005e36fcbaf73026442a94ffeb56f4d05df46b90e3e02c3fbcbe3a32b1878edc7f6a5e57dd9f6ba64097c41e8e7ddaefe24584b142d6180187bc728ed22bf802d01db715ff85b51872991e92ff1d70f500000000000000000000000000000000008e3fe3d42e724fafb0501e4d8f2c55ec35bf60c71f6bd31f3d4b890a0b418e00509b8666af4207c8db44b30dc3828b900000000000000000000000000000000122a0dd7a24cf1e42ac8b8795ba785efd1f03f4753985f4071f17c4b8be7706fda8f900364c1676bef4e20e5797583b129566ac3f767fdce83ea91a295d06984d48763136f977f5e7e4f013ce274923400000000000000000000000000000000153753f25d38c68a3b92a486bb896a1b6ca9d4b81620a7a0040386838be7187e8ca73987bb260ee099793009b5cce1f500000000000000000000000000000000063f22c3bedc7ca5ce16db22f44a68a8fa529b2c6aab59c97e4b2353ed1b81da0586dbc0fa49605402da10c5ff7cad7d92af1ecbc9eccb56b3a220398ad3a3885cdfd3f02c9d302add64359bd121cc3e000000000000000000000000000000000e7775462ebb7f1ed737ab730e39ef8bd089222d3d7b4ab904e3583f898739d6a53c1d359d11017892eebe6ed9917253000000000000000000000000000000000d239831ce4acc58fa97e4d4cf56c3961ef313b681ebb9a1e221900e55832989efd1b022d9ec807019dddf73b1a6fdb2a407193f74d08ba9ed5d971f0516e7bbc7f89309dec24a4ea5d2a1f3eccfa5c6000000000000000000000000000000000c5be42126df5197c04f49e618a3fb6b8ff17f90b5ff26db7fd508a0723c4f479645beee629e02c9da60313b19bbfcec000000000000000000000000000000000e7fb0e4699dbc768d51247f5d7030fc698c5875cc9c5b326f3f7a4315c6fdc8e5095e91413dbd2c9b40316645275b3cd8fde96110b12c91bb5a9df196e4ca3c169710a6951e4dafcc2803fea31a43d00000000000000000000000000000000004760b7d9e28a23216b7ad3ac6b95c094e823df1bb05559e1871d9598287ef2f48f2858a1929fabb7ed3d7372a8bc7e6000000000000000000000000000000000f766efb67b69b273f9e1ee0c1f934231072719039e642892623f869b05c3b7af0b18397e76a25cd9f3eefb4f04935a54d02b624a8c2cca31a05cdeda3e09ad819140fec582a88f266291ee6aa1f1ce6000000000000000000000000000000000f734e6b273c6b05e911a4441c3740d13228917fd0916dfcc696930ed1c2e70268ab98d764507e68fd52826bdddd64e2000000000000000000000000000000000c20234fa85fd9eed8b148e79aa833443d47384590788f0700ccdc163b5d50dfaf5fbb901e7802d27a3db86f6aac06e91977c7a5be2688c808528d63a275fa8d18af14d7e90aba7edabfc821f4ea37be0000000000000000000000000000000016f5c2679ac1a70cfeddf38068bb85b6d35de903105a14b3c4b3d00e6f57c8b6c6de7d55f2b697617a4aeb73cbcffc090000000000000000000000000000000014ebec9ccb8e6052a009255080f2e0bc34eff9214e911bd6c4eedb53022a6defd5f0e78c9713c6a2e1f110152ad65b941a5267d9766e7d84ed4693f15ead057ef7396903e8a5f3a55bae74f044368a6300000000000000000000000000000000189b31702e6d365104d661c9c524b2c8d42dff369366d125453496e434f1b9c4f46cf3923afd14b50a4e06e4f73b5f8e0000000000000000000000000000000009eadd06f6cf208c4c70fe079cec8191553cc8a55321ff0a70f818d1cf7b5838292ba5eae5298f9b842577a7cb0ddb4e89246920765fec2a411849831114d529aa308111efdc119e85186b960ea5456600000000000000000000000000000000153753f25d38c68a3b92a486bb896a1b6ca9d4b81620a7a0040386838be7187e8ca73987bb260ee099793009b5cce1f500000000000000000000000000000000063f22c3bedc7ca5ce16db22f44a68a8fa529b2c6aab59c97e4b2353ed1b81da0586dbc0fa49605402da10c5ff7cad7dc088cc74c109957af3548bea8f72505c8ece5c1b690c14dfe958b8faea470aa1000000000000000000000000000000000334aab374f69a9760f58431c6dfa783f71908bb3249f03d05272fcc6b5548dead4791e86d630231133c121ffc10795d0000000000000000000000000000000013b4f68ca1144b9b2723930cf63c5b75fbe7a09997ad6916b933c5713e5c52e918e4a0876e5a3fa282a87335d9c1cf4d6e33049a1bb4429d216991c6aaec7a6601723e52aaeb4fe9dae31b5d3816e93300000000000000000000000000000000153753f25d38c68a3b92a486bb896a1b6ca9d4b81620a7a0040386838be7187e8ca73987bb260ee099793009b5cce1f500000000000000000000000000000000063f22c3bedc7ca5ce16db22f44a68a8fa529b2c6aab59c97e4b2353ed1b81da0586dbc0fa49605402da10c5ff7cad7d44f89ffaa24457b265e18cd544a4107dcb6f3d7f3fd39842a3a6f40cb80ef8b800000000000000000000000000000000153753f25d38c68a3b92a486bb896a1b6ca9d4b81620a7a0040386838be7187e8ca73987bb260ee099793009b5cce1f500000000000000000000000000000000063f22c3bedc7ca5ce16db22f44a68a8fa529b2c6aab59c97e4b2353ed1b81da0586dbc0fa49605402da10c5ff7cad7d39a1a26daf737fedd3f00aa08e7c55933b70060321ff2d862df8d3f2216433be00000000000000000000000000000000153753f25d38c68a3b92a486bb896a1b6ca9d4b81620a7a0040386838be7187e8ca73987bb260ee099793009b5cce1f500000000000000000000000000000000063f22c3bedc7ca5ce16db22f44a68a8fa529b2c6aab59c97e4b2353ed1b81da0586dbc0fa49605402da10c5ff7cad7d792f9741bbc394770f02b271ac249e66e056b225118afb58e804ba6a64d69fab00000000000000000000000000000000026ef7ed98b77106cc9e97e418086f844f2fa5db62484336750db6b140101657350dd20a29036f31b3b61a0a6292f1720000000000000000000000000000000007253b6377638195eaf42daaaabc451ac78e0707f14b12523ba5cfbf5ecb146b8fe1361cfdaf76b7b7395fb4b2ec7733fa4e4476364dad37551ac06e221cfb959094aae57733ae80c00d2213a68a841c0000000000000000000000000000000010213a60637cee478d92dc83b85937f51be6878189ec58c491959206024a726045906c47f39c89c68e8109ac8a09124c000000000000000000000000000000000a915b174003ba76da253296fad341af125a7b0d30e541c92cd25c970fb5d45993c516124b8535024c74d970f12fd7c1ced1ad2563403e274800e80f48fecac97498e58356f33ef6fb3ab123ce15f5d700000000000000000000000000000000149451bc330ffe029b198feb8d796fde5341b0691d0ea058d9a29ae1de78740e3906fd8cbcfc135caed16c03ec8b0fb500000000000000000000000000000000147a09c04d930602218988f7a101cb0572e8a41f83c49bfa6b92217d62a7b817146876b8de99f984cdff2f1509762580bb49d60ebba706d3556aa7ada87267ee3220b7f0b8d333aab79d690feba308710000000000000000000000000000000010d8cd8f975822ed51b18ed332fa6b695e0ab0c884413da5a1f77f0a472e06a257323aae9a3a8233dde0f3e1a797dd6a000000000000000000000000000000000f2b776ac6bbb05bd2d18148df50f3cf9ba3bddbc6ea410a537a65e0bf12ced5dfb8fd9a1586289bf9ae79889102d1f9a8d81a8d537651685cad896598a65479445bcab815793de88f399a7e2989c2e400000000000000000000000000000000153753f25d38c68a3b92a486bb896a1b6ca9d4b81620a7a0040386838be7187e8ca73987bb260ee099793009b5cce1f500000000000000000000000000000000063f22c3bedc7ca5ce16db22f44a68a8fa529b2c6aab59c97e4b2353ed1b81da0586dbc0fa49605402da10c5ff7cad7ddd130785a081c481879877abfa85e66b3b39cf81451696e7fe7524755d5bb0ca0000000000000000000000000000000019fc82c97989866d4e50f03c018dda0c6b356851d014355862a243ac1e2201ae248407ea895ea051a87249518eeeef66000000000000000000000000000000000d7c34b2070466e3107979f43191c09bc5e70ae6523fcefaa5227d04eb6e51de5d9025df74e2056e5e976a60a8b8b612f96d861e2c9a2b8b47f7c6f6f6c63ca93eb83bf5d1995006a7c5f03c2fc25d2b000000000000000000000000000000000928e3c3be2939c1da0a388eb4b55a436a698827c7979d34ec6a0ad3ffb9e23f112350c0b8174f1e52b2c53a8de4649100000000000000000000000000000000123a719f66a3f2dcc8ec1b3f130dcaf9b4e1e9124ae6807c744417ee04dc7464bbf1bd7f6076257753061334332e7192eb64c8c2bdbcc472ed8079a295888c1ee902c948ae48d2149d37815537aa538e000000000000000000000000000000000ebc060619caa0db6ea4c47bad6610802128d2be619173223a9d0f84d901f147db4fdeb250249759487bc727ac061c66000000000000000000000000000000000c44ce1e0c8b3f4e2098aaf2efe85cbfb689fe5478641ae53cd5805924ded81d586644c3bc49a389b15d837e2d4fe44a39f9d35b3f3b4037baa3bb79f7d5e522b9c1acd434fdaac61c3f616016b3bd5d00000000000000000000000000000000153753f25d38c68a3b92a486bb896a1b6ca9d4b81620a7a0040386838be7187e8ca73987bb260ee099793009b5cce1f500000000000000000000000000000000063f22c3bedc7ca5ce16db22f44a68a8fa529b2c6aab59c97e4b2353ed1b81da0586dbc0fa49605402da10c5ff7cad7d91b623b6ee1adbe3728463c29c39379a29809cfd7cd0027835a271a7436f470300000000000000000000000000000000153753f25d38c68a3b92a486bb896a1b6ca9d4b81620a7a0040386838be7187e8ca73987bb260ee099793009b5cce1f500000000000000000000000000000000063f22c3bedc7ca5ce16db22f44a68a8fa529b2c6aab59c97e4b2353ed1b81da0586dbc0fa49605402da10c5ff7cad7d4e2e68c5c52d84b713d3f681fe6d06fff398c110215895ebf9deef50b2a338d3000000000000000000000000000000000cd89c9fe1298920067f1b37be297c5567137a07a95c56dadb2c04f3993608ea498e89b684b8262172a1081505d5c60600000000000000000000000000000000073204f3cbeb83a5189fe1df5f501241e2453afa3220c38776590862681a771cd5d6cef2946228c1416eb3c1d840bcca8e2be1afacb2acc764b129c6c62c2c35801b548f424c4bd3717f6302a44b15b000000000000000000000000000000000177d5d25fddee9f1923b4ae21ae91ddbc4e55a22af46eb61b35e0634f7ec15a7d8bd6ca12be9fde52561d207d26406330000000000000000000000000000000011e9fc830a8865caf50c1c20853f38039c3b0aa956a75140ed699cd0e69730c6f7bdd00fe05529cedde1785a39f67d3f60cb52da68c43935c22b6d1b13b3c32b79f8939ffaacfb4938bb1747e3d31f4900000000000000000000000000000000153753f25d38c68a3b92a486bb896a1b6ca9d4b81620a7a0040386838be7187e8ca73987bb260ee099793009b5cce1f500000000000000000000000000000000063f22c3bedc7ca5ce16db22f44a68a8fa529b2c6aab59c97e4b2353ed1b81da0586dbc0fa49605402da10c5ff7cad7d91181d5d2444d162419133835091288d910bdc603f405c6120679fae82b6e842000000000000000000000000000000001689b5ec4737d58921a131707b92fb7c5b16e084a0415bc5c1bdb5b9a6260327526da2801932b5775f27cad390e6a6980000000000000000000000000000000004b610f2c453e9cc73f04425487f65660f478eed19ed3f3e60aab068f53f2dfdb5a73b02e525a14afe7423f8850ee9fabd637ad431366f08e955799c79f6ea5aaf9c22faf5400e7dc6c249c0e6494c1f000000000000000000000000000000000c37eec1f1033b86368b0fe1e42d9feaf174a77c4a455aeccda479d8fc937faa3a521afc7a2143285e7496f192670242000000000000000000000000000000000ede805910da61cc6daf7b4d465ee83ddf1ab5097634933a70003112a20361cd9c59bfa77b1bc026e93ba6bcfedded5b6ac13b151ae86bfc484c2bc91d4df9a75ef4a2523b968fd31391f9dd0af789f400000000000000000000000000000000153753f25d38c68a3b92a486bb896a1b6ca9d4b81620a7a0040386838be7187e8ca73987bb260ee099793009b5cce1f500000000000000000000000000000000063f22c3bedc7ca5ce16db22f44a68a8fa529b2c6aab59c97e4b2353ed1b81da0586dbc0fa49605402da10c5ff7cad7d6fb50ae4f785f5b5cfdd9aa004f08215d1bb6c1214d5cc5f027c3bc28a812414000000000000000000000000000000001259021c75f2fa3278b16ffaf375146d0ffac5477347ed1641886f703005940cede0bfab44fe49ba20914d580161326f000000000000000000000000000000001029ca636af85218a2a23d4e0b799dfeb713718a258c13df2731c4f352c5629a4d2b996d9b2b3c7adb73ef0a28217ae0042c2d53c35f3fd0005a977237d71ec6da2723a7c9187f1b9f9c86a5d77dc773000000000000000000000000000000000f719b8ee0f2d3c845323b1d4b5df26a6c118f705f62b5cc535ad3a9dfcda6ecee37a0a9cabc52dfcbdee23ee4fa76d3000000000000000000000000000000001550b4ca2ce312e81b6050f7cbb6934f05830c739d3ec8b84cf1f349fd740b13cdcea3f2939bac45bbc71317ee0a3c11cff78aca784067502defb619fce8c8ca407761d3fa78d635b21afed38aefa13000000000000000000000000000000000153753f25d38c68a3b92a486bb896a1b6ca9d4b81620a7a0040386838be7187e8ca73987bb260ee099793009b5cce1f500000000000000000000000000000000063f22c3bedc7ca5ce16db22f44a68a8fa529b2c6aab59c97e4b2353ed1b81da0586dbc0fa49605402da10c5ff7cad7d8bd0c10194e4c8a032574824ab15979cd7fd2014dd7fda706b86d37a24a38990000000000000000000000000000000000d72f3900402e43a50414d8aba5dabe6a4ed9a2ce4df7f18018ed3292da6ce11f32d336cafe428a867dc3f75af7e625e0000000000000000000000000000000015c68638b97c79004b2bcabbbc309884bb4429fb7a947db7c0aa54a941574475b164151619c9bf5046a644391842cfd183158c0345a5f28d1577e3d9dc463b8a355602d25577e328ea82f987983e805100000000000000000000000000000000004eb67438c54c72fc064a92653c60b36d93dc4578b251dfd9fef885fbb71e7e17ce48cc286d364a9403125a285714ba000000000000000000000000000000001711f593ed6016095a9d01a7bf1081a2e279e837a35d250153ffc6a12bf2dce0c9819e5d0cedd8b20bae73414538b61aa03169e13ad2198817b924f5bc1df0f1db63f14df64d1ae24b1c43f18eb78e010000000000000000000000000000000016b3e588f20cb6b4fcfc37a53f57b4b446abc8d56314031db09996769e79ea63cf54549f0bd367545e4d17d5b55a300a0000000000000000000000000000000016feb1a66fbc5cbe44fc73e43735063100d1d5b28cb56a46c5c932111c08c4769fdea4a0a76caac26347148f50355aa0aa98c3852a24f571693d36ba7db3ffd984010e4084738f0b8b60fc7b6ac4b9de000000000000000000000000000000000ed8b7e1b18a4da705a76d23df1623052f99741485af9ddc9f501d6bb09d04356dcdd02e78bbfd8384c51b4156d0709200000000000000000000000000000000116ed2039d4a23fd7bdc56506bd4109509c6c189251ec9014cf9f9023ee810e254539c83f18bb7642a1dc6b41bf809c7f93ec9381604290d5311aa3fb14d124f0ba65df55f6ef3ec4a269edd870ff84900000000000000000000000000000000153753f25d38c68a3b92a486bb896a1b6ca9d4b81620a7a0040386838be7187e8ca73987bb260ee099793009b5cce1f500000000000000000000000000000000063f22c3bedc7ca5ce16db22f44a68a8fa529b2c6aab59c97e4b2353ed1b81da0586dbc0fa49605402da10c5ff7cad7d3f6f400d9cc7bc131fe4e5549b6ab7d82436bf68b504b970ff712ca4c9c2c97d0000000000000000000000000000000006e236535f811c96ff3f9c072eb9cf5f87c45cba5c7574359fdc6000c40693080e7f61867cd5a3c4a65ee9c3d54a6e03000000000000000000000000000000000738e9c888e7bb7d997c4f981c492fd3a4766e4d4c585b7a03779b249331ac014697c89bc21be212ac499fd6ce0b35969e06051cedf33e1f3ad21f763979ffa200c056792ffc8da1b6f44af6eb227248000000000000000000000000000000000af956bfa4d9b6608adf999c46c2c992f8a3eb697692ea3ee630764b855ff44b350ea6de10a3e5e1f271cac23b235fe800000000000000000000000000000000140bd10fc8fd2e934494c9f7b00fe56028ce31d97345ef9b8b31ce6d297cec92c7d4507b3a6fee0ca39dbc9d451143c61e44b07f50d5e8d1a05c82ac2a481ac5e8aa7822db692a1a3fdea6a0506ad93d0000000000000000000000000000000014f9f27a2cf656c4ed0f94d7c3aee20dc0bc821921bfb045f5b68ed83bf0c7d00a986ea7c45d8d705ecbde13597b0e63000000000000000000000000000000000db7075ecc834f4959cdb7e188fafb405960dbee697a82746f478db752751f450d2ff3bba389104e5b285ae61bdc0c8aad55c357b7f2e245173617f50e12c9e28cabd7b5d4698083b5494bb06ee6b94f000000000000000000000000000000000f3d8fa3abc111f80330ce55ae9318b6fec02b352e6d1d255449eaadd7cb073e98c3c0d8eb927c123e1291e4fe3fd21a0000000000000000000000000000000007444b25c17970b80480504eec11391f135bf9a817c39a17490474401bae058b276da0a3e40524aaa202d20ad9371923f67af135d05146e92f729e3176fdd93e17f5c94fcabc5ea6d93ec2872ba9202200000000000000000000000000000000153753f25d38c68a3b92a486bb896a1b6ca9d4b81620a7a0040386838be7187e8ca73987bb260ee099793009b5cce1f500000000000000000000000000000000063f22c3bedc7ca5ce16db22f44a68a8fa529b2c6aab59c97e4b2353ed1b81da0586dbc0fa49605402da10c5ff7cad7dc430190b829e32a784e3024f0a8724f62d4184898b422e1eaa6a6682a8ffa5ed000000000000000000000000000000000933768ebdc9e9a441da03b7b9a256ad6feb63944389641df09c6a17b73032329246f1d0d6bda314fd240c5edcf763f4000000000000000000000000000000000e27fb7f7d159ec8a2936877c69de1018ef076da27682bf900b67ef6fe042bc4f89d8c209d93f49cf8261350f8e3fa5368baff019bf1f9b24e32cce1bb680db6983d6f2b2e60addfa31d5ad9475238aa00000000000000000000000000000000153753f25d38c68a3b92a486bb896a1b6ca9d4b81620a7a0040386838be7187e8ca73987bb260ee099793009b5cce1f500000000000000000000000000000000063f22c3bedc7ca5ce16db22f44a68a8fa529b2c6aab59c97e4b2353ed1b81da0586dbc0fa49605402da10c5ff7cad7d494507004a8ae79912a11252b4b2db7e498b534e338450981ced313193d9687c000000000000000000000000000000001197c02653a12f6af36025306b69c89df784bb7894d505621f05d7f1f6a69e852508df91e3d8a370f4e8cc48ab02d1740000000000000000000000000000000004dc5b0344470d1d4f41aa663b33cbbc1c679ff7a30dfe96f99514e9d99b94d7119ec7e93aef68bee8ff883401e7191036da67891846eab25aaa711c5d03b89f0a5377bcf5470bc4ecb1434e6d7fdad400000000000000000000000000000000153753f25d38c68a3b92a486bb896a1b6ca9d4b81620a7a0040386838be7187e8ca73987bb260ee099793009b5cce1f500000000000000000000000000000000063f22c3bedc7ca5ce16db22f44a68a8fa529b2c6aab59c97e4b2353ed1b81da0586dbc0fa49605402da10c5ff7cad7dedace0762debb30741de59f071e6ee17f2d7ab3d390b1c9eb2128326204c6ac3000000000000000000000000000000001579c41346af232eb0717e393790cabff843cd6c50fbb378900009506ea2aa44c9bda06ac22508fd90dd4b1812c5791100000000000000000000000000000000034c6e25a58fbac1a5e023a5f8a820eef2539c8ef3f0dc9b3d9e05044f72eed9cce1957257364dbe961a2368f6f4a2fba1d68cffa664b8a4fc6612f5088c2206666218627b5a3d8cdab267ba61b6e94a000000000000000000000000000000000f6d092d1eafb6707da09d754ebe75c036b634ab71d45c05b02d087eaf9a4653c44cebfea4b6077a7d27c136861745fa00000000000000000000000000000000073be5a3badb56736b4fc10f1da61a512cb01b9938f613c24c3d3f3bf92311fc96b112c729e4c15edcf5929c88d459a61375f570e38bcaaee664681e407e7f987c82053420837154cb5a6728e0ef94b800000000000000000000000000000000153753f25d38c68a3b92a486bb896a1b6ca9d4b81620a7a0040386838be7187e8ca73987bb260ee099793009b5cce1f500000000000000000000000000000000063f22c3bedc7ca5ce16db22f44a68a8fa529b2c6aab59c97e4b2353ed1b81da0586dbc0fa49605402da10c5ff7cad7dcbd879144a71eb72e27370ccfe3a7838e7ccd0d1a3736363d4db8bc93b8823b60000000000000000000000000000000008b35839caed21e951fe50de3cb5a2c1b1666facfc98416258f142b3b60ceacb20bb0d08e3ef36f9d4f5de717412a2bb00000000000000000000000000000000199763b4f8dd148df64a832e2f23565a715a4587c5cf43fc4a9275952ca7d4a7697e395f130424e97f1f86cbfa961be5e666b68b60b59b28fc886334ee9dd129522d30b920bab308529666cf8ff0d76d00000000000000000000000000000000182c820bcb67b1498243b455e29c1334e4a3a59eb6abf2933d8ec05df470bd8e7ee8d332a209f1202290739623aa26f6000000000000000000000000000000000384ad81bda50856eed135161899d096fbebacf59a0d02e7a87366ed0f096e3bbd1eb4fa3281fb8413259a7d2deb162ff6b2722416947db59e49f3b1b7160356e36ebb1963b41ccbda7ea93b62ca483b00000000000000000000000000000000001b26cc520f5c5d0ebac51d8a24106c2da9131df1c53c6b36b81b2cccacf3ee81b55292c06cde3008225d0f8a69d8db00000000000000000000000000000000126cd4e992718f3b1b366b1ee4459a16bac8ed2a814ae9445c30640efefbc7cc01c3d1fa1dcfe2a7c727fb869f46e1b99c567427455c4304a89fbd4fbdeec02d5b1cbfe0404bedd35114252f94b82a6d00000000000000000000000000000000153753f25d38c68a3b92a486bb896a1b6ca9d4b81620a7a0040386838be7187e8ca73987bb260ee099793009b5cce1f500000000000000000000000000000000063f22c3bedc7ca5ce16db22f44a68a8fa529b2c6aab59c97e4b2353ed1b81da0586dbc0fa49605402da10c5ff7cad7ddf33607ac4386eda9cbe7a68908739c910922eba2b1cd119e794da621196d3aa00000000000000000000000000000000115c394d97c1aa29dfc3c5c42700dddfd435d30d753ebeb8db7e59c9ee129f8fbd87486f476940c958f127ecb166c7f90000000000000000000000000000000018aa9556e962f8af9d5c4db3e10a1f6c9603345a5e155944702904faf70d972553c0ce6b58df3886ad4de85069fc559b317185cfb9f04c5566bca6bc7dc2043ae8744971331180df35320710e25b404d00000000000000000000000000000000153753f25d38c68a3b92a486bb896a1b6ca9d4b81620a7a0040386838be7187e8ca73987bb260ee099793009b5cce1f500000000000000000000000000000000063f22c3bedc7ca5ce16db22f44a68a8fa529b2c6aab59c97e4b2353ed1b81da0586dbc0fa49605402da10c5ff7cad7d4e2e31f85a0c9145eae006fb7a37c31d8455ab1819d22ed08633b61826a110f2000000000000000000000000000000000b3c0cdb73a3f823d61c88327100dca8f06dcc5b275178a9fb4c7833adbdf5a6b531e8a20bae515a27542f4c8327832100000000000000000000000000000000110efd582f71bffc5866731c388ee69d793060d254a2b35dd35a1a5894511aa1c5fd58b20335921f4756e192f78fd24d618405deb577678c50402b1ab3054f9d74079022abe527279f459da7e464815700000000000000000000000000000000153753f25d38c68a3b92a486bb896a1b6ca9d4b81620a7a0040386838be7187e8ca73987bb260ee099793009b5cce1f500000000000000000000000000000000063f22c3bedc7ca5ce16db22f44a68a8fa529b2c6aab59c97e4b2353ed1b81da0586dbc0fa49605402da10c5ff7cad7d67d8a868ae890084858f063477cf8f8e2463415841530281cb2ee435042ff86400000000000000000000000000000000153753f25d38c68a3b92a486bb896a1b6ca9d4b81620a7a0040386838be7187e8ca73987bb260ee099793009b5cce1f500000000000000000000000000000000063f22c3bedc7ca5ce16db22f44a68a8fa529b2c6aab59c97e4b2353ed1b81da0586dbc0fa49605402da10c5ff7cad7d362802543485898cfa1f4e16eec307f6f0d2a0a49755573abefc8805ebf05d61,0x00000000000000000000000000000000198b43bd45d1858e93b542d86515454ac355d15448f3686d53346a73125bc3f356bc458fb1a2039f79bd27802bcfac1100000000000000000000000000000000180dd0333f06df2ca759049c18dee700ffac00c28006813df050d775219fd2ceaeaf971f57268c8d400e55a975723311,269352, -000000000000000000000000000000000123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef00000000000000000000000000000000193fb7cedb32b2c3adc06ec11a96bc0d661869316f5e4a577a9f7c179593987beb4fb2ee424dbb2f5dd891e228b46c4a000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000112b98340eee2777cc3c14163dea3ec97977ac3dc5c70da32e6e87578f44912e902ccef9efe28d4a78b8999dfbca942600000000000000000000000000000000186b28d92356c4dfec4b5201ad099dbdede3781f8998ddf929b4cd7756192185ca7b8f4ef7088f813270ac3d48868a210000000000000000000000000000000000000000000000000000000000000002,,,Point is not in the expected subgroup \ No newline at end of file +000000000000000000000000000000000123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef00000000000000000000000000000000193fb7cedb32b2c3adc06ec11a96bc0d661869316f5e4a577a9f7c179593987beb4fb2ee424dbb2f5dd891e228b46c4a000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000112b98340eee2777cc3c14163dea3ec97977ac3dc5c70da32e6e87578f44912e902ccef9efe28d4a78b8999dfbca942600000000000000000000000000000000186b28d92356c4dfec4b5201ad099dbdede3781f8998ddf929b4cd7756192185ca7b8f4ef7088f813270ac3d48868a210000000000000000000000000000000000000000000000000000000000000002,,,invalid point: subgroup check failed diff --git a/evm/src/test/resources/org/hyperledger/besu/evm/precompile/g2_add.csv b/evm/src/test/resources/org/hyperledger/besu/evm/precompile/g2_add.csv index f65c17690..3eb449268 100644 --- a/evm/src/test/resources/org/hyperledger/besu/evm/precompile/g2_add.csv +++ b/evm/src/test/resources/org/hyperledger/besu/evm/precompile/g2_add.csv @@ -101,5 +101,5 @@ input,result,gas,notes 0000000000000000000000000000000010d001a09cf5dc3276482185f26ef3f75d28cd6d2667eb08a7fe06c03b99f3b6c4d82390739b6867a314291cc642a8b2000000000000000000000000000000000587846a460b1f37c2e7f491f9a097b4e86e1943d9cd0999313f65627b3907f09b5d5ac1be376a313a959dd136f7e9b3000000000000000000000000000000000af439695556e86b102926d3b40e3e54cc84464e120de3b4e3c5541a6a5bca44151fb0594009663764c1824518b13f020000000000000000000000000000000003bfd9418c1e57269e222152d321b83ae090f216cb422956dd1fcc464f68526cb4a05cdaefc7bbe6e81d4ffe27d64db400000000000000000000000000000000085dd8bfc00ba517dc8d7ddb49d711d35bd36f9fe3843689019e779624a032d2f023533b8184b73042d1a1953d2885e50000000000000000000000000000000009ba8d5d36e6efe02097a3206bbed68529f0cb9875ab81deafd886d9243bfec8b403d2abe713a2ec929b93305dd2da220000000000000000000000000000000007f8f90ebb2771136a92023901ca85e87fb7c8b1a40f88ae564a124bdd0ff0bc27ea98612a817e2c871fb4bcea3bb06600000000000000000000000000000000152de417d02f1d14e5899201db8fd5db8ecb40ea8d415dcdedce8ac70c28d851db68e9aef94506a50ec28145547a2d68,0000000000000000000000000000000017555399f979745302f08210de5311a6401b6b181100b3bc6b6d450f0f62079d2f02d7badcb164f50dfc46a975cbd6720000000000000000000000000000000014aea86c06e4c1fbf0711a8cfced2544c7624abc7ae7906cd992bdf575a702540c45c2117e221446ba09960cbc9048ac0000000000000000000000000000000002fac56960c4989a84e02ce36e8970c2e847ee45579d31ca77f042bf96505af574af822da084ae64b22ff876610ba9a5000000000000000000000000000000000a481cfea2aef8975c80a297ce5a185dacd25649d41f8466d3c63d786e3c264a8e4ccab5ef6b80ab1260e86ab6d5b3f3,800, 000000000000000000000000000000039b10ccd664da6f273ea134bb55ee48f09ba585a7e2bb95b5aec610631ac49810d5d616f67ba0147e6d1be476ea220e0000000000000000000000000000000000fbcdff4e48e07d1f73ec42fe7eb026f5c30407cfd2f22bbbfe5b2a09e8a7bb4884178cb6afd1c95f80e646929d30040000000000000000000000000000000001ed3b0e71acb0adbf44643374edbf4405af87cfc0507db7e8978889c6c3afbe9754d1182e98ac3060d64994d31ef576000000000000000000000000000000001681a2bf65b83be5a2ca50430949b6e2a099977482e9405b593f34d2ed877a3f0d1bddc37d0cec4d59d7df74b2b8f2df0000000000000000000000000000000017c9fcf0504e62d3553b2f089b64574150aa5117bd3d2e89a8c1ed59bb7f70fb83215975ef31976e757abf60a75a1d9f0000000000000000000000000000000008f5a53d704298fe0cfc955e020442874fe87d5c729c7126abbdcbed355eef6c8f07277bee6d49d56c4ebaf334848624000000000000000000000000000000001302dcc50c6ce4c28086f8e1b43f9f65543cf598be440123816765ab6bc93f62bceda80045fbcad8598d4f32d03ee8fa000000000000000000000000000000000bbb4eb37628d60b035a3e0c45c0ea8c4abef5a6ddc5625e0560097ef9caab208221062e81cd77ef72162923a1906a40,,,invalid input parameters, invalid input length for G2 addition 0000000000000000000000000000000000039b10ccd664da6f273ea134bb55ee48f09ba585a7e2bb95b5aec610631ac49810d5d616f67ba0147e6d1be476ea220e0000000000000000000000000000000000fbcdff4e48e07d1f73ec42fe7eb026f5c30407cfd2f22bbbfe5b2a09e8a7bb4884178cb6afd1c95f80e646929d30040000000000000000000000000000000001ed3b0e71acb0adbf44643374edbf4405af87cfc0507db7e8978889c6c3afbe9754d1182e98ac3060d64994d31ef576000000000000000000000000000000001681a2bf65b83be5a2ca50430949b6e2a099977482e9405b593f34d2ed877a3f0d1bddc37d0cec4d59d7df74b2b8f2df0000000000000000000000000000000017c9fcf0504e62d3553b2f089b64574150aa5117bd3d2e89a8c1ed59bb7f70fb83215975ef31976e757abf60a75a1d9f0000000000000000000000000000000008f5a53d704298fe0cfc955e020442874fe87d5c729c7126abbdcbed355eef6c8f07277bee6d49d56c4ebaf334848624000000000000000000000000000000001302dcc50c6ce4c28086f8e1b43f9f65543cf598be440123816765ab6bc93f62bceda80045fbcad8598d4f32d03ee8fa000000000000000000000000000000000bbb4eb37628d60b035a3e0c45c0ea8c4abef5a6ddc5625e0560097ef9caab208221062e81cd77ef72162923a1906a40,,,invalid input parameters, invalid input length for G2 addition -00000000000000000000000000000000039b10ccd664da6f273ea134bb55ee48f09ba585a7e2bb95b5aec610631ac49810d5d616f67ba0147e6d1be476ea220f0000000000000000000000000000000000fbcdff4e48e07d1f73ec42fe7eb026f5c30407cfd2f22bbbfe5b2a09e8a7bb4884178cb6afd1c95f80e646929d30040000000000000000000000000000000001ed3b0e71acb0adbf44643374edbf4405af87cfc0507db7e8978889c6c3afbe9754d1182e98ac3060d64994d31ef576000000000000000000000000000000001681a2bf65b83be5a2ca50430949b6e2a099977482e9405b593f34d2ed877a3f0d1bddc37d0cec4d59d7df74b2b8f2df0000000000000000000000000000000017c9fcf0504e62d3553b2f089b64574150aa5117bd3d2e89a8c1ed59bb7f70fb83215975ef31976e757abf60a75a1d9f0000000000000000000000000000000008f5a53d704298fe0cfc955e020442874fe87d5c729c7126abbdcbed355eef6c8f07277bee6d49d56c4ebaf334848624000000000000000000000000000000001302dcc50c6ce4c28086f8e1b43f9f65543cf598be440123816765ab6bc93f62bceda80045fbcad8598d4f32d03ee8fa000000000000000000000000000000000bbb4eb37628d60b035a3e0c45c0ea8c4abef5a6ddc5625e0560097ef9caab208221062e81cd77ef72162923a1906a40,,,invalid input parameters, Point 0 is not on curve -00000000000000000000000000000000039b10ccd664da6f273ea134bb55ee48f09ba585a7e2bb95b5aec610631ac49810d5d616f67ba0147e6d1be476ea220e0000000000000000000000000000000000fbcdff4e48e07d1f73ec42fe7eb026f5c30407cfd2f22bbbfe5b2a09e8a7bb4884178cb6afd1c95f80e646929d30040000000000000000000000000000000001ed3b0e71acb0adbf44643374edbf4405af87cfc0507db7e8978889c6c3afbe9754d1182e98ac3060d64994d31ef576000000000000000000000000000000001681a2bf65b83be5a2ca50430949b6e2a099977482e9405b593f34d2ed877a3f0d1bddc37d0cec4d59d7df74b2b8f2df0000000000000000000000000000000017c9fcf0504e62d3553b2f089b64574150aa5117bd3d2e89a8c1ed59bb7f70fb83215975ef31976e757abf60a75a1da00000000000000000000000000000000008f5a53d704298fe0cfc955e020442874fe87d5c729c7126abbdcbed355eef6c8f07277bee6d49d56c4ebaf334848624000000000000000000000000000000001302dcc50c6ce4c28086f8e1b43f9f65543cf598be440123816765ab6bc93f62bceda80045fbcad8598d4f32d03ee8fa000000000000000000000000000000000bbb4eb37628d60b035a3e0c45c0ea8c4abef5a6ddc5625e0560097ef9caab208221062e81cd77ef72162923a1906a40,,,invalid input parameters, Point 1 is not on curve +00000000000000000000000000000000039b10ccd664da6f273ea134bb55ee48f09ba585a7e2bb95b5aec610631ac49810d5d616f67ba0147e6d1be476ea220f0000000000000000000000000000000000fbcdff4e48e07d1f73ec42fe7eb026f5c30407cfd2f22bbbfe5b2a09e8a7bb4884178cb6afd1c95f80e646929d30040000000000000000000000000000000001ed3b0e71acb0adbf44643374edbf4405af87cfc0507db7e8978889c6c3afbe9754d1182e98ac3060d64994d31ef576000000000000000000000000000000001681a2bf65b83be5a2ca50430949b6e2a099977482e9405b593f34d2ed877a3f0d1bddc37d0cec4d59d7df74b2b8f2df0000000000000000000000000000000017c9fcf0504e62d3553b2f089b64574150aa5117bd3d2e89a8c1ed59bb7f70fb83215975ef31976e757abf60a75a1d9f0000000000000000000000000000000008f5a53d704298fe0cfc955e020442874fe87d5c729c7126abbdcbed355eef6c8f07277bee6d49d56c4ebaf334848624000000000000000000000000000000001302dcc50c6ce4c28086f8e1b43f9f65543cf598be440123816765ab6bc93f62bceda80045fbcad8598d4f32d03ee8fa000000000000000000000000000000000bbb4eb37628d60b035a3e0c45c0ea8c4abef5a6ddc5625e0560097ef9caab208221062e81cd77ef72162923a1906a40,,,invalid point: point is not on curve +00000000000000000000000000000000039b10ccd664da6f273ea134bb55ee48f09ba585a7e2bb95b5aec610631ac49810d5d616f67ba0147e6d1be476ea220e0000000000000000000000000000000000fbcdff4e48e07d1f73ec42fe7eb026f5c30407cfd2f22bbbfe5b2a09e8a7bb4884178cb6afd1c95f80e646929d30040000000000000000000000000000000001ed3b0e71acb0adbf44643374edbf4405af87cfc0507db7e8978889c6c3afbe9754d1182e98ac3060d64994d31ef576000000000000000000000000000000001681a2bf65b83be5a2ca50430949b6e2a099977482e9405b593f34d2ed877a3f0d1bddc37d0cec4d59d7df74b2b8f2df0000000000000000000000000000000017c9fcf0504e62d3553b2f089b64574150aa5117bd3d2e89a8c1ed59bb7f70fb83215975ef31976e757abf60a75a1da00000000000000000000000000000000008f5a53d704298fe0cfc955e020442874fe87d5c729c7126abbdcbed355eef6c8f07277bee6d49d56c4ebaf334848624000000000000000000000000000000001302dcc50c6ce4c28086f8e1b43f9f65543cf598be440123816765ab6bc93f62bceda80045fbcad8598d4f32d03ee8fa000000000000000000000000000000000bbb4eb37628d60b035a3e0c45c0ea8c4abef5a6ddc5625e0560097ef9caab208221062e81cd77ef72162923a1906a40,,,invalid point: point is not on curve diff --git a/evm/src/test/resources/org/hyperledger/besu/evm/precompile/g2_mul.csv b/evm/src/test/resources/org/hyperledger/besu/evm/precompile/g2_mul.csv index e8863e7ee..7f9ee261b 100644 --- a/evm/src/test/resources/org/hyperledger/besu/evm/precompile/g2_mul.csv +++ b/evm/src/test/resources/org/hyperledger/besu/evm/precompile/g2_mul.csv @@ -99,7 +99,7 @@ input,result,gas,notes 00000000000000000000000000000000156ca5e80be8c8c03a5506ce9abd22a9d4958c372678c0caf6f1329898507dfcb1f06a9464cf080bc6881fa5b7df1ebe00000000000000000000000000000000088174d486b4086b931010da298a399e15b60a113e08f571e096d3a4e94b57b3a684711318796eeca9319119b201abb30000000000000000000000000000000000b96ff68505c088cc03a1c2dc363b05bc8544728a12b29569bed137780523123eb17e68f4632383c252d81bca0c5ca9000000000000000000000000000000000486fc6e5224c5fad56234c41856e60bee4a6c1046f673bf7d5c1bbb603b141fc91074da5f9d3d41b796a2ebcebd9e74d16aa883a20307f5436354bab32b4633e83178f33626af3edb14f82724b8e125,0000000000000000000000000000000000ea29b1e059560fec21c3692d4e632a45c88a807c953fa23dbedb271b049d7fc717333b498ed12573a896f872e795dc000000000000000000000000000000000de0d10c47df92010a6635e3403dd6e91a1bf35bfcae82c1008998e86aa2d18a6cfd3f2f1207fde3bb39b723ec4d3ca60000000000000000000000000000000005e2aef9cd37430b15e5e76b2c7870630d255f630c12e865caefe308a39833e00319406746dbb2af3ed32135e91eed49000000000000000000000000000000000c229fad41b0d27ad7b5db33188fa70b97f22e323e429ef65fcf98f5339e908c31df8859b863356e0fc90538c5c49cf2,45000, 00000000000000000000000000000000121fe97c62e068988ebff21d8129d52aa903afdbb62862c7fd99564d9ad72182ab1f3a1100223ae486cd76f6938e123f000000000000000000000000000000000968ddedb04f52140160061828b5f88dfd09aaf37df625ee6f66b9500d6608df31c7edf86296eccf8f9918b051a5e4df000000000000000000000000000000000b7491cb8f6252e3861d7160feb0afdd736d27886863ec0909a7cc711a9b71aace18b17a00a2999dd57ca1a74f148516000000000000000000000000000000000fdb280093ef45b12b694ca3390a865ee18e4c04b231e2c98cc28706d4cefaf4e654582ee03f34ecf1dfa9674489d553041390a2209b80f7c64d14965cc2f515d5fbdf37953f75c4a0203bf0d9fb674b,000000000000000000000000000000000444a00cfd258bd46f659b09eef17be9929008d3d1c65e46cdc762eeaa2f0b52abfd636e6094e21983fad8171194c71a00000000000000000000000000000000090833e68614be5bf298e04e44527480cb35128bbdecae15eb95d6931a718f66869ddb68352130b4dd8a921ab3f26d080000000000000000000000000000000000994015b1b55340c3839d48320d178b2ffaa0bbff038f7aa63d4dff41a217582fae9613bc537fdeac8d0670c0cf479a000000000000000000000000000000000fc486e2a1680c10ca28d4c3bb22dbccc9572036512645bf868e7693ae4591569c973f9ea26342a573e23a06c2fb4b70,45000, 0000000000000000000000000000000010d001a09cf5dc3276482185f26ef3f75d28cd6d2667eb08a7fe06c03b99f3b6c4d82390739b6867a314291cc642a8b2000000000000000000000000000000000587846a460b1f37c2e7f491f9a097b4e86e1943d9cd0999313f65627b3907f09b5d5ac1be376a313a959dd136f7e9b3000000000000000000000000000000000af439695556e86b102926d3b40e3e54cc84464e120de3b4e3c5541a6a5bca44151fb0594009663764c1824518b13f020000000000000000000000000000000003bfd9418c1e57269e222152d321b83ae090f216cb422956dd1fcc464f68526cb4a05cdaefc7bbe6e81d4ffe27d64db47cf23dee8d95d94046678f3bdb4b0ea3d4e3a1a2f07f582e2a98ad6eb7562cbf,000000000000000000000000000000001375bd5ee66c330796bd8381a26cefa3f40f8cc8de42d4d59a7adbcd3852e6d632422e6ad9a06a6e497b23b17b1df87500000000000000000000000000000000165d8e7be17ecae9bf51a773da705aea42536d0fa3a2206267da50451f5104ee241811dd0e6710a80c38df77b126c009000000000000000000000000000000001559572407aff34969f83c394d2b095a7ae9f53a8e6c923910f256bb87b6ec076fa6acb85465102fd24d34031f88f7510000000000000000000000000000000015ff9ba89b55ef75f63732dec1e64106d7a912a6657fcc970dd011a03b5364117cca46d6cbafbc0c5049db10fa83fe6d,45000, -000000000000000000000000000000039b10ccd664da6f273ea134bb55ee48f09ba585a7e2bb95b5aec610631ac49810d5d616f67ba0147e6d1be476ea220e0000000000000000000000000000000000fbcdff4e48e07d1f73ec42fe7eb026f5c30407cfd2f22bbbfe5b2a09e8a7bb4884178cb6afd1c95f80e646929d30040000000000000000000000000000000001ed3b0e71acb0adbf44643374edbf4405af87cfc0507db7e8978889c6c3afbe9754d1182e98ac3060d64994d31ef576000000000000000000000000000000001681a2bf65b83be5a2ca50430949b6e2a099977482e9405b593f34d2ed877a3f0d1bddc37d0cec4d59d7df74b2b8f2dfb3c940fe79b6966489b527955de7599194a9ac69a6ff58b8d99e7b1084f0464e,,,invalid input parameters, invalid input length for G1 multiplication -0000000000000000000000000000000000039b10ccd664da6f273ea134bb55ee48f09ba585a7e2bb95b5aec610631ac49810d5d616f67ba0147e6d1be476ea220e0000000000000000000000000000000000fbcdff4e48e07d1f73ec42fe7eb026f5c30407cfd2f22bbbfe5b2a09e8a7bb4884178cb6afd1c95f80e646929d30040000000000000000000000000000000001ed3b0e71acb0adbf44643374edbf4405af87cfc0507db7e8978889c6c3afbe9754d1182e98ac3060d64994d31ef576000000000000000000000000000000001681a2bf65b83be5a2ca50430949b6e2a099977482e9405b593f34d2ed877a3f0d1bddc37d0cec4d59d7df74b2b8f2dfb3c940fe79b6966489b527955de7599194a9ac69a6ff58b8d99e7b1084f0464e,,,invalid input parameters, invalid input length for G1 multiplication -00000000000000000000000000000000039b10ccd664da6f273ea134bb55ee48f09ba585a7e2bb95b5aec610631ac49810d5d616f67ba0147e6d1be476ea220f0000000000000000000000000000000000fbcdff4e48e07d1f73ec42fe7eb026f5c30407cfd2f22bbbfe5b2a09e8a7bb4884178cb6afd1c95f80e646929d30040000000000000000000000000000000001ed3b0e71acb0adbf44643374edbf4405af87cfc0507db7e8978889c6c3afbe9754d1182e98ac3060d64994d31ef576000000000000000000000000000000001681a2bf65b83be5a2ca50430949b6e2a099977482e9405b593f34d2ed877a3f0d1bddc37d0cec4d59d7df74b2b8f2dfb3c940fe79b6966489b527955de7599194a9ac69a6ff58b8d99e7b1084f0464e,,,invalid input parameters, Point is not on curve -00000000000000000000000000000000197bfd0342bbc8bee2beced2f173e1a87be576379b343e93232d6cef98d84b1d696e5612ff283ce2cfdccb2cfb65fa0c00000000000000000000000000000000184e811f55e6f9d84d77d2f79102fd7ea7422f4759df5bf7f6331d550245e3f1bcf6a30e3b29110d85e0ca16f9f6ae7a000000000000000000000000000000000f10e1eb3c1e53d2ad9cf2d398b2dc22c5842fab0a74b174f691a7e914975da3564d835cd7d2982815b8ac57f507348f000000000000000000000000000000000767d1c453890f1b9110fda82f5815c27281aba3f026ee868e4176a0654feea41a96575e0c4d58a14dbfbcc05b5010b10000000000000000000000000000000000000000000000000000000000000002,,,Point is not in the expected subgroup +000000000000000000000000000000039b10ccd664da6f273ea134bb55ee48f09ba585a7e2bb95b5aec610631ac49810d5d616f67ba0147e6d1be476ea220e0000000000000000000000000000000000fbcdff4e48e07d1f73ec42fe7eb026f5c30407cfd2f22bbbfe5b2a09e8a7bb4884178cb6afd1c95f80e646929d30040000000000000000000000000000000001ed3b0e71acb0adbf44643374edbf4405af87cfc0507db7e8978889c6c3afbe9754d1182e98ac3060d64994d31ef576000000000000000000000000000000001681a2bf65b83be5a2ca50430949b6e2a099977482e9405b593f34d2ed877a3f0d1bddc37d0cec4d59d7df74b2b8f2dfb3c940fe79b6966489b527955de7599194a9ac69a6ff58b8d99e7b1084f0464e,,,invalid input parameters, invalid input length for G2 multiplication +0000000000000000000000000000000000039b10ccd664da6f273ea134bb55ee48f09ba585a7e2bb95b5aec610631ac49810d5d616f67ba0147e6d1be476ea220e0000000000000000000000000000000000fbcdff4e48e07d1f73ec42fe7eb026f5c30407cfd2f22bbbfe5b2a09e8a7bb4884178cb6afd1c95f80e646929d30040000000000000000000000000000000001ed3b0e71acb0adbf44643374edbf4405af87cfc0507db7e8978889c6c3afbe9754d1182e98ac3060d64994d31ef576000000000000000000000000000000001681a2bf65b83be5a2ca50430949b6e2a099977482e9405b593f34d2ed877a3f0d1bddc37d0cec4d59d7df74b2b8f2dfb3c940fe79b6966489b527955de7599194a9ac69a6ff58b8d99e7b1084f0464e,,,invalid input parameters, invalid input length for G2 multiplication +00000000000000000000000000000000039b10ccd664da6f273ea134bb55ee48f09ba585a7e2bb95b5aec610631ac49810d5d616f67ba0147e6d1be476ea220f0000000000000000000000000000000000fbcdff4e48e07d1f73ec42fe7eb026f5c30407cfd2f22bbbfe5b2a09e8a7bb4884178cb6afd1c95f80e646929d30040000000000000000000000000000000001ed3b0e71acb0adbf44643374edbf4405af87cfc0507db7e8978889c6c3afbe9754d1182e98ac3060d64994d31ef576000000000000000000000000000000001681a2bf65b83be5a2ca50430949b6e2a099977482e9405b593f34d2ed877a3f0d1bddc37d0cec4d59d7df74b2b8f2dfb3c940fe79b6966489b527955de7599194a9ac69a6ff58b8d99e7b1084f0464e,,,invalid point: point is not on curve +00000000000000000000000000000000197bfd0342bbc8bee2beced2f173e1a87be576379b343e93232d6cef98d84b1d696e5612ff283ce2cfdccb2cfb65fa0c00000000000000000000000000000000184e811f55e6f9d84d77d2f79102fd7ea7422f4759df5bf7f6331d550245e3f1bcf6a30e3b29110d85e0ca16f9f6ae7a000000000000000000000000000000000f10e1eb3c1e53d2ad9cf2d398b2dc22c5842fab0a74b174f691a7e914975da3564d835cd7d2982815b8ac57f507348f000000000000000000000000000000000767d1c453890f1b9110fda82f5815c27281aba3f026ee868e4176a0654feea41a96575e0c4d58a14dbfbcc05b5010b10000000000000000000000000000000000000000000000000000000000000002,,,invalid point: subgroup check failed diff --git a/evm/src/test/resources/org/hyperledger/besu/evm/precompile/g2_multiexp.csv b/evm/src/test/resources/org/hyperledger/besu/evm/precompile/g2_multiexp.csv index 460fd7fa3..dfeab857b 100644 --- a/evm/src/test/resources/org/hyperledger/besu/evm/precompile/g2_multiexp.csv +++ b/evm/src/test/resources/org/hyperledger/besu/evm/precompile/g2_multiexp.csv @@ -99,9 +99,9 @@ input,result,gas,notes 000000000000000000000000000000000cd1d25f285c2073175ecad5bba4987cc52012eadc7b19dbaa20fa82d7a6cfb8a52f33469b6308d921eb4b3b23f7022d000000000000000000000000000000001707b67a23d9212d30c06f26f0040c38389b185057e80236d2c828a8d9ade4f72eee1d6eccd78e4f4d71e2c28ee9539e0000000000000000000000000000000008e5c04effd14d915b9afc2083afa2b6d4008cfa0e47144a41982d8b5a8e77922a2609384e2c5d18c871ae24a7d505b7000000000000000000000000000000000f414acb056fff2cd6d9b408adb6eb7f34c8f66a66ee93945a3381d46c2d181613047ca6d4067614c190da444223cab685431a1df7678e49ee049b75ea968ca255ef456dd58cce57b64edffac1ac223c0000000000000000000000000000000008ea841aced2d0b8dd688947648a8ff18d0f6f03f63ee1c331f126dd4fc0da3d386535156b80902bdc1f65add7769cd70000000000000000000000000000000017a32ad2763d99c38c954f62466e78c0332e48875e15afbbe9c78376f1bab12346c73a573738353e2162d3928091dede0000000000000000000000000000000010ea738884dbfe5bc35d031bde9aa4109b1fca529502e236aebb5ad0bf71dd2f3db250d924415b0bfca56519f8ca5d290000000000000000000000000000000013699e29cc1871f51a469898be8b3c732b5cf7860286e655e65bd8176832804d17b48d0ff85eb023360db78162581297b6ccbc0b600f11f1b89061d94c6fbdc9b1d389244fb29a5d140dab8842d44eaa00000000000000000000000000000000004d504e62b2825651381ae862fd33407309851d5291591cd0f541fd092800d709ede00a9134e65ee752eaceb0a344b50000000000000000000000000000000016481efba290c37aa4ecbf940c76ee5df199b0c1f90fddebd2db28120bb5a14dd9f4a067b6d4889aeb683cca0f6ab337000000000000000000000000000000001400c89942cc63417ca4cb05c9d81dda3251e5611c27fc7727c3e803170672f103bff26f7216a0b646533aac3171488d0000000000000000000000000000000019889641be9db08880543ff476b9d4c72167092548ba49a3f3ace4518d3874f4f7993ae7b8cec90f092f144ec9d66c1a54dfe31190469897c30ac3736ab166220dd3702df5bc897835347713d03a8d04000000000000000000000000000000001927fe80adc6dbb581349c603103ad8831e645d9275af8669939b83829182cc6e2a30df2fdeda6d3aa2e2a6126e00ba3000000000000000000000000000000000b6d7934d5ca1098a85a0c60acca075220105e221b802b1be97c2967820bffc2937fc3278ed0f26905c60d44d5fd8dc000000000000000000000000000000000057acc1379f23c0d1d37427d400eb1b0a89f3736c83d3ffd797ae279e01e2acddd84082f13f3c8b8f1bf7c275702a9c700000000000000000000000000000000038dbcd7e08d34c553850a52336991a7d48968e98057e930790d78b5c6368eb2fe01571b60c4aefb653ec04122953d56eff1ceff9e5184dd9fea44da4f07529823dc9b100f776cef6f6881120f7de11a00000000000000000000000000000000014052031b88af979b7edb06c99c2e46bd9df2c862c7e1b71321754841fad67fc3242b51141e49ad86b61344aec913f40000000000000000000000000000000014806a86d078ee9bdde99257b67f50dc2ddf9bbf01dde931742ee6f739aa986cfdca06cd32d23d86f2c14c3b09033d29000000000000000000000000000000000e0561e795d35ceb8bd9e3b276406ec1f697a38ada25d1dbe08715a28bdd3d6ce6e0aac01f7dfc7c2b403850ab213b4700000000000000000000000000000000146a65209b09487e00e356e3b29952280ebc6a06343c4ce14efa0c6281bc2482698bd02295bc35125275ff5f5bb867dfb273e4c6266c1f5cf022902fe1310d2191af91c47995486342bc61cd361eab8500000000000000000000000000000000021592cd7f4cf9cab3be53561c889c9ee865961aad51339f6393dd6a0b7dcc8a7c48b753c947b15cd3add01abd3d76d8000000000000000000000000000000000f9e1a80bad58055a8577700c177889c4d702de04343c1202eaed9485a76493158547b20bcb552b66c42a0c86df809ed0000000000000000000000000000000013908dcff1945cf06f038e3caac9a7fbb3a6466ca18627e93468a875759a2b5599a96834ff21fcd6bfbba82b79536b9a0000000000000000000000000000000001b6354665109c5a64613c3bd7d805b3a34098708f3d41c7b77db031ac6fa0b2d4e2f2f70c84ac78687b0c0f9bf334771342b5cd4ad3179f406941ef6ea15d0aecdf9f6d96dc334c39b7dca89d256d4f0000000000000000000000000000000019394063202186e141dcebce7b8f0f267ba6057a0f993bb1cbe22a5bc528323823bfd1597a87017d478186a18f09a47800000000000000000000000000000000148437bcc43d432d70b47dadac8e738616c97d38d0f84dc132599626612f7bba74988bb23ae47ac15e6f70c059d607ed00000000000000000000000000000000180851594710f4bb5be7ae0104a383081c50f59e4e048614660ab5a4e2661e171510f5b112d8cf97a6af27d56d137c860000000000000000000000000000000000599f3f82f29b493ffe9ee3a8363b9a599a5ef3c9c5c680d4e003f4ac5a7de0562cba8e2a4c6da7d07cbe86c3f7bfb85b36620f65ed84fc0bb344b4b73f4eba4b1680a47b28b47f6d10f9ee82398125000000000000000000000000000000000cfdce7997601afbe484901893a1b5fc0b83e8d238d41d2f889a58fd4d884df1c667a000b53b587df2c42ad46aa2c3e0000000000000000000000000000000000c50bf3e06400cb10494cd09bd89f3c96ff49c9f74dd5325f9489ed6be13b59bd7b0b2351411ac854d430405b8a2a3de0000000000000000000000000000000001db313a34ca4073e4fa2287e234ac32bc579742de22e5218f7873b922f5804894826e6054925a394f125fce850f33ef000000000000000000000000000000000e0627a66d286e8d4d3654b32fc5f552a7ca12f0bd47eb6dee0dde22ee48165247c067a0f4c3d422bf3562d38a3c0cf1249ca9bcf879a770b0a054422a6ea97ae795118ae45532c1523c842696de6d170000000000000000000000000000000005285ba39f5bd981fce2fdf853706d70992acab2dc6d4c4198144fab397392a60d631056b580d0d98f3f350414ce554e0000000000000000000000000000000013bddbc1180f155872376fcdfaff2fb12d3d9645b81bd1475a5323ea855cea820ed7eb693791caa9bd3fa5c66036439700000000000000000000000000000000125644d32df397def58dff875d7e3f14166e765ed49a3991f45b38d74db3985fc7f5052058d85594c8b97afcf850e11b000000000000000000000000000000000fca4662eb1b39f576ee820385fba88ddd2fc01fcfb9d9f874453ad725cd5defb357be028fae97ce71bc5ac26d11c1bac014a0aa616e809b674390b4553bf2d9bf325e73d3a935eba94488dddee4e8950000000000000000000000000000000015b97d7c74c8ec102083b41d7ce5490466e1c0e261b5ea5c756d3f9ae79dd2d8ec6eb5075cfb76dfcf7bfdd80442f7d10000000000000000000000000000000016812f845faf96b8b69ac7a6af3c8947aa25877199e3c12552527706a17b768bbea259ea61ea82c4624a96cbcdf4040d00000000000000000000000000000000123ad55e5cb5ac5bdd3ca0a5afa7c3f8e4b98ad91a205f073fb546fe799ffc57b3c1c3a6209547ffc6ef05fd24be6f5d00000000000000000000000000000000017719f31946aedabe0e9d88ef3f90eb6ceda884f5e3d2ece368373785b2d8bf0f9677731803b25accfcb6cb716e0aa4ab722a1c20f068b6955a44073914c418a082345796912ca634e79983a24ec4bb0000000000000000000000000000000000497e3480d58027c780f47cc35a121ee0cd76c4e84d9a2f9002c04a1c286be990167a0138049ad70467132818f48ec9000000000000000000000000000000000ec0ddf938553105400f70989140ca322d996f48ffb1b35641ca36a6ba9ac1daac1603c100822f80cf62ec3bfb442158000000000000000000000000000000000a0b6ebee28a792df46d2f727af812c15fc91a471e0d8e34b25b26048f3b9606d8375b5b268c40fb04ef8f098e1d03340000000000000000000000000000000017843dd19bfabbd0cfa41fb58e70a8900397d17ccea783087ece90962560f5cf090e8d9eaa873a6a6ebac45219ea97a68b314f83cc3ad501caa44b4c3ca8cf68c70ff6920f445d3a7ada212b6a19ba3e000000000000000000000000000000000b27c82d71f7e4aab9a68596669596df3f62071e921e131ba4d9e59d8d81d370e077e93a4a6a43e059661227f40b38c800000000000000000000000000000000093004917ceb2fb4a1b33960ff74943d520f86e83aa02b9a6c85e4b9a489e9331863cd30cb6ad6f099d03289b4ada5520000000000000000000000000000000016f04e35186c7deaf730708e1678089bf3e73c1164bca24bf8f70c4f6cccd5bbb34bbb5dc313ee428aec4ac9c638a01a00000000000000000000000000000000011052348cec9dc3e85e01abcca5a652461f08a9f5d72b3fc27140a6a571137f0065ed7ccf9ec8cebe314ad9a214d5ed94ffab83099c69845cc87727d459ae300a5725ec53176424ab0ec8bd3f80eaff0000000000000000000000000000000007083dfb0738d58ba8933a1f60283e5da8bf90af5aae4053ca573ee7223d3b80e4bdc30b4a831ce6af9f52f393e9742600000000000000000000000000000000130c627b7d3a527c94cfeba9f514e75eac047e1b6088c082229a8c95d0765a0898ce1e45694ca2c7935bb8e41e44e8b10000000000000000000000000000000009610645b074e652a08f2b89dbe594afa3009d795ef211f7c036a56274b1e1bd69a035c4f356b6b21f69b9cec2bf7c32000000000000000000000000000000001020f3cdef468af700269aa1e9d928e71b8c521f23586c9b0155314f0073da7de04ca41ececd5edcc052af72c05f0e4bb1d80be637e2abd98d0433150e14b629d98fc0918c7dfc179204669ab465e90300000000000000000000000000000000123540047f0768b0af841aa4aeceaf3dac31ea832daed86c8cbd1d33ed0282c6f697d5881f9022af032e90ff82efb6bc000000000000000000000000000000000113daffbe413075f5f4f6fb42f37b6e9d5e5822aa24d6f865792f63e6078584246bcf8b17117385db1d6233974f6ed9000000000000000000000000000000001067b46fd221b6995d25d4bf0adb088e0554d858d4e5d9d6b59e1ae2a7d57188d559b0208918a8944aedd62b1ebd4f4700000000000000000000000000000000087dae77e483d5c0baa37b9b96dad5ca92b5869fa253bffad24dd8747446f7ce60858b52438e58233210d86f470f765fe670a57ce4dcfa680e60ef33ba99c437e4fdb160ea1012de36f4b59613a6af8500000000000000000000000000000000039d09a094d655c139cb9714aa258d9548473162548048b0f07c9317a41a7e5dbaa5aca156992c8a509d4071d9ae4394000000000000000000000000000000000f0273a38b1b9d006efa43c15a53f026587a676912d0275968608519e97994ea9c6a147e377f68b1738ebeaa178f9c1000000000000000000000000000000000132cd92417578d2e46884f1c1a1080b1916c8c8404d2533a4de02bf8575c80ce7e8097c2ddd1f95737355521c0ec21ce0000000000000000000000000000000019adbf09a268a3ed8eff936d25fbe8af2874e44d2580c7941dc14fb89c5da963b468a7088c4a763eac89f4d15deaaf5e54a999fdf391d3944318c54680e69b58ce3778683b6f2c607d64450ed32c6d89000000000000000000000000000000000756dced467ea32c3c425590b7690a45e250e464ac6927ad3f5d2d8d2826961b8dd7572db609375c8d06cc3b9bc3a157000000000000000000000000000000000b79b4eecbaf1d0f8a89f9ef8fc144b3aff38148ae260da7c20e9dd3866d946585df7ed12c8b7005e7b0e1387c9db41d000000000000000000000000000000000afc403b008b70e19f17b1ef37c9c396577a585b6c34b23d09621b891efc00ef9460c3f4b5f3e851ef63620dc06c824300000000000000000000000000000000024e06f3f3b18c026a166c41f75d7bcf699480f5b6811463c27606c9ec1232fd249a46235b7f5b5a2ed3b53231b333150563ae7b444cca7ebaba36b8d59aaa5c0e6c1454a4a2907866247e752e640a7d,0000000000000000000000000000000004f2480d0b7e84a996965b76055f6879aab5bab26656e4e5ca7220adc17f14b5946047484327bbc5952d9f2ffa5f92af0000000000000000000000000000000002f7260c55c500b54df4391a55eb4adefa7d19bcbec82a107fc0d222c898b97360a679a02ab3023ce2ebdcffd125ddf30000000000000000000000000000000002cddfa94c8f6b3f29c2fe018b1f8679d0e98c8c2656f86f327b9cbcba574cc52643ab423b458994a03347460deef6570000000000000000000000000000000014eb4c84f71ef5935e707a11a92ba34780677ac7eb198e160585ad92aa5c1ea21e3a77be940fe344e7e170680e2a8d53,240480, 000000000000000000000000000000000c2c4c039047d297049afd0e8f0375bd4294d628d3a22078d93b684b737e8c4b6ad3ee544ecbeaad6b3c75d8d217f3a20000000000000000000000000000000004c77a2c0943c6f997ce2e785461f8ec253c47273ded4e1af43ae882766ef8c168e66d831abc2b3b3a0849bbc210cbd40000000000000000000000000000000004456a6c267a5cc6b7d9a9f573270855186a1b621cfdc465fe71ddb4d614565d9d36b13985b31396587919226843c6230000000000000000000000000000000009487cdd8a0cf7f40e9087fd3121cb480730f4302339d25fa12128033239662ed65579a59b837bf1bc5fa87db15b15335b59d128b5ac47106b4114cf225dceb621d177141ef5783943f40a54ad94e990000000000000000000000000000000000ba43205e8392168824f77bac344d60c1a9a0b14ab55538c3bfea4a64984cf381a2f61c64f1ba1bcfd8a7973e43f6e80000000000000000000000000000000000e95e5ac415c3e3e7c9feb6e7a2af3e8189afca06ae1fe54bbeb31783810860921ab3c76a475fb227b3c8299e3f1caf00000000000000000000000000000000001e3cb2106a23e77a126013087751c4d2a419a51beedc3a33faa6c933bedb3d34ee9c6450c583642426edb352e04da98000000000000000000000000000000000ab5af4c98aca1fc3fa55355351d12f3bc639662bf8b5b772152988d676b00ef39f767237a2fa3be936e83d1dd77da86a057c0405e24b7373f67197b2109b633a02589711b6a92ff49ca024f893d7ecc0000000000000000000000000000000012f3d927316ba638bd6294f7dd2f3f166d20285ee1662ae4dc145835704a17127078343d26042a5c397bfef31754186200000000000000000000000000000000162893d6252361c340057bcac31986458b8b55a8a4283f5a06ce1730098f9838dad1bca264374e7261bb9d08c177c1820000000000000000000000000000000017264aead0ec41a079827296f3d32c12adfca7cb6c674070d54087438d57b6ccca4822b2337263e60075d469b4ce0ccc000000000000000000000000000000000480cae035bd3bf1b4a4a766bcd5f188833e9587e1aff0e1f10e36ebbf2f3ae76bc0946e7c336efc3ee00bf42e7efbb9677b05905180182427efeb848b2ba2eafbabc7519ab33db14de0746afb607191000000000000000000000000000000000d13375356b1518e37a13b43b7d192eb74bd69636f91c570c41a741a8763c03caf8d13c7364f57c867a4a3983e88060f000000000000000000000000000000000f6f78dffb404faab88ac7373e0c765209c0af80514d438e18393bfcfeb60d9a5e13158d399f43162033571ee4a75dbc0000000000000000000000000000000010c379860638ccf3b6cb8479aa38881b0004197e3e367a1d5ef7c7fcf075689d283b87022e2825b5c789ac6a448467320000000000000000000000000000000002dc392872cf2fcd8e196f10c1ded175300070e4e38aa58c89c81e1aa5faa08d770a5ad90a8295a890551f9329a13cee53e7f69582f4c106ee5bfccba1d5f557736c1b75b6e3777cfde47d552e6bdcac0000000000000000000000000000000010383a21acda7c8f3f3be980bff2d57fa0a5b2dc424164dd2ce53c0b20ca399d6227913b7b550462180b01c231e4813200000000000000000000000000000000078aec90354721f0a31e1377b3652bcb1f388ab36f1866c955f3ea8dfe6ac2c25bc4cea14f54aee71595c2c1bd2dc4910000000000000000000000000000000007dfeec77213d952c183452b98ad936e8854608d950c0c1451262cdc7d6de5aed0db07a8d74b3e8f674967cb4839c4d00000000000000000000000000000000015c09e4ed2ea76d10d196f7a733ccc272b94dc436d6bb5fafad2fae4a96372c2c6f1325d1554746814ae292d8e6b1e3634c87bfb629b817e7ab97def7400b0a83e47af8d628787ff814733fdf34ba8d500000000000000000000000000000000138656fa091cc6613b1fcff04a3efb4f9c393985b2c78fa838eecbbbb8b6dafd88d9c72441f9bc735649480b5187acac000000000000000000000000000000000a35cec4819ca3321917cea5aa589db8cf61882fd1135031dc41a8207a8e71d326312799291b160a646148c382ed086b0000000000000000000000000000000005b6e4c02c9c54630c96271073513cac3a42d47a7272f62a21c7ad4c85c19b60b70d04719626cf4273f6c5691719931700000000000000000000000000000000166a20da734a47d7e28cce8f0c2d679fa6c738a7a1ca9089dc67ba2b1c92a83b024b8991f131e7e8802a617153de4554bebb60069acf431e1671e3d00e4da0d70fa11ed4099b21d45a2b811f99dd9cca000000000000000000000000000000000a4432a544deda931b1f62759320ada2963062e722bc1b748c9bd0d026ffae10f228be36ea0ab076358924f4c06b6feb0000000000000000000000000000000000e955b1b1b28d2044b6be371c58bc85097c77145b239e913bb0729757518c465d9e69338066f7496aa6a2038ea604f900000000000000000000000000000000017ca2a7d52c3a82ab8abf9fc1bc187389b6e4904e161541008e5b3ba0981870e01060d1272a6d59bfcfb294c942403f000000000000000000000000000000001870649a50e0978185551f213eefd9305d33e92b3f8c39752b6ebe18ae86ad97f92acef05971dceee3b3729becea18168b1ee2765e762f1b8c2451270cd5a755758fd733d7922a537aa9f1fd7d0c95960000000000000000000000000000000013713effa20d5039ced751ebafe1516f062f11ee05ffad37281cfee9d7a49ab14c065709832f6674bfbf2c9f379bc9c9000000000000000000000000000000000295f7ef148430209b48c292b024474f05036edfdee082c56aea05a62f1fba3ee7a540955423f78614c8385da8ef60040000000000000000000000000000000007408c97321b6d7c27e5e442a9e35b054e743c34d845874aeb1ccf4e903ca7803ed7fb1288327865f9e0ff0a388e92b400000000000000000000000000000000081808d03722a2d48846a693059c2662dee614f181dc406825544d30a6adc0f9d84a712eff80bddd4a27a036e4bf7359d5009fd559714d5692de5500ec8cae9c04ae1ab1c7c6e08c8738ef22da19ceca000000000000000000000000000000000880b646a674723c15b240ff56d2031e5db724251b1402a68df8b26261ffc9fb60a81abf165c6832137dc7a7293142d200000000000000000000000000000000172354b62bfb8d388b5a984411414738302725a508e8abeacdcb46454371d5e9cf762028fb65921d5c3dd8c67d42a981000000000000000000000000000000000a1af459bc3122dcef78359e468f4094d609ae3da09ca5aa6efb71a7494dafa2373a3906bac1f324d98b3eaa982a27d500000000000000000000000000000000092ac3b47253c7f090df076914cdc08a715faf153e8e365392b4859fca1db14d3f7fb998c97de9ad99b7d0b357252f086330c755ef708d8eb129475785f24be9e7836385ac918c60ad36e80e2f3281b80000000000000000000000000000000003b23eff722c078a781771d8b75d519e7a062ca3e4252ecca877845920158fb20d79a9ce449d9087426b113da0091826000000000000000000000000000000000c9026e8d3fee6282492393db504a2c41db19d8fbb83260624b05ba4107d6cb2c90d645a3c16862b27cc3fcce9bf89840000000000000000000000000000000018b8648d0a42285d474f809519696df9e1ad5c35d8e848ad74fbee37425aee8844a8be8cb4d3331670ee294ddb9a290200000000000000000000000000000000068cad37ee8578f4b502ac2ef4371a10e5432e57fe20d0cb074dc427831872113d3514a0b199d813b796b8357fa2a3dbc2431888d05cae840dde4c26911db1893659fdc345d5433556d9bf75e51fe3740000000000000000000000000000000013200f0aea4c60937be47213b6149b0ae76767f3559e0519f774af4a5d9431e2dd7ea74b42cc3ceb28ccf0d2f01116f30000000000000000000000000000000001c5bff08fd16ecb68f21289a3e7b9a2ec5da1357d604710a18e78ab780f8ef0343d5d9ee7f7988a009329b17e498beb00000000000000000000000000000000125453772eb9d1335ce4dbcc8f2ab8426fe89a0e49fec51d4e96718a38570aa82dbef452368141be2df260fb131c50b2000000000000000000000000000000000432cdd445519775b9914a986a0941cc829b4a15cd361df9ae7129547b24f7a6a15cd8fe9393fa1551db2d761a208b8ec9a72369cda74e5c86c6559cbc4f4db1b3ab24c5150c7decea862ede3c02c505000000000000000000000000000000000396cb6d7b44f92b716ed02985d351b4e8cd1bbb95f239e4f29d7379428470be395e2faeb8e3a910007aaa490d3c336d0000000000000000000000000000000000ad0c0623fdf50c2b504777554dbab3cde1b9705e976561873d7c22b81f49c7654a7c76e558fad1518ed73a0d3c3570000000000000000000000000000000001241d5bed68e02a2ddeb3ccbe109a161abe81edd7affb72182c5163851211c4763e6aecf766053b61ce575de893985f800000000000000000000000000000000183696d2a48feef6088f4e9f75a5055e8c54b3813658b593958490ddd4245ac495a8ff966861b20f26047f07fa8609a0c2f50989b04fc29c4c4a0090fb11e860c15f89a66f3bb8281e4678ba63ff3f9a000000000000000000000000000000000fe0ce41aa9e7cb2bcb4e01721b7b1d99fca4e9b7c4df09bec00bd346fc57c25118ba70d5333b7f3eef2659c64520a470000000000000000000000000000000005c932e09c62b7ddaf3f5c420c60740befa7cdff5bb812e0f089c45098d71b57004b7a207f0cdd34daaa3282cf6e9f7e000000000000000000000000000000001874200ead9776c1ecd6a54a57e5d0f9577910a4b3afb9b051622f658fe3ef6cc5070af60e7ef910562720e9716158d6000000000000000000000000000000000c2c657e58e400a67e59deee8c28234ff4688e781a2f6f2f0d0b186a5e4012695a522dfa0770cfd543f55939a05e20b09fc9abf1c76ff11ab538f46ce768ba597eb5f2f63073ec67e8de10aa1d666720000000000000000000000000000000000f0b561e5860321249b9ff434c604d26c3275824fc4ab9c1ce5c5858605ddaafae83ae27e523bf6006932f6c7f33d0a7000000000000000000000000000000000b47aab85bbd909599aa85c5eda363b67790ac6729fd8b1f4f53f66dd796cf2fa3496407b1bfaea4dc8eae53519054e70000000000000000000000000000000000cab1ebd23bc05c53bc9e8481c469eac3ee1b140af545bebed10a8fe50698d2ed883219881929207c0addf2f687198d0000000000000000000000000000000007742de55b799950e6f786f4eef45d0fb67e0475272ad68a183135b70047abab6c2ed51ede16c39be7b986df334e9e75d4167723682bc0e7476797b3be5e14b8de3e4e23b4ca33c50a2096cda8766dd7000000000000000000000000000000000923861332988bc843a65ec5dd4637f9dca8a15e71b82c780fe60d768213d118d8948ab554e30bb9253e900a9b7d87f200000000000000000000000000000000132b1faef49e7966a05783ba526e71134bfb577b13116548352da37e91e617d7c72ed2645e672ebbc517e079247dfb0e00000000000000000000000000000000000a46a8893a194ebfe077afd05fb25d4680f1e4991a3ec29475fa5651d086d20b38136155a65a4c70af31de5a78af59000000000000000000000000000000001344eb957594028b4228cbdb8efb03cc7cf49ec43b2ca5481eae1df6f2df3d5be9a7c4e4e78f8c39be546e29a83c92f49644c3727f78dd12811092190d5d10adcd5b9fc581dd783c97d4e7b5130f309a0000000000000000000000000000000012d7111303563a6358e5ce9155d7a153b5781062c2f6b919efc67ddfb4c61ef03be8828ca6339397b84763a5f8a7e8330000000000000000000000000000000010a2a0ea9973728d3fb1b5906ee84b2635c687c11398ebf605cad30216df3b7b4e3ee1653d4b323a690e6ba614ebec30000000000000000000000000000000000b93d5de37b892d4de9407a820c73ecfd6cd9fa565db82e7e8c14c8406823f705ff0adf6bd6add5ddc5f72c91e52e840000000000000000000000000000000000dcb320ceba5436df8f099c5a77f34376c96d830f5e8ab80667d156d89f6bf8998c148ef9a53847ed395871ab86f6d280df9846c84354ab7f947caca7800e12e38d8e6651527e6831f4d8b1bd66c4f3d,000000000000000000000000000000000ff3e299e6b9fc488d6db991cf9d226d330846e87c4a5cd3e5d4ac955bc2c3c2d1ee5ff230098b48f594d256495f489800000000000000000000000000000000097fdb8fc95d64c7070d8c71e0fd2a933d1e1ad3fefa230f079bc5743828317cd1b0c6d4253ba9c3c6ec6b12d53afa700000000000000000000000000000000002448bbb179d82eaa453cd5452752b9a083b52694cc65c5d9b47f72eff118d7aa06b0fba18eafe93d2937d7399c001af0000000000000000000000000000000009dec4c0aff2a46b07855c87e08832811633709ddfbbc30dbb7e78b3de43bd95e383baa6ff4c58188f0c7643e0ea5a40,240480, 0000000000000000000000000000000008afabec8a9985cbbc6246825785654c1d2eb7da5a01f76c4af4d0096b9baed3c33dbe492d14a6f9e762f06eb3d198f800000000000000000000000000000000027c592315dee4bcc892acc6f41a6eff5219c308253f7cd715d0e4a32c03c6d0d0e8568e146e9e799ac3025486c77fc30000000000000000000000000000000015b4ee27a3aa518a1ec1b447bb8f9128301c85b7176296d68dad3339b1dee78715b2f031a7fb6ba376145c97ceafeef60000000000000000000000000000000004b7e30ec7cc024ced863ce511cef3cabe954a4e5843dd636d776645a44225a36ed7e153ab5bf5d18f23c6444751875c8a71abe11a893fce872f6b8a020b6d84241df03eb934b50cbf3571df4800a83300000000000000000000000000000000119949d36d8d8e2bc1c26ded5f5fb01225a980a28b934ed3862480dc9297a3758e0f08ccaab3a09b5e5c0e4215e3246c0000000000000000000000000000000004a82dc22316ee6af39d937b662d1f1f2dc855c2ca8f33ec3274d833e87d594633fc7fab247911e0f46564397910d6ce00000000000000000000000000000000196900a09d8504ed960d41f4a8a2cde2e5dac61b008d3f6eb47e86d7b2ce6fcdc0f85157e3ab1571094d9fdaa75d0d500000000000000000000000000000000010c52ef9407eb4ec57844aebbcc3ea5000b1940d035dcc2a873327affaaabdd79e3560cbd29c63ce04f6279056d6eed1bbf28e5bca314391550d3a0fce50b1220965860e72c8c3865a2d4c599d31d3f1000000000000000000000000000000000e43655ae05dc6cfa93113dc26cea895d1c5bc73f20454c7b441dbc5ac80035b290514b13b31b41931ea5336d8d9a6a7000000000000000000000000000000001199a873958c63147e6b82625dfea15ce90dd41ceb4e315f67221eb874ef32c6a2953412e7e981659c72239a7a72bfe6000000000000000000000000000000001845af5936b4d7487ffe59137ba2f86daea3770cf37fd560969ee48243389941a1072205e049ddaa06c0ac56b7edc8930000000000000000000000000000000003cc831177f24614f93a118b896434105f05a277051a852fb9973a775fc54f779c2a1f3d64c457e5231dc22d6aef606b58b208a6845aeb2bf31999042c59b7b130a7ce5297e88023953b1aef63616fe400000000000000000000000000000000005e63584bc85ba58615985f6a466afe05268e545e0062cd7214e0b6fc8b87537c745b754cd9a1144948bc88b3c43acd000000000000000000000000000000000635b6a49090ccede3ed2ef203f0ed164783e3df4d9a7d93319515cb9230bd841b61a097f39e30175793b3e934d8e426000000000000000000000000000000001861e65f47a9da1584c45bc79a66045d86bc1709c2d1cf6cd2930a9fcc8c4efaa6536b5015be8d54789e8f574f93f9f70000000000000000000000000000000009290ce63d55eb436794acf11be9d896f03e7608a1bc8528f61ec9473f054bc9fbbda1072440e58e2f6ba080a01180173b53b6cf9e0ce1661c4960283be790abf956c2d6433529b8f3a32b92b227aebe0000000000000000000000000000000018feed9500bff884d2bb58554da2180c68267b6d3a45c2c7cee4c3f8524252d3faaa5eff971bf40123587e669fe66bbb000000000000000000000000000000001441bd3b58b4a4a87c2459f873c0692f5977b775af984bab46dd76cb9f775d2faebcb77b2854c9f1faa33f6c5de61c6a00000000000000000000000000000000123a890c3362c77e5b5cf9846d9c9e43fb3242d5a831e640ad080993fa0547854c8d11cc22f7f7b426528bf1154d2300000000000000000000000000000000000ff4a59ea98d13cfd353ae61e18d3c7018688f755561e6a1da5f09acc4277e8d49645087115acc64f992ea778a11f39bb049228435ade4c4c565e65f39f13a84c747c312afcdaff352560b9fb3cfebcc0000000000000000000000000000000006b019d005141e82393a2ca04469d1f6fd7b9456001ffef4c34eff6b2e91df58e99fd07944f52b108bd41ab6c4d6bbf200000000000000000000000000000000109ae87042029856befff0c916db5437e1e058a96f2970d8816b3becc93a1a50d6d336d5451303715f3e272147a36caa0000000000000000000000000000000000fc381b8dc9dc02d34db13e34732a10d0dfcf676c224a05a3bffd888b0af7c415b38af0b6afe6b464ffca42947c6ee5000000000000000000000000000000000087040d09c39ccd06c9ecc360fa02147a32e8036ad6e4b6bdf5b3883722a4e5a887dd022d53706d2585fe558696be6656197f5ad17062d2ecbdc8887bcdd32e5ed4c48cefd9e14d622a0b800d970330000000000000000000000000000000000e35c27b29df0fa9298bb9ab6a38b3450782223e2115d79152f9baa924d762d583b3ebe88e42f33028814ec78e5b319d00000000000000000000000000000000190c65667627a16f0af0ac7f23af0803bca810f3986b906b7b4f126d98473d52badf45e90e2e45bb390242fa8c40135100000000000000000000000000000000103f0283a5673c16bcc0f74f259c2eb077061947da04e467dfebf62aa005491e32b85cb73418b624a30dbaa01672921e000000000000000000000000000000000465466955c908607191faf15f0768dce42488c488eb4a065977f21ac7484766bc0abf23961ea2ba46dcc04956abf6c7721d9d7fe10104cafcad71307e785321ab87b2b69593535caecbf0e166cfda5b00000000000000000000000000000000082346e352e845a54cd4267f93b85b2c8623d4650e00c1c56082b73ee31f63588d2c117d3cdecc0378fbbf8956b082040000000000000000000000000000000001a7f43c2bb19cb32345c43c950536f8e85815b86364f278f6ec8169eca80917c2b8fc08d59b20cf55f25dc468e7bd7f00000000000000000000000000000000085a5cb020df10f9b4c7afc01b1d11700579dec1e85e766507def2e6cf5b714174f7be9cce3b18533a5ebfeec2b4e481000000000000000000000000000000001836d7506d1cc984fb777b8ee935d6f5b110644f59e96ff44d8329336d59a3e1d2b53a05d35e97f634baa4fdc11a6cd8461531ecb61365908019c1e8074a4c322df2b356eea3f3eea9aa1e0e1fc5525e000000000000000000000000000000000c1c59828ec6257a02679cff0bee0d665d449d2a158bc6d877e84cc0fe2161c297dde09b778d5e1249c515833e483004000000000000000000000000000000000f5e82589bfb7781e4110f1486752b00cbdf96cdf4191d75053c6d6d646e1c989add011361031a11559e156d64139fbf0000000000000000000000000000000015053afa7fb2b4e4b70f3c8a570fef8288fdc22dd951b6ba8a40b6087b9ab04ede21f0ddfa84d6d18914041bcf244c110000000000000000000000000000000003f399800cba51ab35624d866831ab6506392cb3acf549787153ffaf08cc451acea46c7a612821dd96c45f8b75133d88569c1c1ae2d18bbe36ed50db1bf30957802b09a982fbed49d4968815552e010d000000000000000000000000000000000e26242c8f73116079369ef4265f624abd4377e4e3485c28197663de9de9f5618c3b6ee602ff6bebd1c242aef7295b2200000000000000000000000000000000066ceb3ea6067220bd28fa1164237782859d27c1d3087a42b4d09bcc343611e4ed2be014a27f5b394c67643dc00f57cf00000000000000000000000000000000157f9d30de52110ea7a2a35ddfe67d9fad7223c5e3307e797dd0df3621520a421958a2835205e3c4777923f47d47e5310000000000000000000000000000000016ebb41beb85b9489a6d5482f8a3330a5c5c5e5718e8efb8b67362f9d8e9c313e9e563275ba38c207c5bf3d89c406ea62061d33b2f7e786effbd2e93101a56ba1bb62c1a773a08b72ca82f5183bea35b0000000000000000000000000000000005d1c9109b5b7409f94ae3f7dd9e8ae4908a9b378fea4ea284cbd33d1e59b605577b63892aaa8ec14d415f34e22fec520000000000000000000000000000000005afed05e62599f20f7eca019f41d770c630cf6359cb5601464be821691fba5205c16e7b580e6881047214f938e5104b00000000000000000000000000000000105637a2aa4725d8e080dec3b731a111ea4c94b79f898dfd51f645501ef0c8d68ea8e80fde28ff96e927e44306ebbb1d00000000000000000000000000000000080cfeea754474ceb37973234d5dc3269f8ca99bd862d4d2d1a602321fc709945a3209e5ff2cc962cfa6d03017c9a1354129b150752d2d5551a622231ab067931678454aaeb23f76168219406f0d50ee00000000000000000000000000000000137762ea5c80033aaf17570451b15a062feedde810f11ebdbe9a79a3275dc12613e0505835c122bd5f9afea7dba84203000000000000000000000000000000000d89c04e45e60769a63fcd73df2a138c457bb549195f2c4eebb3be1ea46149f286756795be8328b5b886f497d8167b34000000000000000000000000000000000be43d515083c8c10f467618685a43d4d5f6457204bacd278445943a9f44f7189b561a0e1bc59d2757fcfab2e3f93a4a0000000000000000000000000000000011a52583227c6dcdc1784d3633fd584612a9f3bbc1922477396dcd5af84413e5e9382a34a71b3a72491ea09fab2fc6bf366c32d5d3c132f32a6ac3cfe1dabb649c59ae224338f747ad98b193e8346729000000000000000000000000000000000073acefe33525dd2d5204cce72371ed82c7e4b58d1b4e7f4b4994f9c58b02d9d6206fefb3552446b6b355e860ace43c0000000000000000000000000000000007344eaeaae71e17930e769e02bcb4f44ddf3d040ffa0b081f25901cc125a37a58a6a5d13e7b0ba493802ccdaa054e29000000000000000000000000000000000a65fec6ad29ec3eee9ddc7ded2297f49d03ff18a255f1e6d29d2a67c20713f319d79d513af0c58ae3cddfd1f6240ff50000000000000000000000000000000019d5f00d9e2b271f4e9ac779a096386f08ae124f77fb8183405d48ea7f16e685805442dc67a392aefc643ea95b4f1fcfd997516cac28a3968ac6946b5bffaace0856a52e38fdcca11ddfa16cf5a568f50000000000000000000000000000000018230bf1a873aa04855af1426da30f1b3ef4b64eec613b9f660222e3827b325c318baea031b463c7e9f775165d22ec8f00000000000000000000000000000000017faafa1294fac53e1de8cae9601acc62d76a5f01a39ce49d65f3f5d2cd5cca33eb90bb4116b3ea36f912ae2b81b6cf000000000000000000000000000000000fc3ef5ea59849a87fcd45500989f1744cb5570ee88e34a952cec32cea2eb5900b64d8d0d04ef5c51e8fdcccd46412490000000000000000000000000000000001c53aa8aaae8422fa4fddc86cacdefa89c37592c8e67e472a23627514623a90901a619af79e93561a0dc65215837274e881ec65fdc2f58e46d3ee45a06d0c5ac844ee5b62872c7ba21f6b48621a3371000000000000000000000000000000000e3db6885c2db9244548e11b8c49b73f85e4104b413f54308497262fdff1957495859830114528a22c45d39a554ba82700000000000000000000000000000000181b1bfe2d9a1c563e73356d73f4ed3e7061a79c610bc97c911ab1a0213d123c9f83ed6706e862087a796ce14c5cf53d0000000000000000000000000000000013f5fdceddce771588869b945bd6025e5ce485fe78a362356720b474b83998f27e535cfd8d33ee51cfc68e5d514f915c0000000000000000000000000000000007e8fd7ba457a3cefd50c641847425cf2262deb1d6945a0bd740eadf38dcaa616edc48c3912508d663349f089b8b56fadcd9b95e49473277a665ca0f9a8309df9ed6ee4f25d803aa967fb8f688273e650000000000000000000000000000000004b20b0408da7b704694b47607928a655077015f2174fe01bac9a0b3a61dae087b0b593f58d2947d8d84f75bbfb327c900000000000000000000000000000000106d623b2007c5d7128e03e540325ba763e992a651e2e5c78936f82ee2ff72d89a1a914345486cd0a04440c75beb190b000000000000000000000000000000001847348e5ef429cfdf1ba4d265d8c5ebcbec3d5dd4611ba36e2754fbd3d327273bf2eb7b7ba4b3888d059dc87f034739000000000000000000000000000000000bcb0a9dfe5189bc965e9721407b4cb3ed4171510aa4d4e5d5f0823a1c2827643e1278f9c0ee960c54ef8f6c208eee7b334582482a9038ab906880e43a4a9d39e73b6c63604eba0c8f6399eb5c288638,000000000000000000000000000000001205b70b29ee04212589f8a70a71e004f517d3354e714c1b4fe42cf93faf1a8ed40dbc1b5089ddb53bb052c9cb74c0e8000000000000000000000000000000000f619082734dd9de653b61cf2fb927199f228637db70797bd2a21fdd48b6ecd4c4f712097037534024880a436fdd63680000000000000000000000000000000000592eca560be6ae256abe1796f7ec394a8085c127437f6590c8d41501a482c61456392cb320b9e801044dcba7802df9000000000000000000000000000000000a6d20b8009708ca01a274aed6dece732c5eed5aae5e4c2f3793b5fa1f8cb8c95037ce387bda2e7476e9c493507c7fbc,240480, -000000000000000000000000000000039b10ccd664da6f273ea134bb55ee48f09ba585a7e2bb95b5aec610631ac49810d5d616f67ba0147e6d1be476ea220e0000000000000000000000000000000000fbcdff4e48e07d1f73ec42fe7eb026f5c30407cfd2f22bbbfe5b2a09e8a7bb4884178cb6afd1c95f80e646929d30040000000000000000000000000000000001ed3b0e71acb0adbf44643374edbf4405af87cfc0507db7e8978889c6c3afbe9754d1182e98ac3060d64994d31ef576000000000000000000000000000000001681a2bf65b83be5a2ca50430949b6e2a099977482e9405b593f34d2ed877a3f0d1bddc37d0cec4d59d7df74b2b8f2dfb3c940fe79b6966489b527955de7599194a9ac69a6ff58b8d99e7b1084f0464e0000000000000000000000000000000018c0ada6351b70661f053365deae56910798bd2ace6e2bf6ba4192d1a229967f6af6ca1c9a8a11ebc0a232344ee0f6d6000000000000000000000000000000000cc70a587f4652039d8117b6103858adcd9728f6aebe230578389a62da0042b7623b1c0436734f463cfdd187d20903240000000000000000000000000000000009f50bd7beedb23328818f9ffdafdb6da6a4dd80c5a9048ab8b154df3cad938ccede829f1156f769d9e149791e8e0cd900000000000000000000000000000000079ba50d2511631b20b6d6f3841e616e9d11b68ec3368cd60129d9d4787ab56c4e9145a38927e51c9cd6271d493d93884d0e25bf3f6fc9f4da25d21fdc71773f1947b7a8a775b8177f7eca990b05b71d0000000000000000000000000000000003632695b09dbf86163909d2bb25995b36ad1d137cf252860fd4bb6c95749e19eb0c1383e9d2f93f2791cb0cf6c8ed9d000000000000000000000000000000001688a855609b0bbff4452d146396558ff18777f329fd4f76a96859dabfc6a6f6977c2496280dbe3b1f8923990c1d6407000000000000000000000000000000000c8567fee05d05af279adc67179468a29d7520b067dbb348ee315a99504f70a206538b81a457cce855f4851ad48b7e80000000000000000000000000000000001238dcdfa80ea46e1500026ea5feadb421de4409f4992ffbf5ae59fa67fd82f38452642a50261b849e74b4a33eed70cc973f40c12c92b703d7b7848ef8b4466d40823aad3943a312b57432b91ff68be1000000000000000000000000000000000149704960cccf9d5ea414c73871e896b1d4cf0a946b0db72f5f2c5df98d2ec4f3adbbc14c78047961bc9620cb6cfb5900000000000000000000000000000000140c5d25e534fb1bfdc19ba4cecaabe619f6e0cd3d60b0f17dafd7bcd27b286d4f4477d00c5e1af22ee1a0c67fbf177c00000000000000000000000000000000029a1727041590b8459890de736df15c00d80ab007c3aee692ddcdf75790c9806d198e9f4502bec2f0a623491c3f877d0000000000000000000000000000000008a94c98baa9409151030d4fae2bd4a64c6f11ea3c99b9661fdaed226b9a7c2a7d609be34afda5d18b8911b6e015bf494c51f97bcdda93904ae26991b471e9ea942e2b5b8ed26055da11c58bc7b5002a000000000000000000000000000000001156d478661337478ab0cbc877a99d9e4d9824a2b3f605d41404d6b557b3ffabbf42635b0bbcb854cf9ed8b8637561a8000000000000000000000000000000001147ed317d5642e699787a7b47e6795c9a8943a34a694007e44f8654ba96390cf19f010dcf695e22c21874022c6ce291000000000000000000000000000000000c6dccdf920fd5e7fae284115511952633744c6ad94120d9cae6acda8a7c23c48bd912cba6c38de5159587e1e6cad519000000000000000000000000000000001944227d462bc2e5dcc6f6db0f83dad411ba8895262836f975b2b91e06fd0e2138862162acc04e9e65050b34ccbd1a4e8964d5867927bc3e35a0b4c457482373969bff5edff8a781d65573e07fd87b890000000000000000000000000000000019c31e3ab8cc9c920aa8f56371f133b6cb8d7b0b74b23c0c7201aca79e5ae69dc01f1f74d2492dcb081895b17d106b4e000000000000000000000000000000001789b0d371bd63077ccde3dbbebf3531368feb775bced187fb31cc6821481664600978e323ff21085b8c08e0f21daf72000000000000000000000000000000000009eacfe8f4a2a9bae6573424d07f42bd6af8a9d55f71476a7e3c7a4b2b898550c1e72ec13afd4eff22421a03af1d31000000000000000000000000000000000410bd4ea74dcfa33f2976aa1b571c67cbb596ab10f76a8aaf4548f1097e55b3373bff02683f806cb84e1e0e877819e2787c38b944eadbd03fd3187f450571740f6cd00e5b2e560165846eb800e5c94400000000000000000000000000000000147f09986691f2e57073378e8bfd58804241eed7934f6adfe6d0a6bac4da0b738495778a303e52113e1c80e698476d50000000000000000000000000000000000762348b84c92a8ca6de319cf1f8f11db296a71b90fe13e1e4bcd25903829c00a5d2ad4b1c8d98c37eaad7e042ab023d0000000000000000000000000000000011d1d94530d4a2daf0e902a5c3382cd135938557f94b04bccea5e16ea089c5e020e13524c854a316662bd68784fe31f300000000000000000000000000000000070828522bec75b6a492fd9bca7b54dac6fbbf4f0bc3179d312bb65c647439e3868e4d5b21af5a64c93aeee8a9b7e46eaaee7ae2a237e8e53560c79e7baa9adf9c00a0ea4d6f514e7a6832eb15cef1e1000000000000000000000000000000000690a0869204c8dced5ba0ce13554b2703a3f18afb8fa8fa1c457d79c58fdc25471ae85bafad52e506fc1917fc3becff0000000000000000000000000000000010f7dbb16f8571ede1cec79e3f9ea03ae6468d7285984713f19607f5cab902b9a6b7cbcfd900be5c2e407cc093ea0e6700000000000000000000000000000000151caf87968433cb1f85fc1854c57049be22c26497a86bfbd66a2b3af121d894dba8004a17c6ff96a5843c2719fa32d10000000000000000000000000000000011f0270f2b039409f70392879bcc2c67c836c100cf9883d3dc48d7adbcd52037d270539e863a951acd47ecaa1ca4db12dac6ed3ef45c1d7d3028f0f89e5458797996d3294b95bebe049b76c7d0db317c0000000000000000000000000000000017fae043c8fd4c520a90d4a6bd95f5b0484acc279b899e7b1d8f7f7831cc6ba37cd5965c4dc674768f5805842d433af30000000000000000000000000000000008ddd7b41b8fa4d29fb931830f29b46f4015ec202d51cb969d7c832aafc0995c875cd45eff4a083e2d5ecb5ad185b64f0000000000000000000000000000000015d384ab7e52420b83a69827257cb52b00f0199ed2240a142812b46cf67e92b99942ac59fb9f9efd7dd822f5a36c799f00000000000000000000000000000000074b3a16a9cc4be9da0ac8e2e7003d9c1ec89244d2c33441b31af76716cce439f805843a9a44701203231efdca551d5bbb30985756c3ca075114c92f231575d6befafe4084517f1166a47376867bd108000000000000000000000000000000000e25365988664e8b6ade2e5a40da49c11ff1e084cc0f8dca51f0d0578555d39e3617c8cadb2abc2633b28c5895ab0a9e00000000000000000000000000000000169f5fd768152169c403475dee475576fd2cc3788179453b0039ff3cb1b7a5a0fff8f82d03f56e65cad579218486c3b600000000000000000000000000000000087ccd7f92032febc1f75c7115111ede4acbb2e429cbccf3959524d0b79c449d431ff65485e1aecb442b53fec80ecb4000000000000000000000000000000000135d63f264360003b2eb28f126c6621a40088c6eb15acc4aea89d6068e9d5a47f842aa4b4300f5cda5cc5831edb81596fb730105809f64ea522983d6bbb62f7e2e8cbf702685e9be10e2ef71f818767200000000000000000000000000000000159da74f15e4c614b418997f81a1b8a3d9eb8dd80d94b5bad664bff271bb0f2d8f3c4ceb947dc6300d5003a2f7d7a829000000000000000000000000000000000cdd4d1d4666f385dd54052cf5c1966328403251bebb29f0d553a9a96b5ade350c8493270e9b5282d8a06f9fa8d7b1d900000000000000000000000000000000189f8d3c94fdaa72cc67a7f93d35f91e22206ff9e97eed9601196c28d45b69c802ae92bcbf582754717b0355e08d37c000000000000000000000000000000000054b0a282610f108fc7f6736b8c22c8778d082bf4b0d0abca5a228198eba6a868910dd5c5c440036968e977955054196b6a9408625b0ca8fcbfb21d34eec2d8e24e9a30d2d3b32d7a37d110b13afbfea000000000000000000000000000000000f29b0d2b6e3466668e1328048e8dbc782c1111ab8cbe718c85d58ded992d97ca8ba20b9d048feb6ed0aa1b4139d02d3000000000000000000000000000000000d1f0dae940b99fbfc6e4a58480cac8c4e6b2fe33ce6f39c7ac1671046ce94d9e16cba2bb62c6749ef73d45bea21501a000000000000000000000000000000001902ccece1c0c763fd06934a76d1f2f056563ae6d8592bafd589cfebd6f057726fd908614ccd6518a21c66ecc2f78b660000000000000000000000000000000017f6b113f8872c3187d20b0c765d73b850b54244a719cf461fb318796c0b8f310b5490959f9d9187f99c8ed3e25e42a93b77283d0a7bb9e17a27e66851792fdd605cc0a339028b8985390fd024374c76000000000000000000000000000000000576b8cf1e69efdc277465c344cadf7f8cceffacbeca83821f3ff81717308b97f4ac046f1926e7c2eb42677d7afc257c000000000000000000000000000000000cc1524531e96f3c00e4250dd351aedb5a4c3184aff52ec8c13d470068f5967f3674fe173ee239933e67501a9decc6680000000000000000000000000000000001610cfcaea414c241b44cf6f3cc319dcb51d6b8de29c8a6869ff7c1ebb7b747d881e922b42e8fab96bde7cf23e8e4cd0000000000000000000000000000000017d4444dc8b6893b681cf10dac8169054f9d2f61d3dd5fd785ae7afa49d18ebbde9ce8dde5641adc6b38173173459836dd994eae929aee7428fdda2e44f8cb12b10b91c83b22abc8bbb561310b62257c000000000000000000000000000000000ca8f961f86ee6c46fc88fbbf721ba760186f13cd4cce743f19dc60a89fd985cb3feee34dcc4656735a326f515a729e400000000000000000000000000000000174baf466b809b1155d524050f7ee58c7c5cf728c674e0ce549f5551047a4479ca15bdf69b403b03fa74eb1b26bbff6c0000000000000000000000000000000000e8c8b587c171b1b292779abfef57202ed29e7fe94ade9634ec5a2b3b4692a4f3c15468e3f6418b144674be70780d5b000000000000000000000000000000001865e99cf97d88bdf56dae32314eb32295c39a1e755cd7d1478bea8520b9ff21c39b683b92ae15568420c390c42b123b7010b134989c8368c7f831f9dd9f9a890e2c1435681107414f2e8637153bbf6a0000000000000000000000000000000017eccd446f10018219a1bd111b8786cf9febd49f9e7e754e82dd155ead59b819f0f20e42f4635d5044ec5d550d847623000000000000000000000000000000000403969d2b8f914ff2ea3bf902782642e2c6157bd2a343acf60ff9125b48b558d990a74c6d4d6398e7a3cc2a16037346000000000000000000000000000000000bd45f61f142bd78619fb520715320eb5e6ebafa8b078ce796ba62fe1a549d5fb9df57e92d8d2795988eb6ae18cf9d9300000000000000000000000000000000097db1314e064b8e670ec286958f17065bce644cf240ab1b1b220504560d36a0b43fc18453ff3a2bb315e219965f5bd394c68bc8d91ac8c489ee87dbfc4b94c93c8bbd5fc04c27db8b02303f3a65905400000000000000000000000000000000018244ab39a716e252cbfb986c7958b371e29ea9190010d1f5e1cfdb6ce4822d4055c37cd411fc9a0c46d728f2c13ecf0000000000000000000000000000000001985d3c667c8d68c9adb92bdc7a8af959c17146544997d97116120a0f55366bd7ad7ffa28d93ee51222ff9222779675000000000000000000000000000000000c70fd4e3c8f2a451f83fb6c046431b38251b7bae44cf8d36df69a03e2d3ce6137498523fcf0bcf29b5d69e8f265e24d00000000000000000000000000000000047b9163a218f7654a72e0d7c651a2cf7fd95e9784a59e0bf119d081de6c0465d374a55fbc1eff9828c9fd29abf4c4bdb3682accc3939283b870357cf83683350baf73aa0d3d68bda82a0f6ae7e51746,,,invalid input parameters, invalid input length for G1 multiplication -0000000000000000000000000000000000039b10ccd664da6f273ea134bb55ee48f09ba585a7e2bb95b5aec610631ac49810d5d616f67ba0147e6d1be476ea220e0000000000000000000000000000000000fbcdff4e48e07d1f73ec42fe7eb026f5c30407cfd2f22bbbfe5b2a09e8a7bb4884178cb6afd1c95f80e646929d30040000000000000000000000000000000001ed3b0e71acb0adbf44643374edbf4405af87cfc0507db7e8978889c6c3afbe9754d1182e98ac3060d64994d31ef576000000000000000000000000000000001681a2bf65b83be5a2ca50430949b6e2a099977482e9405b593f34d2ed877a3f0d1bddc37d0cec4d59d7df74b2b8f2dfb3c940fe79b6966489b527955de7599194a9ac69a6ff58b8d99e7b1084f0464e0000000000000000000000000000000018c0ada6351b70661f053365deae56910798bd2ace6e2bf6ba4192d1a229967f6af6ca1c9a8a11ebc0a232344ee0f6d6000000000000000000000000000000000cc70a587f4652039d8117b6103858adcd9728f6aebe230578389a62da0042b7623b1c0436734f463cfdd187d20903240000000000000000000000000000000009f50bd7beedb23328818f9ffdafdb6da6a4dd80c5a9048ab8b154df3cad938ccede829f1156f769d9e149791e8e0cd900000000000000000000000000000000079ba50d2511631b20b6d6f3841e616e9d11b68ec3368cd60129d9d4787ab56c4e9145a38927e51c9cd6271d493d93884d0e25bf3f6fc9f4da25d21fdc71773f1947b7a8a775b8177f7eca990b05b71d0000000000000000000000000000000003632695b09dbf86163909d2bb25995b36ad1d137cf252860fd4bb6c95749e19eb0c1383e9d2f93f2791cb0cf6c8ed9d000000000000000000000000000000001688a855609b0bbff4452d146396558ff18777f329fd4f76a96859dabfc6a6f6977c2496280dbe3b1f8923990c1d6407000000000000000000000000000000000c8567fee05d05af279adc67179468a29d7520b067dbb348ee315a99504f70a206538b81a457cce855f4851ad48b7e80000000000000000000000000000000001238dcdfa80ea46e1500026ea5feadb421de4409f4992ffbf5ae59fa67fd82f38452642a50261b849e74b4a33eed70cc973f40c12c92b703d7b7848ef8b4466d40823aad3943a312b57432b91ff68be1000000000000000000000000000000000149704960cccf9d5ea414c73871e896b1d4cf0a946b0db72f5f2c5df98d2ec4f3adbbc14c78047961bc9620cb6cfb5900000000000000000000000000000000140c5d25e534fb1bfdc19ba4cecaabe619f6e0cd3d60b0f17dafd7bcd27b286d4f4477d00c5e1af22ee1a0c67fbf177c00000000000000000000000000000000029a1727041590b8459890de736df15c00d80ab007c3aee692ddcdf75790c9806d198e9f4502bec2f0a623491c3f877d0000000000000000000000000000000008a94c98baa9409151030d4fae2bd4a64c6f11ea3c99b9661fdaed226b9a7c2a7d609be34afda5d18b8911b6e015bf494c51f97bcdda93904ae26991b471e9ea942e2b5b8ed26055da11c58bc7b5002a000000000000000000000000000000001156d478661337478ab0cbc877a99d9e4d9824a2b3f605d41404d6b557b3ffabbf42635b0bbcb854cf9ed8b8637561a8000000000000000000000000000000001147ed317d5642e699787a7b47e6795c9a8943a34a694007e44f8654ba96390cf19f010dcf695e22c21874022c6ce291000000000000000000000000000000000c6dccdf920fd5e7fae284115511952633744c6ad94120d9cae6acda8a7c23c48bd912cba6c38de5159587e1e6cad519000000000000000000000000000000001944227d462bc2e5dcc6f6db0f83dad411ba8895262836f975b2b91e06fd0e2138862162acc04e9e65050b34ccbd1a4e8964d5867927bc3e35a0b4c457482373969bff5edff8a781d65573e07fd87b890000000000000000000000000000000019c31e3ab8cc9c920aa8f56371f133b6cb8d7b0b74b23c0c7201aca79e5ae69dc01f1f74d2492dcb081895b17d106b4e000000000000000000000000000000001789b0d371bd63077ccde3dbbebf3531368feb775bced187fb31cc6821481664600978e323ff21085b8c08e0f21daf72000000000000000000000000000000000009eacfe8f4a2a9bae6573424d07f42bd6af8a9d55f71476a7e3c7a4b2b898550c1e72ec13afd4eff22421a03af1d31000000000000000000000000000000000410bd4ea74dcfa33f2976aa1b571c67cbb596ab10f76a8aaf4548f1097e55b3373bff02683f806cb84e1e0e877819e2787c38b944eadbd03fd3187f450571740f6cd00e5b2e560165846eb800e5c94400000000000000000000000000000000147f09986691f2e57073378e8bfd58804241eed7934f6adfe6d0a6bac4da0b738495778a303e52113e1c80e698476d50000000000000000000000000000000000762348b84c92a8ca6de319cf1f8f11db296a71b90fe13e1e4bcd25903829c00a5d2ad4b1c8d98c37eaad7e042ab023d0000000000000000000000000000000011d1d94530d4a2daf0e902a5c3382cd135938557f94b04bccea5e16ea089c5e020e13524c854a316662bd68784fe31f300000000000000000000000000000000070828522bec75b6a492fd9bca7b54dac6fbbf4f0bc3179d312bb65c647439e3868e4d5b21af5a64c93aeee8a9b7e46eaaee7ae2a237e8e53560c79e7baa9adf9c00a0ea4d6f514e7a6832eb15cef1e1000000000000000000000000000000000690a0869204c8dced5ba0ce13554b2703a3f18afb8fa8fa1c457d79c58fdc25471ae85bafad52e506fc1917fc3becff0000000000000000000000000000000010f7dbb16f8571ede1cec79e3f9ea03ae6468d7285984713f19607f5cab902b9a6b7cbcfd900be5c2e407cc093ea0e6700000000000000000000000000000000151caf87968433cb1f85fc1854c57049be22c26497a86bfbd66a2b3af121d894dba8004a17c6ff96a5843c2719fa32d10000000000000000000000000000000011f0270f2b039409f70392879bcc2c67c836c100cf9883d3dc48d7adbcd52037d270539e863a951acd47ecaa1ca4db12dac6ed3ef45c1d7d3028f0f89e5458797996d3294b95bebe049b76c7d0db317c0000000000000000000000000000000017fae043c8fd4c520a90d4a6bd95f5b0484acc279b899e7b1d8f7f7831cc6ba37cd5965c4dc674768f5805842d433af30000000000000000000000000000000008ddd7b41b8fa4d29fb931830f29b46f4015ec202d51cb969d7c832aafc0995c875cd45eff4a083e2d5ecb5ad185b64f0000000000000000000000000000000015d384ab7e52420b83a69827257cb52b00f0199ed2240a142812b46cf67e92b99942ac59fb9f9efd7dd822f5a36c799f00000000000000000000000000000000074b3a16a9cc4be9da0ac8e2e7003d9c1ec89244d2c33441b31af76716cce439f805843a9a44701203231efdca551d5bbb30985756c3ca075114c92f231575d6befafe4084517f1166a47376867bd108000000000000000000000000000000000e25365988664e8b6ade2e5a40da49c11ff1e084cc0f8dca51f0d0578555d39e3617c8cadb2abc2633b28c5895ab0a9e00000000000000000000000000000000169f5fd768152169c403475dee475576fd2cc3788179453b0039ff3cb1b7a5a0fff8f82d03f56e65cad579218486c3b600000000000000000000000000000000087ccd7f92032febc1f75c7115111ede4acbb2e429cbccf3959524d0b79c449d431ff65485e1aecb442b53fec80ecb4000000000000000000000000000000000135d63f264360003b2eb28f126c6621a40088c6eb15acc4aea89d6068e9d5a47f842aa4b4300f5cda5cc5831edb81596fb730105809f64ea522983d6bbb62f7e2e8cbf702685e9be10e2ef71f818767200000000000000000000000000000000159da74f15e4c614b418997f81a1b8a3d9eb8dd80d94b5bad664bff271bb0f2d8f3c4ceb947dc6300d5003a2f7d7a829000000000000000000000000000000000cdd4d1d4666f385dd54052cf5c1966328403251bebb29f0d553a9a96b5ade350c8493270e9b5282d8a06f9fa8d7b1d900000000000000000000000000000000189f8d3c94fdaa72cc67a7f93d35f91e22206ff9e97eed9601196c28d45b69c802ae92bcbf582754717b0355e08d37c000000000000000000000000000000000054b0a282610f108fc7f6736b8c22c8778d082bf4b0d0abca5a228198eba6a868910dd5c5c440036968e977955054196b6a9408625b0ca8fcbfb21d34eec2d8e24e9a30d2d3b32d7a37d110b13afbfea000000000000000000000000000000000f29b0d2b6e3466668e1328048e8dbc782c1111ab8cbe718c85d58ded992d97ca8ba20b9d048feb6ed0aa1b4139d02d3000000000000000000000000000000000d1f0dae940b99fbfc6e4a58480cac8c4e6b2fe33ce6f39c7ac1671046ce94d9e16cba2bb62c6749ef73d45bea21501a000000000000000000000000000000001902ccece1c0c763fd06934a76d1f2f056563ae6d8592bafd589cfebd6f057726fd908614ccd6518a21c66ecc2f78b660000000000000000000000000000000017f6b113f8872c3187d20b0c765d73b850b54244a719cf461fb318796c0b8f310b5490959f9d9187f99c8ed3e25e42a93b77283d0a7bb9e17a27e66851792fdd605cc0a339028b8985390fd024374c76000000000000000000000000000000000576b8cf1e69efdc277465c344cadf7f8cceffacbeca83821f3ff81717308b97f4ac046f1926e7c2eb42677d7afc257c000000000000000000000000000000000cc1524531e96f3c00e4250dd351aedb5a4c3184aff52ec8c13d470068f5967f3674fe173ee239933e67501a9decc6680000000000000000000000000000000001610cfcaea414c241b44cf6f3cc319dcb51d6b8de29c8a6869ff7c1ebb7b747d881e922b42e8fab96bde7cf23e8e4cd0000000000000000000000000000000017d4444dc8b6893b681cf10dac8169054f9d2f61d3dd5fd785ae7afa49d18ebbde9ce8dde5641adc6b38173173459836dd994eae929aee7428fdda2e44f8cb12b10b91c83b22abc8bbb561310b62257c000000000000000000000000000000000ca8f961f86ee6c46fc88fbbf721ba760186f13cd4cce743f19dc60a89fd985cb3feee34dcc4656735a326f515a729e400000000000000000000000000000000174baf466b809b1155d524050f7ee58c7c5cf728c674e0ce549f5551047a4479ca15bdf69b403b03fa74eb1b26bbff6c0000000000000000000000000000000000e8c8b587c171b1b292779abfef57202ed29e7fe94ade9634ec5a2b3b4692a4f3c15468e3f6418b144674be70780d5b000000000000000000000000000000001865e99cf97d88bdf56dae32314eb32295c39a1e755cd7d1478bea8520b9ff21c39b683b92ae15568420c390c42b123b7010b134989c8368c7f831f9dd9f9a890e2c1435681107414f2e8637153bbf6a0000000000000000000000000000000017eccd446f10018219a1bd111b8786cf9febd49f9e7e754e82dd155ead59b819f0f20e42f4635d5044ec5d550d847623000000000000000000000000000000000403969d2b8f914ff2ea3bf902782642e2c6157bd2a343acf60ff9125b48b558d990a74c6d4d6398e7a3cc2a16037346000000000000000000000000000000000bd45f61f142bd78619fb520715320eb5e6ebafa8b078ce796ba62fe1a549d5fb9df57e92d8d2795988eb6ae18cf9d9300000000000000000000000000000000097db1314e064b8e670ec286958f17065bce644cf240ab1b1b220504560d36a0b43fc18453ff3a2bb315e219965f5bd394c68bc8d91ac8c489ee87dbfc4b94c93c8bbd5fc04c27db8b02303f3a65905400000000000000000000000000000000018244ab39a716e252cbfb986c7958b371e29ea9190010d1f5e1cfdb6ce4822d4055c37cd411fc9a0c46d728f2c13ecf0000000000000000000000000000000001985d3c667c8d68c9adb92bdc7a8af959c17146544997d97116120a0f55366bd7ad7ffa28d93ee51222ff9222779675000000000000000000000000000000000c70fd4e3c8f2a451f83fb6c046431b38251b7bae44cf8d36df69a03e2d3ce6137498523fcf0bcf29b5d69e8f265e24d00000000000000000000000000000000047b9163a218f7654a72e0d7c651a2cf7fd95e9784a59e0bf119d081de6c0465d374a55fbc1eff9828c9fd29abf4c4bdb3682accc3939283b870357cf83683350baf73aa0d3d68bda82a0f6ae7e51746,,,invalid input parameters, invalid input length for G1 multiplication -,,,invalid input parameters, Invalid number of pairs -00000000000000000000000000000000039b10ccd664da6f273ea134bb55ee48f09ba585a7e2bb95b5aec610631ac49810d5d616f67ba0147e6d1be476ea220f0000000000000000000000000000000000fbcdff4e48e07d1f73ec42fe7eb026f5c30407cfd2f22bbbfe5b2a09e8a7bb4884178cb6afd1c95f80e646929d30040000000000000000000000000000000001ed3b0e71acb0adbf44643374edbf4405af87cfc0507db7e8978889c6c3afbe9754d1182e98ac3060d64994d31ef576000000000000000000000000000000001681a2bf65b83be5a2ca50430949b6e2a099977482e9405b593f34d2ed877a3f0d1bddc37d0cec4d59d7df74b2b8f2dfb3c940fe79b6966489b527955de7599194a9ac69a6ff58b8d99e7b1084f0464e0000000000000000000000000000000018c0ada6351b70661f053365deae56910798bd2ace6e2bf6ba4192d1a229967f6af6ca1c9a8a11ebc0a232344ee0f6d6000000000000000000000000000000000cc70a587f4652039d8117b6103858adcd9728f6aebe230578389a62da0042b7623b1c0436734f463cfdd187d20903240000000000000000000000000000000009f50bd7beedb23328818f9ffdafdb6da6a4dd80c5a9048ab8b154df3cad938ccede829f1156f769d9e149791e8e0cd900000000000000000000000000000000079ba50d2511631b20b6d6f3841e616e9d11b68ec3368cd60129d9d4787ab56c4e9145a38927e51c9cd6271d493d93884d0e25bf3f6fc9f4da25d21fdc71773f1947b7a8a775b8177f7eca990b05b71d0000000000000000000000000000000003632695b09dbf86163909d2bb25995b36ad1d137cf252860fd4bb6c95749e19eb0c1383e9d2f93f2791cb0cf6c8ed9d000000000000000000000000000000001688a855609b0bbff4452d146396558ff18777f329fd4f76a96859dabfc6a6f6977c2496280dbe3b1f8923990c1d6407000000000000000000000000000000000c8567fee05d05af279adc67179468a29d7520b067dbb348ee315a99504f70a206538b81a457cce855f4851ad48b7e80000000000000000000000000000000001238dcdfa80ea46e1500026ea5feadb421de4409f4992ffbf5ae59fa67fd82f38452642a50261b849e74b4a33eed70cc973f40c12c92b703d7b7848ef8b4466d40823aad3943a312b57432b91ff68be1000000000000000000000000000000000149704960cccf9d5ea414c73871e896b1d4cf0a946b0db72f5f2c5df98d2ec4f3adbbc14c78047961bc9620cb6cfb5900000000000000000000000000000000140c5d25e534fb1bfdc19ba4cecaabe619f6e0cd3d60b0f17dafd7bcd27b286d4f4477d00c5e1af22ee1a0c67fbf177c00000000000000000000000000000000029a1727041590b8459890de736df15c00d80ab007c3aee692ddcdf75790c9806d198e9f4502bec2f0a623491c3f877d0000000000000000000000000000000008a94c98baa9409151030d4fae2bd4a64c6f11ea3c99b9661fdaed226b9a7c2a7d609be34afda5d18b8911b6e015bf494c51f97bcdda93904ae26991b471e9ea942e2b5b8ed26055da11c58bc7b5002a000000000000000000000000000000001156d478661337478ab0cbc877a99d9e4d9824a2b3f605d41404d6b557b3ffabbf42635b0bbcb854cf9ed8b8637561a8000000000000000000000000000000001147ed317d5642e699787a7b47e6795c9a8943a34a694007e44f8654ba96390cf19f010dcf695e22c21874022c6ce291000000000000000000000000000000000c6dccdf920fd5e7fae284115511952633744c6ad94120d9cae6acda8a7c23c48bd912cba6c38de5159587e1e6cad519000000000000000000000000000000001944227d462bc2e5dcc6f6db0f83dad411ba8895262836f975b2b91e06fd0e2138862162acc04e9e65050b34ccbd1a4e8964d5867927bc3e35a0b4c457482373969bff5edff8a781d65573e07fd87b890000000000000000000000000000000019c31e3ab8cc9c920aa8f56371f133b6cb8d7b0b74b23c0c7201aca79e5ae69dc01f1f74d2492dcb081895b17d106b4e000000000000000000000000000000001789b0d371bd63077ccde3dbbebf3531368feb775bced187fb31cc6821481664600978e323ff21085b8c08e0f21daf72000000000000000000000000000000000009eacfe8f4a2a9bae6573424d07f42bd6af8a9d55f71476a7e3c7a4b2b898550c1e72ec13afd4eff22421a03af1d31000000000000000000000000000000000410bd4ea74dcfa33f2976aa1b571c67cbb596ab10f76a8aaf4548f1097e55b3373bff02683f806cb84e1e0e877819e2787c38b944eadbd03fd3187f450571740f6cd00e5b2e560165846eb800e5c94400000000000000000000000000000000147f09986691f2e57073378e8bfd58804241eed7934f6adfe6d0a6bac4da0b738495778a303e52113e1c80e698476d50000000000000000000000000000000000762348b84c92a8ca6de319cf1f8f11db296a71b90fe13e1e4bcd25903829c00a5d2ad4b1c8d98c37eaad7e042ab023d0000000000000000000000000000000011d1d94530d4a2daf0e902a5c3382cd135938557f94b04bccea5e16ea089c5e020e13524c854a316662bd68784fe31f300000000000000000000000000000000070828522bec75b6a492fd9bca7b54dac6fbbf4f0bc3179d312bb65c647439e3868e4d5b21af5a64c93aeee8a9b7e46eaaee7ae2a237e8e53560c79e7baa9adf9c00a0ea4d6f514e7a6832eb15cef1e1000000000000000000000000000000000690a0869204c8dced5ba0ce13554b2703a3f18afb8fa8fa1c457d79c58fdc25471ae85bafad52e506fc1917fc3becff0000000000000000000000000000000010f7dbb16f8571ede1cec79e3f9ea03ae6468d7285984713f19607f5cab902b9a6b7cbcfd900be5c2e407cc093ea0e6700000000000000000000000000000000151caf87968433cb1f85fc1854c57049be22c26497a86bfbd66a2b3af121d894dba8004a17c6ff96a5843c2719fa32d10000000000000000000000000000000011f0270f2b039409f70392879bcc2c67c836c100cf9883d3dc48d7adbcd52037d270539e863a951acd47ecaa1ca4db12dac6ed3ef45c1d7d3028f0f89e5458797996d3294b95bebe049b76c7d0db317c0000000000000000000000000000000017fae043c8fd4c520a90d4a6bd95f5b0484acc279b899e7b1d8f7f7831cc6ba37cd5965c4dc674768f5805842d433af30000000000000000000000000000000008ddd7b41b8fa4d29fb931830f29b46f4015ec202d51cb969d7c832aafc0995c875cd45eff4a083e2d5ecb5ad185b64f0000000000000000000000000000000015d384ab7e52420b83a69827257cb52b00f0199ed2240a142812b46cf67e92b99942ac59fb9f9efd7dd822f5a36c799f00000000000000000000000000000000074b3a16a9cc4be9da0ac8e2e7003d9c1ec89244d2c33441b31af76716cce439f805843a9a44701203231efdca551d5bbb30985756c3ca075114c92f231575d6befafe4084517f1166a47376867bd108000000000000000000000000000000000e25365988664e8b6ade2e5a40da49c11ff1e084cc0f8dca51f0d0578555d39e3617c8cadb2abc2633b28c5895ab0a9e00000000000000000000000000000000169f5fd768152169c403475dee475576fd2cc3788179453b0039ff3cb1b7a5a0fff8f82d03f56e65cad579218486c3b600000000000000000000000000000000087ccd7f92032febc1f75c7115111ede4acbb2e429cbccf3959524d0b79c449d431ff65485e1aecb442b53fec80ecb4000000000000000000000000000000000135d63f264360003b2eb28f126c6621a40088c6eb15acc4aea89d6068e9d5a47f842aa4b4300f5cda5cc5831edb81596fb730105809f64ea522983d6bbb62f7e2e8cbf702685e9be10e2ef71f818767200000000000000000000000000000000159da74f15e4c614b418997f81a1b8a3d9eb8dd80d94b5bad664bff271bb0f2d8f3c4ceb947dc6300d5003a2f7d7a829000000000000000000000000000000000cdd4d1d4666f385dd54052cf5c1966328403251bebb29f0d553a9a96b5ade350c8493270e9b5282d8a06f9fa8d7b1d900000000000000000000000000000000189f8d3c94fdaa72cc67a7f93d35f91e22206ff9e97eed9601196c28d45b69c802ae92bcbf582754717b0355e08d37c000000000000000000000000000000000054b0a282610f108fc7f6736b8c22c8778d082bf4b0d0abca5a228198eba6a868910dd5c5c440036968e977955054196b6a9408625b0ca8fcbfb21d34eec2d8e24e9a30d2d3b32d7a37d110b13afbfea000000000000000000000000000000000f29b0d2b6e3466668e1328048e8dbc782c1111ab8cbe718c85d58ded992d97ca8ba20b9d048feb6ed0aa1b4139d02d3000000000000000000000000000000000d1f0dae940b99fbfc6e4a58480cac8c4e6b2fe33ce6f39c7ac1671046ce94d9e16cba2bb62c6749ef73d45bea21501a000000000000000000000000000000001902ccece1c0c763fd06934a76d1f2f056563ae6d8592bafd589cfebd6f057726fd908614ccd6518a21c66ecc2f78b660000000000000000000000000000000017f6b113f8872c3187d20b0c765d73b850b54244a719cf461fb318796c0b8f310b5490959f9d9187f99c8ed3e25e42a93b77283d0a7bb9e17a27e66851792fdd605cc0a339028b8985390fd024374c76000000000000000000000000000000000576b8cf1e69efdc277465c344cadf7f8cceffacbeca83821f3ff81717308b97f4ac046f1926e7c2eb42677d7afc257c000000000000000000000000000000000cc1524531e96f3c00e4250dd351aedb5a4c3184aff52ec8c13d470068f5967f3674fe173ee239933e67501a9decc6680000000000000000000000000000000001610cfcaea414c241b44cf6f3cc319dcb51d6b8de29c8a6869ff7c1ebb7b747d881e922b42e8fab96bde7cf23e8e4cd0000000000000000000000000000000017d4444dc8b6893b681cf10dac8169054f9d2f61d3dd5fd785ae7afa49d18ebbde9ce8dde5641adc6b38173173459836dd994eae929aee7428fdda2e44f8cb12b10b91c83b22abc8bbb561310b62257c000000000000000000000000000000000ca8f961f86ee6c46fc88fbbf721ba760186f13cd4cce743f19dc60a89fd985cb3feee34dcc4656735a326f515a729e400000000000000000000000000000000174baf466b809b1155d524050f7ee58c7c5cf728c674e0ce549f5551047a4479ca15bdf69b403b03fa74eb1b26bbff6c0000000000000000000000000000000000e8c8b587c171b1b292779abfef57202ed29e7fe94ade9634ec5a2b3b4692a4f3c15468e3f6418b144674be70780d5b000000000000000000000000000000001865e99cf97d88bdf56dae32314eb32295c39a1e755cd7d1478bea8520b9ff21c39b683b92ae15568420c390c42b123b7010b134989c8368c7f831f9dd9f9a890e2c1435681107414f2e8637153bbf6a0000000000000000000000000000000017eccd446f10018219a1bd111b8786cf9febd49f9e7e754e82dd155ead59b819f0f20e42f4635d5044ec5d550d847623000000000000000000000000000000000403969d2b8f914ff2ea3bf902782642e2c6157bd2a343acf60ff9125b48b558d990a74c6d4d6398e7a3cc2a16037346000000000000000000000000000000000bd45f61f142bd78619fb520715320eb5e6ebafa8b078ce796ba62fe1a549d5fb9df57e92d8d2795988eb6ae18cf9d9300000000000000000000000000000000097db1314e064b8e670ec286958f17065bce644cf240ab1b1b220504560d36a0b43fc18453ff3a2bb315e219965f5bd394c68bc8d91ac8c489ee87dbfc4b94c93c8bbd5fc04c27db8b02303f3a65905400000000000000000000000000000000018244ab39a716e252cbfb986c7958b371e29ea9190010d1f5e1cfdb6ce4822d4055c37cd411fc9a0c46d728f2c13ecf0000000000000000000000000000000001985d3c667c8d68c9adb92bdc7a8af959c17146544997d97116120a0f55366bd7ad7ffa28d93ee51222ff9222779675000000000000000000000000000000000c70fd4e3c8f2a451f83fb6c046431b38251b7bae44cf8d36df69a03e2d3ce6137498523fcf0bcf29b5d69e8f265e24d00000000000000000000000000000000047b9163a218f7654a72e0d7c651a2cf7fd95e9784a59e0bf119d081de6c0465d374a55fbc1eff9828c9fd29abf4c4bdb3682accc3939283b870357cf83683350baf73aa0d3d68bda82a0f6ae7e51746,,,invalid input parameters, Point is not on curve -00000000000000000000000000000000039b10ccd664da6f273ea134bb55ee48f09ba585a7e2bb95b5aec610631ac49810d5d616f67ba0147e6d1be476ea220e0000000000000000000000000000000000fbcdff4e48e07d1f73ec42fe7eb026f5c30407cfd2f22bbbfe5b2a09e8a7bb4884178cb6afd1c95f80e646929d30040000000000000000000000000000000001ed3b0e71acb0adbf44643374edbf4405af87cfc0507db7e8978889c6c3afbe9754d1182e98ac3060d64994d31ef576000000000000000000000000000000001681a2bf65b83be5a2ca50430949b6e2a099977482e9405b593f34d2ed877a3f0d1bddc37d0cec4d59d7df74b2b8f2dfb3c940fe79b6966489b527955de7599194a9ac69a6ff58b8d99e7b1084f0464e0000000000000000000000000000000018c0ada6351b70661f053365deae56910798bd2ace6e2bf6ba4192d1a229967f6af6ca1c9a8a11ebc0a232344ee0f6d6000000000000000000000000000000000cc70a587f4652039d8117b6103858adcd9728f6aebe230578389a62da0042b7623b1c0436734f463cfdd187d20903240000000000000000000000000000000009f50bd7beedb23328818f9ffdafdb6da6a4dd80c5a9048ab8b154df3cad938ccede829f1156f769d9e149791e8e0cd900000000000000000000000000000000079ba50d2511631b20b6d6f3841e616e9d11b68ec3368cd60129d9d4787ab56c4e9145a38927e51c9cd6271d493d93884d0e25bf3f6fc9f4da25d21fdc71773f1947b7a8a775b8177f7eca990b05b71d0000000000000000000000000000000003632695b09dbf86163909d2bb25995b36ad1d137cf252860fd4bb6c95749e19eb0c1383e9d2f93f2791cb0cf6c8ed9d000000000000000000000000000000001688a855609b0bbff4452d146396558ff18777f329fd4f76a96859dabfc6a6f6977c2496280dbe3b1f8923990c1d6407000000000000000000000000000000000c8567fee05d05af279adc67179468a29d7520b067dbb348ee315a99504f70a206538b81a457cce855f4851ad48b7e80000000000000000000000000000000001238dcdfa80ea46e1500026ea5feadb421de4409f4992ffbf5ae59fa67fd82f38452642a50261b849e74b4a33eed70cc973f40c12c92b703d7b7848ef8b4466d40823aad3943a312b57432b91ff68be1000000000000000000000000000000000149704960cccf9d5ea414c73871e896b1d4cf0a946b0db72f5f2c5df98d2ec4f3adbbc14c78047961bc9620cb6cfb5900000000000000000000000000000000140c5d25e534fb1bfdc19ba4cecaabe619f6e0cd3d60b0f17dafd7bcd27b286d4f4477d00c5e1af22ee1a0c67fbf177c00000000000000000000000000000000029a1727041590b8459890de736df15c00d80ab007c3aee692ddcdf75790c9806d198e9f4502bec2f0a623491c3f877d0000000000000000000000000000000008a94c98baa9409151030d4fae2bd4a64c6f11ea3c99b9661fdaed226b9a7c2a7d609be34afda5d18b8911b6e015bf494c51f97bcdda93904ae26991b471e9ea942e2b5b8ed26055da11c58bc7b5002a000000000000000000000000000000001156d478661337478ab0cbc877a99d9e4d9824a2b3f605d41404d6b557b3ffabbf42635b0bbcb854cf9ed8b8637561a8000000000000000000000000000000001147ed317d5642e699787a7b47e6795c9a8943a34a694007e44f8654ba96390cf19f010dcf695e22c21874022c6ce291000000000000000000000000000000000c6dccdf920fd5e7fae284115511952633744c6ad94120d9cae6acda8a7c23c48bd912cba6c38de5159587e1e6cad519000000000000000000000000000000001944227d462bc2e5dcc6f6db0f83dad411ba8895262836f975b2b91e06fd0e2138862162acc04e9e65050b34ccbd1a4e8964d5867927bc3e35a0b4c457482373969bff5edff8a781d65573e07fd87b890000000000000000000000000000000019c31e3ab8cc9c920aa8f56371f133b6cb8d7b0b74b23c0c7201aca79e5ae69dc01f1f74d2492dcb081895b17d106b4e000000000000000000000000000000001789b0d371bd63077ccde3dbbebf3531368feb775bced187fb31cc6821481664600978e323ff21085b8c08e0f21daf72000000000000000000000000000000000009eacfe8f4a2a9bae6573424d07f42bd6af8a9d55f71476a7e3c7a4b2b898550c1e72ec13afd4eff22421a03af1d31000000000000000000000000000000000410bd4ea74dcfa33f2976aa1b571c67cbb596ab10f76a8aaf4548f1097e55b3373bff02683f806cb84e1e0e877819e2787c38b944eadbd03fd3187f450571740f6cd00e5b2e560165846eb800e5c94400000000000000000000000000000000147f09986691f2e57073378e8bfd58804241eed7934f6adfe6d0a6bac4da0b738495778a303e52113e1c80e698476d50000000000000000000000000000000000762348b84c92a8ca6de319cf1f8f11db296a71b90fe13e1e4bcd25903829c00a5d2ad4b1c8d98c37eaad7e042ab023d0000000000000000000000000000000011d1d94530d4a2daf0e902a5c3382cd135938557f94b04bccea5e16ea089c5e020e13524c854a316662bd68784fe31f300000000000000000000000000000000070828522bec75b6a492fd9bca7b54dac6fbbf4f0bc3179d312bb65c647439e3868e4d5b21af5a64c93aeee8a9b7e46eaaee7ae2a237e8e53560c79e7baa9adf9c00a0ea4d6f514e7a6832eb15cef1e1000000000000000000000000000000000690a0869204c8dced5ba0ce13554b2703a3f18afb8fa8fa1c457d79c58fdc25471ae85bafad52e506fc1917fc3becff0000000000000000000000000000000010f7dbb16f8571ede1cec79e3f9ea03ae6468d7285984713f19607f5cab902b9a6b7cbcfd900be5c2e407cc093ea0e6700000000000000000000000000000000151caf87968433cb1f85fc1854c57049be22c26497a86bfbd66a2b3af121d894dba8004a17c6ff96a5843c2719fa32d10000000000000000000000000000000011f0270f2b039409f70392879bcc2c67c836c100cf9883d3dc48d7adbcd52037d270539e863a951acd47ecaa1ca4db12dac6ed3ef45c1d7d3028f0f89e5458797996d3294b95bebe049b76c7d0db317c0000000000000000000000000000000017fae043c8fd4c520a90d4a6bd95f5b0484acc279b899e7b1d8f7f7831cc6ba37cd5965c4dc674768f5805842d433af30000000000000000000000000000000008ddd7b41b8fa4d29fb931830f29b46f4015ec202d51cb969d7c832aafc0995c875cd45eff4a083e2d5ecb5ad185b64f0000000000000000000000000000000015d384ab7e52420b83a69827257cb52b00f0199ed2240a142812b46cf67e92b99942ac59fb9f9efd7dd822f5a36c799f00000000000000000000000000000000074b3a16a9cc4be9da0ac8e2e7003d9c1ec89244d2c33441b31af76716cce439f805843a9a44701203231efdca551d5bbb30985756c3ca075114c92f231575d6befafe4084517f1166a47376867bd108000000000000000000000000000000000e25365988664e8b6ade2e5a40da49c11ff1e084cc0f8dca51f0d0578555d39e3617c8cadb2abc2633b28c5895ab0a9e00000000000000000000000000000000169f5fd768152169c403475dee475576fd2cc3788179453b0039ff3cb1b7a5a0fff8f82d03f56e65cad579218486c3b600000000000000000000000000000000087ccd7f92032febc1f75c7115111ede4acbb2e429cbccf3959524d0b79c449d431ff65485e1aecb442b53fec80ecb4000000000000000000000000000000000135d63f264360003b2eb28f126c6621a40088c6eb15acc4aea89d6068e9d5a47f842aa4b4300f5cda5cc5831edb81596fb730105809f64ea522983d6bbb62f7e2e8cbf702685e9be10e2ef71f818767200000000000000000000000000000000159da74f15e4c614b418997f81a1b8a3d9eb8dd80d94b5bad664bff271bb0f2d8f3c4ceb947dc6300d5003a2f7d7a829000000000000000000000000000000000cdd4d1d4666f385dd54052cf5c1966328403251bebb29f0d553a9a96b5ade350c8493270e9b5282d8a06f9fa8d7b1d900000000000000000000000000000000189f8d3c94fdaa72cc67a7f93d35f91e22206ff9e97eed9601196c28d45b69c802ae92bcbf582754717b0355e08d37c000000000000000000000000000000000054b0a282610f108fc7f6736b8c22c8778d082bf4b0d0abca5a228198eba6a868910dd5c5c440036968e977955054196b6a9408625b0ca8fcbfb21d34eec2d8e24e9a30d2d3b32d7a37d110b13afbfea000000000000000000000000000000000f29b0d2b6e3466668e1328048e8dbc782c1111ab8cbe718c85d58ded992d97ca8ba20b9d048feb6ed0aa1b4139d02d3000000000000000000000000000000000d1f0dae940b99fbfc6e4a58480cac8c4e6b2fe33ce6f39c7ac1671046ce94d9e16cba2bb62c6749ef73d45bea21501a000000000000000000000000000000001902ccece1c0c763fd06934a76d1f2f056563ae6d8592bafd589cfebd6f057726fd908614ccd6518a21c66ecc2f78b660000000000000000000000000000000017f6b113f8872c3187d20b0c765d73b850b54244a719cf461fb318796c0b8f310b5490959f9d9187f99c8ed3e25e42a93b77283d0a7bb9e17a27e66851792fdd605cc0a339028b8985390fd024374c76000000000000000000000000000000000576b8cf1e69efdc277465c344cadf7f8cceffacbeca83821f3ff81717308b97f4ac046f1926e7c2eb42677d7afc257c000000000000000000000000000000000cc1524531e96f3c00e4250dd351aedb5a4c3184aff52ec8c13d470068f5967f3674fe173ee239933e67501a9decc6680000000000000000000000000000000001610cfcaea414c241b44cf6f3cc319dcb51d6b8de29c8a6869ff7c1ebb7b747d881e922b42e8fab96bde7cf23e8e4cd0000000000000000000000000000000017d4444dc8b6893b681cf10dac8169054f9d2f61d3dd5fd785ae7afa49d18ebbde9ce8dde5641adc6b38173173459836dd994eae929aee7428fdda2e44f8cb12b10b91c83b22abc8bbb561310b62257c000000000000000000000000000000000ca8f961f86ee6c46fc88fbbf721ba760186f13cd4cce743f19dc60a89fd985cb3feee34dcc4656735a326f515a729e400000000000000000000000000000000174baf466b809b1155d524050f7ee58c7c5cf728c674e0ce549f5551047a4479ca15bdf69b403b03fa74eb1b26bbff6c0000000000000000000000000000000000e8c8b587c171b1b292779abfef57202ed29e7fe94ade9634ec5a2b3b4692a4f3c15468e3f6418b144674be70780d5b000000000000000000000000000000001865e99cf97d88bdf56dae32314eb32295c39a1e755cd7d1478bea8520b9ff21c39b683b92ae15568420c390c42b123b7010b134989c8368c7f831f9dd9f9a890e2c1435681107414f2e8637153bbf6a0000000000000000000000000000000017eccd446f10018219a1bd111b8786cf9febd49f9e7e754e82dd155ead59b819f0f20e42f4635d5044ec5d550d847623000000000000000000000000000000000403969d2b8f914ff2ea3bf902782642e2c6157bd2a343acf60ff9125b48b558d990a74c6d4d6398e7a3cc2a16037346000000000000000000000000000000000bd45f61f142bd78619fb520715320eb5e6ebafa8b078ce796ba62fe1a549d5fb9df57e92d8d2795988eb6ae18cf9d9300000000000000000000000000000000097db1314e064b8e670ec286958f17065bce644cf240ab1b1b220504560d36a0b43fc18453ff3a2bb315e219965f5bd394c68bc8d91ac8c489ee87dbfc4b94c93c8bbd5fc04c27db8b02303f3a65905400000000000000000000000000000000018244ab39a716e252cbfb986c7958b371e29ea9190010d1f5e1cfdb6ce4822d4055c37cd411fc9a0c46d728f2c13ed00000000000000000000000000000000001985d3c667c8d68c9adb92bdc7a8af959c17146544997d97116120a0f55366bd7ad7ffa28d93ee51222ff9222779675000000000000000000000000000000000c70fd4e3c8f2a451f83fb6c046431b38251b7bae44cf8d36df69a03e2d3ce6137498523fcf0bcf29b5d69e8f265e24d00000000000000000000000000000000047b9163a218f7654a72e0d7c651a2cf7fd95e9784a59e0bf119d081de6c0465d374a55fbc1eff9828c9fd29abf4c4bdb3682accc3939283b870357cf83683350baf73aa0d3d68bda82a0f6ae7e51746,,,invalid input parameters, Point is not on curve -00000000000000000000000000000000197bfd0342bbc8bee2beced2f173e1a87be576379b343e93232d6cef98d84b1d696e5612ff283ce2cfdccb2cfb65fa0c00000000000000000000000000000000184e811f55e6f9d84d77d2f79102fd7ea7422f4759df5bf7f6331d550245e3f1bcf6a30e3b29110d85e0ca16f9f6ae7a000000000000000000000000000000000f10e1eb3c1e53d2ad9cf2d398b2dc22c5842fab0a74b174f691a7e914975da3564d835cd7d2982815b8ac57f507348f000000000000000000000000000000000767d1c453890f1b9110fda82f5815c27281aba3f026ee868e4176a0654feea41a96575e0c4d58a14dbfbcc05b5010b1000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000103121a2ceaae586d240843a398967325f8eb5a93e8fea99b62b9f88d8556c80dd726a4b30e84a36eeabaf3592937f2700000000000000000000000000000000086b990f3da2aeac0a36143b7d7c824428215140db1bb859338764cb58458f081d92664f9053b50b3fbd2e4723121b68000000000000000000000000000000000f9e7ba9a86a8f7624aa2b42dcc8772e1af4ae115685e60abc2c9b90242167acef3d0be4050bf935eed7c3b6fc7ba77e000000000000000000000000000000000d22c3652d0dc6f0fc9316e14268477c2049ef772e852108d269d9c38dba1d4802e8dae479818184c08f9a569d8784510000000000000000000000000000000000000000000000000000000000000002,,,Point is not in the expected subgroup +000000000000000000000000000000039b10ccd664da6f273ea134bb55ee48f09ba585a7e2bb95b5aec610631ac49810d5d616f67ba0147e6d1be476ea220e0000000000000000000000000000000000fbcdff4e48e07d1f73ec42fe7eb026f5c30407cfd2f22bbbfe5b2a09e8a7bb4884178cb6afd1c95f80e646929d30040000000000000000000000000000000001ed3b0e71acb0adbf44643374edbf4405af87cfc0507db7e8978889c6c3afbe9754d1182e98ac3060d64994d31ef576000000000000000000000000000000001681a2bf65b83be5a2ca50430949b6e2a099977482e9405b593f34d2ed877a3f0d1bddc37d0cec4d59d7df74b2b8f2dfb3c940fe79b6966489b527955de7599194a9ac69a6ff58b8d99e7b1084f0464e0000000000000000000000000000000018c0ada6351b70661f053365deae56910798bd2ace6e2bf6ba4192d1a229967f6af6ca1c9a8a11ebc0a232344ee0f6d6000000000000000000000000000000000cc70a587f4652039d8117b6103858adcd9728f6aebe230578389a62da0042b7623b1c0436734f463cfdd187d20903240000000000000000000000000000000009f50bd7beedb23328818f9ffdafdb6da6a4dd80c5a9048ab8b154df3cad938ccede829f1156f769d9e149791e8e0cd900000000000000000000000000000000079ba50d2511631b20b6d6f3841e616e9d11b68ec3368cd60129d9d4787ab56c4e9145a38927e51c9cd6271d493d93884d0e25bf3f6fc9f4da25d21fdc71773f1947b7a8a775b8177f7eca990b05b71d0000000000000000000000000000000003632695b09dbf86163909d2bb25995b36ad1d137cf252860fd4bb6c95749e19eb0c1383e9d2f93f2791cb0cf6c8ed9d000000000000000000000000000000001688a855609b0bbff4452d146396558ff18777f329fd4f76a96859dabfc6a6f6977c2496280dbe3b1f8923990c1d6407000000000000000000000000000000000c8567fee05d05af279adc67179468a29d7520b067dbb348ee315a99504f70a206538b81a457cce855f4851ad48b7e80000000000000000000000000000000001238dcdfa80ea46e1500026ea5feadb421de4409f4992ffbf5ae59fa67fd82f38452642a50261b849e74b4a33eed70cc973f40c12c92b703d7b7848ef8b4466d40823aad3943a312b57432b91ff68be1000000000000000000000000000000000149704960cccf9d5ea414c73871e896b1d4cf0a946b0db72f5f2c5df98d2ec4f3adbbc14c78047961bc9620cb6cfb5900000000000000000000000000000000140c5d25e534fb1bfdc19ba4cecaabe619f6e0cd3d60b0f17dafd7bcd27b286d4f4477d00c5e1af22ee1a0c67fbf177c00000000000000000000000000000000029a1727041590b8459890de736df15c00d80ab007c3aee692ddcdf75790c9806d198e9f4502bec2f0a623491c3f877d0000000000000000000000000000000008a94c98baa9409151030d4fae2bd4a64c6f11ea3c99b9661fdaed226b9a7c2a7d609be34afda5d18b8911b6e015bf494c51f97bcdda93904ae26991b471e9ea942e2b5b8ed26055da11c58bc7b5002a000000000000000000000000000000001156d478661337478ab0cbc877a99d9e4d9824a2b3f605d41404d6b557b3ffabbf42635b0bbcb854cf9ed8b8637561a8000000000000000000000000000000001147ed317d5642e699787a7b47e6795c9a8943a34a694007e44f8654ba96390cf19f010dcf695e22c21874022c6ce291000000000000000000000000000000000c6dccdf920fd5e7fae284115511952633744c6ad94120d9cae6acda8a7c23c48bd912cba6c38de5159587e1e6cad519000000000000000000000000000000001944227d462bc2e5dcc6f6db0f83dad411ba8895262836f975b2b91e06fd0e2138862162acc04e9e65050b34ccbd1a4e8964d5867927bc3e35a0b4c457482373969bff5edff8a781d65573e07fd87b890000000000000000000000000000000019c31e3ab8cc9c920aa8f56371f133b6cb8d7b0b74b23c0c7201aca79e5ae69dc01f1f74d2492dcb081895b17d106b4e000000000000000000000000000000001789b0d371bd63077ccde3dbbebf3531368feb775bced187fb31cc6821481664600978e323ff21085b8c08e0f21daf72000000000000000000000000000000000009eacfe8f4a2a9bae6573424d07f42bd6af8a9d55f71476a7e3c7a4b2b898550c1e72ec13afd4eff22421a03af1d31000000000000000000000000000000000410bd4ea74dcfa33f2976aa1b571c67cbb596ab10f76a8aaf4548f1097e55b3373bff02683f806cb84e1e0e877819e2787c38b944eadbd03fd3187f450571740f6cd00e5b2e560165846eb800e5c94400000000000000000000000000000000147f09986691f2e57073378e8bfd58804241eed7934f6adfe6d0a6bac4da0b738495778a303e52113e1c80e698476d50000000000000000000000000000000000762348b84c92a8ca6de319cf1f8f11db296a71b90fe13e1e4bcd25903829c00a5d2ad4b1c8d98c37eaad7e042ab023d0000000000000000000000000000000011d1d94530d4a2daf0e902a5c3382cd135938557f94b04bccea5e16ea089c5e020e13524c854a316662bd68784fe31f300000000000000000000000000000000070828522bec75b6a492fd9bca7b54dac6fbbf4f0bc3179d312bb65c647439e3868e4d5b21af5a64c93aeee8a9b7e46eaaee7ae2a237e8e53560c79e7baa9adf9c00a0ea4d6f514e7a6832eb15cef1e1000000000000000000000000000000000690a0869204c8dced5ba0ce13554b2703a3f18afb8fa8fa1c457d79c58fdc25471ae85bafad52e506fc1917fc3becff0000000000000000000000000000000010f7dbb16f8571ede1cec79e3f9ea03ae6468d7285984713f19607f5cab902b9a6b7cbcfd900be5c2e407cc093ea0e6700000000000000000000000000000000151caf87968433cb1f85fc1854c57049be22c26497a86bfbd66a2b3af121d894dba8004a17c6ff96a5843c2719fa32d10000000000000000000000000000000011f0270f2b039409f70392879bcc2c67c836c100cf9883d3dc48d7adbcd52037d270539e863a951acd47ecaa1ca4db12dac6ed3ef45c1d7d3028f0f89e5458797996d3294b95bebe049b76c7d0db317c0000000000000000000000000000000017fae043c8fd4c520a90d4a6bd95f5b0484acc279b899e7b1d8f7f7831cc6ba37cd5965c4dc674768f5805842d433af30000000000000000000000000000000008ddd7b41b8fa4d29fb931830f29b46f4015ec202d51cb969d7c832aafc0995c875cd45eff4a083e2d5ecb5ad185b64f0000000000000000000000000000000015d384ab7e52420b83a69827257cb52b00f0199ed2240a142812b46cf67e92b99942ac59fb9f9efd7dd822f5a36c799f00000000000000000000000000000000074b3a16a9cc4be9da0ac8e2e7003d9c1ec89244d2c33441b31af76716cce439f805843a9a44701203231efdca551d5bbb30985756c3ca075114c92f231575d6befafe4084517f1166a47376867bd108000000000000000000000000000000000e25365988664e8b6ade2e5a40da49c11ff1e084cc0f8dca51f0d0578555d39e3617c8cadb2abc2633b28c5895ab0a9e00000000000000000000000000000000169f5fd768152169c403475dee475576fd2cc3788179453b0039ff3cb1b7a5a0fff8f82d03f56e65cad579218486c3b600000000000000000000000000000000087ccd7f92032febc1f75c7115111ede4acbb2e429cbccf3959524d0b79c449d431ff65485e1aecb442b53fec80ecb4000000000000000000000000000000000135d63f264360003b2eb28f126c6621a40088c6eb15acc4aea89d6068e9d5a47f842aa4b4300f5cda5cc5831edb81596fb730105809f64ea522983d6bbb62f7e2e8cbf702685e9be10e2ef71f818767200000000000000000000000000000000159da74f15e4c614b418997f81a1b8a3d9eb8dd80d94b5bad664bff271bb0f2d8f3c4ceb947dc6300d5003a2f7d7a829000000000000000000000000000000000cdd4d1d4666f385dd54052cf5c1966328403251bebb29f0d553a9a96b5ade350c8493270e9b5282d8a06f9fa8d7b1d900000000000000000000000000000000189f8d3c94fdaa72cc67a7f93d35f91e22206ff9e97eed9601196c28d45b69c802ae92bcbf582754717b0355e08d37c000000000000000000000000000000000054b0a282610f108fc7f6736b8c22c8778d082bf4b0d0abca5a228198eba6a868910dd5c5c440036968e977955054196b6a9408625b0ca8fcbfb21d34eec2d8e24e9a30d2d3b32d7a37d110b13afbfea000000000000000000000000000000000f29b0d2b6e3466668e1328048e8dbc782c1111ab8cbe718c85d58ded992d97ca8ba20b9d048feb6ed0aa1b4139d02d3000000000000000000000000000000000d1f0dae940b99fbfc6e4a58480cac8c4e6b2fe33ce6f39c7ac1671046ce94d9e16cba2bb62c6749ef73d45bea21501a000000000000000000000000000000001902ccece1c0c763fd06934a76d1f2f056563ae6d8592bafd589cfebd6f057726fd908614ccd6518a21c66ecc2f78b660000000000000000000000000000000017f6b113f8872c3187d20b0c765d73b850b54244a719cf461fb318796c0b8f310b5490959f9d9187f99c8ed3e25e42a93b77283d0a7bb9e17a27e66851792fdd605cc0a339028b8985390fd024374c76000000000000000000000000000000000576b8cf1e69efdc277465c344cadf7f8cceffacbeca83821f3ff81717308b97f4ac046f1926e7c2eb42677d7afc257c000000000000000000000000000000000cc1524531e96f3c00e4250dd351aedb5a4c3184aff52ec8c13d470068f5967f3674fe173ee239933e67501a9decc6680000000000000000000000000000000001610cfcaea414c241b44cf6f3cc319dcb51d6b8de29c8a6869ff7c1ebb7b747d881e922b42e8fab96bde7cf23e8e4cd0000000000000000000000000000000017d4444dc8b6893b681cf10dac8169054f9d2f61d3dd5fd785ae7afa49d18ebbde9ce8dde5641adc6b38173173459836dd994eae929aee7428fdda2e44f8cb12b10b91c83b22abc8bbb561310b62257c000000000000000000000000000000000ca8f961f86ee6c46fc88fbbf721ba760186f13cd4cce743f19dc60a89fd985cb3feee34dcc4656735a326f515a729e400000000000000000000000000000000174baf466b809b1155d524050f7ee58c7c5cf728c674e0ce549f5551047a4479ca15bdf69b403b03fa74eb1b26bbff6c0000000000000000000000000000000000e8c8b587c171b1b292779abfef57202ed29e7fe94ade9634ec5a2b3b4692a4f3c15468e3f6418b144674be70780d5b000000000000000000000000000000001865e99cf97d88bdf56dae32314eb32295c39a1e755cd7d1478bea8520b9ff21c39b683b92ae15568420c390c42b123b7010b134989c8368c7f831f9dd9f9a890e2c1435681107414f2e8637153bbf6a0000000000000000000000000000000017eccd446f10018219a1bd111b8786cf9febd49f9e7e754e82dd155ead59b819f0f20e42f4635d5044ec5d550d847623000000000000000000000000000000000403969d2b8f914ff2ea3bf902782642e2c6157bd2a343acf60ff9125b48b558d990a74c6d4d6398e7a3cc2a16037346000000000000000000000000000000000bd45f61f142bd78619fb520715320eb5e6ebafa8b078ce796ba62fe1a549d5fb9df57e92d8d2795988eb6ae18cf9d9300000000000000000000000000000000097db1314e064b8e670ec286958f17065bce644cf240ab1b1b220504560d36a0b43fc18453ff3a2bb315e219965f5bd394c68bc8d91ac8c489ee87dbfc4b94c93c8bbd5fc04c27db8b02303f3a65905400000000000000000000000000000000018244ab39a716e252cbfb986c7958b371e29ea9190010d1f5e1cfdb6ce4822d4055c37cd411fc9a0c46d728f2c13ecf0000000000000000000000000000000001985d3c667c8d68c9adb92bdc7a8af959c17146544997d97116120a0f55366bd7ad7ffa28d93ee51222ff9222779675000000000000000000000000000000000c70fd4e3c8f2a451f83fb6c046431b38251b7bae44cf8d36df69a03e2d3ce6137498523fcf0bcf29b5d69e8f265e24d00000000000000000000000000000000047b9163a218f7654a72e0d7c651a2cf7fd95e9784a59e0bf119d081de6c0465d374a55fbc1eff9828c9fd29abf4c4bdb3682accc3939283b870357cf83683350baf73aa0d3d68bda82a0f6ae7e51746,,,invalid input parameters, invalid input length for G2 multiplication +0000000000000000000000000000000000039b10ccd664da6f273ea134bb55ee48f09ba585a7e2bb95b5aec610631ac49810d5d616f67ba0147e6d1be476ea220e0000000000000000000000000000000000fbcdff4e48e07d1f73ec42fe7eb026f5c30407cfd2f22bbbfe5b2a09e8a7bb4884178cb6afd1c95f80e646929d30040000000000000000000000000000000001ed3b0e71acb0adbf44643374edbf4405af87cfc0507db7e8978889c6c3afbe9754d1182e98ac3060d64994d31ef576000000000000000000000000000000001681a2bf65b83be5a2ca50430949b6e2a099977482e9405b593f34d2ed877a3f0d1bddc37d0cec4d59d7df74b2b8f2dfb3c940fe79b6966489b527955de7599194a9ac69a6ff58b8d99e7b1084f0464e0000000000000000000000000000000018c0ada6351b70661f053365deae56910798bd2ace6e2bf6ba4192d1a229967f6af6ca1c9a8a11ebc0a232344ee0f6d6000000000000000000000000000000000cc70a587f4652039d8117b6103858adcd9728f6aebe230578389a62da0042b7623b1c0436734f463cfdd187d20903240000000000000000000000000000000009f50bd7beedb23328818f9ffdafdb6da6a4dd80c5a9048ab8b154df3cad938ccede829f1156f769d9e149791e8e0cd900000000000000000000000000000000079ba50d2511631b20b6d6f3841e616e9d11b68ec3368cd60129d9d4787ab56c4e9145a38927e51c9cd6271d493d93884d0e25bf3f6fc9f4da25d21fdc71773f1947b7a8a775b8177f7eca990b05b71d0000000000000000000000000000000003632695b09dbf86163909d2bb25995b36ad1d137cf252860fd4bb6c95749e19eb0c1383e9d2f93f2791cb0cf6c8ed9d000000000000000000000000000000001688a855609b0bbff4452d146396558ff18777f329fd4f76a96859dabfc6a6f6977c2496280dbe3b1f8923990c1d6407000000000000000000000000000000000c8567fee05d05af279adc67179468a29d7520b067dbb348ee315a99504f70a206538b81a457cce855f4851ad48b7e80000000000000000000000000000000001238dcdfa80ea46e1500026ea5feadb421de4409f4992ffbf5ae59fa67fd82f38452642a50261b849e74b4a33eed70cc973f40c12c92b703d7b7848ef8b4466d40823aad3943a312b57432b91ff68be1000000000000000000000000000000000149704960cccf9d5ea414c73871e896b1d4cf0a946b0db72f5f2c5df98d2ec4f3adbbc14c78047961bc9620cb6cfb5900000000000000000000000000000000140c5d25e534fb1bfdc19ba4cecaabe619f6e0cd3d60b0f17dafd7bcd27b286d4f4477d00c5e1af22ee1a0c67fbf177c00000000000000000000000000000000029a1727041590b8459890de736df15c00d80ab007c3aee692ddcdf75790c9806d198e9f4502bec2f0a623491c3f877d0000000000000000000000000000000008a94c98baa9409151030d4fae2bd4a64c6f11ea3c99b9661fdaed226b9a7c2a7d609be34afda5d18b8911b6e015bf494c51f97bcdda93904ae26991b471e9ea942e2b5b8ed26055da11c58bc7b5002a000000000000000000000000000000001156d478661337478ab0cbc877a99d9e4d9824a2b3f605d41404d6b557b3ffabbf42635b0bbcb854cf9ed8b8637561a8000000000000000000000000000000001147ed317d5642e699787a7b47e6795c9a8943a34a694007e44f8654ba96390cf19f010dcf695e22c21874022c6ce291000000000000000000000000000000000c6dccdf920fd5e7fae284115511952633744c6ad94120d9cae6acda8a7c23c48bd912cba6c38de5159587e1e6cad519000000000000000000000000000000001944227d462bc2e5dcc6f6db0f83dad411ba8895262836f975b2b91e06fd0e2138862162acc04e9e65050b34ccbd1a4e8964d5867927bc3e35a0b4c457482373969bff5edff8a781d65573e07fd87b890000000000000000000000000000000019c31e3ab8cc9c920aa8f56371f133b6cb8d7b0b74b23c0c7201aca79e5ae69dc01f1f74d2492dcb081895b17d106b4e000000000000000000000000000000001789b0d371bd63077ccde3dbbebf3531368feb775bced187fb31cc6821481664600978e323ff21085b8c08e0f21daf72000000000000000000000000000000000009eacfe8f4a2a9bae6573424d07f42bd6af8a9d55f71476a7e3c7a4b2b898550c1e72ec13afd4eff22421a03af1d31000000000000000000000000000000000410bd4ea74dcfa33f2976aa1b571c67cbb596ab10f76a8aaf4548f1097e55b3373bff02683f806cb84e1e0e877819e2787c38b944eadbd03fd3187f450571740f6cd00e5b2e560165846eb800e5c94400000000000000000000000000000000147f09986691f2e57073378e8bfd58804241eed7934f6adfe6d0a6bac4da0b738495778a303e52113e1c80e698476d50000000000000000000000000000000000762348b84c92a8ca6de319cf1f8f11db296a71b90fe13e1e4bcd25903829c00a5d2ad4b1c8d98c37eaad7e042ab023d0000000000000000000000000000000011d1d94530d4a2daf0e902a5c3382cd135938557f94b04bccea5e16ea089c5e020e13524c854a316662bd68784fe31f300000000000000000000000000000000070828522bec75b6a492fd9bca7b54dac6fbbf4f0bc3179d312bb65c647439e3868e4d5b21af5a64c93aeee8a9b7e46eaaee7ae2a237e8e53560c79e7baa9adf9c00a0ea4d6f514e7a6832eb15cef1e1000000000000000000000000000000000690a0869204c8dced5ba0ce13554b2703a3f18afb8fa8fa1c457d79c58fdc25471ae85bafad52e506fc1917fc3becff0000000000000000000000000000000010f7dbb16f8571ede1cec79e3f9ea03ae6468d7285984713f19607f5cab902b9a6b7cbcfd900be5c2e407cc093ea0e6700000000000000000000000000000000151caf87968433cb1f85fc1854c57049be22c26497a86bfbd66a2b3af121d894dba8004a17c6ff96a5843c2719fa32d10000000000000000000000000000000011f0270f2b039409f70392879bcc2c67c836c100cf9883d3dc48d7adbcd52037d270539e863a951acd47ecaa1ca4db12dac6ed3ef45c1d7d3028f0f89e5458797996d3294b95bebe049b76c7d0db317c0000000000000000000000000000000017fae043c8fd4c520a90d4a6bd95f5b0484acc279b899e7b1d8f7f7831cc6ba37cd5965c4dc674768f5805842d433af30000000000000000000000000000000008ddd7b41b8fa4d29fb931830f29b46f4015ec202d51cb969d7c832aafc0995c875cd45eff4a083e2d5ecb5ad185b64f0000000000000000000000000000000015d384ab7e52420b83a69827257cb52b00f0199ed2240a142812b46cf67e92b99942ac59fb9f9efd7dd822f5a36c799f00000000000000000000000000000000074b3a16a9cc4be9da0ac8e2e7003d9c1ec89244d2c33441b31af76716cce439f805843a9a44701203231efdca551d5bbb30985756c3ca075114c92f231575d6befafe4084517f1166a47376867bd108000000000000000000000000000000000e25365988664e8b6ade2e5a40da49c11ff1e084cc0f8dca51f0d0578555d39e3617c8cadb2abc2633b28c5895ab0a9e00000000000000000000000000000000169f5fd768152169c403475dee475576fd2cc3788179453b0039ff3cb1b7a5a0fff8f82d03f56e65cad579218486c3b600000000000000000000000000000000087ccd7f92032febc1f75c7115111ede4acbb2e429cbccf3959524d0b79c449d431ff65485e1aecb442b53fec80ecb4000000000000000000000000000000000135d63f264360003b2eb28f126c6621a40088c6eb15acc4aea89d6068e9d5a47f842aa4b4300f5cda5cc5831edb81596fb730105809f64ea522983d6bbb62f7e2e8cbf702685e9be10e2ef71f818767200000000000000000000000000000000159da74f15e4c614b418997f81a1b8a3d9eb8dd80d94b5bad664bff271bb0f2d8f3c4ceb947dc6300d5003a2f7d7a829000000000000000000000000000000000cdd4d1d4666f385dd54052cf5c1966328403251bebb29f0d553a9a96b5ade350c8493270e9b5282d8a06f9fa8d7b1d900000000000000000000000000000000189f8d3c94fdaa72cc67a7f93d35f91e22206ff9e97eed9601196c28d45b69c802ae92bcbf582754717b0355e08d37c000000000000000000000000000000000054b0a282610f108fc7f6736b8c22c8778d082bf4b0d0abca5a228198eba6a868910dd5c5c440036968e977955054196b6a9408625b0ca8fcbfb21d34eec2d8e24e9a30d2d3b32d7a37d110b13afbfea000000000000000000000000000000000f29b0d2b6e3466668e1328048e8dbc782c1111ab8cbe718c85d58ded992d97ca8ba20b9d048feb6ed0aa1b4139d02d3000000000000000000000000000000000d1f0dae940b99fbfc6e4a58480cac8c4e6b2fe33ce6f39c7ac1671046ce94d9e16cba2bb62c6749ef73d45bea21501a000000000000000000000000000000001902ccece1c0c763fd06934a76d1f2f056563ae6d8592bafd589cfebd6f057726fd908614ccd6518a21c66ecc2f78b660000000000000000000000000000000017f6b113f8872c3187d20b0c765d73b850b54244a719cf461fb318796c0b8f310b5490959f9d9187f99c8ed3e25e42a93b77283d0a7bb9e17a27e66851792fdd605cc0a339028b8985390fd024374c76000000000000000000000000000000000576b8cf1e69efdc277465c344cadf7f8cceffacbeca83821f3ff81717308b97f4ac046f1926e7c2eb42677d7afc257c000000000000000000000000000000000cc1524531e96f3c00e4250dd351aedb5a4c3184aff52ec8c13d470068f5967f3674fe173ee239933e67501a9decc6680000000000000000000000000000000001610cfcaea414c241b44cf6f3cc319dcb51d6b8de29c8a6869ff7c1ebb7b747d881e922b42e8fab96bde7cf23e8e4cd0000000000000000000000000000000017d4444dc8b6893b681cf10dac8169054f9d2f61d3dd5fd785ae7afa49d18ebbde9ce8dde5641adc6b38173173459836dd994eae929aee7428fdda2e44f8cb12b10b91c83b22abc8bbb561310b62257c000000000000000000000000000000000ca8f961f86ee6c46fc88fbbf721ba760186f13cd4cce743f19dc60a89fd985cb3feee34dcc4656735a326f515a729e400000000000000000000000000000000174baf466b809b1155d524050f7ee58c7c5cf728c674e0ce549f5551047a4479ca15bdf69b403b03fa74eb1b26bbff6c0000000000000000000000000000000000e8c8b587c171b1b292779abfef57202ed29e7fe94ade9634ec5a2b3b4692a4f3c15468e3f6418b144674be70780d5b000000000000000000000000000000001865e99cf97d88bdf56dae32314eb32295c39a1e755cd7d1478bea8520b9ff21c39b683b92ae15568420c390c42b123b7010b134989c8368c7f831f9dd9f9a890e2c1435681107414f2e8637153bbf6a0000000000000000000000000000000017eccd446f10018219a1bd111b8786cf9febd49f9e7e754e82dd155ead59b819f0f20e42f4635d5044ec5d550d847623000000000000000000000000000000000403969d2b8f914ff2ea3bf902782642e2c6157bd2a343acf60ff9125b48b558d990a74c6d4d6398e7a3cc2a16037346000000000000000000000000000000000bd45f61f142bd78619fb520715320eb5e6ebafa8b078ce796ba62fe1a549d5fb9df57e92d8d2795988eb6ae18cf9d9300000000000000000000000000000000097db1314e064b8e670ec286958f17065bce644cf240ab1b1b220504560d36a0b43fc18453ff3a2bb315e219965f5bd394c68bc8d91ac8c489ee87dbfc4b94c93c8bbd5fc04c27db8b02303f3a65905400000000000000000000000000000000018244ab39a716e252cbfb986c7958b371e29ea9190010d1f5e1cfdb6ce4822d4055c37cd411fc9a0c46d728f2c13ecf0000000000000000000000000000000001985d3c667c8d68c9adb92bdc7a8af959c17146544997d97116120a0f55366bd7ad7ffa28d93ee51222ff9222779675000000000000000000000000000000000c70fd4e3c8f2a451f83fb6c046431b38251b7bae44cf8d36df69a03e2d3ce6137498523fcf0bcf29b5d69e8f265e24d00000000000000000000000000000000047b9163a218f7654a72e0d7c651a2cf7fd95e9784a59e0bf119d081de6c0465d374a55fbc1eff9828c9fd29abf4c4bdb3682accc3939283b870357cf83683350baf73aa0d3d68bda82a0f6ae7e51746,,,invalid input parameters, invalid input length for G2 multiplication +,,,invalid input parameters, invalid number of pairs +00000000000000000000000000000000039b10ccd664da6f273ea134bb55ee48f09ba585a7e2bb95b5aec610631ac49810d5d616f67ba0147e6d1be476ea220f0000000000000000000000000000000000fbcdff4e48e07d1f73ec42fe7eb026f5c30407cfd2f22bbbfe5b2a09e8a7bb4884178cb6afd1c95f80e646929d30040000000000000000000000000000000001ed3b0e71acb0adbf44643374edbf4405af87cfc0507db7e8978889c6c3afbe9754d1182e98ac3060d64994d31ef576000000000000000000000000000000001681a2bf65b83be5a2ca50430949b6e2a099977482e9405b593f34d2ed877a3f0d1bddc37d0cec4d59d7df74b2b8f2dfb3c940fe79b6966489b527955de7599194a9ac69a6ff58b8d99e7b1084f0464e0000000000000000000000000000000018c0ada6351b70661f053365deae56910798bd2ace6e2bf6ba4192d1a229967f6af6ca1c9a8a11ebc0a232344ee0f6d6000000000000000000000000000000000cc70a587f4652039d8117b6103858adcd9728f6aebe230578389a62da0042b7623b1c0436734f463cfdd187d20903240000000000000000000000000000000009f50bd7beedb23328818f9ffdafdb6da6a4dd80c5a9048ab8b154df3cad938ccede829f1156f769d9e149791e8e0cd900000000000000000000000000000000079ba50d2511631b20b6d6f3841e616e9d11b68ec3368cd60129d9d4787ab56c4e9145a38927e51c9cd6271d493d93884d0e25bf3f6fc9f4da25d21fdc71773f1947b7a8a775b8177f7eca990b05b71d0000000000000000000000000000000003632695b09dbf86163909d2bb25995b36ad1d137cf252860fd4bb6c95749e19eb0c1383e9d2f93f2791cb0cf6c8ed9d000000000000000000000000000000001688a855609b0bbff4452d146396558ff18777f329fd4f76a96859dabfc6a6f6977c2496280dbe3b1f8923990c1d6407000000000000000000000000000000000c8567fee05d05af279adc67179468a29d7520b067dbb348ee315a99504f70a206538b81a457cce855f4851ad48b7e80000000000000000000000000000000001238dcdfa80ea46e1500026ea5feadb421de4409f4992ffbf5ae59fa67fd82f38452642a50261b849e74b4a33eed70cc973f40c12c92b703d7b7848ef8b4466d40823aad3943a312b57432b91ff68be1000000000000000000000000000000000149704960cccf9d5ea414c73871e896b1d4cf0a946b0db72f5f2c5df98d2ec4f3adbbc14c78047961bc9620cb6cfb5900000000000000000000000000000000140c5d25e534fb1bfdc19ba4cecaabe619f6e0cd3d60b0f17dafd7bcd27b286d4f4477d00c5e1af22ee1a0c67fbf177c00000000000000000000000000000000029a1727041590b8459890de736df15c00d80ab007c3aee692ddcdf75790c9806d198e9f4502bec2f0a623491c3f877d0000000000000000000000000000000008a94c98baa9409151030d4fae2bd4a64c6f11ea3c99b9661fdaed226b9a7c2a7d609be34afda5d18b8911b6e015bf494c51f97bcdda93904ae26991b471e9ea942e2b5b8ed26055da11c58bc7b5002a000000000000000000000000000000001156d478661337478ab0cbc877a99d9e4d9824a2b3f605d41404d6b557b3ffabbf42635b0bbcb854cf9ed8b8637561a8000000000000000000000000000000001147ed317d5642e699787a7b47e6795c9a8943a34a694007e44f8654ba96390cf19f010dcf695e22c21874022c6ce291000000000000000000000000000000000c6dccdf920fd5e7fae284115511952633744c6ad94120d9cae6acda8a7c23c48bd912cba6c38de5159587e1e6cad519000000000000000000000000000000001944227d462bc2e5dcc6f6db0f83dad411ba8895262836f975b2b91e06fd0e2138862162acc04e9e65050b34ccbd1a4e8964d5867927bc3e35a0b4c457482373969bff5edff8a781d65573e07fd87b890000000000000000000000000000000019c31e3ab8cc9c920aa8f56371f133b6cb8d7b0b74b23c0c7201aca79e5ae69dc01f1f74d2492dcb081895b17d106b4e000000000000000000000000000000001789b0d371bd63077ccde3dbbebf3531368feb775bced187fb31cc6821481664600978e323ff21085b8c08e0f21daf72000000000000000000000000000000000009eacfe8f4a2a9bae6573424d07f42bd6af8a9d55f71476a7e3c7a4b2b898550c1e72ec13afd4eff22421a03af1d31000000000000000000000000000000000410bd4ea74dcfa33f2976aa1b571c67cbb596ab10f76a8aaf4548f1097e55b3373bff02683f806cb84e1e0e877819e2787c38b944eadbd03fd3187f450571740f6cd00e5b2e560165846eb800e5c94400000000000000000000000000000000147f09986691f2e57073378e8bfd58804241eed7934f6adfe6d0a6bac4da0b738495778a303e52113e1c80e698476d50000000000000000000000000000000000762348b84c92a8ca6de319cf1f8f11db296a71b90fe13e1e4bcd25903829c00a5d2ad4b1c8d98c37eaad7e042ab023d0000000000000000000000000000000011d1d94530d4a2daf0e902a5c3382cd135938557f94b04bccea5e16ea089c5e020e13524c854a316662bd68784fe31f300000000000000000000000000000000070828522bec75b6a492fd9bca7b54dac6fbbf4f0bc3179d312bb65c647439e3868e4d5b21af5a64c93aeee8a9b7e46eaaee7ae2a237e8e53560c79e7baa9adf9c00a0ea4d6f514e7a6832eb15cef1e1000000000000000000000000000000000690a0869204c8dced5ba0ce13554b2703a3f18afb8fa8fa1c457d79c58fdc25471ae85bafad52e506fc1917fc3becff0000000000000000000000000000000010f7dbb16f8571ede1cec79e3f9ea03ae6468d7285984713f19607f5cab902b9a6b7cbcfd900be5c2e407cc093ea0e6700000000000000000000000000000000151caf87968433cb1f85fc1854c57049be22c26497a86bfbd66a2b3af121d894dba8004a17c6ff96a5843c2719fa32d10000000000000000000000000000000011f0270f2b039409f70392879bcc2c67c836c100cf9883d3dc48d7adbcd52037d270539e863a951acd47ecaa1ca4db12dac6ed3ef45c1d7d3028f0f89e5458797996d3294b95bebe049b76c7d0db317c0000000000000000000000000000000017fae043c8fd4c520a90d4a6bd95f5b0484acc279b899e7b1d8f7f7831cc6ba37cd5965c4dc674768f5805842d433af30000000000000000000000000000000008ddd7b41b8fa4d29fb931830f29b46f4015ec202d51cb969d7c832aafc0995c875cd45eff4a083e2d5ecb5ad185b64f0000000000000000000000000000000015d384ab7e52420b83a69827257cb52b00f0199ed2240a142812b46cf67e92b99942ac59fb9f9efd7dd822f5a36c799f00000000000000000000000000000000074b3a16a9cc4be9da0ac8e2e7003d9c1ec89244d2c33441b31af76716cce439f805843a9a44701203231efdca551d5bbb30985756c3ca075114c92f231575d6befafe4084517f1166a47376867bd108000000000000000000000000000000000e25365988664e8b6ade2e5a40da49c11ff1e084cc0f8dca51f0d0578555d39e3617c8cadb2abc2633b28c5895ab0a9e00000000000000000000000000000000169f5fd768152169c403475dee475576fd2cc3788179453b0039ff3cb1b7a5a0fff8f82d03f56e65cad579218486c3b600000000000000000000000000000000087ccd7f92032febc1f75c7115111ede4acbb2e429cbccf3959524d0b79c449d431ff65485e1aecb442b53fec80ecb4000000000000000000000000000000000135d63f264360003b2eb28f126c6621a40088c6eb15acc4aea89d6068e9d5a47f842aa4b4300f5cda5cc5831edb81596fb730105809f64ea522983d6bbb62f7e2e8cbf702685e9be10e2ef71f818767200000000000000000000000000000000159da74f15e4c614b418997f81a1b8a3d9eb8dd80d94b5bad664bff271bb0f2d8f3c4ceb947dc6300d5003a2f7d7a829000000000000000000000000000000000cdd4d1d4666f385dd54052cf5c1966328403251bebb29f0d553a9a96b5ade350c8493270e9b5282d8a06f9fa8d7b1d900000000000000000000000000000000189f8d3c94fdaa72cc67a7f93d35f91e22206ff9e97eed9601196c28d45b69c802ae92bcbf582754717b0355e08d37c000000000000000000000000000000000054b0a282610f108fc7f6736b8c22c8778d082bf4b0d0abca5a228198eba6a868910dd5c5c440036968e977955054196b6a9408625b0ca8fcbfb21d34eec2d8e24e9a30d2d3b32d7a37d110b13afbfea000000000000000000000000000000000f29b0d2b6e3466668e1328048e8dbc782c1111ab8cbe718c85d58ded992d97ca8ba20b9d048feb6ed0aa1b4139d02d3000000000000000000000000000000000d1f0dae940b99fbfc6e4a58480cac8c4e6b2fe33ce6f39c7ac1671046ce94d9e16cba2bb62c6749ef73d45bea21501a000000000000000000000000000000001902ccece1c0c763fd06934a76d1f2f056563ae6d8592bafd589cfebd6f057726fd908614ccd6518a21c66ecc2f78b660000000000000000000000000000000017f6b113f8872c3187d20b0c765d73b850b54244a719cf461fb318796c0b8f310b5490959f9d9187f99c8ed3e25e42a93b77283d0a7bb9e17a27e66851792fdd605cc0a339028b8985390fd024374c76000000000000000000000000000000000576b8cf1e69efdc277465c344cadf7f8cceffacbeca83821f3ff81717308b97f4ac046f1926e7c2eb42677d7afc257c000000000000000000000000000000000cc1524531e96f3c00e4250dd351aedb5a4c3184aff52ec8c13d470068f5967f3674fe173ee239933e67501a9decc6680000000000000000000000000000000001610cfcaea414c241b44cf6f3cc319dcb51d6b8de29c8a6869ff7c1ebb7b747d881e922b42e8fab96bde7cf23e8e4cd0000000000000000000000000000000017d4444dc8b6893b681cf10dac8169054f9d2f61d3dd5fd785ae7afa49d18ebbde9ce8dde5641adc6b38173173459836dd994eae929aee7428fdda2e44f8cb12b10b91c83b22abc8bbb561310b62257c000000000000000000000000000000000ca8f961f86ee6c46fc88fbbf721ba760186f13cd4cce743f19dc60a89fd985cb3feee34dcc4656735a326f515a729e400000000000000000000000000000000174baf466b809b1155d524050f7ee58c7c5cf728c674e0ce549f5551047a4479ca15bdf69b403b03fa74eb1b26bbff6c0000000000000000000000000000000000e8c8b587c171b1b292779abfef57202ed29e7fe94ade9634ec5a2b3b4692a4f3c15468e3f6418b144674be70780d5b000000000000000000000000000000001865e99cf97d88bdf56dae32314eb32295c39a1e755cd7d1478bea8520b9ff21c39b683b92ae15568420c390c42b123b7010b134989c8368c7f831f9dd9f9a890e2c1435681107414f2e8637153bbf6a0000000000000000000000000000000017eccd446f10018219a1bd111b8786cf9febd49f9e7e754e82dd155ead59b819f0f20e42f4635d5044ec5d550d847623000000000000000000000000000000000403969d2b8f914ff2ea3bf902782642e2c6157bd2a343acf60ff9125b48b558d990a74c6d4d6398e7a3cc2a16037346000000000000000000000000000000000bd45f61f142bd78619fb520715320eb5e6ebafa8b078ce796ba62fe1a549d5fb9df57e92d8d2795988eb6ae18cf9d9300000000000000000000000000000000097db1314e064b8e670ec286958f17065bce644cf240ab1b1b220504560d36a0b43fc18453ff3a2bb315e219965f5bd394c68bc8d91ac8c489ee87dbfc4b94c93c8bbd5fc04c27db8b02303f3a65905400000000000000000000000000000000018244ab39a716e252cbfb986c7958b371e29ea9190010d1f5e1cfdb6ce4822d4055c37cd411fc9a0c46d728f2c13ecf0000000000000000000000000000000001985d3c667c8d68c9adb92bdc7a8af959c17146544997d97116120a0f55366bd7ad7ffa28d93ee51222ff9222779675000000000000000000000000000000000c70fd4e3c8f2a451f83fb6c046431b38251b7bae44cf8d36df69a03e2d3ce6137498523fcf0bcf29b5d69e8f265e24d00000000000000000000000000000000047b9163a218f7654a72e0d7c651a2cf7fd95e9784a59e0bf119d081de6c0465d374a55fbc1eff9828c9fd29abf4c4bdb3682accc3939283b870357cf83683350baf73aa0d3d68bda82a0f6ae7e51746,,,invalid point: point is not on curve +00000000000000000000000000000000039b10ccd664da6f273ea134bb55ee48f09ba585a7e2bb95b5aec610631ac49810d5d616f67ba0147e6d1be476ea220e0000000000000000000000000000000000fbcdff4e48e07d1f73ec42fe7eb026f5c30407cfd2f22bbbfe5b2a09e8a7bb4884178cb6afd1c95f80e646929d30040000000000000000000000000000000001ed3b0e71acb0adbf44643374edbf4405af87cfc0507db7e8978889c6c3afbe9754d1182e98ac3060d64994d31ef576000000000000000000000000000000001681a2bf65b83be5a2ca50430949b6e2a099977482e9405b593f34d2ed877a3f0d1bddc37d0cec4d59d7df74b2b8f2dfb3c940fe79b6966489b527955de7599194a9ac69a6ff58b8d99e7b1084f0464e0000000000000000000000000000000018c0ada6351b70661f053365deae56910798bd2ace6e2bf6ba4192d1a229967f6af6ca1c9a8a11ebc0a232344ee0f6d6000000000000000000000000000000000cc70a587f4652039d8117b6103858adcd9728f6aebe230578389a62da0042b7623b1c0436734f463cfdd187d20903240000000000000000000000000000000009f50bd7beedb23328818f9ffdafdb6da6a4dd80c5a9048ab8b154df3cad938ccede829f1156f769d9e149791e8e0cd900000000000000000000000000000000079ba50d2511631b20b6d6f3841e616e9d11b68ec3368cd60129d9d4787ab56c4e9145a38927e51c9cd6271d493d93884d0e25bf3f6fc9f4da25d21fdc71773f1947b7a8a775b8177f7eca990b05b71d0000000000000000000000000000000003632695b09dbf86163909d2bb25995b36ad1d137cf252860fd4bb6c95749e19eb0c1383e9d2f93f2791cb0cf6c8ed9d000000000000000000000000000000001688a855609b0bbff4452d146396558ff18777f329fd4f76a96859dabfc6a6f6977c2496280dbe3b1f8923990c1d6407000000000000000000000000000000000c8567fee05d05af279adc67179468a29d7520b067dbb348ee315a99504f70a206538b81a457cce855f4851ad48b7e80000000000000000000000000000000001238dcdfa80ea46e1500026ea5feadb421de4409f4992ffbf5ae59fa67fd82f38452642a50261b849e74b4a33eed70cc973f40c12c92b703d7b7848ef8b4466d40823aad3943a312b57432b91ff68be1000000000000000000000000000000000149704960cccf9d5ea414c73871e896b1d4cf0a946b0db72f5f2c5df98d2ec4f3adbbc14c78047961bc9620cb6cfb5900000000000000000000000000000000140c5d25e534fb1bfdc19ba4cecaabe619f6e0cd3d60b0f17dafd7bcd27b286d4f4477d00c5e1af22ee1a0c67fbf177c00000000000000000000000000000000029a1727041590b8459890de736df15c00d80ab007c3aee692ddcdf75790c9806d198e9f4502bec2f0a623491c3f877d0000000000000000000000000000000008a94c98baa9409151030d4fae2bd4a64c6f11ea3c99b9661fdaed226b9a7c2a7d609be34afda5d18b8911b6e015bf494c51f97bcdda93904ae26991b471e9ea942e2b5b8ed26055da11c58bc7b5002a000000000000000000000000000000001156d478661337478ab0cbc877a99d9e4d9824a2b3f605d41404d6b557b3ffabbf42635b0bbcb854cf9ed8b8637561a8000000000000000000000000000000001147ed317d5642e699787a7b47e6795c9a8943a34a694007e44f8654ba96390cf19f010dcf695e22c21874022c6ce291000000000000000000000000000000000c6dccdf920fd5e7fae284115511952633744c6ad94120d9cae6acda8a7c23c48bd912cba6c38de5159587e1e6cad519000000000000000000000000000000001944227d462bc2e5dcc6f6db0f83dad411ba8895262836f975b2b91e06fd0e2138862162acc04e9e65050b34ccbd1a4e8964d5867927bc3e35a0b4c457482373969bff5edff8a781d65573e07fd87b890000000000000000000000000000000019c31e3ab8cc9c920aa8f56371f133b6cb8d7b0b74b23c0c7201aca79e5ae69dc01f1f74d2492dcb081895b17d106b4e000000000000000000000000000000001789b0d371bd63077ccde3dbbebf3531368feb775bced187fb31cc6821481664600978e323ff21085b8c08e0f21daf72000000000000000000000000000000000009eacfe8f4a2a9bae6573424d07f42bd6af8a9d55f71476a7e3c7a4b2b898550c1e72ec13afd4eff22421a03af1d31000000000000000000000000000000000410bd4ea74dcfa33f2976aa1b571c67cbb596ab10f76a8aaf4548f1097e55b3373bff02683f806cb84e1e0e877819e2787c38b944eadbd03fd3187f450571740f6cd00e5b2e560165846eb800e5c94400000000000000000000000000000000147f09986691f2e57073378e8bfd58804241eed7934f6adfe6d0a6bac4da0b738495778a303e52113e1c80e698476d50000000000000000000000000000000000762348b84c92a8ca6de319cf1f8f11db296a71b90fe13e1e4bcd25903829c00a5d2ad4b1c8d98c37eaad7e042ab023d0000000000000000000000000000000011d1d94530d4a2daf0e902a5c3382cd135938557f94b04bccea5e16ea089c5e020e13524c854a316662bd68784fe31f300000000000000000000000000000000070828522bec75b6a492fd9bca7b54dac6fbbf4f0bc3179d312bb65c647439e3868e4d5b21af5a64c93aeee8a9b7e46eaaee7ae2a237e8e53560c79e7baa9adf9c00a0ea4d6f514e7a6832eb15cef1e1000000000000000000000000000000000690a0869204c8dced5ba0ce13554b2703a3f18afb8fa8fa1c457d79c58fdc25471ae85bafad52e506fc1917fc3becff0000000000000000000000000000000010f7dbb16f8571ede1cec79e3f9ea03ae6468d7285984713f19607f5cab902b9a6b7cbcfd900be5c2e407cc093ea0e6700000000000000000000000000000000151caf87968433cb1f85fc1854c57049be22c26497a86bfbd66a2b3af121d894dba8004a17c6ff96a5843c2719fa32d10000000000000000000000000000000011f0270f2b039409f70392879bcc2c67c836c100cf9883d3dc48d7adbcd52037d270539e863a951acd47ecaa1ca4db12dac6ed3ef45c1d7d3028f0f89e5458797996d3294b95bebe049b76c7d0db317c0000000000000000000000000000000017fae043c8fd4c520a90d4a6bd95f5b0484acc279b899e7b1d8f7f7831cc6ba37cd5965c4dc674768f5805842d433af30000000000000000000000000000000008ddd7b41b8fa4d29fb931830f29b46f4015ec202d51cb969d7c832aafc0995c875cd45eff4a083e2d5ecb5ad185b64f0000000000000000000000000000000015d384ab7e52420b83a69827257cb52b00f0199ed2240a142812b46cf67e92b99942ac59fb9f9efd7dd822f5a36c799f00000000000000000000000000000000074b3a16a9cc4be9da0ac8e2e7003d9c1ec89244d2c33441b31af76716cce439f805843a9a44701203231efdca551d5bbb30985756c3ca075114c92f231575d6befafe4084517f1166a47376867bd108000000000000000000000000000000000e25365988664e8b6ade2e5a40da49c11ff1e084cc0f8dca51f0d0578555d39e3617c8cadb2abc2633b28c5895ab0a9e00000000000000000000000000000000169f5fd768152169c403475dee475576fd2cc3788179453b0039ff3cb1b7a5a0fff8f82d03f56e65cad579218486c3b600000000000000000000000000000000087ccd7f92032febc1f75c7115111ede4acbb2e429cbccf3959524d0b79c449d431ff65485e1aecb442b53fec80ecb4000000000000000000000000000000000135d63f264360003b2eb28f126c6621a40088c6eb15acc4aea89d6068e9d5a47f842aa4b4300f5cda5cc5831edb81596fb730105809f64ea522983d6bbb62f7e2e8cbf702685e9be10e2ef71f818767200000000000000000000000000000000159da74f15e4c614b418997f81a1b8a3d9eb8dd80d94b5bad664bff271bb0f2d8f3c4ceb947dc6300d5003a2f7d7a829000000000000000000000000000000000cdd4d1d4666f385dd54052cf5c1966328403251bebb29f0d553a9a96b5ade350c8493270e9b5282d8a06f9fa8d7b1d900000000000000000000000000000000189f8d3c94fdaa72cc67a7f93d35f91e22206ff9e97eed9601196c28d45b69c802ae92bcbf582754717b0355e08d37c000000000000000000000000000000000054b0a282610f108fc7f6736b8c22c8778d082bf4b0d0abca5a228198eba6a868910dd5c5c440036968e977955054196b6a9408625b0ca8fcbfb21d34eec2d8e24e9a30d2d3b32d7a37d110b13afbfea000000000000000000000000000000000f29b0d2b6e3466668e1328048e8dbc782c1111ab8cbe718c85d58ded992d97ca8ba20b9d048feb6ed0aa1b4139d02d3000000000000000000000000000000000d1f0dae940b99fbfc6e4a58480cac8c4e6b2fe33ce6f39c7ac1671046ce94d9e16cba2bb62c6749ef73d45bea21501a000000000000000000000000000000001902ccece1c0c763fd06934a76d1f2f056563ae6d8592bafd589cfebd6f057726fd908614ccd6518a21c66ecc2f78b660000000000000000000000000000000017f6b113f8872c3187d20b0c765d73b850b54244a719cf461fb318796c0b8f310b5490959f9d9187f99c8ed3e25e42a93b77283d0a7bb9e17a27e66851792fdd605cc0a339028b8985390fd024374c76000000000000000000000000000000000576b8cf1e69efdc277465c344cadf7f8cceffacbeca83821f3ff81717308b97f4ac046f1926e7c2eb42677d7afc257c000000000000000000000000000000000cc1524531e96f3c00e4250dd351aedb5a4c3184aff52ec8c13d470068f5967f3674fe173ee239933e67501a9decc6680000000000000000000000000000000001610cfcaea414c241b44cf6f3cc319dcb51d6b8de29c8a6869ff7c1ebb7b747d881e922b42e8fab96bde7cf23e8e4cd0000000000000000000000000000000017d4444dc8b6893b681cf10dac8169054f9d2f61d3dd5fd785ae7afa49d18ebbde9ce8dde5641adc6b38173173459836dd994eae929aee7428fdda2e44f8cb12b10b91c83b22abc8bbb561310b62257c000000000000000000000000000000000ca8f961f86ee6c46fc88fbbf721ba760186f13cd4cce743f19dc60a89fd985cb3feee34dcc4656735a326f515a729e400000000000000000000000000000000174baf466b809b1155d524050f7ee58c7c5cf728c674e0ce549f5551047a4479ca15bdf69b403b03fa74eb1b26bbff6c0000000000000000000000000000000000e8c8b587c171b1b292779abfef57202ed29e7fe94ade9634ec5a2b3b4692a4f3c15468e3f6418b144674be70780d5b000000000000000000000000000000001865e99cf97d88bdf56dae32314eb32295c39a1e755cd7d1478bea8520b9ff21c39b683b92ae15568420c390c42b123b7010b134989c8368c7f831f9dd9f9a890e2c1435681107414f2e8637153bbf6a0000000000000000000000000000000017eccd446f10018219a1bd111b8786cf9febd49f9e7e754e82dd155ead59b819f0f20e42f4635d5044ec5d550d847623000000000000000000000000000000000403969d2b8f914ff2ea3bf902782642e2c6157bd2a343acf60ff9125b48b558d990a74c6d4d6398e7a3cc2a16037346000000000000000000000000000000000bd45f61f142bd78619fb520715320eb5e6ebafa8b078ce796ba62fe1a549d5fb9df57e92d8d2795988eb6ae18cf9d9300000000000000000000000000000000097db1314e064b8e670ec286958f17065bce644cf240ab1b1b220504560d36a0b43fc18453ff3a2bb315e219965f5bd394c68bc8d91ac8c489ee87dbfc4b94c93c8bbd5fc04c27db8b02303f3a65905400000000000000000000000000000000018244ab39a716e252cbfb986c7958b371e29ea9190010d1f5e1cfdb6ce4822d4055c37cd411fc9a0c46d728f2c13ed00000000000000000000000000000000001985d3c667c8d68c9adb92bdc7a8af959c17146544997d97116120a0f55366bd7ad7ffa28d93ee51222ff9222779675000000000000000000000000000000000c70fd4e3c8f2a451f83fb6c046431b38251b7bae44cf8d36df69a03e2d3ce6137498523fcf0bcf29b5d69e8f265e24d00000000000000000000000000000000047b9163a218f7654a72e0d7c651a2cf7fd95e9784a59e0bf119d081de6c0465d374a55fbc1eff9828c9fd29abf4c4bdb3682accc3939283b870357cf83683350baf73aa0d3d68bda82a0f6ae7e51746,,,invalid point: point is not on curve +00000000000000000000000000000000197bfd0342bbc8bee2beced2f173e1a87be576379b343e93232d6cef98d84b1d696e5612ff283ce2cfdccb2cfb65fa0c00000000000000000000000000000000184e811f55e6f9d84d77d2f79102fd7ea7422f4759df5bf7f6331d550245e3f1bcf6a30e3b29110d85e0ca16f9f6ae7a000000000000000000000000000000000f10e1eb3c1e53d2ad9cf2d398b2dc22c5842fab0a74b174f691a7e914975da3564d835cd7d2982815b8ac57f507348f000000000000000000000000000000000767d1c453890f1b9110fda82f5815c27281aba3f026ee868e4176a0654feea41a96575e0c4d58a14dbfbcc05b5010b1000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000103121a2ceaae586d240843a398967325f8eb5a93e8fea99b62b9f88d8556c80dd726a4b30e84a36eeabaf3592937f2700000000000000000000000000000000086b990f3da2aeac0a36143b7d7c824428215140db1bb859338764cb58458f081d92664f9053b50b3fbd2e4723121b68000000000000000000000000000000000f9e7ba9a86a8f7624aa2b42dcc8772e1af4ae115685e60abc2c9b90242167acef3d0be4050bf935eed7c3b6fc7ba77e000000000000000000000000000000000d22c3652d0dc6f0fc9316e14268477c2049ef772e852108d269d9c38dba1d4802e8dae479818184c08f9a569d8784510000000000000000000000000000000000000000000000000000000000000002,,,invalid point: subgroup check failed diff --git a/evm/src/test/resources/org/hyperledger/besu/evm/precompile/invalid_subgroup_for_pairing.csv b/evm/src/test/resources/org/hyperledger/besu/evm/precompile/invalid_subgroup_for_pairing.csv index b0c4d6de2..acc3197d1 100644 --- a/evm/src/test/resources/org/hyperledger/besu/evm/precompile/invalid_subgroup_for_pairing.csv +++ b/evm/src/test/resources/org/hyperledger/besu/evm/precompile/invalid_subgroup_for_pairing.csv @@ -1,101 +1,101 @@ input,result,gas,notes -000000000000000000000000000000000ded5634c6bab9610e70f3a9be2bb39c51f2ddd762d22d6c3f0961af19350c4ca4bae333bf4cf586d8cd1e0a0a6c674e0000000000000000000000000000000012309fe1d843245e2cb58d419ff06ed8e93ec901c01d0c5be453e11d10f930afa0c35428ef0c8dc13ce99c990af166630000000000000000000000000000000017c9fcf0504e62d3553b2f089b64574150aa5117bd3d2e89a8c1ed59bb7f70fb83215975ef31976e757abf60a75a1d9f0000000000000000000000000000000008f5a53d704298fe0cfc955e020442874fe87d5c729c7126abbdcbed355eef6c8f07277bee6d49d56c4ebaf334848624000000000000000000000000000000001302dcc50c6ce4c28086f8e1b43f9f65543cf598be440123816765ab6bc93f62bceda80045fbcad8598d4f32d03ee8fa000000000000000000000000000000000bbb4eb37628d60b035a3e0c45c0ea8c4abef5a6ddc5625e0560097ef9caab208221062e81cd77ef72162923a1906a400000000000000000000000000000000012196c5a43d69224d8713389285f26b98f86ee910ab3dd668e413738282003cc5b7357af9a7af54bb713d62255e80f560000000000000000000000000000000006ba8102bfbeea4416b710c73e8cce3032c31c6269c44906f8ac4f7874ce99fb17559992486528963884ce429a992fee0000000000000000000000000000000017c9fcf0504e62d3553b2f089b64574150aa5117bd3d2e89a8c1ed59bb7f70fb83215975ef31976e757abf60a75a1d9f0000000000000000000000000000000008f5a53d704298fe0cfc955e020442874fe87d5c729c7126abbdcbed355eef6c8f07277bee6d49d56c4ebaf334848624000000000000000000000000000000001302dcc50c6ce4c28086f8e1b43f9f65543cf598be440123816765ab6bc93f62bceda80045fbcad8598d4f32d03ee8fa000000000000000000000000000000000bbb4eb37628d60b035a3e0c45c0ea8c4abef5a6ddc5625e0560097ef9caab208221062e81cd77ef72162923a1906a40,,,invalid input parameters, G1 point is not in the expected subgroup -0000000000000000000000000000000014881e90a100e5c1e07588d68c69b9b217d2c57b2bd8782ea7579abfac3a38275677a8dee7e689c1b185712ea38bf0ba00000000000000000000000000000000061e48ceb68db1cb84ed39f9772f937922198b47082d7517c8258e46a490fc20e4e01971711853ab653d064f8adc79e200000000000000000000000000000000173518c27d76414f3027ed3e4936ad1b6aaebf0a98462df3e3a55aa38e19fb121acc6eeadb7689c84fec18580b63784c0000000000000000000000000000000007c116829ccc1d5505dcce029f5c8b7c8a9cbc9dd562a874766a5654483aec977a0fb9e611f9471d2f0c91fd6534892f000000000000000000000000000000001560b267e66200e69d6298250456d88500a0d79ea69870358a6cb39609fb6596e539b28bfea9d1c7054b5b51a4c0f3950000000000000000000000000000000000cc196f93e5a2dd3a41a1ba23fd2e53bf376c910117e9216663e30091b96c897080bca189ce3107720dac1c54dc4fc70000000000000000000000000000000014881e90a100e5c1e07588d68c69b9b217d2c57b2bd8782ea7579abfac3a38275677a8dee7e689c1b185712ea38bf0ba00000000000000000000000000000000061e48ceb68db1cb84ed39f9772f937922198b47082d7517c8258e46a490fc20e4e01971711853ab653d064f8adc79e20000000000000000000000000000000015237996817e97b29ef5b4ee49e6aea7129bdc4a46707f99df3ab8af36eb4123e93496d94846f7807b3bd2c87d3ca039000000000000000000000000000000000df666f7728483689a746e5b39f4848a9f2d831cb17d4e5f7fb67de5d497f6399de5f37ba9e6ab76937e26450000d600000000000000000000000000000000000e4ffecf86b371ddc9ee6a72b5ada74790b590acc51c6c5c479c43c532a9507b4b4909bdc901b00932371a109fd38b7e000000000000000000000000000000000354f92ccabccc9390072671ccc8d3ea0a0c44f85816f20bd6e8b485e648e8ba0d5b845a8835395ce65b8101015ea83f,,,invalid input parameters, G2 point is not in the expected subgroup -00000000000000000000000000000000199fa649608972d295befae38d36940663d2b67bb286a3d549c75deef39ef8068728bbba2cafac44c102499601e4bd860000000000000000000000000000000002dac960f96822774a4956fc0ba97a235d0a2c10d81d9adf7b88215250c934b68c3de07a97adcaee2aaad0d3d84ecf6800000000000000000000000000000000000eb3c91515d4a41209a73564741a8ccf901a624df9db22e195a5d02d24b7bc0a12756b15b8d006cb991a7e088eaef1000000000000000000000000000000000704ce8afc808b0161f6f61b22d990d713ae398779e6e74e9b5771daf006ce0bba3a8088edf75156f0e48b92ee8409b00000000000000000000000000000000018fe81e05aff0620f4bdbe4a715e015650497afab62921eba0ab86b649e5a2fd3d54041868928519f537e36448688a0d00000000000000000000000000000000162bd97161201ea3c26f8dd1204a9c6b61b762bdf573cb5d20b6b255f30208ca7d96aa47b46fb8c6bf0922075f1c1ca8000000000000000000000000000000000d5bb4fa8b494c0adf4b695477d4a05f0ce48f7f971ef53952f685e9fb69dc8db1603e4a58292ddab7129bb5911d6cea0000000000000000000000000000000004a568c556641f0e0a2f44124b77ba70e4e560d7e030f1a21eff41eeec0d3c437b43488c535cdabf19a70acc777bacca00000000000000000000000000000000000eb3c91515d4a41209a73564741a8ccf901a624df9db22e195a5d02d24b7bc0a12756b15b8d006cb991a7e088eaef1000000000000000000000000000000000704ce8afc808b0161f6f61b22d990d713ae398779e6e74e9b5771daf006ce0bba3a8088edf75156f0e48b92ee8409b00000000000000000000000000000000018fe81e05aff0620f4bdbe4a715e015650497afab62921eba0ab86b649e5a2fd3d54041868928519f537e36448688a0d00000000000000000000000000000000162bd97161201ea3c26f8dd1204a9c6b61b762bdf573cb5d20b6b255f30208ca7d96aa47b46fb8c6bf0922075f1c1ca8,,,invalid input parameters, G1 point is not in the expected subgroup -0000000000000000000000000000000009d928f478fea86b1e3c1ebf59b230af42e4a539dd43ff17b9ca250605401273edc42806bf2cb887c6093729238fc0560000000000000000000000000000000005b6040ce6d0802719af5b9c0fe48366c5a97bcad2c6ec25f64cd73f39dc73a22d0084c69f2e86637c584d2de55d6064000000000000000000000000000000000aaeceb367eaf2ab8afb5070b5f5611f19fed17e16f6b01cd20f5f1a7e550d4689c89d6490878877c46492e8fbc9db600000000000000000000000000000000019dc59fbefa7abf12f1aa92e420f52595a06e819e974c07b62a3ae459c62545922016abd8e91301aca8f48ed793b91af0000000000000000000000000000000012f5352825a95ff0a0f0948b150e5eb1ab53d6591dc54ca8b37941fa94a0fa68af8c35aaa26c73951d2dd52e9c7a55bf000000000000000000000000000000000531e610f3706a1c67b31909a97232acef0e23c35c657dc82d9508fcf33bfff777386dc8265accb52d0da207957d25160000000000000000000000000000000009d928f478fea86b1e3c1ebf59b230af42e4a539dd43ff17b9ca250605401273edc42806bf2cb887c6093729238fc0560000000000000000000000000000000005b6040ce6d0802719af5b9c0fe48366c5a97bcad2c6ec25f64cd73f39dc73a22d0084c69f2e86637c584d2de55d6064000000000000000000000000000000000cf95f6bc3f14cc8a657da35f212d55d3633ca0d224794ac1e49cbf1e1db7757dac2bb08880f7b13f2ac0c2b95ff483c00000000000000000000000000000000115bf27014a31726503f0665301f9e183de41e002db568916aaaeaa4c8046475860db3b993b2ac2af58b12614f0b9f2d000000000000000000000000000000000983ee62076e9c5f8e6ac3ba8e5f98823a37ff20432f0b4e7d9e008660965f551bb5538e6ba28541ad514e87d128da1b0000000000000000000000000000000019c9930e3e009986608463c80aa0049fcac5e897474e519b52c80960f1dada5a48332d810f1f9a34ee479383b5b556b3,,,invalid input parameters, G2 point is not in the expected subgroup -000000000000000000000000000000000f240a4daf7acbe8f4c5a9cb40ccc6d99dd712b8dae4c13e9d3839b0c88c5eef6f050144a4b731267e2132a81b1a635c000000000000000000000000000000001931c93a957ba9005fa69004c7e984b9dc86f45ec03eeed77addb3e1bee3c2424105df8e8faacae2b07623cd3cc7261e000000000000000000000000000000000805892f21889cab3cfe62226eaff6a8d3586d4396692b379efc7e90b0eaad4c9afbdf0f56b30f0c07ae0bc4013343b30000000000000000000000000000000007853f0e75c8dee034c2444299da58c98f22de367a90550dbc635fb52c9a8f61ccc100f70f10208944e48d09507fdce100000000000000000000000000000000064afd6b3ef7ff7ec34f1fa330877b42958a46a7698c6d21adf73bfdfcab7793b312e21e5988652e655f2d42edb8a673000000000000000000000000000000000ea8a2217c3dbcc0f6e562de9cb2f334c896577d0b3a7108d96b1aba2d705dbf531e870d4023cec2c0533455013242330000000000000000000000000000000019c822a4d44ac22f6fbaef356c37ceff93c1d6933e8c8f3b55784cfe62e5705930be48607c3f7a4a2ca146945cad6242000000000000000000000000000000000353d6521a17474856ad69582ce225f27d60f5a8319bea8cefded2c3f6b862d76fe633c77ed8ccdf99d2b10430253fc8000000000000000000000000000000000805892f21889cab3cfe62226eaff6a8d3586d4396692b379efc7e90b0eaad4c9afbdf0f56b30f0c07ae0bc4013343b30000000000000000000000000000000007853f0e75c8dee034c2444299da58c98f22de367a90550dbc635fb52c9a8f61ccc100f70f10208944e48d09507fdce100000000000000000000000000000000064afd6b3ef7ff7ec34f1fa330877b42958a46a7698c6d21adf73bfdfcab7793b312e21e5988652e655f2d42edb8a673000000000000000000000000000000000ea8a2217c3dbcc0f6e562de9cb2f334c896577d0b3a7108d96b1aba2d705dbf531e870d4023cec2c053345501324233,,,invalid input parameters, G1 point is not in the expected subgroup -0000000000000000000000000000000012d75b62dd32798ea12b99f51a496bbf61bca93cd233dd288e00259893dbe7c73b6342860d41fd86878a6de608dba0ed00000000000000000000000000000000018e963e1cdb31ce3f636091952c17ab4c03c0f55940196b5772002850c6c86a3da13a9a5fbfaa8256fb0a9c4139bfc60000000000000000000000000000000018330d288ddc1786744f95c4b3bacbdfd10ab560fc283c1ecde1bcbdc53cb284198f340241242763c77b4cd3b8c729200000000000000000000000000000000019a3d86d9b3ff0b03da1686c3234bb2b8109ab12ffd7599ef9e3489fcee40e50036dd952f7a4129473340fb725458cc50000000000000000000000000000000010f70de44c7e0510c8ff8327dd83ea4087f9f8b5a53fbe18615fa31a3b57862b52a7726b3e9403afe93dcafc5606dfe500000000000000000000000000000000199e6da569d0eb7938d52b396c9bc6d8b563dd6e64edd60e2e25c493475a0cbd953e7ff54309d189eba2b3827ad614180000000000000000000000000000000012d75b62dd32798ea12b99f51a496bbf61bca93cd233dd288e00259893dbe7c73b6342860d41fd86878a6de608dba0ed00000000000000000000000000000000018e963e1cdb31ce3f636091952c17ab4c03c0f55940196b5772002850c6c86a3da13a9a5fbfaa8256fb0a9c4139bfc600000000000000000000000000000000192b17cf1539a57ee64701bcd07ed0b067a6ab12ef17408ad3ba1db0d94889cc481c877588fd70270287aa8f279659af000000000000000000000000000000001779c74b7e83c8d931510b555de206dee2d9edbb49b473c586c5b7046d1389e6f612cf96ee76446a21b02f135492fa1c0000000000000000000000000000000007165050fd4407a69143a98001c290f8b1aef02d64d28ee046744009f4afa376da95b4f6a3dd36427a297ed25e6bb3320000000000000000000000000000000005a9238272385614f6df896801f7f9af9cda1ac0ce3c816174693bd52b1799386c4f6355fc36f9ecd566a3a4b20e612b,,,invalid input parameters, G2 point is not in the expected subgroup -000000000000000000000000000000000d612430d9b8956188fefa4cd839ec8dffee18678f83d4984b08e227880ec127e63860bf5d7a27c309fb425b90c0afa500000000000000000000000000000000100556e6391ac2a05b15e552e67d6509e21c4770cfe2f8126fd1d9663995839420a4915656d6292d0767892833369bbc000000000000000000000000000000000aeb5c087644595d0912879f61959d2731ff55260c682ed2bc5fc55c13964ef7c1f70aeb55876d2264d558c31371ca69000000000000000000000000000000000e173848f4570525b03a2b2c86f4dcdb8b28dd6d18c1354cad31028eb1b8b44432c2346edaace093e3954c7fa6d338a4000000000000000000000000000000001949b0902506d111ef6318edcd7a58ca4d69f5804a028aee73c3786cb2db168c6a73b77194f7a021ae6ae43ac78ade340000000000000000000000000000000017c5e28ba6103d97e2f3d3611c0c78f06406e0da8a49ae29c7d460b52f75136920784cd500aa3593858b877697eb84240000000000000000000000000000000007dc719ae9e3f1e11d3ed4747a546a7b973ccb1967adb1b3066645a8bde9632bcfa3530e768f088ddbc022b169e67cbf000000000000000000000000000000000bbf9cf884b19c84045da1cead7dcd9fdbf39d764ff1ad60d83ed1e4fd0ce0554f0fb618203952cf02a7c4ba466c66b8000000000000000000000000000000000aeb5c087644595d0912879f61959d2731ff55260c682ed2bc5fc55c13964ef7c1f70aeb55876d2264d558c31371ca69000000000000000000000000000000000e173848f4570525b03a2b2c86f4dcdb8b28dd6d18c1354cad31028eb1b8b44432c2346edaace093e3954c7fa6d338a4000000000000000000000000000000001949b0902506d111ef6318edcd7a58ca4d69f5804a028aee73c3786cb2db168c6a73b77194f7a021ae6ae43ac78ade340000000000000000000000000000000017c5e28ba6103d97e2f3d3611c0c78f06406e0da8a49ae29c7d460b52f75136920784cd500aa3593858b877697eb8424,,,invalid input parameters, G1 point is not in the expected subgroup -0000000000000000000000000000000013b23b5a61ad3ed0ed74a57023285338c77c01dd93e17fd93d4225d27a7168dbdae3fff0c8ebcfc30887df348deea7ae000000000000000000000000000000001245282782135d41eee4dbd9b69a586e1ae2e17426643494427eabec93ba3c056089ce9c8a667727c3464178f7c87655000000000000000000000000000000000d35887ecdfce840b79f60f77af0e7cc01289ff20e1558a14b57a73f3fdd8e66ca496a73ce888d1c8cd0888d8219412b000000000000000000000000000000000cca9ce1b3c5bb6d02d5c36549438a4854dacacab7b173b434d09e496256edc2372a08edb2de26e5369af03dd0e2d73e00000000000000000000000000000000152d022429b54ac4bb70dacc888a2a3409cd7d2db0614ba0afe236c7bff311967718a70eb7943f93a6dbc88d3c008e8b00000000000000000000000000000000191e99ff1e02809121098597de4d176dfc85586d3e13609b3399c08da7c9cd6fa006e8b95551878a74e140cf166625c30000000000000000000000000000000013b23b5a61ad3ed0ed74a57023285338c77c01dd93e17fd93d4225d27a7168dbdae3fff0c8ebcfc30887df348deea7ae000000000000000000000000000000001245282782135d41eee4dbd9b69a586e1ae2e17426643494427eabec93ba3c056089ce9c8a667727c3464178f7c8765500000000000000000000000000000000179657b434fbb3ecb4857b4559c8cdaa1448b2a4bf4314349341a45bd3a2cdeb2aa6be75ee1aaaef0f90d086df55ccc40000000000000000000000000000000011ec9abd1a497dc7cc4b4b9e2cef8a7abc767969703d79ff51d7a4f1ab93ae9fc7e8bd4852da22ec067d326fffa54757000000000000000000000000000000000a45435d1f78ad93aeef8a88dad39aebc0cf38cc16fbb02c571a269bbec773e71b5ee9d09a505afc9a7fe11b06f040cd0000000000000000000000000000000000b6ee9d2b0fbd996455169ef07afa3be3c6535d65545c8503c3d77dd0576eecd2f81b50dabbb62328edfe236981d5c1,,,invalid input parameters, G2 point is not in the expected subgroup -000000000000000000000000000000000b14b12ecaa94f9656be54772be9b22a2495d4ff873b0bb971c27ab1d8b940c84cabcf921f6f75e93942c38cddeb8751000000000000000000000000000000000c9ad793ae80ad0e1c39670876d679bc7f930c1df1f9202593d1901079687b77f18e4b1536bd7c4152ec197321dc945a0000000000000000000000000000000006a90568fa25b401756e3f86b5300c4d3b626dc6274f4685e8a9f56ec5ca2afce36a1fdc6d3414edc8780c4e650f10dc0000000000000000000000000000000012e41e8e0dd10b3ee31fa866753aa5d9db7669153b141114cdb2ef7fa6df5db27aef0cc70e76a741eae504b038ecf2300000000000000000000000000000000005c35f3372f1ec9845bd04ea722fbed2be1388abf59e622dd3dafb4b3af49bc5fba9e20235e7e58973fedf4b8b720691000000000000000000000000000000001111d18d621070509805d306a31c109701288fd55d4c0644349deb080c6591b6e852b4f7e009b80019513de7f2fce17d00000000000000000000000000000000000707c711f77bb425cddc71ecf96a18b6eb0bed7f012c4f6cc9431003f2e1ac17f7c1f68c4965a4fcc273a3db93451d000000000000000000000000000000001211464c91c7e78b00fe156da874407e4eeb7f422dbd698effb9a83357bf226d3f189f2db541eb17db3ed555084e91ec0000000000000000000000000000000006a90568fa25b401756e3f86b5300c4d3b626dc6274f4685e8a9f56ec5ca2afce36a1fdc6d3414edc8780c4e650f10dc0000000000000000000000000000000012e41e8e0dd10b3ee31fa866753aa5d9db7669153b141114cdb2ef7fa6df5db27aef0cc70e76a741eae504b038ecf2300000000000000000000000000000000005c35f3372f1ec9845bd04ea722fbed2be1388abf59e622dd3dafb4b3af49bc5fba9e20235e7e58973fedf4b8b720691000000000000000000000000000000001111d18d621070509805d306a31c109701288fd55d4c0644349deb080c6591b6e852b4f7e009b80019513de7f2fce17d,,,invalid input parameters, G1 point is not in the expected subgroup -000000000000000000000000000000000e96f4879493d577aa02e9793aba3c680de9296dadef569d70484297398cca1e3d8acadc6c188345d98d5208f5b2d7800000000000000000000000000000000003bee60fe5a42f31ae4218a6c6fff2ffb51329c86f8d3c381fb090bba0274eef8cf0d351fb4bbe2d51e25d9f7b2094ee000000000000000000000000000000001664847d2bfb8939cccda0bc7b7ef02fcc1188fcade83341db7c4dfdd4a1a3bdd627379544dd405bcdb58caf4be39cb40000000000000000000000000000000001a293caf801299370cd133fd54d2086c6d1aa96ec32a1c9c57679f45785c9e6fa91018720c2d0515b38790914ab61d20000000000000000000000000000000017efcbccb71f6bbfa515e89d59b5fcdda4bf37c90fc6dafe9c6b0fe3d42a372ad9c66e5d60e04eff30ea7c1952f3fed30000000000000000000000000000000018893c6a3c621ba6c1119529a07d6c2f9c1d4bee5e0090c4c0204d8d4f3e200ab3300dcdf1cfe61370d68849806ddd8e000000000000000000000000000000000e96f4879493d577aa02e9793aba3c680de9296dadef569d70484297398cca1e3d8acadc6c188345d98d5208f5b2d7800000000000000000000000000000000003bee60fe5a42f31ae4218a6c6fff2ffb51329c86f8d3c381fb090bba0274eef8cf0d351fb4bbe2d51e25d9f7b2094ee00000000000000000000000000000000060a0cdf9ea84b21c7399b21e337dab42f357c30f50b076b4f95bf8623b88e557cc8b346e41a996adbfbaf0a3697ae8e00000000000000000000000000000000003746a481d5760263d43ee3c2ed6493caddcc59754fb8534ff57ff9bf167f356d901277b9935210ddac4dfff8f21161000000000000000000000000000000000d80e40583153e6e0adf9f95ebc4fd501f5aa426ff77038b69f0fe8259268f9224628ead1a63b7ecb4218ba825ee45b60000000000000000000000000000000005d0421b213f88469887d67c68316a98c18d2035a601dec994f6a4b91fb6c3b7e5ac7741cd07c956908869e1023dd32d,,,invalid input parameters, G2 point is not in the expected subgroup -000000000000000000000000000000001576c6f620bbe36a7df78985dbffd355c032bb667f4757501bb27a426c99e1949a1bc65afebaeac0668ff3d375b7837d000000000000000000000000000000001651783a82f2a8e1e389923bfb53836492c00e447b288873071bd8682a0ef30864f4d0fc9a626bf701bdfe1a48f4479f000000000000000000000000000000001335276775545fbb4c701beb57cb34312108c9f1d46b4aa4b09a16faf0e648b4e80848bf5e75ed8730715f0107afc9820000000000000000000000000000000006ffff8736bab41b4ee5681b741a81fc870e648001027161144254d04c678e4f954e9f191bd8b26201aec681cbf0654b00000000000000000000000000000000026ede90d14fa0885baad21f9631bae058573251cbef5757bb8cfad061f3bdc78834fa5862dea19a2236c014b0f1652e0000000000000000000000000000000009844d0cf7f6f3401145d8d720defa577ca46b49e04e39c4c139ec6811a574e7dd5ce3acd00d1ce9496f10dd15c6d946000000000000000000000000000000000a6ff5f01a97c0f3c89ac0a460861dc9040f00693bfae22d81ea9a46b6c570436f0688ed0deef5cdcc5e2142f195b5c000000000000000000000000000000000193a17880edffe5b2ebedf0dc25e479cac3b136db9b6b24009ea0a9ca526d6dd9714d10d64c999d4334baa081b9f2fbe000000000000000000000000000000001335276775545fbb4c701beb57cb34312108c9f1d46b4aa4b09a16faf0e648b4e80848bf5e75ed8730715f0107afc9820000000000000000000000000000000006ffff8736bab41b4ee5681b741a81fc870e648001027161144254d04c678e4f954e9f191bd8b26201aec681cbf0654b00000000000000000000000000000000026ede90d14fa0885baad21f9631bae058573251cbef5757bb8cfad061f3bdc78834fa5862dea19a2236c014b0f1652e0000000000000000000000000000000009844d0cf7f6f3401145d8d720defa577ca46b49e04e39c4c139ec6811a574e7dd5ce3acd00d1ce9496f10dd15c6d946,,,invalid input parameters, G1 point is not in the expected subgroup -0000000000000000000000000000000016e8fb30c523be94fed64c81cefcbed03d7a2c85ce975601a441a920d70980be8b7c682ebf2aa3cc36ad1bf2d98a711e00000000000000000000000000000000056d7a36324b92ce3bf1644a2a0f6e717b0e9d94e9e5231f0c999c0f6eac936f5c1b1ff4aef04b821454a951882fd45000000000000000000000000000000000069ce7ace071ac2f7034200da8eb9252c55cbb50a591c563684013fa8071d7289a44ce5b100db6af1e8732b8e5b3b7fb0000000000000000000000000000000019535c703e9dec227c92db508c5c0553b986b93e3a90b35f472ad8e5b217bc7658ceb7ea452b76984d3d17859fbd7fc300000000000000000000000000000000008b3677ecfb10faae0478be5be5c72fcd7137042b5972fffbd15ac95d6104687a81fa3db232edbbb8703280412eddd30000000000000000000000000000000012a628e23e5c7f0225eaa75b6c9199d1d3a0316d474d1fa729640c295ec156ce3bd49f193d993165b9a69ad6cb2ed75c0000000000000000000000000000000016e8fb30c523be94fed64c81cefcbed03d7a2c85ce975601a441a920d70980be8b7c682ebf2aa3cc36ad1bf2d98a711e00000000000000000000000000000000056d7a36324b92ce3bf1644a2a0f6e717b0e9d94e9e5231f0c999c0f6eac936f5c1b1ff4aef04b821454a951882fd4500000000000000000000000000000000005b6ff8cf47cdedab38d984013db8401fa4783e7c8e78160c7a420de86636683b8dc292e1f0494dba5865f217e33e7c40000000000000000000000000000000008287d216fc45ee3e210630f0dc4893dfbba90b3bfd34986b64b04a2ec6fea0496cb0f2910cbb99a70896e5afcf809e8000000000000000000000000000000000a1a11f1b52c35b9e061c57b7b7f5f76f4db764607c93c2dddf245170f4c6fcf5915d72130e6f8f0c0c5b29a4970aeb30000000000000000000000000000000009255413a3db5889608069b7a72879b659ee5e1e71165752a9173cf1ef749050fefb86584ce90cbd3c3aa3db023b3322,,,invalid input parameters, G2 point is not in the expected subgroup -00000000000000000000000000000000117e2e3a8753660374fb2b812038bfd8f15d36d26c7b07fb546610405cd4442c79166060c8b8e767ea4084a583bbbcca0000000000000000000000000000000011247def4be1da163e724a175f74afde615df1417cdc2491158fd560442e56ebbcb61f51f9712ac93131024e27a1caa90000000000000000000000000000000001cdfae9234096578b9413f926ef8c6831f2c0f700e25d7553a746aef44238e493f8032e09f67f2fed9676c9611f60e70000000000000000000000000000000019c8bae08d3926997146f7827f00cde863684dd4050ea5da64f6798e7a930d3c1f34046bea0f44232594f5469db566280000000000000000000000000000000013574b997ee8988aa81db0e2ddb98be2e7005603076fac5cb246f65c869aa7bb3f148c8dde970e34e5e5efce023e633c000000000000000000000000000000000998bc9d41c5d527360fc4e68ba067d3778cf5cf00e5959b5ec52c1595aabe6e2e92d40cb34faa84513d150568c8cfc00000000000000000000000000000000009ec00ea2da59d937d3154d86dbed2957667253401bce9de80e0ffe6df32f36b06404b9e3af08e912a0b4ef091f93efb000000000000000000000000000000000dd8d1bd66f4accbc9d0c7dabef7af72f51c67a0d61384647533ad92bba44a312f0be0fa52163176f1aff4e64c00aefb0000000000000000000000000000000001cdfae9234096578b9413f926ef8c6831f2c0f700e25d7553a746aef44238e493f8032e09f67f2fed9676c9611f60e70000000000000000000000000000000019c8bae08d3926997146f7827f00cde863684dd4050ea5da64f6798e7a930d3c1f34046bea0f44232594f5469db566280000000000000000000000000000000013574b997ee8988aa81db0e2ddb98be2e7005603076fac5cb246f65c869aa7bb3f148c8dde970e34e5e5efce023e633c000000000000000000000000000000000998bc9d41c5d527360fc4e68ba067d3778cf5cf00e5959b5ec52c1595aabe6e2e92d40cb34faa84513d150568c8cfc0,,,invalid input parameters, G1 point is not in the expected subgroup -0000000000000000000000000000000018de31d75ba31dc1441bee38f5fb9e9d347e0243e6c3220de664e04a0af17c776fbb483f63ebeac48c7811adc0fff6bc000000000000000000000000000000001053f5c7a65dfb41b7631a22e60337769beabd663fa76eaa1e01f0c0e3c901f40a22b34adfb13b38e298eb83f08d7b1400000000000000000000000000000000079daf601b5fdd1c00552382a819e1924a517226864aa3565d384dc399e6e124c3ad61b236e19321078eab585579572d0000000000000000000000000000000008ff51b4d60d9fb1718c5622b1a3353675ca0144e12e68875481394755107b7f3364d1320283ce34737d5ea0b7d9b40f0000000000000000000000000000000000f430d35de439bf8ef82df4dc61459cf9783d66531e8075f323dbf102035032972a4830ba6bf391b568e6b691723ea600000000000000000000000000000000042df3a5c7b534c48c9af9f48e5cb296e2e514e3322630989c3da9696485797fe2ae036e13484e26cb59b48a479d3f520000000000000000000000000000000018de31d75ba31dc1441bee38f5fb9e9d347e0243e6c3220de664e04a0af17c776fbb483f63ebeac48c7811adc0fff6bc000000000000000000000000000000001053f5c7a65dfb41b7631a22e60337769beabd663fa76eaa1e01f0c0e3c901f40a22b34adfb13b38e298eb83f08d7b1400000000000000000000000000000000180168b2c9a59a9bedcf002336a6ce5d5ff36937948f5d3aa9fc1ef1912d9fed526edcaa00b5ede76906c40994937da00000000000000000000000000000000018d47a4f6e4320a230b8a4e5f5eea7807fb5b0dccc72af182e8bb811f2470dfd485f291b8197899af84332e3674d56950000000000000000000000000000000000dbfed96298ad2f57fe7b1eff4791abdae5fd0ca3573e66270f8c9f6adcbf6e54a746789a496714f5cc06eb2b8190070000000000000000000000000000000002939de2a2f7ec3d44dc5ae679967a5d7efcf80df8a21d9708c036c602a5050487f80a39cc36c7e587f0f2610fed86b2,,,invalid input parameters, G2 point is not in the expected subgroup -0000000000000000000000000000000001ac9e5f4fdccfe8d2979ad5329b07b23b497c2b7f26283f8c79548387610580568bdd9dc040261d6c265aac581b4665000000000000000000000000000000000eaf31d6368bb9d762ea067eed73b008dcb4d84643471dc1d64104eaefaf500858d9a9323b7fa2ba3c22bf15e7db6b9d0000000000000000000000000000000007457f2601621a99050d8993244f026b9a62ff7055b325e6f1edd1cf54065785f003cf7c8a4bb1f7bdf14e220e490ada000000000000000000000000000000000928eb76b428dde37546a27f3d77605c293738f448fbdd6d618747b0de04004aa4419cc5601600419c6e1d470c15982e0000000000000000000000000000000008074e9f5473492dd2e536f7b305be4e5c564cfc9218934d03dde6dc5118064ebaa5c26fdd1123a9c31336c37c1234900000000000000000000000000000000002bba1f9b7da6abd2b322c8f11c749b2a284552eab25a77d21b38b028da477a3ffec1901a015e81fe2893576a41e4c0b00000000000000000000000000000000172447291285a20c3ffcdef805260f00fbd4c5d3a42ee5b17d5ec05a723aadf4c2acc49f839e222155f29d0c6384bb0a000000000000000000000000000000001490dae85f858ed057fdb61c22ebf3d45c3af02afa53f32b2542808bb4db5bb1b9603e377f0b6d214e03050379f8006c0000000000000000000000000000000007457f2601621a99050d8993244f026b9a62ff7055b325e6f1edd1cf54065785f003cf7c8a4bb1f7bdf14e220e490ada000000000000000000000000000000000928eb76b428dde37546a27f3d77605c293738f448fbdd6d618747b0de04004aa4419cc5601600419c6e1d470c15982e0000000000000000000000000000000008074e9f5473492dd2e536f7b305be4e5c564cfc9218934d03dde6dc5118064ebaa5c26fdd1123a9c31336c37c1234900000000000000000000000000000000002bba1f9b7da6abd2b322c8f11c749b2a284552eab25a77d21b38b028da477a3ffec1901a015e81fe2893576a41e4c0b,,,invalid input parameters, G1 point is not in the expected subgroup -000000000000000000000000000000000515390641039576df1debf767b899deed928bba057d8564e7d117b324dd7f45e38939ffa1056fea35e1df8ba38815ad000000000000000000000000000000000013af9258135a09e5710a22dc437a4efdfee1f6c25cc08fb026c7ea2accddb9446333a91a532742c7713f6639e0cc460000000000000000000000000000000017203225f7e7b55e52793698b8a1166de5cb3d130c7df6f74ae428c4f39e7d042d41eb3aed266ca8cd3be1618cfcbdf60000000000000000000000000000000016b8053ab19a08a8c23a166bfe7a89be6eed05f305525146d9ff6e03e47ba125403cb2f000672d08a2b59051242f61ea000000000000000000000000000000001136f9a9369aa3561d65e54869f36ae9d6945654ac16335aaf717e0f848463ad401a99e83b3581c79d4221f65d649e9c000000000000000000000000000000000302ecf71033b917efac49d7a22db2e5c59b656639c4d0aefdb431749718d560b7e5580b4532048a693ccc09fb8a44a6000000000000000000000000000000000515390641039576df1debf767b899deed928bba057d8564e7d117b324dd7f45e38939ffa1056fea35e1df8ba38815ad000000000000000000000000000000000013af9258135a09e5710a22dc437a4efdfee1f6c25cc08fb026c7ea2accddb9446333a91a532742c7713f6639e0cc46000000000000000000000000000000001330e5c71d9b0209c8f8c04b4a28ad70d826b2c781493ac50fe58d0d6b740de3ed08f9829aa9b207ecf623a36dc8de610000000000000000000000000000000019a81ae1c6c08004a75b8fb5426ec899a09becce68dfb63fa7335420f05075bcf42c85dfa688ae75398c3ae5e4d28d12000000000000000000000000000000001597318859306f3814d20faee54926d5e8ec01005fae8aa408989afd5a1d7add8956d8fd3e75f9e446fb8b2a31050b6b00000000000000000000000000000000151e7c5bbcaf1e9581ac48e2b9bc63bf4576ee5d938981550f00fe9e3a42d389d6b56acd0ac9254ceaa71519b5049a4c,,,invalid input parameters, G2 point is not in the expected subgroup -000000000000000000000000000000000a2e9dcb8461de77fffb1281df7360c947108baef671602902c3bfa4afe60e0b4810cd46bd91276cd58e33fbf4973301000000000000000000000000000000000c039ea7e94fca4a32a275691131df8e3d470d6026aa306c8ae855e9e411878247368615094621e6af5486809b467a7d00000000000000000000000000000000138ddc71e9709e595ce2631c9155069818d07f225f80511eac21c5655721df83f83e2abbf56e2d5ebc9698f9128f0579000000000000000000000000000000000080f7ae78277c94833c0f12aa2cd98285621e0d92a89b45cac848f5a75ea652e98cd085150b2d7babaa9a365123d90e000000000000000000000000000000001147cec62010d42cd84651ec61ad8263699786f0f34aa7f9de75ac841861fae2e8ce3795fde8e7038c8506f573cf0e0f00000000000000000000000000000000138ed243889db13546c69583c1aa93ee98366220ad80c590ad112adcb4b7c87fb48a34483e76d4a5c55a30f2adf1a6a6000000000000000000000000000000000077b7a4c4644b21ac3ef56db1163f7b2e07a817cfd9d4c6830a97d0ae0b620e0b235376d590162c378899ba12eadb5900000000000000000000000000000000022beafe4b4ab44434c9dabae45a395b5b8da15da2fc2e723c1b30b5efc95e880846844f27eb47dfae8657fa27ab64ef00000000000000000000000000000000138ddc71e9709e595ce2631c9155069818d07f225f80511eac21c5655721df83f83e2abbf56e2d5ebc9698f9128f0579000000000000000000000000000000000080f7ae78277c94833c0f12aa2cd98285621e0d92a89b45cac848f5a75ea652e98cd085150b2d7babaa9a365123d90e000000000000000000000000000000001147cec62010d42cd84651ec61ad8263699786f0f34aa7f9de75ac841861fae2e8ce3795fde8e7038c8506f573cf0e0f00000000000000000000000000000000138ed243889db13546c69583c1aa93ee98366220ad80c590ad112adcb4b7c87fb48a34483e76d4a5c55a30f2adf1a6a6,,,invalid input parameters, G1 point is not in the expected subgroup -0000000000000000000000000000000004db2336ff5016a6f0f34b2881eb80cfbb35f557ef492f2dc54a654c8c574651fc89f3f211a46510ebffcf5c890e5ee700000000000000000000000000000000103d17d59c26d8c85426b73593843e3863cd672043b7a392cdb05bf5dd69cd11583423a4b146dcd3fbcde4ef4349bd78000000000000000000000000000000000e07265d2762e8e398c83efe1c43452d91b90b7a4271c09ff693c83745a6c01b73561ffe3da9300c8e7e1602dbaab0bc000000000000000000000000000000000375579c16a167fd9f9f61d5177705f157aa0df3451971029a9444432db119fb33b8c07de33fc822eab46ed4ae47cf8200000000000000000000000000000000098cee454129e946d758f95e649a601b6e682467093cf32c76e5cd1328111f9d48cbb2850d4d2faafe429161b090f8ab0000000000000000000000000000000012a3fdf296743b2eb3f389eb6dbea52da21e7dbaad180177184afb7976e06fd4ad488399d39b760ca146278cb3759d7e0000000000000000000000000000000004db2336ff5016a6f0f34b2881eb80cfbb35f557ef492f2dc54a654c8c574651fc89f3f211a46510ebffcf5c890e5ee700000000000000000000000000000000103d17d59c26d8c85426b73593843e3863cd672043b7a392cdb05bf5dd69cd11583423a4b146dcd3fbcde4ef4349bd78000000000000000000000000000000000e87688c9f6f48450528cec78f874d87dcfab499bce391e964a0abd601d675eec8a2b4cc6c44811cbe918913a230975c000000000000000000000000000000000451c1a17567b55123da563e173b2d92ab635c4957d116fdff8eb5a3e00bfbe079abead42b9c990b56db919719d066160000000000000000000000000000000003206eb27b9e53bc451bdbe5059133a51d656d9d80654647163a070741761af3e712e2042acc5ca29fe72cafb3a98ec7000000000000000000000000000000001869b7fd294c230aa5901db9cca31e6d3801069e0795e4c7c63dea8adc1e4a5709ec62670e2abeeb040031b7fcc8521a,,,invalid input parameters, G2 point is not in the expected subgroup -0000000000000000000000000000000007248a496f2cc918cc3cf0240c5c3d0dce36228a199766106999205b5767db09c2ff5cc720691ebc6bb1c316159d1c000000000000000000000000000000000019ab8e34bc4c0ba409c7edf7bbd4d0cf03f7185a2baa3f22ebd6234503d56e9b0d84a5d8d46ef9e3ac6430029be82b2b00000000000000000000000000000000143220e1cd08ffaa6db4795ed4aa35f3b12cce724fcad005367328972f2364f34096e32f1f1cb7a4287ab636d0030322000000000000000000000000000000000f2de47a37a55edbb75ff0bcc446611d690d7f9efdd09ca1ebb6f1d64a330bed420bcc85aed8b95316fcac3aa7d1f2230000000000000000000000000000000016afb044b8b8c64547e000f80b25576aa329a4319dcd4f1bbe15d12e6f3bbdddbb52140e6297c637311ef0c7a31cafab0000000000000000000000000000000019e6803c07fbaa075093f6a69f9dde05ba3d3f58e67389d7f096e56df49f8270008ed422b64fcdadf7cbbc8334037682000000000000000000000000000000000b231eac9869c94f055f22c16ef5efb687a7399da838c9456bb2469b3e394dd21e462bcc9298d5b56173c7b76f79ee9d0000000000000000000000000000000013a1bb963b7fbe1c3f6bb78cce8c3122773428ccbd87cbb2e76f306a8c5369577267e9b4ccb3417a235fc9045e8828f100000000000000000000000000000000143220e1cd08ffaa6db4795ed4aa35f3b12cce724fcad005367328972f2364f34096e32f1f1cb7a4287ab636d0030322000000000000000000000000000000000f2de47a37a55edbb75ff0bcc446611d690d7f9efdd09ca1ebb6f1d64a330bed420bcc85aed8b95316fcac3aa7d1f2230000000000000000000000000000000016afb044b8b8c64547e000f80b25576aa329a4319dcd4f1bbe15d12e6f3bbdddbb52140e6297c637311ef0c7a31cafab0000000000000000000000000000000019e6803c07fbaa075093f6a69f9dde05ba3d3f58e67389d7f096e56df49f8270008ed422b64fcdadf7cbbc8334037682,,,invalid input parameters, G1 point is not in the expected subgroup -000000000000000000000000000000000ee60801e3aaacf27167207a03b42594cdca4cdfe3a1f8e5f87b0e423ad36c56725dc79a26c157f41699e89884d27c1b0000000000000000000000000000000017c92b0beee470e126830843170bf0a89d13856ff6b0209e23bbf2a68e0668bd81db29de726ec7593124bea89771da97000000000000000000000000000000000a1beec4d223edbf1d09c448ea27038327bd8621842d3c7851779286060abd8130e4a641100627057498a421b59e90a600000000000000000000000000000000076a9559f5e33a2d5bdff6a89037c12e58ef920a3d8b9b4ca2a78299dca5dbf07c80d51014ee9288af8725e6c4312225000000000000000000000000000000000755036dd19c7d703343bc29238ae9332823514aeb4779b3378e8f7a3463a4089eef3fe79608db22b703b5d88c65bd80000000000000000000000000000000000ee3d82959dc04b5d59428142411e48e7a2fcfcff91e5554b725868c62d139bfd763720c9e2727c1b1fdc0bfd60f7297000000000000000000000000000000000ee60801e3aaacf27167207a03b42594cdca4cdfe3a1f8e5f87b0e423ad36c56725dc79a26c157f41699e89884d27c1b0000000000000000000000000000000017c92b0beee470e126830843170bf0a89d13856ff6b0209e23bbf2a68e0668bd81db29de726ec7593124bea89771da97000000000000000000000000000000000360e8bf07554b56d6f27de6a4b1f9184adb7980311e8f4128f619d9c8e64e98bcfca8eb3cab93e183882827fce2d06800000000000000000000000000000000010b0b114b55b17531576f782b6bee122cb5fb1e40d5af37ebaa1d4dad55a0f5d130c9a58cf27b1594eebd0b1492c0400000000000000000000000000000000018b70f0c047aaf7e17cb96015642e0d32f3135999de6dd8bded2c600866485ea75ab3a3e37581ae7dcfa1f54381f542300000000000000000000000000000000028cbef4b476a9cfb8daa35b1321a486b8c94f8b8df2352a0c8d509325706eee328b8dc3657122afb81be1fa2e60aafe,,,invalid input parameters, G2 point is not in the expected subgroup -000000000000000000000000000000001573cb3b6f4e841fe97549f42e06db33abeb2bc481cc0bc8c5e7bd81948432dcbd34b64c5766e1e491bc131e77a011aa000000000000000000000000000000000e205be14db0dfb21e58b302d45916de4f4bb48ac95228326cf49c50e6c8588a655a343b90645f73dd03c9aa51c5659a000000000000000000000000000000000a109e3cf72bba0e695bd756478c72884210868c95f0dd6ced22b7254eed0432c2345bbf8addbbd11349fec6e354d2350000000000000000000000000000000018aaf98535812ee760e17ad933acbe6b57bc1310b6fef550210053f06a611ce9df5dfcfdb028497468802c08cc2117320000000000000000000000000000000007590fa8cb07f9dc2ce7b2090685730104ca65a101c8f93965264913bf1deae794b71ff226a805a273248dc641225585000000000000000000000000000000000fbca4e20854a6069c298224eca9a064b7ddc4d834f8671ac45cb5d1d39265fa435ff1750cde5135e170824e516d6d2c000000000000000000000000000000001510f39616d7f576980055d0547c603d882dbe85dd0b634577fae134f210736007345d035d815306db660de4a07fc24300000000000000000000000000000000064d356ad7bd2edcd3622b1fc225fe319f86b5f7da875cd57fe5adc5bdb6443c5b09d676950e2d069bd4303b8f920692000000000000000000000000000000000a109e3cf72bba0e695bd756478c72884210868c95f0dd6ced22b7254eed0432c2345bbf8addbbd11349fec6e354d2350000000000000000000000000000000018aaf98535812ee760e17ad933acbe6b57bc1310b6fef550210053f06a611ce9df5dfcfdb028497468802c08cc2117320000000000000000000000000000000007590fa8cb07f9dc2ce7b2090685730104ca65a101c8f93965264913bf1deae794b71ff226a805a273248dc641225585000000000000000000000000000000000fbca4e20854a6069c298224eca9a064b7ddc4d834f8671ac45cb5d1d39265fa435ff1750cde5135e170824e516d6d2c,,,invalid input parameters, G1 point is not in the expected subgroup -0000000000000000000000000000000002ff87f9bcde30db0919444e2582a5e987fdda67264ed7abf60a93b37288143dd44db75403988cb5b3bcd8d34ebdb4e2000000000000000000000000000000000c672f8bf6e9e747cccb9438be047e56d1cfbd0808864e601de59b0b28b5438cdd10f1194ff5abe8694a598ff3dc1481000000000000000000000000000000000c01823cb218303c7e611f6caf6994615cc3805bb4310bb0bb82b56740c4314ed0a2f9409c8fa6b9f10dead667880fe000000000000000000000000000000000013eb3436ceac3f12dcdd9e71707b85b7cd872ce144c502078d4fd3ec8b4ee579410cbaf2e3db1df9ba6b55f14fbbb0c000000000000000000000000000000000ecb26e5814d5bc66fbbcdff5dd5934a597c4344487e7e63138c31d47a8201433be5ce14205660cae129891f5b7aa8e000000000000000000000000000000000040241f695cc864e99e1dcb04440135c4f3d90a86310441647ab265e9fedf51592b0c11d5e91d2d28ac4ed19245e9cc90000000000000000000000000000000002ff87f9bcde30db0919444e2582a5e987fdda67264ed7abf60a93b37288143dd44db75403988cb5b3bcd8d34ebdb4e2000000000000000000000000000000000c672f8bf6e9e747cccb9438be047e56d1cfbd0808864e601de59b0b28b5438cdd10f1194ff5abe8694a598ff3dc1481000000000000000000000000000000000a2e0129c31f3427340e234df5facbb5d1994a4c8a058fe84f7d5c62c7d00013cc0133d8b0faf497aa8f7c04abc59c3400000000000000000000000000000000160da6086a089fc1a31b89a0f0c95ff2bd85debf5f0d1372f3ca6fc26348d8a8d0b03525b27f7d7db6603f0e55d3a08f000000000000000000000000000000001893edc299faf35510b92c97ef665f458b19e4097299b4f8b0f8a2ea1f31343c9d2f4c35dbdfb36bf7f3e30686e8c3240000000000000000000000000000000009b8731ed8df8ae90ec344c9dea1eeee98f4000b5fe30460e58f30e4ea17821389d613458c7721fd1d759ec4f2bcb325,,,invalid input parameters, G2 point is not in the expected subgroup -000000000000000000000000000000000e42f5097dabc6b0fef4dccbfc659da40b66671d7efbc19dbc14a42a368402156469c818f233ad911574899db01ed86d00000000000000000000000000000000128bbee344b7a19212b549cefaaec31c0644c986ab863005e4d3ecf532be633597ac3906e53ca79b22de916ab92b4ad70000000000000000000000000000000009003b42c08b5c7d3ee9f6abb96e08e6f537da25cd0cf7eb85a49067746c03566e133b54153380286ef5725db5b41058000000000000000000000000000000000f09b7b754c255e0e3b8435ade64d6960285759495659dfdb9b117806397baf8d3c87e30bee02c9e1b22fa3efcc58f300000000000000000000000000000000003582c08a8de4bbd20ebfa833517a75682618fba2702b6c71a4785f70dbdede4e86ad8e04aae1f50a6bb75842ab74aea000000000000000000000000000000000ec013f22e64a4d4fb6f964e8319feb1ddbcfb71329186545d9b9d7f97d1f6a56c8aad03d20e9c30966ca932e1f2bc670000000000000000000000000000000002f78becf8a5717fbfcbe110bd6d4ba683658c1a45afeaeecf7742502d3df54b262de4fe30bd41ed0019cc79b595b5ad000000000000000000000000000000000dbae184899af1ad6221b75fc62cadcd61c623e011672b691a5aa498684f49796220fc5a73ea7170ed2fa44b9f3c39090000000000000000000000000000000009003b42c08b5c7d3ee9f6abb96e08e6f537da25cd0cf7eb85a49067746c03566e133b54153380286ef5725db5b41058000000000000000000000000000000000f09b7b754c255e0e3b8435ade64d6960285759495659dfdb9b117806397baf8d3c87e30bee02c9e1b22fa3efcc58f300000000000000000000000000000000003582c08a8de4bbd20ebfa833517a75682618fba2702b6c71a4785f70dbdede4e86ad8e04aae1f50a6bb75842ab74aea000000000000000000000000000000000ec013f22e64a4d4fb6f964e8319feb1ddbcfb71329186545d9b9d7f97d1f6a56c8aad03d20e9c30966ca932e1f2bc67,,,invalid input parameters, G1 point is not in the expected subgroup -0000000000000000000000000000000002dd02e23d8a9b7aaba94e8ce97a2d988291b6efb1d4d8d1c53b65581b737f992a428cb72ad38d4c6d470d6b50c869f0000000000000000000000000000000000661ddb1f0edbaa208c5e1db143ff41be5a35442da7b3e12d2928310ba5b64847f4909be93f860858f752cffce5e73870000000000000000000000000000000018fc47e1aaeefc1ea653eb42543940ba58044b247eef2627331142988f3a1a4fe72583738c7caa00c562d010089754eb000000000000000000000000000000000b5f8e9d774d99c3b6d224790d5c48367d68167aafc309ad8b351d1de8b601211737235bb0ff1b01e508ecf36a40db5d0000000000000000000000000000000013509c76fe4383e47d8ea35ba6ebcba13579bbf43cee0cbe27291d2601c3d74428bc9d5d1200718c86977abd16cb77a7000000000000000000000000000000000efbeccb9e9f348ba98ce0fd191c2e81de4925d7185f01b39a51aa44b30496f1fa3be4582c539889bef7b5783f730aa70000000000000000000000000000000002dd02e23d8a9b7aaba94e8ce97a2d988291b6efb1d4d8d1c53b65581b737f992a428cb72ad38d4c6d470d6b50c869f0000000000000000000000000000000000661ddb1f0edbaa208c5e1db143ff41be5a35442da7b3e12d2928310ba5b64847f4909be93f860858f752cffce5e7387000000000000000000000000000000000629fc2184297509e1dc0707b707067fa8b9a079d95f271ca230c32705c7e783f91ce1ef0323aedc6aa2febf750392b8000000000000000000000000000000000f29cb4bdb7d53671f9f1b1ee514cc916a657b7c17f298f409ad92ad7b2ca36b0298bd0581db7837994b781b829980c30000000000000000000000000000000014b839ecd27f2d6fdb92a36792c62ef503fb0189d3174447c4b1132e5f66d7970a005e315e6906ecd2ce6c72742d210500000000000000000000000000000000091bbfcfbd929cc8ecd000cf8ccf083c2f8cbd84f19b48b1ad20781e675ca7a77887b962435520e3f707fc0631fdc8f1,,,invalid input parameters, G2 point is not in the expected subgroup -000000000000000000000000000000000f67855b0cf915ab52190c7e69129d40dbeffae28fe110745edefacdca42bf979c5c5da1c6ebd78b43667cbfe360874c0000000000000000000000000000000014c5523f37b011c632e9e8eb08611e5a244ace2746264706b92a5a933b34bb9932c95c493ea7e8fd049d80acddd05e860000000000000000000000000000000012b63d867bbfe5505a83f765b85b0e8f182c796857f11125e691969c8e81eae927a5e1b137c81473e8b99ea0727c873c0000000000000000000000000000000010a8241f3b30c54a5d2fd7adca9be47b001f2268973e955ffa61d57793256a2d82fefa5e449548c64fa5aefda6d933220000000000000000000000000000000008e7d2f2e34a60504a5437275f358d0e742c445080c5e46053ea459893d6865e8d20906b2b58f1d1446a100cb1c9a513000000000000000000000000000000001369bfc5f24e2a7a7ace891444764ca32a32513c8ddf654f418c6eb7690e2cba77a4c4d4b98eb546d4e4046dd3c3267200000000000000000000000000000000153310de30b7a485753dd8443f8638c12b21083f6133a1c093648bcb566b33f73631c6fc558f32abeb0d6df8430e61a900000000000000000000000000000000005be397e9f77556ad952dba0540f46cbc7db910d5203cb976e168a7be3a3b8557c5f08d51cca9379552694a291d67fb0000000000000000000000000000000012b63d867bbfe5505a83f765b85b0e8f182c796857f11125e691969c8e81eae927a5e1b137c81473e8b99ea0727c873c0000000000000000000000000000000010a8241f3b30c54a5d2fd7adca9be47b001f2268973e955ffa61d57793256a2d82fefa5e449548c64fa5aefda6d933220000000000000000000000000000000008e7d2f2e34a60504a5437275f358d0e742c445080c5e46053ea459893d6865e8d20906b2b58f1d1446a100cb1c9a513000000000000000000000000000000001369bfc5f24e2a7a7ace891444764ca32a32513c8ddf654f418c6eb7690e2cba77a4c4d4b98eb546d4e4046dd3c32672,,,invalid input parameters, G1 point is not in the expected subgroup -000000000000000000000000000000000f3300926ec62bbc0a73e4e0404de3a55dc0ad4fdc393b291ccf9f80818b6a69c0a3f9c6edf024db295a353b6aa71a5400000000000000000000000000000000195b21606667c62a181b275184014fcef97218b451c3642e2e4dcf5502d03cbcc88839e827732feb32e77e52f702529c00000000000000000000000000000000198fe6684d3de4ec9c9ed5c59c9e662c4eb1b026995859db3a753ffa96c6cef7a063a607fc54599f706820fb864d7b0500000000000000000000000000000000116af6c03511ba2bcc32ea54c2fe2bedfb0848d2ee3017547cb25acf892400203e3ce4ea1986ecde0cdd383d42b61e180000000000000000000000000000000004a22ed8f30766b6b1dfc7286616066ccc262875e3de42e2c9528f6d23a7fda67ddb371f9ec419ae4dec48a354ffe21300000000000000000000000000000000086651d7ab0a4b1dfb9a56e42443f42d48c1f16866338d997adba078736d32bf4387b95da2da33e714662f800838a077000000000000000000000000000000000f3300926ec62bbc0a73e4e0404de3a55dc0ad4fdc393b291ccf9f80818b6a69c0a3f9c6edf024db295a353b6aa71a5400000000000000000000000000000000195b21606667c62a181b275184014fcef97218b451c3642e2e4dcf5502d03cbcc88839e827732feb32e77e52f702529c000000000000000000000000000000001367e0843d866d010ab03723026aa9ab1f930d3579daeabadc1fdefc06047ade30b36326d79bbae74293d3daf2e6c7a4000000000000000000000000000000000550be918ba9e28ddacb89ec526db63072bc14a62ec7ac06775f951de5b32af93d2d8f95389a6384cde62dffb941fb5a0000000000000000000000000000000014f59aa4f0603d5f166caa5692d9b068ee10a6f45670c6f4d492a4d1fa7a13a5146efcae33a841b5acf75a32b853b2770000000000000000000000000000000010ca0d9ba50c730006c95bc5439e2d39a40a9055ddac935a900bdeafe7141990db20ad0a840d3297c4b9b5f69aada6df,,,invalid input parameters, G2 point is not in the expected subgroup -000000000000000000000000000000000b9590b1d0d292d9967d759060a551f4e8e4c1c0066a9a3c0be515085847fa26b77462e3bae9e2621f28e01f897df0bf000000000000000000000000000000000a00d39c6c14d18dc5888b8a8835c3ef6f83ead2fa380be24ae857677b904b3868ceabdbb3abf3c186c5353a67fad0a60000000000000000000000000000000017d978d60fc89b0429c1a6424231fe9274cedad5d78d9c4ac5aa2dd5e70e8238a0bb1904bb4b6ee5de5cd1ac514c62a8000000000000000000000000000000000d4ce85a95dbc40f405f4e7ebf9121cdcd22766737c39618ad0fb3e10a6e53be1faceaa96073b2a877ab808483ec9b6f0000000000000000000000000000000016c61599ae4da787fa6db233fc28f5c56f7133d403901800ab5fa19d058fb27ecb34ca2e56ffa7628ed004c9e62092700000000000000000000000000000000001e64e4adfdafbb423b1b9f8973738c690713911f68f658d234e57dc35b9554e0f7ba345dd7920b429a12b9c74775222000000000000000000000000000000000c453b5a2f6c721f0303b6b9205e51ccab7829345e0cf13e457491ff35e0f38dc5ac2e5b0d8195e3d322704c38d3280600000000000000000000000000000000092ddd55120b22e2853983dd3dea9bad3e4bf23e46dce297aa3db85856907d1b980185c5a6e02890f24a5463e7895b950000000000000000000000000000000017d978d60fc89b0429c1a6424231fe9274cedad5d78d9c4ac5aa2dd5e70e8238a0bb1904bb4b6ee5de5cd1ac514c62a8000000000000000000000000000000000d4ce85a95dbc40f405f4e7ebf9121cdcd22766737c39618ad0fb3e10a6e53be1faceaa96073b2a877ab808483ec9b6f0000000000000000000000000000000016c61599ae4da787fa6db233fc28f5c56f7133d403901800ab5fa19d058fb27ecb34ca2e56ffa7628ed004c9e62092700000000000000000000000000000000001e64e4adfdafbb423b1b9f8973738c690713911f68f658d234e57dc35b9554e0f7ba345dd7920b429a12b9c74775222,,,invalid input parameters, G1 point is not in the expected subgroup -000000000000000000000000000000000eb7d975030858b57bae3e7a8a7e297f9d7d6b2bcf27fa8bb9b73cf60a1a1a5e6638adc726eb2e7fd5500353de95179e0000000000000000000000000000000015c783845a98d2b12a8cada673e1df4c266b34302cf7d004e00612584d0913283d43150337c36dc3912bbd757e6a370b0000000000000000000000000000000014a0222d6d0a809cb5598db18e35f5b7f5c49ec5574fbb5d801d9f890ede23d20c62a22321394b6efd1a45b9780a4efd0000000000000000000000000000000017c8bc1b8f7ebbbcd6203f6ffcc758a787a96533a77290affc18b76fc6dce7c2ba8f169dd8ecdb8b240c92664852bfc70000000000000000000000000000000001a673ad0af4bdd53027b145472d1e8dfa05029b7ba5bcb7dcc63b5e6369b2e693f27e5665167a8dc8b6d3c9b85eccbb00000000000000000000000000000000085efb596145e58b4eae7aedc8f7aff6949f1edf8fbe0c88e6dcad46423cf7b2d5f8f54bbdcf8f1427438e6a4da71914000000000000000000000000000000000eb7d975030858b57bae3e7a8a7e297f9d7d6b2bcf27fa8bb9b73cf60a1a1a5e6638adc726eb2e7fd5500353de95179e0000000000000000000000000000000015c783845a98d2b12a8cada673e1df4c266b34302cf7d004e00612584d0913283d43150337c36dc3912bbd757e6a370b000000000000000000000000000000001425d6d5cfd04d310d8ef3ff1a3b3d227771f3bb3cb552c64ca1debd3e2e75e7a96b9a0d5768ff041098d743de445e790000000000000000000000000000000008b12959963c17ce7247490d9806e0ab02f9aeed8d8faf4591b955885f5aae509358a19c1eab19dacb72cb67b9c22c46000000000000000000000000000000000a7108fb7442fa6c50b472dda60d6c277bba83aa21ac1630bd3df6f116c8a58e60e8c4a303a041b9825b65301d388e410000000000000000000000000000000000faf3042f00060eff3e5e13e1a964c9dd605677596c49cbeccd6d0374c6a4ab9742cac63d1801631d5fa5e00d399fd7,,,invalid input parameters, G2 point is not in the expected subgroup -000000000000000000000000000000000f6d131c756d031041ba97dd20719cbfc864de16dddf00d282f6c41de683d193a015a781232ea5513321c131505fa4ee0000000000000000000000000000000008d754d62b8f1fb0d0e9dfe4746d9c5f9e4a296c6799d6379a4a1a07583d0959c62b05011b636b72cdb87d3c92d94f3600000000000000000000000000000000061bf88e4c5f6bfacbf1e2e72566d9c44a001237f22d7f6a7240ee0bd3c8d175786f7c2ace267774fa5615d7bd3ec8f800000000000000000000000000000000192c987bed20d707400d3211e480b8760021a33dfbaef829b1e865f92b37cd3962e56a38d4c06c5ad73bea5e7321b176000000000000000000000000000000000dbc62270cf7623e571f6ebcd29f426f214cf1c8f71edf9aeefbeb6037b7e71bfe41a55828cd4353bae2e1e927812aa80000000000000000000000000000000005f6e7064a9708e20bce8e5002c352b13d4531d87be1320bcf3322d5e2b851a54aefaf6f9ae26e277ecad307c448511c00000000000000000000000000000000041fd1625afa48a446454d6613c17cc6a65b3ec8b8f2125c0eb7b8e5d07968397d43969a6579226f496d9b24dbb71b820000000000000000000000000000000006131c506f243b5ac40354f826ac1838839eee9f61301aabd88e499d40e57df3122edc8b36f0a8b16b72f9ac783efd3e00000000000000000000000000000000061bf88e4c5f6bfacbf1e2e72566d9c44a001237f22d7f6a7240ee0bd3c8d175786f7c2ace267774fa5615d7bd3ec8f800000000000000000000000000000000192c987bed20d707400d3211e480b8760021a33dfbaef829b1e865f92b37cd3962e56a38d4c06c5ad73bea5e7321b176000000000000000000000000000000000dbc62270cf7623e571f6ebcd29f426f214cf1c8f71edf9aeefbeb6037b7e71bfe41a55828cd4353bae2e1e927812aa80000000000000000000000000000000005f6e7064a9708e20bce8e5002c352b13d4531d87be1320bcf3322d5e2b851a54aefaf6f9ae26e277ecad307c448511c,,,invalid input parameters, G1 point is not in the expected subgroup -000000000000000000000000000000000c9856c54b638559ce67cffb3e784b9649bbeabe135c89ecb8108341a16ef3c5ac49e9243144792a4f9371f2d6f8f6b6000000000000000000000000000000000e17a67cdee23e13c95e5b951c5f51703660ff614fbba363e5a73ea74b86af6893ae90a929df3d7e2af8852dbad77a01000000000000000000000000000000000c01d2e1592a61cda87dab7fb2a45d7468a8ce56f74fd7c8d401e224b9610d675cbdc0d4719dd2dc10f47547bc641dd90000000000000000000000000000000002d57ac9ac9b4cd7a477e162965c763ec1d0c5752b478449839e0ebd7a1110374fe90aaa2006bd03f08f9242c0419e99000000000000000000000000000000000d50b11e1ea90ef8ef0f7a95ad41ce2cd30cf804e46a96762fadbc275ad513827e6e75b95968a00b42085aa89bb0839e000000000000000000000000000000001250e40358d42dd3a6aa2dc93d89010f2a7b33e5b426ffd7e6eeb9bc02f8f22fd6e91c4fae603f14ed682617dd503eda000000000000000000000000000000000c9856c54b638559ce67cffb3e784b9649bbeabe135c89ecb8108341a16ef3c5ac49e9243144792a4f9371f2d6f8f6b6000000000000000000000000000000000e17a67cdee23e13c95e5b951c5f51703660ff614fbba363e5a73ea74b86af6893ae90a929df3d7e2af8852dbad77a0100000000000000000000000000000000048dfa619f3f77c794d119ff97e04826b5bf49d71591b778b502205875b97b17c9c9d2ae95c8d7035e9d2ade10a511ff0000000000000000000000000000000002fe9b3108c8911b07e4ee52a8d4df17bebc8153f837665513ad5c8af53cd7387100204fafefc2febb2f5e18c9d958b10000000000000000000000000000000016c98a41fac6665657b00bfe9336942e7aa145bea3131224ffa35ec9b9cd4d629b4ceeca98a15ad07e03ffcf898f8a390000000000000000000000000000000011a0d16ccdf98beffdb0953c509261f18567a1656acdd895395b480ebf8843e7d3b965e2151c58e9b610e9e3b5491832,,,invalid input parameters, G2 point is not in the expected subgroup -000000000000000000000000000000000f4eebd0bb8233e020629f72258d3cec7fcd3c181fa913977a405ef7437f6fdc0ee34fe6a7e349730e695f383e4478ad00000000000000000000000000000000080577fec3a6cc706037b43cd39f4bace98191511cb26cc606c11659b63112b519123a00b62158ab7a24dfe086705b470000000000000000000000000000000011e8ecf1e341f0146c59a79a8428bb01d2399d3f87d90d057f63e6cb9837432154d17975f70df175a016735caf85120a0000000000000000000000000000000002a5bd53e4f4c5b9682e1af1f7e09dd305e7342d1688f62885b5e59f173a9fc731cec481559ad693030004a5fbd90a9d000000000000000000000000000000000f9601f95e12bf05c35deb204558d44a60fd630c05f4060b7bd9ff943946e8eab507422afe00a3e7706b8ed013f712c20000000000000000000000000000000003bf6fecc0c7414a69c2b48e2c16e88d988ea8ae9d8b59017ecb89394732a20e4321cb5e4fb071aec7d2736220a455370000000000000000000000000000000018fe22fe0b39f508823e2332712f988efcce291d93c416c544272e88cc0902d79e41b01af005feddaaef6c42a26c824700000000000000000000000000000000164fe8d2934cda6f0b863bb42d13f91c52a49706182f8d337d6a629da65113818d1c177508d6735cc86a6b3837ce49320000000000000000000000000000000011e8ecf1e341f0146c59a79a8428bb01d2399d3f87d90d057f63e6cb9837432154d17975f70df175a016735caf85120a0000000000000000000000000000000002a5bd53e4f4c5b9682e1af1f7e09dd305e7342d1688f62885b5e59f173a9fc731cec481559ad693030004a5fbd90a9d000000000000000000000000000000000f9601f95e12bf05c35deb204558d44a60fd630c05f4060b7bd9ff943946e8eab507422afe00a3e7706b8ed013f712c20000000000000000000000000000000003bf6fecc0c7414a69c2b48e2c16e88d988ea8ae9d8b59017ecb89394732a20e4321cb5e4fb071aec7d2736220a45537,,,invalid input parameters, G1 point is not in the expected subgroup -000000000000000000000000000000000d6e0830ba9839db89621518e1ed86e9d035d7fb03b18d8a615acd58ff5c8c3dbdcf1acfcb8a910e8d3d0da770057cde0000000000000000000000000000000018c38d6e458e22cdd381010568606d26770b9eaaeb38e02a80cd0a0d584577fca7b391bbabe902825a3338682f7d3173000000000000000000000000000000000e5d5bfbe5ab3da8c033663cc457cf69062e1de6bcda6420826301d4e5fb4c47a5c90432f15608aa50678ad083f618c700000000000000000000000000000000146cd56ad5d977fa6471f7c12ee3fd66dfbe4b276b846cf4a74619cfae4a5101e85d01db615e0e6d28a5eca7a92cd05d0000000000000000000000000000000010fa99a243f1de85f40bf6a08e3e9ed3e478562468f0975bb79b1b80c9eef8c433c18ccf6e5149eb99c21f74494eed6e0000000000000000000000000000000018504d4687cf9f055c5cf8360fda2cb2123ea3a3e9c8f58853a68063e60a7ba24f2d1c153090ba2e77156cbb5ded79d7000000000000000000000000000000000d6e0830ba9839db89621518e1ed86e9d035d7fb03b18d8a615acd58ff5c8c3dbdcf1acfcb8a910e8d3d0da770057cde0000000000000000000000000000000018c38d6e458e22cdd381010568606d26770b9eaaeb38e02a80cd0a0d584577fca7b391bbabe902825a3338682f7d31730000000000000000000000000000000016267be431a654019b3f02389fb2f2f307f3bb56590c3ff1924554b2ee6fbbb68381b5ba4a8668fc541dd7e3fe9afc9a000000000000000000000000000000000c41d1daa258be71001babb484d98501c9ea015aad96e398aa6015b9ef618f6a56a45d45383dc34c70ca05242490ae18000000000000000000000000000000000dadc282d8cc0c066f28881cf440fb5a621449dc16488d02e34492fe8af53fd1749886fe6df2e377190e4043d6e3dd290000000000000000000000000000000018a30f1ae8927af27147ee5ea3c7aa848b0e303d16018fc2c3ca4bd088ec5ad3a808e7699ca009a4bf6f5b707edc1fd8,,,invalid input parameters, G2 point is not in the expected subgroup -0000000000000000000000000000000009f71faeb58c4d442272ea0116a03f106008ed68030bce1bc53a3964ec4f9758f508735c8c17017645ccb77124b46cb40000000000000000000000000000000016a2ea9e548342538ccfdae6806ec9ce0b7b892875155f898017929d7105001e8de041bfcab7398cccd060dcee3b6e84000000000000000000000000000000000579462f03502615d26d76e05c758a7f835e4e70f1adfdec8c7ef26580544326d66ba4e23be3c078e1f187ab498ab9dc0000000000000000000000000000000000d386d0af32f630bdf6c13ee82fd35e42961ec4b11ee8fa196d69bed775b8ecfe74409693c531631aa716957e5fe6d7000000000000000000000000000000000ce8a020608c1e7d70d7a03d11b84f48d6b3b77c5836b7c914627f3a84d3d0b3de513029c1379b20ee38a19928e57f44000000000000000000000000000000000dd10882001be7fa52ff21f1a0adab02e688539f098901fe515b61fbdbca02c4146f6c17f7ad7cf59f5e8acd85da60b000000000000000000000000000000000128e019ff92e7171d3c791bd4cf75b0f47c2a9d8722b4a8279f1178db6dddf8a4c00083a935168518a1c26a56b23624f0000000000000000000000000000000008d0c5f3300e73682f4756e6ff1d6722dde576beb587301ded34427d6935e59e76cc8a8cb0ea5f659db9ad5435851e53000000000000000000000000000000000579462f03502615d26d76e05c758a7f835e4e70f1adfdec8c7ef26580544326d66ba4e23be3c078e1f187ab498ab9dc0000000000000000000000000000000000d386d0af32f630bdf6c13ee82fd35e42961ec4b11ee8fa196d69bed775b8ecfe74409693c531631aa716957e5fe6d7000000000000000000000000000000000ce8a020608c1e7d70d7a03d11b84f48d6b3b77c5836b7c914627f3a84d3d0b3de513029c1379b20ee38a19928e57f44000000000000000000000000000000000dd10882001be7fa52ff21f1a0adab02e688539f098901fe515b61fbdbca02c4146f6c17f7ad7cf59f5e8acd85da60b0,,,invalid input parameters, G1 point is not in the expected subgroup -00000000000000000000000000000000167a40d69e2d2e5683ec69af7b226c5456d05241d9c9eb24e988ee2dba845eab361a956cdea64cf971dafea08f0056260000000000000000000000000000000014e5b8ae5032a924da081d3063f31889da110d00330903c6f988684b7d77b7b1bdcbefbf70941d0eb5a34bcb010a3bf200000000000000000000000000000000043a000741027fbd191e2399b7cb5fdb4db3728d81d8b9d25362e8a1d397ec99d1b2339a3a511d0969e7e727f98d4163000000000000000000000000000000000cbda70eab332bf962d123aaf08b8b96680055f1946dd5fdb8818fbb330b816d83062ffaa79e18f1f4f6d53deda53cf200000000000000000000000000000000160a7048e508da288270e8ac5793e9461eaa282b85ce5350b6a661209efa6699874aae71515dc4265125d490a5771ff900000000000000000000000000000000041aa7292f258125d729c1761a3a6f7979a7a92ff179be678ebe301de3ffe12e4a863becbfb2bd0067e42aefc5f5617200000000000000000000000000000000167a40d69e2d2e5683ec69af7b226c5456d05241d9c9eb24e988ee2dba845eab361a956cdea64cf971dafea08f0056260000000000000000000000000000000014e5b8ae5032a924da081d3063f31889da110d00330903c6f988684b7d77b7b1bdcbefbf70941d0eb5a34bcb010a3bf200000000000000000000000000000000158feb06ab69f5da37037c554aa8b4b511e9de7e13a08c2f9a8899f5a504b191195e4de1ab7d937913f60e24a1b3d3f8000000000000000000000000000000000beeea216d85a767af2facfa7fa0399c095a23b7a974ddc3d36b7e79822d7691e53f85c976b8cc948e155f196b7f168c0000000000000000000000000000000009802e94ad5cd6b071a0911cbbc1de29a79a5a4fc145cc79db03119c3c8dac88fa3740bdb35b0b0e6e34127ee1bb081c0000000000000000000000000000000004599d1e0bfe642ff275fbf1dc86bbf83b87c241de09570183faf4e2c1cefc6b8b2354aa2be4aa9f69d6d61546d3a685,,,invalid input parameters, G2 point is not in the expected subgroup -000000000000000000000000000000000130761fb4d4720b8e69b849e1472f15c24cf909920c598aaecd34c5b420a1989a6ea95f89c362a61e4a11f88982f9a6000000000000000000000000000000000d707b24e8720ecd4a14d9f658060303d233253caa63bafd0f475b2985fcebd326924c936a9d66b21b9a75085aaeb54e0000000000000000000000000000000009faa74f66ec0384f0458893c0026f73688c764e8df9ce056a88a2ed0b84ed8f88d1b683443a3269a3db838f8aeb808a000000000000000000000000000000000949c4be2708c1aac86aff39290ab6a8e0f332e7a098bbd64227a175473d9dfe136e07548b282f69a94a15e2c32dada10000000000000000000000000000000014f2c7c7da781e2f50803e3a948381c3c439b127949f79824df1e5722c206efccd6c0ec5dd75ef63d8b1fa301c83356900000000000000000000000000000000176753460d241f38aff41bafdad51688ab0dc9a5fb3643977c7b9d282ad4532fcca1e725715227780ec28bf1c32bbc1d0000000000000000000000000000000010ad2405965f283c845edf92cf34508c0ca625816690d739fec9776d261784a946e083112d11c0776edd04403eaa5b820000000000000000000000000000000007e400896eaaddf797643b05a53f612f73737a2c438762d3f6216d53761f28bc88f402a4f02f36d26bbb431616b1b5690000000000000000000000000000000009faa74f66ec0384f0458893c0026f73688c764e8df9ce056a88a2ed0b84ed8f88d1b683443a3269a3db838f8aeb808a000000000000000000000000000000000949c4be2708c1aac86aff39290ab6a8e0f332e7a098bbd64227a175473d9dfe136e07548b282f69a94a15e2c32dada10000000000000000000000000000000014f2c7c7da781e2f50803e3a948381c3c439b127949f79824df1e5722c206efccd6c0ec5dd75ef63d8b1fa301c83356900000000000000000000000000000000176753460d241f38aff41bafdad51688ab0dc9a5fb3643977c7b9d282ad4532fcca1e725715227780ec28bf1c32bbc1d,,,invalid input parameters, G1 point is not in the expected subgroup -000000000000000000000000000000000220d192e0c635f05870113aac899f996622cd21ad251fb4c300a0ae0051dfd93b0b622f54e149fc4e5bf280ef31b0c6000000000000000000000000000000000dcfd7def563a0937b5173d20f830e6a2350a9d6f1b8a2193e5f755142e850bb7f95519ca187dfe735c197c21688528c0000000000000000000000000000000002479a989dbf27141bd9f467447218dfa6ef60781a7231f089d5f1f1d8dca2ce9606a75c09f63f37f9cc1ee61dceb32500000000000000000000000000000000037c2f1b96170f6847138232bac663e4940bca602717c877f58ff7f5259778246085d499ec6bbeaade18f738df333cc700000000000000000000000000000000115a30e7b71e48efc7166b9a8d2e1ecec6c6e4c058065a18277ca547cf1ebc193e635eb9b65d14c9c94ebde3c83a55dc000000000000000000000000000000000b68916150436f74c61b071a339909f78701d1f3045f7201f076991d7447570fd90887126ca54d96c1310e59ad489190000000000000000000000000000000000220d192e0c635f05870113aac899f996622cd21ad251fb4c300a0ae0051dfd93b0b622f54e149fc4e5bf280ef31b0c6000000000000000000000000000000000dcfd7def563a0937b5173d20f830e6a2350a9d6f1b8a2193e5f755142e850bb7f95519ca187dfe735c197c21688528c00000000000000000000000000000000147610c1075d625dc36388a2bd451ad2c15eae8cbd30393bb9fa30fc233b29a0f5483579752a748bc0f5ca9c90875e0e0000000000000000000000000000000003dff69511f2a53e859b6769ef4c257acf31062eb72f8668f57da60f225ac052badef9df25d43148b4d3baa64c29eccc0000000000000000000000000000000006d2a71dd9c1b302e22c4cecd14dc385e068e63e28e167c060de3ceac8410461d83f961c9292cad30afc0084855ebf1d000000000000000000000000000000000890ce53931aa18e42f00379b40c8e205582f71707a67761acced851fc91755505ae960951dec4ef46353b66e0b928c1,,,invalid input parameters, G2 point is not in the expected subgroup -00000000000000000000000000000000050ae21faa31371d791e3f6163f1c18c577367badb337aa6fa7c8214ec58bacfb24300a81d8226e81d7f47730c734386000000000000000000000000000000000987a0c7abd7c72140bcdba9cf171389ea7971493187c567b0970f05d129b4202124d72bd01038bc77023171de379762000000000000000000000000000000000d4b71595321913e94b9e6ee6ae2391cd5037e8b55e61fd96c745539bcb4bc4fcbab678749f6d47fd2c95001da4715f70000000000000000000000000000000005436e1be9029a2f7cfac51a305fbb7e760a9171c79a5bfce6b161493fb2855df09b3345ddbc8b04318c6b2e0225b74a000000000000000000000000000000000b8f317d36c50c8d039ad137f7d9adbefb3fc147a9cfd6cceb02c75b95fe307c3d6f673a216484f3211f045c2ba9012c000000000000000000000000000000000156bc67e17c8eaa905fb7d9f3f251cc81eeecc86de791c8be30c34aea896755fe2bac28cdb035222afe6237614878c300000000000000000000000000000000065856fe1dcbef934cef47b177ecb7df76cc8796624400d5c0518aa9438bcadf397234808d099bed89ab674560ffbb1800000000000000000000000000000000071b2ff64379ed3e20cda000602c3504616dd673aebbe7690e797d6428ecfbdb29f11138169f3462dffd319cad68b96e000000000000000000000000000000000d4b71595321913e94b9e6ee6ae2391cd5037e8b55e61fd96c745539bcb4bc4fcbab678749f6d47fd2c95001da4715f70000000000000000000000000000000005436e1be9029a2f7cfac51a305fbb7e760a9171c79a5bfce6b161493fb2855df09b3345ddbc8b04318c6b2e0225b74a000000000000000000000000000000000b8f317d36c50c8d039ad137f7d9adbefb3fc147a9cfd6cceb02c75b95fe307c3d6f673a216484f3211f045c2ba9012c000000000000000000000000000000000156bc67e17c8eaa905fb7d9f3f251cc81eeecc86de791c8be30c34aea896755fe2bac28cdb035222afe6237614878c3,,,invalid input parameters, G1 point is not in the expected subgroup -000000000000000000000000000000000e4bfbc392b1de6b17a32387d694f634cb484be4531f425d72833a30ed5aa73a958d5081b30cf98484762ba51542f87b0000000000000000000000000000000010e6acae9df1b5567854f4bbca0ab07c6a0e726bc6ec7a1d2ce8b04e1677776d0ee2642950db040365d581a52a41832300000000000000000000000000000000036a2ac8ecf17fc72ed792c0d8939060117aa0d6c13854fdcf56ed0d1ed3b39da9a67aadfdff484850f9cdf439495712000000000000000000000000000000000a1bd875b74e1ebec19591eb137e68ca7f0db1b3056d341b6bad28c3f45e87688e73fe28e9ef44c7d494442ee0b9472e0000000000000000000000000000000002e26e5a36c008bddc431048d999b7fb44961bb4d931b2dec0cb1d1b0987587f44cd31d429a6cef05d3c060ac828ba7d00000000000000000000000000000000050640087ed6c04ffed759f63e211ff5880c8b06933c1e812954a7a4240a9c644175c4ca3048a4ed68d034f6cbdcf175000000000000000000000000000000000e4bfbc392b1de6b17a32387d694f634cb484be4531f425d72833a30ed5aa73a958d5081b30cf98484762ba51542f87b0000000000000000000000000000000010e6acae9df1b5567854f4bbca0ab07c6a0e726bc6ec7a1d2ce8b04e1677776d0ee2642950db040365d581a52a4183230000000000000000000000000000000003fea73d9ecfb879ea601865d3279ef9b271fdeb14e1094745d5718bf214f1fba99245746716bbf012e2ccff5e22887d0000000000000000000000000000000011b1aa3049157abfa01f3bef33583635873d4bc66801785f41ca51b9a11d95b49a8bbaa543fbe68db86c3560ae258954000000000000000000000000000000001740661de7e1b6e1eff626acc4e37c877d00a0ceb8008d99e76a1dfe826b4dd0ee69b150535caa20386d644394dcf6b800000000000000000000000000000000090c0bc61286187a58f2cf49e2ce6f49d721b4146d973dd7716db271da770450dcba33b7aae37d6842a43063c88704e8,,,invalid input parameters, G2 point is not in the expected subgroup -0000000000000000000000000000000002cd3682c1f87aac1ea91b3f4ac577f0c9531c7702864c444b4163435b4770c9a2ebf94fae2d45a63adecc314d9d536400000000000000000000000000000000103a1eaebc0ee53e21d5bda78bd912f20cc28a13e5e209e062a52ddec3453fa9c364a6b403a68d9db8a40a07755ee1eb00000000000000000000000000000000024494aab30849df790185a4f939954b724c387c9a366fbe833b628577654174f705d05e7d7dbcd29b8873aecd55df0b000000000000000000000000000000000863054fe3e4838d2caec7103e3d0453e86a17fff0dfdb84dd819f31756032e9e97b7be89b636e5e0b642718f6da217b0000000000000000000000000000000015c8bb4fcb6d9cf941b722136d8d76d847fd6d5c643f4c0049c9746e76e49726fd463ce7899f4df66d04e5d48e523e6a000000000000000000000000000000000f101bea4e1bf610d2782ede91da95eb2b0be9ce60485465b9e94cbb9530b416c4394862f0ba7ee8067bb48e94c07c530000000000000000000000000000000001b32ce5c51441e1abbbcc0b6af95380f2de24876ba377ebea44fede8886acbe23aa18681bb08130252bc04193939853000000000000000000000000000000000e5d718c9980140b41fb971fe596070982bf92937df77ef44040ffc27162bb443a60f5c64411ffefc24524ff32fa17ff00000000000000000000000000000000024494aab30849df790185a4f939954b724c387c9a366fbe833b628577654174f705d05e7d7dbcd29b8873aecd55df0b000000000000000000000000000000000863054fe3e4838d2caec7103e3d0453e86a17fff0dfdb84dd819f31756032e9e97b7be89b636e5e0b642718f6da217b0000000000000000000000000000000015c8bb4fcb6d9cf941b722136d8d76d847fd6d5c643f4c0049c9746e76e49726fd463ce7899f4df66d04e5d48e523e6a000000000000000000000000000000000f101bea4e1bf610d2782ede91da95eb2b0be9ce60485465b9e94cbb9530b416c4394862f0ba7ee8067bb48e94c07c53,,,invalid input parameters, G1 point is not in the expected subgroup -0000000000000000000000000000000006e340bc57495a5c01bd44eb6dee60e94feadd69bd0274e7c9755f7b0e7b4e59eb70a2cd7e4da9d1a5f60d93a5df19080000000000000000000000000000000013d7c393a2191ac8d13a0743fecd768a7e15d279be409ccea1d58ba39e91f592b425955ddfc8443861a2899de02cd0fc000000000000000000000000000000000369067d9012509bbc75333fcfa37cd42dc3d6331a55b4720f9efb937916692ed7c7cf4739142ea13fb9130e9dae92fa0000000000000000000000000000000005306d73dd33e26ece5d8cf2ea8d7e25976f7b95dc7091420c2e91b1d0b2ef96db69a364c3cdc3b24a49ec5e307553490000000000000000000000000000000008a9fe15ea4e16e675c42c25b29655683844949b9aff4448f0b79ff08ec2a6526cad973f80123943b863ba9f30b45666000000000000000000000000000000001754caabe499e1ad04ae65d696507096939dc826578db55738e5024601eb052a9fc15f20b601253533847f79a5f6a6ae0000000000000000000000000000000006e340bc57495a5c01bd44eb6dee60e94feadd69bd0274e7c9755f7b0e7b4e59eb70a2cd7e4da9d1a5f60d93a5df19080000000000000000000000000000000013d7c393a2191ac8d13a0743fecd768a7e15d279be409ccea1d58ba39e91f592b425955ddfc8443861a2899de02cd0fc000000000000000000000000000000000ddc7df1bb36d54beb969a244a67c3ae87cab2eddce9397869421999497ab00a3e0ee29e384f3182b52158304790b05c0000000000000000000000000000000006f527de4412dd61845ab1e4536a114c7ac2bee2f3d22c16c660b3189b1666849f70462d6d650846331dc630dfaa075e0000000000000000000000000000000015aae1fad9e6cb3adc8bd93c432c9321a9d2f7cb961671c8e517da7024d1e35b519a2cc662d795173441479fa35f2e830000000000000000000000000000000008485999f40a4a363ddb3da273f7522344f284fb5bcee383a590c7c1287baa10f21312428d6818eebc96ec59d716fae1,,,invalid input parameters, G2 point is not in the expected subgroup -0000000000000000000000000000000015845de9692590d7fbf4187b50f4b2d067983b0a2209ed2bc6d60914be106decc5dfefba112baaf98ba3bf9e4d102b660000000000000000000000000000000004f2ca0858d056f769bc8e6ebf7cca745ca647ba497940b25b31c0541297626cd26ac10f8ae8476b5c868a95226da290000000000000000000000000000000000b1374a47c7c1c833f3856b0fe5ecaefaf2a8f96148eb540482288b56897d9e7e4269ea3a2c3742993b751bd9e484f2d000000000000000000000000000000000bc7fadac70d0a401e61683562cc83ffe107924ba1788bb6e06b0c60f22de0d93b10b63afcca343cad0572209b03b12b000000000000000000000000000000000c22c75d826d2700a8bad4e9c271d8b505ab2911dc257909c69dfdde2bcf332e5f13592eccabf578f48f6078550c1e9c00000000000000000000000000000000057db54159019d1e291131d28a936ac1337f2884f0c4bfc4d8adaa75bc0edf8b0f3030725e33a3d1a2e7e9ea39512fc70000000000000000000000000000000000232940188006769a382a4958383aa6702b2cbfb9c2907a989938ac618f23e241767b021e8ae11c23617ab393d4f85a0000000000000000000000000000000016a672061fe76ed943e36b2d6fa4aadf579db96eba5e4c60cda2884ddcbb0f37668638a3167d8858cd296917eaeff8e0000000000000000000000000000000000b1374a47c7c1c833f3856b0fe5ecaefaf2a8f96148eb540482288b56897d9e7e4269ea3a2c3742993b751bd9e484f2d000000000000000000000000000000000bc7fadac70d0a401e61683562cc83ffe107924ba1788bb6e06b0c60f22de0d93b10b63afcca343cad0572209b03b12b000000000000000000000000000000000c22c75d826d2700a8bad4e9c271d8b505ab2911dc257909c69dfdde2bcf332e5f13592eccabf578f48f6078550c1e9c00000000000000000000000000000000057db54159019d1e291131d28a936ac1337f2884f0c4bfc4d8adaa75bc0edf8b0f3030725e33a3d1a2e7e9ea39512fc7,,,invalid input parameters, G1 point is not in the expected subgroup -0000000000000000000000000000000018611593c7663a36330e0640bc912221a17d0ec9d2a250f1701303249655c7088bdc07b024878a260753d1dde306fd4900000000000000000000000000000000069d26308af5907c15532f31dca8c884b9e54a0da5e428c66fd79d980774cca106e2ccf3f93fe3e01669c594b9770a800000000000000000000000000000000001a38d296c4b7b8351164b935b915c08caf6af9d5233ecfe609e4ed855589bdbc9fb0adc55bb5cc6a2526bd82ab9287f00000000000000000000000000000000184ac28f62c7101bec49879af5da794740f9ba99afab4fcb576fa1149f3b701079915934c624f022b0d3213adc884c2c0000000000000000000000000000000004f64835227f459e76aae3397dfe53eddb1e97c8afd8beaba09382fe79ab378c3f03d6962dfee823c426cab426e51d2d000000000000000000000000000000000577263fd875f6388b723f6abc78aa3b0cc2e6b0ab53beb59286e30d1e982114c161fc0ef490bb1347fd8a3f3cba72710000000000000000000000000000000018611593c7663a36330e0640bc912221a17d0ec9d2a250f1701303249655c7088bdc07b024878a260753d1dde306fd4900000000000000000000000000000000069d26308af5907c15532f31dca8c884b9e54a0da5e428c66fd79d980774cca106e2ccf3f93fe3e01669c594b9770a800000000000000000000000000000000000c072a812b26927b5a672359032e71597002d8c45572db6c575e25c81181a522ca304867b1bcb583c58b2ad6bb1695d0000000000000000000000000000000003c4f5f548f50e835f402105cbd315081e0e8773dd91f3874687ace6fd5ffa66b6ebf6dac4580357b870f8835ed15cdd000000000000000000000000000000000f039e2e73334386b28ed4cc52db09b69c942c0c87f81328a9b7fbe8553eed48a60224ae9d52baf4f62a3fb0d58d451d000000000000000000000000000000001974da8867204f048b81d0c7a90d224dc5b87f3c4f47d1dfb09afc292430bf51d69e3538fdd13ca0749dee76c2ba9b17,,,invalid input parameters, G2 point is not in the expected subgroup -000000000000000000000000000000000754f3a9ea93a01fa244ef6badeac64fbb4dc81d3489c4195a01148e268e2af46011e6c593b4b873fa1470eecc6f79ef0000000000000000000000000000000018043830aa55a8c7efd5dc246622c71bbb4bc6a5d69cf594f46f62d8c3e2a5d4ba1d3990b5445f8b446e404a00259a8a000000000000000000000000000000000e49e94cfa35d8ade2b76865cc8be04737d00b48b195078c8085cbe782232a544cdb548373bd8ad0282674ba5c96fe0700000000000000000000000000000000047d59661f095c41bcc27da5f260f13a3fce334bba216b45df548894bdebc691fe779ccd63d99a9872973ab165a90c01000000000000000000000000000000000772e9a9c22bc7352fdf74915bc464de99ecd96420ef1af6e8bd5a05d73fff89c78e28eb340d4967e906f28afe1320490000000000000000000000000000000018bccff27bf9d7cb2159b9f2d1faabbf8591b53ca8e67e661d9f44f6dba6296e3e46ac32c50128bb5fb076cb8f214e27000000000000000000000000000000000252149178c606d2d6c0311e9f4a66cf348869efc09ec887cf99088ec754c01551796aaf168dc1a09cb741ab3c9d6891000000000000000000000000000000000db7baeeb5acfb22d680e032965a4d417b2f2f6717d3667d786e006327140c1288ff44842142eb1d2730b3be64fcf420000000000000000000000000000000000e49e94cfa35d8ade2b76865cc8be04737d00b48b195078c8085cbe782232a544cdb548373bd8ad0282674ba5c96fe0700000000000000000000000000000000047d59661f095c41bcc27da5f260f13a3fce334bba216b45df548894bdebc691fe779ccd63d99a9872973ab165a90c01000000000000000000000000000000000772e9a9c22bc7352fdf74915bc464de99ecd96420ef1af6e8bd5a05d73fff89c78e28eb340d4967e906f28afe1320490000000000000000000000000000000018bccff27bf9d7cb2159b9f2d1faabbf8591b53ca8e67e661d9f44f6dba6296e3e46ac32c50128bb5fb076cb8f214e27,,,invalid input parameters, G1 point is not in the expected subgroup -0000000000000000000000000000000003455a16c1cf9a408bf17cbb0b8ec2a5f24ba41d5b8a06a10750797f3371bcf361d3b6902d73949df3a24f5a8b9977c10000000000000000000000000000000016480e13653604d05f025b8264fb35a2cf06dc6a90ec7751ed80ee81cd064864655d133ce398e293c289a572dd98605e0000000000000000000000000000000015015aeb1965917cb5b55092d7eeb54915e21fbd5b9a62530b3dd5b8ae07d6f491df46e1987f565223a83cbc90f91735000000000000000000000000000000000658266a6bb01958b791b288ea9f5e138316724398218be522bf816ee5b5b34ef4acc83b82959f52792af6940816bb41000000000000000000000000000000000bf8d18b55a57e67c76882f1a1ad845480196f28556ef569a6a6054426bfa39459ac030b594201be76968cc33c301dd4000000000000000000000000000000000fd8b264f9bd71e00e3987cd221d2e9fbbee34ddcc5c563f02dd150451050bd20b3bd3a6ce1284fb0ebff0c6c1318fa10000000000000000000000000000000003455a16c1cf9a408bf17cbb0b8ec2a5f24ba41d5b8a06a10750797f3371bcf361d3b6902d73949df3a24f5a8b9977c10000000000000000000000000000000016480e13653604d05f025b8264fb35a2cf06dc6a90ec7751ed80ee81cd064864655d133ce398e293c289a572dd98605e000000000000000000000000000000000c5c8e759f71292c8b25dca51bfd40daec58d2d2befe991b27993ae32489b3ef70c0c3f873b3f47ffb013fd31732f763000000000000000000000000000000000a78f4e402668544cada859953182f14421c54446c264312daa5f27cb18a3955a277e5620b0f28f4f9bf233c49f3341f000000000000000000000000000000000e27d9b1bf12c01ab05fa5ed5b2e70444c0582aa5b430d0e10feb69dcddddadeec88c024ec87e23737ec1385461edaad00000000000000000000000000000000065984e81590e368aa6de051129761e94ca218df58ec0132ec22aa7d4128b9ace20e7da35c56a674ed1031d202e9f313,,,invalid input parameters, G2 point is not in the expected subgroup -0000000000000000000000000000000005a54ee5e3dc05c38ade7a42c71baf5a1467938f97c0cdf0742441cd339f22542b1ca6cd215d385b3fd6ba74ec996a520000000000000000000000000000000005f63d18f8bbc1c7b119ee0d58b688477129b2558be0084865297fe119224aec83b3633a646a3d423029cb52f0294aa20000000000000000000000000000000015e2547357626e6160105e5254d8deb80155c42d7b0c13bbe350c3395317913ccea5db61494aa2634857a8c83baa42a0000000000000000000000000000000000629ebc8d1798e2f9280493d2de7c159c558156782487d307ba358fd2bf696c29518d6cf2f975509bdefa89033f1cfa20000000000000000000000000000000011e3f568b9d1793519d5a8cd3bac7cf35091665f981ecb7a9e942f630c5f18fe7cd9747ff539816993b70573410410ac000000000000000000000000000000000889dedf6f29ed9959d8eb7276ae6122fec5a1bfae72c793902e1e3062be444b89a95129dd59f74ea0849b5a2aefd48b000000000000000000000000000000001963e29f92f6f72be2afa4635221b0d2f6afe9ada4582bd7ca4b77eb77fc4503578f38fb49aa1838751db8cf1ca0b0cd0000000000000000000000000000000009856a48f12966554afbcde1971499ee3ae40c9c5c3aef13bc415fddb97545ed84d5f50d2a26b9c16c4403a487dca6140000000000000000000000000000000015e2547357626e6160105e5254d8deb80155c42d7b0c13bbe350c3395317913ccea5db61494aa2634857a8c83baa42a0000000000000000000000000000000000629ebc8d1798e2f9280493d2de7c159c558156782487d307ba358fd2bf696c29518d6cf2f975509bdefa89033f1cfa20000000000000000000000000000000011e3f568b9d1793519d5a8cd3bac7cf35091665f981ecb7a9e942f630c5f18fe7cd9747ff539816993b70573410410ac000000000000000000000000000000000889dedf6f29ed9959d8eb7276ae6122fec5a1bfae72c793902e1e3062be444b89a95129dd59f74ea0849b5a2aefd48b,,,invalid input parameters, G1 point is not in the expected subgroup -0000000000000000000000000000000010df7793a66234599791ae07db9953bba83492389b150a05063105c191c6f32559b9533f1875ed154fa813586e84d0c40000000000000000000000000000000018de32e27e5c97b8b39380dde927e2143bca5d5591d770b2a7a77d7b59bdd533f04c41aef3a5a60df55ed90742869b7400000000000000000000000000000000182f0aa672674c27d8f3fbcc0fc7c1608c01188cf5c28b8ac08d6f99a4e3e214aa3ba61a19607b513b4d01f1d4424a990000000000000000000000000000000000b47be5b5249eab6f67aca9c9349d4a83956550cd21856485132c26e3be3ca133050d79507e2e8cafb67b44a7f4b4da00000000000000000000000000000000060efe7e7a4ca52063b49f6c839666deebe2e8e563de18b210fb477e86420aefa38f89e926cc41334e80f4d47d810d97000000000000000000000000000000000c2243c2a34286b146462a643979a72e75f7ff31f9f043164a5514d3e5da8b0cd891e97af2dd3d6c6f3584b390e5faf60000000000000000000000000000000010df7793a66234599791ae07db9953bba83492389b150a05063105c191c6f32559b9533f1875ed154fa813586e84d0c40000000000000000000000000000000018de32e27e5c97b8b39380dde927e2143bca5d5591d770b2a7a77d7b59bdd533f04c41aef3a5a60df55ed90742869b740000000000000000000000000000000015f7e6dbb904f4f1fbef282667d77c846c0dac6d78f4daaf32123b4326f1c6e42b15cb06ed7b3b46c8877e684ca7f9de00000000000000000000000000000000004a87f0ef3285709a3ded240f529e8e10991a82c7fb40de0bd256a9fafdbc212eabb8121f52c6bf67a45bf36246921c00000000000000000000000000000000156a1d58dd64734149b1e37b1b69fa4ea4452c40d2d041f5cf3de3adadf3bfdf433626fb96c46f9104b1c16114108599000000000000000000000000000000000fc3a0e58ed3fb583e2e1c3b0db5fac2a6d75694aa3d0732243b5a75688fa0ffb5fc9023545b9585df224ee9f6c5d171,,,invalid input parameters, G2 point is not in the expected subgroup -000000000000000000000000000000001639642196e9d6d720e17ace198232d1c0a7c05660c2766b9d28147504308ee48d949755ffcd1c95e024fa299657c8d10000000000000000000000000000000017a5975410b3a80e339b200ec63d7b7d550514653726e3ae6a97a383545118bd4221bba3e27922a826057b244ad025f30000000000000000000000000000000017aa7a3f1ebbdec6abe12abea12ef50a3daabbf96a5f2ebfb517885f0b7aba1e927c682b15521529cb9e1f87c59be99e0000000000000000000000000000000016e23f7effbb9dd34ec1f6974115e7f0d23cc4553d86e6d61a0c98f47d09510e06b3f987c5bcf4bc30e20ae9684da74e000000000000000000000000000000000f3905dd4f99cfcfa6152db53106b4d1f6e24518a822da9388d8ca1dd654a4b8315697328571691f105d1abe9aad3dae0000000000000000000000000000000006bfd10d33df9326a55b35aa6d2bc3e831d4c3b5959aaa35613156e5e19343b74e34ed2670c43ba1a45cd3d91f055c9a000000000000000000000000000000000024c53fb66f77329f70394626073ae298c6aaba115aa6af7bdaf3d2fb74a07441d46eeb398feec036727e86891db2030000000000000000000000000000000016b96c27d4342c47caafa584ec9847c79870eaebcce158535d8da95d7a847ecdc5057425fb3dd862303d1ac03162317e0000000000000000000000000000000017aa7a3f1ebbdec6abe12abea12ef50a3daabbf96a5f2ebfb517885f0b7aba1e927c682b15521529cb9e1f87c59be99e0000000000000000000000000000000016e23f7effbb9dd34ec1f6974115e7f0d23cc4553d86e6d61a0c98f47d09510e06b3f987c5bcf4bc30e20ae9684da74e000000000000000000000000000000000f3905dd4f99cfcfa6152db53106b4d1f6e24518a822da9388d8ca1dd654a4b8315697328571691f105d1abe9aad3dae0000000000000000000000000000000006bfd10d33df9326a55b35aa6d2bc3e831d4c3b5959aaa35613156e5e19343b74e34ed2670c43ba1a45cd3d91f055c9a,,,invalid input parameters, G1 point is not in the expected subgroup -000000000000000000000000000000000680d1062d24bb96b09d9dc9791364b5138e7c36c163589f919354101459de2fa76440616351d1d9bcd961673b106684000000000000000000000000000000000ca650f50b670befbf16d65b486e5c98dea6857862cf23d7bdd2dee2abc0855273495b047431ed03bb1c72b5403c2a4e0000000000000000000000000000000015b2586a23d909e6fd7ef6e58595817bec1389faed80db6d59db219435e7fb1b6492178a849c12bf6418341529d141330000000000000000000000000000000013ee3539c49e0c26e78f46c67b1e3993eed56c72dda43936b419e1340a3aa223ca09a2dca3ca56f2f9578b4a3f885aa00000000000000000000000000000000018e5fd242eca2314b3ade4a1e913177a499d72b539907839c5025b7de69efa24b08b3eb1e85fd05724db82b29edac344000000000000000000000000000000000478706e91d6213e4d4fd9a6c5051c88d86c7271aed7c74ef3b43e904f8ccfe4108f94660807316e8f1eabb85b734d50000000000000000000000000000000000680d1062d24bb96b09d9dc9791364b5138e7c36c163589f919354101459de2fa76440616351d1d9bcd961673b106684000000000000000000000000000000000ca650f50b670befbf16d65b486e5c98dea6857862cf23d7bdd2dee2abc0855273495b047431ed03bb1c72b5403c2a4e000000000000000000000000000000001600e44d53c706898736f5cccab585af5d04f7da91cad6f97b991b51adbc22ce27744f12c0a24804b6fc3dcc53011a59000000000000000000000000000000000751b090922b29f5c299340b12a56a77fd9c32f27995a59cd032cd09ead834d9faf5e151fbf7a0d810738de1beba5b4100000000000000000000000000000000114e35fcef45e87312a90fca21fef50c46b8a0f114df5c67ac9872ccadf858f319977138f03279ddd1edcab4602838eb000000000000000000000000000000000145c6cd707efd8d271dda5b9af26173e337a169c01b28a44f5d4ad06b125a05e867f0b1f873bbc048ea6cec06967c33,,,invalid input parameters, G2 point is not in the expected subgroup -000000000000000000000000000000000d6427dedfdcd624c896ca8e1ef717e212985ae23a4f830ee466c75b37ea2e994e7653b9717928f1be4583aae73f70040000000000000000000000000000000017be03dd7c9c14000aaec774812a8d8bc4aa2f1ecca9a894fd1385864b28a38091d3fb5706ee7c36086c7d50e35eb5b9000000000000000000000000000000000ce359fe7d997e151b94af2f5e167aa4834caf5a07ff056fe049d4b2c2780b35e8ecf9426444da4725a3e66de6691d960000000000000000000000000000000004c7ff987f866ff3919fb4769cc704928af09406c8f5a39e6fdcde5f4ef8a188cff406f853261bd3abd0f67c6cad1f3f000000000000000000000000000000000914584031ca57b9b0bcc35fbe76d967aee164b5eeeaa5e29c02901194fb0f88f5a249040c37ab47a715d34b2329a2b30000000000000000000000000000000007a42352ff521b8e6267a5d0dd1eadcb63db1fec68cff31bee1b2080b451ac731caf0efb86758b26b0c78df5cee8864800000000000000000000000000000000141d878adfaa6a3982cd0de93b4d64ba840a07c026ca443d6d4c2b6c36cf882e109d80df63b1626c112f9a89809788080000000000000000000000000000000005a5888d22a2f654a58d9a03c68d59cde9ab5e5356b2288033ba58fe2dbacf533e59344bdf30eed07698261d6269fc70000000000000000000000000000000000ce359fe7d997e151b94af2f5e167aa4834caf5a07ff056fe049d4b2c2780b35e8ecf9426444da4725a3e66de6691d960000000000000000000000000000000004c7ff987f866ff3919fb4769cc704928af09406c8f5a39e6fdcde5f4ef8a188cff406f853261bd3abd0f67c6cad1f3f000000000000000000000000000000000914584031ca57b9b0bcc35fbe76d967aee164b5eeeaa5e29c02901194fb0f88f5a249040c37ab47a715d34b2329a2b30000000000000000000000000000000007a42352ff521b8e6267a5d0dd1eadcb63db1fec68cff31bee1b2080b451ac731caf0efb86758b26b0c78df5cee88648,,,invalid input parameters, G1 point is not in the expected subgroup -000000000000000000000000000000000da87318eb51b90ca822bff1df4dbc040fb1d74129242d832e1096e813dec5d91f950f44bbb07980dcaaee3366f03a0c00000000000000000000000000000000157d5f5c8ad06af803b9362b22519a23def6dbb700db517c85a663bf1bef9665d6e81e9b02ccaac97f0940d223b83ac400000000000000000000000000000000176835484cf24c47b154b7c35877eaf5194e0e1d8f053842fb5ff8fa833dabebc887f3d34b825fe9cf2c374a2066124a000000000000000000000000000000000d31805157ecafb751536c484fd0c81664de9524a1420c969d54260dd5264bc5454a3234d1e5b090bbb8ee1066b685ee00000000000000000000000000000000196b4f58c12a7d7ac4d720cf9b6c44efdab88e06dad0023a01572cc2ba7bc0a4baf7fa45c06f04ff3d067ba191a84e6000000000000000000000000000000000038cb5d328ac9d1fab9c402b8ed9e72ccd462ca80075132f6be141457ec25a6c84a15e42b78cb64cf05ef18b003e4652000000000000000000000000000000000da87318eb51b90ca822bff1df4dbc040fb1d74129242d832e1096e813dec5d91f950f44bbb07980dcaaee3366f03a0c00000000000000000000000000000000157d5f5c8ad06af803b9362b22519a23def6dbb700db517c85a663bf1bef9665d6e81e9b02ccaac97f0940d223b83ac4000000000000000000000000000000000065c10395b93e8d04f5eb67d8e06e8649139d261ad8fbf5ff2c7d6d364c87837fa8e744834ec9341c714318195896770000000000000000000000000000000009fcc05ee486d42c3b2d480a309e4bb19563f7a27b4a10182ccb2d233ed42943ba472681d1f847249cbd11e4d79ea51f00000000000000000000000000000000053a516998d7c2b2bfa70349bf3f5e3967df827f65044634071450761ae8860e893824b1ae3f204b0ffbf8b091ddd277000000000000000000000000000000000d7cd03cc2cf97a164c7dd65b961df2866e82bf6fa979e56d0ca3f9638319772f56eab2e2134a33515dbcc137da8ec8e,,,invalid input parameters, G2 point is not in the expected subgroup -000000000000000000000000000000000be4cb58fd1dab8fccaa410e1c301be4fd2e7bae95cc1717d2aecaa705d717c67d7f20611dd1403d9350798642fa021d00000000000000000000000000000000075100bfbdb3f6271e5d8bcd4472580e56fd507b73aef3c3c5084d77e11a61b69bea0b85ba62885f7da36d223fca20760000000000000000000000000000000007649efeb3e0bee49b9adb13f8e5d7db1c06d7fde08a3f3082194153bf4b3615aff1450e47fae88ac93f55a389a319da0000000000000000000000000000000008334731582fb1b6125d7ee1da0124fe88f0c70a0a3f6188636976c31ba6a72beed927fe598386f328e4ae534729a57c0000000000000000000000000000000010b57d80fce5cdc90bc93b3bc7a1affadd19fb00aeec2ca9a6287bf4e40fb74616986a44f2f7d945f58501a965f37f3000000000000000000000000000000000180dcae46ee41bccd422b3cc2b34cad26f6816dd08ba51b2f12835e7439ae2d46933de28ac04bbcad68a188e7e90ee8d000000000000000000000000000000000a869358fd3d64849fd62e513db8fce1ab2618d3524acecbd04fef6b8c77703258cc557587f316cbb74bc5af5cb5551100000000000000000000000000000000059eb0e90e0910c24ee2145921ccee83707d8f89a188dcaae7d5c75b7113cacff92a2a030e67927bfec0da39f2bf65ed0000000000000000000000000000000007649efeb3e0bee49b9adb13f8e5d7db1c06d7fde08a3f3082194153bf4b3615aff1450e47fae88ac93f55a389a319da0000000000000000000000000000000008334731582fb1b6125d7ee1da0124fe88f0c70a0a3f6188636976c31ba6a72beed927fe598386f328e4ae534729a57c0000000000000000000000000000000010b57d80fce5cdc90bc93b3bc7a1affadd19fb00aeec2ca9a6287bf4e40fb74616986a44f2f7d945f58501a965f37f3000000000000000000000000000000000180dcae46ee41bccd422b3cc2b34cad26f6816dd08ba51b2f12835e7439ae2d46933de28ac04bbcad68a188e7e90ee8d,,,invalid input parameters, G1 point is not in the expected subgroup -0000000000000000000000000000000010eeac4d171a17d607dc544c559226db50d40193b435ce7528086eee21ec437e986c89dbe05931083768221e4bf06ede00000000000000000000000000000000140ef3af9f3dfe760e8c9dbe8d24abecfe611699ad337a97481a1553e9cabdb2e8a8cb48bc032bd02738cd26cd1388c300000000000000000000000000000000165bb8a97dd4b60ed7fa432f019f7f09a19c8e7a9b70e7370ae668d4597a3cf12c06fe062d880611e34ad9e586c193c00000000000000000000000000000000008c684f30de5c67f675e98400d854397e8cc6a139dca7e9ee179309a9617ce0ae034bfbd0faba7a2f9e7ee39de8770c900000000000000000000000000000000030e524c87a658e44df117fa0a877afcf8a4907979c932921a631a209dd58ddcaf693c7321c537e7e2a5adafe5761fa0000000000000000000000000000000000cd44b77f2d92706b3db5e374f13f6f12e3b030c6341d31e1c55d627e6af06a1b64498e590dbff08ee6354902263ff260000000000000000000000000000000010eeac4d171a17d607dc544c559226db50d40193b435ce7528086eee21ec437e986c89dbe05931083768221e4bf06ede00000000000000000000000000000000140ef3af9f3dfe760e8c9dbe8d24abecfe611699ad337a97481a1553e9cabdb2e8a8cb48bc032bd02738cd26cd1388c300000000000000000000000000000000062e54c21986cff68cd57903594d0e9f2f8348191aea6abc19e8b895e6ca59bf2eb731d10e426ad98726c51adc2d53b4000000000000000000000000000000000594d2a92e0b979c95daf6f78216be8c33ef23f0bebcda479326a1d63ec8234b283ee29fff7fccd441ab4ea6e17371a40000000000000000000000000000000019179f35ebf4ad9f8f9dd577b2db1ed58a988954b4bf4232301b713809be318e746f5b2bd663a21de755125f414bae9700000000000000000000000000000000172d8ad43611623865bff86df2bea58a02b7d6a2c41b85b98d6a2bd4f5e1bef25c978ac0bbb7f4746297c6e0e40b4e23,,,invalid input parameters, G2 point is not in the expected subgroup -00000000000000000000000000000000054dce4bc0b703b8957539c594d8d443fec161c3cb2f806f8eaa8158a665d84cfd551c0b7c0a08bede0cbeb780a6ca5b000000000000000000000000000000000cb3d3f9bbda28f8fe597907a76a8250567f4e481b6e9409e03ead60eab77153cf8f25ffcebb243a310094740cc2e2a9000000000000000000000000000000000a71dc159647864abd64655bf5ef956f21ad55529bdb49ac910ef628cc62a3d43b2b9ee26180232fa29f4b0e8371286b000000000000000000000000000000000c72d0fbe0a7604c9fab394b285ebf1c322c95013651bd21f88865e269eafa65e135ff90f5b249a794cef4e6cfcb56270000000000000000000000000000000019ac0043071372ba077bc8d91a4ac80fb5b8c8131981c4dfc698ba9ae50b506f93149eb73e4bc4f4ded94d6824473817000000000000000000000000000000000113368be2a531d2958d887c046fc26155436fc6a1ef44fdf16447163b7bc48fbb499506d8d5c8041d21116c4f22e685000000000000000000000000000000000b7244995b7819857f716288dc59eee9ba5ac7bfe010937ea0b67ee71388a3792e5b7feb6890a436db4f1b26df18b38c0000000000000000000000000000000009a0b73360bc0ca3b632c0116f21ffdaecf37e4d6c904c98d6225a08d7caadf5024ad6b457cf31b924118ea147ff10fb000000000000000000000000000000000a71dc159647864abd64655bf5ef956f21ad55529bdb49ac910ef628cc62a3d43b2b9ee26180232fa29f4b0e8371286b000000000000000000000000000000000c72d0fbe0a7604c9fab394b285ebf1c322c95013651bd21f88865e269eafa65e135ff90f5b249a794cef4e6cfcb56270000000000000000000000000000000019ac0043071372ba077bc8d91a4ac80fb5b8c8131981c4dfc698ba9ae50b506f93149eb73e4bc4f4ded94d6824473817000000000000000000000000000000000113368be2a531d2958d887c046fc26155436fc6a1ef44fdf16447163b7bc48fbb499506d8d5c8041d21116c4f22e685,,,invalid input parameters, G1 point is not in the expected subgroup -000000000000000000000000000000000cc6bbb9914ae46b57eaaa8d3d22274a355bd7488e5b537169c995ef2bee187ab66497423f14fdcd01373a609981b3ea000000000000000000000000000000000037d9461da369d186cd812a9ade7690b2b8b54ae386b7342a69af832ff4f51e5db9baa3c6b4a65d798a1aeb41d8787d0000000000000000000000000000000013a6e129d4dd4aa93cff5489ee879763e2a2231939e609d2d72f07e630b37d09f3057a36fd5cdfc9c81675c996f8ba0f000000000000000000000000000000000e8d7ad082e8f9a718fc2ea712853ed9ab4e8b1a8ca9988f77c70fc759f1fe2d4bd73696e539f130be13b2862efbdf770000000000000000000000000000000009897223b041568c9ef2884baa28477241e525de05f2c2f15441854a0e8660786a0c7b85a6d9d1074fed2b44d75efedb0000000000000000000000000000000007b52401891bd8003af4b07b04b15b79bd05fcb54739491352d295b5545ddba34da0b0aff36a3e7e4b433011be580174000000000000000000000000000000000cc6bbb9914ae46b57eaaa8d3d22274a355bd7488e5b537169c995ef2bee187ab66497423f14fdcd01373a609981b3ea000000000000000000000000000000000037d9461da369d186cd812a9ade7690b2b8b54ae386b7342a69af832ff4f51e5db9baa3c6b4a65d798a1aeb41d8787d000000000000000000000000000000000cca0d111237ec521889baa4987714c6bb539399b058b6635fd043821377fd6cfdb74923610c8235afe2be99188cbe820000000000000000000000000000000007fa2b99221675b38204c2eea94b2378b1d711ea5ba4f41d35c37f77ee2466f22c88725da9fcdabb6153292b7cd9aa1e000000000000000000000000000000001069adc30f99e0ddfd39775cee5ddd786fcc077cbaa8737f7031745d02f06168fd5d3c4936704d15955bcfa08b0925180000000000000000000000000000000003b388a8d9baabf0bf708e2fe28eacd7f704bc588185adbcea8e0a2bb8f9bc9b045918d97bb27b2033c6722b6e6692de,,,invalid input parameters, G2 point is not in the expected subgroup -000000000000000000000000000000001055ab14a2407bf095a954cf1c926f2c520dda187c44522a7e924e38543e5b87e7642227821a4e0b3ab0289b32161a060000000000000000000000000000000018aa24044066526fa9ed980ae7b3110a4fde7ba0a5fd289803fa5175d30766f01a266917f821169c7ec31fd46e1a14ac000000000000000000000000000000000b6e16f2a6cb821abc43c447da207cc3013f2f750c844f42f0fdf47160a38501bf502073bbeb565122bb3de61b3a5ab800000000000000000000000000000000040f5f3aab5d416e9a084fa298814f894ba599315fe10af20f836e624680582413b4a54623cda8ae2663ee094e4db775000000000000000000000000000000000d32ac715a094813c7b46ce2e932365bfd62ec5e584e047b0c56ed6eca3c58268ae01be31b833be7ba5c2588ebb9859d000000000000000000000000000000000850b9044f129e51658a02cfa49d40a2b09239823cba4d8fe423fa1b4815750811daf745e7e02b317a7318aad0734ddc000000000000000000000000000000000765a76c441227592ba30d6b1d3d9898467352398efc0e8416e0be8c9f87bcac8d5eaa5d7b2a8adfae8303909bef28da00000000000000000000000000000000107c0eff2fa09afb743c294408408451e3039da8db8c0beef32f07864223817075fa557a89244cdc293d631311773947000000000000000000000000000000000b6e16f2a6cb821abc43c447da207cc3013f2f750c844f42f0fdf47160a38501bf502073bbeb565122bb3de61b3a5ab800000000000000000000000000000000040f5f3aab5d416e9a084fa298814f894ba599315fe10af20f836e624680582413b4a54623cda8ae2663ee094e4db775000000000000000000000000000000000d32ac715a094813c7b46ce2e932365bfd62ec5e584e047b0c56ed6eca3c58268ae01be31b833be7ba5c2588ebb9859d000000000000000000000000000000000850b9044f129e51658a02cfa49d40a2b09239823cba4d8fe423fa1b4815750811daf745e7e02b317a7318aad0734ddc,,,invalid input parameters, G1 point is not in the expected subgroup -00000000000000000000000000000000182197c7a0cefeb530f51c664dcf8a74f9f70165ffc416ba454e9c356bade393e30d037347b1a020dcefb09ee65590a6000000000000000000000000000000001030be8d38736ac8e555d1681b14f73f2ca58faebeaff17b6006bf7876e733642d229075c8dfb0a9ba4e832e384aeb8b0000000000000000000000000000000019094370a6f19e946f587e9b117332ce5ad91860cc103015e94c6aac6d2c00f3e71471c241ea1d425e391707b27b851d0000000000000000000000000000000009ad1d1312011907676574a7867ac02059d9b0e29dab709f6ffc1b75b3598658427f10ab52d1129417ef42c30998f55f0000000000000000000000000000000003103495c759d8901898acd98679d92e048ca41244782045a6d9419b3ff87c351f97a333899fb445b8620099f7b9cce100000000000000000000000000000000051f7aaac39348f70109ae7a016026ea52c03e4ec90d03ce05aeea74f66bbf82e17be35cc45f492f50246f0de8dc68c500000000000000000000000000000000182197c7a0cefeb530f51c664dcf8a74f9f70165ffc416ba454e9c356bade393e30d037347b1a020dcefb09ee65590a6000000000000000000000000000000001030be8d38736ac8e555d1681b14f73f2ca58faebeaff17b6006bf7876e733642d229075c8dfb0a9ba4e832e384aeb8b0000000000000000000000000000000014229a1108fcd75131295caee98f8e4e075cf4bb5e169024e07a533f65316cb5d19193d3cfee8b2216663829be6d374600000000000000000000000000000000156cdf98f622a393d920b200e6d9efede7413137eceb79d66f85a18e33ef6946a515737c58e198f877fa39458877b99300000000000000000000000000000000006e5cee8e0f47c0ee4a574fcca6e150901a7de58f3f2eb3480f1ff8c14effa4bb9d00837501f22f6cc465e4026c9d7100000000000000000000000000000000124b6c0836bdd10657a3e1f978b48b9221b1cfc2767b6b99319fb69c5fdcc1b133f1c2fd093c62d6d1e398f32c4e8b71,,,invalid input parameters, G2 point is not in the expected subgroup -0000000000000000000000000000000019c9b755000f9f1b6ff22885f45bc1f5f65d080ecc129d29e1cd60aa14fd20646643be51d2fb3417cbbd39361bc72b62000000000000000000000000000000001741fd3c4a7e883094c0e84d851f45cc1b81af5bcace67dfddd3f19e8817697a386d1965a4e17c60b00ecbff84779b97000000000000000000000000000000000e87ea967f6c4dd7135efcd9a59368a2d19dd1385aefa34d7d9bd7f5094d779a7150667dcec463c9ab63d2ffc8ee4f6d000000000000000000000000000000000a3a010f176efe1a7bdb77dedf6b6271c845d662dca5062ebbac4e9c3b8946db0adfff37a6faa3196a99fb3ef05f09c5000000000000000000000000000000000350ad257d47f270c4340e3cb124ce961316573dea14c9584d20221d922a43c2e94324ec14bd1e4a1eb955861783a8f100000000000000000000000000000000070edff58ac1f8c13f62327cf0adbd748285fcd84ed7be23dfc82a0ae32f8c8f5f6b0679f795874cb0082718fb07a1ca000000000000000000000000000000000d5be6f99bb9a2379d1e542ece048164fa5d14e0c6c459180717b3da46e8446e9def576635ac1124e1390196fe97f39e000000000000000000000000000000001482d8339b402e3bffe61aaa298c8bae4286f1fbfc877a66e21cfe239bbee383d701d95a6c2b8193d67df5a551bb7aba000000000000000000000000000000000e87ea967f6c4dd7135efcd9a59368a2d19dd1385aefa34d7d9bd7f5094d779a7150667dcec463c9ab63d2ffc8ee4f6d000000000000000000000000000000000a3a010f176efe1a7bdb77dedf6b6271c845d662dca5062ebbac4e9c3b8946db0adfff37a6faa3196a99fb3ef05f09c5000000000000000000000000000000000350ad257d47f270c4340e3cb124ce961316573dea14c9584d20221d922a43c2e94324ec14bd1e4a1eb955861783a8f100000000000000000000000000000000070edff58ac1f8c13f62327cf0adbd748285fcd84ed7be23dfc82a0ae32f8c8f5f6b0679f795874cb0082718fb07a1ca,,,invalid input parameters, G1 point is not in the expected subgroup -00000000000000000000000000000000104c749e3f7b40bf6df55f9414bd146ac306b46a6210ae4ceff6fe2a58220ddbc69208ada5f692120dcfce39b1e43fb5000000000000000000000000000000000663a0e62ea68ac23a6e27958baabbb5deca3905aa138a54d6198724e5fdf0abb9288cdb52cf1d44e93f06571a654f75000000000000000000000000000000001116ecf077865395ea40fa9cf05753b87ac29ccf9ecfebfa1031fef0defa1d77634c2177647f069532e00f7fb657577f0000000000000000000000000000000005c7960dd84874fc00ab199d00e8bf1ea035a7eec443328bf2bc28d0006979f5032763a4d33f031e698895e03b27314f0000000000000000000000000000000004e00e32a506bff708c51fcc4101c8ebe7f1695d6a4606b6648b04710fdae313b99219963921451d0fc78dd59970ea8b0000000000000000000000000000000019dc4b721ec4a4303809c47da68099fc10706eb08cd4f6f91641ac680661e93a91e2067a84c12f9f55f84e27ed76ae2700000000000000000000000000000000104c749e3f7b40bf6df55f9414bd146ac306b46a6210ae4ceff6fe2a58220ddbc69208ada5f692120dcfce39b1e43fb5000000000000000000000000000000000663a0e62ea68ac23a6e27958baabbb5deca3905aa138a54d6198724e5fdf0abb9288cdb52cf1d44e93f06571a654f75000000000000000000000000000000000da3982205a45000b16e1ec7a48effad4ae1affd4acd8bd13fcdf2bf05b6845ebda9be2df6d6325389d711111641aae500000000000000000000000000000000150c1bb67fe3d88dbfb452d5b4582d9a1c350ac01cc209740be70d63e266c926cc6b0171eaea913b7456daf595b83ce900000000000000000000000000000000138d0bbb52fb6248731c8fbb6818d1379fc5c2549a5a0d663a56c41b3b2e8c7c4fd77830c455a40e59aaa65124ebcee50000000000000000000000000000000015e6b4628b75f9786ee26e41cb8b86c6e6a97ac18aa7662b39e9c96e169a3192b64b863d7f9739237255fea6cab12fcb,,,invalid input parameters, G2 point is not in the expected subgroup -000000000000000000000000000000001638395680014bc04e2ca42bf864dde47a0d708ae81ba4a6aa2e2476837750aaf5f9f6e41a5a23df432ae92fd221737e0000000000000000000000000000000009419792539e0ae995b8d853d9ef513bc54766475e37bb3dc2dae3d7fb9b02b0eb2327f24a751d2de344b9f5131ef23700000000000000000000000000000000197ff997d6c5efa3d7de8e16f26082bf13a2401d6df5f5c33c6614c36105f347e40216c907bdad9c1df6ebbd44f41c3f000000000000000000000000000000000f27a0bf92329730d776a83583177993b2b354a212a9c004f9f8892a750c477b8d1e68c13127f03b1629bc8392d06f5b0000000000000000000000000000000011b239cc6914a321385d907527b85713a0d842f5be80752f4c5758586dc1de944b6e4578bbe324f16838115e9c866bca0000000000000000000000000000000000cf93c5b48cd9de51ccaa45124217cabf466d07d6fdf4a7bb810443339ec4af5b74931bd07eb9fd31c284c05f3f539e0000000000000000000000000000000010b91e082484fff0da28b06f06e02c699d741f2ef788250e3fbf2ba8fc1d7d78a1ca63b76dadfb71015fbefc0eb70eef000000000000000000000000000000000c2fe842c659c875af0f2cb1a978ac9058981cc6c76ff057f326162d4322805974505e6a35499bd0c58b5d6db3aa222900000000000000000000000000000000197ff997d6c5efa3d7de8e16f26082bf13a2401d6df5f5c33c6614c36105f347e40216c907bdad9c1df6ebbd44f41c3f000000000000000000000000000000000f27a0bf92329730d776a83583177993b2b354a212a9c004f9f8892a750c477b8d1e68c13127f03b1629bc8392d06f5b0000000000000000000000000000000011b239cc6914a321385d907527b85713a0d842f5be80752f4c5758586dc1de944b6e4578bbe324f16838115e9c866bca0000000000000000000000000000000000cf93c5b48cd9de51ccaa45124217cabf466d07d6fdf4a7bb810443339ec4af5b74931bd07eb9fd31c284c05f3f539e,,,invalid input parameters, G1 point is not in the expected subgroup -000000000000000000000000000000000ac27e4d19924f4bfe30432554f25d456cdb4724c106409e46612e1c91e8cf5fc2cdcd6b6fd6bfe040e910795441befd0000000000000000000000000000000007e9227d849e467fbf5fadcc016dedcc04f4c66f23464195782746fde628a107d77ca5b5c9bcc8bbb14fc14208fa5de300000000000000000000000000000000094860f23d182a14d1a64d9693ce9309ef4e775f24aa3807571c9b8281fc0d6157cdb5a00b34b66be1849994c264c4b000000000000000000000000000000000062b4a3ef95b2522c894c0b492673c3800fdf8645998a899e27dc3a23c0530d96b558d1c6364477943726740cdbc88f0000000000000000000000000000000000daa2f2f2c1020339666be4b1c1e12f8d44625a9508bc5590314789d02fe0e2e676d8d240bff89b669b9290fe1d0f8a8000000000000000000000000000000000f7a710af0b04d20b7d515f2627b572a5a17a13975ee81bcb8fd90600d5fb2f161a9ab3635bd16649c95385bcd604f5f000000000000000000000000000000000ac27e4d19924f4bfe30432554f25d456cdb4724c106409e46612e1c91e8cf5fc2cdcd6b6fd6bfe040e910795441befd0000000000000000000000000000000007e9227d849e467fbf5fadcc016dedcc04f4c66f23464195782746fde628a107d77ca5b5c9bcc8bbb14fc14208fa5de300000000000000000000000000000000055d8c63d7c04bf5db81465f2fc372b798d77ab0ecf795bf57debeafbbc8998f91f71b0dbcc440e70df3d5a1cb682ad8000000000000000000000000000000001497d9519e835c0644d30ae38ee66faf39b1939320c2e0a45b7862508ea3bd7eaa3a754a679bff81af26c6aa141adae00000000000000000000000000000000001be6ce3109582f31e02051ef0e4d266f310048e04a7ac8dc5e04d2b7f2766440f1ae63e5da6dbf831b21fd7cb9cc0a80000000000000000000000000000000003d4acbd20192ee2fc55acd5c90cf5b897cb42a4c0a777970d11955cdf11d5ab22444ac9cfb666c3e509ce832cef219f,,,invalid input parameters, G2 point is not in the expected subgroup -0000000000000000000000000000000015866ee89fe4f68e45155fb98124e8453e1ca25347d84f70ebfc32cf76c5d48e3a3e5ccfb1b505db7b493cfcc73ef92d0000000000000000000000000000000013deaec2d2482c457050256d157968ea3d15f9b61b4573353e83daf824b28289343bcbc3bf97ecec9d65ad08804861440000000000000000000000000000000013467fcb424ae0eb012228fd2083d92e6d242427670ca6e2cc1166166edee5a94b78d2c2f8715a996bf2b4e5112e49f0000000000000000000000000000000000c23c01e0061b0fc7579723e072b12e86c8f12f4c2a039bdc5b1f3384441ccefec187e0380efae31a819d92fd6462ce80000000000000000000000000000000014f9a055a5e468955f6d7485fdffed2b33174777f99d9d0af160b0a083912b05da45f35c73053120f61525c173a24e59000000000000000000000000000000000cfdcb6adf8f04fac2cba8f322339fb0614f46b77b0d91f0ec167eca06fcce080ee0e63023fb94712dbe7591843b6fe1000000000000000000000000000000000d90bd38049f2a8de869d8a748c9ff3120542f38fca6e8d5fbbff86baaabf0f19dbf449cf23c043dfea322d99837f7110000000000000000000000000000000000ede89c8bb8299726ec685765f10167c5b844e427d3c15da6ec2c1d97de174819d52caa96d5cc938e93dd09bbd1e0d80000000000000000000000000000000013467fcb424ae0eb012228fd2083d92e6d242427670ca6e2cc1166166edee5a94b78d2c2f8715a996bf2b4e5112e49f0000000000000000000000000000000000c23c01e0061b0fc7579723e072b12e86c8f12f4c2a039bdc5b1f3384441ccefec187e0380efae31a819d92fd6462ce80000000000000000000000000000000014f9a055a5e468955f6d7485fdffed2b33174777f99d9d0af160b0a083912b05da45f35c73053120f61525c173a24e59000000000000000000000000000000000cfdcb6adf8f04fac2cba8f322339fb0614f46b77b0d91f0ec167eca06fcce080ee0e63023fb94712dbe7591843b6fe1,,,invalid input parameters, G1 point is not in the expected subgroup -00000000000000000000000000000000119c7c85e5efaf08b91dc496758b962098cc0eb60f4a770bfafa91809ae4a95b43f96b69c8ddc897701487f22d2e049c0000000000000000000000000000000007467ac896ae9f7d2cfdfbab082c89d3c17a6dfdf1f69b4b38fe6d5ede6848a45e8b0d728eb8c68752ec59c8e0504dcd000000000000000000000000000000001047ce33c70d58e3191a558ce2fd95c20bb62abae7d924cec8a4067fb33e8dacd796d65c049be7bacdb969f61db5b26500000000000000000000000000000000096e7081a7b2377331f86d8418bd577cd5cc1d45e60d39b519ff2b3a50ddb2d5f6dccc0066167f42498a3d29ef5ce2e30000000000000000000000000000000011159939a04c129b007f2aa2d59ae006e8d89c41dd465cba551737d06d3fb2c1161aee98e86cb8c0321f42e514316030000000000000000000000000000000000c25d9cdc8dbeec82c47d5ef12f21a7e58a8eddc1e738e635ba04f2ebe12440090f432c0d1518217a5531266441f1c2500000000000000000000000000000000119c7c85e5efaf08b91dc496758b962098cc0eb60f4a770bfafa91809ae4a95b43f96b69c8ddc897701487f22d2e049c0000000000000000000000000000000007467ac896ae9f7d2cfdfbab082c89d3c17a6dfdf1f69b4b38fe6d5ede6848a45e8b0d728eb8c68752ec59c8e0504dcd0000000000000000000000000000000013a11383f2d3a3c28e3ea750fece5790e37f66b306ecca417c83840bed70c034e4b82b0850f719fb0b3b203a25dffae40000000000000000000000000000000017d067d9cfbbcf605c5da3532b2eda5900d71340508f08c05d0051772e65b0f85b9efe5b6d63a7b64b25ede8df7f25c9000000000000000000000000000000000e44847884ee8eacd5417e042e8299af8313ce177ecdd034a91d3bdd441437510808d44e328e810c46bd851ceb6085dc0000000000000000000000000000000013288506fd52bf37aaa975b533f1182a824b79d2d876ad6ff705efeec7f732bed99d2da8f31c00a2db4d97c4118bcb88,,,invalid input parameters, G2 point is not in the expected subgroup -000000000000000000000000000000000b7aa89ed719e2af5ad32ca923f1d2d52d767f6bd33d8967d2619b54472c8881ad06441b2595931d734a0fd10ccd7f190000000000000000000000000000000014bd6118d65e19e4cb79af164f523f1c80b0f0a0f0063cf1d28e11ae7987381c0b9707e43754b75f36ca8523bc5f7da600000000000000000000000000000000056a29b523b0cf85ab04b0a496e078dba5529cb9699e567ca42f9ee3e3f07b61ae29b0ce17cad23131375f624a366157000000000000000000000000000000000acb91d1f057c7aec1f7561614a95f8db2252cc879bbc2595a5f607d8b0ecd6e6e3ec19849eacfca62d870b049ce84910000000000000000000000000000000010d9459e07178af8e125c2f66de699cfafb5f87a63454e24d0ed88b6c804a9ff204f146ecf4d6db62234ace0a944acb20000000000000000000000000000000007256a68e23b43a3b6475b3cf209ec108bac13631ca448cc860672c65c1760a8299fe941ed5bcbbbcf63a683e86806ae0000000000000000000000000000000005d4453da747eaef90007eb8ebf6088e8617dad362f2a95638fca7312bc5cdd8200f32b17a0b483052e6784d286c2cb80000000000000000000000000000000012f0e56ed3e3f628a13493d0ade2321310cf62927b40887202042981fc9a81d6cc69be130346b7bc244a2119b2632a5600000000000000000000000000000000056a29b523b0cf85ab04b0a496e078dba5529cb9699e567ca42f9ee3e3f07b61ae29b0ce17cad23131375f624a366157000000000000000000000000000000000acb91d1f057c7aec1f7561614a95f8db2252cc879bbc2595a5f607d8b0ecd6e6e3ec19849eacfca62d870b049ce84910000000000000000000000000000000010d9459e07178af8e125c2f66de699cfafb5f87a63454e24d0ed88b6c804a9ff204f146ecf4d6db62234ace0a944acb20000000000000000000000000000000007256a68e23b43a3b6475b3cf209ec108bac13631ca448cc860672c65c1760a8299fe941ed5bcbbbcf63a683e86806ae,,,invalid input parameters, G1 point is not in the expected subgroup -0000000000000000000000000000000015827c619b2a73a750f6469160ff323c15adaf55e893933a5c2e5c2f0df8bc426421408773a3e8cb8b1695973f7c0b760000000000000000000000000000000000af4a7d29f10cd080d9989b341fc030a5dd51512f776fb1da7a46d542c2a6a2ad7c1309af30423b717825fd5dc0356300000000000000000000000000000000198d09947dc088c1d33d776d64765766b508764f12a28fe0119277d6e171af7c9ff83f6823558e8b1a4284857663afb700000000000000000000000000000000130d5e5315f8df8d0142d06bad7a51b08e5b3c2d49b84c9d6b177b9bb628a852ff65c1a93982dcb1b31a2dc0941904750000000000000000000000000000000018cb011868591c6b44b7ce49f82470aa6461a737173e1d88d249c0e83fc6e4e6a15f8397e515efe7dc7302ccc2e369ae0000000000000000000000000000000004de1c5539b2ef536a66c8f3d7cd49ed948c081c08cba8826d2ccdf9d159b931ea10eeb8b3f465dce0143b179059169f0000000000000000000000000000000015827c619b2a73a750f6469160ff323c15adaf55e893933a5c2e5c2f0df8bc426421408773a3e8cb8b1695973f7c0b760000000000000000000000000000000000af4a7d29f10cd080d9989b341fc030a5dd51512f776fb1da7a46d542c2a6a2ad7c1309af30423b717825fd5dc035630000000000000000000000000000000004286a9efe902158cc624080ebc5fd9b5e0e6e31554c745d5f0c34ef1de2a487f77d405577559dac59babc731ca779110000000000000000000000000000000009c09c9c9e2c75bc6a81357c03b339668c7d8cc8a3f65790ad53b62f4c21acbf64fa66fdd75dc24c05214b712ad7fdb60000000000000000000000000000000018bf7e4fe271fe195377639c5743c1ef3eccb09c86d64d2a4dad2d7d4ff0feb46252d749f82a27141dc0007649b032bb0000000000000000000000000000000018113c4584b81eb814a9f1ebd041062d0db8bec46c2c1ffb7f863bdd2fc3fac470b01c32b6f2453ab048eefe362aa1b8,,,invalid input parameters, G2 point is not in the expected subgroup -000000000000000000000000000000000c3f4ece90cf7d380efd3f81e66110a5923bd604422fca0fac2a16fb9a8d8b34cc1fb86a15009e8cc2c0d9fd8fbc0fac0000000000000000000000000000000012ea55d042ae590abd4c2687e0f152384d37665ddf26787d49bc9f6d40a579bcb23521c59ce91c418b9f4801375892aa00000000000000000000000000000000098af17ffd4d28bad76ce1ee669e7cdac1eec9facc260440636be88618302ab5a0826141b4fc914a389816d04597826a0000000000000000000000000000000011bef78afedf5c62daee5e86386c45826a524352fea40f68b07b7794df8eced4eaf0fb55b6990b4fb417ecc597b61e48000000000000000000000000000000000d64f0a4df4f858defde17b31476045c3dea78de4ec8082822c1699c0b9619464c75f0e57ebd12ad9e4e2e6b291b538c00000000000000000000000000000000031f12dc8a9c5445d575f99e2a4b4217ba5c0be58ac00977236440ab0ac7e2c8dab72a64464e4480aab7eaf1d629c7e700000000000000000000000000000000033f3c31337bc48622d27a9a3224a2acdb5c538a59b497a4a85840c81cff667ed0a0e4e3f4bb23a9ae53c1e79ea54cbb000000000000000000000000000000000cf0dc22af4530260cde26aa0eedc83a0ec3ae87d024e6907f3d22070e1054b3d4f24d5ace7218ed44763af6ec3f25ee00000000000000000000000000000000098af17ffd4d28bad76ce1ee669e7cdac1eec9facc260440636be88618302ab5a0826141b4fc914a389816d04597826a0000000000000000000000000000000011bef78afedf5c62daee5e86386c45826a524352fea40f68b07b7794df8eced4eaf0fb55b6990b4fb417ecc597b61e48000000000000000000000000000000000d64f0a4df4f858defde17b31476045c3dea78de4ec8082822c1699c0b9619464c75f0e57ebd12ad9e4e2e6b291b538c00000000000000000000000000000000031f12dc8a9c5445d575f99e2a4b4217ba5c0be58ac00977236440ab0ac7e2c8dab72a64464e4480aab7eaf1d629c7e7,,,invalid input parameters, G1 point is not in the expected subgroup -000000000000000000000000000000001679e0889aac1501b67c4ccee84942e05b1720f48b6390ab82ff76c0ab95defb79b4371770f2e07a9e7ee8de4d76b43500000000000000000000000000000000162fa6099ca3e5e8e27dea6ea0d4d13c5c150d281fd6beb2079ddf2d714bf9458184100c88440109d7526812ee0f56e000000000000000000000000000000000087bda5b07cf72c2b350e663670f094c352097330b307cbe2f7b4224841b6eb23c36ba62d4ee591e5ca68383ec0256f6000000000000000000000000000000001163d4985e0f25d36a1f8dd97b61413b0015a966a88d98eddb2ea2d5eabdd83a44fb7e37cee90cc50df2f95dbfa97979000000000000000000000000000000001652067ee82320191cc5b188e61ee2d1b94c781e8e5798c89224920ed1d12a2cb41066f69cdeffe8a4d5e3aa1be4c83300000000000000000000000000000000139cd806423ee99d913e8b0e5ddfb6b1b62478254fe39d6836fbc632de9435e1464a556b1f9466efebe93636dfde7749000000000000000000000000000000001679e0889aac1501b67c4ccee84942e05b1720f48b6390ab82ff76c0ab95defb79b4371770f2e07a9e7ee8de4d76b43500000000000000000000000000000000162fa6099ca3e5e8e27dea6ea0d4d13c5c150d281fd6beb2079ddf2d714bf9458184100c88440109d7526812ee0f56e00000000000000000000000000000000017028dd744482e290c523ae5944c8a149afd9d344fea7ac0171ee3a5ff0c2add53ab20c477a584bf61e007af5840eb4a000000000000000000000000000000000863382ee8a43f02396030768905e44c8f9504b7315b00e379b92060e4f01e1b4e0f837b24cb42354e7211419a5516480000000000000000000000000000000007e2af64687f7d581d5a2bbdf225d1ab3dbea326ec89c08852807696c8d13cc907ef4289bf5ef9826c1fb27673b28bfb000000000000000000000000000000000ffc910160c8a0b826600fcdbec027e7d4874c9774324bddd2dd4428eb81c22618a49378502917ad9fcd96bdb1371285,,,invalid input parameters, G2 point is not in the expected subgroup -000000000000000000000000000000001902b8c58eae3ca8d2261a637902587c2c0e75d32abc894967b6837ea34252e4558966f931789ccd76c1bbe3e092b180000000000000000000000000000000000dd20f71f5054c79d5e357f69f8d7345b5a036241774a72743271f2dc8f6e8c29a3babc2b65ed8193cc0636fb2e86f740000000000000000000000000000000003e06e2dcfbd695e9bda0baee1276ceab637fd1fbe2d2d6458c923c35b00edc7edf4f9e797aea59ff8cfceada0615a02000000000000000000000000000000000a04a2ed5e42fac7f064b43d64151a6c517ecf22dbc7563a3e9f35f555a9992fe45cf6a728ba94607df7c96f7e0a334b00000000000000000000000000000000090fac97f9f524168bc930d26ea1627ceaf187398d6bfc5a019c8467d75cd31a41c7eb9fda35fc85bd92b4cfca92dbff000000000000000000000000000000000f37b91dc935c28668c27d38328a511148c1739b65f2816dc53e42a8f059c9b2be7417a6f97c9a2597b1a0f06b7afc65000000000000000000000000000000001687dbd36c7f96f8be47f08bb75bc72f91e63e26d0157a9a9c8f531f3e73bfbd9870fe9abd0a7a3fe73b997e48d0ffb8000000000000000000000000000000000183ba882bdaf1dc850cb4e98158895effda1734fa64810cb15640e6cc027bd006e5c1a088cc2c65e8af29b64fe41d4c0000000000000000000000000000000003e06e2dcfbd695e9bda0baee1276ceab637fd1fbe2d2d6458c923c35b00edc7edf4f9e797aea59ff8cfceada0615a02000000000000000000000000000000000a04a2ed5e42fac7f064b43d64151a6c517ecf22dbc7563a3e9f35f555a9992fe45cf6a728ba94607df7c96f7e0a334b00000000000000000000000000000000090fac97f9f524168bc930d26ea1627ceaf187398d6bfc5a019c8467d75cd31a41c7eb9fda35fc85bd92b4cfca92dbff000000000000000000000000000000000f37b91dc935c28668c27d38328a511148c1739b65f2816dc53e42a8f059c9b2be7417a6f97c9a2597b1a0f06b7afc65,,,invalid input parameters, G1 point is not in the expected subgroup -0000000000000000000000000000000010f38e6e4f562be50152c1d10eee8f8990cb8f884035bdce111e178d1286afe2f2f02c3a36858ae2ce902d6a2872ff1000000000000000000000000000000000141dc64999baf42240b933f30ee895188b561b880f90b5f1ca8df0ac75be7d95bc15d55e321720c172171e9c4c59e800000000000000000000000000000000000548814c4b6d72cfb817b49b3141302be7d7b378e50ff9f7d66e31cd04e1f024bba334110817990264d26cbcff7170510000000000000000000000000000000011f9d186fab00b9ede155a82ec5a5e587a1c6091005c4c6e90672d15c434953426440799c5ede15a7976f18bf345595a0000000000000000000000000000000018d480ece4609a56220d4db100b68ca06ee4271b84e1a81112fbb0616cb34d2b0ec974de31f7d6957b186dbd8a8f8ad3000000000000000000000000000000000c3c1b79130f73d516c1bbe38c572be2616991b523a9370c98df9313be9f5015c3e8d51947201c6b27e8cb9c7291bd660000000000000000000000000000000010f38e6e4f562be50152c1d10eee8f8990cb8f884035bdce111e178d1286afe2f2f02c3a36858ae2ce902d6a2872ff1000000000000000000000000000000000141dc64999baf42240b933f30ee895188b561b880f90b5f1ca8df0ac75be7d95bc15d55e321720c172171e9c4c59e8000000000000000000000000000000000006d89d908b733aba090432e795c564d1badd5b8529fc53507c4850e3d97978062b38790ef45562f3d4978491b5ae893b0000000000000000000000000000000003f7fc037328c13d13fdf4b2c251ce10c41ac5d042122f0e4e4f5a71cc9e1463f62d96aed44123d0e612e5296b53fdb80000000000000000000000000000000000aa2e027a929f7637f437b333a795a2e8d1a92cda31feb5a72fa1c66fadd23813177f9360204b0512d8f460b5bb161d00000000000000000000000000000000139a2a989d462e1793caba250c2ba9c46f31b3a06f43a0f4cbaa021b5d52d254f18d9517ddf3c21780f2a2c59533c5db,,,invalid input parameters, G2 point is not in the expected subgroup -0000000000000000000000000000000003ac8ec0fbf8c4a6774d8567a45b033a4a622d88d8b2025eecd746d084617b67342cb1030068ef6dceea78cf97210b6a00000000000000000000000000000000090b3a144dd409afa163ef513af313e545330a66c33d45b32d61cbdeccc66f78062060a2bfab2a88ec0cc47ec3525f19000000000000000000000000000000000d542ceffc583a6022306479b2365171c3610b7f615619802caf2f81d78f2b5166114485dfaacfdfc27c6450f8c344550000000000000000000000000000000010f5a12712658a5359c0a310f6d833c0b4623c51da6c035dfddcc4c201ccb27ac0a534da459a82488c32e1d4ced9b8af000000000000000000000000000000001878dfc18d1744c6f837b36436b82cd9c270916e5206f709e7eb30fcbd4157f65639103f367f1af2684a51d93e3dc7fb000000000000000000000000000000000ca3a300efdfd9812b6213a848d7a2f865d3fbe8c73527997f18460485626921063bd5b7842b8a47ccadcebb5539a54b0000000000000000000000000000000009aafc73979c000236c08e089828880f54645b5ff4c1dcfea0ff41ffe8e3fce8ba0dbcebf0d4205bb6616a737b6d3542000000000000000000000000000000001399a2072604d50f92ee186924ce32c4e887803dc258b7495aa2f3d2187571045db7f360d2614b198f83bc8024b06559000000000000000000000000000000000d542ceffc583a6022306479b2365171c3610b7f615619802caf2f81d78f2b5166114485dfaacfdfc27c6450f8c344550000000000000000000000000000000010f5a12712658a5359c0a310f6d833c0b4623c51da6c035dfddcc4c201ccb27ac0a534da459a82488c32e1d4ced9b8af000000000000000000000000000000001878dfc18d1744c6f837b36436b82cd9c270916e5206f709e7eb30fcbd4157f65639103f367f1af2684a51d93e3dc7fb000000000000000000000000000000000ca3a300efdfd9812b6213a848d7a2f865d3fbe8c73527997f18460485626921063bd5b7842b8a47ccadcebb5539a54b,,,invalid input parameters, G1 point is not in the expected subgroup -0000000000000000000000000000000013a366c2748305c4ca702c053ddcf15df4a4a7858cda813d001f59bdbb419de6ae3fd24b22fbeebe58d5278caf04c0c800000000000000000000000000000000140759404192c97274c06a69609a1f927195dc0e9df312f483b075e0647a9df1225c22284edece061a2a1c3dd6c4af030000000000000000000000000000000018059cd50cc71b1060ee01c10860bccaf2abbf84cc09266f2818b7625be9368138784dfacf0a1413f19bed9c09294fed00000000000000000000000000000000138939b9b91fcc8ee3aeb35de9476576cc84adbfc513a72fb74c6b897a9d6bb2037d65489709de062b238c5d0587345f000000000000000000000000000000000a9f2a8303b70df25b27158d7fbe06db9b71f6b30b8d8f3d3ad3e81ed310af6ba00eaa104c4c8755c3c24b37b5a9bae90000000000000000000000000000000014297a57a543d963d777ce5e3e5b07d19d69f56ff3efafa2753889522f10dac3fcabcc77466ef236d331361955b571670000000000000000000000000000000013a366c2748305c4ca702c053ddcf15df4a4a7858cda813d001f59bdbb419de6ae3fd24b22fbeebe58d5278caf04c0c800000000000000000000000000000000140759404192c97274c06a69609a1f927195dc0e9df312f483b075e0647a9df1225c22284edece061a2a1c3dd6c4af030000000000000000000000000000000009a457949f0a3a5ef91fbe3beb52dcf95a9f71db70bef860d2fd60cf9330b99e1d103eea022f32f0db603a635925f2940000000000000000000000000000000018e2ce9366745f5691d3c8f907bffed5f9da928cf9c9997db1311bc47b34d9d0a076ea5b7845e0dbf1c3dab60edca5de00000000000000000000000000000000089bcfe3a5596fe5f3c61326de93eb63abb0f56a7b9a5c5f4ebd883ea681607352b955deb581b57da99e4fd302e136c70000000000000000000000000000000007cb502742faf77a7223dc713a243af8998652e45f51b32dabe766c7a771bf4642ea9f25fd924e61a0f0a6e0f27c99dd,,,invalid input parameters, G2 point is not in the expected subgroup -0000000000000000000000000000000003f23275ed56b4aa4a1fe367219e8c84142d60d6b9983e0abb8ca21a88e008286a902b2b92369ec14d7f45f7b66b9a0300000000000000000000000000000000130b8d95a4672e467f122fc010ac3ef7f6b6d0ecd044413e51f7c27ed22f7ab7a28f60245b9ba83d4ffc98b9a990510e000000000000000000000000000000000e5af1420546c1a5a0e0c2bd9241bb7c7a26dd52f4f358fc868bea457a60bd4f6bc5b60b27069fb4f6760813a91ada740000000000000000000000000000000017426a65d239b1d9505bef2b476799c394fcc7bfdca36a1ee5a600351334dadc238b64cf8a667a25d4880a31b73c53a9000000000000000000000000000000000f151587944aad17429b51b1c16193c1e1c93cb412538d1475473666c997e012ce618eb841c4e9e064a08ab83d7fa60e0000000000000000000000000000000015c2e049c532db585807319c23ec077a51f288fcffb2cb6528d3697221e8542e3fc85d18b079ea1b217fae30858a36f20000000000000000000000000000000010a1fe14b9981a917e49b71f549b7b548629ad0003b43a9eff26e2cfa7fd8ddb21056e26dc78c88d30c32e62af40a83d0000000000000000000000000000000019f408194aa79434edd5f2a3adcc5c55ee9c1f616641b29ef21fbba8cae342df67ef438095dd7677ea1959f9a855974d000000000000000000000000000000000e5af1420546c1a5a0e0c2bd9241bb7c7a26dd52f4f358fc868bea457a60bd4f6bc5b60b27069fb4f6760813a91ada740000000000000000000000000000000017426a65d239b1d9505bef2b476799c394fcc7bfdca36a1ee5a600351334dadc238b64cf8a667a25d4880a31b73c53a9000000000000000000000000000000000f151587944aad17429b51b1c16193c1e1c93cb412538d1475473666c997e012ce618eb841c4e9e064a08ab83d7fa60e0000000000000000000000000000000015c2e049c532db585807319c23ec077a51f288fcffb2cb6528d3697221e8542e3fc85d18b079ea1b217fae30858a36f2,,,invalid input parameters, G1 point is not in the expected subgroup -000000000000000000000000000000000bc43aa42d656bdc233b332698247bad1904aff059eaa3f9b943ce5d4ae4f414dd361062a243f38129b954f17389ec280000000000000000000000000000000018dc8ec1d798981f662a8ce10f25f31197a2d168d3c047d2f6a214f1554202d072baf004c61b6d58f4f0410a4520b985000000000000000000000000000000001217fe0908fca8686b63337b0de6d3b3e4853466a990d8feb8a127cec95fd8dfc97be2ac57587d5f9ae1f5c10848e5910000000000000000000000000000000005c60861ac4863f7b9c38952daa88c2414ec8ac14f99fc765042b718da08136537765dcbc28cc6a0c279d491cf95b4b500000000000000000000000000000000154b289077530a86091d21c8be9c25ccd250da8d77caf853955b0d169e1ac40b5e0fd539b09b61b293035ebcbd0e21f5000000000000000000000000000000000356ddbe9454937c441dcfc98fe7b0cf8a746464f77230229328cafe6ad9ad1b5cc7a60e50bd8431b0996e3c42882777000000000000000000000000000000000bc43aa42d656bdc233b332698247bad1904aff059eaa3f9b943ce5d4ae4f414dd361062a243f38129b954f17389ec280000000000000000000000000000000018dc8ec1d798981f662a8ce10f25f31197a2d168d3c047d2f6a214f1554202d072baf004c61b6d58f4f0410a4520b9850000000000000000000000000000000001874e45ffd1349b4ed2e361dd7093a2ba41281b2d78f123bf9f6f73892962a0bcd6dc6e4159e505509cf7839aa79a20000000000000000000000000000000000ae0404355b78d20c1c3f5d65373d905696b166e76de62feb33f819dba26d39ef78621f819e998f6f2c82c65ddc22fc90000000000000000000000000000000008a499023de01bbe12958e10a3ca967f0f6047c705345beb8fb835c26df4eee908448b39191321f3eacfbd0951861c40000000000000000000000000000000000a56e3272f0474f980511540610b29e9a722a868025ac424ce8f76f342721a92d2544a420d3472f13186a0837d7e2c43,,,invalid input parameters, G2 point is not in the expected subgroup -0000000000000000000000000000000003e157886f141c2ce7d9ff32af44df6b7407af027005aac1149ebbe74b3b810f834b019b3e67a04531e2554f122d959600000000000000000000000000000000159eef0ff7bbe471a7ef8e666ffe35f427e3ef5bf9eeb4693dd4127467cf2615fa6b289be07452bec5c35b6d8d8ef2a100000000000000000000000000000000028316eaa131ef5303b012bfdd145bcb3106b362f410ce05810b8c83e10b1a8f80167b546b8b86c1368d7099fb5a0deb000000000000000000000000000000000bb3a353a2c16bd73c62fefd820927898dfced930d9639c5f63e62d8e8d31fa028cefb0d57ed16299eccdf3700b62bf200000000000000000000000000000000198272cf5c6e8a4f4cf4692fb7363687d7ba52deae88a7b976863309feb4a475db150073593567352ab62a150d862ca20000000000000000000000000000000019af00f2cf92494f532052962b62c34d0999a984b4bf36abd74a485fb9089ee0967071886b97f541ae80c6f7b8bc73070000000000000000000000000000000014bcf3f26683234584d79b436cc608462f1e2c20b5ecc5019988d8e30137859a4b6d0e1135dd5bbea0781b8ed3f0653700000000000000000000000000000000090ef29bf63ca97ae8388588227e1d1a0653c43b16a35a63f2ab4f0b11fd8005d9a85d30a7406491d983f347e4dfb9f100000000000000000000000000000000028316eaa131ef5303b012bfdd145bcb3106b362f410ce05810b8c83e10b1a8f80167b546b8b86c1368d7099fb5a0deb000000000000000000000000000000000bb3a353a2c16bd73c62fefd820927898dfced930d9639c5f63e62d8e8d31fa028cefb0d57ed16299eccdf3700b62bf200000000000000000000000000000000198272cf5c6e8a4f4cf4692fb7363687d7ba52deae88a7b976863309feb4a475db150073593567352ab62a150d862ca20000000000000000000000000000000019af00f2cf92494f532052962b62c34d0999a984b4bf36abd74a485fb9089ee0967071886b97f541ae80c6f7b8bc7307,,,invalid input parameters, G1 point is not in the expected subgroup -0000000000000000000000000000000003b6f466571daced9c0d6dd76b5f7cc91f20d92c0fc2f051a97524aee838be57eb977af49bf020a252db1b49693892ee00000000000000000000000000000000002b99dffcb6c171f66632d0cbc9aac74e6f4823fa4690e273a5c16baef618b80d2daf81d8c6b4c5240e1c329ba91b41000000000000000000000000000000000a32e330b87bb0c2984ce443412953a879f396221cd21c2f7ae46699b02c76352d3b13759d70541fc67cdc0e65fa6d4f0000000000000000000000000000000006a134cfd54f8e524544b170a4ae0b3da02da61b56633ace68b05c511a425a0a17d3e3e155a592e6176f707100174d1f00000000000000000000000000000000132f34e6b61e7fc7764b3113a4761cde446de56d3bfadc7f285bcf11132ce8d52c656cd9cddf176755dc228277557dbc0000000000000000000000000000000019d74adf4504a87de20b5a53d4e668be279d5850dc13b1699769d2279a23903f6f789dd897c2180ed895351e4f90d7e50000000000000000000000000000000003b6f466571daced9c0d6dd76b5f7cc91f20d92c0fc2f051a97524aee838be57eb977af49bf020a252db1b49693892ee00000000000000000000000000000000002b99dffcb6c171f66632d0cbc9aac74e6f4823fa4690e273a5c16baef618b80d2daf81d8c6b4c5240e1c329ba91b4100000000000000000000000000000000025c97744f862c85507620fef6d4b90a1e37ab2d6c5ed2d794880b43bdf854ea77e87e90b5a487c56fe29e28bf7ce01100000000000000000000000000000000120515b8665151db933e51722fdac7a83d2f299623a38529508b25218f0d57aeb0c6f260e0ef3741ea1f89bc653e5d700000000000000000000000000000000019d1111f074ac541a381472a4d9dc6b76cf64e86d92018460e977460b46e17924dfa522a5bfaccbfd8bd0711950f41f6000000000000000000000000000000000433ad85586f9392cc6079c1f4f37eed99fc65da9a32206912465116f879efcf9e83d8b325433ee31235142aff89a49c,,,invalid input parameters, G2 point is not in the expected subgroup -0000000000000000000000000000000009b488e21aeb418e8913f6bf721b3398693a3875788a3e013717fbba3c6ddaafb4073378d121cc1f2f99c072b7f8eba600000000000000000000000000000000144346f013254cec17d8423f534d54e2496df08193ed65304fe300b47a68c8d322b6ad84f748529928d64298be5ac1f200000000000000000000000000000000102c92272571b73a7df754728d7293fd8050d9dd2b8605c3f7722e6de541b7fc6a81b01c1cf15e5241ee4ee1f81ab39d000000000000000000000000000000000af1cd6f23bbd3e9ef75eed6d6d99a7cdd24574881b3609e45c4adbf82e08259d14701fcc5b6338ecf52166aecca003700000000000000000000000000000000026a1a4c3eb54de2ba4509dc806db9efc7e26247d501cb59c525b8dd15d03b91abafa9ba5816c22e1f8ca159cda34bd500000000000000000000000000000000170b510ec227fe8534a2cbb0f405756491c4f6832df552bd23980ab0946725371b3c24fa8b93a38bdcd47e1026e1d2a0000000000000000000000000000000000d327350067f7401a228c4fbcc7375f2edb058505ab34341df865a82781448d8e053b478e97a3ff79458b264a0dc186a0000000000000000000000000000000014a92d6662933a9eec6134002fb0e23a0930a964bed5bf84886bc3819516af19fb8bee2c0291c518119f4f4198eb67dc00000000000000000000000000000000102c92272571b73a7df754728d7293fd8050d9dd2b8605c3f7722e6de541b7fc6a81b01c1cf15e5241ee4ee1f81ab39d000000000000000000000000000000000af1cd6f23bbd3e9ef75eed6d6d99a7cdd24574881b3609e45c4adbf82e08259d14701fcc5b6338ecf52166aecca003700000000000000000000000000000000026a1a4c3eb54de2ba4509dc806db9efc7e26247d501cb59c525b8dd15d03b91abafa9ba5816c22e1f8ca159cda34bd500000000000000000000000000000000170b510ec227fe8534a2cbb0f405756491c4f6832df552bd23980ab0946725371b3c24fa8b93a38bdcd47e1026e1d2a0,,,invalid input parameters, G1 point is not in the expected subgroup -000000000000000000000000000000001756d051ce0ee9ac0fd83b9a069086cfb62164d5131a2c7be22122cc64fe74590ab5b69e02b37a6075384df9552d1d6b0000000000000000000000000000000013826bf44ff233e612a9dc8d47cbb3aff4f1fb5abf0ffbd35f4124531bca696371357301d12ed89a2974de5027c2c59f000000000000000000000000000000000ec934504ad116a80cf15a8d9a3a0bd5db18139560adbc6de32b5871198df9ecfe122369dbce5a19eeeffffd510f403b00000000000000000000000000000000007e3f75ccfc96dbe63e7b877420bccfccf2a7a56994fcea725c1b9f1823d93b0913ba1293f32493983ebe18ae27ce6b000000000000000000000000000000000ce8b2413d344263a5e598900af1524bf863e92fc3c8a2b1f335e9029081de05c70b50b97bef75044d8083e92f99b88a000000000000000000000000000000000a47a4c7b8b35b0729b43db9785a9f15c7357815e5d1ddf02d14003923120a734a1edd931d39d9261b55c145f8c69443000000000000000000000000000000001756d051ce0ee9ac0fd83b9a069086cfb62164d5131a2c7be22122cc64fe74590ab5b69e02b37a6075384df9552d1d6b0000000000000000000000000000000013826bf44ff233e612a9dc8d47cbb3aff4f1fb5abf0ffbd35f4124531bca696371357301d12ed89a2974de5027c2c59f000000000000000000000000000000000f3f5ca684120f4b7132153ba02995e88c50ac830aa65e23978ea6be09bc838249adf113e9b463cb01fe0eee43262d5f000000000000000000000000000000001270984624e5da5aeff659f5b75d3e7e5ec655ba342e318b0643672f6e71b84916ef767c58daea149f8029bb046e548700000000000000000000000000000000064c7217b420841cff11994a5f9ba682f7df02be4c8ba2027b67d33bb51b0b956137f61ac037d5551d5ca2b880e4140c000000000000000000000000000000001813131d845fc7bd523c7a295f2738580d9b39f6198ff19112b9dd38276c3045942e74c59b4392f59de70e7cd2ee87b0,,,invalid input parameters, G2 point is not in the expected subgroup -0000000000000000000000000000000003dfcd47087531272c3fe93d82878c5a689eba15fd67534bc2fa045b1995eca650e19e020455f0b1cbe599fb27b8352d0000000000000000000000000000000014cc297621e8b9d4ac8b1ced78c53d61261e899de0077b73f4f119e6fc50d5aa10b5111640eb3390057510825a20213e000000000000000000000000000000001150494bc162c0f414d31816adb18256b7d9fc6593f89b30b76522566667dc302050acfba7106031e99bf580fad24aad0000000000000000000000000000000005c920cd2ddd5d660e3246962b466f34a28449fe1790b9312f81fa70e13c1835970d4b807352cf7d89efa093120d527a000000000000000000000000000000000d384fa4729576214cf631ac1e6e2af54176954bd63f13cf15f2cd3c1db4cde4758d260ea4ffc0606aae700bca7ca7ff000000000000000000000000000000001824caf3b35915f528dfbc82bc5d56b5f8e7ba2b02056f6e27cbdbb0a54de8d4749446f14b116ff36b9fa773808c647d0000000000000000000000000000000011d4918642919c801fff0962062a387a4dffe693ec09cd3d0286a18e3a22c84fc09e8396ca82e6054d8535cd888179230000000000000000000000000000000016a1f0c7fec5647dcce688d3e4e526749bbf23c1fcd9e9168ace47399f9198c9b3a6b8aeca68febde1b7beeea0641aa2000000000000000000000000000000001150494bc162c0f414d31816adb18256b7d9fc6593f89b30b76522566667dc302050acfba7106031e99bf580fad24aad0000000000000000000000000000000005c920cd2ddd5d660e3246962b466f34a28449fe1790b9312f81fa70e13c1835970d4b807352cf7d89efa093120d527a000000000000000000000000000000000d384fa4729576214cf631ac1e6e2af54176954bd63f13cf15f2cd3c1db4cde4758d260ea4ffc0606aae700bca7ca7ff000000000000000000000000000000001824caf3b35915f528dfbc82bc5d56b5f8e7ba2b02056f6e27cbdbb0a54de8d4749446f14b116ff36b9fa773808c647d,,,invalid input parameters, G1 point is not in the expected subgroup -00000000000000000000000000000000111650bcc4c7deaa92ef43d8355198c1c0bc402fd758933765495eaf2a6c11ea6b5b6fb4a89b00040c900fdec791c7b20000000000000000000000000000000005519640447380e96adae5042193695193484d61ce0cf26acca8c96932be68e61ad6cd23515f13f8fa4fbdd6ca5390e40000000000000000000000000000000000c6f11a5306aff663038d949d08092275c7c507f68605bf9a4b591138f578f9c454ce12176d4759e1c95f3243185b9b0000000000000000000000000000000018b28c875d620249ecc25cff0ced2b3766aa66254906c69b7157b6e418a332293723b4b268d6f9d97f566b4998997adf000000000000000000000000000000000ce5e55ebe8326ee5650122f4b39dc96fe95aa4c48d26f70580fd97be90782bebfdb2d94e784786c4188ef99ecc33f55000000000000000000000000000000000632c0e5c998679e92ad269e587e831da5dbeaff3eda614d904e11c0e4dba3c87b40101cfe2f579e8015731d0ff22ac000000000000000000000000000000000111650bcc4c7deaa92ef43d8355198c1c0bc402fd758933765495eaf2a6c11ea6b5b6fb4a89b00040c900fdec791c7b20000000000000000000000000000000005519640447380e96adae5042193695193484d61ce0cf26acca8c96932be68e61ad6cd23515f13f8fa4fbdd6ca5390e4000000000000000000000000000000001780ae947388f0e055883d231f8809eb8fcc5e30eec44cbfaf11c52d4fc14bf54480c439e805559f64bd6f2085e12f1600000000000000000000000000000000142aaed1757c6f6ed83d532333e6f8f340625864fae2e71101d1ca6787045189dcb408c433caa3a19e9220f623398aa5000000000000000000000000000000000e29f5acc8998ea0d02d72559230f119ab9f8c4a013c63baa553e6ef7f5a5d38427f5b1e82b0879201ffb5ff3e23911c0000000000000000000000000000000000b934ca967385631e767483d6279afb80ea063b624491d5d837bbe4509e1f54a90b9ccb153039fbec7716dc77e28755,,,invalid input parameters, G2 point is not in the expected subgroup -0000000000000000000000000000000018bccb5411a58583445efe99e16d0b1fbb8ec71c6c8175a73e8d289f102d6925b68374d8986bbe9353640565fe30d3200000000000000000000000000000000013036f4649ab1dddd84a12d5a3efb93f8187824211bda276cef8376ffc90f5728bdef3b5b1bcafd59fd9ecf3bf9acb76000000000000000000000000000000000a43335eb6ff3bf2daeeb1eaf44c2782eeb517e82e55203a247b7a396e26fdf85f93695753c52c68819b58c95f361820000000000000000000000000000000000c240b7896b3dd0c318dc9ffcaa001d20bff288def3ce42752d660fd705e1544e292a5a0aa3a9a80ae91cb47cb938989000000000000000000000000000000000e5195bcc4ee8b149a769322165b6a3157ee7d04546643390adc812b6296675dbd31168b268df869a6722a7c8f51c79d00000000000000000000000000000000004af7dc8a5c552f00d55b996d193a9571173ea829eba8fadfa7becc2f4149ee7c6c4d2c8c7b1970df33cc56e4506573000000000000000000000000000000000d7cf8be632d98ad21137a983fa55acd08492a9d1e9d6caaf520713a10f5cd71c9a155ce9ba65044f42228959e893556000000000000000000000000000000000ddbd265cad3a9c525a30ebab137fb1857a9847e66c3381d51de1040a48835701a1f5627281f6cb36181d8c1c337e58b000000000000000000000000000000000a43335eb6ff3bf2daeeb1eaf44c2782eeb517e82e55203a247b7a396e26fdf85f93695753c52c68819b58c95f361820000000000000000000000000000000000c240b7896b3dd0c318dc9ffcaa001d20bff288def3ce42752d660fd705e1544e292a5a0aa3a9a80ae91cb47cb938989000000000000000000000000000000000e5195bcc4ee8b149a769322165b6a3157ee7d04546643390adc812b6296675dbd31168b268df869a6722a7c8f51c79d00000000000000000000000000000000004af7dc8a5c552f00d55b996d193a9571173ea829eba8fadfa7becc2f4149ee7c6c4d2c8c7b1970df33cc56e4506573,,,invalid input parameters, G1 point is not in the expected subgroup -00000000000000000000000000000000042f294cc86c53cbc520ce6368a7149676d8bc4acf708485057c8caae31409ee1586a735c3e1f416104aede85e40a38300000000000000000000000000000000153de67ca08cdb77e92091e8f04f75d17ee5525c5ec3ccdaca907b5ebc1cfcb6ce9d6a4358999cb00ae5e824d008e7fa0000000000000000000000000000000007e00b1cd95e3f9cbb2bf80404abd9768da125c42b746c2afde0121fccfdcc2431c618d646764bc5137657d2f0fcbda3000000000000000000000000000000001170cf72d827f929cb9efef52b559f8459cdd4d60464e0b3bc6e55bb6cf83cc2e9d6314b2b80e4e4f6a3c6292d1517b50000000000000000000000000000000012a7806f98848dd9c79f74e4a25812a6fae59ca73472fd20db2ecb8f732ea59294647831e03b58c60f7a71d9892ff26700000000000000000000000000000000165e6e0a602c7a1a3334a880ee47c4c440c27cfc1ab1ea6d9df592e98d21f85519d1ddf402f48ce7dc8a87439b3f42f600000000000000000000000000000000042f294cc86c53cbc520ce6368a7149676d8bc4acf708485057c8caae31409ee1586a735c3e1f416104aede85e40a38300000000000000000000000000000000153de67ca08cdb77e92091e8f04f75d17ee5525c5ec3ccdaca907b5ebc1cfcb6ce9d6a4358999cb00ae5e824d008e7fa000000000000000000000000000000000c8373f2969862e64e7a4c319a5e4db5019391ee2fd502c86bd074de5b3a1eff7917b3517175eb28efb9aa10057df87b000000000000000000000000000000000648b6bee01e4bd215ff4b51580d254e09a9b88d879ec2a0a42b0fe80792da10a9fc4d1c47058cabddbb48e94f0df98b000000000000000000000000000000000286667f7ed2e43aa08ba81a8ae4dd0487a4d11425b1e572359783ebda7c181b7dd62857a28ae3b05302cf2773f72bc5000000000000000000000000000000000349436e7b0b86db8e77d7a4dcbeb16c541b994e6f71c45098fd198991a27b4fb48025d0808000d54fe6b9500da80db7,,,invalid input parameters, G2 point is not in the expected subgroup -000000000000000000000000000000000b09f1c099c4743404de9034dadea6120bb4b120e81d415d047d575423d8261af3aeadeca04610d4bbefcd5fbd48d7360000000000000000000000000000000019e08ce27700db908d40e8907434068819f874b79b1540a03b856ba8898be43bf7d97b17685ab54de67602b8fc41f90700000000000000000000000000000000010714e7b0316ac3ddc1836a569befe3965800dc3cd2d9ecca097f2eebfebcce7cdc92df0110e4b872a673d5a0ebbda40000000000000000000000000000000016700d8c04f159b7a019cd0f7ade116448e0657880d364f19d1f6ea099222abab3b766d3088bd9eb870cdb3eece5ee4d00000000000000000000000000000000054f6e8c85be6d914162702dbdeb82801d598e504bfec39a2edd1035f69deccb605af437fd4ecdb23979e993904edbfe00000000000000000000000000000000183e494cd0b25d5ee1e8f1ca4054fffa4d730f547e072af920c88b9d613deb21dac38043c385fc9f9bbd6e708602ae1b00000000000000000000000000000000155d3e886cce6f257513529e40c21b5657ef1ff1f4e71bc32b968db3e05652b1ac780da573fe1a1b94b7fef86e7c260f000000000000000000000000000000001184cf09544ec2826d0101d2b79095da6e5f77d453203c52ea17b6476360ccf166ef092eccf86dbe3a260f7fd25a279400000000000000000000000000000000010714e7b0316ac3ddc1836a569befe3965800dc3cd2d9ecca097f2eebfebcce7cdc92df0110e4b872a673d5a0ebbda40000000000000000000000000000000016700d8c04f159b7a019cd0f7ade116448e0657880d364f19d1f6ea099222abab3b766d3088bd9eb870cdb3eece5ee4d00000000000000000000000000000000054f6e8c85be6d914162702dbdeb82801d598e504bfec39a2edd1035f69deccb605af437fd4ecdb23979e993904edbfe00000000000000000000000000000000183e494cd0b25d5ee1e8f1ca4054fffa4d730f547e072af920c88b9d613deb21dac38043c385fc9f9bbd6e708602ae1b,,,invalid input parameters, G1 point is not in the expected subgroup -00000000000000000000000000000000065a0b9822a814adda6f22f58f0ce0d6db9b32dbb2766077b6fb9bdf084ba584dc749d746740804f826d17634509875f000000000000000000000000000000000d4284a951847bad1b602396a5d5193c3a794826f58122c9c16c6e8e18f6ec2d0e17d8ca3cda9c3bbc92c51794ec7fb600000000000000000000000000000000177f2a7306144321cec932fbc1a10d58073d6915bf9ca97a05b54fe05f525ed0c327dbdb1205b70bf7ef8cf35a61c4e400000000000000000000000000000000089dfb5d4a99380761f75a94deeb6a48854164687f1055b22328d45b9792cf884ae597db1d1a93f3f2633d14969bb260000000000000000000000000000000000b6598d4c8c590f2fbbea7c48899ff43d73087becda4974184eb3ebab605e8f90497caa2fce915f7214dfe244277a437000000000000000000000000000000000acbeeaa0ddf12bb717fd32ea32ef63d137e61b5294c162d3b67e02dcf1075838bd0208d7f8edaf15f023611b774c14a00000000000000000000000000000000065a0b9822a814adda6f22f58f0ce0d6db9b32dbb2766077b6fb9bdf084ba584dc749d746740804f826d17634509875f000000000000000000000000000000000d4284a951847bad1b602396a5d5193c3a794826f58122c9c16c6e8e18f6ec2d0e17d8ca3cda9c3bbc92c51794ec7fb6000000000000000000000000000000001a002703d6da9def84f6ce69f02ce952562a7bab2413e8d58631a3387a1f4556402fba6a39b37bda22d08a68b0230b17000000000000000000000000000000001366c2a752aad0e111adb716b75459c067e275c692bc440731510d56135c3238b410538dae3ec328bcd817384d8a6b6e0000000000000000000000000000000003321a09e7290272d75882b64d2c958d4434df3499c65fbbd1236add534db804081d29b0b34167e05f4de1d8065b5b530000000000000000000000000000000001b6e16cbfe9bd8a291dcadd4599f6edb147e261bb76caca726bc89b3fa1863922e202bd5fc9afa5bfec9923f43fb526,,,invalid input parameters, G2 point is not in the expected subgroup -0000000000000000000000000000000012e6297c3ba79bbec9a84699ee4268a37617d21e3ce984ba1134041e539f0a5f0ac11165e835ed1aba23d3b2c5f804d50000000000000000000000000000000006c8881033aa6aef80b52f0744c0c9058f6ee2d7eeba8a749ab15af41b19be8d6aae30d820ed0a0b50ce327c7baa1a2b0000000000000000000000000000000012ff0494d308d3e7321ad4c4000e9dcd19552d5e4bce8504760f066e2fb2509279b01f1568e3c3f6216bd5328cbf72db000000000000000000000000000000000038c6e8f0fab30b5c8e4323c1fd29527845c29e1a26c70b8e5284f7ca55fb55ad4ad5389b5280927b98907132f26b76000000000000000000000000000000000aef946b9b9e9fcabb36507c1cf441df2f5ccd71ef9281dafa5e25bf07d69556e4143ab402dfb38aa756bb6ee009a6890000000000000000000000000000000015f69bc7b0a6f2cb64fd0897b421e339fcc8637efced8bf33f5aed809a38b49a2e6376d18b1bff0ef70df1b7187ad04800000000000000000000000000000000019a5a9faf36413a1e48a97458b7c416a634e1ed92fbd89fbe4593f42abad0ada72f50f7a1e1a802158ccdf923b497e4000000000000000000000000000000000e0b851da6a8005b83b2afd272a6cd017bec39d9f55b3230b600c50fb9bd5cc1bd229671f6b2c7f1d78652e4534745190000000000000000000000000000000012ff0494d308d3e7321ad4c4000e9dcd19552d5e4bce8504760f066e2fb2509279b01f1568e3c3f6216bd5328cbf72db000000000000000000000000000000000038c6e8f0fab30b5c8e4323c1fd29527845c29e1a26c70b8e5284f7ca55fb55ad4ad5389b5280927b98907132f26b76000000000000000000000000000000000aef946b9b9e9fcabb36507c1cf441df2f5ccd71ef9281dafa5e25bf07d69556e4143ab402dfb38aa756bb6ee009a6890000000000000000000000000000000015f69bc7b0a6f2cb64fd0897b421e339fcc8637efced8bf33f5aed809a38b49a2e6376d18b1bff0ef70df1b7187ad048,,,invalid input parameters, G1 point is not in the expected subgroup -000000000000000000000000000000000c321b54ea1ae6e893f2c28e72a3e4bed4a9aebaf147716178d3392c959e79b6f3393d738f3722a0339c773da3ae56760000000000000000000000000000000005d2c477e1c9333eb642bb40709b042816cc54134fad935942cc08eb2db0c1582f9bf06518d4fd5577df4634332e70e50000000000000000000000000000000019123b0d9c362184620c90834730c58ec5f9becdb2f3c6c00fd157ac83c16a815efb5057011d00c774d0de626274d58a000000000000000000000000000000001936fe98ecb82299a85304213a3e30c02d90ea871661b34f664a825184c2d1ebad84d144df88c479b9526222a7fe9ead00000000000000000000000000000000081a6abf02a0a236ba6006a95a8ab3f186e72f05b00f2b686049cf980898d64a71bf2e41b6b276ed6556cf83a3247b6e0000000000000000000000000000000012162cab3a7d92acc12efec9672ecb4cb30ae208eabc77608748e968a84ec0de81678df45d1655e45a19162b06354a99000000000000000000000000000000000c321b54ea1ae6e893f2c28e72a3e4bed4a9aebaf147716178d3392c959e79b6f3393d738f3722a0339c773da3ae56760000000000000000000000000000000005d2c477e1c9333eb642bb40709b042816cc54134fad935942cc08eb2db0c1582f9bf06518d4fd5577df4634332e70e50000000000000000000000000000000008b24839939deb424bb0c7bb171064e01453008ada6e3f14fd3a86db79162d0f9a851eb6abcb7dd27f93df0f7ff3320300000000000000000000000000000000036bdf42585414a8fd616bf967ed2ad4eb2b30a7581a58691c6d58e5d54fa152b42427c98fb3094c718943d9d014730c0000000000000000000000000000000002b542c2d6e8862495b2a6937f1fefbba53c228af512918bcc5b39083125c41340f1b5f1c60696c7c07f6705dfbcae9100000000000000000000000000000000030516a5aa32954dc083531035c55aa623d5f53c07b7bcff54cb9bf04d567a293ee55b2027cdcb864b133eac0f3d5274,,,invalid input parameters, G2 point is not in the expected subgroup -00000000000000000000000000000000018a649f727e9ac88994760a97b129d3347d30174d54a1442542123a76f805e1a48e7a71f3704eaca90b3c17c538d26b000000000000000000000000000000000a5c006871d73a11d525df1921d256f880c2a3c0aea04ed27e83d5c264d3f2196c997347299fb04149c4083876bbf3d5000000000000000000000000000000000995b9bb378a7c98ed661b493ad17b3aca367cc6aa6db24fc421d82455bca4edae6c891c191023ef2113f3c7eba79662000000000000000000000000000000000213eb30b55a6ab8efdaa67c6c99362dc62022041a6ee76f7c72cc13ffaffddf88bc68ce3d4ed36d54285b177bffc1eb000000000000000000000000000000001202977411cd6674c957c74471e269ded8140f72483b5bf81846ec60be1748080e67e38c8520b0b71793f2be9d2a5b1b000000000000000000000000000000000d49d0b96d12bbb9ae56cae73bf240cac03daa2743557e6a78f029883752ba011cbe216618b28cc173a186750602eb7800000000000000000000000000000000076ed600ed860f16ec5dbae3f09471302bf85fde7702b3376b0d670f93560e77699bed969e7001570f44dc5e37aaa830000000000000000000000000000000000c993a8b08d2eb00bcee05e1c09e8a37834fac53643643402f60fbfe2cc7d795f5c68f3d6a32c8604c37211585830426000000000000000000000000000000000995b9bb378a7c98ed661b493ad17b3aca367cc6aa6db24fc421d82455bca4edae6c891c191023ef2113f3c7eba79662000000000000000000000000000000000213eb30b55a6ab8efdaa67c6c99362dc62022041a6ee76f7c72cc13ffaffddf88bc68ce3d4ed36d54285b177bffc1eb000000000000000000000000000000001202977411cd6674c957c74471e269ded8140f72483b5bf81846ec60be1748080e67e38c8520b0b71793f2be9d2a5b1b000000000000000000000000000000000d49d0b96d12bbb9ae56cae73bf240cac03daa2743557e6a78f029883752ba011cbe216618b28cc173a186750602eb78,,,invalid input parameters, G1 point is not in the expected subgroup -00000000000000000000000000000000012065f7dc3b8d6d6dded1106ecd071ac0e5f73c2aea8d088bda7687ccbb34625e2da53befb200d0885b25c228b3637a000000000000000000000000000000000d222a3c0a560f9e8a6624d9100b72e62f515f1d9384ac966d99c1761264ff8e88f308e57ddc94f156655dc310b3976e00000000000000000000000000000000109fe60cebfba62b89ae166733a097629026ccee41c95ad0260c96b772293e1403247b0451d149d527212c228ca6733a000000000000000000000000000000000a497d6c0285f7d5434c42605077528e24eee8185a615c39d2caabc570bcc01b40eadb937d78e6ceb8572115671053c8000000000000000000000000000000000f0d14ceab429a46e5568200034dba88a713899a12602529fd015e2c792191d8ef492a4d685ed09a75f638ad56f02ef10000000000000000000000000000000004d4b477fa154cd86a0934130c27f4eefed4b986da5afadf558d4fa003d2480a93b351798a24c2232e3c09c0bc33e7a400000000000000000000000000000000012065f7dc3b8d6d6dded1106ecd071ac0e5f73c2aea8d088bda7687ccbb34625e2da53befb200d0885b25c228b3637a000000000000000000000000000000000d222a3c0a560f9e8a6624d9100b72e62f515f1d9384ac966d99c1761264ff8e88f308e57ddc94f156655dc310b3976e00000000000000000000000000000000129c37bc44471eeb38b484699156862250e40df9415876f8a0da3d2f2504bd5dfe76e7b67f103a94c20751a656c5c1020000000000000000000000000000000011f24e9760017ed9120e3e0c25f57ff9e70f4f15265cf884d9d978225996f21905b32c0f918e5ac30e095767779cac8f00000000000000000000000000000000012e10463254df4bb4765a10ba47f47b6ca7ccf1ed289b8a9ccc4ee5cffde83a45077c3f093d0da6aaa5f38ebc3e5f0d0000000000000000000000000000000006755c3c202da2f65be8880e12485e2f8ea85b8e6c4b21b559e2a45b5f0977e01bba8685e4d7acb4fdc045a4cb6bba9d,,,invalid input parameters, G2 point is not in the expected subgroup -00000000000000000000000000000000182c68fe02eb491e1c0939304135485dcd2955c643ec67198d4a07075f0ec96441ffc1274e75dd36b103053660811643000000000000000000000000000000001308eb23be0860718e6ce06c2f24f9f94b7a72c557559ba8e1a9e3bc4eb4df009472adbfb26689900a65ee80b976a5c200000000000000000000000000000000030cc52d7901d0360d10f344cecc8325412788cc30a912d5de3fa9bdab18db44efea235c5d34bab526f3b8ecee2cbb8d000000000000000000000000000000000cda35f561c19ebd85a445ce8bb1618b446c7013c07606ce58e0b5627a5c9e7cb200e2b8ee12a0564730279e75b469b500000000000000000000000000000000055ad0655a96f6dab5a432e7d2fef57a6a11113070444089df23b4b911e0994b90aaaaa2c62d06756f4704fa218f7c350000000000000000000000000000000011d22438d7c162d34802a664c254abaae07659902e1f1bfc2bdffa6c17eb11bff5276474cc3cec9507e28685f1c21bb00000000000000000000000000000000005711605edddc03aee2e53b0945162616b969fc4ad2c15819df360533120dd2ded321aa929d67dbc84ecefeed531a49d0000000000000000000000000000000012adb2a59f85343c923642ea4be500595ec8c76755c0c219e5484a7a0f53a4c3f9740cf6973aab349973295791472e5900000000000000000000000000000000030cc52d7901d0360d10f344cecc8325412788cc30a912d5de3fa9bdab18db44efea235c5d34bab526f3b8ecee2cbb8d000000000000000000000000000000000cda35f561c19ebd85a445ce8bb1618b446c7013c07606ce58e0b5627a5c9e7cb200e2b8ee12a0564730279e75b469b500000000000000000000000000000000055ad0655a96f6dab5a432e7d2fef57a6a11113070444089df23b4b911e0994b90aaaaa2c62d06756f4704fa218f7c350000000000000000000000000000000011d22438d7c162d34802a664c254abaae07659902e1f1bfc2bdffa6c17eb11bff5276474cc3cec9507e28685f1c21bb0,,,invalid input parameters, G1 point is not in the expected subgroup -0000000000000000000000000000000001d70e0c28a776a0fef6d7d6a729f03d59c20a4c1f28bcb28645b996c307483837361d146b73fc808041893ac1738365000000000000000000000000000000000a68b5a13a6e5ffb88ad2618be4a197271d08e55781d21c367209c08fab2545b99f8e1e0b523854f075a915856f7483d0000000000000000000000000000000008c7569bb4e8d3b213dff2c132e5954e9622edc874dc82fcd674405cfda14dbeeb323d1605d06a92231f44339952333300000000000000000000000000000000092decf1271f8cb90a67c6cbf7eb0cca0c2d71c698470193ef495e494a8a1ac3b6bd78fa6e4367874ba18a00f6eca025000000000000000000000000000000000dfeff0f041a1868cd0ede471164f24dcac619c56515b8eec5c8aea870a79a2d03f0e1526eb1e8cbcba908969b5e952700000000000000000000000000000000109aa32bee0a83dae428e388a39ece51fd3f392ec841ffaa2554972528b7f55ca36b19ef6ae585e91995a50c0848cccf0000000000000000000000000000000001d70e0c28a776a0fef6d7d6a729f03d59c20a4c1f28bcb28645b996c307483837361d146b73fc808041893ac1738365000000000000000000000000000000000a68b5a13a6e5ffb88ad2618be4a197271d08e55781d21c367209c08fab2545b99f8e1e0b523854f075a915856f7483d00000000000000000000000000000000065860fd6efa478810b70e56ca788706bccb63191649d7b9e92941efe264bd4720b1f536d90a034b681ec9ee16f50b5c0000000000000000000000000000000014e4277fc0e4827510d55f27162d85d362f99ce57a7baf74f62567d42efd3afefb61782a6ba85d4d0e27184dc15b30ea0000000000000000000000000000000004a18f9b07e2c61210d7b00d54dd1e2895692b928adc0a4597d4ff7efbfd7215e764572275cb78f29d106aec578ed1a200000000000000000000000000000000025c5527f68d69ca8d86ffaaa3330784b9a9e32069cdc2e147c81d9a39eb181e39592a126d428e6f7963d34292f44e4c,,,invalid input parameters, G2 point is not in the expected subgroup -0000000000000000000000000000000010f18fc4c3d422a64f6c8935636cade47636934cc6c7d5077428ca6e2641068f4668a792a20c6bd4890da09de9765409000000000000000000000000000000000795df122ae83682617000aa2f80fb82cf933b2e5765fde4409249ac06d8eaf2a92938fb7bf4cc5717e4c604b68afc1f000000000000000000000000000000001825f573c335f0e3ad6ca9f721b529ab1a84585094c034058fce2f84185d99ab78e568b7cf129adb65501c266db679ff00000000000000000000000000000000114d2a8a69b83b46acc0dc3cde307b4690d2335c18b583874a0f5f6ed6b4e4ae63fb114d32479d56d3d2ce6393a128a900000000000000000000000000000000088c08b1b66f37b98e443f9d390b9934ee8edee075788a6ff9620c386f8ec4c1f6455704574b65086170c8a37f1728be000000000000000000000000000000000366a281910a6cb906b8acdb68180c6068b555c00d84b2cd3153ce5b8dc64532b3977d186202d1d6c00673b7ffe42c1a00000000000000000000000000000000067458ca402c19488e2515037abf9323ab8288e0e11f7cdee18b3da50cfa377435cfde1f63dcdc451ce65a05641cae370000000000000000000000000000000010ed9c895629bdafae66ea176388be4e4ce45cb13ecbe0869ce57f0f48852b6b8c47bcc4a14fc5327f1df372ad9f5d4a000000000000000000000000000000001825f573c335f0e3ad6ca9f721b529ab1a84585094c034058fce2f84185d99ab78e568b7cf129adb65501c266db679ff00000000000000000000000000000000114d2a8a69b83b46acc0dc3cde307b4690d2335c18b583874a0f5f6ed6b4e4ae63fb114d32479d56d3d2ce6393a128a900000000000000000000000000000000088c08b1b66f37b98e443f9d390b9934ee8edee075788a6ff9620c386f8ec4c1f6455704574b65086170c8a37f1728be000000000000000000000000000000000366a281910a6cb906b8acdb68180c6068b555c00d84b2cd3153ce5b8dc64532b3977d186202d1d6c00673b7ffe42c1a,,,invalid input parameters, G1 point is not in the expected subgroup -0000000000000000000000000000000018339c70bcf5f8cbf7f3d67dcc7b40a937045b53243d6bcd417d467b1a264b960793171fda821c4206d10b4fe8488e170000000000000000000000000000000017907a4fd66b2a8b113352975ed70c0833a6fb51568ada67bf9f8cdc770e30a3a5fa305200691f4e8dbf210cbefeb002000000000000000000000000000000000b46ea3a7acd5615741210a761f7ef55e7381f52593f02e20aedc0753861acfabb5333dc5bfd829656511070b642e7fb0000000000000000000000000000000000989e2bbad608bc55d0749e0de844e001934d28a58178377d8607a1c5d5c85eb346ab94bd527b36b965626457f6aa300000000000000000000000000000000016ffa6209c14e0803789f94886e96bfbab47e07ef745557f1d1dd48e887086424cac57dd9a624de73bb7f3521de3fbe2000000000000000000000000000000000fac98b30fb441d9426f61bcdbb149b103fa9ec3b85cbd5f755d57474bbeebe796b96fac0ba1d4b75897dea8e54796970000000000000000000000000000000018339c70bcf5f8cbf7f3d67dcc7b40a937045b53243d6bcd417d467b1a264b960793171fda821c4206d10b4fe8488e170000000000000000000000000000000017907a4fd66b2a8b113352975ed70c0833a6fb51568ada67bf9f8cdc770e30a3a5fa305200691f4e8dbf210cbefeb002000000000000000000000000000000000b349ddaccbdd1381d9eb4ae7e65db31733fe3c24f38c21f5a20298bd8e01db7ebbe3c703327a5f81c89c040a5e17c67000000000000000000000000000000000dbadd08c77f8c210439d48fb55c741dc83aa9adbe7153bee1ddf1d3df824938c14d85a528c285db28df1d0fb22b8e820000000000000000000000000000000014d76b082d032e23130d6e55c0560080a5aa607f6cdfcd683d4e2450aa0788a99a005ccbdefdb3f626a045fd7cb9ed6400000000000000000000000000000000124130e29fb52ffc0d8e8ec760619de7397813b8ce598afe97f9076899f13dbe35417a6f94a2c4bc0341c933ab8c30b1,,,invalid input parameters, G2 point is not in the expected subgroup -000000000000000000000000000000001977147ab98c2e88f46f038c821e85fdf476bfe7bf7b7fd633ecfcf1fd2ef339b3b5cc686f4a8937e16dfa29ad8123f7000000000000000000000000000000000ef669778c61c21dbd4681483c51269a74a3ba1b1f75796b4680f0e30a286aa0173147b206f91c84731ec8ead074d187000000000000000000000000000000000e0f7595e4c136b4d8bbd1eeb021df7dd2bcf1d9f98e4fa293f7edab635e019af87c138275fefacd806213177af40eca0000000000000000000000000000000005dc209d6c86f1871637998c10490a70371f9e00a68d1363dfaeb62046473dfb4bbd3b18b943439f75c45a1ee7f264a90000000000000000000000000000000003d215567d1e8f504a72658d48fa51374ac77234552c17db4033af780133d8516bb0769678ecb50b8b9eb950c2dd73e80000000000000000000000000000000004d780849b731012e1e5732d5f6d32c659a95c3e1c8f5ef4841fe82afc6f0aa309b1e02dc2554a4a4ee781be2be2149f000000000000000000000000000000000073439cedc08916d00609c6152ee2844be85550ff5c199e9e9dddf09bedfc00d907dc85255651cff3e28a74d3b4836c000000000000000000000000000000000e57e74af4f2d6c08843152cce6d095d00679998463bfb41bef9c57ba427e14715e9e0da0e8c5193a798cf92590b34b4000000000000000000000000000000000e0f7595e4c136b4d8bbd1eeb021df7dd2bcf1d9f98e4fa293f7edab635e019af87c138275fefacd806213177af40eca0000000000000000000000000000000005dc209d6c86f1871637998c10490a70371f9e00a68d1363dfaeb62046473dfb4bbd3b18b943439f75c45a1ee7f264a90000000000000000000000000000000003d215567d1e8f504a72658d48fa51374ac77234552c17db4033af780133d8516bb0769678ecb50b8b9eb950c2dd73e80000000000000000000000000000000004d780849b731012e1e5732d5f6d32c659a95c3e1c8f5ef4841fe82afc6f0aa309b1e02dc2554a4a4ee781be2be2149f,,,invalid input parameters, G1 point is not in the expected subgroup -0000000000000000000000000000000005585544fc7ed448c7939c42235549edc98c5d9a793ec918274b49687e8b9267d53c2e5d66a44d889e8f2e94abab43490000000000000000000000000000000002a091dc69d5af394d408a3b5b60debffddac4db228c613b2e2f98b932aa8f90d9f5a77129fc0fe69b93ca64b0081eb9000000000000000000000000000000000f694959a69b0d692e167e95524555d58d06621d77f46c54b7f0da0a45c4cabdc8ac916b0f2052cb99b6f0f5bca36fd9000000000000000000000000000000000df814c1cf62a7a089984a3afe3f7636157ee17bbe0dde1aa2e56fe7168a3fee7c6102999dfd55b282f1a6a4ca0e0cda0000000000000000000000000000000002ce0806a288c2b9d7e03204f573b06c440be782469cf7f1478f53d5b017fa9ea3b1025cc5de378e2186c150cbd1bc0f0000000000000000000000000000000007d3c1d2c5806e73119cafe9efda5a8419679c89d17f7a90fa6302485d4efe9e44b287f573d576d7f45589c7501e40ff0000000000000000000000000000000005585544fc7ed448c7939c42235549edc98c5d9a793ec918274b49687e8b9267d53c2e5d66a44d889e8f2e94abab43490000000000000000000000000000000002a091dc69d5af394d408a3b5b60debffddac4db228c613b2e2f98b932aa8f90d9f5a77129fc0fe69b93ca64b0081eb900000000000000000000000000000000199d1db3ab960c003575ba7a53f489159aa2005bc9a30bc23e952b57ac892a2340a8adbe21eb07bcbac255be231c49120000000000000000000000000000000014303bc0d1c9748ebbbc187486650cd7651e51ebeb1bb428e153ca5e83fc4b118c7575efc03ac0ba500c6149f91db23f000000000000000000000000000000000b6383243f6914d41d2947ee74ccd299a20741e33bdad3aff2d05de662fb4d7b9b9266085bb71dee8c13dfbb121cdd320000000000000000000000000000000005d515210d948c48ee9f7ced4c23a5eb12c6bc26c974d518af4e14c1b2b2c5a286c2bc4d51ff5974eb939b4395f9d8ed,,,invalid input parameters, G2 point is not in the expected subgroup -000000000000000000000000000000000ba91d035c7a2da7e14c400bb137b66a4d8f563004bcf57a01f21223225b93f860eaab9c429b915a130115c8f61c606b00000000000000000000000000000000196c7f0f6b99772d1a5e97afd92a6ab4916a2f2df709bf6393a60fe29623b25dbdc989f22715fda427bf8cb84cdfd033000000000000000000000000000000000b362ce289c7edfb507b579fc8d344c5e7bfa8d58bf3629a41af7ec1faecfb9b95139d9a8159804691047e4b18bc1cd600000000000000000000000000000000112bac785b4033f11b08e845c8c5ce78e40138b0cc0b998dd8e0213bbfe0e5b96a83ff2b53ee9699b18efffdf879602a00000000000000000000000000000000157885a39334664681d8425bd60e9c1d12dd1ef45b9a3c40956df105cd3534ff9378203755119ed302a54adba9e5858d0000000000000000000000000000000008237a9ffe95f89a24e1e3a82d8f127766e2173505a9ef0e715b1ec711619664a12d86d247e530049ee542ee4d20cc7000000000000000000000000000000000072c644635936a91dcaee40e3b4794e634c315a39a9cb5cb99ef6784b332fdcfaafdc80e228cd19d0104d5796f584c350000000000000000000000000000000002318bea9077484e9c1937dfa63774b5ecf6fc63ff06e5cb653553d5111a981c09c907069ffe11b5704ea60a99873283000000000000000000000000000000000b362ce289c7edfb507b579fc8d344c5e7bfa8d58bf3629a41af7ec1faecfb9b95139d9a8159804691047e4b18bc1cd600000000000000000000000000000000112bac785b4033f11b08e845c8c5ce78e40138b0cc0b998dd8e0213bbfe0e5b96a83ff2b53ee9699b18efffdf879602a00000000000000000000000000000000157885a39334664681d8425bd60e9c1d12dd1ef45b9a3c40956df105cd3534ff9378203755119ed302a54adba9e5858d0000000000000000000000000000000008237a9ffe95f89a24e1e3a82d8f127766e2173505a9ef0e715b1ec711619664a12d86d247e530049ee542ee4d20cc70,,,invalid input parameters, G1 point is not in the expected subgroup -00000000000000000000000000000000077dfb9ac791b3471c6cbcb0b37b65adb0bc4e40341b85c13867bfdaf32365ddfb749ebfd965abfa22996773eab505540000000000000000000000000000000015e771a0f0149cfad7910a4a1971b39323948bc7530936db5d99a53b51bd656bdce093cc2b91ebad0f91a95034afa0e3000000000000000000000000000000000200775a5848ac14b5e762ae7d4b492d2dc0bd5e80ef7fc760d42ea6fb07ffd2944409052cfb773875df676a188da65b00000000000000000000000000000000140ec7de210c890e4c795eed394d32d77f6acad0a3628da2ec805d4cf2de9822b5a73f06bdbeeba0fc1068c26da675b20000000000000000000000000000000018e7877a3f27c5400b08bd2769616745e4657f6fe262f9d7b88330917f977efa463b3226f3433da95a82568d990b1fa50000000000000000000000000000000015801af4934193336cc67fe8f4be5d2093909006f8bdd3382d60fd5c6bce4b86071370eefbce7a04dbcfb825858f90eb00000000000000000000000000000000077dfb9ac791b3471c6cbcb0b37b65adb0bc4e40341b85c13867bfdaf32365ddfb749ebfd965abfa22996773eab505540000000000000000000000000000000015e771a0f0149cfad7910a4a1971b39323948bc7530936db5d99a53b51bd656bdce093cc2b91ebad0f91a95034afa0e30000000000000000000000000000000017bbbfef68883fbf6fa9cdcef37ef145d7fbe9532164530e9c08d196ee41f38784b257087ad53f4939426451fb5f955c0000000000000000000000000000000018bb97090375c21600b6d3ee0629cff78116aa59d7b665c08590add8cdff8247c38b588a25e0b11eee5111c63f8c619e000000000000000000000000000000000e181f7327776df8ec16258115303029c68e1b72fcad6395c6d7d477368e1697076333a2102447a225fb3f3d725b3b0b000000000000000000000000000000000291d82b95e9a2c3f766994c304dae7f19f1efc789f68c4e58eda102da36cd0d7eec3d5a1b1e88c63462c8ec0e4393a4,,,invalid input parameters, G2 point is not in the expected subgroup -00000000000000000000000000000000121a9b867c86195dc4aee07081c1ad62f066b471bb5a14f296943b263fb9a25e6805e3171624e7e7e45b78f175a1861300000000000000000000000000000000071e1c35979d6f43170e79c0db5cceccff01f17cc2980b771a6cc38e0b27438a9db8e00eb943142d992c6a395fe4aacc000000000000000000000000000000001819d13cf4522a9362bbeb0bbbb0a498c3f34da1c9e3b2c54d08f7c8acd9ee756983fe80405579effb79d673407390ef000000000000000000000000000000000f870e5978f4a6e3b655fb2a05541ac0673e7b10136adaf28be4dfc9022d4cc8a60e17d125dfe53fbe10c644ff37e02a0000000000000000000000000000000010207ef774cddd10db2bca0a051ceb12900c407ee265dea4615553c193d7475b5ba3198b7e0160740e4fd015dca33e1d0000000000000000000000000000000017937be546e06fd2eab4c969a029534c02fb770646d43edeb5e6c8bc0c2b5f35576c375bf860fd1087ce099d4377d24e0000000000000000000000000000000001a8b8cdcd160565a1df9cb5ccb06a62fbaf32b2cac4ec9a552773313c940688638775983815cb246d4eaafe91c3451100000000000000000000000000000000082a1237c161831a37589ff711f7873d5e092d8a4690b983c9ccbbf980422ed177a3ebbd4b4ae4b557bcb3ae532f1823000000000000000000000000000000001819d13cf4522a9362bbeb0bbbb0a498c3f34da1c9e3b2c54d08f7c8acd9ee756983fe80405579effb79d673407390ef000000000000000000000000000000000f870e5978f4a6e3b655fb2a05541ac0673e7b10136adaf28be4dfc9022d4cc8a60e17d125dfe53fbe10c644ff37e02a0000000000000000000000000000000010207ef774cddd10db2bca0a051ceb12900c407ee265dea4615553c193d7475b5ba3198b7e0160740e4fd015dca33e1d0000000000000000000000000000000017937be546e06fd2eab4c969a029534c02fb770646d43edeb5e6c8bc0c2b5f35576c375bf860fd1087ce099d4377d24e,,,invalid input parameters, G1 point is not in the expected subgroup -000000000000000000000000000000000a86f90fcd9b63a0cd5f53356c170699d78d03f180d59c38ff770560bda30bf412fdcf236b6720d94684ef1aab97bafc00000000000000000000000000000000030bcbb272ab20a2f27d45295875e3c29a8ad088bb8173feb6f6f4d2c81bbc91d673c23239e36bdafada8c7d50b54b440000000000000000000000000000000011e01c96294c726ed3ef22a5c6597d8202604c4fb14058bf44fa64ae6d342f6f77f151c8ecd99f793e79f0ad29c309f40000000000000000000000000000000000e186664d8c2a2e136ff1be2192573b94c083bf242b2c01c984a792e43a11a10599481a9a79f6a8d5b074bc16019725000000000000000000000000000000000fc48ade56f841489c4824411130fb5b7e0e83b613fa09099f318cef207ce035d5d6e7ecff5057c15ee764ec8a7fa20300000000000000000000000000000000003f1b261043887af57fab48b505ed7aa44132457d71a390646b70fcd073e677a7e275a89dd0a2bf32beae3b2bcbd6e9000000000000000000000000000000000a86f90fcd9b63a0cd5f53356c170699d78d03f180d59c38ff770560bda30bf412fdcf236b6720d94684ef1aab97bafc00000000000000000000000000000000030bcbb272ab20a2f27d45295875e3c29a8ad088bb8173feb6f6f4d2c81bbc91d673c23239e36bdafada8c7d50b54b44000000000000000000000000000000000781404020a416e2596ab361e02674e25cfb365420d35d5db7146f563a7675a942383da44ae4df49c45b38e371c82a2a0000000000000000000000000000000010c546bda090a13ccf0fec03bdcb87b41f5aed3b4e6740690afb9dadc57d773aae2d22a2d8323336c5b1dc5798725495000000000000000000000000000000000bea6aaaadbbe8102212279f1458c461d3a0d54e341c91b5e16e0ce5ba1517a13cd1d43e1d0b25a63b7cc57ece5369f3000000000000000000000000000000000b0b676e5cc2f6ac383f5dd42d379c552579f601de0cf4f34ac637383a31e393df40f5c0f95b5a8f57cd6fa4de01caeb,,,invalid input parameters, G2 point is not in the expected subgroup -0000000000000000000000000000000014372fb746da15863e9ee4e06099c7e513bdbe53ca772a4b61c81eaa7f841399422f7902893d5ee7f7d59d530e3674b10000000000000000000000000000000006ba991efa65ef8dfac8b07915cab83b5267babba1291e4662a81fdcb455faf33596f6730b6f5b3eac2076054a4ccf6600000000000000000000000000000000042ee88071289a2adeb69cbab5a3ac8c7935576bc434062091cdf1cada4b67a2501c179b5980b53256f623840a5aee5700000000000000000000000000000000063b0819dd470047a704f20f5f7c65ea0899f25603dfc7e8b8d5f0d0d323180aa921e43d63b45acc8fe9054326a8d9bb000000000000000000000000000000000615e2e5b0389017cd3ce7c15740caf3b897fbe4a59c68247c3c4229bf661257f56bcc10f55fc722f96424f5617d259700000000000000000000000000000000166f7cadf7cb9ac5a8cfa83fe4aaac0e32fd4de3e38e0d39e010d50f5b3d383243d6870505f2a285b7c5f6fc1b13f0f0000000000000000000000000000000000d1ed017ef4702bcd3bfbbcff36000af6a1d26ab363e68ea5629027e0b90352bf1d8e03c13a7955da6c15507cc1c9f47000000000000000000000000000000000e09830e54fe9eddd416479a1740f6f1b7693f2d153d322f27779b16bb6451d7657df85a55da75a4aee0a2e33b3a46e600000000000000000000000000000000042ee88071289a2adeb69cbab5a3ac8c7935576bc434062091cdf1cada4b67a2501c179b5980b53256f623840a5aee5700000000000000000000000000000000063b0819dd470047a704f20f5f7c65ea0899f25603dfc7e8b8d5f0d0d323180aa921e43d63b45acc8fe9054326a8d9bb000000000000000000000000000000000615e2e5b0389017cd3ce7c15740caf3b897fbe4a59c68247c3c4229bf661257f56bcc10f55fc722f96424f5617d259700000000000000000000000000000000166f7cadf7cb9ac5a8cfa83fe4aaac0e32fd4de3e38e0d39e010d50f5b3d383243d6870505f2a285b7c5f6fc1b13f0f0,,,invalid input parameters, G1 point is not in the expected subgroup -0000000000000000000000000000000009f0c6f9fac38e8c83183499b8918a1ffbc52f2400882edb66594f496ff38ffec77368f28e4f20767257e200f48255700000000000000000000000000000000002a05bfde9523ac13ba3518cd5b308c4985484f996e7192140d681d9934d501111a81445031d84d4a47a9727202c07620000000000000000000000000000000003004acd2a95d932b84233e80bebb9fd92b302809725d5ca0921a5d8983950ff521d89bcc2d1bc1e7c186c702bf7aa270000000000000000000000000000000011744ffc7092744a79e345be8b51569c5df8eb10b4e49957ade8df4ee4ede566b3825eec89027d70d188ff858a8b6cf4000000000000000000000000000000000e46cd26b21a8a933eac05ed526a2b8fe195e5a5435e79c7f385fb69a90190acd06e25e9b63af7862616c79add032597000000000000000000000000000000000ad60c22b3690c78c23682ba902a18e708e88430a55a9038975a43b4606ef4c6e2b8e648a25097b3a34bf6e4024d00280000000000000000000000000000000009f0c6f9fac38e8c83183499b8918a1ffbc52f2400882edb66594f496ff38ffec77368f28e4f20767257e200f48255700000000000000000000000000000000002a05bfde9523ac13ba3518cd5b308c4985484f996e7192140d681d9934d501111a81445031d84d4a47a9727202c07620000000000000000000000000000000007d87d13752c52bf0510cee94274f6f4a6e0675de9a4a864ba5058dd8771b6c5000e957cfca5279e64f09c21111322ec0000000000000000000000000000000007999819b5b57104c9432a9d4dc6ad377f0c6f0dd630155fc489aed1f8d18ce0386222813726cb786635778b74967bce0000000000000000000000000000000016b66e0ebcbf6043f6a7fe52bf527a9b763cd68d901933068966e6dbb9817e1287ebc2de9c3729df8b4228a4f92d9732000000000000000000000000000000000ee19b863d5ce19afce76e489e122948597ac6a5ee07e2d856a49377285ac93d6674cc5429e02bbd051d4edf7988ba89,,,invalid input parameters, G2 point is not in the expected subgroup -000000000000000000000000000000001269c2717ba196d5004865af806d4a99b8c238583db14f9c02da70b0275cf35a3a5276eec0c8e6934f11e0d5cc8b7c9f0000000000000000000000000000000017971814f15aaf3f6672b3a720cf6726aa042dbd82ac508a8f7ac5ddf17f377891199ba2fd01d990868347d45e3b37ae0000000000000000000000000000000001587e32753adc85c98cf1322115772b0e282ef4e6a75944fc86091e81aad076508e3d727f4df0e30924fff6b67c312e000000000000000000000000000000000ae96d3a1b79985e56f80df8ac4d9792229ca580b156dbbe71a9db470447fa4dfa19fc8a8a2e2f0fae28a24b7d6153d100000000000000000000000000000000114101ad0d29ddfd2fc436d2a270711c444c8c257785f4b4c549e9c795f6dd9834d3744995d2188c0c968752a7f68892000000000000000000000000000000000d30d9cc1e2273af745dd47a596a2202ca4fb655f9f9beeb0a87631e2461f29206163fd921761fde69654cb02e23505c0000000000000000000000000000000010cda048fed479f7bcd388a0acaa977b134055f5ea92b2a689793e301d58190c67031920ccf1cd97ecf9f429f5a022e00000000000000000000000000000000014c410faae20d54049aa7c644ec1ef0388367ac847f6781e62ec88eb9262ffff5f19cf5f4ebe791a44ad9a84fd78aca70000000000000000000000000000000001587e32753adc85c98cf1322115772b0e282ef4e6a75944fc86091e81aad076508e3d727f4df0e30924fff6b67c312e000000000000000000000000000000000ae96d3a1b79985e56f80df8ac4d9792229ca580b156dbbe71a9db470447fa4dfa19fc8a8a2e2f0fae28a24b7d6153d100000000000000000000000000000000114101ad0d29ddfd2fc436d2a270711c444c8c257785f4b4c549e9c795f6dd9834d3744995d2188c0c968752a7f68892000000000000000000000000000000000d30d9cc1e2273af745dd47a596a2202ca4fb655f9f9beeb0a87631e2461f29206163fd921761fde69654cb02e23505c,,,invalid input parameters, G1 point is not in the expected subgroup -000000000000000000000000000000001252aaecb588ffcdee3e4fd92ff5164feaf9aa39acbc71c704d8180611d30fe13e59bba805101dc1cecf77b254bc65510000000000000000000000000000000009dc3de2e8aa94dbcc25c8775e9bd0ae0fa8581df790e562e67f24c08efaab59a0a8062478a09c262040c5f0558971c3000000000000000000000000000000000b0a6f9e0b58db3015e1dc63f9d377895d25f48e8a05371ad90c3ef5f3085a76b888d38693eefdf3b1eedf80eab1736200000000000000000000000000000000006dfb36e1c281cf1c5a8be9a631cab94aa956bacf8e9e787c0e2bab4440f03f0efc56d5a058fde2e18696c569676d3b00000000000000000000000000000000118791bba7507725b7106bc889b68c3daa56dc3100d8378cf156268f249dbafd01025cb722d58246c95ac856dd5d0411000000000000000000000000000000000f942ab8fd1e71f6d4498403116ef41954e7967222f894b93ae31f061cafaa1ed3464520dc5123aad4b0a352a85efbf8000000000000000000000000000000001252aaecb588ffcdee3e4fd92ff5164feaf9aa39acbc71c704d8180611d30fe13e59bba805101dc1cecf77b254bc65510000000000000000000000000000000009dc3de2e8aa94dbcc25c8775e9bd0ae0fa8581df790e562e67f24c08efaab59a0a8062478a09c262040c5f0558971c3000000000000000000000000000000000c13d99118e4946773d0ae54a37895411e39ba0de604c5f69d0b3ddcd50c4261c38c510bc1e018dbdf449e303e398d820000000000000000000000000000000018427393a7ed2dee713e83e58a6537c5c6baeb69ceac3b574e02af78215d99b8cd01f0c944d075300d35176099b0aa8100000000000000000000000000000000140ab2527b79327e07344a673e688debec28aa29219a5b1646a3c2b599a9d374cf5e139ab00aa237bb8e29d021d766ea0000000000000000000000000000000017164f154d26566ecc983d38d77d694208864c024c3ffc69f19f84550e86eddd8dbb055a8cf543717ce3d65e1c64c53a,,,invalid input parameters, G2 point is not in the expected subgroup +000000000000000000000000000000000ded5634c6bab9610e70f3a9be2bb39c51f2ddd762d22d6c3f0961af19350c4ca4bae333bf4cf586d8cd1e0a0a6c674e0000000000000000000000000000000012309fe1d843245e2cb58d419ff06ed8e93ec901c01d0c5be453e11d10f930afa0c35428ef0c8dc13ce99c990af166630000000000000000000000000000000017c9fcf0504e62d3553b2f089b64574150aa5117bd3d2e89a8c1ed59bb7f70fb83215975ef31976e757abf60a75a1d9f0000000000000000000000000000000008f5a53d704298fe0cfc955e020442874fe87d5c729c7126abbdcbed355eef6c8f07277bee6d49d56c4ebaf334848624000000000000000000000000000000001302dcc50c6ce4c28086f8e1b43f9f65543cf598be440123816765ab6bc93f62bceda80045fbcad8598d4f32d03ee8fa000000000000000000000000000000000bbb4eb37628d60b035a3e0c45c0ea8c4abef5a6ddc5625e0560097ef9caab208221062e81cd77ef72162923a1906a400000000000000000000000000000000012196c5a43d69224d8713389285f26b98f86ee910ab3dd668e413738282003cc5b7357af9a7af54bb713d62255e80f560000000000000000000000000000000006ba8102bfbeea4416b710c73e8cce3032c31c6269c44906f8ac4f7874ce99fb17559992486528963884ce429a992fee0000000000000000000000000000000017c9fcf0504e62d3553b2f089b64574150aa5117bd3d2e89a8c1ed59bb7f70fb83215975ef31976e757abf60a75a1d9f0000000000000000000000000000000008f5a53d704298fe0cfc955e020442874fe87d5c729c7126abbdcbed355eef6c8f07277bee6d49d56c4ebaf334848624000000000000000000000000000000001302dcc50c6ce4c28086f8e1b43f9f65543cf598be440123816765ab6bc93f62bceda80045fbcad8598d4f32d03ee8fa000000000000000000000000000000000bbb4eb37628d60b035a3e0c45c0ea8c4abef5a6ddc5625e0560097ef9caab208221062e81cd77ef72162923a1906a40,,,invalid point: subgroup check failed +0000000000000000000000000000000014881e90a100e5c1e07588d68c69b9b217d2c57b2bd8782ea7579abfac3a38275677a8dee7e689c1b185712ea38bf0ba00000000000000000000000000000000061e48ceb68db1cb84ed39f9772f937922198b47082d7517c8258e46a490fc20e4e01971711853ab653d064f8adc79e200000000000000000000000000000000173518c27d76414f3027ed3e4936ad1b6aaebf0a98462df3e3a55aa38e19fb121acc6eeadb7689c84fec18580b63784c0000000000000000000000000000000007c116829ccc1d5505dcce029f5c8b7c8a9cbc9dd562a874766a5654483aec977a0fb9e611f9471d2f0c91fd6534892f000000000000000000000000000000001560b267e66200e69d6298250456d88500a0d79ea69870358a6cb39609fb6596e539b28bfea9d1c7054b5b51a4c0f3950000000000000000000000000000000000cc196f93e5a2dd3a41a1ba23fd2e53bf376c910117e9216663e30091b96c897080bca189ce3107720dac1c54dc4fc70000000000000000000000000000000014881e90a100e5c1e07588d68c69b9b217d2c57b2bd8782ea7579abfac3a38275677a8dee7e689c1b185712ea38bf0ba00000000000000000000000000000000061e48ceb68db1cb84ed39f9772f937922198b47082d7517c8258e46a490fc20e4e01971711853ab653d064f8adc79e20000000000000000000000000000000015237996817e97b29ef5b4ee49e6aea7129bdc4a46707f99df3ab8af36eb4123e93496d94846f7807b3bd2c87d3ca039000000000000000000000000000000000df666f7728483689a746e5b39f4848a9f2d831cb17d4e5f7fb67de5d497f6399de5f37ba9e6ab76937e26450000d600000000000000000000000000000000000e4ffecf86b371ddc9ee6a72b5ada74790b590acc51c6c5c479c43c532a9507b4b4909bdc901b00932371a109fd38b7e000000000000000000000000000000000354f92ccabccc9390072671ccc8d3ea0a0c44f85816f20bd6e8b485e648e8ba0d5b845a8835395ce65b8101015ea83f,,,invalid point: subgroup check failed +00000000000000000000000000000000199fa649608972d295befae38d36940663d2b67bb286a3d549c75deef39ef8068728bbba2cafac44c102499601e4bd860000000000000000000000000000000002dac960f96822774a4956fc0ba97a235d0a2c10d81d9adf7b88215250c934b68c3de07a97adcaee2aaad0d3d84ecf6800000000000000000000000000000000000eb3c91515d4a41209a73564741a8ccf901a624df9db22e195a5d02d24b7bc0a12756b15b8d006cb991a7e088eaef1000000000000000000000000000000000704ce8afc808b0161f6f61b22d990d713ae398779e6e74e9b5771daf006ce0bba3a8088edf75156f0e48b92ee8409b00000000000000000000000000000000018fe81e05aff0620f4bdbe4a715e015650497afab62921eba0ab86b649e5a2fd3d54041868928519f537e36448688a0d00000000000000000000000000000000162bd97161201ea3c26f8dd1204a9c6b61b762bdf573cb5d20b6b255f30208ca7d96aa47b46fb8c6bf0922075f1c1ca8000000000000000000000000000000000d5bb4fa8b494c0adf4b695477d4a05f0ce48f7f971ef53952f685e9fb69dc8db1603e4a58292ddab7129bb5911d6cea0000000000000000000000000000000004a568c556641f0e0a2f44124b77ba70e4e560d7e030f1a21eff41eeec0d3c437b43488c535cdabf19a70acc777bacca00000000000000000000000000000000000eb3c91515d4a41209a73564741a8ccf901a624df9db22e195a5d02d24b7bc0a12756b15b8d006cb991a7e088eaef1000000000000000000000000000000000704ce8afc808b0161f6f61b22d990d713ae398779e6e74e9b5771daf006ce0bba3a8088edf75156f0e48b92ee8409b00000000000000000000000000000000018fe81e05aff0620f4bdbe4a715e015650497afab62921eba0ab86b649e5a2fd3d54041868928519f537e36448688a0d00000000000000000000000000000000162bd97161201ea3c26f8dd1204a9c6b61b762bdf573cb5d20b6b255f30208ca7d96aa47b46fb8c6bf0922075f1c1ca8,,,invalid point: subgroup check failed +0000000000000000000000000000000009d928f478fea86b1e3c1ebf59b230af42e4a539dd43ff17b9ca250605401273edc42806bf2cb887c6093729238fc0560000000000000000000000000000000005b6040ce6d0802719af5b9c0fe48366c5a97bcad2c6ec25f64cd73f39dc73a22d0084c69f2e86637c584d2de55d6064000000000000000000000000000000000aaeceb367eaf2ab8afb5070b5f5611f19fed17e16f6b01cd20f5f1a7e550d4689c89d6490878877c46492e8fbc9db600000000000000000000000000000000019dc59fbefa7abf12f1aa92e420f52595a06e819e974c07b62a3ae459c62545922016abd8e91301aca8f48ed793b91af0000000000000000000000000000000012f5352825a95ff0a0f0948b150e5eb1ab53d6591dc54ca8b37941fa94a0fa68af8c35aaa26c73951d2dd52e9c7a55bf000000000000000000000000000000000531e610f3706a1c67b31909a97232acef0e23c35c657dc82d9508fcf33bfff777386dc8265accb52d0da207957d25160000000000000000000000000000000009d928f478fea86b1e3c1ebf59b230af42e4a539dd43ff17b9ca250605401273edc42806bf2cb887c6093729238fc0560000000000000000000000000000000005b6040ce6d0802719af5b9c0fe48366c5a97bcad2c6ec25f64cd73f39dc73a22d0084c69f2e86637c584d2de55d6064000000000000000000000000000000000cf95f6bc3f14cc8a657da35f212d55d3633ca0d224794ac1e49cbf1e1db7757dac2bb08880f7b13f2ac0c2b95ff483c00000000000000000000000000000000115bf27014a31726503f0665301f9e183de41e002db568916aaaeaa4c8046475860db3b993b2ac2af58b12614f0b9f2d000000000000000000000000000000000983ee62076e9c5f8e6ac3ba8e5f98823a37ff20432f0b4e7d9e008660965f551bb5538e6ba28541ad514e87d128da1b0000000000000000000000000000000019c9930e3e009986608463c80aa0049fcac5e897474e519b52c80960f1dada5a48332d810f1f9a34ee479383b5b556b3,,,invalid point: subgroup check failed +000000000000000000000000000000000f240a4daf7acbe8f4c5a9cb40ccc6d99dd712b8dae4c13e9d3839b0c88c5eef6f050144a4b731267e2132a81b1a635c000000000000000000000000000000001931c93a957ba9005fa69004c7e984b9dc86f45ec03eeed77addb3e1bee3c2424105df8e8faacae2b07623cd3cc7261e000000000000000000000000000000000805892f21889cab3cfe62226eaff6a8d3586d4396692b379efc7e90b0eaad4c9afbdf0f56b30f0c07ae0bc4013343b30000000000000000000000000000000007853f0e75c8dee034c2444299da58c98f22de367a90550dbc635fb52c9a8f61ccc100f70f10208944e48d09507fdce100000000000000000000000000000000064afd6b3ef7ff7ec34f1fa330877b42958a46a7698c6d21adf73bfdfcab7793b312e21e5988652e655f2d42edb8a673000000000000000000000000000000000ea8a2217c3dbcc0f6e562de9cb2f334c896577d0b3a7108d96b1aba2d705dbf531e870d4023cec2c0533455013242330000000000000000000000000000000019c822a4d44ac22f6fbaef356c37ceff93c1d6933e8c8f3b55784cfe62e5705930be48607c3f7a4a2ca146945cad6242000000000000000000000000000000000353d6521a17474856ad69582ce225f27d60f5a8319bea8cefded2c3f6b862d76fe633c77ed8ccdf99d2b10430253fc8000000000000000000000000000000000805892f21889cab3cfe62226eaff6a8d3586d4396692b379efc7e90b0eaad4c9afbdf0f56b30f0c07ae0bc4013343b30000000000000000000000000000000007853f0e75c8dee034c2444299da58c98f22de367a90550dbc635fb52c9a8f61ccc100f70f10208944e48d09507fdce100000000000000000000000000000000064afd6b3ef7ff7ec34f1fa330877b42958a46a7698c6d21adf73bfdfcab7793b312e21e5988652e655f2d42edb8a673000000000000000000000000000000000ea8a2217c3dbcc0f6e562de9cb2f334c896577d0b3a7108d96b1aba2d705dbf531e870d4023cec2c053345501324233,,,invalid point: subgroup check failed +0000000000000000000000000000000012d75b62dd32798ea12b99f51a496bbf61bca93cd233dd288e00259893dbe7c73b6342860d41fd86878a6de608dba0ed00000000000000000000000000000000018e963e1cdb31ce3f636091952c17ab4c03c0f55940196b5772002850c6c86a3da13a9a5fbfaa8256fb0a9c4139bfc60000000000000000000000000000000018330d288ddc1786744f95c4b3bacbdfd10ab560fc283c1ecde1bcbdc53cb284198f340241242763c77b4cd3b8c729200000000000000000000000000000000019a3d86d9b3ff0b03da1686c3234bb2b8109ab12ffd7599ef9e3489fcee40e50036dd952f7a4129473340fb725458cc50000000000000000000000000000000010f70de44c7e0510c8ff8327dd83ea4087f9f8b5a53fbe18615fa31a3b57862b52a7726b3e9403afe93dcafc5606dfe500000000000000000000000000000000199e6da569d0eb7938d52b396c9bc6d8b563dd6e64edd60e2e25c493475a0cbd953e7ff54309d189eba2b3827ad614180000000000000000000000000000000012d75b62dd32798ea12b99f51a496bbf61bca93cd233dd288e00259893dbe7c73b6342860d41fd86878a6de608dba0ed00000000000000000000000000000000018e963e1cdb31ce3f636091952c17ab4c03c0f55940196b5772002850c6c86a3da13a9a5fbfaa8256fb0a9c4139bfc600000000000000000000000000000000192b17cf1539a57ee64701bcd07ed0b067a6ab12ef17408ad3ba1db0d94889cc481c877588fd70270287aa8f279659af000000000000000000000000000000001779c74b7e83c8d931510b555de206dee2d9edbb49b473c586c5b7046d1389e6f612cf96ee76446a21b02f135492fa1c0000000000000000000000000000000007165050fd4407a69143a98001c290f8b1aef02d64d28ee046744009f4afa376da95b4f6a3dd36427a297ed25e6bb3320000000000000000000000000000000005a9238272385614f6df896801f7f9af9cda1ac0ce3c816174693bd52b1799386c4f6355fc36f9ecd566a3a4b20e612b,,,invalid point: subgroup check failed +000000000000000000000000000000000d612430d9b8956188fefa4cd839ec8dffee18678f83d4984b08e227880ec127e63860bf5d7a27c309fb425b90c0afa500000000000000000000000000000000100556e6391ac2a05b15e552e67d6509e21c4770cfe2f8126fd1d9663995839420a4915656d6292d0767892833369bbc000000000000000000000000000000000aeb5c087644595d0912879f61959d2731ff55260c682ed2bc5fc55c13964ef7c1f70aeb55876d2264d558c31371ca69000000000000000000000000000000000e173848f4570525b03a2b2c86f4dcdb8b28dd6d18c1354cad31028eb1b8b44432c2346edaace093e3954c7fa6d338a4000000000000000000000000000000001949b0902506d111ef6318edcd7a58ca4d69f5804a028aee73c3786cb2db168c6a73b77194f7a021ae6ae43ac78ade340000000000000000000000000000000017c5e28ba6103d97e2f3d3611c0c78f06406e0da8a49ae29c7d460b52f75136920784cd500aa3593858b877697eb84240000000000000000000000000000000007dc719ae9e3f1e11d3ed4747a546a7b973ccb1967adb1b3066645a8bde9632bcfa3530e768f088ddbc022b169e67cbf000000000000000000000000000000000bbf9cf884b19c84045da1cead7dcd9fdbf39d764ff1ad60d83ed1e4fd0ce0554f0fb618203952cf02a7c4ba466c66b8000000000000000000000000000000000aeb5c087644595d0912879f61959d2731ff55260c682ed2bc5fc55c13964ef7c1f70aeb55876d2264d558c31371ca69000000000000000000000000000000000e173848f4570525b03a2b2c86f4dcdb8b28dd6d18c1354cad31028eb1b8b44432c2346edaace093e3954c7fa6d338a4000000000000000000000000000000001949b0902506d111ef6318edcd7a58ca4d69f5804a028aee73c3786cb2db168c6a73b77194f7a021ae6ae43ac78ade340000000000000000000000000000000017c5e28ba6103d97e2f3d3611c0c78f06406e0da8a49ae29c7d460b52f75136920784cd500aa3593858b877697eb8424,,,invalid point: subgroup check failed +0000000000000000000000000000000013b23b5a61ad3ed0ed74a57023285338c77c01dd93e17fd93d4225d27a7168dbdae3fff0c8ebcfc30887df348deea7ae000000000000000000000000000000001245282782135d41eee4dbd9b69a586e1ae2e17426643494427eabec93ba3c056089ce9c8a667727c3464178f7c87655000000000000000000000000000000000d35887ecdfce840b79f60f77af0e7cc01289ff20e1558a14b57a73f3fdd8e66ca496a73ce888d1c8cd0888d8219412b000000000000000000000000000000000cca9ce1b3c5bb6d02d5c36549438a4854dacacab7b173b434d09e496256edc2372a08edb2de26e5369af03dd0e2d73e00000000000000000000000000000000152d022429b54ac4bb70dacc888a2a3409cd7d2db0614ba0afe236c7bff311967718a70eb7943f93a6dbc88d3c008e8b00000000000000000000000000000000191e99ff1e02809121098597de4d176dfc85586d3e13609b3399c08da7c9cd6fa006e8b95551878a74e140cf166625c30000000000000000000000000000000013b23b5a61ad3ed0ed74a57023285338c77c01dd93e17fd93d4225d27a7168dbdae3fff0c8ebcfc30887df348deea7ae000000000000000000000000000000001245282782135d41eee4dbd9b69a586e1ae2e17426643494427eabec93ba3c056089ce9c8a667727c3464178f7c8765500000000000000000000000000000000179657b434fbb3ecb4857b4559c8cdaa1448b2a4bf4314349341a45bd3a2cdeb2aa6be75ee1aaaef0f90d086df55ccc40000000000000000000000000000000011ec9abd1a497dc7cc4b4b9e2cef8a7abc767969703d79ff51d7a4f1ab93ae9fc7e8bd4852da22ec067d326fffa54757000000000000000000000000000000000a45435d1f78ad93aeef8a88dad39aebc0cf38cc16fbb02c571a269bbec773e71b5ee9d09a505afc9a7fe11b06f040cd0000000000000000000000000000000000b6ee9d2b0fbd996455169ef07afa3be3c6535d65545c8503c3d77dd0576eecd2f81b50dabbb62328edfe236981d5c1,,,invalid point: subgroup check failed +000000000000000000000000000000000b14b12ecaa94f9656be54772be9b22a2495d4ff873b0bb971c27ab1d8b940c84cabcf921f6f75e93942c38cddeb8751000000000000000000000000000000000c9ad793ae80ad0e1c39670876d679bc7f930c1df1f9202593d1901079687b77f18e4b1536bd7c4152ec197321dc945a0000000000000000000000000000000006a90568fa25b401756e3f86b5300c4d3b626dc6274f4685e8a9f56ec5ca2afce36a1fdc6d3414edc8780c4e650f10dc0000000000000000000000000000000012e41e8e0dd10b3ee31fa866753aa5d9db7669153b141114cdb2ef7fa6df5db27aef0cc70e76a741eae504b038ecf2300000000000000000000000000000000005c35f3372f1ec9845bd04ea722fbed2be1388abf59e622dd3dafb4b3af49bc5fba9e20235e7e58973fedf4b8b720691000000000000000000000000000000001111d18d621070509805d306a31c109701288fd55d4c0644349deb080c6591b6e852b4f7e009b80019513de7f2fce17d00000000000000000000000000000000000707c711f77bb425cddc71ecf96a18b6eb0bed7f012c4f6cc9431003f2e1ac17f7c1f68c4965a4fcc273a3db93451d000000000000000000000000000000001211464c91c7e78b00fe156da874407e4eeb7f422dbd698effb9a83357bf226d3f189f2db541eb17db3ed555084e91ec0000000000000000000000000000000006a90568fa25b401756e3f86b5300c4d3b626dc6274f4685e8a9f56ec5ca2afce36a1fdc6d3414edc8780c4e650f10dc0000000000000000000000000000000012e41e8e0dd10b3ee31fa866753aa5d9db7669153b141114cdb2ef7fa6df5db27aef0cc70e76a741eae504b038ecf2300000000000000000000000000000000005c35f3372f1ec9845bd04ea722fbed2be1388abf59e622dd3dafb4b3af49bc5fba9e20235e7e58973fedf4b8b720691000000000000000000000000000000001111d18d621070509805d306a31c109701288fd55d4c0644349deb080c6591b6e852b4f7e009b80019513de7f2fce17d,,,invalid point: subgroup check failed +000000000000000000000000000000000e96f4879493d577aa02e9793aba3c680de9296dadef569d70484297398cca1e3d8acadc6c188345d98d5208f5b2d7800000000000000000000000000000000003bee60fe5a42f31ae4218a6c6fff2ffb51329c86f8d3c381fb090bba0274eef8cf0d351fb4bbe2d51e25d9f7b2094ee000000000000000000000000000000001664847d2bfb8939cccda0bc7b7ef02fcc1188fcade83341db7c4dfdd4a1a3bdd627379544dd405bcdb58caf4be39cb40000000000000000000000000000000001a293caf801299370cd133fd54d2086c6d1aa96ec32a1c9c57679f45785c9e6fa91018720c2d0515b38790914ab61d20000000000000000000000000000000017efcbccb71f6bbfa515e89d59b5fcdda4bf37c90fc6dafe9c6b0fe3d42a372ad9c66e5d60e04eff30ea7c1952f3fed30000000000000000000000000000000018893c6a3c621ba6c1119529a07d6c2f9c1d4bee5e0090c4c0204d8d4f3e200ab3300dcdf1cfe61370d68849806ddd8e000000000000000000000000000000000e96f4879493d577aa02e9793aba3c680de9296dadef569d70484297398cca1e3d8acadc6c188345d98d5208f5b2d7800000000000000000000000000000000003bee60fe5a42f31ae4218a6c6fff2ffb51329c86f8d3c381fb090bba0274eef8cf0d351fb4bbe2d51e25d9f7b2094ee00000000000000000000000000000000060a0cdf9ea84b21c7399b21e337dab42f357c30f50b076b4f95bf8623b88e557cc8b346e41a996adbfbaf0a3697ae8e00000000000000000000000000000000003746a481d5760263d43ee3c2ed6493caddcc59754fb8534ff57ff9bf167f356d901277b9935210ddac4dfff8f21161000000000000000000000000000000000d80e40583153e6e0adf9f95ebc4fd501f5aa426ff77038b69f0fe8259268f9224628ead1a63b7ecb4218ba825ee45b60000000000000000000000000000000005d0421b213f88469887d67c68316a98c18d2035a601dec994f6a4b91fb6c3b7e5ac7741cd07c956908869e1023dd32d,,,invalid point: subgroup check failed +000000000000000000000000000000001576c6f620bbe36a7df78985dbffd355c032bb667f4757501bb27a426c99e1949a1bc65afebaeac0668ff3d375b7837d000000000000000000000000000000001651783a82f2a8e1e389923bfb53836492c00e447b288873071bd8682a0ef30864f4d0fc9a626bf701bdfe1a48f4479f000000000000000000000000000000001335276775545fbb4c701beb57cb34312108c9f1d46b4aa4b09a16faf0e648b4e80848bf5e75ed8730715f0107afc9820000000000000000000000000000000006ffff8736bab41b4ee5681b741a81fc870e648001027161144254d04c678e4f954e9f191bd8b26201aec681cbf0654b00000000000000000000000000000000026ede90d14fa0885baad21f9631bae058573251cbef5757bb8cfad061f3bdc78834fa5862dea19a2236c014b0f1652e0000000000000000000000000000000009844d0cf7f6f3401145d8d720defa577ca46b49e04e39c4c139ec6811a574e7dd5ce3acd00d1ce9496f10dd15c6d946000000000000000000000000000000000a6ff5f01a97c0f3c89ac0a460861dc9040f00693bfae22d81ea9a46b6c570436f0688ed0deef5cdcc5e2142f195b5c000000000000000000000000000000000193a17880edffe5b2ebedf0dc25e479cac3b136db9b6b24009ea0a9ca526d6dd9714d10d64c999d4334baa081b9f2fbe000000000000000000000000000000001335276775545fbb4c701beb57cb34312108c9f1d46b4aa4b09a16faf0e648b4e80848bf5e75ed8730715f0107afc9820000000000000000000000000000000006ffff8736bab41b4ee5681b741a81fc870e648001027161144254d04c678e4f954e9f191bd8b26201aec681cbf0654b00000000000000000000000000000000026ede90d14fa0885baad21f9631bae058573251cbef5757bb8cfad061f3bdc78834fa5862dea19a2236c014b0f1652e0000000000000000000000000000000009844d0cf7f6f3401145d8d720defa577ca46b49e04e39c4c139ec6811a574e7dd5ce3acd00d1ce9496f10dd15c6d946,,,invalid point: subgroup check failed +0000000000000000000000000000000016e8fb30c523be94fed64c81cefcbed03d7a2c85ce975601a441a920d70980be8b7c682ebf2aa3cc36ad1bf2d98a711e00000000000000000000000000000000056d7a36324b92ce3bf1644a2a0f6e717b0e9d94e9e5231f0c999c0f6eac936f5c1b1ff4aef04b821454a951882fd45000000000000000000000000000000000069ce7ace071ac2f7034200da8eb9252c55cbb50a591c563684013fa8071d7289a44ce5b100db6af1e8732b8e5b3b7fb0000000000000000000000000000000019535c703e9dec227c92db508c5c0553b986b93e3a90b35f472ad8e5b217bc7658ceb7ea452b76984d3d17859fbd7fc300000000000000000000000000000000008b3677ecfb10faae0478be5be5c72fcd7137042b5972fffbd15ac95d6104687a81fa3db232edbbb8703280412eddd30000000000000000000000000000000012a628e23e5c7f0225eaa75b6c9199d1d3a0316d474d1fa729640c295ec156ce3bd49f193d993165b9a69ad6cb2ed75c0000000000000000000000000000000016e8fb30c523be94fed64c81cefcbed03d7a2c85ce975601a441a920d70980be8b7c682ebf2aa3cc36ad1bf2d98a711e00000000000000000000000000000000056d7a36324b92ce3bf1644a2a0f6e717b0e9d94e9e5231f0c999c0f6eac936f5c1b1ff4aef04b821454a951882fd4500000000000000000000000000000000005b6ff8cf47cdedab38d984013db8401fa4783e7c8e78160c7a420de86636683b8dc292e1f0494dba5865f217e33e7c40000000000000000000000000000000008287d216fc45ee3e210630f0dc4893dfbba90b3bfd34986b64b04a2ec6fea0496cb0f2910cbb99a70896e5afcf809e8000000000000000000000000000000000a1a11f1b52c35b9e061c57b7b7f5f76f4db764607c93c2dddf245170f4c6fcf5915d72130e6f8f0c0c5b29a4970aeb30000000000000000000000000000000009255413a3db5889608069b7a72879b659ee5e1e71165752a9173cf1ef749050fefb86584ce90cbd3c3aa3db023b3322,,,invalid point: subgroup check failed +00000000000000000000000000000000117e2e3a8753660374fb2b812038bfd8f15d36d26c7b07fb546610405cd4442c79166060c8b8e767ea4084a583bbbcca0000000000000000000000000000000011247def4be1da163e724a175f74afde615df1417cdc2491158fd560442e56ebbcb61f51f9712ac93131024e27a1caa90000000000000000000000000000000001cdfae9234096578b9413f926ef8c6831f2c0f700e25d7553a746aef44238e493f8032e09f67f2fed9676c9611f60e70000000000000000000000000000000019c8bae08d3926997146f7827f00cde863684dd4050ea5da64f6798e7a930d3c1f34046bea0f44232594f5469db566280000000000000000000000000000000013574b997ee8988aa81db0e2ddb98be2e7005603076fac5cb246f65c869aa7bb3f148c8dde970e34e5e5efce023e633c000000000000000000000000000000000998bc9d41c5d527360fc4e68ba067d3778cf5cf00e5959b5ec52c1595aabe6e2e92d40cb34faa84513d150568c8cfc00000000000000000000000000000000009ec00ea2da59d937d3154d86dbed2957667253401bce9de80e0ffe6df32f36b06404b9e3af08e912a0b4ef091f93efb000000000000000000000000000000000dd8d1bd66f4accbc9d0c7dabef7af72f51c67a0d61384647533ad92bba44a312f0be0fa52163176f1aff4e64c00aefb0000000000000000000000000000000001cdfae9234096578b9413f926ef8c6831f2c0f700e25d7553a746aef44238e493f8032e09f67f2fed9676c9611f60e70000000000000000000000000000000019c8bae08d3926997146f7827f00cde863684dd4050ea5da64f6798e7a930d3c1f34046bea0f44232594f5469db566280000000000000000000000000000000013574b997ee8988aa81db0e2ddb98be2e7005603076fac5cb246f65c869aa7bb3f148c8dde970e34e5e5efce023e633c000000000000000000000000000000000998bc9d41c5d527360fc4e68ba067d3778cf5cf00e5959b5ec52c1595aabe6e2e92d40cb34faa84513d150568c8cfc0,,,invalid point: subgroup check failed +0000000000000000000000000000000018de31d75ba31dc1441bee38f5fb9e9d347e0243e6c3220de664e04a0af17c776fbb483f63ebeac48c7811adc0fff6bc000000000000000000000000000000001053f5c7a65dfb41b7631a22e60337769beabd663fa76eaa1e01f0c0e3c901f40a22b34adfb13b38e298eb83f08d7b1400000000000000000000000000000000079daf601b5fdd1c00552382a819e1924a517226864aa3565d384dc399e6e124c3ad61b236e19321078eab585579572d0000000000000000000000000000000008ff51b4d60d9fb1718c5622b1a3353675ca0144e12e68875481394755107b7f3364d1320283ce34737d5ea0b7d9b40f0000000000000000000000000000000000f430d35de439bf8ef82df4dc61459cf9783d66531e8075f323dbf102035032972a4830ba6bf391b568e6b691723ea600000000000000000000000000000000042df3a5c7b534c48c9af9f48e5cb296e2e514e3322630989c3da9696485797fe2ae036e13484e26cb59b48a479d3f520000000000000000000000000000000018de31d75ba31dc1441bee38f5fb9e9d347e0243e6c3220de664e04a0af17c776fbb483f63ebeac48c7811adc0fff6bc000000000000000000000000000000001053f5c7a65dfb41b7631a22e60337769beabd663fa76eaa1e01f0c0e3c901f40a22b34adfb13b38e298eb83f08d7b1400000000000000000000000000000000180168b2c9a59a9bedcf002336a6ce5d5ff36937948f5d3aa9fc1ef1912d9fed526edcaa00b5ede76906c40994937da00000000000000000000000000000000018d47a4f6e4320a230b8a4e5f5eea7807fb5b0dccc72af182e8bb811f2470dfd485f291b8197899af84332e3674d56950000000000000000000000000000000000dbfed96298ad2f57fe7b1eff4791abdae5fd0ca3573e66270f8c9f6adcbf6e54a746789a496714f5cc06eb2b8190070000000000000000000000000000000002939de2a2f7ec3d44dc5ae679967a5d7efcf80df8a21d9708c036c602a5050487f80a39cc36c7e587f0f2610fed86b2,,,invalid point: subgroup check failed +0000000000000000000000000000000001ac9e5f4fdccfe8d2979ad5329b07b23b497c2b7f26283f8c79548387610580568bdd9dc040261d6c265aac581b4665000000000000000000000000000000000eaf31d6368bb9d762ea067eed73b008dcb4d84643471dc1d64104eaefaf500858d9a9323b7fa2ba3c22bf15e7db6b9d0000000000000000000000000000000007457f2601621a99050d8993244f026b9a62ff7055b325e6f1edd1cf54065785f003cf7c8a4bb1f7bdf14e220e490ada000000000000000000000000000000000928eb76b428dde37546a27f3d77605c293738f448fbdd6d618747b0de04004aa4419cc5601600419c6e1d470c15982e0000000000000000000000000000000008074e9f5473492dd2e536f7b305be4e5c564cfc9218934d03dde6dc5118064ebaa5c26fdd1123a9c31336c37c1234900000000000000000000000000000000002bba1f9b7da6abd2b322c8f11c749b2a284552eab25a77d21b38b028da477a3ffec1901a015e81fe2893576a41e4c0b00000000000000000000000000000000172447291285a20c3ffcdef805260f00fbd4c5d3a42ee5b17d5ec05a723aadf4c2acc49f839e222155f29d0c6384bb0a000000000000000000000000000000001490dae85f858ed057fdb61c22ebf3d45c3af02afa53f32b2542808bb4db5bb1b9603e377f0b6d214e03050379f8006c0000000000000000000000000000000007457f2601621a99050d8993244f026b9a62ff7055b325e6f1edd1cf54065785f003cf7c8a4bb1f7bdf14e220e490ada000000000000000000000000000000000928eb76b428dde37546a27f3d77605c293738f448fbdd6d618747b0de04004aa4419cc5601600419c6e1d470c15982e0000000000000000000000000000000008074e9f5473492dd2e536f7b305be4e5c564cfc9218934d03dde6dc5118064ebaa5c26fdd1123a9c31336c37c1234900000000000000000000000000000000002bba1f9b7da6abd2b322c8f11c749b2a284552eab25a77d21b38b028da477a3ffec1901a015e81fe2893576a41e4c0b,,,invalid point: subgroup check failed +000000000000000000000000000000000515390641039576df1debf767b899deed928bba057d8564e7d117b324dd7f45e38939ffa1056fea35e1df8ba38815ad000000000000000000000000000000000013af9258135a09e5710a22dc437a4efdfee1f6c25cc08fb026c7ea2accddb9446333a91a532742c7713f6639e0cc460000000000000000000000000000000017203225f7e7b55e52793698b8a1166de5cb3d130c7df6f74ae428c4f39e7d042d41eb3aed266ca8cd3be1618cfcbdf60000000000000000000000000000000016b8053ab19a08a8c23a166bfe7a89be6eed05f305525146d9ff6e03e47ba125403cb2f000672d08a2b59051242f61ea000000000000000000000000000000001136f9a9369aa3561d65e54869f36ae9d6945654ac16335aaf717e0f848463ad401a99e83b3581c79d4221f65d649e9c000000000000000000000000000000000302ecf71033b917efac49d7a22db2e5c59b656639c4d0aefdb431749718d560b7e5580b4532048a693ccc09fb8a44a6000000000000000000000000000000000515390641039576df1debf767b899deed928bba057d8564e7d117b324dd7f45e38939ffa1056fea35e1df8ba38815ad000000000000000000000000000000000013af9258135a09e5710a22dc437a4efdfee1f6c25cc08fb026c7ea2accddb9446333a91a532742c7713f6639e0cc46000000000000000000000000000000001330e5c71d9b0209c8f8c04b4a28ad70d826b2c781493ac50fe58d0d6b740de3ed08f9829aa9b207ecf623a36dc8de610000000000000000000000000000000019a81ae1c6c08004a75b8fb5426ec899a09becce68dfb63fa7335420f05075bcf42c85dfa688ae75398c3ae5e4d28d12000000000000000000000000000000001597318859306f3814d20faee54926d5e8ec01005fae8aa408989afd5a1d7add8956d8fd3e75f9e446fb8b2a31050b6b00000000000000000000000000000000151e7c5bbcaf1e9581ac48e2b9bc63bf4576ee5d938981550f00fe9e3a42d389d6b56acd0ac9254ceaa71519b5049a4c,,,invalid point: subgroup check failed +000000000000000000000000000000000a2e9dcb8461de77fffb1281df7360c947108baef671602902c3bfa4afe60e0b4810cd46bd91276cd58e33fbf4973301000000000000000000000000000000000c039ea7e94fca4a32a275691131df8e3d470d6026aa306c8ae855e9e411878247368615094621e6af5486809b467a7d00000000000000000000000000000000138ddc71e9709e595ce2631c9155069818d07f225f80511eac21c5655721df83f83e2abbf56e2d5ebc9698f9128f0579000000000000000000000000000000000080f7ae78277c94833c0f12aa2cd98285621e0d92a89b45cac848f5a75ea652e98cd085150b2d7babaa9a365123d90e000000000000000000000000000000001147cec62010d42cd84651ec61ad8263699786f0f34aa7f9de75ac841861fae2e8ce3795fde8e7038c8506f573cf0e0f00000000000000000000000000000000138ed243889db13546c69583c1aa93ee98366220ad80c590ad112adcb4b7c87fb48a34483e76d4a5c55a30f2adf1a6a6000000000000000000000000000000000077b7a4c4644b21ac3ef56db1163f7b2e07a817cfd9d4c6830a97d0ae0b620e0b235376d590162c378899ba12eadb5900000000000000000000000000000000022beafe4b4ab44434c9dabae45a395b5b8da15da2fc2e723c1b30b5efc95e880846844f27eb47dfae8657fa27ab64ef00000000000000000000000000000000138ddc71e9709e595ce2631c9155069818d07f225f80511eac21c5655721df83f83e2abbf56e2d5ebc9698f9128f0579000000000000000000000000000000000080f7ae78277c94833c0f12aa2cd98285621e0d92a89b45cac848f5a75ea652e98cd085150b2d7babaa9a365123d90e000000000000000000000000000000001147cec62010d42cd84651ec61ad8263699786f0f34aa7f9de75ac841861fae2e8ce3795fde8e7038c8506f573cf0e0f00000000000000000000000000000000138ed243889db13546c69583c1aa93ee98366220ad80c590ad112adcb4b7c87fb48a34483e76d4a5c55a30f2adf1a6a6,,,invalid point: subgroup check failed +0000000000000000000000000000000004db2336ff5016a6f0f34b2881eb80cfbb35f557ef492f2dc54a654c8c574651fc89f3f211a46510ebffcf5c890e5ee700000000000000000000000000000000103d17d59c26d8c85426b73593843e3863cd672043b7a392cdb05bf5dd69cd11583423a4b146dcd3fbcde4ef4349bd78000000000000000000000000000000000e07265d2762e8e398c83efe1c43452d91b90b7a4271c09ff693c83745a6c01b73561ffe3da9300c8e7e1602dbaab0bc000000000000000000000000000000000375579c16a167fd9f9f61d5177705f157aa0df3451971029a9444432db119fb33b8c07de33fc822eab46ed4ae47cf8200000000000000000000000000000000098cee454129e946d758f95e649a601b6e682467093cf32c76e5cd1328111f9d48cbb2850d4d2faafe429161b090f8ab0000000000000000000000000000000012a3fdf296743b2eb3f389eb6dbea52da21e7dbaad180177184afb7976e06fd4ad488399d39b760ca146278cb3759d7e0000000000000000000000000000000004db2336ff5016a6f0f34b2881eb80cfbb35f557ef492f2dc54a654c8c574651fc89f3f211a46510ebffcf5c890e5ee700000000000000000000000000000000103d17d59c26d8c85426b73593843e3863cd672043b7a392cdb05bf5dd69cd11583423a4b146dcd3fbcde4ef4349bd78000000000000000000000000000000000e87688c9f6f48450528cec78f874d87dcfab499bce391e964a0abd601d675eec8a2b4cc6c44811cbe918913a230975c000000000000000000000000000000000451c1a17567b55123da563e173b2d92ab635c4957d116fdff8eb5a3e00bfbe079abead42b9c990b56db919719d066160000000000000000000000000000000003206eb27b9e53bc451bdbe5059133a51d656d9d80654647163a070741761af3e712e2042acc5ca29fe72cafb3a98ec7000000000000000000000000000000001869b7fd294c230aa5901db9cca31e6d3801069e0795e4c7c63dea8adc1e4a5709ec62670e2abeeb040031b7fcc8521a,,,invalid point: subgroup check failed +0000000000000000000000000000000007248a496f2cc918cc3cf0240c5c3d0dce36228a199766106999205b5767db09c2ff5cc720691ebc6bb1c316159d1c000000000000000000000000000000000019ab8e34bc4c0ba409c7edf7bbd4d0cf03f7185a2baa3f22ebd6234503d56e9b0d84a5d8d46ef9e3ac6430029be82b2b00000000000000000000000000000000143220e1cd08ffaa6db4795ed4aa35f3b12cce724fcad005367328972f2364f34096e32f1f1cb7a4287ab636d0030322000000000000000000000000000000000f2de47a37a55edbb75ff0bcc446611d690d7f9efdd09ca1ebb6f1d64a330bed420bcc85aed8b95316fcac3aa7d1f2230000000000000000000000000000000016afb044b8b8c64547e000f80b25576aa329a4319dcd4f1bbe15d12e6f3bbdddbb52140e6297c637311ef0c7a31cafab0000000000000000000000000000000019e6803c07fbaa075093f6a69f9dde05ba3d3f58e67389d7f096e56df49f8270008ed422b64fcdadf7cbbc8334037682000000000000000000000000000000000b231eac9869c94f055f22c16ef5efb687a7399da838c9456bb2469b3e394dd21e462bcc9298d5b56173c7b76f79ee9d0000000000000000000000000000000013a1bb963b7fbe1c3f6bb78cce8c3122773428ccbd87cbb2e76f306a8c5369577267e9b4ccb3417a235fc9045e8828f100000000000000000000000000000000143220e1cd08ffaa6db4795ed4aa35f3b12cce724fcad005367328972f2364f34096e32f1f1cb7a4287ab636d0030322000000000000000000000000000000000f2de47a37a55edbb75ff0bcc446611d690d7f9efdd09ca1ebb6f1d64a330bed420bcc85aed8b95316fcac3aa7d1f2230000000000000000000000000000000016afb044b8b8c64547e000f80b25576aa329a4319dcd4f1bbe15d12e6f3bbdddbb52140e6297c637311ef0c7a31cafab0000000000000000000000000000000019e6803c07fbaa075093f6a69f9dde05ba3d3f58e67389d7f096e56df49f8270008ed422b64fcdadf7cbbc8334037682,,,invalid point: subgroup check failed +000000000000000000000000000000000ee60801e3aaacf27167207a03b42594cdca4cdfe3a1f8e5f87b0e423ad36c56725dc79a26c157f41699e89884d27c1b0000000000000000000000000000000017c92b0beee470e126830843170bf0a89d13856ff6b0209e23bbf2a68e0668bd81db29de726ec7593124bea89771da97000000000000000000000000000000000a1beec4d223edbf1d09c448ea27038327bd8621842d3c7851779286060abd8130e4a641100627057498a421b59e90a600000000000000000000000000000000076a9559f5e33a2d5bdff6a89037c12e58ef920a3d8b9b4ca2a78299dca5dbf07c80d51014ee9288af8725e6c4312225000000000000000000000000000000000755036dd19c7d703343bc29238ae9332823514aeb4779b3378e8f7a3463a4089eef3fe79608db22b703b5d88c65bd80000000000000000000000000000000000ee3d82959dc04b5d59428142411e48e7a2fcfcff91e5554b725868c62d139bfd763720c9e2727c1b1fdc0bfd60f7297000000000000000000000000000000000ee60801e3aaacf27167207a03b42594cdca4cdfe3a1f8e5f87b0e423ad36c56725dc79a26c157f41699e89884d27c1b0000000000000000000000000000000017c92b0beee470e126830843170bf0a89d13856ff6b0209e23bbf2a68e0668bd81db29de726ec7593124bea89771da97000000000000000000000000000000000360e8bf07554b56d6f27de6a4b1f9184adb7980311e8f4128f619d9c8e64e98bcfca8eb3cab93e183882827fce2d06800000000000000000000000000000000010b0b114b55b17531576f782b6bee122cb5fb1e40d5af37ebaa1d4dad55a0f5d130c9a58cf27b1594eebd0b1492c0400000000000000000000000000000000018b70f0c047aaf7e17cb96015642e0d32f3135999de6dd8bded2c600866485ea75ab3a3e37581ae7dcfa1f54381f542300000000000000000000000000000000028cbef4b476a9cfb8daa35b1321a486b8c94f8b8df2352a0c8d509325706eee328b8dc3657122afb81be1fa2e60aafe,,,invalid point: subgroup check failed +000000000000000000000000000000001573cb3b6f4e841fe97549f42e06db33abeb2bc481cc0bc8c5e7bd81948432dcbd34b64c5766e1e491bc131e77a011aa000000000000000000000000000000000e205be14db0dfb21e58b302d45916de4f4bb48ac95228326cf49c50e6c8588a655a343b90645f73dd03c9aa51c5659a000000000000000000000000000000000a109e3cf72bba0e695bd756478c72884210868c95f0dd6ced22b7254eed0432c2345bbf8addbbd11349fec6e354d2350000000000000000000000000000000018aaf98535812ee760e17ad933acbe6b57bc1310b6fef550210053f06a611ce9df5dfcfdb028497468802c08cc2117320000000000000000000000000000000007590fa8cb07f9dc2ce7b2090685730104ca65a101c8f93965264913bf1deae794b71ff226a805a273248dc641225585000000000000000000000000000000000fbca4e20854a6069c298224eca9a064b7ddc4d834f8671ac45cb5d1d39265fa435ff1750cde5135e170824e516d6d2c000000000000000000000000000000001510f39616d7f576980055d0547c603d882dbe85dd0b634577fae134f210736007345d035d815306db660de4a07fc24300000000000000000000000000000000064d356ad7bd2edcd3622b1fc225fe319f86b5f7da875cd57fe5adc5bdb6443c5b09d676950e2d069bd4303b8f920692000000000000000000000000000000000a109e3cf72bba0e695bd756478c72884210868c95f0dd6ced22b7254eed0432c2345bbf8addbbd11349fec6e354d2350000000000000000000000000000000018aaf98535812ee760e17ad933acbe6b57bc1310b6fef550210053f06a611ce9df5dfcfdb028497468802c08cc2117320000000000000000000000000000000007590fa8cb07f9dc2ce7b2090685730104ca65a101c8f93965264913bf1deae794b71ff226a805a273248dc641225585000000000000000000000000000000000fbca4e20854a6069c298224eca9a064b7ddc4d834f8671ac45cb5d1d39265fa435ff1750cde5135e170824e516d6d2c,,,invalid point: subgroup check failed +0000000000000000000000000000000002ff87f9bcde30db0919444e2582a5e987fdda67264ed7abf60a93b37288143dd44db75403988cb5b3bcd8d34ebdb4e2000000000000000000000000000000000c672f8bf6e9e747cccb9438be047e56d1cfbd0808864e601de59b0b28b5438cdd10f1194ff5abe8694a598ff3dc1481000000000000000000000000000000000c01823cb218303c7e611f6caf6994615cc3805bb4310bb0bb82b56740c4314ed0a2f9409c8fa6b9f10dead667880fe000000000000000000000000000000000013eb3436ceac3f12dcdd9e71707b85b7cd872ce144c502078d4fd3ec8b4ee579410cbaf2e3db1df9ba6b55f14fbbb0c000000000000000000000000000000000ecb26e5814d5bc66fbbcdff5dd5934a597c4344487e7e63138c31d47a8201433be5ce14205660cae129891f5b7aa8e000000000000000000000000000000000040241f695cc864e99e1dcb04440135c4f3d90a86310441647ab265e9fedf51592b0c11d5e91d2d28ac4ed19245e9cc90000000000000000000000000000000002ff87f9bcde30db0919444e2582a5e987fdda67264ed7abf60a93b37288143dd44db75403988cb5b3bcd8d34ebdb4e2000000000000000000000000000000000c672f8bf6e9e747cccb9438be047e56d1cfbd0808864e601de59b0b28b5438cdd10f1194ff5abe8694a598ff3dc1481000000000000000000000000000000000a2e0129c31f3427340e234df5facbb5d1994a4c8a058fe84f7d5c62c7d00013cc0133d8b0faf497aa8f7c04abc59c3400000000000000000000000000000000160da6086a089fc1a31b89a0f0c95ff2bd85debf5f0d1372f3ca6fc26348d8a8d0b03525b27f7d7db6603f0e55d3a08f000000000000000000000000000000001893edc299faf35510b92c97ef665f458b19e4097299b4f8b0f8a2ea1f31343c9d2f4c35dbdfb36bf7f3e30686e8c3240000000000000000000000000000000009b8731ed8df8ae90ec344c9dea1eeee98f4000b5fe30460e58f30e4ea17821389d613458c7721fd1d759ec4f2bcb325,,,invalid point: subgroup check failed +000000000000000000000000000000000e42f5097dabc6b0fef4dccbfc659da40b66671d7efbc19dbc14a42a368402156469c818f233ad911574899db01ed86d00000000000000000000000000000000128bbee344b7a19212b549cefaaec31c0644c986ab863005e4d3ecf532be633597ac3906e53ca79b22de916ab92b4ad70000000000000000000000000000000009003b42c08b5c7d3ee9f6abb96e08e6f537da25cd0cf7eb85a49067746c03566e133b54153380286ef5725db5b41058000000000000000000000000000000000f09b7b754c255e0e3b8435ade64d6960285759495659dfdb9b117806397baf8d3c87e30bee02c9e1b22fa3efcc58f300000000000000000000000000000000003582c08a8de4bbd20ebfa833517a75682618fba2702b6c71a4785f70dbdede4e86ad8e04aae1f50a6bb75842ab74aea000000000000000000000000000000000ec013f22e64a4d4fb6f964e8319feb1ddbcfb71329186545d9b9d7f97d1f6a56c8aad03d20e9c30966ca932e1f2bc670000000000000000000000000000000002f78becf8a5717fbfcbe110bd6d4ba683658c1a45afeaeecf7742502d3df54b262de4fe30bd41ed0019cc79b595b5ad000000000000000000000000000000000dbae184899af1ad6221b75fc62cadcd61c623e011672b691a5aa498684f49796220fc5a73ea7170ed2fa44b9f3c39090000000000000000000000000000000009003b42c08b5c7d3ee9f6abb96e08e6f537da25cd0cf7eb85a49067746c03566e133b54153380286ef5725db5b41058000000000000000000000000000000000f09b7b754c255e0e3b8435ade64d6960285759495659dfdb9b117806397baf8d3c87e30bee02c9e1b22fa3efcc58f300000000000000000000000000000000003582c08a8de4bbd20ebfa833517a75682618fba2702b6c71a4785f70dbdede4e86ad8e04aae1f50a6bb75842ab74aea000000000000000000000000000000000ec013f22e64a4d4fb6f964e8319feb1ddbcfb71329186545d9b9d7f97d1f6a56c8aad03d20e9c30966ca932e1f2bc67,,,invalid point: subgroup check failed +0000000000000000000000000000000002dd02e23d8a9b7aaba94e8ce97a2d988291b6efb1d4d8d1c53b65581b737f992a428cb72ad38d4c6d470d6b50c869f0000000000000000000000000000000000661ddb1f0edbaa208c5e1db143ff41be5a35442da7b3e12d2928310ba5b64847f4909be93f860858f752cffce5e73870000000000000000000000000000000018fc47e1aaeefc1ea653eb42543940ba58044b247eef2627331142988f3a1a4fe72583738c7caa00c562d010089754eb000000000000000000000000000000000b5f8e9d774d99c3b6d224790d5c48367d68167aafc309ad8b351d1de8b601211737235bb0ff1b01e508ecf36a40db5d0000000000000000000000000000000013509c76fe4383e47d8ea35ba6ebcba13579bbf43cee0cbe27291d2601c3d74428bc9d5d1200718c86977abd16cb77a7000000000000000000000000000000000efbeccb9e9f348ba98ce0fd191c2e81de4925d7185f01b39a51aa44b30496f1fa3be4582c539889bef7b5783f730aa70000000000000000000000000000000002dd02e23d8a9b7aaba94e8ce97a2d988291b6efb1d4d8d1c53b65581b737f992a428cb72ad38d4c6d470d6b50c869f0000000000000000000000000000000000661ddb1f0edbaa208c5e1db143ff41be5a35442da7b3e12d2928310ba5b64847f4909be93f860858f752cffce5e7387000000000000000000000000000000000629fc2184297509e1dc0707b707067fa8b9a079d95f271ca230c32705c7e783f91ce1ef0323aedc6aa2febf750392b8000000000000000000000000000000000f29cb4bdb7d53671f9f1b1ee514cc916a657b7c17f298f409ad92ad7b2ca36b0298bd0581db7837994b781b829980c30000000000000000000000000000000014b839ecd27f2d6fdb92a36792c62ef503fb0189d3174447c4b1132e5f66d7970a005e315e6906ecd2ce6c72742d210500000000000000000000000000000000091bbfcfbd929cc8ecd000cf8ccf083c2f8cbd84f19b48b1ad20781e675ca7a77887b962435520e3f707fc0631fdc8f1,,,invalid point: subgroup check failed +000000000000000000000000000000000f67855b0cf915ab52190c7e69129d40dbeffae28fe110745edefacdca42bf979c5c5da1c6ebd78b43667cbfe360874c0000000000000000000000000000000014c5523f37b011c632e9e8eb08611e5a244ace2746264706b92a5a933b34bb9932c95c493ea7e8fd049d80acddd05e860000000000000000000000000000000012b63d867bbfe5505a83f765b85b0e8f182c796857f11125e691969c8e81eae927a5e1b137c81473e8b99ea0727c873c0000000000000000000000000000000010a8241f3b30c54a5d2fd7adca9be47b001f2268973e955ffa61d57793256a2d82fefa5e449548c64fa5aefda6d933220000000000000000000000000000000008e7d2f2e34a60504a5437275f358d0e742c445080c5e46053ea459893d6865e8d20906b2b58f1d1446a100cb1c9a513000000000000000000000000000000001369bfc5f24e2a7a7ace891444764ca32a32513c8ddf654f418c6eb7690e2cba77a4c4d4b98eb546d4e4046dd3c3267200000000000000000000000000000000153310de30b7a485753dd8443f8638c12b21083f6133a1c093648bcb566b33f73631c6fc558f32abeb0d6df8430e61a900000000000000000000000000000000005be397e9f77556ad952dba0540f46cbc7db910d5203cb976e168a7be3a3b8557c5f08d51cca9379552694a291d67fb0000000000000000000000000000000012b63d867bbfe5505a83f765b85b0e8f182c796857f11125e691969c8e81eae927a5e1b137c81473e8b99ea0727c873c0000000000000000000000000000000010a8241f3b30c54a5d2fd7adca9be47b001f2268973e955ffa61d57793256a2d82fefa5e449548c64fa5aefda6d933220000000000000000000000000000000008e7d2f2e34a60504a5437275f358d0e742c445080c5e46053ea459893d6865e8d20906b2b58f1d1446a100cb1c9a513000000000000000000000000000000001369bfc5f24e2a7a7ace891444764ca32a32513c8ddf654f418c6eb7690e2cba77a4c4d4b98eb546d4e4046dd3c32672,,,invalid point: subgroup check failed +000000000000000000000000000000000f3300926ec62bbc0a73e4e0404de3a55dc0ad4fdc393b291ccf9f80818b6a69c0a3f9c6edf024db295a353b6aa71a5400000000000000000000000000000000195b21606667c62a181b275184014fcef97218b451c3642e2e4dcf5502d03cbcc88839e827732feb32e77e52f702529c00000000000000000000000000000000198fe6684d3de4ec9c9ed5c59c9e662c4eb1b026995859db3a753ffa96c6cef7a063a607fc54599f706820fb864d7b0500000000000000000000000000000000116af6c03511ba2bcc32ea54c2fe2bedfb0848d2ee3017547cb25acf892400203e3ce4ea1986ecde0cdd383d42b61e180000000000000000000000000000000004a22ed8f30766b6b1dfc7286616066ccc262875e3de42e2c9528f6d23a7fda67ddb371f9ec419ae4dec48a354ffe21300000000000000000000000000000000086651d7ab0a4b1dfb9a56e42443f42d48c1f16866338d997adba078736d32bf4387b95da2da33e714662f800838a077000000000000000000000000000000000f3300926ec62bbc0a73e4e0404de3a55dc0ad4fdc393b291ccf9f80818b6a69c0a3f9c6edf024db295a353b6aa71a5400000000000000000000000000000000195b21606667c62a181b275184014fcef97218b451c3642e2e4dcf5502d03cbcc88839e827732feb32e77e52f702529c000000000000000000000000000000001367e0843d866d010ab03723026aa9ab1f930d3579daeabadc1fdefc06047ade30b36326d79bbae74293d3daf2e6c7a4000000000000000000000000000000000550be918ba9e28ddacb89ec526db63072bc14a62ec7ac06775f951de5b32af93d2d8f95389a6384cde62dffb941fb5a0000000000000000000000000000000014f59aa4f0603d5f166caa5692d9b068ee10a6f45670c6f4d492a4d1fa7a13a5146efcae33a841b5acf75a32b853b2770000000000000000000000000000000010ca0d9ba50c730006c95bc5439e2d39a40a9055ddac935a900bdeafe7141990db20ad0a840d3297c4b9b5f69aada6df,,,invalid point: subgroup check failed +000000000000000000000000000000000b9590b1d0d292d9967d759060a551f4e8e4c1c0066a9a3c0be515085847fa26b77462e3bae9e2621f28e01f897df0bf000000000000000000000000000000000a00d39c6c14d18dc5888b8a8835c3ef6f83ead2fa380be24ae857677b904b3868ceabdbb3abf3c186c5353a67fad0a60000000000000000000000000000000017d978d60fc89b0429c1a6424231fe9274cedad5d78d9c4ac5aa2dd5e70e8238a0bb1904bb4b6ee5de5cd1ac514c62a8000000000000000000000000000000000d4ce85a95dbc40f405f4e7ebf9121cdcd22766737c39618ad0fb3e10a6e53be1faceaa96073b2a877ab808483ec9b6f0000000000000000000000000000000016c61599ae4da787fa6db233fc28f5c56f7133d403901800ab5fa19d058fb27ecb34ca2e56ffa7628ed004c9e62092700000000000000000000000000000000001e64e4adfdafbb423b1b9f8973738c690713911f68f658d234e57dc35b9554e0f7ba345dd7920b429a12b9c74775222000000000000000000000000000000000c453b5a2f6c721f0303b6b9205e51ccab7829345e0cf13e457491ff35e0f38dc5ac2e5b0d8195e3d322704c38d3280600000000000000000000000000000000092ddd55120b22e2853983dd3dea9bad3e4bf23e46dce297aa3db85856907d1b980185c5a6e02890f24a5463e7895b950000000000000000000000000000000017d978d60fc89b0429c1a6424231fe9274cedad5d78d9c4ac5aa2dd5e70e8238a0bb1904bb4b6ee5de5cd1ac514c62a8000000000000000000000000000000000d4ce85a95dbc40f405f4e7ebf9121cdcd22766737c39618ad0fb3e10a6e53be1faceaa96073b2a877ab808483ec9b6f0000000000000000000000000000000016c61599ae4da787fa6db233fc28f5c56f7133d403901800ab5fa19d058fb27ecb34ca2e56ffa7628ed004c9e62092700000000000000000000000000000000001e64e4adfdafbb423b1b9f8973738c690713911f68f658d234e57dc35b9554e0f7ba345dd7920b429a12b9c74775222,,,invalid point: subgroup check failed +000000000000000000000000000000000eb7d975030858b57bae3e7a8a7e297f9d7d6b2bcf27fa8bb9b73cf60a1a1a5e6638adc726eb2e7fd5500353de95179e0000000000000000000000000000000015c783845a98d2b12a8cada673e1df4c266b34302cf7d004e00612584d0913283d43150337c36dc3912bbd757e6a370b0000000000000000000000000000000014a0222d6d0a809cb5598db18e35f5b7f5c49ec5574fbb5d801d9f890ede23d20c62a22321394b6efd1a45b9780a4efd0000000000000000000000000000000017c8bc1b8f7ebbbcd6203f6ffcc758a787a96533a77290affc18b76fc6dce7c2ba8f169dd8ecdb8b240c92664852bfc70000000000000000000000000000000001a673ad0af4bdd53027b145472d1e8dfa05029b7ba5bcb7dcc63b5e6369b2e693f27e5665167a8dc8b6d3c9b85eccbb00000000000000000000000000000000085efb596145e58b4eae7aedc8f7aff6949f1edf8fbe0c88e6dcad46423cf7b2d5f8f54bbdcf8f1427438e6a4da71914000000000000000000000000000000000eb7d975030858b57bae3e7a8a7e297f9d7d6b2bcf27fa8bb9b73cf60a1a1a5e6638adc726eb2e7fd5500353de95179e0000000000000000000000000000000015c783845a98d2b12a8cada673e1df4c266b34302cf7d004e00612584d0913283d43150337c36dc3912bbd757e6a370b000000000000000000000000000000001425d6d5cfd04d310d8ef3ff1a3b3d227771f3bb3cb552c64ca1debd3e2e75e7a96b9a0d5768ff041098d743de445e790000000000000000000000000000000008b12959963c17ce7247490d9806e0ab02f9aeed8d8faf4591b955885f5aae509358a19c1eab19dacb72cb67b9c22c46000000000000000000000000000000000a7108fb7442fa6c50b472dda60d6c277bba83aa21ac1630bd3df6f116c8a58e60e8c4a303a041b9825b65301d388e410000000000000000000000000000000000faf3042f00060eff3e5e13e1a964c9dd605677596c49cbeccd6d0374c6a4ab9742cac63d1801631d5fa5e00d399fd7,,,invalid point: subgroup check failed +000000000000000000000000000000000f6d131c756d031041ba97dd20719cbfc864de16dddf00d282f6c41de683d193a015a781232ea5513321c131505fa4ee0000000000000000000000000000000008d754d62b8f1fb0d0e9dfe4746d9c5f9e4a296c6799d6379a4a1a07583d0959c62b05011b636b72cdb87d3c92d94f3600000000000000000000000000000000061bf88e4c5f6bfacbf1e2e72566d9c44a001237f22d7f6a7240ee0bd3c8d175786f7c2ace267774fa5615d7bd3ec8f800000000000000000000000000000000192c987bed20d707400d3211e480b8760021a33dfbaef829b1e865f92b37cd3962e56a38d4c06c5ad73bea5e7321b176000000000000000000000000000000000dbc62270cf7623e571f6ebcd29f426f214cf1c8f71edf9aeefbeb6037b7e71bfe41a55828cd4353bae2e1e927812aa80000000000000000000000000000000005f6e7064a9708e20bce8e5002c352b13d4531d87be1320bcf3322d5e2b851a54aefaf6f9ae26e277ecad307c448511c00000000000000000000000000000000041fd1625afa48a446454d6613c17cc6a65b3ec8b8f2125c0eb7b8e5d07968397d43969a6579226f496d9b24dbb71b820000000000000000000000000000000006131c506f243b5ac40354f826ac1838839eee9f61301aabd88e499d40e57df3122edc8b36f0a8b16b72f9ac783efd3e00000000000000000000000000000000061bf88e4c5f6bfacbf1e2e72566d9c44a001237f22d7f6a7240ee0bd3c8d175786f7c2ace267774fa5615d7bd3ec8f800000000000000000000000000000000192c987bed20d707400d3211e480b8760021a33dfbaef829b1e865f92b37cd3962e56a38d4c06c5ad73bea5e7321b176000000000000000000000000000000000dbc62270cf7623e571f6ebcd29f426f214cf1c8f71edf9aeefbeb6037b7e71bfe41a55828cd4353bae2e1e927812aa80000000000000000000000000000000005f6e7064a9708e20bce8e5002c352b13d4531d87be1320bcf3322d5e2b851a54aefaf6f9ae26e277ecad307c448511c,,,invalid point: subgroup check failed +000000000000000000000000000000000c9856c54b638559ce67cffb3e784b9649bbeabe135c89ecb8108341a16ef3c5ac49e9243144792a4f9371f2d6f8f6b6000000000000000000000000000000000e17a67cdee23e13c95e5b951c5f51703660ff614fbba363e5a73ea74b86af6893ae90a929df3d7e2af8852dbad77a01000000000000000000000000000000000c01d2e1592a61cda87dab7fb2a45d7468a8ce56f74fd7c8d401e224b9610d675cbdc0d4719dd2dc10f47547bc641dd90000000000000000000000000000000002d57ac9ac9b4cd7a477e162965c763ec1d0c5752b478449839e0ebd7a1110374fe90aaa2006bd03f08f9242c0419e99000000000000000000000000000000000d50b11e1ea90ef8ef0f7a95ad41ce2cd30cf804e46a96762fadbc275ad513827e6e75b95968a00b42085aa89bb0839e000000000000000000000000000000001250e40358d42dd3a6aa2dc93d89010f2a7b33e5b426ffd7e6eeb9bc02f8f22fd6e91c4fae603f14ed682617dd503eda000000000000000000000000000000000c9856c54b638559ce67cffb3e784b9649bbeabe135c89ecb8108341a16ef3c5ac49e9243144792a4f9371f2d6f8f6b6000000000000000000000000000000000e17a67cdee23e13c95e5b951c5f51703660ff614fbba363e5a73ea74b86af6893ae90a929df3d7e2af8852dbad77a0100000000000000000000000000000000048dfa619f3f77c794d119ff97e04826b5bf49d71591b778b502205875b97b17c9c9d2ae95c8d7035e9d2ade10a511ff0000000000000000000000000000000002fe9b3108c8911b07e4ee52a8d4df17bebc8153f837665513ad5c8af53cd7387100204fafefc2febb2f5e18c9d958b10000000000000000000000000000000016c98a41fac6665657b00bfe9336942e7aa145bea3131224ffa35ec9b9cd4d629b4ceeca98a15ad07e03ffcf898f8a390000000000000000000000000000000011a0d16ccdf98beffdb0953c509261f18567a1656acdd895395b480ebf8843e7d3b965e2151c58e9b610e9e3b5491832,,,invalid point: subgroup check failed +000000000000000000000000000000000f4eebd0bb8233e020629f72258d3cec7fcd3c181fa913977a405ef7437f6fdc0ee34fe6a7e349730e695f383e4478ad00000000000000000000000000000000080577fec3a6cc706037b43cd39f4bace98191511cb26cc606c11659b63112b519123a00b62158ab7a24dfe086705b470000000000000000000000000000000011e8ecf1e341f0146c59a79a8428bb01d2399d3f87d90d057f63e6cb9837432154d17975f70df175a016735caf85120a0000000000000000000000000000000002a5bd53e4f4c5b9682e1af1f7e09dd305e7342d1688f62885b5e59f173a9fc731cec481559ad693030004a5fbd90a9d000000000000000000000000000000000f9601f95e12bf05c35deb204558d44a60fd630c05f4060b7bd9ff943946e8eab507422afe00a3e7706b8ed013f712c20000000000000000000000000000000003bf6fecc0c7414a69c2b48e2c16e88d988ea8ae9d8b59017ecb89394732a20e4321cb5e4fb071aec7d2736220a455370000000000000000000000000000000018fe22fe0b39f508823e2332712f988efcce291d93c416c544272e88cc0902d79e41b01af005feddaaef6c42a26c824700000000000000000000000000000000164fe8d2934cda6f0b863bb42d13f91c52a49706182f8d337d6a629da65113818d1c177508d6735cc86a6b3837ce49320000000000000000000000000000000011e8ecf1e341f0146c59a79a8428bb01d2399d3f87d90d057f63e6cb9837432154d17975f70df175a016735caf85120a0000000000000000000000000000000002a5bd53e4f4c5b9682e1af1f7e09dd305e7342d1688f62885b5e59f173a9fc731cec481559ad693030004a5fbd90a9d000000000000000000000000000000000f9601f95e12bf05c35deb204558d44a60fd630c05f4060b7bd9ff943946e8eab507422afe00a3e7706b8ed013f712c20000000000000000000000000000000003bf6fecc0c7414a69c2b48e2c16e88d988ea8ae9d8b59017ecb89394732a20e4321cb5e4fb071aec7d2736220a45537,,,invalid point: subgroup check failed +000000000000000000000000000000000d6e0830ba9839db89621518e1ed86e9d035d7fb03b18d8a615acd58ff5c8c3dbdcf1acfcb8a910e8d3d0da770057cde0000000000000000000000000000000018c38d6e458e22cdd381010568606d26770b9eaaeb38e02a80cd0a0d584577fca7b391bbabe902825a3338682f7d3173000000000000000000000000000000000e5d5bfbe5ab3da8c033663cc457cf69062e1de6bcda6420826301d4e5fb4c47a5c90432f15608aa50678ad083f618c700000000000000000000000000000000146cd56ad5d977fa6471f7c12ee3fd66dfbe4b276b846cf4a74619cfae4a5101e85d01db615e0e6d28a5eca7a92cd05d0000000000000000000000000000000010fa99a243f1de85f40bf6a08e3e9ed3e478562468f0975bb79b1b80c9eef8c433c18ccf6e5149eb99c21f74494eed6e0000000000000000000000000000000018504d4687cf9f055c5cf8360fda2cb2123ea3a3e9c8f58853a68063e60a7ba24f2d1c153090ba2e77156cbb5ded79d7000000000000000000000000000000000d6e0830ba9839db89621518e1ed86e9d035d7fb03b18d8a615acd58ff5c8c3dbdcf1acfcb8a910e8d3d0da770057cde0000000000000000000000000000000018c38d6e458e22cdd381010568606d26770b9eaaeb38e02a80cd0a0d584577fca7b391bbabe902825a3338682f7d31730000000000000000000000000000000016267be431a654019b3f02389fb2f2f307f3bb56590c3ff1924554b2ee6fbbb68381b5ba4a8668fc541dd7e3fe9afc9a000000000000000000000000000000000c41d1daa258be71001babb484d98501c9ea015aad96e398aa6015b9ef618f6a56a45d45383dc34c70ca05242490ae18000000000000000000000000000000000dadc282d8cc0c066f28881cf440fb5a621449dc16488d02e34492fe8af53fd1749886fe6df2e377190e4043d6e3dd290000000000000000000000000000000018a30f1ae8927af27147ee5ea3c7aa848b0e303d16018fc2c3ca4bd088ec5ad3a808e7699ca009a4bf6f5b707edc1fd8,,,invalid point: subgroup check failed +0000000000000000000000000000000009f71faeb58c4d442272ea0116a03f106008ed68030bce1bc53a3964ec4f9758f508735c8c17017645ccb77124b46cb40000000000000000000000000000000016a2ea9e548342538ccfdae6806ec9ce0b7b892875155f898017929d7105001e8de041bfcab7398cccd060dcee3b6e84000000000000000000000000000000000579462f03502615d26d76e05c758a7f835e4e70f1adfdec8c7ef26580544326d66ba4e23be3c078e1f187ab498ab9dc0000000000000000000000000000000000d386d0af32f630bdf6c13ee82fd35e42961ec4b11ee8fa196d69bed775b8ecfe74409693c531631aa716957e5fe6d7000000000000000000000000000000000ce8a020608c1e7d70d7a03d11b84f48d6b3b77c5836b7c914627f3a84d3d0b3de513029c1379b20ee38a19928e57f44000000000000000000000000000000000dd10882001be7fa52ff21f1a0adab02e688539f098901fe515b61fbdbca02c4146f6c17f7ad7cf59f5e8acd85da60b000000000000000000000000000000000128e019ff92e7171d3c791bd4cf75b0f47c2a9d8722b4a8279f1178db6dddf8a4c00083a935168518a1c26a56b23624f0000000000000000000000000000000008d0c5f3300e73682f4756e6ff1d6722dde576beb587301ded34427d6935e59e76cc8a8cb0ea5f659db9ad5435851e53000000000000000000000000000000000579462f03502615d26d76e05c758a7f835e4e70f1adfdec8c7ef26580544326d66ba4e23be3c078e1f187ab498ab9dc0000000000000000000000000000000000d386d0af32f630bdf6c13ee82fd35e42961ec4b11ee8fa196d69bed775b8ecfe74409693c531631aa716957e5fe6d7000000000000000000000000000000000ce8a020608c1e7d70d7a03d11b84f48d6b3b77c5836b7c914627f3a84d3d0b3de513029c1379b20ee38a19928e57f44000000000000000000000000000000000dd10882001be7fa52ff21f1a0adab02e688539f098901fe515b61fbdbca02c4146f6c17f7ad7cf59f5e8acd85da60b0,,,invalid point: subgroup check failed +00000000000000000000000000000000167a40d69e2d2e5683ec69af7b226c5456d05241d9c9eb24e988ee2dba845eab361a956cdea64cf971dafea08f0056260000000000000000000000000000000014e5b8ae5032a924da081d3063f31889da110d00330903c6f988684b7d77b7b1bdcbefbf70941d0eb5a34bcb010a3bf200000000000000000000000000000000043a000741027fbd191e2399b7cb5fdb4db3728d81d8b9d25362e8a1d397ec99d1b2339a3a511d0969e7e727f98d4163000000000000000000000000000000000cbda70eab332bf962d123aaf08b8b96680055f1946dd5fdb8818fbb330b816d83062ffaa79e18f1f4f6d53deda53cf200000000000000000000000000000000160a7048e508da288270e8ac5793e9461eaa282b85ce5350b6a661209efa6699874aae71515dc4265125d490a5771ff900000000000000000000000000000000041aa7292f258125d729c1761a3a6f7979a7a92ff179be678ebe301de3ffe12e4a863becbfb2bd0067e42aefc5f5617200000000000000000000000000000000167a40d69e2d2e5683ec69af7b226c5456d05241d9c9eb24e988ee2dba845eab361a956cdea64cf971dafea08f0056260000000000000000000000000000000014e5b8ae5032a924da081d3063f31889da110d00330903c6f988684b7d77b7b1bdcbefbf70941d0eb5a34bcb010a3bf200000000000000000000000000000000158feb06ab69f5da37037c554aa8b4b511e9de7e13a08c2f9a8899f5a504b191195e4de1ab7d937913f60e24a1b3d3f8000000000000000000000000000000000beeea216d85a767af2facfa7fa0399c095a23b7a974ddc3d36b7e79822d7691e53f85c976b8cc948e155f196b7f168c0000000000000000000000000000000009802e94ad5cd6b071a0911cbbc1de29a79a5a4fc145cc79db03119c3c8dac88fa3740bdb35b0b0e6e34127ee1bb081c0000000000000000000000000000000004599d1e0bfe642ff275fbf1dc86bbf83b87c241de09570183faf4e2c1cefc6b8b2354aa2be4aa9f69d6d61546d3a685,,,invalid point: subgroup check failed +000000000000000000000000000000000130761fb4d4720b8e69b849e1472f15c24cf909920c598aaecd34c5b420a1989a6ea95f89c362a61e4a11f88982f9a6000000000000000000000000000000000d707b24e8720ecd4a14d9f658060303d233253caa63bafd0f475b2985fcebd326924c936a9d66b21b9a75085aaeb54e0000000000000000000000000000000009faa74f66ec0384f0458893c0026f73688c764e8df9ce056a88a2ed0b84ed8f88d1b683443a3269a3db838f8aeb808a000000000000000000000000000000000949c4be2708c1aac86aff39290ab6a8e0f332e7a098bbd64227a175473d9dfe136e07548b282f69a94a15e2c32dada10000000000000000000000000000000014f2c7c7da781e2f50803e3a948381c3c439b127949f79824df1e5722c206efccd6c0ec5dd75ef63d8b1fa301c83356900000000000000000000000000000000176753460d241f38aff41bafdad51688ab0dc9a5fb3643977c7b9d282ad4532fcca1e725715227780ec28bf1c32bbc1d0000000000000000000000000000000010ad2405965f283c845edf92cf34508c0ca625816690d739fec9776d261784a946e083112d11c0776edd04403eaa5b820000000000000000000000000000000007e400896eaaddf797643b05a53f612f73737a2c438762d3f6216d53761f28bc88f402a4f02f36d26bbb431616b1b5690000000000000000000000000000000009faa74f66ec0384f0458893c0026f73688c764e8df9ce056a88a2ed0b84ed8f88d1b683443a3269a3db838f8aeb808a000000000000000000000000000000000949c4be2708c1aac86aff39290ab6a8e0f332e7a098bbd64227a175473d9dfe136e07548b282f69a94a15e2c32dada10000000000000000000000000000000014f2c7c7da781e2f50803e3a948381c3c439b127949f79824df1e5722c206efccd6c0ec5dd75ef63d8b1fa301c83356900000000000000000000000000000000176753460d241f38aff41bafdad51688ab0dc9a5fb3643977c7b9d282ad4532fcca1e725715227780ec28bf1c32bbc1d,,,invalid point: subgroup check failed +000000000000000000000000000000000220d192e0c635f05870113aac899f996622cd21ad251fb4c300a0ae0051dfd93b0b622f54e149fc4e5bf280ef31b0c6000000000000000000000000000000000dcfd7def563a0937b5173d20f830e6a2350a9d6f1b8a2193e5f755142e850bb7f95519ca187dfe735c197c21688528c0000000000000000000000000000000002479a989dbf27141bd9f467447218dfa6ef60781a7231f089d5f1f1d8dca2ce9606a75c09f63f37f9cc1ee61dceb32500000000000000000000000000000000037c2f1b96170f6847138232bac663e4940bca602717c877f58ff7f5259778246085d499ec6bbeaade18f738df333cc700000000000000000000000000000000115a30e7b71e48efc7166b9a8d2e1ecec6c6e4c058065a18277ca547cf1ebc193e635eb9b65d14c9c94ebde3c83a55dc000000000000000000000000000000000b68916150436f74c61b071a339909f78701d1f3045f7201f076991d7447570fd90887126ca54d96c1310e59ad489190000000000000000000000000000000000220d192e0c635f05870113aac899f996622cd21ad251fb4c300a0ae0051dfd93b0b622f54e149fc4e5bf280ef31b0c6000000000000000000000000000000000dcfd7def563a0937b5173d20f830e6a2350a9d6f1b8a2193e5f755142e850bb7f95519ca187dfe735c197c21688528c00000000000000000000000000000000147610c1075d625dc36388a2bd451ad2c15eae8cbd30393bb9fa30fc233b29a0f5483579752a748bc0f5ca9c90875e0e0000000000000000000000000000000003dff69511f2a53e859b6769ef4c257acf31062eb72f8668f57da60f225ac052badef9df25d43148b4d3baa64c29eccc0000000000000000000000000000000006d2a71dd9c1b302e22c4cecd14dc385e068e63e28e167c060de3ceac8410461d83f961c9292cad30afc0084855ebf1d000000000000000000000000000000000890ce53931aa18e42f00379b40c8e205582f71707a67761acced851fc91755505ae960951dec4ef46353b66e0b928c1,,,invalid point: subgroup check failed +00000000000000000000000000000000050ae21faa31371d791e3f6163f1c18c577367badb337aa6fa7c8214ec58bacfb24300a81d8226e81d7f47730c734386000000000000000000000000000000000987a0c7abd7c72140bcdba9cf171389ea7971493187c567b0970f05d129b4202124d72bd01038bc77023171de379762000000000000000000000000000000000d4b71595321913e94b9e6ee6ae2391cd5037e8b55e61fd96c745539bcb4bc4fcbab678749f6d47fd2c95001da4715f70000000000000000000000000000000005436e1be9029a2f7cfac51a305fbb7e760a9171c79a5bfce6b161493fb2855df09b3345ddbc8b04318c6b2e0225b74a000000000000000000000000000000000b8f317d36c50c8d039ad137f7d9adbefb3fc147a9cfd6cceb02c75b95fe307c3d6f673a216484f3211f045c2ba9012c000000000000000000000000000000000156bc67e17c8eaa905fb7d9f3f251cc81eeecc86de791c8be30c34aea896755fe2bac28cdb035222afe6237614878c300000000000000000000000000000000065856fe1dcbef934cef47b177ecb7df76cc8796624400d5c0518aa9438bcadf397234808d099bed89ab674560ffbb1800000000000000000000000000000000071b2ff64379ed3e20cda000602c3504616dd673aebbe7690e797d6428ecfbdb29f11138169f3462dffd319cad68b96e000000000000000000000000000000000d4b71595321913e94b9e6ee6ae2391cd5037e8b55e61fd96c745539bcb4bc4fcbab678749f6d47fd2c95001da4715f70000000000000000000000000000000005436e1be9029a2f7cfac51a305fbb7e760a9171c79a5bfce6b161493fb2855df09b3345ddbc8b04318c6b2e0225b74a000000000000000000000000000000000b8f317d36c50c8d039ad137f7d9adbefb3fc147a9cfd6cceb02c75b95fe307c3d6f673a216484f3211f045c2ba9012c000000000000000000000000000000000156bc67e17c8eaa905fb7d9f3f251cc81eeecc86de791c8be30c34aea896755fe2bac28cdb035222afe6237614878c3,,,invalid point: subgroup check failed +000000000000000000000000000000000e4bfbc392b1de6b17a32387d694f634cb484be4531f425d72833a30ed5aa73a958d5081b30cf98484762ba51542f87b0000000000000000000000000000000010e6acae9df1b5567854f4bbca0ab07c6a0e726bc6ec7a1d2ce8b04e1677776d0ee2642950db040365d581a52a41832300000000000000000000000000000000036a2ac8ecf17fc72ed792c0d8939060117aa0d6c13854fdcf56ed0d1ed3b39da9a67aadfdff484850f9cdf439495712000000000000000000000000000000000a1bd875b74e1ebec19591eb137e68ca7f0db1b3056d341b6bad28c3f45e87688e73fe28e9ef44c7d494442ee0b9472e0000000000000000000000000000000002e26e5a36c008bddc431048d999b7fb44961bb4d931b2dec0cb1d1b0987587f44cd31d429a6cef05d3c060ac828ba7d00000000000000000000000000000000050640087ed6c04ffed759f63e211ff5880c8b06933c1e812954a7a4240a9c644175c4ca3048a4ed68d034f6cbdcf175000000000000000000000000000000000e4bfbc392b1de6b17a32387d694f634cb484be4531f425d72833a30ed5aa73a958d5081b30cf98484762ba51542f87b0000000000000000000000000000000010e6acae9df1b5567854f4bbca0ab07c6a0e726bc6ec7a1d2ce8b04e1677776d0ee2642950db040365d581a52a4183230000000000000000000000000000000003fea73d9ecfb879ea601865d3279ef9b271fdeb14e1094745d5718bf214f1fba99245746716bbf012e2ccff5e22887d0000000000000000000000000000000011b1aa3049157abfa01f3bef33583635873d4bc66801785f41ca51b9a11d95b49a8bbaa543fbe68db86c3560ae258954000000000000000000000000000000001740661de7e1b6e1eff626acc4e37c877d00a0ceb8008d99e76a1dfe826b4dd0ee69b150535caa20386d644394dcf6b800000000000000000000000000000000090c0bc61286187a58f2cf49e2ce6f49d721b4146d973dd7716db271da770450dcba33b7aae37d6842a43063c88704e8,,,invalid point: subgroup check failed +0000000000000000000000000000000002cd3682c1f87aac1ea91b3f4ac577f0c9531c7702864c444b4163435b4770c9a2ebf94fae2d45a63adecc314d9d536400000000000000000000000000000000103a1eaebc0ee53e21d5bda78bd912f20cc28a13e5e209e062a52ddec3453fa9c364a6b403a68d9db8a40a07755ee1eb00000000000000000000000000000000024494aab30849df790185a4f939954b724c387c9a366fbe833b628577654174f705d05e7d7dbcd29b8873aecd55df0b000000000000000000000000000000000863054fe3e4838d2caec7103e3d0453e86a17fff0dfdb84dd819f31756032e9e97b7be89b636e5e0b642718f6da217b0000000000000000000000000000000015c8bb4fcb6d9cf941b722136d8d76d847fd6d5c643f4c0049c9746e76e49726fd463ce7899f4df66d04e5d48e523e6a000000000000000000000000000000000f101bea4e1bf610d2782ede91da95eb2b0be9ce60485465b9e94cbb9530b416c4394862f0ba7ee8067bb48e94c07c530000000000000000000000000000000001b32ce5c51441e1abbbcc0b6af95380f2de24876ba377ebea44fede8886acbe23aa18681bb08130252bc04193939853000000000000000000000000000000000e5d718c9980140b41fb971fe596070982bf92937df77ef44040ffc27162bb443a60f5c64411ffefc24524ff32fa17ff00000000000000000000000000000000024494aab30849df790185a4f939954b724c387c9a366fbe833b628577654174f705d05e7d7dbcd29b8873aecd55df0b000000000000000000000000000000000863054fe3e4838d2caec7103e3d0453e86a17fff0dfdb84dd819f31756032e9e97b7be89b636e5e0b642718f6da217b0000000000000000000000000000000015c8bb4fcb6d9cf941b722136d8d76d847fd6d5c643f4c0049c9746e76e49726fd463ce7899f4df66d04e5d48e523e6a000000000000000000000000000000000f101bea4e1bf610d2782ede91da95eb2b0be9ce60485465b9e94cbb9530b416c4394862f0ba7ee8067bb48e94c07c53,,,invalid point: subgroup check failed +0000000000000000000000000000000006e340bc57495a5c01bd44eb6dee60e94feadd69bd0274e7c9755f7b0e7b4e59eb70a2cd7e4da9d1a5f60d93a5df19080000000000000000000000000000000013d7c393a2191ac8d13a0743fecd768a7e15d279be409ccea1d58ba39e91f592b425955ddfc8443861a2899de02cd0fc000000000000000000000000000000000369067d9012509bbc75333fcfa37cd42dc3d6331a55b4720f9efb937916692ed7c7cf4739142ea13fb9130e9dae92fa0000000000000000000000000000000005306d73dd33e26ece5d8cf2ea8d7e25976f7b95dc7091420c2e91b1d0b2ef96db69a364c3cdc3b24a49ec5e307553490000000000000000000000000000000008a9fe15ea4e16e675c42c25b29655683844949b9aff4448f0b79ff08ec2a6526cad973f80123943b863ba9f30b45666000000000000000000000000000000001754caabe499e1ad04ae65d696507096939dc826578db55738e5024601eb052a9fc15f20b601253533847f79a5f6a6ae0000000000000000000000000000000006e340bc57495a5c01bd44eb6dee60e94feadd69bd0274e7c9755f7b0e7b4e59eb70a2cd7e4da9d1a5f60d93a5df19080000000000000000000000000000000013d7c393a2191ac8d13a0743fecd768a7e15d279be409ccea1d58ba39e91f592b425955ddfc8443861a2899de02cd0fc000000000000000000000000000000000ddc7df1bb36d54beb969a244a67c3ae87cab2eddce9397869421999497ab00a3e0ee29e384f3182b52158304790b05c0000000000000000000000000000000006f527de4412dd61845ab1e4536a114c7ac2bee2f3d22c16c660b3189b1666849f70462d6d650846331dc630dfaa075e0000000000000000000000000000000015aae1fad9e6cb3adc8bd93c432c9321a9d2f7cb961671c8e517da7024d1e35b519a2cc662d795173441479fa35f2e830000000000000000000000000000000008485999f40a4a363ddb3da273f7522344f284fb5bcee383a590c7c1287baa10f21312428d6818eebc96ec59d716fae1,,,invalid point: subgroup check failed +0000000000000000000000000000000015845de9692590d7fbf4187b50f4b2d067983b0a2209ed2bc6d60914be106decc5dfefba112baaf98ba3bf9e4d102b660000000000000000000000000000000004f2ca0858d056f769bc8e6ebf7cca745ca647ba497940b25b31c0541297626cd26ac10f8ae8476b5c868a95226da290000000000000000000000000000000000b1374a47c7c1c833f3856b0fe5ecaefaf2a8f96148eb540482288b56897d9e7e4269ea3a2c3742993b751bd9e484f2d000000000000000000000000000000000bc7fadac70d0a401e61683562cc83ffe107924ba1788bb6e06b0c60f22de0d93b10b63afcca343cad0572209b03b12b000000000000000000000000000000000c22c75d826d2700a8bad4e9c271d8b505ab2911dc257909c69dfdde2bcf332e5f13592eccabf578f48f6078550c1e9c00000000000000000000000000000000057db54159019d1e291131d28a936ac1337f2884f0c4bfc4d8adaa75bc0edf8b0f3030725e33a3d1a2e7e9ea39512fc70000000000000000000000000000000000232940188006769a382a4958383aa6702b2cbfb9c2907a989938ac618f23e241767b021e8ae11c23617ab393d4f85a0000000000000000000000000000000016a672061fe76ed943e36b2d6fa4aadf579db96eba5e4c60cda2884ddcbb0f37668638a3167d8858cd296917eaeff8e0000000000000000000000000000000000b1374a47c7c1c833f3856b0fe5ecaefaf2a8f96148eb540482288b56897d9e7e4269ea3a2c3742993b751bd9e484f2d000000000000000000000000000000000bc7fadac70d0a401e61683562cc83ffe107924ba1788bb6e06b0c60f22de0d93b10b63afcca343cad0572209b03b12b000000000000000000000000000000000c22c75d826d2700a8bad4e9c271d8b505ab2911dc257909c69dfdde2bcf332e5f13592eccabf578f48f6078550c1e9c00000000000000000000000000000000057db54159019d1e291131d28a936ac1337f2884f0c4bfc4d8adaa75bc0edf8b0f3030725e33a3d1a2e7e9ea39512fc7,,,invalid point: subgroup check failed +0000000000000000000000000000000018611593c7663a36330e0640bc912221a17d0ec9d2a250f1701303249655c7088bdc07b024878a260753d1dde306fd4900000000000000000000000000000000069d26308af5907c15532f31dca8c884b9e54a0da5e428c66fd79d980774cca106e2ccf3f93fe3e01669c594b9770a800000000000000000000000000000000001a38d296c4b7b8351164b935b915c08caf6af9d5233ecfe609e4ed855589bdbc9fb0adc55bb5cc6a2526bd82ab9287f00000000000000000000000000000000184ac28f62c7101bec49879af5da794740f9ba99afab4fcb576fa1149f3b701079915934c624f022b0d3213adc884c2c0000000000000000000000000000000004f64835227f459e76aae3397dfe53eddb1e97c8afd8beaba09382fe79ab378c3f03d6962dfee823c426cab426e51d2d000000000000000000000000000000000577263fd875f6388b723f6abc78aa3b0cc2e6b0ab53beb59286e30d1e982114c161fc0ef490bb1347fd8a3f3cba72710000000000000000000000000000000018611593c7663a36330e0640bc912221a17d0ec9d2a250f1701303249655c7088bdc07b024878a260753d1dde306fd4900000000000000000000000000000000069d26308af5907c15532f31dca8c884b9e54a0da5e428c66fd79d980774cca106e2ccf3f93fe3e01669c594b9770a800000000000000000000000000000000000c072a812b26927b5a672359032e71597002d8c45572db6c575e25c81181a522ca304867b1bcb583c58b2ad6bb1695d0000000000000000000000000000000003c4f5f548f50e835f402105cbd315081e0e8773dd91f3874687ace6fd5ffa66b6ebf6dac4580357b870f8835ed15cdd000000000000000000000000000000000f039e2e73334386b28ed4cc52db09b69c942c0c87f81328a9b7fbe8553eed48a60224ae9d52baf4f62a3fb0d58d451d000000000000000000000000000000001974da8867204f048b81d0c7a90d224dc5b87f3c4f47d1dfb09afc292430bf51d69e3538fdd13ca0749dee76c2ba9b17,,,invalid point: subgroup check failed +000000000000000000000000000000000754f3a9ea93a01fa244ef6badeac64fbb4dc81d3489c4195a01148e268e2af46011e6c593b4b873fa1470eecc6f79ef0000000000000000000000000000000018043830aa55a8c7efd5dc246622c71bbb4bc6a5d69cf594f46f62d8c3e2a5d4ba1d3990b5445f8b446e404a00259a8a000000000000000000000000000000000e49e94cfa35d8ade2b76865cc8be04737d00b48b195078c8085cbe782232a544cdb548373bd8ad0282674ba5c96fe0700000000000000000000000000000000047d59661f095c41bcc27da5f260f13a3fce334bba216b45df548894bdebc691fe779ccd63d99a9872973ab165a90c01000000000000000000000000000000000772e9a9c22bc7352fdf74915bc464de99ecd96420ef1af6e8bd5a05d73fff89c78e28eb340d4967e906f28afe1320490000000000000000000000000000000018bccff27bf9d7cb2159b9f2d1faabbf8591b53ca8e67e661d9f44f6dba6296e3e46ac32c50128bb5fb076cb8f214e27000000000000000000000000000000000252149178c606d2d6c0311e9f4a66cf348869efc09ec887cf99088ec754c01551796aaf168dc1a09cb741ab3c9d6891000000000000000000000000000000000db7baeeb5acfb22d680e032965a4d417b2f2f6717d3667d786e006327140c1288ff44842142eb1d2730b3be64fcf420000000000000000000000000000000000e49e94cfa35d8ade2b76865cc8be04737d00b48b195078c8085cbe782232a544cdb548373bd8ad0282674ba5c96fe0700000000000000000000000000000000047d59661f095c41bcc27da5f260f13a3fce334bba216b45df548894bdebc691fe779ccd63d99a9872973ab165a90c01000000000000000000000000000000000772e9a9c22bc7352fdf74915bc464de99ecd96420ef1af6e8bd5a05d73fff89c78e28eb340d4967e906f28afe1320490000000000000000000000000000000018bccff27bf9d7cb2159b9f2d1faabbf8591b53ca8e67e661d9f44f6dba6296e3e46ac32c50128bb5fb076cb8f214e27,,,invalid point: subgroup check failed +0000000000000000000000000000000003455a16c1cf9a408bf17cbb0b8ec2a5f24ba41d5b8a06a10750797f3371bcf361d3b6902d73949df3a24f5a8b9977c10000000000000000000000000000000016480e13653604d05f025b8264fb35a2cf06dc6a90ec7751ed80ee81cd064864655d133ce398e293c289a572dd98605e0000000000000000000000000000000015015aeb1965917cb5b55092d7eeb54915e21fbd5b9a62530b3dd5b8ae07d6f491df46e1987f565223a83cbc90f91735000000000000000000000000000000000658266a6bb01958b791b288ea9f5e138316724398218be522bf816ee5b5b34ef4acc83b82959f52792af6940816bb41000000000000000000000000000000000bf8d18b55a57e67c76882f1a1ad845480196f28556ef569a6a6054426bfa39459ac030b594201be76968cc33c301dd4000000000000000000000000000000000fd8b264f9bd71e00e3987cd221d2e9fbbee34ddcc5c563f02dd150451050bd20b3bd3a6ce1284fb0ebff0c6c1318fa10000000000000000000000000000000003455a16c1cf9a408bf17cbb0b8ec2a5f24ba41d5b8a06a10750797f3371bcf361d3b6902d73949df3a24f5a8b9977c10000000000000000000000000000000016480e13653604d05f025b8264fb35a2cf06dc6a90ec7751ed80ee81cd064864655d133ce398e293c289a572dd98605e000000000000000000000000000000000c5c8e759f71292c8b25dca51bfd40daec58d2d2befe991b27993ae32489b3ef70c0c3f873b3f47ffb013fd31732f763000000000000000000000000000000000a78f4e402668544cada859953182f14421c54446c264312daa5f27cb18a3955a277e5620b0f28f4f9bf233c49f3341f000000000000000000000000000000000e27d9b1bf12c01ab05fa5ed5b2e70444c0582aa5b430d0e10feb69dcddddadeec88c024ec87e23737ec1385461edaad00000000000000000000000000000000065984e81590e368aa6de051129761e94ca218df58ec0132ec22aa7d4128b9ace20e7da35c56a674ed1031d202e9f313,,,invalid point: subgroup check failed +0000000000000000000000000000000005a54ee5e3dc05c38ade7a42c71baf5a1467938f97c0cdf0742441cd339f22542b1ca6cd215d385b3fd6ba74ec996a520000000000000000000000000000000005f63d18f8bbc1c7b119ee0d58b688477129b2558be0084865297fe119224aec83b3633a646a3d423029cb52f0294aa20000000000000000000000000000000015e2547357626e6160105e5254d8deb80155c42d7b0c13bbe350c3395317913ccea5db61494aa2634857a8c83baa42a0000000000000000000000000000000000629ebc8d1798e2f9280493d2de7c159c558156782487d307ba358fd2bf696c29518d6cf2f975509bdefa89033f1cfa20000000000000000000000000000000011e3f568b9d1793519d5a8cd3bac7cf35091665f981ecb7a9e942f630c5f18fe7cd9747ff539816993b70573410410ac000000000000000000000000000000000889dedf6f29ed9959d8eb7276ae6122fec5a1bfae72c793902e1e3062be444b89a95129dd59f74ea0849b5a2aefd48b000000000000000000000000000000001963e29f92f6f72be2afa4635221b0d2f6afe9ada4582bd7ca4b77eb77fc4503578f38fb49aa1838751db8cf1ca0b0cd0000000000000000000000000000000009856a48f12966554afbcde1971499ee3ae40c9c5c3aef13bc415fddb97545ed84d5f50d2a26b9c16c4403a487dca6140000000000000000000000000000000015e2547357626e6160105e5254d8deb80155c42d7b0c13bbe350c3395317913ccea5db61494aa2634857a8c83baa42a0000000000000000000000000000000000629ebc8d1798e2f9280493d2de7c159c558156782487d307ba358fd2bf696c29518d6cf2f975509bdefa89033f1cfa20000000000000000000000000000000011e3f568b9d1793519d5a8cd3bac7cf35091665f981ecb7a9e942f630c5f18fe7cd9747ff539816993b70573410410ac000000000000000000000000000000000889dedf6f29ed9959d8eb7276ae6122fec5a1bfae72c793902e1e3062be444b89a95129dd59f74ea0849b5a2aefd48b,,,invalid point: subgroup check failed +0000000000000000000000000000000010df7793a66234599791ae07db9953bba83492389b150a05063105c191c6f32559b9533f1875ed154fa813586e84d0c40000000000000000000000000000000018de32e27e5c97b8b39380dde927e2143bca5d5591d770b2a7a77d7b59bdd533f04c41aef3a5a60df55ed90742869b7400000000000000000000000000000000182f0aa672674c27d8f3fbcc0fc7c1608c01188cf5c28b8ac08d6f99a4e3e214aa3ba61a19607b513b4d01f1d4424a990000000000000000000000000000000000b47be5b5249eab6f67aca9c9349d4a83956550cd21856485132c26e3be3ca133050d79507e2e8cafb67b44a7f4b4da00000000000000000000000000000000060efe7e7a4ca52063b49f6c839666deebe2e8e563de18b210fb477e86420aefa38f89e926cc41334e80f4d47d810d97000000000000000000000000000000000c2243c2a34286b146462a643979a72e75f7ff31f9f043164a5514d3e5da8b0cd891e97af2dd3d6c6f3584b390e5faf60000000000000000000000000000000010df7793a66234599791ae07db9953bba83492389b150a05063105c191c6f32559b9533f1875ed154fa813586e84d0c40000000000000000000000000000000018de32e27e5c97b8b39380dde927e2143bca5d5591d770b2a7a77d7b59bdd533f04c41aef3a5a60df55ed90742869b740000000000000000000000000000000015f7e6dbb904f4f1fbef282667d77c846c0dac6d78f4daaf32123b4326f1c6e42b15cb06ed7b3b46c8877e684ca7f9de00000000000000000000000000000000004a87f0ef3285709a3ded240f529e8e10991a82c7fb40de0bd256a9fafdbc212eabb8121f52c6bf67a45bf36246921c00000000000000000000000000000000156a1d58dd64734149b1e37b1b69fa4ea4452c40d2d041f5cf3de3adadf3bfdf433626fb96c46f9104b1c16114108599000000000000000000000000000000000fc3a0e58ed3fb583e2e1c3b0db5fac2a6d75694aa3d0732243b5a75688fa0ffb5fc9023545b9585df224ee9f6c5d171,,,invalid point: subgroup check failed +000000000000000000000000000000001639642196e9d6d720e17ace198232d1c0a7c05660c2766b9d28147504308ee48d949755ffcd1c95e024fa299657c8d10000000000000000000000000000000017a5975410b3a80e339b200ec63d7b7d550514653726e3ae6a97a383545118bd4221bba3e27922a826057b244ad025f30000000000000000000000000000000017aa7a3f1ebbdec6abe12abea12ef50a3daabbf96a5f2ebfb517885f0b7aba1e927c682b15521529cb9e1f87c59be99e0000000000000000000000000000000016e23f7effbb9dd34ec1f6974115e7f0d23cc4553d86e6d61a0c98f47d09510e06b3f987c5bcf4bc30e20ae9684da74e000000000000000000000000000000000f3905dd4f99cfcfa6152db53106b4d1f6e24518a822da9388d8ca1dd654a4b8315697328571691f105d1abe9aad3dae0000000000000000000000000000000006bfd10d33df9326a55b35aa6d2bc3e831d4c3b5959aaa35613156e5e19343b74e34ed2670c43ba1a45cd3d91f055c9a000000000000000000000000000000000024c53fb66f77329f70394626073ae298c6aaba115aa6af7bdaf3d2fb74a07441d46eeb398feec036727e86891db2030000000000000000000000000000000016b96c27d4342c47caafa584ec9847c79870eaebcce158535d8da95d7a847ecdc5057425fb3dd862303d1ac03162317e0000000000000000000000000000000017aa7a3f1ebbdec6abe12abea12ef50a3daabbf96a5f2ebfb517885f0b7aba1e927c682b15521529cb9e1f87c59be99e0000000000000000000000000000000016e23f7effbb9dd34ec1f6974115e7f0d23cc4553d86e6d61a0c98f47d09510e06b3f987c5bcf4bc30e20ae9684da74e000000000000000000000000000000000f3905dd4f99cfcfa6152db53106b4d1f6e24518a822da9388d8ca1dd654a4b8315697328571691f105d1abe9aad3dae0000000000000000000000000000000006bfd10d33df9326a55b35aa6d2bc3e831d4c3b5959aaa35613156e5e19343b74e34ed2670c43ba1a45cd3d91f055c9a,,,invalid point: subgroup check failed +000000000000000000000000000000000680d1062d24bb96b09d9dc9791364b5138e7c36c163589f919354101459de2fa76440616351d1d9bcd961673b106684000000000000000000000000000000000ca650f50b670befbf16d65b486e5c98dea6857862cf23d7bdd2dee2abc0855273495b047431ed03bb1c72b5403c2a4e0000000000000000000000000000000015b2586a23d909e6fd7ef6e58595817bec1389faed80db6d59db219435e7fb1b6492178a849c12bf6418341529d141330000000000000000000000000000000013ee3539c49e0c26e78f46c67b1e3993eed56c72dda43936b419e1340a3aa223ca09a2dca3ca56f2f9578b4a3f885aa00000000000000000000000000000000018e5fd242eca2314b3ade4a1e913177a499d72b539907839c5025b7de69efa24b08b3eb1e85fd05724db82b29edac344000000000000000000000000000000000478706e91d6213e4d4fd9a6c5051c88d86c7271aed7c74ef3b43e904f8ccfe4108f94660807316e8f1eabb85b734d50000000000000000000000000000000000680d1062d24bb96b09d9dc9791364b5138e7c36c163589f919354101459de2fa76440616351d1d9bcd961673b106684000000000000000000000000000000000ca650f50b670befbf16d65b486e5c98dea6857862cf23d7bdd2dee2abc0855273495b047431ed03bb1c72b5403c2a4e000000000000000000000000000000001600e44d53c706898736f5cccab585af5d04f7da91cad6f97b991b51adbc22ce27744f12c0a24804b6fc3dcc53011a59000000000000000000000000000000000751b090922b29f5c299340b12a56a77fd9c32f27995a59cd032cd09ead834d9faf5e151fbf7a0d810738de1beba5b4100000000000000000000000000000000114e35fcef45e87312a90fca21fef50c46b8a0f114df5c67ac9872ccadf858f319977138f03279ddd1edcab4602838eb000000000000000000000000000000000145c6cd707efd8d271dda5b9af26173e337a169c01b28a44f5d4ad06b125a05e867f0b1f873bbc048ea6cec06967c33,,,invalid point: subgroup check failed +000000000000000000000000000000000d6427dedfdcd624c896ca8e1ef717e212985ae23a4f830ee466c75b37ea2e994e7653b9717928f1be4583aae73f70040000000000000000000000000000000017be03dd7c9c14000aaec774812a8d8bc4aa2f1ecca9a894fd1385864b28a38091d3fb5706ee7c36086c7d50e35eb5b9000000000000000000000000000000000ce359fe7d997e151b94af2f5e167aa4834caf5a07ff056fe049d4b2c2780b35e8ecf9426444da4725a3e66de6691d960000000000000000000000000000000004c7ff987f866ff3919fb4769cc704928af09406c8f5a39e6fdcde5f4ef8a188cff406f853261bd3abd0f67c6cad1f3f000000000000000000000000000000000914584031ca57b9b0bcc35fbe76d967aee164b5eeeaa5e29c02901194fb0f88f5a249040c37ab47a715d34b2329a2b30000000000000000000000000000000007a42352ff521b8e6267a5d0dd1eadcb63db1fec68cff31bee1b2080b451ac731caf0efb86758b26b0c78df5cee8864800000000000000000000000000000000141d878adfaa6a3982cd0de93b4d64ba840a07c026ca443d6d4c2b6c36cf882e109d80df63b1626c112f9a89809788080000000000000000000000000000000005a5888d22a2f654a58d9a03c68d59cde9ab5e5356b2288033ba58fe2dbacf533e59344bdf30eed07698261d6269fc70000000000000000000000000000000000ce359fe7d997e151b94af2f5e167aa4834caf5a07ff056fe049d4b2c2780b35e8ecf9426444da4725a3e66de6691d960000000000000000000000000000000004c7ff987f866ff3919fb4769cc704928af09406c8f5a39e6fdcde5f4ef8a188cff406f853261bd3abd0f67c6cad1f3f000000000000000000000000000000000914584031ca57b9b0bcc35fbe76d967aee164b5eeeaa5e29c02901194fb0f88f5a249040c37ab47a715d34b2329a2b30000000000000000000000000000000007a42352ff521b8e6267a5d0dd1eadcb63db1fec68cff31bee1b2080b451ac731caf0efb86758b26b0c78df5cee88648,,,invalid point: subgroup check failed +000000000000000000000000000000000da87318eb51b90ca822bff1df4dbc040fb1d74129242d832e1096e813dec5d91f950f44bbb07980dcaaee3366f03a0c00000000000000000000000000000000157d5f5c8ad06af803b9362b22519a23def6dbb700db517c85a663bf1bef9665d6e81e9b02ccaac97f0940d223b83ac400000000000000000000000000000000176835484cf24c47b154b7c35877eaf5194e0e1d8f053842fb5ff8fa833dabebc887f3d34b825fe9cf2c374a2066124a000000000000000000000000000000000d31805157ecafb751536c484fd0c81664de9524a1420c969d54260dd5264bc5454a3234d1e5b090bbb8ee1066b685ee00000000000000000000000000000000196b4f58c12a7d7ac4d720cf9b6c44efdab88e06dad0023a01572cc2ba7bc0a4baf7fa45c06f04ff3d067ba191a84e6000000000000000000000000000000000038cb5d328ac9d1fab9c402b8ed9e72ccd462ca80075132f6be141457ec25a6c84a15e42b78cb64cf05ef18b003e4652000000000000000000000000000000000da87318eb51b90ca822bff1df4dbc040fb1d74129242d832e1096e813dec5d91f950f44bbb07980dcaaee3366f03a0c00000000000000000000000000000000157d5f5c8ad06af803b9362b22519a23def6dbb700db517c85a663bf1bef9665d6e81e9b02ccaac97f0940d223b83ac4000000000000000000000000000000000065c10395b93e8d04f5eb67d8e06e8649139d261ad8fbf5ff2c7d6d364c87837fa8e744834ec9341c714318195896770000000000000000000000000000000009fcc05ee486d42c3b2d480a309e4bb19563f7a27b4a10182ccb2d233ed42943ba472681d1f847249cbd11e4d79ea51f00000000000000000000000000000000053a516998d7c2b2bfa70349bf3f5e3967df827f65044634071450761ae8860e893824b1ae3f204b0ffbf8b091ddd277000000000000000000000000000000000d7cd03cc2cf97a164c7dd65b961df2866e82bf6fa979e56d0ca3f9638319772f56eab2e2134a33515dbcc137da8ec8e,,,invalid point: subgroup check failed +000000000000000000000000000000000be4cb58fd1dab8fccaa410e1c301be4fd2e7bae95cc1717d2aecaa705d717c67d7f20611dd1403d9350798642fa021d00000000000000000000000000000000075100bfbdb3f6271e5d8bcd4472580e56fd507b73aef3c3c5084d77e11a61b69bea0b85ba62885f7da36d223fca20760000000000000000000000000000000007649efeb3e0bee49b9adb13f8e5d7db1c06d7fde08a3f3082194153bf4b3615aff1450e47fae88ac93f55a389a319da0000000000000000000000000000000008334731582fb1b6125d7ee1da0124fe88f0c70a0a3f6188636976c31ba6a72beed927fe598386f328e4ae534729a57c0000000000000000000000000000000010b57d80fce5cdc90bc93b3bc7a1affadd19fb00aeec2ca9a6287bf4e40fb74616986a44f2f7d945f58501a965f37f3000000000000000000000000000000000180dcae46ee41bccd422b3cc2b34cad26f6816dd08ba51b2f12835e7439ae2d46933de28ac04bbcad68a188e7e90ee8d000000000000000000000000000000000a869358fd3d64849fd62e513db8fce1ab2618d3524acecbd04fef6b8c77703258cc557587f316cbb74bc5af5cb5551100000000000000000000000000000000059eb0e90e0910c24ee2145921ccee83707d8f89a188dcaae7d5c75b7113cacff92a2a030e67927bfec0da39f2bf65ed0000000000000000000000000000000007649efeb3e0bee49b9adb13f8e5d7db1c06d7fde08a3f3082194153bf4b3615aff1450e47fae88ac93f55a389a319da0000000000000000000000000000000008334731582fb1b6125d7ee1da0124fe88f0c70a0a3f6188636976c31ba6a72beed927fe598386f328e4ae534729a57c0000000000000000000000000000000010b57d80fce5cdc90bc93b3bc7a1affadd19fb00aeec2ca9a6287bf4e40fb74616986a44f2f7d945f58501a965f37f3000000000000000000000000000000000180dcae46ee41bccd422b3cc2b34cad26f6816dd08ba51b2f12835e7439ae2d46933de28ac04bbcad68a188e7e90ee8d,,,invalid point: subgroup check failed +0000000000000000000000000000000010eeac4d171a17d607dc544c559226db50d40193b435ce7528086eee21ec437e986c89dbe05931083768221e4bf06ede00000000000000000000000000000000140ef3af9f3dfe760e8c9dbe8d24abecfe611699ad337a97481a1553e9cabdb2e8a8cb48bc032bd02738cd26cd1388c300000000000000000000000000000000165bb8a97dd4b60ed7fa432f019f7f09a19c8e7a9b70e7370ae668d4597a3cf12c06fe062d880611e34ad9e586c193c00000000000000000000000000000000008c684f30de5c67f675e98400d854397e8cc6a139dca7e9ee179309a9617ce0ae034bfbd0faba7a2f9e7ee39de8770c900000000000000000000000000000000030e524c87a658e44df117fa0a877afcf8a4907979c932921a631a209dd58ddcaf693c7321c537e7e2a5adafe5761fa0000000000000000000000000000000000cd44b77f2d92706b3db5e374f13f6f12e3b030c6341d31e1c55d627e6af06a1b64498e590dbff08ee6354902263ff260000000000000000000000000000000010eeac4d171a17d607dc544c559226db50d40193b435ce7528086eee21ec437e986c89dbe05931083768221e4bf06ede00000000000000000000000000000000140ef3af9f3dfe760e8c9dbe8d24abecfe611699ad337a97481a1553e9cabdb2e8a8cb48bc032bd02738cd26cd1388c300000000000000000000000000000000062e54c21986cff68cd57903594d0e9f2f8348191aea6abc19e8b895e6ca59bf2eb731d10e426ad98726c51adc2d53b4000000000000000000000000000000000594d2a92e0b979c95daf6f78216be8c33ef23f0bebcda479326a1d63ec8234b283ee29fff7fccd441ab4ea6e17371a40000000000000000000000000000000019179f35ebf4ad9f8f9dd577b2db1ed58a988954b4bf4232301b713809be318e746f5b2bd663a21de755125f414bae9700000000000000000000000000000000172d8ad43611623865bff86df2bea58a02b7d6a2c41b85b98d6a2bd4f5e1bef25c978ac0bbb7f4746297c6e0e40b4e23,,,invalid point: subgroup check failed +00000000000000000000000000000000054dce4bc0b703b8957539c594d8d443fec161c3cb2f806f8eaa8158a665d84cfd551c0b7c0a08bede0cbeb780a6ca5b000000000000000000000000000000000cb3d3f9bbda28f8fe597907a76a8250567f4e481b6e9409e03ead60eab77153cf8f25ffcebb243a310094740cc2e2a9000000000000000000000000000000000a71dc159647864abd64655bf5ef956f21ad55529bdb49ac910ef628cc62a3d43b2b9ee26180232fa29f4b0e8371286b000000000000000000000000000000000c72d0fbe0a7604c9fab394b285ebf1c322c95013651bd21f88865e269eafa65e135ff90f5b249a794cef4e6cfcb56270000000000000000000000000000000019ac0043071372ba077bc8d91a4ac80fb5b8c8131981c4dfc698ba9ae50b506f93149eb73e4bc4f4ded94d6824473817000000000000000000000000000000000113368be2a531d2958d887c046fc26155436fc6a1ef44fdf16447163b7bc48fbb499506d8d5c8041d21116c4f22e685000000000000000000000000000000000b7244995b7819857f716288dc59eee9ba5ac7bfe010937ea0b67ee71388a3792e5b7feb6890a436db4f1b26df18b38c0000000000000000000000000000000009a0b73360bc0ca3b632c0116f21ffdaecf37e4d6c904c98d6225a08d7caadf5024ad6b457cf31b924118ea147ff10fb000000000000000000000000000000000a71dc159647864abd64655bf5ef956f21ad55529bdb49ac910ef628cc62a3d43b2b9ee26180232fa29f4b0e8371286b000000000000000000000000000000000c72d0fbe0a7604c9fab394b285ebf1c322c95013651bd21f88865e269eafa65e135ff90f5b249a794cef4e6cfcb56270000000000000000000000000000000019ac0043071372ba077bc8d91a4ac80fb5b8c8131981c4dfc698ba9ae50b506f93149eb73e4bc4f4ded94d6824473817000000000000000000000000000000000113368be2a531d2958d887c046fc26155436fc6a1ef44fdf16447163b7bc48fbb499506d8d5c8041d21116c4f22e685,,,invalid point: subgroup check failed +000000000000000000000000000000000cc6bbb9914ae46b57eaaa8d3d22274a355bd7488e5b537169c995ef2bee187ab66497423f14fdcd01373a609981b3ea000000000000000000000000000000000037d9461da369d186cd812a9ade7690b2b8b54ae386b7342a69af832ff4f51e5db9baa3c6b4a65d798a1aeb41d8787d0000000000000000000000000000000013a6e129d4dd4aa93cff5489ee879763e2a2231939e609d2d72f07e630b37d09f3057a36fd5cdfc9c81675c996f8ba0f000000000000000000000000000000000e8d7ad082e8f9a718fc2ea712853ed9ab4e8b1a8ca9988f77c70fc759f1fe2d4bd73696e539f130be13b2862efbdf770000000000000000000000000000000009897223b041568c9ef2884baa28477241e525de05f2c2f15441854a0e8660786a0c7b85a6d9d1074fed2b44d75efedb0000000000000000000000000000000007b52401891bd8003af4b07b04b15b79bd05fcb54739491352d295b5545ddba34da0b0aff36a3e7e4b433011be580174000000000000000000000000000000000cc6bbb9914ae46b57eaaa8d3d22274a355bd7488e5b537169c995ef2bee187ab66497423f14fdcd01373a609981b3ea000000000000000000000000000000000037d9461da369d186cd812a9ade7690b2b8b54ae386b7342a69af832ff4f51e5db9baa3c6b4a65d798a1aeb41d8787d000000000000000000000000000000000cca0d111237ec521889baa4987714c6bb539399b058b6635fd043821377fd6cfdb74923610c8235afe2be99188cbe820000000000000000000000000000000007fa2b99221675b38204c2eea94b2378b1d711ea5ba4f41d35c37f77ee2466f22c88725da9fcdabb6153292b7cd9aa1e000000000000000000000000000000001069adc30f99e0ddfd39775cee5ddd786fcc077cbaa8737f7031745d02f06168fd5d3c4936704d15955bcfa08b0925180000000000000000000000000000000003b388a8d9baabf0bf708e2fe28eacd7f704bc588185adbcea8e0a2bb8f9bc9b045918d97bb27b2033c6722b6e6692de,,,invalid point: subgroup check failed +000000000000000000000000000000001055ab14a2407bf095a954cf1c926f2c520dda187c44522a7e924e38543e5b87e7642227821a4e0b3ab0289b32161a060000000000000000000000000000000018aa24044066526fa9ed980ae7b3110a4fde7ba0a5fd289803fa5175d30766f01a266917f821169c7ec31fd46e1a14ac000000000000000000000000000000000b6e16f2a6cb821abc43c447da207cc3013f2f750c844f42f0fdf47160a38501bf502073bbeb565122bb3de61b3a5ab800000000000000000000000000000000040f5f3aab5d416e9a084fa298814f894ba599315fe10af20f836e624680582413b4a54623cda8ae2663ee094e4db775000000000000000000000000000000000d32ac715a094813c7b46ce2e932365bfd62ec5e584e047b0c56ed6eca3c58268ae01be31b833be7ba5c2588ebb9859d000000000000000000000000000000000850b9044f129e51658a02cfa49d40a2b09239823cba4d8fe423fa1b4815750811daf745e7e02b317a7318aad0734ddc000000000000000000000000000000000765a76c441227592ba30d6b1d3d9898467352398efc0e8416e0be8c9f87bcac8d5eaa5d7b2a8adfae8303909bef28da00000000000000000000000000000000107c0eff2fa09afb743c294408408451e3039da8db8c0beef32f07864223817075fa557a89244cdc293d631311773947000000000000000000000000000000000b6e16f2a6cb821abc43c447da207cc3013f2f750c844f42f0fdf47160a38501bf502073bbeb565122bb3de61b3a5ab800000000000000000000000000000000040f5f3aab5d416e9a084fa298814f894ba599315fe10af20f836e624680582413b4a54623cda8ae2663ee094e4db775000000000000000000000000000000000d32ac715a094813c7b46ce2e932365bfd62ec5e584e047b0c56ed6eca3c58268ae01be31b833be7ba5c2588ebb9859d000000000000000000000000000000000850b9044f129e51658a02cfa49d40a2b09239823cba4d8fe423fa1b4815750811daf745e7e02b317a7318aad0734ddc,,,invalid point: subgroup check failed +00000000000000000000000000000000182197c7a0cefeb530f51c664dcf8a74f9f70165ffc416ba454e9c356bade393e30d037347b1a020dcefb09ee65590a6000000000000000000000000000000001030be8d38736ac8e555d1681b14f73f2ca58faebeaff17b6006bf7876e733642d229075c8dfb0a9ba4e832e384aeb8b0000000000000000000000000000000019094370a6f19e946f587e9b117332ce5ad91860cc103015e94c6aac6d2c00f3e71471c241ea1d425e391707b27b851d0000000000000000000000000000000009ad1d1312011907676574a7867ac02059d9b0e29dab709f6ffc1b75b3598658427f10ab52d1129417ef42c30998f55f0000000000000000000000000000000003103495c759d8901898acd98679d92e048ca41244782045a6d9419b3ff87c351f97a333899fb445b8620099f7b9cce100000000000000000000000000000000051f7aaac39348f70109ae7a016026ea52c03e4ec90d03ce05aeea74f66bbf82e17be35cc45f492f50246f0de8dc68c500000000000000000000000000000000182197c7a0cefeb530f51c664dcf8a74f9f70165ffc416ba454e9c356bade393e30d037347b1a020dcefb09ee65590a6000000000000000000000000000000001030be8d38736ac8e555d1681b14f73f2ca58faebeaff17b6006bf7876e733642d229075c8dfb0a9ba4e832e384aeb8b0000000000000000000000000000000014229a1108fcd75131295caee98f8e4e075cf4bb5e169024e07a533f65316cb5d19193d3cfee8b2216663829be6d374600000000000000000000000000000000156cdf98f622a393d920b200e6d9efede7413137eceb79d66f85a18e33ef6946a515737c58e198f877fa39458877b99300000000000000000000000000000000006e5cee8e0f47c0ee4a574fcca6e150901a7de58f3f2eb3480f1ff8c14effa4bb9d00837501f22f6cc465e4026c9d7100000000000000000000000000000000124b6c0836bdd10657a3e1f978b48b9221b1cfc2767b6b99319fb69c5fdcc1b133f1c2fd093c62d6d1e398f32c4e8b71,,,invalid point: subgroup check failed +0000000000000000000000000000000019c9b755000f9f1b6ff22885f45bc1f5f65d080ecc129d29e1cd60aa14fd20646643be51d2fb3417cbbd39361bc72b62000000000000000000000000000000001741fd3c4a7e883094c0e84d851f45cc1b81af5bcace67dfddd3f19e8817697a386d1965a4e17c60b00ecbff84779b97000000000000000000000000000000000e87ea967f6c4dd7135efcd9a59368a2d19dd1385aefa34d7d9bd7f5094d779a7150667dcec463c9ab63d2ffc8ee4f6d000000000000000000000000000000000a3a010f176efe1a7bdb77dedf6b6271c845d662dca5062ebbac4e9c3b8946db0adfff37a6faa3196a99fb3ef05f09c5000000000000000000000000000000000350ad257d47f270c4340e3cb124ce961316573dea14c9584d20221d922a43c2e94324ec14bd1e4a1eb955861783a8f100000000000000000000000000000000070edff58ac1f8c13f62327cf0adbd748285fcd84ed7be23dfc82a0ae32f8c8f5f6b0679f795874cb0082718fb07a1ca000000000000000000000000000000000d5be6f99bb9a2379d1e542ece048164fa5d14e0c6c459180717b3da46e8446e9def576635ac1124e1390196fe97f39e000000000000000000000000000000001482d8339b402e3bffe61aaa298c8bae4286f1fbfc877a66e21cfe239bbee383d701d95a6c2b8193d67df5a551bb7aba000000000000000000000000000000000e87ea967f6c4dd7135efcd9a59368a2d19dd1385aefa34d7d9bd7f5094d779a7150667dcec463c9ab63d2ffc8ee4f6d000000000000000000000000000000000a3a010f176efe1a7bdb77dedf6b6271c845d662dca5062ebbac4e9c3b8946db0adfff37a6faa3196a99fb3ef05f09c5000000000000000000000000000000000350ad257d47f270c4340e3cb124ce961316573dea14c9584d20221d922a43c2e94324ec14bd1e4a1eb955861783a8f100000000000000000000000000000000070edff58ac1f8c13f62327cf0adbd748285fcd84ed7be23dfc82a0ae32f8c8f5f6b0679f795874cb0082718fb07a1ca,,,invalid point: subgroup check failed +00000000000000000000000000000000104c749e3f7b40bf6df55f9414bd146ac306b46a6210ae4ceff6fe2a58220ddbc69208ada5f692120dcfce39b1e43fb5000000000000000000000000000000000663a0e62ea68ac23a6e27958baabbb5deca3905aa138a54d6198724e5fdf0abb9288cdb52cf1d44e93f06571a654f75000000000000000000000000000000001116ecf077865395ea40fa9cf05753b87ac29ccf9ecfebfa1031fef0defa1d77634c2177647f069532e00f7fb657577f0000000000000000000000000000000005c7960dd84874fc00ab199d00e8bf1ea035a7eec443328bf2bc28d0006979f5032763a4d33f031e698895e03b27314f0000000000000000000000000000000004e00e32a506bff708c51fcc4101c8ebe7f1695d6a4606b6648b04710fdae313b99219963921451d0fc78dd59970ea8b0000000000000000000000000000000019dc4b721ec4a4303809c47da68099fc10706eb08cd4f6f91641ac680661e93a91e2067a84c12f9f55f84e27ed76ae2700000000000000000000000000000000104c749e3f7b40bf6df55f9414bd146ac306b46a6210ae4ceff6fe2a58220ddbc69208ada5f692120dcfce39b1e43fb5000000000000000000000000000000000663a0e62ea68ac23a6e27958baabbb5deca3905aa138a54d6198724e5fdf0abb9288cdb52cf1d44e93f06571a654f75000000000000000000000000000000000da3982205a45000b16e1ec7a48effad4ae1affd4acd8bd13fcdf2bf05b6845ebda9be2df6d6325389d711111641aae500000000000000000000000000000000150c1bb67fe3d88dbfb452d5b4582d9a1c350ac01cc209740be70d63e266c926cc6b0171eaea913b7456daf595b83ce900000000000000000000000000000000138d0bbb52fb6248731c8fbb6818d1379fc5c2549a5a0d663a56c41b3b2e8c7c4fd77830c455a40e59aaa65124ebcee50000000000000000000000000000000015e6b4628b75f9786ee26e41cb8b86c6e6a97ac18aa7662b39e9c96e169a3192b64b863d7f9739237255fea6cab12fcb,,,invalid point: subgroup check failed +000000000000000000000000000000001638395680014bc04e2ca42bf864dde47a0d708ae81ba4a6aa2e2476837750aaf5f9f6e41a5a23df432ae92fd221737e0000000000000000000000000000000009419792539e0ae995b8d853d9ef513bc54766475e37bb3dc2dae3d7fb9b02b0eb2327f24a751d2de344b9f5131ef23700000000000000000000000000000000197ff997d6c5efa3d7de8e16f26082bf13a2401d6df5f5c33c6614c36105f347e40216c907bdad9c1df6ebbd44f41c3f000000000000000000000000000000000f27a0bf92329730d776a83583177993b2b354a212a9c004f9f8892a750c477b8d1e68c13127f03b1629bc8392d06f5b0000000000000000000000000000000011b239cc6914a321385d907527b85713a0d842f5be80752f4c5758586dc1de944b6e4578bbe324f16838115e9c866bca0000000000000000000000000000000000cf93c5b48cd9de51ccaa45124217cabf466d07d6fdf4a7bb810443339ec4af5b74931bd07eb9fd31c284c05f3f539e0000000000000000000000000000000010b91e082484fff0da28b06f06e02c699d741f2ef788250e3fbf2ba8fc1d7d78a1ca63b76dadfb71015fbefc0eb70eef000000000000000000000000000000000c2fe842c659c875af0f2cb1a978ac9058981cc6c76ff057f326162d4322805974505e6a35499bd0c58b5d6db3aa222900000000000000000000000000000000197ff997d6c5efa3d7de8e16f26082bf13a2401d6df5f5c33c6614c36105f347e40216c907bdad9c1df6ebbd44f41c3f000000000000000000000000000000000f27a0bf92329730d776a83583177993b2b354a212a9c004f9f8892a750c477b8d1e68c13127f03b1629bc8392d06f5b0000000000000000000000000000000011b239cc6914a321385d907527b85713a0d842f5be80752f4c5758586dc1de944b6e4578bbe324f16838115e9c866bca0000000000000000000000000000000000cf93c5b48cd9de51ccaa45124217cabf466d07d6fdf4a7bb810443339ec4af5b74931bd07eb9fd31c284c05f3f539e,,,invalid point: subgroup check failed +000000000000000000000000000000000ac27e4d19924f4bfe30432554f25d456cdb4724c106409e46612e1c91e8cf5fc2cdcd6b6fd6bfe040e910795441befd0000000000000000000000000000000007e9227d849e467fbf5fadcc016dedcc04f4c66f23464195782746fde628a107d77ca5b5c9bcc8bbb14fc14208fa5de300000000000000000000000000000000094860f23d182a14d1a64d9693ce9309ef4e775f24aa3807571c9b8281fc0d6157cdb5a00b34b66be1849994c264c4b000000000000000000000000000000000062b4a3ef95b2522c894c0b492673c3800fdf8645998a899e27dc3a23c0530d96b558d1c6364477943726740cdbc88f0000000000000000000000000000000000daa2f2f2c1020339666be4b1c1e12f8d44625a9508bc5590314789d02fe0e2e676d8d240bff89b669b9290fe1d0f8a8000000000000000000000000000000000f7a710af0b04d20b7d515f2627b572a5a17a13975ee81bcb8fd90600d5fb2f161a9ab3635bd16649c95385bcd604f5f000000000000000000000000000000000ac27e4d19924f4bfe30432554f25d456cdb4724c106409e46612e1c91e8cf5fc2cdcd6b6fd6bfe040e910795441befd0000000000000000000000000000000007e9227d849e467fbf5fadcc016dedcc04f4c66f23464195782746fde628a107d77ca5b5c9bcc8bbb14fc14208fa5de300000000000000000000000000000000055d8c63d7c04bf5db81465f2fc372b798d77ab0ecf795bf57debeafbbc8998f91f71b0dbcc440e70df3d5a1cb682ad8000000000000000000000000000000001497d9519e835c0644d30ae38ee66faf39b1939320c2e0a45b7862508ea3bd7eaa3a754a679bff81af26c6aa141adae00000000000000000000000000000000001be6ce3109582f31e02051ef0e4d266f310048e04a7ac8dc5e04d2b7f2766440f1ae63e5da6dbf831b21fd7cb9cc0a80000000000000000000000000000000003d4acbd20192ee2fc55acd5c90cf5b897cb42a4c0a777970d11955cdf11d5ab22444ac9cfb666c3e509ce832cef219f,,,invalid point: subgroup check failed +0000000000000000000000000000000015866ee89fe4f68e45155fb98124e8453e1ca25347d84f70ebfc32cf76c5d48e3a3e5ccfb1b505db7b493cfcc73ef92d0000000000000000000000000000000013deaec2d2482c457050256d157968ea3d15f9b61b4573353e83daf824b28289343bcbc3bf97ecec9d65ad08804861440000000000000000000000000000000013467fcb424ae0eb012228fd2083d92e6d242427670ca6e2cc1166166edee5a94b78d2c2f8715a996bf2b4e5112e49f0000000000000000000000000000000000c23c01e0061b0fc7579723e072b12e86c8f12f4c2a039bdc5b1f3384441ccefec187e0380efae31a819d92fd6462ce80000000000000000000000000000000014f9a055a5e468955f6d7485fdffed2b33174777f99d9d0af160b0a083912b05da45f35c73053120f61525c173a24e59000000000000000000000000000000000cfdcb6adf8f04fac2cba8f322339fb0614f46b77b0d91f0ec167eca06fcce080ee0e63023fb94712dbe7591843b6fe1000000000000000000000000000000000d90bd38049f2a8de869d8a748c9ff3120542f38fca6e8d5fbbff86baaabf0f19dbf449cf23c043dfea322d99837f7110000000000000000000000000000000000ede89c8bb8299726ec685765f10167c5b844e427d3c15da6ec2c1d97de174819d52caa96d5cc938e93dd09bbd1e0d80000000000000000000000000000000013467fcb424ae0eb012228fd2083d92e6d242427670ca6e2cc1166166edee5a94b78d2c2f8715a996bf2b4e5112e49f0000000000000000000000000000000000c23c01e0061b0fc7579723e072b12e86c8f12f4c2a039bdc5b1f3384441ccefec187e0380efae31a819d92fd6462ce80000000000000000000000000000000014f9a055a5e468955f6d7485fdffed2b33174777f99d9d0af160b0a083912b05da45f35c73053120f61525c173a24e59000000000000000000000000000000000cfdcb6adf8f04fac2cba8f322339fb0614f46b77b0d91f0ec167eca06fcce080ee0e63023fb94712dbe7591843b6fe1,,,invalid point: subgroup check failed +00000000000000000000000000000000119c7c85e5efaf08b91dc496758b962098cc0eb60f4a770bfafa91809ae4a95b43f96b69c8ddc897701487f22d2e049c0000000000000000000000000000000007467ac896ae9f7d2cfdfbab082c89d3c17a6dfdf1f69b4b38fe6d5ede6848a45e8b0d728eb8c68752ec59c8e0504dcd000000000000000000000000000000001047ce33c70d58e3191a558ce2fd95c20bb62abae7d924cec8a4067fb33e8dacd796d65c049be7bacdb969f61db5b26500000000000000000000000000000000096e7081a7b2377331f86d8418bd577cd5cc1d45e60d39b519ff2b3a50ddb2d5f6dccc0066167f42498a3d29ef5ce2e30000000000000000000000000000000011159939a04c129b007f2aa2d59ae006e8d89c41dd465cba551737d06d3fb2c1161aee98e86cb8c0321f42e514316030000000000000000000000000000000000c25d9cdc8dbeec82c47d5ef12f21a7e58a8eddc1e738e635ba04f2ebe12440090f432c0d1518217a5531266441f1c2500000000000000000000000000000000119c7c85e5efaf08b91dc496758b962098cc0eb60f4a770bfafa91809ae4a95b43f96b69c8ddc897701487f22d2e049c0000000000000000000000000000000007467ac896ae9f7d2cfdfbab082c89d3c17a6dfdf1f69b4b38fe6d5ede6848a45e8b0d728eb8c68752ec59c8e0504dcd0000000000000000000000000000000013a11383f2d3a3c28e3ea750fece5790e37f66b306ecca417c83840bed70c034e4b82b0850f719fb0b3b203a25dffae40000000000000000000000000000000017d067d9cfbbcf605c5da3532b2eda5900d71340508f08c05d0051772e65b0f85b9efe5b6d63a7b64b25ede8df7f25c9000000000000000000000000000000000e44847884ee8eacd5417e042e8299af8313ce177ecdd034a91d3bdd441437510808d44e328e810c46bd851ceb6085dc0000000000000000000000000000000013288506fd52bf37aaa975b533f1182a824b79d2d876ad6ff705efeec7f732bed99d2da8f31c00a2db4d97c4118bcb88,,,invalid point: subgroup check failed +000000000000000000000000000000000b7aa89ed719e2af5ad32ca923f1d2d52d767f6bd33d8967d2619b54472c8881ad06441b2595931d734a0fd10ccd7f190000000000000000000000000000000014bd6118d65e19e4cb79af164f523f1c80b0f0a0f0063cf1d28e11ae7987381c0b9707e43754b75f36ca8523bc5f7da600000000000000000000000000000000056a29b523b0cf85ab04b0a496e078dba5529cb9699e567ca42f9ee3e3f07b61ae29b0ce17cad23131375f624a366157000000000000000000000000000000000acb91d1f057c7aec1f7561614a95f8db2252cc879bbc2595a5f607d8b0ecd6e6e3ec19849eacfca62d870b049ce84910000000000000000000000000000000010d9459e07178af8e125c2f66de699cfafb5f87a63454e24d0ed88b6c804a9ff204f146ecf4d6db62234ace0a944acb20000000000000000000000000000000007256a68e23b43a3b6475b3cf209ec108bac13631ca448cc860672c65c1760a8299fe941ed5bcbbbcf63a683e86806ae0000000000000000000000000000000005d4453da747eaef90007eb8ebf6088e8617dad362f2a95638fca7312bc5cdd8200f32b17a0b483052e6784d286c2cb80000000000000000000000000000000012f0e56ed3e3f628a13493d0ade2321310cf62927b40887202042981fc9a81d6cc69be130346b7bc244a2119b2632a5600000000000000000000000000000000056a29b523b0cf85ab04b0a496e078dba5529cb9699e567ca42f9ee3e3f07b61ae29b0ce17cad23131375f624a366157000000000000000000000000000000000acb91d1f057c7aec1f7561614a95f8db2252cc879bbc2595a5f607d8b0ecd6e6e3ec19849eacfca62d870b049ce84910000000000000000000000000000000010d9459e07178af8e125c2f66de699cfafb5f87a63454e24d0ed88b6c804a9ff204f146ecf4d6db62234ace0a944acb20000000000000000000000000000000007256a68e23b43a3b6475b3cf209ec108bac13631ca448cc860672c65c1760a8299fe941ed5bcbbbcf63a683e86806ae,,,invalid point: subgroup check failed +0000000000000000000000000000000015827c619b2a73a750f6469160ff323c15adaf55e893933a5c2e5c2f0df8bc426421408773a3e8cb8b1695973f7c0b760000000000000000000000000000000000af4a7d29f10cd080d9989b341fc030a5dd51512f776fb1da7a46d542c2a6a2ad7c1309af30423b717825fd5dc0356300000000000000000000000000000000198d09947dc088c1d33d776d64765766b508764f12a28fe0119277d6e171af7c9ff83f6823558e8b1a4284857663afb700000000000000000000000000000000130d5e5315f8df8d0142d06bad7a51b08e5b3c2d49b84c9d6b177b9bb628a852ff65c1a93982dcb1b31a2dc0941904750000000000000000000000000000000018cb011868591c6b44b7ce49f82470aa6461a737173e1d88d249c0e83fc6e4e6a15f8397e515efe7dc7302ccc2e369ae0000000000000000000000000000000004de1c5539b2ef536a66c8f3d7cd49ed948c081c08cba8826d2ccdf9d159b931ea10eeb8b3f465dce0143b179059169f0000000000000000000000000000000015827c619b2a73a750f6469160ff323c15adaf55e893933a5c2e5c2f0df8bc426421408773a3e8cb8b1695973f7c0b760000000000000000000000000000000000af4a7d29f10cd080d9989b341fc030a5dd51512f776fb1da7a46d542c2a6a2ad7c1309af30423b717825fd5dc035630000000000000000000000000000000004286a9efe902158cc624080ebc5fd9b5e0e6e31554c745d5f0c34ef1de2a487f77d405577559dac59babc731ca779110000000000000000000000000000000009c09c9c9e2c75bc6a81357c03b339668c7d8cc8a3f65790ad53b62f4c21acbf64fa66fdd75dc24c05214b712ad7fdb60000000000000000000000000000000018bf7e4fe271fe195377639c5743c1ef3eccb09c86d64d2a4dad2d7d4ff0feb46252d749f82a27141dc0007649b032bb0000000000000000000000000000000018113c4584b81eb814a9f1ebd041062d0db8bec46c2c1ffb7f863bdd2fc3fac470b01c32b6f2453ab048eefe362aa1b8,,,invalid point: subgroup check failed +000000000000000000000000000000000c3f4ece90cf7d380efd3f81e66110a5923bd604422fca0fac2a16fb9a8d8b34cc1fb86a15009e8cc2c0d9fd8fbc0fac0000000000000000000000000000000012ea55d042ae590abd4c2687e0f152384d37665ddf26787d49bc9f6d40a579bcb23521c59ce91c418b9f4801375892aa00000000000000000000000000000000098af17ffd4d28bad76ce1ee669e7cdac1eec9facc260440636be88618302ab5a0826141b4fc914a389816d04597826a0000000000000000000000000000000011bef78afedf5c62daee5e86386c45826a524352fea40f68b07b7794df8eced4eaf0fb55b6990b4fb417ecc597b61e48000000000000000000000000000000000d64f0a4df4f858defde17b31476045c3dea78de4ec8082822c1699c0b9619464c75f0e57ebd12ad9e4e2e6b291b538c00000000000000000000000000000000031f12dc8a9c5445d575f99e2a4b4217ba5c0be58ac00977236440ab0ac7e2c8dab72a64464e4480aab7eaf1d629c7e700000000000000000000000000000000033f3c31337bc48622d27a9a3224a2acdb5c538a59b497a4a85840c81cff667ed0a0e4e3f4bb23a9ae53c1e79ea54cbb000000000000000000000000000000000cf0dc22af4530260cde26aa0eedc83a0ec3ae87d024e6907f3d22070e1054b3d4f24d5ace7218ed44763af6ec3f25ee00000000000000000000000000000000098af17ffd4d28bad76ce1ee669e7cdac1eec9facc260440636be88618302ab5a0826141b4fc914a389816d04597826a0000000000000000000000000000000011bef78afedf5c62daee5e86386c45826a524352fea40f68b07b7794df8eced4eaf0fb55b6990b4fb417ecc597b61e48000000000000000000000000000000000d64f0a4df4f858defde17b31476045c3dea78de4ec8082822c1699c0b9619464c75f0e57ebd12ad9e4e2e6b291b538c00000000000000000000000000000000031f12dc8a9c5445d575f99e2a4b4217ba5c0be58ac00977236440ab0ac7e2c8dab72a64464e4480aab7eaf1d629c7e7,,,invalid point: subgroup check failed +000000000000000000000000000000001679e0889aac1501b67c4ccee84942e05b1720f48b6390ab82ff76c0ab95defb79b4371770f2e07a9e7ee8de4d76b43500000000000000000000000000000000162fa6099ca3e5e8e27dea6ea0d4d13c5c150d281fd6beb2079ddf2d714bf9458184100c88440109d7526812ee0f56e000000000000000000000000000000000087bda5b07cf72c2b350e663670f094c352097330b307cbe2f7b4224841b6eb23c36ba62d4ee591e5ca68383ec0256f6000000000000000000000000000000001163d4985e0f25d36a1f8dd97b61413b0015a966a88d98eddb2ea2d5eabdd83a44fb7e37cee90cc50df2f95dbfa97979000000000000000000000000000000001652067ee82320191cc5b188e61ee2d1b94c781e8e5798c89224920ed1d12a2cb41066f69cdeffe8a4d5e3aa1be4c83300000000000000000000000000000000139cd806423ee99d913e8b0e5ddfb6b1b62478254fe39d6836fbc632de9435e1464a556b1f9466efebe93636dfde7749000000000000000000000000000000001679e0889aac1501b67c4ccee84942e05b1720f48b6390ab82ff76c0ab95defb79b4371770f2e07a9e7ee8de4d76b43500000000000000000000000000000000162fa6099ca3e5e8e27dea6ea0d4d13c5c150d281fd6beb2079ddf2d714bf9458184100c88440109d7526812ee0f56e00000000000000000000000000000000017028dd744482e290c523ae5944c8a149afd9d344fea7ac0171ee3a5ff0c2add53ab20c477a584bf61e007af5840eb4a000000000000000000000000000000000863382ee8a43f02396030768905e44c8f9504b7315b00e379b92060e4f01e1b4e0f837b24cb42354e7211419a5516480000000000000000000000000000000007e2af64687f7d581d5a2bbdf225d1ab3dbea326ec89c08852807696c8d13cc907ef4289bf5ef9826c1fb27673b28bfb000000000000000000000000000000000ffc910160c8a0b826600fcdbec027e7d4874c9774324bddd2dd4428eb81c22618a49378502917ad9fcd96bdb1371285,,,invalid point: subgroup check failed +000000000000000000000000000000001902b8c58eae3ca8d2261a637902587c2c0e75d32abc894967b6837ea34252e4558966f931789ccd76c1bbe3e092b180000000000000000000000000000000000dd20f71f5054c79d5e357f69f8d7345b5a036241774a72743271f2dc8f6e8c29a3babc2b65ed8193cc0636fb2e86f740000000000000000000000000000000003e06e2dcfbd695e9bda0baee1276ceab637fd1fbe2d2d6458c923c35b00edc7edf4f9e797aea59ff8cfceada0615a02000000000000000000000000000000000a04a2ed5e42fac7f064b43d64151a6c517ecf22dbc7563a3e9f35f555a9992fe45cf6a728ba94607df7c96f7e0a334b00000000000000000000000000000000090fac97f9f524168bc930d26ea1627ceaf187398d6bfc5a019c8467d75cd31a41c7eb9fda35fc85bd92b4cfca92dbff000000000000000000000000000000000f37b91dc935c28668c27d38328a511148c1739b65f2816dc53e42a8f059c9b2be7417a6f97c9a2597b1a0f06b7afc65000000000000000000000000000000001687dbd36c7f96f8be47f08bb75bc72f91e63e26d0157a9a9c8f531f3e73bfbd9870fe9abd0a7a3fe73b997e48d0ffb8000000000000000000000000000000000183ba882bdaf1dc850cb4e98158895effda1734fa64810cb15640e6cc027bd006e5c1a088cc2c65e8af29b64fe41d4c0000000000000000000000000000000003e06e2dcfbd695e9bda0baee1276ceab637fd1fbe2d2d6458c923c35b00edc7edf4f9e797aea59ff8cfceada0615a02000000000000000000000000000000000a04a2ed5e42fac7f064b43d64151a6c517ecf22dbc7563a3e9f35f555a9992fe45cf6a728ba94607df7c96f7e0a334b00000000000000000000000000000000090fac97f9f524168bc930d26ea1627ceaf187398d6bfc5a019c8467d75cd31a41c7eb9fda35fc85bd92b4cfca92dbff000000000000000000000000000000000f37b91dc935c28668c27d38328a511148c1739b65f2816dc53e42a8f059c9b2be7417a6f97c9a2597b1a0f06b7afc65,,,invalid point: subgroup check failed +0000000000000000000000000000000010f38e6e4f562be50152c1d10eee8f8990cb8f884035bdce111e178d1286afe2f2f02c3a36858ae2ce902d6a2872ff1000000000000000000000000000000000141dc64999baf42240b933f30ee895188b561b880f90b5f1ca8df0ac75be7d95bc15d55e321720c172171e9c4c59e800000000000000000000000000000000000548814c4b6d72cfb817b49b3141302be7d7b378e50ff9f7d66e31cd04e1f024bba334110817990264d26cbcff7170510000000000000000000000000000000011f9d186fab00b9ede155a82ec5a5e587a1c6091005c4c6e90672d15c434953426440799c5ede15a7976f18bf345595a0000000000000000000000000000000018d480ece4609a56220d4db100b68ca06ee4271b84e1a81112fbb0616cb34d2b0ec974de31f7d6957b186dbd8a8f8ad3000000000000000000000000000000000c3c1b79130f73d516c1bbe38c572be2616991b523a9370c98df9313be9f5015c3e8d51947201c6b27e8cb9c7291bd660000000000000000000000000000000010f38e6e4f562be50152c1d10eee8f8990cb8f884035bdce111e178d1286afe2f2f02c3a36858ae2ce902d6a2872ff1000000000000000000000000000000000141dc64999baf42240b933f30ee895188b561b880f90b5f1ca8df0ac75be7d95bc15d55e321720c172171e9c4c59e8000000000000000000000000000000000006d89d908b733aba090432e795c564d1badd5b8529fc53507c4850e3d97978062b38790ef45562f3d4978491b5ae893b0000000000000000000000000000000003f7fc037328c13d13fdf4b2c251ce10c41ac5d042122f0e4e4f5a71cc9e1463f62d96aed44123d0e612e5296b53fdb80000000000000000000000000000000000aa2e027a929f7637f437b333a795a2e8d1a92cda31feb5a72fa1c66fadd23813177f9360204b0512d8f460b5bb161d00000000000000000000000000000000139a2a989d462e1793caba250c2ba9c46f31b3a06f43a0f4cbaa021b5d52d254f18d9517ddf3c21780f2a2c59533c5db,,,invalid point: subgroup check failed +0000000000000000000000000000000003ac8ec0fbf8c4a6774d8567a45b033a4a622d88d8b2025eecd746d084617b67342cb1030068ef6dceea78cf97210b6a00000000000000000000000000000000090b3a144dd409afa163ef513af313e545330a66c33d45b32d61cbdeccc66f78062060a2bfab2a88ec0cc47ec3525f19000000000000000000000000000000000d542ceffc583a6022306479b2365171c3610b7f615619802caf2f81d78f2b5166114485dfaacfdfc27c6450f8c344550000000000000000000000000000000010f5a12712658a5359c0a310f6d833c0b4623c51da6c035dfddcc4c201ccb27ac0a534da459a82488c32e1d4ced9b8af000000000000000000000000000000001878dfc18d1744c6f837b36436b82cd9c270916e5206f709e7eb30fcbd4157f65639103f367f1af2684a51d93e3dc7fb000000000000000000000000000000000ca3a300efdfd9812b6213a848d7a2f865d3fbe8c73527997f18460485626921063bd5b7842b8a47ccadcebb5539a54b0000000000000000000000000000000009aafc73979c000236c08e089828880f54645b5ff4c1dcfea0ff41ffe8e3fce8ba0dbcebf0d4205bb6616a737b6d3542000000000000000000000000000000001399a2072604d50f92ee186924ce32c4e887803dc258b7495aa2f3d2187571045db7f360d2614b198f83bc8024b06559000000000000000000000000000000000d542ceffc583a6022306479b2365171c3610b7f615619802caf2f81d78f2b5166114485dfaacfdfc27c6450f8c344550000000000000000000000000000000010f5a12712658a5359c0a310f6d833c0b4623c51da6c035dfddcc4c201ccb27ac0a534da459a82488c32e1d4ced9b8af000000000000000000000000000000001878dfc18d1744c6f837b36436b82cd9c270916e5206f709e7eb30fcbd4157f65639103f367f1af2684a51d93e3dc7fb000000000000000000000000000000000ca3a300efdfd9812b6213a848d7a2f865d3fbe8c73527997f18460485626921063bd5b7842b8a47ccadcebb5539a54b,,,invalid point: subgroup check failed +0000000000000000000000000000000013a366c2748305c4ca702c053ddcf15df4a4a7858cda813d001f59bdbb419de6ae3fd24b22fbeebe58d5278caf04c0c800000000000000000000000000000000140759404192c97274c06a69609a1f927195dc0e9df312f483b075e0647a9df1225c22284edece061a2a1c3dd6c4af030000000000000000000000000000000018059cd50cc71b1060ee01c10860bccaf2abbf84cc09266f2818b7625be9368138784dfacf0a1413f19bed9c09294fed00000000000000000000000000000000138939b9b91fcc8ee3aeb35de9476576cc84adbfc513a72fb74c6b897a9d6bb2037d65489709de062b238c5d0587345f000000000000000000000000000000000a9f2a8303b70df25b27158d7fbe06db9b71f6b30b8d8f3d3ad3e81ed310af6ba00eaa104c4c8755c3c24b37b5a9bae90000000000000000000000000000000014297a57a543d963d777ce5e3e5b07d19d69f56ff3efafa2753889522f10dac3fcabcc77466ef236d331361955b571670000000000000000000000000000000013a366c2748305c4ca702c053ddcf15df4a4a7858cda813d001f59bdbb419de6ae3fd24b22fbeebe58d5278caf04c0c800000000000000000000000000000000140759404192c97274c06a69609a1f927195dc0e9df312f483b075e0647a9df1225c22284edece061a2a1c3dd6c4af030000000000000000000000000000000009a457949f0a3a5ef91fbe3beb52dcf95a9f71db70bef860d2fd60cf9330b99e1d103eea022f32f0db603a635925f2940000000000000000000000000000000018e2ce9366745f5691d3c8f907bffed5f9da928cf9c9997db1311bc47b34d9d0a076ea5b7845e0dbf1c3dab60edca5de00000000000000000000000000000000089bcfe3a5596fe5f3c61326de93eb63abb0f56a7b9a5c5f4ebd883ea681607352b955deb581b57da99e4fd302e136c70000000000000000000000000000000007cb502742faf77a7223dc713a243af8998652e45f51b32dabe766c7a771bf4642ea9f25fd924e61a0f0a6e0f27c99dd,,,invalid point: subgroup check failed +0000000000000000000000000000000003f23275ed56b4aa4a1fe367219e8c84142d60d6b9983e0abb8ca21a88e008286a902b2b92369ec14d7f45f7b66b9a0300000000000000000000000000000000130b8d95a4672e467f122fc010ac3ef7f6b6d0ecd044413e51f7c27ed22f7ab7a28f60245b9ba83d4ffc98b9a990510e000000000000000000000000000000000e5af1420546c1a5a0e0c2bd9241bb7c7a26dd52f4f358fc868bea457a60bd4f6bc5b60b27069fb4f6760813a91ada740000000000000000000000000000000017426a65d239b1d9505bef2b476799c394fcc7bfdca36a1ee5a600351334dadc238b64cf8a667a25d4880a31b73c53a9000000000000000000000000000000000f151587944aad17429b51b1c16193c1e1c93cb412538d1475473666c997e012ce618eb841c4e9e064a08ab83d7fa60e0000000000000000000000000000000015c2e049c532db585807319c23ec077a51f288fcffb2cb6528d3697221e8542e3fc85d18b079ea1b217fae30858a36f20000000000000000000000000000000010a1fe14b9981a917e49b71f549b7b548629ad0003b43a9eff26e2cfa7fd8ddb21056e26dc78c88d30c32e62af40a83d0000000000000000000000000000000019f408194aa79434edd5f2a3adcc5c55ee9c1f616641b29ef21fbba8cae342df67ef438095dd7677ea1959f9a855974d000000000000000000000000000000000e5af1420546c1a5a0e0c2bd9241bb7c7a26dd52f4f358fc868bea457a60bd4f6bc5b60b27069fb4f6760813a91ada740000000000000000000000000000000017426a65d239b1d9505bef2b476799c394fcc7bfdca36a1ee5a600351334dadc238b64cf8a667a25d4880a31b73c53a9000000000000000000000000000000000f151587944aad17429b51b1c16193c1e1c93cb412538d1475473666c997e012ce618eb841c4e9e064a08ab83d7fa60e0000000000000000000000000000000015c2e049c532db585807319c23ec077a51f288fcffb2cb6528d3697221e8542e3fc85d18b079ea1b217fae30858a36f2,,,invalid point: subgroup check failed +000000000000000000000000000000000bc43aa42d656bdc233b332698247bad1904aff059eaa3f9b943ce5d4ae4f414dd361062a243f38129b954f17389ec280000000000000000000000000000000018dc8ec1d798981f662a8ce10f25f31197a2d168d3c047d2f6a214f1554202d072baf004c61b6d58f4f0410a4520b985000000000000000000000000000000001217fe0908fca8686b63337b0de6d3b3e4853466a990d8feb8a127cec95fd8dfc97be2ac57587d5f9ae1f5c10848e5910000000000000000000000000000000005c60861ac4863f7b9c38952daa88c2414ec8ac14f99fc765042b718da08136537765dcbc28cc6a0c279d491cf95b4b500000000000000000000000000000000154b289077530a86091d21c8be9c25ccd250da8d77caf853955b0d169e1ac40b5e0fd539b09b61b293035ebcbd0e21f5000000000000000000000000000000000356ddbe9454937c441dcfc98fe7b0cf8a746464f77230229328cafe6ad9ad1b5cc7a60e50bd8431b0996e3c42882777000000000000000000000000000000000bc43aa42d656bdc233b332698247bad1904aff059eaa3f9b943ce5d4ae4f414dd361062a243f38129b954f17389ec280000000000000000000000000000000018dc8ec1d798981f662a8ce10f25f31197a2d168d3c047d2f6a214f1554202d072baf004c61b6d58f4f0410a4520b9850000000000000000000000000000000001874e45ffd1349b4ed2e361dd7093a2ba41281b2d78f123bf9f6f73892962a0bcd6dc6e4159e505509cf7839aa79a20000000000000000000000000000000000ae0404355b78d20c1c3f5d65373d905696b166e76de62feb33f819dba26d39ef78621f819e998f6f2c82c65ddc22fc90000000000000000000000000000000008a499023de01bbe12958e10a3ca967f0f6047c705345beb8fb835c26df4eee908448b39191321f3eacfbd0951861c40000000000000000000000000000000000a56e3272f0474f980511540610b29e9a722a868025ac424ce8f76f342721a92d2544a420d3472f13186a0837d7e2c43,,,invalid point: subgroup check failed +0000000000000000000000000000000003e157886f141c2ce7d9ff32af44df6b7407af027005aac1149ebbe74b3b810f834b019b3e67a04531e2554f122d959600000000000000000000000000000000159eef0ff7bbe471a7ef8e666ffe35f427e3ef5bf9eeb4693dd4127467cf2615fa6b289be07452bec5c35b6d8d8ef2a100000000000000000000000000000000028316eaa131ef5303b012bfdd145bcb3106b362f410ce05810b8c83e10b1a8f80167b546b8b86c1368d7099fb5a0deb000000000000000000000000000000000bb3a353a2c16bd73c62fefd820927898dfced930d9639c5f63e62d8e8d31fa028cefb0d57ed16299eccdf3700b62bf200000000000000000000000000000000198272cf5c6e8a4f4cf4692fb7363687d7ba52deae88a7b976863309feb4a475db150073593567352ab62a150d862ca20000000000000000000000000000000019af00f2cf92494f532052962b62c34d0999a984b4bf36abd74a485fb9089ee0967071886b97f541ae80c6f7b8bc73070000000000000000000000000000000014bcf3f26683234584d79b436cc608462f1e2c20b5ecc5019988d8e30137859a4b6d0e1135dd5bbea0781b8ed3f0653700000000000000000000000000000000090ef29bf63ca97ae8388588227e1d1a0653c43b16a35a63f2ab4f0b11fd8005d9a85d30a7406491d983f347e4dfb9f100000000000000000000000000000000028316eaa131ef5303b012bfdd145bcb3106b362f410ce05810b8c83e10b1a8f80167b546b8b86c1368d7099fb5a0deb000000000000000000000000000000000bb3a353a2c16bd73c62fefd820927898dfced930d9639c5f63e62d8e8d31fa028cefb0d57ed16299eccdf3700b62bf200000000000000000000000000000000198272cf5c6e8a4f4cf4692fb7363687d7ba52deae88a7b976863309feb4a475db150073593567352ab62a150d862ca20000000000000000000000000000000019af00f2cf92494f532052962b62c34d0999a984b4bf36abd74a485fb9089ee0967071886b97f541ae80c6f7b8bc7307,,,invalid point: subgroup check failed +0000000000000000000000000000000003b6f466571daced9c0d6dd76b5f7cc91f20d92c0fc2f051a97524aee838be57eb977af49bf020a252db1b49693892ee00000000000000000000000000000000002b99dffcb6c171f66632d0cbc9aac74e6f4823fa4690e273a5c16baef618b80d2daf81d8c6b4c5240e1c329ba91b41000000000000000000000000000000000a32e330b87bb0c2984ce443412953a879f396221cd21c2f7ae46699b02c76352d3b13759d70541fc67cdc0e65fa6d4f0000000000000000000000000000000006a134cfd54f8e524544b170a4ae0b3da02da61b56633ace68b05c511a425a0a17d3e3e155a592e6176f707100174d1f00000000000000000000000000000000132f34e6b61e7fc7764b3113a4761cde446de56d3bfadc7f285bcf11132ce8d52c656cd9cddf176755dc228277557dbc0000000000000000000000000000000019d74adf4504a87de20b5a53d4e668be279d5850dc13b1699769d2279a23903f6f789dd897c2180ed895351e4f90d7e50000000000000000000000000000000003b6f466571daced9c0d6dd76b5f7cc91f20d92c0fc2f051a97524aee838be57eb977af49bf020a252db1b49693892ee00000000000000000000000000000000002b99dffcb6c171f66632d0cbc9aac74e6f4823fa4690e273a5c16baef618b80d2daf81d8c6b4c5240e1c329ba91b4100000000000000000000000000000000025c97744f862c85507620fef6d4b90a1e37ab2d6c5ed2d794880b43bdf854ea77e87e90b5a487c56fe29e28bf7ce01100000000000000000000000000000000120515b8665151db933e51722fdac7a83d2f299623a38529508b25218f0d57aeb0c6f260e0ef3741ea1f89bc653e5d700000000000000000000000000000000019d1111f074ac541a381472a4d9dc6b76cf64e86d92018460e977460b46e17924dfa522a5bfaccbfd8bd0711950f41f6000000000000000000000000000000000433ad85586f9392cc6079c1f4f37eed99fc65da9a32206912465116f879efcf9e83d8b325433ee31235142aff89a49c,,,invalid point: subgroup check failed +0000000000000000000000000000000009b488e21aeb418e8913f6bf721b3398693a3875788a3e013717fbba3c6ddaafb4073378d121cc1f2f99c072b7f8eba600000000000000000000000000000000144346f013254cec17d8423f534d54e2496df08193ed65304fe300b47a68c8d322b6ad84f748529928d64298be5ac1f200000000000000000000000000000000102c92272571b73a7df754728d7293fd8050d9dd2b8605c3f7722e6de541b7fc6a81b01c1cf15e5241ee4ee1f81ab39d000000000000000000000000000000000af1cd6f23bbd3e9ef75eed6d6d99a7cdd24574881b3609e45c4adbf82e08259d14701fcc5b6338ecf52166aecca003700000000000000000000000000000000026a1a4c3eb54de2ba4509dc806db9efc7e26247d501cb59c525b8dd15d03b91abafa9ba5816c22e1f8ca159cda34bd500000000000000000000000000000000170b510ec227fe8534a2cbb0f405756491c4f6832df552bd23980ab0946725371b3c24fa8b93a38bdcd47e1026e1d2a0000000000000000000000000000000000d327350067f7401a228c4fbcc7375f2edb058505ab34341df865a82781448d8e053b478e97a3ff79458b264a0dc186a0000000000000000000000000000000014a92d6662933a9eec6134002fb0e23a0930a964bed5bf84886bc3819516af19fb8bee2c0291c518119f4f4198eb67dc00000000000000000000000000000000102c92272571b73a7df754728d7293fd8050d9dd2b8605c3f7722e6de541b7fc6a81b01c1cf15e5241ee4ee1f81ab39d000000000000000000000000000000000af1cd6f23bbd3e9ef75eed6d6d99a7cdd24574881b3609e45c4adbf82e08259d14701fcc5b6338ecf52166aecca003700000000000000000000000000000000026a1a4c3eb54de2ba4509dc806db9efc7e26247d501cb59c525b8dd15d03b91abafa9ba5816c22e1f8ca159cda34bd500000000000000000000000000000000170b510ec227fe8534a2cbb0f405756491c4f6832df552bd23980ab0946725371b3c24fa8b93a38bdcd47e1026e1d2a0,,,invalid point: subgroup check failed +000000000000000000000000000000001756d051ce0ee9ac0fd83b9a069086cfb62164d5131a2c7be22122cc64fe74590ab5b69e02b37a6075384df9552d1d6b0000000000000000000000000000000013826bf44ff233e612a9dc8d47cbb3aff4f1fb5abf0ffbd35f4124531bca696371357301d12ed89a2974de5027c2c59f000000000000000000000000000000000ec934504ad116a80cf15a8d9a3a0bd5db18139560adbc6de32b5871198df9ecfe122369dbce5a19eeeffffd510f403b00000000000000000000000000000000007e3f75ccfc96dbe63e7b877420bccfccf2a7a56994fcea725c1b9f1823d93b0913ba1293f32493983ebe18ae27ce6b000000000000000000000000000000000ce8b2413d344263a5e598900af1524bf863e92fc3c8a2b1f335e9029081de05c70b50b97bef75044d8083e92f99b88a000000000000000000000000000000000a47a4c7b8b35b0729b43db9785a9f15c7357815e5d1ddf02d14003923120a734a1edd931d39d9261b55c145f8c69443000000000000000000000000000000001756d051ce0ee9ac0fd83b9a069086cfb62164d5131a2c7be22122cc64fe74590ab5b69e02b37a6075384df9552d1d6b0000000000000000000000000000000013826bf44ff233e612a9dc8d47cbb3aff4f1fb5abf0ffbd35f4124531bca696371357301d12ed89a2974de5027c2c59f000000000000000000000000000000000f3f5ca684120f4b7132153ba02995e88c50ac830aa65e23978ea6be09bc838249adf113e9b463cb01fe0eee43262d5f000000000000000000000000000000001270984624e5da5aeff659f5b75d3e7e5ec655ba342e318b0643672f6e71b84916ef767c58daea149f8029bb046e548700000000000000000000000000000000064c7217b420841cff11994a5f9ba682f7df02be4c8ba2027b67d33bb51b0b956137f61ac037d5551d5ca2b880e4140c000000000000000000000000000000001813131d845fc7bd523c7a295f2738580d9b39f6198ff19112b9dd38276c3045942e74c59b4392f59de70e7cd2ee87b0,,,invalid point: subgroup check failed +0000000000000000000000000000000003dfcd47087531272c3fe93d82878c5a689eba15fd67534bc2fa045b1995eca650e19e020455f0b1cbe599fb27b8352d0000000000000000000000000000000014cc297621e8b9d4ac8b1ced78c53d61261e899de0077b73f4f119e6fc50d5aa10b5111640eb3390057510825a20213e000000000000000000000000000000001150494bc162c0f414d31816adb18256b7d9fc6593f89b30b76522566667dc302050acfba7106031e99bf580fad24aad0000000000000000000000000000000005c920cd2ddd5d660e3246962b466f34a28449fe1790b9312f81fa70e13c1835970d4b807352cf7d89efa093120d527a000000000000000000000000000000000d384fa4729576214cf631ac1e6e2af54176954bd63f13cf15f2cd3c1db4cde4758d260ea4ffc0606aae700bca7ca7ff000000000000000000000000000000001824caf3b35915f528dfbc82bc5d56b5f8e7ba2b02056f6e27cbdbb0a54de8d4749446f14b116ff36b9fa773808c647d0000000000000000000000000000000011d4918642919c801fff0962062a387a4dffe693ec09cd3d0286a18e3a22c84fc09e8396ca82e6054d8535cd888179230000000000000000000000000000000016a1f0c7fec5647dcce688d3e4e526749bbf23c1fcd9e9168ace47399f9198c9b3a6b8aeca68febde1b7beeea0641aa2000000000000000000000000000000001150494bc162c0f414d31816adb18256b7d9fc6593f89b30b76522566667dc302050acfba7106031e99bf580fad24aad0000000000000000000000000000000005c920cd2ddd5d660e3246962b466f34a28449fe1790b9312f81fa70e13c1835970d4b807352cf7d89efa093120d527a000000000000000000000000000000000d384fa4729576214cf631ac1e6e2af54176954bd63f13cf15f2cd3c1db4cde4758d260ea4ffc0606aae700bca7ca7ff000000000000000000000000000000001824caf3b35915f528dfbc82bc5d56b5f8e7ba2b02056f6e27cbdbb0a54de8d4749446f14b116ff36b9fa773808c647d,,,invalid point: subgroup check failed +00000000000000000000000000000000111650bcc4c7deaa92ef43d8355198c1c0bc402fd758933765495eaf2a6c11ea6b5b6fb4a89b00040c900fdec791c7b20000000000000000000000000000000005519640447380e96adae5042193695193484d61ce0cf26acca8c96932be68e61ad6cd23515f13f8fa4fbdd6ca5390e40000000000000000000000000000000000c6f11a5306aff663038d949d08092275c7c507f68605bf9a4b591138f578f9c454ce12176d4759e1c95f3243185b9b0000000000000000000000000000000018b28c875d620249ecc25cff0ced2b3766aa66254906c69b7157b6e418a332293723b4b268d6f9d97f566b4998997adf000000000000000000000000000000000ce5e55ebe8326ee5650122f4b39dc96fe95aa4c48d26f70580fd97be90782bebfdb2d94e784786c4188ef99ecc33f55000000000000000000000000000000000632c0e5c998679e92ad269e587e831da5dbeaff3eda614d904e11c0e4dba3c87b40101cfe2f579e8015731d0ff22ac000000000000000000000000000000000111650bcc4c7deaa92ef43d8355198c1c0bc402fd758933765495eaf2a6c11ea6b5b6fb4a89b00040c900fdec791c7b20000000000000000000000000000000005519640447380e96adae5042193695193484d61ce0cf26acca8c96932be68e61ad6cd23515f13f8fa4fbdd6ca5390e4000000000000000000000000000000001780ae947388f0e055883d231f8809eb8fcc5e30eec44cbfaf11c52d4fc14bf54480c439e805559f64bd6f2085e12f1600000000000000000000000000000000142aaed1757c6f6ed83d532333e6f8f340625864fae2e71101d1ca6787045189dcb408c433caa3a19e9220f623398aa5000000000000000000000000000000000e29f5acc8998ea0d02d72559230f119ab9f8c4a013c63baa553e6ef7f5a5d38427f5b1e82b0879201ffb5ff3e23911c0000000000000000000000000000000000b934ca967385631e767483d6279afb80ea063b624491d5d837bbe4509e1f54a90b9ccb153039fbec7716dc77e28755,,,invalid point: subgroup check failed +0000000000000000000000000000000018bccb5411a58583445efe99e16d0b1fbb8ec71c6c8175a73e8d289f102d6925b68374d8986bbe9353640565fe30d3200000000000000000000000000000000013036f4649ab1dddd84a12d5a3efb93f8187824211bda276cef8376ffc90f5728bdef3b5b1bcafd59fd9ecf3bf9acb76000000000000000000000000000000000a43335eb6ff3bf2daeeb1eaf44c2782eeb517e82e55203a247b7a396e26fdf85f93695753c52c68819b58c95f361820000000000000000000000000000000000c240b7896b3dd0c318dc9ffcaa001d20bff288def3ce42752d660fd705e1544e292a5a0aa3a9a80ae91cb47cb938989000000000000000000000000000000000e5195bcc4ee8b149a769322165b6a3157ee7d04546643390adc812b6296675dbd31168b268df869a6722a7c8f51c79d00000000000000000000000000000000004af7dc8a5c552f00d55b996d193a9571173ea829eba8fadfa7becc2f4149ee7c6c4d2c8c7b1970df33cc56e4506573000000000000000000000000000000000d7cf8be632d98ad21137a983fa55acd08492a9d1e9d6caaf520713a10f5cd71c9a155ce9ba65044f42228959e893556000000000000000000000000000000000ddbd265cad3a9c525a30ebab137fb1857a9847e66c3381d51de1040a48835701a1f5627281f6cb36181d8c1c337e58b000000000000000000000000000000000a43335eb6ff3bf2daeeb1eaf44c2782eeb517e82e55203a247b7a396e26fdf85f93695753c52c68819b58c95f361820000000000000000000000000000000000c240b7896b3dd0c318dc9ffcaa001d20bff288def3ce42752d660fd705e1544e292a5a0aa3a9a80ae91cb47cb938989000000000000000000000000000000000e5195bcc4ee8b149a769322165b6a3157ee7d04546643390adc812b6296675dbd31168b268df869a6722a7c8f51c79d00000000000000000000000000000000004af7dc8a5c552f00d55b996d193a9571173ea829eba8fadfa7becc2f4149ee7c6c4d2c8c7b1970df33cc56e4506573,,,invalid point: subgroup check failed +00000000000000000000000000000000042f294cc86c53cbc520ce6368a7149676d8bc4acf708485057c8caae31409ee1586a735c3e1f416104aede85e40a38300000000000000000000000000000000153de67ca08cdb77e92091e8f04f75d17ee5525c5ec3ccdaca907b5ebc1cfcb6ce9d6a4358999cb00ae5e824d008e7fa0000000000000000000000000000000007e00b1cd95e3f9cbb2bf80404abd9768da125c42b746c2afde0121fccfdcc2431c618d646764bc5137657d2f0fcbda3000000000000000000000000000000001170cf72d827f929cb9efef52b559f8459cdd4d60464e0b3bc6e55bb6cf83cc2e9d6314b2b80e4e4f6a3c6292d1517b50000000000000000000000000000000012a7806f98848dd9c79f74e4a25812a6fae59ca73472fd20db2ecb8f732ea59294647831e03b58c60f7a71d9892ff26700000000000000000000000000000000165e6e0a602c7a1a3334a880ee47c4c440c27cfc1ab1ea6d9df592e98d21f85519d1ddf402f48ce7dc8a87439b3f42f600000000000000000000000000000000042f294cc86c53cbc520ce6368a7149676d8bc4acf708485057c8caae31409ee1586a735c3e1f416104aede85e40a38300000000000000000000000000000000153de67ca08cdb77e92091e8f04f75d17ee5525c5ec3ccdaca907b5ebc1cfcb6ce9d6a4358999cb00ae5e824d008e7fa000000000000000000000000000000000c8373f2969862e64e7a4c319a5e4db5019391ee2fd502c86bd074de5b3a1eff7917b3517175eb28efb9aa10057df87b000000000000000000000000000000000648b6bee01e4bd215ff4b51580d254e09a9b88d879ec2a0a42b0fe80792da10a9fc4d1c47058cabddbb48e94f0df98b000000000000000000000000000000000286667f7ed2e43aa08ba81a8ae4dd0487a4d11425b1e572359783ebda7c181b7dd62857a28ae3b05302cf2773f72bc5000000000000000000000000000000000349436e7b0b86db8e77d7a4dcbeb16c541b994e6f71c45098fd198991a27b4fb48025d0808000d54fe6b9500da80db7,,,invalid point: subgroup check failed +000000000000000000000000000000000b09f1c099c4743404de9034dadea6120bb4b120e81d415d047d575423d8261af3aeadeca04610d4bbefcd5fbd48d7360000000000000000000000000000000019e08ce27700db908d40e8907434068819f874b79b1540a03b856ba8898be43bf7d97b17685ab54de67602b8fc41f90700000000000000000000000000000000010714e7b0316ac3ddc1836a569befe3965800dc3cd2d9ecca097f2eebfebcce7cdc92df0110e4b872a673d5a0ebbda40000000000000000000000000000000016700d8c04f159b7a019cd0f7ade116448e0657880d364f19d1f6ea099222abab3b766d3088bd9eb870cdb3eece5ee4d00000000000000000000000000000000054f6e8c85be6d914162702dbdeb82801d598e504bfec39a2edd1035f69deccb605af437fd4ecdb23979e993904edbfe00000000000000000000000000000000183e494cd0b25d5ee1e8f1ca4054fffa4d730f547e072af920c88b9d613deb21dac38043c385fc9f9bbd6e708602ae1b00000000000000000000000000000000155d3e886cce6f257513529e40c21b5657ef1ff1f4e71bc32b968db3e05652b1ac780da573fe1a1b94b7fef86e7c260f000000000000000000000000000000001184cf09544ec2826d0101d2b79095da6e5f77d453203c52ea17b6476360ccf166ef092eccf86dbe3a260f7fd25a279400000000000000000000000000000000010714e7b0316ac3ddc1836a569befe3965800dc3cd2d9ecca097f2eebfebcce7cdc92df0110e4b872a673d5a0ebbda40000000000000000000000000000000016700d8c04f159b7a019cd0f7ade116448e0657880d364f19d1f6ea099222abab3b766d3088bd9eb870cdb3eece5ee4d00000000000000000000000000000000054f6e8c85be6d914162702dbdeb82801d598e504bfec39a2edd1035f69deccb605af437fd4ecdb23979e993904edbfe00000000000000000000000000000000183e494cd0b25d5ee1e8f1ca4054fffa4d730f547e072af920c88b9d613deb21dac38043c385fc9f9bbd6e708602ae1b,,,invalid point: subgroup check failed +00000000000000000000000000000000065a0b9822a814adda6f22f58f0ce0d6db9b32dbb2766077b6fb9bdf084ba584dc749d746740804f826d17634509875f000000000000000000000000000000000d4284a951847bad1b602396a5d5193c3a794826f58122c9c16c6e8e18f6ec2d0e17d8ca3cda9c3bbc92c51794ec7fb600000000000000000000000000000000177f2a7306144321cec932fbc1a10d58073d6915bf9ca97a05b54fe05f525ed0c327dbdb1205b70bf7ef8cf35a61c4e400000000000000000000000000000000089dfb5d4a99380761f75a94deeb6a48854164687f1055b22328d45b9792cf884ae597db1d1a93f3f2633d14969bb260000000000000000000000000000000000b6598d4c8c590f2fbbea7c48899ff43d73087becda4974184eb3ebab605e8f90497caa2fce915f7214dfe244277a437000000000000000000000000000000000acbeeaa0ddf12bb717fd32ea32ef63d137e61b5294c162d3b67e02dcf1075838bd0208d7f8edaf15f023611b774c14a00000000000000000000000000000000065a0b9822a814adda6f22f58f0ce0d6db9b32dbb2766077b6fb9bdf084ba584dc749d746740804f826d17634509875f000000000000000000000000000000000d4284a951847bad1b602396a5d5193c3a794826f58122c9c16c6e8e18f6ec2d0e17d8ca3cda9c3bbc92c51794ec7fb6000000000000000000000000000000001a002703d6da9def84f6ce69f02ce952562a7bab2413e8d58631a3387a1f4556402fba6a39b37bda22d08a68b0230b17000000000000000000000000000000001366c2a752aad0e111adb716b75459c067e275c692bc440731510d56135c3238b410538dae3ec328bcd817384d8a6b6e0000000000000000000000000000000003321a09e7290272d75882b64d2c958d4434df3499c65fbbd1236add534db804081d29b0b34167e05f4de1d8065b5b530000000000000000000000000000000001b6e16cbfe9bd8a291dcadd4599f6edb147e261bb76caca726bc89b3fa1863922e202bd5fc9afa5bfec9923f43fb526,,,invalid point: subgroup check failed +0000000000000000000000000000000012e6297c3ba79bbec9a84699ee4268a37617d21e3ce984ba1134041e539f0a5f0ac11165e835ed1aba23d3b2c5f804d50000000000000000000000000000000006c8881033aa6aef80b52f0744c0c9058f6ee2d7eeba8a749ab15af41b19be8d6aae30d820ed0a0b50ce327c7baa1a2b0000000000000000000000000000000012ff0494d308d3e7321ad4c4000e9dcd19552d5e4bce8504760f066e2fb2509279b01f1568e3c3f6216bd5328cbf72db000000000000000000000000000000000038c6e8f0fab30b5c8e4323c1fd29527845c29e1a26c70b8e5284f7ca55fb55ad4ad5389b5280927b98907132f26b76000000000000000000000000000000000aef946b9b9e9fcabb36507c1cf441df2f5ccd71ef9281dafa5e25bf07d69556e4143ab402dfb38aa756bb6ee009a6890000000000000000000000000000000015f69bc7b0a6f2cb64fd0897b421e339fcc8637efced8bf33f5aed809a38b49a2e6376d18b1bff0ef70df1b7187ad04800000000000000000000000000000000019a5a9faf36413a1e48a97458b7c416a634e1ed92fbd89fbe4593f42abad0ada72f50f7a1e1a802158ccdf923b497e4000000000000000000000000000000000e0b851da6a8005b83b2afd272a6cd017bec39d9f55b3230b600c50fb9bd5cc1bd229671f6b2c7f1d78652e4534745190000000000000000000000000000000012ff0494d308d3e7321ad4c4000e9dcd19552d5e4bce8504760f066e2fb2509279b01f1568e3c3f6216bd5328cbf72db000000000000000000000000000000000038c6e8f0fab30b5c8e4323c1fd29527845c29e1a26c70b8e5284f7ca55fb55ad4ad5389b5280927b98907132f26b76000000000000000000000000000000000aef946b9b9e9fcabb36507c1cf441df2f5ccd71ef9281dafa5e25bf07d69556e4143ab402dfb38aa756bb6ee009a6890000000000000000000000000000000015f69bc7b0a6f2cb64fd0897b421e339fcc8637efced8bf33f5aed809a38b49a2e6376d18b1bff0ef70df1b7187ad048,,,invalid point: subgroup check failed +000000000000000000000000000000000c321b54ea1ae6e893f2c28e72a3e4bed4a9aebaf147716178d3392c959e79b6f3393d738f3722a0339c773da3ae56760000000000000000000000000000000005d2c477e1c9333eb642bb40709b042816cc54134fad935942cc08eb2db0c1582f9bf06518d4fd5577df4634332e70e50000000000000000000000000000000019123b0d9c362184620c90834730c58ec5f9becdb2f3c6c00fd157ac83c16a815efb5057011d00c774d0de626274d58a000000000000000000000000000000001936fe98ecb82299a85304213a3e30c02d90ea871661b34f664a825184c2d1ebad84d144df88c479b9526222a7fe9ead00000000000000000000000000000000081a6abf02a0a236ba6006a95a8ab3f186e72f05b00f2b686049cf980898d64a71bf2e41b6b276ed6556cf83a3247b6e0000000000000000000000000000000012162cab3a7d92acc12efec9672ecb4cb30ae208eabc77608748e968a84ec0de81678df45d1655e45a19162b06354a99000000000000000000000000000000000c321b54ea1ae6e893f2c28e72a3e4bed4a9aebaf147716178d3392c959e79b6f3393d738f3722a0339c773da3ae56760000000000000000000000000000000005d2c477e1c9333eb642bb40709b042816cc54134fad935942cc08eb2db0c1582f9bf06518d4fd5577df4634332e70e50000000000000000000000000000000008b24839939deb424bb0c7bb171064e01453008ada6e3f14fd3a86db79162d0f9a851eb6abcb7dd27f93df0f7ff3320300000000000000000000000000000000036bdf42585414a8fd616bf967ed2ad4eb2b30a7581a58691c6d58e5d54fa152b42427c98fb3094c718943d9d014730c0000000000000000000000000000000002b542c2d6e8862495b2a6937f1fefbba53c228af512918bcc5b39083125c41340f1b5f1c60696c7c07f6705dfbcae9100000000000000000000000000000000030516a5aa32954dc083531035c55aa623d5f53c07b7bcff54cb9bf04d567a293ee55b2027cdcb864b133eac0f3d5274,,,invalid point: subgroup check failed +00000000000000000000000000000000018a649f727e9ac88994760a97b129d3347d30174d54a1442542123a76f805e1a48e7a71f3704eaca90b3c17c538d26b000000000000000000000000000000000a5c006871d73a11d525df1921d256f880c2a3c0aea04ed27e83d5c264d3f2196c997347299fb04149c4083876bbf3d5000000000000000000000000000000000995b9bb378a7c98ed661b493ad17b3aca367cc6aa6db24fc421d82455bca4edae6c891c191023ef2113f3c7eba79662000000000000000000000000000000000213eb30b55a6ab8efdaa67c6c99362dc62022041a6ee76f7c72cc13ffaffddf88bc68ce3d4ed36d54285b177bffc1eb000000000000000000000000000000001202977411cd6674c957c74471e269ded8140f72483b5bf81846ec60be1748080e67e38c8520b0b71793f2be9d2a5b1b000000000000000000000000000000000d49d0b96d12bbb9ae56cae73bf240cac03daa2743557e6a78f029883752ba011cbe216618b28cc173a186750602eb7800000000000000000000000000000000076ed600ed860f16ec5dbae3f09471302bf85fde7702b3376b0d670f93560e77699bed969e7001570f44dc5e37aaa830000000000000000000000000000000000c993a8b08d2eb00bcee05e1c09e8a37834fac53643643402f60fbfe2cc7d795f5c68f3d6a32c8604c37211585830426000000000000000000000000000000000995b9bb378a7c98ed661b493ad17b3aca367cc6aa6db24fc421d82455bca4edae6c891c191023ef2113f3c7eba79662000000000000000000000000000000000213eb30b55a6ab8efdaa67c6c99362dc62022041a6ee76f7c72cc13ffaffddf88bc68ce3d4ed36d54285b177bffc1eb000000000000000000000000000000001202977411cd6674c957c74471e269ded8140f72483b5bf81846ec60be1748080e67e38c8520b0b71793f2be9d2a5b1b000000000000000000000000000000000d49d0b96d12bbb9ae56cae73bf240cac03daa2743557e6a78f029883752ba011cbe216618b28cc173a186750602eb78,,,invalid point: subgroup check failed +00000000000000000000000000000000012065f7dc3b8d6d6dded1106ecd071ac0e5f73c2aea8d088bda7687ccbb34625e2da53befb200d0885b25c228b3637a000000000000000000000000000000000d222a3c0a560f9e8a6624d9100b72e62f515f1d9384ac966d99c1761264ff8e88f308e57ddc94f156655dc310b3976e00000000000000000000000000000000109fe60cebfba62b89ae166733a097629026ccee41c95ad0260c96b772293e1403247b0451d149d527212c228ca6733a000000000000000000000000000000000a497d6c0285f7d5434c42605077528e24eee8185a615c39d2caabc570bcc01b40eadb937d78e6ceb8572115671053c8000000000000000000000000000000000f0d14ceab429a46e5568200034dba88a713899a12602529fd015e2c792191d8ef492a4d685ed09a75f638ad56f02ef10000000000000000000000000000000004d4b477fa154cd86a0934130c27f4eefed4b986da5afadf558d4fa003d2480a93b351798a24c2232e3c09c0bc33e7a400000000000000000000000000000000012065f7dc3b8d6d6dded1106ecd071ac0e5f73c2aea8d088bda7687ccbb34625e2da53befb200d0885b25c228b3637a000000000000000000000000000000000d222a3c0a560f9e8a6624d9100b72e62f515f1d9384ac966d99c1761264ff8e88f308e57ddc94f156655dc310b3976e00000000000000000000000000000000129c37bc44471eeb38b484699156862250e40df9415876f8a0da3d2f2504bd5dfe76e7b67f103a94c20751a656c5c1020000000000000000000000000000000011f24e9760017ed9120e3e0c25f57ff9e70f4f15265cf884d9d978225996f21905b32c0f918e5ac30e095767779cac8f00000000000000000000000000000000012e10463254df4bb4765a10ba47f47b6ca7ccf1ed289b8a9ccc4ee5cffde83a45077c3f093d0da6aaa5f38ebc3e5f0d0000000000000000000000000000000006755c3c202da2f65be8880e12485e2f8ea85b8e6c4b21b559e2a45b5f0977e01bba8685e4d7acb4fdc045a4cb6bba9d,,,invalid point: subgroup check failed +00000000000000000000000000000000182c68fe02eb491e1c0939304135485dcd2955c643ec67198d4a07075f0ec96441ffc1274e75dd36b103053660811643000000000000000000000000000000001308eb23be0860718e6ce06c2f24f9f94b7a72c557559ba8e1a9e3bc4eb4df009472adbfb26689900a65ee80b976a5c200000000000000000000000000000000030cc52d7901d0360d10f344cecc8325412788cc30a912d5de3fa9bdab18db44efea235c5d34bab526f3b8ecee2cbb8d000000000000000000000000000000000cda35f561c19ebd85a445ce8bb1618b446c7013c07606ce58e0b5627a5c9e7cb200e2b8ee12a0564730279e75b469b500000000000000000000000000000000055ad0655a96f6dab5a432e7d2fef57a6a11113070444089df23b4b911e0994b90aaaaa2c62d06756f4704fa218f7c350000000000000000000000000000000011d22438d7c162d34802a664c254abaae07659902e1f1bfc2bdffa6c17eb11bff5276474cc3cec9507e28685f1c21bb00000000000000000000000000000000005711605edddc03aee2e53b0945162616b969fc4ad2c15819df360533120dd2ded321aa929d67dbc84ecefeed531a49d0000000000000000000000000000000012adb2a59f85343c923642ea4be500595ec8c76755c0c219e5484a7a0f53a4c3f9740cf6973aab349973295791472e5900000000000000000000000000000000030cc52d7901d0360d10f344cecc8325412788cc30a912d5de3fa9bdab18db44efea235c5d34bab526f3b8ecee2cbb8d000000000000000000000000000000000cda35f561c19ebd85a445ce8bb1618b446c7013c07606ce58e0b5627a5c9e7cb200e2b8ee12a0564730279e75b469b500000000000000000000000000000000055ad0655a96f6dab5a432e7d2fef57a6a11113070444089df23b4b911e0994b90aaaaa2c62d06756f4704fa218f7c350000000000000000000000000000000011d22438d7c162d34802a664c254abaae07659902e1f1bfc2bdffa6c17eb11bff5276474cc3cec9507e28685f1c21bb0,,,invalid point: subgroup check failed +0000000000000000000000000000000001d70e0c28a776a0fef6d7d6a729f03d59c20a4c1f28bcb28645b996c307483837361d146b73fc808041893ac1738365000000000000000000000000000000000a68b5a13a6e5ffb88ad2618be4a197271d08e55781d21c367209c08fab2545b99f8e1e0b523854f075a915856f7483d0000000000000000000000000000000008c7569bb4e8d3b213dff2c132e5954e9622edc874dc82fcd674405cfda14dbeeb323d1605d06a92231f44339952333300000000000000000000000000000000092decf1271f8cb90a67c6cbf7eb0cca0c2d71c698470193ef495e494a8a1ac3b6bd78fa6e4367874ba18a00f6eca025000000000000000000000000000000000dfeff0f041a1868cd0ede471164f24dcac619c56515b8eec5c8aea870a79a2d03f0e1526eb1e8cbcba908969b5e952700000000000000000000000000000000109aa32bee0a83dae428e388a39ece51fd3f392ec841ffaa2554972528b7f55ca36b19ef6ae585e91995a50c0848cccf0000000000000000000000000000000001d70e0c28a776a0fef6d7d6a729f03d59c20a4c1f28bcb28645b996c307483837361d146b73fc808041893ac1738365000000000000000000000000000000000a68b5a13a6e5ffb88ad2618be4a197271d08e55781d21c367209c08fab2545b99f8e1e0b523854f075a915856f7483d00000000000000000000000000000000065860fd6efa478810b70e56ca788706bccb63191649d7b9e92941efe264bd4720b1f536d90a034b681ec9ee16f50b5c0000000000000000000000000000000014e4277fc0e4827510d55f27162d85d362f99ce57a7baf74f62567d42efd3afefb61782a6ba85d4d0e27184dc15b30ea0000000000000000000000000000000004a18f9b07e2c61210d7b00d54dd1e2895692b928adc0a4597d4ff7efbfd7215e764572275cb78f29d106aec578ed1a200000000000000000000000000000000025c5527f68d69ca8d86ffaaa3330784b9a9e32069cdc2e147c81d9a39eb181e39592a126d428e6f7963d34292f44e4c,,,invalid point: subgroup check failed +0000000000000000000000000000000010f18fc4c3d422a64f6c8935636cade47636934cc6c7d5077428ca6e2641068f4668a792a20c6bd4890da09de9765409000000000000000000000000000000000795df122ae83682617000aa2f80fb82cf933b2e5765fde4409249ac06d8eaf2a92938fb7bf4cc5717e4c604b68afc1f000000000000000000000000000000001825f573c335f0e3ad6ca9f721b529ab1a84585094c034058fce2f84185d99ab78e568b7cf129adb65501c266db679ff00000000000000000000000000000000114d2a8a69b83b46acc0dc3cde307b4690d2335c18b583874a0f5f6ed6b4e4ae63fb114d32479d56d3d2ce6393a128a900000000000000000000000000000000088c08b1b66f37b98e443f9d390b9934ee8edee075788a6ff9620c386f8ec4c1f6455704574b65086170c8a37f1728be000000000000000000000000000000000366a281910a6cb906b8acdb68180c6068b555c00d84b2cd3153ce5b8dc64532b3977d186202d1d6c00673b7ffe42c1a00000000000000000000000000000000067458ca402c19488e2515037abf9323ab8288e0e11f7cdee18b3da50cfa377435cfde1f63dcdc451ce65a05641cae370000000000000000000000000000000010ed9c895629bdafae66ea176388be4e4ce45cb13ecbe0869ce57f0f48852b6b8c47bcc4a14fc5327f1df372ad9f5d4a000000000000000000000000000000001825f573c335f0e3ad6ca9f721b529ab1a84585094c034058fce2f84185d99ab78e568b7cf129adb65501c266db679ff00000000000000000000000000000000114d2a8a69b83b46acc0dc3cde307b4690d2335c18b583874a0f5f6ed6b4e4ae63fb114d32479d56d3d2ce6393a128a900000000000000000000000000000000088c08b1b66f37b98e443f9d390b9934ee8edee075788a6ff9620c386f8ec4c1f6455704574b65086170c8a37f1728be000000000000000000000000000000000366a281910a6cb906b8acdb68180c6068b555c00d84b2cd3153ce5b8dc64532b3977d186202d1d6c00673b7ffe42c1a,,,invalid point: subgroup check failed +0000000000000000000000000000000018339c70bcf5f8cbf7f3d67dcc7b40a937045b53243d6bcd417d467b1a264b960793171fda821c4206d10b4fe8488e170000000000000000000000000000000017907a4fd66b2a8b113352975ed70c0833a6fb51568ada67bf9f8cdc770e30a3a5fa305200691f4e8dbf210cbefeb002000000000000000000000000000000000b46ea3a7acd5615741210a761f7ef55e7381f52593f02e20aedc0753861acfabb5333dc5bfd829656511070b642e7fb0000000000000000000000000000000000989e2bbad608bc55d0749e0de844e001934d28a58178377d8607a1c5d5c85eb346ab94bd527b36b965626457f6aa300000000000000000000000000000000016ffa6209c14e0803789f94886e96bfbab47e07ef745557f1d1dd48e887086424cac57dd9a624de73bb7f3521de3fbe2000000000000000000000000000000000fac98b30fb441d9426f61bcdbb149b103fa9ec3b85cbd5f755d57474bbeebe796b96fac0ba1d4b75897dea8e54796970000000000000000000000000000000018339c70bcf5f8cbf7f3d67dcc7b40a937045b53243d6bcd417d467b1a264b960793171fda821c4206d10b4fe8488e170000000000000000000000000000000017907a4fd66b2a8b113352975ed70c0833a6fb51568ada67bf9f8cdc770e30a3a5fa305200691f4e8dbf210cbefeb002000000000000000000000000000000000b349ddaccbdd1381d9eb4ae7e65db31733fe3c24f38c21f5a20298bd8e01db7ebbe3c703327a5f81c89c040a5e17c67000000000000000000000000000000000dbadd08c77f8c210439d48fb55c741dc83aa9adbe7153bee1ddf1d3df824938c14d85a528c285db28df1d0fb22b8e820000000000000000000000000000000014d76b082d032e23130d6e55c0560080a5aa607f6cdfcd683d4e2450aa0788a99a005ccbdefdb3f626a045fd7cb9ed6400000000000000000000000000000000124130e29fb52ffc0d8e8ec760619de7397813b8ce598afe97f9076899f13dbe35417a6f94a2c4bc0341c933ab8c30b1,,,invalid point: subgroup check failed +000000000000000000000000000000001977147ab98c2e88f46f038c821e85fdf476bfe7bf7b7fd633ecfcf1fd2ef339b3b5cc686f4a8937e16dfa29ad8123f7000000000000000000000000000000000ef669778c61c21dbd4681483c51269a74a3ba1b1f75796b4680f0e30a286aa0173147b206f91c84731ec8ead074d187000000000000000000000000000000000e0f7595e4c136b4d8bbd1eeb021df7dd2bcf1d9f98e4fa293f7edab635e019af87c138275fefacd806213177af40eca0000000000000000000000000000000005dc209d6c86f1871637998c10490a70371f9e00a68d1363dfaeb62046473dfb4bbd3b18b943439f75c45a1ee7f264a90000000000000000000000000000000003d215567d1e8f504a72658d48fa51374ac77234552c17db4033af780133d8516bb0769678ecb50b8b9eb950c2dd73e80000000000000000000000000000000004d780849b731012e1e5732d5f6d32c659a95c3e1c8f5ef4841fe82afc6f0aa309b1e02dc2554a4a4ee781be2be2149f000000000000000000000000000000000073439cedc08916d00609c6152ee2844be85550ff5c199e9e9dddf09bedfc00d907dc85255651cff3e28a74d3b4836c000000000000000000000000000000000e57e74af4f2d6c08843152cce6d095d00679998463bfb41bef9c57ba427e14715e9e0da0e8c5193a798cf92590b34b4000000000000000000000000000000000e0f7595e4c136b4d8bbd1eeb021df7dd2bcf1d9f98e4fa293f7edab635e019af87c138275fefacd806213177af40eca0000000000000000000000000000000005dc209d6c86f1871637998c10490a70371f9e00a68d1363dfaeb62046473dfb4bbd3b18b943439f75c45a1ee7f264a90000000000000000000000000000000003d215567d1e8f504a72658d48fa51374ac77234552c17db4033af780133d8516bb0769678ecb50b8b9eb950c2dd73e80000000000000000000000000000000004d780849b731012e1e5732d5f6d32c659a95c3e1c8f5ef4841fe82afc6f0aa309b1e02dc2554a4a4ee781be2be2149f,,,invalid point: subgroup check failed +0000000000000000000000000000000005585544fc7ed448c7939c42235549edc98c5d9a793ec918274b49687e8b9267d53c2e5d66a44d889e8f2e94abab43490000000000000000000000000000000002a091dc69d5af394d408a3b5b60debffddac4db228c613b2e2f98b932aa8f90d9f5a77129fc0fe69b93ca64b0081eb9000000000000000000000000000000000f694959a69b0d692e167e95524555d58d06621d77f46c54b7f0da0a45c4cabdc8ac916b0f2052cb99b6f0f5bca36fd9000000000000000000000000000000000df814c1cf62a7a089984a3afe3f7636157ee17bbe0dde1aa2e56fe7168a3fee7c6102999dfd55b282f1a6a4ca0e0cda0000000000000000000000000000000002ce0806a288c2b9d7e03204f573b06c440be782469cf7f1478f53d5b017fa9ea3b1025cc5de378e2186c150cbd1bc0f0000000000000000000000000000000007d3c1d2c5806e73119cafe9efda5a8419679c89d17f7a90fa6302485d4efe9e44b287f573d576d7f45589c7501e40ff0000000000000000000000000000000005585544fc7ed448c7939c42235549edc98c5d9a793ec918274b49687e8b9267d53c2e5d66a44d889e8f2e94abab43490000000000000000000000000000000002a091dc69d5af394d408a3b5b60debffddac4db228c613b2e2f98b932aa8f90d9f5a77129fc0fe69b93ca64b0081eb900000000000000000000000000000000199d1db3ab960c003575ba7a53f489159aa2005bc9a30bc23e952b57ac892a2340a8adbe21eb07bcbac255be231c49120000000000000000000000000000000014303bc0d1c9748ebbbc187486650cd7651e51ebeb1bb428e153ca5e83fc4b118c7575efc03ac0ba500c6149f91db23f000000000000000000000000000000000b6383243f6914d41d2947ee74ccd299a20741e33bdad3aff2d05de662fb4d7b9b9266085bb71dee8c13dfbb121cdd320000000000000000000000000000000005d515210d948c48ee9f7ced4c23a5eb12c6bc26c974d518af4e14c1b2b2c5a286c2bc4d51ff5974eb939b4395f9d8ed,,,invalid point: subgroup check failed +000000000000000000000000000000000ba91d035c7a2da7e14c400bb137b66a4d8f563004bcf57a01f21223225b93f860eaab9c429b915a130115c8f61c606b00000000000000000000000000000000196c7f0f6b99772d1a5e97afd92a6ab4916a2f2df709bf6393a60fe29623b25dbdc989f22715fda427bf8cb84cdfd033000000000000000000000000000000000b362ce289c7edfb507b579fc8d344c5e7bfa8d58bf3629a41af7ec1faecfb9b95139d9a8159804691047e4b18bc1cd600000000000000000000000000000000112bac785b4033f11b08e845c8c5ce78e40138b0cc0b998dd8e0213bbfe0e5b96a83ff2b53ee9699b18efffdf879602a00000000000000000000000000000000157885a39334664681d8425bd60e9c1d12dd1ef45b9a3c40956df105cd3534ff9378203755119ed302a54adba9e5858d0000000000000000000000000000000008237a9ffe95f89a24e1e3a82d8f127766e2173505a9ef0e715b1ec711619664a12d86d247e530049ee542ee4d20cc7000000000000000000000000000000000072c644635936a91dcaee40e3b4794e634c315a39a9cb5cb99ef6784b332fdcfaafdc80e228cd19d0104d5796f584c350000000000000000000000000000000002318bea9077484e9c1937dfa63774b5ecf6fc63ff06e5cb653553d5111a981c09c907069ffe11b5704ea60a99873283000000000000000000000000000000000b362ce289c7edfb507b579fc8d344c5e7bfa8d58bf3629a41af7ec1faecfb9b95139d9a8159804691047e4b18bc1cd600000000000000000000000000000000112bac785b4033f11b08e845c8c5ce78e40138b0cc0b998dd8e0213bbfe0e5b96a83ff2b53ee9699b18efffdf879602a00000000000000000000000000000000157885a39334664681d8425bd60e9c1d12dd1ef45b9a3c40956df105cd3534ff9378203755119ed302a54adba9e5858d0000000000000000000000000000000008237a9ffe95f89a24e1e3a82d8f127766e2173505a9ef0e715b1ec711619664a12d86d247e530049ee542ee4d20cc70,,,invalid point: subgroup check failed +00000000000000000000000000000000077dfb9ac791b3471c6cbcb0b37b65adb0bc4e40341b85c13867bfdaf32365ddfb749ebfd965abfa22996773eab505540000000000000000000000000000000015e771a0f0149cfad7910a4a1971b39323948bc7530936db5d99a53b51bd656bdce093cc2b91ebad0f91a95034afa0e3000000000000000000000000000000000200775a5848ac14b5e762ae7d4b492d2dc0bd5e80ef7fc760d42ea6fb07ffd2944409052cfb773875df676a188da65b00000000000000000000000000000000140ec7de210c890e4c795eed394d32d77f6acad0a3628da2ec805d4cf2de9822b5a73f06bdbeeba0fc1068c26da675b20000000000000000000000000000000018e7877a3f27c5400b08bd2769616745e4657f6fe262f9d7b88330917f977efa463b3226f3433da95a82568d990b1fa50000000000000000000000000000000015801af4934193336cc67fe8f4be5d2093909006f8bdd3382d60fd5c6bce4b86071370eefbce7a04dbcfb825858f90eb00000000000000000000000000000000077dfb9ac791b3471c6cbcb0b37b65adb0bc4e40341b85c13867bfdaf32365ddfb749ebfd965abfa22996773eab505540000000000000000000000000000000015e771a0f0149cfad7910a4a1971b39323948bc7530936db5d99a53b51bd656bdce093cc2b91ebad0f91a95034afa0e30000000000000000000000000000000017bbbfef68883fbf6fa9cdcef37ef145d7fbe9532164530e9c08d196ee41f38784b257087ad53f4939426451fb5f955c0000000000000000000000000000000018bb97090375c21600b6d3ee0629cff78116aa59d7b665c08590add8cdff8247c38b588a25e0b11eee5111c63f8c619e000000000000000000000000000000000e181f7327776df8ec16258115303029c68e1b72fcad6395c6d7d477368e1697076333a2102447a225fb3f3d725b3b0b000000000000000000000000000000000291d82b95e9a2c3f766994c304dae7f19f1efc789f68c4e58eda102da36cd0d7eec3d5a1b1e88c63462c8ec0e4393a4,,,invalid point: subgroup check failed +00000000000000000000000000000000121a9b867c86195dc4aee07081c1ad62f066b471bb5a14f296943b263fb9a25e6805e3171624e7e7e45b78f175a1861300000000000000000000000000000000071e1c35979d6f43170e79c0db5cceccff01f17cc2980b771a6cc38e0b27438a9db8e00eb943142d992c6a395fe4aacc000000000000000000000000000000001819d13cf4522a9362bbeb0bbbb0a498c3f34da1c9e3b2c54d08f7c8acd9ee756983fe80405579effb79d673407390ef000000000000000000000000000000000f870e5978f4a6e3b655fb2a05541ac0673e7b10136adaf28be4dfc9022d4cc8a60e17d125dfe53fbe10c644ff37e02a0000000000000000000000000000000010207ef774cddd10db2bca0a051ceb12900c407ee265dea4615553c193d7475b5ba3198b7e0160740e4fd015dca33e1d0000000000000000000000000000000017937be546e06fd2eab4c969a029534c02fb770646d43edeb5e6c8bc0c2b5f35576c375bf860fd1087ce099d4377d24e0000000000000000000000000000000001a8b8cdcd160565a1df9cb5ccb06a62fbaf32b2cac4ec9a552773313c940688638775983815cb246d4eaafe91c3451100000000000000000000000000000000082a1237c161831a37589ff711f7873d5e092d8a4690b983c9ccbbf980422ed177a3ebbd4b4ae4b557bcb3ae532f1823000000000000000000000000000000001819d13cf4522a9362bbeb0bbbb0a498c3f34da1c9e3b2c54d08f7c8acd9ee756983fe80405579effb79d673407390ef000000000000000000000000000000000f870e5978f4a6e3b655fb2a05541ac0673e7b10136adaf28be4dfc9022d4cc8a60e17d125dfe53fbe10c644ff37e02a0000000000000000000000000000000010207ef774cddd10db2bca0a051ceb12900c407ee265dea4615553c193d7475b5ba3198b7e0160740e4fd015dca33e1d0000000000000000000000000000000017937be546e06fd2eab4c969a029534c02fb770646d43edeb5e6c8bc0c2b5f35576c375bf860fd1087ce099d4377d24e,,,invalid point: subgroup check failed +000000000000000000000000000000000a86f90fcd9b63a0cd5f53356c170699d78d03f180d59c38ff770560bda30bf412fdcf236b6720d94684ef1aab97bafc00000000000000000000000000000000030bcbb272ab20a2f27d45295875e3c29a8ad088bb8173feb6f6f4d2c81bbc91d673c23239e36bdafada8c7d50b54b440000000000000000000000000000000011e01c96294c726ed3ef22a5c6597d8202604c4fb14058bf44fa64ae6d342f6f77f151c8ecd99f793e79f0ad29c309f40000000000000000000000000000000000e186664d8c2a2e136ff1be2192573b94c083bf242b2c01c984a792e43a11a10599481a9a79f6a8d5b074bc16019725000000000000000000000000000000000fc48ade56f841489c4824411130fb5b7e0e83b613fa09099f318cef207ce035d5d6e7ecff5057c15ee764ec8a7fa20300000000000000000000000000000000003f1b261043887af57fab48b505ed7aa44132457d71a390646b70fcd073e677a7e275a89dd0a2bf32beae3b2bcbd6e9000000000000000000000000000000000a86f90fcd9b63a0cd5f53356c170699d78d03f180d59c38ff770560bda30bf412fdcf236b6720d94684ef1aab97bafc00000000000000000000000000000000030bcbb272ab20a2f27d45295875e3c29a8ad088bb8173feb6f6f4d2c81bbc91d673c23239e36bdafada8c7d50b54b44000000000000000000000000000000000781404020a416e2596ab361e02674e25cfb365420d35d5db7146f563a7675a942383da44ae4df49c45b38e371c82a2a0000000000000000000000000000000010c546bda090a13ccf0fec03bdcb87b41f5aed3b4e6740690afb9dadc57d773aae2d22a2d8323336c5b1dc5798725495000000000000000000000000000000000bea6aaaadbbe8102212279f1458c461d3a0d54e341c91b5e16e0ce5ba1517a13cd1d43e1d0b25a63b7cc57ece5369f3000000000000000000000000000000000b0b676e5cc2f6ac383f5dd42d379c552579f601de0cf4f34ac637383a31e393df40f5c0f95b5a8f57cd6fa4de01caeb,,,invalid point: subgroup check failed +0000000000000000000000000000000014372fb746da15863e9ee4e06099c7e513bdbe53ca772a4b61c81eaa7f841399422f7902893d5ee7f7d59d530e3674b10000000000000000000000000000000006ba991efa65ef8dfac8b07915cab83b5267babba1291e4662a81fdcb455faf33596f6730b6f5b3eac2076054a4ccf6600000000000000000000000000000000042ee88071289a2adeb69cbab5a3ac8c7935576bc434062091cdf1cada4b67a2501c179b5980b53256f623840a5aee5700000000000000000000000000000000063b0819dd470047a704f20f5f7c65ea0899f25603dfc7e8b8d5f0d0d323180aa921e43d63b45acc8fe9054326a8d9bb000000000000000000000000000000000615e2e5b0389017cd3ce7c15740caf3b897fbe4a59c68247c3c4229bf661257f56bcc10f55fc722f96424f5617d259700000000000000000000000000000000166f7cadf7cb9ac5a8cfa83fe4aaac0e32fd4de3e38e0d39e010d50f5b3d383243d6870505f2a285b7c5f6fc1b13f0f0000000000000000000000000000000000d1ed017ef4702bcd3bfbbcff36000af6a1d26ab363e68ea5629027e0b90352bf1d8e03c13a7955da6c15507cc1c9f47000000000000000000000000000000000e09830e54fe9eddd416479a1740f6f1b7693f2d153d322f27779b16bb6451d7657df85a55da75a4aee0a2e33b3a46e600000000000000000000000000000000042ee88071289a2adeb69cbab5a3ac8c7935576bc434062091cdf1cada4b67a2501c179b5980b53256f623840a5aee5700000000000000000000000000000000063b0819dd470047a704f20f5f7c65ea0899f25603dfc7e8b8d5f0d0d323180aa921e43d63b45acc8fe9054326a8d9bb000000000000000000000000000000000615e2e5b0389017cd3ce7c15740caf3b897fbe4a59c68247c3c4229bf661257f56bcc10f55fc722f96424f5617d259700000000000000000000000000000000166f7cadf7cb9ac5a8cfa83fe4aaac0e32fd4de3e38e0d39e010d50f5b3d383243d6870505f2a285b7c5f6fc1b13f0f0,,,invalid point: subgroup check failed +0000000000000000000000000000000009f0c6f9fac38e8c83183499b8918a1ffbc52f2400882edb66594f496ff38ffec77368f28e4f20767257e200f48255700000000000000000000000000000000002a05bfde9523ac13ba3518cd5b308c4985484f996e7192140d681d9934d501111a81445031d84d4a47a9727202c07620000000000000000000000000000000003004acd2a95d932b84233e80bebb9fd92b302809725d5ca0921a5d8983950ff521d89bcc2d1bc1e7c186c702bf7aa270000000000000000000000000000000011744ffc7092744a79e345be8b51569c5df8eb10b4e49957ade8df4ee4ede566b3825eec89027d70d188ff858a8b6cf4000000000000000000000000000000000e46cd26b21a8a933eac05ed526a2b8fe195e5a5435e79c7f385fb69a90190acd06e25e9b63af7862616c79add032597000000000000000000000000000000000ad60c22b3690c78c23682ba902a18e708e88430a55a9038975a43b4606ef4c6e2b8e648a25097b3a34bf6e4024d00280000000000000000000000000000000009f0c6f9fac38e8c83183499b8918a1ffbc52f2400882edb66594f496ff38ffec77368f28e4f20767257e200f48255700000000000000000000000000000000002a05bfde9523ac13ba3518cd5b308c4985484f996e7192140d681d9934d501111a81445031d84d4a47a9727202c07620000000000000000000000000000000007d87d13752c52bf0510cee94274f6f4a6e0675de9a4a864ba5058dd8771b6c5000e957cfca5279e64f09c21111322ec0000000000000000000000000000000007999819b5b57104c9432a9d4dc6ad377f0c6f0dd630155fc489aed1f8d18ce0386222813726cb786635778b74967bce0000000000000000000000000000000016b66e0ebcbf6043f6a7fe52bf527a9b763cd68d901933068966e6dbb9817e1287ebc2de9c3729df8b4228a4f92d9732000000000000000000000000000000000ee19b863d5ce19afce76e489e122948597ac6a5ee07e2d856a49377285ac93d6674cc5429e02bbd051d4edf7988ba89,,,invalid point: subgroup check failed +000000000000000000000000000000001269c2717ba196d5004865af806d4a99b8c238583db14f9c02da70b0275cf35a3a5276eec0c8e6934f11e0d5cc8b7c9f0000000000000000000000000000000017971814f15aaf3f6672b3a720cf6726aa042dbd82ac508a8f7ac5ddf17f377891199ba2fd01d990868347d45e3b37ae0000000000000000000000000000000001587e32753adc85c98cf1322115772b0e282ef4e6a75944fc86091e81aad076508e3d727f4df0e30924fff6b67c312e000000000000000000000000000000000ae96d3a1b79985e56f80df8ac4d9792229ca580b156dbbe71a9db470447fa4dfa19fc8a8a2e2f0fae28a24b7d6153d100000000000000000000000000000000114101ad0d29ddfd2fc436d2a270711c444c8c257785f4b4c549e9c795f6dd9834d3744995d2188c0c968752a7f68892000000000000000000000000000000000d30d9cc1e2273af745dd47a596a2202ca4fb655f9f9beeb0a87631e2461f29206163fd921761fde69654cb02e23505c0000000000000000000000000000000010cda048fed479f7bcd388a0acaa977b134055f5ea92b2a689793e301d58190c67031920ccf1cd97ecf9f429f5a022e00000000000000000000000000000000014c410faae20d54049aa7c644ec1ef0388367ac847f6781e62ec88eb9262ffff5f19cf5f4ebe791a44ad9a84fd78aca70000000000000000000000000000000001587e32753adc85c98cf1322115772b0e282ef4e6a75944fc86091e81aad076508e3d727f4df0e30924fff6b67c312e000000000000000000000000000000000ae96d3a1b79985e56f80df8ac4d9792229ca580b156dbbe71a9db470447fa4dfa19fc8a8a2e2f0fae28a24b7d6153d100000000000000000000000000000000114101ad0d29ddfd2fc436d2a270711c444c8c257785f4b4c549e9c795f6dd9834d3744995d2188c0c968752a7f68892000000000000000000000000000000000d30d9cc1e2273af745dd47a596a2202ca4fb655f9f9beeb0a87631e2461f29206163fd921761fde69654cb02e23505c,,,invalid point: subgroup check failed +000000000000000000000000000000001252aaecb588ffcdee3e4fd92ff5164feaf9aa39acbc71c704d8180611d30fe13e59bba805101dc1cecf77b254bc65510000000000000000000000000000000009dc3de2e8aa94dbcc25c8775e9bd0ae0fa8581df790e562e67f24c08efaab59a0a8062478a09c262040c5f0558971c3000000000000000000000000000000000b0a6f9e0b58db3015e1dc63f9d377895d25f48e8a05371ad90c3ef5f3085a76b888d38693eefdf3b1eedf80eab1736200000000000000000000000000000000006dfb36e1c281cf1c5a8be9a631cab94aa956bacf8e9e787c0e2bab4440f03f0efc56d5a058fde2e18696c569676d3b00000000000000000000000000000000118791bba7507725b7106bc889b68c3daa56dc3100d8378cf156268f249dbafd01025cb722d58246c95ac856dd5d0411000000000000000000000000000000000f942ab8fd1e71f6d4498403116ef41954e7967222f894b93ae31f061cafaa1ed3464520dc5123aad4b0a352a85efbf8000000000000000000000000000000001252aaecb588ffcdee3e4fd92ff5164feaf9aa39acbc71c704d8180611d30fe13e59bba805101dc1cecf77b254bc65510000000000000000000000000000000009dc3de2e8aa94dbcc25c8775e9bd0ae0fa8581df790e562e67f24c08efaab59a0a8062478a09c262040c5f0558971c3000000000000000000000000000000000c13d99118e4946773d0ae54a37895411e39ba0de604c5f69d0b3ddcd50c4261c38c510bc1e018dbdf449e303e398d820000000000000000000000000000000018427393a7ed2dee713e83e58a6537c5c6baeb69ceac3b574e02af78215d99b8cd01f0c944d075300d35176099b0aa8100000000000000000000000000000000140ab2527b79327e07344a673e688debec28aa29219a5b1646a3c2b599a9d374cf5e139ab00aa237bb8e29d021d766ea0000000000000000000000000000000017164f154d26566ecc983d38d77d694208864c024c3ffc69f19f84550e86eddd8dbb055a8cf543717ce3d65e1c64c53a,,,invalid point: subgroup check failed diff --git a/evm/src/test/resources/org/hyperledger/besu/evm/precompile/pairing.csv b/evm/src/test/resources/org/hyperledger/besu/evm/precompile/pairing.csv index 1b5feaae6..ea04bb5b7 100644 --- a/evm/src/test/resources/org/hyperledger/besu/evm/precompile/pairing.csv +++ b/evm/src/test/resources/org/hyperledger/besu/evm/precompile/pairing.csv @@ -95,10 +95,10 @@ input,result,gas,notes 0000000000000000000000000000000009ec00ea2da59d937d3154d86dbed2957667253401bce9de80e0ffe6df32f36b06404b9e3af08e912a0b4ef091f93efb000000000000000000000000000000000dd8d1bd66f4accbc9d0c7dabef7af72f51c67a0d61384647533ad92bba44a312f0be0fa52163176f1aff4e64c00aefb0000000000000000000000000000000001cdfae9234096578b9413f926ef8c6831f2c0f700e25d7553a746aef44238e493f8032e09f67f2fed9676c9611f60e70000000000000000000000000000000019c8bae08d3926997146f7827f00cde863684dd4050ea5da64f6798e7a930d3c1f34046bea0f44232594f5469db566280000000000000000000000000000000013574b997ee8988aa81db0e2ddb98be2e7005603076fac5cb246f65c869aa7bb3f148c8dde970e34e5e5efce023e633c000000000000000000000000000000000998bc9d41c5d527360fc4e68ba067d3778cf5cf00e5959b5ec52c1595aabe6e2e92d40cb34faa84513d150568c8cfc00000000000000000000000000000000009ec00ea2da59d937d3154d86dbed2957667253401bce9de80e0ffe6df32f36b06404b9e3af08e912a0b4ef091f93efb000000000000000000000000000000000c28402cd28b39ce814adfdb8453fd646f5ae3e41d718e5af1fd250e3b0cabf2efa01f045f3dce88c84f0b19b3fefbb00000000000000000000000000000000001cdfae9234096578b9413f926ef8c6831f2c0f700e25d7553a746aef44238e493f8032e09f67f2fed9676c9611f60e70000000000000000000000000000000019c8bae08d3926997146f7827f00cde863684dd4050ea5da64f6798e7a930d3c1f34046bea0f44232594f5469db566280000000000000000000000000000000013574b997ee8988aa81db0e2ddb98be2e7005603076fac5cb246f65c869aa7bb3f148c8dde970e34e5e5efce023e633c000000000000000000000000000000000998bc9d41c5d527360fc4e68ba067d3778cf5cf00e5959b5ec52c1595aabe6e2e92d40cb34faa84513d150568c8cfc00000000000000000000000000000000009ec00ea2da59d937d3154d86dbed2957667253401bce9de80e0ffe6df32f36b06404b9e3af08e912a0b4ef091f93efb000000000000000000000000000000000dd8d1bd66f4accbc9d0c7dabef7af72f51c67a0d61384647533ad92bba44a312f0be0fa52163176f1aff4e64c00aefb0000000000000000000000000000000001cdfae9234096578b9413f926ef8c6831f2c0f700e25d7553a746aef44238e493f8032e09f67f2fed9676c9611f60e70000000000000000000000000000000019c8bae08d3926997146f7827f00cde863684dd4050ea5da64f6798e7a930d3c1f34046bea0f44232594f5469db566280000000000000000000000000000000006a9c650ba974e0fa2fdf6d3659220f47d76f581ec156662b4e9dc4470164e68df977370d2bcf1cad4191031fdc1476f000000000000000000000000000000001068554cf7ba1173150be2cfb7ab4503ecea55b5f29f7d24086ba68b610637b5f0192bf1fe04557b68c1eafa9736daeb0000000000000000000000000000000009ec00ea2da59d937d3154d86dbed2957667253401bce9de80e0ffe6df32f36b06404b9e3af08e912a0b4ef091f93efb000000000000000000000000000000000c28402cd28b39ce814adfdb8453fd646f5ae3e41d718e5af1fd250e3b0cabf2efa01f045f3dce88c84f0b19b3fefbb00000000000000000000000000000000001cdfae9234096578b9413f926ef8c6831f2c0f700e25d7553a746aef44238e493f8032e09f67f2fed9676c9611f60e70000000000000000000000000000000019c8bae08d3926997146f7827f00cde863684dd4050ea5da64f6798e7a930d3c1f34046bea0f44232594f5469db566280000000000000000000000000000000006a9c650ba974e0fa2fdf6d3659220f47d76f581ec156662b4e9dc4470164e68df977370d2bcf1cad4191031fdc1476f000000000000000000000000000000001068554cf7ba1173150be2cfb7ab4503ecea55b5f29f7d24086ba68b610637b5f0192bf1fe04557b68c1eafa9736daeb0000000000000000000000000000000009ec00ea2da59d937d3154d86dbed2957667253401bce9de80e0ffe6df32f36b06404b9e3af08e912a0b4ef091f93efb000000000000000000000000000000000dd8d1bd66f4accbc9d0c7dabef7af72f51c67a0d61384647533ad92bba44a312f0be0fa52163176f1aff4e64c00aefb0000000000000000000000000000000001cdfae9234096578b9413f926ef8c6831f2c0f700e25d7553a746aef44238e493f8032e09f67f2fed9676c9611f60e70000000000000000000000000000000019c8bae08d3926997146f7827f00cde863684dd4050ea5da64f6798e7a930d3c1f34046bea0f44232594f5469db566280000000000000000000000000000000013574b997ee8988aa81db0e2ddb98be2e7005603076fac5cb246f65c869aa7bb3f148c8dde970e34e5e5efce023e633c000000000000000000000000000000000998bc9d41c5d527360fc4e68ba067d3778cf5cf00e5959b5ec52c1595aabe6e2e92d40cb34faa84513d150568c8cfc00000000000000000000000000000000009ec00ea2da59d937d3154d86dbed2957667253401bce9de80e0ffe6df32f36b06404b9e3af08e912a0b4ef091f93efb000000000000000000000000000000000c28402cd28b39ce814adfdb8453fd646f5ae3e41d718e5af1fd250e3b0cabf2efa01f045f3dce88c84f0b19b3fefbb00000000000000000000000000000000001cdfae9234096578b9413f926ef8c6831f2c0f700e25d7553a746aef44238e493f8032e09f67f2fed9676c9611f60e70000000000000000000000000000000019c8bae08d3926997146f7827f00cde863684dd4050ea5da64f6798e7a930d3c1f34046bea0f44232594f5469db566280000000000000000000000000000000013574b997ee8988aa81db0e2ddb98be2e7005603076fac5cb246f65c869aa7bb3f148c8dde970e34e5e5efce023e633c000000000000000000000000000000000998bc9d41c5d527360fc4e68ba067d3778cf5cf00e5959b5ec52c1595aabe6e2e92d40cb34faa84513d150568c8cfc00000000000000000000000000000000009ec00ea2da59d937d3154d86dbed2957667253401bce9de80e0ffe6df32f36b06404b9e3af08e912a0b4ef091f93efb000000000000000000000000000000000dd8d1bd66f4accbc9d0c7dabef7af72f51c67a0d61384647533ad92bba44a312f0be0fa52163176f1aff4e64c00aefb0000000000000000000000000000000001cdfae9234096578b9413f926ef8c6831f2c0f700e25d7553a746aef44238e493f8032e09f67f2fed9676c9611f60e70000000000000000000000000000000019c8bae08d3926997146f7827f00cde863684dd4050ea5da64f6798e7a930d3c1f34046bea0f44232594f5469db566280000000000000000000000000000000006a9c650ba974e0fa2fdf6d3659220f47d76f581ec156662b4e9dc4470164e68df977370d2bcf1cad4191031fdc1476f000000000000000000000000000000001068554cf7ba1173150be2cfb7ab4503ecea55b5f29f7d24086ba68b610637b5f0192bf1fe04557b68c1eafa9736daeb0000000000000000000000000000000009ec00ea2da59d937d3154d86dbed2957667253401bce9de80e0ffe6df32f36b06404b9e3af08e912a0b4ef091f93efb000000000000000000000000000000000c28402cd28b39ce814adfdb8453fd646f5ae3e41d718e5af1fd250e3b0cabf2efa01f045f3dce88c84f0b19b3fefbb00000000000000000000000000000000001cdfae9234096578b9413f926ef8c6831f2c0f700e25d7553a746aef44238e493f8032e09f67f2fed9676c9611f60e70000000000000000000000000000000019c8bae08d3926997146f7827f00cde863684dd4050ea5da64f6798e7a930d3c1f34046bea0f44232594f5469db566280000000000000000000000000000000006a9c650ba974e0fa2fdf6d3659220f47d76f581ec156662b4e9dc4470164e68df977370d2bcf1cad4191031fdc1476f000000000000000000000000000000001068554cf7ba1173150be2cfb7ab4503ecea55b5f29f7d24086ba68b610637b5f0192bf1fe04557b68c1eafa9736daeb,0000000000000000000000000000000000000000000000000000000000000001,409000, 0000000000000000000000000000000014153e01c9e495c5c01c82b3cad9eaf20cf78369ccbabf57fb160ded309cbd1caea3d3df38a7ea5490c67f168e9acec0000000000000000000000000000000001648030be79658c134e016a211d311841988065957b35e9bc1580fb6e05e291e747b7a960a50e26a2a3c0cd1634c3585000000000000000000000000000000000c78d84157dc0b102c3843e4c8e88f244cc1b2a27043e07b2fab694a58f93d47e4cf9ca1158a8e30e3d43f94a20d33b50000000000000000000000000000000004842fe0df312f735a9d8af0c2ff7c561ed9cf4add5e3e9402bcff1190f3f36ca91de8edc9472b3ebd27ee2d9afdf8770000000000000000000000000000000008c7a67b89960da4309888bc6ce31e7efe74867165a8aceda7c7290f8a92687100ccbcd39d4d5a67f21f4b63ecc638320000000000000000000000000000000001cd7978ce28629ed1a9c5433c555b1ebb584f80909599282467e7b2471f591bea1d73e7b0a247aed7de4f1fecc012040000000000000000000000000000000014153e01c9e495c5c01c82b3cad9eaf20cf78369ccbabf57fb160ded309cbd1caea3d3df38a7ea5490c67f168e9acec00000000000000000000000000000000003b90ede51e98dd9163b911431789b534aef452b9bd1b423a5d8c2ea1652cd05aa308568a7031d958fc2f32e9cb37526000000000000000000000000000000000c78d84157dc0b102c3843e4c8e88f244cc1b2a27043e07b2fab694a58f93d47e4cf9ca1158a8e30e3d43f94a20d33b50000000000000000000000000000000004842fe0df312f735a9d8af0c2ff7c561ed9cf4add5e3e9402bcff1190f3f36ca91de8edc9472b3ebd27ee2d9afdf8770000000000000000000000000000000008c7a67b89960da4309888bc6ce31e7efe74867165a8aceda7c7290f8a92687100ccbcd39d4d5a67f21f4b63ecc638320000000000000000000000000000000001cd7978ce28629ed1a9c5433c555b1ebb584f80909599282467e7b2471f591bea1d73e7b0a247aed7de4f1fecc012040000000000000000000000000000000014153e01c9e495c5c01c82b3cad9eaf20cf78369ccbabf57fb160ded309cbd1caea3d3df38a7ea5490c67f168e9acec0000000000000000000000000000000001648030be79658c134e016a211d311841988065957b35e9bc1580fb6e05e291e747b7a960a50e26a2a3c0cd1634c3585000000000000000000000000000000000c78d84157dc0b102c3843e4c8e88f244cc1b2a27043e07b2fab694a58f93d47e4cf9ca1158a8e30e3d43f94a20d33b50000000000000000000000000000000004842fe0df312f735a9d8af0c2ff7c561ed9cf4add5e3e9402bcff1190f3f36ca91de8edc9472b3ebd27ee2d9afdf8770000000000000000000000000000000011396b6eafe9d8f61a831ef9d6688e586602c5138ddc65d1bf69a9916c1e8db31ddf432b1406a597c7dfb49c1339727900000000000000000000000000000000183398716b5783fb7971e27306f651b8a91efc0462ef799742c8eaeeaf919d08348e8c1700b1b850e220b0e0133f98a70000000000000000000000000000000014153e01c9e495c5c01c82b3cad9eaf20cf78369ccbabf57fb160ded309cbd1caea3d3df38a7ea5490c67f168e9acec00000000000000000000000000000000003b90ede51e98dd9163b911431789b534aef452b9bd1b423a5d8c2ea1652cd05aa308568a7031d958fc2f32e9cb37526000000000000000000000000000000000c78d84157dc0b102c3843e4c8e88f244cc1b2a27043e07b2fab694a58f93d47e4cf9ca1158a8e30e3d43f94a20d33b50000000000000000000000000000000004842fe0df312f735a9d8af0c2ff7c561ed9cf4add5e3e9402bcff1190f3f36ca91de8edc9472b3ebd27ee2d9afdf8770000000000000000000000000000000011396b6eafe9d8f61a831ef9d6688e586602c5138ddc65d1bf69a9916c1e8db31ddf432b1406a597c7dfb49c1339727900000000000000000000000000000000183398716b5783fb7971e27306f651b8a91efc0462ef799742c8eaeeaf919d08348e8c1700b1b850e220b0e0133f98a70000000000000000000000000000000014153e01c9e495c5c01c82b3cad9eaf20cf78369ccbabf57fb160ded309cbd1caea3d3df38a7ea5490c67f168e9acec0000000000000000000000000000000001648030be79658c134e016a211d311841988065957b35e9bc1580fb6e05e291e747b7a960a50e26a2a3c0cd1634c3585000000000000000000000000000000000c78d84157dc0b102c3843e4c8e88f244cc1b2a27043e07b2fab694a58f93d47e4cf9ca1158a8e30e3d43f94a20d33b50000000000000000000000000000000004842fe0df312f735a9d8af0c2ff7c561ed9cf4add5e3e9402bcff1190f3f36ca91de8edc9472b3ebd27ee2d9afdf8770000000000000000000000000000000008c7a67b89960da4309888bc6ce31e7efe74867165a8aceda7c7290f8a92687100ccbcd39d4d5a67f21f4b63ecc638320000000000000000000000000000000001cd7978ce28629ed1a9c5433c555b1ebb584f80909599282467e7b2471f591bea1d73e7b0a247aed7de4f1fecc012040000000000000000000000000000000014153e01c9e495c5c01c82b3cad9eaf20cf78369ccbabf57fb160ded309cbd1caea3d3df38a7ea5490c67f168e9acec00000000000000000000000000000000003b90ede51e98dd9163b911431789b534aef452b9bd1b423a5d8c2ea1652cd05aa308568a7031d958fc2f32e9cb37526000000000000000000000000000000000c78d84157dc0b102c3843e4c8e88f244cc1b2a27043e07b2fab694a58f93d47e4cf9ca1158a8e30e3d43f94a20d33b50000000000000000000000000000000004842fe0df312f735a9d8af0c2ff7c561ed9cf4add5e3e9402bcff1190f3f36ca91de8edc9472b3ebd27ee2d9afdf8770000000000000000000000000000000008c7a67b89960da4309888bc6ce31e7efe74867165a8aceda7c7290f8a92687100ccbcd39d4d5a67f21f4b63ecc638320000000000000000000000000000000001cd7978ce28629ed1a9c5433c555b1ebb584f80909599282467e7b2471f591bea1d73e7b0a247aed7de4f1fecc012040000000000000000000000000000000014153e01c9e495c5c01c82b3cad9eaf20cf78369ccbabf57fb160ded309cbd1caea3d3df38a7ea5490c67f168e9acec0000000000000000000000000000000001648030be79658c134e016a211d311841988065957b35e9bc1580fb6e05e291e747b7a960a50e26a2a3c0cd1634c3585000000000000000000000000000000000c78d84157dc0b102c3843e4c8e88f244cc1b2a27043e07b2fab694a58f93d47e4cf9ca1158a8e30e3d43f94a20d33b50000000000000000000000000000000004842fe0df312f735a9d8af0c2ff7c561ed9cf4add5e3e9402bcff1190f3f36ca91de8edc9472b3ebd27ee2d9afdf8770000000000000000000000000000000011396b6eafe9d8f61a831ef9d6688e586602c5138ddc65d1bf69a9916c1e8db31ddf432b1406a597c7dfb49c1339727900000000000000000000000000000000183398716b5783fb7971e27306f651b8a91efc0462ef799742c8eaeeaf919d08348e8c1700b1b850e220b0e0133f98a70000000000000000000000000000000014153e01c9e495c5c01c82b3cad9eaf20cf78369ccbabf57fb160ded309cbd1caea3d3df38a7ea5490c67f168e9acec00000000000000000000000000000000003b90ede51e98dd9163b911431789b534aef452b9bd1b423a5d8c2ea1652cd05aa308568a7031d958fc2f32e9cb37526000000000000000000000000000000000c78d84157dc0b102c3843e4c8e88f244cc1b2a27043e07b2fab694a58f93d47e4cf9ca1158a8e30e3d43f94a20d33b50000000000000000000000000000000004842fe0df312f735a9d8af0c2ff7c561ed9cf4add5e3e9402bcff1190f3f36ca91de8edc9472b3ebd27ee2d9afdf8770000000000000000000000000000000011396b6eafe9d8f61a831ef9d6688e586602c5138ddc65d1bf69a9916c1e8db31ddf432b1406a597c7dfb49c1339727900000000000000000000000000000000183398716b5783fb7971e27306f651b8a91efc0462ef799742c8eaeeaf919d08348e8c1700b1b850e220b0e0133f98a7,0000000000000000000000000000000000000000000000000000000000000001,409000, 000000000000000000000000000000001555535228eb9a24f460df9894d59aa06fc848a8bf8d6c3b51653b1d85734b3c5a2bece161309bd478d356fa198d579500000000000000000000000000000000144401f7eb69f6321eae8dad39dbe2cf4ae58e455474701dd9f1b62c85c7536813e84eb4f9def511eb62e5194288728b000000000000000000000000000000000e619d79792ac685030311a31a21203e5172d2e5d20ecf69a1e64158e7fe903b3695fd15432d3ca35562b5a8bd9cbdc20000000000000000000000000000000012394a621a503d1d92df3306649a6c6979816cabeb8f8d27450ec883c4e75f6f7411f3bfd068dc8dee58cdb8ebbd91bd0000000000000000000000000000000001652a688dbfd63a1c89452335bdaf248c97c9c6e5a3ad5a126577a6b9ab57075b22987ea8697b459611a5ab164f328400000000000000000000000000000000058a37347c5637808632ae6e8f264e8bde14ebb0ae69828f962f51b728321fea57c5a97ab694f7db175efe7a17d36cb6000000000000000000000000000000001555535228eb9a24f460df9894d59aa06fc848a8bf8d6c3b51653b1d85734b3c5a2bece161309bd478d356fa198d57950000000000000000000000000000000005bd0ff24e15f0682c6d1a09096fca081991bd3f9f10a2a18d3f1c7470e9a2bc0ac3b149b7750aedce9c1ae6bd773820000000000000000000000000000000000e619d79792ac685030311a31a21203e5172d2e5d20ecf69a1e64158e7fe903b3695fd15432d3ca35562b5a8bd9cbdc20000000000000000000000000000000012394a621a503d1d92df3306649a6c6979816cabeb8f8d27450ec883c4e75f6f7411f3bfd068dc8dee58cdb8ebbd91bd0000000000000000000000000000000001652a688dbfd63a1c89452335bdaf248c97c9c6e5a3ad5a126577a6b9ab57075b22987ea8697b459611a5ab164f328400000000000000000000000000000000058a37347c5637808632ae6e8f264e8bde14ebb0ae69828f962f51b728321fea57c5a97ab694f7db175efe7a17d36cb6000000000000000000000000000000001555535228eb9a24f460df9894d59aa06fc848a8bf8d6c3b51653b1d85734b3c5a2bece161309bd478d356fa198d579500000000000000000000000000000000144401f7eb69f6321eae8dad39dbe2cf4ae58e455474701dd9f1b62c85c7536813e84eb4f9def511eb62e5194288728b000000000000000000000000000000000e619d79792ac685030311a31a21203e5172d2e5d20ecf69a1e64158e7fe903b3695fd15432d3ca35562b5a8bd9cbdc20000000000000000000000000000000012394a621a503d1d92df3306649a6c6979816cabeb8f8d27450ec883c4e75f6f7411f3bfd068dc8dee58cdb8ebbd91bd00000000000000000000000000000000189be781abc010602e9262930d8dfdb2d7df81be0de1656554cb5afa3d059f1cc389678008ea84ba23ed5a54e9b07827000000000000000000000000000000001476dab5bd29af19c4e8f947b4255e4b86625fd4451b902fd10180e9ce7ed639c6e65683fabf0824a2a00185e82c3df5000000000000000000000000000000001555535228eb9a24f460df9894d59aa06fc848a8bf8d6c3b51653b1d85734b3c5a2bece161309bd478d356fa198d57950000000000000000000000000000000005bd0ff24e15f0682c6d1a09096fca081991bd3f9f10a2a18d3f1c7470e9a2bc0ac3b149b7750aedce9c1ae6bd773820000000000000000000000000000000000e619d79792ac685030311a31a21203e5172d2e5d20ecf69a1e64158e7fe903b3695fd15432d3ca35562b5a8bd9cbdc20000000000000000000000000000000012394a621a503d1d92df3306649a6c6979816cabeb8f8d27450ec883c4e75f6f7411f3bfd068dc8dee58cdb8ebbd91bd00000000000000000000000000000000189be781abc010602e9262930d8dfdb2d7df81be0de1656554cb5afa3d059f1cc389678008ea84ba23ed5a54e9b07827000000000000000000000000000000001476dab5bd29af19c4e8f947b4255e4b86625fd4451b902fd10180e9ce7ed639c6e65683fabf0824a2a00185e82c3df5000000000000000000000000000000001555535228eb9a24f460df9894d59aa06fc848a8bf8d6c3b51653b1d85734b3c5a2bece161309bd478d356fa198d579500000000000000000000000000000000144401f7eb69f6321eae8dad39dbe2cf4ae58e455474701dd9f1b62c85c7536813e84eb4f9def511eb62e5194288728b000000000000000000000000000000000e619d79792ac685030311a31a21203e5172d2e5d20ecf69a1e64158e7fe903b3695fd15432d3ca35562b5a8bd9cbdc20000000000000000000000000000000012394a621a503d1d92df3306649a6c6979816cabeb8f8d27450ec883c4e75f6f7411f3bfd068dc8dee58cdb8ebbd91bd0000000000000000000000000000000001652a688dbfd63a1c89452335bdaf248c97c9c6e5a3ad5a126577a6b9ab57075b22987ea8697b459611a5ab164f328400000000000000000000000000000000058a37347c5637808632ae6e8f264e8bde14ebb0ae69828f962f51b728321fea57c5a97ab694f7db175efe7a17d36cb6000000000000000000000000000000001555535228eb9a24f460df9894d59aa06fc848a8bf8d6c3b51653b1d85734b3c5a2bece161309bd478d356fa198d57950000000000000000000000000000000005bd0ff24e15f0682c6d1a09096fca081991bd3f9f10a2a18d3f1c7470e9a2bc0ac3b149b7750aedce9c1ae6bd773820000000000000000000000000000000000e619d79792ac685030311a31a21203e5172d2e5d20ecf69a1e64158e7fe903b3695fd15432d3ca35562b5a8bd9cbdc20000000000000000000000000000000012394a621a503d1d92df3306649a6c6979816cabeb8f8d27450ec883c4e75f6f7411f3bfd068dc8dee58cdb8ebbd91bd0000000000000000000000000000000001652a688dbfd63a1c89452335bdaf248c97c9c6e5a3ad5a126577a6b9ab57075b22987ea8697b459611a5ab164f328400000000000000000000000000000000058a37347c5637808632ae6e8f264e8bde14ebb0ae69828f962f51b728321fea57c5a97ab694f7db175efe7a17d36cb6000000000000000000000000000000001555535228eb9a24f460df9894d59aa06fc848a8bf8d6c3b51653b1d85734b3c5a2bece161309bd478d356fa198d579500000000000000000000000000000000144401f7eb69f6321eae8dad39dbe2cf4ae58e455474701dd9f1b62c85c7536813e84eb4f9def511eb62e5194288728b000000000000000000000000000000000e619d79792ac685030311a31a21203e5172d2e5d20ecf69a1e64158e7fe903b3695fd15432d3ca35562b5a8bd9cbdc20000000000000000000000000000000012394a621a503d1d92df3306649a6c6979816cabeb8f8d27450ec883c4e75f6f7411f3bfd068dc8dee58cdb8ebbd91bd00000000000000000000000000000000189be781abc010602e9262930d8dfdb2d7df81be0de1656554cb5afa3d059f1cc389678008ea84ba23ed5a54e9b07827000000000000000000000000000000001476dab5bd29af19c4e8f947b4255e4b86625fd4451b902fd10180e9ce7ed639c6e65683fabf0824a2a00185e82c3df5000000000000000000000000000000001555535228eb9a24f460df9894d59aa06fc848a8bf8d6c3b51653b1d85734b3c5a2bece161309bd478d356fa198d57950000000000000000000000000000000005bd0ff24e15f0682c6d1a09096fca081991bd3f9f10a2a18d3f1c7470e9a2bc0ac3b149b7750aedce9c1ae6bd773820000000000000000000000000000000000e619d79792ac685030311a31a21203e5172d2e5d20ecf69a1e64158e7fe903b3695fd15432d3ca35562b5a8bd9cbdc20000000000000000000000000000000012394a621a503d1d92df3306649a6c6979816cabeb8f8d27450ec883c4e75f6f7411f3bfd068dc8dee58cdb8ebbd91bd00000000000000000000000000000000189be781abc010602e9262930d8dfdb2d7df81be0de1656554cb5afa3d059f1cc389678008ea84ba23ed5a54e9b07827000000000000000000000000000000001476dab5bd29af19c4e8f947b4255e4b86625fd4451b902fd10180e9ce7ed639c6e65683fabf0824a2a00185e82c3df5,0000000000000000000000000000000000000000000000000000000000000001,409000, -00000000000000000000000000000012196c5a43d69224d8713389285f26b98f86ee910ab3dd668e413738282003cc5b7357af9a7af54bb713d62255e80f560000000000000000000000000000000006ba8102bfbeea4416b710c73e8cce3032c31c6269c44906f8ac4f7874ce99fb17559992486528963884ce429a992fee0000000000000000000000000000000017c9fcf0504e62d3553b2f089b64574150aa5117bd3d2e89a8c1ed59bb7f70fb83215975ef31976e757abf60a75a1d9f0000000000000000000000000000000008f5a53d704298fe0cfc955e020442874fe87d5c729c7126abbdcbed355eef6c8f07277bee6d49d56c4ebaf334848624000000000000000000000000000000001302dcc50c6ce4c28086f8e1b43f9f65543cf598be440123816765ab6bc93f62bceda80045fbcad8598d4f32d03ee8fa000000000000000000000000000000000bbb4eb37628d60b035a3e0c45c0ea8c4abef5a6ddc5625e0560097ef9caab208221062e81cd77ef72162923a1906a40,,115000,invalid input parameters, invalid input length for pairing +00000000000000000000000000000012196c5a43d69224d8713389285f26b98f86ee910ab3dd668e413738282003cc5b7357af9a7af54bb713d62255e80f560000000000000000000000000000000006ba8102bfbeea4416b710c73e8cce3032c31c6269c44906f8ac4f7874ce99fb17559992486528963884ce429a992fee0000000000000000000000000000000017c9fcf0504e62d3553b2f089b64574150aa5117bd3d2e89a8c1ed59bb7f70fb83215975ef31976e757abf60a75a1d9f0000000000000000000000000000000008f5a53d704298fe0cfc955e020442874fe87d5c729c7126abbdcbed355eef6c8f07277bee6d49d56c4ebaf334848624000000000000000000000000000000001302dcc50c6ce4c28086f8e1b43f9f65543cf598be440123816765ab6bc93f62bceda80045fbcad8598d4f32d03ee8fa000000000000000000000000000000000bbb4eb37628d60b035a3e0c45c0ea8c4abef5a6ddc5625e0560097ef9caab208221062e81cd77ef72162923a1906a40,,115000,invalid input parameters, invalid number of pairs 000000000000000000000000000000000012196c5a43d69224d8713389285f26b98f86ee910ab3dd668e413738282003cc5b7357af9a7af54bb713d62255e80f560000000000000000000000000000000006ba8102bfbeea4416b710c73e8cce3032c31c6269c44906f8ac4f7874ce99fb17559992486528963884ce429a992fee0000000000000000000000000000000017c9fcf0504e62d3553b2f089b64574150aa5117bd3d2e89a8c1ed59bb7f70fb83215975ef31976e757abf60a75a1d9f0000000000000000000000000000000008f5a53d704298fe0cfc955e020442874fe87d5c729c7126abbdcbed355eef6c8f07277bee6d49d56c4ebaf334848624000000000000000000000000000000001302dcc50c6ce4c28086f8e1b43f9f65543cf598be440123816765ab6bc93f62bceda80045fbcad8598d4f32d03ee8fa000000000000000000000000000000000bbb4eb37628d60b035a3e0c45c0ea8c4abef5a6ddc5625e0560097ef9caab208221062e81cd77ef72162923a1906a40,,108000,invalid input parameters, invalid input length for pairing -,,115000,invalid input parameters, Invalid number of pairs -0000000000000000000000000000000012196c5a43d69224d8713389285f26b98f86ee910ab3dd668e413738282003cc5b7357af9a7af54bb713d62255e80f570000000000000000000000000000000006ba8102bfbeea4416b710c73e8cce3032c31c6269c44906f8ac4f7874ce99fb17559992486528963884ce429a992fee0000000000000000000000000000000017c9fcf0504e62d3553b2f089b64574150aa5117bd3d2e89a8c1ed59bb7f70fb83215975ef31976e757abf60a75a1d9f0000000000000000000000000000000008f5a53d704298fe0cfc955e020442874fe87d5c729c7126abbdcbed355eef6c8f07277bee6d49d56c4ebaf334848624000000000000000000000000000000001302dcc50c6ce4c28086f8e1b43f9f65543cf598be440123816765ab6bc93f62bceda80045fbcad8598d4f32d03ee8fa000000000000000000000000000000000bbb4eb37628d60b035a3e0c45c0ea8c4abef5a6ddc5625e0560097ef9caab208221062e81cd77ef72162923a1906a40,,108000,invalid input parameters, G1 point is not on curve -0000000000000000000000000000000012196c5a43d69224d8713389285f26b98f86ee910ab3dd668e413738282003cc5b7357af9a7af54bb713d62255e80f560000000000000000000000000000000006ba8102bfbeea4416b710c73e8cce3032c31c6269c44906f8ac4f7874ce99fb17559992486528963884ce429a992fee0000000000000000000000000000000017c9fcf0504e62d3553b2f089b64574150aa5117bd3d2e89a8c1ed59bb7f70fb83215975ef31976e757abf60a75a1da00000000000000000000000000000000008f5a53d704298fe0cfc955e020442874fe87d5c729c7126abbdcbed355eef6c8f07277bee6d49d56c4ebaf334848624000000000000000000000000000000001302dcc50c6ce4c28086f8e1b43f9f65543cf598be440123816765ab6bc93f62bceda80045fbcad8598d4f32d03ee8fa000000000000000000000000000000000bbb4eb37628d60b035a3e0c45c0ea8c4abef5a6ddc5625e0560097ef9caab208221062e81cd77ef72162923a1906a40,,108000,invalid input parameters, G2 point is not on curve -000000000000000000000000000000001830f52d9bff64a623c6f5259e2cd2c2a08ea17a8797aaf83174ea1e8c3bd3955c2af1d39bfa474815bfe60714b7cd80000000000000000000000000000000000874389c02d4cf1c61bc54c4c24def11dfbe7880bc998a95e70063009451ee8226fec4b278aade3a7cea55659459f1d500000000000000000000000000000000197737f831d4dc7e708475f4ca7ca15284db2f3751fcaac0c17f517f1ddab35e1a37907d7b99b39d6c8d9001cd50e79e000000000000000000000000000000000af1a3f6396f0c983e7c2d42d489a3ae5a3ff0a553d93154f73ac770cd0af7467aa0cef79f10bbd34621b3ec9583a834000000000000000000000000000000001918cb6e448ed69fb906145de3f11455ee0359d030e90d673ce050a360d796de33ccd6a941c49a1414aca1c26f9e699e0000000000000000000000000000000019a915154a13249d784093facc44520e7f3a18410ab2a3093e0b12657788e9419eec25729944f7945e732104939e7a9e000000000000000000000000000000001830f52d9bff64a623c6f5259e2cd2c2a08ea17a8797aaf83174ea1e8c3bd3955c2af1d39bfa474815bfe60714b7cd9000000000000000000000000000000000118cd94e36ab177de95f52f180fdbdc584b8d30436eb882980306fa0625f07a1f7ad3b4c38a921c53d14aa9a6ba5b8d600000000000000000000000000000000197737f831d4dc7e708475f4ca7ca15284db2f3751fcaac0c17f517f1ddab35e1a37907d7b99b39d6c8d9001cd50e79e000000000000000000000000000000000af1a3f6396f0c983e7c2d42d489a3ae5a3ff0a553d93154f73ac770cd0af7467aa0cef79f10bbd34621b3ec9583a834000000000000000000000000000000001918cb6e448ed69fb906145de3f11455ee0359d030e90d673ce050a360d796de33ccd6a941c49a1414aca1c26f9e699e0000000000000000000000000000000019a915154a13249d784093facc44520e7f3a18410ab2a3093e0b12657788e9419eec25729944f7945e732104939e7a9e,,151000,invalid input parameters, G1 point is not on curve -000000000000000000000000000000001830f52d9bff64a623c6f5259e2cd2c2a08ea17a8797aaf83174ea1e8c3bd3955c2af1d39bfa474815bfe60714b7cd80000000000000000000000000000000000874389c02d4cf1c61bc54c4c24def11dfbe7880bc998a95e70063009451ee8226fec4b278aade3a7cea55659459f1d500000000000000000000000000000000197737f831d4dc7e708475f4ca7ca15284db2f3751fcaac0c17f517f1ddab35e1a37907d7b99b39d6c8d9001cd50e79e000000000000000000000000000000000af1a3f6396f0c983e7c2d42d489a3ae5a3ff0a553d93154f73ac770cd0af7467aa0cef79f10bbd34621b3ec9583a834000000000000000000000000000000001918cb6e448ed69fb906145de3f11455ee0359d030e90d673ce050a360d796de33ccd6a941c49a1414aca1c26f9e699e0000000000000000000000000000000019a915154a13249d784093facc44520e7f3a18410ab2a3093e0b12657788e9419eec25729944f7945e732104939e7a9e000000000000000000000000000000001830f52d9bff64a623c6f5259e2cd2c2a08ea17a8797aaf83174ea1e8c3bd3955c2af1d39bfa474815bfe60714b7cd8000000000000000000000000000000000118cd94e36ab177de95f52f180fdbdc584b8d30436eb882980306fa0625f07a1f7ad3b4c38a921c53d14aa9a6ba5b8d600000000000000000000000000000000197737f831d4dc7e708475f4ca7ca15284db2f3751fcaac0c17f517f1ddab35e1a37907d7b99b39d6c8d9001cd50e79f000000000000000000000000000000000af1a3f6396f0c983e7c2d42d489a3ae5a3ff0a553d93154f73ac770cd0af7467aa0cef79f10bbd34621b3ec9583a834000000000000000000000000000000001918cb6e448ed69fb906145de3f11455ee0359d030e90d673ce050a360d796de33ccd6a941c49a1414aca1c26f9e699e0000000000000000000000000000000019a915154a13249d784093facc44520e7f3a18410ab2a3093e0b12657788e9419eec25729944f7945e732104939e7a9e,,151000,invalid input parameters, G2 point is not on curve +,,115000,invalid input parameters, invalid number of pairs +0000000000000000000000000000000012196c5a43d69224d8713389285f26b98f86ee910ab3dd668e413738282003cc5b7357af9a7af54bb713d62255e80f570000000000000000000000000000000006ba8102bfbeea4416b710c73e8cce3032c31c6269c44906f8ac4f7874ce99fb17559992486528963884ce429a992fee0000000000000000000000000000000017c9fcf0504e62d3553b2f089b64574150aa5117bd3d2e89a8c1ed59bb7f70fb83215975ef31976e757abf60a75a1d9f0000000000000000000000000000000008f5a53d704298fe0cfc955e020442874fe87d5c729c7126abbdcbed355eef6c8f07277bee6d49d56c4ebaf334848624000000000000000000000000000000001302dcc50c6ce4c28086f8e1b43f9f65543cf598be440123816765ab6bc93f62bceda80045fbcad8598d4f32d03ee8fa000000000000000000000000000000000bbb4eb37628d60b035a3e0c45c0ea8c4abef5a6ddc5625e0560097ef9caab208221062e81cd77ef72162923a1906a40,,108000,invalid point: point is not on curve +0000000000000000000000000000000012196c5a43d69224d8713389285f26b98f86ee910ab3dd668e413738282003cc5b7357af9a7af54bb713d62255e80f560000000000000000000000000000000006ba8102bfbeea4416b710c73e8cce3032c31c6269c44906f8ac4f7874ce99fb17559992486528963884ce429a992fee0000000000000000000000000000000017c9fcf0504e62d3553b2f089b64574150aa5117bd3d2e89a8c1ed59bb7f70fb83215975ef31976e757abf60a75a1da00000000000000000000000000000000008f5a53d704298fe0cfc955e020442874fe87d5c729c7126abbdcbed355eef6c8f07277bee6d49d56c4ebaf334848624000000000000000000000000000000001302dcc50c6ce4c28086f8e1b43f9f65543cf598be440123816765ab6bc93f62bceda80045fbcad8598d4f32d03ee8fa000000000000000000000000000000000bbb4eb37628d60b035a3e0c45c0ea8c4abef5a6ddc5625e0560097ef9caab208221062e81cd77ef72162923a1906a40,,108000,invalid point: point is not on curve +000000000000000000000000000000001830f52d9bff64a623c6f5259e2cd2c2a08ea17a8797aaf83174ea1e8c3bd3955c2af1d39bfa474815bfe60714b7cd80000000000000000000000000000000000874389c02d4cf1c61bc54c4c24def11dfbe7880bc998a95e70063009451ee8226fec4b278aade3a7cea55659459f1d500000000000000000000000000000000197737f831d4dc7e708475f4ca7ca15284db2f3751fcaac0c17f517f1ddab35e1a37907d7b99b39d6c8d9001cd50e79e000000000000000000000000000000000af1a3f6396f0c983e7c2d42d489a3ae5a3ff0a553d93154f73ac770cd0af7467aa0cef79f10bbd34621b3ec9583a834000000000000000000000000000000001918cb6e448ed69fb906145de3f11455ee0359d030e90d673ce050a360d796de33ccd6a941c49a1414aca1c26f9e699e0000000000000000000000000000000019a915154a13249d784093facc44520e7f3a18410ab2a3093e0b12657788e9419eec25729944f7945e732104939e7a9e000000000000000000000000000000001830f52d9bff64a623c6f5259e2cd2c2a08ea17a8797aaf83174ea1e8c3bd3955c2af1d39bfa474815bfe60714b7cd9000000000000000000000000000000000118cd94e36ab177de95f52f180fdbdc584b8d30436eb882980306fa0625f07a1f7ad3b4c38a921c53d14aa9a6ba5b8d600000000000000000000000000000000197737f831d4dc7e708475f4ca7ca15284db2f3751fcaac0c17f517f1ddab35e1a37907d7b99b39d6c8d9001cd50e79e000000000000000000000000000000000af1a3f6396f0c983e7c2d42d489a3ae5a3ff0a553d93154f73ac770cd0af7467aa0cef79f10bbd34621b3ec9583a834000000000000000000000000000000001918cb6e448ed69fb906145de3f11455ee0359d030e90d673ce050a360d796de33ccd6a941c49a1414aca1c26f9e699e0000000000000000000000000000000019a915154a13249d784093facc44520e7f3a18410ab2a3093e0b12657788e9419eec25729944f7945e732104939e7a9e,,151000,invalid point: point is not on curve +000000000000000000000000000000001830f52d9bff64a623c6f5259e2cd2c2a08ea17a8797aaf83174ea1e8c3bd3955c2af1d39bfa474815bfe60714b7cd80000000000000000000000000000000000874389c02d4cf1c61bc54c4c24def11dfbe7880bc998a95e70063009451ee8226fec4b278aade3a7cea55659459f1d500000000000000000000000000000000197737f831d4dc7e708475f4ca7ca15284db2f3751fcaac0c17f517f1ddab35e1a37907d7b99b39d6c8d9001cd50e79e000000000000000000000000000000000af1a3f6396f0c983e7c2d42d489a3ae5a3ff0a553d93154f73ac770cd0af7467aa0cef79f10bbd34621b3ec9583a834000000000000000000000000000000001918cb6e448ed69fb906145de3f11455ee0359d030e90d673ce050a360d796de33ccd6a941c49a1414aca1c26f9e699e0000000000000000000000000000000019a915154a13249d784093facc44520e7f3a18410ab2a3093e0b12657788e9419eec25729944f7945e732104939e7a9e000000000000000000000000000000001830f52d9bff64a623c6f5259e2cd2c2a08ea17a8797aaf83174ea1e8c3bd3955c2af1d39bfa474815bfe60714b7cd8000000000000000000000000000000000118cd94e36ab177de95f52f180fdbdc584b8d30436eb882980306fa0625f07a1f7ad3b4c38a921c53d14aa9a6ba5b8d600000000000000000000000000000000197737f831d4dc7e708475f4ca7ca15284db2f3751fcaac0c17f517f1ddab35e1a37907d7b99b39d6c8d9001cd50e79f000000000000000000000000000000000af1a3f6396f0c983e7c2d42d489a3ae5a3ff0a553d93154f73ac770cd0af7467aa0cef79f10bbd34621b3ec9583a834000000000000000000000000000000001918cb6e448ed69fb906145de3f11455ee0359d030e90d673ce050a360d796de33ccd6a941c49a1414aca1c26f9e699e0000000000000000000000000000000019a915154a13249d784093facc44520e7f3a18410ab2a3093e0b12657788e9419eec25729944f7945e732104939e7a9e,,151000,invalid point: point is not on curve From 5cb00f2f5ff84b66d974bc4ab2f3248e26fb03aa Mon Sep 17 00:00:00 2001 From: Matilda-Clerke Date: Mon, 15 Jul 2024 12:45:36 +1000 Subject: [PATCH 50/58] 6612 update changelog with removed syncmodes (#7320) * 6612: Update changelog with removal of deprecated sync modes Signed-off-by: Matilda Clerke * 6612: Update changelog with removal of deprecated sync modes Signed-off-by: Matilda Clerke * 6612: Update changelog with removal of deprecated sync modes Signed-off-by: Matilda Clerke --------- Signed-off-by: Matilda Clerke --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index c8a6730a9..70714d205 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ ## Next release ### Breaking Changes +- Removed deprecated sync modes (X_SNAP and X_CHECKPOINT). Use SNAP and CHECKPOINT instead [#7309](https://github.com/hyperledger/besu/pull/7309) ### Additions and Improvements - `--Xsnapsync-bft-enabled` option enables experimental support for snap sync with IBFT/QBFT permissioned Bonsai-DB chains [#7140](https://github.com/hyperledger/besu/pull/7140) From 51f10dcdd2efbf31172ee1774d29d61b171c8a67 Mon Sep 17 00:00:00 2001 From: Danno Ferrin Date: Sun, 14 Jul 2024 21:05:22 -0600 Subject: [PATCH 51/58] Update datacopy (#7319) Check for OOG earlier in DataCopy. Add unit tests to cover operation branches. Signed-off-by: Danno Ferrin --- .../besu/evm/operation/DataCopyOperation.java | 4 + .../evm/operations/DataCopyOperationTest.java | 179 ++++++++++++++++++ 2 files changed, 183 insertions(+) create mode 100644 evm/src/test/java/org/hyperledger/besu/evm/operations/DataCopyOperationTest.java diff --git a/evm/src/main/java/org/hyperledger/besu/evm/operation/DataCopyOperation.java b/evm/src/main/java/org/hyperledger/besu/evm/operation/DataCopyOperation.java index 7813358ea..a7f7b0147 100644 --- a/evm/src/main/java/org/hyperledger/besu/evm/operation/DataCopyOperation.java +++ b/evm/src/main/java/org/hyperledger/besu/evm/operation/DataCopyOperation.java @@ -18,6 +18,7 @@ import static org.hyperledger.besu.evm.internal.Words.clampedToInt; import org.hyperledger.besu.evm.Code; import org.hyperledger.besu.evm.EVM; +import org.hyperledger.besu.evm.frame.ExceptionalHaltReason; import org.hyperledger.besu.evm.frame.MessageFrame; import org.hyperledger.besu.evm.gascalculator.GasCalculator; @@ -58,6 +59,9 @@ public class DataCopyOperation extends AbstractOperation { final int sourceOffset = clampedToInt(frame.popStackItem()); final int length = clampedToInt(frame.popStackItem()); final long cost = cost(frame, memOffset, length); + if (cost > frame.getRemainingGas()) { + return new OperationResult(cost, ExceptionalHaltReason.INSUFFICIENT_GAS); + } final Bytes data = code.getData(sourceOffset, length); frame.writeMemory(memOffset, length, data); diff --git a/evm/src/test/java/org/hyperledger/besu/evm/operations/DataCopyOperationTest.java b/evm/src/test/java/org/hyperledger/besu/evm/operations/DataCopyOperationTest.java new file mode 100644 index 000000000..83d7f09e5 --- /dev/null +++ b/evm/src/test/java/org/hyperledger/besu/evm/operations/DataCopyOperationTest.java @@ -0,0 +1,179 @@ +/* + * Copyright contributors to Hyperledger Besu. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on + * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the + * specific language governing permissions and limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + */ +package org.hyperledger.besu.evm.operations; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assumptions.assumeThat; + +import org.hyperledger.besu.evm.Code; +import org.hyperledger.besu.evm.EVM; +import org.hyperledger.besu.evm.MainnetEVMs; +import org.hyperledger.besu.evm.frame.ExceptionalHaltReason; +import org.hyperledger.besu.evm.frame.MessageFrame; +import org.hyperledger.besu.evm.gascalculator.PragueGasCalculator; +import org.hyperledger.besu.evm.internal.EvmConfiguration; +import org.hyperledger.besu.evm.operation.DataCopyOperation; +import org.hyperledger.besu.evm.operation.Operation; +import org.hyperledger.besu.evm.testutils.TestMessageFrameBuilder; + +import java.util.Arrays; +import java.util.Collection; + +import org.apache.tuweni.bytes.Bytes; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.MethodSource; + +class DataCopyOperationTest { + + static EVM evm = MainnetEVMs.pragueEOF(EvmConfiguration.DEFAULT); + + static Collection datacopyTestVector() { + return Arrays.asList( + new Object[][] { + { + "Copy after, no overlap", + Bytes.fromHexString("0123456789abcdef000000000000000000000000000000000000000000000000"), + 32, + 0, + 8, + Bytes.fromHexString( + "00000000000000000000000000000000000000000000000000000000000000000123456789abcdef"), + 12L + }, + { + "copy past data limit", + Bytes.EMPTY, + 0, + 24, + 16, + Bytes.fromHexString( + "0x0000000000000000000000000000000000000000000000000000000000000000"), + 9L + }, + { + "copy from initialized + uninitialized memory", + Bytes.fromHexString( + "0x0000000000000000000000000000000000000000000000000123456789abcdef"), + 64, + 24, + 16, + Bytes.fromHexString( + "0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000123456789abcdef000000000000000000000000000000000000000000000000"), + 15L + }, + { + "overlapping src < dst", + Bytes.fromHexString( + "0x0123456789abcdef000000000000000000000000000000000000000000000000"), + 4, + 0, + 8, + Bytes.fromHexString( + "0x000000000123456789abcdef0000000000000000000000000000000000000000"), + 9L + }, + { + "overlapping src > dst", + Bytes.fromHexString( + "0x00112233445566778899aabbccddeeff00000000000000000000000000000000"), + 0, + 4, + 8, + Bytes.fromHexString( + "0x445566778899aabb000000000000000000000000000000000000000000000000"), + 9L + }, + { + "overlapping src == dst", + Bytes.fromHexString( + "0x00112233445566778899aabbccddeeff00000000000000000000000000000000"), + 4, + 4, + 8, + Bytes.fromHexString( + "0x00000000445566778899aabb0000000000000000000000000000000000000000"), + 9L + }, + {"large dst offset", Bytes.EMPTY, 0x8000000000000010L, 4, 8, Bytes.EMPTY, 8796294610953L}, + { + "large src offset", + Bytes.EMPTY, + 4, + 0x8000000000000010L, + 8, + Bytes.fromHexString( + "0x0000000000000000000000000000000000000000000000000000000000000000"), + 9L + }, + {"large len", Bytes.EMPTY, 4, 4, 0x8000000000000010L, Bytes.EMPTY, 8796093284361L} + }); + } + + @SuppressWarnings("unused") + @ParameterizedTest(name = "{0}") + @MethodSource("datacopyTestVector") + void testMCopy( + final String name, + final Bytes data, + final long dst, + final long src, + final long len, + final Bytes expected, + final long gasCost) { + DataCopyOperation subject = new DataCopyOperation(new PragueGasCalculator()); + String eofCode = + "0xef0001010004020001001d04%04x000080000367%016x67%016x67%016xd300%s" + .formatted(data.size(), dst, src, len, data.toUnprefixedHexString()); + Code code = evm.getCodeUncached(Bytes.fromHexString(eofCode)); + assumeThat(code.isValid()).isTrue(); + + MessageFrame frame = + new TestMessageFrameBuilder() + .pushStackItem(Bytes.ofUnsignedLong(len)) + .pushStackItem(Bytes.ofUnsignedLong(src)) + .pushStackItem(Bytes.ofUnsignedLong(dst)) + .initialGas(10_000_000) + .code(code) + .build(); + + Operation.OperationResult result = subject.execute(frame, evm); + + assertThat(frame.memoryWordSize()).isEqualTo((expected.size() + 31) / 32); + assertThat(frame.readMemory(0, expected.size())).isEqualTo(expected); + assertThat(result.getGasCost()).isEqualTo(gasCost); + } + + @Test + void legacyCallFails() { + DataCopyOperation subject = new DataCopyOperation(new PragueGasCalculator()); + Code code = evm.getCodeUncached(Bytes.fromHexString("0x600460046004d3")); + assumeThat(code.isValid()).isTrue(); + + MessageFrame frame = + new TestMessageFrameBuilder() + .pushStackItem(Bytes.ofUnsignedLong(4)) + .pushStackItem(Bytes.ofUnsignedLong(4)) + .pushStackItem(Bytes.ofUnsignedLong(4)) + .initialGas(10_000_000) + .code(code) + .pc(6) + .build(); + + Operation.OperationResult result = subject.execute(frame, evm); + assertThat(result.getGasCost()).isZero(); + assertThat(result.getHaltReason()).isEqualTo(ExceptionalHaltReason.INVALID_OPERATION); + } +} From ab513b26a2b09ebb80f9cd8fb7465a278b1a9e3f Mon Sep 17 00:00:00 2001 From: Sally MacFarlane Date: Mon, 15 Jul 2024 14:02:50 +1000 Subject: [PATCH 52/58] disable flaky test (#7308) * disable flaky test Signed-off-by: Sally MacFarlane * disable flaky test Signed-off-by: Sally MacFarlane --------- Signed-off-by: Sally MacFarlane --- .../AccountLocalAndOnchainPermissioningAcceptanceTest.java | 2 ++ .../NodeLocalAndOnchainPermissioningAcceptanceTest.java | 2 ++ 2 files changed, 4 insertions(+) diff --git a/acceptance-tests/tests/src/test/java/org/hyperledger/besu/tests/acceptance/permissioning/AccountLocalAndOnchainPermissioningAcceptanceTest.java b/acceptance-tests/tests/src/test/java/org/hyperledger/besu/tests/acceptance/permissioning/AccountLocalAndOnchainPermissioningAcceptanceTest.java index 1d38f7e6c..1bd6d4cf9 100644 --- a/acceptance-tests/tests/src/test/java/org/hyperledger/besu/tests/acceptance/permissioning/AccountLocalAndOnchainPermissioningAcceptanceTest.java +++ b/acceptance-tests/tests/src/test/java/org/hyperledger/besu/tests/acceptance/permissioning/AccountLocalAndOnchainPermissioningAcceptanceTest.java @@ -22,8 +22,10 @@ import java.math.BigInteger; import java.util.Arrays; import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; +@Disabled("permissioning tests flaky with timeouts") public class AccountLocalAndOnchainPermissioningAcceptanceTest extends AccountSmartContractPermissioningAcceptanceTestBase { diff --git a/acceptance-tests/tests/src/test/java/org/hyperledger/besu/tests/acceptance/permissioning/NodeLocalAndOnchainPermissioningAcceptanceTest.java b/acceptance-tests/tests/src/test/java/org/hyperledger/besu/tests/acceptance/permissioning/NodeLocalAndOnchainPermissioningAcceptanceTest.java index 3dfdae528..9271c0d97 100644 --- a/acceptance-tests/tests/src/test/java/org/hyperledger/besu/tests/acceptance/permissioning/NodeLocalAndOnchainPermissioningAcceptanceTest.java +++ b/acceptance-tests/tests/src/test/java/org/hyperledger/besu/tests/acceptance/permissioning/NodeLocalAndOnchainPermissioningAcceptanceTest.java @@ -17,8 +17,10 @@ package org.hyperledger.besu.tests.acceptance.permissioning; import org.hyperledger.besu.tests.acceptance.dsl.node.Node; import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; +@Disabled("permissioning tests flaky with timeouts") public class NodeLocalAndOnchainPermissioningAcceptanceTest extends NodeSmartContractPermissioningAcceptanceTestBase { From 17f4dc9a8a612042927232ddc0b956f80320933d Mon Sep 17 00:00:00 2001 From: Danno Ferrin Date: Sun, 14 Jul 2024 22:31:18 -0600 Subject: [PATCH 53/58] Update unit test (#7317) * Update parameterized unit tests so the enumerate with --dry-run * Update the prague-withdrawal.json unit test to handle current code Signed-off-by: Danno Ferrin Co-authored-by: Sally MacFarlane --- .../blockchain/ExpectBeneficiary.java | 2 +- .../blockchain/ExpectBlockNumberAbove.java | 2 +- .../dsl/condition/clique/ExpectNonceVote.java | 2 +- .../clique/ExpectedBlockHasProposer.java | 2 +- .../besu/ForkIdsNetworkConfigTest.java | 8 +++ .../chainimport/JsonBlockImporterTest.java | 7 +++ .../cli/NetworkDeprecationMessageTest.java | 8 +++ .../clique/CliqueProtocolScheduleTest.java | 2 +- .../blockcreation/CliqueBlockCreatorTest.java | 7 ++- .../CliqueExtraDataValidationRuleTest.java | 2 +- .../VoteValidationRuleTest.java | 10 +++- .../jsonrpc/methods/CliqueProposalsTest.java | 2 +- .../besu/consensus/common/bft/VoteTest.java | 2 +- .../AbstractVoteProposerMethodTest.java | 2 +- .../consensus/ibft/BftBlockHashingTest.java | 2 +- .../methods/IbftGetPendingVotesTest.java | 2 +- .../api/graphql/EthGraphQLHttpBySpecTest.java | 9 ++++ .../JsonRpcHttpServiceParameterizedTest.java | 8 +++ .../jsonrpc/RpcErrorTypeConverterTest.java | 8 +++ .../bonsai/DebugJsonRpcHttpBySpecTest.java | 10 ++++ .../DebugTraceJsonRpcHttpBySpecTest.java | 10 ++++ .../EthByzantiumJsonRpcHttpBySpecTest.java | 10 ++++ .../bonsai/EthJsonRpcHttpBySpecTest.java | 10 ++++ .../bonsai/TraceJsonRpcHttpBySpecTest.java | 10 ++++ .../api/jsonrpc/context/ContextKeyTest.java | 8 +++ .../forest/DebugJsonRpcHttpBySpecTest.java | 10 ++++ .../DebugTraceJsonRpcHttpBySpecTest.java | 10 ++++ .../EthByzantiumJsonRpcHttpBySpecTest.java | 10 ++++ .../forest/EthJsonRpcHttpBySpecTest.java | 10 ++++ .../forest/TraceJsonRpcHttpBySpecTest.java | 10 ++++ .../internal/methods/TraceFilterTest.java | 8 +++ ...endingPermissionTransactionFilterTest.java | 8 +++ .../jsonrpc/timeout/TimeoutHandlerTest.java | 9 ++++ .../ethereum/api/query/BackendQueryTest.java | 8 +++ .../HashRateMiningCoordinatorTest.java | 8 +++ .../besu/ethereum/chain/GenesisStateTest.java | 8 +++ .../besu/ethereum/core/UtilTest.java | 2 +- .../encoding/BlobTransactionEncodingTest.java | 8 +++ .../feemarket/BaseFeeMarketBaseFeeTest.java | 8 +++ .../CoinbaseFeePriceCalculatorTest.java | 8 +++ .../TransactionPriceCalculatorTest.java | 8 +++ .../ForkIdBackwardCompatibilityTest.java | 8 +++ .../ethereum/mainnet/IntrinsicGasTest.java | 10 ++++ .../PragueWithdrawalRequestValidatorTest.java | 8 +++ .../ethereum/mainnet/RefundSstoreGasTest.java | 9 ++++ .../WithdrawalRequestValidatorTest.java | 8 +++ ...yValidationRuleFixedBaseFeeMarketTest.java | 8 +++ .../GasLimitElasticityValidationRuleTest.java | 8 +++ ...tyValidationRuleZeroBaseFeeMarketTest.java | 8 +++ ...sLimitRangeAndDeltaValidationRuleTest.java | 8 +++ .../GasUsageValidationRuleTest.java | 8 +++ .../ProofOfWorkValidationRuleTest.java | 8 +++ .../util/BlockchainUtilParameterizedTest.java | 8 +++ .../eth/sync/ChainHeadTrackerTest.java | 9 ++++ .../CheckPointSyncChainDownloaderTest.java | 14 ++++- .../fastsync/FastDownloaderFactoryTest.java | 8 +++ .../sync/fastsync/FastSyncActionsTest.java | 8 +++ .../fastsync/FastSyncChainDownloaderTest.java | 12 ++++- .../sync/fastsync/FastSyncDownloaderTest.java | 8 +++ .../fastsync/PivotBlockConfirmerTest.java | 8 +++ .../fastsync/PivotBlockRetrieverTest.java | 8 +++ .../FastWorldDownloadStateTest.java | 8 +++ .../fullsync/FullSyncChainDownloaderTest.java | 12 ++++- ...DownloaderTotalTerminalDifficultyTest.java | 12 ++++- .../sync/fullsync/FullSyncDownloaderTest.java | 12 ++++- .../fullsync/FullSyncTargetManagerTest.java | 12 ++++- .../snapsync/SnapWorldDownloadStateTest.java | 8 +++ .../StorageTrieNodeHealingRequestTest.java | 10 ++++ ...neCommonAncestorTaskParameterizedTest.java | 8 +++ .../eth/sync/tasks/PersistBlockTaskTest.java | 8 +++ ...TransactionPoolReplacementHandlerTest.java | 8 +++ ...sactionReplacementByFeeMarketRuleTest.java | 8 +++ ...nsactionReplacementByGasPriceRuleTest.java | 8 +++ .../TransactionReplacementRulesTest.java | 8 +++ .../eth/transactions/layered/LayersTest.java | 8 +++ .../besu/evmtool/EvmToolSpecTests.java | 8 +++ .../besu/evmtool/t8n/prague-withdrawal.json | 53 ++++++++++--------- .../internal/PeerRequirementCombineTest.java | 8 +++ .../ethereum/p2p/peers/EnodeURLImplTest.java | 5 ++ .../netty/TLSContextFactoryTest.java | 8 +++ .../besu/evm/code/EOFLayoutTest.java | 8 +++ .../CancunGasCalculatorTest.java | 8 +++ .../besu/evm/internal/WordsTest.java | 8 +++ .../evm/operations/ChainIdOperationTest.java | 8 +++ ...stantinopleSStoreOperationGasCostTest.java | 8 +++ .../LondonSStoreOperationGasCostTest.java | 8 +++ .../evm/operations/MCopyOperationTest.java | 8 +++ .../evm/operations/SStoreOperationTest.java | 8 +++ .../besu/evm/operations/SarOperationTest.java | 9 ++++ .../operations/SelfDestructOperationTest.java | 8 +++ .../besu/evm/operations/ShlOperationTest.java | 9 ++++ .../besu/evm/operations/ShrOperationTest.java | 9 ++++ .../BLAKE2BFPrecompileContractTest.java | 8 +++ .../BLS12G1AddPrecompiledContractTest.java | 8 +++ .../BLS12G1MulPrecompiledContractTest.java | 8 +++ ...LS12G1MultiExpPrecompiledContractTest.java | 8 +++ .../BLS12G2AddPrecompiledContractTest.java | 8 +++ .../BLS12G2MulPrecompiledContractTest.java | 8 +++ ...LS12G2MultiExpPrecompiledContractTest.java | 8 +++ ...LS12MapFp2ToG2PrecompiledContractTest.java | 8 +++ ...BLS12MapFpToG1PrecompiledContractTest.java | 8 +++ .../BLS12PairingPrecompiledContractTest.java | 8 +++ .../ECRECPrecompiledContractTest.java | 8 +++ .../KZGPointEvalPrecompileContractTest.java | 8 +++ .../MODEXPPrecompiledContractTest.java | 8 +++ 105 files changed, 817 insertions(+), 50 deletions(-) diff --git a/acceptance-tests/dsl/src/main/java/org/hyperledger/besu/tests/acceptance/dsl/condition/blockchain/ExpectBeneficiary.java b/acceptance-tests/dsl/src/main/java/org/hyperledger/besu/tests/acceptance/dsl/condition/blockchain/ExpectBeneficiary.java index 25abc0782..fe765cbea 100644 --- a/acceptance-tests/dsl/src/main/java/org/hyperledger/besu/tests/acceptance/dsl/condition/blockchain/ExpectBeneficiary.java +++ b/acceptance-tests/dsl/src/main/java/org/hyperledger/besu/tests/acceptance/dsl/condition/blockchain/ExpectBeneficiary.java @@ -14,7 +14,7 @@ */ package org.hyperledger.besu.tests.acceptance.dsl.condition.blockchain; -import static org.assertj.core.api.Java6Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThat; import org.hyperledger.besu.tests.acceptance.dsl.WaitUtils; import org.hyperledger.besu.tests.acceptance.dsl.condition.Condition; diff --git a/acceptance-tests/dsl/src/main/java/org/hyperledger/besu/tests/acceptance/dsl/condition/blockchain/ExpectBlockNumberAbove.java b/acceptance-tests/dsl/src/main/java/org/hyperledger/besu/tests/acceptance/dsl/condition/blockchain/ExpectBlockNumberAbove.java index 60fa6ad54..6919581bf 100644 --- a/acceptance-tests/dsl/src/main/java/org/hyperledger/besu/tests/acceptance/dsl/condition/blockchain/ExpectBlockNumberAbove.java +++ b/acceptance-tests/dsl/src/main/java/org/hyperledger/besu/tests/acceptance/dsl/condition/blockchain/ExpectBlockNumberAbove.java @@ -14,7 +14,7 @@ */ package org.hyperledger.besu.tests.acceptance.dsl.condition.blockchain; -import static org.assertj.core.api.Java6Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThat; import org.hyperledger.besu.tests.acceptance.dsl.WaitUtils; import org.hyperledger.besu.tests.acceptance.dsl.condition.Condition; diff --git a/acceptance-tests/dsl/src/main/java/org/hyperledger/besu/tests/acceptance/dsl/condition/clique/ExpectNonceVote.java b/acceptance-tests/dsl/src/main/java/org/hyperledger/besu/tests/acceptance/dsl/condition/clique/ExpectNonceVote.java index 6882890c1..1e8f4b8a9 100644 --- a/acceptance-tests/dsl/src/main/java/org/hyperledger/besu/tests/acceptance/dsl/condition/clique/ExpectNonceVote.java +++ b/acceptance-tests/dsl/src/main/java/org/hyperledger/besu/tests/acceptance/dsl/condition/clique/ExpectNonceVote.java @@ -14,7 +14,7 @@ */ package org.hyperledger.besu.tests.acceptance.dsl.condition.clique; -import static org.assertj.core.api.Java6Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThat; import static org.hyperledger.besu.tests.acceptance.dsl.condition.clique.ExpectNonceVote.CLIQUE_NONCE_VOTE.AUTH; import org.hyperledger.besu.tests.acceptance.dsl.WaitUtils; diff --git a/acceptance-tests/dsl/src/main/java/org/hyperledger/besu/tests/acceptance/dsl/condition/clique/ExpectedBlockHasProposer.java b/acceptance-tests/dsl/src/main/java/org/hyperledger/besu/tests/acceptance/dsl/condition/clique/ExpectedBlockHasProposer.java index 53b166c71..4abba67a0 100644 --- a/acceptance-tests/dsl/src/main/java/org/hyperledger/besu/tests/acceptance/dsl/condition/clique/ExpectedBlockHasProposer.java +++ b/acceptance-tests/dsl/src/main/java/org/hyperledger/besu/tests/acceptance/dsl/condition/clique/ExpectedBlockHasProposer.java @@ -14,7 +14,7 @@ */ package org.hyperledger.besu.tests.acceptance.dsl.condition.clique; -import static org.assertj.core.api.Java6Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThat; import org.hyperledger.besu.consensus.clique.CliqueBlockHeaderFunctions; import org.hyperledger.besu.consensus.clique.CliqueExtraData; diff --git a/besu/src/test/java/org/hyperledger/besu/ForkIdsNetworkConfigTest.java b/besu/src/test/java/org/hyperledger/besu/ForkIdsNetworkConfigTest.java index ae338f27c..fe5077acc 100644 --- a/besu/src/test/java/org/hyperledger/besu/ForkIdsNetworkConfigTest.java +++ b/besu/src/test/java/org/hyperledger/besu/ForkIdsNetworkConfigTest.java @@ -44,6 +44,7 @@ import java.util.stream.Stream; import com.google.common.collect.Streams; import org.apache.tuweni.bytes.Bytes; +import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.MethodSource; import org.junit.runner.RunWith; @@ -207,4 +208,11 @@ public class ForkIdsNetworkConfigTest { MilestoneStreamingProtocolSchedule::streamMilestoneBlocks); } } + + @Test + void dryRunDetector() { + assertThat(true) + .withFailMessage("This test is here so gradle --dry-run executes this class") + .isTrue(); + } } diff --git a/besu/src/test/java/org/hyperledger/besu/chainimport/JsonBlockImporterTest.java b/besu/src/test/java/org/hyperledger/besu/chainimport/JsonBlockImporterTest.java index 522f268c5..73015afd0 100644 --- a/besu/src/test/java/org/hyperledger/besu/chainimport/JsonBlockImporterTest.java +++ b/besu/src/test/java/org/hyperledger/besu/chainimport/JsonBlockImporterTest.java @@ -410,6 +410,13 @@ public abstract class JsonBlockImporterTest { + genesisConfigFile.getConfigOptions().getConsensusEngine()); } } + + @Test + void dryRunDetector() { + assertThat(true) + .withFailMessage("This test is here so gradle --dry-run executes this class") + .isTrue(); + } } protected Block getBlockAt(final Blockchain blockchain, final long blockNumber) { diff --git a/besu/src/test/java/org/hyperledger/besu/cli/NetworkDeprecationMessageTest.java b/besu/src/test/java/org/hyperledger/besu/cli/NetworkDeprecationMessageTest.java index e140db8c2..87be2a699 100644 --- a/besu/src/test/java/org/hyperledger/besu/cli/NetworkDeprecationMessageTest.java +++ b/besu/src/test/java/org/hyperledger/besu/cli/NetworkDeprecationMessageTest.java @@ -20,6 +20,7 @@ import static org.assertj.core.api.Assertions.assertThatThrownBy; import org.hyperledger.besu.cli.config.NetworkName; import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.EnumSource; @@ -45,4 +46,11 @@ class NetworkDeprecationMessageTest { assertThatThrownBy(() -> NetworkDeprecationMessage.generate(network)) .isInstanceOf(AssertionError.class); } + + @Test + void dryRunDetector() { + assertThat(true) + .withFailMessage("This test is here so gradle --dry-run executes this class") + .isTrue(); + } } diff --git a/consensus/clique/src/test/java/org/hyperledger/besu/consensus/clique/CliqueProtocolScheduleTest.java b/consensus/clique/src/test/java/org/hyperledger/besu/consensus/clique/CliqueProtocolScheduleTest.java index 30a3967da..35f959e45 100644 --- a/consensus/clique/src/test/java/org/hyperledger/besu/consensus/clique/CliqueProtocolScheduleTest.java +++ b/consensus/clique/src/test/java/org/hyperledger/besu/consensus/clique/CliqueProtocolScheduleTest.java @@ -14,8 +14,8 @@ */ package org.hyperledger.besu.consensus.clique; +import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; -import static org.assertj.core.api.Java6Assertions.assertThat; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; diff --git a/consensus/clique/src/test/java/org/hyperledger/besu/consensus/clique/blockcreation/CliqueBlockCreatorTest.java b/consensus/clique/src/test/java/org/hyperledger/besu/consensus/clique/blockcreation/CliqueBlockCreatorTest.java index 7dcbfa34b..485b2aff7 100644 --- a/consensus/clique/src/test/java/org/hyperledger/besu/consensus/clique/blockcreation/CliqueBlockCreatorTest.java +++ b/consensus/clique/src/test/java/org/hyperledger/besu/consensus/clique/blockcreation/CliqueBlockCreatorTest.java @@ -14,7 +14,7 @@ */ package org.hyperledger.besu.consensus.clique.blockcreation; -import static org.assertj.core.api.Java6Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThat; import static org.hyperledger.besu.ethereum.core.InMemoryKeyValueStorageProvider.createInMemoryBlockchain; import static org.hyperledger.besu.ethereum.core.InMemoryKeyValueStorageProvider.createInMemoryWorldStateArchive; import static org.mockito.ArgumentMatchers.any; @@ -75,7 +75,6 @@ import java.util.Optional; import com.google.common.collect.Lists; import org.apache.tuweni.bytes.Bytes; -import org.assertj.core.api.Java6Assertions; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -98,7 +97,7 @@ public class CliqueBlockCreatorTest { private VoteProvider voteProvider; @BeforeEach - public void setup() { + void setup() { protocolSchedule = CliqueProtocolSchedule.create( GenesisConfigFile.DEFAULT.getConfigOptions(), @@ -160,7 +159,7 @@ public class CliqueBlockCreatorTest { final Block createdBlock = blockCreator.createBlock(5L).getBlock(); - Java6Assertions.assertThat(CliqueHelpers.getProposerOfBlock(createdBlock.getHeader())) + assertThat(CliqueHelpers.getProposerOfBlock(createdBlock.getHeader())) .isEqualTo(proposerAddress); } diff --git a/consensus/clique/src/test/java/org/hyperledger/besu/consensus/clique/headervalidationrules/CliqueExtraDataValidationRuleTest.java b/consensus/clique/src/test/java/org/hyperledger/besu/consensus/clique/headervalidationrules/CliqueExtraDataValidationRuleTest.java index 0d30cdf65..afcc7e23c 100644 --- a/consensus/clique/src/test/java/org/hyperledger/besu/consensus/clique/headervalidationrules/CliqueExtraDataValidationRuleTest.java +++ b/consensus/clique/src/test/java/org/hyperledger/besu/consensus/clique/headervalidationrules/CliqueExtraDataValidationRuleTest.java @@ -14,7 +14,7 @@ */ package org.hyperledger.besu.consensus.clique.headervalidationrules; -import static org.assertj.core.api.Java6Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; diff --git a/consensus/clique/src/test/java/org/hyperledger/besu/consensus/clique/headervalidationrules/VoteValidationRuleTest.java b/consensus/clique/src/test/java/org/hyperledger/besu/consensus/clique/headervalidationrules/VoteValidationRuleTest.java index fdb688595..0ba0e5f3c 100644 --- a/consensus/clique/src/test/java/org/hyperledger/besu/consensus/clique/headervalidationrules/VoteValidationRuleTest.java +++ b/consensus/clique/src/test/java/org/hyperledger/besu/consensus/clique/headervalidationrules/VoteValidationRuleTest.java @@ -14,7 +14,7 @@ */ package org.hyperledger.besu.consensus.clique.headervalidationrules; -import static org.assertj.core.api.Java6Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThat; import org.hyperledger.besu.consensus.clique.CliqueBlockInterface; import org.hyperledger.besu.ethereum.core.BlockHeader; @@ -22,6 +22,7 @@ import org.hyperledger.besu.ethereum.core.BlockHeaderTestFixture; import java.util.stream.Stream; +import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtensionContext; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; @@ -52,4 +53,11 @@ public class VoteValidationRuleTest { assertThat(uut.validate(header, null)).isEqualTo(expectedResult); } + + @Test + void dryRunDetector() { + assertThat(true) + .withFailMessage("This test is here so gradle --dry-run executes this class") + .isTrue(); + } } diff --git a/consensus/clique/src/test/java/org/hyperledger/besu/consensus/clique/jsonrpc/methods/CliqueProposalsTest.java b/consensus/clique/src/test/java/org/hyperledger/besu/consensus/clique/jsonrpc/methods/CliqueProposalsTest.java index 50dc379b5..cdfbeb629 100644 --- a/consensus/clique/src/test/java/org/hyperledger/besu/consensus/clique/jsonrpc/methods/CliqueProposalsTest.java +++ b/consensus/clique/src/test/java/org/hyperledger/besu/consensus/clique/jsonrpc/methods/CliqueProposalsTest.java @@ -14,7 +14,7 @@ */ package org.hyperledger.besu.consensus.clique.jsonrpc.methods; -import static org.assertj.core.api.Java6Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThat; import org.hyperledger.besu.consensus.common.jsonrpc.AbstractVoteProposerMethod; import org.hyperledger.besu.consensus.common.jsonrpc.AbstractVoteProposerMethodTest; diff --git a/consensus/common/src/test/java/org/hyperledger/besu/consensus/common/bft/VoteTest.java b/consensus/common/src/test/java/org/hyperledger/besu/consensus/common/bft/VoteTest.java index b01a3a97c..ec37b1d4b 100644 --- a/consensus/common/src/test/java/org/hyperledger/besu/consensus/common/bft/VoteTest.java +++ b/consensus/common/src/test/java/org/hyperledger/besu/consensus/common/bft/VoteTest.java @@ -14,7 +14,7 @@ */ package org.hyperledger.besu.consensus.common.bft; -import static org.assertj.core.api.Java6Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThat; import org.hyperledger.besu.datatypes.Address; diff --git a/consensus/common/src/test/java/org/hyperledger/besu/consensus/common/jsonrpc/AbstractVoteProposerMethodTest.java b/consensus/common/src/test/java/org/hyperledger/besu/consensus/common/jsonrpc/AbstractVoteProposerMethodTest.java index a59bd556e..eefe1784c 100644 --- a/consensus/common/src/test/java/org/hyperledger/besu/consensus/common/jsonrpc/AbstractVoteProposerMethodTest.java +++ b/consensus/common/src/test/java/org/hyperledger/besu/consensus/common/jsonrpc/AbstractVoteProposerMethodTest.java @@ -14,7 +14,7 @@ */ package org.hyperledger.besu.consensus.common.jsonrpc; -import static org.assertj.core.api.Java6Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; diff --git a/consensus/ibft/src/test/java/org/hyperledger/besu/consensus/ibft/BftBlockHashingTest.java b/consensus/ibft/src/test/java/org/hyperledger/besu/consensus/ibft/BftBlockHashingTest.java index 7d5362ff7..1b821c78c 100644 --- a/consensus/ibft/src/test/java/org/hyperledger/besu/consensus/ibft/BftBlockHashingTest.java +++ b/consensus/ibft/src/test/java/org/hyperledger/besu/consensus/ibft/BftBlockHashingTest.java @@ -15,7 +15,7 @@ package org.hyperledger.besu.consensus.ibft; import static java.util.Collections.emptyList; -import static org.assertj.core.api.Java6Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThat; import org.hyperledger.besu.consensus.common.bft.BftBlockHashing; import org.hyperledger.besu.consensus.common.bft.BftBlockHeaderFunctions; diff --git a/consensus/ibft/src/test/java/org/hyperledger/besu/consensus/ibft/jsonrpc/methods/IbftGetPendingVotesTest.java b/consensus/ibft/src/test/java/org/hyperledger/besu/consensus/ibft/jsonrpc/methods/IbftGetPendingVotesTest.java index ddede6aef..b3d8cd43c 100644 --- a/consensus/ibft/src/test/java/org/hyperledger/besu/consensus/ibft/jsonrpc/methods/IbftGetPendingVotesTest.java +++ b/consensus/ibft/src/test/java/org/hyperledger/besu/consensus/ibft/jsonrpc/methods/IbftGetPendingVotesTest.java @@ -14,7 +14,7 @@ */ package org.hyperledger.besu.consensus.ibft.jsonrpc.methods; -import static org.assertj.core.api.Java6Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThat; import org.hyperledger.besu.consensus.common.jsonrpc.AbstractVoteProposerMethod; import org.hyperledger.besu.consensus.common.jsonrpc.AbstractVoteProposerMethodTest; diff --git a/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/graphql/EthGraphQLHttpBySpecTest.java b/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/graphql/EthGraphQLHttpBySpecTest.java index 4cd316460..df620d7c1 100644 --- a/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/graphql/EthGraphQLHttpBySpecTest.java +++ b/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/graphql/EthGraphQLHttpBySpecTest.java @@ -15,6 +15,7 @@ package org.hyperledger.besu.ethereum.api.graphql; import static com.google.common.base.Preconditions.checkState; +import static org.assertj.core.api.Assertions.assertThat; import java.io.IOException; import java.net.URISyntaxException; @@ -31,6 +32,7 @@ import okhttp3.Request; import okhttp3.RequestBody; import okhttp3.Response; import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; @@ -83,4 +85,11 @@ public class EthGraphQLHttpBySpecTest extends AbstractEthGraphQLHttpServiceTest Assertions.assertThat(resp.code()).isEqualTo(expectedStatusCode); } } + + @Test + void dryRunDetector() { + assertThat(true) + .withFailMessage("This test is here so gradle --dry-run executes this class") + .isTrue(); + } } diff --git a/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/JsonRpcHttpServiceParameterizedTest.java b/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/JsonRpcHttpServiceParameterizedTest.java index a93575aa8..a561079e7 100644 --- a/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/JsonRpcHttpServiceParameterizedTest.java +++ b/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/JsonRpcHttpServiceParameterizedTest.java @@ -27,6 +27,7 @@ import okhttp3.RequestBody; import okhttp3.Response; import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.MethodSource; @@ -60,4 +61,11 @@ public class JsonRpcHttpServiceParameterizedTest extends JsonRpcHttpServiceTestB json, null, expectedError.getCode(), expectedError.getMessage()); } } + + @Test + void dryRunDetector() { + assertThat(true) + .withFailMessage("This test is here so gradle --dry-run executes this class") + .isTrue(); + } } diff --git a/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/RpcErrorTypeConverterTest.java b/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/RpcErrorTypeConverterTest.java index 8dbee4bf9..a54057f8f 100644 --- a/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/RpcErrorTypeConverterTest.java +++ b/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/RpcErrorTypeConverterTest.java @@ -22,6 +22,7 @@ import org.hyperledger.besu.ethereum.transaction.TransactionInvalidReason; import java.util.Arrays; import java.util.Collection; +import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.MethodSource; @@ -85,4 +86,11 @@ public class RpcErrorTypeConverterTest { assertThat(JsonRpcErrorConverter.convertTransactionInvalidReason(txInvalidReason)) .isEqualTo(expectedJsonRpcError); } + + @Test + void dryRunDetector() { + assertThat(true) + .withFailMessage("This test is here so gradle --dry-run executes this class") + .isTrue(); + } } diff --git a/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/bonsai/DebugJsonRpcHttpBySpecTest.java b/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/bonsai/DebugJsonRpcHttpBySpecTest.java index 0ee3388f4..e1a13f1a8 100644 --- a/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/bonsai/DebugJsonRpcHttpBySpecTest.java +++ b/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/bonsai/DebugJsonRpcHttpBySpecTest.java @@ -14,9 +14,12 @@ */ package org.hyperledger.besu.ethereum.api.jsonrpc.bonsai; +import static org.assertj.core.api.Assertions.assertThat; + import org.hyperledger.besu.ethereum.api.jsonrpc.AbstractJsonRpcHttpBySpecTest; import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; public class DebugJsonRpcHttpBySpecTest extends AbstractJsonRpcHttpBySpecTest { @@ -33,4 +36,11 @@ public class DebugJsonRpcHttpBySpecTest extends AbstractJsonRpcHttpBySpecTest { "debug/account-at", "debug/batch-send-raw-transaction", "debug/trace-transaction" }); // storageRange and accountRange are not working with bonsai trie } + + @Test + void dryRunDetector() { + assertThat(true) + .withFailMessage("This test is here so gradle --dry-run executes this class") + .isTrue(); + } } diff --git a/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/bonsai/DebugTraceJsonRpcHttpBySpecTest.java b/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/bonsai/DebugTraceJsonRpcHttpBySpecTest.java index 37b2cedf7..fbe3f3219 100644 --- a/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/bonsai/DebugTraceJsonRpcHttpBySpecTest.java +++ b/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/bonsai/DebugTraceJsonRpcHttpBySpecTest.java @@ -14,11 +14,14 @@ */ package org.hyperledger.besu.ethereum.api.jsonrpc.bonsai; +import static org.assertj.core.api.Assertions.assertThat; + import org.hyperledger.besu.ethereum.api.jsonrpc.AbstractJsonRpcHttpBySpecTest; import org.hyperledger.besu.ethereum.core.BlockchainSetupUtil; import org.hyperledger.besu.plugin.services.storage.DataStorageFormat; import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; public class DebugTraceJsonRpcHttpBySpecTest extends AbstractJsonRpcHttpBySpecTest { @@ -38,4 +41,11 @@ public class DebugTraceJsonRpcHttpBySpecTest extends AbstractJsonRpcHttpBySpecTe public static Object[][] specs() { return AbstractJsonRpcHttpBySpecTest.findSpecFiles(new String[] {"debug/trace-call"}); } + + @Test + void dryRunDetector() { + assertThat(true) + .withFailMessage("This test is here so gradle --dry-run executes this class") + .isTrue(); + } } diff --git a/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/bonsai/EthByzantiumJsonRpcHttpBySpecTest.java b/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/bonsai/EthByzantiumJsonRpcHttpBySpecTest.java index 358aeb155..f1b6b695a 100644 --- a/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/bonsai/EthByzantiumJsonRpcHttpBySpecTest.java +++ b/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/bonsai/EthByzantiumJsonRpcHttpBySpecTest.java @@ -14,11 +14,14 @@ */ package org.hyperledger.besu.ethereum.api.jsonrpc.bonsai; +import static org.assertj.core.api.Assertions.assertThat; + import org.hyperledger.besu.ethereum.api.jsonrpc.AbstractJsonRpcHttpBySpecTest; import org.hyperledger.besu.ethereum.core.BlockchainSetupUtil; import org.hyperledger.besu.plugin.services.storage.DataStorageFormat; import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; public class EthByzantiumJsonRpcHttpBySpecTest extends AbstractJsonRpcHttpBySpecTest { @@ -38,4 +41,11 @@ public class EthByzantiumJsonRpcHttpBySpecTest extends AbstractJsonRpcHttpBySpec public static Object[][] specs() { return AbstractJsonRpcHttpBySpecTest.findSpecFiles(new String[] {"eth_latest"}); } + + @Test + void dryRunDetector() { + assertThat(true) + .withFailMessage("This test is here so gradle --dry-run executes this class") + .isTrue(); + } } diff --git a/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/bonsai/EthJsonRpcHttpBySpecTest.java b/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/bonsai/EthJsonRpcHttpBySpecTest.java index 9dc7d193c..1bb5f801e 100644 --- a/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/bonsai/EthJsonRpcHttpBySpecTest.java +++ b/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/bonsai/EthJsonRpcHttpBySpecTest.java @@ -14,9 +14,12 @@ */ package org.hyperledger.besu.ethereum.api.jsonrpc.bonsai; +import static org.assertj.core.api.Assertions.assertThat; + import org.hyperledger.besu.ethereum.api.jsonrpc.AbstractJsonRpcHttpBySpecTest; import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; public class EthJsonRpcHttpBySpecTest extends AbstractJsonRpcHttpBySpecTest { @@ -30,4 +33,11 @@ public class EthJsonRpcHttpBySpecTest extends AbstractJsonRpcHttpBySpecTest { public static Object[][] specs() { return findSpecFiles(new String[] {"eth"}); } + + @Test + void dryRunDetector() { + assertThat(true) + .withFailMessage("This test is here so gradle --dry-run executes this class") + .isTrue(); + } } diff --git a/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/bonsai/TraceJsonRpcHttpBySpecTest.java b/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/bonsai/TraceJsonRpcHttpBySpecTest.java index a3bf6fc51..51d573dda 100644 --- a/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/bonsai/TraceJsonRpcHttpBySpecTest.java +++ b/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/bonsai/TraceJsonRpcHttpBySpecTest.java @@ -14,11 +14,14 @@ */ package org.hyperledger.besu.ethereum.api.jsonrpc.bonsai; +import static org.assertj.core.api.Assertions.assertThat; + import org.hyperledger.besu.ethereum.api.jsonrpc.AbstractJsonRpcHttpBySpecTest; import org.hyperledger.besu.ethereum.core.BlockchainSetupUtil; import org.hyperledger.besu.plugin.services.storage.DataStorageFormat; import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; public class TraceJsonRpcHttpBySpecTest extends AbstractJsonRpcHttpBySpecTest { @@ -52,4 +55,11 @@ public class TraceJsonRpcHttpBySpecTest extends AbstractJsonRpcHttpBySpecTest { "trace/specs/trace-raw-transaction" }); } + + @Test + void dryRunDetector() { + assertThat(true) + .withFailMessage("This test is here so gradle --dry-run executes this class") + .isTrue(); + } } diff --git a/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/context/ContextKeyTest.java b/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/context/ContextKeyTest.java index a31bcb96d..ed2574170 100644 --- a/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/context/ContextKeyTest.java +++ b/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/context/ContextKeyTest.java @@ -26,6 +26,7 @@ import java.util.function.Supplier; import io.vertx.core.json.JsonObject; import io.vertx.ext.web.RoutingContext; +import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.MethodSource; @@ -66,4 +67,11 @@ public class ContextKeyTest { private static Supplier supplier(final T value) { return () -> value; } + + @Test + void dryRunDetector() { + assertThat(true) + .withFailMessage("This test is here so gradle --dry-run executes this class") + .isTrue(); + } } diff --git a/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/forest/DebugJsonRpcHttpBySpecTest.java b/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/forest/DebugJsonRpcHttpBySpecTest.java index 562b4c257..bc8d4178e 100644 --- a/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/forest/DebugJsonRpcHttpBySpecTest.java +++ b/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/forest/DebugJsonRpcHttpBySpecTest.java @@ -14,9 +14,12 @@ */ package org.hyperledger.besu.ethereum.api.jsonrpc.forest; +import static org.assertj.core.api.Assertions.assertThat; + import org.hyperledger.besu.ethereum.api.jsonrpc.AbstractJsonRpcHttpBySpecTest; import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; public class DebugJsonRpcHttpBySpecTest extends AbstractJsonRpcHttpBySpecTest { @@ -37,4 +40,11 @@ public class DebugJsonRpcHttpBySpecTest extends AbstractJsonRpcHttpBySpecTest { "debug/storage-range" }); } + + @Test + void dryRunDetector() { + assertThat(true) + .withFailMessage("This test is here so gradle --dry-run executes this class") + .isTrue(); + } } diff --git a/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/forest/DebugTraceJsonRpcHttpBySpecTest.java b/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/forest/DebugTraceJsonRpcHttpBySpecTest.java index 89b79c2af..cdedc3438 100644 --- a/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/forest/DebugTraceJsonRpcHttpBySpecTest.java +++ b/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/forest/DebugTraceJsonRpcHttpBySpecTest.java @@ -14,11 +14,14 @@ */ package org.hyperledger.besu.ethereum.api.jsonrpc.forest; +import static org.assertj.core.api.Assertions.assertThat; + import org.hyperledger.besu.ethereum.api.jsonrpc.AbstractJsonRpcHttpBySpecTest; import org.hyperledger.besu.ethereum.core.BlockchainSetupUtil; import org.hyperledger.besu.plugin.services.storage.DataStorageFormat; import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; public class DebugTraceJsonRpcHttpBySpecTest extends AbstractJsonRpcHttpBySpecTest { @@ -38,4 +41,11 @@ public class DebugTraceJsonRpcHttpBySpecTest extends AbstractJsonRpcHttpBySpecTe public static Object[][] specs() { return AbstractJsonRpcHttpBySpecTest.findSpecFiles(new String[] {"debug/trace-call"}); } + + @Test + void dryRunDetector() { + assertThat(true) + .withFailMessage("This test is here so gradle --dry-run executes this class") + .isTrue(); + } } diff --git a/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/forest/EthByzantiumJsonRpcHttpBySpecTest.java b/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/forest/EthByzantiumJsonRpcHttpBySpecTest.java index 163929799..c7c2d131a 100644 --- a/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/forest/EthByzantiumJsonRpcHttpBySpecTest.java +++ b/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/forest/EthByzantiumJsonRpcHttpBySpecTest.java @@ -14,11 +14,14 @@ */ package org.hyperledger.besu.ethereum.api.jsonrpc.forest; +import static org.assertj.core.api.Assertions.assertThat; + import org.hyperledger.besu.ethereum.api.jsonrpc.AbstractJsonRpcHttpBySpecTest; import org.hyperledger.besu.ethereum.core.BlockchainSetupUtil; import org.hyperledger.besu.plugin.services.storage.DataStorageFormat; import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; public class EthByzantiumJsonRpcHttpBySpecTest extends AbstractJsonRpcHttpBySpecTest { @@ -38,4 +41,11 @@ public class EthByzantiumJsonRpcHttpBySpecTest extends AbstractJsonRpcHttpBySpec public static Object[][] specs() { return AbstractJsonRpcHttpBySpecTest.findSpecFiles(new String[] {"eth_latest"}); } + + @Test + void dryRunDetector() { + assertThat(true) + .withFailMessage("This test is here so gradle --dry-run executes this class") + .isTrue(); + } } diff --git a/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/forest/EthJsonRpcHttpBySpecTest.java b/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/forest/EthJsonRpcHttpBySpecTest.java index 277f1b89d..041c0c711 100644 --- a/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/forest/EthJsonRpcHttpBySpecTest.java +++ b/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/forest/EthJsonRpcHttpBySpecTest.java @@ -14,9 +14,12 @@ */ package org.hyperledger.besu.ethereum.api.jsonrpc.forest; +import static org.assertj.core.api.Assertions.assertThat; + import org.hyperledger.besu.ethereum.api.jsonrpc.AbstractJsonRpcHttpBySpecTest; import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; public class EthJsonRpcHttpBySpecTest extends AbstractJsonRpcHttpBySpecTest { @@ -30,4 +33,11 @@ public class EthJsonRpcHttpBySpecTest extends AbstractJsonRpcHttpBySpecTest { public static Object[][] specs() { return findSpecFiles(new String[] {"eth"}); } + + @Test + void dryRunDetector() { + assertThat(true) + .withFailMessage("This test is here so gradle --dry-run executes this class") + .isTrue(); + } } diff --git a/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/forest/TraceJsonRpcHttpBySpecTest.java b/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/forest/TraceJsonRpcHttpBySpecTest.java index d71c28a22..b33be9100 100644 --- a/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/forest/TraceJsonRpcHttpBySpecTest.java +++ b/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/forest/TraceJsonRpcHttpBySpecTest.java @@ -14,11 +14,14 @@ */ package org.hyperledger.besu.ethereum.api.jsonrpc.forest; +import static org.assertj.core.api.Assertions.assertThat; + import org.hyperledger.besu.ethereum.api.jsonrpc.AbstractJsonRpcHttpBySpecTest; import org.hyperledger.besu.ethereum.core.BlockchainSetupUtil; import org.hyperledger.besu.plugin.services.storage.DataStorageFormat; import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; public class TraceJsonRpcHttpBySpecTest extends AbstractJsonRpcHttpBySpecTest { @@ -52,4 +55,11 @@ public class TraceJsonRpcHttpBySpecTest extends AbstractJsonRpcHttpBySpecTest { "trace/specs/trace-raw-transaction" }); } + + @Test + void dryRunDetector() { + assertThat(true) + .withFailMessage("This test is here so gradle --dry-run executes this class") + .isTrue(); + } } diff --git a/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/TraceFilterTest.java b/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/TraceFilterTest.java index 6a9d4da03..c5c03f6b1 100644 --- a/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/TraceFilterTest.java +++ b/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/TraceFilterTest.java @@ -29,6 +29,7 @@ import org.hyperledger.besu.ethereum.mainnet.ProtocolSchedule; import java.util.function.Supplier; +import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.CsvSource; @@ -76,4 +77,11 @@ public class TraceFilterTest { final JsonRpcErrorResponse errorResponse = (JsonRpcErrorResponse) response; assertThat(errorResponse.getErrorType()).isEqualTo(RpcErrorType.EXCEEDS_RPC_MAX_BLOCK_RANGE); } + + @Test + void dryRunDetector() { + assertThat(true) + .withFailMessage("This test is here so gradle --dry-run executes this class") + .isTrue(); + } } diff --git a/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/results/transaction/pool/PendingPermissionTransactionFilterTest.java b/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/results/transaction/pool/PendingPermissionTransactionFilterTest.java index b08e5f7e8..ada560adb 100644 --- a/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/results/transaction/pool/PendingPermissionTransactionFilterTest.java +++ b/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/results/transaction/pool/PendingPermissionTransactionFilterTest.java @@ -39,6 +39,7 @@ import java.util.List; import java.util.Optional; import java.util.Set; +import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.MethodSource; @@ -126,4 +127,11 @@ public class PendingPermissionTransactionFilterTest { } return new LinkedHashSet<>(pendingTransactionList); } + + @Test + void dryRunDetector() { + assertThat(true) + .withFailMessage("This test is here so gradle --dry-run executes this class") + .isTrue(); + } } diff --git a/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/timeout/TimeoutHandlerTest.java b/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/timeout/TimeoutHandlerTest.java index c8047b806..2fd96d6b9 100644 --- a/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/timeout/TimeoutHandlerTest.java +++ b/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/timeout/TimeoutHandlerTest.java @@ -14,6 +14,7 @@ */ package org.hyperledger.besu.ethereum.api.jsonrpc.timeout; +import static org.assertj.core.api.Assertions.assertThat; import static org.hyperledger.besu.ethereum.api.jsonrpc.RpcMethod.ETH_BLOCK_NUMBER; import static org.hyperledger.besu.ethereum.api.jsonrpc.RpcMethod.ETH_GET_LOGS; import static org.mockito.ArgumentMatchers.any; @@ -39,6 +40,7 @@ import io.vertx.core.Handler; import io.vertx.core.Vertx; import io.vertx.core.json.JsonObject; import io.vertx.ext.web.RoutingContext; +import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.MethodSource; import org.mockito.Mockito; @@ -86,4 +88,11 @@ public class TimeoutHandlerTest { .setTimer(eq(TimeUnit.SECONDS.toMillis(timeoutSec)), any()); verify(ctx, times(timerMustBeSet ? 1 : 0)).addBodyEndHandler(any()); } + + @Test + void dryRunDetector() { + assertThat(true) + .withFailMessage("This test is here so gradle --dry-run executes this class") + .isTrue(); + } } diff --git a/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/query/BackendQueryTest.java b/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/query/BackendQueryTest.java index 20eaf656e..4c5c2679e 100644 --- a/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/query/BackendQueryTest.java +++ b/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/query/BackendQueryTest.java @@ -20,6 +20,7 @@ import static org.assertj.core.api.Assertions.assertThatThrownBy; import java.util.function.Supplier; import java.util.stream.Stream; +import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; @@ -52,4 +53,11 @@ public class BackendQueryTest { assertThat(BackendQuery.runIfAlive(() -> wantReturn, alive)).isEqualTo(wantReturn); } } + + @Test + void dryRunDetector() { + assertThat(true) + .withFailMessage("This test is here so gradle --dry-run executes this class") + .isTrue(); + } } diff --git a/ethereum/blockcreation/src/test/java/org/hyperledger/besu/ethereum/blockcreation/HashRateMiningCoordinatorTest.java b/ethereum/blockcreation/src/test/java/org/hyperledger/besu/ethereum/blockcreation/HashRateMiningCoordinatorTest.java index 985870c6f..73e122b62 100644 --- a/ethereum/blockcreation/src/test/java/org/hyperledger/besu/ethereum/blockcreation/HashRateMiningCoordinatorTest.java +++ b/ethereum/blockcreation/src/test/java/org/hyperledger/besu/ethereum/blockcreation/HashRateMiningCoordinatorTest.java @@ -24,6 +24,7 @@ import java.util.Arrays; import java.util.Collection; import java.util.UUID; +import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.MethodSource; @@ -62,4 +63,11 @@ public class HashRateMiningCoordinatorTest { assertThat(miningCoordinator.hashesPerSecond()).contains(wantTotalHashrate); } } + + @Test + void dryRunDetector() { + assertThat(true) + .withFailMessage("This test is here so gradle --dry-run executes this class") + .isTrue(); + } } diff --git a/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/chain/GenesisStateTest.java b/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/chain/GenesisStateTest.java index ea1eb0441..70c1e64bd 100644 --- a/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/chain/GenesisStateTest.java +++ b/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/chain/GenesisStateTest.java @@ -32,6 +32,7 @@ import java.util.stream.Stream; import org.apache.tuweni.bytes.Bytes; import org.apache.tuweni.units.bigints.UInt256; import org.bouncycastle.util.encoders.Hex; +import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtensionContext; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; @@ -331,4 +332,11 @@ final class GenesisStateTest { Hash.fromHexString( "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421")); } + + @Test + void dryRunDetector() { + assertThat(true) + .withFailMessage("This test is here so gradle --dry-run executes this class") + .isTrue(); + } } diff --git a/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/core/UtilTest.java b/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/core/UtilTest.java index f5df65523..39b804abe 100644 --- a/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/core/UtilTest.java +++ b/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/core/UtilTest.java @@ -14,7 +14,7 @@ */ package org.hyperledger.besu.ethereum.core; -import static org.assertj.core.api.Java6Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThat; import org.junit.jupiter.api.Test; diff --git a/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/core/encoding/BlobTransactionEncodingTest.java b/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/core/encoding/BlobTransactionEncodingTest.java index b847d0bb7..e53c1b50e 100644 --- a/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/core/encoding/BlobTransactionEncodingTest.java +++ b/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/core/encoding/BlobTransactionEncodingTest.java @@ -27,6 +27,7 @@ import java.nio.charset.StandardCharsets; import java.util.stream.Stream; import org.apache.tuweni.bytes.Bytes; +import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; @@ -117,4 +118,11 @@ public class BlobTransactionEncodingTest { : bytes.toString(); } } + + @Test + void dryRunDetector() { + assertThat(true) + .withFailMessage("This test is here so gradle --dry-run executes this class") + .isTrue(); + } } diff --git a/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/core/feemarket/BaseFeeMarketBaseFeeTest.java b/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/core/feemarket/BaseFeeMarketBaseFeeTest.java index d6d94c845..e657c5c2e 100644 --- a/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/core/feemarket/BaseFeeMarketBaseFeeTest.java +++ b/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/core/feemarket/BaseFeeMarketBaseFeeTest.java @@ -30,6 +30,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.google.common.base.Charsets; import com.google.common.io.Resources; import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; @@ -99,4 +100,11 @@ public class BaseFeeMarketBaseFeeTest { this.expectedBaseFee = expectedBaseFee; } } + + @Test + void dryRunDetector() { + assertThat(true) + .withFailMessage("This test is here so gradle --dry-run executes this class") + .isTrue(); + } } diff --git a/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/core/feemarket/CoinbaseFeePriceCalculatorTest.java b/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/core/feemarket/CoinbaseFeePriceCalculatorTest.java index 2706444f8..1da9a689c 100644 --- a/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/core/feemarket/CoinbaseFeePriceCalculatorTest.java +++ b/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/core/feemarket/CoinbaseFeePriceCalculatorTest.java @@ -21,6 +21,7 @@ import org.hyperledger.besu.datatypes.Wei; import java.util.Optional; import java.util.stream.Stream; +import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; @@ -54,4 +55,11 @@ public class CoinbaseFeePriceCalculatorTest { assertThat(coinbaseFeePriceCalculator.price(coinbaseFee, transactionGasPrice, baseFee)) .isEqualByComparingTo(expectedPrice); } + + @Test + void dryRunDetector() { + assertThat(true) + .withFailMessage("This test is here so gradle --dry-run executes this class") + .isTrue(); + } } diff --git a/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/core/feemarket/TransactionPriceCalculatorTest.java b/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/core/feemarket/TransactionPriceCalculatorTest.java index c23061ac8..df07fd1f7 100644 --- a/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/core/feemarket/TransactionPriceCalculatorTest.java +++ b/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/core/feemarket/TransactionPriceCalculatorTest.java @@ -29,6 +29,7 @@ import java.util.Collections; import java.util.Optional; import java.util.stream.Stream; +import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; @@ -146,4 +147,11 @@ public class TransactionPriceCalculatorTest { baseFee)) .isEqualByComparingTo(expectedPrice); } + + @Test + void dryRunDetector() { + assertThat(true) + .withFailMessage("This test is here so gradle --dry-run executes this class") + .isTrue(); + } } diff --git a/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/forkid/ForkIdBackwardCompatibilityTest.java b/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/forkid/ForkIdBackwardCompatibilityTest.java index cd28e6e9a..84c24bc9a 100644 --- a/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/forkid/ForkIdBackwardCompatibilityTest.java +++ b/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/forkid/ForkIdBackwardCompatibilityTest.java @@ -24,6 +24,7 @@ import java.util.List; import java.util.stream.Stream; import org.apache.tuweni.bytes.Bytes; +import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; @@ -99,4 +100,11 @@ public class ForkIdBackwardCompatibilityTest { assertThat(forkIdManager.getForkIdForChainHead()) .isEqualTo(legacyEth64 ? legacyForkId : wantForkId); } + + @Test + void dryRunDetector() { + assertThat(true) + .withFailMessage("This test is here so gradle --dry-run executes this class") + .isTrue(); + } } diff --git a/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/IntrinsicGasTest.java b/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/IntrinsicGasTest.java index a6ae23724..bb9ce2b49 100644 --- a/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/IntrinsicGasTest.java +++ b/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/IntrinsicGasTest.java @@ -14,6 +14,8 @@ */ package org.hyperledger.besu.ethereum.mainnet; +import static org.assertj.core.api.Assertions.assertThat; + import org.hyperledger.besu.ethereum.core.Transaction; import org.hyperledger.besu.ethereum.rlp.RLP; import org.hyperledger.besu.evm.gascalculator.FrontierGasCalculator; @@ -24,6 +26,7 @@ import java.util.stream.Stream; import org.apache.tuweni.bytes.Bytes; import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; @@ -90,4 +93,11 @@ public class IntrinsicGasTest { gasCalculator.transactionIntrinsicGasCost(t.getPayload(), t.isContractCreation())) .isEqualTo(expectedGas); } + + @Test + void dryRunDetector() { + assertThat(true) + .withFailMessage("This test is here so gradle --dry-run executes this class") + .isTrue(); + } } diff --git a/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/PragueWithdrawalRequestValidatorTest.java b/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/PragueWithdrawalRequestValidatorTest.java index 1d53b4b19..8756f8559 100644 --- a/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/PragueWithdrawalRequestValidatorTest.java +++ b/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/PragueWithdrawalRequestValidatorTest.java @@ -28,6 +28,7 @@ import java.util.List; import java.util.Optional; import java.util.stream.Stream; +import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; @@ -72,4 +73,11 @@ class PragueWithdrawalRequestValidatorTest { Arguments.of(blockWithWithdrawalRequestsMismatch(), false), Arguments.of(blockWithMoreThanMaximumWithdrawalRequests(), false)); } + + @Test + void dryRunDetector() { + assertThat(true) + .withFailMessage("This test is here so gradle --dry-run executes this class") + .isTrue(); + } } diff --git a/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/RefundSstoreGasTest.java b/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/RefundSstoreGasTest.java index e98bbc528..77edb8a76 100644 --- a/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/RefundSstoreGasTest.java +++ b/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/RefundSstoreGasTest.java @@ -16,6 +16,7 @@ package org.hyperledger.besu.ethereum.mainnet; import static org.apache.tuweni.units.bigints.UInt256.ONE; import static org.apache.tuweni.units.bigints.UInt256.ZERO; +import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; @@ -29,6 +30,7 @@ import java.util.stream.Stream; import org.apache.tuweni.units.bigints.UInt256; import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; @@ -134,4 +136,11 @@ public class RefundSstoreGasTest { newValue, mockSupplierCurrentValue, mockSupplierForOriginalValue)) .isEqualTo(expectedGasRefund); } + + @Test + void dryRunDetector() { + assertThat(true) + .withFailMessage("This test is here so gradle --dry-run executes this class") + .isTrue(); + } } diff --git a/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/WithdrawalRequestValidatorTest.java b/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/WithdrawalRequestValidatorTest.java index 43797a6e0..f93067d94 100644 --- a/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/WithdrawalRequestValidatorTest.java +++ b/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/WithdrawalRequestValidatorTest.java @@ -29,6 +29,7 @@ import java.util.List; import java.util.Optional; import java.util.stream.Stream; +import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; @@ -76,4 +77,11 @@ class WithdrawalRequestValidatorTest { Arguments.of(blockWithoutWithdrawalRequestsWithWithdrawalRequestsRoot(), false), Arguments.of(blockWithoutWithdrawalRequestsAndWithdrawalRequestsRoot(), true)); } + + @Test + void dryRunDetector() { + assertThat(true) + .withFailMessage("This test is here so gradle --dry-run executes this class") + .isTrue(); + } } diff --git a/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/headervalidationrules/GasLimitElasticityValidationRuleFixedBaseFeeMarketTest.java b/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/headervalidationrules/GasLimitElasticityValidationRuleFixedBaseFeeMarketTest.java index 7f29e6f42..94b58fa69 100644 --- a/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/headervalidationrules/GasLimitElasticityValidationRuleFixedBaseFeeMarketTest.java +++ b/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/headervalidationrules/GasLimitElasticityValidationRuleFixedBaseFeeMarketTest.java @@ -25,6 +25,7 @@ import org.hyperledger.besu.ethereum.mainnet.feemarket.FixedBaseFeeMarket; import java.util.Optional; +import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.CsvSource; @@ -72,4 +73,11 @@ public class GasLimitElasticityValidationRuleFixedBaseFeeMarketTest { assertThat(uut.validate(header, parent)).isEqualTo(expectedResult); } + + @Test + void dryRunDetector() { + assertThat(true) + .withFailMessage("This test is here so gradle --dry-run executes this class") + .isTrue(); + } } diff --git a/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/headervalidationrules/GasLimitElasticityValidationRuleTest.java b/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/headervalidationrules/GasLimitElasticityValidationRuleTest.java index bd69303a0..1f7423344 100644 --- a/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/headervalidationrules/GasLimitElasticityValidationRuleTest.java +++ b/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/headervalidationrules/GasLimitElasticityValidationRuleTest.java @@ -24,6 +24,7 @@ import org.hyperledger.besu.ethereum.mainnet.feemarket.LondonFeeMarket; import java.util.Optional; +import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.CsvSource; @@ -69,4 +70,11 @@ public class GasLimitElasticityValidationRuleTest { assertThat(uut.validate(header, parent)).isEqualTo(expectedResult); } + + @Test + void dryRunDetector() { + assertThat(true) + .withFailMessage("This test is here so gradle --dry-run executes this class") + .isTrue(); + } } diff --git a/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/headervalidationrules/GasLimitElasticityValidationRuleZeroBaseFeeMarketTest.java b/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/headervalidationrules/GasLimitElasticityValidationRuleZeroBaseFeeMarketTest.java index 229b402ed..39462a22c 100644 --- a/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/headervalidationrules/GasLimitElasticityValidationRuleZeroBaseFeeMarketTest.java +++ b/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/headervalidationrules/GasLimitElasticityValidationRuleZeroBaseFeeMarketTest.java @@ -24,6 +24,7 @@ import org.hyperledger.besu.ethereum.mainnet.feemarket.ZeroBaseFeeMarket; import java.util.Optional; +import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.CsvSource; @@ -71,4 +72,11 @@ public class GasLimitElasticityValidationRuleZeroBaseFeeMarketTest { assertThat(uut.validate(header, parent)).isEqualTo(expectedResult); } + + @Test + void dryRunDetector() { + assertThat(true) + .withFailMessage("This test is here so gradle --dry-run executes this class") + .isTrue(); + } } diff --git a/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/headervalidationrules/GasLimitRangeAndDeltaValidationRuleTest.java b/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/headervalidationrules/GasLimitRangeAndDeltaValidationRuleTest.java index 635f8e1c1..665da4735 100644 --- a/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/headervalidationrules/GasLimitRangeAndDeltaValidationRuleTest.java +++ b/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/headervalidationrules/GasLimitRangeAndDeltaValidationRuleTest.java @@ -23,6 +23,7 @@ import org.hyperledger.besu.ethereum.core.BlockHeaderTestFixture; import java.util.Optional; import java.util.stream.Stream; +import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; @@ -102,4 +103,11 @@ public class GasLimitRangeAndDeltaValidationRuleTest { assertThat(uut.validate(header, parent)).isEqualTo(expectedResult); } + + @Test + void dryRunDetector() { + assertThat(true) + .withFailMessage("This test is here so gradle --dry-run executes this class") + .isTrue(); + } } diff --git a/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/headervalidationrules/GasUsageValidationRuleTest.java b/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/headervalidationrules/GasUsageValidationRuleTest.java index 06dff0804..a06fa0c70 100644 --- a/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/headervalidationrules/GasUsageValidationRuleTest.java +++ b/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/headervalidationrules/GasUsageValidationRuleTest.java @@ -21,6 +21,7 @@ import org.hyperledger.besu.ethereum.core.BlockHeaderTestFixture; import java.util.stream.Stream; +import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; @@ -48,4 +49,11 @@ public class GasUsageValidationRuleTest { assertThat(uut.validate(header, null)).isEqualTo(expectedResult); } + + @Test + void dryRunDetector() { + assertThat(true) + .withFailMessage("This test is here so gradle --dry-run executes this class") + .isTrue(); + } } diff --git a/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/headervalidationrules/ProofOfWorkValidationRuleTest.java b/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/headervalidationrules/ProofOfWorkValidationRuleTest.java index 8d831ab7c..8f11434d1 100644 --- a/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/headervalidationrules/ProofOfWorkValidationRuleTest.java +++ b/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/headervalidationrules/ProofOfWorkValidationRuleTest.java @@ -37,6 +37,7 @@ import java.util.Optional; import java.util.stream.Stream; import org.apache.tuweni.units.bigints.UInt256; +import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; @@ -216,4 +217,11 @@ public class ProofOfWorkValidationRuleTest { final ProtocolSchedule protocolSchedule = ProtocolScheduleFixture.MAINNET; return ScheduleBasedBlockHeaderFunctions.create(protocolSchedule); } + + @Test + void dryRunDetector() { + assertThat(true) + .withFailMessage("This test is here so gradle --dry-run executes this class") + .isTrue(); + } } diff --git a/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/util/BlockchainUtilParameterizedTest.java b/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/util/BlockchainUtilParameterizedTest.java index e4f578030..af673d10d 100644 --- a/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/util/BlockchainUtilParameterizedTest.java +++ b/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/util/BlockchainUtilParameterizedTest.java @@ -33,6 +33,7 @@ import java.util.Random; import java.util.stream.Stream; import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; @@ -131,4 +132,11 @@ public class BlockchainUtilParameterizedTest { assertThat(maybeAncestorNumber.getAsInt()) .isEqualTo(Math.toIntExact(chainHeight - commonHeader.getNumber())); } + + @Test + void dryRunDetector() { + assertThat(true) + .withFailMessage("This test is here so gradle --dry-run executes this class") + .isTrue(); + } } diff --git a/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/sync/ChainHeadTrackerTest.java b/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/sync/ChainHeadTrackerTest.java index b46a109c1..4bad73ebb 100644 --- a/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/sync/ChainHeadTrackerTest.java +++ b/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/sync/ChainHeadTrackerTest.java @@ -14,6 +14,7 @@ */ package org.hyperledger.besu.ethereum.eth.sync; +import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Mockito.mock; import org.hyperledger.besu.config.GenesisConfigFile; @@ -37,6 +38,7 @@ import org.hyperledger.besu.plugin.services.storage.DataStorageFormat; import java.util.stream.Stream; import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtensionContext; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; @@ -150,4 +152,11 @@ public class ChainHeadTrackerTest { private ChainState chainHeadState() { return respondingPeer.getEthPeer().chainState(); } + + @Test + void dryRunDetector() { + assertThat(true) + .withFailMessage("This test is here so gradle --dry-run executes this class") + .isTrue(); + } } diff --git a/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/sync/checkpointsync/CheckPointSyncChainDownloaderTest.java b/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/sync/checkpointsync/CheckPointSyncChainDownloaderTest.java index 09761081a..c623b553f 100644 --- a/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/sync/checkpointsync/CheckPointSyncChainDownloaderTest.java +++ b/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/sync/checkpointsync/CheckPointSyncChainDownloaderTest.java @@ -48,6 +48,7 @@ import java.util.concurrent.CompletableFuture; import java.util.stream.Stream; import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtensionContext; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; @@ -124,8 +125,10 @@ public class CheckPointSyncChainDownloaderTest { } @AfterEach - public void tearDown() { - ethProtocolManager.stop(); + void tearDown() { + if (ethContext != null) { + ethProtocolManager.stop(); + } } private ChainDownloader downloader( @@ -208,4 +211,11 @@ public class CheckPointSyncChainDownloaderTest { assertThat(localBlockchain.getChainHeadHeader()) .isEqualTo(otherBlockchain.getBlockHeader(pivotBlockNumber).get()); } + + @Test + void dryRunDetector() { + assertThat(true) + .withFailMessage("This test is here so gradle --dry-run executes this class") + .isTrue(); + } } diff --git a/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/sync/fastsync/FastDownloaderFactoryTest.java b/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/sync/fastsync/FastDownloaderFactoryTest.java index e100c0369..b5be361bf 100644 --- a/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/sync/fastsync/FastDownloaderFactoryTest.java +++ b/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/sync/fastsync/FastDownloaderFactoryTest.java @@ -48,6 +48,7 @@ import java.util.stream.Stream; import org.assertj.core.api.Assertions; import org.junit.jupiter.api.Assumptions; +import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.junit.jupiter.api.extension.ExtensionContext; import org.junit.jupiter.params.ParameterizedTest; @@ -254,4 +255,11 @@ public class FastDownloaderFactoryTest { when(fastSyncDir.toFile()).thenReturn(fastSyncDirFile); when(dataDirectory.resolve(anyString())).thenReturn(fastSyncDir); } + + @Test + void dryRunDetector() { + assertThat(true) + .withFailMessage("This test is here so gradle --dry-run executes this class") + .isTrue(); + } } diff --git a/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/sync/fastsync/FastSyncActionsTest.java b/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/sync/fastsync/FastSyncActionsTest.java index d29bb7260..68caf2182 100644 --- a/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/sync/fastsync/FastSyncActionsTest.java +++ b/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/sync/fastsync/FastSyncActionsTest.java @@ -53,6 +53,7 @@ import java.util.concurrent.CompletableFuture; import java.util.concurrent.atomic.AtomicInteger; import java.util.stream.Stream; +import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtensionContext; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; @@ -539,4 +540,11 @@ public class FastSyncActionsTest { pivotBlockSelector, new NoOpMetricsSystem()); } + + @Test + void dryRunDetector() { + assertThat(true) + .withFailMessage("This test is here so gradle --dry-run executes this class") + .isTrue(); + } } diff --git a/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/sync/fastsync/FastSyncChainDownloaderTest.java b/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/sync/fastsync/FastSyncChainDownloaderTest.java index a73118516..f7a8a9ee5 100644 --- a/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/sync/fastsync/FastSyncChainDownloaderTest.java +++ b/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/sync/fastsync/FastSyncChainDownloaderTest.java @@ -44,6 +44,7 @@ import java.util.concurrent.locks.LockSupport; import java.util.stream.Stream; import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtensionContext; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; @@ -95,7 +96,9 @@ public class FastSyncChainDownloaderTest { @AfterEach public void tearDown() { - ethProtocolManager.stop(); + if (ethProtocolManager != null) { + ethProtocolManager.stop(); + } } private ChainDownloader downloader( @@ -222,4 +225,11 @@ public class FastSyncChainDownloaderTest { assertThat(localBlockchain.getChainHeadHeader()) .isEqualTo(otherBlockchain.getBlockHeader(pivotBlockNumber).get()); } + + @Test + void dryRunDetector() { + assertThat(true) + .withFailMessage("This test is here so gradle --dry-run executes this class") + .isTrue(); + } } diff --git a/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/sync/fastsync/FastSyncDownloaderTest.java b/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/sync/fastsync/FastSyncDownloaderTest.java index ae252a39f..e929b72ff 100644 --- a/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/sync/fastsync/FastSyncDownloaderTest.java +++ b/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/sync/fastsync/FastSyncDownloaderTest.java @@ -50,6 +50,7 @@ import java.util.function.Supplier; import java.util.stream.Stream; import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtensionContext; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; @@ -605,4 +606,11 @@ public class FastSyncDownloaderTest { return null; }); } + + @Test + void dryRunDetector() { + assertThat(true) + .withFailMessage("This test is here so gradle --dry-run executes this class") + .isTrue(); + } } diff --git a/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/sync/fastsync/PivotBlockConfirmerTest.java b/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/sync/fastsync/PivotBlockConfirmerTest.java index 050724ef5..2a8a31108 100644 --- a/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/sync/fastsync/PivotBlockConfirmerTest.java +++ b/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/sync/fastsync/PivotBlockConfirmerTest.java @@ -42,6 +42,7 @@ import java.util.concurrent.atomic.AtomicBoolean; import java.util.stream.Stream; import org.apache.tuweni.bytes.Bytes; +import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtensionContext; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; @@ -341,4 +342,11 @@ public class PivotBlockConfirmerTest { return RespondingEthPeer.blockchainResponder(mockBlockchain); } + + @Test + void dryRunDetector() { + assertThat(true) + .withFailMessage("This test is here so gradle --dry-run executes this class") + .isTrue(); + } } diff --git a/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/sync/fastsync/PivotBlockRetrieverTest.java b/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/sync/fastsync/PivotBlockRetrieverTest.java index 41317fdab..a377ee782 100644 --- a/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/sync/fastsync/PivotBlockRetrieverTest.java +++ b/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/sync/fastsync/PivotBlockRetrieverTest.java @@ -45,6 +45,7 @@ import java.util.concurrent.atomic.AtomicBoolean; import java.util.stream.Stream; import org.apache.tuweni.bytes.Bytes; +import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtensionContext; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; @@ -425,4 +426,11 @@ public class PivotBlockRetrieverTest { return RespondingEthPeer.blockchainResponder(mockBlockchain); } + + @Test + void dryRunDetector() { + assertThat(true) + .withFailMessage("This test is here so gradle --dry-run executes this class") + .isTrue(); + } } diff --git a/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/sync/fastsync/worldstate/FastWorldDownloadStateTest.java b/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/sync/fastsync/worldstate/FastWorldDownloadStateTest.java index 44847ffb9..a808ac707 100644 --- a/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/sync/fastsync/worldstate/FastWorldDownloadStateTest.java +++ b/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/sync/fastsync/worldstate/FastWorldDownloadStateTest.java @@ -43,6 +43,7 @@ import java.util.concurrent.ExecutionException; import java.util.stream.Stream; import org.apache.tuweni.bytes.Bytes; +import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtensionContext; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; @@ -265,4 +266,11 @@ public class FastWorldDownloadStateTest { .isInstanceOf(ExecutionException.class) .hasRootCauseInstanceOf(StalledDownloadException.class); } + + @Test + void dryRunDetector() { + assertThat(true) + .withFailMessage("This test is here so gradle --dry-run executes this class") + .isTrue(); + } } diff --git a/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/sync/fullsync/FullSyncChainDownloaderTest.java b/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/sync/fullsync/FullSyncChainDownloaderTest.java index f44c8e2da..ded65f6a1 100644 --- a/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/sync/fullsync/FullSyncChainDownloaderTest.java +++ b/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/sync/fullsync/FullSyncChainDownloaderTest.java @@ -55,6 +55,7 @@ import java.util.stream.Stream; import org.awaitility.Awaitility; import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtensionContext; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; @@ -107,7 +108,9 @@ public class FullSyncChainDownloaderTest { @AfterEach public void tearDown() { - ethProtocolManager.stop(); + if (ethProtocolManager != null) { + ethProtocolManager.stop(); + } } private ChainDownloader downloader(final SynchronizerConfiguration syncConfig) { @@ -499,4 +502,11 @@ public class FullSyncChainDownloaderTest { } return shortChain; } + + @Test + void dryRunDetector() { + assertThat(true) + .withFailMessage("This test is here so gradle --dry-run executes this class") + .isTrue(); + } } diff --git a/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/sync/fullsync/FullSyncChainDownloaderTotalTerminalDifficultyTest.java b/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/sync/fullsync/FullSyncChainDownloaderTotalTerminalDifficultyTest.java index c9f22ec5f..4eeb3bbc6 100644 --- a/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/sync/fullsync/FullSyncChainDownloaderTotalTerminalDifficultyTest.java +++ b/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/sync/fullsync/FullSyncChainDownloaderTotalTerminalDifficultyTest.java @@ -39,6 +39,7 @@ import java.util.concurrent.CompletableFuture; import java.util.stream.Stream; import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtensionContext; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; @@ -91,7 +92,9 @@ public class FullSyncChainDownloaderTotalTerminalDifficultyTest { @AfterEach public void tearDown() { - ethProtocolManager.stop(); + if (ethProtocolManager != null) { + ethProtocolManager.stop(); + } } private ChainDownloader downloader( @@ -179,4 +182,11 @@ public class FullSyncChainDownloaderTotalTerminalDifficultyTest { assertThat(future.isDone()).isFalse(); } + + @Test + void dryRunDetector() { + assertThat(true) + .withFailMessage("This test is here so gradle --dry-run executes this class") + .isTrue(); + } } diff --git a/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/sync/fullsync/FullSyncDownloaderTest.java b/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/sync/fullsync/FullSyncDownloaderTest.java index cb0f399ff..a44ddc07b 100644 --- a/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/sync/fullsync/FullSyncDownloaderTest.java +++ b/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/sync/fullsync/FullSyncDownloaderTest.java @@ -36,6 +36,7 @@ import org.hyperledger.besu.plugin.services.storage.DataStorageFormat; import java.util.stream.Stream; import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtensionContext; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; @@ -82,7 +83,9 @@ public class FullSyncDownloaderTest { @AfterEach public void tearDown() { - ethProtocolManager.stop(); + if (ethProtocolManager != null) { + ethProtocolManager.stop(); + } } private FullSyncDownloader downloader(final SynchronizerConfiguration syncConfig) { @@ -129,4 +132,11 @@ public class FullSyncDownloaderTest { assertThat(synchronizer.calculateTrailingPeerRequirements()) .isEqualTo(TrailingPeerRequirements.UNRESTRICTED); } + + @Test + void dryRunDetector() { + assertThat(true) + .withFailMessage("This test is here so gradle --dry-run executes this class") + .isTrue(); + } } diff --git a/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/sync/fullsync/FullSyncTargetManagerTest.java b/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/sync/fullsync/FullSyncTargetManagerTest.java index d10be455e..027bd270d 100644 --- a/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/sync/fullsync/FullSyncTargetManagerTest.java +++ b/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/sync/fullsync/FullSyncTargetManagerTest.java @@ -43,6 +43,7 @@ import java.util.concurrent.CompletableFuture; import java.util.stream.Stream; import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtensionContext; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; @@ -100,7 +101,9 @@ public class FullSyncTargetManagerTest { @AfterEach public void tearDown() { - ethProtocolManager.stop(); + if (ethProtocolManager != null) { + ethProtocolManager.stop(); + } } @ParameterizedTest @@ -180,4 +183,11 @@ public class FullSyncTargetManagerTest { new SyncTarget(bestPeer.getEthPeer(), localBlockchain.getChainHeadHeader())); assertThat(bestPeer.getPeerConnection().isDisconnected()).isFalse(); } + + @Test + void dryRunDetector() { + assertThat(true) + .withFailMessage("This test is here so gradle --dry-run executes this class") + .isTrue(); + } } diff --git a/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/sync/snapsync/SnapWorldDownloadStateTest.java b/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/sync/snapsync/SnapWorldDownloadStateTest.java index 28298acb9..d1e90b5eb 100644 --- a/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/sync/snapsync/SnapWorldDownloadStateTest.java +++ b/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/sync/snapsync/SnapWorldDownloadStateTest.java @@ -62,6 +62,7 @@ import java.util.stream.Stream; import org.apache.tuweni.bytes.Bytes; import org.apache.tuweni.bytes.Bytes32; import org.junit.jupiter.api.Assumptions; +import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtensionContext; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; @@ -493,4 +494,11 @@ public class SnapWorldDownloadStateTest { .isEmpty(); assertThat(downloadState.isDownloading()).isTrue(); } + + @Test + void dryRunDetector() { + assertThat(true) + .withFailMessage("This test is here so gradle --dry-run executes this class") + .isTrue(); + } } diff --git a/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/sync/snapsync/request/heal/StorageTrieNodeHealingRequestTest.java b/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/sync/snapsync/request/heal/StorageTrieNodeHealingRequestTest.java index f36a64c87..4f8299f9a 100644 --- a/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/sync/snapsync/request/heal/StorageTrieNodeHealingRequestTest.java +++ b/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/sync/snapsync/request/heal/StorageTrieNodeHealingRequestTest.java @@ -14,6 +14,8 @@ */ package org.hyperledger.besu.ethereum.eth.sync.snapsync.request.heal; +import static org.assertj.core.api.Assertions.assertThat; + import org.hyperledger.besu.datatypes.Address; import org.hyperledger.besu.datatypes.Hash; import org.hyperledger.besu.ethereum.core.InMemoryKeyValueStorageProvider; @@ -36,6 +38,7 @@ import java.util.stream.Stream; import org.apache.tuweni.bytes.Bytes; import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.junit.jupiter.api.extension.ExtensionContext; import org.junit.jupiter.params.ParameterizedTest; @@ -115,4 +118,11 @@ class StorageTrieNodeHealingRequestTest { Assertions.assertThat(request.getExistingData(worldStateStorageCoordinator)).isEmpty(); } + + @Test + void dryRunDetector() { + assertThat(true) + .withFailMessage("This test is here so gradle --dry-run executes this class") + .isTrue(); + } } diff --git a/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/sync/tasks/DetermineCommonAncestorTaskParameterizedTest.java b/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/sync/tasks/DetermineCommonAncestorTaskParameterizedTest.java index 71c0bcb54..73d5e5138 100644 --- a/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/sync/tasks/DetermineCommonAncestorTaskParameterizedTest.java +++ b/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/sync/tasks/DetermineCommonAncestorTaskParameterizedTest.java @@ -51,6 +51,7 @@ import java.util.stream.Stream; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; @@ -174,4 +175,11 @@ public class DetermineCommonAncestorTaskParameterizedTest { assertThat(actualResult.get().getHash()) .isEqualTo(MainnetBlockHeaderFunctions.createHash(commonHeader)); } + + @Test + void dryRunDetector() { + assertThat(true) + .withFailMessage("This test is here so gradle --dry-run executes this class") + .isTrue(); + } } diff --git a/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/sync/tasks/PersistBlockTaskTest.java b/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/sync/tasks/PersistBlockTaskTest.java index d78940576..dd5d79b66 100644 --- a/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/sync/tasks/PersistBlockTaskTest.java +++ b/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/sync/tasks/PersistBlockTaskTest.java @@ -40,6 +40,7 @@ import java.util.concurrent.CompletableFuture; import java.util.stream.Stream; import org.awaitility.Awaitility; +import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtensionContext; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; @@ -420,4 +421,11 @@ public class PersistBlockTaskTest { assertThat(result.isCancelled()).isTrue(); assertThat(blockchain.contains(nextBlock.getHash())).isFalse(); } + + @Test + void dryRunDetector() { + assertThat(true) + .withFailMessage("This test is here so gradle --dry-run executes this class") + .isTrue(); + } } diff --git a/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/transactions/TransactionPoolReplacementHandlerTest.java b/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/transactions/TransactionPoolReplacementHandlerTest.java index f57d6fac3..aca1f202c 100644 --- a/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/transactions/TransactionPoolReplacementHandlerTest.java +++ b/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/transactions/TransactionPoolReplacementHandlerTest.java @@ -30,6 +30,7 @@ import java.util.List; import java.util.Optional; import java.util.stream.Collectors; +import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.MethodSource; @@ -88,4 +89,11 @@ public class TransactionPoolReplacementHandlerTest { when(pendingTransaction.getTransaction()).thenReturn(transaction); return pendingTransaction; } + + @Test + void dryRunDetector() { + assertThat(true) + .withFailMessage("This test is here so gradle --dry-run executes this class") + .isTrue(); + } } diff --git a/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/transactions/TransactionReplacementByFeeMarketRuleTest.java b/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/transactions/TransactionReplacementByFeeMarketRuleTest.java index 527b26e25..eb22184a2 100644 --- a/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/transactions/TransactionReplacementByFeeMarketRuleTest.java +++ b/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/transactions/TransactionReplacementByFeeMarketRuleTest.java @@ -24,6 +24,7 @@ import org.hyperledger.besu.util.number.Percentage; import java.util.Collection; import java.util.Optional; +import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.MethodSource; @@ -107,4 +108,11 @@ public class TransactionReplacementByFeeMarketRuleTest extends AbstractTransacti .shouldReplace(oldTx, newTx, baseFee)) .isEqualTo(expected); } + + @Test + void dryRunDetector() { + assertThat(true) + .withFailMessage("This test is here so gradle --dry-run executes this class") + .isTrue(); + } } diff --git a/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/transactions/TransactionReplacementByGasPriceRuleTest.java b/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/transactions/TransactionReplacementByGasPriceRuleTest.java index d4f851e19..651666fdd 100644 --- a/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/transactions/TransactionReplacementByGasPriceRuleTest.java +++ b/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/transactions/TransactionReplacementByGasPriceRuleTest.java @@ -24,6 +24,7 @@ import org.hyperledger.besu.util.number.Percentage; import java.util.Collection; import java.util.Optional; +import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.MethodSource; @@ -84,4 +85,11 @@ public class TransactionReplacementByGasPriceRuleTest extends AbstractTransactio .shouldReplace(oldTx, newTx, baseFee)) .isEqualTo(expected); } + + @Test + void dryRunDetector() { + assertThat(true) + .withFailMessage("This test is here so gradle --dry-run executes this class") + .isTrue(); + } } diff --git a/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/transactions/TransactionReplacementRulesTest.java b/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/transactions/TransactionReplacementRulesTest.java index a6a5524ee..da7b46558 100644 --- a/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/transactions/TransactionReplacementRulesTest.java +++ b/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/transactions/TransactionReplacementRulesTest.java @@ -27,6 +27,7 @@ import org.hyperledger.besu.util.number.Percentage; import java.util.Collection; import java.util.Optional; +import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.MethodSource; @@ -106,4 +107,11 @@ public class TransactionReplacementRulesTest extends AbstractTransactionReplacem .shouldReplace(oldTx, newTx, mockHeader)) .isEqualTo(expected); } + + @Test + void dryRunDetector() { + assertThat(true) + .withFailMessage("This test is here so gradle --dry-run executes this class") + .isTrue(); + } } diff --git a/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/transactions/layered/LayersTest.java b/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/transactions/layered/LayersTest.java index 6946111e5..a56222345 100644 --- a/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/transactions/layered/LayersTest.java +++ b/ethereum/eth/src/test/java/org/hyperledger/besu/ethereum/eth/transactions/layered/LayersTest.java @@ -58,6 +58,7 @@ import java.util.Optional; import java.util.OptionalLong; import java.util.stream.Stream; +import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; @@ -1622,4 +1623,11 @@ public class LayersTest extends BaseTransactionPoolTest { this.hasPriority = hasPriority; } } + + @Test + void dryRunDetector() { + assertThat(true) + .withFailMessage("This test is here so gradle --dry-run executes this class") + .isTrue(); + } } diff --git a/ethereum/evmtool/src/test/java/org/hyperledger/besu/evmtool/EvmToolSpecTests.java b/ethereum/evmtool/src/test/java/org/hyperledger/besu/evmtool/EvmToolSpecTests.java index 66efb574f..24cd858ba 100644 --- a/ethereum/evmtool/src/test/java/org/hyperledger/besu/evmtool/EvmToolSpecTests.java +++ b/ethereum/evmtool/src/test/java/org/hyperledger/besu/evmtool/EvmToolSpecTests.java @@ -45,6 +45,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectReader; import com.fasterxml.jackson.databind.node.ArrayNode; import com.fasterxml.jackson.databind.node.JsonNodeType; +import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.MethodSource; @@ -183,4 +184,11 @@ public class EvmToolSpecTests { assertThat(actualNode).isEqualTo(stdoutNode); } } + + @Test + void dryRunDetector() { + assertThat(true) + .withFailMessage("This test is here so gradle --dry-run executes this class") + .isTrue(); + } } diff --git a/ethereum/evmtool/src/test/resources/org/hyperledger/besu/evmtool/t8n/prague-withdrawal.json b/ethereum/evmtool/src/test/resources/org/hyperledger/besu/evmtool/t8n/prague-withdrawal.json index 66dcf3e85..cc8958b07 100644 --- a/ethereum/evmtool/src/test/resources/org/hyperledger/besu/evmtool/t8n/prague-withdrawal.json +++ b/ethereum/evmtool/src/test/resources/org/hyperledger/besu/evmtool/t8n/prague-withdrawal.json @@ -178,6 +178,7 @@ "0x00a3ca265ebcb825b45f985a16cefb49958ce017": { "code": "0x3373fffffffffffffffffffffffffffffffffffffffe146090573615156028575f545f5260205ff35b366038141561012e5760115f54600182026001905f5b5f82111560595781019083028483029004916001019190603e565b90939004341061012e57600154600101600155600354806003026004013381556001015f3581556001016020359055600101600355005b6003546002548082038060101160a4575060105b5f5b81811460dd5780604c02838201600302600401805490600101805490600101549160601b83528260140152906034015260010160a6565b910180921460ed579060025560f8565b90505f6002555f6003555b5f548061049d141561010757505f5b60015460028282011161011c5750505f610122565b01600290035b5f555f600155604c025ff35b5f5ffd", "storage": { + "0x0000000000000000000000000000000000000000000000000000000000000000": "0x000000000000000000000000000000000000000000000000000000000000000e", "0x0000000000000000000000000000000000000000000000000000000000000004": "0x0000000000000000000000000000000000000000000000000000000000000200", "0x0000000000000000000000000000000000000000000000000000000000000006": "0x00000000000000000000000000000001fffffffffffffffe0000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000007": "0x0000000000000000000000000000000000000000000000000000000000000200", @@ -229,31 +230,6 @@ }, "body": "0xf903e5f903e28007830f424094000000000000000000000000000000000000020080b90380000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001fffffffffffffffe0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003fffffffffffffffe0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005fffffffffffffffe0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007fffffffffffffffe0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009fffffffffffffffe00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000bfffffffffffffffe00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000dfffffffffffffffe00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffe000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000026a0963cb6620fe5828cbc93bb7139d3f4501067d76275dff648bf48c3c100ca8dd4a04ac396104a5be4643406718f59a6e74d62a32777f5f6135e55e805e87612013c", "result": { - "stateRoot": "0xdba3aee0733886dac565d2a654d8fac1953fd913261f44b3aa31f153e159e98a", - "txRoot": "0x8521df63211790726b6f1a437bb0fd4b27c00e13e7678d324c4cfddb8d834ad2", - "receiptsRoot": "0x4bd8bd5580caf4ed45f873794ad7ff9d6fd2363ae529269b17b891b68d349d75", - "logsHash": "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347", - "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "receipts": [ - { - "root": "0x", - "status": "0x1", - "cumulativeGasUsed": "0xe52ba", - "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "logs": null, - "transactionHash": "0x04a2d3f252dcc98edb684f7f15b572aaf980d0c2eea4c620a9f1ff1d275b2207", - "contractAddress": "0x0000000000000000000000000000000000000000", - "gasUsed": "0xe52ba", - "blockHash": "0x0000000000000000000000000000000000000000000000000000000000000000", - "transactionIndex": "0x0" - } - ], - "currentDifficulty": null, - "gasUsed": "0xe52ba", - "currentBaseFee": "0x7", - "withdrawalsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", - "currentExcessBlobGas": "0x0", - "blobGasUsed": "0x0", "requestsRoot": "0x415d33e444f917658fd3bd6d3d8d88a1f501f9b83ace92ddacac823252c9fa47", "depositRequests": [], "withdrawalRequests": [ @@ -337,7 +313,32 @@ "validatorPubkey": "0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010", "amount": "0x0000000000000000" } - ] + ], + "stateRoot": "0xf63d7552dc407993393315e99272781d04eedfcf369a1acd3e386d1e6710229d", + "txRoot": "0x8521df63211790726b6f1a437bb0fd4b27c00e13e7678d324c4cfddb8d834ad2", + "receiptsRoot": "0x4bd8bd5580caf4ed45f873794ad7ff9d6fd2363ae529269b17b891b68d349d75", + "logsHash": "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "receipts": [ + { + "root": "0x", + "status": "0x1", + "cumulativeGasUsed": "0xe52ba", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "logs": null, + "transactionHash": "0x04a2d3f252dcc98edb684f7f15b572aaf980d0c2eea4c620a9f1ff1d275b2207", + "contractAddress": "0x0000000000000000000000000000000000000000", + "gasUsed": "0xe52ba", + "blockHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "transactionIndex": "0x0" + } + ], + "currentDifficulty": null, + "gasUsed": "0xe52ba", + "currentBaseFee": "0x7", + "withdrawalsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "currentExcessBlobGas": "0x0", + "blobGasUsed": "0x0" } } } \ No newline at end of file diff --git a/ethereum/p2p/src/test/java/org/hyperledger/besu/ethereum/p2p/discovery/internal/PeerRequirementCombineTest.java b/ethereum/p2p/src/test/java/org/hyperledger/besu/ethereum/p2p/discovery/internal/PeerRequirementCombineTest.java index 5c7a140dc..7ad7f7c41 100644 --- a/ethereum/p2p/src/test/java/org/hyperledger/besu/ethereum/p2p/discovery/internal/PeerRequirementCombineTest.java +++ b/ethereum/p2p/src/test/java/org/hyperledger/besu/ethereum/p2p/discovery/internal/PeerRequirementCombineTest.java @@ -23,6 +23,7 @@ import java.util.List; import java.util.concurrent.atomic.AtomicBoolean; import java.util.stream.Stream; +import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.MethodSource; @@ -76,4 +77,11 @@ public class PeerRequirementCombineTest { PeerRequirement combined = PeerRequirement.combine(Collections.emptyList()); assertThat(combined.hasSufficientPeers()).isTrue(); } + + @Test + void dryRunDetector() { + assertThat(true) + .withFailMessage("This test is here so gradle --dry-run executes this class") + .isTrue(); + } } diff --git a/ethereum/p2p/src/test/java/org/hyperledger/besu/ethereum/p2p/peers/EnodeURLImplTest.java b/ethereum/p2p/src/test/java/org/hyperledger/besu/ethereum/p2p/peers/EnodeURLImplTest.java index b7cc2a063..cf8fdd6cf 100644 --- a/ethereum/p2p/src/test/java/org/hyperledger/besu/ethereum/p2p/peers/EnodeURLImplTest.java +++ b/ethereum/p2p/src/test/java/org/hyperledger/besu/ethereum/p2p/peers/EnodeURLImplTest.java @@ -32,6 +32,8 @@ import java.util.stream.Stream; import org.apache.tuweni.bytes.Bytes; import org.assertj.core.api.ThrowableAssert; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.condition.DisabledOnOs; +import org.junit.jupiter.api.condition.OS; import org.mockito.Mockito; public class EnodeURLImplTest { @@ -494,6 +496,9 @@ public class EnodeURLImplTest { } @Test + @DisabledOnOs( + value = OS.MAC, + disabledReason = "canonical lookup may not match dns lookup for local machine") public void toURI_WithHostnameShouldWorkWhenDnsEnabledAndUpdateEnabled() throws UnknownHostException { final String enodeURLString = diff --git a/ethereum/p2p/src/test/java/org/hyperledger/besu/ethereum/p2p/rlpx/connections/netty/TLSContextFactoryTest.java b/ethereum/p2p/src/test/java/org/hyperledger/besu/ethereum/p2p/rlpx/connections/netty/TLSContextFactoryTest.java index 45d228cb4..d7763892c 100644 --- a/ethereum/p2p/src/test/java/org/hyperledger/besu/ethereum/p2p/rlpx/connections/netty/TLSContextFactoryTest.java +++ b/ethereum/p2p/src/test/java/org/hyperledger/besu/ethereum/p2p/rlpx/connections/netty/TLSContextFactoryTest.java @@ -48,6 +48,7 @@ import io.netty.handler.ssl.SslContext; import io.netty.handler.ssl.SslHandler; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.DisabledOnOs; import org.junit.jupiter.api.condition.OS; import org.junit.jupiter.params.ParameterizedTest; @@ -493,4 +494,11 @@ class TLSContextFactoryTest { return messageHandler != null ? messageHandler.getCause() : Optional.empty(); } } + + @Test + void dryRunDetector() { + assertThat(true) + .withFailMessage("This test is here so gradle --dry-run executes this class") + .isTrue(); + } } diff --git a/evm/src/test/java/org/hyperledger/besu/evm/code/EOFLayoutTest.java b/evm/src/test/java/org/hyperledger/besu/evm/code/EOFLayoutTest.java index 5324d7adf..145adfb2d 100644 --- a/evm/src/test/java/org/hyperledger/besu/evm/code/EOFLayoutTest.java +++ b/evm/src/test/java/org/hyperledger/besu/evm/code/EOFLayoutTest.java @@ -20,6 +20,7 @@ import java.util.Arrays; import java.util.Collection; import org.apache.tuweni.bytes.Bytes; +import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.MethodSource; @@ -361,4 +362,11 @@ public class EOFLayoutTest { assertThat(layout.getCodeSectionCount()).isNotZero(); } } + + @Test + void dryRunDetector() { + assertThat(true) + .withFailMessage("This test is here so gradle --dry-run executes this class") + .isTrue(); + } } diff --git a/evm/src/test/java/org/hyperledger/besu/evm/gascalculator/CancunGasCalculatorTest.java b/evm/src/test/java/org/hyperledger/besu/evm/gascalculator/CancunGasCalculatorTest.java index 917b95b68..ded199bf3 100644 --- a/evm/src/test/java/org/hyperledger/besu/evm/gascalculator/CancunGasCalculatorTest.java +++ b/evm/src/test/java/org/hyperledger/besu/evm/gascalculator/CancunGasCalculatorTest.java @@ -18,6 +18,7 @@ import static org.assertj.core.api.Assertions.assertThat; import java.util.List; +import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; @@ -43,4 +44,11 @@ public class CancunGasCalculatorTest { Arguments.of(targetGasPerBlock, 1, CancunGasCalculator.BLOB_GAS_PER_BLOB), Arguments.of(targetGasPerBlock, 3, targetGasPerBlock)); } + + @Test + void dryRunDetector() { + assertThat(true) + .withFailMessage("This test is here so gradle --dry-run executes this class") + .isTrue(); + } } diff --git a/evm/src/test/java/org/hyperledger/besu/evm/internal/WordsTest.java b/evm/src/test/java/org/hyperledger/besu/evm/internal/WordsTest.java index 30e651436..871f6ed0b 100644 --- a/evm/src/test/java/org/hyperledger/besu/evm/internal/WordsTest.java +++ b/evm/src/test/java/org/hyperledger/besu/evm/internal/WordsTest.java @@ -22,6 +22,7 @@ import java.util.Arrays; import java.util.Collection; import org.apache.tuweni.bytes.Bytes; +import org.junit.jupiter.api.Test; import org.junit.jupiter.api.TestInstance; import org.junit.jupiter.api.TestInstance.Lifecycle; import org.junit.jupiter.params.ParameterizedTest; @@ -103,4 +104,11 @@ class WordsTest { void clampedToIntTest(final Bytes theBytes, final int theExpectedInt) { assertThat(clampedToInt(theBytes)).isEqualTo(theExpectedInt); } + + @Test + void dryRunDetector() { + assertThat(true) + .withFailMessage("This test is here so gradle --dry-run executes this class") + .isTrue(); + } } diff --git a/evm/src/test/java/org/hyperledger/besu/evm/operations/ChainIdOperationTest.java b/evm/src/test/java/org/hyperledger/besu/evm/operations/ChainIdOperationTest.java index e8d2c3d02..969039266 100644 --- a/evm/src/test/java/org/hyperledger/besu/evm/operations/ChainIdOperationTest.java +++ b/evm/src/test/java/org/hyperledger/besu/evm/operations/ChainIdOperationTest.java @@ -27,6 +27,7 @@ import java.util.List; import org.apache.tuweni.bytes.Bytes; import org.apache.tuweni.bytes.Bytes32; +import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; @@ -67,4 +68,11 @@ class ChainIdOperationTest { final OperationResult result = operation.execute(messageFrame, null); assertThat(result.getGasCost()).isEqualTo(expectedGas); } + + @Test + void dryRunDetector() { + assertThat(true) + .withFailMessage("This test is here so gradle --dry-run executes this class") + .isTrue(); + } } diff --git a/evm/src/test/java/org/hyperledger/besu/evm/operations/ConstantinopleSStoreOperationGasCostTest.java b/evm/src/test/java/org/hyperledger/besu/evm/operations/ConstantinopleSStoreOperationGasCostTest.java index 00edb9c5d..3cea9300e 100644 --- a/evm/src/test/java/org/hyperledger/besu/evm/operations/ConstantinopleSStoreOperationGasCostTest.java +++ b/evm/src/test/java/org/hyperledger/besu/evm/operations/ConstantinopleSStoreOperationGasCostTest.java @@ -23,6 +23,7 @@ import org.hyperledger.besu.evm.internal.EvmConfiguration; import org.hyperledger.besu.evm.testutils.TestCodeExecutor; import org.apache.tuweni.units.bigints.UInt256; +import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.MethodSource; @@ -73,4 +74,11 @@ public class ConstantinopleSStoreOperationGasCostTest { assertThat(frame.getRemainingGas()).isEqualTo(gasLimit - expectedGasUsed); assertThat(frame.getGasRefund()).isEqualTo(expectedGasRefund); } + + @Test + void dryRunDetector() { + assertThat(true) + .withFailMessage("This test is here so gradle --dry-run executes this class") + .isTrue(); + } } diff --git a/evm/src/test/java/org/hyperledger/besu/evm/operations/LondonSStoreOperationGasCostTest.java b/evm/src/test/java/org/hyperledger/besu/evm/operations/LondonSStoreOperationGasCostTest.java index 1065d5cbd..f2cf95068 100644 --- a/evm/src/test/java/org/hyperledger/besu/evm/operations/LondonSStoreOperationGasCostTest.java +++ b/evm/src/test/java/org/hyperledger/besu/evm/operations/LondonSStoreOperationGasCostTest.java @@ -24,6 +24,7 @@ import org.hyperledger.besu.evm.testutils.TestCodeExecutor; import org.apache.tuweni.units.bigints.UInt256; import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.MethodSource; @@ -76,4 +77,11 @@ public class LondonSStoreOperationGasCostTest { assertThat(frame.getRemainingGas()).isEqualTo(gasLimit - (expectedGasUsed + 2100)); assertThat(frame.getGasRefund()).isEqualTo(expectedGasRefund); } + + @Test + void dryRunDetector() { + assertThat(true) + .withFailMessage("This test is here so gradle --dry-run executes this class") + .isTrue(); + } } diff --git a/evm/src/test/java/org/hyperledger/besu/evm/operations/MCopyOperationTest.java b/evm/src/test/java/org/hyperledger/besu/evm/operations/MCopyOperationTest.java index a30375723..297531292 100644 --- a/evm/src/test/java/org/hyperledger/besu/evm/operations/MCopyOperationTest.java +++ b/evm/src/test/java/org/hyperledger/besu/evm/operations/MCopyOperationTest.java @@ -27,6 +27,7 @@ import java.util.Arrays; import java.util.Collection; import org.apache.tuweni.bytes.Bytes; +import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.MethodSource; @@ -134,4 +135,11 @@ class MCopyOperationTest { assertThat(frame.readMemory(0, expected.size())).isEqualTo(expected); assertThat(result.getGasCost()).isEqualTo(gasCost); } + + @Test + void dryRunDetector() { + assertThat(true) + .withFailMessage("This test is here so gradle --dry-run executes this class") + .isTrue(); + } } diff --git a/evm/src/test/java/org/hyperledger/besu/evm/operations/SStoreOperationTest.java b/evm/src/test/java/org/hyperledger/besu/evm/operations/SStoreOperationTest.java index e2f14dbdb..3993d9f81 100644 --- a/evm/src/test/java/org/hyperledger/besu/evm/operations/SStoreOperationTest.java +++ b/evm/src/test/java/org/hyperledger/besu/evm/operations/SStoreOperationTest.java @@ -34,6 +34,7 @@ import org.hyperledger.besu.evm.worldstate.WorldUpdater; import java.util.List; import org.apache.tuweni.units.bigints.UInt256; +import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; @@ -88,4 +89,11 @@ class SStoreOperationTest { final OperationResult result = operation.execute(frame, null); assertThat(result.getHaltReason()).isEqualTo(expectedHalt); } + + @Test + void dryRunDetector() { + assertThat(true) + .withFailMessage("This test is here so gradle --dry-run executes this class") + .isTrue(); + } } diff --git a/evm/src/test/java/org/hyperledger/besu/evm/operations/SarOperationTest.java b/evm/src/test/java/org/hyperledger/besu/evm/operations/SarOperationTest.java index 460a7294f..86182e47e 100644 --- a/evm/src/test/java/org/hyperledger/besu/evm/operations/SarOperationTest.java +++ b/evm/src/test/java/org/hyperledger/besu/evm/operations/SarOperationTest.java @@ -14,6 +14,7 @@ */ package org.hyperledger.besu.evm.operations; +import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @@ -27,6 +28,7 @@ import java.util.List; import org.apache.tuweni.bytes.Bytes; import org.apache.tuweni.bytes.Bytes32; +import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; @@ -176,4 +178,11 @@ class SarOperationTest { operation.execute(frame, null); verify(frame).pushStackItem(Bytes.fromHexString(expectedResult)); } + + @Test + void dryRunDetector() { + assertThat(true) + .withFailMessage("This test is here so gradle --dry-run executes this class") + .isTrue(); + } } diff --git a/evm/src/test/java/org/hyperledger/besu/evm/operations/SelfDestructOperationTest.java b/evm/src/test/java/org/hyperledger/besu/evm/operations/SelfDestructOperationTest.java index 3b372f03a..7842174e9 100644 --- a/evm/src/test/java/org/hyperledger/besu/evm/operations/SelfDestructOperationTest.java +++ b/evm/src/test/java/org/hyperledger/besu/evm/operations/SelfDestructOperationTest.java @@ -36,6 +36,7 @@ import org.hyperledger.besu.evm.operation.SelfDestructOperation; import org.hyperledger.besu.evm.worldstate.WorldUpdater; import org.apache.tuweni.bytes.Bytes; +import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.MethodSource; @@ -176,4 +177,11 @@ public class SelfDestructOperationTest { assertThat(messageFrame.getCreates()).doesNotContain(orignatorAddress); } } + + @Test + void dryRunDetector() { + assertThat(true) + .withFailMessage("This test is here so gradle --dry-run executes this class") + .isTrue(); + } } diff --git a/evm/src/test/java/org/hyperledger/besu/evm/operations/ShlOperationTest.java b/evm/src/test/java/org/hyperledger/besu/evm/operations/ShlOperationTest.java index 7ee283877..b567cb630 100644 --- a/evm/src/test/java/org/hyperledger/besu/evm/operations/ShlOperationTest.java +++ b/evm/src/test/java/org/hyperledger/besu/evm/operations/ShlOperationTest.java @@ -14,6 +14,7 @@ */ package org.hyperledger.besu.evm.operations; +import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @@ -28,6 +29,7 @@ import java.util.Arrays; import org.apache.tuweni.bytes.Bytes; import org.apache.tuweni.bytes.Bytes32; import org.apache.tuweni.units.bigints.UInt256; +import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; @@ -113,4 +115,11 @@ class ShlOperationTest { operation.execute(frame, null); verify(frame).pushStackItem(Bytes.fromHexString(expectedResult)); } + + @Test + void dryRunDetector() { + assertThat(true) + .withFailMessage("This test is here so gradle --dry-run executes this class") + .isTrue(); + } } diff --git a/evm/src/test/java/org/hyperledger/besu/evm/operations/ShrOperationTest.java b/evm/src/test/java/org/hyperledger/besu/evm/operations/ShrOperationTest.java index 16e5ca763..659c50d35 100644 --- a/evm/src/test/java/org/hyperledger/besu/evm/operations/ShrOperationTest.java +++ b/evm/src/test/java/org/hyperledger/besu/evm/operations/ShrOperationTest.java @@ -14,6 +14,7 @@ */ package org.hyperledger.besu.evm.operations; +import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @@ -28,6 +29,7 @@ import java.util.Arrays; import org.apache.tuweni.bytes.Bytes; import org.apache.tuweni.bytes.Bytes32; import org.apache.tuweni.units.bigints.UInt256; +import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; @@ -124,4 +126,11 @@ class ShrOperationTest { operation.execute(frame, null); verify(frame).pushStackItem(Bytes.fromHexString(expectedResult)); } + + @Test + void dryRunDetector() { + assertThat(true) + .withFailMessage("This test is here so gradle --dry-run executes this class") + .isTrue(); + } } diff --git a/evm/src/test/java/org/hyperledger/besu/evm/precompile/BLAKE2BFPrecompileContractTest.java b/evm/src/test/java/org/hyperledger/besu/evm/precompile/BLAKE2BFPrecompileContractTest.java index c449f3e08..381e64c01 100644 --- a/evm/src/test/java/org/hyperledger/besu/evm/precompile/BLAKE2BFPrecompileContractTest.java +++ b/evm/src/test/java/org/hyperledger/besu/evm/precompile/BLAKE2BFPrecompileContractTest.java @@ -21,6 +21,7 @@ import org.hyperledger.besu.evm.frame.MessageFrame; import org.hyperledger.besu.evm.gascalculator.PetersburgGasCalculator; import org.apache.tuweni.bytes.Bytes; +import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; @@ -76,4 +77,11 @@ class BLAKE2BFPrecompileContractTest { .isEqualTo(expectedComputation); assertThat(contract.gasRequirement(input)).isEqualTo(expectedGasUsed); } + + @Test + void dryRunDetector() { + assertThat(true) + .withFailMessage("This test is here so gradle --dry-run executes this class") + .isTrue(); + } } diff --git a/evm/src/test/java/org/hyperledger/besu/evm/precompile/BLS12G1AddPrecompiledContractTest.java b/evm/src/test/java/org/hyperledger/besu/evm/precompile/BLS12G1AddPrecompiledContractTest.java index c85f26b12..2ad792a41 100644 --- a/evm/src/test/java/org/hyperledger/besu/evm/precompile/BLS12G1AddPrecompiledContractTest.java +++ b/evm/src/test/java/org/hyperledger/besu/evm/precompile/BLS12G1AddPrecompiledContractTest.java @@ -27,6 +27,7 @@ import java.util.stream.Collectors; import com.google.common.io.CharStreams; import org.apache.tuweni.bytes.Bytes; +import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; @@ -79,4 +80,11 @@ class BLS12G1AddPrecompiledContractTest { assertThat(contract.gasRequirement(input)).isEqualTo(Long.parseLong(expectedGasUsed)); } } + + @Test + void dryRunDetector() { + assertThat(true) + .withFailMessage("This test is here so gradle --dry-run executes this class") + .isTrue(); + } } diff --git a/evm/src/test/java/org/hyperledger/besu/evm/precompile/BLS12G1MulPrecompiledContractTest.java b/evm/src/test/java/org/hyperledger/besu/evm/precompile/BLS12G1MulPrecompiledContractTest.java index cfadb57bd..bf0f8a148 100644 --- a/evm/src/test/java/org/hyperledger/besu/evm/precompile/BLS12G1MulPrecompiledContractTest.java +++ b/evm/src/test/java/org/hyperledger/besu/evm/precompile/BLS12G1MulPrecompiledContractTest.java @@ -28,6 +28,7 @@ import java.util.stream.Collectors; import com.google.common.io.CharStreams; import org.apache.tuweni.bytes.Bytes; +import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; @@ -79,4 +80,11 @@ class BLS12G1MulPrecompiledContractTest { assertThat(contract.gasRequirement(input)).isEqualTo(Long.parseLong(expectedGasUsed)); } } + + @Test + void dryRunDetector() { + assertThat(true) + .withFailMessage("This test is here so gradle --dry-run executes this class") + .isTrue(); + } } diff --git a/evm/src/test/java/org/hyperledger/besu/evm/precompile/BLS12G1MultiExpPrecompiledContractTest.java b/evm/src/test/java/org/hyperledger/besu/evm/precompile/BLS12G1MultiExpPrecompiledContractTest.java index 9bd4b6a54..27d45b1dd 100644 --- a/evm/src/test/java/org/hyperledger/besu/evm/precompile/BLS12G1MultiExpPrecompiledContractTest.java +++ b/evm/src/test/java/org/hyperledger/besu/evm/precompile/BLS12G1MultiExpPrecompiledContractTest.java @@ -28,6 +28,7 @@ import java.util.stream.Collectors; import com.google.common.io.CharStreams; import org.apache.tuweni.bytes.Bytes; +import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; @@ -80,4 +81,11 @@ class BLS12G1MultiExpPrecompiledContractTest { assertThat(contract.gasRequirement(input)).isEqualTo(Long.parseLong(expectedGasUsed)); } } + + @Test + void dryRunDetector() { + assertThat(true) + .withFailMessage("This test is here so gradle --dry-run executes this class") + .isTrue(); + } } diff --git a/evm/src/test/java/org/hyperledger/besu/evm/precompile/BLS12G2AddPrecompiledContractTest.java b/evm/src/test/java/org/hyperledger/besu/evm/precompile/BLS12G2AddPrecompiledContractTest.java index 18dcd7ea5..e98422f78 100644 --- a/evm/src/test/java/org/hyperledger/besu/evm/precompile/BLS12G2AddPrecompiledContractTest.java +++ b/evm/src/test/java/org/hyperledger/besu/evm/precompile/BLS12G2AddPrecompiledContractTest.java @@ -28,6 +28,7 @@ import java.util.stream.Collectors; import com.google.common.io.CharStreams; import org.apache.tuweni.bytes.Bytes; +import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; @@ -79,4 +80,11 @@ class BLS12G2AddPrecompiledContractTest { assertThat(contract.gasRequirement(input)).isEqualTo(Long.parseLong(expectedGasUsed)); } } + + @Test + void dryRunDetector() { + assertThat(true) + .withFailMessage("This test is here so gradle --dry-run executes this class") + .isTrue(); + } } diff --git a/evm/src/test/java/org/hyperledger/besu/evm/precompile/BLS12G2MulPrecompiledContractTest.java b/evm/src/test/java/org/hyperledger/besu/evm/precompile/BLS12G2MulPrecompiledContractTest.java index 0dd510273..32af46774 100644 --- a/evm/src/test/java/org/hyperledger/besu/evm/precompile/BLS12G2MulPrecompiledContractTest.java +++ b/evm/src/test/java/org/hyperledger/besu/evm/precompile/BLS12G2MulPrecompiledContractTest.java @@ -28,6 +28,7 @@ import java.util.stream.Collectors; import com.google.common.io.CharStreams; import org.apache.tuweni.bytes.Bytes; +import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; @@ -79,4 +80,11 @@ class BLS12G2MulPrecompiledContractTest { assertThat(contract.gasRequirement(input)).isEqualTo(Long.parseLong(expectedGasUsed)); } } + + @Test + void dryRunDetector() { + assertThat(true) + .withFailMessage("This test is here so gradle --dry-run executes this class") + .isTrue(); + } } diff --git a/evm/src/test/java/org/hyperledger/besu/evm/precompile/BLS12G2MultiExpPrecompiledContractTest.java b/evm/src/test/java/org/hyperledger/besu/evm/precompile/BLS12G2MultiExpPrecompiledContractTest.java index b613bebe8..27ca15076 100644 --- a/evm/src/test/java/org/hyperledger/besu/evm/precompile/BLS12G2MultiExpPrecompiledContractTest.java +++ b/evm/src/test/java/org/hyperledger/besu/evm/precompile/BLS12G2MultiExpPrecompiledContractTest.java @@ -27,6 +27,7 @@ import java.util.Objects; import com.google.common.io.CharStreams; import org.apache.tuweni.bytes.Bytes; +import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; @@ -79,4 +80,11 @@ class BLS12G2MultiExpPrecompiledContractTest { assertThat(contract.gasRequirement(input)).isEqualTo(Long.parseLong(expectedGasUsed)); } } + + @Test + void dryRunDetector() { + assertThat(true) + .withFailMessage("This test is here so gradle --dry-run executes this class") + .isTrue(); + } } diff --git a/evm/src/test/java/org/hyperledger/besu/evm/precompile/BLS12MapFp2ToG2PrecompiledContractTest.java b/evm/src/test/java/org/hyperledger/besu/evm/precompile/BLS12MapFp2ToG2PrecompiledContractTest.java index 05f6b4bfb..afe2826ae 100644 --- a/evm/src/test/java/org/hyperledger/besu/evm/precompile/BLS12MapFp2ToG2PrecompiledContractTest.java +++ b/evm/src/test/java/org/hyperledger/besu/evm/precompile/BLS12MapFp2ToG2PrecompiledContractTest.java @@ -28,6 +28,7 @@ import java.util.stream.Collectors; import com.google.common.io.CharStreams; import org.apache.tuweni.bytes.Bytes; +import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; @@ -80,4 +81,11 @@ class BLS12MapFp2ToG2PrecompiledContractTest { assertThat(contract.gasRequirement(input)).isEqualTo(Long.parseLong(expectedGasUsed)); } } + + @Test + void dryRunDetector() { + assertThat(true) + .withFailMessage("This test is here so gradle --dry-run executes this class") + .isTrue(); + } } diff --git a/evm/src/test/java/org/hyperledger/besu/evm/precompile/BLS12MapFpToG1PrecompiledContractTest.java b/evm/src/test/java/org/hyperledger/besu/evm/precompile/BLS12MapFpToG1PrecompiledContractTest.java index cf8334657..836e295dd 100644 --- a/evm/src/test/java/org/hyperledger/besu/evm/precompile/BLS12MapFpToG1PrecompiledContractTest.java +++ b/evm/src/test/java/org/hyperledger/besu/evm/precompile/BLS12MapFpToG1PrecompiledContractTest.java @@ -28,6 +28,7 @@ import java.util.stream.Collectors; import com.google.common.io.CharStreams; import org.apache.tuweni.bytes.Bytes; +import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; @@ -80,4 +81,11 @@ class BLS12MapFpToG1PrecompiledContractTest { assertThat(contract.gasRequirement(input)).isEqualTo(Long.parseLong(expectedGasUsed)); } } + + @Test + void dryRunDetector() { + assertThat(true) + .withFailMessage("This test is here so gradle --dry-run executes this class") + .isTrue(); + } } diff --git a/evm/src/test/java/org/hyperledger/besu/evm/precompile/BLS12PairingPrecompiledContractTest.java b/evm/src/test/java/org/hyperledger/besu/evm/precompile/BLS12PairingPrecompiledContractTest.java index e5d219dcd..134bc1274 100644 --- a/evm/src/test/java/org/hyperledger/besu/evm/precompile/BLS12PairingPrecompiledContractTest.java +++ b/evm/src/test/java/org/hyperledger/besu/evm/precompile/BLS12PairingPrecompiledContractTest.java @@ -29,6 +29,7 @@ import java.util.stream.Collectors; import com.google.common.collect.Streams; import com.google.common.io.CharStreams; import org.apache.tuweni.bytes.Bytes; +import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; @@ -89,4 +90,11 @@ class BLS12PairingPrecompiledContractTest { assertThat(contract.gasRequirement(input)).isEqualTo(Long.parseLong(expectedGasUsed)); } } + + @Test + void dryRunDetector() { + assertThat(true) + .withFailMessage("This test is here so gradle --dry-run executes this class") + .isTrue(); + } } diff --git a/evm/src/test/java/org/hyperledger/besu/evm/precompile/ECRECPrecompiledContractTest.java b/evm/src/test/java/org/hyperledger/besu/evm/precompile/ECRECPrecompiledContractTest.java index bc4026ae6..ac248b947 100644 --- a/evm/src/test/java/org/hyperledger/besu/evm/precompile/ECRECPrecompiledContractTest.java +++ b/evm/src/test/java/org/hyperledger/besu/evm/precompile/ECRECPrecompiledContractTest.java @@ -22,6 +22,7 @@ import org.hyperledger.besu.evm.gascalculator.SpuriousDragonGasCalculator; import org.apache.tuweni.bytes.Bytes; import org.apache.tuweni.bytes.Bytes32; +import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; @@ -355,4 +356,11 @@ class ECRECPrecompiledContractTest { expectedResult == null ? Bytes.EMPTY : Bytes32.fromHexString(expectedResult); assertThat(contract.computePrecompile(input, messageFrame).getOutput()).isEqualTo(expected); } + + @Test + void dryRunDetector() { + assertThat(true) + .withFailMessage("This test is here so gradle --dry-run executes this class") + .isTrue(); + } } diff --git a/evm/src/test/java/org/hyperledger/besu/evm/precompile/KZGPointEvalPrecompileContractTest.java b/evm/src/test/java/org/hyperledger/besu/evm/precompile/KZGPointEvalPrecompileContractTest.java index fb7ce9d39..bbf9b545a 100644 --- a/evm/src/test/java/org/hyperledger/besu/evm/precompile/KZGPointEvalPrecompileContractTest.java +++ b/evm/src/test/java/org/hyperledger/besu/evm/precompile/KZGPointEvalPrecompileContractTest.java @@ -35,6 +35,7 @@ import org.apache.tuweni.bytes.Bytes; import org.apache.tuweni.bytes.Bytes32; import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.MethodSource; @@ -91,4 +92,11 @@ public class KZGPointEvalPrecompileContractTest { record PrecompileTestParameters( Bytes input, boolean valid, Bytes returnValue, VersionedHash versionedHash) {} + + @Test + void dryRunDetector() { + assertThat(true) + .withFailMessage("This test is here so gradle --dry-run executes this class") + .isTrue(); + } } diff --git a/evm/src/test/java/org/hyperledger/besu/evm/precompile/MODEXPPrecompiledContractTest.java b/evm/src/test/java/org/hyperledger/besu/evm/precompile/MODEXPPrecompiledContractTest.java index ad2c80a41..ac4fd9041 100644 --- a/evm/src/test/java/org/hyperledger/besu/evm/precompile/MODEXPPrecompiledContractTest.java +++ b/evm/src/test/java/org/hyperledger/besu/evm/precompile/MODEXPPrecompiledContractTest.java @@ -22,6 +22,7 @@ import org.hyperledger.besu.evm.gascalculator.BerlinGasCalculator; import org.hyperledger.besu.evm.gascalculator.ByzantiumGasCalculator; import org.apache.tuweni.bytes.Bytes; +import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; @@ -181,4 +182,11 @@ class MODEXPPrecompiledContractTest { assertThat(byzantiumContract.gasRequirement(input)).isEqualTo(eip198Gas); assertThat(berlinContract.gasRequirement(input)).isEqualTo(eip2565Gas); } + + @Test + void dryRunDetector() { + assertThat(true) + .withFailMessage("This test is here so gradle --dry-run executes this class") + .isTrue(); + } } From 23123719fb5ec624691f6a4fc34bc9f6ceeedc2e Mon Sep 17 00:00:00 2001 From: Sally MacFarlane Date: Tue, 16 Jul 2024 10:21:16 +1000 Subject: [PATCH 54/58] removed PKI backed QBFT (#7310) * removed PKI backed QBFT Signed-off-by: Sally MacFarlane * changelog Signed-off-by: Sally MacFarlane --------- Signed-off-by: Sally MacFarlane --- CHANGELOG.md | 7 +- .../configuration/BesuNodeConfiguration.java | 8 - .../BesuNodeConfigurationBuilder.java | 10 - .../src/test/resources/pki-certs/README.md | 127 ------------ .../resources/pki-certs/ca_certs/inter_ca.p12 | Bin 3516 -> 0 bytes .../pki-certs/ca_certs/partner1_ca.p12 | Bin 4434 -> 0 bytes .../pki-certs/ca_certs/partner2_ca.p12 | Bin 4434 -> 0 bytes .../resources/pki-certs/ca_certs/root_ca.p12 | Bin 2602 -> 0 bytes .../src/test/resources/pki-certs/create.sh | 190 ------------------ .../src/test/resources/pki-certs/crl/crl.pem | 28 --- .../resources/pki-certs/miner1/miner1.jks | Bin 3227 -> 0 bytes .../resources/pki-certs/miner1/miner1.p12 | Bin 4004 -> 0 bytes .../test/resources/pki-certs/miner1/nss.cfg | 5 - .../resources/pki-certs/miner1/nssdb/cert9.db | Bin 36864 -> 0 bytes .../resources/pki-certs/miner1/nssdb/key4.db | Bin 36864 -> 0 bytes .../pki-certs/miner1/nssdb/pkcs11.txt | 5 - .../pki-certs/miner1/nssdb/secmod.db | 0 .../resources/pki-certs/miner1/nsspin.txt | 1 - .../resources/pki-certs/miner1/truststore.p12 | Bin 1126 -> 0 bytes .../resources/pki-certs/miner2/miner2.jks | Bin 3226 -> 0 bytes .../resources/pki-certs/miner2/miner2.p12 | Bin 4004 -> 0 bytes .../test/resources/pki-certs/miner2/nss.cfg | 5 - .../resources/pki-certs/miner2/nssdb/cert9.db | Bin 36864 -> 0 bytes .../resources/pki-certs/miner2/nssdb/key4.db | Bin 36864 -> 0 bytes .../pki-certs/miner2/nssdb/pkcs11.txt | 5 - .../pki-certs/miner2/nssdb/secmod.db | 0 .../resources/pki-certs/miner2/nsspin.txt | 1 - .../resources/pki-certs/miner2/truststore.p12 | Bin 1126 -> 0 bytes .../resources/pki-certs/miner3/miner3.jks | Bin 3227 -> 0 bytes .../resources/pki-certs/miner3/miner3.p12 | Bin 4004 -> 0 bytes .../test/resources/pki-certs/miner3/nss.cfg | 5 - .../resources/pki-certs/miner3/nssdb/cert9.db | Bin 36864 -> 0 bytes .../resources/pki-certs/miner3/nssdb/key4.db | Bin 36864 -> 0 bytes .../pki-certs/miner3/nssdb/pkcs11.txt | 5 - .../pki-certs/miner3/nssdb/secmod.db | 0 .../resources/pki-certs/miner3/nsspin.txt | 1 - .../resources/pki-certs/miner3/truststore.p12 | Bin 1126 -> 0 bytes .../resources/pki-certs/miner4/miner4.jks | Bin 3226 -> 0 bytes .../resources/pki-certs/miner4/miner4.p12 | Bin 4004 -> 0 bytes .../test/resources/pki-certs/miner4/nss.cfg | 5 - .../resources/pki-certs/miner4/nssdb/cert9.db | Bin 36864 -> 0 bytes .../resources/pki-certs/miner4/nssdb/key4.db | Bin 36864 -> 0 bytes .../pki-certs/miner4/nssdb/pkcs11.txt | 5 - .../pki-certs/miner4/nssdb/secmod.db | 0 .../resources/pki-certs/miner4/nsspin.txt | 1 - .../resources/pki-certs/miner4/truststore.p12 | Bin 1126 -> 0 bytes .../resources/pki-certs/miner5/miner5.jks | Bin 3226 -> 0 bytes .../resources/pki-certs/miner5/miner5.p12 | Bin 4004 -> 0 bytes .../test/resources/pki-certs/miner5/nss.cfg | 5 - .../resources/pki-certs/miner5/nssdb/cert9.db | Bin 36864 -> 0 bytes .../resources/pki-certs/miner5/nssdb/key4.db | Bin 36864 -> 0 bytes .../pki-certs/miner5/nssdb/pkcs11.txt | 5 - .../pki-certs/miner5/nssdb/secmod.db | 0 .../resources/pki-certs/miner5/nsspin.txt | 1 - .../resources/pki-certs/miner5/truststore.p12 | Bin 1126 -> 0 bytes .../resources/pki-certs/miner6/miner6.jks | Bin 3226 -> 0 bytes .../resources/pki-certs/miner6/miner6.p12 | Bin 4004 -> 0 bytes .../test/resources/pki-certs/miner6/nss.cfg | 5 - .../resources/pki-certs/miner6/nssdb/cert9.db | Bin 36864 -> 0 bytes .../resources/pki-certs/miner6/nssdb/key4.db | Bin 36864 -> 0 bytes .../pki-certs/miner6/nssdb/pkcs11.txt | 5 - .../pki-certs/miner6/nssdb/secmod.db | 0 .../resources/pki-certs/miner6/nsspin.txt | 1 - .../resources/pki-certs/miner6/truststore.p12 | Bin 1126 -> 0 bytes .../test/resources/pki-certs/node1/crl.pem | 27 --- .../test/resources/pki-certs/node1/keys.p12 | Bin 6008 -> 0 bytes .../resources/pki-certs/node1/keystore.jks | Bin 6749 -> 0 bytes .../test/resources/pki-certs/node1/nss.cfg | 6 - .../resources/pki-certs/node1/nssdb/cert8.db | Bin 65536 -> 0 bytes .../resources/pki-certs/node1/nssdb/key3.db | Bin 16384 -> 0 bytes .../resources/pki-certs/node1/nssdb/secmod.db | Bin 16384 -> 0 bytes .../test/resources/pki-certs/node1/nsspin.txt | 1 - .../test/resources/pki-certs/node1/ssl-ca.pem | 70 ------- .../test/resources/pki-certs/node1/ssl.pem | 126 ------------ .../resources/pki-certs/node1/truststore.jks | Bin 3135 -> 0 bytes .../test/resources/pki-certs/node2/crl.pem | 27 --- .../test/resources/pki-certs/node2/keys.p12 | Bin 6008 -> 0 bytes .../resources/pki-certs/node2/keystore.jks | Bin 6749 -> 0 bytes .../test/resources/pki-certs/node2/nss.cfg | 6 - .../resources/pki-certs/node2/nssdb/cert8.db | Bin 65536 -> 0 bytes .../resources/pki-certs/node2/nssdb/key3.db | Bin 16384 -> 0 bytes .../resources/pki-certs/node2/nssdb/secmod.db | Bin 16384 -> 0 bytes .../test/resources/pki-certs/node2/nsspin.txt | 1 - .../test/resources/pki-certs/node2/ssl-ca.pem | 70 ------- .../test/resources/pki-certs/node2/ssl.pem | 126 ------------ .../resources/pki-certs/node2/truststore.jks | Bin 3135 -> 0 bytes .../resources/pki-certs/non-validator/crl.pem | 27 --- .../pki-certs/non-validator/keys.p12 | Bin 6056 -> 0 bytes .../pki-certs/non-validator/keystore.jks | Bin 6805 -> 0 bytes .../resources/pki-certs/non-validator/nss.cfg | 6 - .../pki-certs/non-validator/nssdb/cert8.db | Bin 65536 -> 0 bytes .../pki-certs/non-validator/nssdb/key3.db | Bin 16384 -> 0 bytes .../pki-certs/non-validator/nssdb/secmod.db | Bin 16384 -> 0 bytes .../pki-certs/non-validator/nsspin.txt | 1 - .../pki-certs/non-validator/ssl-ca.pem | 70 ------- .../resources/pki-certs/non-validator/ssl.pem | 126 ------------ .../pki-certs/non-validator/truststore.jks | Bin 3135 -> 0 bytes .../resources/pki-certs/nonValidator/crl.pem | 27 --- .../resources/pki-certs/nonValidator/keys.p12 | Bin 6046 -> 0 bytes .../pki-certs/nonValidator/keystore.jks | Bin 6795 -> 0 bytes .../resources/pki-certs/nonValidator/nss.cfg | 6 - .../pki-certs/nonValidator/nssdb/cert8.db | Bin 65536 -> 0 bytes .../pki-certs/nonValidator/nssdb/key3.db | Bin 16384 -> 0 bytes .../pki-certs/nonValidator/nssdb/secmod.db | Bin 16384 -> 0 bytes .../pki-certs/nonValidator/nsspin.txt | 1 - .../pki-certs/nonValidator/ssl-ca.pem | 70 ------- .../resources/pki-certs/nonValidator/ssl.pem | 126 ------------ .../pki-certs/nonValidator/truststore.jks | Bin 3135 -> 0 bytes .../pki-certs/truststore/truststore.p12 | Bin 5894 -> 0 bytes .../resources/pki-certs/validator/crl.pem | 27 --- .../resources/pki-certs/validator/keys.p12 | Bin 6032 -> 0 bytes .../pki-certs/validator/keystore.jks | Bin 6773 -> 0 bytes .../resources/pki-certs/validator/nss.cfg | 6 - .../pki-certs/validator/nssdb/cert8.db | Bin 65536 -> 0 bytes .../pki-certs/validator/nssdb/key3.db | Bin 16384 -> 0 bytes .../pki-certs/validator/nssdb/secmod.db | Bin 16384 -> 0 bytes .../resources/pki-certs/validator/nsspin.txt | 1 - .../resources/pki-certs/validator/ssl-ca.pem | 70 ------- .../resources/pki-certs/validator/ssl.pem | 126 ------------ .../pki-certs/validator/truststore.jks | Bin 3135 -> 0 bytes .../resources/pki-certs/validator1/crl.pem | 27 --- .../resources/pki-certs/validator1/keys.p12 | Bin 6034 -> 0 bytes .../pki-certs/validator1/keystore.jks | Bin 6783 -> 0 bytes .../resources/pki-certs/validator1/nss.cfg | 6 - .../pki-certs/validator1/nssdb/cert8.db | Bin 65536 -> 0 bytes .../pki-certs/validator1/nssdb/key3.db | Bin 16384 -> 0 bytes .../pki-certs/validator1/nssdb/secmod.db | Bin 16384 -> 0 bytes .../resources/pki-certs/validator1/nsspin.txt | 1 - .../resources/pki-certs/validator1/ssl-ca.pem | 70 ------- .../resources/pki-certs/validator1/ssl.pem | 126 ------------ .../pki-certs/validator1/truststore.jks | Bin 3135 -> 0 bytes .../resources/pki-certs/validator2/crl.pem | 27 --- .../resources/pki-certs/validator2/keys.p12 | Bin 6034 -> 0 bytes .../pki-certs/validator2/keystore.jks | Bin 6783 -> 0 bytes .../resources/pki-certs/validator2/nss.cfg | 6 - .../pki-certs/validator2/nssdb/cert8.db | Bin 65536 -> 0 bytes .../pki-certs/validator2/nssdb/key3.db | Bin 16384 -> 0 bytes .../pki-certs/validator2/nssdb/secmod.db | Bin 16384 -> 0 bytes .../resources/pki-certs/validator2/nsspin.txt | 1 - .../resources/pki-certs/validator2/ssl-ca.pem | 70 ------- .../resources/pki-certs/validator2/ssl.pem | 126 ------------ .../pki-certs/validator2/truststore.jks | Bin 3135 -> 0 bytes .../resources/pki-certs/validator3/crl.pem | 27 --- .../resources/pki-certs/validator3/keys.p12 | Bin 6034 -> 0 bytes .../pki-certs/validator3/keystore.jks | Bin 6783 -> 0 bytes .../resources/pki-certs/validator3/nss.cfg | 6 - .../pki-certs/validator3/nssdb/cert8.db | Bin 65536 -> 0 bytes .../pki-certs/validator3/nssdb/key3.db | Bin 16384 -> 0 bytes .../pki-certs/validator3/nssdb/secmod.db | Bin 16384 -> 0 bytes .../resources/pki-certs/validator3/nsspin.txt | 1 - .../resources/pki-certs/validator3/ssl-ca.pem | 70 ------- .../resources/pki-certs/validator3/ssl.pem | 126 ------------ .../pki-certs/validator3/truststore.jks | Bin 3135 -> 0 bytes .../resources/pki-certs/validator4/crl.pem | 27 --- .../resources/pki-certs/validator4/keys.p12 | Bin 6034 -> 0 bytes .../pki-certs/validator4/keystore.jks | Bin 6783 -> 0 bytes .../resources/pki-certs/validator4/nss.cfg | 6 - .../pki-certs/validator4/nssdb/cert8.db | Bin 65536 -> 0 bytes .../pki-certs/validator4/nssdb/key3.db | Bin 16384 -> 0 bytes .../pki-certs/validator4/nssdb/secmod.db | Bin 16384 -> 0 bytes .../resources/pki-certs/validator4/nsspin.txt | 1 - .../resources/pki-certs/validator4/ssl-ca.pem | 70 ------- .../resources/pki-certs/validator4/ssl.pem | 126 ------------ .../pki-certs/validator4/truststore.jks | Bin 3135 -> 0 bytes .../org/hyperledger/besu/cli/BesuCommand.java | 18 -- .../unstable/PkiBlockCreationOptions.java | 164 --------------- .../controller/BesuControllerBuilder.java | 17 -- ...onsensusScheduleBesuControllerBuilder.java | 10 - .../controller/QbftBesuControllerBuilder.java | 10 +- .../TransitionBesuControllerBuilder.java | 8 - .../besu/cli/CommandTestAbstract.java | 22 -- .../hyperledger/besu/cli/PkiOptionsTest.java | 98 --------- .../qbft/support/TestContextBuilder.java | 2 +- .../besu/consensus/qbft/QbftContext.java | 19 +- .../blockcreation/PkiQbftBlockCreator.java | 179 ----------------- .../QbftBlockCreatorFactory.java | 18 -- .../pki/DefaultKeyStoreWrapperProvider.java | 96 --------- .../qbft/pki/KeyStoreWrapperProvider.java | 29 --- .../pki/PkiBlockCreationConfiguration.java | 68 ------- ...PkiBlockCreationConfigurationProvider.java | 87 -------- .../qbft/pki/PkiQbftBlockHashing.java | 48 ----- .../qbft/pki/PkiQbftBlockHeaderFunctions.java | 37 ---- .../consensus/qbft/pki/PkiQbftExtraData.java | 77 ------- .../qbft/pki/PkiQbftExtraDataCodec.java | 95 --------- .../validation/ProposalPayloadValidator.java | 76 +------ .../qbft/validation/ProposalValidator.java | 2 +- .../ProposalPayloadValidatorTest.java | 131 +----------- 187 files changed, 17 insertions(+), 3800 deletions(-) delete mode 100644 acceptance-tests/tests/src/test/resources/pki-certs/README.md delete mode 100644 acceptance-tests/tests/src/test/resources/pki-certs/ca_certs/inter_ca.p12 delete mode 100644 acceptance-tests/tests/src/test/resources/pki-certs/ca_certs/partner1_ca.p12 delete mode 100644 acceptance-tests/tests/src/test/resources/pki-certs/ca_certs/partner2_ca.p12 delete mode 100644 acceptance-tests/tests/src/test/resources/pki-certs/ca_certs/root_ca.p12 delete mode 100644 acceptance-tests/tests/src/test/resources/pki-certs/create.sh delete mode 100644 acceptance-tests/tests/src/test/resources/pki-certs/crl/crl.pem delete mode 100644 acceptance-tests/tests/src/test/resources/pki-certs/miner1/miner1.jks delete mode 100644 acceptance-tests/tests/src/test/resources/pki-certs/miner1/miner1.p12 delete mode 100644 acceptance-tests/tests/src/test/resources/pki-certs/miner1/nss.cfg delete mode 100644 acceptance-tests/tests/src/test/resources/pki-certs/miner1/nssdb/cert9.db delete mode 100644 acceptance-tests/tests/src/test/resources/pki-certs/miner1/nssdb/key4.db delete mode 100644 acceptance-tests/tests/src/test/resources/pki-certs/miner1/nssdb/pkcs11.txt delete mode 100644 acceptance-tests/tests/src/test/resources/pki-certs/miner1/nssdb/secmod.db delete mode 100644 acceptance-tests/tests/src/test/resources/pki-certs/miner1/nsspin.txt delete mode 100644 acceptance-tests/tests/src/test/resources/pki-certs/miner1/truststore.p12 delete mode 100644 acceptance-tests/tests/src/test/resources/pki-certs/miner2/miner2.jks delete mode 100644 acceptance-tests/tests/src/test/resources/pki-certs/miner2/miner2.p12 delete mode 100644 acceptance-tests/tests/src/test/resources/pki-certs/miner2/nss.cfg delete mode 100644 acceptance-tests/tests/src/test/resources/pki-certs/miner2/nssdb/cert9.db delete mode 100644 acceptance-tests/tests/src/test/resources/pki-certs/miner2/nssdb/key4.db delete mode 100644 acceptance-tests/tests/src/test/resources/pki-certs/miner2/nssdb/pkcs11.txt delete mode 100644 acceptance-tests/tests/src/test/resources/pki-certs/miner2/nssdb/secmod.db delete mode 100644 acceptance-tests/tests/src/test/resources/pki-certs/miner2/nsspin.txt delete mode 100644 acceptance-tests/tests/src/test/resources/pki-certs/miner2/truststore.p12 delete mode 100644 acceptance-tests/tests/src/test/resources/pki-certs/miner3/miner3.jks delete mode 100644 acceptance-tests/tests/src/test/resources/pki-certs/miner3/miner3.p12 delete mode 100644 acceptance-tests/tests/src/test/resources/pki-certs/miner3/nss.cfg delete mode 100644 acceptance-tests/tests/src/test/resources/pki-certs/miner3/nssdb/cert9.db delete mode 100644 acceptance-tests/tests/src/test/resources/pki-certs/miner3/nssdb/key4.db delete mode 100644 acceptance-tests/tests/src/test/resources/pki-certs/miner3/nssdb/pkcs11.txt delete mode 100644 acceptance-tests/tests/src/test/resources/pki-certs/miner3/nssdb/secmod.db delete mode 100644 acceptance-tests/tests/src/test/resources/pki-certs/miner3/nsspin.txt delete mode 100644 acceptance-tests/tests/src/test/resources/pki-certs/miner3/truststore.p12 delete mode 100644 acceptance-tests/tests/src/test/resources/pki-certs/miner4/miner4.jks delete mode 100644 acceptance-tests/tests/src/test/resources/pki-certs/miner4/miner4.p12 delete mode 100644 acceptance-tests/tests/src/test/resources/pki-certs/miner4/nss.cfg delete mode 100644 acceptance-tests/tests/src/test/resources/pki-certs/miner4/nssdb/cert9.db delete mode 100644 acceptance-tests/tests/src/test/resources/pki-certs/miner4/nssdb/key4.db delete mode 100644 acceptance-tests/tests/src/test/resources/pki-certs/miner4/nssdb/pkcs11.txt delete mode 100644 acceptance-tests/tests/src/test/resources/pki-certs/miner4/nssdb/secmod.db delete mode 100644 acceptance-tests/tests/src/test/resources/pki-certs/miner4/nsspin.txt delete mode 100644 acceptance-tests/tests/src/test/resources/pki-certs/miner4/truststore.p12 delete mode 100644 acceptance-tests/tests/src/test/resources/pki-certs/miner5/miner5.jks delete mode 100644 acceptance-tests/tests/src/test/resources/pki-certs/miner5/miner5.p12 delete mode 100644 acceptance-tests/tests/src/test/resources/pki-certs/miner5/nss.cfg delete mode 100644 acceptance-tests/tests/src/test/resources/pki-certs/miner5/nssdb/cert9.db delete mode 100644 acceptance-tests/tests/src/test/resources/pki-certs/miner5/nssdb/key4.db delete mode 100644 acceptance-tests/tests/src/test/resources/pki-certs/miner5/nssdb/pkcs11.txt delete mode 100644 acceptance-tests/tests/src/test/resources/pki-certs/miner5/nssdb/secmod.db delete mode 100644 acceptance-tests/tests/src/test/resources/pki-certs/miner5/nsspin.txt delete mode 100644 acceptance-tests/tests/src/test/resources/pki-certs/miner5/truststore.p12 delete mode 100644 acceptance-tests/tests/src/test/resources/pki-certs/miner6/miner6.jks delete mode 100644 acceptance-tests/tests/src/test/resources/pki-certs/miner6/miner6.p12 delete mode 100644 acceptance-tests/tests/src/test/resources/pki-certs/miner6/nss.cfg delete mode 100644 acceptance-tests/tests/src/test/resources/pki-certs/miner6/nssdb/cert9.db delete mode 100644 acceptance-tests/tests/src/test/resources/pki-certs/miner6/nssdb/key4.db delete mode 100644 acceptance-tests/tests/src/test/resources/pki-certs/miner6/nssdb/pkcs11.txt delete mode 100644 acceptance-tests/tests/src/test/resources/pki-certs/miner6/nssdb/secmod.db delete mode 100644 acceptance-tests/tests/src/test/resources/pki-certs/miner6/nsspin.txt delete mode 100644 acceptance-tests/tests/src/test/resources/pki-certs/miner6/truststore.p12 delete mode 100644 acceptance-tests/tests/src/test/resources/pki-certs/node1/crl.pem delete mode 100644 acceptance-tests/tests/src/test/resources/pki-certs/node1/keys.p12 delete mode 100644 acceptance-tests/tests/src/test/resources/pki-certs/node1/keystore.jks delete mode 100644 acceptance-tests/tests/src/test/resources/pki-certs/node1/nss.cfg delete mode 100644 acceptance-tests/tests/src/test/resources/pki-certs/node1/nssdb/cert8.db delete mode 100644 acceptance-tests/tests/src/test/resources/pki-certs/node1/nssdb/key3.db delete mode 100644 acceptance-tests/tests/src/test/resources/pki-certs/node1/nssdb/secmod.db delete mode 100644 acceptance-tests/tests/src/test/resources/pki-certs/node1/nsspin.txt delete mode 100644 acceptance-tests/tests/src/test/resources/pki-certs/node1/ssl-ca.pem delete mode 100644 acceptance-tests/tests/src/test/resources/pki-certs/node1/ssl.pem delete mode 100644 acceptance-tests/tests/src/test/resources/pki-certs/node1/truststore.jks delete mode 100644 acceptance-tests/tests/src/test/resources/pki-certs/node2/crl.pem delete mode 100644 acceptance-tests/tests/src/test/resources/pki-certs/node2/keys.p12 delete mode 100644 acceptance-tests/tests/src/test/resources/pki-certs/node2/keystore.jks delete mode 100644 acceptance-tests/tests/src/test/resources/pki-certs/node2/nss.cfg delete mode 100644 acceptance-tests/tests/src/test/resources/pki-certs/node2/nssdb/cert8.db delete mode 100644 acceptance-tests/tests/src/test/resources/pki-certs/node2/nssdb/key3.db delete mode 100644 acceptance-tests/tests/src/test/resources/pki-certs/node2/nssdb/secmod.db delete mode 100644 acceptance-tests/tests/src/test/resources/pki-certs/node2/nsspin.txt delete mode 100644 acceptance-tests/tests/src/test/resources/pki-certs/node2/ssl-ca.pem delete mode 100644 acceptance-tests/tests/src/test/resources/pki-certs/node2/ssl.pem delete mode 100644 acceptance-tests/tests/src/test/resources/pki-certs/node2/truststore.jks delete mode 100644 acceptance-tests/tests/src/test/resources/pki-certs/non-validator/crl.pem delete mode 100644 acceptance-tests/tests/src/test/resources/pki-certs/non-validator/keys.p12 delete mode 100644 acceptance-tests/tests/src/test/resources/pki-certs/non-validator/keystore.jks delete mode 100644 acceptance-tests/tests/src/test/resources/pki-certs/non-validator/nss.cfg delete mode 100644 acceptance-tests/tests/src/test/resources/pki-certs/non-validator/nssdb/cert8.db delete mode 100644 acceptance-tests/tests/src/test/resources/pki-certs/non-validator/nssdb/key3.db delete mode 100644 acceptance-tests/tests/src/test/resources/pki-certs/non-validator/nssdb/secmod.db delete mode 100644 acceptance-tests/tests/src/test/resources/pki-certs/non-validator/nsspin.txt delete mode 100644 acceptance-tests/tests/src/test/resources/pki-certs/non-validator/ssl-ca.pem delete mode 100644 acceptance-tests/tests/src/test/resources/pki-certs/non-validator/ssl.pem delete mode 100644 acceptance-tests/tests/src/test/resources/pki-certs/non-validator/truststore.jks delete mode 100644 acceptance-tests/tests/src/test/resources/pki-certs/nonValidator/crl.pem delete mode 100644 acceptance-tests/tests/src/test/resources/pki-certs/nonValidator/keys.p12 delete mode 100644 acceptance-tests/tests/src/test/resources/pki-certs/nonValidator/keystore.jks delete mode 100644 acceptance-tests/tests/src/test/resources/pki-certs/nonValidator/nss.cfg delete mode 100644 acceptance-tests/tests/src/test/resources/pki-certs/nonValidator/nssdb/cert8.db delete mode 100644 acceptance-tests/tests/src/test/resources/pki-certs/nonValidator/nssdb/key3.db delete mode 100644 acceptance-tests/tests/src/test/resources/pki-certs/nonValidator/nssdb/secmod.db delete mode 100644 acceptance-tests/tests/src/test/resources/pki-certs/nonValidator/nsspin.txt delete mode 100644 acceptance-tests/tests/src/test/resources/pki-certs/nonValidator/ssl-ca.pem delete mode 100644 acceptance-tests/tests/src/test/resources/pki-certs/nonValidator/ssl.pem delete mode 100644 acceptance-tests/tests/src/test/resources/pki-certs/nonValidator/truststore.jks delete mode 100644 acceptance-tests/tests/src/test/resources/pki-certs/truststore/truststore.p12 delete mode 100644 acceptance-tests/tests/src/test/resources/pki-certs/validator/crl.pem delete mode 100644 acceptance-tests/tests/src/test/resources/pki-certs/validator/keys.p12 delete mode 100644 acceptance-tests/tests/src/test/resources/pki-certs/validator/keystore.jks delete mode 100644 acceptance-tests/tests/src/test/resources/pki-certs/validator/nss.cfg delete mode 100644 acceptance-tests/tests/src/test/resources/pki-certs/validator/nssdb/cert8.db delete mode 100644 acceptance-tests/tests/src/test/resources/pki-certs/validator/nssdb/key3.db delete mode 100644 acceptance-tests/tests/src/test/resources/pki-certs/validator/nssdb/secmod.db delete mode 100644 acceptance-tests/tests/src/test/resources/pki-certs/validator/nsspin.txt delete mode 100644 acceptance-tests/tests/src/test/resources/pki-certs/validator/ssl-ca.pem delete mode 100644 acceptance-tests/tests/src/test/resources/pki-certs/validator/ssl.pem delete mode 100644 acceptance-tests/tests/src/test/resources/pki-certs/validator/truststore.jks delete mode 100644 acceptance-tests/tests/src/test/resources/pki-certs/validator1/crl.pem delete mode 100644 acceptance-tests/tests/src/test/resources/pki-certs/validator1/keys.p12 delete mode 100644 acceptance-tests/tests/src/test/resources/pki-certs/validator1/keystore.jks delete mode 100644 acceptance-tests/tests/src/test/resources/pki-certs/validator1/nss.cfg delete mode 100644 acceptance-tests/tests/src/test/resources/pki-certs/validator1/nssdb/cert8.db delete mode 100644 acceptance-tests/tests/src/test/resources/pki-certs/validator1/nssdb/key3.db delete mode 100644 acceptance-tests/tests/src/test/resources/pki-certs/validator1/nssdb/secmod.db delete mode 100644 acceptance-tests/tests/src/test/resources/pki-certs/validator1/nsspin.txt delete mode 100644 acceptance-tests/tests/src/test/resources/pki-certs/validator1/ssl-ca.pem delete mode 100644 acceptance-tests/tests/src/test/resources/pki-certs/validator1/ssl.pem delete mode 100644 acceptance-tests/tests/src/test/resources/pki-certs/validator1/truststore.jks delete mode 100644 acceptance-tests/tests/src/test/resources/pki-certs/validator2/crl.pem delete mode 100644 acceptance-tests/tests/src/test/resources/pki-certs/validator2/keys.p12 delete mode 100644 acceptance-tests/tests/src/test/resources/pki-certs/validator2/keystore.jks delete mode 100644 acceptance-tests/tests/src/test/resources/pki-certs/validator2/nss.cfg delete mode 100644 acceptance-tests/tests/src/test/resources/pki-certs/validator2/nssdb/cert8.db delete mode 100644 acceptance-tests/tests/src/test/resources/pki-certs/validator2/nssdb/key3.db delete mode 100644 acceptance-tests/tests/src/test/resources/pki-certs/validator2/nssdb/secmod.db delete mode 100644 acceptance-tests/tests/src/test/resources/pki-certs/validator2/nsspin.txt delete mode 100644 acceptance-tests/tests/src/test/resources/pki-certs/validator2/ssl-ca.pem delete mode 100644 acceptance-tests/tests/src/test/resources/pki-certs/validator2/ssl.pem delete mode 100644 acceptance-tests/tests/src/test/resources/pki-certs/validator2/truststore.jks delete mode 100644 acceptance-tests/tests/src/test/resources/pki-certs/validator3/crl.pem delete mode 100644 acceptance-tests/tests/src/test/resources/pki-certs/validator3/keys.p12 delete mode 100644 acceptance-tests/tests/src/test/resources/pki-certs/validator3/keystore.jks delete mode 100644 acceptance-tests/tests/src/test/resources/pki-certs/validator3/nss.cfg delete mode 100644 acceptance-tests/tests/src/test/resources/pki-certs/validator3/nssdb/cert8.db delete mode 100644 acceptance-tests/tests/src/test/resources/pki-certs/validator3/nssdb/key3.db delete mode 100644 acceptance-tests/tests/src/test/resources/pki-certs/validator3/nssdb/secmod.db delete mode 100644 acceptance-tests/tests/src/test/resources/pki-certs/validator3/nsspin.txt delete mode 100644 acceptance-tests/tests/src/test/resources/pki-certs/validator3/ssl-ca.pem delete mode 100644 acceptance-tests/tests/src/test/resources/pki-certs/validator3/ssl.pem delete mode 100644 acceptance-tests/tests/src/test/resources/pki-certs/validator3/truststore.jks delete mode 100644 acceptance-tests/tests/src/test/resources/pki-certs/validator4/crl.pem delete mode 100644 acceptance-tests/tests/src/test/resources/pki-certs/validator4/keys.p12 delete mode 100644 acceptance-tests/tests/src/test/resources/pki-certs/validator4/keystore.jks delete mode 100644 acceptance-tests/tests/src/test/resources/pki-certs/validator4/nss.cfg delete mode 100644 acceptance-tests/tests/src/test/resources/pki-certs/validator4/nssdb/cert8.db delete mode 100644 acceptance-tests/tests/src/test/resources/pki-certs/validator4/nssdb/key3.db delete mode 100644 acceptance-tests/tests/src/test/resources/pki-certs/validator4/nssdb/secmod.db delete mode 100644 acceptance-tests/tests/src/test/resources/pki-certs/validator4/nsspin.txt delete mode 100644 acceptance-tests/tests/src/test/resources/pki-certs/validator4/ssl-ca.pem delete mode 100644 acceptance-tests/tests/src/test/resources/pki-certs/validator4/ssl.pem delete mode 100644 acceptance-tests/tests/src/test/resources/pki-certs/validator4/truststore.jks delete mode 100644 besu/src/main/java/org/hyperledger/besu/cli/options/unstable/PkiBlockCreationOptions.java delete mode 100644 besu/src/test/java/org/hyperledger/besu/cli/PkiOptionsTest.java delete mode 100644 consensus/qbft/src/main/java/org/hyperledger/besu/consensus/qbft/blockcreation/PkiQbftBlockCreator.java delete mode 100644 consensus/qbft/src/main/java/org/hyperledger/besu/consensus/qbft/pki/DefaultKeyStoreWrapperProvider.java delete mode 100644 consensus/qbft/src/main/java/org/hyperledger/besu/consensus/qbft/pki/KeyStoreWrapperProvider.java delete mode 100644 consensus/qbft/src/main/java/org/hyperledger/besu/consensus/qbft/pki/PkiBlockCreationConfiguration.java delete mode 100644 consensus/qbft/src/main/java/org/hyperledger/besu/consensus/qbft/pki/PkiBlockCreationConfigurationProvider.java delete mode 100644 consensus/qbft/src/main/java/org/hyperledger/besu/consensus/qbft/pki/PkiQbftBlockHashing.java delete mode 100644 consensus/qbft/src/main/java/org/hyperledger/besu/consensus/qbft/pki/PkiQbftBlockHeaderFunctions.java delete mode 100644 consensus/qbft/src/main/java/org/hyperledger/besu/consensus/qbft/pki/PkiQbftExtraData.java delete mode 100644 consensus/qbft/src/main/java/org/hyperledger/besu/consensus/qbft/pki/PkiQbftExtraDataCodec.java diff --git a/CHANGELOG.md b/CHANGELOG.md index 70714d205..e2b3ea072 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,14 +3,15 @@ ## Next release ### Breaking Changes -- Removed deprecated sync modes (X_SNAP and X_CHECKPOINT). Use SNAP and CHECKPOINT instead [#7309](https://github.com/hyperledger/besu/pull/7309) +- Remove deprecated sync modes (X_SNAP and X_CHECKPOINT). Use SNAP and CHECKPOINT instead [#7309](https://github.com/hyperledger/besu/pull/7309) +- Remove PKI-backed QBFT (deprecated in 24.5.1) Other forms of QBFT remain unchanged. [#7293](https://github.com/hyperledger/besu/pull/7293) ### Additions and Improvements - `--Xsnapsync-bft-enabled` option enables experimental support for snap sync with IBFT/QBFT permissioned Bonsai-DB chains [#7140](https://github.com/hyperledger/besu/pull/7140) - Add support to load external profiles using `--profile` [#7265](https://github.com/hyperledger/besu/issues/7265) - `privacy-nonce-always-increments` option enables private transactions to always increment the nonce, even if the transaction is invalid [#6593](https://github.com/hyperledger/besu/pull/6593) -- Added `block-test` subcommand to the evmtool which runs blockchain reference tests [#7293](https://github.com/hyperledger/besu/pull/7293) -- implement gnark-crypto for eip-2537 [#7316](https://github.com/hyperledger/besu/pull/7316) +- Add `block-test` subcommand to the evmtool which runs blockchain reference tests [#7310](https://github.com/hyperledger/besu/pull/7310) +- Implement gnark-crypto for eip-2537 [#7316](https://github.com/hyperledger/besu/pull/7316) ### Bug fixes diff --git a/acceptance-tests/dsl/src/main/java/org/hyperledger/besu/tests/acceptance/dsl/node/configuration/BesuNodeConfiguration.java b/acceptance-tests/dsl/src/main/java/org/hyperledger/besu/tests/acceptance/dsl/node/configuration/BesuNodeConfiguration.java index d1e398f72..7bffe9d77 100644 --- a/acceptance-tests/dsl/src/main/java/org/hyperledger/besu/tests/acceptance/dsl/node/configuration/BesuNodeConfiguration.java +++ b/acceptance-tests/dsl/src/main/java/org/hyperledger/besu/tests/acceptance/dsl/node/configuration/BesuNodeConfiguration.java @@ -28,7 +28,6 @@ import org.hyperledger.besu.ethereum.p2p.rlpx.connections.netty.TLSConfiguration import org.hyperledger.besu.ethereum.permissioning.PermissioningConfiguration; import org.hyperledger.besu.ethereum.worldstate.DataStorageConfiguration; import org.hyperledger.besu.metrics.prometheus.MetricsConfiguration; -import org.hyperledger.besu.pki.config.PkiKeyStoreConfiguration; import org.hyperledger.besu.tests.acceptance.dsl.node.configuration.genesis.GenesisConfigurationProvider; import java.nio.file.Path; @@ -70,7 +69,6 @@ public class BesuNodeConfiguration { private final List runCommand; private final NetworkName network; private final Optional keyPair; - private final Optional pkiKeyStoreConfiguration; private final boolean strictTxReplayProtectionEnabled; private final Map environment; @@ -107,7 +105,6 @@ public class BesuNodeConfiguration { final Optional privacyParameters, final List runCommand, final Optional keyPair, - final Optional pkiKeyStoreConfiguration, final boolean strictTxReplayProtectionEnabled, final Map environment) { this.name = name; @@ -142,7 +139,6 @@ public class BesuNodeConfiguration { this.privacyParameters = privacyParameters; this.runCommand = runCommand; this.keyPair = keyPair; - this.pkiKeyStoreConfiguration = pkiKeyStoreConfiguration; this.strictTxReplayProtectionEnabled = strictTxReplayProtectionEnabled; this.environment = environment; } @@ -275,10 +271,6 @@ public class BesuNodeConfiguration { return keyPair; } - public Optional getPkiKeyStoreConfiguration() { - return pkiKeyStoreConfiguration; - } - public boolean isStrictTxReplayProtectionEnabled() { return strictTxReplayProtectionEnabled; } diff --git a/acceptance-tests/dsl/src/main/java/org/hyperledger/besu/tests/acceptance/dsl/node/configuration/BesuNodeConfigurationBuilder.java b/acceptance-tests/dsl/src/main/java/org/hyperledger/besu/tests/acceptance/dsl/node/configuration/BesuNodeConfigurationBuilder.java index 1a9a16f36..86fb8ab5c 100644 --- a/acceptance-tests/dsl/src/main/java/org/hyperledger/besu/tests/acceptance/dsl/node/configuration/BesuNodeConfigurationBuilder.java +++ b/acceptance-tests/dsl/src/main/java/org/hyperledger/besu/tests/acceptance/dsl/node/configuration/BesuNodeConfigurationBuilder.java @@ -41,7 +41,6 @@ import org.hyperledger.besu.ethereum.p2p.rlpx.connections.netty.TLSConfiguration import org.hyperledger.besu.ethereum.permissioning.PermissioningConfiguration; import org.hyperledger.besu.ethereum.worldstate.DataStorageConfiguration; import org.hyperledger.besu.metrics.prometheus.MetricsConfiguration; -import org.hyperledger.besu.pki.config.PkiKeyStoreConfiguration; import org.hyperledger.besu.tests.acceptance.dsl.node.configuration.genesis.GenesisConfigurationProvider; import org.hyperledger.besu.tests.acceptance.dsl.node.configuration.pki.PKCS11Utils; @@ -96,7 +95,6 @@ public class BesuNodeConfigurationBuilder { private Optional privacyParameters = Optional.empty(); private List runCommand = new ArrayList<>(); private Optional keyPair = Optional.empty(); - private Optional pkiKeyStoreConfiguration = Optional.empty(); private Boolean strictTxReplayProtectionEnabled = false; private Map environment = new HashMap<>(); @@ -429,13 +427,6 @@ public class BesuNodeConfigurationBuilder { return this; } - public BesuNodeConfigurationBuilder pkiBlockCreationEnabled( - final PkiKeyStoreConfiguration pkiKeyStoreConfiguration) { - this.pkiKeyStoreConfiguration = Optional.of(pkiKeyStoreConfiguration); - - return this; - } - public BesuNodeConfigurationBuilder discoveryEnabled(final boolean discoveryEnabled) { this.discoveryEnabled = discoveryEnabled; return this; @@ -549,7 +540,6 @@ public class BesuNodeConfigurationBuilder { privacyParameters, runCommand, keyPair, - pkiKeyStoreConfiguration, strictTxReplayProtectionEnabled, environment); } diff --git a/acceptance-tests/tests/src/test/resources/pki-certs/README.md b/acceptance-tests/tests/src/test/resources/pki-certs/README.md deleted file mode 100644 index 25b23db20..000000000 --- a/acceptance-tests/tests/src/test/resources/pki-certs/README.md +++ /dev/null @@ -1,127 +0,0 @@ -See `ethereum/p2p/src/test/resources/keys/README.md` which describes the details on how the -certificates are created. The same CA are used to create miner1-miner6. - -For `PkiQbftAcceptanceTest`: -`miner1`-`miner5` are signed with `partner1_ca` and `miner6` is signed with `partner2_ca`. -`miner5` and `miner6` are revoked and added in the crl list. - -Sample shell script that can be executed to recreate the certificates -~~~ -#! /bin/sh - -names=("partner1:miner1" "partner1:miner2" "partner1:miner3" "partner1:miner4" "partner1:miner5" "partner2:miner6") -crls=("partner1:miner5" "partner2:miner6") -KEY_ALG="EC -groupname secp256r1" -#KEY_ALG="RSA -keysize 2048" - -########## -CA_CERTS_PATH=./ca_certs -ROOT_CA_KS=$CA_CERTS_PATH/root_ca.p12 -INTER_CA_KS=$CA_CERTS_PATH/inter_ca.p12 -CRL_DIR=./crl - -keytool -exportcert -keystore $ROOT_CA_KS -storepass test123 -alias root_ca -rfc -file $CA_CERTS_PATH/root_ca.pem - -echo "Generating miner keystores..." -### Generate client keystores -for name in "${names[@]}" -do - IFS=':' read -r -a array <<< "$name" - partner=${array[0]} - client=${array[1]} - - PARTNER_CA_KEYSTORE="$CA_CERTS_PATH/${partner}_ca.p12" - CLIENT_PATH="./${client}" - KEYSTORE_PATH="./$CLIENT_PATH/${client}.p12" - NSSDB_PATH="${CLIENT_PATH}/nssdb" - - echo "$PARTNER_CA_KEYSTORE" - - mkdir -p $NSSDB_PATH - - echo "Generating keystore for Partner $partner Client $client" - keytool -genkeypair -keystore $KEYSTORE_PATH -storepass test123 -alias ${client} \ - -keyalg $KEY_ALG -validity 36500 \ - -dname "CN=localhost, OU=${partner}" \ - -ext san=dns:localhost,ip:127.0.0.1 - - echo "Creating CSR for $client and signing it with ${partner}_ca" - keytool -storepass test123 -keystore $KEYSTORE_PATH -certreq -alias ${client} \ - | keytool -storepass test123 -keystore $PARTNER_CA_KEYSTORE -gencert -alias "${partner}_ca" -ext ku:c=digitalSignature,nonRepudiation,keyEncipherment -ext eku=sA,cA \ - -rfc > "${CLIENT_PATH}/${client}.pem" - - echo "Concat root_ca.pem to ${client}.pem" - cat "${CA_CERTS_PATH}/root_ca.pem" >> "${CLIENT_PATH}/${client}.pem" - - echo "Importing signed $client.pem CSR into $KEYSTORE_PATH" - keytool -keystore $KEYSTORE_PATH -importcert -alias $client \ - -storepass test123 -noprompt -file "${CLIENT_PATH}/${client}.pem" - - echo "Converting p12 to jks" - keytool -importkeystore -srckeystore $KEYSTORE_PATH -srcstoretype PKCS12 -destkeystore "$CLIENT_PATH/${client}.jks" -deststoretype JKS -srcstorepass test123 -deststorepass test123 -srcalias $client -destalias $client -srckeypass test123 -destkeypass test123 -noprompt - - echo "Initialize nss" - echo "test123" > ${CLIENT_PATH}/nsspin.txt - certutil -N -d sql:${NSSDB_PATH} -f "${CLIENT_PATH}/nsspin.txt" - # hack to make Java SunPKCS11 work with new sql version of nssdb - touch ${NSSDB_PATH}/secmod.db - - pk12util -i $KEYSTORE_PATH -d sql:${NSSDB_PATH} -k ${CLIENT_PATH}/nsspin.txt -W test123 - echo "Fixing truststores in sql:${NSSDB_PATH}" - certutil -M -n "CN=root.ca.besu.com" -t CT,C,C -d sql:"$NSSDB_PATH" -f ${CLIENT_PATH}/nsspin.txt - certutil -M -n "CN=inter.ca.besu.com" -t CT,C,C -d sql:"$NSSDB_PATH" -f ${CLIENT_PATH}/nsspin.txt - certutil -M -n "CN=${partner}.ca.besu.com" -t CT,C,C -d sql:"$NSSDB_PATH" -f ${CLIENT_PATH}/nsspin.txt - - certutil -d sql:"$NSSDB_PATH" -f nsspin.txt -L - - echo "Creating pkcs11 nss config file" - cat <${CLIENT_PATH}/nss.cfg -name = NSScrypto-${partner}-${client} -nssSecmodDirectory = ./src/test/resources/pki-certs/${client}/nssdb -nssDbMode = readOnly -nssModule = keystore -showInfo = true -EOF - - # remove pem files - rm "${CLIENT_PATH}/${client}.pem" - - # create truststore - echo "Creating truststore ..." - keytool -exportcert -keystore $ROOT_CA_KS -storepass test123 -alias root_ca -rfc | keytool -import -trustcacerts -alias root_ca -keystore "${CLIENT_PATH}/truststore.p12" -storepass test123 -noprompt - keytool -exportcert -keystore $INTER_CA_KS -storepass test123 -alias inter_ca -rfc | keytool -import -trustcacerts -alias inter_ca -keystore "${CLIENT_PATH}/truststore.p12" -storepass test123 -noprompt - keytool -exportcert -keystore $PARTNER_CA_KEYSTORE -storepass test123 -alias "${partner}_ca" -rfc | keytool -import -trustcacerts -alias "${partner}_ca" -keystore "${CLIENT_PATH}/truststore.p12" -storepass test123 -noprompt - -done -rm $CA_CERTS_PATH/root_ca.pem -echo "Keystores and nss database created" - -## create crl list -mkdir -p $CRL_DIR -rm $CRL_DIR/crl.pem - -for crl in "${crls[@]}" -do - IFS=':' read -r -a array <<< "$crl" - partner=${array[0]} - client=${array[1]} - - echo "Exporting CA certificate and private key" - openssl pkcs12 -nodes -in "$CA_CERTS_PATH/${partner}_ca.p12" -out "$CRL_DIR/${partner}_ca_key.pem" -passin pass:test123 -nocerts - openssl pkcs12 -nodes -in "$CA_CERTS_PATH/${partner}_ca.p12" -out "$CRL_DIR/${partner}_ca.pem" -passin pass:test123 -nokeys - - echo "Export $client certificate" - openssl pkcs12 -nodes -in "./${client}/${client}.p12" -out "$CRL_DIR/${client}.pem" -passin pass:test123 -nokeys - - ## On Mac, use gnutls-certtool, on Linux use certtool - echo "Creating crl" - printf '365\n\n' | gnutls-certtool --generate-crl --load-ca-privkey "$CRL_DIR/${partner}_ca_key.pem" --load-ca-certificate "$CRL_DIR/${partner}_ca.pem" \ - --load-certificate "$CRL_DIR/${client}.pem" >> $CRL_DIR/crl.pem - - rm "$CRL_DIR/${partner}_ca_key.pem" - rm "$CRL_DIR/${partner}_ca.pem" - rm "$CRL_DIR/${client}.pem" - -done - -~~~ diff --git a/acceptance-tests/tests/src/test/resources/pki-certs/ca_certs/inter_ca.p12 b/acceptance-tests/tests/src/test/resources/pki-certs/ca_certs/inter_ca.p12 deleted file mode 100644 index a6e945c2f0638ca5380ba1bb5e378d4eb63bc4f9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3516 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 S=hf#40hqa&9*+My!T$k)Pi9R3 diff --git a/acceptance-tests/tests/src/test/resources/pki-certs/ca_certs/partner1_ca.p12 b/acceptance-tests/tests/src/test/resources/pki-certs/ca_certs/partner1_ca.p12 deleted file mode 100644 index fc89f3e90f462e3f4f2511e054c7dbf2aa0221a7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4434 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 diff --git a/acceptance-tests/tests/src/test/resources/pki-certs/ca_certs/partner2_ca.p12 b/acceptance-tests/tests/src/test/resources/pki-certs/ca_certs/partner2_ca.p12 deleted file mode 100644 index c9fe71867920fff04f279af62effe2389cbf5305..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4434 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 diff --git a/acceptance-tests/tests/src/test/resources/pki-certs/ca_certs/root_ca.p12 b/acceptance-tests/tests/src/test/resources/pki-certs/ca_certs/root_ca.p12 deleted file mode 100644 index 8fc62a23aceb2d9899743d385bb80e53aeb31e9d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2602 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 diff --git a/acceptance-tests/tests/src/test/resources/pki-certs/create.sh b/acceptance-tests/tests/src/test/resources/pki-certs/create.sh deleted file mode 100644 index efc59a09c..000000000 --- a/acceptance-tests/tests/src/test/resources/pki-certs/create.sh +++ /dev/null @@ -1,190 +0,0 @@ -#! /bin/sh -## -## Copyright contributors to Hyperledger Besu. -## -## Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with -## the License. You may obtain a copy of the License at -## -## http://www.apache.org/licenses/LICENSE-2.0 -## -## Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on -## an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the -## specific language governing permissions and limitations under the License. -## -## SPDX-License-Identifier: Apache-2.0 -## - -set -e - -names=("partner1:miner1" "partner1:miner2" "partner1:miner3" "partner1:miner4" "partner1:miner5" "partner2:miner6") -crls=("partner1:miner5" "partner2:miner6") -KEY_ALG="EC -groupname secp256r1" -#KEY_ALG="RSA -keysize 2048" - -########## -CA_CERTS_PATH=./ca_certs -ROOT_CA_KS=$CA_CERTS_PATH/root_ca.p12 -INTER_CA_KS=$CA_CERTS_PATH/inter_ca.p12 -PARTNER1_CA_KS=$CA_CERTS_PATH/partner1_ca.p12 -PARTNER2_CA_KS=$CA_CERTS_PATH/partner2_ca.p12 -CRL_DIR=./crl - -mkdir $CA_CERTS_PATH - -keytool -genkeypair -alias root_ca -dname "CN=root.ca.besu.com" -ext bc:c -keyalg RSA -keysize 2048 \ --sigalg SHA256WithRSA -validity 36500 \ --storepass test123 \ --keystore $ROOT_CA_KS - -keytool -exportcert -keystore $ROOT_CA_KS -storepass test123 -alias root_ca -rfc -file $CA_CERTS_PATH/root_ca.pem - -keytool -genkeypair -alias inter_ca -dname "CN=inter.ca.besu.com" \ --ext bc:c=ca:true,pathlen:1 -ext ku:c=dS,kCS,cRLs \ --keyalg RSA -sigalg SHA256WithRSA -validity 36500 \ --storepass test123 \ --keystore $INTER_CA_KS - -keytool -exportcert -keystore $INTER_CA_KS -storepass test123 -alias inter_ca -rfc -file $CA_CERTS_PATH/inter_ca.pem - -keytool -genkeypair -alias partner1_ca -dname "CN=partner1.ca.besu.com" \ --ext bc:c=ca:true,pathlen:0 -ext ku:c=dS,kCS,cRLs \ --keyalg RSA -sigalg SHA256WithRSA -validity 36500 \ --storepass test123 \ --keystore $PARTNER1_CA_KS - -keytool -exportcert -keystore $PARTNER1_CA_KS -storepass test123 -alias partner1_ca -rfc -file $CA_CERTS_PATH/partner1_ca.pem - -keytool -genkeypair -alias partner2_ca -dname "CN=partner2.ca.besu.com" \ --ext bc:c=ca:true,pathlen:0 -ext ku:c=dS,kCS,cRLs \ --keyalg RSA -sigalg SHA256WithRSA -validity 36500 \ --storepass test123 \ --keystore $PARTNER2_CA_KS - -keytool -exportcert -keystore $PARTNER2_CA_KS -storepass test123 -alias partner2_ca -rfc -file $CA_CERTS_PATH/partner2_ca.pem - -keytool -storepass test123 -keystore $INTER_CA_KS -certreq -alias inter_ca \ -| keytool -storepass test123 -keystore $ROOT_CA_KS -gencert -validity 36500 -alias root_ca \ --ext bc:c=ca:true,pathlen:1 -ext ku:c=dS,kCS,cRLs -rfc > $CA_CERTS_PATH/inter_ca.pem - -cat $CA_CERTS_PATH/root_ca.pem >> $CA_CERTS_PATH/inter_ca.pem - -keytool -keystore $INTER_CA_KS -importcert -alias inter_ca \ --storepass test123 -noprompt -file $CA_CERTS_PATH/inter_ca.pem - -keytool -storepass test123 -keystore $PARTNER1_CA_KS -certreq -alias partner1_ca \ -| keytool -storepass test123 -keystore $INTER_CA_KS -gencert -validity 36500 -alias inter_ca \ --ext bc:c=ca:true,pathlen:0 -ext ku:c=dS,kCS,cRLs -rfc > $CA_CERTS_PATH/partner1_ca.pem - -keytool -storepass test123 -keystore $PARTNER2_CA_KS -certreq -alias partner2_ca \ -| keytool -storepass test123 -keystore $INTER_CA_KS -gencert -validity 36500 -alias inter_ca \ --ext bc:c=ca:true,pathlen:0 -ext ku:c=dS,kCS,cRLs -rfc > $CA_CERTS_PATH/partner2_ca.pem - -cat $CA_CERTS_PATH/inter_ca.pem >> $CA_CERTS_PATH/partner1_ca.pem -cat $CA_CERTS_PATH/inter_ca.pem >> $CA_CERTS_PATH/partner2_ca.pem - -keytool -keystore $PARTNER1_CA_KS -importcert -alias partner1_ca \ --storepass test123 -noprompt -file $CA_CERTS_PATH/partner1_ca.pem - -keytool -keystore $PARTNER2_CA_KS -importcert -alias partner2_ca \ --storepass test123 -noprompt -file $CA_CERTS_PATH/partner2_ca.pem - -echo "Generating miner keystores..." -### Generate client keystores -for name in "${names[@]}" -do - IFS=':' read -r -a array <<< "$name" - partner=${array[0]} - client=${array[1]} - - PARTNER_CA_KEYSTORE="$CA_CERTS_PATH/${partner}_ca.p12" - CLIENT_PATH="./${client}" - KEYSTORE_PATH="./$CLIENT_PATH/${client}.p12" - NSSDB_PATH="${CLIENT_PATH}/nssdb" - - echo "$PARTNER_CA_KEYSTORE" - - mkdir -p $NSSDB_PATH - - echo "Generating keystore for Partner $partner Client $client" - keytool -genkeypair -keystore $KEYSTORE_PATH -storepass test123 -alias ${client} \ - -keyalg $KEY_ALG -validity 36500 \ - -dname "CN=localhost, OU=${partner}" \ - -ext san=dns:localhost,ip:127.0.0.1 - - echo "Creating CSR for $client and signing it with ${partner}_ca" - keytool -storepass test123 -keystore $KEYSTORE_PATH -certreq -alias ${client} \ - | keytool -storepass test123 -keystore $PARTNER_CA_KEYSTORE -gencert -validity 36500 -alias "${partner}_ca" -ext ku:c=digitalSignature,nonRepudiation,keyEncipherment -ext eku=sA,cA \ - -rfc > "${CLIENT_PATH}/${client}.pem" - - echo "Concat root_ca.pem to ${client}.pem" - cat "${CA_CERTS_PATH}/root_ca.pem" >> "${CLIENT_PATH}/${client}.pem" - - echo "Importing signed $client.pem CSR into $KEYSTORE_PATH" - keytool -keystore $KEYSTORE_PATH -importcert -alias $client \ - -storepass test123 -noprompt -file "${CLIENT_PATH}/${client}.pem" - - echo "Converting p12 to jks" - keytool -importkeystore -srckeystore $KEYSTORE_PATH -srcstoretype PKCS12 -destkeystore "$CLIENT_PATH/${client}.jks" -deststoretype JKS -srcstorepass test123 -deststorepass test123 -srcalias $client -destalias $client -srckeypass test123 -destkeypass test123 -noprompt - - echo "Initialize nss" - echo "test123" > ${CLIENT_PATH}/nsspin.txt - certutil -N -d sql:${NSSDB_PATH} -f "${CLIENT_PATH}/nsspin.txt" - # hack to make Java SunPKCS11 work with new sql version of nssdb - touch ${NSSDB_PATH}/secmod.db - - pk12util -i $KEYSTORE_PATH -d sql:${NSSDB_PATH} -k ${CLIENT_PATH}/nsspin.txt -W test123 - echo "Fixing truststores in sql:${NSSDB_PATH}" - certutil -M -n "CN=root.ca.besu.com" -t CT,C,C -d sql:"$NSSDB_PATH" -f ${CLIENT_PATH}/nsspin.txt - certutil -M -n "CN=inter.ca.besu.com" -t u,u,u -d sql:"$NSSDB_PATH" -f ${CLIENT_PATH}/nsspin.txt - certutil -M -n "CN=${partner}.ca.besu.com" -t u,u,u -d sql:"$NSSDB_PATH" -f ${CLIENT_PATH}/nsspin.txt - - certutil -d sql:"$NSSDB_PATH" -f nsspin.txt -L - - echo "Creating pkcs11 nss config file" - cat <${CLIENT_PATH}/nss.cfg -name = NSScrypto-${partner}-${client} -nssSecmodDirectory = ./src/test/resources/pki-certs/${client}/nssdb -nssDbMode = readOnly -nssModule = keystore -showInfo = true -EOF - - # remove pem files - rm "${CLIENT_PATH}/${client}.pem" - - # create truststore - echo "Creating truststore ..." - keytool -exportcert -keystore $ROOT_CA_KS -storepass test123 -alias root_ca -rfc | keytool -import -trustcacerts -alias root_ca -keystore "${CLIENT_PATH}/truststore.p12" -storepass test123 -noprompt -## keytool -exportcert -keystore $INTER_CA_KS -storepass test123 -alias inter_ca -rfc | keytool -import -trustcacerts -alias inter_ca -keystore "${CLIENT_PATH}/truststore.p12" -storepass test123 -noprompt -## keytool -exportcert -keystore $PARTNER_CA_KEYSTORE -storepass test123 -alias "${partner}_ca" -rfc | keytool -import -trustcacerts -alias "${partner}_ca" -keystore "${CLIENT_PATH}/truststore.p12" -storepass test123 -noprompt - -done -rm $CA_CERTS_PATH/root_ca.pem -echo "Keystores and nss database created" - -## create crl list -mkdir -p $CRL_DIR -## rm $CRL_DIR/crl.pem - -for crl in "${crls[@]}" -do - IFS=':' read -r -a array <<< "$crl" - partner=${array[0]} - client=${array[1]} - - echo "Exporting CA certificate and private key" - openssl pkcs12 -nodes -in "$CA_CERTS_PATH/${partner}_ca.p12" -out "$CRL_DIR/${partner}_ca_key.pem" -passin pass:test123 -nocerts - openssl pkcs12 -nodes -in "$CA_CERTS_PATH/${partner}_ca.p12" -out "$CRL_DIR/${partner}_ca.pem" -passin pass:test123 -nokeys - - echo "Export $client certificate" - openssl pkcs12 -nodes -in "./${client}/${client}.p12" -out "$CRL_DIR/${client}.pem" -passin pass:test123 -nokeys - - ## On Mac, use gnutls-certtool, on Linux use certtool - echo "Creating crl" - printf '365\n\n' | gnutls-certtool --generate-crl --load-ca-privkey "$CRL_DIR/${partner}_ca_key.pem" --load-ca-certificate "$CRL_DIR/${partner}_ca.pem" \ - --load-certificate "$CRL_DIR/${client}.pem" >> $CRL_DIR/crl.pem - - rm "$CRL_DIR/${partner}_ca_key.pem" - rm "$CRL_DIR/${partner}_ca.pem" - rm "$CRL_DIR/${client}.pem" -done diff --git a/acceptance-tests/tests/src/test/resources/pki-certs/crl/crl.pem b/acceptance-tests/tests/src/test/resources/pki-certs/crl/crl.pem deleted file mode 100644 index 763d01c19..000000000 --- a/acceptance-tests/tests/src/test/resources/pki-certs/crl/crl.pem +++ /dev/null @@ -1,28 +0,0 @@ ------BEGIN X509 CRL----- -MIICGzCCAQMCAQEwDQYJKoZIhvcNAQELBQAwHzEdMBsGA1UEAxMUcGFydG5lcjEu -Y2EuYmVzdS5jb20XDTIzMDUwNDEwMTUzNVoXDTI0MDUwMzEwMTUzNVowbTAZAghF -KUAnwQI0rxcNMjMwNTA0MTAxNTM1WjAZAggBqEW2S0yD7hcNMjMwNTA0MTAxNTM1 -WjAZAghxoeavxdMy8xcNMjMwNTA0MTAxNTM1WjAaAgkAgWKzx/tKZWkXDTIzMDUw -NDEwMTUzNVqgQTA/MB8GA1UdIwQYMBaAFJcP76nbNK50KG5jmh6CvsxlAhJjMBwG -A1UdFAQVAhNkU4XHFwNbgBqsTIFexJjuzEvyMA0GCSqGSIb3DQEBCwUAA4IBAQB2 -fhAhVwRBtHdwqhGjRlgbz4i6E0CtoL/02Vazib1OiRAXCkyFJL04U3FGcrPa89Dt -ClZE0G38+Jw0Be0tEpn9A8doSbLr73w1GqW3BqNTw/qjbc6R2x28A1VIVPwV6bZH -5P59YtDV+SjSPNxqkwRMyXqGZ2WIMwUS3u47Es9vMsjChXUJWU6W+jf3LYO/dt+V -7xSchRpljhBtMB8MIoXILBq9uOSFalLmy94YzK2Rw1ZG2SVy2QZ6ZXHvZ/omLbPL -kd4oAiN7L0OLOkFVHyb9bVP6DUWfXxSxBdszbQzHCy74NEsFUC0xqq0xpxwQRRfD -codJtbEVJraSsSBkB78n ------END X509 CRL----- ------BEGIN X509 CRL----- -MIICGzCCAQMCAQEwDQYJKoZIhvcNAQELBQAwHzEdMBsGA1UEAxMUcGFydG5lcjIu -Y2EuYmVzdS5jb20XDTIzMDUwNDEwMTUzNVoXDTI0MDUwMzEwMTUzNVowbTAZAggF -p9b0zZl1RxcNMjMwNTA0MTAxNTM1WjAZAgh7MQ7e4x/GbRcNMjMwNTA0MTAxNTM1 -WjAZAghxoeavxdMy8xcNMjMwNTA0MTAxNTM1WjAaAgkAgWKzx/tKZWkXDTIzMDUw -NDEwMTUzNVqgQTA/MB8GA1UdIwQYMBaAFJuQMv8IsgbJS8FfPZZx+hSgj7PBMBwG -A1UdFAQVAhNkU4XHGmnm4OkmS4KBFW1nS4csMA0GCSqGSIb3DQEBCwUAA4IBAQB2 -43mCjuMmB+MXpl+Axn3b/4V2f0HmbUFhF/andWKUwzC47HoQ+WzXoTV0xisHGCgH -SYlrLdWd+pFh24H7TrKgqvmwtVmUFwm6DphXW3AHvaePWIrAy7L5ZrdOQB9TZPC1 -Ly+6x0oKoueiHodWivLQx+CJVbPAzxFEVh0JjecoFw8Tf9FGTqy8jJRdno9HgKDg -BB7w7kPGF7xoaAbukwTXFz7f1nep44oqge+leEc398tdFDxmwralXAUB0A2v/vDG -cSZTr+fyTri+zHjQzeq6//y2GF7S56KSyBXDXTJrvqtuijiVHTzQku+pbVNNrid5 -LgCJI7Phj2Q8k26z0+JJ ------END X509 CRL----- diff --git a/acceptance-tests/tests/src/test/resources/pki-certs/miner1/miner1.jks b/acceptance-tests/tests/src/test/resources/pki-certs/miner1/miner1.jks deleted file mode 100644 index df9dfad4b5dd2f0b891cae035e1d19444f0913de..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3227 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 QjT$@usqm`wOaG_;1?O7-y#N3J diff --git a/acceptance-tests/tests/src/test/resources/pki-certs/miner1/miner1.p12 b/acceptance-tests/tests/src/test/resources/pki-certs/miner1/miner1.p12 deleted file mode 100644 index baba59128aae2a961e6b1af9decea6ffdd241300..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4004 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 diff --git a/acceptance-tests/tests/src/test/resources/pki-certs/miner1/nss.cfg b/acceptance-tests/tests/src/test/resources/pki-certs/miner1/nss.cfg deleted file mode 100644 index d76bd9c16..000000000 --- a/acceptance-tests/tests/src/test/resources/pki-certs/miner1/nss.cfg +++ /dev/null @@ -1,5 +0,0 @@ -name = NSScrypto-partner1-miner1 -nssSecmodDirectory = ./src/test/resources/pki-certs/miner1/nssdb -nssDbMode = readOnly -nssModule = keystore -showInfo = true diff --git a/acceptance-tests/tests/src/test/resources/pki-certs/miner1/nssdb/cert9.db b/acceptance-tests/tests/src/test/resources/pki-certs/miner1/nssdb/cert9.db deleted file mode 100644 index 33e83d02b71d03eaa6c38f795823d384e1cd3d35..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 36864 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 U*V_@F3hC$sy}7=gmKebQ0ObKytpET3 diff --git a/acceptance-tests/tests/src/test/resources/pki-certs/miner1/nssdb/key4.db b/acceptance-tests/tests/src/test/resources/pki-certs/miner1/nssdb/key4.db deleted file mode 100644 index 03a4a5e5b86910715a5db5d5d99b80bd8b442a81..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 36864 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 p+7JuA~I(+~&*%4@*4 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 diff --git a/acceptance-tests/tests/src/test/resources/pki-certs/miner2/nss.cfg b/acceptance-tests/tests/src/test/resources/pki-certs/miner2/nss.cfg deleted file mode 100644 index 995d452fc..000000000 --- a/acceptance-tests/tests/src/test/resources/pki-certs/miner2/nss.cfg +++ /dev/null @@ -1,5 +0,0 @@ -name = NSScrypto-partner1-miner2 -nssSecmodDirectory = ./src/test/resources/pki-certs/miner2/nssdb -nssDbMode = readOnly -nssModule = keystore -showInfo = true diff --git a/acceptance-tests/tests/src/test/resources/pki-certs/miner2/nssdb/cert9.db b/acceptance-tests/tests/src/test/resources/pki-certs/miner2/nssdb/cert9.db deleted file mode 100644 index 21d6ea184107e60752f60c91b43be1b1327d1302..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 36864 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 diff --git a/acceptance-tests/tests/src/test/resources/pki-certs/miner3/miner3.jks b/acceptance-tests/tests/src/test/resources/pki-certs/miner3/miner3.jks deleted file mode 100644 index 79ee2cb0ecc44eb7cf4c08171acb77db25627dfb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3227 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 U7k@7OlWzLEnYFYJUK_~&0K?b-cmMzZ diff --git a/acceptance-tests/tests/src/test/resources/pki-certs/miner3/miner3.p12 b/acceptance-tests/tests/src/test/resources/pki-certs/miner3/miner3.p12 deleted file mode 100644 index c7e42d1af69677fbdda29b508457a4c77f64ddcc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4004 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 diff --git a/acceptance-tests/tests/src/test/resources/pki-certs/miner3/nss.cfg b/acceptance-tests/tests/src/test/resources/pki-certs/miner3/nss.cfg deleted file mode 100644 index 65e04bccb..000000000 --- a/acceptance-tests/tests/src/test/resources/pki-certs/miner3/nss.cfg +++ /dev/null @@ -1,5 +0,0 @@ -name = NSScrypto-partner1-miner3 -nssSecmodDirectory = ./src/test/resources/pki-certs/miner3/nssdb -nssDbMode = readOnly -nssModule = keystore -showInfo = true diff --git a/acceptance-tests/tests/src/test/resources/pki-certs/miner3/nssdb/cert9.db b/acceptance-tests/tests/src/test/resources/pki-certs/miner3/nssdb/cert9.db deleted file mode 100644 index 5b295bcda9ab458a518e5255a688503e86575f81..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 36864 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 diff --git a/acceptance-tests/tests/src/test/resources/pki-certs/miner3/nssdb/pkcs11.txt b/acceptance-tests/tests/src/test/resources/pki-certs/miner3/nssdb/pkcs11.txt deleted file mode 100644 index c4368a178..000000000 --- a/acceptance-tests/tests/src/test/resources/pki-certs/miner3/nssdb/pkcs11.txt +++ /dev/null @@ -1,5 +0,0 @@ -library= -name=NSS Internal PKCS #11 Module -parameters=configdir='sql:./miner3/nssdb' certPrefix='' keyPrefix='' secmod='secmod.db' flags= updatedir='' updateCertPrefix='' updateKeyPrefix='' updateid='' updateTokenDescription='' -NSS=Flags=internal,critical trustOrder=75 cipherOrder=100 slotParams=(1={slotFlags=[ECC,RSA,DSA,DH,RC2,RC4,DES,RANDOM,SHA1,MD5,MD2,SSL,TLS,AES,Camellia,SEED,SHA256,SHA512] askpw=any timeout=30}) - diff --git a/acceptance-tests/tests/src/test/resources/pki-certs/miner3/nssdb/secmod.db b/acceptance-tests/tests/src/test/resources/pki-certs/miner3/nssdb/secmod.db deleted file mode 100644 index e69de29bb..000000000 diff --git a/acceptance-tests/tests/src/test/resources/pki-certs/miner3/nsspin.txt b/acceptance-tests/tests/src/test/resources/pki-certs/miner3/nsspin.txt deleted file mode 100644 index 5271a5268..000000000 --- a/acceptance-tests/tests/src/test/resources/pki-certs/miner3/nsspin.txt +++ /dev/null @@ -1 +0,0 @@ -test123 diff --git a/acceptance-tests/tests/src/test/resources/pki-certs/miner3/truststore.p12 b/acceptance-tests/tests/src/test/resources/pki-certs/miner3/truststore.p12 deleted file mode 100644 index 028424cebdf8e53db3c9b018ae0b324b56352a56..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1126 zcmV-s1eyCVf&^j$0Ru3C1PlfVDuzgg_YDCD0ic2d{RDyo`7nY5^)P}1@dgPhhDe6@ z4FLxRpn?P9FoFZ#0s#Opf&&LNQU+thDZTr0|Wso1Q5=F?w)25f2`pSws*~ujbng<17P4v{NMV#l_e_M2nzm0vP@%` zFjWphE88&)X{Xq`o0QA;=&AiX`S=llxH$J*ZX+(tC$c?gh#m;e4=Xo3kn;yO`-KMAQolV+`vfy zF>u118cPkS!J^6PR~d}XZNx@jTsE%Eb@=Doowg7`K?n>f#&8CxK+9G>cMo$lZ;Z=o z=|}Ym1CNE9?cO1JPp;|;MpJnA9r1Fs27y6vkOra2aD!KLB>pUV$g{`Z&%t z`M3dfb~S~})^5&9gMj2;Kv2g*InmLXI!*i^r(Ts2R7zs6$SWvg0rZl}-~$`!n3tTX zQjl#>7IvJ3sOE)rgWN8NS-GQ@q)<}hD^Y8+aqGjn=?<=Tj;ya+Nf#6)C2AH9rgTR{ zpupZfphl`DOkkABCt8_lj^n zdP>Un3Z1rfJ!^+dfT1u=FflL<1_@w>NC9O71OfpC00bZuj$jg#_Af|-I!ll3k*)r> szqZAYjcCRE&gh?g#yCj?6!(kQl=+!N7V=~=MG{1qwp*jJ=K=yJ5CeJ<_5c6? diff --git a/acceptance-tests/tests/src/test/resources/pki-certs/miner4/miner4.jks b/acceptance-tests/tests/src/test/resources/pki-certs/miner4/miner4.jks deleted file mode 100644 index 6cde7b1a0bafe370fa8c6480adc3ccab33e3ac18..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3226 zcmb7`c|4TcAIE36lzr@^v5#duW673oxnvt|QfV|3vRvy7X3)!x7!pRZk0qBYjIu|z zR6?k1Wr-|VOO}YZ#f>}V{_d~q)$jKD{c&E;Ip62?e9w8lpU?Z8v$eRj2m*m1tOowl z5Z>-27e7tb@bW9eNE=q{A`lF4BRG{2U>H~l!UqP!K`>8VN%a%vP@ZstM{{N|6#u&I zP*7cPTL%Ywhcm%vGa;>k-4nSPHBp50DZ0vVyR+YmewaJRC*Zhxd>r8-LDbIxKVNuB z_)6r@Kb6wB?;y4UJz;%qd9&}IWjx%PgrnudY&a;l8fS0t3!_;}fPvtrFU6o zmLK5V$;#nHc5?J`BU7jV9uPpVu_o^_fPfL~Upi1Q8`Ka4ySTEtnKTuT&5#zM#>68F zJX7B^$H5GIedQH-dxrJe&0BDf*_E?K`Ann8P1@T@F&&YLd{W8|kpr(H6c$OBuKNOH zK$10~BsWY5hUDzXR{xY55xv~-?~E`a5gAw*?;vQy9x=Vfx#ecwzl-# z3Wg%DTSUsFxm$NxU`nRf_5)s{4Yy;RQUQYf-Zhe&*dInZ_bQ}ZUh~Ji5pnA7FEiCL zHXi@fYLwFYT30rL0ZFwjZ^|i5R^^?;`-GRBCkS3$*AMd(UFQGzVt{a{tTdaG1a_#f z_cRuBTGoCMm(cQJ+p4Rxsok=AGm@O$D;HSk{wPTBx{eqZV_T%0nzEQS?tiimY9_&a z6XHGaVSW^L-^IYzG@e^T4EA)PrIqahnvBuM__hYTl)2N1KAxp#bi6t3jR%q%6a+u6 zh%-DrZlUSMU)oX^tZAMymu{+fNFecRFVoyP9+P<#mL$n8xX*!OIov!wt5IiA{ZWY>Ec=eFbDIJpt)^m z8{7j%Z|9<y zP0B4funvA&XqYfL-_RWvnMzE1Yk6cu_thVk#ehdD_w=~kY40ma1(eMo-QL5wrTA%2 zzr?cs2?!Jn0$+CpoWH{7n>73bA8;hV{}~^F&p5FI2-X7vW^E>4A?2s^rU~hUyg$6( zH`sZhzLqL!$@#Sstj*^OGvSFM{$A4h;}6dNvaNiODPz_8h|50pOvO;9JEL8%{DS1Q^n2XaccDC1(|F4QMXhM)aYr?y_|5p7Oc~&rV2T~9Aw>qS|f@$ zk&V{~(RFY((Slov%*6DBL#IhMdpgZI;^upmEKb?ntLnc{Gkdjr%Pi@pHU;)Rr@LJ* zE4e7SAl?K!Ba2krAJWu~A??XMe~u$FG-GmT8CM(S$qceREE;b*>cTfQ+2Ww;fm!+Z zWWu7-4y&u5MmoH%LzcFGUBItWvz&h`f=*h`3~t3*=B!D`zQBZk=){f6_p?*VnTRx7 zoefmxh65Z$A(L&rwxXWwbL75!D^Zj(WJ2VVPxnoyBRtlLdyo%mAC`nix9shc&AM6 zCh~1<@%+ z;!(<}!_h|;Z@>eMh;BMM)Hg%jsF50`S(0p?rLV>`?f3ab1D)c&#A(+U*_)D4T#HaL4icY?GSNJ81wI)TO+ri{&hL!WbwgV&hGQ05Va{=k$6|=5%%ZI}$FMO~ z=Sg9oAago-f+^P^Q+{R`Ot1zGEa&pywc97Ji%+_mo9b+w``E(_!bjgHmY~%_Owy&y z&b_3shd;tYHeRlb9ajy$n?Q+1pPITtc+%0My-*0fj!cSp-1s*ykasLr7Fip4{|+x4 zps;h5ZJXvU?z_tN{{W-08yF3{fB*b@ywso7(vl9H3fwG;3my@Ah@{^)KR;snV|3z zVNF%_gV^+Iz9;XaE(@NE&CP|7v=TXD`#+Y(b1}-4iWjephUfQ;q-{x=f%3E2?2`~C zH7KE}>O9;0Pne2CBH3!Ld?IS0dxsZw0Ql;B`KHxB-ynC+6F2~6ohQ3Q{NjC^ksfsP zv7W0&S{t$EeNd}@^1G2UCL5LK8o4D8XjVvJ_AoeWh0p!AH|^9(UwKoZ`O3Qo)>HZ8 zIcvJ~VFU>)l@sBZ0|5@fhQu0di335y^4Y_us`K*qA|htZ&#SNTTt2&rFTvGK z2ha&Cu2!>``WAetWrSl4S>5GtrIfq!?Z{i3v5WA^C` z$sD^K8))#b zO7L3X4`PqN(PMR!5dWgD4GbbD z&l<}kM^k*KB}3=3G2A(8+d9?xdd>8vqnD(g!8p!LzTwIYe^XqyAz?Aoy}c^CKX8&V zCzsX=vG*npYVXqb9jh#G^ksJfKCMu~IQ)C4bOW2l?m&9ACCd~NEa=6VxG1s*;8k7M z^>-7wf%Jsl&5YUQu460P8BuwB75#9Xq z+QFl+CW;BrHzoEkfx!Sno0-cs3zRNv&M=!Yt4ROgZj>q0gRHZw?be3eOHZ=Wy80TG zc<7voN9<=0UR($NA{k^H;sGlc0afXJ>E*=`tYmfU(WBL@rLnCOLPv^b@TQpsQh*lY zBz{BmC(ZV~0yptXvD*bVh3%93usf%$X-6drVMQC%GPM!>F$z*2#aVl;n;C9Bu^ivv z31#*BtrKZLB zHIL>0p7)@0Z$)vj+w}F^sy)S6UoM-dZ8L+RgY=X%WxUC|r^hW}FDEyoa=Q7(Nzkm= zCx7-BcrCmI0#W_0_~Uv|?zmS!GN0)IgV`FrP6jSa3% zr8>VqyR6y>f|OY7J~Eqe&M{(XTl^~c_D=Ad?(qvW3$j8!>l-AE)YjF-WO$+cH1)}# z8J#!c*e9{#wQ9X(bcKzwlgLIjwgTg7XkZqlO$;&DsffM5GH!ghSLz`=(K-dDef54f zOhH{NgKi?be`!wJT$1{LU^i3VvD?BNLS9lSC?F-T(U~IK81! zNGrEdM5L~}sI-?KB3CFjVaG1i;?@58%(ImkUEsY?ho>2B7ugaDQS)WEKcNUki*TBLkddtqd2##zwtgm66?}C{`(cV!hlJ z8XxCoI9r%>Lv|LH9RjMGEhA6R1n6=nK3oBTFHP^ThQASdO5Y;#oft24m~>$5X-|=v z2L;%e0Xj$N(&k?!btT=?0vP!`v``#4!sOQk8W2ZBDs#R{9xR^(@p- z@P4QQJsI(|QgQ1_VRG->vS5mNc4=FD&waTiGFCK}MNCx<=`raeG>~C;5UGV3Q|+6M zit}l-Z32dUrJ{h=)URj0K}y>;{ysJ5xUN>uPoB;ZF$^;y@|O=;aU8!6Fa!i_-L~t| zP2>S`4tt&>;!estW;p~a_pQv&ewfaUlRYn@brzL702S1D!qEZd<E@!bbBL7RO|lfp>>_kE}L=3$5t(TH&$nU6##CW+8fPuXm0081$jXSc`e?xI6F~#L%k1 z7|%GpnU$k&$}%KTgkQo4#u)$Bhwixh9bHMPy~2z-D-z93VE1nGKraZ|ZG=jQH2Y+n zJQ!9}714MRw0;tg$95BJQhF_;H^&DEWp_}675RvW#^$Kd`8nAUx8*X#N%aCb=x4n| ze`V`Yblk8_(8{o0Lnc`p4&q1HolzG`H=EYPzSDbs!u^c0i$pu$H~RL-`Zwb>4_!(h zUD0{5V1&Q)`GRVattP{p*sWPL!+UrrHK~NTFiocjQYN81Z0yz((je{vZ>CUBxuQQI)~kcqzF9z21KmlkFbB5Rd*F2# zMo?=9HH`@&9AsCSthU}n!p>+5@WvItXNh>bHKwRYwkn}OM*YV8xa;H(3fBGoLn?jD zwC_d$9g@1NTM2>qGi|+R632_w=P5T|?!_<^dfwK3{3Ct+%k`D~mpMyDPe)z#xQ!=C zt{pKbcb28EXu`0+mbzv59Bm15)qmx=y{UG9&!#V1uJf~OWkW;_iDwoCa5SVOw`O_7 zJ*cTh0&m%Or^y^Aoh;-N1_(9#JD9<{!5Y#8CR7w^Iysv4o})1b#Y z%3;C9Mc9uz+m~r5_1rJAz;qm7SMVYZQ-7qL8YOm%MkR{Sm^e#&)N!AMVRhW9qhHUr zuT~l1-Fo05Znk_H?QJzYwkwz`B~|#Rs(v7S7tTViZDZ35R8t@MY27WDip#4X+B2y- zSL?gk!+>d4kqyh9J>-k_o8N=p%Ap+~!c^c~DLJrK`1w^0k@7_rBZ`2)y^)KcH}Mqv zmwK0)#~fG<&RZM)hm>P~+{`_q%NR~PRX-WDIA%eInr~d<_N()$BB;iX>Xb9a>DL5~ zzTJ`3QgAa-EAB7Mb}&-Vb;n@CxX^U|VX;-+b2tf$&k=s)#YdM_!lFXb?9z*Nutzhs z6%EpvKR80W-*y-XS@cel^?%*UyB`+#B^1o3M;c(;$xa?$k}tg^;}KPxrf8(e5o}M0 z?BOltfMQKvs3;jc>x-5VRuEu_U-C>p2r}J3{#uGXd+|Pl06ElHrs50G8%!c3YBiO1 z_lah$m<<-hD`n|9K3B__4QCFY`+Y$N=dOgskrd)MUPcR*5y=kSA6c|DeQM`yQoYiK zfd9U2up^>fMtpl_*v*l(8d=;JqE|NBkD4NYBm8jhm>yWD&R0R1P?GVGo4y`p`Yz8! zW0agJU&SC5gB$~04mq`>n(Wri3a?nkuFQm4eeZBH^Tt*YgXZR&P#T(YJje0T$8ETo>mq0=wYfG=%3=x z-sm;I>l@)@X*@%xJNk^rKcJJ4uFm@Pcn9 z7bE$}@9cPbX6i{G1LJ=AId4S#wONn*CUL($rt;sDH%g=kD1UVZ{B%;9Es-91DxGGA zyxJLi!aiFn-s*uQ0+$o(XMzob4j)TsZ;@V?7zfrB)$*`>&nAC#%CjV1>wOT8(aiWW z2AI}=J9{otrqcUOP1RmLmnFk?L!L~g_eV%R;>So@+#<99ff*Xp>=H+qo!-b752Zab z9ZNxbH-O$nmeD)AmLVIh)Bs}ff!5FDcuGw_Ct1-I9^ZlU_nte{N^6IP8WEoS7S2_f zXWy84pDNR=!KXV=V^TX{n@Ja%&=V^Hj#{ohr+lSSa?8gU=sezg&PQ(XK|+rale`#26_myV%9j;W}y&tORDqLjI45RtiS9*^o(Dw0UIgbbCNl&F-X zLi3fRB6UR*r9sJ1Zqr*dynF9+aJVjg-+jOPzTf?=?YGx{_OsS{)>{9)*K^KVd+lR^ zt(6bYi@7`~G{B9=10PObCL+@m&nxdo~eVp!S^LM_5SyBT*dEa#4^(KSDI| z7D(bPdRgL_gs;S8`~+-(03ZMe00MvjAOHve0)W8(Aps*AO-@b`cJK-G^jhWN=jP)X z7#21^+}+>DLv)s%sqsQnrn${*(Zn8|K1d| zeiq2MffhI#v#B(>af+}rnLjMt-Pg;5*K0wfp9MkeKpQNKrD2TFWx!uRsylS!irxWh%_U$CEkV&fMDA&VgxZ z>cCuNV{W_1lqg}=JexUI=Cc+ujZNm+Eu6}9!|)>#_E!>x@4>_8LP{WB`xccmi5S#BqbJ!iA}bbjS+d-WP90UojIhQL+UxC zo=a-Dq=qZd5T$T2q7*JkhD(y+lJ>czeJ*(&bjZ9qWL_OIuMSBSw~1kF7E!oBBx5<~?eft4?kd<0@&HjwD}_zCp->Y&$C2i?B<;$lyIaj_>YE()dXDHzxG)E5_f3dY5rf^o5@U|b|_HKGo< zNZfA%k+|suqGzAz)h90R70H{1pVqyvI_^YuJaybKPj?K{U{Pptriw7ccP%0Q_=w)c zEu0rbp1bt+YZq3ph~Tc4PPkiQP!FTsgeb;85F*$B0YCr{00aO5KmZT`1ONd*01yBK z00BVY??Zr2B_8tA(NYNgh`vUjqmAfo^g3FGE5HT_00MvjAOHve0)PM@00;mAfB+x> z2mk{Ac>;8V3UeOr$f5HEqXbb>Xl$U+_`)VkL?CEW1%ehL5Hu;G2vv;JxM>Q1{7;9_ z&**kE2(?D1phYMht^dzA5Yzw=00aO5KmZT`1ONd*01yBK00BS%5cu~KP)5vPY&>f$ zCQm~aQIXN3d;)o1p;{hpTJBz9;aVO+0dyr~4vdXsjltyjNk)bS1@VMahz^^AHf#!! zVN+0tuPUO3*ua<~O930luPP(hEtD7N70ME>E(Jj#G5+}97DAVzi&0zD6^%x7@D%`` z{{4i3ML+-$00aO5KmZT`1ONd*01yBK00BVYZ$yBKKro#MM2X-#2K>Vh=c(T{oJTZ~ zWiU30H3~zCLBGUkde5MrC5?^b&jX102YI;pdk2N_C^SS`EC+JrkN@K#v=sdn-HX0L zKcN};N`Uyk(G>wr0R#X6KmZT`1ONd*01yBK00BS%5C8=JdkBak(l92mk_r03ZMe00MvjAn^Z`z<@OZ#87_khj&kxnm}>w zGS9}`_-WSFR+d%-ImW*?^L*y0q|)X$Ht{Wt#KNLG&0ptJi5zM!x*@9@k@4XUC9<9u z*Sze`H)%$Q2=S^t>@TS?@ttR9HTyesWhPLqWGHe7S8T8dNgN>+v4T)oB3aZI7r+Jx z00RFj0&(N05mbhh6c^gE7-Gy}3K=ou3Z49cDD?;W?^EMH=An(J#Q%HeV6%c)G@^t> zQ^c|m3QVEUL-sx|xLnJAi%HVNCdZn^{!msID-FO+ju7_l*|U8*v&s3q;R ztq_41Kj#4K4rqun+D1&yw^_*IK1YJY}9DPuu|zDI}lRLkh3uJs0CznMJz`Ow0QxRH$f zE8^{3S^0dgS&v=fovIQX7wEi9bAGc-3)+0x%~9ogdKzo$De8ji+e_5mOn*D2X71gD zDhIuV+Omh|Zt*^pTRQG_@w?4gD=gQBz80xg$$qjsqsz>hg1`{GZ#m|PDd4NM6r`xK zR7U9Jmt_nO#)SvWkVwz=(r6Kls-22_2c$`lD-3H-|AR|1B{oKl!L+w@s>epSWR_w8%B zwUt+CP1F+Y#=FS=J1J>tZgO{P17dzXXm69xzi>dn8 z^KQ%JK1+F=t9Dl9*wP2ElPy%=nJsRjX zKC|Jti3sT(44^H`Ach%}C{3{0{1x6o3onfC9R_a+e z$uK>O_ExDd zpHg^ID(>gXn6`@@My*#)ju&?*LBem)Wy_}cMDJDegkP!6l%2jj-`H_x-Q~^eeb?PQ zP?0|2#+`f7zr?2N`%N@UxZf6}+N?B5DcE{f(WS?CL@Y8gFY4cAUp?YT-E+p?He$`~ z6>D<7YR`ME+`WTyL_=ypbeB~9>{qREiuRFX4Hup9v0@y#JEJ`9*tNh34-VT|wRrfl z&2I)Tunlj`Y5H05ZdA9*az!LL`-tub_*S0D_9ty;YocOPozq`g8#hdQ{@FSo^G%g{ z*5tS(;HSw4!nz}-)f#0Vb$I3%np9BtcrYiChQ2=dfP0ju9_X=iLiG76FN(CscQ^^C zpOYBW)Aav%Af3d9B>8ZE<>^hotXlnT%8XnUn~JNFE~!fk@9pwQt28*aW}@+q2MeCC zU2ctj?`l=OIR8>m6EA*KyUOmIxZ_iGiw*QzA3a{aJ5s+^Ta&V?Gs5<)(tBrlk08_c zPVuE8qGJvmPs&Zo*gkVf;Gvt<7Ghi5YA0JRUU2?I-J0T-Z8cxblMm^IQQu|NR2pQa z98NiqIG5F|%1~#nEvwNAl*nG?F1Bm^&L{UetxDqjawF`G#w40GdX0Meq})~0SL@BE z>yIsq99h$*rw1B+&<|2}d2v8`YH?@I@tB0b54$2OSk_tZ$E)7g+VHX3s&Qf+J?vO6 zE!|$fOKDe^tB6uqP>{X98qsBk?gkWkZ|@oI72LtT!^5$D6w*=1L-9O_VZ$U!6l}}> z3P+)d7lu0u{&PayCj{f2a*4n%I8>`td_Ag?Gte&#*UgVIw>HqC}ILp*S&e$o%}SBwNqK1w>gn>M(vD5y`$pAG}V|iN~-;_vaGxm z&5^AR!5a!zImvAMFg+@COsDjx`}IyU3y$s)4}@I{UHnYPdUWdD-@3j0{x_Q&)n%2| zr@CW<_SCAa%=5V#A+t|^tYq3Z`D45t9qCQsi*6(4<8xoG4XFRv)=0hJWoU1fC?!9Z zdaJ#>LUfHrkk)jqkct(LRL)du*ku~bw!4)6(wD)Dh!C+;w=!AMWXbiGK3ZNHIcY{h z${354>5rWQ!%Q;SHKOK|+s9tkj`0cpk`ceojJVl{{iLAKd+){XUGqNJ^@O9=z+`We z7Id-R14Eh%N#TDGBqb#!{kv#fO++!H28rplF`PjB0w11+0z>$te_TL_75Re<-|-F! z5vv1;R6_SW)%Z`}^5pnm%mW%BCxMAu-~!kH0YCr{00aO5KmZT`1pX|6C{Ox7h-qQ+ zi({g5FPPsuY=wy&!aJ0ZXJM4KcYL9#{Lf{o z`aZEXHKDC}*v4)1FP>ACTT(x{`9s~dC=b!TX7-!>{wtbkl+f4Ap?;&QZwl}Ct;`U= zqFP((IWNZ2UGLnUq8|-EFRs;5w2i+Lu$q;(T4|A&`k8-3dD4Vhsr)@n6H4>UoNVs6Js(GpPgfU&^^(Ci%)yfOb zJM5dAY-PncRhJUgRv>p;V~f3J@WT>=w~o=HE_P%(yMD|PD>7~^Q(b-K1#+(vBbf_`gQI=8FH{i2kDF1JuoOCn9YM9zKhi1fvaLMEEYwiTVz z{g5i1C|-PHI@M{s&D4b(v~*XvMw&PmvyQkrajbuxaXz7A?Vb~>CZ3OpX|Y(vevfWi z*6nb_s`S~41gAI4ZCWa$7P?@6=Tsch$ae%_a#8-~}U zx^yUOU)-}~r$Uxm`vd(3mlbK{g<)ov_kG0V4ti)m-S94Oty`3>_`%%?i;sJJ%zxeb zgD3MBqjfb-W3^RVj@^2}+pK_D#Y&_+q;EPgOCm%yA-7`Di*K}|bFwkZ493ZZk5+%x Zp?~oPk8mGD-i{QZPB4_~8*GUI{4YLqO@sgd diff --git a/acceptance-tests/tests/src/test/resources/pki-certs/miner4/nssdb/key4.db b/acceptance-tests/tests/src/test/resources/pki-certs/miner4/nssdb/key4.db deleted file mode 100644 index 127bbd567e9732c176dce7c3a75f62d4c6c25899..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 36864 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 Q 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 WO&;MshP)gpLY-hJ*EiS_1Nfh$%TR0p diff --git a/acceptance-tests/tests/src/test/resources/pki-certs/miner5/nssdb/key4.db b/acceptance-tests/tests/src/test/resources/pki-certs/miner5/nssdb/key4.db deleted file mode 100644 index e366aa9e27204b6e11311f91083a09eb9ab4d299..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 36864 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 UPr!D?Pkui_GA7&5hQ65iKapuQjsO4v diff --git a/acceptance-tests/tests/src/test/resources/pki-certs/miner5/nssdb/pkcs11.txt b/acceptance-tests/tests/src/test/resources/pki-certs/miner5/nssdb/pkcs11.txt deleted file mode 100644 index bd574fbdc..000000000 --- a/acceptance-tests/tests/src/test/resources/pki-certs/miner5/nssdb/pkcs11.txt +++ /dev/null @@ -1,5 +0,0 @@ -library= -name=NSS Internal PKCS #11 Module -parameters=configdir='sql:./miner5/nssdb' certPrefix='' keyPrefix='' secmod='secmod.db' flags= updatedir='' updateCertPrefix='' updateKeyPrefix='' updateid='' updateTokenDescription='' -NSS=Flags=internal,critical trustOrder=75 cipherOrder=100 slotParams=(1={slotFlags=[ECC,RSA,DSA,DH,RC2,RC4,DES,RANDOM,SHA1,MD5,MD2,SSL,TLS,AES,Camellia,SEED,SHA256,SHA512] askpw=any timeout=30}) - diff --git a/acceptance-tests/tests/src/test/resources/pki-certs/miner5/nssdb/secmod.db b/acceptance-tests/tests/src/test/resources/pki-certs/miner5/nssdb/secmod.db deleted file mode 100644 index e69de29bb..000000000 diff --git a/acceptance-tests/tests/src/test/resources/pki-certs/miner5/nsspin.txt b/acceptance-tests/tests/src/test/resources/pki-certs/miner5/nsspin.txt deleted file mode 100644 index 5271a5268..000000000 --- a/acceptance-tests/tests/src/test/resources/pki-certs/miner5/nsspin.txt +++ /dev/null @@ -1 +0,0 @@ -test123 diff --git a/acceptance-tests/tests/src/test/resources/pki-certs/miner5/truststore.p12 b/acceptance-tests/tests/src/test/resources/pki-certs/miner5/truststore.p12 deleted file mode 100644 index 7d54dfe7f6d1ed45b5cb8ac5ae5e8046819fcb9f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1126 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 T8@sDhVAdh!A+gZ4T6O9VovHCl diff --git a/acceptance-tests/tests/src/test/resources/pki-certs/miner6/miner6.p12 b/acceptance-tests/tests/src/test/resources/pki-certs/miner6/miner6.p12 deleted file mode 100644 index 8df1575b0e3a939e925148f1b3e36f132f58f83c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4004 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 diff --git a/acceptance-tests/tests/src/test/resources/pki-certs/miner6/nss.cfg b/acceptance-tests/tests/src/test/resources/pki-certs/miner6/nss.cfg deleted file mode 100644 index 60a2e65bc..000000000 --- a/acceptance-tests/tests/src/test/resources/pki-certs/miner6/nss.cfg +++ /dev/null @@ -1,5 +0,0 @@ -name = NSScrypto-partner2-miner6 -nssSecmodDirectory = ./src/test/resources/pki-certs/miner6/nssdb -nssDbMode = readOnly -nssModule = keystore -showInfo = true diff --git a/acceptance-tests/tests/src/test/resources/pki-certs/miner6/nssdb/cert9.db b/acceptance-tests/tests/src/test/resources/pki-certs/miner6/nssdb/cert9.db deleted file mode 100644 index 8bc1ba42f15efaef2bac73ad65811099cba0b0e9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 36864 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 V;Xb~4J5r=N!Pi`0e@hJDe*vndG710y diff --git a/acceptance-tests/tests/src/test/resources/pki-certs/miner6/nssdb/key4.db b/acceptance-tests/tests/src/test/resources/pki-certs/miner6/nssdb/key4.db deleted file mode 100644 index aa078f69b7d74b24028ca91d68009f3702a9b02a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 36864 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 J&<4Ml_#a_$6!icA diff --git a/acceptance-tests/tests/src/test/resources/pki-certs/miner6/nssdb/pkcs11.txt b/acceptance-tests/tests/src/test/resources/pki-certs/miner6/nssdb/pkcs11.txt deleted file mode 100644 index a47ca829b..000000000 --- a/acceptance-tests/tests/src/test/resources/pki-certs/miner6/nssdb/pkcs11.txt +++ /dev/null @@ -1,5 +0,0 @@ -library= -name=NSS Internal PKCS #11 Module -parameters=configdir='sql:./miner6/nssdb' certPrefix='' keyPrefix='' secmod='secmod.db' flags= updatedir='' updateCertPrefix='' updateKeyPrefix='' updateid='' updateTokenDescription='' -NSS=Flags=internal,critical trustOrder=75 cipherOrder=100 slotParams=(1={slotFlags=[ECC,RSA,DSA,DH,RC2,RC4,DES,RANDOM,SHA1,MD5,MD2,SSL,TLS,AES,Camellia,SEED,SHA256,SHA512] askpw=any timeout=30}) - diff --git a/acceptance-tests/tests/src/test/resources/pki-certs/miner6/nssdb/secmod.db b/acceptance-tests/tests/src/test/resources/pki-certs/miner6/nssdb/secmod.db deleted file mode 100644 index e69de29bb..000000000 diff --git a/acceptance-tests/tests/src/test/resources/pki-certs/miner6/nsspin.txt b/acceptance-tests/tests/src/test/resources/pki-certs/miner6/nsspin.txt deleted file mode 100644 index 5271a5268..000000000 --- a/acceptance-tests/tests/src/test/resources/pki-certs/miner6/nsspin.txt +++ /dev/null @@ -1 +0,0 @@ -test123 diff --git a/acceptance-tests/tests/src/test/resources/pki-certs/miner6/truststore.p12 b/acceptance-tests/tests/src/test/resources/pki-certs/miner6/truststore.p12 deleted file mode 100644 index bb56eecd08a7a2a501832acfe6bc4c347d74e218..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1126 zcmV-s1eyCVf&^j$0Ru3C1PlfVDuzgg_YDCD0ic2d{RDyo`7nY5^)P}1@dgPhhDe6@ z4FLxRpn?P9FoFZ#0s#Opf&&LNQU+thDZTr0|Wso1Q2sHS96?4gecm=3lqFrmB)aB17J4`?`1hJP*4S%kCe{8B>`yN z4 zUE$b?Rz@kqye4m^AH#Ni&&BXxkfSoGJC#)zhZ?rAb^KZ1|K4h(ACjLg#_ZDSf=T({|{o{%g9 zQC3S3FJvkBaWy9w!A2w<%g#DYxe53}*^vW>UaWnOyw;Q6DI7t~zxoJJ?X>B81(9g? zHy?7TyxQJ!o0C+09;s)~!`#J3OEeyE!9xzSCcq8!kT}0NLc`1!TYoRte6tiS8BLx5 z;(XgcP*y$|?wgb(71W2p=GbxZWs^@cy3f9O8nz=3(*Cu_I9WoU8=|j%OwnrR&<<`U zz%ZFoHgyK>^yFbj0lE7LbTN*s#Cv@2uu)fhiLZO(#rV;V?sAx`t=%{rg08%VF@aS7 z;)IyKnSvp&tQvOu<;$ssg*0c~oq{h{y(Kp&*)_yVke#4joQ^jK^`6V(+XN|-8*ZMN z)2|$+$yX@0EwU^^V!z_t5Jae_2eI7-5*X%Bw;qd;at}Ho+LZcnI?N-$y@93bXI3W0Xo^S9tkvFtebPi+ zUD(S_$eG5Gf4y?OW@t6Rfws{5i(-M$0LLOr>bI(T091&9c28l$H!>+VgB1V&37Wel z3V{TBE$t*P)sT2E=X*vY)~!G%UaA1I15_I-XMnSZj7NW9BVjoqgQZAMfmC*si71j$ zanwk4-6LhVVNrH5(;ZrFgrkM07ORL7d9PubyYvO7Cw{Z0GgFGa{%*>qe7BP|B1fMe zD56`AT#DBJrPB~v4~P_^0~AL;!49{ks86#cEFuu`L?FA1khlQF@;B#20%^rNC9O71OfpC00bZoH4!(i%gEG#YVCl4cJ&0~ s2tPw26Y2?Z5^=WKQ|Iag6d@(bPYJ>ZO{Qbqu_k_7`mSbZ-~s|C5FGOOJ^%m! diff --git a/acceptance-tests/tests/src/test/resources/pki-certs/node1/crl.pem b/acceptance-tests/tests/src/test/resources/pki-certs/node1/crl.pem deleted file mode 100644 index 8ced006c9..000000000 --- a/acceptance-tests/tests/src/test/resources/pki-certs/node1/crl.pem +++ /dev/null @@ -1,27 +0,0 @@ ------BEGIN X509 CRL----- -MIICBDCB7QIBATANBgkqhkiG9w0BAQsFADCBgTELMAkGA1UEBhMCVVMxCzAJBgNV -BAgMAkNBMQwwCgYDVQQHDANTRk8xCzAJBgNVBAoMAk1DMQ0wCwYDVQQLDARyb290 -MRMwEQYDVQQDDApwYXJ0bmVyYWNhMSYwJAYJKoZIhvcNAQkBFhdwYXJ0bmVyYWNh -QHBhcnRuZXJhLmNvbRcNMjEwNzA5MTkxMjM1WhcNMjIwNzA5MTkxMjM1WjAnMCUC -FF9rJlU9U6JdFIeK/xRojaoxHdc5Fw0yMTA3MDkxOTEyMzVaoA4wDDAKBgNVHRQE -AwIBADANBgkqhkiG9w0BAQsFAAOCAQEAfByR//FGHSsVQbaS51d59o82XocOGnnT -p1hjceqtLGv3bhiebVrsRCOB5TsvE/r2IbB/yHYTe3+LJisIUqBxblQ6xK6IM+qA -3fY646YnPT5pvdZAPZ2BCN/xP3xqGffFKapQ9cz0/36YE3vaEoUDlC2VHK0OXI0t -4CLwAmiptUT2GW4Bk1RtokAsFiUNwNIOlRX5bywUNwkG7EuitR90QSGH3l/vyii2 -0c1Fm9He9MskwipjXpJKKb+t+m1pdpOVkSjRfjmVqi4BZwWlnQjELSLywhJ+WZG2 -Z1NgRjzPXotFKK+YD97Kx1L260A1eUZ46zSq73oUZr0EDZRnNJTr6A== ------END X509 CRL----- ------BEGIN X509 CRL----- -MIICLDCCARQCAQEwDQYJKoZIhvcNAQELBQAwgYExCzAJBgNVBAYTAlVTMQswCQYD -VQQIDAJDQTEMMAoGA1UEBwwDU0ZPMQswCQYDVQQKDAJNQzENMAsGA1UECwwEcm9v -dDETMBEGA1UEAwwKcGFydG5lcmJjYTEmMCQGCSqGSIb3DQEJARYXcGFydG5lcmJj -YUBwYXJ0bmVyYi5jb20XDTIxMDcwOTE5MTIzNVoXDTIyMDcwOTE5MTIzNVowTjAl -AhQTZhDgbKuvX7iLRUBBTiWXBPKM1xcNMjEwNzA5MTkxMjM1WjAlAhRfayZVPVOi -XRSHiv8UaI2qMR3XORcNMjEwNzA5MTkxMjM1WqAOMAwwCgYDVR0UBAMCAQEwDQYJ -KoZIhvcNAQELBQADggEBAMIltmJ036f1BmK/baISJTZTu7PKZgSZMNORnpFT8KvC -s2GNRor5bGp5qvD6LHvsx92YVppCC6xd/beCFBtdyYifqw5xtOvqLQKuqCfxruLz -EqYjKXE/3v8VdyU71J7kFqi0U0Gy4/h/YCL92e5KNbATlmcn5ToyI2EBIEfBfV08 -mm7FBXvbHRzqhfrnCNEjBWBWz3zkJMc9Rib26eCCofYIDkY2HvYSN78YgrnMmD6O -hWOXrPoxArxvmDr5rG4vCadqbQYRkkCAOP0hBeMiB0SAcO2W2LNNAmHWXX7FvU3n -ZRZUX31WoVjhNeEQtNBb2mPYBXHQzLC66qYm1p97afc= ------END X509 CRL----- diff --git a/acceptance-tests/tests/src/test/resources/pki-certs/node1/keys.p12 b/acceptance-tests/tests/src/test/resources/pki-certs/node1/keys.p12 deleted file mode 100644 index 1aeb2fec791cc42aa3d6c9f2390440f0963e7f9c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6008 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 dp(@$^(QUOHyjA21dVbB1IAx4~V5yW9Tv*1fy6 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 Q5C8!X009sHf&WI}Uo4sy9{>OV diff --git a/acceptance-tests/tests/src/test/resources/pki-certs/node1/nssdb/key3.db b/acceptance-tests/tests/src/test/resources/pki-certs/node1/nssdb/key3.db deleted file mode 100644 index 0b103995be1baae63b6a94d6559514d93a489105..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16384 zcmeI$c{J2(9{}**G-Db@#ubWAOtOrvESDKsx`ZKexr{B#9VELkLbg%%HK8$HvJ)ap z7_=x{lOan)S+9&sdAnKa9Z7W4`~LC%{r=H=?m5r*oacPM=XsuUzTflt=Q-zrkRoIV zg7!fWVibY|zm^a`1i`+hy#=BEQ+z%DwgLZ^za2q{y_y~n&H0-5V(-r0`tE`H_dMUd zFK7q^fB+Bx0zd!=00AHX1b_e#00KbZ?;?PLwlE(tD;OrG7Q?_W1a9!scyI820RaSn z01yBIKmZ5;0U+=l1>g`eAkgE2Dx?yN;Huz|XoWpgOgGh0C3xrnL-?+6voQWRHzf z-}@Shh;~Zw>e`+iU9S8gfXg z?c=cNQ+T|W-iB`6!gkPu=osgYfFl1swLiS>WJ8iG730+W^Pa9g9rZb3vf{6T_LFmk zON=(j`sBkj{Pil|=x6Zhh!(5mlflWKUcKoHgBnBe`oHj{oyK!K6p`LBMLXV6Jv#+Z zSm*C(_?)<(x0UqeUL`}_;)SsUc{E-?F>Wc5;e>k3uT?0wfFUF<4${NJerVnvoFa=H zEPA2Cb~2u5IGmkPahy@X@#wm#U;j4n%0@0hxgip@J;V+yR^dBjyNaHW_}L`91X(88 zbv;Od7JV;i(R+TvMWmY|>7rh|@n~jJPivIQ!yKs@wYon3fpnU-W%EzSGfo>GbP6{a z_`;Ejvl3+4c5{WVq({o!<&6!w}EKflr4=KLC!*@PdJAB5yLjH_xpc;d966FZ1J5hSXnNoRF zbzAg|jBL7K1HEh7Fm;7Xvushck&(@|HVybQOP3+)Oh+|6wih!W=#7%}5qsx=ef3-( zp=sVIBl=#7S5tS5nkno0+G!!{bJXNiMf{6^G_E!IVMoyev+k^BPh&N0ZiPZ~R;ryr zzK<~Bjw7-fd#1{agfX|Q))^8O3Z`XIa*N@0RjZs&EzwtrzvD8@{Tn&)TPG5eKl}O= z9aFQNk9HW{w0I_=s+7e_YapJ*+UR9c@}B0vT)p^t{#B3)o4vePU&=hx!6ifz>-%Bk z`fbPb&caiKY!Z%SC7xf;s;)C^&une$|KMrbLUrE{A2VBbXjWJz&~(DblJ%gH z*;uL9^MwMlIoNHipQ#2?OIs+_T%xmuQyw0!hpl>DTgoA&@*xm%#nwOsKWKJop*Jp7|;?Rmwfr$)76!Bp^n@%xG?W|Jh%gDU9 zlDO*8d*@37pQJnuW59#@62FLdgip>q*!@X8tuVLEFVcK^+&#WbKr2h2v1HJ}vT-e+p75awwbr?A z(4YfLV&^p9Zk?S~stt*kvn=Oo{&dVg!c=9luirvrYuxk+VNmY5+u4Ub8$!gHvGfx! zcV-POm_?6=t!ImJo@Kmx`*Vl#=DQs^Dxsk&-uiwi4X0^2#^xz&x}EH=j`cd6hjMcs zTE~8hZ6a}qJW7J}cFFNrCG)uGJDtWmy*;Ku0d8#Ye z5c;FjNV^Qry3ERQCePs2#T3%HuGcOIz1;=uwOh(ZBCzfF3OhlVtuvb!N6 zn7DC3ZVn!ImqHE>4hy7uD7$-IaQB7VUZ4hh2L}9I{wctmKmZ5;0U!VbfB+Bx0zd!= u00AHX1c1Q*F0k_*|FuCYAOHk_01yBIKmZ5;0U!VbfB+Bx0zlyZBk&iY2!oRV diff --git a/acceptance-tests/tests/src/test/resources/pki-certs/node1/nssdb/secmod.db b/acceptance-tests/tests/src/test/resources/pki-certs/node1/nssdb/secmod.db deleted file mode 100644 index 08102e23979aed56fbaeb5c47e07822df06d387d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16384 zcmeI&ze)o!9Ki9PRcZ&RE^Zlel7WliW+=zQ1fB*srAbn3Ip&3(^PBXj>VNKH72weOW}Baa@8gJJ5c*;EIaDN=i@L3=Gv8PNHit(=Nn zzV9t}@yOUKlZHt&&7#=mE9F1@r^BW1o^bB!pR(!MpGyh?2q1s}0tg_000IagfB*sr H{C9ybXU9$v diff --git a/acceptance-tests/tests/src/test/resources/pki-certs/node1/nsspin.txt b/acceptance-tests/tests/src/test/resources/pki-certs/node1/nsspin.txt deleted file mode 100644 index 5271a5268..000000000 --- a/acceptance-tests/tests/src/test/resources/pki-certs/node1/nsspin.txt +++ /dev/null @@ -1 +0,0 @@ -test123 diff --git a/acceptance-tests/tests/src/test/resources/pki-certs/node1/ssl-ca.pem b/acceptance-tests/tests/src/test/resources/pki-certs/node1/ssl-ca.pem deleted file mode 100644 index 61a8f5230..000000000 --- a/acceptance-tests/tests/src/test/resources/pki-certs/node1/ssl-ca.pem +++ /dev/null @@ -1,70 +0,0 @@ ------BEGIN CERTIFICATE----- -MIID8DCCAtigAwIBAgIUcATI/N49JsZyAuyS8gfW6BppdBEwDQYJKoZIhvcNAQEL -BQAweDELMAkGA1UEBhMCVVMxCzAJBgNVBAgMAkNBMQwwCgYDVQQHDANTRk8xCzAJ -BgNVBAoMAk1DMQ0wCwYDVQQLDARyb290MRAwDgYDVQQDDAdpbnRlcmNhMSAwHgYJ -KoZIhvcNAQkBFhFpbnRlcmNhQGFkbWluLmNvbTAgFw0yMTA3MDkxOTExNTRaGA8y -MTIxMDYxNTE5MTE1NFowgYExCzAJBgNVBAYTAlVTMQswCQYDVQQIDAJDQTEMMAoG -A1UEBwwDU0ZPMQswCQYDVQQKDAJNQzENMAsGA1UECwwEcm9vdDETMBEGA1UEAwwK -cGFydG5lcmFjYTEmMCQGCSqGSIb3DQEJARYXcGFydG5lcmFjYUBwYXJ0bmVyYS5j -b20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDccGhUDD8T8m6e2x13 -B0LgCDR8F2vlfAw9FN/tXOKKU3DpagJk0CAutL6YFFYs9MXg8D6bZx+w0iXUnaN/ -6rjIC1LFs79AizpEaoFWDzcVI66ItSW1Swu3ts0I1kK7EGgAMba0TDTnssfrtuPw -rOA2TOdVX03owOE+gaaPonIQlnew5+NNGhbW+P/5ix1IQXhyuNjV/uu3VEJBGNTh -cAuMGdjvglFuz4zyFon4kNRcQvghs5ztjs2h5ZNHjEo6YtNIdJuRS/XOXII9MfPN -plcwJArWTM3yEATNBtdc5FypOSI6cO/Pl+SVEf4kKmnzJQZWOSGiDXbpm938hGVw -ByZPAgMBAAGjZjBkMB0GA1UdDgQWBBQhpkZg+Ktqh6sFCjtm9HE+9bLJ3TAfBgNV -HSMEGDAWgBTdAXu8aBbvkvxYD5Ss9/Ml5VgohjASBgNVHRMBAf8ECDAGAQH/AgEA -MA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOCAQEAIggdc0DCxEiNaKak -/xbc7uGiGBb+UzBTjk4BmX9kEFrZf4XEaHzsptltqcQDCVtzcbFFFxMYhv/w/1g/ -WMNuUhL0mmGIGMxfoqkg50tNyuHW6aSrBXErel9WthGXAhUSzdHgkWxl3pe2wgda -qIcSwTCFgOeVWTZRdKWqKNPHirBglJHUpMgLo0qa0Ug1hxiyOQRt2yXLpe/mH3pG -cozhrEDYQMOcDhYTpPwM2Bl+TsRPpxFaV4QDfiOyvUDFLMM0dyhl2pukjay/Xpp2 -+6Tsnaa+Ui0sDcM3A36Q07+E4Vugxjzfb9a36Eg4XE+Jg3jDA8UOqjeFg9gkK3aY -NaI0qQ== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIID6jCCAtKgAwIBAgIUYdazVD+VnI7jBu7xLaW+npfwHJIwDQYJKoZIhvcNAQEL -BQAwfDELMAkGA1UEBhMCVVMxCzAJBgNVBAgMAkNBMQwwCgYDVQQHDANTRk8xCzAJ -BgNVBAoMAk1DMQ0wCwYDVQQLDARyb290MRUwEwYDVQQDDAxyb290Y2EuYWRtaW4x -HzAdBgkqhkiG9w0BCQEWEHJvb3RjYUBhZG1pbi5jb20wIBcNMjEwNzA5MTkxMTU0 -WhgPMjEyMTA2MTUxOTExNTRaMHgxCzAJBgNVBAYTAlVTMQswCQYDVQQIDAJDQTEM -MAoGA1UEBwwDU0ZPMQswCQYDVQQKDAJNQzENMAsGA1UECwwEcm9vdDEQMA4GA1UE -AwwHaW50ZXJjYTEgMB4GCSqGSIb3DQEJARYRaW50ZXJjYUBhZG1pbi5jb20wggEi -MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDZ8QgVwEjy3CgJFvET7tYNBw97 -4i33EHQT4ZuayGCJ+ADY3ZFpsw2M1IPlbAguqfBkcLd8TAjWNRAdsm9ubGlIcTZr -7LNle3gvc7qEP4qg0i6M7D06CDqtBaIJ1PMTJchOouGU9ntBe+h0qg8tzpiqJdIw -jIOPRWW98Hw9KgF6++2jtlcOW1IxiFSWqf0Mpc81qKukcxnsHjvdxmBp/Z1vL42E -m5xNOGXoxpjq8NygSuVDhQ/bZUnmHLmvv9MXe9Ob52rlzea/YafLpOeNGSA1aCxm -Fx0lcoXWp4xpoyJn9St7vmH3t7quBKdqt54zwcuHjhgZPSR6RikodKHtsl8TAgMB -AAGjZjBkMB0GA1UdDgQWBBTdAXu8aBbvkvxYD5Ss9/Ml5VgohjAfBgNVHSMEGDAW -gBSMsBNO3UGBteMZOTq5fDPG2aPx8DASBgNVHRMBAf8ECDAGAQH/AgEBMA4GA1Ud -DwEB/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOCAQEA0hJCtrCI9Mf47+y3pvsTjiaT -TZwpNE0cdxHjpcCHJWX2jmGbqqA6wvQ7yy4PFarmnFOoW3hQFeiLgpz9X86YTRzF -8dj3Q2MKXf6i6/iW+Y96GFqurshKp7wV25wfzWwLXcVCiM1xYPWYSyGsZAGotu4M -c7uolVABjJu5nci9mBxVmaYV5oT1mxrvq3dCPm2AvmVFNWPNRbMSAuT5B7FUDvWG -xvd1aDFduqL0iLAcrTifMIYI3XL4pBSIlL78dgY45WL6616EF3mHhW/Y4k4PNq1I -Fz08Q3y99ilhzeAci1jv6KBVHiALZNFFtYjd10KX95qnF9SomBjCTPsQ9PTC5g== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIID2zCCAsOgAwIBAgIUdxRGMrv1ONRI/dJXUHa3isjVXuwwDQYJKoZIhvcNAQEL -BQAwfDELMAkGA1UEBhMCVVMxCzAJBgNVBAgMAkNBMQwwCgYDVQQHDANTRk8xCzAJ -BgNVBAoMAk1DMQ0wCwYDVQQLDARyb290MRUwEwYDVQQDDAxyb290Y2EuYWRtaW4x -HzAdBgkqhkiG9w0BCQEWEHJvb3RjYUBhZG1pbi5jb20wIBcNMjEwNzA5MTkxMTU0 -WhgPMjEyMTA2MTUxOTExNTRaMHwxCzAJBgNVBAYTAlVTMQswCQYDVQQIDAJDQTEM -MAoGA1UEBwwDU0ZPMQswCQYDVQQKDAJNQzENMAsGA1UECwwEcm9vdDEVMBMGA1UE -AwwMcm9vdGNhLmFkbWluMR8wHQYJKoZIhvcNAQkBFhByb290Y2FAYWRtaW4uY29t -MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2Bqlx+ngRZfWjktX6urJ -Tpg2//n3uMW8Gp55SVq+lbpkNXuA3W0uTlom/2fsnzmMmBAJUvv/NaLcFSN++0/d -fYGVhogxjlRoyaXa4sdFPg2ocM+lCHLGhWpYuVdTWPknikTOVNbh9z94SLRfrP8N -kuxGNZNktnVm+QJmrCLmjvnPvQlcP/WqFYehFM26NaRzswOhLLRU1YK8aVlh9Vto -PGSTPtZK60XwTfyCj/zEvHqpbGbKJPp7W0rpxl7ehPQIzGQt5IMH3zKrqLm4/pt+ -XFEVqy724sstthS73bvXguWxBLOzuMze8CbI6SJpcHaH8HO5pfFMPyE5N5l2x9Co -uQIDAQABo1MwUTAdBgNVHQ4EFgQUjLATTt1BgbXjGTk6uXwzxtmj8fAwHwYDVR0j -BBgwFoAUjLATTt1BgbXjGTk6uXwzxtmj8fAwDwYDVR0TAQH/BAUwAwEB/zANBgkq -hkiG9w0BAQsFAAOCAQEAL9/7YtxIbuTt7dgH1KOMb/y6P3Qb79fTVZTx073E2ZBj -OfSuMGUhKC30LWQXCQEsY4WpugJ4cS0NsArSYsO5XWguqgjYlWL6poOmYhGvj7ou -oi44oYqcPm6EbvLrAKdI67bkbSPLzgs+6TrxTyXHzPKFBqGBnuHaFKjgb4hGiPmd -JWKrh3fbTtuLjqSHd0Gey2uBNFql4LhPutdsCUhSOD3BibAeTbXyln70AgpTCoWT -9Qr9Ux6HYIiAHSDBzzuN8EcrlnAm9RO4zRyUVwxDsHoNsOUwybn50IM66p83HuiY -h/iX5uNjaFAADfRR4rQOwb6MLreVH2XYUSiz4M/ijg== ------END CERTIFICATE----- diff --git a/acceptance-tests/tests/src/test/resources/pki-certs/node1/ssl.pem b/acceptance-tests/tests/src/test/resources/pki-certs/node1/ssl.pem deleted file mode 100644 index 291b73031..000000000 --- a/acceptance-tests/tests/src/test/resources/pki-certs/node1/ssl.pem +++ /dev/null @@ -1,126 +0,0 @@ ------BEGIN PRIVATE KEY----- -MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQCw8JqVhfSxCPC+ -8UKvPAGHyZOzqrXd3SyrdYQnUKP2NkAhbXpJMNnIyk41+dVJxzjNJ9RiSr3D8hJH -3NOMLtj93UROtp7Az1PdnpPRjeHsT7kt9+79J3I4r6eEU7uhfig2UNPJBaKxqoht -MyBoGJgIYl3O8SD6grFV40cFfCFOWFgKi+Q+U7I0uMl/y+eXw1/g8DBwGPxhhw9Z -est7Ov3Qnk4x2np8Ejh6hl+dAqubojjLFdWrs2goQXrkE+qLEM2jze49L6gL5FwJ -brMkyewsaF6xVKfptMw9EK92NFzQuCUF8SXq548FzYHkiVVNweheBD7+4iCOpi0b -eiC4N6RXAgMBAAECggEABx01aeuf4fpVC6hRoRANk7MUIDYt58S7xg0MijQg04Zs -36syLn0rVHpl2J+55qR+8Si3zlfo91blS0RisRE1IkfiNjP7gA8V9SQqF1PYEJNI -A8QjNMSAQC031Ac11RFodn6bdUqntvL/VzymAelzO2sREH/7bncQwD5KHbtW73pm -un5CvnP6dHQTHX+AVDuH6yOdukuyNM+2Xn8J+PAIRsPn9yENgmvzWIW8UOvKj2Ox -4ckkT7zkihwyf8BnztNizdxSlR+ebsvP76C2gAULXoYjJlI7XxvQ1/qhma0yXhGx -I/fBBmK5rz84DabblgS0mOc2ul/nlhJI5kQSHr/PQQKBgQDVLnoJUOCa/R+s9zOn -WcUu38C8JYsj1J1PqHEOkoTim8gD3JxxCEuHLLFMSxMp4umGa3oYxut6HmgdQaym -mYPCKr0oWYDhZ8M0zwKFGTGjhGv/gkRQKdYk7IV5ASKEijRHwxfMBL9Qbc0+G0xO -/CQgJ4GsQ8neGfrDavzfsnt79wKBgQDUeqApjX0bQXTRYMyJU926N7vasyW+2kFd -KE2aUxgdEm1LG1ZDaCuPi7YZYH+J9krKISLehUJRCa4rmu6L0JjWHJAZNDQdKi2E -jNfQUWU9hoQHs3J/c8e63MmgUy7K16gt7oelRtlyL2A5NXnqvTv8U0kw7+KJkxda -et0Cke9CoQKBgBo6SJtizu9imwYNt9YsDj1xG+ZJ/C9hViVZxOcVEbJLljUbbEff -zGMKFZocVnQ9zZtTF8d6mbgBi6+lx9cLZhF6bqFLObcBrBuQKHA1pEzI2vypizwN -maIbU2SKxjNmSX5Wu1PHdb4wdCLi+uVw0gT+t055XJmtupNWU1w2OkkLAoGATdFD -SzSYdxz37Z7oCft/Hy4+TJCD6GwCuF2EXlrEYBFZmcI/S5yhJ4dhf9XJn/tl1LVi -EeD4Mrm64hlx+B7DetcnJzPpSi0iUoNKnu7Qh0H2pONhsa/znEo0RdVxM7Tb0Uak -wzE5fgo/0XP2XLRFfdn62kNg0kXerbKFsuVDnUECgYARX+jedlHmj1aY6ldhoRGf -5/RAfYAH2f0NbS4oAiRvchjydN9EjCVp8KoF7m9ToaLqPFgHP8zIjYsk7B49jXZr -DjtyMERpjMsBoRbjSKyD1glm1UQeoavgiorPz0w9QDYBstlhH/d0ejfEBCpGk5/2 -YxMs98KdYA62DUkmuaiySQ== ------END PRIVATE KEY----- ------BEGIN CERTIFICATE----- -MIIEszCCA5ugAwIBAgIUX2smVT1Tol0Uh4r/FGiNqjEd1zgwDQYJKoZIhvcNAQEL -BQAwgYExCzAJBgNVBAYTAlVTMQswCQYDVQQIDAJDQTEMMAoGA1UEBwwDU0ZPMQsw -CQYDVQQKDAJNQzENMAsGA1UECwwEcm9vdDETMBEGA1UEAwwKcGFydG5lcmFjYTEm -MCQGCSqGSIb3DQEJARYXcGFydG5lcmFjYUBwYXJ0bmVyYS5jb20wIBcNMjEwNzA5 -MTkxMjA4WhgPMjEyMTA2MTUxOTEyMDhaMHcxCzAJBgNVBAYTAlVTMQswCQYDVQQI -DAJDQTEMMAoGA1UEBwwDU0ZPMQswCQYDVQQKDAJNQzENMAsGA1UECwwEcm9vdDEO -MAwGA1UEAwwFbm9kZTExITAfBgkqhkiG9w0BCQEWEm5vZGUxQHBhcnRuZXJhLmNv -bTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALDwmpWF9LEI8L7xQq88 -AYfJk7Oqtd3dLKt1hCdQo/Y2QCFtekkw2cjKTjX51UnHOM0n1GJKvcPyEkfc04wu -2P3dRE62nsDPU92ek9GN4exPuS337v0ncjivp4RTu6F+KDZQ08kForGqiG0zIGgY -mAhiXc7xIPqCsVXjRwV8IU5YWAqL5D5TsjS4yX/L55fDX+DwMHAY/GGHD1l6y3s6 -/dCeTjHaenwSOHqGX50Cq5uiOMsV1auzaChBeuQT6osQzaPN7j0vqAvkXAlusyTJ -7CxoXrFUp+m0zD0Qr3Y0XNC4JQXxJernjwXNgeSJVU3B6F4EPv7iII6mLRt6ILg3 -pFcCAwEAAaOCASgwggEkMBEGCWCGSAGG+EIBAQQEAwIGwDAdBgNVHQ4EFgQUAWkS -lH1KF5emjGJvHhaERb3a7DIwCQYDVR0TBAIwADAOBgNVHQ8BAf8EBAMCBeAwHQYD -VR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMIG1BgNVHSMEga0wgaqAFCGmRmD4 -q2qHqwUKO2b0cT71ssndoXykejB4MQswCQYDVQQGEwJVUzELMAkGA1UECAwCQ0Ex -DDAKBgNVBAcMA1NGTzELMAkGA1UECgwCTUMxDTALBgNVBAsMBHJvb3QxEDAOBgNV -BAMMB2ludGVyY2ExIDAeBgkqhkiG9w0BCQEWEWludGVyY2FAYWRtaW4uY29tghRw -BMj83j0mxnIC7JLyB9boGml0ETANBgkqhkiG9w0BAQsFAAOCAQEAWq/10HjhRI3A -OOs2JTrG5Xpzz7E8rpH45XQE0ecB1I9Zcm5bnHx+WdIo5GtxvFzGF3EtlAaxDlcM -iE1u1bfrwEF6qr0nQc8q+wHfnNdb1lqqFlXrhoerLBVrChwqkGbxILUQ+mPFhSQd -a2791g8SS/jLM3lnf9bFp7AdzJCqg7Ly0BEkIpfVsuZn0HgfYf7JG68B05RdU7/v -Hw5wGTbEmukODWZtAYRFBnKT4pq5G30heNjATjkmaWeoImJNSPgyoPzYJsYJMUNC -GYj3Ap0ueY6LbsNXst61jUGeBtCcWDa3uRg8Hl7j1dz4USPTJwBEEuSSN3CzjJuI -VGvgw1MPpQ== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIID8DCCAtigAwIBAgIUcATI/N49JsZyAuyS8gfW6BppdBEwDQYJKoZIhvcNAQEL -BQAweDELMAkGA1UEBhMCVVMxCzAJBgNVBAgMAkNBMQwwCgYDVQQHDANTRk8xCzAJ -BgNVBAoMAk1DMQ0wCwYDVQQLDARyb290MRAwDgYDVQQDDAdpbnRlcmNhMSAwHgYJ -KoZIhvcNAQkBFhFpbnRlcmNhQGFkbWluLmNvbTAgFw0yMTA3MDkxOTExNTRaGA8y -MTIxMDYxNTE5MTE1NFowgYExCzAJBgNVBAYTAlVTMQswCQYDVQQIDAJDQTEMMAoG -A1UEBwwDU0ZPMQswCQYDVQQKDAJNQzENMAsGA1UECwwEcm9vdDETMBEGA1UEAwwK -cGFydG5lcmFjYTEmMCQGCSqGSIb3DQEJARYXcGFydG5lcmFjYUBwYXJ0bmVyYS5j -b20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDccGhUDD8T8m6e2x13 -B0LgCDR8F2vlfAw9FN/tXOKKU3DpagJk0CAutL6YFFYs9MXg8D6bZx+w0iXUnaN/ -6rjIC1LFs79AizpEaoFWDzcVI66ItSW1Swu3ts0I1kK7EGgAMba0TDTnssfrtuPw -rOA2TOdVX03owOE+gaaPonIQlnew5+NNGhbW+P/5ix1IQXhyuNjV/uu3VEJBGNTh -cAuMGdjvglFuz4zyFon4kNRcQvghs5ztjs2h5ZNHjEo6YtNIdJuRS/XOXII9MfPN -plcwJArWTM3yEATNBtdc5FypOSI6cO/Pl+SVEf4kKmnzJQZWOSGiDXbpm938hGVw -ByZPAgMBAAGjZjBkMB0GA1UdDgQWBBQhpkZg+Ktqh6sFCjtm9HE+9bLJ3TAfBgNV -HSMEGDAWgBTdAXu8aBbvkvxYD5Ss9/Ml5VgohjASBgNVHRMBAf8ECDAGAQH/AgEA -MA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOCAQEAIggdc0DCxEiNaKak -/xbc7uGiGBb+UzBTjk4BmX9kEFrZf4XEaHzsptltqcQDCVtzcbFFFxMYhv/w/1g/ -WMNuUhL0mmGIGMxfoqkg50tNyuHW6aSrBXErel9WthGXAhUSzdHgkWxl3pe2wgda -qIcSwTCFgOeVWTZRdKWqKNPHirBglJHUpMgLo0qa0Ug1hxiyOQRt2yXLpe/mH3pG -cozhrEDYQMOcDhYTpPwM2Bl+TsRPpxFaV4QDfiOyvUDFLMM0dyhl2pukjay/Xpp2 -+6Tsnaa+Ui0sDcM3A36Q07+E4Vugxjzfb9a36Eg4XE+Jg3jDA8UOqjeFg9gkK3aY -NaI0qQ== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIID6jCCAtKgAwIBAgIUYdazVD+VnI7jBu7xLaW+npfwHJIwDQYJKoZIhvcNAQEL -BQAwfDELMAkGA1UEBhMCVVMxCzAJBgNVBAgMAkNBMQwwCgYDVQQHDANTRk8xCzAJ -BgNVBAoMAk1DMQ0wCwYDVQQLDARyb290MRUwEwYDVQQDDAxyb290Y2EuYWRtaW4x -HzAdBgkqhkiG9w0BCQEWEHJvb3RjYUBhZG1pbi5jb20wIBcNMjEwNzA5MTkxMTU0 -WhgPMjEyMTA2MTUxOTExNTRaMHgxCzAJBgNVBAYTAlVTMQswCQYDVQQIDAJDQTEM -MAoGA1UEBwwDU0ZPMQswCQYDVQQKDAJNQzENMAsGA1UECwwEcm9vdDEQMA4GA1UE -AwwHaW50ZXJjYTEgMB4GCSqGSIb3DQEJARYRaW50ZXJjYUBhZG1pbi5jb20wggEi -MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDZ8QgVwEjy3CgJFvET7tYNBw97 -4i33EHQT4ZuayGCJ+ADY3ZFpsw2M1IPlbAguqfBkcLd8TAjWNRAdsm9ubGlIcTZr -7LNle3gvc7qEP4qg0i6M7D06CDqtBaIJ1PMTJchOouGU9ntBe+h0qg8tzpiqJdIw -jIOPRWW98Hw9KgF6++2jtlcOW1IxiFSWqf0Mpc81qKukcxnsHjvdxmBp/Z1vL42E -m5xNOGXoxpjq8NygSuVDhQ/bZUnmHLmvv9MXe9Ob52rlzea/YafLpOeNGSA1aCxm -Fx0lcoXWp4xpoyJn9St7vmH3t7quBKdqt54zwcuHjhgZPSR6RikodKHtsl8TAgMB -AAGjZjBkMB0GA1UdDgQWBBTdAXu8aBbvkvxYD5Ss9/Ml5VgohjAfBgNVHSMEGDAW -gBSMsBNO3UGBteMZOTq5fDPG2aPx8DASBgNVHRMBAf8ECDAGAQH/AgEBMA4GA1Ud -DwEB/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOCAQEA0hJCtrCI9Mf47+y3pvsTjiaT -TZwpNE0cdxHjpcCHJWX2jmGbqqA6wvQ7yy4PFarmnFOoW3hQFeiLgpz9X86YTRzF -8dj3Q2MKXf6i6/iW+Y96GFqurshKp7wV25wfzWwLXcVCiM1xYPWYSyGsZAGotu4M -c7uolVABjJu5nci9mBxVmaYV5oT1mxrvq3dCPm2AvmVFNWPNRbMSAuT5B7FUDvWG -xvd1aDFduqL0iLAcrTifMIYI3XL4pBSIlL78dgY45WL6616EF3mHhW/Y4k4PNq1I -Fz08Q3y99ilhzeAci1jv6KBVHiALZNFFtYjd10KX95qnF9SomBjCTPsQ9PTC5g== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIID2zCCAsOgAwIBAgIUdxRGMrv1ONRI/dJXUHa3isjVXuwwDQYJKoZIhvcNAQEL -BQAwfDELMAkGA1UEBhMCVVMxCzAJBgNVBAgMAkNBMQwwCgYDVQQHDANTRk8xCzAJ -BgNVBAoMAk1DMQ0wCwYDVQQLDARyb290MRUwEwYDVQQDDAxyb290Y2EuYWRtaW4x -HzAdBgkqhkiG9w0BCQEWEHJvb3RjYUBhZG1pbi5jb20wIBcNMjEwNzA5MTkxMTU0 -WhgPMjEyMTA2MTUxOTExNTRaMHwxCzAJBgNVBAYTAlVTMQswCQYDVQQIDAJDQTEM -MAoGA1UEBwwDU0ZPMQswCQYDVQQKDAJNQzENMAsGA1UECwwEcm9vdDEVMBMGA1UE -AwwMcm9vdGNhLmFkbWluMR8wHQYJKoZIhvcNAQkBFhByb290Y2FAYWRtaW4uY29t -MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2Bqlx+ngRZfWjktX6urJ -Tpg2//n3uMW8Gp55SVq+lbpkNXuA3W0uTlom/2fsnzmMmBAJUvv/NaLcFSN++0/d -fYGVhogxjlRoyaXa4sdFPg2ocM+lCHLGhWpYuVdTWPknikTOVNbh9z94SLRfrP8N -kuxGNZNktnVm+QJmrCLmjvnPvQlcP/WqFYehFM26NaRzswOhLLRU1YK8aVlh9Vto -PGSTPtZK60XwTfyCj/zEvHqpbGbKJPp7W0rpxl7ehPQIzGQt5IMH3zKrqLm4/pt+ -XFEVqy724sstthS73bvXguWxBLOzuMze8CbI6SJpcHaH8HO5pfFMPyE5N5l2x9Co -uQIDAQABo1MwUTAdBgNVHQ4EFgQUjLATTt1BgbXjGTk6uXwzxtmj8fAwHwYDVR0j -BBgwFoAUjLATTt1BgbXjGTk6uXwzxtmj8fAwDwYDVR0TAQH/BAUwAwEB/zANBgkq -hkiG9w0BAQsFAAOCAQEAL9/7YtxIbuTt7dgH1KOMb/y6P3Qb79fTVZTx073E2ZBj -OfSuMGUhKC30LWQXCQEsY4WpugJ4cS0NsArSYsO5XWguqgjYlWL6poOmYhGvj7ou -oi44oYqcPm6EbvLrAKdI67bkbSPLzgs+6TrxTyXHzPKFBqGBnuHaFKjgb4hGiPmd -JWKrh3fbTtuLjqSHd0Gey2uBNFql4LhPutdsCUhSOD3BibAeTbXyln70AgpTCoWT -9Qr9Ux6HYIiAHSDBzzuN8EcrlnAm9RO4zRyUVwxDsHoNsOUwybn50IM66p83HuiY -h/iX5uNjaFAADfRR4rQOwb6MLreVH2XYUSiz4M/ijg== ------END CERTIFICATE----- diff --git a/acceptance-tests/tests/src/test/resources/pki-certs/node1/truststore.jks b/acceptance-tests/tests/src/test/resources/pki-certs/node1/truststore.jks deleted file mode 100644 index d707235c76a31f1e2287e068289c8af1be79d11a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3135 zcmc(hcTiJ%7ROU40TNoME?rJsVDgD9ALy9!v0SbWx0qO972P{fW#E1<91(DuW z1Pw*OLiJ%p0b>+UdPf2Vfk)eb@?>3S+@0MS|G4wJ=X`%N_ssYH&gXa5rq`xHAP|K0 zKsQ&28x8~lhm&uiO+oDTC=8&-9$(-$obNdEOTF0csyCsA)xM7jC- z05YP8eP}=(&_rvZ(HK<+F}{6hRzeMp`JDK{^~HeYwi^a!2SH=Nd>|kO%ngYFgF*Bi z`7PspMya%_KbO_= zIwq$_cxTkIMejeNQxZt%BpZ(>`ELeVjC2r1{_Xj&z~*=_`x-lI`=!4p{`Aa-*1w<| zhP~rlwvM zcl0=jzobJmnKWXUt;C#LX}lj^?Ct)C{GSnyCgaV=-o`OuPw^^4v7GPrl@`@hucb#h zSqhh;J`S|0P=xOF-g^}@e4DMZvij*;hGOfuoTq;Xkr7mrKWnNhtEqk^q~&>04Fn1X zfpe_^OV*Eu+Dh`WiLeQg%aP{2`q6g>#Wl5RBKJ4H&Yfid(i`$lHZeft)VDYAZEQe- z!Ru`70F$wtqzw7&Y1?l(kV%qN9_mB zGJf83*o^Uds*4COTFgQ-S}o*0gVYYV-bb{a^u z_8<3x;GfH&?$oCV9Z_aB^)YnPk4u+#D0E%RJvmX`%45}3`9SZC)=ys1NBGo*citr3 zRk(YIr;0*_(G2eKdw|fCJEp3m6)lsLK}K1hn(3&mv)S0gex2xob2)+hmqW`(2hDbf z&=%L1&PZbQ!vd@6FV`lkYz*|py88Wj$l~;w7)#%F@|?)&#q(WG28*(l8PiGB?BPp4 zlTEZ-JF&s(7Y@xobBfVMf1noF0rK25Q|cT)8Afp)1b9~9y0r*pEjOX${w&M-1!JaAQd7kNPW?F!JF_lmGYR=p@=B> z2#7y5n)0ifWpI9pQfEtIxl8heuDn*BT$8IWuo$9Pg(jO%w?bR~%!qWjaUi+BOpmVD zkijd0%v*ue#iPs{EeZu3?BbwNJ1gq+nv@$ z9U67M^Fds{V^;IQcYd_0F|3A@#p&3v251v+iF$l2U4BnU8YV}zcoPd-ZTD#^*iZSw zg!e2aOt6^H@tFxYTBVI{N=DKk$NO28{QAsPhQ!6MZ2iHv?)RsHAIGfk(ctwgO!y&o zu1ASWWET0JhT!Cj7*JW@4@UN^WRrACL;I<~jYzA0zZ5#)3=uRGy`k zD0Bei*mFjNI!2`SZgBYWbS}k?*U<`1vbkKm3eRuH6qV)$iBCx#=xuiKT)pPE_iS8x zhM5LotT}Ch(UWB|Y#7hiP55O*qUP3vPSJ?Y^ii*2>c|6JVO!qlS#cSRhqAkIp^|H>y#k zAY^EX^R^A|d_wcWZyxBQwK+^uxx@{P>p%jmH*hgeh?HEv62hS|?E2^Au{hD+iSd5) z0dqdJ8(2~8gNBiHA9vxXeG+HvXU4K@rDS;UFO2SzdS4l&E?g}X?J7zWdu+PQ&tyIx ad19|6ani4`UFgV#Hu}TctF4B1qW=V(G>y^# diff --git a/acceptance-tests/tests/src/test/resources/pki-certs/node2/crl.pem b/acceptance-tests/tests/src/test/resources/pki-certs/node2/crl.pem deleted file mode 100644 index 8ced006c9..000000000 --- a/acceptance-tests/tests/src/test/resources/pki-certs/node2/crl.pem +++ /dev/null @@ -1,27 +0,0 @@ ------BEGIN X509 CRL----- -MIICBDCB7QIBATANBgkqhkiG9w0BAQsFADCBgTELMAkGA1UEBhMCVVMxCzAJBgNV -BAgMAkNBMQwwCgYDVQQHDANTRk8xCzAJBgNVBAoMAk1DMQ0wCwYDVQQLDARyb290 -MRMwEQYDVQQDDApwYXJ0bmVyYWNhMSYwJAYJKoZIhvcNAQkBFhdwYXJ0bmVyYWNh -QHBhcnRuZXJhLmNvbRcNMjEwNzA5MTkxMjM1WhcNMjIwNzA5MTkxMjM1WjAnMCUC -FF9rJlU9U6JdFIeK/xRojaoxHdc5Fw0yMTA3MDkxOTEyMzVaoA4wDDAKBgNVHRQE -AwIBADANBgkqhkiG9w0BAQsFAAOCAQEAfByR//FGHSsVQbaS51d59o82XocOGnnT -p1hjceqtLGv3bhiebVrsRCOB5TsvE/r2IbB/yHYTe3+LJisIUqBxblQ6xK6IM+qA -3fY646YnPT5pvdZAPZ2BCN/xP3xqGffFKapQ9cz0/36YE3vaEoUDlC2VHK0OXI0t -4CLwAmiptUT2GW4Bk1RtokAsFiUNwNIOlRX5bywUNwkG7EuitR90QSGH3l/vyii2 -0c1Fm9He9MskwipjXpJKKb+t+m1pdpOVkSjRfjmVqi4BZwWlnQjELSLywhJ+WZG2 -Z1NgRjzPXotFKK+YD97Kx1L260A1eUZ46zSq73oUZr0EDZRnNJTr6A== ------END X509 CRL----- ------BEGIN X509 CRL----- -MIICLDCCARQCAQEwDQYJKoZIhvcNAQELBQAwgYExCzAJBgNVBAYTAlVTMQswCQYD -VQQIDAJDQTEMMAoGA1UEBwwDU0ZPMQswCQYDVQQKDAJNQzENMAsGA1UECwwEcm9v -dDETMBEGA1UEAwwKcGFydG5lcmJjYTEmMCQGCSqGSIb3DQEJARYXcGFydG5lcmJj -YUBwYXJ0bmVyYi5jb20XDTIxMDcwOTE5MTIzNVoXDTIyMDcwOTE5MTIzNVowTjAl -AhQTZhDgbKuvX7iLRUBBTiWXBPKM1xcNMjEwNzA5MTkxMjM1WjAlAhRfayZVPVOi -XRSHiv8UaI2qMR3XORcNMjEwNzA5MTkxMjM1WqAOMAwwCgYDVR0UBAMCAQEwDQYJ -KoZIhvcNAQELBQADggEBAMIltmJ036f1BmK/baISJTZTu7PKZgSZMNORnpFT8KvC -s2GNRor5bGp5qvD6LHvsx92YVppCC6xd/beCFBtdyYifqw5xtOvqLQKuqCfxruLz -EqYjKXE/3v8VdyU71J7kFqi0U0Gy4/h/YCL92e5KNbATlmcn5ToyI2EBIEfBfV08 -mm7FBXvbHRzqhfrnCNEjBWBWz3zkJMc9Rib26eCCofYIDkY2HvYSN78YgrnMmD6O -hWOXrPoxArxvmDr5rG4vCadqbQYRkkCAOP0hBeMiB0SAcO2W2LNNAmHWXX7FvU3n -ZRZUX31WoVjhNeEQtNBb2mPYBXHQzLC66qYm1p97afc= ------END X509 CRL----- diff --git a/acceptance-tests/tests/src/test/resources/pki-certs/node2/keys.p12 b/acceptance-tests/tests/src/test/resources/pki-certs/node2/keys.p12 deleted file mode 100644 index 5b3aa85caa4c2318b88d436a057fe6c1028b7a40..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6008 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 diff --git a/acceptance-tests/tests/src/test/resources/pki-certs/node2/keystore.jks b/acceptance-tests/tests/src/test/resources/pki-certs/node2/keystore.jks deleted file mode 100644 index 90b5e93ec75351ca331567a3c7015202667cbbdc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6749 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 diff --git a/acceptance-tests/tests/src/test/resources/pki-certs/node2/nss.cfg b/acceptance-tests/tests/src/test/resources/pki-certs/node2/nss.cfg deleted file mode 100644 index a0db3bdc9..000000000 --- a/acceptance-tests/tests/src/test/resources/pki-certs/node2/nss.cfg +++ /dev/null @@ -1,6 +0,0 @@ - -name = NSScrypto-node2 -nssSecmodDirectory = ./src/test/resources/pki-certs/node2/nssdb -nssDbMode = readOnly -nssModule = keystore - diff --git a/acceptance-tests/tests/src/test/resources/pki-certs/node2/nssdb/cert8.db b/acceptance-tests/tests/src/test/resources/pki-certs/node2/nssdb/cert8.db deleted file mode 100644 index 10555edf0d7d8ccb38cf07295888fdf5e61db5d9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 65536 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 BkJ|tM diff --git a/acceptance-tests/tests/src/test/resources/pki-certs/node2/nssdb/secmod.db b/acceptance-tests/tests/src/test/resources/pki-certs/node2/nssdb/secmod.db deleted file mode 100644 index ebbf2f030645a70640c155267e97f878374109ac..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16384 zcmeI&ze)o!9Ki9PRcZ&RE^Z45$G#X7ao5V@hw6QklO`E2= z=c&*n*==I_(aiTeH8l4>gVcoMSo>btHuC8HC>W%^noe|(nIg5f9JE*RlmVUJ*~+QN z<@?@p7Y~iSG-;SblPrpDzEb|ff7)O8?g^)^{weF8{kfnZfB*srAb}P;PF&&gpl~?{`jre9!ZJp3ig6^F8n9dA+{R$H|YA5C{ay zdSGiU)X^RS0YVdQ8JR%Xtg(1dl~s8OM#6f*Na!D#Fem_p3Iq%2Dc+q^d91(OX=NHj zjcjY+O0v&dYUZ zaRs0KLU2p?q6z)ih?H0oF42PUAouw|i>?N$z^5aZ)2}(k-MY%k+$9 zpR*~vA1+u)7vw9!&z($f8!&_WNFKesLrZ4JhnkM~70I3GGG3`KFgR4gv2s{BX} zKWZjejD0`QrcfbpmwxwYp#$yqBsq1Adx%+GUwM(^Y%_+3$|3 zjGLhIW;q3hf|D>8AnzDcSPc#FRX~*>IvxI~I!3@2arUG*EaXMyIq=;|s>WtxRkGqK z8eY*}vu_~z`fnbXEczc)#bG=Evfp*SwM*SPm= zVoqGJ)|IxC5xZ@2`zuYVpL%fVA5u|o_^m|3sC+gxoB>6cBVsPjA(qW0;_OIg#HAWK z_MV&mWoN37>>Q?&CYEf4)F}x?l?;Oqs^%X>sf}OVBQcsD_aSX$(2-yYK{3n*?(j6! zC19y3lFmJ5a%KG;1Bq+obGUg0IQy;RZ{qv~|FXwAh8OV*SB*eINgjb?y95dg29nKIv&aJe(9LvC&L?pF`cCrthKuY=%?tp8o6$ zIWD0Y%-e1h2bwsbz~l|Uydr0`+Wqzc(nCM*R)$J=95w90i7lLV@}Y(qa(3f+#cz9i zdARBODxaJvb0&uD@~@88jL+=ECQPWSajM;5%jSCg4kOcQoc${KJyDA|8c>8*XiqPa z=>!v^l60MGr^D2D0HKSM*D9=dY!Bf`7O92H$lMNmL2-`%rU{9?^kzG^<;&i?&P9_c zMk>yu&FSOQFER~=bz;!H&Id-ss&3VH2@|`>uib}fBlY(AZ8@*cZIZ$h#!N)2ssi6WcSw}$F%mkY?6ynO=m34IsPX#@InfLKEi zn!2!LjZVJKd?zz(Ef@QJ^!fimpA%$fp$`Rswfz!Duj&BK`j^Fib!^vc(8;e|Q9@$0 ze3+V`<}G3pWiJ|0w(m9)3+5Zly%#6r{65j1T$HKS$k^M4MGF>f=3<+f zfdt&K>TCw7MC^vjRWO#5?)M=_fRtRf6vVDF?6C0Wc(m}TxESxA0b{iC4SiwtpLN1& z-*304^^2Xgo*K=xl#t?f`b)Q*M1QKC#>~hUeq4|)(rCEI%V0E)tl0qJWA7K>J14SI}-*|^2%Z%?TGK$TUisr8EJ%$9*ah6DrbglaY>=4cFsU)v=2UV zghti!&*-aNp(Kr}`!^}Q10Irhw?(!!9hJ`@)JC)qnpB8skkItg?c#$Kl?aUp;fP%7 zsc?TsfJR>K|K@y9Xc}5 z5t|r+htH-mjLGhOB;jgFC8lHoVuI?{)T>@qngcX5-VG`F?q94V-ruvcjeLoG`WA0> zsrkJ#_Yb4uyMpZs*~qf557GGdrKj?j;Y@2Pj(tlDr`)9jDX3p06ohGaJo00RCN1&o z|I)%Yz44z~fc!UFxNYz8Q$WfShSa!DUEtZK>x$=8C|zt%tkbRS2C*EI+~L7+v9k9^ zRis5BmXbKF1uoZe2#5BcuG6Mru4yxdA?IJMybko2ZJZ}8H$JlMsOl&soK_F&jS6y@ z?$bD#w_90gpQyR(6MdwlWVFG4(s5&|kk-YnqlVA&6vFHGvG>z6Z`a!~DM6zd4HvAFEClD-e94Ip0-yZN1j+|W($#l$4g@!cEpaI zj=H)mm)}ti kwVH=SglZ2XPE{h7S2mT`vHgYK;sQ6`12Zgv$2T@~ diff --git a/acceptance-tests/tests/src/test/resources/pki-certs/non-validator/crl.pem b/acceptance-tests/tests/src/test/resources/pki-certs/non-validator/crl.pem deleted file mode 100644 index 8ced006c9..000000000 --- a/acceptance-tests/tests/src/test/resources/pki-certs/non-validator/crl.pem +++ /dev/null @@ -1,27 +0,0 @@ ------BEGIN X509 CRL----- -MIICBDCB7QIBATANBgkqhkiG9w0BAQsFADCBgTELMAkGA1UEBhMCVVMxCzAJBgNV -BAgMAkNBMQwwCgYDVQQHDANTRk8xCzAJBgNVBAoMAk1DMQ0wCwYDVQQLDARyb290 -MRMwEQYDVQQDDApwYXJ0bmVyYWNhMSYwJAYJKoZIhvcNAQkBFhdwYXJ0bmVyYWNh -QHBhcnRuZXJhLmNvbRcNMjEwNzA5MTkxMjM1WhcNMjIwNzA5MTkxMjM1WjAnMCUC -FF9rJlU9U6JdFIeK/xRojaoxHdc5Fw0yMTA3MDkxOTEyMzVaoA4wDDAKBgNVHRQE -AwIBADANBgkqhkiG9w0BAQsFAAOCAQEAfByR//FGHSsVQbaS51d59o82XocOGnnT -p1hjceqtLGv3bhiebVrsRCOB5TsvE/r2IbB/yHYTe3+LJisIUqBxblQ6xK6IM+qA -3fY646YnPT5pvdZAPZ2BCN/xP3xqGffFKapQ9cz0/36YE3vaEoUDlC2VHK0OXI0t -4CLwAmiptUT2GW4Bk1RtokAsFiUNwNIOlRX5bywUNwkG7EuitR90QSGH3l/vyii2 -0c1Fm9He9MskwipjXpJKKb+t+m1pdpOVkSjRfjmVqi4BZwWlnQjELSLywhJ+WZG2 -Z1NgRjzPXotFKK+YD97Kx1L260A1eUZ46zSq73oUZr0EDZRnNJTr6A== ------END X509 CRL----- ------BEGIN X509 CRL----- -MIICLDCCARQCAQEwDQYJKoZIhvcNAQELBQAwgYExCzAJBgNVBAYTAlVTMQswCQYD -VQQIDAJDQTEMMAoGA1UEBwwDU0ZPMQswCQYDVQQKDAJNQzENMAsGA1UECwwEcm9v -dDETMBEGA1UEAwwKcGFydG5lcmJjYTEmMCQGCSqGSIb3DQEJARYXcGFydG5lcmJj -YUBwYXJ0bmVyYi5jb20XDTIxMDcwOTE5MTIzNVoXDTIyMDcwOTE5MTIzNVowTjAl -AhQTZhDgbKuvX7iLRUBBTiWXBPKM1xcNMjEwNzA5MTkxMjM1WjAlAhRfayZVPVOi -XRSHiv8UaI2qMR3XORcNMjEwNzA5MTkxMjM1WqAOMAwwCgYDVR0UBAMCAQEwDQYJ -KoZIhvcNAQELBQADggEBAMIltmJ036f1BmK/baISJTZTu7PKZgSZMNORnpFT8KvC -s2GNRor5bGp5qvD6LHvsx92YVppCC6xd/beCFBtdyYifqw5xtOvqLQKuqCfxruLz -EqYjKXE/3v8VdyU71J7kFqi0U0Gy4/h/YCL92e5KNbATlmcn5ToyI2EBIEfBfV08 -mm7FBXvbHRzqhfrnCNEjBWBWz3zkJMc9Rib26eCCofYIDkY2HvYSN78YgrnMmD6O -hWOXrPoxArxvmDr5rG4vCadqbQYRkkCAOP0hBeMiB0SAcO2W2LNNAmHWXX7FvU3n -ZRZUX31WoVjhNeEQtNBb2mPYBXHQzLC66qYm1p97afc= ------END X509 CRL----- diff --git a/acceptance-tests/tests/src/test/resources/pki-certs/non-validator/keys.p12 b/acceptance-tests/tests/src/test/resources/pki-certs/non-validator/keys.p12 deleted file mode 100644 index 30115f1a0dbef1486dbad765b6140e423d331f59..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6056 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 diff --git a/acceptance-tests/tests/src/test/resources/pki-certs/non-validator/keystore.jks b/acceptance-tests/tests/src/test/resources/pki-certs/non-validator/keystore.jks deleted file mode 100644 index 310fbb591cae578e711de9c0f237e9477d3b2f07..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6805 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 F{syT2m diff --git a/acceptance-tests/tests/src/test/resources/pki-certs/non-validator/nssdb/secmod.db b/acceptance-tests/tests/src/test/resources/pki-certs/non-validator/nssdb/secmod.db deleted file mode 100644 index 1320aa6f1c3153aaeecbb09c1958d0207995b3a3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16384 zcmeI&ze>YE9Ki9PRcZ&RE^Z z(ASW9Nh(?t$5Q0`gX8Xg_sjkH%#rG0AR-l!ofnYW4e_ns8&+D6VBkq9!0tg_000IagfB*srAb`N{0##A6SosIM;|fF9%H+{i zx2rBprV|sy>bleJs*_erUD|LOYghH$w`LFx!zl5+us1$yG@5!gu}Ri6)|}o3aTErb zO`0Z6!=9)5I?1jRJ&0z$=c$pt`KenOom3l>g_0@FZ_Rz%<-g44j*{3Y% zeBZ51MQ*>(Pj2i;n{%D^lW3Af*5oVYfB28P3*SBE*tH+=*Yn>O1Of;kfB*srAb-_HV8%Aqu0328({Fl=t?UoaJhEhq2gP87>^ulp8OuzXXd#MZ-z!nJ zqQ%;yNug;9W#46Jgon68d2+j*)4k{3bNb_VzQ51s{XOURIq%>1^ZI_)X4YmvAP|K0 zKsQ&2D;@*_hf{8fCxO`P&{#l&rMv}*&>nyYY0QE`zz~RFsG!lly9?^wxR0H-heE0o z+Fl%;29WHWyW?^3i%2k-n+*g+Vz>cLcBl=E9R;zm+6v$Zh=Cpk0dQ?790;hDk@=Ry zg@BkEV2}X!hQy741^W2~V}t-g>5Gv9B>wsuCs>&8lc>8XqFw!b z0BI5AJ`A7+Xkauj7_5rDDDOTDE1`7X%Q&To57{45IJI zZ=L8jOr<3rw4I!MY?h|FzPwn|d~ZkQiC^s-QtI5W5vTfm&}Q}u>&K?AX;9MmI4xJ! zu{pg$JEK<2`~DG~5>Lh?T6;Xse?8c0sEsW0@5qM-w#0ea)!JIwE&n~?=cm@RfkmA# z+-;|_b>xLT6&bD zg-|K_!(h8|mEhgJyDy0&w_uf(HBa6!6xt?aJ^e#SjG)^5ITIZj4YkW5tTAy6;~ zoNEPGuzobuMuG<>3=^c3qs;pBqVEieX=v6){?zg+ca8x_ZOA)eqJZ$JZ*Sn;*nk3q z*I{e`l(lTPopnxGwu3=?->$gy;(Ui^X6PK zR4=prc(jUret(U5-AivyoTa+f!_(!Grg!EqMKK{tE;GRn*Lor4-ls6wu#DEMe9`65TmSL)nv@Z$#nd|fOd32QcfV>rO@)RA=4eg zw59dsGZHwxu)rGni?yk0YkfV@?g4*piWq&CXyMyInHN62bgtV`e@Uh?VgAAES?^}%}_;V=fexfxj342iRE*fPg`pr%Hl%g9|X$r569y;oZc7EL ztVcoKx^VBifgDlcH7md>(F}a~q#K|8tCMj}9+A@puY8J|pqvgt0k;fAP@?hcjCDI5 zyGCD20p=AvS@elhPOC$x@ zGkAnid8-JzSd>|lc_F{OZ7eiuXGOhkvr?lbO`-;kNg5Wn!1tv~qI{r*(&*S z@|^%BCdrUc&xq984Gv$K$*r>Gaj?XYtuGaSMC5m1i%Ro?#HJ zhN(JXyd`at(VJyFVi3pML-=)6y!Ph(E|G|?^f9jy>gauZVSC=#Suts>hmyO9gnVEe zt&rlGD|>8VPecQLvAXUCtkA1E^QVXHq(o6MExB-`U5dfkGZjv#Z_(hJ&Hmkq;NNKg z{!eJoDWG3fPG+_)%}!Srte_GVE}CZSQZW?|ym^kkXyD3qWG!cE>C$pixTyV&8*Rpg_k?;fq^RE9N1FA? z)Bxv&w1YBbZs4M-cZi_7MJb2Cl=RxGZS`s5HkS*8Mq?M!cg&WC>TCO)Y9JV5U8#nZ z0+8Wlj$76|3-K+Bzk6Vg)a5YA<>J@XuL1G!zQCnCL2`1#Y6!dfh|8Z-M`J}!kmCI4 zgJ!&{*Ks0R2Mi+XKkUL&`^C@L&5mc;NJ?|NJvY2V?t7`9x_G5fq`N3h^pVL5ACviL abX6T8^ZrCv>DcurR5h5SPtc1v_J0EFZ;aOf diff --git a/acceptance-tests/tests/src/test/resources/pki-certs/nonValidator/crl.pem b/acceptance-tests/tests/src/test/resources/pki-certs/nonValidator/crl.pem deleted file mode 100644 index 8ced006c9..000000000 --- a/acceptance-tests/tests/src/test/resources/pki-certs/nonValidator/crl.pem +++ /dev/null @@ -1,27 +0,0 @@ ------BEGIN X509 CRL----- -MIICBDCB7QIBATANBgkqhkiG9w0BAQsFADCBgTELMAkGA1UEBhMCVVMxCzAJBgNV -BAgMAkNBMQwwCgYDVQQHDANTRk8xCzAJBgNVBAoMAk1DMQ0wCwYDVQQLDARyb290 -MRMwEQYDVQQDDApwYXJ0bmVyYWNhMSYwJAYJKoZIhvcNAQkBFhdwYXJ0bmVyYWNh -QHBhcnRuZXJhLmNvbRcNMjEwNzA5MTkxMjM1WhcNMjIwNzA5MTkxMjM1WjAnMCUC -FF9rJlU9U6JdFIeK/xRojaoxHdc5Fw0yMTA3MDkxOTEyMzVaoA4wDDAKBgNVHRQE -AwIBADANBgkqhkiG9w0BAQsFAAOCAQEAfByR//FGHSsVQbaS51d59o82XocOGnnT -p1hjceqtLGv3bhiebVrsRCOB5TsvE/r2IbB/yHYTe3+LJisIUqBxblQ6xK6IM+qA -3fY646YnPT5pvdZAPZ2BCN/xP3xqGffFKapQ9cz0/36YE3vaEoUDlC2VHK0OXI0t -4CLwAmiptUT2GW4Bk1RtokAsFiUNwNIOlRX5bywUNwkG7EuitR90QSGH3l/vyii2 -0c1Fm9He9MskwipjXpJKKb+t+m1pdpOVkSjRfjmVqi4BZwWlnQjELSLywhJ+WZG2 -Z1NgRjzPXotFKK+YD97Kx1L260A1eUZ46zSq73oUZr0EDZRnNJTr6A== ------END X509 CRL----- ------BEGIN X509 CRL----- -MIICLDCCARQCAQEwDQYJKoZIhvcNAQELBQAwgYExCzAJBgNVBAYTAlVTMQswCQYD -VQQIDAJDQTEMMAoGA1UEBwwDU0ZPMQswCQYDVQQKDAJNQzENMAsGA1UECwwEcm9v -dDETMBEGA1UEAwwKcGFydG5lcmJjYTEmMCQGCSqGSIb3DQEJARYXcGFydG5lcmJj -YUBwYXJ0bmVyYi5jb20XDTIxMDcwOTE5MTIzNVoXDTIyMDcwOTE5MTIzNVowTjAl -AhQTZhDgbKuvX7iLRUBBTiWXBPKM1xcNMjEwNzA5MTkxMjM1WjAlAhRfayZVPVOi -XRSHiv8UaI2qMR3XORcNMjEwNzA5MTkxMjM1WqAOMAwwCgYDVR0UBAMCAQEwDQYJ -KoZIhvcNAQELBQADggEBAMIltmJ036f1BmK/baISJTZTu7PKZgSZMNORnpFT8KvC -s2GNRor5bGp5qvD6LHvsx92YVppCC6xd/beCFBtdyYifqw5xtOvqLQKuqCfxruLz -EqYjKXE/3v8VdyU71J7kFqi0U0Gy4/h/YCL92e5KNbATlmcn5ToyI2EBIEfBfV08 -mm7FBXvbHRzqhfrnCNEjBWBWz3zkJMc9Rib26eCCofYIDkY2HvYSN78YgrnMmD6O -hWOXrPoxArxvmDr5rG4vCadqbQYRkkCAOP0hBeMiB0SAcO2W2LNNAmHWXX7FvU3n -ZRZUX31WoVjhNeEQtNBb2mPYBXHQzLC66qYm1p97afc= ------END X509 CRL----- diff --git a/acceptance-tests/tests/src/test/resources/pki-certs/nonValidator/keys.p12 b/acceptance-tests/tests/src/test/resources/pki-certs/nonValidator/keys.p12 deleted file mode 100644 index 0f5879ff1c0eca2567f5f417547e3778cd2add23..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6046 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�Buv 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 HtH8eiS_q!X diff --git a/acceptance-tests/tests/src/test/resources/pki-certs/nonValidator/nssdb/secmod.db b/acceptance-tests/tests/src/test/resources/pki-certs/nonValidator/nssdb/secmod.db deleted file mode 100644 index 1d70f9b3a97264b7b49982a0dd894a43314ed59d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16384 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 diff --git a/acceptance-tests/tests/src/test/resources/pki-certs/validator/crl.pem b/acceptance-tests/tests/src/test/resources/pki-certs/validator/crl.pem deleted file mode 100644 index 8ced006c9..000000000 --- a/acceptance-tests/tests/src/test/resources/pki-certs/validator/crl.pem +++ /dev/null @@ -1,27 +0,0 @@ ------BEGIN X509 CRL----- -MIICBDCB7QIBATANBgkqhkiG9w0BAQsFADCBgTELMAkGA1UEBhMCVVMxCzAJBgNV -BAgMAkNBMQwwCgYDVQQHDANTRk8xCzAJBgNVBAoMAk1DMQ0wCwYDVQQLDARyb290 -MRMwEQYDVQQDDApwYXJ0bmVyYWNhMSYwJAYJKoZIhvcNAQkBFhdwYXJ0bmVyYWNh -QHBhcnRuZXJhLmNvbRcNMjEwNzA5MTkxMjM1WhcNMjIwNzA5MTkxMjM1WjAnMCUC -FF9rJlU9U6JdFIeK/xRojaoxHdc5Fw0yMTA3MDkxOTEyMzVaoA4wDDAKBgNVHRQE -AwIBADANBgkqhkiG9w0BAQsFAAOCAQEAfByR//FGHSsVQbaS51d59o82XocOGnnT -p1hjceqtLGv3bhiebVrsRCOB5TsvE/r2IbB/yHYTe3+LJisIUqBxblQ6xK6IM+qA -3fY646YnPT5pvdZAPZ2BCN/xP3xqGffFKapQ9cz0/36YE3vaEoUDlC2VHK0OXI0t -4CLwAmiptUT2GW4Bk1RtokAsFiUNwNIOlRX5bywUNwkG7EuitR90QSGH3l/vyii2 -0c1Fm9He9MskwipjXpJKKb+t+m1pdpOVkSjRfjmVqi4BZwWlnQjELSLywhJ+WZG2 -Z1NgRjzPXotFKK+YD97Kx1L260A1eUZ46zSq73oUZr0EDZRnNJTr6A== ------END X509 CRL----- ------BEGIN X509 CRL----- -MIICLDCCARQCAQEwDQYJKoZIhvcNAQELBQAwgYExCzAJBgNVBAYTAlVTMQswCQYD -VQQIDAJDQTEMMAoGA1UEBwwDU0ZPMQswCQYDVQQKDAJNQzENMAsGA1UECwwEcm9v -dDETMBEGA1UEAwwKcGFydG5lcmJjYTEmMCQGCSqGSIb3DQEJARYXcGFydG5lcmJj -YUBwYXJ0bmVyYi5jb20XDTIxMDcwOTE5MTIzNVoXDTIyMDcwOTE5MTIzNVowTjAl -AhQTZhDgbKuvX7iLRUBBTiWXBPKM1xcNMjEwNzA5MTkxMjM1WjAlAhRfayZVPVOi -XRSHiv8UaI2qMR3XORcNMjEwNzA5MTkxMjM1WqAOMAwwCgYDVR0UBAMCAQEwDQYJ -KoZIhvcNAQELBQADggEBAMIltmJ036f1BmK/baISJTZTu7PKZgSZMNORnpFT8KvC -s2GNRor5bGp5qvD6LHvsx92YVppCC6xd/beCFBtdyYifqw5xtOvqLQKuqCfxruLz -EqYjKXE/3v8VdyU71J7kFqi0U0Gy4/h/YCL92e5KNbATlmcn5ToyI2EBIEfBfV08 -mm7FBXvbHRzqhfrnCNEjBWBWz3zkJMc9Rib26eCCofYIDkY2HvYSN78YgrnMmD6O -hWOXrPoxArxvmDr5rG4vCadqbQYRkkCAOP0hBeMiB0SAcO2W2LNNAmHWXX7FvU3n -ZRZUX31WoVjhNeEQtNBb2mPYBXHQzLC66qYm1p97afc= ------END X509 CRL----- diff --git a/acceptance-tests/tests/src/test/resources/pki-certs/validator/keys.p12 b/acceptance-tests/tests/src/test/resources/pki-certs/validator/keys.p12 deleted file mode 100644 index c3be57147fe26d8a513c90423b409425b7f9ed0e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6032 zcmY+IRZtuXlZA)D-G<=qKDZ1LBzW);90s>Q2=4AAxCIODIxs+R2*KUm9YS!2y|-$2 z|J{eKQ*};PKc4FPz`?|^Kmq0{o#tqb*;?NcUM!6#N5+8B zP!0hP+;MSB11VMVw&4`3{T0*)#%T=D+|JORFQBKFXd;-PNqsSPdJq=aT!AWhGCi#v zqky}eH})*s>|PuFn2Mai`O9giW(S#J_U&Y-ez}2*z5HN3FnlN4l-LSc0xFW~8N0~* zhjNicppXy!tC_A!9uO+nnyx5`dQGJhxqVYrhf1zvcuUVOlH{sDGf9j~b9UJLgXj(?Q z<|=3J+(wvLYALtqwju2H_bY|dCZ=3};(kJ>n6d#7`-4F3|iTSM9X6=&P7$j4FmUU-+OTZ{b7! zQZ*ZdybG}Us|=5OsdR-t_IuG}^BwZXzWd(F%K`ZuU>_glF%GFN178+1gJtJhf7?W=73up2p_lPV)xb8#mRSVKsV%TIN zK3jU5`6IVgZ<}W2>jy28(95M~i4ub4ohK!%G2Nyi6mbjPpqKTa8fZk7)x|&s!KOCK z9723CnLz_m`LGD)ti7wm*Q#HlKH{BaJsRU&gx#hxyq&SkJ)Us!R`2H7vZz4MenR;X z>_yr2bPWHhCyJPu>18EH! zRRyDxYl6EkW`P!(YWj8ftq3z-)fFf397=*iG0}jXSUH%Dfar+bVkNqP!N-Zlcj1wL z)GXm@Eh>x)Ya<~}BQGZzhGR10+REMm-`daSTk0Djq9e{x+paVVC>IVV`Y!>wMcn&C zhK_z&gL*=RZy}H9xWR^6WhcWzr3**iGo62l^W$kc9s(T4hB`IY z&6tZ8%q1l-t=XHRgfwWOom@Oz4$t(W3nL1J{I*`A>t_ zB0NsRf%3KfSecdCgQLggD!_sp+OVC}hx>C{MWQ*;)iz9TE6uz^`KXvbCYLC!5lmSd z;^dUXL8bhpDKMs=vk9E@PSd8t9dhQu13?VGr#F5b+hRwG*_v80eoqjKBzF7M;%`}6eEOoxD;Ne!u&(z7}XrA7rFU{e<(#qEL(Eq*{G z(U&-Oy`bDB5l+ybZXI`BE211;((kF&a1Z5R$B!_6F$%T(q#8i^M4_GjzBg&tF{%vf z4zFZVW&-|HUfmW-&aGtLPjdY?TKs)NKWqxCR6aPw#f8PS$e+6}`KXdjy5l-$2P$)4 z{-(4ZdPBbZO9o~uS|&V}jKBNTO7Zt0ZGBwej6EDUvgq^<)2Z~C+T1gl4mTI(7c?!K z>l1R`-S=dZBRx;0@f-qX=7(&0L2o!fRMTsG$VsUN{_0s7*Ja zimTwQ!=T7KVT!CO-4x3Lm6lnr5p@Ap&-#Ww)^{uM=H|)IuE{nIl1M{ym>wo(G6ng$ z2>j~5^Dy=4gN}=#^mY%)hSF4(YQZFhp-&d?vN0Yqb;em(RcfI|L6`?uz|iSzQy>lf zI|mNtL(gZ8KJtiq%_m?Hk^`qYx|@Uc@cB0sg#yq5*4YrvtYH~ST3^(AXTD}Gl*0#Kz{i{S) z^iC+@WK}95QD%hIecu`o8EJwxKXg^I8@1WgF5aX?^GeW%Qoa-Juu0PQs4Gcvpcd8n zGl`}{d?jOxULuL@z8tCwoET?1Zfo7Gb9Q$ip<(VFU+Hw>>OEqAGx zyy{$7F1E$>tEac$djqA`4NDp^GK+G>0#x?1=2K?D5v;6494|81m!d})BCvb7MNM@_ z8yRC!SNTtVseQMvjX$Ti;o-=7nXI{Aq1!%mMRsv^zLq>a8_?dsBHGJzE)SPWz2s2i5WR z_k$l9N@rkxd6pBFGVbklZ>zkImp*}_p_AXfQ7kYGnKJab8bKaMzTKLkdqj!B0;v)2 z8ba8x<|u@{>@qahxK8CC0>NHa1cvU-EgPk=Ns_9!q4Ut>8cH|&dk^)x6jrLYd{$$+ zN70kh$-xzN51-5|S3h89FJo^k`*nu@*`g1qPk|U%7~c`hOdUuSpvBD}BE+jN4qM9rjY(I&$WcFBr)!bTj z1+_$MW4tH%))LvTbJ>Gij7KA0QqWUOnmgJya);ieG(_nHuxI4BnL%_CtGXlcdiK$j zk?WF=gc0+C06Vd~ayb@v(EiinIjy&%wviB9fuj*~*rjhXc8Ud?n(JB$b>I@JVl(BB z6rsGBaUCb7?%|#I{C+7TEEnw!O|d=3(6bf+t-TGXiyvX*93ng%3K_ZKJ1~ZG4bY~E zT+(O|*?R3OI|uJFZ$e2vtrcw*FwX0h3ozIHWGy=sAfr#f^Ih{qrHn@AV5jk2I6#CiW5 zuX&>}-)^q_Y=8;*koY7=(yNU(D=+<9S?u1djuO(7DeEuA&GXE$wb!4IINoyuu^rh>psd(^rzpKhJwesUG_0U)az998|n@IbPG{>a> zM%b*?TtA)K#C_a(=fXt!WDNNR+XRUJjoV`3J0rkiztLyyhvvd4rk+Pw2nBpB*knDu znL3YzU)6vKTXjDm51jvZT|SHuId_xNOG?&w3kEv$4qH9>Ix{&--$&KnE zUcAi1QN=Qj9DVRFt9L08Txm2CwE6*8Q`F2(@`lCLFs39B2hcU;oA!MMSu_6|Ihs!EBjnUOuy{`G5hLxlKV!Uk?`xek*Y)>U3p*~ZaEgdJJkOC(n zg`!E>wv)5=&g$r_{{r&K-*YPyVma$QkQE2CL-z>qmS@x_wF*2o(O256%duLx2pP}M zBAgs)wlqF`RhNGODQvARCwt6L=s1qH=EK}s;e0s^rH)QJPl-a&Xx-!rgQL7(v{DJ` z+hXU3Rb?tKLbrXZ@iM15k_>vuW~S4YA|B?8LyW$ETA)<)=8Qb?584t5I{A5K*4B`c*}O*bcsRq2C*2nu6E$b6`N z*n9Yw?4<_16Aqi#&rK7u*0OTVYQf?&Ws2BI5By}LFlyo-NQ}0=WQkJD2y>&%cz?)) zAR5W`(?!UM?(7ZBTCUT}lZ$6`t|4E{_cL}x=K6~umP6z21uvBf70i-Qs?fVgI|lju z0ZT;Qq)+=>Il>rIMOqonlNj?f6Di9q7NeZG%D^3=O+mdq8beB(T3k>DX9OWwERy9H zm^a(n>*Pc*Cx=`70O&GxP9g|Fv}>g)orL(b&VJkf=Z!dTn1LAwOr%YSUr6T#r)%%4Iz)}FMs48P`XztGdD5~{*EMLiV%=6 zZg{^s;{`$Le=n0St!~qeT4Ft4cf^Vln&SeBuU9(<(ZwBod0p?Ql%SPX<0{Vek+W`1 zqxCai?t#)EJ{|HW^xi3wR=JUzJ1KsP2?BrR@dh2Vh2Ma)FUsK;_3+O;7w6a*S9d?U z5gOMfX3G*gh4Nf;)*F~xue)rYKc~5UCcB5yx#@_v_{ORNdWo2BHvS~ap|U_<5(<$O zb#zEY1|o8k%p2(HLRuk5RF0Db1+Zha6#30dFWo<(p@FL`{v~6W{Ai`FH&6HiCyG)9 z%k(42GgR7cm$@*TXFR`=9ONI@e*I?<&}wb!@4_S=1|FUIDViVt%C=JSePd;mOYF-X z?T;uW#0-dXywbR!hJr+p`jck~UyWcmmqrT}Hf@<$3z<(+6lfa4h}=5wZSUPhFJ$*u zQ0tP1$>&|F+$jhxA7K-x@+bjo#WUqys43qy6=(2hZ1!m~Az=-hy~?9&PlS+zS`{<-{Ngp6 zN@ItxqJ~a9_WGL&`)(Pl*no7AlXYX>OEqLnOLwlWfk1`x)2!}D6Vsbwu{sLpNTT7Y zC8XIsd!I>R0Ce<<@WIA-Jd2Nw+cLiuY9Dyi_sT||^vvNWWTky?j8^_*z?W56p#N0) z72Uo1HDm^neuk*_L9rpP*_qRX_-9iY+1QH1#aC9ChS6K+%tT=Cro|{ei#*kz)vtF_ zJksul^}6qgdhuDQX3#wr`~T*++y@ELs+6x2iKidQc|)27DDmBNn^ykRzAtO?Pa!f# zeT~DnlVH4%1CK0LDagnRKCoJrZ)JsRYzR5GLKs{oyPxsu%ep`&2S{QP#1S8*1HVFj z7BypEA{|_h736xTpW@re!bqUYREi?;DnZ<;f4=G7C}BI~l5Z6uDGGB4~dqAivj)=F`Pb zjlW@W5I~gr8V(Ldw)j8b=0`B{2c%$RjeqR-|BNCE=Ko+E3hB4w(c%Ry*Lq@eC>|W06fhUb$4tn@ z+t1d_EKAe~5xSc0V}tLhm2xNwaxT0_+3==hbF1arI9W~niM9UTDq`YsoXxeabNph^ zhp$fz2H|aN7AS)9RI%#D0aM5b(jTI)_7w~Uo-Ue>JU%`nw@OUp#SC1@O^e#qRh>-La{{-H+P;Yb`{y`<9ov$Cqu!+gOz`sp|n~+k<&KOh9W`_{#gOT|Q3J z{B>UW8K@1y?C;+SHOdSqkF9dR;Qu=3awhBU2*eXjvnv>Kf}wt24^%w5qwU6 ztMY0fDRbuyIFkIblUA8mLGkN*4q3gaKYbMKvEQy-q^n^QBHh@i24BO^hhB}4Hyf_* z^CgcIyHO?eVAWb$tJjf*w|fUk-$uR9kBOP$53B%=f?lj9^Yx2F?~{yt*ir6>Et4~( z?n44Dms8fSR`s;(?1~M3t=L1^*lo->n|u?9zO3l7cWOyKD&2#g{ zTs^=65O=+BjCK2}hG|E7)3|$szlGC>`W*jCces~t?1J`j&wH}5RH>Mz$e3`YPdRV|QfkyvnA zGV_`AM6M^=`ONVjCrZp6Ht=n!ryvLIVL3FHx+_T!ilub!c!a8?PV$2=V3ey#}4Y;D$OBn|F z5x{W<@5_rkebm6oa^!NwRV-pDMSQ%02S|s#a+N}h?!EsRoe{HJNyJwa(mVq*Tsu=Pk z%FL(sd^r|EmO!`C6RM?2LB!NG<*>${VaZ!{=~JY6p=hmo0qxT40W0*dM-RjRym*`! z!qrp4X}$`@#7n6q|1Irswl7bm{ICG^ldq6dvRSD5h*WwR0+|erUp~asuuVkU0M9HOYeCUz_kC{ zj_4pB5ETKy9RLM50Bivk|EMd#3Gf9>|DP2io;OG!B+K9ZHuaMiDxNDr$DMStIj^57 zz&v1DFggk{I}Rd{3>km~0vUgD8i{K-tY9Iz{h8y5I_rK5MnbE~m*y`Q3I+aKr2hql C>~C%W diff --git a/acceptance-tests/tests/src/test/resources/pki-certs/validator/keystore.jks b/acceptance-tests/tests/src/test/resources/pki-certs/validator/keystore.jks deleted file mode 100644 index 4fb942a9e0f1a55765b331f784473df9271af34b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6773 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 J0LYQ~{{o6$?4tkx diff --git a/acceptance-tests/tests/src/test/resources/pki-certs/validator/nss.cfg b/acceptance-tests/tests/src/test/resources/pki-certs/validator/nss.cfg deleted file mode 100644 index f3849919c..000000000 --- a/acceptance-tests/tests/src/test/resources/pki-certs/validator/nss.cfg +++ /dev/null @@ -1,6 +0,0 @@ - -name = NSScrypto-validator -nssSecmodDirectory = ./src/test/resources/pki-certs/validator/nssdb -nssDbMode = readOnly -nssModule = keystore - diff --git a/acceptance-tests/tests/src/test/resources/pki-certs/validator/nssdb/cert8.db b/acceptance-tests/tests/src/test/resources/pki-certs/validator/nssdb/cert8.db deleted file mode 100644 index f1aa64c06cae6ebc6fa426cc3fe372cebe220e26..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 65536 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 J5MaB&e*ngi^fUkf diff --git a/acceptance-tests/tests/src/test/resources/pki-certs/validator/nssdb/key3.db b/acceptance-tests/tests/src/test/resources/pki-certs/validator/nssdb/key3.db deleted file mode 100644 index cb2eb74985dcd253546ee476487162909ca25d0e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16384 zcmeI%Yc$mB8UXMa#&u-aC__@oRxT^Tl)*`pkr3LsXUJ__W;D!*C_9%O36-63zs4|f zja-r;a=%k1w+?b2B*KI(htBzMKA#Vrwby!|wVw4n>;JxMJ@5K``mgteaEm!WAP^1+ z1lA9M2<^2H0SE-TSN0Ra`=4fS{l^E+AN9u)1h(H(Zw5~8)&1Dtv!6dbc>jH#pFS51 z1Oh++2mk>f00e*l5C8%|00;m9Anz9CqM3Pe649&vv!cR>IFAOHk_01yBI zKmZ5;0U!VbfB+Bx0zXHf z3KUT~{iL3fxG13p=UT8-NrJ%T!}P=02cQC6P)=!6bGyZG=D>!U|MGHmf00e-*|0KW(;rDeQ zx;s1gkjN0_5ZH$DN$&steN;xmL@lm&rq*bRl?RR2MN_Yq+He=B=@HB58CSipEojUo#0G}!0z>9uX)jE&o zw`r+;9~q^rOItHT2ROGVT`~`>P|GM(Z(I2VgqKc+?dRLU^7xihxAP>F7ya`pa7|5eJ^#oM+j67BDdf!*eQ(;9zh$2&Bg>7}(-Jr2 zC6oROSC3IbPLTHs4Hp*Z`Kb5wW|v-*ik5upgX##HYMCHcKHhHb1)F7%=6+8R5*pOv zi1#z6g=NV_Te#|(DcJ9(hbmGn5p>lX>h~(sgc`GRzXutnw6&if9Xk};&TS*#5nr>u zLJ88auBjwSKB_bnXp!$4;-$+vE14y$YYGDt2d`H>sV`p9D*HK4nPJ6Q52uWJ(YDqvoAH zERSOPQ{fGFHc4;+@~Bm&2x3Xh{Zu94kMeTEjH0>>-T*P}1{pltr88;io2OtzYof-L zU;pyOai1xzGCi7ojh!5|{+SoS17&SrPqfSw^84!Jj+-`-9Gd>Z(b#=LNZ!oYFfGmR zT~)F5GKM*l*M8Atz=vB#!B-Jp^^s~rm{4!LVA-R%(mTXil-o00Nwdq0qu|ce?r0r_lv0y>%kINT*6Oj3ZKQevL((19pRX`@ zWQ4`hH904IvobBtZ6UK`xY(={S!yX*5i>zie=xvwKJ3)jZs$Rk4eeauLm!ezTALrt zKH!o#tvP#g+m&TOUW93vb;QmT8;WsScE2+bXAaGeNlDond#>R`rbImdc-Ru|A+}oe zM1}aIP29$Wf3~<4qlVEk&Fy{8IGjNbXpZ3->rlFSui)e_cw z=MG_tGyDkJzOkfOe=(>len(ijbw$4K-W=bCn5+1BK(EmvddO&KDfjsZ5;=K(yNgjm zV?`o=H#Ts6+`-gL*!nggI`c%izB2NmoHMTDt8e%jr)LaIp0Mw;4-#xLv$ZSd>$$1s zvs>$_W45(oJ~FyS3+_whRvrmqli1?N_UQ8JG3#}ad;d6>8OC8YSn#&(BbG+kl#0td zCt4XjCxCg=OwN{gMYSbi=PWd_{OhEWq^RP0zB`4r*_frPUCozPkVFP|So(C4UxH4{ zj$>D{F1I<*YLD3t>35zt%p7_3O8&@)vU^yD!&?+OLmiH$5O|c&R?OSuH{7`$sG}#pJKO z#)`w@B{I-H#3TW7yOsT2fp7-H2Hi(HQm{IzG{0qBV#sHA;md^fz^(0|NUNC3oP*)f z7L=?Sg~3GQ?vB~3iL{a+yR)w)RVQ6%MsTP5bc9QM9DCuy%n4ckZX;OPC06?wO)uRo z;llMyxEK%VcMH!{*p5l(a`p*jAL}xL(72H7E2U&K&fShly>9WFn%sd=r_{k%W=Aq^o@?jl+-HC(KmZ5;0U!VbfB+Bx0zd!=00AHX1c1Q*QQ%)< C_@u-D diff --git a/acceptance-tests/tests/src/test/resources/pki-certs/validator/nssdb/secmod.db b/acceptance-tests/tests/src/test/resources/pki-certs/validator/nssdb/secmod.db deleted file mode 100644 index c51600ebfcfe5e2003875fe46a053ccba4c7dd09..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16384 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 T;=|Iy)!Bv=_7WNZH3t44NI<;k diff --git a/acceptance-tests/tests/src/test/resources/pki-certs/validator1/nss.cfg b/acceptance-tests/tests/src/test/resources/pki-certs/validator1/nss.cfg deleted file mode 100644 index b908a6800..000000000 --- a/acceptance-tests/tests/src/test/resources/pki-certs/validator1/nss.cfg +++ /dev/null @@ -1,6 +0,0 @@ - -name = NSScrypto-validator1 -nssSecmodDirectory = ./src/test/resources/pki-certs/validator1/nssdb -nssDbMode = readOnly -nssModule = keystore - diff --git a/acceptance-tests/tests/src/test/resources/pki-certs/validator1/nssdb/cert8.db b/acceptance-tests/tests/src/test/resources/pki-certs/validator1/nssdb/cert8.db deleted file mode 100644 index c9633c714184d2e157136369f26fd5eba4a63c5d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 65536 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 BLAn3{ diff --git a/acceptance-tests/tests/src/test/resources/pki-certs/validator1/nssdb/key3.db b/acceptance-tests/tests/src/test/resources/pki-certs/validator1/nssdb/key3.db deleted file mode 100644 index 2b98e97f3b00199635526bf32492b92a9a270515..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16384 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 E0sNwjEC2ui diff --git a/acceptance-tests/tests/src/test/resources/pki-certs/validator1/nssdb/secmod.db b/acceptance-tests/tests/src/test/resources/pki-certs/validator1/nssdb/secmod.db deleted file mode 100644 index bc3748fac0570558d7936a34046ac8664a8ce093..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16384 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 BZI}Q6 diff --git a/acceptance-tests/tests/src/test/resources/pki-certs/validator2/keystore.jks b/acceptance-tests/tests/src/test/resources/pki-certs/validator2/keystore.jks deleted file mode 100644 index 414b903e13363bff556f75c2610ff1d0a4af736b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6783 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 diff --git a/acceptance-tests/tests/src/test/resources/pki-certs/validator3/crl.pem b/acceptance-tests/tests/src/test/resources/pki-certs/validator3/crl.pem deleted file mode 100644 index 8ced006c9..000000000 --- a/acceptance-tests/tests/src/test/resources/pki-certs/validator3/crl.pem +++ /dev/null @@ -1,27 +0,0 @@ ------BEGIN X509 CRL----- -MIICBDCB7QIBATANBgkqhkiG9w0BAQsFADCBgTELMAkGA1UEBhMCVVMxCzAJBgNV -BAgMAkNBMQwwCgYDVQQHDANTRk8xCzAJBgNVBAoMAk1DMQ0wCwYDVQQLDARyb290 -MRMwEQYDVQQDDApwYXJ0bmVyYWNhMSYwJAYJKoZIhvcNAQkBFhdwYXJ0bmVyYWNh -QHBhcnRuZXJhLmNvbRcNMjEwNzA5MTkxMjM1WhcNMjIwNzA5MTkxMjM1WjAnMCUC -FF9rJlU9U6JdFIeK/xRojaoxHdc5Fw0yMTA3MDkxOTEyMzVaoA4wDDAKBgNVHRQE -AwIBADANBgkqhkiG9w0BAQsFAAOCAQEAfByR//FGHSsVQbaS51d59o82XocOGnnT -p1hjceqtLGv3bhiebVrsRCOB5TsvE/r2IbB/yHYTe3+LJisIUqBxblQ6xK6IM+qA -3fY646YnPT5pvdZAPZ2BCN/xP3xqGffFKapQ9cz0/36YE3vaEoUDlC2VHK0OXI0t -4CLwAmiptUT2GW4Bk1RtokAsFiUNwNIOlRX5bywUNwkG7EuitR90QSGH3l/vyii2 -0c1Fm9He9MskwipjXpJKKb+t+m1pdpOVkSjRfjmVqi4BZwWlnQjELSLywhJ+WZG2 -Z1NgRjzPXotFKK+YD97Kx1L260A1eUZ46zSq73oUZr0EDZRnNJTr6A== ------END X509 CRL----- ------BEGIN X509 CRL----- -MIICLDCCARQCAQEwDQYJKoZIhvcNAQELBQAwgYExCzAJBgNVBAYTAlVTMQswCQYD -VQQIDAJDQTEMMAoGA1UEBwwDU0ZPMQswCQYDVQQKDAJNQzENMAsGA1UECwwEcm9v -dDETMBEGA1UEAwwKcGFydG5lcmJjYTEmMCQGCSqGSIb3DQEJARYXcGFydG5lcmJj -YUBwYXJ0bmVyYi5jb20XDTIxMDcwOTE5MTIzNVoXDTIyMDcwOTE5MTIzNVowTjAl -AhQTZhDgbKuvX7iLRUBBTiWXBPKM1xcNMjEwNzA5MTkxMjM1WjAlAhRfayZVPVOi -XRSHiv8UaI2qMR3XORcNMjEwNzA5MTkxMjM1WqAOMAwwCgYDVR0UBAMCAQEwDQYJ -KoZIhvcNAQELBQADggEBAMIltmJ036f1BmK/baISJTZTu7PKZgSZMNORnpFT8KvC -s2GNRor5bGp5qvD6LHvsx92YVppCC6xd/beCFBtdyYifqw5xtOvqLQKuqCfxruLz -EqYjKXE/3v8VdyU71J7kFqi0U0Gy4/h/YCL92e5KNbATlmcn5ToyI2EBIEfBfV08 -mm7FBXvbHRzqhfrnCNEjBWBWz3zkJMc9Rib26eCCofYIDkY2HvYSN78YgrnMmD6O -hWOXrPoxArxvmDr5rG4vCadqbQYRkkCAOP0hBeMiB0SAcO2W2LNNAmHWXX7FvU3n -ZRZUX31WoVjhNeEQtNBb2mPYBXHQzLC66qYm1p97afc= ------END X509 CRL----- diff --git a/acceptance-tests/tests/src/test/resources/pki-certs/validator3/keys.p12 b/acceptance-tests/tests/src/test/resources/pki-certs/validator3/keys.p12 deleted file mode 100644 index b36ede08e5ab569a284ff976e23079b00c827f1f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6034 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 uauZ>o(_#XE6w>Q;(y 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�?O8?s2jl&ezK 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 HzQ8{LKjB5t diff --git a/acceptance-tests/tests/src/test/resources/pki-certs/validator3/nssdb/key3.db b/acceptance-tests/tests/src/test/resources/pki-certs/validator3/nssdb/key3.db deleted file mode 100644 index 6414460a69c30d002e7d87ea579da8e887572e0e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16384 zcmeI$XHe5y769;nAdpZbbe8hKClEjg(j*WR5ETT1)I}gDL~7_gqS6BR=tVk6e~J_< zQlu{~is5b{68xAX5CjNkM3BM5$6XLyCY`<9R6_|EbA;eq`3JU_fIXb1#= z01yBIKmZ5;0U!VbfB+Bx0zlxeB7lSrQ2VGAR4u9!m4(XUNM;FUNoM&90tf&BAOHk_ z01yBIK;Xv+FhXoWL=Tc9F~HkT8B(CYcNL_W*-qcPa&PYhjGYO_s2~XE)!&YHLY+$R z)=~F9JniCuP8F(NV}QZn6nM`A5!+tDt3AGakBAJr48=`m%jnqrpF5(r-{=s!m7iw^ z_qSp1eZ_t(}Jzx$i;d!}Cp_@1xwJ3>){N_I>~7pF)SCU&OkzH*bCVdOoA()vaF zv*WK_qUcnyFY9_2Tq0#xW^!<`hczz-r*2XH{lE`@&A9S59tYt%T z-OcJ!cT-D1koC;eO>0wKT1b=fE*B+*qH1Q-)xRMyQ-J)%fKNIA`N!Nm^Xnj(75;L6d!upnC1^4!~q~66XKIJHz7u!=~P^)P(a!DxU>Eji_JX zeic3*UUQn&R{m7EwzzU5Mz(90Unv(Wi)ixtrE(+BLhR4ZUT?E@x*SzLokIRdBoxnz z4KFrQYO3F1mUHr>9Rv#D>^@42QxvZz5%e(W4b5)wnn-y8l+bbdYmw~EoTA!`pd%H& zwzt0}XV|RhCFFl((C6hZ5hGxDLV9pH^cNpI)s@y0{A?d))xFBim|Ji=|B1ezw<(f7 zI-8!TuM{;YTzOHWgr9R1Up1k?_AG_TL=cumqb!LYwCcV*K^PLcT+I;38$i13UsX7O zJ9k7Iy}jnC(RqY>bzULj!t`p5mFJ^nXTyUX(gs!6t(`e`Z#$dpAmO`!r`~3w?pK@M z>MP}mn7RMLBAO(Mn=-$S5*pf3+gF$6d=_aVtr@n~-4n=VPI5WS$uNsc_#(+@6?cZ0 z$61lf04*M1h_jcBd3W)}p=!5gM<u) zo@?Mhm1&o>4`{shGm6{|y+w2P^9*8hERDVwWy z`GH&sU6XP3%z;VhgXUqbvv(R1*JOmL8Lrgv)|Rsfnnd_?*tm;smaA4(hxAjvLu6gA z5H8n?uRNh=f>k`Az;4Zzw$SWxQr2>1jHyE{xv+kHumRgx4xyjQ-@`o%4Z*F$3ACZ< zSXYVMNy)9%@wvc%tUpw+=!(Ae2fe_uo3F+clBsJJnLdSU!1@ula@|WC1uJY*)I9u} zaAjGcU5|SOd&g>1Z}94x{60mlPQ%EeZ5USZ64+{~@hXh&hUy#z;j_jXCgU^v6Ze#L zrq)PE?3EBsDfm{*aOX(2|LQqa`(SgP>?F1s`(b;SZBn27$v}>sg=7|(F>QgVSE9S4 z$Zj`Xzw4G-9=l(RX8%!M?At|O<00`wl)-v1Cn+9rgyIt8QA029J1$%_DLJL{r;{}8 zL!N1?t8sBZRfszZmG-5Na9fUiX%-^bg|>!tP|Ih|C>Si>54%h2HEO0JJ_i}zl$X2C zJf~^3auq#|EDF6zck%GPN%X+@6FmYLd0{sDt+K2`6IfxP8oPtP*+g{pYb8Vf{Zh=Q z5Oa(a3sb9>4u+RS?a)3%e}A&KpCiV>)yct~(bCD!pXBZJSNW#^a{>V%00e*l5C8%| z00;m9AOHk_01yBI|GU7^kNMXIU4Q@(00KY&2mk>f00e*l5C8%|00;nq|D(Xa0Hkz_ A$^ZZW diff --git a/acceptance-tests/tests/src/test/resources/pki-certs/validator3/nssdb/secmod.db b/acceptance-tests/tests/src/test/resources/pki-certs/validator3/nssdb/secmod.db deleted file mode 100644 index 75bd6e3d96d9b279614832801245ccc20f2996cf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16384 zcmeI&O-jQ+6u|LkmD+_=H||6RTx8c$+zDCLjTEI&FOVkF5}GC@Nu@44hI`K;u6qEl zpvO?^Bva8Mx-3Qh1CRN7c{B4{N2-UOh*U&&o<$DKQ1(Q&Ojm@|mIJe2E^L>5xn+~? zIVs+ADQzLg#xm zyA+ywpPyVOBORaX%umBf9wu?IWB2h9mghqw7=f|zMvt100IagfB*srAb diff --git a/acceptance-tests/tests/src/test/resources/pki-certs/validator3/nsspin.txt b/acceptance-tests/tests/src/test/resources/pki-certs/validator3/nsspin.txt deleted file mode 100644 index 5271a5268..000000000 --- a/acceptance-tests/tests/src/test/resources/pki-certs/validator3/nsspin.txt +++ /dev/null @@ -1 +0,0 @@ -test123 diff --git a/acceptance-tests/tests/src/test/resources/pki-certs/validator3/ssl-ca.pem b/acceptance-tests/tests/src/test/resources/pki-certs/validator3/ssl-ca.pem deleted file mode 100644 index a5fdc343f..000000000 --- a/acceptance-tests/tests/src/test/resources/pki-certs/validator3/ssl-ca.pem +++ /dev/null @@ -1,70 +0,0 @@ ------BEGIN CERTIFICATE----- -MIID8DCCAtigAwIBAgIUcATI/N49JsZyAuyS8gfW6BppdBMwDQYJKoZIhvcNAQEL -BQAweDELMAkGA1UEBhMCVVMxCzAJBgNVBAgMAkNBMQwwCgYDVQQHDANTRk8xCzAJ -BgNVBAoMAk1DMQ0wCwYDVQQLDARyb290MRAwDgYDVQQDDAdpbnRlcmNhMSAwHgYJ -KoZIhvcNAQkBFhFpbnRlcmNhQGFkbWluLmNvbTAgFw0yMTA3MDkxOTEyMThaGA8y -MTIxMDYxNTE5MTIxOFowgYExCzAJBgNVBAYTAlVTMQswCQYDVQQIDAJDQTEMMAoG -A1UEBwwDU0ZPMQswCQYDVQQKDAJNQzENMAsGA1UECwwEcm9vdDETMBEGA1UEAwwK -cGFydG5lcmNjYTEmMCQGCSqGSIb3DQEJARYXcGFydG5lcmNjYUBwYXJ0bmVyYy5j -b20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC+31Xz+vdtagGGF4Zs -JPzLNkPRWUZ2aB2nB6O3GFFItRERIeKQQ809jpuWb+3nPwmHgAeu/5KDuHExXUp3 -zsq/pBhjmIxysN/tSB0ZWgnDZj0T/O1cFxmFPSIQi2YqN9ex/k1P0A/bPLYid6sp -BrMB2oDuemjG9OL8zwWxTWFstwMZgh+PUoLv4xPt3vnv8hiBvMxIRe2IjseFRvR9 -zoaxAW94oeLPngPgWanUZvU+hL0BR2h0RZbsmPciw4K7PzHKCfOnDcJN3/k32GuQ -1ETYXVqBZstMwZ/yUAZzHDUFuungfM/VyuVVqjV1Njmi1ulrZNaLj3pe+x0WwrXq -VbgfAgMBAAGjZjBkMB0GA1UdDgQWBBRoOd/JgcA/UZW816OxlkI45xhLJDAfBgNV -HSMEGDAWgBTdAXu8aBbvkvxYD5Ss9/Ml5VgohjASBgNVHRMBAf8ECDAGAQH/AgEA -MA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOCAQEAbIUXWJ1SU2cwnGfJ -gor9Y3QX8q3bLRBQ6nuVXUhyHtOKnecEYY+6cvTgAy4tcaEbTrmXnIwwddzWXR5c -IEgpem6t9tJqjvDZ3SMmlIf57L/rKp1rQQXmOBm2fBy86zC6RChYMshf9LQ3pCeZ -kESZ+WzHqmTDe2vpe3AaZTsGy+HucyVv5Ha5WLATFMPSMbY76sMbFDEr8viskCNm -JzDvYbqHMfZUJu4eiWiRJ8v6GY1HJ8SJrFUz2ry6WNYiizoEABHC8VrWV+Kss1Vq -MiFfAZND4wBS5TZmaKi4BQt/+cnUAX0ej6wYSug/+Atz9DSu/b+AsEZ5tXnxDMGO -vqwj8g== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIID6jCCAtKgAwIBAgIUYdazVD+VnI7jBu7xLaW+npfwHJIwDQYJKoZIhvcNAQEL -BQAwfDELMAkGA1UEBhMCVVMxCzAJBgNVBAgMAkNBMQwwCgYDVQQHDANTRk8xCzAJ -BgNVBAoMAk1DMQ0wCwYDVQQLDARyb290MRUwEwYDVQQDDAxyb290Y2EuYWRtaW4x -HzAdBgkqhkiG9w0BCQEWEHJvb3RjYUBhZG1pbi5jb20wIBcNMjEwNzA5MTkxMTU0 -WhgPMjEyMTA2MTUxOTExNTRaMHgxCzAJBgNVBAYTAlVTMQswCQYDVQQIDAJDQTEM -MAoGA1UEBwwDU0ZPMQswCQYDVQQKDAJNQzENMAsGA1UECwwEcm9vdDEQMA4GA1UE -AwwHaW50ZXJjYTEgMB4GCSqGSIb3DQEJARYRaW50ZXJjYUBhZG1pbi5jb20wggEi -MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDZ8QgVwEjy3CgJFvET7tYNBw97 -4i33EHQT4ZuayGCJ+ADY3ZFpsw2M1IPlbAguqfBkcLd8TAjWNRAdsm9ubGlIcTZr -7LNle3gvc7qEP4qg0i6M7D06CDqtBaIJ1PMTJchOouGU9ntBe+h0qg8tzpiqJdIw -jIOPRWW98Hw9KgF6++2jtlcOW1IxiFSWqf0Mpc81qKukcxnsHjvdxmBp/Z1vL42E -m5xNOGXoxpjq8NygSuVDhQ/bZUnmHLmvv9MXe9Ob52rlzea/YafLpOeNGSA1aCxm -Fx0lcoXWp4xpoyJn9St7vmH3t7quBKdqt54zwcuHjhgZPSR6RikodKHtsl8TAgMB -AAGjZjBkMB0GA1UdDgQWBBTdAXu8aBbvkvxYD5Ss9/Ml5VgohjAfBgNVHSMEGDAW -gBSMsBNO3UGBteMZOTq5fDPG2aPx8DASBgNVHRMBAf8ECDAGAQH/AgEBMA4GA1Ud -DwEB/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOCAQEA0hJCtrCI9Mf47+y3pvsTjiaT -TZwpNE0cdxHjpcCHJWX2jmGbqqA6wvQ7yy4PFarmnFOoW3hQFeiLgpz9X86YTRzF -8dj3Q2MKXf6i6/iW+Y96GFqurshKp7wV25wfzWwLXcVCiM1xYPWYSyGsZAGotu4M -c7uolVABjJu5nci9mBxVmaYV5oT1mxrvq3dCPm2AvmVFNWPNRbMSAuT5B7FUDvWG -xvd1aDFduqL0iLAcrTifMIYI3XL4pBSIlL78dgY45WL6616EF3mHhW/Y4k4PNq1I -Fz08Q3y99ilhzeAci1jv6KBVHiALZNFFtYjd10KX95qnF9SomBjCTPsQ9PTC5g== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIID2zCCAsOgAwIBAgIUdxRGMrv1ONRI/dJXUHa3isjVXuwwDQYJKoZIhvcNAQEL -BQAwfDELMAkGA1UEBhMCVVMxCzAJBgNVBAgMAkNBMQwwCgYDVQQHDANTRk8xCzAJ -BgNVBAoMAk1DMQ0wCwYDVQQLDARyb290MRUwEwYDVQQDDAxyb290Y2EuYWRtaW4x -HzAdBgkqhkiG9w0BCQEWEHJvb3RjYUBhZG1pbi5jb20wIBcNMjEwNzA5MTkxMTU0 -WhgPMjEyMTA2MTUxOTExNTRaMHwxCzAJBgNVBAYTAlVTMQswCQYDVQQIDAJDQTEM -MAoGA1UEBwwDU0ZPMQswCQYDVQQKDAJNQzENMAsGA1UECwwEcm9vdDEVMBMGA1UE -AwwMcm9vdGNhLmFkbWluMR8wHQYJKoZIhvcNAQkBFhByb290Y2FAYWRtaW4uY29t -MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2Bqlx+ngRZfWjktX6urJ -Tpg2//n3uMW8Gp55SVq+lbpkNXuA3W0uTlom/2fsnzmMmBAJUvv/NaLcFSN++0/d -fYGVhogxjlRoyaXa4sdFPg2ocM+lCHLGhWpYuVdTWPknikTOVNbh9z94SLRfrP8N -kuxGNZNktnVm+QJmrCLmjvnPvQlcP/WqFYehFM26NaRzswOhLLRU1YK8aVlh9Vto -PGSTPtZK60XwTfyCj/zEvHqpbGbKJPp7W0rpxl7ehPQIzGQt5IMH3zKrqLm4/pt+ -XFEVqy724sstthS73bvXguWxBLOzuMze8CbI6SJpcHaH8HO5pfFMPyE5N5l2x9Co -uQIDAQABo1MwUTAdBgNVHQ4EFgQUjLATTt1BgbXjGTk6uXwzxtmj8fAwHwYDVR0j -BBgwFoAUjLATTt1BgbXjGTk6uXwzxtmj8fAwDwYDVR0TAQH/BAUwAwEB/zANBgkq -hkiG9w0BAQsFAAOCAQEAL9/7YtxIbuTt7dgH1KOMb/y6P3Qb79fTVZTx073E2ZBj -OfSuMGUhKC30LWQXCQEsY4WpugJ4cS0NsArSYsO5XWguqgjYlWL6poOmYhGvj7ou -oi44oYqcPm6EbvLrAKdI67bkbSPLzgs+6TrxTyXHzPKFBqGBnuHaFKjgb4hGiPmd -JWKrh3fbTtuLjqSHd0Gey2uBNFql4LhPutdsCUhSOD3BibAeTbXyln70AgpTCoWT -9Qr9Ux6HYIiAHSDBzzuN8EcrlnAm9RO4zRyUVwxDsHoNsOUwybn50IM66p83HuiY -h/iX5uNjaFAADfRR4rQOwb6MLreVH2XYUSiz4M/ijg== ------END CERTIFICATE----- diff --git a/acceptance-tests/tests/src/test/resources/pki-certs/validator3/ssl.pem b/acceptance-tests/tests/src/test/resources/pki-certs/validator3/ssl.pem deleted file mode 100644 index 474187b0e..000000000 --- a/acceptance-tests/tests/src/test/resources/pki-certs/validator3/ssl.pem +++ /dev/null @@ -1,126 +0,0 @@ ------BEGIN PRIVATE KEY----- -MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDW0t2JaCSa2iXy -7Njgdb7vpTBUxYV44tueVscVtVEAKbe9HN0iOro3cmHymmujuxmqXJA4bHK8OqeX -fsWoyhnK17aRXhRGUNHcd7OTLSsmWgLsTCQ3syfYrC1G8Dbgggdw7gp/KXDfHRLc -WZY/1H2JSH0QJwTyiNPE1Jhz7Dw2YHlTE5iOC95g02ABXI7LLiB1DvTkjwkBT9bk -Bcokx8OgX/aUScV4OJsMcog+zf2bic/lcU/SI/wPSu95EGmLB/0PER8TOCbp+GTk -Q1CiIkL1ZSjW6JtRwGhPoc3JGhKED5P+y1t6LHdE3wBbX37AfcPJqd4vMErlkn98 -1spNvckHAgMBAAECggEBALhlG5/ccr8wzS4tuyNALnqJsmixexX+tEC/f/fUQQkA -xiRf6Dh/bGQ3nHefsRFDgo5HEcw82mdTeZOCT6vIfkcszhsNRB3vNZQmc0+7j7RF -wwiNevEMqQFFGUAw5Qnk0vpOeVgZfDcnP49AnsV/YZo7TI5Wz9pXNF9ZlNq8Rhrt -NYTF92vzWfrCskQnYL2Tn29qUTWIvsqq6wt7oR0NKwTfbm4420ZGbpAKgtVWsnXN -13nRhAgB7aNEAAXn9FsRjn/aVaOLWv8rfL7AnWx/DREMOBOKNUIW7mkT4xwNFrnl -kVS4mjnMRVtMG+/xK781E9voJ+2GYXiCE3ldEY1ZhDECgYEA9I7ej9ZWYLwnf6jS -IsRDWLwqLsy5upHv88zeqGTNR/kiO8On5+GMaFT93II53TQk+gLBTdmUYR1jYdq+ -raR9nOSVjV35kE747NZIhqRGkMCJg3qLLF7haK5bvynAD60dIpme6IiDEKLjgPmr -k2CQo0rPIASed+vXpdYVYGVsaMUCgYEA4N/cLv/Mi59tAdFNUaxyIAVgFD++bG1r -RkJmhYcCqj563kIRhqd+YtWhtedeBMTrmMBztd/1p1qjUmnB/drhvl60J+4WoULR -1YSA1hLOz25iGTBEPJH05115hD4OC7o2R88NdC4TYizIqzSbyuYIw3kTLGDzO9b9 -wYaR4+TdD1sCgYEAo8a985O1uwimZw6200OeWmGA2mCODQzIpfvQLPN8qjOEooNw -AZEBx6kLbU3k1GekT63iqHEKtlLJCHJGeeELojNOmCKUC/lnKKyEW27ONwhJzzwU -0f0kdUc29/lMvvLO7Sn1yoIJS+3Z77jEF2l203Q465dMTMErZMrO/ARQKoUCgYBW -n0T0wcpsGjxmT9al2HSZyxhIlIlowPlqthdB5lDrfWfdB7wyj4CK19oT9Qztb2GF -lNS9wYiiL7LsAxscC12b9GUXYIpNEi08P29VhyctFkspgsM2Rc799K7jdvf4IoHY -RXTcRQdocPHXqUs97ECB87ikBrCLY3SaQJkgHT/eMwKBgGRqRCW3J+DHaGYVrfFh -jTtVnMAw+eNMrfEzbueav8XYFDA035lHANMaW1ImCEnGcNxTKTNHYlEI+GJGlf3j -nLyFxHt2t7t3EH+Z1TRBpTWcI9NIBA9suGSwHF6JSYYoP/XycknvHR3CKnptVqEh -2BvRskmyqDqlJ3or8iilBVG4 ------END PRIVATE KEY----- ------BEGIN CERTIFICATE----- -MIIEvjCCA6agAwIBAgIUeHwvCYkMzLzluPyGlFa5V/lmFnowDQYJKoZIhvcNAQEL -BQAwgYExCzAJBgNVBAYTAlVTMQswCQYDVQQIDAJDQTEMMAoGA1UEBwwDU0ZPMQsw -CQYDVQQKDAJNQzENMAsGA1UECwwEcm9vdDETMBEGA1UEAwwKcGFydG5lcmNjYTEm -MCQGCSqGSIb3DQEJARYXcGFydG5lcmNjYUBwYXJ0bmVyYy5jb20wIBcNMjEwNzA5 -MTkxMjE4WhgPMjEyMTA2MTUxOTEyMThaMIGBMQswCQYDVQQGEwJVUzELMAkGA1UE -CAwCQ0ExDDAKBgNVBAcMA1NGTzELMAkGA1UECgwCTUMxDTALBgNVBAsMBHJvb3Qx -EzARBgNVBAMMCnZhbGlkYXRvcjMxJjAkBgkqhkiG9w0BCQEWF3ZhbGlkYXRvcjNA -cGFydG5lcmMuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA1tLd -iWgkmtol8uzY4HW+76UwVMWFeOLbnlbHFbVRACm3vRzdIjq6N3Jh8ppro7sZqlyQ -OGxyvDqnl37FqMoZyte2kV4URlDR3Hezky0rJloC7EwkN7Mn2KwtRvA24IIHcO4K -fylw3x0S3FmWP9R9iUh9ECcE8ojTxNSYc+w8NmB5UxOYjgveYNNgAVyOyy4gdQ70 -5I8JAU/W5AXKJMfDoF/2lEnFeDibDHKIPs39m4nP5XFP0iP8D0rveRBpiwf9DxEf -Ezgm6fhk5ENQoiJC9WUo1uibUcBoT6HNyRoShA+T/stbeix3RN8AW19+wH3Dyane -LzBK5ZJ/fNbKTb3JBwIDAQABo4IBKDCCASQwEQYJYIZIAYb4QgEBBAQDAgbAMB0G -A1UdDgQWBBSl7BsGlNKcg8bg/9K/Pt6beFmUbDAJBgNVHRMEAjAAMA4GA1UdDwEB -/wQEAwIF4DAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwgbUGA1UdIwSB -rTCBqoAUaDnfyYHAP1GVvNejsZZCOOcYSyShfKR6MHgxCzAJBgNVBAYTAlVTMQsw -CQYDVQQIDAJDQTEMMAoGA1UEBwwDU0ZPMQswCQYDVQQKDAJNQzENMAsGA1UECwwE -cm9vdDEQMA4GA1UEAwwHaW50ZXJjYTEgMB4GCSqGSIb3DQEJARYRaW50ZXJjYUBh -ZG1pbi5jb22CFHAEyPzePSbGcgLskvIH1ugaaXQTMA0GCSqGSIb3DQEBCwUAA4IB -AQAM49KuL0GR6f9O6bS8YkPNcNcOP3y5AbGzV08boCHcnL0iJmSyUoYwD4ksEj+Z -41YcBOGtPE++MR27LvpMXV6wMoJvmg4G97M1Oql+fs+eZnKyWRuQSWoCLUpsh5Cq -j9QUHv95xUyadH3HSQnDHd2Khhsu60MEqF6wuyU+EsjoNp5Ejsmk0DDWobXPwA8K -WaqyleZOjA52HeRwAeextO9Zvv4yJX/I/DeGf3LTPz8IAE0rLXROpEj31rX0CeKA -BPiBVVn0qRTeimjm9G22AUwKKBNCta2plMkbq2shHAKTXWzI72aW6kHHG35zdXWV -qnQZrcVShlqsexiZAGRfKqsb ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIID8DCCAtigAwIBAgIUcATI/N49JsZyAuyS8gfW6BppdBMwDQYJKoZIhvcNAQEL -BQAweDELMAkGA1UEBhMCVVMxCzAJBgNVBAgMAkNBMQwwCgYDVQQHDANTRk8xCzAJ -BgNVBAoMAk1DMQ0wCwYDVQQLDARyb290MRAwDgYDVQQDDAdpbnRlcmNhMSAwHgYJ -KoZIhvcNAQkBFhFpbnRlcmNhQGFkbWluLmNvbTAgFw0yMTA3MDkxOTEyMThaGA8y -MTIxMDYxNTE5MTIxOFowgYExCzAJBgNVBAYTAlVTMQswCQYDVQQIDAJDQTEMMAoG -A1UEBwwDU0ZPMQswCQYDVQQKDAJNQzENMAsGA1UECwwEcm9vdDETMBEGA1UEAwwK -cGFydG5lcmNjYTEmMCQGCSqGSIb3DQEJARYXcGFydG5lcmNjYUBwYXJ0bmVyYy5j -b20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC+31Xz+vdtagGGF4Zs -JPzLNkPRWUZ2aB2nB6O3GFFItRERIeKQQ809jpuWb+3nPwmHgAeu/5KDuHExXUp3 -zsq/pBhjmIxysN/tSB0ZWgnDZj0T/O1cFxmFPSIQi2YqN9ex/k1P0A/bPLYid6sp -BrMB2oDuemjG9OL8zwWxTWFstwMZgh+PUoLv4xPt3vnv8hiBvMxIRe2IjseFRvR9 -zoaxAW94oeLPngPgWanUZvU+hL0BR2h0RZbsmPciw4K7PzHKCfOnDcJN3/k32GuQ -1ETYXVqBZstMwZ/yUAZzHDUFuungfM/VyuVVqjV1Njmi1ulrZNaLj3pe+x0WwrXq -VbgfAgMBAAGjZjBkMB0GA1UdDgQWBBRoOd/JgcA/UZW816OxlkI45xhLJDAfBgNV -HSMEGDAWgBTdAXu8aBbvkvxYD5Ss9/Ml5VgohjASBgNVHRMBAf8ECDAGAQH/AgEA -MA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOCAQEAbIUXWJ1SU2cwnGfJ -gor9Y3QX8q3bLRBQ6nuVXUhyHtOKnecEYY+6cvTgAy4tcaEbTrmXnIwwddzWXR5c -IEgpem6t9tJqjvDZ3SMmlIf57L/rKp1rQQXmOBm2fBy86zC6RChYMshf9LQ3pCeZ -kESZ+WzHqmTDe2vpe3AaZTsGy+HucyVv5Ha5WLATFMPSMbY76sMbFDEr8viskCNm -JzDvYbqHMfZUJu4eiWiRJ8v6GY1HJ8SJrFUz2ry6WNYiizoEABHC8VrWV+Kss1Vq -MiFfAZND4wBS5TZmaKi4BQt/+cnUAX0ej6wYSug/+Atz9DSu/b+AsEZ5tXnxDMGO -vqwj8g== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIID6jCCAtKgAwIBAgIUYdazVD+VnI7jBu7xLaW+npfwHJIwDQYJKoZIhvcNAQEL -BQAwfDELMAkGA1UEBhMCVVMxCzAJBgNVBAgMAkNBMQwwCgYDVQQHDANTRk8xCzAJ -BgNVBAoMAk1DMQ0wCwYDVQQLDARyb290MRUwEwYDVQQDDAxyb290Y2EuYWRtaW4x -HzAdBgkqhkiG9w0BCQEWEHJvb3RjYUBhZG1pbi5jb20wIBcNMjEwNzA5MTkxMTU0 -WhgPMjEyMTA2MTUxOTExNTRaMHgxCzAJBgNVBAYTAlVTMQswCQYDVQQIDAJDQTEM -MAoGA1UEBwwDU0ZPMQswCQYDVQQKDAJNQzENMAsGA1UECwwEcm9vdDEQMA4GA1UE -AwwHaW50ZXJjYTEgMB4GCSqGSIb3DQEJARYRaW50ZXJjYUBhZG1pbi5jb20wggEi -MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDZ8QgVwEjy3CgJFvET7tYNBw97 -4i33EHQT4ZuayGCJ+ADY3ZFpsw2M1IPlbAguqfBkcLd8TAjWNRAdsm9ubGlIcTZr -7LNle3gvc7qEP4qg0i6M7D06CDqtBaIJ1PMTJchOouGU9ntBe+h0qg8tzpiqJdIw -jIOPRWW98Hw9KgF6++2jtlcOW1IxiFSWqf0Mpc81qKukcxnsHjvdxmBp/Z1vL42E -m5xNOGXoxpjq8NygSuVDhQ/bZUnmHLmvv9MXe9Ob52rlzea/YafLpOeNGSA1aCxm -Fx0lcoXWp4xpoyJn9St7vmH3t7quBKdqt54zwcuHjhgZPSR6RikodKHtsl8TAgMB -AAGjZjBkMB0GA1UdDgQWBBTdAXu8aBbvkvxYD5Ss9/Ml5VgohjAfBgNVHSMEGDAW -gBSMsBNO3UGBteMZOTq5fDPG2aPx8DASBgNVHRMBAf8ECDAGAQH/AgEBMA4GA1Ud -DwEB/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOCAQEA0hJCtrCI9Mf47+y3pvsTjiaT -TZwpNE0cdxHjpcCHJWX2jmGbqqA6wvQ7yy4PFarmnFOoW3hQFeiLgpz9X86YTRzF -8dj3Q2MKXf6i6/iW+Y96GFqurshKp7wV25wfzWwLXcVCiM1xYPWYSyGsZAGotu4M -c7uolVABjJu5nci9mBxVmaYV5oT1mxrvq3dCPm2AvmVFNWPNRbMSAuT5B7FUDvWG -xvd1aDFduqL0iLAcrTifMIYI3XL4pBSIlL78dgY45WL6616EF3mHhW/Y4k4PNq1I -Fz08Q3y99ilhzeAci1jv6KBVHiALZNFFtYjd10KX95qnF9SomBjCTPsQ9PTC5g== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIID2zCCAsOgAwIBAgIUdxRGMrv1ONRI/dJXUHa3isjVXuwwDQYJKoZIhvcNAQEL -BQAwfDELMAkGA1UEBhMCVVMxCzAJBgNVBAgMAkNBMQwwCgYDVQQHDANTRk8xCzAJ -BgNVBAoMAk1DMQ0wCwYDVQQLDARyb290MRUwEwYDVQQDDAxyb290Y2EuYWRtaW4x -HzAdBgkqhkiG9w0BCQEWEHJvb3RjYUBhZG1pbi5jb20wIBcNMjEwNzA5MTkxMTU0 -WhgPMjEyMTA2MTUxOTExNTRaMHwxCzAJBgNVBAYTAlVTMQswCQYDVQQIDAJDQTEM -MAoGA1UEBwwDU0ZPMQswCQYDVQQKDAJNQzENMAsGA1UECwwEcm9vdDEVMBMGA1UE -AwwMcm9vdGNhLmFkbWluMR8wHQYJKoZIhvcNAQkBFhByb290Y2FAYWRtaW4uY29t -MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2Bqlx+ngRZfWjktX6urJ -Tpg2//n3uMW8Gp55SVq+lbpkNXuA3W0uTlom/2fsnzmMmBAJUvv/NaLcFSN++0/d -fYGVhogxjlRoyaXa4sdFPg2ocM+lCHLGhWpYuVdTWPknikTOVNbh9z94SLRfrP8N -kuxGNZNktnVm+QJmrCLmjvnPvQlcP/WqFYehFM26NaRzswOhLLRU1YK8aVlh9Vto -PGSTPtZK60XwTfyCj/zEvHqpbGbKJPp7W0rpxl7ehPQIzGQt5IMH3zKrqLm4/pt+ -XFEVqy724sstthS73bvXguWxBLOzuMze8CbI6SJpcHaH8HO5pfFMPyE5N5l2x9Co -uQIDAQABo1MwUTAdBgNVHQ4EFgQUjLATTt1BgbXjGTk6uXwzxtmj8fAwHwYDVR0j -BBgwFoAUjLATTt1BgbXjGTk6uXwzxtmj8fAwDwYDVR0TAQH/BAUwAwEB/zANBgkq -hkiG9w0BAQsFAAOCAQEAL9/7YtxIbuTt7dgH1KOMb/y6P3Qb79fTVZTx073E2ZBj -OfSuMGUhKC30LWQXCQEsY4WpugJ4cS0NsArSYsO5XWguqgjYlWL6poOmYhGvj7ou -oi44oYqcPm6EbvLrAKdI67bkbSPLzgs+6TrxTyXHzPKFBqGBnuHaFKjgb4hGiPmd -JWKrh3fbTtuLjqSHd0Gey2uBNFql4LhPutdsCUhSOD3BibAeTbXyln70AgpTCoWT -9Qr9Ux6HYIiAHSDBzzuN8EcrlnAm9RO4zRyUVwxDsHoNsOUwybn50IM66p83HuiY -h/iX5uNjaFAADfRR4rQOwb6MLreVH2XYUSiz4M/ijg== ------END CERTIFICATE----- diff --git a/acceptance-tests/tests/src/test/resources/pki-certs/validator3/truststore.jks b/acceptance-tests/tests/src/test/resources/pki-certs/validator3/truststore.jks deleted file mode 100644 index 7acd9015b86e4783c78910745adfd67669b33948..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3135 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 E04*k+`2YX_ diff --git a/acceptance-tests/tests/src/test/resources/pki-certs/validator4/keystore.jks b/acceptance-tests/tests/src/test/resources/pki-certs/validator4/keystore.jks deleted file mode 100644 index ef941f664e3204b1e88dd30ae9700ad9a78723bc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6783 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 NY(1`phJgyp`wtkv+35fP diff --git a/acceptance-tests/tests/src/test/resources/pki-certs/validator4/nss.cfg b/acceptance-tests/tests/src/test/resources/pki-certs/validator4/nss.cfg deleted file mode 100644 index c114f78b0..000000000 --- a/acceptance-tests/tests/src/test/resources/pki-certs/validator4/nss.cfg +++ /dev/null @@ -1,6 +0,0 @@ - -name = NSScrypto-validator4 -nssSecmodDirectory = ./src/test/resources/pki-certs/validator4/nssdb -nssDbMode = readOnly -nssModule = keystore - diff --git a/acceptance-tests/tests/src/test/resources/pki-certs/validator4/nssdb/cert8.db b/acceptance-tests/tests/src/test/resources/pki-certs/validator4/nssdb/cert8.db deleted file mode 100644 index 7c94b589ac7f804ea94a3acc1ff7f6ba5fbbd512..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 65536 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 diff --git a/acceptance-tests/tests/src/test/resources/pki-certs/validator4/nssdb/key3.db b/acceptance-tests/tests/src/test/resources/pki-certs/validator4/nssdb/key3.db deleted file mode 100644 index 0b60173dbf93ac79ab3e94a15e363711706b2d58..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16384 zcmeI$XHe7G769;n2)zXnLL%h>x&%cq6om+)Axjk$3*GFahiD)YLRE^0Qdim%42S|E z(i9NIAi|1*1dv`9gG&cP2Vp59_{8@^9ddMmUm+3&d&PbA^7iket2Kd z5C{MPAOHk_01yBIKmZ5;0U!VbfWY5HKoHtMtRtoom55?QIwD;>Q7Bj_QRpiOAOHk_ z01yBIKmZ5;fgd9PheQHgC}ejRI+dmaVIz50v8wzc2X30(ToZ$d^1orzIr#6c84r6# zHG@Z=SLjaFsO?@R?S6OJ`j##!(7~qu4%iN z>#QX()%RatlWf!!s;EB2ERyh>U$Q9?6P`1@cpjC?!31dJKWU2Q39xIJMuf@!D|D??WvrFbp@vbddxK@-wJF!t zB&mJ0@cE|)Z57!{w>;7g z&L;e`8@6HZSVFXCb{HxKLt+HXBTUJ9#ZZq;u4JnW4rwG6epR;DxjxrC`VFP>)`oC!5&eNd~C=!Fr((;g^9G9O{8X!z4yNUo}t#IUS!3g z$mY*&f6P;l*`-7^JPw%Lc0HYuDI261;`G<)Sk^G^_5B$2;U2X~9B*84JT~dK#pv)2 zn#F}I@_J6eG`qJ;f}RaSySA`~9rk5kYjg_9zkS$5PKT$6LbP7kE59}%XFZ=FpwKl- z8V*)`{*db5?74_*X?!mowt1q@y@A1H6v`VnGRrX>@KURZGc2s?-@2esp z(w|Lb$QMOLDHNobU!~F_I$gQ_#Ht$+EmhpR4`%qv6wOr00@8{p+l6g%nVIT$!&ftO zR92Jr)GauCE$G>1O>6AF#~Q-OJ0039w>I?xuT**DWXC(ziJbPtvl-8$Vn0hH4DF2= zTfe1yvu@7`1FWIBDC0|0J^f{W%rx{eJ*4)Vtvnp6UgRDt{o>oW($Hod$I+as+d!3DwpYolMU-?GtI3i? zjoUS`I?1&s(IUGtqpGuJ4RVtN(b?%w$s`m+W)e7OT?4#E91)p-TcK+Xf|_L&=uBE5p0>Lyhu>jqf08)N!^{T zJ?q0Ca~CzHR`?7V@9_(UM4`I6P}KcgD0H|KOp-G|n8X`iy4Ev2w#7c@)jY9l2Kw)p z!pD95<1`wkf00e*l5C8%|00;m9AOHk_01)^;3j7OA CEQufh diff --git a/acceptance-tests/tests/src/test/resources/pki-certs/validator4/nssdb/secmod.db b/acceptance-tests/tests/src/test/resources/pki-certs/validator4/nssdb/secmod.db deleted file mode 100644 index 346dc33e6916bb2023054dc994582c9fa3527709..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16384 zcmeI&O-jQ+6u|LkmD+_=H||6RTx8c$a3y3_H&T>By+E2wOK6&uB$c}G816lXxb6YG zf*wPulT1a6=&}^~4?O1U<;~1*9jP9AB2p3Ac@{Y^L)jDAGF=f;TMo>Axv*XK<(5sl zkMCa0TG5J}BG%q&_C9Mrmje+%009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{ z1Q6I1fr`BD&+AY1d3{rE#61u|009ILKmY**5I_I{1Q7UDpejnooQv)$O!<>ZH|Dmq{>NIMv*;;ykX|5>BJP#WqoHkX|L3=37zlN z>{4jzeSUJCjC6diGd~R{d6>k-j{Oh+VRzx0cO0Ae(f)e-`+|l50tg_000IagfB*sr LAb?c5GZ@U+#vY=g<;nCLPa{SMkth3BuBgV$h{D*SjEb=)%Z)5$DY6W* zMA>P3lG3C{LLstcH+sgF?HS6G+wGq2IrpB^AHVbceLwH-Ils?&|Gw|n_q#NIzovA2n6trD0IIF;jqTwKvlNV1=3*cAPxHH1`G;7p~61GdP-GOD$V+fO@~dr z%fjnl9~}izoZLG?^h0J)0Km%u0sXMNAU7w>3eJg!T3M`35J;$w78VKetSDSan1!Cn zn#6;I8tGtBAn%IAi-dbnC|+0*5WO;mA(1OnA^}4nxj4CEH-gfCe~lXu75FUfTNN=x ziVG+!hEl?Udq7pJDi({|Z6nUFgk=|$vA8dVpWGh}*tFg-fCB=f0sIh<2Jk>>003!| z%zQG`t((viWpH?S_^ENC^77nF`QvKI)U&_Y)W%hka8&#7ln0^H{F z%eeFokfgr*5IDsdT}C9t%ecPwAis-6Bp zm^$LPmlUhfa&SbKX|zC#UiiJ*H^I`vSSTl=A2mODQ{lC9}e`Nt0 z0G8n#AdEe%x1GID*|r0aU0w6`9r~_)V`FVx%{L<`3zeE)8zx#`SzVcYRrC9se-c$$ z1t3{&n<7h*B*qQwBnIbHLeID>qKbH$>>pLwIbw1VZE^OWvI4X01q-7qG3gkUwD4pN z*C5xABam$UkIa`z%)Jc64`1ISGng1Un=sHzbToyaSY|zU_#V_o zV9Me)lH1I-m2@}uM6D*D$Bp3OG#gkdhRUNMUP%n2HA;L&2>j=c!qe!r(Tn$A<`0|xOywI*`}Gpj}yg>o)9YI`1< zQ1uUeJ71tFo@(rGzr!z5Of?N%Wx*L7>!Vqm)YagSbG|<-b~%m-t9i3;VOI>%#k#Fm z;jHgoD}z%<;-$<|qGaBs79Bdkol`$*mUyX1t>xGsopG(rA{1#FxwuYs1H{0@duw3c z&Y=3VU}}#==+b^c;UpXL{glS}{pOJz9@*Y4LOaD|#zgts=69&b6j#r0bqY2{Fa+WF zI0Su9mUez6a>!xQno+`#r>VV?*$z}i)fUNE+Y5o;1z}bgd$TypJ z6$|oRc%RPdM?z6dOzj~9K9k#}x^<}7w_9fPIv@$e5l~LxgZM0<#nkMRW&e3AVX(zXtUDb$7zTzvI(0W4+Ad<$W| zPtBPb<4Rhz4;OL87n|5~J`YY{81W5{ALyQZuG|>NBbS_pFXU~%ih8^|VO(}dmwJ!U zmWKddi4eK3|FL5mx9B8#yamO@Pwi2h5%5C4Pr6or{NgO6t@E-|2`ZvFu-_Sh$zhV* z%KQuwEjR(`Vv4J?lfJw1snHTL^~^5M${@|~8%>yqQFS~5pU;ub-TWt7zTP7!eq)ORi!1sqX-M=f`fA9_Bk@jt#Sn&sjufHsa`c8J-fOGHRW5 z$DI~aD7zwql9G*7$b)r>!_1Bw2m5t``P<3A4M6)E*KiBeWqvqT1hrjjHl@_e*4 zT>NXvx;P?3w?qiqH^+6`l5Z-cZsxQj)~+(06;>pbuW}s>L3Db|W(bE}sa^2qROz?> zG;%aZ>}+T-rLD)9UpZf2OntA8U(NJ(0;5~%lJ&&k4J#R0UeX`Bcf&ecwG(EpWs5b_ j6U84I&I_ allocatedPorts = new HashSet<>(); - private final PkiBlockCreationConfigurationProvider pkiBlockCreationConfigProvider; private final Supplier genesisConfigFileSupplier = Suppliers.memoize(this::readGenesisConfigFile); private final Supplier genesisConfigOptionsSupplier = @@ -906,8 +902,6 @@ public class BesuCommand implements DefaultCommandValues, Runnable { @Mixin private P2PTLSConfigOptions p2pTLSConfigOptions; - @Mixin private PkiBlockCreationOptions pkiBlockCreationOptions; - // Plugins Configuration Option Group @CommandLine.ArgGroup(validate = false) PluginsConfigurationOptions pluginsConfigurationOptions = new PluginsConfigurationOptions(); @@ -972,7 +966,6 @@ public class BesuCommand implements DefaultCommandValues, Runnable { new SecurityModuleServiceImpl(), new PermissioningServiceImpl(), new PrivacyPluginServiceImpl(), - new PkiBlockCreationConfigurationProvider(), new RpcEndpointServiceImpl(), new TransactionSelectionServiceImpl(), new TransactionPoolValidatorServiceImpl(), @@ -995,7 +988,6 @@ public class BesuCommand implements DefaultCommandValues, Runnable { * @param securityModuleService instance of SecurityModuleServiceImpl * @param permissioningService instance of PermissioningServiceImpl * @param privacyPluginService instance of PrivacyPluginServiceImpl - * @param pkiBlockCreationConfigProvider instance of PkiBlockCreationConfigurationProvider * @param rpcEndpointServiceImpl instance of RpcEndpointServiceImpl * @param transactionSelectionServiceImpl instance of TransactionSelectionServiceImpl * @param transactionValidatorServiceImpl instance of TransactionValidatorServiceImpl @@ -1016,7 +1008,6 @@ public class BesuCommand implements DefaultCommandValues, Runnable { final SecurityModuleServiceImpl securityModuleService, final PermissioningServiceImpl permissioningService, final PrivacyPluginServiceImpl privacyPluginService, - final PkiBlockCreationConfigurationProvider pkiBlockCreationConfigProvider, final RpcEndpointServiceImpl rpcEndpointServiceImpl, final TransactionSelectionServiceImpl transactionSelectionServiceImpl, final TransactionPoolValidatorServiceImpl transactionValidatorServiceImpl, @@ -1037,7 +1028,6 @@ public class BesuCommand implements DefaultCommandValues, Runnable { this.privacyPluginService = privacyPluginService; this.pluginCommonConfiguration = new BesuConfigurationImpl(); besuPluginContext.addService(BesuConfiguration.class, pluginCommonConfiguration); - this.pkiBlockCreationConfigProvider = pkiBlockCreationConfigProvider; this.rpcEndpointServiceImpl = rpcEndpointServiceImpl; this.transactionSelectionServiceImpl = transactionSelectionServiceImpl; this.transactionValidatorServiceImpl = transactionValidatorServiceImpl; @@ -1556,7 +1546,6 @@ public class BesuCommand implements DefaultCommandValues, Runnable { validateApiOptions(); validateConsensusSyncCompatibilityOptions(); p2pTLSConfigOptions.checkP2PTLSOptionsDependencies(logger, commandLine); - pkiBlockCreationOptions.checkPkiBlockCreationOptionsDependencies(logger, commandLine); } private void validateConsensusSyncCompatibilityOptions() { @@ -1910,7 +1899,6 @@ public class BesuCommand implements DefaultCommandValues, Runnable { .metricsSystem(metricsSystem.get()) .messagePermissioningProviders(permissioningService.getMessagePermissioningProviders()) .privacyParameters(privacyParameters()) - .pkiBlockCreationConfiguration(maybePkiBlockCreationConfiguration()) .clock(Clock.systemUTC()) .isRevertReasonEnabled(isRevertReasonEnabled) .storageProvider(storageProvider) @@ -2182,12 +2170,6 @@ public class BesuCommand implements DefaultCommandValues, Runnable { return keyValueStorageProvider(keyValueStorageName); } - private Optional maybePkiBlockCreationConfiguration() { - return pkiBlockCreationOptions - .asDomainConfig(commandLine) - .map(pkiBlockCreationConfigProvider::load); - } - private SynchronizerConfiguration buildSyncConfig() { return unstableSynchronizerOptions .toDomainObject() diff --git a/besu/src/main/java/org/hyperledger/besu/cli/options/unstable/PkiBlockCreationOptions.java b/besu/src/main/java/org/hyperledger/besu/cli/options/unstable/PkiBlockCreationOptions.java deleted file mode 100644 index 64fe8effb..000000000 --- a/besu/src/main/java/org/hyperledger/besu/cli/options/unstable/PkiBlockCreationOptions.java +++ /dev/null @@ -1,164 +0,0 @@ -/* - * Copyright ConsenSys AG. - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on - * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the - * specific language governing permissions and limitations under the License. - * - * SPDX-License-Identifier: Apache-2.0 - */ -package org.hyperledger.besu.cli.options.unstable; - -import static java.util.Arrays.asList; -import static org.hyperledger.besu.cli.DefaultCommandValues.MANDATORY_FILE_FORMAT_HELP; - -import org.hyperledger.besu.cli.util.CommandLineUtils; -import org.hyperledger.besu.pki.config.PkiKeyStoreConfiguration; - -import java.nio.file.Path; -import java.util.Optional; - -import org.slf4j.Logger; -import picocli.CommandLine; -import picocli.CommandLine.Option; -import picocli.CommandLine.ParameterException; - -/** The Pki block creation Cli options. */ -public class PkiBlockCreationOptions { - - /** The pki block creation enabled. */ - @Option( - names = {"--Xpki-block-creation-enabled"}, - hidden = true, - description = "Enable PKI integration (default: ${DEFAULT-VALUE})") - Boolean enabled = false; - - /** The Key store type. */ - @Option( - names = {"--Xpki-block-creation-keystore-type"}, - hidden = true, - paramLabel = "", - description = "PKI service keystore type. Required if PKI Block Creation is enabled.") - @SuppressWarnings({"FieldCanBeFinal", "FieldMayBeFinal"}) - String keyStoreType = PkiKeyStoreConfiguration.DEFAULT_KEYSTORE_TYPE; - - /** The Key store file. */ - @Option( - names = {"--Xpki-block-creation-keystore-file"}, - hidden = true, - paramLabel = MANDATORY_FILE_FORMAT_HELP, - description = "Keystore containing key/certificate for PKI Block Creation.") - Path keyStoreFile = null; - - /** The Key store password file. */ - @Option( - names = {"--Xpki-block-creation-keystore-password-file"}, - hidden = true, - paramLabel = MANDATORY_FILE_FORMAT_HELP, - description = - "File containing password to unlock keystore for PKI Integration. Required if PKI Block Creation is enabled.") - Path keyStorePasswordFile = null; - - /** The Certificate alias. */ - @Option( - names = {"--Xpki-block-creation-keystore-certificate-alias"}, - hidden = true, - paramLabel = "", - description = - "Alias of the certificate that will be included in the blocks proposed by this validator.") - @SuppressWarnings({"FieldCanBeFinal", "FieldMayBeFinal"}) - String certificateAlias = PkiKeyStoreConfiguration.DEFAULT_CERTIFICATE_ALIAS; - - /** The Trust store type. */ - @Option( - names = {"--Xpki-block-creation-truststore-type"}, - hidden = true, - paramLabel = "", - description = "PKI Integration truststore type.") - @SuppressWarnings({"FieldCanBeFinal", "FieldMayBeFinal"}) - String trustStoreType = PkiKeyStoreConfiguration.DEFAULT_KEYSTORE_TYPE; - - /** The Trust store file. */ - @Option( - names = {"--Xpki-block-creation-truststore-file"}, - hidden = true, - paramLabel = MANDATORY_FILE_FORMAT_HELP, - description = "Truststore containing trusted certificates for PKI Block Creation.") - Path trustStoreFile = null; - - /** The Trust store password file. */ - @Option( - names = {"--Xpki-block-creation-truststore-password-file"}, - hidden = true, - paramLabel = MANDATORY_FILE_FORMAT_HELP, - description = "File containing password to unlock truststore for PKI Block Creation.") - Path trustStorePasswordFile = null; - - /** The Crl file. */ - @Option( - names = {"--Xpki-block-creation-crl-file"}, - hidden = true, - paramLabel = MANDATORY_FILE_FORMAT_HELP, - description = "File with all CRLs for PKI Block Creation.") - Path crlFile = null; - - /** Default Constructor. */ - PkiBlockCreationOptions() {} - - /** - * As domain config optional. - * - * @param commandLine the command line - * @return the optional - */ - public Optional asDomainConfig(final CommandLine commandLine) { - if (!enabled) { - return Optional.empty(); - } - - if (keyStoreFile == null) { - throw new ParameterException( - commandLine, "KeyStore file is required when PKI Block Creation is enabled"); - } - - if (keyStorePasswordFile == null) { - throw new ParameterException( - commandLine, - "File containing password to unlock keystore is required when PKI Block Creation is enabled"); - } - - return Optional.of( - new PkiKeyStoreConfiguration.Builder() - .withKeyStoreType(keyStoreType) - .withKeyStorePath(keyStoreFile) - .withKeyStorePasswordPath(keyStorePasswordFile) - .withCertificateAlias(certificateAlias) - .withTrustStoreType(trustStoreType) - .withTrustStorePath(trustStoreFile) - .withTrustStorePasswordPath(trustStorePasswordFile) - .withCrlFilePath(crlFile) - .build()); - } - - /** - * Check pki block creation options dependencies. - * - * @param logger the logger - * @param commandLine the command line - */ - public void checkPkiBlockCreationOptionsDependencies( - final Logger logger, final CommandLine commandLine) { - CommandLineUtils.checkOptionDependencies( - logger, - commandLine, - "--Xpki-block-creation-enabled", - !enabled, - asList( - "--Xpki-block-creation-keystore-file", "--Xpki-block-creation-keystore-password-file")); - } -} diff --git a/besu/src/main/java/org/hyperledger/besu/controller/BesuControllerBuilder.java b/besu/src/main/java/org/hyperledger/besu/controller/BesuControllerBuilder.java index 73bc76608..8f26909a5 100644 --- a/besu/src/main/java/org/hyperledger/besu/controller/BesuControllerBuilder.java +++ b/besu/src/main/java/org/hyperledger/besu/controller/BesuControllerBuilder.java @@ -23,7 +23,6 @@ import org.hyperledger.besu.config.GenesisConfigOptions; import org.hyperledger.besu.consensus.merge.MergeContext; import org.hyperledger.besu.consensus.merge.UnverifiedForkchoiceSupplier; import org.hyperledger.besu.consensus.qbft.BFTPivotSelectorFromPeers; -import org.hyperledger.besu.consensus.qbft.pki.PkiBlockCreationConfiguration; import org.hyperledger.besu.cryptoservices.NodeKey; import org.hyperledger.besu.datatypes.Hash; import org.hyperledger.besu.ethereum.ConsensusContext; @@ -150,10 +149,6 @@ public abstract class BesuControllerBuilder implements MiningParameterOverrides /** The Privacy parameters. */ protected PrivacyParameters privacyParameters; - /** The Pki block creation configuration. */ - protected Optional pkiBlockCreationConfiguration = - Optional.empty(); - /** The Data directory. */ protected Path dataDirectory; @@ -348,18 +343,6 @@ public abstract class BesuControllerBuilder implements MiningParameterOverrides return this; } - /** - * Pki block creation configuration besu controller builder. - * - * @param pkiBlockCreationConfiguration the pki block creation configuration - * @return the besu controller builder - */ - public BesuControllerBuilder pkiBlockCreationConfiguration( - final Optional pkiBlockCreationConfiguration) { - this.pkiBlockCreationConfiguration = pkiBlockCreationConfiguration; - return this; - } - /** * Data directory besu controller builder. * diff --git a/besu/src/main/java/org/hyperledger/besu/controller/ConsensusScheduleBesuControllerBuilder.java b/besu/src/main/java/org/hyperledger/besu/controller/ConsensusScheduleBesuControllerBuilder.java index af59a7625..f66933220 100644 --- a/besu/src/main/java/org/hyperledger/besu/controller/ConsensusScheduleBesuControllerBuilder.java +++ b/besu/src/main/java/org/hyperledger/besu/controller/ConsensusScheduleBesuControllerBuilder.java @@ -23,7 +23,6 @@ import org.hyperledger.besu.consensus.common.ForksSchedule; import org.hyperledger.besu.consensus.common.MigratingContext; import org.hyperledger.besu.consensus.common.MigratingMiningCoordinator; import org.hyperledger.besu.consensus.common.MigratingProtocolContext; -import org.hyperledger.besu.consensus.qbft.pki.PkiBlockCreationConfiguration; import org.hyperledger.besu.cryptoservices.NodeKey; import org.hyperledger.besu.datatypes.Hash; import org.hyperledger.besu.ethereum.ConsensusContext; @@ -330,15 +329,6 @@ public class ConsensusScheduleBesuControllerBuilder extends BesuControllerBuilde return super.privacyParameters(privacyParameters); } - @Override - public BesuControllerBuilder pkiBlockCreationConfiguration( - final Optional pkiBlockCreationConfiguration) { - besuControllerBuilderSchedule - .values() - .forEach(b -> b.pkiBlockCreationConfiguration(pkiBlockCreationConfiguration)); - return super.pkiBlockCreationConfiguration(pkiBlockCreationConfiguration); - } - @Override public BesuControllerBuilder dataDirectory(final Path dataDirectory) { besuControllerBuilderSchedule.values().forEach(b -> b.dataDirectory(dataDirectory)); diff --git a/besu/src/main/java/org/hyperledger/besu/controller/QbftBesuControllerBuilder.java b/besu/src/main/java/org/hyperledger/besu/controller/QbftBesuControllerBuilder.java index 030173acb..4a5f592e2 100644 --- a/besu/src/main/java/org/hyperledger/besu/controller/QbftBesuControllerBuilder.java +++ b/besu/src/main/java/org/hyperledger/besu/controller/QbftBesuControllerBuilder.java @@ -52,7 +52,6 @@ import org.hyperledger.besu.consensus.qbft.QbftProtocolScheduleBuilder; import org.hyperledger.besu.consensus.qbft.blockcreation.QbftBlockCreatorFactory; import org.hyperledger.besu.consensus.qbft.jsonrpc.QbftJsonRpcMethods; import org.hyperledger.besu.consensus.qbft.payload.MessageFactory; -import org.hyperledger.besu.consensus.qbft.pki.PkiQbftExtraDataCodec; import org.hyperledger.besu.consensus.qbft.protocol.Istanbul100SubProtocol; import org.hyperledger.besu.consensus.qbft.statemachine.QbftBlockHeightManagerFactory; import org.hyperledger.besu.consensus.qbft.statemachine.QbftController; @@ -113,11 +112,7 @@ public class QbftBesuControllerBuilder extends BftBesuControllerBuilder { protected Supplier bftExtraDataCodec() { return Suppliers.memoize( () -> { - if (pkiBlockCreationConfiguration.isPresent()) { - return new PkiQbftExtraDataCodec(); - } else { - return new QbftExtraDataCodec(); - } + return new QbftExtraDataCodec(); }); } @@ -393,8 +388,7 @@ public class QbftBesuControllerBuilder extends BftBesuControllerBuilder { new ForkingValidatorProvider( blockchain, qbftForksSchedule, blockValidatorProvider, transactionValidatorProvider); - return new QbftContext( - validatorProvider, epochManager, bftBlockInterface().get(), pkiBlockCreationConfiguration); + return new QbftContext(validatorProvider, epochManager, bftBlockInterface().get()); } private BftValidatorOverrides convertBftForks(final List bftForks) { diff --git a/besu/src/main/java/org/hyperledger/besu/controller/TransitionBesuControllerBuilder.java b/besu/src/main/java/org/hyperledger/besu/controller/TransitionBesuControllerBuilder.java index 4f084f3c1..cdf5413ff 100644 --- a/besu/src/main/java/org/hyperledger/besu/controller/TransitionBesuControllerBuilder.java +++ b/besu/src/main/java/org/hyperledger/besu/controller/TransitionBesuControllerBuilder.java @@ -21,7 +21,6 @@ import org.hyperledger.besu.consensus.merge.TransitionBackwardSyncContext; import org.hyperledger.besu.consensus.merge.TransitionContext; import org.hyperledger.besu.consensus.merge.TransitionProtocolSchedule; import org.hyperledger.besu.consensus.merge.blockcreation.TransitionCoordinator; -import org.hyperledger.besu.consensus.qbft.pki.PkiBlockCreationConfiguration; import org.hyperledger.besu.cryptoservices.NodeKey; import org.hyperledger.besu.datatypes.Hash; import org.hyperledger.besu.ethereum.ConsensusContext; @@ -350,13 +349,6 @@ public class TransitionBesuControllerBuilder extends BesuControllerBuilder { return propagateConfig(z -> z.privacyParameters(privacyParameters)); } - @Override - public BesuControllerBuilder pkiBlockCreationConfiguration( - final Optional pkiBlockCreationConfiguration) { - super.pkiBlockCreationConfiguration(pkiBlockCreationConfiguration); - return propagateConfig(z -> z.pkiBlockCreationConfiguration(pkiBlockCreationConfiguration)); - } - @Override public BesuControllerBuilder dataDirectory(final Path dataDirectory) { super.dataDirectory(dataDirectory); diff --git a/besu/src/test/java/org/hyperledger/besu/cli/CommandTestAbstract.java b/besu/src/test/java/org/hyperledger/besu/cli/CommandTestAbstract.java index f620c729b..c92a3a5bd 100644 --- a/besu/src/test/java/org/hyperledger/besu/cli/CommandTestAbstract.java +++ b/besu/src/test/java/org/hyperledger/besu/cli/CommandTestAbstract.java @@ -45,8 +45,6 @@ import org.hyperledger.besu.cli.options.unstable.NetworkingOptions; import org.hyperledger.besu.cli.options.unstable.SynchronizerOptions; import org.hyperledger.besu.components.BesuComponent; import org.hyperledger.besu.config.GenesisConfigOptions; -import org.hyperledger.besu.consensus.qbft.pki.PkiBlockCreationConfiguration; -import org.hyperledger.besu.consensus.qbft.pki.PkiBlockCreationConfigurationProvider; import org.hyperledger.besu.controller.BesuController; import org.hyperledger.besu.controller.BesuControllerBuilder; import org.hyperledger.besu.controller.NoopPluginServiceFactory; @@ -74,7 +72,6 @@ import org.hyperledger.besu.ethereum.storage.StorageProvider; import org.hyperledger.besu.ethereum.worldstate.DataStorageConfiguration; import org.hyperledger.besu.ethereum.worldstate.WorldStateArchive; import org.hyperledger.besu.metrics.prometheus.MetricsConfiguration; -import org.hyperledger.besu.pki.config.PkiKeyStoreConfiguration; import org.hyperledger.besu.plugin.services.PicoCLIOptions; import org.hyperledger.besu.plugin.services.StorageService; import org.hyperledger.besu.plugin.services.TransactionSelectionService; @@ -235,9 +232,6 @@ public abstract class CommandTestAbstract { @Mock(lenient = true) protected BesuComponent mockBesuComponent; - @Mock protected PkiBlockCreationConfigurationProvider mockPkiBlockCreationConfigProvider; - @Mock protected PkiBlockCreationConfiguration mockPkiBlockCreationConfiguration; - @Captor protected ArgumentCaptor> bytesCollectionCollector; @Captor protected ArgumentCaptor pathArgumentCaptor; @Captor protected ArgumentCaptor stringArgumentCaptor; @@ -252,7 +246,6 @@ public abstract class CommandTestAbstract { @Captor protected ArgumentCaptor storageProviderArgumentCaptor; @Captor protected ArgumentCaptor ethProtocolConfigurationArgumentCaptor; @Captor protected ArgumentCaptor dataStorageConfigurationArgumentCaptor; - @Captor protected ArgumentCaptor pkiKeyStoreConfigurationArgumentCaptor; @Captor protected ArgumentCaptor> @@ -281,8 +274,6 @@ public abstract class CommandTestAbstract { when(mockControllerBuilder.messagePermissioningProviders(any())) .thenReturn(mockControllerBuilder); when(mockControllerBuilder.privacyParameters(any())).thenReturn(mockControllerBuilder); - when(mockControllerBuilder.pkiBlockCreationConfiguration(any())) - .thenReturn(mockControllerBuilder); when(mockControllerBuilder.clock(any())).thenReturn(mockControllerBuilder); when(mockControllerBuilder.isRevertReasonEnabled(false)).thenReturn(mockControllerBuilder); when(mockControllerBuilder.storageProvider(any())).thenReturn(mockControllerBuilder); @@ -390,10 +381,6 @@ public abstract class CommandTestAbstract { .when(mockBesuPluginContext.getService(TransactionSelectionService.class)) .thenReturn(Optional.of(txSelectionService)); - lenient() - .doReturn(mockPkiBlockCreationConfiguration) - .when(mockPkiBlockCreationConfigProvider) - .load(pkiKeyStoreConfigurationArgumentCaptor.capture()); when(mockBesuComponent.getBesuCommandLogger()).thenReturn(mockLogger); } @@ -489,7 +476,6 @@ public abstract class CommandTestAbstract { environment, storageService, securityModuleService, - mockPkiBlockCreationConfigProvider, privacyPluginService); case PORT_CHECK: return new TestBesuCommand( @@ -503,7 +489,6 @@ public abstract class CommandTestAbstract { environment, storageService, securityModuleService, - mockPkiBlockCreationConfigProvider, privacyPluginService); default: return new TestBesuCommandWithoutPortCheck( @@ -517,7 +502,6 @@ public abstract class CommandTestAbstract { environment, storageService, securityModuleService, - mockPkiBlockCreationConfigProvider, privacyPluginService); } } @@ -558,7 +542,6 @@ public abstract class CommandTestAbstract { final Map environment, final StorageServiceImpl storageService, final SecurityModuleServiceImpl securityModuleService, - final PkiBlockCreationConfigurationProvider pkiBlockCreationConfigProvider, final PrivacyPluginServiceImpl privacyPluginService) { super( besuComponent, @@ -573,7 +556,6 @@ public abstract class CommandTestAbstract { securityModuleService, new PermissioningServiceImpl(), privacyPluginService, - pkiBlockCreationConfigProvider, rpcEndpointServiceImpl, new TransactionSelectionServiceImpl(), new TransactionPoolValidatorServiceImpl(), @@ -659,7 +641,6 @@ public abstract class CommandTestAbstract { final Map environment, final StorageServiceImpl storageService, final SecurityModuleServiceImpl securityModuleService, - final PkiBlockCreationConfigurationProvider pkiBlockCreationConfigProvider, final PrivacyPluginServiceImpl privacyPluginService) { super( besuComponent, @@ -672,7 +653,6 @@ public abstract class CommandTestAbstract { environment, storageService, securityModuleService, - pkiBlockCreationConfigProvider, privacyPluginService); } @@ -695,7 +675,6 @@ public abstract class CommandTestAbstract { final Map environment, final StorageServiceImpl storageService, final SecurityModuleServiceImpl securityModuleService, - final PkiBlockCreationConfigurationProvider pkiBlockCreationConfigProvider, final PrivacyPluginServiceImpl privacyPluginService) { super( context, @@ -708,7 +687,6 @@ public abstract class CommandTestAbstract { environment, storageService, securityModuleService, - pkiBlockCreationConfigProvider, privacyPluginService); } diff --git a/besu/src/test/java/org/hyperledger/besu/cli/PkiOptionsTest.java b/besu/src/test/java/org/hyperledger/besu/cli/PkiOptionsTest.java deleted file mode 100644 index 12da66342..000000000 --- a/besu/src/test/java/org/hyperledger/besu/cli/PkiOptionsTest.java +++ /dev/null @@ -1,98 +0,0 @@ -/* - * Copyright contributors to Hyperledger Besu. - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on - * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the - * specific language governing permissions and limitations under the License. - * - * SPDX-License-Identifier: Apache-2.0 - */ -package org.hyperledger.besu.cli; - -import static java.nio.charset.StandardCharsets.UTF_8; -import static org.assertj.core.api.Assertions.assertThat; -import static org.mockito.Mockito.verifyNoInteractions; - -import org.hyperledger.besu.pki.config.PkiKeyStoreConfiguration; - -import java.io.File; -import java.nio.file.Path; - -import org.apache.commons.io.FileUtils; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.io.TempDir; - -public class PkiOptionsTest extends CommandTestAbstract { - - @Test - public void pkiBlockCreationIsDisabledByDefault() { - parseCommand(); - - verifyNoInteractions(mockPkiBlockCreationConfigProvider); - } - - @Test - public void pkiBlockCreationKeyStoreFileRequired() { - parseCommand( - "--Xpki-block-creation-enabled", - "--Xpki-block-creation-keystore-password-file", - "/tmp/pwd"); - - assertThat(commandErrorOutput.toString(UTF_8)) - .contains("KeyStore file is required when PKI Block Creation is enabled"); - } - - @Test - public void pkiBlockCreationPasswordFileRequired() { - parseCommand( - "--Xpki-block-creation-enabled", "--Xpki-block-creation-keystore-file", "/tmp/keystore"); - - assertThat(commandErrorOutput.toString(UTF_8)) - .contains( - "File containing password to unlock keystore is required when PKI Block Creation is enabled"); - } - - @Test - public void pkiBlockCreationFullConfig(final @TempDir Path pkiTempFolder) throws Exception { - // Create temp file with password - final File pwdFile = pkiTempFolder.resolve("pwd").toFile(); - FileUtils.writeStringToFile(pwdFile, "foo", UTF_8); - - parseCommand( - "--Xpki-block-creation-enabled", - "--Xpki-block-creation-keystore-type", - "JKS", - "--Xpki-block-creation-keystore-file", - "/tmp/keystore", - "--Xpki-block-creation-keystore-password-file", - pwdFile.getAbsolutePath(), - "--Xpki-block-creation-keystore-certificate-alias", - "anAlias", - "--Xpki-block-creation-truststore-type", - "JKS", - "--Xpki-block-creation-truststore-file", - "/tmp/truststore", - "--Xpki-block-creation-truststore-password-file", - pwdFile.getAbsolutePath(), - "--Xpki-block-creation-crl-file", - "/tmp/crl"); - - final PkiKeyStoreConfiguration pkiKeyStoreConfig = - pkiKeyStoreConfigurationArgumentCaptor.getValue(); - - assertThat(pkiKeyStoreConfig).isNotNull(); - assertThat(pkiKeyStoreConfig.getKeyStoreType()).isEqualTo("JKS"); - assertThat(pkiKeyStoreConfig.getKeyStorePath()).isEqualTo(Path.of("/tmp/keystore")); - assertThat(pkiKeyStoreConfig.getKeyStorePassword()).isEqualTo("foo"); - assertThat(pkiKeyStoreConfig.getCertificateAlias()).isEqualTo("anAlias"); - assertThat(pkiKeyStoreConfig.getTrustStoreType()).isEqualTo("JKS"); - assertThat(pkiKeyStoreConfig.getTrustStorePath()).isEqualTo(Path.of("/tmp/truststore")); - assertThat(pkiKeyStoreConfig.getTrustStorePassword()).isEqualTo("foo"); - assertThat(pkiKeyStoreConfig.getCrlFilePath()).hasValue(Path.of("/tmp/crl")); - } -} diff --git a/consensus/qbft/src/integration-test/java/org/hyperledger/besu/consensus/qbft/support/TestContextBuilder.java b/consensus/qbft/src/integration-test/java/org/hyperledger/besu/consensus/qbft/support/TestContextBuilder.java index 7a014986a..48b6daad0 100644 --- a/consensus/qbft/src/integration-test/java/org/hyperledger/besu/consensus/qbft/support/TestContextBuilder.java +++ b/consensus/qbft/src/integration-test/java/org/hyperledger/besu/consensus/qbft/support/TestContextBuilder.java @@ -458,7 +458,7 @@ public class TestContextBuilder { new ProtocolContext( blockChain, worldStateArchive, - new QbftContext(validatorProvider, epochManager, blockInterface, Optional.empty()), + new QbftContext(validatorProvider, epochManager, blockInterface), new BadBlockManager()); final TransactionPoolConfiguration poolConf = diff --git a/consensus/qbft/src/main/java/org/hyperledger/besu/consensus/qbft/QbftContext.java b/consensus/qbft/src/main/java/org/hyperledger/besu/consensus/qbft/QbftContext.java index f89f4990b..68e8b7f1a 100644 --- a/consensus/qbft/src/main/java/org/hyperledger/besu/consensus/qbft/QbftContext.java +++ b/consensus/qbft/src/main/java/org/hyperledger/besu/consensus/qbft/QbftContext.java @@ -18,38 +18,21 @@ import org.hyperledger.besu.consensus.common.EpochManager; import org.hyperledger.besu.consensus.common.bft.BftBlockInterface; import org.hyperledger.besu.consensus.common.bft.BftContext; import org.hyperledger.besu.consensus.common.validator.ValidatorProvider; -import org.hyperledger.besu.consensus.qbft.pki.PkiBlockCreationConfiguration; - -import java.util.Optional; /** The Qbft context. */ public class QbftContext extends BftContext { - private final Optional pkiBlockCreationConfiguration; - /** * Instantiates a new Qbft context. * * @param validatorProvider the validator provider * @param epochManager the epoch manager * @param blockInterface the block interface - * @param pkiBlockCreationConfiguration the pki block creation configuration */ public QbftContext( final ValidatorProvider validatorProvider, final EpochManager epochManager, - final BftBlockInterface blockInterface, - final Optional pkiBlockCreationConfiguration) { + final BftBlockInterface blockInterface) { super(validatorProvider, epochManager, blockInterface); - this.pkiBlockCreationConfiguration = pkiBlockCreationConfiguration; - } - - /** - * Gets pki block creation configuration. - * - * @return the pki block creation configuration - */ - public Optional getPkiBlockCreationConfiguration() { - return pkiBlockCreationConfiguration; } } diff --git a/consensus/qbft/src/main/java/org/hyperledger/besu/consensus/qbft/blockcreation/PkiQbftBlockCreator.java b/consensus/qbft/src/main/java/org/hyperledger/besu/consensus/qbft/blockcreation/PkiQbftBlockCreator.java deleted file mode 100644 index b3811a8aa..000000000 --- a/consensus/qbft/src/main/java/org/hyperledger/besu/consensus/qbft/blockcreation/PkiQbftBlockCreator.java +++ /dev/null @@ -1,179 +0,0 @@ -/* - * Copyright ConsenSys AG. - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on - * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the - * specific language governing permissions and limitations under the License. - * - * SPDX-License-Identifier: Apache-2.0 - */ -package org.hyperledger.besu.consensus.qbft.blockcreation; - -import static com.google.common.base.Preconditions.checkArgument; - -import org.hyperledger.besu.consensus.common.bft.BftBlockHeaderFunctions; -import org.hyperledger.besu.consensus.common.bft.BftExtraData; -import org.hyperledger.besu.consensus.common.bft.BftExtraDataCodec; -import org.hyperledger.besu.consensus.common.bft.BftProtocolSchedule; -import org.hyperledger.besu.consensus.qbft.pki.PkiBlockCreationConfiguration; -import org.hyperledger.besu.consensus.qbft.pki.PkiQbftBlockHeaderFunctions; -import org.hyperledger.besu.consensus.qbft.pki.PkiQbftExtraData; -import org.hyperledger.besu.consensus.qbft.pki.PkiQbftExtraDataCodec; -import org.hyperledger.besu.datatypes.Hash; -import org.hyperledger.besu.ethereum.blockcreation.BlockCreationTiming; -import org.hyperledger.besu.ethereum.blockcreation.BlockCreator; -import org.hyperledger.besu.ethereum.core.Block; -import org.hyperledger.besu.ethereum.core.BlockHeader; -import org.hyperledger.besu.ethereum.core.BlockHeaderBuilder; -import org.hyperledger.besu.ethereum.core.Transaction; -import org.hyperledger.besu.ethereum.mainnet.ProtocolSchedule; -import org.hyperledger.besu.ethereum.mainnet.ProtocolSpec; -import org.hyperledger.besu.ethereum.mainnet.WithdrawalsValidator; -import org.hyperledger.besu.pki.cms.CmsCreator; - -import java.util.Collections; -import java.util.List; -import java.util.Optional; - -import com.google.common.annotations.VisibleForTesting; -import org.apache.tuweni.bytes.Bytes; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** The Pki qbft block creator. */ -public class PkiQbftBlockCreator implements BlockCreator { - - private static final Logger LOG = LoggerFactory.getLogger(PkiQbftBlockCreator.class); - - private final BlockCreator blockCreator; - private final PkiQbftExtraDataCodec pkiQbftExtraDataCodec; - private final CmsCreator cmsCreator; - private final BlockHeader parentHeader; - private final ProtocolSchedule protocolSchedule; - - /** - * Instantiates a new Pki qbft block creator. - * - * @param blockCreator the block creator - * @param pkiBlockCreationConfiguration the pki block creation configuration - * @param pkiQbftExtraDataCodec the pki qbft extra data codec - * @param parentHeader the block header of the parent block - * @param protocolSchedule the protocol schedule (the type of block can vary based on the current - * protocol spec) - */ - public PkiQbftBlockCreator( - final BlockCreator blockCreator, - final PkiBlockCreationConfiguration pkiBlockCreationConfiguration, - final BftExtraDataCodec pkiQbftExtraDataCodec, - final BlockHeader parentHeader, - final ProtocolSchedule protocolSchedule) { - this( - blockCreator, - new CmsCreator( - pkiBlockCreationConfiguration.getKeyStore(), - pkiBlockCreationConfiguration.getCertificateAlias()), - pkiQbftExtraDataCodec, - parentHeader, - protocolSchedule); - } - - /** - * Instantiates a new Pki qbft block creator. - * - * @param blockCreator the block creator - * @param cmsCreator the cms creator - * @param bftExtraDataCodec the bft extra data codec - * @param parentHeader the block header of the parent block - * @param protocolSchedule the protocol schedule (the type of block can vary based on the current - * protocol spec) - */ - @VisibleForTesting - public PkiQbftBlockCreator( - final BlockCreator blockCreator, - final CmsCreator cmsCreator, - final BftExtraDataCodec bftExtraDataCodec, - final BlockHeader parentHeader, - final ProtocolSchedule protocolSchedule) { - this.blockCreator = blockCreator; - this.cmsCreator = cmsCreator; - this.protocolSchedule = protocolSchedule; - this.parentHeader = parentHeader; - - checkArgument( - bftExtraDataCodec instanceof PkiQbftExtraDataCodec, - "PkiQbftBlockCreator must use PkiQbftExtraDataCodec"); - this.pkiQbftExtraDataCodec = (PkiQbftExtraDataCodec) bftExtraDataCodec; - } - - @Override - public BlockCreationResult createBlock(final long timestamp) { - ProtocolSpec protocolSpec = - ((BftProtocolSchedule) protocolSchedule) - .getByBlockNumberOrTimestamp(parentHeader.getNumber() + 1, timestamp); - - final BlockCreationResult blockCreationResult; - if (protocolSpec.getWithdrawalsValidator() instanceof WithdrawalsValidator.AllowedWithdrawals) { - blockCreationResult = blockCreator.createEmptyWithdrawalsBlock(timestamp); - } else { - blockCreationResult = blockCreator.createBlock(timestamp); - } - return replaceCmsInBlock(blockCreationResult); - } - - @Override - public BlockCreationResult createBlock( - final List transactions, final List ommers, final long timestamp) { - final BlockCreationResult blockCreationResult = - blockCreator.createBlock(transactions, ommers, timestamp); - return replaceCmsInBlock(blockCreationResult); - } - - @Override - public BlockCreationResult createBlock( - final Optional> maybeTransactions, - final Optional> maybeOmmers, - final long timestamp) { - return createBlock( - maybeTransactions.orElse(Collections.emptyList()), - maybeOmmers.orElse(Collections.emptyList()), - timestamp); - } - - @Override - public BlockCreationResult createEmptyWithdrawalsBlock(final long timestamp) { - final BlockCreationResult blockCreationResult = - blockCreator.createEmptyWithdrawalsBlock(timestamp); - return replaceCmsInBlock(blockCreationResult); - } - - private BlockCreationResult replaceCmsInBlock(final BlockCreationResult blockCreationResult) { - final Block block = blockCreationResult.getBlock(); - final BlockHeader blockHeader = block.getHeader(); - final Hash hashWithoutCms = - PkiQbftBlockHeaderFunctions.forCmsSignature(pkiQbftExtraDataCodec).hash(block.getHeader()); - - final Bytes cms = cmsCreator.create(hashWithoutCms); - - final BftExtraData previousExtraData = pkiQbftExtraDataCodec.decode(blockHeader); - final BftExtraData substituteExtraData = new PkiQbftExtraData(previousExtraData, cms); - final Bytes substituteExtraDataBytes = pkiQbftExtraDataCodec.encode(substituteExtraData); - - final BlockHeaderBuilder headerBuilder = BlockHeaderBuilder.fromHeader(blockHeader); - headerBuilder - .extraData(substituteExtraDataBytes) - .blockHeaderFunctions(BftBlockHeaderFunctions.forCommittedSeal(pkiQbftExtraDataCodec)); - final BlockHeader newHeader = headerBuilder.buildBlockHeader(); - - LOG.debug("Created CMS with signed hash {} for block {}", hashWithoutCms, newHeader.getHash()); - - return new BlockCreationResult( - new Block(newHeader, block.getBody()), - blockCreationResult.getTransactionSelectionResults(), - new BlockCreationTiming()); - } -} diff --git a/consensus/qbft/src/main/java/org/hyperledger/besu/consensus/qbft/blockcreation/QbftBlockCreatorFactory.java b/consensus/qbft/src/main/java/org/hyperledger/besu/consensus/qbft/blockcreation/QbftBlockCreatorFactory.java index 9cbc64e78..10f61713d 100644 --- a/consensus/qbft/src/main/java/org/hyperledger/besu/consensus/qbft/blockcreation/QbftBlockCreatorFactory.java +++ b/consensus/qbft/src/main/java/org/hyperledger/besu/consensus/qbft/blockcreation/QbftBlockCreatorFactory.java @@ -20,10 +20,8 @@ import org.hyperledger.besu.consensus.common.ForksSchedule; import org.hyperledger.besu.consensus.common.bft.BftExtraData; import org.hyperledger.besu.consensus.common.bft.BftExtraDataCodec; import org.hyperledger.besu.consensus.common.bft.blockcreation.BftBlockCreatorFactory; -import org.hyperledger.besu.consensus.qbft.QbftContext; import org.hyperledger.besu.datatypes.Address; import org.hyperledger.besu.ethereum.ProtocolContext; -import org.hyperledger.besu.ethereum.blockcreation.BlockCreator; import org.hyperledger.besu.ethereum.core.BlockHeader; import org.hyperledger.besu.ethereum.core.MiningParameters; import org.hyperledger.besu.ethereum.eth.manager.EthScheduler; @@ -69,22 +67,6 @@ public class QbftBlockCreatorFactory extends BftBlockCreatorFactory extraDataCodec.encodeWithoutCms(bftExtraData), extraDataCodec)); - } -} diff --git a/consensus/qbft/src/main/java/org/hyperledger/besu/consensus/qbft/pki/PkiQbftBlockHeaderFunctions.java b/consensus/qbft/src/main/java/org/hyperledger/besu/consensus/qbft/pki/PkiQbftBlockHeaderFunctions.java deleted file mode 100644 index df567c2c2..000000000 --- a/consensus/qbft/src/main/java/org/hyperledger/besu/consensus/qbft/pki/PkiQbftBlockHeaderFunctions.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright ConsenSys AG. - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on - * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the - * specific language governing permissions and limitations under the License. - * - * SPDX-License-Identifier: Apache-2.0 - */ -package org.hyperledger.besu.consensus.qbft.pki; - -import org.hyperledger.besu.consensus.common.bft.BftBlockHeaderFunctions; -import org.hyperledger.besu.ethereum.core.BlockHeaderFunctions; - -/** The Pki qbft block header functions. */ -public class PkiQbftBlockHeaderFunctions { - /** Default constructor */ - private PkiQbftBlockHeaderFunctions() {} - - /** - * Create block header functions for cms signature. - * - * @param bftExtraDataCodec the bft extra data codec - * @return the block header functions - */ - public static BlockHeaderFunctions forCmsSignature( - final PkiQbftExtraDataCodec bftExtraDataCodec) { - return new BftBlockHeaderFunctions( - h -> new PkiQbftBlockHashing(bftExtraDataCodec).calculateHashOfBftBlockForCmsSignature(h), - bftExtraDataCodec); - } -} diff --git a/consensus/qbft/src/main/java/org/hyperledger/besu/consensus/qbft/pki/PkiQbftExtraData.java b/consensus/qbft/src/main/java/org/hyperledger/besu/consensus/qbft/pki/PkiQbftExtraData.java deleted file mode 100644 index 8d047c79e..000000000 --- a/consensus/qbft/src/main/java/org/hyperledger/besu/consensus/qbft/pki/PkiQbftExtraData.java +++ /dev/null @@ -1,77 +0,0 @@ -/* - * Copyright ConsenSys AG. - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on - * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the - * specific language governing permissions and limitations under the License. - * - * SPDX-License-Identifier: Apache-2.0 - */ -package org.hyperledger.besu.consensus.qbft.pki; - -import org.hyperledger.besu.consensus.common.bft.BftExtraData; -import org.hyperledger.besu.consensus.common.bft.Vote; -import org.hyperledger.besu.crypto.SECPSignature; -import org.hyperledger.besu.datatypes.Address; - -import java.util.Collection; -import java.util.Optional; - -import org.apache.tuweni.bytes.Bytes; - -/** The Pki Qbft extra data. */ -public class PkiQbftExtraData extends BftExtraData { - - private final Bytes cms; - - /** - * Instantiates a new Pki Qbft extra data. - * - * @param vanityData the vanity data - * @param seals the seals - * @param vote the vote - * @param round the round - * @param validators the validators - * @param cms the cms - */ - public PkiQbftExtraData( - final Bytes vanityData, - final Collection seals, - final Optional vote, - final int round, - final Collection