mirror of
https://github.com/yi-sun/zk-attestor.git
synced 2026-01-09 05:28:03 -05:00
Refactor: Remove eth2 and old run scripts
This commit is contained in:
27
README.md
27
README.md
@@ -8,25 +8,38 @@ This repository provides implementations of account, storage, and transaction pr
|
||||
Ethereum. Together, these enable a user to generate validity proofs for data from any
|
||||
current or past Ethereum block or state using a trusted block hash alone.
|
||||
|
||||
**These implementations are for demonstration purposes only**. These circuits are not
|
||||
audited, and this is not intended to be used as a library for production-grade applications.
|
||||
|
||||
## Install dependencies
|
||||
|
||||
* Run `yarn` at the top level to install npm dependencies (`snarkjs` and `circomlib`).
|
||||
* You'll also need `circom` version >= 2.0.2 on your system. Installation instructions [here](https://docs.circom.io/getting-started/installation).
|
||||
* Building these circuits requires a Powers of Tau file with `2^24` constraints in the `circuits` subdirectory with the name `pot24_final.ptau`. One such file can be downloaded from the Hermez trusted setup [here](https://github.com/iden3/snarkjs#7-prepare-phase-2).
|
||||
* Finally, you'll need to follow the setup instructions at [Best Practices for Large Circuits](https://hackmd.io/V-7Aal05Tiy-ozmzTGBYPA).
|
||||
|
||||
## Building proving keys and witness generation files
|
||||
|
||||
We provide four circuits, which together enable attestations to all current or
|
||||
historical Ethereum data available from an archive node:
|
||||
We provide three circuits, which enable attestations to all current or
|
||||
historical Ethereum data available from an archive node with the exception of receipts,
|
||||
which are WIP:
|
||||
|
||||
* `eth_block_hash`: Prove state, transaction, and receipt roots corresponding to a block hash.
|
||||
* `address_proof`: Prove an account state corresponding to a state root.
|
||||
* `storage_proof`: Prove the contents of a storage slot with corresponding storage root.
|
||||
* `tx_proof`: Prove the contents of a transaction with corresponding transaction root.
|
||||
* `eth_addr_storage`: Prove the contents of a storage slot for an account from a block hash.
|
||||
* `eth_tx_proof`: Prove the contents of a transaction from a block hash.
|
||||
|
||||
Run `yarn build:eth_block_hash`, `yarn build:address`, `yarn build:storage`, `yarn build:tx` at the
|
||||
Run `yarn build:eth_block_hash`, `yarn build:eth_addr_storage`, `yarn build:eth_tx_proof` at the
|
||||
top level to compile proving keys and witness generators for each file.
|
||||
|
||||
These circuits are fairly large and require special hardware and setup to run: see
|
||||
[Best Practices for Large Circuits](https://hackmd.io/V-7Aal05Tiy-ozmzTGBYPA).
|
||||
|
||||
## Testing
|
||||
|
||||
Run `yarn test` at the top level to run tests. Note that these tests only test correctness of witness generation.
|
||||
Run `yarn test` at the top level to run tests. Note that these tests only test correctness
|
||||
of witness generation.
|
||||
|
||||
## Acknowledgements
|
||||
|
||||
We use a [circom implementation of keccak](https://github.com/vocdoni/keccak256-circom) from Vocdoni
|
||||
as well as the [eth-mpt Python library](https://pypi.org/project/eth-mpt) by [popzxc](https://github.com/popzxc).
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,894 +0,0 @@
|
||||
pragma circom 2.0.2;
|
||||
|
||||
include "../node_modules/circomlib/circuits/bitify.circom";
|
||||
include "../node_modules/circomlib/circuits/comparators.circom";
|
||||
include "../node_modules/circomlib/circuits/multiplexer.circom";
|
||||
|
||||
include "./keccak.circom";
|
||||
include "./rlp.circom";
|
||||
include "./mpt2.circom";
|
||||
|
||||
template EthBlockHashHex2() {
|
||||
signal input blockRlpHexs[1112];
|
||||
|
||||
signal output out;
|
||||
signal output blockHashHexs[64];
|
||||
|
||||
signal output numberHexLen;
|
||||
|
||||
signal output stateRoot[64];
|
||||
signal output transactionsRoot[64];
|
||||
signal output receiptsRoot[64];
|
||||
signal output number[6];
|
||||
|
||||
log(5555555000012);
|
||||
for (var idx = 0; idx < 1112; idx++) {
|
||||
log(blockRlpHexs[idx]);
|
||||
}
|
||||
|
||||
component rlp = RlpArrayCheck(1112, 16, 4,
|
||||
[64, 64, 40, 64, 64, 64, 512, 0, 0, 0, 0, 0, 0, 64, 16, 0],
|
||||
[64, 64, 40, 64, 64, 64, 512, 14, 6, 8, 8, 8, 64, 64, 18, 10]);
|
||||
for (var idx = 0; idx < 1112; idx++) {
|
||||
rlp.in[idx] <== blockRlpHexs[idx];
|
||||
}
|
||||
rlp.arrayRlpPrefix1HexLen <== 4;
|
||||
for (var idx = 0; idx < 6; idx++) {
|
||||
rlp.fieldRlpPrefix1HexLen[idx] <== 0;
|
||||
}
|
||||
rlp.fieldRlpPrefix1HexLen[6] <== 4;
|
||||
for (var idx = 7; idx < 16; idx++) {
|
||||
rlp.fieldRlpPrefix1HexLen[idx] <== 0;
|
||||
}
|
||||
|
||||
var blockRlpHexLen = rlp.totalRlpHexLen;
|
||||
component pad = ReorderPad101Hex(1016, 1112, 1360, 13);
|
||||
pad.inLen <== blockRlpHexLen;
|
||||
for (var idx = 0; idx < 1112; idx++) {
|
||||
pad.in[idx] <== blockRlpHexs[idx];
|
||||
}
|
||||
|
||||
// if leq.out == 1, use 4 rounds, else use 5 rounds
|
||||
component leq = LessEqThan(13);
|
||||
leq.in[0] <== blockRlpHexLen + 1;
|
||||
// 4 * blockSize = 1088
|
||||
leq.in[1] <== 1088;
|
||||
|
||||
var blockSizeHex = 136 * 2;
|
||||
component keccak = Keccak256Hex(5);
|
||||
for (var idx = 0; idx < 5 * blockSizeHex; idx++) {
|
||||
keccak.inPaddedHex[idx] <== pad.out[idx];
|
||||
}
|
||||
keccak.rounds <== 5 - leq.out;
|
||||
|
||||
out <== rlp.out;
|
||||
for (var idx = 0; idx < 32; idx++) {
|
||||
blockHashHexs[2 * idx] <== keccak.out[2 * idx + 1];
|
||||
blockHashHexs[2 * idx + 1] <== keccak.out[2 * idx];
|
||||
}
|
||||
for (var idx = 0; idx < 64; idx++) {
|
||||
stateRoot[idx] <== rlp.fields[3][idx];
|
||||
transactionsRoot[idx] <== rlp.fields[4][idx];
|
||||
receiptsRoot[idx] <== rlp.fields[5][idx];
|
||||
}
|
||||
numberHexLen <== rlp.fieldHexLen[8];
|
||||
for (var idx = 0; idx < 6; idx++) {
|
||||
number[idx] <== rlp.fields[8][idx];
|
||||
}
|
||||
|
||||
log(out);
|
||||
for (var idx = 0; idx < 64; idx++) {
|
||||
log(blockHashHexs[idx]);
|
||||
}
|
||||
log(numberHexLen);
|
||||
for (var idx = 0; idx < 64; idx++) {
|
||||
log(stateRoot[idx]);
|
||||
}
|
||||
for (var idx = 0; idx < 64; idx++) {
|
||||
log(transactionsRoot[idx]);
|
||||
}
|
||||
for (var idx = 0; idx < 64; idx++) {
|
||||
log(receiptsRoot[idx]);
|
||||
}
|
||||
for (var idx = 0; idx < 6; idx++) {
|
||||
log(number[idx]);
|
||||
}
|
||||
}
|
||||
|
||||
template EthBlockHashHex3() {
|
||||
signal input blockRlpHexs[1112];
|
||||
|
||||
signal output out;
|
||||
signal output blockHashHexs[64];
|
||||
|
||||
signal output numberHexLen;
|
||||
|
||||
signal output stateRoot[64];
|
||||
signal output transactionsRoot[64];
|
||||
signal output receiptsRoot[64];
|
||||
signal output number[6];
|
||||
|
||||
log(5555555000013);
|
||||
for (var idx = 0; idx < 1112; idx++) {
|
||||
log(blockRlpHexs[idx]);
|
||||
}
|
||||
|
||||
component rlp = RlpArrayCheckNoPrefix(1112, 16, 4,
|
||||
[64, 64, 40, 64, 64, 64, 512, 0, 0, 0, 0, 0, 0, 64, 16, 0],
|
||||
[64, 64, 40, 64, 64, 64, 512, 14, 6, 8, 8, 8, 64, 64, 18, 10]);
|
||||
for (var idx = 0; idx < 1112; idx++) {
|
||||
rlp.in[idx] <== blockRlpHexs[idx];
|
||||
}
|
||||
|
||||
var blockRlpHexLen = rlp.totalRlpHexLen;
|
||||
component pad = ReorderPad101Hex(1016, 1112, 1360, 13);
|
||||
pad.inLen <== blockRlpHexLen;
|
||||
for (var idx = 0; idx < 1112; idx++) {
|
||||
pad.in[idx] <== blockRlpHexs[idx];
|
||||
}
|
||||
|
||||
// if leq.out == 1, use 4 rounds, else use 5 rounds
|
||||
component leq = LessEqThan(13);
|
||||
leq.in[0] <== blockRlpHexLen + 1;
|
||||
// 4 * blockSize = 1088
|
||||
leq.in[1] <== 1088;
|
||||
|
||||
var blockSizeHex = 136 * 2;
|
||||
component keccak = Keccak256Hex(5);
|
||||
for (var idx = 0; idx < 5 * blockSizeHex; idx++) {
|
||||
keccak.inPaddedHex[idx] <== pad.out[idx];
|
||||
}
|
||||
keccak.rounds <== 5 - leq.out;
|
||||
|
||||
out <== rlp.out;
|
||||
for (var idx = 0; idx < 32; idx++) {
|
||||
blockHashHexs[2 * idx] <== keccak.out[2 * idx + 1];
|
||||
blockHashHexs[2 * idx + 1] <== keccak.out[2 * idx];
|
||||
}
|
||||
for (var idx = 0; idx < 64; idx++) {
|
||||
stateRoot[idx] <== rlp.fields[3][idx];
|
||||
transactionsRoot[idx] <== rlp.fields[4][idx];
|
||||
receiptsRoot[idx] <== rlp.fields[5][idx];
|
||||
}
|
||||
numberHexLen <== rlp.fieldHexLen[8];
|
||||
for (var idx = 0; idx < 6; idx++) {
|
||||
number[idx] <== rlp.fields[8][idx];
|
||||
}
|
||||
|
||||
log(out);
|
||||
for (var idx = 0; idx < 64; idx++) {
|
||||
log(blockHashHexs[idx]);
|
||||
}
|
||||
log(numberHexLen);
|
||||
for (var idx = 0; idx < 64; idx++) {
|
||||
log(stateRoot[idx]);
|
||||
}
|
||||
for (var idx = 0; idx < 64; idx++) {
|
||||
log(transactionsRoot[idx]);
|
||||
}
|
||||
for (var idx = 0; idx < 64; idx++) {
|
||||
log(receiptsRoot[idx]);
|
||||
}
|
||||
for (var idx = 0; idx < 6; idx++) {
|
||||
log(number[idx]);
|
||||
}
|
||||
}
|
||||
|
||||
template EthAddressProof2(maxDepth) {
|
||||
var keyHexLen = 64;
|
||||
var maxValueHexLen = 228;
|
||||
var maxLeafRlpHexLen = 4 + (keyHexLen + 2) + 4 + maxValueHexLen;
|
||||
var maxBranchRlpHexLen = 1064;
|
||||
var maxExtensionRlpHexLen = 4 + 2 + keyHexLen + 2 + 64;
|
||||
|
||||
signal input stateRootHexs[64];
|
||||
signal input addressHexs[40];
|
||||
signal input keyFragmentStarts[maxDepth];
|
||||
|
||||
// addressRlpPrefix: 2
|
||||
// addressRlpLength: 2
|
||||
// nonceRlpPrefix 2
|
||||
// nonce <= 64
|
||||
// balanceRlpPrefix 2
|
||||
// balance <= 24
|
||||
// storageRootRlpPrefix 2
|
||||
// storageRoot 64
|
||||
// codeHashRlpPrefix 2
|
||||
// codeHash 64
|
||||
signal input addressValueRlpHexs[228];
|
||||
|
||||
// MPT inclusion entries
|
||||
signal input leafRlpHexs[maxLeafRlpHexLen];
|
||||
signal input leafPathPrefixHexLen;
|
||||
|
||||
signal input nodeRlpHexs[maxDepth - 1][maxBranchRlpHexLen];
|
||||
signal input nodePathPrefixHexLen[maxDepth - 1];
|
||||
|
||||
// index 0 = root; value 0 = branch, 1 = extension
|
||||
signal input nodeTypes[maxDepth - 1];
|
||||
signal input depth;
|
||||
|
||||
signal output out;
|
||||
signal output nonceHexLen;
|
||||
signal output balanceHexLen;
|
||||
signal output nonceHexs[64];
|
||||
signal output balanceHexs[24];
|
||||
signal output storageRootHexs[64];
|
||||
signal output codeHashHexs[64];
|
||||
|
||||
log(5555555000022);
|
||||
log(maxDepth);
|
||||
for (var idx = 0; idx < 64; idx++) {
|
||||
log(stateRootHexs[idx]);
|
||||
}
|
||||
for (var idx = 0; idx < 40; idx++) {
|
||||
log(addressHexs[idx]);
|
||||
}
|
||||
for (var idx = 0; idx < maxDepth; idx++) {
|
||||
log(keyFragmentStarts[idx]);
|
||||
}
|
||||
for (var idx = 0; idx < 228; idx++) {
|
||||
log(addressValueRlpHexs[idx]);
|
||||
}
|
||||
|
||||
// check address info is properly formattted
|
||||
component rlp = RlpArrayCheckNoPrefix(228, 4, 2, [0, 0, 64, 64], [64, 24, 64, 64]);
|
||||
for (var idx = 0; idx < 228; idx++) {
|
||||
rlp.in[idx] <== addressValueRlpHexs[idx];
|
||||
}
|
||||
|
||||
// read out address fields
|
||||
nonceHexLen <== rlp.fieldHexLen[0];
|
||||
for (var idx = 0; idx < 64; idx++) {
|
||||
nonceHexs[idx] <== rlp.fields[0][idx];
|
||||
}
|
||||
|
||||
balanceHexLen <== rlp.fieldHexLen[1];
|
||||
for (var idx = 0; idx < 24; idx++) {
|
||||
balanceHexs[idx] <== rlp.fields[1][idx];
|
||||
}
|
||||
|
||||
for (var idx = 0; idx < 64; idx++) {
|
||||
storageRootHexs[idx] <== rlp.fields[2][idx];
|
||||
codeHashHexs[idx] <== rlp.fields[3][idx];
|
||||
}
|
||||
|
||||
// check address MPT inclusion proof
|
||||
component address_hash = KeccakAndPadHex(40);
|
||||
for (var idx = 0; idx < 40; idx++) {
|
||||
address_hash.in[idx] <== addressHexs[idx];
|
||||
}
|
||||
address_hash.inLen <== 40;
|
||||
|
||||
component mpt = MPTInclusionFixedKeyHexLen2(maxDepth, 64, 228);
|
||||
for (var idx = 0; idx < 64; idx++) {
|
||||
mpt.keyHexs[idx] <== address_hash.out[idx];
|
||||
}
|
||||
for (var idx = 0; idx < 228; idx++) {
|
||||
mpt.valueHexs[idx] <== addressValueRlpHexs[idx];
|
||||
}
|
||||
for (var idx = 0; idx < 64; idx++) {
|
||||
mpt.rootHashHexs[idx] <== stateRootHexs[idx];
|
||||
}
|
||||
|
||||
for (var idx = 0; idx < maxDepth; idx++) {
|
||||
mpt.keyFragmentStarts[idx] <== keyFragmentStarts[idx];
|
||||
}
|
||||
|
||||
mpt.leafPathPrefixHexLen <== leafPathPrefixHexLen;
|
||||
for (var idx = 0; idx < maxLeafRlpHexLen; idx++) {
|
||||
mpt.leafRlpHexs[idx] <== leafRlpHexs[idx];
|
||||
}
|
||||
for (var idx = 0; idx < maxDepth - 1; idx++) {
|
||||
mpt.nodePathPrefixHexLen[idx] <== nodePathPrefixHexLen[idx];
|
||||
for (var j = 0; j < maxBranchRlpHexLen; j++) {
|
||||
mpt.nodeRlpHexs[idx][j] <== nodeRlpHexs[idx][j];
|
||||
}
|
||||
mpt.nodeTypes[idx] <== nodeTypes[idx];
|
||||
}
|
||||
mpt.depth <== depth;
|
||||
|
||||
out <== rlp.out * mpt.out;
|
||||
|
||||
log(out);
|
||||
log(nonceHexLen);
|
||||
log(balanceHexLen);
|
||||
for (var idx = 0; idx < 64; idx++) {
|
||||
log(nonceHexs[idx]);
|
||||
}
|
||||
for (var idx = 0; idx < 24; idx++) {
|
||||
log(balanceHexs[idx]);
|
||||
}
|
||||
for (var idx = 0; idx < 64; idx++) {
|
||||
log(storageRootHexs[idx]);
|
||||
}
|
||||
for (var idx = 0; idx < 64; idx++) {
|
||||
log(codeHashHexs[idx]);
|
||||
}
|
||||
}
|
||||
|
||||
template EthStorageProof2(maxDepth) {
|
||||
var keyHexLen = 64;
|
||||
var maxValueHexLen = 66;
|
||||
var maxLeafRlpHexLen = 4 + (keyHexLen + 2) + 4 + maxValueHexLen;
|
||||
var maxBranchRlpHexLen = 1064;
|
||||
var maxExtensionRlpHexLen = 4 + 2 + keyHexLen + 2 + 64;
|
||||
|
||||
signal input storageRootHexs[64];
|
||||
|
||||
signal input slotHexs[64];
|
||||
signal input valueRlpHexs[66];
|
||||
signal input keyFragmentStarts[maxDepth];
|
||||
|
||||
signal input leafRlpHexs[maxLeafRlpHexLen];
|
||||
signal input leafPathPrefixHexLen;
|
||||
|
||||
signal input nodeRlpHexs[maxDepth - 1][maxBranchRlpHexLen];
|
||||
signal input nodePathPrefixHexLen[maxDepth - 1];
|
||||
|
||||
signal input nodeTypes[maxDepth - 1];
|
||||
|
||||
signal input depth;
|
||||
|
||||
signal output out;
|
||||
signal output slotValue[64];
|
||||
signal output valueHexLen;
|
||||
|
||||
log(5555555000032);
|
||||
log(maxDepth);
|
||||
for (var idx = 0; idx < 64; idx++) {
|
||||
log(storageRootHexs[idx]);
|
||||
}
|
||||
for (var idx = 0; idx < 64; idx++) {
|
||||
log(slotHexs[idx]);
|
||||
}
|
||||
for (var idx = 0; idx < 66; idx++) {
|
||||
log(valueRlpHexs[idx]);
|
||||
}
|
||||
for (var idx = 0; idx < maxDepth; idx++) {
|
||||
log(keyFragmentStarts[idx]);
|
||||
}
|
||||
|
||||
// key is keccak256(slot)
|
||||
component slot_hash = KeccakAndPadHex(64);
|
||||
for (var idx = 0; idx < 64; idx++) {
|
||||
slot_hash.in[idx] <== slotHexs[idx];
|
||||
}
|
||||
slot_hash.inLen <== 64;
|
||||
|
||||
// check MPT inclusion proof
|
||||
component mpt = MPTInclusionFixedKeyHexLen2(maxDepth, 64, 66);
|
||||
for (var idx = 0; idx < 64; idx++) {
|
||||
mpt.keyHexs[idx] <== slot_hash.out[idx];
|
||||
}
|
||||
for (var idx = 0; idx < 66; idx++) {
|
||||
mpt.valueHexs[idx] <== valueRlpHexs[idx];
|
||||
}
|
||||
for (var idx = 0; idx < 64; idx++) {
|
||||
mpt.rootHashHexs[idx] <== storageRootHexs[idx];
|
||||
}
|
||||
|
||||
for (var idx = 0; idx < maxDepth; idx++) {
|
||||
mpt.keyFragmentStarts[idx] <== keyFragmentStarts[idx];
|
||||
}
|
||||
|
||||
mpt.leafPathPrefixHexLen <== leafPathPrefixHexLen;
|
||||
for (var idx = 0; idx < maxLeafRlpHexLen; idx++) {
|
||||
mpt.leafRlpHexs[idx] <== leafRlpHexs[idx];
|
||||
}
|
||||
for (var idx = 0; idx < maxDepth - 1; idx++) {
|
||||
mpt.nodePathPrefixHexLen[idx] <== nodePathPrefixHexLen[idx];
|
||||
for (var j = 0; j < maxBranchRlpHexLen; j++) {
|
||||
mpt.nodeRlpHexs[idx][j] <== nodeRlpHexs[idx][j];
|
||||
}
|
||||
mpt.nodeTypes[idx] <== nodeTypes[idx];
|
||||
}
|
||||
mpt.depth <== depth;
|
||||
|
||||
out <== mpt.out;
|
||||
valueHexLen <== mpt.valueHexLen - 2;
|
||||
for (var idx = 0; idx < 64; idx++) {
|
||||
slotValue[idx] <== valueRlpHexs[idx + 2];
|
||||
}
|
||||
|
||||
log(out);
|
||||
for (var idx = 0; idx < 64; idx++) {
|
||||
log(slotValue[idx]);
|
||||
}
|
||||
log(valueHexLen);
|
||||
}
|
||||
|
||||
template EthTransactionProofCore(maxDepth, maxIndex, maxTxRlpHexLen) {
|
||||
var maxLeafRlpHexLen = 4 + (6 + 2) + 4 + maxTxRlpHexLen;
|
||||
var maxBranchRlpHexLen = 1064;
|
||||
|
||||
signal input blockHash[2]; // 128 bit coordinates
|
||||
signal input index;
|
||||
|
||||
// block input
|
||||
signal input blockRlpHexs[1112];
|
||||
|
||||
// MPT inclusion inputs
|
||||
signal input txRlpHexs[maxTxRlpHexLen];
|
||||
signal input keyFragmentStarts[maxDepth];
|
||||
|
||||
signal input leafRlpHexs[maxLeafRlpHexLen];
|
||||
signal input leafPathPrefixHexLen;
|
||||
|
||||
signal input nodeRlpHexs[maxDepth - 1][maxBranchRlpHexLen];
|
||||
signal input nodePathPrefixHexLen[maxDepth - 1];
|
||||
|
||||
// index 0 = root; value 0 = branch, 1 = extension
|
||||
signal input nodeTypes[maxDepth - 1];
|
||||
signal input depth;
|
||||
|
||||
signal output out;
|
||||
|
||||
signal output txType; // 0 if type 0, 1 if type 2 (post EIP-1559)
|
||||
|
||||
signal output nonceHexLen;
|
||||
signal output gasPriceHexLen;
|
||||
signal output gasLimitHexLen;
|
||||
signal output valueHexLen;
|
||||
signal output dataHexLen;
|
||||
|
||||
signal output nonceHexs[64];
|
||||
signal output gasPriceHexs[64];
|
||||
signal output gasLimitHexs[64];
|
||||
signal output toHexs[40];
|
||||
signal output valueHexs[64];
|
||||
signal output dataHexs[maxTxRlpHexLen - 170];
|
||||
signal output vHexs[2];
|
||||
signal output rHexs[64];
|
||||
signal output sHexs[64];
|
||||
|
||||
// fields only in type 2
|
||||
signal output chainIdHexLen;
|
||||
signal output maxPriorityFeeHexLen;
|
||||
|
||||
signal output chainIdHexs[2];
|
||||
signal output maxPriorityFeeHexs[64];
|
||||
|
||||
// decode compressed inputs
|
||||
signal blockHashHexs[64];
|
||||
component blockHashN2b[2];
|
||||
for (var idx = 0; idx < 2; idx++) {
|
||||
blockHashN2b[idx] = Num2Bits(128);
|
||||
blockHashN2b[idx].in <== blockHash[idx];
|
||||
for (var j = 0; j < 32; j++) {
|
||||
blockHashHexs[32 * idx + j] <== 8 * blockHashN2b[idx].out[4 * (31 - j) + 3] + 4 * blockHashN2b[idx].out[4 * (31 - j) + 2] + 2 * blockHashN2b[idx].out[4 * (31 - j) + 1] + blockHashN2b[idx].out[4 * (31 - j)];
|
||||
}
|
||||
}
|
||||
|
||||
// validate index
|
||||
component index_lt = LessThan(10);
|
||||
index_lt.in[0] <== index;
|
||||
index_lt.in[1] <== maxIndex;
|
||||
|
||||
// match block hash
|
||||
component block_hash = EthBlockHashHex2();
|
||||
for (var idx = 0; idx < 1112; idx++) {
|
||||
block_hash.blockRlpHexs[idx] <== blockRlpHexs[idx];
|
||||
}
|
||||
|
||||
component block_hash_check = ArrayEq(64);
|
||||
for (var idx = 0; idx < 64; idx++) {
|
||||
block_hash_check.a[idx] <== block_hash.blockHashHexs[idx];
|
||||
block_hash_check.b[idx] <== blockHashHexs[idx];
|
||||
}
|
||||
block_hash_check.inLen <== 64;
|
||||
|
||||
// determine tx type
|
||||
component tx_type_1 = IsEqual();
|
||||
tx_type_1.in[0] <== txRlpHexs[0];
|
||||
tx_type_1.in[1] <== 0;
|
||||
|
||||
component tx_type_2 = IsEqual();
|
||||
tx_type_2.in[0] <== txRlpHexs[1];
|
||||
tx_type_2.in[1] <== 2;
|
||||
|
||||
txType <== tx_type_1.out * tx_type_2.out;
|
||||
|
||||
// check tx info is properly formatted
|
||||
var maxArrayPrefix1HexLen = 2 * (log_ceil(maxTxRlpHexLen) \ 8 + 1);
|
||||
component rlp0 = RlpArrayCheckNoPrefix(maxTxRlpHexLen, 9, maxArrayPrefix1HexLen,
|
||||
[ 0, 0, 0, 40, 0, 0, 0, 64, 64],
|
||||
[64, 64, 64, 40, 64, maxTxRlpHexLen - 170, 2, 64, 64]);
|
||||
for (var idx = 0; idx < maxTxRlpHexLen; idx++) {
|
||||
rlp0.in[idx] <== (1 - txType) * txRlpHexs[idx];
|
||||
}
|
||||
|
||||
// assume access list is empty
|
||||
component rlp2 = RlpArrayCheckNoPrefix(maxTxRlpHexLen - 2, 12, maxArrayPrefix1HexLen,
|
||||
[0, 0, 0, 0, 0, 40, 0, 0, 0, 0, 64, 64],
|
||||
[2, 64, 64, 64, 64, 40, 64, maxTxRlpHexLen - 172, 0, 2, 64, 64]);
|
||||
for (var idx = 0; idx < maxTxRlpHexLen - 2; idx++) {
|
||||
rlp2.in[idx] <== txType * txRlpHexs[idx + 2];
|
||||
}
|
||||
signal tx_rlp_check;
|
||||
tx_rlp_check <== rlp0.out + txType * (rlp2.out - rlp0.out);
|
||||
|
||||
// read out tx fields
|
||||
nonceHexLen <== rlp0.fieldHexLen[0] + txType * (rlp2.fieldHexLen[1] - rlp0.fieldHexLen[0]);
|
||||
gasPriceHexLen <== rlp0.fieldHexLen[1] + txType * (rlp2.fieldHexLen[3] - rlp0.fieldHexLen[1]);
|
||||
gasLimitHexLen <== rlp0.fieldHexLen[2] + txType * (rlp2.fieldHexLen[4] - rlp0.fieldHexLen[2]);
|
||||
valueHexLen <== rlp0.fieldHexLen[4] + txType * (rlp2.fieldHexLen[6] - rlp0.fieldHexLen[4]);
|
||||
dataHexLen <== rlp0.fieldHexLen[5] + txType * (rlp2.fieldHexLen[7] - rlp0.fieldHexLen[5]);
|
||||
for (var idx = 0; idx < 64; idx++) {
|
||||
nonceHexs[idx] <== rlp0.fields[0][idx] + txType * (rlp2.fields[1][idx] - rlp0.fields[0][idx]);
|
||||
}
|
||||
for (var idx = 0; idx < 64; idx++) {
|
||||
gasPriceHexs[idx] <== rlp0.fields[1][idx] + txType * (rlp2.fields[3][idx] - rlp0.fields[1][idx]);
|
||||
}
|
||||
for (var idx = 0; idx < 64; idx++) {
|
||||
gasLimitHexs[idx] <== rlp0.fields[2][idx] + txType * (rlp2.fields[4][idx] - rlp0.fields[2][idx]);
|
||||
}
|
||||
for (var idx = 0; idx < 40; idx++) {
|
||||
toHexs[idx] <== rlp0.fields[3][idx] + txType * (rlp2.fields[5][idx] - rlp0.fields[3][idx]);
|
||||
}
|
||||
for (var idx = 0; idx < 64; idx++) {
|
||||
valueHexs[idx] <== rlp0.fields[4][idx] + txType * (rlp2.fields[6][idx] - rlp0.fields[4][idx]);
|
||||
}
|
||||
for (var idx = 0; idx < maxTxRlpHexLen - 172; idx++) {
|
||||
dataHexs[idx] <== rlp0.fields[5][idx] + txType * (rlp2.fields[7][idx] - rlp0.fields[5][idx]);
|
||||
}
|
||||
for (var idx = maxTxRlpHexLen - 172; idx < maxTxRlpHexLen - 170; idx++) {
|
||||
dataHexs[idx] <== rlp0.fields[5][idx] * (1 - txType);
|
||||
}
|
||||
for (var idx = 0; idx < 2; idx++) {
|
||||
vHexs[idx] <== rlp0.fields[6][idx] + txType * (rlp2.fields[9][idx] - rlp0.fields[6][idx]);
|
||||
}
|
||||
for (var idx = 0; idx < 64; idx++) {
|
||||
rHexs[idx] <== rlp0.fields[7][idx] + txType * (rlp2.fields[10][idx] - rlp0.fields[7][idx]);
|
||||
}
|
||||
for (var idx = 0; idx < 64; idx++) {
|
||||
sHexs[idx] <== rlp0.fields[8][idx] + txType * (rlp2.fields[11][idx] - rlp0.fields[8][idx]);
|
||||
}
|
||||
|
||||
chainIdHexLen <== rlp2.fieldHexLen[0];
|
||||
maxPriorityFeeHexLen <== rlp2.fieldHexLen[2];
|
||||
for (var idx = 0; idx < 2; idx++) {
|
||||
chainIdHexs[idx] <== rlp2.fields[0][idx];
|
||||
}
|
||||
for (var idx = 0; idx < 64; idx++) {
|
||||
maxPriorityFeeHexs[idx] <== rlp2.fields[2][idx];
|
||||
}
|
||||
|
||||
signal rlpIndexHexs[6];
|
||||
signal rlpIndexHexLen;
|
||||
|
||||
// if index == 0, then 80
|
||||
// if index in [0, 127], then index literal
|
||||
// if index in [128, 255], then 81[index]
|
||||
// if index > 255, then 82[index]
|
||||
component index_zero = IsZero();
|
||||
index_zero.in <== index;
|
||||
|
||||
component index_rlp_lt1 = LessThan(16);
|
||||
index_rlp_lt1.in[0] <== index;
|
||||
index_rlp_lt1.in[1] <== 128;
|
||||
|
||||
component index_rlp_lt2 = LessThan(16);
|
||||
index_rlp_lt2.in[0] <== index;
|
||||
index_rlp_lt2.in[1] <== 256;
|
||||
|
||||
component index_n2b = Num2Bits(16);
|
||||
index_n2b.in <== index;
|
||||
|
||||
rlpIndexHexLen <== 6 - 4 * index_rlp_lt1.out - 2 * index_rlp_lt2.out + 2 * index_rlp_lt1.out * index_rlp_lt2.out;
|
||||
signal rlpIndex_temp[4];
|
||||
rlpIndex_temp[0] <== index_rlp_lt1.out * (index_n2b.out[4] + 2 * index_n2b.out[5] + 4 * index_n2b.out[6] + 8 * index_n2b.out[7] - 8) + 8;
|
||||
rlpIndex_temp[1] <== index_rlp_lt1.out * (index_n2b.out[0] + 2 * index_n2b.out[1] + 4 * index_n2b.out[2] + 8 * index_n2b.out[3] - 2) + 2 - index_rlp_lt2.out;
|
||||
rlpIndex_temp[2] <== (1 - index_rlp_lt1.out) * (index_n2b.out[4] + 2 * index_n2b.out[5] + 4 * index_n2b.out[6] + 8 * index_n2b.out[7]);
|
||||
rlpIndex_temp[3] <== (1 - index_rlp_lt1.out) * (index_n2b.out[0] + 2 * index_n2b.out[1] + 4 * index_n2b.out[2] + 8 * index_n2b.out[3]);
|
||||
|
||||
rlpIndexHexs[0] <== index_zero.out * (8 - rlpIndex_temp[0]) + rlpIndex_temp[0];
|
||||
rlpIndexHexs[1] <== (1 - index_zero.out) * rlpIndex_temp[1];
|
||||
|
||||
rlpIndexHexs[2] <== (index_n2b.out[12] + 2 * index_n2b.out[13] + 4 * index_n2b.out[14] + 8 * index_n2b.out[15]) + index_rlp_lt2.out * (rlpIndex_temp[2] - (index_n2b.out[12] + 2 * index_n2b.out[13] + 4 * index_n2b.out[14] + 8 * index_n2b.out[15]));
|
||||
rlpIndexHexs[3] <== (index_n2b.out[8] + 2 * index_n2b.out[9] + 4 * index_n2b.out[10] + 8 * index_n2b.out[11]) + index_rlp_lt2.out * (rlpIndex_temp[3] - (index_n2b.out[8] + 2 * index_n2b.out[9] + 4 * index_n2b.out[10] + 8 * index_n2b.out[11]));
|
||||
|
||||
rlpIndexHexs[4] <== (1 - index_rlp_lt2.out) * (index_n2b.out[4] + 2 * index_n2b.out[5] + 4 * index_n2b.out[6] + 8 * index_n2b.out[7]);
|
||||
rlpIndexHexs[5] <== (1 - index_rlp_lt2.out) * (index_n2b.out[0] + 2 * index_n2b.out[1] + 4 * index_n2b.out[2] + 8 * index_n2b.out[3]);
|
||||
|
||||
// validate MPT inclusion
|
||||
component mpt = MPTInclusionNoBranchTermination2(maxDepth, 6, maxTxRlpHexLen);
|
||||
for (var idx = 0; idx < 6; idx++) {
|
||||
mpt.keyHexs[idx] <== rlpIndexHexs[idx];
|
||||
}
|
||||
mpt.keyHexLen <== rlpIndexHexLen;
|
||||
for (var idx = 0; idx < maxTxRlpHexLen; idx++) {
|
||||
mpt.valueHexs[idx] <== txRlpHexs[idx];
|
||||
}
|
||||
for (var idx = 0; idx < 64; idx++) {
|
||||
mpt.rootHashHexs[idx] <== block_hash.transactionsRoot[idx];
|
||||
}
|
||||
|
||||
for (var idx = 0; idx < maxDepth; idx++) {
|
||||
mpt.keyFragmentStarts[idx] <== keyFragmentStarts[idx];
|
||||
}
|
||||
|
||||
mpt.leafPathPrefixHexLen <== leafPathPrefixHexLen;
|
||||
for (var idx = 0; idx < maxLeafRlpHexLen; idx++) {
|
||||
mpt.leafRlpHexs[idx] <== leafRlpHexs[idx];
|
||||
}
|
||||
for (var idx = 0; idx < maxDepth - 1; idx++) {
|
||||
mpt.nodePathPrefixHexLen[idx] <== nodePathPrefixHexLen[idx];
|
||||
for (var j = 0; j < maxBranchRlpHexLen; j++) {
|
||||
mpt.nodeRlpHexs[idx][j] <== nodeRlpHexs[idx][j];
|
||||
}
|
||||
mpt.nodeTypes[idx] <== nodeTypes[idx];
|
||||
}
|
||||
mpt.depth <== depth;
|
||||
|
||||
component final_check = IsEqual();
|
||||
final_check.in[0] <== 5;
|
||||
final_check.in[1] <== index_lt.out + block_hash.out + block_hash_check.out + tx_rlp_check + mpt.out;
|
||||
out <== final_check.out;
|
||||
}
|
||||
|
||||
template EthTransactionProof2(maxDepth, maxIndex, maxTxRlpHexLen) {
|
||||
var maxLeafRlpHexLen = 4 + (6 + 2) + 4 + maxTxRlpHexLen;
|
||||
var maxBranchRlpHexLen = 1064;
|
||||
|
||||
signal input blockHash[2]; // 128 bit coordinates
|
||||
signal input index;
|
||||
|
||||
// block input
|
||||
signal input blockRlpHexs[1112];
|
||||
|
||||
// MPT inclusion inputs
|
||||
signal input txRlpHexs[maxTxRlpHexLen];
|
||||
signal input keyFragmentStarts[maxDepth];
|
||||
|
||||
signal input leafRlpHexs[maxLeafRlpHexLen];
|
||||
signal input leafPathPrefixHexLen;
|
||||
|
||||
signal input nodeRlpHexs[maxDepth - 1][maxBranchRlpHexLen];
|
||||
signal input nodePathPrefixHexLen[maxDepth - 1];
|
||||
|
||||
// index 0 = root; value 0 = branch, 1 = extension
|
||||
signal input nodeTypes[maxDepth - 1];
|
||||
signal input depth;
|
||||
|
||||
signal output out;
|
||||
signal output isCall;
|
||||
signal output methodId;
|
||||
|
||||
component tx_pf = EthTransactionProofCore(maxDepth, maxIndex, maxTxRlpHexLen);
|
||||
tx_pf.blockHash[0] <== blockHash[0];
|
||||
tx_pf.blockHash[1] <== blockHash[1];
|
||||
tx_pf.index <== index;
|
||||
|
||||
for (var idx = 0; idx < 1112; idx++) {
|
||||
tx_pf.blockRlpHexs[idx] <== blockRlpHexs[idx];
|
||||
}
|
||||
for (var idx = 0; idx < maxTxRlpHexLen; idx++) {
|
||||
tx_pf.txRlpHexs[idx] <== txRlpHexs[idx];
|
||||
}
|
||||
for (var idx = 0; idx < maxDepth; idx++) {
|
||||
tx_pf.keyFragmentStarts[idx] <== keyFragmentStarts[idx];
|
||||
}
|
||||
for (var idx = 0; idx < maxLeafRlpHexLen; idx++) {
|
||||
tx_pf.leafRlpHexs[idx] <== leafRlpHexs[idx];
|
||||
}
|
||||
tx_pf.leafPathPrefixHexLen <== leafPathPrefixHexLen;
|
||||
|
||||
for (var idx = 0; idx < maxDepth - 1; idx++) {
|
||||
for (var j = 0; j < maxBranchRlpHexLen; j++) {
|
||||
tx_pf.nodeRlpHexs[idx][j] <== nodeRlpHexs[idx][j];
|
||||
}
|
||||
}
|
||||
for (var idx = 0; idx < maxDepth - 1; idx++) {
|
||||
tx_pf.nodePathPrefixHexLen[idx] <== nodePathPrefixHexLen[idx];
|
||||
tx_pf.nodeTypes[idx] <== nodeTypes[idx];
|
||||
}
|
||||
tx_pf.depth <== depth;
|
||||
|
||||
out <== tx_pf.out;
|
||||
|
||||
component iz = IsZero();
|
||||
iz.in <== tx_pf.dataHexLen;
|
||||
isCall <== 1 - iz.out;
|
||||
|
||||
var temp = 0;
|
||||
for (var idx = 0; idx < 8; idx++) {
|
||||
temp = temp + tx_pf.dataHexs[idx] * (16 ** (7 - idx));
|
||||
}
|
||||
methodId <== isCall * temp;
|
||||
}
|
||||
|
||||
template EthAddressStorageProof2(addressMaxDepth, storageMaxDepth) {
|
||||
// 128 bits = big endian expression of hexes
|
||||
signal input blockHash[2]; // 128 bit coordinates
|
||||
signal input address; // 160 bits
|
||||
signal input slot[2]; // 128 bit coordinates
|
||||
|
||||
// block input
|
||||
signal input blockRlpHexs[1112];
|
||||
|
||||
// address proof input
|
||||
var addressKeyHexLen = 64;
|
||||
var addressMaxValueHexLen = 228;
|
||||
var addressMaxLeafRlpHexLen = 4 + (addressKeyHexLen + 2) + 4 + addressMaxValueHexLen;
|
||||
var addressMaxBranchRlpHexLen = 1064;
|
||||
var addressMaxExtensionRlpHexLen = 4 + 2 + addressKeyHexLen + 2 + 64;
|
||||
|
||||
signal input addressKeyFragmentStarts[addressMaxDepth];
|
||||
|
||||
signal input addressValueRlpHexs[228];
|
||||
|
||||
signal input addressLeafRlpHexs[addressMaxLeafRlpHexLen];
|
||||
signal input addressLeafPathPrefixHexLen;
|
||||
|
||||
signal input addressNodeRlpHexs[addressMaxDepth - 1][addressMaxBranchRlpHexLen];
|
||||
signal input addressNodePathPrefixHexLen[addressMaxDepth - 1];
|
||||
signal input addressNodeTypes[addressMaxDepth - 1];
|
||||
|
||||
signal input addressDepth;
|
||||
|
||||
// storage proof inputs
|
||||
var storageKeyHexLen = 64;
|
||||
var storageMaxValueHexLen = 66;
|
||||
var storageMaxLeafRlpHexLen = 4 + (storageKeyHexLen + 2) + 4 + storageMaxValueHexLen;
|
||||
var storageMaxBranchRlpHexLen = 1064;
|
||||
var storageMaxExtensionRlpHexLen = 4 + 2 + storageKeyHexLen + 2 + 64;
|
||||
|
||||
signal input storageKeyFragmentStarts[storageMaxDepth];
|
||||
|
||||
signal input slotValueRlpHexs[66];
|
||||
|
||||
signal input storageLeafRlpHexs[storageMaxLeafRlpHexLen];
|
||||
signal input storageLeafPathPrefixHexLen;
|
||||
|
||||
signal input storageNodeRlpHexs[storageMaxDepth - 1][storageMaxBranchRlpHexLen];
|
||||
signal input storageNodePathPrefixHexLen[storageMaxDepth - 1];
|
||||
signal input storageNodeTypes[storageMaxDepth - 1];
|
||||
|
||||
signal input storageDepth;
|
||||
|
||||
signal output out;
|
||||
signal output blockNumber;
|
||||
signal output slotValue[2]; // 128 bit coordinates
|
||||
|
||||
log(5555555000042);
|
||||
log(addressMaxDepth);
|
||||
log(storageMaxDepth);
|
||||
log(blockHash[0]);
|
||||
log(blockHash[1]);
|
||||
log(address);
|
||||
log(slot[0]);
|
||||
log(slot[1]);
|
||||
|
||||
// decode compressed inputs
|
||||
signal blockHashHexs[64];
|
||||
signal addressHexs[40];
|
||||
signal slotHexs[64];
|
||||
component blockHashN2b[2];
|
||||
for (var idx = 0; idx < 2; idx++) {
|
||||
blockHashN2b[idx] = Num2Bits(128);
|
||||
blockHashN2b[idx].in <== blockHash[idx];
|
||||
for (var j = 0; j < 32; j++) {
|
||||
blockHashHexs[32 * idx + j] <== 8 * blockHashN2b[idx].out[4 * (31 - j) + 3] + 4 * blockHashN2b[idx].out[4 * (31 - j) + 2] + 2 * blockHashN2b[idx].out[4 * (31 - j) + 1] + blockHashN2b[idx].out[4 * (31 - j)];
|
||||
}
|
||||
}
|
||||
component addressN2b = Num2Bits(160);
|
||||
addressN2b.in <== address;
|
||||
for (var idx = 0; idx < 40; idx++) {
|
||||
addressHexs[idx] <== 8 * addressN2b.out[4 * (39 - idx) + 3] + 4 * addressN2b.out[4 * (39 - idx) + 2] + 2 * addressN2b.out[4 * (39 - idx) + 1] + addressN2b.out[4 * (39 - idx)];
|
||||
}
|
||||
component slotN2b[2];
|
||||
for (var idx = 0; idx < 2; idx++) {
|
||||
slotN2b[idx] = Num2Bits(128);
|
||||
slotN2b[idx].in <== slot[idx];
|
||||
for (var j = 0; j < 32; j++) {
|
||||
slotHexs[32 * idx + j] <== 8 * slotN2b[idx].out[4 * (31 - j) + 3] + 4 * slotN2b[idx].out[4 * (31 - j) + 2] + 2 * slotN2b[idx].out[4 * (31 - j) + 1] + slotN2b[idx].out[4 * (31 - j)];
|
||||
}
|
||||
}
|
||||
|
||||
// match block hash
|
||||
component block_hash = EthBlockHashHex3();
|
||||
for (var idx = 0; idx < 1112; idx++) {
|
||||
block_hash.blockRlpHexs[idx] <== blockRlpHexs[idx];
|
||||
}
|
||||
|
||||
component block_hash_check = ArrayEq(64);
|
||||
for (var idx = 0; idx < 64; idx++) {
|
||||
block_hash_check.a[idx] <== block_hash.blockHashHexs[idx];
|
||||
block_hash_check.b[idx] <== blockHashHexs[idx];
|
||||
}
|
||||
block_hash_check.inLen <== 64;
|
||||
|
||||
// check address proof
|
||||
component address_proof = EthAddressProof2(addressMaxDepth);
|
||||
for (var idx = 0; idx < 64; idx++) {
|
||||
address_proof.stateRootHexs[idx] <== block_hash.stateRoot[idx];
|
||||
}
|
||||
for (var idx = 0; idx < 40; idx++) {
|
||||
address_proof.addressHexs[idx] <== addressHexs[idx];
|
||||
}
|
||||
for (var idx = 0; idx < 228; idx++) {
|
||||
address_proof.addressValueRlpHexs[idx] <== addressValueRlpHexs[idx];
|
||||
}
|
||||
for (var idx = 0; idx < addressMaxDepth; idx++) {
|
||||
address_proof.keyFragmentStarts[idx] <== addressKeyFragmentStarts[idx];
|
||||
}
|
||||
address_proof.leafPathPrefixHexLen <== addressLeafPathPrefixHexLen;
|
||||
for (var idx = 0; idx < addressMaxLeafRlpHexLen; idx++) {
|
||||
address_proof.leafRlpHexs[idx] <== addressLeafRlpHexs[idx];
|
||||
}
|
||||
for (var idx = 0; idx < addressMaxDepth - 1; idx++) {
|
||||
address_proof.nodePathPrefixHexLen[idx] <== addressNodePathPrefixHexLen[idx];
|
||||
for (var j = 0; j < addressMaxBranchRlpHexLen; j++) {
|
||||
address_proof.nodeRlpHexs[idx][j] <== addressNodeRlpHexs[idx][j];
|
||||
}
|
||||
address_proof.nodeTypes[idx] <== addressNodeTypes[idx];
|
||||
}
|
||||
address_proof.depth <== addressDepth;
|
||||
|
||||
// check storage proof
|
||||
component storage_proof = EthStorageProof2(storageMaxDepth);
|
||||
for (var idx = 0; idx < 64; idx++) {
|
||||
storage_proof.storageRootHexs[idx] <== address_proof.storageRootHexs[idx];
|
||||
}
|
||||
for (var idx = 0; idx < 64; idx++) {
|
||||
storage_proof.slotHexs[idx] <== slotHexs[idx];
|
||||
}
|
||||
for (var idx = 0; idx < 66; idx++) {
|
||||
storage_proof.valueRlpHexs[idx] <== slotValueRlpHexs[idx];
|
||||
}
|
||||
for (var idx = 0; idx < storageMaxDepth; idx++) {
|
||||
storage_proof.keyFragmentStarts[idx] <== storageKeyFragmentStarts[idx];
|
||||
}
|
||||
storage_proof.leafPathPrefixHexLen <== storageLeafPathPrefixHexLen;
|
||||
for (var idx = 0; idx < storageMaxLeafRlpHexLen; idx++) {
|
||||
storage_proof.leafRlpHexs[idx] <== storageLeafRlpHexs[idx];
|
||||
}
|
||||
for (var idx = 0; idx < storageMaxDepth - 1; idx++) {
|
||||
storage_proof.nodePathPrefixHexLen[idx] <== storageNodePathPrefixHexLen[idx];
|
||||
for (var j = 0; j < storageMaxBranchRlpHexLen; j++) {
|
||||
storage_proof.nodeRlpHexs[idx][j] <== storageNodeRlpHexs[idx][j];
|
||||
}
|
||||
storage_proof.nodeTypes[idx] <== storageNodeTypes[idx];
|
||||
}
|
||||
storage_proof.depth <== storageDepth;
|
||||
|
||||
component final_check = IsEqual();
|
||||
final_check.in[0] <== 3;
|
||||
final_check.in[1] <== block_hash_check.out + address_proof.out + storage_proof.out;
|
||||
out <== final_check.out;
|
||||
|
||||
component shift = ShiftRight(64, 9);
|
||||
for (var idx = 0; idx < 64; idx++) {
|
||||
shift.in[idx] <== storage_proof.slotValue[idx];
|
||||
}
|
||||
shift.shift <== 64 - storage_proof.valueHexLen;
|
||||
|
||||
for (var idx = 0; idx < 2; idx++) {
|
||||
var temp = 0;
|
||||
for (var j = 0; j < 32; j++) {
|
||||
temp = temp + shift.out[32 * idx + j] * (16 ** (31 - j));
|
||||
}
|
||||
slotValue[idx] <== temp;
|
||||
}
|
||||
|
||||
component blockNumberShift = ShiftRight(6, 3);
|
||||
for (var idx = 0; idx < 6; idx++) {
|
||||
blockNumberShift.in[idx] <== block_hash.number[idx];
|
||||
}
|
||||
blockNumberShift.shift <== 6 - block_hash.numberHexLen;
|
||||
var tempBlockNumber = 0;
|
||||
for (var idx = 0; idx < 6; idx++) {
|
||||
tempBlockNumber = tempBlockNumber + blockNumberShift.out[idx] * (16 ** (5 - idx));
|
||||
}
|
||||
blockNumber <== tempBlockNumber;
|
||||
|
||||
log(out);
|
||||
log(block_hash_check.out);
|
||||
log(address_proof.out);
|
||||
log(storage_proof.out);
|
||||
|
||||
log(slotValue[0]);
|
||||
log(slotValue[1]);
|
||||
log(blockNumber);
|
||||
}
|
||||
@@ -30,11 +30,11 @@ TAG_TO_NAME = {
|
||||
555555500002: 'EthAddressProof',
|
||||
555555500003: 'EthStorageProof',
|
||||
555555500004: 'EthAddressStorageProof',
|
||||
5555555000012: 'EthBlockHashHex2',
|
||||
5555555000013: 'EthBlockHashHex3',
|
||||
5555555000022: 'EthAddressProof2',
|
||||
5555555000032: 'EthStorageProof2',
|
||||
5555555000042: 'EthAddressStorageProof2',
|
||||
5555555000012: 'EthBlockHashHex',
|
||||
5555555000013: 'EthBlockHashHex',
|
||||
5555555000022: 'EthAddressProof',
|
||||
5555555000032: 'EthStorageProof',
|
||||
5555555000042: 'EthAddressStorageProof',
|
||||
1111111000012: 'LeafCheck2',
|
||||
1111111000022: 'ExtensionCheck2',
|
||||
1111111000042: 'EmptyVtBranchCheck2',
|
||||
|
||||
10
package.json
10
package.json
@@ -1,18 +1,16 @@
|
||||
{
|
||||
"name": "eth-attestor",
|
||||
"name": "zk-attestor",
|
||||
"version": "0.0.1",
|
||||
"description": "Attestations to Ethereum data in circom",
|
||||
"main": "index.js",
|
||||
"scripts": {
|
||||
"build": "./build_circuits.sh",
|
||||
"build:storage": "cd ./scripts/storage_proof && ./build_storage_proof.sh",
|
||||
"build:address": "cd ./scripts/address_proof && ./build_address_proof.sh",
|
||||
"build:eth_addr_storage": "cd ./scripts/eth_addr_storage && ./build_eth_addr_storage.sh",
|
||||
"build:eth_tx_proof": "cd ./scripts/eth_tx && ./build_eth_tx.sh",
|
||||
"build:eth_block_hash": "cd ./scripts/eth_block_hash && ./build_eth_block_hash.sh",
|
||||
"build:tx": "cd ./scripts/tx_proof && ./build_tx_proof.sh",
|
||||
"test": "NODE_OPTIONS='--max-old-space-size=56000' mocha -r ts-node/register 'test/**/*.ts'",
|
||||
"test:hardhat": "hardhat test"
|
||||
},
|
||||
"repository": "git@github.com:yi-sun/eth-attestor.git",
|
||||
"repository": "git@github.com:yi-sun/zk-attestor.git",
|
||||
"author": "Yi Sun <yi-sun@users.noreply.github.com>",
|
||||
"dependencies": {
|
||||
"circomlib": "^2.0.2",
|
||||
|
||||
@@ -1,24 +0,0 @@
|
||||
pragma circom 2.0.2;
|
||||
|
||||
include "../../circuits/mpt.circom";
|
||||
|
||||
component main {public [
|
||||
keyHexs,
|
||||
valueHexs,
|
||||
rootHashHexs,
|
||||
leafRlpLengthHexLen,
|
||||
leafPathRlpLengthHexLen,
|
||||
leafPathPrefixHexLen,
|
||||
leafPathHexLen,
|
||||
leafValueRlpLengthHexLen,
|
||||
leafValueHexLen,
|
||||
leafRlpHexs,
|
||||
nodeRlpLengthHexLen,
|
||||
nodePathRlpLengthHexLen,
|
||||
nodePathPrefixHexLen,
|
||||
nodePathHexLen,
|
||||
nodeRefHexLen,
|
||||
nodeRlpHexs,
|
||||
nodeTypes,
|
||||
depth
|
||||
]} = MPTInclusionFixedKeyHexLen(8, 64, 228);
|
||||
@@ -1,67 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
PHASE1=../../circuits/pot24_final.ptau
|
||||
BUILD_DIR=../../build/address_proof
|
||||
CIRCUIT_NAME=address_proof
|
||||
|
||||
if [ -f "$PHASE1" ]; then
|
||||
echo "Found Phase 1 ptau file"
|
||||
else
|
||||
echo "No Phase 1 ptau file found. Exiting..."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ ! -d "$BUILD_DIR" ]; then
|
||||
echo "No build directory found. Creating build directory..."
|
||||
mkdir "$BUILD_DIR"
|
||||
fi
|
||||
|
||||
echo $PWD
|
||||
|
||||
echo "****COMPILING CIRCUIT****"
|
||||
start=`date +%s`
|
||||
circom "$CIRCUIT_NAME".circom --r1cs --wasm --sym --c --wat --output "$BUILD_DIR"
|
||||
end=`date +%s`
|
||||
echo "DONE ($((end-start))s)"
|
||||
|
||||
echo "****GENERATING WITNESS FOR SAMPLE INPUT****"
|
||||
start=`date +%s`
|
||||
node "$BUILD_DIR"/"$CIRCUIT_NAME"_js/generate_witness.js "$BUILD_DIR"/"$CIRCUIT_NAME"_js/"$CIRCUIT_NAME".wasm input_"$CIRCUIT_NAME".json "$BUILD_DIR"/witness.wtns
|
||||
end=`date +%s`
|
||||
echo "DONE ($((end-start))s)"
|
||||
|
||||
echo "****GENERATING ZKEY 0****"
|
||||
start=`date +%s`
|
||||
NODE_OPTIONS="--max-old-space-size=56000" npx snarkjs groth16 setup "$BUILD_DIR"/"$CIRCUIT_NAME".r1cs "$PHASE1" "$BUILD_DIR"/"$CIRCUIT_NAME"_0.zkey
|
||||
end=`date +%s`
|
||||
echo "DONE ($((end-start))s)"
|
||||
|
||||
echo "****GENERATING FINAL ZKEY****"
|
||||
start=`date +%s`
|
||||
NODE_OPTIONS="--max-old-space-size=56000" npx snarkjs zkey beacon "$BUILD_DIR"/"$CIRCUIT_NAME"_0.zkey "$BUILD_DIR"/"$CIRCUIT_NAME".zkey 0102030405060708090a0b0c0d0e0f101112231415161718221a1b1c1d1e1f 10 -n="Final Beacon phase2"
|
||||
end=`date +%s`
|
||||
echo "DONE ($((end-start))s)"
|
||||
|
||||
echo "****VERIFYING FINAL ZKEY****"
|
||||
start=`date +%s`
|
||||
NODE_OPTIONS="--max-old-space-size=56000" npx snarkjs zkey verify -verbose "$BUILD_DIR"/"$CIRCUIT_NAME".r1cs "$PHASE1" "$BUILD_DIR"/"$CIRCUIT_NAME".zkey
|
||||
end=`date +%s`
|
||||
echo "DONE ($((end-start))s)"
|
||||
|
||||
echo "****EXPORTING VKEY****"
|
||||
start=`date +%s`
|
||||
npx snarkjs zkey export verificationkey "$BUILD_DIR"/"$CIRCUIT_NAME".zkey "$BUILD_DIR"/vkey.json
|
||||
end=`date +%s`
|
||||
echo "DONE ($((end-start))s)"
|
||||
|
||||
echo "****GENERATING PROOF FOR SAMPLE INPUT****"
|
||||
start=`date +%s`
|
||||
npx snarkjs groth16 prove "$BUILD_DIR"/"$CIRCUIT_NAME".zkey "$BUILD_DIR"/witness.wtns "$BUILD_DIR"/proof.json "$BUILD_DIR"/public.json
|
||||
end=`date +%s`
|
||||
echo "DONE ($((end-start))s)"
|
||||
|
||||
echo "****VERIFYING PROOF FOR SAMPLE INPUT****"
|
||||
start=`date +%s`
|
||||
npx snarkjs groth16 verify "$BUILD_DIR"/vkey.json "$BUILD_DIR"/public.json "$BUILD_DIR"/proof.json
|
||||
end=`date +%s`
|
||||
echo "DONE ($((end-start))s)"
|
||||
@@ -1,354 +0,0 @@
|
||||
{"depth": 8,
|
||||
"keyHexs": [2, 8, 10, 2, 1, 15, 10, 15, 8, 12, 7, 15, 10, 11, 5, 7, 4, 7, 1, 10, 2, 10, 4, 1, 3, 8,
|
||||
7, 15, 9, 11, 0, 13, 0, 14, 10, 11, 2, 2, 9, 4, 5, 7, 12, 5, 0, 2, 4, 11, 13, 6, 12,
|
||||
15, 11, 7, 2, 13, 13, 7, 11, 11, 10, 2, 15, 14],
|
||||
"leafPathHexLen": 57,
|
||||
"leafPathPrefixHexLen": 1,
|
||||
"leafPathRlpLengthHexLen": 0,
|
||||
"leafRlpHexs": [15, 8, 7, 0, 9, 13, 3, 15, 8, 12, 7, 15, 10, 11, 5, 7, 4, 7, 1, 10, 2, 10, 4, 1, 3,
|
||||
8, 7, 15, 9, 11, 0, 13, 0, 14, 10, 11, 2, 2, 9, 4, 5, 7, 12, 5, 0, 2, 4, 11, 13, 6,
|
||||
12, 15, 11, 7, 2, 13, 13, 7, 11, 11, 10, 2, 15, 14, 11, 8, 5, 0, 15, 8, 4, 14, 0,
|
||||
1, 8, 10, 0, 3, 1, 3, 5, 7, 0, 10, 8, 4, 11, 15, 3, 7, 8, 14, 15, 13, 2, 5, 10, 0,
|
||||
10, 14, 2, 7, 9, 2, 2, 4, 4, 4, 1, 7, 11, 12, 1, 7, 4, 9, 11, 9, 12, 13, 9, 10, 0,
|
||||
11, 13, 12, 1, 12, 4, 10, 6, 12, 15, 3, 2, 15, 1, 4, 7, 11, 3, 7, 2, 0, 2, 12, 8,
|
||||
12, 11, 3, 5, 9, 0, 7, 7, 7, 6, 5, 9, 10, 14, 12, 10, 0, 14, 2, 14, 7, 10, 7, 5, 2,
|
||||
4, 10, 9, 8, 12, 14, 6, 2, 9, 14, 14, 4, 0, 6, 12, 1, 5, 12, 5, 1, 10, 6, 8, 3, 14,
|
||||
4, 1, 6, 7, 15, 0, 11, 7, 4, 14, 10, 2, 3, 0, 5, 6, 6, 13, 13, 14, 12, 14, 7, 10,
|
||||
14, 9, 13, 6, 15, 0, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
|
||||
"leafRlpLengthHexLen": 2,
|
||||
"leafValueHexLen": 160,
|
||||
"leafValueRlpLengthHexLen": 2,
|
||||
"nodePathHexLen": [0, 0, 0, 0, 0, 0, 0],
|
||||
"nodePathPrefixHexLen": [0, 0, 0, 0, 0, 0, 0],
|
||||
"nodePathRlpLengthHexLen": [0, 0, 0, 0, 0, 0, 0],
|
||||
"nodeRefHexLen": [[64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64],
|
||||
[64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64],
|
||||
[64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64],
|
||||
[64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64],
|
||||
[64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64],
|
||||
[64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64],
|
||||
[0, 0, 64, 0, 64, 0, 0, 0, 64, 0, 64, 64, 64, 0, 0, 0]],
|
||||
"nodeRlpHexs": [[15, 9, 0, 2, 1, 1, 10, 0, 6, 1, 7, 2, 10, 15, 14, 14, 15, 7, 7, 2, 14, 14, 1, 10,
|
||||
9, 7, 7, 6, 7, 0, 10, 5, 14, 9, 14, 3, 1, 14, 3, 7, 7, 6, 10, 1, 6, 5, 5, 14, 8,
|
||||
13, 2, 12, 8, 9, 7, 13, 1, 8, 13, 6, 13, 10, 15, 4, 15, 6, 2, 6, 7, 3, 9, 9, 10,
|
||||
0, 0, 3, 11, 9, 7, 10, 7, 10, 0, 0, 10, 2, 0, 14, 14, 4, 11, 2, 10, 11, 9, 3, 7,
|
||||
1, 6, 4, 7, 11, 1, 7, 15, 7, 9, 3, 12, 2, 4, 8, 13, 15, 13, 6, 3, 9, 10, 13, 0,
|
||||
11, 9, 9, 11, 7, 6, 3, 13, 2, 6, 13, 9, 4, 1, 11, 3, 9, 10, 0, 10, 11, 4, 3, 10,
|
||||
14, 14, 13, 0, 12, 13, 12, 2, 12, 6, 3, 0, 9, 8, 7, 5, 15, 13, 13, 3, 2, 4, 15, 0,
|
||||
14, 9, 10, 13, 9, 15, 11, 1, 13, 10, 13, 14, 3, 5, 6, 5, 15, 9, 14, 5, 7, 2, 5,
|
||||
13, 2, 9, 10, 9, 5, 11, 8, 15, 3, 4, 14, 10, 0, 11, 11, 10, 2, 3, 6, 15, 13, 4,
|
||||
14, 7, 0, 7, 11, 6, 9, 10, 2, 15, 12, 12, 13, 5, 3, 3, 13, 14, 7, 0, 9, 11, 2, 5,
|
||||
2, 8, 13, 8, 6, 10, 9, 14, 12, 1, 0, 9, 13, 11, 5, 11, 8, 5, 6, 0, 6, 14, 3, 1, 7,
|
||||
0, 2, 2, 3, 12, 13, 10, 0, 8, 5, 3, 6, 13, 7, 8, 6, 7, 4, 15, 0, 15, 6, 11, 14, 3,
|
||||
2, 2, 15, 14, 11, 4, 7, 13, 13, 1, 2, 3, 13, 4, 11, 8, 8, 12, 0, 7, 14, 6, 14, 8,
|
||||
9, 1, 8, 5, 7, 2, 1, 13, 8, 13, 11, 8, 14, 7, 7, 0, 13, 6, 5, 10, 15, 4, 1, 10, 0,
|
||||
14, 11, 15, 5, 15, 14, 14, 5, 1, 3, 0, 9, 5, 2, 0, 4, 1, 11, 8, 12, 11, 6, 3, 1,
|
||||
7, 3, 9, 0, 15, 15, 13, 2, 15, 6, 2, 10, 0, 6, 8, 6, 10, 1, 2, 15, 9, 2, 1, 15, 8,
|
||||
11, 5, 10, 1, 0, 15, 10, 13, 8, 2, 0, 6, 11, 0, 4, 10, 0, 13, 1, 3, 11, 2, 6, 2,
|
||||
1, 1, 9, 1, 5, 14, 8, 14, 8, 15, 3, 14, 2, 13, 7, 9, 0, 13, 14, 5, 1, 12, 1, 7,
|
||||
12, 11, 4, 1, 9, 1, 13, 8, 0, 5, 0, 8, 14, 3, 5, 1, 8, 2, 14, 10, 0, 2, 10, 14, 8,
|
||||
13, 2, 14, 0, 10, 13, 6, 5, 10, 0, 12, 14, 11, 3, 15, 8, 1, 2, 2, 5, 13, 13, 0, 3,
|
||||
1, 2, 11, 13, 13, 7, 7, 12, 2, 7, 6, 12, 0, 14, 12, 2, 11, 0, 1, 8, 3, 4, 13, 0,
|
||||
2, 6, 12, 3, 14, 1, 10, 13, 15, 0, 8, 8, 7, 8, 12, 11, 15, 9, 8, 3, 10, 0, 2, 10,
|
||||
11, 1, 10, 0, 9, 13, 15, 8, 0, 2, 13, 9, 5, 0, 9, 5, 0, 14, 12, 9, 13, 7, 5, 11,
|
||||
8, 3, 2, 14, 11, 7, 6, 8, 13, 12, 2, 2, 3, 6, 10, 15, 9, 3, 15, 10, 6, 4, 8, 2,
|
||||
12, 9, 15, 2, 15, 8, 2, 3, 6, 7, 10, 9, 1, 3, 14, 10, 0, 3, 8, 3, 10, 0, 11, 1, 5,
|
||||
13, 14, 6, 12, 8, 7, 4, 12, 15, 10, 1, 0, 5, 5, 0, 5, 2, 10, 10, 7, 3, 6, 10, 4,
|
||||
5, 10, 14, 7, 13, 9, 13, 11, 11, 7, 15, 10, 7, 14, 0, 12, 14, 2, 6, 0, 8, 5, 11,
|
||||
0, 12, 2, 1, 4, 4, 13, 2, 11, 14, 15, 11, 1, 0, 10, 0, 7, 2, 7, 0, 12, 15, 13, 2,
|
||||
5, 4, 5, 13, 3, 13, 1, 9, 13, 2, 2, 12, 8, 5, 8, 14, 12, 8, 10, 9, 12, 8, 7, 1, 5,
|
||||
11, 11, 11, 4, 12, 10, 8, 6, 8, 9, 12, 5, 13, 14, 3, 2, 4, 12, 4, 11, 0, 0, 0, 15,
|
||||
13, 10, 2, 5, 13, 9, 11, 10, 0, 5, 7, 7, 10, 13, 2, 13, 13, 11, 12, 4, 10, 13, 6,
|
||||
10, 14, 14, 15, 3, 3, 5, 10, 3, 0, 14, 5, 1, 1, 11, 15, 0, 1, 5, 2, 10, 0, 2, 2,
|
||||
10, 15, 13, 15, 11, 14, 2, 3, 3, 4, 13, 6, 9, 7, 12, 9, 11, 4, 7, 1, 1, 14, 13, 7,
|
||||
10, 14, 10, 0, 8, 0, 8, 14, 8, 4, 9, 5, 0, 13, 13, 7, 12, 10, 8, 11, 7, 13, 2, 13,
|
||||
3, 1, 13, 14, 11, 15, 4, 9, 2, 1, 13, 10, 4, 11, 2, 1, 15, 13, 14, 2, 13, 7, 10,
|
||||
7, 6, 14, 13, 6, 9, 9, 13, 10, 13, 7, 11, 8, 11, 12, 5, 1, 15, 2, 15, 4, 10, 0, 8,
|
||||
10, 2, 7, 10, 13, 12, 11, 10, 9, 4, 7, 8, 6, 14, 0, 0, 7, 1, 9, 14, 12, 9, 5, 0,
|
||||
10, 11, 8, 6, 10, 2, 8, 2, 14, 4, 13, 6, 13, 1, 13, 6, 3, 9, 15, 10, 1, 3, 15, 2,
|
||||
0, 12, 6, 0, 9, 5, 1, 14, 3, 2, 0, 14, 12, 3, 10, 10, 0, 6, 8, 13, 11, 11, 10, 11,
|
||||
1, 2, 11, 7, 7, 3, 3, 0, 2, 2, 7, 6, 15, 7, 9, 5, 8, 12, 9, 11, 12, 8, 12, 7, 2,
|
||||
13, 0, 15, 6, 10, 2, 6, 15, 8, 2, 4, 6, 0, 7, 4, 10, 6, 1, 8, 9, 13, 1, 8, 4, 2,
|
||||
0, 2, 1, 15, 4, 5, 8, 10, 0, 1, 6, 8, 4, 7, 4, 7, 15, 12, 7, 7, 2, 2, 14, 7, 0, 4,
|
||||
9, 2, 15, 2, 14, 5, 15, 13, 3, 4, 13, 6, 9, 11, 13, 14, 8, 12, 0, 8, 0, 6, 3, 4,
|
||||
0, 15, 8, 1, 12, 6, 12, 12, 10, 3, 14, 1, 14, 7, 5, 8, 4, 6, 8, 6, 3, 5, 6, 8,
|
||||
0],
|
||||
[15, 9, 0, 2, 1, 1, 10, 0, 7, 7, 8, 1, 11, 4, 15, 7, 12, 1, 10, 3, 1, 0, 14, 3, 7,
|
||||
9, 4, 4, 3, 1, 10, 11, 1, 2, 10, 12, 13, 1, 1, 1, 14, 8, 7, 2, 4, 5, 15, 5, 1, 1,
|
||||
0, 9, 4, 14, 12, 3, 10, 3, 12, 3, 13, 7, 9, 11, 1, 12, 15, 2, 14, 9, 0, 1, 10, 0,
|
||||
7, 11, 3, 8, 5, 7, 14, 4, 0, 14, 10, 3, 2, 14, 1, 10, 9, 1, 6, 2, 11, 10, 7, 14,
|
||||
14, 14, 14, 2, 3, 8, 9, 2, 11, 2, 2, 4, 11, 10, 14, 12, 9, 12, 1, 14, 1, 11, 8, 2,
|
||||
11, 10, 3, 11, 6, 13, 12, 15, 9, 5, 11, 6, 6, 3, 11, 14, 10, 0, 7, 15, 5, 13, 14,
|
||||
5, 11, 2, 6, 11, 13, 2, 10, 0, 14, 7, 3, 9, 8, 2, 3, 13, 5, 11, 0, 2, 6, 0, 8, 3,
|
||||
1, 13, 8, 9, 8, 10, 9, 13, 6, 2, 1, 7, 3, 3, 4, 4, 2, 0, 15, 0, 5, 10, 15, 10, 8,
|
||||
8, 3, 12, 0, 8, 15, 14, 8, 7, 10, 0, 2, 1, 2, 13, 5, 0, 12, 1, 5, 4, 12, 11, 4, 3,
|
||||
12, 14, 8, 5, 12, 0, 9, 7, 14, 14, 5, 10, 7, 14, 15, 0, 2, 14, 9, 9, 15, 3, 4, 7,
|
||||
6, 12, 11, 8, 13, 11, 7, 0, 7, 1, 5, 5, 10, 3, 15, 3, 10, 8, 4, 3, 14, 10, 2, 15,
|
||||
5, 0, 10, 0, 14, 10, 10, 11, 15, 14, 0, 0, 2, 0, 12, 14, 7, 2, 8, 7, 12, 13, 15,
|
||||
2, 7, 5, 13, 1, 2, 13, 5, 4, 7, 3, 13, 7, 11, 6, 6, 5, 13, 8, 11, 7, 11, 8, 12, 0,
|
||||
6, 9, 5, 12, 10, 3, 1, 15, 11, 0, 10, 12, 14, 15, 2, 11, 12, 6, 5, 4, 10, 0, 14,
|
||||
5, 1, 9, 0, 2, 1, 10, 10, 15, 3, 5, 14, 15, 1, 0, 12, 1, 5, 14, 0, 14, 12, 14, 0,
|
||||
15, 13, 3, 14, 10, 8, 5, 1, 14, 14, 0, 0, 8, 3, 4, 6, 4, 14, 12, 3, 8, 6, 0, 12,
|
||||
5, 0, 6, 8, 3, 11, 3, 7, 11, 4, 5, 14, 3, 15, 1, 10, 0, 9, 8, 13, 9, 2, 12, 9, 3,
|
||||
11, 8, 3, 10, 8, 5, 0, 11, 1, 13, 11, 13, 4, 14, 11, 8, 8, 9, 2, 7, 1, 8, 11, 2,
|
||||
2, 13, 13, 5, 8, 2, 9, 14, 12, 2, 5, 11, 1, 12, 12, 15, 5, 13, 3, 3, 10, 3, 13, 3,
|
||||
3, 13, 13, 3, 13, 14, 14, 11, 10, 0, 7, 10, 15, 2, 12, 0, 1, 7, 14, 12, 13, 12,
|
||||
11, 10, 12, 6, 1, 2, 14, 7, 5, 15, 2, 3, 5, 11, 8, 0, 6, 4, 7, 6, 6, 1, 11, 9, 11,
|
||||
11, 6, 5, 5, 11, 15, 8, 11, 14, 5, 13, 1, 14, 0, 9, 15, 12, 14, 2, 11, 8, 9, 9,
|
||||
14, 0, 13, 10, 10, 0, 10, 2, 15, 12, 0, 4, 10, 2, 0, 1, 9, 9, 13, 4, 8, 11, 12, 5,
|
||||
14, 0, 7, 3, 2, 7, 1, 9, 2, 14, 15, 13, 1, 2, 7, 3, 0, 2, 14, 8, 8, 12, 3, 5, 4,
|
||||
8, 2, 12, 15, 10, 13, 14, 15, 6, 11, 8, 7, 2, 12, 11, 2, 5, 13, 5, 3, 15, 10, 0,
|
||||
12, 9, 4, 4, 1, 15, 2, 11, 11, 4, 3, 11, 1, 12, 15, 12, 6, 5, 2, 6, 8, 3, 2, 10,
|
||||
5, 9, 11, 4, 8, 8, 3, 14, 0, 1, 8, 0, 14, 14, 8, 0, 10, 8, 12, 5, 8, 7, 10, 2, 15,
|
||||
15, 6, 14, 11, 5, 8, 15, 4, 13, 4, 10, 14, 7, 15, 1, 10, 0, 0, 1, 4, 11, 3, 1, 9,
|
||||
14, 4, 2, 2, 4, 14, 0, 15, 10, 1, 11, 5, 15, 7, 3, 3, 10, 9, 3, 8, 11, 4, 6, 2,
|
||||
12, 15, 4, 2, 15, 3, 3, 10, 14, 4, 6, 4, 5, 13, 1, 11, 15, 9, 12, 11, 1, 8, 6, 3,
|
||||
10, 12, 4, 3, 13, 8, 13, 0, 12, 10, 0, 7, 12, 4, 1, 12, 9, 14, 11, 6, 9, 12, 7, 6,
|
||||
3, 7, 14, 13, 5, 13, 2, 12, 10, 2, 3, 7, 13, 0, 9, 1, 1, 6, 11, 2, 1, 6, 12, 7,
|
||||
10, 15, 11, 8, 8, 9, 10, 0, 7, 11, 5, 2, 7, 0, 8, 1, 2, 4, 6, 9, 0, 4, 12, 3, 11,
|
||||
7, 4, 10, 0, 7, 0, 10, 0, 5, 1, 10, 9, 10, 3, 7, 2, 6, 15, 0, 8, 15, 2, 0, 7, 4,
|
||||
5, 0, 15, 4, 0, 11, 3, 7, 9, 15, 2, 14, 11, 6, 0, 15, 15, 9, 13, 15, 2, 11, 12,
|
||||
12, 10, 3, 8, 11, 12, 14, 4, 4, 3, 12, 7, 15, 11, 0, 11, 8, 12, 2, 11, 10, 0, 6,
|
||||
7, 6, 4, 0, 14, 10, 6, 7, 4, 13, 6, 12, 7, 10, 0, 10, 0, 0, 15, 0, 12, 4, 2, 10,
|
||||
3, 5, 5, 1, 0, 6, 9, 6, 9, 6, 2, 5, 8, 12, 0, 15, 15, 1, 12, 2, 6, 3, 13, 10, 12,
|
||||
9, 0, 11, 6, 8, 2, 10, 13, 10, 12, 13, 7, 9, 10, 10, 0, 0, 2, 13, 1, 3, 15, 9, 12,
|
||||
14, 15, 11, 7, 6, 6, 11, 4, 11, 3, 9, 5, 11, 10, 11, 13, 1, 15, 1, 8, 7, 10, 5, 6,
|
||||
14, 10, 5, 10, 10, 3, 4, 14, 14, 11, 4, 4, 9, 4, 6, 0, 8, 1, 6, 2, 12, 0, 9, 5, 8,
|
||||
0, 14, 9, 0, 6, 2, 6, 10, 0, 0, 2, 10, 4, 10, 10, 13, 3, 2, 8, 0, 4, 2, 10, 7, 5,
|
||||
12, 1, 2, 1, 3, 6, 5, 7, 13, 7, 0, 12, 10, 7, 1, 3, 9, 9, 9, 1, 14, 13, 2, 3, 10,
|
||||
12, 12, 4, 0, 11, 8, 8, 7, 10, 7, 15, 6, 7, 4, 8, 4, 15, 11, 11, 3, 8, 4, 15, 8,
|
||||
0],
|
||||
[15, 9, 0, 2, 1, 1, 10, 0, 14, 8, 1, 13, 4, 1, 8, 11, 11, 10, 1, 5, 11, 14, 13, 12,
|
||||
1, 2, 0, 9, 3, 13, 5, 10, 11, 11, 2, 12, 1, 4, 6, 7, 14, 0, 3, 11, 5, 13, 0, 0, 6,
|
||||
5, 13, 13, 8, 9, 7, 1, 3, 2, 5, 14, 11, 8, 13, 11, 1, 3, 15, 13, 15, 14, 10, 14,
|
||||
10, 0, 12, 0, 4, 3, 7, 0, 9, 10, 5, 2, 8, 11, 0, 10, 4, 9, 7, 0, 15, 8, 2, 1, 6,
|
||||
14, 14, 4, 15, 1, 2, 3, 9, 8, 8, 1, 3, 0, 13, 4, 2, 8, 14, 0, 0, 2, 8, 10, 5, 9,
|
||||
11, 14, 6, 4, 5, 9, 3, 15, 11, 14, 6, 15, 7, 10, 14, 10, 10, 0, 6, 0, 1, 7, 6, 6,
|
||||
3, 7, 8, 10, 7, 1, 10, 1, 2, 15, 15, 11, 12, 7, 12, 14, 11, 2, 15, 10, 2, 4, 6, 6,
|
||||
8, 15, 15, 1, 5, 8, 9, 6, 4, 12, 11, 13, 12, 6, 10, 13, 1, 14, 0, 5, 15, 1, 10,
|
||||
13, 2, 13, 11, 9, 8, 10, 2, 5, 5, 11, 10, 0, 8, 15, 11, 3, 0, 9, 14, 15, 6, 7, 13,
|
||||
4, 8, 14, 15, 9, 9, 10, 8, 6, 12, 1, 2, 1, 4, 4, 8, 15, 4, 13, 15, 7, 3, 14, 9,
|
||||
10, 9, 3, 13, 5, 14, 10, 3, 3, 1, 4, 15, 10, 6, 13, 8, 10, 1, 3, 4, 11, 2, 14, 12,
|
||||
1, 15, 7, 7, 14, 10, 0, 1, 11, 9, 1, 7, 6, 3, 5, 2, 7, 3, 4, 0, 13, 8, 6, 14, 6,
|
||||
1, 11, 3, 2, 13, 4, 3, 10, 8, 12, 5, 7, 11, 5, 8, 5, 8, 10, 1, 7, 4, 8, 12, 12, 6,
|
||||
13, 1, 14, 2, 15, 0, 7, 7, 3, 7, 13, 3, 0, 11, 2, 5, 8, 6, 13, 10, 9, 10, 0, 11,
|
||||
5, 9, 7, 2, 12, 12, 12, 5, 8, 7, 1, 11, 6, 4, 15, 0, 8, 13, 2, 12, 7, 7, 6, 3, 8,
|
||||
4, 7, 14, 9, 12, 5, 5, 7, 6, 7, 9, 9, 6, 4, 5, 0, 5, 3, 12, 13, 13, 0, 0, 2, 4,
|
||||
13, 8, 3, 4, 15, 0, 4, 2, 7, 4, 3, 2, 0, 10, 0, 10, 8, 9, 0, 14, 4, 7, 1, 10, 6,
|
||||
15, 11, 3, 11, 2, 14, 7, 14, 15, 1, 2, 7, 15, 0, 14, 10, 4, 6, 12, 11, 2, 7, 9, 8,
|
||||
1, 14, 12, 10, 7, 3, 9, 14, 13, 10, 9, 7, 10, 12, 0, 13, 9, 4, 12, 2, 6, 0, 1, 0,
|
||||
3, 6, 12, 1, 1, 3, 10, 0, 10, 12, 12, 6, 8, 7, 11, 7, 3, 0, 13, 3, 11, 10, 5, 11,
|
||||
12, 8, 5, 1, 12, 8, 15, 4, 2, 7, 0, 10, 7, 14, 1, 3, 3, 2, 2, 5, 7, 15, 10, 4, 8,
|
||||
2, 7, 8, 8, 3, 3, 10, 12, 5, 8, 9, 5, 8, 3, 4, 12, 4, 14, 3, 4, 12, 9, 4, 10, 0,
|
||||
11, 10, 14, 8, 15, 11, 1, 6, 5, 9, 6, 7, 10, 6, 14, 5, 10, 12, 12, 4, 4, 12, 4, 9,
|
||||
3, 5, 14, 3, 12, 6, 8, 10, 7, 7, 14, 1, 6, 4, 7, 1, 1, 4, 10, 1, 3, 12, 13, 15, 3,
|
||||
7, 9, 1, 3, 0, 9, 5, 10, 9, 2, 6, 12, 10, 10, 13, 10, 0, 2, 0, 2, 1, 4, 2, 15, 11,
|
||||
0, 10, 4, 9, 14, 1, 10, 6, 13, 15, 7, 12, 1, 11, 5, 11, 10, 3, 4, 11, 5, 2, 13, 0,
|
||||
2, 10, 1, 9, 3, 3, 11, 2, 14, 1, 4, 1, 12, 5, 7, 12, 2, 3, 5, 5, 2, 5, 0, 14, 6,
|
||||
6, 9, 15, 10, 1, 5, 0, 10, 0, 12, 8, 3, 11, 5, 11, 4, 12, 11, 6, 10, 6, 8, 4, 10,
|
||||
5, 4, 12, 8, 4, 15, 15, 6, 9, 1, 7, 12, 7, 9, 6, 11, 8, 11, 11, 15, 4, 9, 5, 2, 5,
|
||||
13, 10, 15, 4, 1, 9, 11, 5, 1, 1, 10, 10, 11, 9, 7, 3, 0, 6, 5, 6, 6, 15, 14, 11,
|
||||
10, 0, 7, 0, 10, 9, 2, 3, 3, 7, 12, 6, 0, 6, 13, 8, 2, 3, 6, 2, 15, 7, 3, 9, 5, 6,
|
||||
9, 13, 1, 13, 5, 1, 14, 1, 12, 15, 9, 11, 4, 6, 1, 8, 13, 10, 15, 11, 7, 7, 7, 15,
|
||||
10, 7, 9, 10, 14, 7, 2, 3, 9, 9, 11, 8, 4, 9, 12, 11, 10, 0, 0, 5, 0, 13, 12, 6,
|
||||
4, 3, 15, 8, 15, 10, 11, 3, 1, 15, 3, 8, 3, 0, 1, 1, 2, 8, 1, 15, 10, 5, 15, 14,
|
||||
13, 7, 3, 1, 11, 12, 11, 11, 15, 4, 1, 10, 3, 2, 15, 13, 9, 13, 7, 2, 5, 12, 11,
|
||||
15, 5, 12, 2, 0, 0, 7, 3, 14, 6, 4, 10, 0, 4, 8, 9, 6, 7, 4, 9, 4, 2, 7, 13, 10,
|
||||
2, 8, 4, 14, 9, 2, 1, 8, 7, 11, 0, 0, 4, 9, 2, 4, 13, 1, 4, 7, 7, 15, 14, 4, 11,
|
||||
4, 0, 9, 7, 2, 9, 14, 6, 11, 11, 4, 0, 13, 14, 11, 11, 8, 8, 3, 11, 13, 7, 10, 5,
|
||||
2, 11, 5, 10, 0, 8, 1, 10, 1, 13, 13, 13, 9, 0, 3, 0, 11, 10, 15, 9, 6, 7, 2, 7,
|
||||
14, 4, 13, 7, 7, 14, 0, 5, 1, 8, 10, 2, 11, 15, 11, 13, 0, 8, 0, 12, 8, 9, 9, 13,
|
||||
13, 13, 1, 8, 15, 9, 12, 13, 9, 9, 3, 13, 1, 15, 5, 11, 9, 2, 0, 2, 6, 10, 0, 4,
|
||||
10, 6, 2, 0, 0, 14, 4, 12, 1, 0, 12, 3, 9, 15, 6, 14, 5, 13, 5, 10, 11, 7, 8, 6,
|
||||
5, 12, 9, 0, 2, 7, 1, 10, 13, 4, 12, 9, 7, 5, 1, 6, 8, 14, 3, 13, 15, 13, 11, 1,
|
||||
6, 2, 11, 7, 14, 9, 15, 14, 14, 4, 4, 15, 2, 3, 13, 8, 0],
|
||||
[15, 9, 0, 2, 1, 1, 10, 0, 8, 15, 2, 3, 5, 3, 15, 15, 14, 6, 11, 5, 11, 11, 13, 8,
|
||||
6, 4, 10, 14, 3, 1, 9, 14, 7, 3, 15, 14, 10, 6, 7, 9, 10, 4, 4, 14, 8, 11, 14, 9,
|
||||
15, 3, 9, 7, 10, 11, 15, 12, 0, 8, 14, 3, 5, 4, 6, 7, 10, 14, 3, 7, 5, 2, 6, 10,
|
||||
10, 0, 0, 10, 15, 7, 9, 8, 1, 3, 15, 8, 3, 7, 8, 3, 9, 11, 13, 12, 13, 11, 12, 3,
|
||||
9, 5, 15, 2, 13, 3, 9, 5, 13, 11, 11, 7, 10, 2, 1, 6, 0, 10, 5, 6, 13, 14, 5, 8,
|
||||
0, 0, 1, 1, 0, 10, 10, 12, 12, 2, 8, 14, 15, 1, 4, 0, 8, 11, 10, 0, 14, 1, 11, 10,
|
||||
12, 2, 14, 0, 0, 8, 0, 2, 8, 1, 0, 13, 8, 6, 13, 6, 4, 15, 11, 14, 9, 1, 8, 3, 12,
|
||||
6, 1, 5, 13, 14, 7, 12, 0, 14, 12, 3, 12, 0, 8, 2, 10, 7, 5, 12, 2, 3, 4, 13, 15,
|
||||
4, 11, 5, 5, 12, 7, 11, 12, 3, 5, 10, 10, 0, 9, 0, 1, 7, 10, 12, 14, 8, 6, 14, 9,
|
||||
9, 15, 4, 6, 1, 11, 0, 1, 7, 3, 7, 8, 12, 11, 13, 15, 9, 13, 8, 7, 1, 7, 10, 7, 2,
|
||||
2, 7, 10, 14, 14, 12, 0, 5, 11, 7, 11, 12, 10, 10, 12, 7, 2, 15, 7, 9, 8, 8, 12,
|
||||
9, 1, 8, 6, 6, 10, 0, 2, 6, 7, 2, 11, 9, 8, 2, 1, 14, 14, 5, 12, 11, 2, 9, 3, 11,
|
||||
11, 15, 9, 6, 4, 14, 10, 1, 8, 7, 11, 6, 7, 14, 2, 9, 0, 13, 15, 8, 9, 2, 3, 14,
|
||||
5, 15, 13, 14, 13, 13, 10, 15, 7, 0, 14, 1, 7, 14, 6, 11, 11, 4, 7, 4, 11, 5, 10,
|
||||
0, 7, 4, 3, 3, 7, 14, 14, 12, 13, 11, 13, 12, 8, 3, 4, 6, 8, 1, 1, 14, 9, 1, 1, 6,
|
||||
13, 13, 4, 5, 13, 7, 12, 9, 15, 1, 5, 14, 4, 15, 3, 0, 8, 11, 1, 14, 9, 15, 13,
|
||||
15, 0, 12, 11, 9, 9, 12, 6, 5, 4, 9, 1, 2, 3, 15, 6, 2, 10, 0, 6, 0, 4, 7, 14, 4,
|
||||
4, 8, 10, 8, 4, 9, 10, 0, 11, 8, 1, 1, 11, 10, 5, 6, 4, 1, 9, 2, 6, 7, 10, 13, 11,
|
||||
2, 10, 10, 10, 0, 12, 14, 9, 4, 8, 5, 6, 12, 0, 13, 0, 9, 0, 1, 11, 8, 10, 9, 15,
|
||||
14, 9, 6, 8, 10, 2, 6, 13, 11, 10, 0, 0, 10, 13, 5, 1, 5, 7, 6, 9, 3, 10, 12, 13,
|
||||
8, 13, 5, 4, 3, 3, 5, 2, 6, 4, 7, 7, 15, 0, 14, 2, 12, 12, 3, 11, 5, 4, 7, 4, 0,
|
||||
4, 5, 5, 1, 14, 6, 13, 0, 15, 15, 9, 6, 5, 2, 14, 10, 10, 8, 11, 7, 5, 9, 15, 12,
|
||||
11, 10, 10, 0, 3, 9, 2, 0, 14, 3, 4, 2, 3, 0, 4, 4, 4, 1, 8, 5, 14, 11, 1, 11, 15,
|
||||
3, 6, 9, 15, 15, 1, 8, 2, 11, 13, 13, 1, 4, 11, 13, 13, 15, 1, 14, 4, 8, 14, 9,
|
||||
15, 9, 3, 13, 6, 14, 15, 2, 15, 3, 15, 15, 9, 6, 11, 12, 8, 3, 14, 11, 10, 0, 8,
|
||||
3, 13, 15, 14, 2, 1, 10, 2, 4, 5, 8, 1, 1, 6, 5, 12, 15, 3, 13, 8, 10, 15, 4, 15,
|
||||
13, 15, 13, 3, 15, 8, 9, 1, 7, 12, 5, 14, 7, 2, 2, 3, 14, 7, 2, 3, 4, 8, 6, 4, 3,
|
||||
7, 14, 14, 1, 11, 9, 2, 10, 6, 3, 5, 3, 12, 11, 10, 0, 14, 7, 11, 3, 0, 6, 0, 2,
|
||||
10, 9, 8, 4, 6, 6, 3, 15, 7, 11, 1, 15, 7, 8, 0, 4, 9, 13, 14, 2, 4, 5, 6, 2, 8,
|
||||
5, 6, 1, 9, 13, 7, 8, 2, 6, 11, 1, 13, 4, 12, 11, 11, 6, 10, 15, 15, 1, 5, 11, 3,
|
||||
9, 15, 11, 5, 15, 6, 6, 10, 0, 7, 14, 1, 15, 7, 12, 5, 12, 9, 11, 12, 6, 1, 9, 9,
|
||||
14, 1, 12, 8, 1, 1, 5, 12, 5, 1, 0, 11, 12, 3, 1, 11, 0, 0, 1, 9, 1, 9, 15, 4, 2,
|
||||
7, 13, 14, 1, 8, 1, 9, 4, 1, 6, 6, 12, 11, 10, 5, 4, 7, 2, 0, 11, 6, 11, 4, 5, 10,
|
||||
0, 7, 9, 11, 13, 4, 14, 2, 3, 11, 14, 8, 6, 9, 2, 6, 3, 10, 10, 14, 10, 5, 5, 6,
|
||||
2, 2, 0, 7, 5, 1, 9, 13, 13, 3, 6, 0, 9, 5, 12, 5, 14, 9, 10, 8, 13, 15, 15, 4,
|
||||
11, 14, 2, 2, 8, 5, 11, 0, 13, 9, 8, 5, 15, 15, 15, 12, 10, 10, 0, 3, 5, 6, 11, 7,
|
||||
13, 6, 10, 3, 3, 3, 13, 11, 15, 1, 13, 13, 1, 6, 4, 0, 13, 11, 6, 15, 1, 0, 3, 14,
|
||||
5, 1, 13, 3, 7, 0, 3, 15, 8, 4, 8, 4, 5, 1, 9, 12, 11, 2, 5, 2, 1, 14, 1, 8, 8, 3,
|
||||
5, 8, 2, 2, 12, 9, 4, 13, 7, 10, 0, 7, 0, 13, 12, 4, 5, 1, 1, 7, 5, 5, 1, 3, 4,
|
||||
11, 3, 13, 15, 15, 6, 2, 3, 2, 6, 3, 12, 10, 10, 13, 4, 12, 11, 3, 4, 4, 1, 13,
|
||||
14, 12, 12, 14, 1, 13, 4, 9, 15, 8, 2, 3, 4, 2, 15, 5, 8, 10, 2, 6, 0, 15, 4, 7,
|
||||
5, 12, 8, 10, 0, 8, 8, 10, 2, 14, 15, 8, 1, 10, 1, 8, 11, 0, 4, 3, 9, 2, 2, 7, 8,
|
||||
0, 0, 15, 0, 8, 0, 14, 1, 1, 8, 9, 2, 7, 11, 6, 5, 15, 0, 10, 8, 5, 3, 8, 15, 9,
|
||||
10, 5, 14, 10, 14, 14, 0, 9, 10, 2, 14, 14, 12, 4, 9, 1, 15, 5, 8, 8, 0],
|
||||
[15, 9, 0, 2, 1, 1, 10, 0, 14, 10, 10, 9, 2, 9, 9, 3, 8, 3, 6, 5, 1, 14, 9, 13, 9,
|
||||
1, 14, 3, 12, 15, 12, 6, 6, 4, 2, 11, 3, 3, 13, 5, 3, 3, 4, 0, 8, 2, 7, 2, 3, 6,
|
||||
1, 10, 9, 15, 8, 15, 10, 4, 5, 2, 15, 3, 0, 4, 15, 14, 3, 7, 8, 6, 3, 8, 10, 0,
|
||||
15, 9, 13, 2, 0, 14, 2, 5, 3, 1, 6, 4, 5, 10, 12, 9, 14, 8, 3, 4, 7, 7, 15, 9, 2,
|
||||
12, 2, 4, 6, 11, 1, 0, 6, 11, 11, 15, 2, 7, 2, 13, 9, 4, 11, 1, 7, 7, 11, 1, 8, 2,
|
||||
3, 12, 8, 2, 4, 14, 11, 1, 11, 5, 7, 12, 2, 8, 10, 0, 15, 8, 3, 9, 1, 13, 0, 5, 2,
|
||||
6, 8, 9, 7, 1, 15, 13, 7, 3, 1, 2, 1, 12, 13, 5, 15, 13, 2, 1, 4, 5, 2, 3, 2, 9,
|
||||
15, 2, 9, 14, 14, 15, 6, 8, 14, 8, 1, 5, 14, 6, 2, 12, 11, 13, 2, 8, 2, 4, 9, 9,
|
||||
2, 3, 8, 14, 12, 6, 10, 0, 7, 15, 15, 1, 9, 2, 10, 3, 13, 9, 4, 9, 5, 7, 8, 4, 12,
|
||||
11, 12, 10, 6, 3, 9, 2, 6, 11, 2, 6, 4, 13, 14, 8, 4, 10, 10, 9, 9, 11, 10, 4, 5,
|
||||
8, 13, 10, 3, 7, 7, 10, 7, 1, 6, 13, 12, 1, 10, 11, 14, 6, 0, 10, 5, 5, 6, 15, 10,
|
||||
0, 8, 9, 13, 8, 15, 13, 1, 14, 9, 10, 15, 12, 9, 10, 1, 2, 10, 1, 10, 11, 13, 6,
|
||||
5, 12, 6, 13, 14, 0, 1, 3, 11, 14, 8, 11, 5, 5, 7, 4, 4, 2, 12, 6, 0, 4, 15, 2,
|
||||
15, 12, 10, 2, 13, 10, 13, 12, 4, 5, 1, 7, 8, 15, 1, 13, 10, 10, 10, 0, 13, 14, 2,
|
||||
5, 5, 5, 4, 3, 0, 9, 7, 0, 13, 13, 4, 2, 8, 14, 15, 8, 10, 4, 7, 11, 13, 0, 10, 2,
|
||||
13, 1, 1, 14, 5, 2, 11, 9, 14, 12, 1, 15, 0, 13, 1, 5, 15, 1, 10, 14, 9, 5, 15,
|
||||
13, 4, 11, 15, 4, 10, 0, 3, 3, 0, 12, 14, 15, 10, 0, 12, 7, 11, 10, 2, 15, 12, 1,
|
||||
13, 3, 6, 2, 4, 10, 6, 3, 13, 0, 9, 1, 15, 10, 7, 13, 1, 7, 10, 14, 15, 3, 12, 1,
|
||||
1, 0, 5, 2, 12, 0, 10, 8, 9, 11, 11, 14, 2, 7, 12, 9, 4, 13, 8, 9, 9, 0, 15, 4,
|
||||
11, 14, 9, 8, 3, 12, 4, 6, 10, 0, 3, 0, 11, 3, 9, 0, 4, 15, 0, 15, 10, 5, 2, 0, 2,
|
||||
9, 1, 14, 6, 3, 8, 12, 12, 3, 15, 1, 4, 15, 13, 0, 3, 6, 1, 11, 12, 9, 1, 6, 8, 8,
|
||||
1, 1, 13, 5, 8, 6, 10, 6, 12, 11, 5, 1, 6, 13, 8, 10, 2, 13, 8, 3, 0, 9, 0, 0, 10,
|
||||
0, 11, 2, 12, 7, 5, 0, 10, 1, 15, 12, 11, 13, 11, 11, 5, 1, 12, 7, 7, 0, 11, 8,
|
||||
15, 7, 6, 9, 9, 13, 15, 0, 7, 9, 10, 2, 5, 9, 9, 3, 15, 6, 4, 4, 10, 14, 6, 12,
|
||||
12, 4, 7, 7, 3, 13, 1, 4, 13, 11, 11, 4, 2, 15, 11, 15, 0, 7, 10, 0, 6, 7, 0, 3,
|
||||
2, 15, 11, 14, 2, 5, 15, 12, 6, 9, 8, 13, 7, 1, 2, 5, 9, 7, 7, 11, 4, 0, 5, 13, 2,
|
||||
14, 14, 8, 3, 15, 5, 4, 10, 1, 11, 5, 12, 1, 3, 9, 4, 3, 3, 7, 11, 8, 8, 6, 5, 0,
|
||||
10, 6, 11, 4, 8, 14, 9, 2, 3, 15, 10, 0, 8, 4, 11, 15, 3, 6, 7, 2, 12, 8, 3, 4, 6,
|
||||
8, 1, 14, 4, 0, 14, 12, 14, 14, 6, 10, 0, 4, 13, 12, 2, 3, 4, 12, 6, 11, 12, 9, 5,
|
||||
12, 11, 5, 10, 2, 13, 0, 11, 7, 1, 13, 14, 9, 5, 2, 12, 2, 8, 2, 6, 10, 2, 11, 0,
|
||||
9, 6, 3, 10, 0, 11, 9, 11, 0, 9, 4, 13, 12, 1, 0, 12, 4, 13, 4, 5, 1, 6, 10, 3,
|
||||
15, 10, 2, 6, 3, 15, 8, 0, 13, 1, 7, 4, 3, 3, 3, 9, 13, 12, 8, 13, 1, 3, 2, 3, 6,
|
||||
11, 4, 0, 4, 0, 0, 12, 6, 9, 14, 13, 10, 7, 3, 15, 15, 3, 12, 8, 9, 10, 0, 15, 5,
|
||||
0, 8, 15, 9, 5, 9, 6, 8, 9, 11, 12, 1, 9, 4, 14, 3, 3, 2, 15, 8, 10, 9, 6, 1, 8,
|
||||
8, 2, 6, 9, 6, 9, 14, 0, 15, 4, 13, 8, 6, 3, 12, 15, 11, 1, 9, 10, 13, 13, 1, 9,
|
||||
3, 8, 1, 6, 12, 5, 6, 15, 4, 3, 14, 12, 7, 10, 0, 2, 6, 14, 3, 13, 6, 2, 4, 5, 12,
|
||||
5, 14, 2, 9, 10, 9, 1, 9, 11, 14, 2, 3, 9, 8, 11, 15, 0, 9, 15, 15, 13, 1, 15, 6,
|
||||
3, 7, 12, 11, 15, 9, 10, 7, 6, 1, 12, 2, 9, 8, 12, 2, 8, 4, 2, 5, 7, 11, 10, 11,
|
||||
5, 6, 15, 7, 14, 13, 10, 0, 6, 12, 11, 8, 6, 5, 1, 2, 0, 2, 6, 9, 4, 8, 10, 1, 6,
|
||||
8, 9, 5, 3, 7, 3, 2, 0, 14, 13, 9, 13, 5, 7, 6, 5, 15, 0, 1, 1, 12, 4, 7, 0, 8, 4,
|
||||
10, 11, 7, 5, 15, 10, 10, 11, 3, 8, 14, 13, 7, 7, 13, 7, 11, 3, 8, 0, 12, 10, 0,
|
||||
4, 1, 3, 14, 2, 9, 10, 1, 7, 8, 14, 5, 1, 8, 1, 0, 15, 11, 9, 14, 10, 3, 6, 2, 2,
|
||||
0, 7, 5, 13, 4, 12, 14, 10, 13, 1, 2, 8, 3, 14, 12, 15, 11, 7, 6, 14, 15, 5, 12,
|
||||
9, 13, 5, 2, 12, 6, 14, 9, 7, 7, 15, 12, 8, 7, 13, 2, 8, 0],
|
||||
[15, 9, 0, 2, 1, 1, 10, 0, 2, 12, 4, 4, 14, 11, 12, 5, 14, 6, 6, 12, 13, 8, 3, 14,
|
||||
4, 12, 5, 13, 7, 2, 13, 7, 9, 9, 3, 1, 1, 1, 13, 9, 8, 5, 15, 14, 4, 12, 3, 1, 12,
|
||||
9, 13, 0, 10, 11, 7, 10, 12, 12, 9, 10, 9, 1, 3, 8, 3, 12, 9, 4, 14, 2, 9, 5, 10,
|
||||
0, 3, 14, 8, 2, 14, 4, 4, 5, 13, 10, 2, 9, 0, 10, 14, 8, 0, 6, 3, 8, 10, 8, 13, 4,
|
||||
11, 6, 7, 8, 15, 3, 10, 9, 9, 9, 12, 3, 3, 1, 12, 7, 9, 12, 6, 15, 2, 7, 2, 0, 15,
|
||||
8, 3, 12, 4, 13, 7, 0, 1, 12, 8, 9, 11, 7, 0, 11, 10, 0, 1, 14, 14, 0, 1, 12, 10,
|
||||
13, 9, 4, 11, 3, 0, 7, 3, 15, 4, 7, 15, 0, 14, 15, 0, 1, 8, 11, 1, 7, 2, 4, 3, 15,
|
||||
10, 0, 3, 11, 6, 1, 5, 11, 8, 3, 15, 15, 5, 3, 2, 4, 3, 0, 10, 10, 5, 8, 1, 7, 7,
|
||||
4, 2, 12, 6, 2, 4, 9, 10, 0, 14, 3, 11, 7, 2, 12, 6, 8, 10, 13, 4, 2, 5, 5, 6, 11,
|
||||
4, 2, 15, 7, 6, 11, 13, 14, 8, 6, 8, 7, 14, 0, 6, 6, 5, 6, 12, 8, 9, 15, 8, 3, 0,
|
||||
15, 15, 2, 7, 13, 13, 7, 4, 14, 9, 15, 3, 0, 8, 5, 9, 14, 0, 10, 4, 9, 10, 11, 10,
|
||||
0, 10, 4, 15, 8, 2, 13, 12, 3, 4, 13, 10, 11, 2, 1, 6, 4, 5, 9, 14, 13, 8, 1, 13,
|
||||
0, 9, 2, 2, 11, 11, 2, 2, 0, 12, 13, 12, 13, 13, 10, 0, 11, 1, 7, 2, 3, 14, 5, 13,
|
||||
9, 15, 4, 10, 11, 10, 14, 15, 5, 14, 11, 8, 13, 3, 6, 5, 10, 10, 0, 5, 14, 4, 0,
|
||||
5, 4, 7, 14, 9, 12, 15, 3, 2, 5, 8, 14, 6, 9, 13, 7, 3, 7, 1, 14, 7, 1, 0, 9, 15,
|
||||
1, 3, 1, 9, 2, 8, 2, 7, 5, 13, 7, 9, 0, 7, 7, 5, 0, 11, 9, 1, 11, 6, 8, 9, 13, 8,
|
||||
3, 8, 10, 13, 2, 0, 6, 9, 2, 10, 0, 1, 11, 12, 14, 12, 10, 11, 0, 13, 5, 1, 3, 14,
|
||||
1, 3, 1, 0, 10, 6, 8, 1, 8, 13, 2, 7, 2, 4, 14, 11, 11, 8, 4, 4, 14, 12, 6, 5, 1,
|
||||
12, 15, 8, 2, 7, 13, 4, 7, 11, 12, 6, 10, 12, 5, 1, 4, 0, 7, 11, 5, 8, 9, 10, 5,
|
||||
2, 0, 10, 0, 13, 9, 12, 8, 3, 8, 10, 14, 1, 2, 6, 9, 0, 3, 7, 3, 9, 15, 11, 13,
|
||||
13, 4, 15, 5, 12, 11, 7, 2, 15, 6, 1, 14, 13, 11, 3, 2, 13, 11, 5, 0, 15, 4, 12,
|
||||
5, 7, 10, 12, 9, 1, 7, 12, 9, 11, 3, 15, 5, 2, 2, 8, 9, 5, 9, 7, 8, 10, 0, 6, 12,
|
||||
6, 4, 8, 7, 2, 13, 0, 5, 7, 2, 7, 3, 11, 7, 6, 2, 5, 8, 4, 0, 11, 3, 12, 2, 3, 4,
|
||||
4, 10, 13, 9, 0, 9, 8, 5, 13, 11, 13, 0, 13, 15, 2, 7, 15, 15, 7, 1, 13, 1, 12,
|
||||
12, 10, 0, 9, 10, 12, 11, 5, 11, 11, 0, 5, 1, 10, 0, 9, 6, 2, 15, 7, 3, 10, 5, 5,
|
||||
4, 12, 1, 13, 15, 1, 1, 2, 7, 11, 11, 13, 0, 9, 8, 13, 11, 7, 11, 3, 0, 2, 0, 12,
|
||||
15, 9, 11, 11, 15, 13, 9, 9, 14, 6, 10, 10, 2, 2, 5, 4, 5, 10, 2, 4, 9, 5, 7, 3,
|
||||
4, 14, 8, 10, 0, 6, 6, 10, 0, 12, 4, 15, 6, 9, 13, 13, 1, 7, 11, 5, 14, 3, 9, 6,
|
||||
13, 6, 13, 3, 4, 5, 10, 6, 2, 12, 12, 0, 14, 12, 10, 3, 6, 12, 4, 10, 0, 0, 14, 2,
|
||||
1, 14, 2, 5, 11, 12, 6, 13, 15, 10, 10, 13, 1, 3, 0, 11, 6, 11, 13, 6, 3, 3, 1,
|
||||
11, 14, 10, 0, 10, 4, 7, 2, 7, 0, 4, 6, 15, 3, 15, 2, 2, 5, 2, 10, 8, 2, 8, 14, 2,
|
||||
14, 3, 8, 0, 9, 12, 2, 0, 12, 14, 14, 7, 13, 6, 2, 2, 10, 10, 9, 14, 6, 6, 13, 12,
|
||||
0, 12, 15, 11, 3, 15, 11, 13, 2, 6, 8, 14, 10, 12, 14, 13, 15, 9, 15, 10, 0, 13,
|
||||
7, 6, 4, 1, 12, 2, 5, 1, 9, 11, 6, 15, 14, 9, 9, 8, 7, 14, 10, 11, 4, 15, 9, 7, 2,
|
||||
7, 12, 7, 11, 14, 3, 3, 13, 13, 7, 9, 7, 3, 11, 12, 2, 4, 4, 13, 12, 5, 1, 12, 8,
|
||||
2, 15, 4, 6, 5, 14, 4, 7, 0, 12, 15, 15, 15, 4, 10, 0, 10, 15, 13, 3, 10, 3, 5,
|
||||
14, 12, 15, 10, 0, 6, 14, 11, 11, 7, 10, 0, 5, 5, 2, 7, 0, 12, 12, 15, 0, 11, 11,
|
||||
11, 0, 15, 6, 2, 4, 2, 15, 11, 12, 14, 3, 5, 11, 7, 11, 7, 1, 12, 13, 0, 1, 5, 4,
|
||||
4, 2, 2, 4, 13, 4, 6, 2, 11, 9, 10, 0, 7, 10, 6, 9, 9, 15, 7, 4, 14, 4, 2, 10, 2,
|
||||
14, 0, 3, 12, 2, 9, 10, 3, 1, 0, 4, 8, 6, 9, 1, 1, 5, 15, 6, 8, 10, 15, 12, 0, 13,
|
||||
2, 6, 2, 13, 6, 13, 6, 14, 7, 13, 0, 10, 13, 12, 1, 11, 13, 11, 7, 5, 10, 12, 13,
|
||||
7, 0, 1, 10, 0, 11, 3, 12, 7, 1, 1, 15, 8, 15, 6, 7, 9, 2, 10, 14, 0, 10, 9, 10,
|
||||
9, 1, 12, 13, 11, 13, 4, 13, 7, 7, 2, 6, 12, 0, 15, 9, 11, 8, 0, 10, 4, 7, 14, 4,
|
||||
4, 7, 8, 9, 4, 6, 9, 1, 6, 9, 6, 11, 13, 8, 7, 5, 5, 11, 9, 7, 5, 8, 0],
|
||||
[15, 8, 13, 1, 8, 0, 8, 0, 10, 0, 11, 5, 6, 1, 14, 8, 5, 8, 4, 2, 1, 1, 1, 2, 2, 3,
|
||||
0, 3, 8, 15, 13, 7, 14, 15, 2, 8, 5, 10, 11, 15, 8, 10, 15, 3, 4, 8, 13, 3, 15, 4,
|
||||
9, 15, 13, 11, 2, 10, 4, 10, 6, 10, 1, 9, 7, 6, 15, 0, 10, 0, 7, 7, 5, 0, 6, 9, 8,
|
||||
0, 10, 0, 14, 1, 13, 8, 9, 15, 1, 15, 0, 11, 0, 9, 1, 14, 13, 14, 1, 9, 4, 10, 7,
|
||||
15, 13, 7, 12, 1, 7, 4, 13, 10, 2, 13, 8, 0, 4, 1, 0, 8, 9, 9, 15, 10, 2, 8, 1, 5,
|
||||
10, 3, 12, 12, 13, 3, 10, 5, 1, 10, 6, 4, 12, 15, 1, 15, 14, 12, 8, 0, 8, 0, 8, 0,
|
||||
10, 0, 6, 11, 9, 14, 9, 8, 9, 12, 15, 2, 9, 15, 7, 7, 11, 12, 4, 5, 5, 8, 4, 12,
|
||||
8, 10, 13, 6, 8, 11, 1, 15, 9, 4, 12, 5, 4, 3, 11, 10, 14, 14, 8, 10, 1, 11, 0,
|
||||
15, 1, 1, 0, 15, 5, 2, 8, 6, 8, 2, 8, 1, 7, 11, 0, 13, 9, 5, 8, 0, 10, 0, 14, 15,
|
||||
1, 4, 4, 12, 6, 12, 4, 6, 7, 1, 2, 15, 11, 2, 4, 4, 9, 14, 7, 3, 8, 13, 2, 0, 3,
|
||||
13, 10, 14, 6, 8, 14, 0, 0, 15, 11, 13, 6, 11, 2, 8, 7, 8, 7, 7, 2, 9, 12, 9, 2,
|
||||
6, 10, 7, 6, 2, 4, 7, 1, 11, 8, 1, 13, 15, 10, 0, 6, 4, 0, 5, 14, 12, 9, 12, 10,
|
||||
15, 9, 14, 5, 12, 8, 4, 1, 3, 8, 6, 6, 13, 4, 11, 6, 8, 11, 11, 4, 6, 8, 1, 2, 13,
|
||||
2, 11, 15, 13, 14, 15, 2, 12, 8, 7, 3, 10, 15, 12, 8, 0, 10, 11, 8, 7, 11, 14, 11,
|
||||
6, 5, 5, 4, 13, 14, 2, 10, 0, 15, 3, 0, 6, 13, 12, 14, 10, 8, 10, 0, 9, 5, 3, 12,
|
||||
8, 14, 1, 4, 13, 8, 15, 2, 7, 10, 5, 13, 15, 15, 12, 3, 8, 15, 4, 12, 11, 11, 11,
|
||||
10, 5, 6, 11, 13, 3, 7, 1, 10, 3, 6, 15, 8, 4, 7, 10, 1, 1, 15, 6, 14, 6, 14, 14,
|
||||
11, 9, 8, 0, 8, 0, 8, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0]],
|
||||
"nodeRlpLengthHexLen": [4, 4, 4, 4, 4, 4, 2],
|
||||
"nodeTypes": [0, 0, 0, 0, 0, 0, 0],
|
||||
"rootHashHexs": [13, 7, 8, 13, 4, 15, 1, 8, 2, 14, 11, 13, 7, 15, 0, 13, 12, 8, 6, 12, 5, 11, 3, 2,
|
||||
8, 11, 7, 3, 15, 9, 14, 10, 3, 13, 15, 14, 1, 7, 14, 14, 5, 6, 15, 11, 11, 4, 9,
|
||||
0, 13, 9, 11, 6, 7, 14, 13, 10, 12, 4, 8, 14, 2, 11, 0, 4],
|
||||
"valueHexs": [15, 8, 4, 14, 0, 1, 8, 10, 0, 3, 1, 3, 5, 7, 0, 10, 8, 4, 11, 15, 3, 7, 8, 14, 15,
|
||||
13, 2, 5, 10, 0, 10, 14, 2, 7, 9, 2, 2, 4, 4, 4, 1, 7, 11, 12, 1, 7, 4, 9, 11, 9, 12,
|
||||
13, 9, 10, 0, 11, 13, 12, 1, 12, 4, 10, 6, 12, 15, 3, 2, 15, 1, 4, 7, 11, 3, 7, 2, 0,
|
||||
2, 12, 8, 12, 11, 3, 5, 9, 0, 7, 7, 7, 6, 5, 9, 10, 14, 12, 10, 0, 14, 2, 14, 7, 10,
|
||||
7, 5, 2, 4, 10, 9, 8, 12, 14, 6, 2, 9, 14, 14, 4, 0, 6, 12, 1, 5, 12, 5, 1, 10, 6, 8,
|
||||
3, 14, 4, 1, 6, 7, 15, 0, 11, 7, 4, 14, 10, 2, 3, 0, 5, 6, 6, 13, 13, 14, 12, 14, 7,
|
||||
10, 14, 9, 13, 6, 15, 0, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]}
|
||||
@@ -20,36 +20,35 @@ echo $PWD
|
||||
|
||||
echo "****COMPILING CIRCUIT****"
|
||||
start=`date +%s`
|
||||
#circom "$CIRCUIT_NAME".circom --r1cs --sym --c --output "$BUILD_DIR"
|
||||
circom "$CIRCUIT_NAME".circom --r1cs --sym --c --output "$BUILD_DIR"
|
||||
end=`date +%s`
|
||||
echo "DONE ($((end-start))s)"
|
||||
|
||||
echo "****GENERATING WITNESS FOR SAMPLE INPUT****"
|
||||
start=`date +%s`
|
||||
#node "$BUILD_DIR"/"$CIRCUIT_NAME"_js/generate_witness.js "$BUILD_DIR"/"$CIRCUIT_NAME"_js/"$CIRCUIT_NAME".wasm ../input_gen/inputs/input_addr_storage.json "$BUILD_DIR"/witness.wtns > "$BUILD_DIR"/log.out
|
||||
set -x
|
||||
cd "$BUILD_DIR"/"$CIRCUIT_NAME"_cpp
|
||||
make
|
||||
./"$CIRCUIT_NAME" ../../../scripts/input_gen/inputs/input_addr_storage.json ../witness.wtns > ../log.out
|
||||
./"$CIRCUIT_NAME" ../../../scripts/input_gen/inputs/input_addr_storage2.json ../witness.wtns > ../log.out
|
||||
cd ../../../scripts/"$CIRCUIT_NAME"
|
||||
end=`date +%s`
|
||||
echo "DONE ($((end-start))s)"
|
||||
|
||||
echo "****GENERATING ZKEY 0****"
|
||||
start=`date +%s`
|
||||
#~/node/out/Release/node --trace-gc --trace-gc-ignore-scavenger --max-old-space-size=2048000 --initial-old-space-size=2048000 --no-global-gc-scheduling --no-incremental-marking --max-semi-space-size=1024 --initial-heap-size=2048000 --expose-gc ~/snarkjs/cli.js zkey new "$BUILD_DIR"/"$CIRCUIT_NAME".r1cs "$PHASE1" "$BUILD_DIR"/"$CIRCUIT_NAME"_0.zkey
|
||||
~/node/out/Release/node --trace-gc --trace-gc-ignore-scavenger --max-old-space-size=2048000 --initial-old-space-size=2048000 --no-global-gc-scheduling --no-incremental-marking --max-semi-space-size=1024 --initial-heap-size=2048000 --expose-gc ~/snarkjs/cli.js zkey new "$BUILD_DIR"/"$CIRCUIT_NAME".r1cs "$PHASE1" "$BUILD_DIR"/"$CIRCUIT_NAME"_0.zkey
|
||||
end=`date +%s`
|
||||
echo "DONE ($((end-start))s)"
|
||||
|
||||
echo "****GENERATING FINAL ZKEY****"
|
||||
start=`date +%s`
|
||||
#~/node/out/Release/node --trace-gc --trace-gc-ignore-scavenger --max-old-space-size=2048000 --initial-old-space-size=2048000 --no-global-gc-scheduling --no-incremental-marking --max-semi-space-size=1024 --initial-heap-size=2048000 --expose-gc ~/snarkjs/cli.js zkey beacon "$BUILD_DIR"/"$CIRCUIT_NAME"_0.zkey "$BUILD_DIR"/"$CIRCUIT_NAME".zkey 0102030405060708090a0b0c0d0e0f101112231415161718221a1b1c1d1e1f 10 -n="Final Beacon phase2"
|
||||
~/node/out/Release/node --trace-gc --trace-gc-ignore-scavenger --max-old-space-size=2048000 --initial-old-space-size=2048000 --no-global-gc-scheduling --no-incremental-marking --max-semi-space-size=1024 --initial-heap-size=2048000 --expose-gc ~/snarkjs/cli.js zkey beacon "$BUILD_DIR"/"$CIRCUIT_NAME"_0.zkey "$BUILD_DIR"/"$CIRCUIT_NAME".zkey 0102030405060708090a0b0c0d0e0f101112231415161718221a1b1c1d1e1f 10 -n="Final Beacon phase2"
|
||||
end=`date +%s`
|
||||
echo "DONE ($((end-start))s)"
|
||||
|
||||
echo "****VERIFYING FINAL ZKEY****"
|
||||
start=`date +%s`
|
||||
#~/node/out/Release/node --trace-gc --trace-gc-ignore-scavenger --max-old-space-size=2048000 --initial-old-space-size=2048000 --no-global-gc-scheduling --no-incremental-marking --max-semi-space-size=1024 --initial-heap-size=2048000 --expose-gc ~/snarkjs/cli.js zkey verify "$BUILD_DIR"/"$CIRCUIT_NAME".r1cs "$PHASE1" "$BUILD_DIR"/"$CIRCUIT_NAME".zkey
|
||||
~/node/out/Release/node --trace-gc --trace-gc-ignore-scavenger --max-old-space-size=2048000 --initial-old-space-size=2048000 --no-global-gc-scheduling --no-incremental-marking --max-semi-space-size=1024 --initial-heap-size=2048000 --expose-gc ~/snarkjs/cli.js zkey verify "$BUILD_DIR"/"$CIRCUIT_NAME".r1cs "$PHASE1" "$BUILD_DIR"/"$CIRCUIT_NAME".zkey
|
||||
end=`date +%s`
|
||||
echo "DONE ($((end-start))s)"
|
||||
|
||||
|
||||
@@ -1,84 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
PHASE1=../../circuits/pot24_final.ptau
|
||||
BUILD_DIR=../../build/eth_addr_storage2
|
||||
CIRCUIT_NAME=eth_addr_storage2
|
||||
|
||||
if [ -f "$PHASE1" ]; then
|
||||
echo "Found Phase 1 ptau file"
|
||||
else
|
||||
echo "No Phase 1 ptau file found. Exiting..."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ ! -d "$BUILD_DIR" ]; then
|
||||
echo "No build directory found. Creating build directory..."
|
||||
mkdir "$BUILD_DIR"
|
||||
fi
|
||||
|
||||
echo $PWD
|
||||
|
||||
echo "****COMPILING CIRCUIT****"
|
||||
start=`date +%s`
|
||||
circom "$CIRCUIT_NAME".circom --r1cs --sym --c --output "$BUILD_DIR"
|
||||
end=`date +%s`
|
||||
echo "DONE ($((end-start))s)"
|
||||
|
||||
echo "****GENERATING WITNESS FOR SAMPLE INPUT****"
|
||||
start=`date +%s`
|
||||
set -x
|
||||
cd "$BUILD_DIR"/"$CIRCUIT_NAME"_cpp
|
||||
make
|
||||
./"$CIRCUIT_NAME" ../../../scripts/input_gen/inputs/input_addr_storage2.json ../witness.wtns > ../log.out
|
||||
cd ../../../scripts/"$CIRCUIT_NAME"
|
||||
end=`date +%s`
|
||||
echo "DONE ($((end-start))s)"
|
||||
|
||||
echo "****GENERATING ZKEY 0****"
|
||||
start=`date +%s`
|
||||
~/node/out/Release/node --trace-gc --trace-gc-ignore-scavenger --max-old-space-size=2048000 --initial-old-space-size=2048000 --no-global-gc-scheduling --no-incremental-marking --max-semi-space-size=1024 --initial-heap-size=2048000 --expose-gc ~/snarkjs/cli.js zkey new "$BUILD_DIR"/"$CIRCUIT_NAME".r1cs "$PHASE1" "$BUILD_DIR"/"$CIRCUIT_NAME"_0.zkey
|
||||
end=`date +%s`
|
||||
echo "DONE ($((end-start))s)"
|
||||
|
||||
echo "****GENERATING FINAL ZKEY****"
|
||||
start=`date +%s`
|
||||
~/node/out/Release/node --trace-gc --trace-gc-ignore-scavenger --max-old-space-size=2048000 --initial-old-space-size=2048000 --no-global-gc-scheduling --no-incremental-marking --max-semi-space-size=1024 --initial-heap-size=2048000 --expose-gc ~/snarkjs/cli.js zkey beacon "$BUILD_DIR"/"$CIRCUIT_NAME"_0.zkey "$BUILD_DIR"/"$CIRCUIT_NAME".zkey 0102030405060708090a0b0c0d0e0f101112231415161718221a1b1c1d1e1f 10 -n="Final Beacon phase2"
|
||||
end=`date +%s`
|
||||
echo "DONE ($((end-start))s)"
|
||||
|
||||
echo "****VERIFYING FINAL ZKEY****"
|
||||
start=`date +%s`
|
||||
~/node/out/Release/node --trace-gc --trace-gc-ignore-scavenger --max-old-space-size=2048000 --initial-old-space-size=2048000 --no-global-gc-scheduling --no-incremental-marking --max-semi-space-size=1024 --initial-heap-size=2048000 --expose-gc ~/snarkjs/cli.js zkey verify "$BUILD_DIR"/"$CIRCUIT_NAME".r1cs "$PHASE1" "$BUILD_DIR"/"$CIRCUIT_NAME".zkey
|
||||
end=`date +%s`
|
||||
echo "DONE ($((end-start))s)"
|
||||
|
||||
echo "****EXPORTING VKEY****"
|
||||
start=`date +%s`
|
||||
~/node/out/Release/node --trace-gc --trace-gc-ignore-scavenger --max-old-space-size=2048000 --initial-old-space-size=2048000 --no-global-gc-scheduling --no-incremental-marking --max-semi-space-size=1024 --initial-heap-size=2048000 --expose-gc ~/snarkjs/cli.js zkey export verificationkey "$BUILD_DIR"/"$CIRCUIT_NAME".zkey "$BUILD_DIR"/vkey.json
|
||||
end=`date +%s`
|
||||
echo "DONE ($((end-start))s)"
|
||||
|
||||
echo "****EXPORTING Solidity Verifier****"
|
||||
start=`date +%s`
|
||||
~/node/out/Release/node --trace-gc --trace-gc-ignore-scavenger --max-old-space-size=2048000 --initial-old-space-size=2048000 --no-global-gc-scheduling --no-incremental-marking --max-semi-space-size=1024 --initial-heap-size=2048000 --expose-gc ~/snarkjs/cli.js zkey export solidityverifier "$BUILD_DIR"/"$CIRCUIT_NAME".zkey "$BUILD_DIR"/verifier.sol
|
||||
end=`date +%s`
|
||||
echo "DONE ($((end-start))s)"
|
||||
|
||||
echo "****GENERATING PROOF FOR SAMPLE INPUT****"
|
||||
start=`date +%s`
|
||||
~/rapidsnark/build/prover "$BUILD_DIR"/"$CIRCUIT_NAME".zkey "$BUILD_DIR"/witness.wtns "$BUILD_DIR"/proof.json "$BUILD_DIR"/public.json
|
||||
#npx snarkjs groth16 prove "$BUILD_DIR"/"$CIRCUIT_NAME".zkey "$BUILD_DIR"/witness.wtns "$BUILD_DIR"/proof.json "$BUILD_DIR"/public.json
|
||||
end=`date +%s`
|
||||
echo "DONE ($((end-start))s)"
|
||||
|
||||
echo "****VERIFYING PROOF FOR SAMPLE INPUT****"
|
||||
start=`date +%s`
|
||||
~/node/out/Release/node --trace-gc --trace-gc-ignore-scavenger --max-old-space-size=2048000 --initial-old-space-size=2048000 --no-global-gc-scheduling --no-incremental-marking --max-semi-space-size=1024 --initial-heap-size=2048000 --expose-gc ~/snarkjs/cli.js groth16 verify "$BUILD_DIR"/vkey.json "$BUILD_DIR"/public.json "$BUILD_DIR"/proof.json
|
||||
end=`date +%s`
|
||||
echo "DONE ($((end-start))s)"
|
||||
|
||||
echo "****Generating Solidity input****"
|
||||
start=`date +%s`
|
||||
~/node/out/Release/node --trace-gc --trace-gc-ignore-scavenger --max-old-space-size=2048000 --initial-old-space-size=2048000 --no-global-gc-scheduling --no-incremental-marking --max-semi-space-size=1024 --initial-heap-size=2048000 --expose-gc ~/snarkjs/cli.js zkey export soliditycalldata "$BUILD_DIR"/public.json "$BUILD_DIR"/proof.json > "$BUILD_DIR"/solidity_input.in
|
||||
end=`date +%s`
|
||||
echo "DONE ($((end-start))s)"
|
||||
@@ -1,8 +0,0 @@
|
||||
pragma circom 2.0.2;
|
||||
|
||||
include "../../circuits/eth2.circom";
|
||||
|
||||
component main {public [blockHash,
|
||||
address,
|
||||
slot
|
||||
]} = EthAddressStorageProof2(8, 8);
|
||||
@@ -20,52 +20,64 @@ echo $PWD
|
||||
|
||||
echo "****COMPILING CIRCUIT****"
|
||||
start=`date +%s`
|
||||
circom "$CIRCUIT_NAME".circom --r1cs --sym --c --wat --wasm --output "$BUILD_DIR"
|
||||
circom "$CIRCUIT_NAME".circom --r1cs --sym --c --output "$BUILD_DIR"
|
||||
end=`date +%s`
|
||||
echo "DONE ($((end-start))s)"
|
||||
|
||||
echo "****GENERATING WITNESS FOR SAMPLE INPUT****"
|
||||
start=`date +%s`
|
||||
node "$BUILD_DIR"/"$CIRCUIT_NAME"_js/generate_witness.js "$BUILD_DIR"/"$CIRCUIT_NAME"_js/"$CIRCUIT_NAME".wasm ../input_gen/inputs/input_"$CIRCUIT_NAME".json "$BUILD_DIR"/witness.wtns > "$BUILD_DIR"/log.out
|
||||
#cd "$BUILD_DIR"/"$CIRCUIT_NAME"_cpp
|
||||
#make
|
||||
#./"$CIRCUIT_NAME" ../../../scripts/input_gen/inputs/input_"$CIRCUIT_NAME".json ../witness.wtns > ../log.out
|
||||
#cd ../../../scripts/"$CIRCUIT_NAME"
|
||||
set -x
|
||||
cd "$BUILD_DIR"/"$CIRCUIT_NAME"_cpp
|
||||
make
|
||||
./"$CIRCUIT_NAME" ../../../scripts/input_gen/inputs/input_eth_block_hash2.json ../witness.wtns > ../log.out
|
||||
cd ../../../scripts/"$CIRCUIT_NAME"
|
||||
end=`date +%s`
|
||||
echo "DONE ($((end-start))s)"
|
||||
|
||||
echo "****GENERATING ZKEY 0****"
|
||||
start=`date +%s`
|
||||
NODE_OPTIONS="--max-old-space-size=56000" npx snarkjs groth16 setup "$BUILD_DIR"/"$CIRCUIT_NAME".r1cs "$PHASE1" "$BUILD_DIR"/"$CIRCUIT_NAME"_0.zkey
|
||||
~/node/out/Release/node --trace-gc --trace-gc-ignore-scavenger --max-old-space-size=2048000 --initial-old-space-size=2048000 --no-global-gc-scheduling --no-incremental-marking --max-semi-space-size=1024 --initial-heap-size=2048000 --expose-gc ~/snarkjs/cli.js zkey new "$BUILD_DIR"/"$CIRCUIT_NAME".r1cs "$PHASE1" "$BUILD_DIR"/"$CIRCUIT_NAME"_0.zkey
|
||||
end=`date +%s`
|
||||
echo "DONE ($((end-start))s)"
|
||||
|
||||
echo "****GENERATING FINAL ZKEY****"
|
||||
start=`date +%s`
|
||||
NODE_OPTIONS="--max-old-space-size=56000" npx snarkjs zkey beacon "$BUILD_DIR"/"$CIRCUIT_NAME"_0.zkey "$BUILD_DIR"/"$CIRCUIT_NAME".zkey 0102030405060708090a0b0c0d0e0f101112231415161718221a1b1c1d1e1f 10 -n="Final Beacon phase2"
|
||||
~/node/out/Release/node --trace-gc --trace-gc-ignore-scavenger --max-old-space-size=2048000 --initial-old-space-size=2048000 --no-global-gc-scheduling --no-incremental-marking --max-semi-space-size=1024 --initial-heap-size=2048000 --expose-gc ~/snarkjs/cli.js zkey beacon "$BUILD_DIR"/"$CIRCUIT_NAME"_0.zkey "$BUILD_DIR"/"$CIRCUIT_NAME".zkey 0102030405060708090a0b0c0d0e0f101112231415161718221a1b1c1d1e1f 10 -n="Final Beacon phase2"
|
||||
end=`date +%s`
|
||||
echo "DONE ($((end-start))s)"
|
||||
|
||||
echo "****VERIFYING FINAL ZKEY****"
|
||||
start=`date +%s`
|
||||
NODE_OPTIONS="--max-old-space-size=56000" npx snarkjs zkey verify -verbose "$BUILD_DIR"/"$CIRCUIT_NAME".r1cs "$PHASE1" "$BUILD_DIR"/"$CIRCUIT_NAME".zkey
|
||||
~/node/out/Release/node --trace-gc --trace-gc-ignore-scavenger --max-old-space-size=2048000 --initial-old-space-size=2048000 --no-global-gc-scheduling --no-incremental-marking --max-semi-space-size=1024 --initial-heap-size=2048000 --expose-gc ~/snarkjs/cli.js zkey verify "$BUILD_DIR"/"$CIRCUIT_NAME".r1cs "$PHASE1" "$BUILD_DIR"/"$CIRCUIT_NAME".zkey
|
||||
end=`date +%s`
|
||||
echo "DONE ($((end-start))s)"
|
||||
|
||||
echo "****EXPORTING VKEY****"
|
||||
start=`date +%s`
|
||||
npx snarkjs zkey export verificationkey "$BUILD_DIR"/"$CIRCUIT_NAME".zkey "$BUILD_DIR"/vkey.json
|
||||
~/node/out/Release/node --trace-gc --trace-gc-ignore-scavenger --max-old-space-size=2048000 --initial-old-space-size=2048000 --no-global-gc-scheduling --no-incremental-marking --max-semi-space-size=1024 --initial-heap-size=2048000 --expose-gc ~/snarkjs/cli.js zkey export verificationkey "$BUILD_DIR"/"$CIRCUIT_NAME".zkey "$BUILD_DIR"/vkey.json
|
||||
end=`date +%s`
|
||||
echo "DONE ($((end-start))s)"
|
||||
|
||||
echo "****EXPORTING Solidity Verifier****"
|
||||
start=`date +%s`
|
||||
~/node/out/Release/node --trace-gc --trace-gc-ignore-scavenger --max-old-space-size=2048000 --initial-old-space-size=2048000 --no-global-gc-scheduling --no-incremental-marking --max-semi-space-size=1024 --initial-heap-size=2048000 --expose-gc ~/snarkjs/cli.js zkey export solidityverifier "$BUILD_DIR"/"$CIRCUIT_NAME".zkey "$BUILD_DIR"/verifier.sol
|
||||
end=`date +%s`
|
||||
echo "DONE ($((end-start))s)"
|
||||
|
||||
echo "****GENERATING PROOF FOR SAMPLE INPUT****"
|
||||
start=`date +%s`
|
||||
npx snarkjs groth16 prove "$BUILD_DIR"/"$CIRCUIT_NAME".zkey "$BUILD_DIR"/witness.wtns "$BUILD_DIR"/proof.json "$BUILD_DIR"/public.json
|
||||
~/rapidsnark/build/prover "$BUILD_DIR"/"$CIRCUIT_NAME".zkey "$BUILD_DIR"/witness.wtns "$BUILD_DIR"/proof.json "$BUILD_DIR"/public.json
|
||||
end=`date +%s`
|
||||
echo "DONE ($((end-start))s)"
|
||||
|
||||
echo "****VERIFYING PROOF FOR SAMPLE INPUT****"
|
||||
start=`date +%s`
|
||||
npx snarkjs groth16 verify "$BUILD_DIR"/vkey.json "$BUILD_DIR"/public.json "$BUILD_DIR"/proof.json
|
||||
~/node/out/Release/node --trace-gc --trace-gc-ignore-scavenger --max-old-space-size=2048000 --initial-old-space-size=2048000 --no-global-gc-scheduling --no-incremental-marking --max-semi-space-size=1024 --initial-heap-size=2048000 --expose-gc ~/snarkjs/cli.js groth16 verify "$BUILD_DIR"/vkey.json "$BUILD_DIR"/public.json "$BUILD_DIR"/proof.json
|
||||
end=`date +%s`
|
||||
echo "DONE ($((end-start))s)"
|
||||
|
||||
echo "****Generating Solidity input****"
|
||||
start=`date +%s`
|
||||
~/node/out/Release/node --trace-gc --trace-gc-ignore-scavenger --max-old-space-size=2048000 --initial-old-space-size=2048000 --no-global-gc-scheduling --no-incremental-marking --max-semi-space-size=1024 --initial-heap-size=2048000 --expose-gc ~/snarkjs/cli.js zkey export soliditycalldata "$BUILD_DIR"/public.json "$BUILD_DIR"/proof.json > "$BUILD_DIR"/solidity_input.in
|
||||
end=`date +%s`
|
||||
echo "DONE ($((end-start))s)"
|
||||
|
||||
@@ -1,12 +0,0 @@
|
||||
{"rlpPrefixHexs": [9, 15, 2, 0, 12, 1],
|
||||
"parentHashRlpHexs": [0, 10, 2, 15, 0, 12, 14, 1, 14, 9, 6, 10, 7, 9, 6, 13, 3, 4, 10, 3, 2, 10, 5, 15, 3, 4, 8, 1, 11, 0, 2, 7, 13, 7, 5, 2, 6, 5, 2, 7, 5, 15, 1, 12, 12, 7, 10, 0, 0, 2, 13, 6, 4, 2, 3, 6, 3, 5, 13, 5, 10, 1, 11, 12, 12, 10],
|
||||
"ommersHashRlpHexs": [0, 10, 13, 1, 12, 12, 13, 4, 8, 14, 14, 13, 7, 12, 13, 5, 10, 7, 11, 10, 5, 8, 5, 11, 7, 6, 6, 11, 12, 12, 4, 13, 10, 1, 3, 13, 2, 1, 5, 4, 11, 1, 4, 9, 10, 8, 4, 7, 3, 1, 0, 15, 1, 10, 2, 4, 13, 15, 0, 4, 4, 13, 3, 9, 7, 4],
|
||||
"beneficiaryRlpHexs": [4, 9, 12, 1, 4, 10, 11, 3, 4, 6, 8, 5, 6, 8, 9, 12, 13, 8, 14, 7, 7, 11, 2, 13, 14, 7, 1, 12, 14, 6, 5, 10, 15, 9, 0, 5, 12, 9, 14, 11, 10, 1],
|
||||
"stateRootRlpHexs": [0, 10, 13, 10, 12, 4, 7, 3, 9, 6, 10, 9, 6, 10, 9, 9, 14, 2, 1, 8, 5, 9, 10, 7, 13, 12, 11, 8, 13, 4, 14, 10, 13, 1, 0, 7, 0, 7, 2, 7, 6, 13, 12, 9, 9, 0, 3, 1, 5, 2, 5, 13, 1, 1, 5, 12, 7, 0, 4, 0, 2, 5, 5, 4, 12, 9],
|
||||
"transactionsRootRlpHexs": [0, 10, 2, 4, 7, 4, 1, 7, 7, 12, 10, 8, 9, 15, 10, 10, 15, 2, 10, 15, 7, 5, 11, 2, 4, 1, 4, 8, 2, 2, 0, 11, 15, 9, 13, 10, 14, 6, 3, 1, 8, 8, 5, 13, 12, 9, 3, 13, 7, 0, 14, 15, 15, 8, 7, 1, 2, 4, 11, 13, 10, 9, 0, 6, 12, 6],
|
||||
"receiptsRootRlpHexs": [0, 10, 8, 3, 15, 6, 8, 2, 6, 7, 12, 5, 7, 1, 12, 15, 1, 7, 1, 11, 11, 11, 11, 9, 0, 13, 7, 7, 2, 15, 11, 7, 11, 1, 6, 13, 10, 13, 10, 6, 5, 1, 13, 4, 10, 0, 15, 10, 14, 7, 12, 12, 0, 3, 2, 3, 3, 13, 7, 14, 10, 1, 12, 8, 6, 5],
|
||||
"logsBloomRlpHexs": [9, 11, 1, 0, 0, 0, 2, 14, 15, 14, 15, 4, 6, 15, 1, 11, 11, 12, 8, 8, 5, 6, 1, 9, 10, 10, 14, 3, 1, 6, 8, 12, 0, 7, 15, 7, 7, 13, 12, 15, 2, 12, 9, 5, 6, 7, 15, 10, 11, 2, 12, 5, 15, 5, 11, 7, 15, 15, 10, 14, 10, 5, 5, 15, 10, 13, 9, 11, 3, 14, 14, 7, 15, 13, 1, 5, 2, 14, 12, 15, 13, 8, 11, 11, 3, 11, 12, 0, 13, 3, 7, 5, 7, 15, 12, 8, 11, 15, 11, 7, 3, 5, 7, 15, 5, 10, 5, 13, 11, 12, 9, 2, 7, 6, 13, 15, 15, 15, 15, 15, 12, 7, 14, 11, 7, 9, 15, 15, 15, 7, 2, 15, 13, 15, 7, 13, 8, 5, 7, 7, 14, 10, 7, 12, 8, 1, 11, 6, 10, 15, 9, 15, 2, 11, 9, 13, 11, 11, 11, 6, 4, 10, 6, 14, 7, 14, 12, 13, 3, 15, 7, 9, 14, 15, 5, 7, 2, 15, 7, 11, 13, 3, 5, 5, 5, 7, 15, 11, 5, 7, 14, 13, 7, 14, 1, 15, 8, 5, 14, 7, 11, 15, 12, 12, 6, 12, 14, 4, 15, 3, 6, 15, 9, 9, 15, 4, 15, 12, 2, 5, 15, 15, 14, 1, 12, 3, 15, 11, 11, 13, 15, 7, 14, 7, 11, 14, 8, 15, 8, 12, 15, 4, 15, 9, 6, 4, 14, 7, 4, 10, 15, 15, 13, 1, 13, 6, 15, 12, 6, 7, 2, 15, 12, 8, 12, 9, 15, 2, 14, 0, 7, 10, 15, 15, 11, 3, 5, 5, 9, 10, 15, 14, 7, 8, 3, 14, 15, 8, 3, 13, 13, 13, 6, 15, 14, 10, 6, 9, 15, 11, 1, 10, 9, 9, 4, 7, 7, 3, 8, 13, 1, 15, 5, 15, 13, 3, 14, 15, 13, 7, 12, 13, 13, 9, 5, 11, 15, 6, 9, 12, 8, 13, 8, 3, 15, 5, 2, 15, 13, 10, 1, 15, 14, 14, 2, 11, 11, 15, 1, 15, 13, 11, 3, 11, 13, 13, 0, 7, 15, 15, 15, 0, 15, 10, 15, 15, 15, 14, 7, 5, 11, 6, 7, 4, 15, 3, 7, 11, 11, 15, 14, 15, 3, 1, 15, 12, 11, 15, 7, 11, 13, 4, 15, 6, 2, 14, 7, 14, 14, 15, 9, 0, 6, 15, 9, 15, 13, 15, 3, 8, 13, 13, 3, 13, 11, 12, 15, 14, 6, 7, 3, 6, 14, 8, 10, 7, 2, 15, 7, 5, 12, 5, 11, 11, 6, 11, 11, 7, 10, 14, 6, 5, 9, 10, 14, 11, 7, 15, 11, 5, 15, 11, 12, 15, 7, 3, 13, 11, 13, 3, 15, 5, 13, 3, 9, 15, 15, 4, 12, 15, 10, 12, 12, 11, 4, 0, 3, 15, 15, 12, 6, 9, 11, 12, 14, 15, 15, 3, 11, 4, 11, 7, 5, 14, 14, 6, 10, 15, 15, 6, 6, 7, 5, 14, 14, 13, 14, 7, 7, 14, 1, 14, 7, 6, 5, 11, 7, 7],
|
||||
"difficultyRlpHexs": [7, 8, 9, 2, 11, 7, 2, 12, 8, 13, 7, 6, 4, 0, 12, 7],
|
||||
"suffixRlpHexs": [3, 8, 5, 13, 0, 1, 11, 8, 4, 8, 1, 0, 11, 12, 10, 13, 13, 4, 4, 8, 1, 0, 11, 12, 10, 11, 12, 15, 4, 8, 1, 6, 9, 13, 11, 3, 3, 14, 3, 9, 13, 4, 9, 6, 14, 6, 5, 6, 4, 6, 0, 2, 2, 4, 9, 7, 0, 2, 6, 5, 9, 6, 1, 6, 2, 4, 4, 5, 3, 4, 0, 2, 5, 4, 5, 5, 2, 3, 0, 10, 2, 6, 1, 13, 12, 8, 8, 12, 1, 12, 11, 10, 6, 9, 13, 11, 15, 15, 8, 3, 3, 1, 7, 9, 13, 9, 12, 11, 5, 0, 8, 3, 9, 1, 2, 7, 3, 4, 8, 9, 15, 8, 2, 1, 11, 1, 7, 8, 10, 7, 1, 11, 0, 14, 12, 0, 13, 8, 14, 8, 5, 10, 11, 9, 8, 8, 5, 2, 11, 13, 9, 0, 7, 10, 7, 1, 14, 10, 11, 1, 6, 5, 5, 8, 15, 0, 4, 5, 13, 9, 2, 6, 11, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
|
||||
"suffixRlpHexLen": 174
|
||||
}
|
||||
@@ -1,71 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
PHASE1=../../circuits/pot24_final.ptau
|
||||
BUILD_DIR=../../build/eth_block_hash2
|
||||
CIRCUIT_NAME=eth_block_hash2
|
||||
|
||||
if [ -f "$PHASE1" ]; then
|
||||
echo "Found Phase 1 ptau file"
|
||||
else
|
||||
echo "No Phase 1 ptau file found. Exiting..."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ ! -d "$BUILD_DIR" ]; then
|
||||
echo "No build directory found. Creating build directory..."
|
||||
mkdir "$BUILD_DIR"
|
||||
fi
|
||||
|
||||
echo $PWD
|
||||
|
||||
echo "****COMPILING CIRCUIT****"
|
||||
start=`date +%s`
|
||||
circom "$CIRCUIT_NAME".circom --r1cs --sym --c --wat --wasm --output "$BUILD_DIR"
|
||||
end=`date +%s`
|
||||
echo "DONE ($((end-start))s)"
|
||||
|
||||
echo "****GENERATING WITNESS FOR SAMPLE INPUT****"
|
||||
start=`date +%s`
|
||||
node "$BUILD_DIR"/"$CIRCUIT_NAME"_js/generate_witness.js "$BUILD_DIR"/"$CIRCUIT_NAME"_js/"$CIRCUIT_NAME".wasm ../input_gen/inputs/input_"$CIRCUIT_NAME".json "$BUILD_DIR"/witness.wtns > "$BUILD_DIR"/log.out
|
||||
cd "$BUILD_DIR"/"$CIRCUIT_NAME"_cpp
|
||||
make
|
||||
./"$CIRCUIT_NAME" ../../../scripts/input_gen/inputs/input_"$CIRCUIT_NAME".json ../witness.wtns > ../log.out
|
||||
cd ../../../scripts/"$CIRCUIT_NAME"
|
||||
end=`date +%s`
|
||||
echo "DONE ($((end-start))s)"
|
||||
|
||||
echo "****GENERATING ZKEY 0****"
|
||||
start=`date +%s`
|
||||
NODE_OPTIONS="--max-old-space-size=56000" npx snarkjs groth16 setup "$BUILD_DIR"/"$CIRCUIT_NAME".r1cs "$PHASE1" "$BUILD_DIR"/"$CIRCUIT_NAME"_0.zkey
|
||||
end=`date +%s`
|
||||
echo "DONE ($((end-start))s)"
|
||||
|
||||
echo "****GENERATING FINAL ZKEY****"
|
||||
start=`date +%s`
|
||||
NODE_OPTIONS="--max-old-space-size=56000" npx snarkjs zkey beacon "$BUILD_DIR"/"$CIRCUIT_NAME"_0.zkey "$BUILD_DIR"/"$CIRCUIT_NAME".zkey 0102030405060708090a0b0c0d0e0f101112231415161718221a1b1c1d1e1f 10 -n="Final Beacon phase2"
|
||||
end=`date +%s`
|
||||
echo "DONE ($((end-start))s)"
|
||||
|
||||
echo "****VERIFYING FINAL ZKEY****"
|
||||
start=`date +%s`
|
||||
NODE_OPTIONS="--max-old-space-size=56000" npx snarkjs zkey verify -verbose "$BUILD_DIR"/"$CIRCUIT_NAME".r1cs "$PHASE1" "$BUILD_DIR"/"$CIRCUIT_NAME".zkey
|
||||
end=`date +%s`
|
||||
echo "DONE ($((end-start))s)"
|
||||
|
||||
echo "****EXPORTING VKEY****"
|
||||
start=`date +%s`
|
||||
npx snarkjs zkey export verificationkey "$BUILD_DIR"/"$CIRCUIT_NAME".zkey "$BUILD_DIR"/vkey.json
|
||||
end=`date +%s`
|
||||
echo "DONE ($((end-start))s)"
|
||||
|
||||
echo "****GENERATING PROOF FOR SAMPLE INPUT****"
|
||||
start=`date +%s`
|
||||
npx snarkjs groth16 prove "$BUILD_DIR"/"$CIRCUIT_NAME".zkey "$BUILD_DIR"/witness.wtns "$BUILD_DIR"/proof.json "$BUILD_DIR"/public.json
|
||||
end=`date +%s`
|
||||
echo "DONE ($((end-start))s)"
|
||||
|
||||
echo "****VERIFYING PROOF FOR SAMPLE INPUT****"
|
||||
start=`date +%s`
|
||||
npx snarkjs groth16 verify "$BUILD_DIR"/vkey.json "$BUILD_DIR"/public.json "$BUILD_DIR"/proof.json
|
||||
end=`date +%s`
|
||||
echo "DONE ($((end-start))s)"
|
||||
@@ -1,5 +0,0 @@
|
||||
pragma circom 2.0.2;
|
||||
|
||||
include "../../circuits/eth2.circom";
|
||||
|
||||
component main = EthBlockHashHex2();
|
||||
@@ -1,85 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
PHASE1=../../circuits/pot24_final.ptau
|
||||
INPUT_DIR=../input_gen/inputs
|
||||
BUILD_DIR=../../build/punk_test
|
||||
CIRCUIT_NAME=punk_storage
|
||||
|
||||
if [ -f "$PHASE1" ]; then
|
||||
echo "Found Phase 1 ptau file"
|
||||
else
|
||||
echo "No Phase 1 ptau file found. Exiting..."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ ! -d "$BUILD_DIR" ]; then
|
||||
echo "No build directory found. Creating build directory..."
|
||||
mkdir "$BUILD_DIR"
|
||||
fi
|
||||
|
||||
echo $PWD
|
||||
|
||||
echo "****COMPILING CIRCUIT****"
|
||||
start=`date +%s`
|
||||
circom "$CIRCUIT_NAME".circom --r1cs --wasm --sym --c --wat --output "$BUILD_DIR"
|
||||
#circom "$CIRCUIT_NAME".circom --O1 --wasm --output "$BUILD_DIR"
|
||||
end=`date +%s`
|
||||
echo "DONE ($((end-start))s)"
|
||||
|
||||
echo "****GENERATING ZKEY 0****"
|
||||
start=`date +%s`
|
||||
NODE_OPTIONS="--max-old-space-size=56000" npx snarkjs groth16 setup "$BUILD_DIR"/"$CIRCUIT_NAME".r1cs "$PHASE1" "$BUILD_DIR"/"$CIRCUIT_NAME"_0.zkey
|
||||
end=`date +%s`
|
||||
echo "DONE ($((end-start))s)"
|
||||
|
||||
echo "****GENERATING FINAL ZKEY****"
|
||||
start=`date +%s`
|
||||
NODE_OPTIONS="--max-old-space-size=56000" npx snarkjs zkey beacon "$BUILD_DIR"/"$CIRCUIT_NAME"_0.zkey "$BUILD_DIR"/"$CIRCUIT_NAME".zkey 0102030405060708090a0b0c0d0e0f101112231415161718221a1b1c1d1e1f 10 -n="Final Beacon phase2"
|
||||
end=`date +%s`
|
||||
echo "DONE ($((end-start))s)"
|
||||
|
||||
echo "****VERIFYING FINAL ZKEY****"
|
||||
start=`date +%s`
|
||||
NODE_OPTIONS="--max-old-space-size=56000" npx snarkjs zkey verify -verbose "$BUILD_DIR"/"$CIRCUIT_NAME".r1cs "$PHASE1" "$BUILD_DIR"/"$CIRCUIT_NAME".zkey
|
||||
end=`date +%s`
|
||||
echo "DONE ($((end-start))s)"
|
||||
|
||||
echo "****EXPORTING VKEY****"
|
||||
start=`date +%s`
|
||||
npx snarkjs zkey export verificationkey "$BUILD_DIR"/"$CIRCUIT_NAME".zkey "$BUILD_DIR"/vkey.json
|
||||
end=`date +%s`
|
||||
echo "DONE ($((end-start))s)"
|
||||
|
||||
echo "****EXPORTING Solidity Verifier****"
|
||||
start=`date +%s`
|
||||
npx snarkjs zkey export solidityverifier "$BUILD_DIR"/"$CIRCUIT_NAME".zkey "$BUILD_DIR"/verifier.sol
|
||||
end=`date +%s`
|
||||
echo "DONE ($((end-start))s)"
|
||||
|
||||
for PUNK_IDX in {0..1}
|
||||
do
|
||||
echo "****GENERATING WITNESS FOR SAMPLE INPUT $PUNK_IDX****"
|
||||
start=`date +%s`
|
||||
set -x
|
||||
node "$BUILD_DIR"/"$CIRCUIT_NAME"_js/generate_witness.js "$BUILD_DIR"/"$CIRCUIT_NAME"_js/"$CIRCUIT_NAME".wasm "$INPUT_DIR"/input_punk_pf"$PUNK_IDX".json "$BUILD_DIR"/witness"$PUNK_IDX".wtns > "$BUILD_DIR"/log"$PUNK_IDX".log
|
||||
end=`date +%s`
|
||||
echo "DONE ($((end-start))s)"
|
||||
|
||||
echo "****GENERATING PROOF FOR SAMPLE INPUT****"
|
||||
start=`date +%s`
|
||||
npx snarkjs groth16 prove "$BUILD_DIR"/"$CIRCUIT_NAME".zkey "$BUILD_DIR"/witness"$PUNK_IDX".wtns "$BUILD_DIR"/proof"$PUNK_IDX".json "$BUILD_DIR"/public"$PUNK_IDX".json
|
||||
end=`date +%s`
|
||||
echo "DONE ($((end-start))s)"
|
||||
|
||||
echo "****VERIFYING PROOF FOR SAMPLE INPUT****"
|
||||
start=`date +%s`
|
||||
npx snarkjs groth16 verify "$BUILD_DIR"/vkey.json "$BUILD_DIR"/public"$PUNK_IDX".json "$BUILD_DIR"/proof"$PUNK_IDX".json
|
||||
end=`date +%s`
|
||||
echo "DONE ($((end-start))s)"
|
||||
|
||||
echo "****Generating Solidity input****"
|
||||
start=`date +%s`
|
||||
npx snarkjs zkey export soliditycalldata "$BUILD_DIR"/public.json "$BUILD_DIR"/proof.json > "$BUILD_DIR"/solidity_input"$PUNK_IDX".in
|
||||
end=`date +%s`
|
||||
echo "DONE ($((end-start))s)"
|
||||
done
|
||||
@@ -1,24 +0,0 @@
|
||||
pragma circom 2.0.2;
|
||||
|
||||
include "../../circuits/mpt.circom";
|
||||
|
||||
component main {public [
|
||||
keyHexs,
|
||||
valueHexs
|
||||
// rootHashHexs,
|
||||
// leafRlpLengthHexLen,
|
||||
// leafPathRlpLengthHexLen,
|
||||
// leafPathPrefixHexLen,
|
||||
// leafPathHexLen,
|
||||
// leafValueRlpLengthHexLen,
|
||||
// leafValueHexLen,
|
||||
// leafRlpHexs,
|
||||
// nodeRlpLengthHexLen,
|
||||
// nodePathRlpLengthHexLen,
|
||||
// nodePathPrefixHexLen,
|
||||
// nodePathHexLen,
|
||||
// nodeRefHexLen,
|
||||
// nodeRlpHexs,
|
||||
// nodeTypes,
|
||||
// depth
|
||||
]} = MPTInclusionFixedKeyHexLen(8, 64, 66);
|
||||
@@ -1,68 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
PHASE1=../../circuits/pot24_final.ptau
|
||||
BUILD_DIR=../../build/storage_proof
|
||||
CIRCUIT_NAME=storage_proof
|
||||
|
||||
if [ -f "$PHASE1" ]; then
|
||||
echo "Found Phase 1 ptau file"
|
||||
else
|
||||
echo "No Phase 1 ptau file found. Exiting..."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ ! -d "$BUILD_DIR" ]; then
|
||||
echo "No build directory found. Creating build directory..."
|
||||
mkdir "$BUILD_DIR"
|
||||
fi
|
||||
|
||||
echo $PWD
|
||||
|
||||
echo "****COMPILING CIRCUIT****"
|
||||
start=`date +%s`
|
||||
circom "$CIRCUIT_NAME".circom --r1cs --wasm --sym --wat --output "$BUILD_DIR"
|
||||
end=`date +%s`
|
||||
echo "DONE ($((end-start))s)"
|
||||
|
||||
echo "****GENERATING WITNESS FOR SAMPLE INPUT****"
|
||||
start=`date +%s`
|
||||
node "$BUILD_DIR"/"$CIRCUIT_NAME"_js/generate_witness.js "$BUILD_DIR"/"$CIRCUIT_NAME"_js/"$CIRCUIT_NAME".wasm input_"$CIRCUIT_NAME".json "$BUILD_DIR"/witness.wtns
|
||||
end=`date +%s`
|
||||
echo "DONE ($((end-start))s)"
|
||||
|
||||
echo "****GENERATING ZKEY 0****"
|
||||
start=`date +%s`
|
||||
#NODE_OPTIONS="--max-old-space-size=56000" npx snarkjs plonk setup "$BUILD_DIR"/"$CIRCUIT_NAME".r1cs "$PHASE1" "$BUILD_DIR"/"$CIRCUIT_NAME"_0.zkey
|
||||
NODE_OPTIONS="--max-old-space-size=56000" npx snarkjs plonk setup "$BUILD_DIR"/"$CIRCUIT_NAME".r1cs "$PHASE1" "$BUILD_DIR"/"$CIRCUIT_NAME".zkey
|
||||
end=`date +%s`
|
||||
echo "DONE ($((end-start))s)"
|
||||
|
||||
echo "****GENERATING FINAL ZKEY****"
|
||||
start=`date +%s`
|
||||
#NODE_OPTIONS="--max-old-space-size=56000" npx snarkjs zkey beacon "$BUILD_DIR"/"$CIRCUIT_NAME"_0.zkey "$BUILD_DIR"/"$CIRCUIT_NAME".zkey 0102030405060708090a0b0c0d0e0f101112231415161718221a1b1c1d1e1f 10 -n="Final Beacon phase2"
|
||||
end=`date +%s`
|
||||
echo "DONE ($((end-start))s)"
|
||||
|
||||
echo "****VERIFYING FINAL ZKEY****"
|
||||
start=`date +%s`
|
||||
#NODE_OPTIONS="--max-old-space-size=56000" npx snarkjs zkey verify -verbose "$BUILD_DIR"/"$CIRCUIT_NAME".r1cs "$PHASE1" "$BUILD_DIR"/"$CIRCUIT_NAME".zkey
|
||||
end=`date +%s`
|
||||
echo "DONE ($((end-start))s)"
|
||||
|
||||
echo "****EXPORTING VKEY****"
|
||||
start=`date +%s`
|
||||
npx snarkjs zkey export verificationkey "$BUILD_DIR"/"$CIRCUIT_NAME".zkey "$BUILD_DIR"/vkey.json
|
||||
end=`date +%s`
|
||||
echo "DONE ($((end-start))s)"
|
||||
|
||||
echo "****GENERATING PROOF FOR SAMPLE INPUT****"
|
||||
start=`date +%s`
|
||||
npx snarkjs plonk prove "$BUILD_DIR"/"$CIRCUIT_NAME".zkey "$BUILD_DIR"/witness.wtns "$BUILD_DIR"/proof.json "$BUILD_DIR"/public.json
|
||||
end=`date +%s`
|
||||
echo "DONE ($((end-start))s)"
|
||||
|
||||
echo "****VERIFYING PROOF FOR SAMPLE INPUT****"
|
||||
start=`date +%s`
|
||||
npx snarkjs plonk verify "$BUILD_DIR"/vkey.json "$BUILD_DIR"/public.json "$BUILD_DIR"/proof.json
|
||||
end=`date +%s`
|
||||
echo "DONE ($((end-start))s)"
|
||||
@@ -1,328 +0,0 @@
|
||||
{"depth": 5,
|
||||
"keyHexs": [14, 5, 3, 10, 0, 11, 9, 7, 2, 12, 4, 7, 0, 15, 1, 8, 15, 8, 4, 2, 12, 3, 5, 12, 7, 1,
|
||||
2, 15, 9, 11, 9, 11, 14, 10, 10, 12, 1, 14, 8, 14, 8, 3, 8, 12, 1, 11, 10, 4, 9, 1, 13,
|
||||
0, 13, 4, 7, 8, 9, 0, 0, 14, 8, 1, 12, 10],
|
||||
"leafPathHexLen": 60,
|
||||
"leafPathPrefixHexLen": 2,
|
||||
"leafPathRlpLengthHexLen": 0,
|
||||
"leafRlpHexs": [15, 6, 9, 15, 2, 0, 0, 11, 9, 7, 2, 12, 4, 7, 0, 15, 1, 8, 15, 8, 4, 2, 12, 3, 5,
|
||||
12, 7, 1, 2, 15, 9, 11, 9, 11, 14, 10, 10, 12, 1, 14, 8, 14, 8, 3, 8, 12, 1, 11,
|
||||
10, 4, 9, 1, 13, 0, 13, 4, 7, 8, 9, 0, 0, 14, 8, 1, 12, 10, 9, 5, 9, 4, 14, 0, 8,
|
||||
12, 3, 2, 7, 3, 7, 12, 0, 2, 1, 12, 7, 13, 0, 5, 13, 1, 1, 6, 11, 0, 0, 10, 6, 8,
|
||||
10, 0, 2, 15, 2, 13, 1, 4, 4, 10, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
|
||||
"leafRlpLengthHexLen": 0,
|
||||
"leafValueHexLen": 42,
|
||||
"leafValueRlpLengthHexLen": 0,
|
||||
"nodePathHexLen": [0, 0, 0, 0, 0, 0, 0],
|
||||
"nodePathPrefixHexLen": [0, 0, 0, 0, 0, 0, 0],
|
||||
"nodePathRlpLengthHexLen": [0, 0, 0, 0, 0, 0, 0],
|
||||
"nodeRefHexLen": [[64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64],
|
||||
[64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64],
|
||||
[64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64],
|
||||
[64, 0, 0, 0, 64, 0, 0, 64, 64, 64, 64, 64, 0, 0, 0, 0],
|
||||
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
|
||||
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
|
||||
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]],
|
||||
"nodeRlpHexs": [[15, 9, 0, 2, 1, 1, 10, 0, 13, 4, 6, 8, 5, 5, 2, 3, 14, 0, 1, 14, 9, 8, 0, 11, 1,
|
||||
11, 1, 5, 13, 5, 9, 3, 14, 15, 9, 2, 10, 2, 9, 8, 9, 2, 2, 0, 0, 11, 5, 13, 1, 7,
|
||||
14, 9, 0, 15, 7, 3, 9, 9, 3, 11, 8, 14, 4, 8, 14, 3, 14, 12, 9, 10, 9, 5, 10, 0,
|
||||
0, 3, 15, 5, 1, 1, 10, 0, 2, 11, 11, 7, 9, 12, 9, 3, 0, 10, 0, 3, 15, 14, 12, 8,
|
||||
14, 4, 5, 11, 12, 4, 14, 5, 6, 5, 12, 2, 15, 5, 12, 2, 11, 9, 0, 15, 5, 2, 12, 12,
|
||||
8, 0, 12, 7, 6, 7, 0, 9, 3, 7, 0, 9, 4, 6, 4, 15, 10, 0, 13, 4, 1, 14, 11, 12, 4,
|
||||
5, 8, 15, 8, 13, 7, 4, 1, 4, 11, 7, 7, 11, 4, 2, 15, 2, 14, 14, 13, 1, 0, 4, 1, 5,
|
||||
11, 4, 15, 10, 9, 0, 9, 12, 14, 14, 9, 3, 0, 7, 15, 11, 5, 0, 1, 12, 15, 14, 9,
|
||||
12, 2, 15, 14, 12, 2, 7, 9, 14, 10, 0, 11, 2, 3, 4, 8, 2, 1, 1, 2, 13, 4, 9, 7,
|
||||
15, 9, 3, 1, 14, 5, 6, 6, 6, 6, 4, 1, 14, 3, 12, 0, 1, 4, 10, 10, 11, 4, 8, 11, 3,
|
||||
5, 6, 4, 3, 0, 5, 13, 1, 3, 15, 10, 10, 15, 12, 10, 8, 9, 3, 9, 0, 10, 15, 2, 13,
|
||||
6, 6, 10, 0, 10, 2, 2, 4, 9, 5, 15, 1, 10, 12, 2, 6, 14, 13, 5, 1, 12, 0, 8, 15,
|
||||
0, 11, 2, 0, 5, 11, 4, 10, 2, 2, 14, 13, 3, 6, 1, 6, 3, 1, 8, 6, 6, 15, 0, 2, 2,
|
||||
3, 15, 2, 10, 7, 6, 1, 2, 13, 1, 0, 15, 2, 13, 10, 1, 10, 10, 8, 10, 0, 13, 2, 3,
|
||||
15, 12, 4, 11, 10, 12, 10, 5, 4, 11, 15, 5, 3, 2, 15, 10, 10, 5, 7, 2, 11, 5, 5,
|
||||
6, 2, 2, 14, 4, 0, 15, 8, 7, 3, 6, 5, 2, 12, 2, 11, 0, 0, 9, 10, 6, 10, 11, 8, 14,
|
||||
0, 6, 15, 2, 9, 9, 3, 8, 10, 2, 14, 5, 9, 10, 0, 15, 1, 10, 13, 7, 10, 11, 7, 7,
|
||||
1, 14, 6, 5, 13, 8, 6, 5, 14, 11, 5, 13, 1, 14, 14, 1, 11, 7, 7, 12, 9, 12, 11, 9,
|
||||
1, 0, 9, 4, 8, 4, 6, 1, 2, 9, 5, 11, 5, 6, 4, 1, 1, 0, 6, 15, 9, 1, 8, 7, 15, 7,
|
||||
0, 3, 8, 14, 15, 10, 0, 10, 9, 9, 10, 10, 15, 12, 3, 14, 12, 4, 5, 12, 2, 6, 8,
|
||||
15, 5, 11, 1, 1, 4, 6, 15, 15, 10, 14, 7, 8, 2, 4, 2, 13, 1, 5, 14, 5, 2, 11, 0,
|
||||
6, 10, 5, 4, 15, 3, 13, 5, 15, 14, 9, 10, 1, 5, 11, 15, 5, 0, 9, 12, 10, 10, 9, 1,
|
||||
10, 0, 0, 5, 12, 3, 5, 7, 1, 5, 1, 9, 12, 4, 0, 8, 4, 1, 14, 1, 15, 12, 11, 6, 12,
|
||||
9, 5, 2, 10, 5, 11, 15, 9, 11, 7, 6, 15, 15, 13, 0, 13, 5, 9, 15, 7, 13, 12, 12,
|
||||
15, 14, 12, 5, 1, 2, 2, 15, 4, 4, 5, 14, 8, 6, 2, 4, 10, 13, 10, 0, 4, 6, 2, 6,
|
||||
14, 7, 7, 0, 1, 10, 12, 12, 6, 8, 13, 14, 8, 15, 13, 0, 4, 4, 5, 14, 14, 3, 0, 4,
|
||||
9, 7, 2, 10, 1, 4, 9, 5, 9, 13, 10, 4, 0, 15, 5, 9, 0, 15, 8, 15, 11, 2, 0, 12, 6,
|
||||
5, 4, 11, 9, 11, 1, 11, 14, 10, 5, 12, 10, 0, 10, 6, 8, 13, 11, 0, 6, 1, 7, 15, 5,
|
||||
11, 4, 12, 6, 12, 13, 11, 5, 3, 0, 14, 13, 1, 4, 3, 6, 6, 12, 1, 6, 12, 13, 11,
|
||||
10, 3, 15, 11, 9, 0, 1, 6, 7, 0, 3, 11, 7, 4, 4, 10, 2, 4, 1, 9, 7, 2, 2, 3, 6, 3,
|
||||
6, 15, 14, 5, 10, 0, 13, 9, 14, 2, 9, 4, 11, 0, 8, 11, 15, 2, 6, 2, 3, 3, 14, 1,
|
||||
5, 4, 9, 8, 6, 5, 9, 10, 6, 5, 0, 14, 2, 9, 8, 3, 13, 1, 12, 1, 0, 5, 9, 14, 7,
|
||||
14, 15, 3, 8, 5, 12, 6, 3, 4, 6, 5, 6, 15, 0, 5, 2, 8, 15, 1, 2, 12, 10, 0, 3, 4,
|
||||
2, 0, 5, 1, 1, 3, 4, 1, 10, 2, 12, 3, 15, 13, 12, 2, 0, 7, 0, 14, 7, 4, 1, 9, 0,
|
||||
14, 4, 3, 6, 13, 9, 5, 12, 0, 7, 8, 10, 5, 8, 0, 11, 11, 9, 3, 2, 3, 0, 5, 15, 11,
|
||||
2, 15, 11, 11, 14, 5, 10, 11, 5, 12, 9, 12, 10, 0, 10, 0, 15, 14, 1, 8, 7, 12, 8,
|
||||
14, 13, 12, 15, 6, 2, 10, 15, 11, 1, 8, 11, 15, 2, 9, 11, 14, 10, 6, 9, 11, 5, 4,
|
||||
8, 8, 11, 2, 6, 13, 12, 11, 14, 0, 15, 8, 2, 0, 4, 12, 13, 0, 8, 11, 5, 6, 6, 2,
|
||||
15, 0, 5, 2, 10, 0, 0, 15, 10, 0, 7, 13, 13, 0, 14, 8, 11, 11, 2, 15, 5, 11, 6, 1,
|
||||
7, 11, 7, 7, 0, 9, 9, 5, 13, 6, 1, 15, 4, 13, 9, 9, 12, 5, 6, 7, 15, 1, 8, 10, 13,
|
||||
3, 0, 15, 13, 3, 15, 9, 10, 13, 3, 0, 8, 2, 11, 8, 8, 1, 8, 1, 15, 1, 3, 6, 10, 8,
|
||||
10, 0, 3, 2, 12, 2, 5, 5, 11, 3, 5, 3, 1, 1, 9, 6, 13, 13, 5, 10, 3, 1, 14, 11,
|
||||
15, 1, 15, 4, 0, 4, 11, 11, 11, 6, 11, 9, 0, 11, 11, 2, 9, 6, 5, 3, 13, 10, 9, 10,
|
||||
8, 3, 2, 13, 2, 12, 12, 12, 9, 13, 12, 11, 2, 1, 13, 13, 8, 11, 8, 0],
|
||||
[15, 9, 0, 2, 1, 1, 10, 0, 6, 6, 10, 10, 12, 6, 15, 5, 10, 9, 7, 8, 12, 9, 14, 6,
|
||||
6, 5, 14, 5, 11, 9, 6, 13, 8, 8, 3, 14, 11, 8, 0, 13, 0, 14, 1, 15, 0, 1, 1, 15,
|
||||
8, 15, 8, 0, 12, 9, 11, 1, 11, 13, 8, 12, 12, 8, 8, 15, 3, 9, 1, 14, 5, 3, 13, 1,
|
||||
10, 0, 9, 15, 1, 14, 4, 3, 10, 0, 11, 10, 6, 6, 6, 14, 1, 7, 15, 4, 14, 8, 1, 1,
|
||||
0, 9, 7, 5, 15, 4, 1, 12, 8, 11, 14, 4, 4, 2, 0, 6, 4, 8, 15, 0, 3, 1, 5, 5, 0,
|
||||
10, 4, 4, 5, 1, 13, 1, 5, 5, 14, 10, 4, 1, 1, 1, 10, 10, 10, 0, 12, 14, 2, 2, 2,
|
||||
8, 13, 13, 7, 12, 11, 8, 7, 14, 11, 5, 10, 14, 13, 5, 4, 2, 13, 8, 9, 15, 11, 11,
|
||||
15, 9, 14, 14, 14, 9, 0, 12, 1, 11, 10, 5, 10, 10, 15, 1, 9, 14, 14, 2, 9, 13, 12,
|
||||
14, 7, 11, 6, 1, 9, 13, 0, 4, 1, 6, 7, 4, 10, 0, 8, 9, 0, 14, 6, 12, 2, 12, 15, 4,
|
||||
6, 2, 4, 1, 3, 6, 6, 2, 5, 6, 4, 3, 11, 3, 1, 5, 4, 6, 7, 4, 12, 3, 9, 7, 14, 0,
|
||||
11, 0, 8, 14, 15, 15, 13, 7, 8, 8, 15, 12, 2, 7, 15, 12, 11, 1, 8, 9, 2, 6, 11,
|
||||
10, 5, 12, 11, 0, 10, 0, 13, 12, 8, 9, 0, 10, 13, 9, 12, 15, 1, 6, 5, 6, 0, 11, 0,
|
||||
6, 0, 12, 13, 5, 0, 10, 9, 3, 13, 4, 2, 4, 4, 8, 4, 9, 15, 14, 11, 0, 5, 15, 1, 6,
|
||||
8, 9, 0, 1, 8, 3, 2, 0, 12, 10, 9, 5, 7, 4, 6, 0, 1, 12, 8, 13, 6, 14, 10, 0, 15,
|
||||
9, 2, 4, 15, 6, 13, 0, 10, 2, 6, 13, 2, 10, 6, 1, 11, 11, 2, 3, 4, 7, 2, 3, 14, 7,
|
||||
14, 5, 5, 2, 9, 1, 14, 2, 11, 1, 15, 4, 10, 3, 2, 4, 1, 10, 5, 5, 1, 0, 14, 7, 6,
|
||||
13, 0, 4, 10, 0, 4, 9, 1, 11, 9, 4, 4, 9, 10, 0, 3, 10, 8, 4, 0, 8, 6, 6, 5, 3, 2,
|
||||
14, 4, 6, 15, 6, 13, 13, 3, 3, 2, 6, 0, 13, 15, 14, 2, 9, 2, 12, 5, 11, 15, 15, 7,
|
||||
5, 0, 3, 9, 9, 5, 9, 7, 3, 9, 15, 7, 9, 7, 10, 11, 9, 3, 12, 11, 10, 5, 5, 6, 15,
|
||||
3, 5, 4, 13, 10, 0, 1, 11, 9, 12, 0, 14, 9, 9, 10, 10, 5, 0, 4, 9, 0, 4, 14, 8,
|
||||
15, 7, 4, 1, 6, 13, 7, 1, 15, 10, 0, 13, 4, 9, 9, 8, 14, 7, 10, 3, 0, 4, 11, 7, 5,
|
||||
7, 11, 9, 1, 14, 8, 8, 1, 0, 1, 9, 3, 8, 3, 3, 12, 8, 0, 13, 6, 12, 10, 0, 15, 7,
|
||||
9, 0, 0, 14, 12, 7, 15, 5, 3, 15, 2, 12, 5, 4, 1, 11, 1, 10, 7, 8, 15, 1, 1, 2, 8,
|
||||
7, 12, 8, 15, 2, 8, 9, 13, 13, 8, 12, 4, 2, 1, 2, 7, 3, 15, 13, 6, 0, 8, 4, 1, 8,
|
||||
12, 12, 4, 9, 9, 12, 12, 15, 0, 4, 0, 4, 10, 0, 10, 13, 10, 8, 14, 0, 10, 6, 1, 8,
|
||||
14, 11, 15, 10, 2, 8, 4, 14, 13, 11, 12, 4, 10, 15, 8, 13, 3, 9, 1, 10, 5, 8, 7,
|
||||
10, 9, 8, 7, 15, 3, 13, 4, 6, 7, 8, 12, 0, 2, 8, 11, 2, 14, 15, 12, 8, 14, 8, 10,
|
||||
12, 4, 12, 9, 9, 9, 11, 10, 0, 6, 6, 13, 13, 12, 15, 11, 5, 9, 1, 5, 2, 6, 8, 4,
|
||||
8, 2, 11, 9, 14, 14, 3, 12, 15, 1, 14, 14, 10, 5, 3, 9, 0, 1, 12, 0, 12, 3, 3, 0,
|
||||
9, 9, 0, 8, 7, 4, 14, 4, 2, 0, 9, 10, 12, 7, 6, 8, 15, 9, 13, 5, 13, 13, 8, 5, 3,
|
||||
10, 0, 13, 0, 7, 1, 1, 14, 5, 0, 9, 12, 15, 7, 9, 15, 2, 11, 13, 6, 15, 1, 11, 9,
|
||||
0, 14, 7, 0, 5, 13, 6, 8, 4, 15, 5, 12, 8, 14, 3, 15, 9, 12, 12, 0, 15, 15, 1, 14,
|
||||
0, 2, 13, 4, 15, 8, 0, 8, 1, 11, 9, 0, 10, 11, 1, 2, 4, 8, 10, 0, 7, 1, 12, 7, 14,
|
||||
14, 1, 11, 3, 3, 15, 6, 7, 2, 8, 7, 6, 6, 4, 7, 7, 10, 6, 9, 10, 13, 8, 11, 13, 9,
|
||||
15, 7, 12, 10, 0, 12, 4, 4, 5, 8, 12, 2, 14, 8, 3, 12, 0, 2, 6, 13, 6, 4, 2, 13,
|
||||
2, 2, 14, 14, 8, 6, 13, 15, 6, 4, 10, 0, 0, 9, 11, 15, 0, 4, 2, 3, 13, 15, 14, 0,
|
||||
0, 6, 6, 1, 8, 0, 13, 11, 1, 6, 9, 1, 13, 10, 13, 7, 0, 7, 5, 1, 3, 9, 9, 15, 10,
|
||||
5, 14, 13, 12, 10, 8, 6, 8, 0, 6, 12, 7, 12, 8, 13, 15, 13, 1, 12, 4, 6, 2, 2, 10,
|
||||
9, 11, 4, 10, 0, 8, 14, 11, 10, 4, 5, 11, 15, 7, 7, 15, 2, 14, 10, 15, 1, 15, 1,
|
||||
0, 10, 3, 3, 1, 6, 1, 8, 3, 9, 10, 6, 13, 4, 15, 5, 1, 10, 12, 0, 0, 6, 4, 14, 2,
|
||||
3, 10, 5, 3, 6, 14, 15, 15, 7, 11, 3, 11, 4, 3, 14, 4, 12, 7, 14, 10, 4, 10, 0, 2,
|
||||
6, 0, 14, 9, 9, 10, 0, 4, 0, 14, 7, 0, 11, 7, 10, 2, 7, 14, 14, 0, 0, 8, 6, 8, 15,
|
||||
7, 0, 15, 11, 2, 9, 9, 3, 11, 5, 3, 10, 2, 3, 3, 13, 10, 8, 8, 8, 3, 5, 2, 8, 5,
|
||||
8, 10, 10, 4, 10, 7, 15, 7, 8, 1, 10, 3, 6, 8, 0],
|
||||
[15, 9, 0, 2, 1, 1, 10, 0, 2, 12, 15, 4, 0, 1, 6, 5, 14, 4, 0, 4, 10, 2, 9, 4, 11,
|
||||
14, 8, 0, 3, 7, 8, 10, 11, 12, 11, 5, 9, 14, 0, 10, 9, 11, 3, 10, 5, 11, 3, 10, 2,
|
||||
7, 5, 2, 5, 1, 7, 3, 9, 14, 2, 14, 15, 7, 1, 8, 8, 1, 13, 12, 15, 11, 10, 9, 10,
|
||||
0, 5, 6, 2, 12, 10, 9, 8, 10, 15, 7, 14, 15, 6, 13, 7, 12, 1, 12, 9, 7, 12, 6, 10,
|
||||
4, 3, 15, 14, 7, 11, 15, 6, 3, 2, 9, 11, 4, 12, 1, 4, 14, 2, 5, 12, 0, 12, 3, 9,
|
||||
10, 11, 5, 2, 2, 11, 7, 14, 12, 3, 0, 14, 7, 11, 12, 9, 1, 10, 0, 4, 13, 15, 13,
|
||||
9, 2, 13, 5, 7, 13, 13, 13, 14, 9, 5, 4, 0, 1, 9, 4, 3, 15, 8, 14, 3, 13, 2, 1, 8,
|
||||
11, 0, 4, 14, 9, 0, 4, 9, 8, 3, 12, 14, 0, 2, 4, 13, 12, 9, 12, 13, 7, 7, 15, 0,
|
||||
7, 4, 14, 4, 8, 6, 12, 11, 8, 15, 13, 10, 0, 7, 3, 0, 8, 6, 3, 13, 5, 4, 11, 6,
|
||||
14, 0, 15, 6, 10, 9, 3, 1, 3, 2, 13, 8, 11, 3, 15, 8, 10, 9, 8, 14, 14, 7, 15, 2,
|
||||
4, 7, 12, 13, 15, 14, 8, 1, 11, 0, 2, 15, 0, 8, 9, 15, 7, 5, 15, 15, 3, 6, 1, 1,
|
||||
15, 9, 8, 8, 5, 10, 0, 2, 8, 9, 2, 0, 5, 9, 2, 15, 2, 10, 11, 4, 7, 3, 12, 10, 1,
|
||||
8, 8, 11, 15, 12, 12, 5, 13, 2, 15, 0, 9, 3, 6, 2, 2, 10, 2, 12, 13, 10, 1, 6, 15,
|
||||
13, 15, 6, 1, 7, 2, 2, 5, 13, 12, 2, 13, 3, 9, 3, 5, 7, 4, 7, 8, 4, 12, 10, 0, 6,
|
||||
5, 10, 2, 15, 15, 9, 4, 0, 10, 12, 13, 0, 3, 13, 2, 12, 9, 3, 1, 0, 1, 14, 12, 9,
|
||||
7, 2, 3, 6, 12, 4, 15, 10, 3, 10, 3, 10, 5, 9, 3, 11, 14, 9, 12, 4, 8, 8, 2, 15,
|
||||
4, 9, 2, 1, 5, 15, 4, 1, 6, 3, 13, 3, 12, 9, 8, 10, 0, 2, 12, 7, 9, 2, 7, 9, 5, 9,
|
||||
6, 14, 2, 3, 5, 13, 3, 7, 2, 4, 11, 7, 8, 1, 7, 12, 1, 15, 11, 9, 2, 4, 9, 13, 4,
|
||||
2, 10, 1, 9, 6, 14, 11, 14, 5, 8, 13, 14, 11, 9, 11, 6, 5, 8, 6, 6, 8, 0, 0, 2, 8,
|
||||
8, 13, 15, 15, 13, 10, 0, 6, 1, 10, 10, 7, 13, 7, 6, 10, 1, 4, 11, 3, 3, 3, 10, 2,
|
||||
13, 6, 4, 15, 3, 8, 6, 11, 5, 12, 8, 15, 3, 8, 2, 9, 7, 6, 12, 6, 5, 0, 6, 10, 4,
|
||||
12, 0, 11, 7, 6, 4, 8, 2, 4, 3, 0, 8, 0, 6, 6, 3, 5, 5, 4, 8, 1, 7, 10, 0, 6, 6,
|
||||
14, 13, 0, 4, 0, 0, 10, 14, 10, 11, 0, 3, 5, 7, 13, 9, 14, 14, 15, 1, 9, 1, 14, 7,
|
||||
6, 4, 1, 0, 4, 7, 14, 4, 1, 8, 4, 1, 6, 15, 6, 12, 4, 2, 1, 13, 7, 4, 5, 12, 3, 8,
|
||||
4, 2, 14, 10, 5, 0, 10, 9, 0, 10, 10, 4, 10, 0, 0, 10, 6, 12, 13, 9, 6, 8, 2, 13,
|
||||
4, 5, 1, 6, 1, 3, 4, 2, 6, 14, 15, 14, 2, 4, 0, 13, 9, 13, 14, 6, 12, 10, 11, 4,
|
||||
5, 9, 1, 6, 15, 1, 8, 9, 10, 1, 6, 11, 14, 0, 11, 10, 13, 8, 8, 14, 8, 8, 8, 2, 5,
|
||||
8, 12, 6, 3, 11, 10, 0, 5, 7, 0, 6, 11, 5, 12, 13, 7, 6, 10, 6, 11, 11, 2, 11, 3,
|
||||
0, 15, 13, 7, 10, 14, 1, 4, 0, 8, 12, 12, 15, 2, 15, 4, 1, 2, 8, 9, 2, 4, 4, 2, 8,
|
||||
8, 13, 0, 0, 0, 10, 6, 10, 14, 3, 5, 6, 11, 13, 14, 2, 6, 5, 10, 3, 9, 14, 10, 0,
|
||||
9, 11, 15, 10, 11, 6, 13, 4, 9, 5, 0, 15, 11, 14, 6, 2, 9, 14, 5, 9, 14, 14, 7, 5,
|
||||
13, 7, 3, 7, 6, 1, 7, 7, 4, 12, 15, 12, 12, 5, 11, 1, 3, 5, 11, 13, 5, 9, 7, 15,
|
||||
3, 7, 6, 1, 10, 11, 12, 7, 10, 5, 12, 8, 2, 3, 2, 11, 10, 0, 12, 10, 7, 8, 4, 5,
|
||||
15, 3, 15, 15, 15, 10, 7, 2, 15, 4, 4, 15, 11, 4, 3, 10, 2, 15, 12, 7, 6, 1, 6,
|
||||
14, 10, 10, 5, 11, 5, 6, 3, 12, 6, 7, 4, 10, 7, 12, 3, 15, 15, 0, 1, 11, 10, 13,
|
||||
10, 12, 14, 5, 1, 4, 6, 4, 14, 13, 8, 4, 10, 0, 3, 7, 10, 6, 3, 14, 0, 5, 4, 5, 4,
|
||||
11, 15, 12, 2, 2, 13, 3, 2, 7, 13, 1, 9, 1, 4, 15, 4, 6, 5, 4, 14, 6, 1, 15, 2, 4,
|
||||
4, 4, 0, 3, 12, 7, 5, 5, 11, 1, 14, 2, 0, 3, 9, 8, 4, 7, 6, 10, 1, 5, 9, 12, 13,
|
||||
7, 4, 14, 10, 0, 2, 13, 14, 4, 4, 14, 1, 1, 12, 8, 0, 9, 4, 5, 8, 3, 13, 7, 12, 0,
|
||||
0, 11, 13, 2, 0, 6, 1, 15, 10, 11, 8, 5, 3, 1, 12, 8, 13, 3, 12, 8, 6, 8, 6, 9, 0,
|
||||
5, 14, 1, 10, 1, 4, 8, 2, 4, 14, 8, 1, 7, 8, 9, 8, 11, 4, 11, 10, 0, 6, 10, 2, 6,
|
||||
10, 7, 14, 1, 9, 2, 14, 2, 1, 3, 9, 12, 10, 5, 0, 14, 10, 11, 4, 13, 4, 2, 0, 6,
|
||||
4, 5, 14, 11, 8, 8, 0, 3, 10, 14, 9, 11, 10, 14, 12, 1, 11, 1, 4, 14, 0, 13, 2, 1,
|
||||
0, 14, 13, 9, 4, 2, 10, 7, 14, 8, 1, 0, 8, 0],
|
||||
[15, 8, 15, 1, 10, 0, 14, 4, 9, 4, 9, 10, 1, 2, 0, 3, 10, 6, 8, 10, 3, 6, 0, 7, 12,
|
||||
4, 7, 6, 1, 9, 10, 12, 6, 2, 11, 12, 13, 7, 5, 3, 15, 4, 2, 11, 9, 5, 9, 2, 0, 5,
|
||||
14, 9, 10, 6, 3, 1, 9, 4, 12, 11, 9, 3, 13, 15, 2, 7, 3, 11, 14, 11, 8, 0, 8, 0,
|
||||
8, 0, 10, 0, 11, 3, 8, 3, 12, 11, 10, 11, 14, 3, 8, 0, 1, 8, 13, 4, 8, 7, 11, 5,
|
||||
2, 1, 8, 11, 9, 1, 6, 3, 6, 15, 9, 11, 0, 14, 10, 8, 5, 3, 3, 11, 3, 14, 15, 6, 4,
|
||||
6, 10, 11, 5, 3, 6, 15, 10, 10, 14, 8, 2, 13, 15, 7, 9, 13, 0, 2, 8, 0, 8, 0, 10,
|
||||
0, 5, 4, 5, 15, 0, 0, 4, 15, 9, 2, 0, 0, 6, 6, 11, 13, 7, 1, 9, 11, 5, 0, 14, 4,
|
||||
6, 9, 3, 8, 12, 9, 15, 12, 13, 8, 15, 13, 8, 6, 15, 6, 5, 8, 13, 10, 6, 4, 0, 9,
|
||||
15, 2, 14, 1, 2, 1, 5, 6, 5, 7, 4, 10, 14, 9, 7, 7, 10, 0, 14, 4, 6, 11, 14, 3, 2,
|
||||
15, 9, 0, 12, 4, 12, 8, 13, 14, 2, 3, 10, 8, 11, 2, 9, 15, 6, 0, 5, 7, 12, 13, 13,
|
||||
9, 6, 4, 4, 1, 5, 13, 12, 6, 3, 10, 5, 11, 5, 2, 12, 0, 1, 13, 8, 7, 15, 15, 10,
|
||||
8, 4, 12, 11, 1, 8, 15, 0, 0, 10, 0, 1, 2, 14, 10, 13, 10, 12, 13, 1, 15, 12, 4,
|
||||
12, 11, 13, 13, 5, 3, 7, 12, 3, 3, 11, 11, 10, 11, 2, 1, 15, 3, 10, 12, 11, 4, 8,
|
||||
1, 7, 8, 4, 5, 9, 8, 4, 1, 0, 4, 2, 1, 10, 13, 3, 6, 12, 4, 3, 11, 10, 1, 9, 13,
|
||||
15, 11, 11, 15, 10, 0, 3, 9, 7, 12, 13, 11, 9, 10, 0, 11, 10, 2, 0, 8, 6, 3, 8, 2,
|
||||
9, 3, 7, 13, 13, 13, 8, 6, 13, 11, 8, 4, 9, 6, 1, 13, 12, 4, 14, 8, 6, 12, 14, 2,
|
||||
11, 14, 3, 14, 1, 0, 3, 15, 2, 4, 2, 7, 6, 15, 14, 4, 3, 0, 2, 5, 0, 9, 10, 0, 9,
|
||||
4, 15, 9, 1, 14, 10, 14, 8, 1, 8, 4, 11, 4, 6, 7, 3, 4, 14, 2, 13, 0, 9, 3, 7, 13,
|
||||
9, 11, 10, 13, 9, 2, 2, 2, 0, 3, 9, 10, 6, 12, 12, 14, 9, 9, 3, 11, 9, 5, 13, 14,
|
||||
11, 13, 0, 3, 6, 2, 2, 14, 14, 3, 6, 12, 1, 6, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0],
|
||||
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
|
||||
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
|
||||
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]],
|
||||
"nodeRlpLengthHexLen": [4, 4, 4, 2, 0, 0, 0],
|
||||
"nodeTypes": [0, 0, 0, 0, 0, 0, 0],
|
||||
"rootHashHexs": [10, 14, 2, 7, 9, 2, 2, 4, 4, 4, 1, 7, 11, 12, 1, 7, 4, 9, 11, 9, 12, 13, 9, 10, 0,
|
||||
11, 13, 12, 1, 12, 4, 10, 6, 12, 15, 3, 2, 15, 1, 4, 7, 11, 3, 7, 2, 0, 2, 12, 8,
|
||||
12, 11, 3, 5, 9, 0, 7, 7, 7, 6, 5, 9, 10, 14, 12],
|
||||
"valueHexs": [9, 4, 14, 0, 8, 12, 3, 2, 7, 3, 7, 12, 0, 2, 1, 12, 7, 13, 0, 5, 13, 1, 1, 6, 11, 0,
|
||||
0, 10, 6, 8, 10, 0, 2, 15, 2, 13, 1, 4, 4, 10, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]}
|
||||
@@ -1,24 +0,0 @@
|
||||
pragma circom 2.0.2;
|
||||
|
||||
include "../../circuits/mpt.circom";
|
||||
|
||||
component main {public [
|
||||
keyHexs,
|
||||
valueHexs,
|
||||
rootHashHexs,
|
||||
leafRlpLengthHexLen,
|
||||
leafPathRlpLengthHexLen,
|
||||
leafPathPrefixHexLen,
|
||||
leafPathHexLen,
|
||||
leafValueRlpLengthHexLen,
|
||||
leafValueHexLen,
|
||||
leafRlpHexs,
|
||||
nodeRlpLengthHexLen,
|
||||
nodePathRlpLengthHexLen,
|
||||
nodePathPrefixHexLen,
|
||||
nodePathHexLen,
|
||||
nodeRefHexLen,
|
||||
nodeRlpHexs,
|
||||
nodeTypes,
|
||||
depth
|
||||
]} = MPTInclusionFixedKeyHexLen(8, 64, 66);
|
||||
@@ -1,67 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
PHASE1=../../circuits/pot24_final.ptau
|
||||
BUILD_DIR=../../build/tx_proof
|
||||
CIRCUIT_NAME=tx_proof
|
||||
|
||||
if [ -f "$PHASE1" ]; then
|
||||
echo "Found Phase 1 ptau file"
|
||||
else
|
||||
echo "No Phase 1 ptau file found. Exiting..."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ ! -d "$BUILD_DIR" ]; then
|
||||
echo "No build directory found. Creating build directory..."
|
||||
mkdir "$BUILD_DIR"
|
||||
fi
|
||||
|
||||
echo $PWD
|
||||
|
||||
echo "****COMPILING CIRCUIT****"
|
||||
start=`date +%s`
|
||||
circom "$CIRCUIT_NAME".circom --r1cs --wasm --sym --c --wat --output "$BUILD_DIR"
|
||||
end=`date +%s`
|
||||
echo "DONE ($((end-start))s)"
|
||||
|
||||
echo "****GENERATING WITNESS FOR SAMPLE INPUT****"
|
||||
start=`date +%s`
|
||||
node "$BUILD_DIR"/"$CIRCUIT_NAME"_js/generate_witness.js "$BUILD_DIR"/"$CIRCUIT_NAME"_js/"$CIRCUIT_NAME".wasm input_"$CIRCUIT_NAME".json "$BUILD_DIR"/witness.wtns
|
||||
end=`date +%s`
|
||||
echo "DONE ($((end-start))s)"
|
||||
|
||||
echo "****GENERATING ZKEY 0****"
|
||||
start=`date +%s`
|
||||
NODE_OPTIONS="--max-old-space-size=56000" npx snarkjs groth16 setup -verbose "$BUILD_DIR"/"$CIRCUIT_NAME".r1cs "$PHASE1" "$BUILD_DIR"/"$CIRCUIT_NAME"_0.zkey
|
||||
end=`date +%s`
|
||||
echo "DONE ($((end-start))s)"
|
||||
|
||||
echo "****GENERATING FINAL ZKEY****"
|
||||
start=`date +%s`
|
||||
NODE_OPTIONS="--max-old-space-size=56000" npx snarkjs zkey beacon -verbose "$BUILD_DIR"/"$CIRCUIT_NAME"_0.zkey "$BUILD_DIR"/"$CIRCUIT_NAME".zkey 0102030405060708090a0b0c0d0e0f101112231415161718221a1b1c1d1e1f 10 -n="Final Beacon phase2"
|
||||
end=`date +%s`
|
||||
echo "DONE ($((end-start))s)"
|
||||
|
||||
echo "****VERIFYING FINAL ZKEY****"
|
||||
start=`date +%s`
|
||||
NODE_OPTIONS="--max-old-space-size=56000" npx snarkjs zkey verify -verbose "$BUILD_DIR"/"$CIRCUIT_NAME".r1cs "$PHASE1" "$BUILD_DIR"/"$CIRCUIT_NAME".zkey
|
||||
end=`date +%s`
|
||||
echo "DONE ($((end-start))s)"
|
||||
|
||||
echo "****EXPORTING VKEY****"
|
||||
start=`date +%s`
|
||||
npx snarkjs zkey export verificationkey "$BUILD_DIR"/"$CIRCUIT_NAME".zkey "$BUILD_DIR"/vkey.json
|
||||
end=`date +%s`
|
||||
echo "DONE ($((end-start))s)"
|
||||
|
||||
echo "****GENERATING PROOF FOR SAMPLE INPUT****"
|
||||
start=`date +%s`
|
||||
npx snarkjs groth16 prove "$BUILD_DIR"/"$CIRCUIT_NAME".zkey "$BUILD_DIR"/witness.wtns "$BUILD_DIR"/proof.json "$BUILD_DIR"/public.json
|
||||
end=`date +%s`
|
||||
echo "DONE ($((end-start))s)"
|
||||
|
||||
echo "****VERIFYING PROOF FOR SAMPLE INPUT****"
|
||||
start=`date +%s`
|
||||
npx snarkjs groth16 verify "$BUILD_DIR"/vkey.json "$BUILD_DIR"/public.json "$BUILD_DIR"/proof.json
|
||||
end=`date +%s`
|
||||
echo "DONE ($((end-start))s)"
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,26 +0,0 @@
|
||||
pragma circom 2.0.2;
|
||||
|
||||
include "../../circuits/mpt.circom";
|
||||
|
||||
component main {public [
|
||||
keyHexLen,
|
||||
keyHexs,
|
||||
valueHexLen,
|
||||
valueHexs,
|
||||
rootHashHexs,
|
||||
leafRlpLengthHexLen,
|
||||
leafPathRlpLengthHexLen,
|
||||
leafPathPrefixHexLen,
|
||||
leafPathHexLen,
|
||||
leafValueRlpLengthHexLen,
|
||||
leafValueHexLen,
|
||||
leafRlpHexs,
|
||||
nodeRlpLengthHexLen,
|
||||
nodePathRlpLengthHexLen,
|
||||
nodePathPrefixHexLen,
|
||||
nodePathHexLen,
|
||||
nodeRefHexLen,
|
||||
nodeRlpHexs,
|
||||
nodeTypes,
|
||||
depth
|
||||
]} = MPTInclusionNoBranchTermination(5, 6, 1500);
|
||||
@@ -1,78 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
PHASE1=../../circuits/pot24_final.ptau
|
||||
INPUT_DIR=../input_gen/inputs
|
||||
BUILD_DIR=../../build/tx_test
|
||||
CIRCUIT_NAME=tx_test
|
||||
|
||||
if [ -f "$PHASE1" ]; then
|
||||
echo "Found Phase 1 ptau file"
|
||||
else
|
||||
echo "No Phase 1 ptau file found. Exiting..."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ ! -d "$BUILD_DIR" ]; then
|
||||
echo "No build directory found. Creating build directory..."
|
||||
mkdir "$BUILD_DIR"
|
||||
fi
|
||||
|
||||
echo $PWD
|
||||
|
||||
echo "****COMPILING CIRCUIT****"
|
||||
start=`date +%s`
|
||||
circom "$CIRCUIT_NAME".circom --r1cs --wasm --sym --wat --output "$BUILD_DIR"
|
||||
#circom "$CIRCUIT_NAME".circom --r1cs --wasm --wat --O1 --output "$BUILD_DIR"
|
||||
end=`date +%s`
|
||||
echo "DONE ($((end-start))s)"
|
||||
|
||||
echo "****GENERATING ZKEY 0****"
|
||||
start=`date +%s`
|
||||
NODE_OPTIONS="--max-old-space-size=56000" npx snarkjs groth16 setup "$BUILD_DIR"/"$CIRCUIT_NAME".r1cs "$PHASE1" "$BUILD_DIR"/"$CIRCUIT_NAME"_0.zkey
|
||||
end=`date +%s`
|
||||
echo "DONE ($((end-start))s)"
|
||||
|
||||
echo "****GENERATING FINAL ZKEY****"
|
||||
start=`date +%s`
|
||||
NODE_OPTIONS="--max-old-space-size=56000" npx snarkjs zkey beacon "$BUILD_DIR"/"$CIRCUIT_NAME"_0.zkey "$BUILD_DIR"/"$CIRCUIT_NAME".zkey 0102030405060708090a0b0c0d0e0f101112231415161718221a1b1c1d1e1f 10 -n="Final Beacon phase2"
|
||||
end=`date +%s`
|
||||
echo "DONE ($((end-start))s)"
|
||||
|
||||
echo "****VERIFYING FINAL ZKEY****"
|
||||
start=`date +%s`
|
||||
#NODE_OPTIONS="--max-old-space-size=56000" npx snarkjs zkey verify -verbose "$BUILD_DIR"/"$CIRCUIT_NAME".r1cs "$PHASE1" "$BUILD_DIR"/"$CIRCUIT_NAME".zkey
|
||||
end=`date +%s`
|
||||
echo "DONE ($((end-start))s)"
|
||||
|
||||
echo "****EXPORTING VKEY****"
|
||||
start=`date +%s`
|
||||
npx snarkjs zkey export verificationkey "$BUILD_DIR"/"$CIRCUIT_NAME".zkey "$BUILD_DIR"/vkey.json
|
||||
end=`date +%s`
|
||||
echo "DONE ($((end-start))s)"
|
||||
|
||||
for TX_IDX in {1..196}
|
||||
do
|
||||
echo "****GENERATING WITNESS FOR SAMPLE INPUT $TX_IDX****"
|
||||
start=`date +%s`
|
||||
set -x
|
||||
node "$BUILD_DIR"/"$CIRCUIT_NAME"_js/generate_witness.js "$BUILD_DIR"/"$CIRCUIT_NAME"_js/"$CIRCUIT_NAME".wasm "$INPUT_DIR"/input_tx_pf"$TX_IDX".json "$BUILD_DIR"/witness"$TX_IDX".wtns > "$BUILD_DIR"/log"$TX_IDX".log
|
||||
end=`date +%s`
|
||||
echo "DONE ($((end-start))s)"
|
||||
|
||||
echo "****GENERATING PROOF FOR SAMPLE INPUT****"
|
||||
start=`date +%s`
|
||||
npx snarkjs groth16 prove "$BUILD_DIR"/"$CIRCUIT_NAME".zkey "$BUILD_DIR"/witness"$TX_IDX".wtns "$BUILD_DIR"/proof"$TX_IDX".json "$BUILD_DIR"/public"$TX_IDX".json
|
||||
end=`date +%s`
|
||||
echo "DONE ($((end-start))s)"
|
||||
|
||||
echo "****VERIFYING PROOF FOR SAMPLE INPUT****"
|
||||
start=`date +%s`
|
||||
npx snarkjs groth16 verify "$BUILD_DIR"/vkey.json "$BUILD_DIR"/public"$TX_IDX".json "$BUILD_DIR"/proof"$TX_IDX".json
|
||||
end=`date +%s`
|
||||
echo "DONE ($((end-start))s)"
|
||||
done
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -1,26 +0,0 @@
|
||||
pragma circom 2.0.2;
|
||||
|
||||
include "../../circuits/mpt.circom";
|
||||
|
||||
component main {public [
|
||||
keyHexLen,
|
||||
keyHexs,
|
||||
valueHexLen,
|
||||
valueHexs,
|
||||
rootHashHexs,
|
||||
leafRlpLengthHexLen,
|
||||
leafPathRlpLengthHexLen,
|
||||
leafPathPrefixHexLen,
|
||||
leafPathHexLen,
|
||||
leafValueRlpLengthHexLen,
|
||||
leafValueHexLen,
|
||||
leafRlpHexs,
|
||||
nodeRlpLengthHexLen,
|
||||
nodePathRlpLengthHexLen,
|
||||
nodePathPrefixHexLen,
|
||||
nodePathHexLen,
|
||||
nodeRefHexLen,
|
||||
nodeRlpHexs,
|
||||
nodeTypes,
|
||||
depth
|
||||
]} = MPTInclusionNoBranchTermination(5, 6, 6080);
|
||||
Reference in New Issue
Block a user