From 95b6a2728f090eea811bffac4bdf100cf4b48981 Mon Sep 17 00:00:00 2001 From: Yi Sun Date: Thu, 10 Mar 2022 19:02:50 -0500 Subject: [PATCH] SubArray: Specify bits --- .gitignore | 3 +- circuits/mpt.circom | 40 ++++++++++++++-------- scripts/punk_test/build_punk_storage_pf.sh | 6 ++-- 3 files changed, 31 insertions(+), 18 deletions(-) diff --git a/.gitignore b/.gitignore index c17534b..6e30f2c 100644 --- a/.gitignore +++ b/.gitignore @@ -4,4 +4,5 @@ pot*.ptau INFURA_ID *.swp -*~ \ No newline at end of file +*~ +*.sym \ No newline at end of file diff --git a/circuits/mpt.circom b/circuits/mpt.circom index 883d3d5..c4da286 100644 --- a/circuits/mpt.circom +++ b/circuits/mpt.circom @@ -16,6 +16,7 @@ function max(a, b) { template LeafCheck(maxKeyHexLen, maxValueHexLen) { var maxLeafRlpHexLen = 4 + (maxKeyHexLen + 2) + 4 + maxValueHexLen; + var LEAF_BITS = log_ceil(maxLeafRlpHexLen); // FIXME: Differentiate between cases where keyLen is 0 and where the prefix+nibble is '1b' signal input keyNibbleHexLen; @@ -74,7 +75,7 @@ template LeafCheck(maxKeyHexLen, maxValueHexLen) { // * [ignore] check validity of path prefix // * check path matches keyNibbles - component leaf_to_path = SubArray(maxLeafRlpHexLen, maxKeyHexLen, 252); + component leaf_to_path = SubArray(maxLeafRlpHexLen, maxKeyHexLen, LEAF_BITS); for (var idx = 0; idx < maxLeafRlpHexLen; idx++) { leaf_to_path.in[idx] <== leafRlpHexs[idx]; } @@ -96,7 +97,7 @@ template LeafCheck(maxKeyHexLen, maxValueHexLen) { key_path <== key_path_len_match.out * key_path_match.out; // * check value matches valueBits - component leaf_to_value = SubArray(maxLeafRlpHexLen, maxValueHexLen, 252); + component leaf_to_value = SubArray(maxLeafRlpHexLen, maxValueHexLen, LEAF_BITS); for (var idx = 0; idx < maxLeafRlpHexLen; idx++) { leaf_to_value.in[idx] <== leafRlpHexs[idx]; } @@ -120,6 +121,7 @@ template LeafCheck(maxKeyHexLen, maxValueHexLen) { template ExtensionCheck(maxKeyHexLen, maxNodeRefHexLen) { var maxExtensionRlpHexLen = 4 + 2 + maxKeyHexLen + 2 + maxNodeRefHexLen; + var EXTENSION_BITS = log_ceil(maxExtensionRlpHexLen); signal input keyNibbleHexLen; signal input keyNibbleHexs[maxKeyHexLen]; @@ -176,7 +178,7 @@ template ExtensionCheck(maxKeyHexLen, maxNodeRefHexLen) { // * [ignore] check validity of RLP encoding // * [ignore] check validity of path prefix // * check path contains nibbles of key - component extension_to_path = SubArray(maxExtensionRlpHexLen, maxKeyHexLen, 252); + component extension_to_path = SubArray(maxExtensionRlpHexLen, maxKeyHexLen, EXTENSION_BITS); for (var idx = 0; idx < maxExtensionRlpHexLen; idx++) { extension_to_path.in[idx] <== nodeRlpHexs[idx]; } @@ -198,7 +200,7 @@ template ExtensionCheck(maxKeyHexLen, maxNodeRefHexLen) { key_path <== key_path_len_match.out * key_path_match.out; // * check node_ref matches child - component extension_to_node_ref = SubArray(maxExtensionRlpHexLen, maxNodeRefHexLen, 252); + component extension_to_node_ref = SubArray(maxExtensionRlpHexLen, maxNodeRefHexLen, EXTENSION_BITS); for (var idx = 0; idx < maxExtensionRlpHexLen; idx++) { extension_to_node_ref.in[idx] <== nodeRlpHexs[idx]; } @@ -229,6 +231,7 @@ template ExtensionCheck(maxKeyHexLen, maxNodeRefHexLen) { template BranchFixedKeyHexLen(maxNodeRefHexLen) { var maxBranchRlpHexLen = 1064; + var BRANCH_BITS = 11; signal input keyNibble; @@ -293,7 +296,7 @@ template BranchFixedKeyHexLen(maxNodeRefHexLen) { nodeRefLenSelector.sel <== keyNibble; // find the node_ref at the index of nibble - component branch_to_node_ref = SubArray(maxBranchRlpHexLen, maxNodeRefHexLen, 252); + component branch_to_node_ref = SubArray(maxBranchRlpHexLen, maxNodeRefHexLen, BRANCH_BITS); for (var idx = 0; idx < maxBranchRlpHexLen; idx++) { branch_to_node_ref.in[idx] <== nodeRlpHexs[idx]; } @@ -320,6 +323,7 @@ template BranchFixedKeyHexLen(maxNodeRefHexLen) { template EmptyTerminalBranchCheck(maxNodeRefHexLen, maxValueHexLen) { var maxBranchRlpHexLen = 1064; + var BRANCH_BITS = 11; signal input keyNibble; @@ -393,7 +397,7 @@ template EmptyTerminalBranchCheck(maxNodeRefHexLen, maxValueHexLen) { nodeRefLenSelector.sel <== keyNibble; // find the node_ref at the index of nibble / value - component branch_to_node_ref = SubArray(maxBranchRlpHexLen, maxNodeRefHexLen, 252); + component branch_to_node_ref = SubArray(maxBranchRlpHexLen, maxNodeRefHexLen, BRANCH_BITS); for (var idx = 0; idx < maxBranchRlpHexLen; idx++) { branch_to_node_ref.in[idx] <== nodeRlpHexs[idx]; } @@ -420,6 +424,7 @@ template EmptyTerminalBranchCheck(maxNodeRefHexLen, maxValueHexLen) { template NonTerminalBranchCheck(maxNodeRefHexLen, maxValueHexLen) { var maxBranchRlpHexLen = 1064 + 2 + maxValueHexLen; + var BRANCH_BITS = log_ceil(maxBranchRlpHexLen); signal input keyNibble; @@ -499,7 +504,7 @@ template NonTerminalBranchCheck(maxNodeRefHexLen, maxValueHexLen) { nodeRefLenSelector.sel <== keyNibble; // find the node_ref at the index of nibble / value - component branch_to_node_ref = SubArray(maxBranchRlpHexLen, maxNodeRefHexLen, 252); + component branch_to_node_ref = SubArray(maxBranchRlpHexLen, maxNodeRefHexLen, BRANCH_BITS); for (var idx = 0; idx < maxBranchRlpHexLen; idx++) { branch_to_node_ref.in[idx] <== nodeRlpHexs[idx]; } @@ -526,6 +531,7 @@ template NonTerminalBranchCheck(maxNodeRefHexLen, maxValueHexLen) { template TerminalBranchCheck(maxNodeRefHexLen, maxValueHexLen) { var maxBranchRlpHexLen = 1064 + 2 + maxValueHexLen; + var BRANCH_BITS = log_ceil(maxBranchRlpHexLen); signal input valueHexLen; signal input valueHexs[maxValueHexLen]; @@ -592,7 +598,7 @@ template TerminalBranchCheck(maxNodeRefHexLen, maxValueHexLen) { valueStartHexIdx <== 2 + nodeRlpLengthHexLen + 2 + 2 * 16 + nodeValueLenHexLen[0] + nodeValueLenHexLen[1] + nodeValueLenHexLen[2] + nodeValueLenHexLen[3] + nodeValueLenHexLen[4] + nodeValueLenHexLen[5] + nodeValueLenHexLen[6] + nodeValueLenHexLen[7] + nodeValueLenHexLen[8] + nodeValueLenHexLen[9] + nodeValueLenHexLen[10] + nodeValueLenHexLen[11] + nodeValueLenHexLen[12] + nodeValueLenHexLen[13] + nodeValueLenHexLen[14] + nodeValueLenHexLen[15] + nodeVtRlpLenHexLen; // check vt matches value - component branch_to_value = SubArray(maxBranchRlpHexLen, maxValueHexLen, 252); + component branch_to_value = SubArray(maxBranchRlpHexLen, maxValueHexLen, BRANCH_BITS); for (var idx = 0; idx < maxBranchRlpHexLen; idx++) { branch_to_value.in[idx] <== nodeRlpHexs[idx]; } @@ -624,6 +630,8 @@ template MPTInclusionFixedKeyHexLen(maxDepth, keyHexLen, maxValueHexLen) { var maxLeafRlpHexLen = 4 + (keyHexLen + 2) + 4 + maxValueHexLen; var maxBranchRlpHexLen = 1064; var maxExtensionRlpHexLen = 4 + 2 + keyHexLen + 2 + 64; + + var KEY_BITS = log_ceil(keyHexLen); signal input keyHexs[keyHexLen]; signal input valueHexs[maxValueHexLen]; @@ -742,7 +750,7 @@ template MPTInclusionFixedKeyHexLen(maxDepth, keyHexLen, maxValueHexLen) { } leafStartSelector.sel <== depth - 1; - component leafSelector = SubArray(keyHexLen, keyHexLen, 252); + component leafSelector = SubArray(keyHexLen, keyHexLen, KEY_BITS); for (var idx = 0; idx < keyHexLen; idx++) { leafSelector.in[idx] <== keyHexs[idx]; } @@ -780,7 +788,7 @@ template MPTInclusionFixedKeyHexLen(maxDepth, keyHexLen, maxValueHexLen) { for (var layer = 0; layer < maxDepth - 1; layer++) { exts[layer] = ExtensionCheck(keyHexLen, 64); - extKeySelectors[layer] = SubArray(keyHexLen, keyHexLen, 252); + extKeySelectors[layer] = SubArray(keyHexLen, keyHexLen, KEY_BITS); for (var idx = 0; idx < keyHexLen; idx++) { extKeySelectors[layer].in[idx] <== keyHexs[idx]; } @@ -878,6 +886,8 @@ template MPTInclusion(maxDepth, maxKeyHexLen, maxValueHexLen) { var maxNodeRefHexLen = 64; var maxExtensionRlpHexLen = 4 + 2 + maxKeyHexLen + 2 + maxNodeRefHexLen; + var KEY_BITS = log_ceil(maxKeyHexLen); + signal input keyHexLen; signal input keyHexs[maxKeyHexLen]; @@ -1018,7 +1028,7 @@ template MPTInclusion(maxDepth, maxKeyHexLen, maxValueHexLen) { } leafStartSelector.sel <== depth - 1; - component leafSelector = SubArray(maxKeyHexLen, maxKeyHexLen, 252); + component leafSelector = SubArray(maxKeyHexLen, maxKeyHexLen, KEY_BITS); for (var idx = 0; idx < maxKeyHexLen; idx++) { leafSelector.in[idx] <== keyHexs[idx]; } @@ -1072,7 +1082,7 @@ template MPTInclusion(maxDepth, maxKeyHexLen, maxValueHexLen) { for (var layer = 0; layer < maxDepth - 1; layer++) { exts[layer] = ExtensionCheck(maxKeyHexLen, 64); - extKeySelectors[layer] = SubArray(maxKeyHexLen, maxKeyHexLen, 252); + extKeySelectors[layer] = SubArray(maxKeyHexLen, maxKeyHexLen, KEY_BITS); for (var idx = 0; idx < maxKeyHexLen; idx++) { extKeySelectors[layer].in[idx] <== keyHexs[idx]; } @@ -1173,6 +1183,8 @@ template MPTInclusionNoBranchTermination(maxDepth, maxKeyHexLen, maxValueHexLen) var maxNodeRefHexLen = 64; var maxExtensionRlpHexLen = 4 + 2 + maxKeyHexLen + 2 + maxNodeRefHexLen; + var KEY_BITS = log_ceil(maxKeyHexLen); + signal input keyHexLen; signal input keyHexs[maxKeyHexLen]; @@ -1289,7 +1301,7 @@ template MPTInclusionNoBranchTermination(maxDepth, maxKeyHexLen, maxValueHexLen) } leafStartSelector.sel <== depth - 1; - component leafSelector = SubArray(maxKeyHexLen, maxKeyHexLen, 252); + component leafSelector = SubArray(maxKeyHexLen, maxKeyHexLen, KEY_BITS); for (var idx = 0; idx < maxKeyHexLen; idx++) { leafSelector.in[idx] <== keyHexs[idx]; } @@ -1327,7 +1339,7 @@ template MPTInclusionNoBranchTermination(maxDepth, maxKeyHexLen, maxValueHexLen) for (var layer = 0; layer < maxDepth - 1; layer++) { exts[layer] = ExtensionCheck(maxKeyHexLen, 64); - extKeySelectors[layer] = SubArray(maxKeyHexLen, maxKeyHexLen, 252); + extKeySelectors[layer] = SubArray(maxKeyHexLen, maxKeyHexLen, KEY_BITS); for (var idx = 0; idx < maxKeyHexLen; idx++) { extKeySelectors[layer].in[idx] <== keyHexs[idx]; } diff --git a/scripts/punk_test/build_punk_storage_pf.sh b/scripts/punk_test/build_punk_storage_pf.sh index bfcd252..aa6d1d1 100755 --- a/scripts/punk_test/build_punk_storage_pf.sh +++ b/scripts/punk_test/build_punk_storage_pf.sh @@ -28,13 +28,13 @@ 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_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" +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)" @@ -46,7 +46,7 @@ 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 +npx snarkjs zkey export verificationkey "$BUILD_DIR"/"$CIRCUIT_NAME".zkey "$BUILD_DIR"/vkey.json end=`date +%s` echo "DONE ($((end-start))s)"