Refactor: Remove eth2 and old run scripts

This commit is contained in:
Yi Sun
2022-04-21 07:00:42 +00:00
parent b033caca53
commit 0398e845ae
25 changed files with 578 additions and 4416 deletions

View File

@@ -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

View File

@@ -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);
}

View File

@@ -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',

View File

@@ -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",

View File

@@ -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);

View File

@@ -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)"

View File

@@ -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]}

View File

@@ -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)"

View File

@@ -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)"

View File

@@ -1,8 +0,0 @@
pragma circom 2.0.2;
include "../../circuits/eth2.circom";
component main {public [blockHash,
address,
slot
]} = EthAddressStorageProof2(8, 8);

View File

@@ -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)"

View File

@@ -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
}

View File

@@ -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)"

View File

@@ -1,5 +0,0 @@
pragma circom 2.0.2;
include "../../circuits/eth2.circom";
component main = EthBlockHashHex2();

View File

@@ -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

View File

@@ -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);

View File

@@ -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)"

View File

@@ -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]}

View File

@@ -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);

View File

@@ -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

View File

@@ -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);

View File

@@ -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

View File

@@ -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);