mirror of https://github.com/hyperledger/besu
Release 23.1.1 rc1 (#5106)
* Prepare for version 23.1.1-SNAPSHOT (#5067) Signed-off-by: Simon Dudley <simon.dudley@consensys.net> * Add getPayloadBodiesByRangeV1 and getPayloadBodiesByHash engine methods (#4980) * Add engine get payload body methods and test Signed-off-by: Zhenyang Shi <wcgcyx@gmail.com> Signed-off-by: Gabriel Fukushima <gabrielfukushima@gmail.com> * Add header Signed-off-by: Zhenyang Shi <wcgcyx@gmail.com> * Update result struct & add test Signed-off-by: Zhenyang Shi <wcgcyx@gmail.com> * Change constant to use upper case Signed-off-by: Gabriel Fukushima <gabrielfukushima@gmail.com> * Add PayloadBody class and withdrawals to response of methods Signed-off-by: Gabriel Fukushima <gabrielfukushima@gmail.com> * Add unit tests Signed-off-by: Gabriel Fukushima <gabrielfukushima@gmail.com> * Add changelog Signed-off-by: Gabriel Fukushima <gabrielfukushima@gmail.com> * spotless Signed-off-by: Gabriel Fukushima <gabrielfukushima@gmail.com> * Add check to prevent returning trailing null results past the head Signed-off-by: Gabriel Fukushima <gabrielfukushima@gmail.com> * Add test to check trailing null post head scenario Signed-off-by: Gabriel Fukushima <gabrielfukushima@gmail.com> * Split tests into pre and post shanghai Signed-off-by: Gabriel Fukushima <gabrielfukushima@gmail.com> * spotless Signed-off-by: Gabriel Fukushima <gabrielfukushima@gmail.com> * Rename methods Signed-off-by: Gabriel Fukushima <gabrielfukushima@gmail.com> * Use getName() to log method name Signed-off-by: Gabriel Fukushima <gabrielfukushima@gmail.com> * spotless Signed-off-by: Gabriel Fukushima <gabrielfukushima@gmail.com> * Rename variable Signed-off-by: Gabriel Fukushima <gabrielfukushima@gmail.com> * Call constructor directly Signed-off-by: Gabriel Fukushima <gabrielfukushima@gmail.com> * Fix ByHash json parsing Signed-off-by: Simon Dudley <simon.dudley@consensys.net> * Fix json parsing again Signed-off-by: Simon Dudley <simon.dudley@consensys.net> * Add check to prevent unnecessary queries Signed-off-by: Gabriel Fukushima <gabrielfukushima@gmail.com> * Refactor method Signed-off-by: Gabriel Fukushima <gabrielfukushima@gmail.com> * Add new error code for EngineGetPayloadBodies methods Signed-off-by: Gabriel Fukushima <gabrielfukushima@gmail.com> * Add return error for request above the API limit Signed-off-by: Gabriel Fukushima <gabrielfukushima@gmail.com> * Add constructor for empty response Signed-off-by: Gabriel Fukushima <gabrielfukushima@gmail.com> * add check for number of blocks requested and for requests of post head Signed-off-by: Gabriel Fukushima <gabrielfukushima@gmail.com> * Add test to check error code when request exceeds API limits Signed-off-by: Gabriel Fukushima <gabrielfukushima@gmail.com> * add constant for max blocks allowed per request Signed-off-by: Gabriel Fukushima <gabrielfukushima@gmail.com> * spotless Signed-off-by: Gabriel Fukushima <gabrielfukushima@gmail.com> * Fix some nits Signed-off-by: Gabriel Fukushima <gabrielfukushima@gmail.com> * Add invalid params check Signed-off-by: Gabriel Fukushima <gabrielfukushima@gmail.com> * Add tests for invalid params check Signed-off-by: Gabriel Fukushima <gabrielfukushima@gmail.com> * Fix test and spotless Signed-off-by: Gabriel Fukushima <gabrielfukushima@gmail.com> * Revert "Fix json parsing again" This reverts commitpull/5155/head 23.1.1-RC1558d325bf3
. Signed-off-by: Gabriel Fukushima <gabrielfukushima@gmail.com> * Revert "Fix ByHash json parsing Signed-off-by: Simon Dudley <simon.dudley@consensys.net>" This reverts commit663e11e2
Signed-off-by: Gabriel Fukushima <gabrielfukushima@gmail.com> * Use UnsignedLongParameter to cast params of the request Signed-off-by: Gabriel Fukushima <gabrielfukushima@gmail.com> * Add optional withdrawals to the NewPayload log (#5021) Signed-off-by: Simon Dudley <simon.dudley@consensys.net> * kubernetes and errorprone - update versions (#5013) * update errorprone and kubernetes versions * fixed errorprone issues in prod cod * fixed errorprone issues in test code --------- Signed-off-by: Sally MacFarlane <macfarla.github@gmail.com> * Rename JsonRpcService to EngineJsonRpcService (#5036) * rename JsonRpcService to EngineJsonRpcService Signed-off-by: Daniel Lehrner <daniel.lehrner@consensys.net> * Params should be single item of array type, not outer array of strings (#5037) Signed-off-by: Simon Dudley <simon.dudley@consensys.net> * Add EIP-2537 (BLS12-381 curve precompiles) to Cancun (#5017) Add the BLS curve precompiles into the registry for cancun. All of the curve precompiles have been here since berlin, so this is just wiring them in. Signed-off-by: Danno Ferrin <danno.ferrin@swirldslabs.com> Co-authored-by: Sally MacFarlane <macfarla.github@gmail.com> * Use UnsignedLongParameter to cast params of the request Signed-off-by: Gabriel Fukushima <gabrielfukushima@gmail.com> * Add optional withdrawals to the NewPayload log (#5021) Signed-off-by: Simon Dudley <simon.dudley@consensys.net> * kubernetes and errorprone - update versions (#5013) * update errorprone and kubernetes versions * fixed errorprone issues in prod cod * fixed errorprone issues in test code --------- Signed-off-by: Sally MacFarlane <macfarla.github@gmail.com> * Rename JsonRpcService to EngineJsonRpcService (#5036) * rename JsonRpcService to EngineJsonRpcService Signed-off-by: Daniel Lehrner <daniel.lehrner@consensys.net> * Params should be single item of array type, not outer array of strings (#5037) Signed-off-by: Simon Dudley <simon.dudley@consensys.net> * Add EIP-2537 (BLS12-381 curve precompiles) to Cancun (#5017) Add the BLS curve precompiles into the registry for cancun. All of the curve precompiles have been here since berlin, so this is just wiring them in. Signed-off-by: Danno Ferrin <danno.ferrin@swirldslabs.com> Co-authored-by: Sally MacFarlane <macfarla.github@gmail.com> * Convert start and count from hex to match JSON-RPC Spec standard Signed-off-by: Gabriel Fukushima <gabrielfukushima@gmail.com> --------- Signed-off-by: Zhenyang Shi <wcgcyx@gmail.com> Signed-off-by: Gabriel Fukushima <gabrielfukushima@gmail.com> Signed-off-by: Simon Dudley <simon.dudley@consensys.net> Signed-off-by: Sally MacFarlane <macfarla.github@gmail.com> Signed-off-by: Daniel Lehrner <daniel.lehrner@consensys.net> Signed-off-by: Danno Ferrin <danno.ferrin@swirldslabs.com> Co-authored-by: Zhenyang Shi <wcgcyx@gmail.com> Co-authored-by: Simon Dudley <simon.dudley@consensys.net> Co-authored-by: Sally MacFarlane <macfarla.github@gmail.com> Co-authored-by: Daniel Lehrner <daniel.lehrner@consensys.net> Co-authored-by: Danno Ferrin <danno.ferrin@swirldslabs.com> * Revert "Keep Worldstate Storage open for Bonsai archive latest layer (#5039)" (#5073) This reverts commite7150102ea
. Signed-off-by: Simon Dudley <simon.dudley@consensys.net> * Support post merge forks at genesis for hive tests (#5019) Signed-off-by: Jason Frame <jason.frame@consensys.net> * Fix manifest docker not skipping interim builds for RCs (#5068) Signed-off-by: Jason Frame <jason.frame@consensys.net> * Fix PoS checkpoint validation (#5081) * change validation to lessThan Signed-off-by: Gabriel Fukushima <gabrielfukushima@gmail.com> * Change exception message to PoS instead of Near head Signed-off-by: Gabriel Fukushima <gabrielfukushima@gmail.com> * Add unit test and fix message of existing unit test Signed-off-by: Gabriel Fukushima <gabrielfukushima@gmail.com> --------- Signed-off-by: Gabriel Fukushima <gabrielfukushima@gmail.com> * moves check for init code length before balance check (#5077) Signed-off-by: Justin Florentine <justin+github@florentine.us> * bump revision for 23.1.x release branch Signed-off-by: garyschulte <garyschulte@gmail.com> * Burn in build of 23.1.0 (#5093) * rebase off of burn-in release, remove unreleased 23.1.0-RC2 from CHANGELOG Signed-off-by: garyschulte <garyschulte@gmail.com> Signed-off-by: Simon Dudley <simon.dudley@consensys.net> Signed-off-by: Ameziane H <ameziane.hamlat@consensys.net> Signed-off-by: Karim TAAM <karim.t2am@gmail.com> * re-default global max rpc batch size to 1k (#5104) (#5105) * default global max rpc batch size to 1000 for now Signed-off-by: garyschulte <garyschulte@gmail.com> * Fix Layered World State issue (#5076) * Use the copy during prepareTrieLog instead of saveTrieLog * add final flag on BonsaiWorldStateUpdater * Use a copy of BonsaiInMemoryWorldState inside prepareTrieLog * add link to persisted worldstate storage * fix tests * Make a copy of the worldstate after committing changes to the trielog * spotless + remove maybeUnSubscribe in setNextWorldView * subscribe storage on layered worldstate * fix null issue * not close layered worldstate during getAccount * clean code * Add changelog entry --------- Signed-off-by: ahamlat <ameziane.hamlat@consensys.net> Signed-off-by: Karim TAAM <karim.t2am@gmail.com> Co-authored-by: Karim TAAM <karim.t2am@gmail.com> * Add shanghaiTime to sepolia (#5088) Update and fix forkId tests Move timestamp forks from getForkBlockNumbers to getForkBlockTimestamps in JsonGenesisConfigOptions - this ultimately gets used to popoulate the ForkIdManager which handles lists of blocks and timestamps the same way so this hasn't changed any actual behaviour, but rather supports the test fixes. Implement TransitionProtocolSchedule.streamMilestoneBlocks as a concatenation of blockNumbers++blockTimestamps. This may have been a latent bug since it's used to update the node record when a fork transition occurs. Signed-off-by: Simon Dudley <simon.dudley@consensys.net> * If a PoS block creation repetition takes less than a configurable dur… (#5048) * If a PoS block creation repetition takes less than a configurable duration, then waits before next repetition Signed-off-by: Fabio Di Fabio <fabio.difabio@consensys.net> * Update CHANGELOG Signed-off-by: Fabio Di Fabio <fabio.difabio@consensys.net> * Add unit test Signed-off-by: Fabio Di Fabio <fabio.difabio@consensys.net> * Update besu/src/main/java/org/hyperledger/besu/cli/BesuCommand.java Co-authored-by: Sally MacFarlane <macfarla.github@gmail.com> Signed-off-by: Fabio Di Fabio <fabio.difabio@consensys.net> * Update besu/src/main/java/org/hyperledger/besu/cli/options/unstable/MiningOptions.java Co-authored-by: Sally MacFarlane <macfarla.github@gmail.com> Signed-off-by: Fabio Di Fabio <fabio.difabio@consensys.net> --------- Signed-off-by: Fabio Di Fabio <fabio.difabio@consensys.net> Co-authored-by: Sally MacFarlane <macfarla.github@gmail.com> * Allow dashes in ethstats password (#5090) Signed-off-by: Simon Dudley <simon.dudley@consensys.net> * reintroduce checking of block height for certain tasks when we are not PoS (Revert PR#3911) (#5083) * reintroduce checking of block height for certain tasks when we are not PoS (Revert PR#3911) Signed-off-by: Stefan Pingel <16143240+pinges@users.noreply.github.com> * Allow other users to read the /opt/besu dir when using docker (#5092) Signed-off-by: Rafael Matias <rafael@skyle.net> Co-authored-by: Sally MacFarlane <macfarla.github@gmail.com> * Only use MAINNET version of KZG (#5095) Signed-off-by: Fabio Di Fabio <fabio.difabio@consensys.net> * add more context to exception messages and debug logging (#5066) Signed-off-by: Sally MacFarlane <macfarla.github@gmail.com> * Fix block value calculation (#5100) * Add gasUsed calculation Signed-off-by: Gabriel Fukushima <gabrielfukushima@gmail.com> * Fix unit test Signed-off-by: Gabriel Fukushima <gabrielfukushima@gmail.com> * Fix typo Signed-off-by: Gabriel Fukushima <gabrielfukushima@gmail.com> --------- Signed-off-by: Gabriel Fukushima <gabrielfukushima@gmail.com> * Add 23.1.1-RC1 changelog Signed-off-by: Jason Frame <jason.frame@consensys.net> * Change version to 23.1.1-RC1 Signed-off-by: Jason Frame <jason.frame@consensys.net> --------- Signed-off-by: Simon Dudley <simon.dudley@consensys.net> Signed-off-by: Zhenyang Shi <wcgcyx@gmail.com> Signed-off-by: Gabriel Fukushima <gabrielfukushima@gmail.com> Signed-off-by: Sally MacFarlane <macfarla.github@gmail.com> Signed-off-by: Daniel Lehrner <daniel.lehrner@consensys.net> Signed-off-by: Danno Ferrin <danno.ferrin@swirldslabs.com> Signed-off-by: Jason Frame <jason.frame@consensys.net> Signed-off-by: Justin Florentine <justin+github@florentine.us> Signed-off-by: garyschulte <garyschulte@gmail.com> Signed-off-by: Ameziane H <ameziane.hamlat@consensys.net> Signed-off-by: Karim TAAM <karim.t2am@gmail.com> Signed-off-by: ahamlat <ameziane.hamlat@consensys.net> Signed-off-by: Fabio Di Fabio <fabio.difabio@consensys.net> Signed-off-by: Stefan Pingel <16143240+pinges@users.noreply.github.com> Signed-off-by: Rafael Matias <rafael@skyle.net> Co-authored-by: Simon Dudley <simon.dudley@consensys.net> Co-authored-by: Gabriel Fukushima <gabrielfukushima@gmail.com> Co-authored-by: Zhenyang Shi <wcgcyx@gmail.com> Co-authored-by: Sally MacFarlane <macfarla.github@gmail.com> Co-authored-by: Daniel Lehrner <daniel.lehrner@consensys.net> Co-authored-by: Danno Ferrin <danno.ferrin@swirldslabs.com> Co-authored-by: Justin Florentine <justin+github@florentine.us> Co-authored-by: garyschulte <garyschulte@gmail.com> Co-authored-by: ahamlat <ameziane.hamlat@consensys.net> Co-authored-by: Karim TAAM <karim.t2am@gmail.com> Co-authored-by: Fabio Di Fabio <fabio.difabio@consensys.net> Co-authored-by: Stefan Pingel <16143240+pinges@users.noreply.github.com> Co-authored-by: Rafael Matias <rafael@skyle.net>
parent
79c1a97fc8
commit
d048798f1a
@ -0,0 +1,56 @@ |
||||
{ |
||||
"config": { |
||||
"chainId": 1337, |
||||
"homesteadBlock": 0, |
||||
"daoForkBlock": 0, |
||||
"eip150Block": 0, |
||||
"eip158Block": 0, |
||||
"byzantiumBlock": 0, |
||||
"petersburgBlock": 0, |
||||
"istanbulBlock": 0, |
||||
"muirGlacierBlock": 0, |
||||
"berlinBlock": 0, |
||||
"londonBlock": 0, |
||||
"arrowGlacierBlock": 0, |
||||
"grayGlacierBlock": 0, |
||||
"terminalTotalDifficulty": 10, |
||||
"ethash": { |
||||
}, |
||||
"discovery": { |
||||
"dns": "enrtree://AKA3AM6LPBYEUDMVNU3BSVQJ5AD45Y7YPOHJLEF6W26QOE4VTUDPE@all.mainnet.ethdisco.net", |
||||
"bootnodes": [ |
||||
"enode://d860a01f9722d78051619d1e2351aba3f43f943f6f00718d1b9baa4101932a1f5011f16bb2b1bb35db20d6fe28fa0bf09636d26a87d31de9ec6203eeedb1f666@18.138.108.67:30303", |
||||
"enode://22a8232c3abc76a16ae9d6c3b164f98775fe226f0917b0ca871128a74a8e9630b458460865bab457221f1d448dd9791d24c4e5d88786180ac185df813a68d4de@3.209.45.79:30303", |
||||
"enode://8499da03c47d637b20eee24eec3c356c9a2e6148d6fe25ca195c7949ab8ec2c03e3556126b0d7ed644675e78c4318b08691b7b57de10e5f0d40d05b09238fa0a@52.187.207.27:30303", |
||||
"enode://103858bdb88756c71f15e9b5e09b56dc1be52f0a5021d46301dbbfb7e130029cc9d0d6f73f693bc29b665770fff7da4d34f3c6379fe12721b5d7a0bcb5ca1fc1@191.234.162.198:30303", |
||||
"enode://715171f50508aba88aecd1250af392a45a330af91d7b90701c436b618c86aaa1589c9184561907bebbb56439b8f8787bc01f49a7c77276c58c1b09822d75e8e8@52.231.165.108:30303", |
||||
"enode://5d6d7cd20d6da4bb83a1d28cadb5d409b64edf314c0335df658c1a54e32c7c4a7ab7823d57c39b6a757556e68ff1df17c748b698544a55cb488b52479a92b60f@104.42.217.25:30303", |
||||
"enode://2b252ab6a1d0f971d9722cb839a42cb81db019ba44c08754628ab4a823487071b5695317c8ccd085219c3a03af063495b2f1da8d18218da2d6a82981b45e6ffc@65.108.70.101:30303", |
||||
"enode://4aeb4ab6c14b23e2c4cfdce879c04b0748a20d8e9b59e25ded2a08143e265c6c25936e74cbc8e641e3312ca288673d91f2f93f8e277de3cfa444ecdaaf982052@157.90.35.166:30303", |
||||
"enode://a979fb575495b8d6db44f750317d0f4622bf4c2aa3365d6af7c284339968eef29b69ad0dce72a4d8db5ebb4968de0e3bec910127f134779fbcb0cb6d3331163c@52.16.188.185:30303", |
||||
"enode://3f1d12044546b76342d59d4a05532c14b85aa669704bfe1f864fe079415aa2c02d743e03218e57a33fb94523adb54032871a6c51b2cc5514cb7c7e35b3ed0a99@13.93.211.84:30303", |
||||
"enode://78de8a0916848093c73790ead81d1928bec737d565119932b98c6b100d944b7a95e94f847f689fc723399d2e31129d182f7ef3863f2b4c820abbf3ab2722344d@191.235.84.50:30303", |
||||
"enode://158f8aab45f6d19c6cbf4a089c2670541a8da11978a2f90dbf6a502a4a3bab80d288afdbeb7ec0ef6d92de563767f3b1ea9e8e334ca711e9f8e2df5a0385e8e6@13.75.154.138:30303", |
||||
"enode://1118980bf48b0a3640bdba04e0fe78b1add18e1cd99bf22d53daac1fd9972ad650df52176e7c7d89d1114cfef2bc23a2959aa54998a46afcf7d91809f0855082@52.74.57.123:30303", |
||||
"enode://979b7fa28feeb35a4741660a16076f1943202cb72b6af70d327f053e248bab9ba81760f39d0701ef1d8f89cc1fbd2cacba0710a12cd5314d5e0c9021aa3637f9@5.1.83.226:30303" |
||||
] |
||||
}, |
||||
"checkpoint": { |
||||
"hash": "0x186642d6084eb7799cb01c7eb69c1a7f3b2c32cd141e62d309f30081a1ea3c91", |
||||
"number": 3, |
||||
"totalDifficulty": "0x0a" |
||||
} |
||||
}, |
||||
"nonce": "0x42", |
||||
"timestamp": "0x0", |
||||
"extraData": "0x11bbe8db4e347b4e8c937c1c8370e4b5ed33adb3db69cbdb7a38e1e50b1b82fa", |
||||
"gasLimit": "0x1388", |
||||
"difficulty": "0x400000000", |
||||
"mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000", |
||||
"coinbase": "0x0000000000000000000000000000000000000000", |
||||
"alloc": { |
||||
"000d836201318ec6899a67540690382780743280": { |
||||
"balance": "0xad78ebc5ac6200000" |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,85 @@ |
||||
/* |
||||
* Copyright Hyperledger Besu Contributors. |
||||
* |
||||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with |
||||
* the License. You may obtain a copy of the License at |
||||
* |
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
* |
||||
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on |
||||
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the |
||||
* specific language governing permissions and limitations under the License. |
||||
* |
||||
* SPDX-License-Identifier: Apache-2.0 |
||||
*/ |
||||
package org.hyperledger.besu.ethereum.api.jsonrpc.internal.methods.engine; |
||||
|
||||
import static org.hyperledger.besu.util.Slf4jLambdaHelper.traceLambda; |
||||
|
||||
import org.hyperledger.besu.datatypes.Hash; |
||||
import org.hyperledger.besu.ethereum.ProtocolContext; |
||||
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.methods.ExecutionEngineJsonRpcMethod; |
||||
import org.hyperledger.besu.ethereum.api.jsonrpc.internal.response.JsonRpcError; |
||||
import org.hyperledger.besu.ethereum.api.jsonrpc.internal.response.JsonRpcErrorResponse; |
||||
import org.hyperledger.besu.ethereum.api.jsonrpc.internal.response.JsonRpcResponse; |
||||
import org.hyperledger.besu.ethereum.api.jsonrpc.internal.response.JsonRpcSuccessResponse; |
||||
import org.hyperledger.besu.ethereum.api.jsonrpc.internal.results.BlockResultFactory; |
||||
import org.hyperledger.besu.ethereum.api.jsonrpc.internal.results.EngineGetPayloadBodiesResultV1; |
||||
import org.hyperledger.besu.ethereum.chain.Blockchain; |
||||
|
||||
import java.util.Arrays; |
||||
import java.util.stream.Collectors; |
||||
|
||||
import io.vertx.core.Vertx; |
||||
import org.slf4j.Logger; |
||||
import org.slf4j.LoggerFactory; |
||||
|
||||
public class EngineGetPayloadBodiesByHashV1 extends ExecutionEngineJsonRpcMethod { |
||||
|
||||
private static final int MAX_REQUEST_BLOCKS = 1024; |
||||
private static final Logger LOG = LoggerFactory.getLogger(EngineGetPayloadBodiesByHashV1.class); |
||||
private final BlockResultFactory blockResultFactory; |
||||
|
||||
public EngineGetPayloadBodiesByHashV1( |
||||
final Vertx vertx, |
||||
final ProtocolContext protocolContext, |
||||
final BlockResultFactory blockResultFactory, |
||||
final EngineCallListener engineCallListener) { |
||||
super(vertx, protocolContext, engineCallListener); |
||||
this.blockResultFactory = blockResultFactory; |
||||
} |
||||
|
||||
@Override |
||||
public String getName() { |
||||
return RpcMethod.ENGINE_GET_PAYLOAD_BODIES_BY_HASH_V1.getMethodName(); |
||||
} |
||||
|
||||
@Override |
||||
public JsonRpcResponse syncResponse(final JsonRpcRequestContext request) { |
||||
engineCallListener.executionEngineCalled(); |
||||
|
||||
final Object reqId = request.getRequest().getId(); |
||||
|
||||
final Hash[] blockHashes = request.getRequiredParameter(0, Hash[].class); |
||||
|
||||
traceLambda(LOG, "{} parameters: blockHashes {}", () -> getName(), () -> blockHashes); |
||||
|
||||
if (blockHashes.length > getMaxRequestBlocks()) { |
||||
return new JsonRpcErrorResponse(reqId, JsonRpcError.INVALID_RANGE_REQUEST_TOO_LARGE); |
||||
} |
||||
|
||||
final Blockchain blockchain = protocolContext.getBlockchain(); |
||||
|
||||
final EngineGetPayloadBodiesResultV1 engineGetPayloadBodiesResultV1 = |
||||
blockResultFactory.payloadBodiesCompleteV1( |
||||
Arrays.stream(blockHashes).map(blockchain::getBlockBody).collect(Collectors.toList())); |
||||
|
||||
return new JsonRpcSuccessResponse(reqId, engineGetPayloadBodiesResultV1); |
||||
} |
||||
|
||||
protected int getMaxRequestBlocks() { |
||||
return MAX_REQUEST_BLOCKS; |
||||
} |
||||
} |
@ -0,0 +1,113 @@ |
||||
/* |
||||
* Copyright Hyperledger Besu Contributors. |
||||
* |
||||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with |
||||
* the License. You may obtain a copy of the License at |
||||
* |
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
* |
||||
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on |
||||
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the |
||||
* specific language governing permissions and limitations under the License. |
||||
* |
||||
* SPDX-License-Identifier: Apache-2.0 |
||||
*/ |
||||
package org.hyperledger.besu.ethereum.api.jsonrpc.internal.methods.engine; |
||||
|
||||
import static org.hyperledger.besu.util.Slf4jLambdaHelper.traceLambda; |
||||
|
||||
import org.hyperledger.besu.ethereum.ProtocolContext; |
||||
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.methods.ExecutionEngineJsonRpcMethod; |
||||
import org.hyperledger.besu.ethereum.api.jsonrpc.internal.parameters.UnsignedLongParameter; |
||||
import org.hyperledger.besu.ethereum.api.jsonrpc.internal.response.JsonRpcError; |
||||
import org.hyperledger.besu.ethereum.api.jsonrpc.internal.response.JsonRpcErrorResponse; |
||||
import org.hyperledger.besu.ethereum.api.jsonrpc.internal.response.JsonRpcResponse; |
||||
import org.hyperledger.besu.ethereum.api.jsonrpc.internal.response.JsonRpcSuccessResponse; |
||||
import org.hyperledger.besu.ethereum.api.jsonrpc.internal.results.BlockResultFactory; |
||||
import org.hyperledger.besu.ethereum.api.jsonrpc.internal.results.EngineGetPayloadBodiesResultV1; |
||||
import org.hyperledger.besu.ethereum.chain.Blockchain; |
||||
|
||||
import java.util.stream.Collectors; |
||||
import java.util.stream.LongStream; |
||||
|
||||
import io.vertx.core.Vertx; |
||||
import org.slf4j.Logger; |
||||
import org.slf4j.LoggerFactory; |
||||
|
||||
public class EngineGetPayloadBodiesByRangeV1 extends ExecutionEngineJsonRpcMethod { |
||||
private static final Logger LOG = LoggerFactory.getLogger(EngineGetPayloadBodiesByRangeV1.class); |
||||
private static final int MAX_REQUEST_BLOCKS = 1024; |
||||
private final BlockResultFactory blockResultFactory; |
||||
|
||||
public EngineGetPayloadBodiesByRangeV1( |
||||
final Vertx vertx, |
||||
final ProtocolContext protocolContext, |
||||
final BlockResultFactory blockResultFactory, |
||||
final EngineCallListener engineCallListener) { |
||||
super(vertx, protocolContext, engineCallListener); |
||||
this.blockResultFactory = blockResultFactory; |
||||
} |
||||
|
||||
@Override |
||||
public String getName() { |
||||
return RpcMethod.ENGINE_GET_PAYLOAD_BODIES_BY_RANGE_V1.getMethodName(); |
||||
} |
||||
|
||||
@Override |
||||
public JsonRpcResponse syncResponse(final JsonRpcRequestContext request) { |
||||
engineCallListener.executionEngineCalled(); |
||||
|
||||
final long startBlockNumber = |
||||
request.getRequiredParameter(0, UnsignedLongParameter.class).getValue(); |
||||
final long count = request.getRequiredParameter(1, UnsignedLongParameter.class).getValue(); |
||||
final Object reqId = request.getRequest().getId(); |
||||
|
||||
traceLambda( |
||||
LOG, |
||||
"{} parameters: start block number {} count {}", |
||||
() -> getName(), |
||||
() -> startBlockNumber, |
||||
() -> count); |
||||
|
||||
if (startBlockNumber < 1 || count < 1) { |
||||
return new JsonRpcErrorResponse(reqId, JsonRpcError.INVALID_PARAMS); |
||||
} |
||||
|
||||
if (count > getMaxRequestBlocks()) { |
||||
return new JsonRpcErrorResponse(reqId, JsonRpcError.INVALID_RANGE_REQUEST_TOO_LARGE); |
||||
} |
||||
|
||||
final Blockchain blockchain = protocolContext.getBlockchain(); |
||||
final long chainHeadBlockNumber = blockchain.getChainHeadBlockNumber(); |
||||
|
||||
// request startBlockNumber is beyond head of chain
|
||||
if (chainHeadBlockNumber < startBlockNumber) { |
||||
// Empty List of payloadBodies
|
||||
return new JsonRpcSuccessResponse(reqId, new EngineGetPayloadBodiesResultV1()); |
||||
} |
||||
|
||||
final long upperBound = startBlockNumber + count; |
||||
|
||||
// if we've received request from blocks beyond the head we exclude those from the query
|
||||
final long endExclusiveBlockNumber = |
||||
chainHeadBlockNumber < upperBound ? chainHeadBlockNumber + 1 : upperBound; |
||||
|
||||
EngineGetPayloadBodiesResultV1 engineGetPayloadBodiesResultV1 = |
||||
blockResultFactory.payloadBodiesCompleteV1( |
||||
LongStream.range(startBlockNumber, endExclusiveBlockNumber) |
||||
.mapToObj( |
||||
blockNumber -> |
||||
blockchain |
||||
.getBlockHashByNumber(blockNumber) |
||||
.flatMap(blockchain::getBlockBody)) |
||||
.collect(Collectors.toList())); |
||||
|
||||
return new JsonRpcSuccessResponse(reqId, engineGetPayloadBodiesResultV1); |
||||
} |
||||
|
||||
protected int getMaxRequestBlocks() { |
||||
return MAX_REQUEST_BLOCKS; |
||||
} |
||||
} |
@ -0,0 +1,79 @@ |
||||
/* |
||||
* Copyright Hyperledger Besu Contributors. |
||||
* |
||||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with |
||||
* the License. You may obtain a copy of the License at |
||||
* |
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
* |
||||
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on |
||||
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the |
||||
* specific language governing permissions and limitations under the License. |
||||
* |
||||
* SPDX-License-Identifier: Apache-2.0 |
||||
*/ |
||||
package org.hyperledger.besu.ethereum.api.jsonrpc.internal.results; |
||||
|
||||
import org.hyperledger.besu.ethereum.api.jsonrpc.internal.parameters.WithdrawalParameter; |
||||
import org.hyperledger.besu.ethereum.core.BlockBody; |
||||
import org.hyperledger.besu.ethereum.core.encoding.TransactionEncoder; |
||||
|
||||
import java.util.Collections; |
||||
import java.util.List; |
||||
import java.util.stream.Collectors; |
||||
|
||||
import com.fasterxml.jackson.annotation.JsonGetter; |
||||
import com.fasterxml.jackson.annotation.JsonPropertyOrder; |
||||
import com.fasterxml.jackson.annotation.JsonValue; |
||||
import org.apache.tuweni.bytes.Bytes; |
||||
|
||||
@JsonPropertyOrder({"payloadBodies"}) |
||||
public class EngineGetPayloadBodiesResultV1 { |
||||
|
||||
private final List<PayloadBody> payloadBodies; |
||||
|
||||
public EngineGetPayloadBodiesResultV1() { |
||||
this.payloadBodies = Collections.<PayloadBody>emptyList(); |
||||
} |
||||
|
||||
public EngineGetPayloadBodiesResultV1(final List<PayloadBody> payloadBody) { |
||||
this.payloadBodies = payloadBody; |
||||
} |
||||
|
||||
@JsonValue |
||||
public List<PayloadBody> getPayloadBodies() { |
||||
return payloadBodies; |
||||
} |
||||
|
||||
public static class PayloadBody { |
||||
private final List<String> transactions; |
||||
private final List<WithdrawalParameter> withdrawals; |
||||
|
||||
public PayloadBody(final BlockBody blockBody) { |
||||
this.transactions = |
||||
blockBody.getTransactions().stream() |
||||
.map(TransactionEncoder::encodeOpaqueBytes) |
||||
.map(Bytes::toHexString) |
||||
.collect(Collectors.toList()); |
||||
this.withdrawals = |
||||
blockBody |
||||
.getWithdrawals() |
||||
.map( |
||||
ws -> |
||||
ws.stream() |
||||
.map(WithdrawalParameter::fromWithdrawal) |
||||
.collect(Collectors.toList())) |
||||
.orElse(null); |
||||
} |
||||
|
||||
@JsonGetter(value = "transactions") |
||||
public List<String> getTransactions() { |
||||
return transactions; |
||||
} |
||||
|
||||
@JsonGetter(value = "withdrawals") |
||||
public List<WithdrawalParameter> getWithdrawals() { |
||||
return withdrawals; |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,267 @@ |
||||
/* |
||||
* Copyright Hyperledger Besu Contributors. |
||||
* |
||||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with |
||||
* the License. You may obtain a copy of the License at |
||||
* |
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
* |
||||
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on |
||||
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the |
||||
* specific language governing permissions and limitations under the License. |
||||
* |
||||
* SPDX-License-Identifier: Apache-2.0 |
||||
*/ |
||||
package org.hyperledger.besu.ethereum.api.jsonrpc.internal.methods.engine; |
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat; |
||||
import static org.hyperledger.besu.ethereum.api.jsonrpc.internal.response.JsonRpcError.INVALID_RANGE_REQUEST_TOO_LARGE; |
||||
import static org.mockito.Mockito.doReturn; |
||||
import static org.mockito.Mockito.spy; |
||||
import static org.mockito.Mockito.when; |
||||
|
||||
import org.hyperledger.besu.crypto.SignatureAlgorithm; |
||||
import org.hyperledger.besu.crypto.SignatureAlgorithmFactory; |
||||
import org.hyperledger.besu.datatypes.Address; |
||||
import org.hyperledger.besu.datatypes.GWei; |
||||
import org.hyperledger.besu.datatypes.Hash; |
||||
import org.hyperledger.besu.ethereum.ProtocolContext; |
||||
import org.hyperledger.besu.ethereum.api.jsonrpc.RpcMethod; |
||||
import org.hyperledger.besu.ethereum.api.jsonrpc.internal.JsonRpcRequest; |
||||
import org.hyperledger.besu.ethereum.api.jsonrpc.internal.JsonRpcRequestContext; |
||||
import org.hyperledger.besu.ethereum.api.jsonrpc.internal.response.JsonRpcError; |
||||
import org.hyperledger.besu.ethereum.api.jsonrpc.internal.response.JsonRpcErrorResponse; |
||||
import org.hyperledger.besu.ethereum.api.jsonrpc.internal.response.JsonRpcResponse; |
||||
import org.hyperledger.besu.ethereum.api.jsonrpc.internal.response.JsonRpcResponseType; |
||||
import org.hyperledger.besu.ethereum.api.jsonrpc.internal.response.JsonRpcSuccessResponse; |
||||
import org.hyperledger.besu.ethereum.api.jsonrpc.internal.results.BlockResultFactory; |
||||
import org.hyperledger.besu.ethereum.api.jsonrpc.internal.results.EngineGetPayloadBodiesResultV1; |
||||
import org.hyperledger.besu.ethereum.chain.MutableBlockchain; |
||||
import org.hyperledger.besu.ethereum.core.BlockBody; |
||||
import org.hyperledger.besu.ethereum.core.TransactionTestFixture; |
||||
import org.hyperledger.besu.ethereum.core.Withdrawal; |
||||
|
||||
import java.util.Collections; |
||||
import java.util.List; |
||||
import java.util.Optional; |
||||
|
||||
import io.vertx.core.Vertx; |
||||
import org.apache.tuweni.bytes.Bytes32; |
||||
import org.apache.tuweni.units.bigints.UInt64; |
||||
import org.junit.Before; |
||||
import org.junit.Test; |
||||
import org.junit.runner.RunWith; |
||||
import org.mockito.Mock; |
||||
import org.mockito.junit.MockitoJUnitRunner; |
||||
|
||||
@RunWith(MockitoJUnitRunner.class) |
||||
public class EngineGetPayloadBodiesByHashV1Test { |
||||
private EngineGetPayloadBodiesByHashV1 method; |
||||
private static final Vertx vertx = Vertx.vertx(); |
||||
private static final BlockResultFactory blockResultFactory = new BlockResultFactory(); |
||||
@Mock private ProtocolContext protocolContext; |
||||
@Mock private EngineCallListener engineCallListener; |
||||
@Mock private MutableBlockchain blockchain; |
||||
|
||||
@Before |
||||
public void before() { |
||||
when(protocolContext.getBlockchain()).thenReturn(blockchain); |
||||
this.method = |
||||
spy( |
||||
new EngineGetPayloadBodiesByHashV1( |
||||
vertx, protocolContext, blockResultFactory, engineCallListener)); |
||||
} |
||||
|
||||
@Test |
||||
public void shouldReturnExpectedMethodName() { |
||||
assertThat(method.getName()).isEqualTo("engine_getPayloadBodiesByHashV1"); |
||||
} |
||||
|
||||
@Test |
||||
public void shouldReturnEmptyPayloadBodiesWithEmptyHash() { |
||||
final var resp = resp(new Hash[] {}); |
||||
final EngineGetPayloadBodiesResultV1 result = fromSuccessResp(resp); |
||||
assertThat(result.getPayloadBodies().isEmpty()).isTrue(); |
||||
} |
||||
|
||||
@Test |
||||
public void shouldReturnPayloadForKnownHashes() { |
||||
final SignatureAlgorithm sig = SignatureAlgorithmFactory.getInstance(); |
||||
final Hash blockHash1 = Hash.wrap(Bytes32.random()); |
||||
final Hash blockHash2 = Hash.wrap(Bytes32.random()); |
||||
final Hash blockHash3 = Hash.wrap(Bytes32.random()); |
||||
final BlockBody blockBody1 = |
||||
new BlockBody( |
||||
List.of(new TransactionTestFixture().createTransaction(sig.generateKeyPair())), |
||||
Collections.emptyList()); |
||||
final BlockBody blockBody2 = |
||||
new BlockBody( |
||||
List.of( |
||||
new TransactionTestFixture().createTransaction(sig.generateKeyPair()), |
||||
new TransactionTestFixture().createTransaction(sig.generateKeyPair())), |
||||
Collections.emptyList()); |
||||
final BlockBody blockBody3 = |
||||
new BlockBody( |
||||
List.of( |
||||
new TransactionTestFixture().createTransaction(sig.generateKeyPair()), |
||||
new TransactionTestFixture().createTransaction(sig.generateKeyPair()), |
||||
new TransactionTestFixture().createTransaction(sig.generateKeyPair())), |
||||
Collections.emptyList()); |
||||
when(blockchain.getBlockBody(blockHash1)).thenReturn(Optional.of(blockBody1)); |
||||
when(blockchain.getBlockBody(blockHash2)).thenReturn(Optional.of(blockBody2)); |
||||
when(blockchain.getBlockBody(blockHash3)).thenReturn(Optional.of(blockBody3)); |
||||
|
||||
final var resp = resp(new Hash[] {blockHash1, blockHash2, blockHash3}); |
||||
final var result = fromSuccessResp(resp); |
||||
assertThat(result.getPayloadBodies().size()).isEqualTo(3); |
||||
assertThat(result.getPayloadBodies().get(0).getTransactions().size()).isEqualTo(1); |
||||
assertThat(result.getPayloadBodies().get(1).getTransactions().size()).isEqualTo(2); |
||||
assertThat(result.getPayloadBodies().get(2).getTransactions().size()).isEqualTo(3); |
||||
} |
||||
|
||||
@Test |
||||
public void shouldReturnNullForUnknownHashes() { |
||||
final Hash blockHash1 = Hash.wrap(Bytes32.random()); |
||||
final Hash blockHash2 = Hash.wrap(Bytes32.random()); |
||||
final Hash blockHash3 = Hash.wrap(Bytes32.random()); |
||||
final var resp = resp(new Hash[] {blockHash1, blockHash2, blockHash3}); |
||||
final var result = fromSuccessResp(resp); |
||||
assertThat(result.getPayloadBodies().size()).isEqualTo(3); |
||||
assertThat(result.getPayloadBodies().get(0)).isNull(); |
||||
assertThat(result.getPayloadBodies().get(1)).isNull(); |
||||
assertThat(result.getPayloadBodies().get(2)).isNull(); |
||||
} |
||||
|
||||
@Test |
||||
public void shouldReturnNullForUnknownHashAndPayloadForKnownHash() { |
||||
final SignatureAlgorithm sig = SignatureAlgorithmFactory.getInstance(); |
||||
final Hash blockHash1 = Hash.wrap(Bytes32.random()); |
||||
final Hash blockHash2 = Hash.wrap(Bytes32.random()); |
||||
final Hash blockHash3 = Hash.wrap(Bytes32.random()); |
||||
final BlockBody blockBody1 = |
||||
new BlockBody( |
||||
List.of(new TransactionTestFixture().createTransaction(sig.generateKeyPair())), |
||||
Collections.emptyList()); |
||||
final BlockBody blockBody3 = |
||||
new BlockBody( |
||||
List.of( |
||||
new TransactionTestFixture().createTransaction(sig.generateKeyPair()), |
||||
new TransactionTestFixture().createTransaction(sig.generateKeyPair()), |
||||
new TransactionTestFixture().createTransaction(sig.generateKeyPair())), |
||||
Collections.emptyList()); |
||||
when(blockchain.getBlockBody(blockHash1)).thenReturn(Optional.of(blockBody1)); |
||||
when(blockchain.getBlockBody(blockHash3)).thenReturn(Optional.of(blockBody3)); |
||||
|
||||
final var resp = resp(new Hash[] {blockHash1, blockHash2, blockHash3}); |
||||
final var result = fromSuccessResp(resp); |
||||
assertThat(result.getPayloadBodies().size()).isEqualTo(3); |
||||
assertThat(result.getPayloadBodies().get(0).getTransactions().size()).isEqualTo(1); |
||||
assertThat(result.getPayloadBodies().get(1)).isNull(); |
||||
assertThat(result.getPayloadBodies().get(2).getTransactions().size()).isEqualTo(3); |
||||
} |
||||
|
||||
@Test |
||||
public void shouldReturnWithdrawalNullWhenBlockIsPreShanghai() { |
||||
final SignatureAlgorithm sig = SignatureAlgorithmFactory.getInstance(); |
||||
final Hash blockHash1 = Hash.wrap(Bytes32.random()); |
||||
final Hash blockHash2 = Hash.wrap(Bytes32.random()); |
||||
final BlockBody preShanghaiBlockBody = |
||||
new BlockBody( |
||||
List.of( |
||||
new TransactionTestFixture().createTransaction(sig.generateKeyPair()), |
||||
new TransactionTestFixture().createTransaction(sig.generateKeyPair()), |
||||
new TransactionTestFixture().createTransaction(sig.generateKeyPair())), |
||||
Collections.emptyList()); |
||||
|
||||
final BlockBody preShanghaiBlockBody2 = |
||||
new BlockBody( |
||||
List.of(new TransactionTestFixture().createTransaction(sig.generateKeyPair())), |
||||
Collections.emptyList(), |
||||
Optional.empty()); |
||||
when(blockchain.getBlockBody(blockHash1)).thenReturn(Optional.of(preShanghaiBlockBody)); |
||||
when(blockchain.getBlockBody(blockHash2)).thenReturn(Optional.of(preShanghaiBlockBody2)); |
||||
|
||||
final var resp = resp(new Hash[] {blockHash1, blockHash2}); |
||||
final var result = fromSuccessResp(resp); |
||||
assertThat(result.getPayloadBodies().size()).isEqualTo(2); |
||||
assertThat(result.getPayloadBodies().get(0).getTransactions().size()).isEqualTo(3); |
||||
assertThat(result.getPayloadBodies().get(0).getWithdrawals()).isNull(); |
||||
assertThat(result.getPayloadBodies().get(1).getTransactions().size()).isEqualTo(1); |
||||
assertThat(result.getPayloadBodies().get(1).getWithdrawals()).isNull(); |
||||
} |
||||
|
||||
@Test |
||||
public void shouldReturnWithdrawalsWhenBlockIsPostShanghai() { |
||||
final SignatureAlgorithm sig = SignatureAlgorithmFactory.getInstance(); |
||||
final Hash blockHash1 = Hash.wrap(Bytes32.random()); |
||||
final Hash blockHash2 = Hash.wrap(Bytes32.random()); |
||||
final Withdrawal withdrawal = |
||||
new Withdrawal(UInt64.ONE, UInt64.ONE, Address.fromHexString("0x1"), GWei.ONE); |
||||
final Withdrawal withdrawal2 = |
||||
new Withdrawal(UInt64.ONE, UInt64.ONE, Address.fromHexString("0x2"), GWei.ONE); |
||||
|
||||
final BlockBody shanghaiBlockBody = |
||||
new BlockBody( |
||||
List.of( |
||||
new TransactionTestFixture().createTransaction(sig.generateKeyPair()), |
||||
new TransactionTestFixture().createTransaction(sig.generateKeyPair()), |
||||
new TransactionTestFixture().createTransaction(sig.generateKeyPair())), |
||||
Collections.emptyList(), |
||||
Optional.of(List.of(withdrawal))); |
||||
|
||||
final BlockBody shanghaiBlockBody2 = |
||||
new BlockBody( |
||||
List.of(new TransactionTestFixture().createTransaction(sig.generateKeyPair())), |
||||
Collections.emptyList(), |
||||
Optional.of(List.of(withdrawal2))); |
||||
when(blockchain.getBlockBody(blockHash1)).thenReturn(Optional.of(shanghaiBlockBody)); |
||||
when(blockchain.getBlockBody(blockHash2)).thenReturn(Optional.of(shanghaiBlockBody2)); |
||||
|
||||
final var resp = resp(new Hash[] {blockHash1, blockHash2}); |
||||
final var result = fromSuccessResp(resp); |
||||
assertThat(result.getPayloadBodies().size()).isEqualTo(2); |
||||
assertThat(result.getPayloadBodies().get(0).getTransactions().size()).isEqualTo(3); |
||||
assertThat(result.getPayloadBodies().get(0).getWithdrawals().size()).isEqualTo(1); |
||||
assertThat(result.getPayloadBodies().get(1).getTransactions().size()).isEqualTo(1); |
||||
assertThat(result.getPayloadBodies().get(1).getWithdrawals().size()).isEqualTo(1); |
||||
} |
||||
|
||||
@Test |
||||
public void shouldReturnErrorWhenRequestExceedsPermittedNumberOfBlocks() { |
||||
final Hash blockHash1 = Hash.wrap(Bytes32.random()); |
||||
final Hash blockHash2 = Hash.wrap(Bytes32.random()); |
||||
final Hash[] hashes = new Hash[] {blockHash1, blockHash2}; |
||||
|
||||
doReturn(1).when(method).getMaxRequestBlocks(); |
||||
|
||||
final JsonRpcResponse resp = resp(hashes); |
||||
final var result = fromErrorResp(resp); |
||||
assertThat(result.getCode()).isEqualTo(INVALID_RANGE_REQUEST_TOO_LARGE.getCode()); |
||||
} |
||||
|
||||
private JsonRpcResponse resp(final Hash[] hashes) { |
||||
return method.response( |
||||
new JsonRpcRequestContext( |
||||
new JsonRpcRequest( |
||||
"2.0", |
||||
RpcMethod.ENGINE_GET_PAYLOAD_BODIES_BY_HASH_V1.getMethodName(), |
||||
new Object[] {hashes}))); |
||||
} |
||||
|
||||
private EngineGetPayloadBodiesResultV1 fromSuccessResp(final JsonRpcResponse resp) { |
||||
assertThat(resp.getType()).isEqualTo(JsonRpcResponseType.SUCCESS); |
||||
return Optional.of(resp) |
||||
.map(JsonRpcSuccessResponse.class::cast) |
||||
.map(JsonRpcSuccessResponse::getResult) |
||||
.map(EngineGetPayloadBodiesResultV1.class::cast) |
||||
.get(); |
||||
} |
||||
|
||||
private JsonRpcError fromErrorResp(final JsonRpcResponse resp) { |
||||
assertThat(resp.getType()).isEqualTo(JsonRpcResponseType.ERROR); |
||||
return Optional.of(resp) |
||||
.map(JsonRpcErrorResponse.class::cast) |
||||
.map(JsonRpcErrorResponse::getError) |
||||
.get(); |
||||
} |
||||
} |
@ -0,0 +1,352 @@ |
||||
/* |
||||
* Copyright Hyperledger Besu Contributors. |
||||
* |
||||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with |
||||
* the License. You may obtain a copy of the License at |
||||
* |
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
* |
||||
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on |
||||
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the |
||||
* specific language governing permissions and limitations under the License. |
||||
* |
||||
* SPDX-License-Identifier: Apache-2.0 |
||||
*/ |
||||
package org.hyperledger.besu.ethereum.api.jsonrpc.internal.methods.engine; |
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat; |
||||
import static org.hyperledger.besu.ethereum.api.jsonrpc.internal.response.JsonRpcError.INVALID_PARAMS; |
||||
import static org.hyperledger.besu.ethereum.api.jsonrpc.internal.response.JsonRpcError.INVALID_RANGE_REQUEST_TOO_LARGE; |
||||
import static org.mockito.Mockito.doReturn; |
||||
import static org.mockito.Mockito.spy; |
||||
import static org.mockito.Mockito.when; |
||||
|
||||
import org.hyperledger.besu.crypto.SignatureAlgorithm; |
||||
import org.hyperledger.besu.crypto.SignatureAlgorithmFactory; |
||||
import org.hyperledger.besu.datatypes.Address; |
||||
import org.hyperledger.besu.datatypes.GWei; |
||||
import org.hyperledger.besu.datatypes.Hash; |
||||
import org.hyperledger.besu.ethereum.ProtocolContext; |
||||
import org.hyperledger.besu.ethereum.api.jsonrpc.RpcMethod; |
||||
import org.hyperledger.besu.ethereum.api.jsonrpc.internal.JsonRpcRequest; |
||||
import org.hyperledger.besu.ethereum.api.jsonrpc.internal.JsonRpcRequestContext; |
||||
import org.hyperledger.besu.ethereum.api.jsonrpc.internal.response.JsonRpcError; |
||||
import org.hyperledger.besu.ethereum.api.jsonrpc.internal.response.JsonRpcErrorResponse; |
||||
import org.hyperledger.besu.ethereum.api.jsonrpc.internal.response.JsonRpcResponse; |
||||
import org.hyperledger.besu.ethereum.api.jsonrpc.internal.response.JsonRpcResponseType; |
||||
import org.hyperledger.besu.ethereum.api.jsonrpc.internal.response.JsonRpcSuccessResponse; |
||||
import org.hyperledger.besu.ethereum.api.jsonrpc.internal.results.BlockResultFactory; |
||||
import org.hyperledger.besu.ethereum.api.jsonrpc.internal.results.EngineGetPayloadBodiesResultV1; |
||||
import org.hyperledger.besu.ethereum.chain.MutableBlockchain; |
||||
import org.hyperledger.besu.ethereum.core.BlockBody; |
||||
import org.hyperledger.besu.ethereum.core.TransactionTestFixture; |
||||
import org.hyperledger.besu.ethereum.core.Withdrawal; |
||||
|
||||
import java.util.Collections; |
||||
import java.util.List; |
||||
import java.util.Optional; |
||||
|
||||
import io.vertx.core.Vertx; |
||||
import org.apache.tuweni.bytes.Bytes32; |
||||
import org.apache.tuweni.units.bigints.UInt64; |
||||
import org.junit.Before; |
||||
import org.junit.Test; |
||||
import org.junit.runner.RunWith; |
||||
import org.mockito.Mock; |
||||
import org.mockito.junit.MockitoJUnitRunner; |
||||
|
||||
@RunWith(MockitoJUnitRunner.class) |
||||
public class EngineGetPayloadBodiesByRangeV1Test { |
||||
private EngineGetPayloadBodiesByRangeV1 method; |
||||
private static final Vertx vertx = Vertx.vertx(); |
||||
private static final BlockResultFactory blockResultFactory = new BlockResultFactory(); |
||||
@Mock private ProtocolContext protocolContext; |
||||
@Mock private EngineCallListener engineCallListener; |
||||
@Mock private MutableBlockchain blockchain; |
||||
|
||||
@Before |
||||
public void before() { |
||||
when(protocolContext.getBlockchain()).thenReturn(blockchain); |
||||
this.method = |
||||
spy( |
||||
new EngineGetPayloadBodiesByRangeV1( |
||||
vertx, protocolContext, blockResultFactory, engineCallListener)); |
||||
} |
||||
|
||||
@Test |
||||
public void shouldReturnExpectedMethodName() { |
||||
assertThat(method.getName()).isEqualTo("engine_getPayloadBodiesByRangeV1"); |
||||
} |
||||
|
||||
@Test |
||||
public void shouldReturnPayloadForKnownNumber() { |
||||
final SignatureAlgorithm sig = SignatureAlgorithmFactory.getInstance(); |
||||
final Hash blockHash1 = Hash.wrap(Bytes32.random()); |
||||
final Hash blockHash2 = Hash.wrap(Bytes32.random()); |
||||
final Hash blockHash3 = Hash.wrap(Bytes32.random()); |
||||
final BlockBody blockBody1 = |
||||
new BlockBody( |
||||
List.of(new TransactionTestFixture().createTransaction(sig.generateKeyPair())), |
||||
Collections.emptyList()); |
||||
final BlockBody blockBody2 = |
||||
new BlockBody( |
||||
List.of( |
||||
new TransactionTestFixture().createTransaction(sig.generateKeyPair()), |
||||
new TransactionTestFixture().createTransaction(sig.generateKeyPair())), |
||||
Collections.emptyList()); |
||||
final BlockBody blockBody3 = |
||||
new BlockBody( |
||||
List.of( |
||||
new TransactionTestFixture().createTransaction(sig.generateKeyPair()), |
||||
new TransactionTestFixture().createTransaction(sig.generateKeyPair()), |
||||
new TransactionTestFixture().createTransaction(sig.generateKeyPair())), |
||||
Collections.emptyList()); |
||||
when(blockchain.getChainHeadBlockNumber()).thenReturn(Long.valueOf(130)); |
||||
when(blockchain.getBlockBody(blockHash1)).thenReturn(Optional.of(blockBody1)); |
||||
when(blockchain.getBlockBody(blockHash2)).thenReturn(Optional.of(blockBody2)); |
||||
when(blockchain.getBlockBody(blockHash3)).thenReturn(Optional.of(blockBody3)); |
||||
when(blockchain.getBlockHashByNumber(123)).thenReturn(Optional.of(blockHash1)); |
||||
when(blockchain.getBlockHashByNumber(124)).thenReturn(Optional.of(blockHash2)); |
||||
when(blockchain.getBlockHashByNumber(125)).thenReturn(Optional.of(blockHash3)); |
||||
|
||||
final var resp = resp("0x7b", "0x3"); |
||||
final EngineGetPayloadBodiesResultV1 result = fromSuccessResp(resp); |
||||
assertThat(result.getPayloadBodies().size()).isEqualTo(3); |
||||
assertThat(result.getPayloadBodies().get(0).getTransactions().size()).isEqualTo(1); |
||||
assertThat(result.getPayloadBodies().get(1).getTransactions().size()).isEqualTo(2); |
||||
assertThat(result.getPayloadBodies().get(2).getTransactions().size()).isEqualTo(3); |
||||
} |
||||
|
||||
@Test |
||||
public void shouldReturnNullForUnknownNumber() { |
||||
when(blockchain.getChainHeadBlockNumber()).thenReturn(Long.valueOf(130)); |
||||
final var resp = resp("0x7b", "0x3"); |
||||
final EngineGetPayloadBodiesResultV1 result = fromSuccessResp(resp); |
||||
assertThat(result.getPayloadBodies().size()).isEqualTo(3); |
||||
assertThat(result.getPayloadBodies().get(0)).isNull(); |
||||
assertThat(result.getPayloadBodies().get(1)).isNull(); |
||||
assertThat(result.getPayloadBodies().get(2)).isNull(); |
||||
} |
||||
|
||||
@Test |
||||
public void shouldReturnNullForUnknownNumberAndPayloadForKnownNumber() { |
||||
final SignatureAlgorithm sig = SignatureAlgorithmFactory.getInstance(); |
||||
final Hash blockHash1 = Hash.wrap(Bytes32.random()); |
||||
final Hash blockHash3 = Hash.wrap(Bytes32.random()); |
||||
final BlockBody blockBody1 = |
||||
new BlockBody( |
||||
List.of(new TransactionTestFixture().createTransaction(sig.generateKeyPair())), |
||||
Collections.emptyList()); |
||||
final BlockBody blockBody3 = |
||||
new BlockBody( |
||||
List.of( |
||||
new TransactionTestFixture().createTransaction(sig.generateKeyPair()), |
||||
new TransactionTestFixture().createTransaction(sig.generateKeyPair()), |
||||
new TransactionTestFixture().createTransaction(sig.generateKeyPair())), |
||||
Collections.emptyList()); |
||||
when(blockchain.getChainHeadBlockNumber()).thenReturn(Long.valueOf(130)); |
||||
when(blockchain.getBlockBody(blockHash1)).thenReturn(Optional.of(blockBody1)); |
||||
when(blockchain.getBlockBody(blockHash3)).thenReturn(Optional.of(blockBody3)); |
||||
when(blockchain.getBlockHashByNumber(123)).thenReturn(Optional.of(blockHash1)); |
||||
when(blockchain.getBlockHashByNumber(125)).thenReturn(Optional.of(blockHash3)); |
||||
|
||||
final var resp = resp("0x7b", "0x3"); |
||||
final var result = fromSuccessResp(resp); |
||||
assertThat(result.getPayloadBodies().size()).isEqualTo(3); |
||||
assertThat(result.getPayloadBodies().get(0).getTransactions().size()).isEqualTo(1); |
||||
assertThat(result.getPayloadBodies().get(1)).isNull(); |
||||
assertThat(result.getPayloadBodies().get(2).getTransactions().size()).isEqualTo(3); |
||||
} |
||||
|
||||
@Test |
||||
public void shouldReturnNullForWithdrawalsWhenBlockIsPreShanghai() { |
||||
final SignatureAlgorithm sig = SignatureAlgorithmFactory.getInstance(); |
||||
final Hash blockHash1 = Hash.wrap(Bytes32.random()); |
||||
final Hash blockHash2 = Hash.wrap(Bytes32.random()); |
||||
|
||||
final BlockBody preShanghaiBlockBody = |
||||
new BlockBody( |
||||
List.of( |
||||
new TransactionTestFixture().createTransaction(sig.generateKeyPair()), |
||||
new TransactionTestFixture().createTransaction(sig.generateKeyPair()), |
||||
new TransactionTestFixture().createTransaction(sig.generateKeyPair())), |
||||
Collections.emptyList()); |
||||
|
||||
final BlockBody preShanghaiBlockBody2 = |
||||
new BlockBody( |
||||
List.of(new TransactionTestFixture().createTransaction(sig.generateKeyPair())), |
||||
Collections.emptyList(), |
||||
Optional.empty()); |
||||
when(blockchain.getChainHeadBlockNumber()).thenReturn(Long.valueOf(130)); |
||||
when(blockchain.getBlockBody(blockHash1)).thenReturn(Optional.of(preShanghaiBlockBody)); |
||||
when(blockchain.getBlockBody(blockHash2)).thenReturn(Optional.of(preShanghaiBlockBody2)); |
||||
when(blockchain.getBlockHashByNumber(123)).thenReturn(Optional.of(blockHash1)); |
||||
when(blockchain.getBlockHashByNumber(124)).thenReturn(Optional.of(blockHash2)); |
||||
|
||||
final var resp = resp("0x7b", "0x2"); |
||||
final var result = fromSuccessResp(resp); |
||||
assertThat(result.getPayloadBodies().size()).isEqualTo(2); |
||||
assertThat(result.getPayloadBodies().get(0).getTransactions().size()).isEqualTo(3); |
||||
assertThat(result.getPayloadBodies().get(0).getWithdrawals()).isNull(); |
||||
assertThat(result.getPayloadBodies().get(1).getTransactions().size()).isEqualTo(1); |
||||
assertThat(result.getPayloadBodies().get(1).getWithdrawals()).isNull(); |
||||
; |
||||
} |
||||
|
||||
@Test |
||||
public void shouldReturnWithdrawalsWhenBlockIsPostShanghai() { |
||||
final SignatureAlgorithm sig = SignatureAlgorithmFactory.getInstance(); |
||||
final Hash blockHash1 = Hash.wrap(Bytes32.random()); |
||||
final Hash blockHash2 = Hash.wrap(Bytes32.random()); |
||||
final Withdrawal withdrawal = |
||||
new Withdrawal(UInt64.ONE, UInt64.ONE, Address.fromHexString("0x1"), GWei.ONE); |
||||
final Withdrawal withdrawal2 = |
||||
new Withdrawal(UInt64.ONE, UInt64.ONE, Address.fromHexString("0x2"), GWei.ONE); |
||||
|
||||
final BlockBody shanghaiBlockBody = |
||||
new BlockBody( |
||||
List.of( |
||||
new TransactionTestFixture().createTransaction(sig.generateKeyPair()), |
||||
new TransactionTestFixture().createTransaction(sig.generateKeyPair()), |
||||
new TransactionTestFixture().createTransaction(sig.generateKeyPair())), |
||||
Collections.emptyList(), |
||||
Optional.of(List.of(withdrawal))); |
||||
|
||||
final BlockBody shanghaiBlockBody2 = |
||||
new BlockBody( |
||||
List.of(new TransactionTestFixture().createTransaction(sig.generateKeyPair())), |
||||
Collections.emptyList(), |
||||
Optional.of(List.of(withdrawal2))); |
||||
when(blockchain.getChainHeadBlockNumber()).thenReturn(Long.valueOf(130)); |
||||
when(blockchain.getBlockBody(blockHash1)).thenReturn(Optional.of(shanghaiBlockBody)); |
||||
when(blockchain.getBlockBody(blockHash2)).thenReturn(Optional.of(shanghaiBlockBody2)); |
||||
when(blockchain.getBlockHashByNumber(123)).thenReturn(Optional.of(blockHash1)); |
||||
when(blockchain.getBlockHashByNumber(124)).thenReturn(Optional.of(blockHash2)); |
||||
|
||||
final var resp = resp("0x7b", "0x2"); |
||||
final var result = fromSuccessResp(resp); |
||||
assertThat(result.getPayloadBodies().size()).isEqualTo(2); |
||||
assertThat(result.getPayloadBodies().get(0).getTransactions().size()).isEqualTo(3); |
||||
assertThat(result.getPayloadBodies().get(0).getWithdrawals().size()).isEqualTo(1); |
||||
assertThat(result.getPayloadBodies().get(1).getTransactions().size()).isEqualTo(1); |
||||
assertThat(result.getPayloadBodies().get(1).getWithdrawals().size()).isEqualTo(1); |
||||
} |
||||
|
||||
@Test |
||||
public void shouldNotContainTrailingNullForBlocksPastTheCurrentHead() { |
||||
final SignatureAlgorithm sig = SignatureAlgorithmFactory.getInstance(); |
||||
final Hash blockHash1 = Hash.wrap(Bytes32.random()); |
||||
final Withdrawal withdrawal = |
||||
new Withdrawal(UInt64.ONE, UInt64.ONE, Address.fromHexString("0x1"), GWei.ONE); |
||||
|
||||
final BlockBody shanghaiBlockBody = |
||||
new BlockBody( |
||||
List.of( |
||||
new TransactionTestFixture().createTransaction(sig.generateKeyPair()), |
||||
new TransactionTestFixture().createTransaction(sig.generateKeyPair()), |
||||
new TransactionTestFixture().createTransaction(sig.generateKeyPair())), |
||||
Collections.emptyList(), |
||||
Optional.of(List.of(withdrawal))); |
||||
when(blockchain.getChainHeadBlockNumber()).thenReturn(Long.valueOf(123)); |
||||
when(blockchain.getBlockBody(blockHash1)).thenReturn(Optional.of(shanghaiBlockBody)); |
||||
when(blockchain.getBlockHashByNumber(123)).thenReturn(Optional.of(blockHash1)); |
||||
|
||||
final var resp = resp("0x7b", "0x3"); |
||||
final var result = fromSuccessResp(resp); |
||||
assertThat(result.getPayloadBodies().size()).isEqualTo(1); |
||||
} |
||||
|
||||
@Test |
||||
public void shouldReturnUpUntilHeadWhenStartBlockPlusCountEqualsHeadNumber() { |
||||
final SignatureAlgorithm sig = SignatureAlgorithmFactory.getInstance(); |
||||
final Hash blockHash1 = Hash.wrap(Bytes32.random()); |
||||
final Hash blockHash2 = Hash.wrap(Bytes32.random()); |
||||
final Hash blockHash3 = Hash.wrap(Bytes32.random()); |
||||
final Withdrawal withdrawal = |
||||
new Withdrawal(UInt64.ONE, UInt64.ONE, Address.fromHexString("0x1"), GWei.ONE); |
||||
|
||||
final BlockBody shanghaiBlockBody = |
||||
new BlockBody( |
||||
List.of(new TransactionTestFixture().createTransaction(sig.generateKeyPair())), |
||||
Collections.emptyList(), |
||||
Optional.of(List.of(withdrawal))); |
||||
final BlockBody shanghaiBlockBody2 = |
||||
new BlockBody( |
||||
List.of(new TransactionTestFixture().createTransaction(sig.generateKeyPair())), |
||||
Collections.emptyList(), |
||||
Optional.of(List.of(withdrawal))); |
||||
final BlockBody shanghaiBlockBody3 = |
||||
new BlockBody( |
||||
List.of(new TransactionTestFixture().createTransaction(sig.generateKeyPair())), |
||||
Collections.emptyList(), |
||||
Optional.of(List.of(withdrawal))); |
||||
when(blockchain.getChainHeadBlockNumber()).thenReturn(Long.valueOf(125)); |
||||
when(blockchain.getBlockBody(blockHash1)).thenReturn(Optional.of(shanghaiBlockBody)); |
||||
when(blockchain.getBlockBody(blockHash2)).thenReturn(Optional.of(shanghaiBlockBody2)); |
||||
when(blockchain.getBlockBody(blockHash3)).thenReturn(Optional.of(shanghaiBlockBody3)); |
||||
when(blockchain.getBlockHashByNumber(123)).thenReturn(Optional.of(blockHash1)); |
||||
when(blockchain.getBlockHashByNumber(124)).thenReturn(Optional.of(blockHash2)); |
||||
when(blockchain.getBlockHashByNumber(125)).thenReturn(Optional.of(blockHash3)); |
||||
|
||||
final var resp = resp("0x7b", "0x3"); |
||||
final var result = fromSuccessResp(resp); |
||||
assertThat(result.getPayloadBodies().size()).isEqualTo(3); |
||||
} |
||||
|
||||
@Test |
||||
public void ShouldReturnEmptyPayloadForRequestsPastCurrentHead() { |
||||
|
||||
when(blockchain.getChainHeadBlockNumber()).thenReturn(Long.valueOf(123)); |
||||
final JsonRpcResponse resp = resp("0x7d", "0x3"); |
||||
final var result = fromSuccessResp(resp); |
||||
assertThat(result.getPayloadBodies()).isEqualTo(Collections.EMPTY_LIST); |
||||
} |
||||
|
||||
@Test |
||||
public void shouldReturnErrorWhenRequestExceedsPermittedNumberOfBlocks() { |
||||
doReturn(3).when(method).getMaxRequestBlocks(); |
||||
final JsonRpcResponse resp = resp("0x539", "0x4"); |
||||
final var result = fromErrorResp(resp); |
||||
assertThat(result.getCode()).isEqualTo(INVALID_RANGE_REQUEST_TOO_LARGE.getCode()); |
||||
} |
||||
|
||||
@Test |
||||
public void shouldReturnInvalidParamsIfStartIsZero() { |
||||
final JsonRpcResponse resp = resp("0x0", "0x539"); |
||||
final var result = fromErrorResp(resp); |
||||
assertThat(result.getCode()).isEqualTo(INVALID_PARAMS.getCode()); |
||||
} |
||||
|
||||
@Test |
||||
public void shouldReturnInvalidParamsIfCountIsZero() { |
||||
final JsonRpcResponse resp = resp("0x539", "0x0"); |
||||
final var result = fromErrorResp(resp); |
||||
assertThat(result.getCode()).isEqualTo(INVALID_PARAMS.getCode()); |
||||
} |
||||
|
||||
private JsonRpcResponse resp(final String startBlockNumber, final String range) { |
||||
return method.response( |
||||
new JsonRpcRequestContext( |
||||
new JsonRpcRequest( |
||||
"2.0", |
||||
RpcMethod.ENGINE_GET_PAYLOAD_BODIES_BY_RANGE_V1.getMethodName(), |
||||
new Object[] {startBlockNumber, range}))); |
||||
} |
||||
|
||||
private EngineGetPayloadBodiesResultV1 fromSuccessResp(final JsonRpcResponse resp) { |
||||
assertThat(resp.getType()).isEqualTo(JsonRpcResponseType.SUCCESS); |
||||
return Optional.of(resp) |
||||
.map(JsonRpcSuccessResponse.class::cast) |
||||
.map(JsonRpcSuccessResponse::getResult) |
||||
.map(EngineGetPayloadBodiesResultV1.class::cast) |
||||
.get(); |
||||
} |
||||
|
||||
private JsonRpcError fromErrorResp(final JsonRpcResponse resp) { |
||||
assertThat(resp.getType()).isEqualTo(JsonRpcResponseType.ERROR); |
||||
return Optional.of(resp) |
||||
.map(JsonRpcErrorResponse.class::cast) |
||||
.map(JsonRpcErrorResponse::getError) |
||||
.get(); |
||||
} |
||||
} |
@ -1 +1 @@ |
||||
Subproject commit 69c4c2a98dc8a712d4c6f5a817da4f21ff719006 |
||||
Subproject commit 638da7ca7b2ca371ebb33d7d7d2562981aafd9b2 |
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,170 @@ |
||||
{ |
||||
"PrecompileReturnValue": "000000000000000000000000000000000000000000000000000000000000100073eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000001", |
||||
"TestCases": [ |
||||
{ |
||||
"Input": "01c357eb79e30f84b7f1b78e2dc064d5e889714a94a879218ffe6ffea8467682a645f2136c180538e24425f70b7607c87f7cb892193b242b86750f13de96c44febbab307c43d34e34553a2cb7115749fd5aef0958386e668419b3ef6f1eac524a97456b8097baed6e90ce381d2b21c970a3f9ad4f6c92b1bb26337f919bd639dd43bd470839153db09115e2862051f33a8cd9ff4ff4f98ba4ea89e80747cfdc694ac9969b841c8d558dc41bceb3c8f97c8c48c1409304ec70176c4e24fc7f6fa", |
||||
"FailureMode": "", |
||||
"Valid": true |
||||
}, |
||||
{ |
||||
"Input": "012801238108394529333e45adfaff59edde33727fa766ee99752921b472893611f5bc1101693a3a77098f71ec13c7ccaf4542a037b9397dd4ebe522e05d9d47629f4dddbcf4a5c28f5b09c9bee1895d3de14ea9312df7cf607d09517eb7863dabb6bcbe313530ce7779abdf633d5a3594a41fbad9a79f4a9b46b89c0cfe78f6a15948dec92c4404aedac8b5e7dd60598a963e56a55c2659c306beeb49ac79b7bd375fad150619b2fb5d835ee8f8305c3aac541ca6adad9be851b4f6dca5cd73", |
||||
"FailureMode": "", |
||||
"Valid": true |
||||
}, |
||||
{ |
||||
"Input": "0116f63b849a1a5704c55538e61f3576b09fe82fe038a39c96a3cd97986777a97ca4870f96b96f3c0ccef8ebccb186d1df0eccad55374fcf2262bc32e224763f5ac3abbe48a5c2f3731087f86bbf567910fe098f6183a2be6c1bd97ed2e1c562a4429aefed1de5145c9426c68b2fa5dc9ac0bd0c7d0420e0763824849abf47ff9be8942d481525d54dbf8d2508490e42a5e6166b8755b63c54b54802049c01c4a79b6c55b3cf3b7a22e9382cf4960f703b339622aa530e0961ef6747faf3ebf3", |
||||
"FailureMode": "", |
||||
"Valid": true |
||||
}, |
||||
{ |
||||
"Input": "01aebaf22aa7b4019a4917f97176f9c0e79513f1e297b4daef1158fbed94f8afe753520d2b0aa53ea1926266ad4f46d60fd855bb73b5642171d89242e4eb4e3735096476da0d660f9e2913bbe7d29301fa96a178d02349323fac041d6ac1070d934abbb7ff0028c06ce8d27accbf0312fd4bfd55e58e6d8920aaf9d7d51f1a59ac00b34e7eedf5464ddf69b3c6e3e8d1b577b30ec9d82eb5e56827c875fb33892e29b504198fa7a6b196ac7cd6d64838ca452d94adeb57f1ae4b5d894d26d616", |
||||
"FailureMode": "", |
||||
"Valid": true |
||||
}, |
||||
{ |
||||
"Input": "016ee58067bdbc41ad3978fb379e8fe3ab0bc4cda0f131ee9baf2db213cd4dc552031d0bc05ada403657cce08ded05db3fa1dfc891337a73bf4e6952e6b2272f02b04885539a8052bd8e104f6f894fca92355da265a04fc5a16b2fca2e016252a90cf079520942b69d207a57445406dc1f539f60467cf2bcd805814190ea87280103f02e68e50a314b25dea197c2543488e5992ffd5e03890ef5c362569a670b955cb11d923b176b152750e853190ee7dd6b56074f009580e191d79e3888bc26", |
||||
"FailureMode": "", |
||||
"Valid": true |
||||
}, |
||||
{ |
||||
"Input": "01bbbb1a74e35dd8cb8faec442693b1355f40ab9d0b44c47a9ec8ff197987929bdb2e70855ab0f43cb1b365b6e8bc5df6f6a69d6afb18fc50dc53f62e879002728aa2577ad9b59293956d5d76783b1e54c1777d3ebc2ac5dea349f10a66735399913a98b55d225411649847f9cf0c5afedf4f30623392cea17ed509864d8e0d87ecfa303e0f9c9c083456d9125a3a8d5b723e9a64edda406fc74ab8685039dd6039b6d2f8ed8d15887776860d7ea57a3767410a4eb46bba045f925b41e2fa299", |
||||
"FailureMode": "", |
||||
"Valid": true |
||||
}, |
||||
{ |
||||
"Input": "01792bd31013b362e1383652ea9c6d7d0f6c7880f4478eab785923d2a24417fe2862b206eafb444560e09fd54e2985e49f33f3e3cd2fa5175c3b1672ea40d91e808310a87ca1c24a2b2258c38e495d0df51d1cea6c11431679cc04a8468c9f5a86bdcd35acafb637235ccb8c908332cea2ca9e4efa5afc66c24f9f3ea0281ff3c588b147d90844248b36b79cbae7d016b6c46951710384a5fc425bfc89f804b9bfe0148805c54162a4ec091e5bf063db88577b12b9839def3fb15ab4b15e46e8", |
||||
"FailureMode": "", |
||||
"Valid": true |
||||
}, |
||||
{ |
||||
"Input": "0111c228100fd51f22a0be9e86211f971ab6c7a5dfe6988b5b45e159c77d937b93117d047f4c7a47f5a409502fc744e9cffc7cf1ebadba69aab1ec81ec07b2166770490221efc59c136280d4152adcfee9dbd2d17b6b727a4838373258054631b416564857a5239934c918dd7ce1585016082ca9bb79a0626d1ccb00afcd458910d69b36e69752791ff49736af318707855231b9ecc3cd8ed8f52eb31673482ad804ccaeeadb91fda7104f90b483d609fefa5b677efe9ceb772a4d80decbf404", |
||||
"FailureMode": "", |
||||
"Valid": true |
||||
}, |
||||
{ |
||||
"Input": "016d0d27b2a1b5266e1f6fe2f987bff57bd67157222831d9260f782dbf85e957fec04702149daf498a6973ca0f6504eeffc506ff092cd0bbf827c391eece8a0e004ddc8a839cd6c7d381795dd08e8ef23e97f59e7c34457f3aa802b5edbba35a94c3f402eb91cf43a4f502d486f22f0f04bd99c1a8180353d93e6c612ddb22c7838d3e03c471b4289bd2fd5060a615379172bbbf1f4606d3c777886412b18c5e551b098d9373cec1957dc333e9b83d0306941c61a7a0fdf031f243c4e2fc0919", |
||||
"FailureMode": "", |
||||
"Valid": true |
||||
}, |
||||
{ |
||||
"Input": "011459b168df56c35b2a1712329aabd7f904735dfb7e948b12869a4396d7cb9e69701200a9ede44b1f2edd44f002c4f22f8f900c28aae50d479e99a1f0956306740e0b40715e2d1d5b32c1960253f8a2b2c32db833279863237e1da14867b24b840eedd5e97ba21d82aaa67583b8f9b8936b1d0e11e69c77ab9f8381cf47f3013dc258944bf04fd91fe5663aa33b5397a05bcb8545682fbdc37663bbf01010c13164a422915a9c8961efe82825fb68302a3435ed2cf7e01bbac059a420277f05", |
||||
"FailureMode": "", |
||||
"Valid": true |
||||
}, |
||||
{ |
||||
"Input": "01dc43cf428476b6fde56262f081988eeeb5ae6e665a2fcbcd667f93b474ebc9d51fddfd3c3e1a4eb34e45bfd344414b6530bc234e003593dd910ddb45042a72c1f4fd101b80df1af58a2d77804c711e999d09a90f2e379ef18c752dd3866e34ac51bce1515c3df45ee85b5342c88291288a171f8799d31b1e77ff2d692f3f1f6880e2fd0262132fdaac0e4245958fafaaed1182c6af9f27f01e9e0c47dd3278496c3d3b4126c9f62a6fb81542d3223a480323fa09fb524ad4f70c83f46150f1", |
||||
"FailureMode": "", |
||||
"Valid": true |
||||
}, |
||||
{ |
||||
"Input": "0111c36a6aa83254e02e96995ac0ac766f5edadd8044fd0170d4e459df72267a40cfa7fbd18e4f504813af39b4e2005095f945316c7e4ae52b08e4ea47cb026a43dfedc72048fbe7a9107e8abcdca472f722cd3327c78a6a1dd475d556e1063f8a6775af1fb1d442d7fef688d3e34aa7055e131fa13be05528cde77479d33ffd2f21708b479d3e36fabff48ccaceec19acbd62bfac28c7f29f62e0e3b8587fb50abd49370c1e164f3555abbe9199aabacf170d7c39beafb36506ec73847a6729", |
||||
"FailureMode": "", |
||||
"Valid": true |
||||
}, |
||||
{ |
||||
"Input": "014adbe3d78e1a41777dc899baa9597dc97bcffa2bc6d8f79fe9de417078d8f8ab7e72f966df8452ddd718b49480c054c5c2cf3e8afc5f377a7ebafa4992db617d7ec99ffb7dac5dd4d5dc011447816b11b46094b584d5070fb620ef71edb114a8d63144a4ed21007c816a63e56701ad142dd4a26feaf9249040246b1b290450fac06edfc3f223e98aca2b7c758c459884b90ccabd00e842e492ffdea7495f3732dd2cfe142892400089b121bcac3dd21ab347d0f6dc092f23710354ea071438", |
||||
"FailureMode": "", |
||||
"Valid": true |
||||
}, |
||||
{ |
||||
"Input": "01cbb255a9e362102497d90841b3099aa812f281980b20c12951fdfdc30204c7162e3df7fb2fba54729c822e751e8059f58b594ca87a7589c8f4900a4c59b45904ec35e25ea7595f7e7352abbe50d6c1fa57c612b43cf77d17ab598ffa0f023f8a20f1cbae3472de159c30b66bcec852689326c449720ffeaa87d5b86629489ce1a5c660bb06c2a2539dcf1438d2c960a246002bcfe66adb8f9463c873b855ade410313c5128a8adfab5492da5e662cc556999ee653b697a449a21628c1585c7", |
||||
"FailureMode": "", |
||||
"Valid": true |
||||
}, |
||||
{ |
||||
"Input": "0103a676648fcc81830d61b0b07937aaf48690aeda04d5b02b5a251bd5ca5c4f81dd07f59080ef560761eca855bc3f5e2555e359c6f88adb166b671a4e208d51e6ecb876da33438c5cf8fe1463008e14d012cda7365474e61148e2eb76d3910a852f33ed26a17a7a6b9db96b03c110d5709251a5377d0e86d4349bce0610d01ae2d6c4e2a45aea1d20822988bcbca345b17fca68d1b4024f157d9b81f57ff2917d0101f8e02cc05ae8c6655102b4dd55d8461c6f971f5111f1f0b82338837cb5", |
||||
"FailureMode": "", |
||||
"Valid": true |
||||
}, |
||||
{ |
||||
"Input": "01e7ab7a7aaea9ee3e2fc8d17bde6badc12e2bf824bfe8db0eafc43dd0762bf1ec8cd2f225d124599c255623365aff62551e6d67e476a02d65e13d2a50e76549efae7b3b28a8d235894e618237f4abaffaa500fff7cb926e9309a7d4fe7eb53cab1484ed8e82a622d2647871e0e784fc676e55047dde4cf156b2036f937562dfff92102fd993352513fb75913935b47e89dc14149659b5d999abd29d2fc33f76b287b0140434c6c26c214fb0aa3f1ac27369ea89f4b2ab79aa03040720d32c67", |
||||
"FailureMode": "", |
||||
"Valid": true |
||||
}, |
||||
{ |
||||
"Input": "010b73d38034466a538f1acaf463f7575d3d3f4baa23dcf6d559700e8fb5fd82573c9df0ba215a5b31eabf9d16f8be6785e7f67402f5b57fb357143a52ae3e4144abb69b6b607cce5f1830f05ad98f8c184d39a1c76d860876fffb5852fc450fa372cb9c0a5b0c14406f59e4926acde14f737d69d4a926906fbabad357e743f2ecab5a7da7e5384dca593697eaeaf58aa1b8b02d82fac14d98121dae7e04d9f3e38a5fc4164e0d0dd6692ba0b55b8063d4aee0987a0f811396617f4045609a71", |
||||
"FailureMode": "", |
||||
"Valid": true |
||||
}, |
||||
{ |
||||
"Input": "013e3ff78fc9bb6c6564d205fe1064aa6e11eddef9f0e985d8f364005d03c22fc2eb67ee4f728f5dc6ae2918f7957e6cb5b080822073cbd101ceea4954751739e3e04001d6c2037a831ff7ad639fbdb277264edd75b50d025eb183120464f940a86e11eedc9683475153b147c8ce10ae29495aed6cf2e58c5c3385f1be4d2162696d0488a94b4a2a552eeb0502eae3cc80049aaaf808839090c40d57463ffb5b56228d88f2329b5811ac7f5931085fa7360876a58893cc049debf820bc7ab88b", |
||||
"FailureMode": "", |
||||
"Valid": true |
||||
}, |
||||
{ |
||||
"Input": "019f4cc64584a59f7d924fb921ede13a7a04c1d595bdd96ba66722baeb145e862d9b32ece4c2c45f5b739392d7333e71e5790a903ef1e0235044c159563cf0309ae1b4c885a4afeb472ccf74b3ec7d68044ab28890a647d76939d31097645025817785fe342e0354ee0845753542d0eaff5c0acb9a7c2206de60c930a57c81b6db2e2b414ba3ab2730f3364f7d35dfdfa4df917a3c7c9e3457871234e6bf9a35ad025f0e40ef2a2502a5024c7f0ce709cc27c3bd2399c9a1ec02238d38124c9e", |
||||
"FailureMode": "", |
||||
"Valid": true |
||||
}, |
||||
{ |
||||
"Input": "0128f689b5b1121319a69abacd871979a1075506bd04ac7f08399a1996626201984afde97913fa61f037fd0cb8d1fd751543949d5c6ff6759eba97695803c9284b3b9280d5b4d8f18181f4a0d199bd69e63463b75a2722835b23fe5145711a5997885c37b0edb98b1569af211135fa3b2ec29871005ef58bd429533bbabb70275840fec04fdd4fc327c730d0919fb0d08bd1b47fac65f7874afc7d394b5873c48c82a70e67c5c4dac616896fcec24df35f7e1ac5a6236927671d11aaa0a25c71", |
||||
"FailureMode": "", |
||||
"Valid": true |
||||
}, |
||||
{ |
||||
"Input": "", |
||||
"FailureMode": "incorrectPrecompileLength", |
||||
"Valid": false |
||||
}, |
||||
{ |
||||
"Input": "01c357eb79e30f84b7f1b78e2dc064d5e889714a94a879218ffe6ffea8467682a645f2136c180538e24425f70b7607c87f7cb892193b242b86750f13de96c44febbab307c43d34e34553a2cb7115749fd5aef0958386e668419b3ef6f1eac5", |
||||
"FailureMode": "incorrectPrecompileLength", |
||||
"Valid": false |
||||
}, |
||||
{ |
||||
"Input": "01c357eb79e30f84b7f1b78e2dc064d5e889714a94a879218ffe6ffea8467682a645f2136c180538e24425f70b7607c87f7cb892193b242b86750f13de96c44febbab307c43d34e34553a2cb7115749fd5aef0958386e668419b3ef6f1eac524a97456b8097baed6e90ce381d2b21c970a3f9ad4f6c92b1bb26337f919bd639dd43bd470839153db09115e2862051f33a8cd9ff4ff4f98ba4ea89e80747cfdc694ac9969b841c8d558dc41bceb3c8f97c8c48c1409304ec70176c4e24fc7f6fa01c357eb79e30f84b7f1b78e2dc064d5e889714a94a879218ffe6ffea8467682a645f2136c180538e24425f70b7607c87f7cb892193b242b86750f13de96c44febbab307c43d34e34553a2cb7115749fd5aef0958386e668419b3ef6f1eac524a97456b8097baed6e90ce381d2b21c970a3f9ad4f6c92b1bb26337f919bd639dd43bd470839153db09115e2862051f33a8cd9ff4ff4f98ba4ea89e80747cfdc694ac9969b841c8d558dc41bceb3c8f97c8c48c1409304ec70176c4e24fc7f6fa", |
||||
"FailureMode": "incorrectPrecompileLength", |
||||
"Valid": false |
||||
}, |
||||
{ |
||||
"Input": "01c357eb79e30f84b7f1b78e2dc064d5e889714a94a879218ffe6ffea8467682c3b23e313cacf2ce5e5e13219c5a54851bc51a0ef723a0e13805186b13f245a7ebbab307c43d34e34553a2cb7115749fd5aef0958386e668419b3ef6f1eac524a97456b8097baed6e90ce381d2b21c970a3f9ad4f6c92b1bb26337f919bd639dd43bd470839153db09115e2862051f33a8cd9ff4ff4f98ba4ea89e80747cfdc694ac9969b841c8d558dc41bceb3c8f97c8c48c1409304ec70176c4e24fc7f6fa", |
||||
"FailureMode": "nonCanonicalInputPoint", |
||||
"Valid": false |
||||
}, |
||||
{ |
||||
"Input": "01c357eb79e30f84b7f1b78e2dc064d5e889714a94a879218ffe6ffea8467682a645f2136c180538e24425f70b7607c87f7cb892193b242b86750f13de96c44f98b392451fdc18899c205e8b9f9286daf331b974cba0af44e3343dc307b3baeca97456b8097baed6e90ce381d2b21c970a3f9ad4f6c92b1bb26337f919bd639dd43bd470839153db09115e2862051f33a8cd9ff4ff4f98ba4ea89e80747cfdc694ac9969b841c8d558dc41bceb3c8f97c8c48c1409304ec70176c4e24fc7f6fa", |
||||
"FailureMode": "nonCanonicalOutputPoint", |
||||
"Valid": false |
||||
}, |
||||
{ |
||||
"Input": "01c357eb79e30f84b7f1b78e2dc064d5e889714a94a879218ffe6ffea8467682a645f2136c180538e24425f70b7607c87f7cb892193b242b86750f13de96c44febbab307c43d34e34553a2cb7115749fd5aef0958386e668419b3ef6f1eac524000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a8cd9ff4ff4f98ba4ea89e80747cfdc694ac9969b841c8d558dc41bceb3c8f97c8c48c1409304ec70176c4e24fc7f6fa", |
||||
"FailureMode": "cannotDeserialiseCommitment", |
||||
"Valid": false |
||||
}, |
||||
{ |
||||
"Input": "01c357eb79e30f84b7f1b78e2dc064d5e889714a94a879218ffe6ffea8467682a645f2136c180538e24425f70b7607c87f7cb892193b242b86750f13de96c44febbab307c43d34e34553a2cb7115749fd5aef0958386e668419b3ef6f1eac524ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa8cd9ff4ff4f98ba4ea89e80747cfdc694ac9969b841c8d558dc41bceb3c8f97c8c48c1409304ec70176c4e24fc7f6fa", |
||||
"FailureMode": "cannotDeserialiseCommitment", |
||||
"Valid": false |
||||
}, |
||||
{ |
||||
"Input": "01c357eb79e30f84b7f1b78e2dc064d5e889714a94a879218ffe6ffea8467682a645f2136c180538e24425f70b7607c87f7cb892193b242b86750f13de96c44febbab307c43d34e34553a2cb7115749fd5aef0958386e668419b3ef6f1eac524a97456b8097baed6e90ce381d2b21c970a3f9ad4f6c92b1bb26337f919bd639dd43bd470839153db09115e2862051f33000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", |
||||
"FailureMode": "cannotDeserialiseProof", |
||||
"Valid": false |
||||
}, |
||||
{ |
||||
"Input": "01c357eb79e30f84b7f1b78e2dc064d5e889714a94a879218ffe6ffea8467682a645f2136c180538e24425f70b7607c87f7cb892193b242b86750f13de96c44febbab307c43d34e34553a2cb7115749fd5aef0958386e668419b3ef6f1eac524a97456b8097baed6e90ce381d2b21c970a3f9ad4f6c92b1bb26337f919bd639dd43bd470839153db09115e2862051f33ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", |
||||
"FailureMode": "cannotDeserialiseProof", |
||||
"Valid": false |
||||
}, |
||||
{ |
||||
"Input": "01c357eb79e30f84b7f1b78e2dc064d5e889714a94a879218ffe6ffea84676820000000000000000000000000000000000000000000000000000000000000000ebbab307c43d34e34553a2cb7115749fd5aef0958386e668419b3ef6f1eac524a97456b8097baed6e90ce381d2b21c970a3f9ad4f6c92b1bb26337f919bd639dd43bd470839153db09115e2862051f33a8cd9ff4ff4f98ba4ea89e80747cfdc694ac9969b841c8d558dc41bceb3c8f97c8c48c1409304ec70176c4e24fc7f6fa", |
||||
"FailureMode": "invalidOpening", |
||||
"Valid": false |
||||
}, |
||||
{ |
||||
"Input": "01c357eb79e30f84b7f1b78e2dc064d5e889714a94a879218ffe6ffea8467682a645f2136c180538e24425f70b7607c87f7cb892193b242b86750f13de96c44f0000000000000000000000000000000000000000000000000000000000000000a97456b8097baed6e90ce381d2b21c970a3f9ad4f6c92b1bb26337f919bd639dd43bd470839153db09115e2862051f33a8cd9ff4ff4f98ba4ea89e80747cfdc694ac9969b841c8d558dc41bceb3c8f97c8c48c1409304ec70176c4e24fc7f6fa", |
||||
"FailureMode": "invalidOpening", |
||||
"Valid": false |
||||
}, |
||||
{ |
||||
"Input": "01c357eb79e30f84b7f1b78e2dc064d5e889714a94a879218ffe6ffea8467682a645f2136c180538e24425f70b7607c87f7cb892193b242b86750f13de96c44febbab307c43d34e34553a2cb7115749fd5aef0958386e668419b3ef6f1eac524c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a8cd9ff4ff4f98ba4ea89e80747cfdc694ac9969b841c8d558dc41bceb3c8f97c8c48c1409304ec70176c4e24fc7f6fa", |
||||
"FailureMode": "invalidOpening", |
||||
"Valid": false |
||||
}, |
||||
{ |
||||
"Input": "01c357eb79e30f84b7f1b78e2dc064d5e889714a94a879218ffe6ffea8467682a645f2136c180538e24425f70b7607c87f7cb892193b242b86750f13de96c44febbab307c43d34e34553a2cb7115749fd5aef0958386e668419b3ef6f1eac524a97456b8097baed6e90ce381d2b21c970a3f9ad4f6c92b1bb26337f919bd639dd43bd470839153db09115e2862051f33c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", |
||||
"FailureMode": "invalidOpening", |
||||
"Valid": false |
||||
} |
||||
] |
||||
} |
@ -1,71 +0,0 @@ |
||||
4 |
||||
65 |
||||
97f1d3a73197d7942695638c4fa9ac0fc3688c4f9774b905a14e3a3f171bac586c55e83ff97a1aeffb3af00adb22c6bb |
||||
854262641262cb9e056a8512808ea6864d903dbcad713fd6da8dddfa5ce40d85612c912063ace060ed8c4bf005bab839 |
||||
86f708eee5ae0cf40be36993e760d9cb3b2371f22db3209947c5d21ea68e55186b30871c50bf11ef29e5248bf42d5678 |
||||
94f9c0bafb23cbbf34a93a64243e3e0f934b57593651f3464de7dc174468123d9698f1b9dfa22bb5b6eb96eae002f29f |
||||
93e02b6052719f607dacd3a088274f65596bd0d09920b61ab5da61bbdc7f5049334cf11213945d57e5ac7d055d042b7e024aa2b2f08f0a91260805272dc51051c6e47ad4fa403b02b4510b647ae3d1770bac0326a805bbefd48056c8c121bdb8 |
||||
99aca9fb2f7760cecb892bf7262c176b334824f5727f680bba701a33e322cb6667531410dfc7c8e4321a3f0ea8af48cb1436638a2093123f046f0f504cc2a864825542873edbbc5d7ed17af125a4f2cf6433c6f4f61b81173726981dd989761d |
||||
88e2e982982bf8231e747e9dfcd14c05bd02623d1332734d2af26246c6869fb56ee6c994843f593178a040495ba61f4a083b0e18110b1d9f5224783d8f9a895e8ee744e87929430e9ba96bd29251cbf61240b256d1525600f3d562894d93d659 |
||||
a2d33775e3d9e6af0d1b27d389e6c021a578e617a3d6627686db6288d4b3dffd7a847a00f7ef01828b7f42885b660e4204923402aca18fbae74ccd4e9c50dd8c2281b38dc09c022342ed1ac695d53f7081cb21f05fdfc0a3508c04759196fcd3 |
||||
93e02b6052719f607dacd3a088274f65596bd0d09920b61ab5da61bbdc7f5049334cf11213945d57e5ac7d055d042b7e024aa2b2f08f0a91260805272dc51051c6e47ad4fa403b02b4510b647ae3d1770bac0326a805bbefd48056c8c121bdb8 |
||||
99aca9fb2f7760cecb892bf7262c176b334824f5727f680bba701a33e322cb6667531410dfc7c8e4321a3f0ea8af48cb1436638a2093123f046f0f504cc2a864825542873edbbc5d7ed17af125a4f2cf6433c6f4f61b81173726981dd989761d |
||||
88e2e982982bf8231e747e9dfcd14c05bd02623d1332734d2af26246c6869fb56ee6c994843f593178a040495ba61f4a083b0e18110b1d9f5224783d8f9a895e8ee744e87929430e9ba96bd29251cbf61240b256d1525600f3d562894d93d659 |
||||
a2d33775e3d9e6af0d1b27d389e6c021a578e617a3d6627686db6288d4b3dffd7a847a00f7ef01828b7f42885b660e4204923402aca18fbae74ccd4e9c50dd8c2281b38dc09c022342ed1ac695d53f7081cb21f05fdfc0a3508c04759196fcd3 |
||||
93e02b6052719f607dacd3a088274f65596bd0d09920b61ab5da61bbdc7f5049334cf11213945d57e5ac7d055d042b7e024aa2b2f08f0a91260805272dc51051c6e47ad4fa403b02b4510b647ae3d1770bac0326a805bbefd48056c8c121bdb8 |
||||
99aca9fb2f7760cecb892bf7262c176b334824f5727f680bba701a33e322cb6667531410dfc7c8e4321a3f0ea8af48cb1436638a2093123f046f0f504cc2a864825542873edbbc5d7ed17af125a4f2cf6433c6f4f61b81173726981dd989761d |
||||
88e2e982982bf8231e747e9dfcd14c05bd02623d1332734d2af26246c6869fb56ee6c994843f593178a040495ba61f4a083b0e18110b1d9f5224783d8f9a895e8ee744e87929430e9ba96bd29251cbf61240b256d1525600f3d562894d93d659 |
||||
a2d33775e3d9e6af0d1b27d389e6c021a578e617a3d6627686db6288d4b3dffd7a847a00f7ef01828b7f42885b660e4204923402aca18fbae74ccd4e9c50dd8c2281b38dc09c022342ed1ac695d53f7081cb21f05fdfc0a3508c04759196fcd3 |
||||
93e02b6052719f607dacd3a088274f65596bd0d09920b61ab5da61bbdc7f5049334cf11213945d57e5ac7d055d042b7e024aa2b2f08f0a91260805272dc51051c6e47ad4fa403b02b4510b647ae3d1770bac0326a805bbefd48056c8c121bdb8 |
||||
99aca9fb2f7760cecb892bf7262c176b334824f5727f680bba701a33e322cb6667531410dfc7c8e4321a3f0ea8af48cb1436638a2093123f046f0f504cc2a864825542873edbbc5d7ed17af125a4f2cf6433c6f4f61b81173726981dd989761d |
||||
88e2e982982bf8231e747e9dfcd14c05bd02623d1332734d2af26246c6869fb56ee6c994843f593178a040495ba61f4a083b0e18110b1d9f5224783d8f9a895e8ee744e87929430e9ba96bd29251cbf61240b256d1525600f3d562894d93d659 |
||||
a2d33775e3d9e6af0d1b27d389e6c021a578e617a3d6627686db6288d4b3dffd7a847a00f7ef01828b7f42885b660e4204923402aca18fbae74ccd4e9c50dd8c2281b38dc09c022342ed1ac695d53f7081cb21f05fdfc0a3508c04759196fcd3 |
||||
93e02b6052719f607dacd3a088274f65596bd0d09920b61ab5da61bbdc7f5049334cf11213945d57e5ac7d055d042b7e024aa2b2f08f0a91260805272dc51051c6e47ad4fa403b02b4510b647ae3d1770bac0326a805bbefd48056c8c121bdb8 |
||||
99aca9fb2f7760cecb892bf7262c176b334824f5727f680bba701a33e322cb6667531410dfc7c8e4321a3f0ea8af48cb1436638a2093123f046f0f504cc2a864825542873edbbc5d7ed17af125a4f2cf6433c6f4f61b81173726981dd989761d |
||||
88e2e982982bf8231e747e9dfcd14c05bd02623d1332734d2af26246c6869fb56ee6c994843f593178a040495ba61f4a083b0e18110b1d9f5224783d8f9a895e8ee744e87929430e9ba96bd29251cbf61240b256d1525600f3d562894d93d659 |
||||
a2d33775e3d9e6af0d1b27d389e6c021a578e617a3d6627686db6288d4b3dffd7a847a00f7ef01828b7f42885b660e4204923402aca18fbae74ccd4e9c50dd8c2281b38dc09c022342ed1ac695d53f7081cb21f05fdfc0a3508c04759196fcd3 |
||||
93e02b6052719f607dacd3a088274f65596bd0d09920b61ab5da61bbdc7f5049334cf11213945d57e5ac7d055d042b7e024aa2b2f08f0a91260805272dc51051c6e47ad4fa403b02b4510b647ae3d1770bac0326a805bbefd48056c8c121bdb8 |
||||
99aca9fb2f7760cecb892bf7262c176b334824f5727f680bba701a33e322cb6667531410dfc7c8e4321a3f0ea8af48cb1436638a2093123f046f0f504cc2a864825542873edbbc5d7ed17af125a4f2cf6433c6f4f61b81173726981dd989761d |
||||
88e2e982982bf8231e747e9dfcd14c05bd02623d1332734d2af26246c6869fb56ee6c994843f593178a040495ba61f4a083b0e18110b1d9f5224783d8f9a895e8ee744e87929430e9ba96bd29251cbf61240b256d1525600f3d562894d93d659 |
||||
a2d33775e3d9e6af0d1b27d389e6c021a578e617a3d6627686db6288d4b3dffd7a847a00f7ef01828b7f42885b660e4204923402aca18fbae74ccd4e9c50dd8c2281b38dc09c022342ed1ac695d53f7081cb21f05fdfc0a3508c04759196fcd3 |
||||
93e02b6052719f607dacd3a088274f65596bd0d09920b61ab5da61bbdc7f5049334cf11213945d57e5ac7d055d042b7e024aa2b2f08f0a91260805272dc51051c6e47ad4fa403b02b4510b647ae3d1770bac0326a805bbefd48056c8c121bdb8 |
||||
99aca9fb2f7760cecb892bf7262c176b334824f5727f680bba701a33e322cb6667531410dfc7c8e4321a3f0ea8af48cb1436638a2093123f046f0f504cc2a864825542873edbbc5d7ed17af125a4f2cf6433c6f4f61b81173726981dd989761d |
||||
88e2e982982bf8231e747e9dfcd14c05bd02623d1332734d2af26246c6869fb56ee6c994843f593178a040495ba61f4a083b0e18110b1d9f5224783d8f9a895e8ee744e87929430e9ba96bd29251cbf61240b256d1525600f3d562894d93d659 |
||||
a2d33775e3d9e6af0d1b27d389e6c021a578e617a3d6627686db6288d4b3dffd7a847a00f7ef01828b7f42885b660e4204923402aca18fbae74ccd4e9c50dd8c2281b38dc09c022342ed1ac695d53f7081cb21f05fdfc0a3508c04759196fcd3 |
||||
93e02b6052719f607dacd3a088274f65596bd0d09920b61ab5da61bbdc7f5049334cf11213945d57e5ac7d055d042b7e024aa2b2f08f0a91260805272dc51051c6e47ad4fa403b02b4510b647ae3d1770bac0326a805bbefd48056c8c121bdb8 |
||||
99aca9fb2f7760cecb892bf7262c176b334824f5727f680bba701a33e322cb6667531410dfc7c8e4321a3f0ea8af48cb1436638a2093123f046f0f504cc2a864825542873edbbc5d7ed17af125a4f2cf6433c6f4f61b81173726981dd989761d |
||||
88e2e982982bf8231e747e9dfcd14c05bd02623d1332734d2af26246c6869fb56ee6c994843f593178a040495ba61f4a083b0e18110b1d9f5224783d8f9a895e8ee744e87929430e9ba96bd29251cbf61240b256d1525600f3d562894d93d659 |
||||
a2d33775e3d9e6af0d1b27d389e6c021a578e617a3d6627686db6288d4b3dffd7a847a00f7ef01828b7f42885b660e4204923402aca18fbae74ccd4e9c50dd8c2281b38dc09c022342ed1ac695d53f7081cb21f05fdfc0a3508c04759196fcd3 |
||||
93e02b6052719f607dacd3a088274f65596bd0d09920b61ab5da61bbdc7f5049334cf11213945d57e5ac7d055d042b7e024aa2b2f08f0a91260805272dc51051c6e47ad4fa403b02b4510b647ae3d1770bac0326a805bbefd48056c8c121bdb8 |
||||
99aca9fb2f7760cecb892bf7262c176b334824f5727f680bba701a33e322cb6667531410dfc7c8e4321a3f0ea8af48cb1436638a2093123f046f0f504cc2a864825542873edbbc5d7ed17af125a4f2cf6433c6f4f61b81173726981dd989761d |
||||
88e2e982982bf8231e747e9dfcd14c05bd02623d1332734d2af26246c6869fb56ee6c994843f593178a040495ba61f4a083b0e18110b1d9f5224783d8f9a895e8ee744e87929430e9ba96bd29251cbf61240b256d1525600f3d562894d93d659 |
||||
a2d33775e3d9e6af0d1b27d389e6c021a578e617a3d6627686db6288d4b3dffd7a847a00f7ef01828b7f42885b660e4204923402aca18fbae74ccd4e9c50dd8c2281b38dc09c022342ed1ac695d53f7081cb21f05fdfc0a3508c04759196fcd3 |
||||
93e02b6052719f607dacd3a088274f65596bd0d09920b61ab5da61bbdc7f5049334cf11213945d57e5ac7d055d042b7e024aa2b2f08f0a91260805272dc51051c6e47ad4fa403b02b4510b647ae3d1770bac0326a805bbefd48056c8c121bdb8 |
||||
99aca9fb2f7760cecb892bf7262c176b334824f5727f680bba701a33e322cb6667531410dfc7c8e4321a3f0ea8af48cb1436638a2093123f046f0f504cc2a864825542873edbbc5d7ed17af125a4f2cf6433c6f4f61b81173726981dd989761d |
||||
88e2e982982bf8231e747e9dfcd14c05bd02623d1332734d2af26246c6869fb56ee6c994843f593178a040495ba61f4a083b0e18110b1d9f5224783d8f9a895e8ee744e87929430e9ba96bd29251cbf61240b256d1525600f3d562894d93d659 |
||||
a2d33775e3d9e6af0d1b27d389e6c021a578e617a3d6627686db6288d4b3dffd7a847a00f7ef01828b7f42885b660e4204923402aca18fbae74ccd4e9c50dd8c2281b38dc09c022342ed1ac695d53f7081cb21f05fdfc0a3508c04759196fcd3 |
||||
93e02b6052719f607dacd3a088274f65596bd0d09920b61ab5da61bbdc7f5049334cf11213945d57e5ac7d055d042b7e024aa2b2f08f0a91260805272dc51051c6e47ad4fa403b02b4510b647ae3d1770bac0326a805bbefd48056c8c121bdb8 |
||||
99aca9fb2f7760cecb892bf7262c176b334824f5727f680bba701a33e322cb6667531410dfc7c8e4321a3f0ea8af48cb1436638a2093123f046f0f504cc2a864825542873edbbc5d7ed17af125a4f2cf6433c6f4f61b81173726981dd989761d |
||||
88e2e982982bf8231e747e9dfcd14c05bd02623d1332734d2af26246c6869fb56ee6c994843f593178a040495ba61f4a083b0e18110b1d9f5224783d8f9a895e8ee744e87929430e9ba96bd29251cbf61240b256d1525600f3d562894d93d659 |
||||
a2d33775e3d9e6af0d1b27d389e6c021a578e617a3d6627686db6288d4b3dffd7a847a00f7ef01828b7f42885b660e4204923402aca18fbae74ccd4e9c50dd8c2281b38dc09c022342ed1ac695d53f7081cb21f05fdfc0a3508c04759196fcd3 |
||||
93e02b6052719f607dacd3a088274f65596bd0d09920b61ab5da61bbdc7f5049334cf11213945d57e5ac7d055d042b7e024aa2b2f08f0a91260805272dc51051c6e47ad4fa403b02b4510b647ae3d1770bac0326a805bbefd48056c8c121bdb8 |
||||
99aca9fb2f7760cecb892bf7262c176b334824f5727f680bba701a33e322cb6667531410dfc7c8e4321a3f0ea8af48cb1436638a2093123f046f0f504cc2a864825542873edbbc5d7ed17af125a4f2cf6433c6f4f61b81173726981dd989761d |
||||
88e2e982982bf8231e747e9dfcd14c05bd02623d1332734d2af26246c6869fb56ee6c994843f593178a040495ba61f4a083b0e18110b1d9f5224783d8f9a895e8ee744e87929430e9ba96bd29251cbf61240b256d1525600f3d562894d93d659 |
||||
a2d33775e3d9e6af0d1b27d389e6c021a578e617a3d6627686db6288d4b3dffd7a847a00f7ef01828b7f42885b660e4204923402aca18fbae74ccd4e9c50dd8c2281b38dc09c022342ed1ac695d53f7081cb21f05fdfc0a3508c04759196fcd3 |
||||
93e02b6052719f607dacd3a088274f65596bd0d09920b61ab5da61bbdc7f5049334cf11213945d57e5ac7d055d042b7e024aa2b2f08f0a91260805272dc51051c6e47ad4fa403b02b4510b647ae3d1770bac0326a805bbefd48056c8c121bdb8 |
||||
99aca9fb2f7760cecb892bf7262c176b334824f5727f680bba701a33e322cb6667531410dfc7c8e4321a3f0ea8af48cb1436638a2093123f046f0f504cc2a864825542873edbbc5d7ed17af125a4f2cf6433c6f4f61b81173726981dd989761d |
||||
88e2e982982bf8231e747e9dfcd14c05bd02623d1332734d2af26246c6869fb56ee6c994843f593178a040495ba61f4a083b0e18110b1d9f5224783d8f9a895e8ee744e87929430e9ba96bd29251cbf61240b256d1525600f3d562894d93d659 |
||||
a2d33775e3d9e6af0d1b27d389e6c021a578e617a3d6627686db6288d4b3dffd7a847a00f7ef01828b7f42885b660e4204923402aca18fbae74ccd4e9c50dd8c2281b38dc09c022342ed1ac695d53f7081cb21f05fdfc0a3508c04759196fcd3 |
||||
93e02b6052719f607dacd3a088274f65596bd0d09920b61ab5da61bbdc7f5049334cf11213945d57e5ac7d055d042b7e024aa2b2f08f0a91260805272dc51051c6e47ad4fa403b02b4510b647ae3d1770bac0326a805bbefd48056c8c121bdb8 |
||||
99aca9fb2f7760cecb892bf7262c176b334824f5727f680bba701a33e322cb6667531410dfc7c8e4321a3f0ea8af48cb1436638a2093123f046f0f504cc2a864825542873edbbc5d7ed17af125a4f2cf6433c6f4f61b81173726981dd989761d |
||||
88e2e982982bf8231e747e9dfcd14c05bd02623d1332734d2af26246c6869fb56ee6c994843f593178a040495ba61f4a083b0e18110b1d9f5224783d8f9a895e8ee744e87929430e9ba96bd29251cbf61240b256d1525600f3d562894d93d659 |
||||
a2d33775e3d9e6af0d1b27d389e6c021a578e617a3d6627686db6288d4b3dffd7a847a00f7ef01828b7f42885b660e4204923402aca18fbae74ccd4e9c50dd8c2281b38dc09c022342ed1ac695d53f7081cb21f05fdfc0a3508c04759196fcd3 |
||||
93e02b6052719f607dacd3a088274f65596bd0d09920b61ab5da61bbdc7f5049334cf11213945d57e5ac7d055d042b7e024aa2b2f08f0a91260805272dc51051c6e47ad4fa403b02b4510b647ae3d1770bac0326a805bbefd48056c8c121bdb8 |
||||
99aca9fb2f7760cecb892bf7262c176b334824f5727f680bba701a33e322cb6667531410dfc7c8e4321a3f0ea8af48cb1436638a2093123f046f0f504cc2a864825542873edbbc5d7ed17af125a4f2cf6433c6f4f61b81173726981dd989761d |
||||
88e2e982982bf8231e747e9dfcd14c05bd02623d1332734d2af26246c6869fb56ee6c994843f593178a040495ba61f4a083b0e18110b1d9f5224783d8f9a895e8ee744e87929430e9ba96bd29251cbf61240b256d1525600f3d562894d93d659 |
||||
a2d33775e3d9e6af0d1b27d389e6c021a578e617a3d6627686db6288d4b3dffd7a847a00f7ef01828b7f42885b660e4204923402aca18fbae74ccd4e9c50dd8c2281b38dc09c022342ed1ac695d53f7081cb21f05fdfc0a3508c04759196fcd3 |
||||
93e02b6052719f607dacd3a088274f65596bd0d09920b61ab5da61bbdc7f5049334cf11213945d57e5ac7d055d042b7e024aa2b2f08f0a91260805272dc51051c6e47ad4fa403b02b4510b647ae3d1770bac0326a805bbefd48056c8c121bdb8 |
||||
99aca9fb2f7760cecb892bf7262c176b334824f5727f680bba701a33e322cb6667531410dfc7c8e4321a3f0ea8af48cb1436638a2093123f046f0f504cc2a864825542873edbbc5d7ed17af125a4f2cf6433c6f4f61b81173726981dd989761d |
||||
88e2e982982bf8231e747e9dfcd14c05bd02623d1332734d2af26246c6869fb56ee6c994843f593178a040495ba61f4a083b0e18110b1d9f5224783d8f9a895e8ee744e87929430e9ba96bd29251cbf61240b256d1525600f3d562894d93d659 |
||||
a2d33775e3d9e6af0d1b27d389e6c021a578e617a3d6627686db6288d4b3dffd7a847a00f7ef01828b7f42885b660e4204923402aca18fbae74ccd4e9c50dd8c2281b38dc09c022342ed1ac695d53f7081cb21f05fdfc0a3508c04759196fcd3 |
||||
93e02b6052719f607dacd3a088274f65596bd0d09920b61ab5da61bbdc7f5049334cf11213945d57e5ac7d055d042b7e024aa2b2f08f0a91260805272dc51051c6e47ad4fa403b02b4510b647ae3d1770bac0326a805bbefd48056c8c121bdb8 |
File diff suppressed because it is too large
Load Diff
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in new issue