Merge pull request #1 from worldcoin/philsippl/extract_external_nullifier
extract external_nullifier calculation
This commit is contained in:
commit
9b8988419d
13
README.md
13
README.md
|
@ -32,21 +32,22 @@ let (_, leaf) = id.commitment().to_bytes_be();
|
||||||
tree.set(0, leaf.into());
|
tree.set(0, leaf.into());
|
||||||
|
|
||||||
let merkle_proof = tree.proof(0).expect("proof should exist");
|
let merkle_proof = tree.proof(0).expect("proof should exist");
|
||||||
let root = tree.root().into();
|
let root = tree.root();
|
||||||
|
|
||||||
// change signal and external_nullifier here
|
// change signal and external_nullifier here
|
||||||
let signal = "hello".as_bytes();
|
let signal = "xxx".as_bytes();
|
||||||
let external_nullifier = "123".as_bytes();
|
let external_nullifier = "appId".as_bytes();
|
||||||
|
|
||||||
let nullifier_hash = generate_nullifier_hash(&id, external_nullifier);
|
let external_nullifier_hash = hash_external_nullifier(external_nullifier);
|
||||||
|
let nullifier_hash = generate_nullifier_hash(&id, &external_nullifier_hash);
|
||||||
|
|
||||||
let config = SnarkFileConfig {
|
let config = SnarkFileConfig {
|
||||||
zkey: "./semaphore/build/snark/semaphore_final.zkey".to_string(),
|
zkey: "./semaphore/build/snark/semaphore_final.zkey".to_string(),
|
||||||
wasm: "./semaphore/build/snark/semaphore.wasm".to_string(),
|
wasm: "./semaphore/build/snark/semaphore.wasm".to_string(),
|
||||||
};
|
};
|
||||||
|
|
||||||
let proof = generate_proof(&config, &id, &merkle_proof, external_nullifier, signal).unwrap();
|
let proof = generate_proof(&config, &id, &merkle_proof, &external_nullifier_hash, signal).unwrap();
|
||||||
let success = verify_proof(&config, &root, &nullifier_hash, signal, external_nullifier, &proof).unwrap();
|
let success = verify_proof(&config, &root.into(), &nullifier_hash, signal, &external_nullifier_hash, &proof).unwrap();
|
||||||
|
|
||||||
assert!(success);
|
assert!(success);
|
||||||
```
|
```
|
|
@ -43,7 +43,8 @@ mod test {
|
||||||
let signal = "xxx".as_bytes();
|
let signal = "xxx".as_bytes();
|
||||||
let external_nullifier = "appId".as_bytes();
|
let external_nullifier = "appId".as_bytes();
|
||||||
|
|
||||||
let nullifier_hash = generate_nullifier_hash(&id, external_nullifier);
|
let external_nullifier_hash = hash_external_nullifier(external_nullifier);
|
||||||
|
let nullifier_hash = generate_nullifier_hash(&id, &external_nullifier_hash);
|
||||||
|
|
||||||
let config = SnarkFileConfig {
|
let config = SnarkFileConfig {
|
||||||
zkey: "./semaphore/build/snark/semaphore_final.zkey".to_string(),
|
zkey: "./semaphore/build/snark/semaphore_final.zkey".to_string(),
|
||||||
|
@ -51,14 +52,14 @@ mod test {
|
||||||
};
|
};
|
||||||
|
|
||||||
let proof =
|
let proof =
|
||||||
generate_proof(&config, &id, &merkle_proof, external_nullifier, signal).unwrap();
|
generate_proof(&config, &id, &merkle_proof, &external_nullifier_hash, signal).unwrap();
|
||||||
|
|
||||||
let success = verify_proof(
|
let success = verify_proof(
|
||||||
&config,
|
&config,
|
||||||
&root.into(),
|
&root.into(),
|
||||||
&nullifier_hash,
|
&nullifier_hash,
|
||||||
signal,
|
signal,
|
||||||
external_nullifier,
|
&external_nullifier_hash,
|
||||||
&proof,
|
&proof,
|
||||||
)
|
)
|
||||||
.unwrap();
|
.unwrap();
|
||||||
|
|
|
@ -45,17 +45,23 @@ fn hash_signal(signal: &[u8]) -> BigInt {
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Internal helper to hash the external nullifier
|
/// Internal helper to hash the external nullifier
|
||||||
pub fn hash_external_nullifier(nullifier: &[u8]) -> BigInt {
|
pub fn hash_external_nullifier(nullifier: &[u8]) -> [u8; 32] {
|
||||||
let mut hash = keccak256(nullifier).to_vec();
|
let mut hash = keccak256(nullifier);
|
||||||
hash.splice(..3, vec![0; 4]);
|
hash[0] = 0;
|
||||||
BigInt::from_bytes_be(Sign::Plus, &hash)
|
hash[1] = 0;
|
||||||
|
hash[2] = 0;
|
||||||
|
hash[3] = 0;
|
||||||
|
hash
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Generates the nullifier hash
|
/// Generates the nullifier hash
|
||||||
pub fn generate_nullifier_hash(identity: &Identity, external_nullifier: &[u8]) -> BigInt {
|
pub fn generate_nullifier_hash(identity: &Identity, external_nullifier: &[u8]) -> BigInt {
|
||||||
let res = POSEIDON
|
let res = POSEIDON
|
||||||
.hash(vec![
|
.hash(vec![
|
||||||
bigint_to_fr(&hash_external_nullifier(external_nullifier)),
|
bigint_to_fr(&BigInt::from_bytes_be(
|
||||||
|
Sign::Plus,
|
||||||
|
external_nullifier,
|
||||||
|
)),
|
||||||
bigint_to_fr(&identity.nullifier),
|
bigint_to_fr(&identity.nullifier),
|
||||||
])
|
])
|
||||||
.unwrap();
|
.unwrap();
|
||||||
|
@ -90,7 +96,7 @@ pub fn generate_proof(
|
||||||
merkle_proof_to_vec(merkle_proof),
|
merkle_proof_to_vec(merkle_proof),
|
||||||
);
|
);
|
||||||
inputs.insert("externalNullifier".to_string(), vec![
|
inputs.insert("externalNullifier".to_string(), vec![
|
||||||
hash_external_nullifier(external_nullifier),
|
BigInt::from_bytes_be(Sign::Plus, external_nullifier),
|
||||||
]);
|
]);
|
||||||
inputs.insert("signalHash".to_string(), vec![hash_signal(signal)]);
|
inputs.insert("signalHash".to_string(), vec![hash_signal(signal)]);
|
||||||
|
|
||||||
|
@ -151,7 +157,7 @@ pub fn verify_proof(
|
||||||
Fp256::from(nullifier_hash.to_biguint().unwrap()),
|
Fp256::from(nullifier_hash.to_biguint().unwrap()),
|
||||||
Fp256::from(hash_signal(signal).to_biguint().unwrap()),
|
Fp256::from(hash_signal(signal).to_biguint().unwrap()),
|
||||||
Fp256::from(
|
Fp256::from(
|
||||||
hash_external_nullifier(external_nullifier)
|
BigInt::from_bytes_be(Sign::Plus, external_nullifier)
|
||||||
.to_biguint()
|
.to_biguint()
|
||||||
.unwrap(),
|
.unwrap(),
|
||||||
),
|
),
|
||||||
|
|
Loading…
Reference in New Issue