From 22755c7b1414c8ded3bca74308fbe23d330e7f89 Mon Sep 17 00:00:00 2001 From: Alex Gherghisan Date: Wed, 22 May 2024 14:13:39 +0000 Subject: [PATCH] feat: update header serialisation --- l1-contracts/src/core/Rollup.sol | 10 ++- l1-contracts/src/core/libraries/HeaderLib.sol | 64 +++++++++---------- .../integration_proof_verification.test.ts | 46 +++++++------ .../src/fixtures/dumps/block_result.json | 2 +- 4 files changed, 62 insertions(+), 60 deletions(-) diff --git a/l1-contracts/src/core/Rollup.sol b/l1-contracts/src/core/Rollup.sol index 0774bf660a04..30dd4b064b59 100644 --- a/l1-contracts/src/core/Rollup.sol +++ b/l1-contracts/src/core/Rollup.sol @@ -79,14 +79,18 @@ contract Rollup is IRollup { revert Errors.Rollup__UnavailableTxs(header.contentCommitment.txsEffectsHash); } - bytes32[] memory publicInputs = new bytes32[](40); + bytes32[] memory publicInputs = new bytes32[]( + 2 + + Constants.HEADER_LENGTH + + 16 + ); publicInputs[0] = _archive; // this is the _next_ available leaf in the archive tree // normally this should be equal to the block number (since leaves are 0-indexed and blocks 1-indexed) // but in yarn-project/merkle-tree/src/new_tree.ts we prefill the tree so that block N is in leaf N publicInputs[1] = bytes32(header.globalVariables.blockNumber + 1); - bytes32[22] memory headerFields = HeaderLib.toFields(header); + bytes32[] memory headerFields = HeaderLib.toFields(header); for (uint256 i = 0; i < headerFields.length; i++) { publicInputs[i + 2] = headerFields[i]; } @@ -95,7 +99,7 @@ contract Rollup is IRollup { // this snippet copies it into the public inputs needed for verification // it also guards against empty _aggregationObject used with mocked proofs for (uint256 i = 0; i < 16 && i * 32 < _aggregationObject.length; i++) { - publicInputs[i + 24] = bytes32(_aggregationObject[i * 32:(i + 1) * 32]); + publicInputs[i + 2 + headerFields.length] = bytes32(_aggregationObject[i * 32:(i + 1) * 32]); } if (!verifier.verify(_proof, publicInputs)) { diff --git a/l1-contracts/src/core/libraries/HeaderLib.sol b/l1-contracts/src/core/libraries/HeaderLib.sol index 18aeeb67f338..c85eeb675349 100644 --- a/l1-contracts/src/core/libraries/HeaderLib.sol +++ b/l1-contracts/src/core/libraries/HeaderLib.sol @@ -198,37 +198,37 @@ library HeaderLib { return header; } - // must match the order in the Header.getFields - function toFields(Header memory _header) internal pure returns (bytes32[22] memory) { - return [ - _header.lastArchive.root, - bytes32(uint256(_header.lastArchive.nextAvailableLeafIndex)), - bytes32(_header.contentCommitment.txTreeHeight), - _header.contentCommitment.txsEffectsHash, - _header.contentCommitment.inHash, - _header.contentCommitment.outHash, - _header.stateReference.l1ToL2MessageTree.root, - bytes32(uint256(_header.stateReference.l1ToL2MessageTree.nextAvailableLeafIndex)), - _header.stateReference.partialStateReference.noteHashTree.root, - bytes32( - uint256(_header.stateReference.partialStateReference.noteHashTree.nextAvailableLeafIndex) - ), - _header.stateReference.partialStateReference.nullifierTree.root, - bytes32( - uint256(_header.stateReference.partialStateReference.nullifierTree.nextAvailableLeafIndex) - ), - _header.stateReference.partialStateReference.publicDataTree.root, - bytes32( - uint256(_header.stateReference.partialStateReference.publicDataTree.nextAvailableLeafIndex) - ), - bytes32(_header.globalVariables.chainId), - bytes32(_header.globalVariables.version), - bytes32(_header.globalVariables.blockNumber), - bytes32(_header.globalVariables.timestamp), - bytes32(uint256(uint160(_header.globalVariables.coinbase))), - bytes32(_header.globalVariables.feeRecipient), - bytes32(_header.globalVariables.gasFees.feePerDaGas), - bytes32(_header.globalVariables.gasFees.feePerL2Gas) - ]; + function toFields(Header memory _header) internal pure returns (bytes32[] memory) { + bytes32[] memory fields = new bytes32[](23); + + // must match the order in the Header.getFields + fields[0] = _header.lastArchive.root; + fields[1] = bytes32(uint256(_header.lastArchive.nextAvailableLeafIndex)); + fields[2] = bytes32(_header.contentCommitment.txTreeHeight); + fields[3] = _header.contentCommitment.txsEffectsHash; + fields[4] = _header.contentCommitment.inHash; + fields[5] = _header.contentCommitment.outHash; + fields[6] = _header.stateReference.l1ToL2MessageTree.root; + fields[7] = bytes32(uint256(_header.stateReference.l1ToL2MessageTree.nextAvailableLeafIndex)); + fields[8] = _header.stateReference.partialStateReference.noteHashTree.root; + fields[9] = bytes32(uint256(_header.stateReference.partialStateReference.noteHashTree.nextAvailableLeafIndex)); + fields[10] = _header.stateReference.partialStateReference.nullifierTree.root; + fields[11] = bytes32(uint256(_header.stateReference.partialStateReference.nullifierTree.nextAvailableLeafIndex)); + fields[12] = _header.stateReference.partialStateReference.publicDataTree.root; + fields[13] = bytes32(uint256(_header.stateReference.partialStateReference.publicDataTree.nextAvailableLeafIndex)); + fields[14] = bytes32(_header.globalVariables.chainId); + fields[15] = bytes32(_header.globalVariables.version); + fields[16] = bytes32(_header.globalVariables.blockNumber); + fields[17] = bytes32(_header.globalVariables.timestamp); + fields[18] = bytes32(uint256(uint160(_header.globalVariables.coinbase))); + fields[19] = bytes32(_header.globalVariables.feeRecipient); + fields[20] = bytes32(_header.globalVariables.gasFees.feePerDaGas); + fields[21] = bytes32(_header.globalVariables.gasFees.feePerL2Gas); + fields[22] = bytes32(_header.totalFees); + + // fail if the header structure has changed without updating this function + assert(fields.length == Constants.HEADER_LENGTH); + + return fields; } } diff --git a/yarn-project/end-to-end/src/composed/integration_proof_verification.test.ts b/yarn-project/end-to-end/src/composed/integration_proof_verification.test.ts index 49ad6b4161ef..e0635bc21c51 100644 --- a/yarn-project/end-to-end/src/composed/integration_proof_verification.test.ts +++ b/yarn-project/end-to-end/src/composed/integration_proof_verification.test.ts @@ -40,7 +40,6 @@ describe('proof_verification', () => { let block: L2Block; let aggregationObject: Fr[]; let anvil: Anvil | undefined; - let rpcUrl: string; let walletClient: WalletClient; let publicClient: PublicClient; // eslint-disable-next-line @@ -53,7 +52,11 @@ describe('proof_verification', () => { beforeAll(async () => { logger = getLogger(); - ({ anvil, rpcUrl } = await startAnvil()); + let rpcUrl = process.env.ETHEREUM_HOST; + if (!rpcUrl) { + ({ anvil, rpcUrl } = await startAnvil()); + } + ({ l1ContractAddresses, publicClient, walletClient } = await setupL1Contracts( rpcUrl, mnemonicToAccount(MNEMONIC), @@ -99,17 +102,12 @@ describe('proof_verification', () => { const abi = output.contracts['UltraVerifier.sol']['UltraVerifier'].abi; const bytecode: string = output.contracts['UltraVerifier.sol']['UltraVerifier'].evm.bytecode.object; - try { - const verifierAddress = await deployL1Contract(walletClient, publicClient, abi, `0x${bytecode}`); - verifierContract = getContract({ - address: verifierAddress.toString(), - client: publicClient, - abi, - }) as any; - } catch (err) { - logger.error(anvil?.logs.join(' ')); - throw err; - } + const verifierAddress = await deployL1Contract(walletClient, publicClient, abi, `0x${bytecode}`); + verifierContract = getContract({ + address: verifierAddress.toString(), + client: publicClient, + abi, + }) as any; }); afterAll(async () => { @@ -119,7 +117,7 @@ describe('proof_verification', () => { await acvmTeardown(); }); - beforeEach(async () => { + beforeAll(async () => { // regenerate with // AZTEC_GENERATE_TEST_DATA=1 yarn workspace @aztec/end-to-end test e2e_prover const blockResult = JSON.parse( @@ -181,20 +179,20 @@ describe('proof_verification', () => { client: walletClient, }); + await rollupContract.write.setVerifier([verifierContract.address]); + logger.info('Rollup only accepts valid proofs now'); await availabilityContract.write.publish([`0x${block.body.toBuffer().toString('hex')}`]); }); it('verifies proof', async () => { - await availabilityContract.write.publish([`0x${block.body.toBuffer().toString('hex')}`]); - - await expect( - rollupContract.write.process([ - `0x${block.header.toBuffer().toString('hex')}`, - `0x${block.archive.root.toBuffer().toString('hex')}`, - `0x${serializeToBuffer(aggregationObject).toString('hex')}`, - `0x${proof.withoutPublicInputs().toString('hex')}`, - ]), - ).resolves.toBeDefined(); + const args = [ + `0x${block.header.toBuffer().toString('hex')}`, + `0x${block.archive.root.toBuffer().toString('hex')}`, + `0x${serializeToBuffer(aggregationObject).toString('hex')}`, + `0x${proof.withoutPublicInputs().toString('hex')}`, + ] as const; + + await expect(rollupContract.write.process(args)).resolves.toBeDefined(); }); }); }); diff --git a/yarn-project/end-to-end/src/fixtures/dumps/block_result.json b/yarn-project/end-to-end/src/fixtures/dumps/block_result.json index a0f3c823747f..947a5f5ea8f2 100644 --- a/yarn-project/end-to-end/src/fixtures/dumps/block_result.json +++ b/yarn-project/end-to-end/src/fixtures/dumps/block_result.json @@ -1 +1 @@ -{"block":"1075eb6805003122616b5d95297166f69960d6a70e6e33373bd1932043d6db9300000008000000000000000000000000000000000000000000000000000000000000000100923e1b137758070d6008aa4ae8be8d70b0e37d2876a580943c1842bfd3475e00089a9d421a82c4a25f7acbebe69e638d5b064fa8a60e018793dcb0be53752c0007638bb56b6dda2b64b8f76841114ac3a87a1820030e2e16772c4d294879c31864fcdaa80ff2719154fa7c8a9050662972707168d69eac9db6fd3110829f800000008016da2b0a6aa6a151093f4179bc153932a774aa649ba1e5e8443b6b43abc347680000040020fdc7fc0004f54356b5e02ec40c46317714befbffee30c86da7992377279041000004802da76278f8d33afd1e7012c9974ddb5d722fe0fcc3272a1b415df4bb873cc215000002400000000000000000000000000000000000000000000000000000000000007a690000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000664da65a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000bebc6000178f2e8e3e9464f1f7f3d21d476b6936c52b032333a6f8d80d5823cc39a5074000000090000000200000000000000000000000000000000000000000000000000000000000bebc60000011f2c6490eb4433b37128ba44c3f675f6547b7863ad40bfdabc1b4af2c50df3f400020bb0ba55f56845eb8bf696ecda53761b70327f2e14cb6bbb8aa052ae65f91fd700000000000000000000000000000000000000000000000000000000000013880a5c706d2fb6b3925fa951a8880415c03062476b30b1c5fef1547d6d4e70c55a00000000000000000000000000000000000000000000000000000000000013880000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000400000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000021ded7da7572520f907c95d60594fb98a7c3fb1c11a73001f3249fd7ba93bdc9b1d54d7324bff467047c7192362cd973cfb3cfab41f9075db76c2aa92f84b6674022c0eab5fbc1c7673c324ee16e6e63cd6587c6999444e8a6fc3206fd1ac84df2f0ef50729873ccc65d4b28a06987b567f8f3231344756b45d2a8c1295eef5880b0000000000000000000000000000000000000000000000000000000000000000048800000000000000000000000000000000000000000000000000000000000000000000048c0000048800000240000000000000000000000000000000000000000000000000000000000000002100000000000000000000000000000000000000000000000000000000000000211cb035d842d754c2ae90251b685cf1de94c0fb73cf14cfd169b298d4342b09b92109aed77db737b1521085e93deb369b44e9b52399c27874b1e285423bf8d259937db52261cdba8bbfadedcd70101e305cdc05b3ebc764ef4e4faf4a9f86f5d5790dae3f163a755bdf8be7cca24ff022d20d7e9999a9970ac1d5a8ca4d63422991488f89175300d730a35e2885ad982f4059685e8a7e64714188628a66109765357bb3fea727ae5583abd6491d6d9c42880229026cdc53d108b620f7e074d065ce78bf9200604749c28ffc6007464d0c39abc8d5a0b4794d786d30ee8accfd78371283825950760b14560e76fff8e18690da8f70aa6ac7a9c8f6d1039b7965f82768b89b0700600a749cc4ea24278fa64b74b6f7ea31a657629f734f75bca6b481f280d621146b4f03dfb7041a740a50ea1d28dad8ece30067d1c991eb84c363d6b742d8ceb75d95b1a97bd33edb23628f3ca7eb77ed49db1010b67d0ce36c53a72cf8d18abd13a16737bb91888a63b90babf3f93928533f68a69adee5d7bcbdbaa21de2aca0d23d0cd967e4e7f79d289b7953a6fde5f20788958e79fefc3110b4093ca37cb0c44520823f2e1ea581f3c12ccccfaffe8108177a081c3d41250b7b1cca1b2446f8a6b14708480265200bdcb4887092858c08970a8300dfeb96d879810a57690c20c96aebdb4ca418b32c86dbdaa027ae43c8c75f3dcee70ba1da00000240000000000000000000000000000000000000000000000000000000000000002100000000000000000000000000000000000000000000000000000000000000210df76c37c81c497ab3920cc9cb10c454116734f77af22d19b5d56fb1d918c1ad24ee9d4247b3fb340d669ac1349f543632929fb9caa9ba681a3598a107794520863e0a9586989530a87ff8522122bbcdcc5b7ddc8d2cb57fe0a8d4a2283c55ef9c233d6545c31366d0658d94306448a29d6c5681d77007bb9e22538937a02af7c46733026a882dc2551cde388266bb932a441a726c4b5f65e1d2ac9aeda3a134e5fa57a220409fffc143b369dbe4c71b5dd33ee686ce3eeedd81aafe0f37665f01fa355ae3a9e8994d7dcf826b8aeb42d149235c1f88b7726b971aeb3708cee53ab9b098e3243ee6ae79b3d5950ed19833885d966588e3f1d0e663c2d82bf603d16522c52d87702bd590b88b8733109995016017a1b19fbdbc32c6f9a8f9951ff186c28749411f16a42e9654ab2d0ad53c34e1e3a05a27943ae8051e8b91f752fcb3cc55bc1f80dc7fbff0e43f471ec4f9c89882cbe64a03e77b48904dc609a439c1730588031497718695df1a30c7636e29a143f787adfd123fa9c614ce9889a4c266a82fb82cc071d77754bb12ef1ea49e58693af7ab53f95fca12c6639530d936b559115e0609b56ce1ee54e22c6ecb475ff22bc8b7be68c7b5fc0346ba80855ae8bb22dcc8b3a64261041e93cc813bcf632a73840879e7dbd5c1c9087e2c2e306a6f81379f0b0bc240e433e15b605c71f05902442a3e41554e98c11f8b2900000004000000000000000400000000","proof":"0000002900000d800178f2e8e3e9464f1f7f3d21d476b6936c52b032333a6f8d80d5823cc39a507400000000000000000000000000000000000000000000000000000000000000091075eb6805003122616b5d95297166f69960d6a70e6e33373bd1932043d6db930000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000100923e1b137758070d6008aa4ae8be8d70b0e37d2876a580943c1842bfd3475e00089a9d421a82c4a25f7acbebe69e638d5b064fa8a60e018793dcb0be53752c0007638bb56b6dda2b64b8f76841114ac3a87a1820030e2e16772c4d294879c31864fcdaa80ff2719154fa7c8a9050662972707168d69eac9db6fd3110829f80000000000000000000000000000000000000000000000000000000000000008016da2b0a6aa6a151093f4179bc153932a774aa649ba1e5e8443b6b43abc34768000000000000000000000000000000000000000000000000000000000000040020fdc7fc0004f54356b5e02ec40c46317714befbffee30c86da799237727904100000000000000000000000000000000000000000000000000000000000004802da76278f8d33afd1e7012c9974ddb5d722fe0fcc3272a1b415df4bb873cc21500000000000000000000000000000000000000000000000000000000000002400000000000000000000000000000000000000000000000000000000000007a690000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000664da65a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000bebc60000000000000000000000000000000000000000000000000af1cb913f2e1c1354000000000000000000000000000000000000000000000006b8252a241e85fd0a00000000000000000000000000000000000000000000000bca8f488716f5f92f00000000000000000000000000000000000000000000000000022e94688484be00000000000000000000000000000000000000000000000d2824e602f8a72ac900000000000000000000000000000000000000000000000f820890c61675df9b00000000000000000000000000000000000000000000000eaffae6c633e60d990000000000000000000000000000000000000000000000000001a3e89a685d3600000000000000000000000000000000000000000000000ea6891a08125bdcf300000000000000000000000000000000000000000000000c52c304c53b82f7e30000000000000000000000000000000000000000000000027c4b4268be59319d0000000000000000000000000000000000000000000000000001081b74d6554f0000000000000000000000000000000000000000000000060794c579722c34cc00000000000000000000000000000000000000000000000598a2c82b272b3eb000000000000000000000000000000000000000000000000993a001d96e10b2c9000000000000000000000000000000000000000000000000000261a0abd03e361168f08d5cd525b19a7f2e581607c6a9ab3bc5f99a9c8db7f0cfadb2c631751e0360c55dc37ac36641e56fabe69eee735a910629a4749fff1f97ce5d8680c3160a05a3c0f3e9ee5f57e1dc8b9ec9e72a031893468877852ea1e3c7280a78867c2f183249e5dd3d10a3edb350151717c095c6de7f829374f251280d4aa6ec42d0109b89340ada22024b7c538a9f7e1e093f2d53a8f25994aa1657604c0735027d1b0abc76ae4638922635bb0213b9761bbc79a7145f0e690194cd17a085152ebe2300901270c647bc5b1ee19d518cbca345c06a5f4e70e88caf398eb27d0b0f3926fb1fdc2d49d85a9de64a91a72563daf7ce38ec8aefecf564371faa4fffe9f52cf763eda99505581cf3a69eaf5510c647858436c366b298f791792f8d34c0311d2bc1e977eaf8ef685e26def2d1e5d3796fc5f79dd415c0ec118355875e85a829649c8c29cc574b73a05c27d4ffdc5605ea3aa240be3e2d1dbefb00809bc2fa1e018bf3135823448c974919a275e539a074b0b7e6ce10ca23140e626b6434c10f79b8c144b52518bbb7786657fcff6f28de37e753c8a7fd292789dcf3e7c75f2d94a9e23386ccc0aeed33f2ac67206379ef40d5d354db5bbc0a602a070f5c85012e63b693f817a9019dc4eb08aae4ce7d3ceb3b71d24707c3513c7836a1f7cf19cd7dad699ab060f917f47214ec73d106fb1cf7e4e5fcc0dd33d4758072698e1b39cbf35c7dc57aef828d419eddaa710c6c8d9d1f5d236a48737833b3966f710a5fc4d0b83af106551eb29cb219342e6532df3563196ca0e7fd38c49155536001abc6f16d82f51832e754b50606f698633b610c5d66c7af5b34fbb16d5eb68d04d82ed23acf35a2510a4438f9b2f42574a04223672d14b0abb72f18afbf3f1b1663ed75b7b51bff58b64dc75a10fdb8e0dd3600060c435d633390f7b965b5802e87eeb593a6d349f7f4a4a891b77c35e872b61d38ce819a6f9191f72765868418c72c3d7839ffd49df3ae2484710ec7c6d8c95aec306cdd45f2074adc9ea1c92856c713adfc042dda9828dcd7922bb1a0f9b804e3ce01387c2731c705cc6b2c102c9501a65e7bbec2d66c5b76c13b5ce40b5d18a21ef2f7d0473a89dfcdfe551b066e809e212ae953da43c57c9755287c58202b149b9cdb2295b9ba6d22a8f013979eb3f25238c3d86a05c2068a48ddf612a07e294e8314e4c115738cd20ec007f0ef0293c5f8b19a4750e888abd698815118cef1dce343bd0a77e1b15a098c23b4fbc459e49511b703ae297dd7d791ea592d300aa0062c442e5297c0f6d1f82a7ba43b42e451392cbda2f3e0eb798d02f1c4b87bc23b15303609cdaa6af308118759450729fd64ddb6d1e8f95bc0fdecc410803c0ff78d9a43110a4dbce7400f2b60ab74b18205b95956fe1c4494f32140286950199bdfa2a6b53fed70aa1915b4b8a131b37cf9ff128a78ff12adbf87c8d764ea05dc6e5f493445f767eee00f7d5b34c64c4faa31e7884570f83496aa36460c525ab9b3b621877b48739f8c2e609ebce82805bc8fedaa2bd8bf7c9db1927efd577d03031732c2074a972cfa1c398a33dfd2a3399d44d721e988e0aa12f14d526b0b1b59abf38b932387e1e314173754a0459b5f98193f5eeb8c4d6a85668d0ab8d0f7bd451d92cea2c983c201af0adf7d076ebe12103f3674ef0eae68c87199a75483aabf81774017ceba352e194d2cdb7497e5b5711f960a0b6c02c01ecf62293cde13e8d2456bab798f6a226d75c9f0547ee43f42507689daaeff89cd0e9229a868b98b807a42b9857231249a847e59853a6a9ef3cd53ca9121bf42bd26065c8d0c3f9d4542a3bedb16120eeccda33f6e2bf97bb0322f718f4dcfbd542729e39a675a813f7f9c98b2f7691327ea2592e8cf700ad02f4396f652607c43fe76989af92ea8b0cf05d0d9dd9004dbd3d7471bf72e74bfa241970b92607dbe70eff1e17f5d95dd640473566a0b1424e5df7675d8be7fad185d43d0883e2078f852fb9ea91a7bddb4793cde78c20d36739252332f6a042bf5ce6ec8b21fffd408ed2e60813a17aaa08facba0fd722c9bed207fd6db25144cde05b41878dfbda3564b04ba7625573dc770082c9ec2fc2e36cebd11546696cc117a176d5cf4361afc7c901f1d0374fdd87db2f75870a2d73a6d30b8454563d25160a279496230bafbde404858782e8cc02682e74ac07b88f78a458cd959161076674dc6c964cf314d6f87a8c5eedfdfe8e56edeacf2c3498c6d48f234705c37aa2a7e8d452c294e66fcde51e1753da56ef4795f863014dee1a7136999918f690a6ae15ee863045665e40a21ff1a9778a2fb11cdb4d2d297a9016e0b0094eb834ddcd71adf2670fc2d4c183cc3dfe577aab18b1b454035296f4366c02304ca3f3d4b55c6b88de73be10fbf60bd9fa217de486ee0e8305c92cfff7f8fd8bde063b13c00123b927bdf8e6a817b98357f99a176e58063e1be8a5700c9861a91b12bb98e3e14dd7073d6cb346fb8d8d0e0b943f32c7caf20d7098211dbbc64c49c6e932cd1f0b61dc6dff67f136cefd5c1fa0d3043cc6350e1a14153faae7c1e6530f96fc7b0cf757524058699be02a1bdf1ca6c6481fa8262a9018c0bb0e50f9d727c71a70cbac1c1bb6b6ecc5163e04333c9b03b14e6e26688c76f4f01ebcb0b31e522c7cfe986439278e9c58381c39fca2a742fb72f91a378fce8cfd354412b9e535c5d3f858f68b1a1f87425b6ec81228973c0c44b31f3f0f6883d42d637e4b588c11ad26802408a29274cb5657e3229ad543bfe0d91b0def6d4115a33b38c99c30303a9a1710d1846a22bd79e5d6a14f514fa9bd541915b8d4c5665f4d7b0b0da91c7959f46b47cf9fe3c399f5a80df2b142acd5331c5ae93315de3fa7e65c9146e3a919492b709976550a5640fec9c5f29846b1432b56aed748378a6209bdc043a5b5545cb36d7bc0edb725d7fb3f6e17686046452c5fc78ecff0a53604a64a0d8d3fe650bddb2405d3a409ec4ba2375998fd38e1","aggregationObject":["0x00000000000000000000000000000000000000000000000af1cb913f2e1c1354","0x000000000000000000000000000000000000000000000006b8252a241e85fd0a","0x00000000000000000000000000000000000000000000000bca8f488716f5f92f","0x00000000000000000000000000000000000000000000000000022e94688484be","0x00000000000000000000000000000000000000000000000d2824e602f8a72ac9","0x00000000000000000000000000000000000000000000000f820890c61675df9b","0x00000000000000000000000000000000000000000000000eaffae6c633e60d99","0x0000000000000000000000000000000000000000000000000001a3e89a685d36","0x00000000000000000000000000000000000000000000000ea6891a08125bdcf3","0x00000000000000000000000000000000000000000000000c52c304c53b82f7e3","0x0000000000000000000000000000000000000000000000027c4b4268be59319d","0x0000000000000000000000000000000000000000000000000001081b74d6554f","0x0000000000000000000000000000000000000000000000060794c579722c34cc","0x00000000000000000000000000000000000000000000000598a2c82b272b3eb0","0x00000000000000000000000000000000000000000000000993a001d96e10b2c9","0x000000000000000000000000000000000000000000000000000261a0abd03e36"]} \ No newline at end of file +{"block":"2774972a0037d54053e8effa8f66b8bc66285e55b593b3def8c13dce2f12494d00000008000000000000000000000000000000000000000000000000000000000000000100b0d798ff84fda941fdf58d58410fb1b02176090bd3179c0cab7b97aba0c78800089a9d421a82c4a25f7acbebe69e638d5b064fa8a60e018793dcb0be53752c0007638bb56b6dda2b64b8f76841114ac3a87a1820030e2e16772c4d294879c31864fcdaa80ff2719154fa7c8a9050662972707168d69eac9db6fd3110829f800000008003e2e7e785e0872e2b62f30d89e65f74b44cf0c30fcfcf79bf066d0679f18eca0000040017b0111f8493a8703cca9fbc990e6847553113d26f94f1dffe1e69ed19d0046400000480160b1f15cf7687bf41acefdd37f529a9de75c11b0d403b159b81e86824eb122a000002400000000000000000000000000000000000000000000000000000000000007a690000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000664ded810000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000bebc60007cdf6d3056c5a80c4e3e2f503b6031d36856029a46eb39cb8fe877b56ca19850000000900000002000000000000000000000000000000000000000000000000000000000000000000021cc2f75029db91724914d05977b9d9b6c25197b172fddf208823fde4d79613d50041743fbcea57778ffac0814d42efda50f373de5d1a11feca642cc0b17c13eb0215794a297a6991c2d3121d4dc41f793cfebda66612cfaa14b219c83e15da41900d613a8c6916f881d22a79eba53fd531da3d573039bf7c3fbf0cb1d3d011baa60000000000000000000000000000000000000000000000000000000000000000048800000000000000000000000000000000000000000000000000000000000000000000048c0000048800000240000000000000000000000000000000000000000000000000000000000000002100000000000000000000000000000000000000000000000000000000000000212f75474b42a9dcf7fd695b00897d7424c2d0b63f50faec3f7edf7ba5f21e91de1969f1933155b5554e5f3e6832f37e1921eacb2b126a5e1a825349d0743d8297b8b4904663f777abd258ab5b3953fc1c9270ba9e6a452cea672a9f677f87af1843a8ae1784e1589e54d332a6a67904558af75788c95a9064fba193ee3fdad5923cbe7b140bb484c3a73124dacb0ba2839539357a97cc11e16177b6cebd219b458bfe1ab4bc1dc9b212584513c8ad8dd959c972d6fea323ad7119dc88f74148ec72f2614480ddd4599cfb55f921f41221f18ab97bf10b1b3313af175d700f6848b42def7ff8fe106ae2e256c6e9072b8a57136ff222d347bdcf8a0d4f0fc2989b08f8f7f7540f1f496da15895c7aa83db01a2f44c5d4c6a1fcb670b95d4f47af25bfedf0a56bf65dd7d60bb8b48c24540ecf88680ead37ccf68ad9ea3e2f9b5c6781d0a98707a5f8e2d44b2247c5485b01e27c87c283d0d26fd627eadd0dde73e46844473327fbb7b856b37976224fac2b4c31aae345910e4ceadf7d04e0d6f92462f34dce8615927c9dc2571a1f85f8592683df4376c4c5df683c22e4cce70d51b9aaa3eb2bf8cf5cea100ff6f2d55eb16f74c1408700c8975c58f9e33e86456a1e2f553ff54485f12b860cd78afeca9f8af3eadaa2c495cd8e1d1eba09b514ddbffd43c5a50e455ac94094c9af07280f54a542e71dcf2d2d13b79a8eb5d26c800000240000000000000000000000000000000000000000000000000000000000000002100000000000000000000000000000000000000000000000000000000000000212329978d8f5fe374b11f0ec98b61684ef2b8da4311b9a5b16484c28d9665eb2a2947d9b276578cca636179812e44d6d310aa7d982d721067f849c4c9f5a4a268f36b04266222b2e39417e8fc84c8a0d99059f3878a3f9be21b240baf64f7428f8a3220f97776c1ef3448aa6ed590aa30b167a30f4323fc345c8902249815cc34c73c53efa67a3bfd5569458d6eff193214147503fec74093b45fb5f1ad9ed0eab201668e80a338bdee62446b6b075dca830fd7d0f3b12134e87db3cf506ed1c59066aaecd0534f65ed2e63042f549bb920e929f39db6b4ba6d21b7c68e2d824cc3cedf53d8779841b4026f3bab1f377e86ba2c4c630cee663f7ca13137906b5f75881d3733bf9ed07f530b0a95fb655d15acbf447d39dbde449682f4fae26a4e666be740845238f49d27b213745af9d58e66944a3c13ec75855597e8a9460a5d67a0b28246b5a7ceef6fcdce6dae016f751e45c875dba9d8d698ceb20a2c25ef5786b4751b7cb049faaf194110029c45f2bde6921e6ce51290ce1dd439fe85d1ece6122fd1a972d017af3cb27752b36694707aed65e71134d948e65363f2d647c3968942bfd4658cc64a63092c3123baf11327671465d8d506a16e1bd2d13e335aeeb43311dd560f887f78864a400d37a4e62b3d77b8d3d99dd7d7f7105900ebb8f6533e85169f130978f9f3cb3019919df037acfc81df208f3988ceaa2cf26b0000000400000000000000040000000000000000000000000000000000000000000000000000000000000000000bebc60000012b468f41105b2089b55f96ae149a54890fcff68a0320e586d13f41f6d1879e8100022bac43790f607f1e39a965b285948df93008bad28e708bef3b186eedfbb6e616000000000000000000000000000000000000000000000000000000000000138802a53179c6522a4e6a4954d04422354c9e94dead1da2f6c56acb185bd7f6c8c500000000000000000000000000000000000000000000000000000000000013880000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000400000000000000080000000000000000","proof":"0000002900000d8007cdf6d3056c5a80c4e3e2f503b6031d36856029a46eb39cb8fe877b56ca198500000000000000000000000000000000000000000000000000000000000000092774972a0037d54053e8effa8f66b8bc66285e55b593b3def8c13dce2f12494d0000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000100b0d798ff84fda941fdf58d58410fb1b02176090bd3179c0cab7b97aba0c78800089a9d421a82c4a25f7acbebe69e638d5b064fa8a60e018793dcb0be53752c0007638bb56b6dda2b64b8f76841114ac3a87a1820030e2e16772c4d294879c31864fcdaa80ff2719154fa7c8a9050662972707168d69eac9db6fd3110829f80000000000000000000000000000000000000000000000000000000000000008003e2e7e785e0872e2b62f30d89e65f74b44cf0c30fcfcf79bf066d0679f18eca000000000000000000000000000000000000000000000000000000000000040017b0111f8493a8703cca9fbc990e6847553113d26f94f1dffe1e69ed19d004640000000000000000000000000000000000000000000000000000000000000480160b1f15cf7687bf41acefdd37f529a9de75c11b0d403b159b81e86824eb122a00000000000000000000000000000000000000000000000000000000000002400000000000000000000000000000000000000000000000000000000000007a690000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000664ded810000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000bebc600000000000000000000000000000000000000000000000002b93179b6142adf9500000000000000000000000000000000000000000000000a117f08198d81edec000000000000000000000000000000000000000000000005efad9de6ed69357b0000000000000000000000000000000000000000000000000001b7953b8f21ea00000000000000000000000000000000000000000000000a614afb9967e9f25d0000000000000000000000000000000000000000000000039f96530d561a31b4000000000000000000000000000000000000000000000004e8d89953e7ebd9b10000000000000000000000000000000000000000000000000002f9df1a0cfe3d00000000000000000000000000000000000000000000000bbd0175fad736742800000000000000000000000000000000000000000000000d27a1c8e94bdd08d60000000000000000000000000000000000000000000000011f40bffddccf077d00000000000000000000000000000000000000000000000000009e1e3f15157b00000000000000000000000000000000000000000000000ea4e57dd82cc4a935000000000000000000000000000000000000000000000002485a643f1bdb539300000000000000000000000000000000000000000000000f9a492d63a789c1da00000000000000000000000000000000000000000000000000009badb3a01b961b83ce1a5411f0968953bfd3a1cb11619ac0e414a0c0bf3f48687ff92eed892c0c7861544f9b80a7c54958d9d5fae270d17581b535af446714fbbfb97489bd740c7f611cfbc1881862b943735609ed5e4e983c7b2daa5a7f955162f040a3282f28fd465eb3a17d46914c0dd67f6374900d6a7c893a759ab0e297658f7e6608a8003f1023ef2ede922c024e908fd767089a481b73d83608e039f7313c59459fd817e267dcc041aaf80be82210e96e0ea3533b76a64690543ae5e84f1893fde04203fb925de1894d5a0dde304ac772166890da006f6702c48737c1403a6c5a96c80014e1d3aa3297ad331cc214d29a51a7fa68dda1917bae51aac394bd2310d8f717e77ea55745e1a2daca9d5db302466e008e9e89d72808810c9e732f5a4da3f618516d1457361ce9bffadc1f607c1fc29c04becf6d2884baa1ab375250da1ae32378b37aa7a2a4d0c2ac163e1c983e1020b30beb918f3c21f93c479d1fefbb652e4cda333e639f3e832bfd262f4714e7bd5b4f796b8820e05640ae3aa6f602e92a20ae96065de142354abb18792f1d33c3dd08d4b77bbefc57ddacc25f30a2061a1108465b25e3ed733cb4ec787678b51d83b65e73a339cc42b1374694857027161e89d833834f5a35d8ee90ac40ea87345eb41f8c1c6631b151d5e13c7d39df0f08b8ae0b2a58dd46c4956989849f9f07423713397f534599a55f362d7b26cd0836e6bb88f5d2702723be1f21c2f2e192da6a5a8b13a2ff4fed267c8860823e0b01516d23ef537f30430826c71d4c53316b16d0c84c2af921b1f7a067485e7807f1c1e16727dfdc0ae12ae3a9ee3a0d3d9dfb8bded385a5b9a95a8baedb980f01a121e2654bae9d2900e929ffac16e775291b4ba2763d143f55253d81d9d5f62b941fd65a8e2b54366a3c054cb1c6bc7025b2b7c66ef5ceff9da5414b262657087298f87031096d1ced9c74a778b68b261950addd7e10986664f4f63c3d04ad24886d9ec9ee928dde8e80b468dea5d5294aaf1cb9ffa05f77b4daabd1b67e033047387eb13fc7a06f70d75d4d47f17ae405b543417acd04ab751a797125b2702a94a62e20d868f5e83088c6cfe8f0c3b25578a3b9f2bc3cc0321b7986db5b880ada3ff829eacab5cbed641a56073b8e02d04c3acf0f68451f10630d534314f2304e9d89b9d8faea187c7ba3c78f98dcc73441c771d894ffbab8ecb1d1f4e59126c4028cda09fa964b848da76ecf27667f5f4f77f93bb48cabd2edd11f641dd12fc82b6d472acaf79acc22a261cba37d0050e7017748676e826959d02567db94267bb713a34cf1a17c590da95cc3974a45904cb62dfc398d71e8c6e1a98b4a47216e77d0ce3ca2f94c74aef73b5f2bc0095f5c78129c6506d08669744dd09a9411070df95f9b1cfa6d6eb7ebf5f7f9f49fe9c9a22a94e202887636fbb805a163306395f7a82cbade40cee818d94c6d09c03cda19108589a048e28e29efae953613dd8bd6dd45571d27e85000068e06230f128788b810d6dc708c381448eefa25136c6d5a03c257c76875f54f49f7e778c66c9896d53d9f78e3c2ddd59c3df04d14ee1b1a1dcabc4dfd4fc328a22e72aa74938d347259b17802f9cbdb67c15aba1c98cd62dd6e77bec7661b10d404a3a165d5290ef82a493162bf23d56c013ed41b3ad4b5ae94feb1be6692809be35741e38cc8a1736b6596af48e076aec214b8160c98c2035958ca2e7a899473efa9c5b63759304c2e925d5860686e8265cd1c0e5db8b07ef4f857f7396286b63c7a100604f09a7b99e7cc2e1bc21e5a19fa2516078c0ad02890d75be88f6733a9c46b20b432c25b0336da5b830ef103bd11782bbbbfc51c46f4cf29a384ed817e63823cbf085ac8ec5c7711268a85f56c891225077dcc35c90ec89fecfd7b0c9c78ffaabf2c4f8d6c8e3e0dea04d41552af1b188993f1c05eddc8d36e43d0d4898bfb7563e56e1f543af5a145c6de07a069630b9b4429b21d870191a09434331934d297893eb49aa64b669ffdaf0035384bd50ef0074d113f86600bc3e3fc7881b1437cc775305312d44fe4ab2a50d35ce49019e8a65d0d3a5170ecb0be2459c5c32cb76113be9b713ef336d75c99b0433c3e0794793ad3a155f370691af5ca426db8da673f396f2f9e13e3f2906d3997dfe710d638532a4186adcb51c6e8bfbaf5401b6b8f3a671c4dc6449364dbc882782a2435e764f5ed0657585aee8476f49915e44dce3b2fb6437e83ed501bc55d109b02f5421bcd561c45540309afd0b449f7a6e3f1074a259e5cad039f34003ff3320483ea65edb693651950deb89a70eaec815ab51ad177294e8c51d526a11e147c140f4c470303cee2fd2ce8303ea7c406a1c089508cf0a6cb71bc35cd50790b072080878ddfc557be42a10258be6319056c91908734ff5732dc0a63f558414786052371ebe3fe48b4d0b1d39a2c3a0105e40b10741ca4843d392343babcfa228f0a13c492746dc6ecfd84ab98e7ad70e7031e29ef350ccf4ac2d4e4725848acb32fceda5ec4e0701cc42587c025b5b13616285620386310b153f82710ac4b232c2c44215cdbd51895138b594c91f3e71db942db70f5c12730a4d723c517024e9b1afd77524e34cc178a428b839eae0dba521740cabbb04c1fe7ccb9f3140613192143c32cfe1c90d0fca44e7bb6083501c3403ccb1c6e81f5a30743e7404b0d9f25964c2ae7778c75fd22a7826f73fd7cc54cd20fdad279aaa6d5d922c1b936eb18d1723d7e0f0958b9584d843a7765064e260dfb681bcd580f0fefcce40f39052c03ab680c209170e9c679c560d1292e56624e077f4078a96ed1861f127cb7371627b3b4f1e30a6e0d48653be7d726995399bc00383dc7b81ae580cec61fa9e3281978813a33b8d927879de9592f4763dc8b04fd557ac103d533f81cedba995616cb01183fccac279fb5364179dcf9e55992e801cfc460e220b1e05b3c7739ee13d5b5e694f2a2f7170e7843fb43ac73b90ee4f1c2c311860c7bee2c65596fc0","aggregationObject":["0x000000000000000000000000000000000000000000000002b93179b6142adf95","0x00000000000000000000000000000000000000000000000a117f08198d81edec","0x000000000000000000000000000000000000000000000005efad9de6ed69357b","0x0000000000000000000000000000000000000000000000000001b7953b8f21ea","0x00000000000000000000000000000000000000000000000a614afb9967e9f25d","0x0000000000000000000000000000000000000000000000039f96530d561a31b4","0x000000000000000000000000000000000000000000000004e8d89953e7ebd9b1","0x0000000000000000000000000000000000000000000000000002f9df1a0cfe3d","0x00000000000000000000000000000000000000000000000bbd0175fad7367428","0x00000000000000000000000000000000000000000000000d27a1c8e94bdd08d6","0x0000000000000000000000000000000000000000000000011f40bffddccf077d","0x00000000000000000000000000000000000000000000000000009e1e3f15157b","0x00000000000000000000000000000000000000000000000ea4e57dd82cc4a935","0x000000000000000000000000000000000000000000000002485a643f1bdb5393","0x00000000000000000000000000000000000000000000000f9a492d63a789c1da","0x00000000000000000000000000000000000000000000000000009badb3a01b96"]} \ No newline at end of file