mirror of
https://github.com/logos-messaging/logos-messaging-nim.git
synced 2026-01-08 17:03:09 +00:00
feat: update witness serialization
This commit is contained in:
parent
f95a280257
commit
2080728b87
@ -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 =
|
||||
|
||||
@ -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)
|
||||
|
||||
|
||||
@ -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
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user