/*
|
|
# withdraw.circom
|
|
|
|
WARNING: WIP, very initial version of the miksi circuit
|
|
|
|
|
|
+----------+
|
|
| |
|
|
PRI_secret+--------->+ Poseidon +<------+PRI_key+---------+
|
|
| | | |
|
|
| +----------+ +----+ |
|
|
| nullifier+----->+ != +<-----+0 |
|
|
| + +----+ v
|
|
| | +--+-------+
|
|
| v | |
|
|
| +-----+----+ | |
|
|
+--------->+ | | SMT +<------+PRI_siblings
|
|
| +--------------------->+ Poseidon |
|
|
PUB_coinCode+------->+ Poseidon | | Verifier |
|
|
| | | +<------+PUB_root
|
|
PUB_amount+--------->+ | | | +
|
|
+----------+ +----------+ |
|
|
|
|
|
|
|
|
+----+ +----+ |
|
|
PUB_address+--->+ != +<-------+0+-------------->+ != +<-------+
|
|
+----+ +----+
|
|
|
|
|
|
|
|
*/
|
|
|
|
include "../node_modules/circomlib/circuits/comparators.circom";
|
|
include "../node_modules/circomlib/circuits/poseidon.circom";
|
|
include "../node_modules/circomlib/circuits/smt/smtverifier.circom";
|
|
|
|
template Withdraw(nLevels) {
|
|
signal input coinCode;
|
|
signal input amount;
|
|
signal private input secret;
|
|
signal input nullifier;
|
|
signal private input siblings[nLevels];
|
|
signal input root;
|
|
signal input address;
|
|
signal private input key;
|
|
|
|
component nullifierCmp = Poseidon(2, 6, 8, 57);
|
|
nullifierCmp.inputs[0] <== key;
|
|
nullifierCmp.inputs[1] <== secret;
|
|
|
|
component nullifierCheck = IsEqual();
|
|
nullifierCheck.in[0] <== nullifierCmp.out;
|
|
nullifierCheck.in[1] <== nullifier;
|
|
nullifierCheck.out === 1;
|
|
|
|
component hash = Poseidon(4, 6, 8, 57);
|
|
hash.inputs[0] <== coinCode;
|
|
hash.inputs[1] <== amount;
|
|
hash.inputs[2] <== secret;
|
|
hash.inputs[3] <== nullifierCmp.out;
|
|
|
|
component z = IsZero();
|
|
z.in <== address;
|
|
z.out === 0;
|
|
|
|
component smtV = SMTVerifier(nLevels);
|
|
smtV.enabled <== 1;
|
|
smtV.fnc <== 0;
|
|
smtV.root <== root;
|
|
for (var i=0; i<nLevels; i++) {
|
|
smtV.siblings[i] <== siblings[i];
|
|
}
|
|
smtV.oldKey <== 0;
|
|
smtV.oldValue <== 0;
|
|
smtV.isOld0 <== 0;
|
|
smtV.key <== key;
|
|
smtV.value <== hash.out;
|
|
}
|