feat: update witness serialization

This commit is contained in:
darshankabariya 2025-03-15 00:53:53 +05:30
parent f95a280257
commit 2080728b87
3 changed files with 19 additions and 20 deletions

View File

@ -117,17 +117,17 @@ proc serialize*(memIndices: seq[MembershipIndex]): seq[byte] =
return memIndicesBytes
proc serialize*(witness: Witness): seq[byte] =
## Serializes the witness into a byte array
## Serializes the witness into a byte array according to the RLN protocol format
var buffer: seq[byte]
buffer.add(witness.identity_secret)
buffer.add(witness.identity_nullifier)
for element in witness.merkle_proof:
buffer.add(element.toBytesBE()) # Convert Uint256 to big-endian bytes
buffer.add(witness.user_message_limit.toBytesBE())
buffer.add(witness.message_id.toBytesBE())
buffer.add(toBytes(uint64(witness.path_elements.len), Endianness.littleEndian))
for element in witness.path_elements:
buffer.add(element)
buffer.add(witness.identity_path_index)
buffer.add(witness.x)
buffer.add(witness.external_nullifier)
buffer.add(uint8(witness.signal.len)) # Add signal length as a single byte
buffer.add(witness.signal)
buffer.add(toBytesBE(witness.message_id))
buffer.add(witness.rln_identifier)
return buffer
proc toEpoch*(t: uint64): Epoch =

View File

@ -40,18 +40,17 @@ method generateProof*(
if g.userMessageLimit.isNone():
return err("user message limit is not set")
let merkleProof = g.fetchMerkleProof()
# Prepare the witness
let witness = Witness(
identity_secret: g.idCredentials.get().idSecretHash,
identity_nullifier: g.idCredentials.get().idNullifier,
merkle_proof: merkleProof,
external_nullifier: epoch,
signal: data,
user_message_limit: g.userMessageLimit.get(),
message_id: messageId,
rln_identifier: rlnIdentifier,
path_elements: g.fetchMerkleProof(),
identity_path_index: g.membershipIndex.get(),
x: data,
external_nullifier: poseidon_hash([epoch, rln_identifier]),
)
let serializedWitness = serialize(witness)
var inputBuffer = toBuffer(serializedWitness)

View File

@ -54,12 +54,12 @@ type RateLimitProof* = object
type Witness* = object ## Represents the custom witness for generating an RLN proof
identity_secret*: seq[byte] # Identity secret (private key)
identity_nullifier*: seq[byte] # Identity nullifier
merkle_proof*: seq[Uint256] # Merkle proof elements (retrieved from the smart contract)
external_nullifier*: Epoch # Epoch (external nullifier)
signal*: seq[byte] # Message data (signal)
user_message_limit*: UserMessageLimit # Maximum number of messages a user can send
message_id*: MessageId # Message ID (used for rate limiting)
rln_identifier*: RlnIdentifier # RLN identifier (default value provided)
path_elements*: seq[seq[byte]] # Merkle proof path elements
identity_path_index*: seq[byte] # Merkle proof path indices
x*: seq[byte] # Hash of the signal data
external_nullifier*: seq[byte] # Hash of epoch and RLN identifier
type ProofMetadata* = object
nullifier*: Nullifier