diff --git a/circuits/withdraw.circom b/circuits/withdraw.circom index c33c25c..16c23df 100644 --- a/circuits/withdraw.circom +++ b/circuits/withdraw.circom @@ -3,49 +3,61 @@ WARNING: WIP, very initial version of the miksi circuit - +--------+ -PUB_coinCode+------->+ | - | | +----+ -PUB_amount+--------->+Poseidon+------->+ == +<-----+PUB_commitment - | | +----+ -PRI_secret+--------->+ | - +--------+ - +----+ -PUB_address+--->+ != +<---+0 - +----+ + + +----------+ + | | +PUB_nullifier+------>+----------+ | | +PUB_coinCode+------->+ | | SMT +<------+PRI_siblings + | | | Poseidon | +PUB_amount+--------->+ Poseidon +------------->+ Verifier | + | | | +<------+PUB_root +PRI_secret+--------->+ | | | + + +----------+ +----------+ | + | + +----+ +----+ | + PUB_address+--->+ != +<-------+0+------>+ != +<-------+ + +----+ +----+ */ -include "../node_modules/circomlib/circuits/babyjub.circom"; include "../node_modules/circomlib/circuits/comparators.circom"; include "../node_modules/circomlib/circuits/poseidon.circom"; -include "../node_modules/circomlib/circuits/bitify.circom"; include "../node_modules/circomlib/circuits/smt/smtverifier.circom"; -include "../node_modules/circomlib/circuits/smt/smtprocessor.circom"; -template Withdraw() { +template Withdraw(nLevels) { signal input coinCode; signal input amount; - signal input commitment; signal private input secret; + signal input nullifier; + signal private input siblings[nLevels]; + signal input root; signal input address; - component hash = Poseidon(3, 6, 8, 57); + component hash = Poseidon(4, 6, 8, 57); hash.inputs[0] <== coinCode; hash.inputs[1] <== amount; hash.inputs[2] <== secret; - - component eq = IsEqual(); - eq.in[0] <== hash.out; - eq.in[1] <== commitment; - eq.out === 1; + hash.inputs[3] <== nullifier; 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