signal.zk 1.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. k = 13;
  2. field = "pallas";
  3. constant "RlnSignal" {}
  4. witness "RlnSignal" {
  5. Base identity_nullifier,
  6. Base identity_trapdoor,
  7. MerklePath identity_path,
  8. Uint32 identity_leaf_pos,
  9. Base x, # The message hash
  10. Base message_id,
  11. Base message_limit,
  12. # These are public
  13. Base epoch,
  14. Base rln_identifier,
  15. }
  16. circuit "RlnSignal" {
  17. constrain_instance(message_limit);
  18. constrain_instance(epoch);
  19. external_nullifier = poseidon_hash(epoch, rln_identifier);
  20. constrain_instance(external_nullifier);
  21. a_0 = poseidon_hash(identity_nullifier, identity_trapdoor);
  22. a_1 = poseidon_hash(a_0, external_nullifier, message_id);
  23. internal_nullifier = poseidon_hash(a_1);
  24. constrain_instance(internal_nullifier);
  25. # y = a_0 + x * a_1
  26. x_a_1 = base_mul(x, a_1);
  27. y = base_add(a_0, x_a_1);
  28. constrain_instance(x);
  29. constrain_instance(y);
  30. identity_commitment = poseidon_hash(a_0);
  31. root = merkle_root(identity_leaf_pos, identity_path, identity_commitment);
  32. constrain_instance(root);
  33. }