Open this in zkREPL →
This file can be included into other zkREPLs with include "gist:1117e8e808bc0519e38ddeba248b7368";
Open this in zkREPL →
This file can be included into other zkREPLs with include "gist:1117e8e808bc0519e38ddeba248b7368";
pragma circom 2.1.4; | |
include "circomlib/poseidon.circom"; | |
// include "https://github.com/0xPARC/circom-secp256k1/blob/master/circuits/bigint.circom"; | |
template Secret2Public () { | |
signal input sk; | |
signal output pk; | |
component poseidon = Poseidon(1); // the input of poseidon hash is the number of variables you want to hash, normally one or two | |
poseidon.inputs[0] <== sk; | |
pk <== poseidon.out; | |
log("pk:", pk); | |
} | |
template Sign(){ | |
signal input m; | |
signal input sk; // private | |
signal output pk; | |
component checker = Secret2Public(); | |
checker.sk <== sk; | |
pk <== checker.pk; | |
} | |
template GroupSign(n){ | |
signal input m; | |
signal input sk; // private | |
signal input pk[n]; | |
component checker = Secret2Public(); | |
checker.sk <== sk; | |
signal zeroChecker[n+1]; | |
zeroChecker[0] <== 1; | |
for(var i = 0; i < n; i++){ | |
// the following line is not work because cirom cannot multiple more than 2-order to one variable | |
// and the self multiple is not allowed,too | |
// zeroChecker <== zeroChecker * (pk[i] - checker.pk); | |
zeroChecker[i+1] <== zeroChecker[i] * (pk[i] - checker.pk); | |
} | |
zeroChecker[n] === 0; | |
} | |
component main = GroupSign(5); | |
/* INPUT = { | |
"m": "3", | |
"sk": "5", | |
"pk": ["19065150524771031435284970883882288895168425523179566388456001105768498065277", | |
"2", | |
"3", | |
"4", | |
"5"] | |
} */ |