From b9269660c857e3eae6680091e58e02bcb199a353 Mon Sep 17 00:00:00 2001 From: Richard Ramos Date: Mon, 26 Sep 2022 14:58:03 -0400 Subject: [PATCH] refactor: RateLimitProof --- package-lock.json | 14 +++++++------- package.json | 2 +- src/encoder.spec.ts | 25 +++++++++++++++++-------- src/encoder.ts | 9 ++++----- src/index.spec.ts | 12 ++++++------ src/index.ts | 4 ++-- src/rln.ts | 36 ++++++++++++++++++++---------------- 7 files changed, 57 insertions(+), 45 deletions(-) diff --git a/package-lock.json b/package-lock.json index f76e758..9358dd5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -41,7 +41,7 @@ "husky": "^7.0.4", "ignore-loader": "^0.1.2", "isomorphic-fetch": "^3.0.0", - "js-waku": "^0.29.0-5bab85f", + "js-waku": "^0.29.0-7714812", "jsdom": "^19.0.0", "jsdom-global": "^3.0.2", "karma": "^6.3.12", @@ -6647,9 +6647,9 @@ "license": "MIT" }, "node_modules/js-waku": { - "version": "0.29.0-5bab85f", - "resolved": "https://registry.npmjs.org/js-waku/-/js-waku-0.29.0-5bab85f.tgz", - "integrity": "sha512-5uJCslPYnz+7QoY33ybVbpDnxduyCKzOmIDCGYitke6AtHMwsBfRIlCWlHdmUWonB3UdLZup80Rk07IPd5gqhA==", + "version": "0.29.0-7714812", + "resolved": "https://registry.npmjs.org/js-waku/-/js-waku-0.29.0-7714812.tgz", + "integrity": "sha512-pHX7cvrLC8Yw0KxTa8KJlFcE9S5WLkBWqd0pWqBWGCG5mU1Q6LWBZv+rOYuhn9wkCCpjF5jWJvmTohzkGt91XA==", "dev": true, "dependencies": { "@chainsafe/libp2p-gossipsub": "^4.1.1", @@ -15715,9 +15715,9 @@ "dev": true }, "js-waku": { - "version": "0.29.0-5bab85f", - "resolved": "https://registry.npmjs.org/js-waku/-/js-waku-0.29.0-5bab85f.tgz", - "integrity": "sha512-5uJCslPYnz+7QoY33ybVbpDnxduyCKzOmIDCGYitke6AtHMwsBfRIlCWlHdmUWonB3UdLZup80Rk07IPd5gqhA==", + "version": "0.29.0-7714812", + "resolved": "https://registry.npmjs.org/js-waku/-/js-waku-0.29.0-7714812.tgz", + "integrity": "sha512-pHX7cvrLC8Yw0KxTa8KJlFcE9S5WLkBWqd0pWqBWGCG5mU1Q6LWBZv+rOYuhn9wkCCpjF5jWJvmTohzkGt91XA==", "dev": true, "requires": { "@chainsafe/libp2p-gossipsub": "^4.1.1", diff --git a/package.json b/package.json index 97d4143..51789c7 100644 --- a/package.json +++ b/package.json @@ -81,7 +81,7 @@ "husky": "^7.0.4", "ignore-loader": "^0.1.2", "isomorphic-fetch": "^3.0.0", - "js-waku": "^0.29.0-5bab85f", + "js-waku": "^0.29.0-7714812", "jsdom": "^19.0.0", "jsdom-global": "^3.0.2", "karma": "^6.3.12", diff --git a/src/encoder.spec.ts b/src/encoder.spec.ts index 08128cf..a458a74 100644 --- a/src/encoder.spec.ts +++ b/src/encoder.spec.ts @@ -1,9 +1,13 @@ import { expect } from "chai"; - -import {DecoderV0, EncoderV0, MessageV0} from "js-waku/lib/waku_message/version_0"; +import { + DecoderV0, + EncoderV0, + MessageV0, +} from "js-waku/lib/waku_message/version_0"; import { RLNDecoder, RLNEncoder } from "./encoder.js"; -import * as rln from "./index"; + +import * as rln from "./index.js"; const TestContentTopic = "/test/1/waku-message/utf8"; @@ -27,11 +31,16 @@ describe("js-rln: encoder", () => { const bytes = await rlnEncoder.encode({ payload }); const protoResult = await rlnDecoder.decodeProto(bytes!); - const result = (await rlnDecoder.decode(protoResult!)) as MessageV0; + const msg = (await rlnDecoder.decode(protoResult!))!; - expect(result.contentTopic).to.eq(TestContentTopic); - expect(result.version).to.eq(0); - expect(result.payload).to.deep.eq(payload); - expect(result.timestamp).to.not.be.undefined; + // Validate proof + const verifResult = rlnInstance.verifyProof(msg.rateLimitProof!); + expect(verifResult).to.be.true; + + const msgV0 = msg as MessageV0; + expect(msgV0.contentTopic).to.eq(TestContentTopic); + expect(msgV0.version).to.eq(0); + expect(msgV0.payload).to.deep.eq(payload); + expect(msgV0.timestamp).to.not.be.undefined; }); }); diff --git a/src/encoder.ts b/src/encoder.ts index 83d0677..b7ab866 100644 --- a/src/encoder.ts +++ b/src/encoder.ts @@ -76,11 +76,10 @@ export class RLNDecoder implements Decoder { } async decode(proto: ProtoMessage): Promise { - // https://github.com/status-im/js-waku/issues/921 - if (proto.version === undefined) { - proto.version = 0; + const msg = await this.decoder.decode(proto); + if (msg) { + msg.rateLimitProof = proto.rateLimitProof; } - - return this.decoder.decode(proto); + return msg; } } diff --git a/src/index.spec.ts b/src/index.spec.ts index e22adb6..5cdb0df 100644 --- a/src/index.spec.ts +++ b/src/index.spec.ts @@ -1,6 +1,6 @@ import { assert, expect } from "chai"; -import * as rln from "./index"; +import * as rln from "./index.js"; describe("js-rln", () => { it("should verify a proof", async function () { @@ -50,13 +50,13 @@ describe("js-rln", () => { try { // Modifying the proof so it's invalid - const proofBytes = proof.toBytes(); - proofBytes[7] = 1; - proofBytes[8] = 2; - proofBytes[9] = 3; + proof.proof[0] = 0; + proof.proof[1] = 1; + proof.proof[2] = 2; + proof.proof[3] = 3; // verify the proof - const verifResult = rlnInstance.verifyProof(proofBytes); + const verifResult = rlnInstance.verifyProof(proof); expect(verifResult).to.be.false; } catch (err) { // diff --git a/src/index.ts b/src/index.ts index 3954160..6f65ab4 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,4 +1,4 @@ -import type { MembershipKey, RateLimitProof, RLNInstance } from "./rln.js"; +import type { MembershipKey, Proof, RLNInstance } from "./rln.js"; // reexport the create function, dynamically imported from rln.ts export async function create(): Promise { @@ -9,4 +9,4 @@ export async function create(): Promise { return await rlnModule.create(); } -export { RLNInstance, MembershipKey, RateLimitProof }; +export { RLNInstance, MembershipKey, Proof }; diff --git a/src/rln.ts b/src/rln.ts index bbc675e..3600443 100644 --- a/src/rln.ts +++ b/src/rln.ts @@ -1,4 +1,5 @@ import init, * as zerokitRLN from "@waku/zerokit-rln-wasm"; +import { RateLimitProof } from "js-waku/lib/interfaces"; import verificationKey from "./resources/verification_key.json"; import * as wc from "./witness_calculator.js"; @@ -120,7 +121,7 @@ const shareYOffset = shareXOffset + 32; const nullifierOffset = shareYOffset + 32; const rlnIdentifierOffset = nullifierOffset + 32; -export class RateLimitProof { +export class Proof implements RateLimitProof { readonly proof: Uint8Array; readonly merkleRoot: Uint8Array; readonly epoch: Uint8Array; @@ -143,18 +144,18 @@ export class RateLimitProof { rlnIdentifierOffset ); } +} - toBytes(): Uint8Array { - return concatenate( - this.proof, - this.merkleRoot, - this.epoch, - this.shareX, - this.shareY, - this.nullifier, - this.rlnIdentifier - ); - } +function proofToBytes(p: RateLimitProof): Uint8Array { + return concatenate( + p.proof, + p.merkleRoot, + p.epoch, + p.shareX, + p.shareY, + p.nullifier, + p.rlnIdentifier + ); } export class RLNInstance { @@ -218,13 +219,16 @@ export class RLNInstance { rlnWitness ); - return new RateLimitProof(proofBytes); + return new Proof(proofBytes); } verifyProof(proof: RateLimitProof | Uint8Array): boolean { - if (proof instanceof RateLimitProof) { - proof = proof.toBytes(); + let pBytes: Uint8Array; + if (proof instanceof Uint8Array) { + pBytes = proof; + } else { + pBytes = proofToBytes(proof); } - return zerokitRLN.verifyProof(this.zkRLN, proof); + return zerokitRLN.verifyProof(this.zkRLN, pBytes); } }