From 7988290759546a1884a58196a5bc1399ccafe474 Mon Sep 17 00:00:00 2001 From: Elder Ryan Date: Mon, 19 Feb 2024 18:11:15 +0800 Subject: [PATCH] feat: use forked protobufjs (#556) * fix: use forked protobufjs * feat: make snark task splitable * chore: update readme --- README.md | 18 +++++----- crates/node/src/backend/snark/browser.rs | 7 ++++ crates/node/src/backend/snark/mod.rs | 45 ++++++++++++++++++++++++ crates/snark/README.md | 2 +- package.json | 2 +- 5 files changed, 64 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index 17157c40c..96616a6ba 100644 --- a/README.md +++ b/README.md @@ -84,14 +84,14 @@ rings help ## Resource -| Resource | Link | Status | -|---------------------------------|-----------------------------------------------|---------| -| Rings Whitepaper | [Rings Whitepaper](https://github.com/RingsNetwork/whitepaper) | [![rings-ext-v2](https://github.com/RingsNetwork/rings_ext_v2/actions/workflows/dev.yml/badge.svg)](https://github.com/RingsNetwork/rings_ext_v2/actions/workflows/dev.yml)| -| Rings Documentation | [Rings Docs](https://rings.gitbook.io/) | | -| Rings Browser Handshakes Example| [Rings Browser Handshakes](https://github.com/RingsNetwork/rings-wasm-p2p) | Demo / PoC | -| Rings Browser Extension | [Rings Browser Extension](https://github.com/RingsNetwork/rings_ext_v2) | Beta | -| Rings dWeb Demo | [Rings dWeb Demo](https://github.com/RingsNetwork/rings-dweb) | [![rings-ext-v2](https://github.com/RingsNetwork/rings_dweb/actions/workflows/nextjs.yml/badge.svg?branch=page)](https://github.com/RingsNetwork/rings_dweb/actions/workflows/nextjs.yml)| - +| Resource | Link | Status | +|----------------------------------|----------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| Rings Whitepaper | [Rings Whitepaper](https://github.com/RingsNetwork/whitepaper) | [![rings-ext-v2](https://github.com/RingsNetwork/rings_ext_v2/actions/workflows/dev.yml/badge.svg)](https://github.com/RingsNetwork/rings_ext_v2/actions/workflows/dev.yml) | +| Rings Documentation | [Rings Docs](https://rings.gitbook.io/) | | +| Rings Browser Handshakes Example | [Rings Browser Handshakes](https://github.com/RingsNetwork/rings-wasm-p2p) | Demo / PoC | +| Rings Browser Extension | [Rings Browser Extension](https://github.com/RingsNetwork/rings_ext_v2) | Beta | +| Rings dWeb Demo | [Rings dWeb Demo](https://github.com/RingsNetwork/rings-dweb) | [![rings-ext-v2](https://github.com/RingsNetwork/rings_dweb/actions/workflows/nextjs.yml/badge.svg?branch=page)](https://github.com/RingsNetwork/rings_dweb/actions/workflows/nextjs.yml) | +|Rings zkProof Demo | [Rings zkProof Demo](https://zkp.rings.rs) |![rings-snark-demo](https://github.com/RingsNetwork/rings-proof-demo/actions/workflows/nextjs.yml/badge.svg?branch=page)| ## Components: @@ -105,6 +105,8 @@ rings help * transport: Rings Transport implementation, including native transport and `web_sys` based transport. +* snark: Rings SNARK is based on fold scheme and zkSNARK + ## Architecture The Rings Network architecture is streamlined into five distinct layers. diff --git a/crates/node/src/backend/snark/browser.rs b/crates/node/src/backend/snark/browser.rs index 03d267c0b..2e0517958 100644 --- a/crates/node/src/backend/snark/browser.rs +++ b/crates/node/src/backend/snark/browser.rs @@ -20,6 +20,13 @@ pub struct SNARKProofTaskRef { inner: Arc, } +impl SNARKProofTaskRef { + /// Make snark proof task ref splitable + pub fn split(&self, n: usize) -> Vec { + self.inner.split(n).into_iter().map(|t| t.into()).collect() + } +} + #[wasm_bindgen] impl SNARKProofTaskRef { /// serialize SNARKProofTaskRef to json diff --git a/crates/node/src/backend/snark/mod.rs b/crates/node/src/backend/snark/mod.rs index 114b84811..4b42c6050 100644 --- a/crates/node/src/backend/snark/mod.rs +++ b/crates/node/src/backend/snark/mod.rs @@ -680,6 +680,29 @@ where pp: Arc>, } +impl SNARKProofTask { + /// Make snark proof task splitable + pub fn split(&self, n: usize) -> Vec { + match self { + SNARKProofTask::PallasVasta(g) => g + .split(n) + .into_iter() + .map(SNARKProofTask::PallasVasta) + .collect(), + SNARKProofTask::VastaPallas(g) => g + .split(n) + .into_iter() + .map(SNARKProofTask::VastaPallas) + .collect(), + SNARKProofTask::Bn256KZGGrumpkin(g) => g + .split(n) + .into_iter() + .map(SNARKProofTask::Bn256KZGGrumpkin) + .collect(), + } + } +} + impl SNARKGenerator where E1: Engine::Scalar>, @@ -697,6 +720,28 @@ where Ok(()) } + /// Split a SNARKGenerator task to multiple, by split circuits into multiple + pub fn split(&self, n: usize) -> Vec { + let SNARKGenerator { + snark, + circuits, + pp, + } = self; + + let mut split = Vec::new(); + let chunk_size = (circuits.len() + n - 1) / n; + + for circuit_chunk in circuits.chunks(chunk_size) { + let new_generator = SNARKGenerator { + snark: snark.clone(), + circuits: circuit_chunk.to_vec(), + pp: Arc::clone(pp), + }; + split.push(new_generator); + } + split + } + /// setup compressed snark, get (pk, vk) #[allow(clippy::type_complexity)] pub fn setup, S2: RelaxedR1CSSNARKTrait>( diff --git a/crates/snark/README.md b/crates/snark/README.md index 9cd04d5ae..172283fb4 100644 --- a/crates/snark/README.md +++ b/crates/snark/README.md @@ -11,7 +11,7 @@ [![docs](https://docs.rs/rings-node/badge.svg)](https://docs.rs/rings-node/latest/rings_node/) ![GitHub](https://img.shields.io/github/license/RingsNetwork/rings-node) -This create contains the implementation of Rings SNARK, which is based on Nova +This crate contains the implementation of Rings SNARK, which is based on Nova ### TL;DR diff --git a/package.json b/package.json index 8d3fe4e95..20e83f9bb 100644 --- a/package.json +++ b/package.json @@ -17,7 +17,7 @@ }, "dependencies": { "circomlib": "^2.0.5", - "protobufjs": "^7.2.5" + "protobufjs": "https://github.com/RingsNetwork/protobuf.js#83686a0" }, "devDependencies": { "protobufjs-cli": "^1.1.2",