k = 13; field = "pallas"; constant "RlnSignal" {} witness "RlnSignal" { Base secret_key, MerklePath identity_path, Uint32 identity_leaf_pos, # These are public so have to be properly constructed Base message_hash, # x Base epoch, Base rln_identifier, } circuit "RlnSignal" { constrain_instance(epoch); constrain_instance(rln_identifier); constrain_instance(message_hash); # This has to be the same constant used outside identity_derivation_path = witness_base(11); nullifier_derivation_path = witness_base(12); identity_commit = poseidon_hash(identity_derivation_path, secret_key); root = merkle_root(identity_leaf_pos, identity_path, identity_commit); constrain_instance(root); external_nullifier = poseidon_hash(epoch, rln_identifier); a_1 = poseidon_hash(secret_key, external_nullifier); internal_nullifier = poseidon_hash(nullifier_derivation_path, a_1); constrain_instance(internal_nullifier); y_a = base_mul(a_1, message_hash); y = base_add(y_a, secret_key); constrain_instance(y); }