mirror of
https://github.com/logos-messaging/logos-messaging-js.git
synced 2026-01-23 18:33:12 +00:00
* chore: idCommitmentBigInt validates against contract Q * chore: fix linting * chore: add log * chore: rename Q and make sync * fix: test * chore: remove stubbed contract test * chore: hardcode default constant for Q * use non deprecated sha256 * chore: use full 32 bytes for bigint * chore: all storage in LE, but smart contract interactions in BE * chore: remove references to idCOmmitmentBigInt in Identity * chore: don't fetch Q from contract * chore: ByteUtils as a class * chore: store Identity in BE, convert during Keystore * chore: add IDCommitmentBigInt part of Identity * chore: minor improvements * chore: switch idTrapdoor to LE * chore: add logs * chore: rename `DEFAULT_Q` to `RLN_Q` * chore: rm spec test * chore: improve modulo logging * fix(tests): add IDCommitmentBigInt
70 lines
2.1 KiB
TypeScript
70 lines
2.1 KiB
TypeScript
import type { IRateLimitProof } from "@waku/interfaces";
|
|
|
|
import { BytesUtils, poseidonHash } from "./utils/index.js";
|
|
|
|
const proofOffset = 128;
|
|
const rootOffset = proofOffset + 32;
|
|
const epochOffset = rootOffset + 32;
|
|
const shareXOffset = epochOffset + 32;
|
|
const shareYOffset = shareXOffset + 32;
|
|
const nullifierOffset = shareYOffset + 32;
|
|
const rlnIdentifierOffset = nullifierOffset + 32;
|
|
|
|
class ProofMetadata {
|
|
public constructor(
|
|
public readonly nullifier: Uint8Array,
|
|
public readonly shareX: Uint8Array,
|
|
public readonly shareY: Uint8Array,
|
|
public readonly externalNullifier: Uint8Array
|
|
) {}
|
|
}
|
|
|
|
export class Proof implements IRateLimitProof {
|
|
public readonly proof: Uint8Array;
|
|
public readonly merkleRoot: Uint8Array;
|
|
public readonly epoch: Uint8Array;
|
|
public readonly shareX: Uint8Array;
|
|
public readonly shareY: Uint8Array;
|
|
public readonly nullifier: Uint8Array;
|
|
public readonly rlnIdentifier: Uint8Array;
|
|
|
|
public constructor(proofBytes: Uint8Array) {
|
|
if (proofBytes.length < rlnIdentifierOffset) {
|
|
throw new Error("invalid proof");
|
|
}
|
|
// parse the proof as proof<128> | share_y<32> | nullifier<32> | root<32> | epoch<32> | share_x<32> | rln_identifier<32>
|
|
this.proof = proofBytes.subarray(0, proofOffset);
|
|
this.merkleRoot = proofBytes.subarray(proofOffset, rootOffset);
|
|
this.epoch = proofBytes.subarray(rootOffset, epochOffset);
|
|
this.shareX = proofBytes.subarray(epochOffset, shareXOffset);
|
|
this.shareY = proofBytes.subarray(shareXOffset, shareYOffset);
|
|
this.nullifier = proofBytes.subarray(shareYOffset, nullifierOffset);
|
|
this.rlnIdentifier = proofBytes.subarray(
|
|
nullifierOffset,
|
|
rlnIdentifierOffset
|
|
);
|
|
}
|
|
|
|
public extractMetadata(): ProofMetadata {
|
|
const externalNullifier = poseidonHash(this.epoch, this.rlnIdentifier);
|
|
return new ProofMetadata(
|
|
this.nullifier,
|
|
this.shareX,
|
|
this.shareY,
|
|
externalNullifier
|
|
);
|
|
}
|
|
}
|
|
|
|
export function proofToBytes(p: IRateLimitProof): Uint8Array {
|
|
return BytesUtils.concatenate(
|
|
p.proof,
|
|
p.merkleRoot,
|
|
p.epoch,
|
|
p.shareX,
|
|
p.shareY,
|
|
p.nullifier,
|
|
p.rlnIdentifier
|
|
);
|
|
}
|