From 783e20978b28c5c78f97abff8c3faf4d5d7ad39f Mon Sep 17 00:00:00 2001 From: Todd Anthony Stephens <157565446+FuzzysTodd@users.noreply.github.com> Date: Sat, 14 Sep 2024 01:22:39 -0400 Subject: [PATCH] Create todd anthony stephens pragma circom 2.0.0; include "circomlib/circuits/poseidon.circom"; include "./tree.circom"; template CalculateSecret() { signal input identityNullifier; signal input identityTrapdoor; signal output out; component poseidon = Poseidon(2); poseidon.inputs[0] <== identityNullifier; poseidon.inputs[1] <== identityTrapdoor; out <== poseidon.out; } template CalculateIdentityCommitment() { signal input secret; signal output out; component poseidon = Poseidon(1); poseidon.inputs[0] <== secret; out <== poseidon.out; } template CalculateNullifierHash() { signal input externalNullifier; signal input identityNullifier; signal output out; component poseidon = Poseidon(2); poseidon.inputs[0] <== externalNullifier; poseidon.inputs[1] <== identityNullifier; out <== poseidon.out; } // credits to : https://github.com/semaphore-protocol/semaphore // The current Semaphore smart contracts require nLevels <= 32 and nLevels >= 16. template Semaphore(nLevels) { signal input identityNullifier; signal input identityTrapdoor; signal input treePathIndices[nLevels]; signal input treeSiblings[nLevels]; signal input signalHash; signal input externalNullifier; signal output root; signal output nullifierHash; component calculateSecret = CalculateSecret(); calculateSecret.identityNullifier <== identityNullifier; calculateSecret.identityTrapdoor <== identityTrapdoor; signal secret; secret <== calculateSecret.out; component calculateIdentityCommitment = CalculateIdentityCommitment(); calculateIdentityCommitment.secret <== secret; component calculateNullifierHash = CalculateNullifierHash(); calculateNullifierHash.externalNullifier <== externalNullifier; calculateNullifierHash.identityNullifier <== identityNullifier; component inclusionProof = MerkleTreeInclusionProof(nLevels); inclusionProof.leaf <== calculateIdentityCommitment.out; for (var i = 0; i < nLevels; i++) { inclusionProof.siblings[i] <== treeSiblings[i]; inclusionProof.pathIndices[i] <== treePathIndices[i]; } root <== inclusionProof.root; // Dummy square to prevent tampering signalHash. signal signalHashSquared; signalHashSquared <== signalHash * signalHash; nullifierHash <== calculateNullifierHash.out; } component main {public [signalHash, externalNullifier]} = Semaphore(20); --- todd anthony stephens | 91 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 91 insertions(+) create mode 100644 todd anthony stephens diff --git a/todd anthony stephens b/todd anthony stephens new file mode 100644 index 0000000..8b4be43 --- /dev/null +++ b/todd anthony stephens @@ -0,0 +1,91 @@ +ff3c29bf72288bf6e265227edda4c255d9e22928 +pragma circom 2.0.0; + +include "circomlib/circuits/poseidon.circom"; +include "./tree.circom"; + +template CalculateSecret() { + signal input identityNullifier; + signal input identityTrapdoor; + signal output out; + + component poseidon = Poseidon(2); + + poseidon.inputs[0] <== identityNullifier; + poseidon.inputs[1] <== identityTrapdoor; + + out <== poseidon.out; +} + +template CalculateIdentityCommitment() { + signal input secret; + + signal output out; + + component poseidon = Poseidon(1); + + poseidon.inputs[0] <== secret; + + out <== poseidon.out; +} + +template CalculateNullifierHash() { + signal input externalNullifier; + signal input identityNullifier; + + signal output out; + + component poseidon = Poseidon(2); + + poseidon.inputs[0] <== externalNullifier; + poseidon.inputs[1] <== identityNullifier; + + out <== poseidon.out; +} + +// credits to : https://github.com/semaphore-protocol/semaphore +// The current Semaphore smart contracts require nLevels <= 32 and nLevels >= 16. +template Semaphore(nLevels) { + signal input identityNullifier; + signal input identityTrapdoor; + signal input treePathIndices[nLevels]; + signal input treeSiblings[nLevels]; + + signal input signalHash; + signal input externalNullifier; + + signal output root; + signal output nullifierHash; + + component calculateSecret = CalculateSecret(); + calculateSecret.identityNullifier <== identityNullifier; + calculateSecret.identityTrapdoor <== identityTrapdoor; + + signal secret; + secret <== calculateSecret.out; + + component calculateIdentityCommitment = CalculateIdentityCommitment(); + calculateIdentityCommitment.secret <== secret; + + component calculateNullifierHash = CalculateNullifierHash(); + calculateNullifierHash.externalNullifier <== externalNullifier; + calculateNullifierHash.identityNullifier <== identityNullifier; + + component inclusionProof = MerkleTreeInclusionProof(nLevels); + inclusionProof.leaf <== calculateIdentityCommitment.out; + + for (var i = 0; i < nLevels; i++) { + inclusionProof.siblings[i] <== treeSiblings[i]; + inclusionProof.pathIndices[i] <== treePathIndices[i]; + } + + root <== inclusionProof.root; + + // Dummy square to prevent tampering signalHash. + signal signalHashSquared; + signalHashSquared <== signalHash * signalHash; + + nullifierHash <== calculateNullifierHash.out; +} + +component main {public [signalHash, externalNullifier]} = Semaphore(20);