From 9ecc6b1a9f83cdba05448c76312f177cfe0601ab Mon Sep 17 00:00:00 2001 From: Davi Bauer Date: Thu, 22 Jun 2023 17:20:15 -0300 Subject: [PATCH] Integrated poseidon into merkle tree --- .github/workflows/contracts-checks.yml | 21 ++++++++---- .gitignore | 3 +- .../groth16-verifier/src/ejs/lib.ejs.repl | 2 +- contracts/merkle-tree/src/ejs/lib.ejs.repl | 32 ++++++++----------- contracts/merkle-tree/tests/merkle-tests.repl | 7 ++++ contracts/package.json | 6 ++-- contracts/poseidon/src/ejs/lib.ejs.repl | 2 +- 7 files changed, 42 insertions(+), 31 deletions(-) create mode 100644 contracts/merkle-tree/tests/merkle-tests.repl diff --git a/.github/workflows/contracts-checks.yml b/.github/workflows/contracts-checks.yml index c62e75d6..0fb4d64f 100644 --- a/.github/workflows/contracts-checks.yml +++ b/.github/workflows/contracts-checks.yml @@ -30,23 +30,30 @@ jobs: npm install -g pnpm pnpm install + # Generate modules + - name: Run generate-plonk run: pnpm contracts generate-plonk - - name: Run test-plonk - run: pnpm contracts test-plonk - - name: Run generate-groth16 run: pnpm contracts generate-groth16 - - name: Run test-groth16 - run: pnpm contracts test-groth16 + - name: Run generate-poseidon + run: pnpm contracts generate-poseidon - name: Run generate-merkle run: pnpm contracts generate-merkle - - name: Run generate-poseidon - run: pnpm contracts generate-poseidon + # Test modules + + - name: Run test-plonk + run: pnpm contracts test-plonk + + - name: Run test-groth16 + run: pnpm contracts test-groth16 - name: Run test-poseidon run: pnpm contracts test-poseidon + + - name: Run test-merkle + run: pnpm contracts test-merkle \ No newline at end of file diff --git a/.gitignore b/.gitignore index 7eaa9fa8..3e826512 100644 --- a/.gitignore +++ b/.gitignore @@ -24,4 +24,5 @@ lib.repl *.env **/.env **/node_modules -pact \ No newline at end of file +pact +scripts \ No newline at end of file diff --git a/contracts/groth16-verifier/src/ejs/lib.ejs.repl b/contracts/groth16-verifier/src/ejs/lib.ejs.repl index f805ea4d..cd69b5d2 100644 --- a/contracts/groth16-verifier/src/ejs/lib.ejs.repl +++ b/contracts/groth16-verifier/src/ejs/lib.ejs.repl @@ -1,4 +1,4 @@ -(module plonk MODULE_ADMIN +(module groth16 MODULE_ADMIN (defcap MODULE_ADMIN () true) (defschema G1Point diff --git a/contracts/merkle-tree/src/ejs/lib.ejs.repl b/contracts/merkle-tree/src/ejs/lib.ejs.repl index 3586b0ea..ec732019 100644 --- a/contracts/merkle-tree/src/ejs/lib.ejs.repl +++ b/contracts/merkle-tree/src/ejs/lib.ejs.repl @@ -3,11 +3,11 @@ (defschema FilledSubtreesSchema "Schema for the filledSubtrees table" - value:string) + value:integer) (defschema RootsSchema "Schema for the roots table" - value:string) + value:integer) (defschema StateSchema "Schema for the config table" @@ -31,14 +31,14 @@ (defun set-next-index (next_index:integer) (update state "0" {"next_index": next_index})) - (defun set-filled-subtrees (key:string value:string) + (defun set-filled-subtrees (key:string value:integer) (write filledSubtrees key { "value": value })) - (defun insert-root (key:string value:string) + (defun insert-root (key:string value:integer) (write roots key { "value": value })) - (defun my-hash (left:string right:string) - (hash (+ left right))) + (defun poseidon-hash (left:integer right:integer) + (poseidon.poseidon [left right])) (defun initialize() <% for (let i = 0; i < level; i++) { %> @@ -55,18 +55,18 @@ (defun zeros (i:integer) (if (= i 0) - "D9kjyl5yGMS6PDgBwmphfs2_2uu5x2zi7KFm54Ve-7g" ; (hash "0") + 3193090221241211970002919215846211184824251841300455796635909287157453409439 ; (hash "0") zeroElement (if (= i 1) - "s1sm9e2GFnqacffSdC5KpjHwqIzD2Ocr5pGGpgktnJk" ; (hash (+ "D9kjyl5yGMS6PDgBwmphfs2_2uu5x2zi7KFm54Ve" "D9kjyl5yGMS6PDgBwmphfs2_2uu5x2zi7KFm54Ve")) + 5537318983262243501092567777293783139848264067255984381952191910128890964680 ; (hash (+ "3193090221241211970002919215846211184824251841300455796635909287157453409439" "3193090221241211970002919215846211184824251841300455796635909287157453409439")) (if (= i 2) - "-yuQcXs9Wr_GOZTpN6UG1RhjBULGWEL22v_9jyVZ_ss" ; (hash (+ "s1sm9e2GFnqacffSdC5KpjHwqIzD2Ocr5pGGpgktnJk" "s1sm9e2GFnqacffSdC5KpjHwqIzD2Ocr5pGGpgktnJk")) + 7303590454072865666193218918548579953037841327389857351908320529561587029886 ; (hash (+ "5537318983262243501092567777293783139848264067255984381952191910128890964680" "5537318983262243501092567777293783139848264067255984381952191910128890964680")) "" ) ) ) ) - (defun insert-leaf (leaf:string) + (defun insert-leaf (leaf:integer) ( let* ( @@ -80,7 +80,7 @@ (filled_subtrees (at 'value (read filledSubtrees "<%= i - 1 %>"))) (lr_<%= i %> (if (= (mod current_index 2) 0) - {"left": current_level_hash, "right": (zeros <%= i -1 %>)} + {"left": current_level_hash, "right": (zeros <%= i - 1 %>)} {"left": filled_subtrees, "right": current_level_hash} )) @@ -89,7 +89,7 @@ (list (zeros <%= i - 1 %>))) )) - (current_level_hash (my-hash (at 'left lr_<%= i %>) (at 'right lr_<%= i %>))) + (current_level_hash (poseidon-hash (at 'left lr_<%= i %>) (at 'right lr_<%= i %>))) (current_index (/ current_index 2)) <% } %> @@ -107,13 +107,7 @@ (set-filled-subtrees "<%= i %>" (at <%= i %> hashes)) ) <% } %> - { - "root": current_level_hash, - "state": { - "current_root_index": new_root_index, - "next_index": (+ next-index 1) - } - } + current_level_hash ) ) ) diff --git a/contracts/merkle-tree/tests/merkle-tests.repl b/contracts/merkle-tree/tests/merkle-tests.repl new file mode 100644 index 00000000..6b825d5b --- /dev/null +++ b/contracts/merkle-tree/tests/merkle-tests.repl @@ -0,0 +1,7 @@ +(load "../../poseidon/src/lib.repl") +(load "../src/lib.repl") + +(expect "merkle" 20211649699328972427040417540848848882630537175401544736520822735123291360599 (insert-leaf 1)) +(expect "merkle" 10432624530112658362661942458029986103228559979322390538181807469641977050330 (insert-leaf 2)) +(expect "merkle" 17673813253184655362744115372752093680139333872142827168176649842069470193038 (insert-leaf 3)) +(expect "merkle" 19902585034578372203168006768193534455972092212577590957934236606898171441729 (insert-leaf 4)) \ No newline at end of file diff --git a/contracts/package.json b/contracts/package.json index 3c83e355..e8abe788 100644 --- a/contracts/package.json +++ b/contracts/package.json @@ -4,10 +4,12 @@ "scripts": { "generate-plonk": "pnpm ejs ./plonk-verifier/src/ejs/lib.ejs.repl -f ./plonk-verifier/src/ejs/sample.verifier.json -o ./plonk-verifier/src/lib.repl", "generate-groth16": "pnpm ejs ./groth16-verifier/src/ejs/lib.ejs.repl -f ./groth16-verifier/src/ejs/sample.verifier.json -o ./groth16-verifier/src/lib.repl", + "generate-poseidon": "pnpm ejs ./poseidon/src/ejs/lib.ejs.repl -f ./poseidon/src/ejs/data.json -o ./poseidon/src/lib.repl", + "generate-merkle": "pnpm ejs ./merkle-tree/src/ejs/lib.ejs.repl -f ./merkle-tree/src/ejs/data.json -o ./merkle-tree/src/lib.repl", "test-plonk": "pact plonk-verifier/tests/plonk-tests.repl", "test-groth16": "pact groth16-verifier/tests/groth16-tests.repl", - "generate-merkle": "pnpm ejs ./merkle-tree/src/ejs/lib.ejs.repl -f ./merkle-tree/src/ejs/data.json -o ./merkle-tree/src/lib.repl", - "generate-poseidon": "pnpm ejs ./poseidon/src/ejs/lib.ejs.repl -f ./poseidon/src/ejs/data.json -o ./poseidon/src/lib.repl" + "test-poseidon": "pact poseidon/tests/poseidon-tests.repl", + "test-merkle": "pact merkle-tree/tests/merkle-tests.repl" }, "dependencies": { "ejs": "^3.1.9" diff --git a/contracts/poseidon/src/ejs/lib.ejs.repl b/contracts/poseidon/src/ejs/lib.ejs.repl index f4622765..cb5eaed2 100644 --- a/contracts/poseidon/src/ejs/lib.ejs.repl +++ b/contracts/poseidon/src/ejs/lib.ejs.repl @@ -1,4 +1,4 @@ -(module plonk MODULE_ADMIN +(module poseidon MODULE_ADMIN (defcap MODULE_ADMIN () true) (defun sigma(in:integer)