From 43f5a996e82564b49807809526c3fb6102557398 Mon Sep 17 00:00:00 2001 From: ymekuria Date: Mon, 20 May 2024 14:13:26 +0200 Subject: [PATCH 01/26] feat(witness-proof.ts): add new ZkProgram example with witness proof functionality for verification of proofs and output validation --- src/examples/zkprogram/witness-proof.ts | 54 +++++++++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 src/examples/zkprogram/witness-proof.ts diff --git a/src/examples/zkprogram/witness-proof.ts b/src/examples/zkprogram/witness-proof.ts new file mode 100644 index 0000000000..0991bcd375 --- /dev/null +++ b/src/examples/zkprogram/witness-proof.ts @@ -0,0 +1,54 @@ +import { + SelfProof, + Field, + ZkProgram, + verify, + isReady, + Proof, + JsonProof, + Provable, + Empty, +} from 'o1js'; + +await isReady; + +let MyProgram = ZkProgram({ + name: 'example-with-output', + publicOutput: Field, + + methods: { + baseCase: { + privateInputs: [], + method() { + return Field(0); + }, + }, + }, +}); + +class ProgramProof extends ZkProgram.Proof(MyProgram) {} + +await MyProgram.compile(); + +let proof = await MyProgram.baseCase(); + +let MyProgram2 = ZkProgram({ + name: 'example-with-output2', + + methods: { + baseCase: { + privateInputs: [ProgramProof], + method(p: ProgramProof) { + p.verify(); + + // should say 0 and fail verification + Provable.log(proof.publicOutput); + }, + }, + }, +}); +console.log('GOING INTO SECOND ZKPROGRAM'); +await MyProgram2.compile(); +console.log('PROVING'); + +await MyProgram2.baseCase(proof); From 40e9d855d90a4f1bf2672ddcfa9d27465c8bb751 Mon Sep 17 00:00:00 2001 From: ymekuria Date: Mon, 20 May 2024 14:14:47 +0200 Subject: [PATCH 02/26] feat(zkprogram): add a new ZkProgram example file witness-proof-2.ts to demonstrate wtinessing proofs --- src/examples/zkprogram/witness-proof-2.ts | 54 +++++++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 src/examples/zkprogram/witness-proof-2.ts diff --git a/src/examples/zkprogram/witness-proof-2.ts b/src/examples/zkprogram/witness-proof-2.ts new file mode 100644 index 0000000000..0991bcd375 --- /dev/null +++ b/src/examples/zkprogram/witness-proof-2.ts @@ -0,0 +1,54 @@ +import { + SelfProof, + Field, + ZkProgram, + verify, + isReady, + Proof, + JsonProof, + Provable, + Empty, +} from 'o1js'; + +await isReady; + +let MyProgram = ZkProgram({ + name: 'example-with-output', + publicOutput: Field, + + methods: { + baseCase: { + privateInputs: [], + method() { + return Field(0); + }, + }, + }, +}); + +class ProgramProof extends ZkProgram.Proof(MyProgram) {} + +await MyProgram.compile(); + +let proof = await MyProgram.baseCase(); + +let MyProgram2 = ZkProgram({ + name: 'example-with-output2', + + methods: { + baseCase: { + privateInputs: [ProgramProof], + method(p: ProgramProof) { + p.verify(); + + // should say 0 and fail verification + Provable.log(proof.publicOutput); + }, + }, + }, +}); +console.log('GOING INTO SECOND ZKPROGRAM'); +await MyProgram2.compile(); +console.log('PROVING'); + +await MyProgram2.baseCase(proof); From 7c16959883b526eb02a6cf6aaf3ceb525f8baba2 Mon Sep 17 00:00:00 2001 From: ymekuria Date: Thu, 30 May 2024 16:03:56 -0400 Subject: [PATCH 03/26] feat(witness-proof.ts): update witness-proof example --- src/examples/zkprogram/witness-proof.ts | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/src/examples/zkprogram/witness-proof.ts b/src/examples/zkprogram/witness-proof.ts index 0991bcd375..b36fc89dee 100644 --- a/src/examples/zkprogram/witness-proof.ts +++ b/src/examples/zkprogram/witness-proof.ts @@ -37,10 +37,15 @@ let MyProgram2 = ZkProgram({ methods: { baseCase: { - privateInputs: [ProgramProof], - method(p: ProgramProof) { - p.verify(); + privateInputs: [], + method() { + let p = Provable.witness(ProgramProof.provable, () => { + proof.publicOutput = Field(5); + return proof; + }); + ProgramProof.declare(p); + p.verify(); // should say 0 and fail verification Provable.log(proof.publicOutput); }, @@ -50,5 +55,4 @@ let MyProgram2 = ZkProgram({ console.log('GOING INTO SECOND ZKPROGRAM'); await MyProgram2.compile(); console.log('PROVING'); - -await MyProgram2.baseCase(proof); +await MyProgram2.baseCase(); From 078d76832b42392c224d276d79052a074f15f09a Mon Sep 17 00:00:00 2001 From: ymekuria Date: Thu, 30 May 2024 17:06:34 -0400 Subject: [PATCH 04/26] feat(zkprogram.ts): import statement for Unconstrained --- src/lib/proof-system/zkprogram.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/lib/proof-system/zkprogram.ts b/src/lib/proof-system/zkprogram.ts index 0e00f61d1b..8aed6c3e7c 100644 --- a/src/lib/proof-system/zkprogram.ts +++ b/src/lib/proof-system/zkprogram.ts @@ -38,6 +38,7 @@ import { unsetSrsCache, } from '../../bindings/crypto/bindings/srs.js'; import { ProvablePure } from '../provable/types/provable-intf.js'; +import { Unconstrained } from '../provable/types/unconstrained.js'; import { prefixToField } from '../../bindings/lib/binable.js'; import { prefixes } from '../../bindings/crypto/constants.js'; From ae2238ba941c2342ebc116f6a6d8620ac98a37af Mon Sep 17 00:00:00 2001 From: ymekuria Date: Thu, 30 May 2024 17:32:42 -0400 Subject: [PATCH 05/26] feat(zkprogram.ts): import ProvableExtended --- src/lib/proof-system/zkprogram.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/lib/proof-system/zkprogram.ts b/src/lib/proof-system/zkprogram.ts index 8aed6c3e7c..34eec4cc35 100644 --- a/src/lib/proof-system/zkprogram.ts +++ b/src/lib/proof-system/zkprogram.ts @@ -16,6 +16,7 @@ import { FlexibleProvable, FlexibleProvablePure, InferProvable, + ProvableExtended, ProvablePureExtended, Struct, } from '../provable/types/struct.js'; From d00b47f0205b0ec7b6621b8c36089d623f1ffb5d Mon Sep 17 00:00:00 2001 From: ymekuria Date: Thu, 30 May 2024 17:42:25 -0400 Subject: [PATCH 06/26] refactor(zkprogram.ts): import contexts --- src/lib/proof-system/zkprogram.ts | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/lib/proof-system/zkprogram.ts b/src/lib/proof-system/zkprogram.ts index 34eec4cc35..8307491082 100644 --- a/src/lib/proof-system/zkprogram.ts +++ b/src/lib/proof-system/zkprogram.ts @@ -23,7 +23,12 @@ import { import { provable, provablePure } from '../provable/types/provable-derivers.js'; import { Provable } from '../provable/provable.js'; import { assert, prettifyStacktracePromise } from '../util/errors.js'; -import { snarkContext } from '../provable/core/provable-context.js'; +import { + inAnalyze, + inCompile, + inProver, + snarkContext, +} from '../provable/core/provable-context.js'; import { hashConstant } from '../provable/crypto/poseidon.js'; import { MlArray, MlBool, MlResult, MlPair } from '../ml/base.js'; import { MlFieldArray, MlFieldConstArray } from '../ml/fields.js'; From b7a8e54e4c05de7498b06be23781954df4845eb3 Mon Sep 17 00:00:00 2001 From: ymekuria Date: Fri, 31 May 2024 12:55:37 -0400 Subject: [PATCH 07/26] feat(zkprogram.ts): export sublcass internal api --- src/lib/proof-system/zkprogram.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/lib/proof-system/zkprogram.ts b/src/lib/proof-system/zkprogram.ts index 8307491082..3fcb80cd39 100644 --- a/src/lib/proof-system/zkprogram.ts +++ b/src/lib/proof-system/zkprogram.ts @@ -80,6 +80,7 @@ export { isAsFields, Prover, dummyBase64Proof, + Subclass, }; type Undefined = undefined; From 550fd3bcc4fc3cb3599f25b9ce3bb670a35d574f Mon Sep 17 00:00:00 2001 From: ymekuria Date: Fri, 31 May 2024 13:03:45 -0400 Subject: [PATCH 08/26] feat(provable-context.ts): import Proof Subclass and Bool --- src/lib/provable/core/provable-context.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/lib/provable/core/provable-context.ts b/src/lib/provable/core/provable-context.ts index 29b258c02b..1f3d06887a 100644 --- a/src/lib/provable/core/provable-context.ts +++ b/src/lib/provable/core/provable-context.ts @@ -11,6 +11,9 @@ import { prettifyStacktrace } from '../../util/errors.js'; import { Fp } from '../../../bindings/crypto/finite-field.js'; import { MlBool } from '../../ml/base.js'; +import { Proof, Subclass } from '../../proof-system/zkprogram.js'; +import { Bool } from '../bool.js'; + // internal API export { snarkContext, From 7d0eab93b4b570c2eb8174262b77068c1e3fb7dc Mon Sep 17 00:00:00 2001 From: ymekuria Date: Sat, 1 Jun 2024 13:15:47 -0400 Subject: [PATCH 09/26] feat(provable-context.ts): add proof context --- src/lib/provable/core/provable-context.ts | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/lib/provable/core/provable-context.ts b/src/lib/provable/core/provable-context.ts index 1f3d06887a..27d77ea268 100644 --- a/src/lib/provable/core/provable-context.ts +++ b/src/lib/provable/core/provable-context.ts @@ -12,8 +12,18 @@ import { Fp } from '../../../bindings/crypto/finite-field.js'; import { MlBool } from '../../ml/base.js'; import { Proof, Subclass } from '../../proof-system/zkprogram.js'; +import { ProvablePure } from '../types/provable-intf.js'; import { Bool } from '../bool.js'; +type ProofContext = { + proofClass: Subclass; + publicInput: ProvablePure; + publicOutput: ProvablePure; + proof: unknown; + shouldVerify: Bool; + maxProofsVerified: number; +}; + // internal API export { snarkContext, From b7b2a51277d6dbb1f6a1f42a280a41c593e813ad Mon Sep 17 00:00:00 2001 From: ymekuria Date: Sat, 1 Jun 2024 13:25:46 -0400 Subject: [PATCH 10/26] feat(provable-context.ts): add circuit context type --- src/lib/provable/core/provable-context.ts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/lib/provable/core/provable-context.ts b/src/lib/provable/core/provable-context.ts index 27d77ea268..3b94490029 100644 --- a/src/lib/provable/core/provable-context.ts +++ b/src/lib/provable/core/provable-context.ts @@ -23,6 +23,11 @@ type ProofContext = { shouldVerify: Bool; maxProofsVerified: number; }; +// context that observes and collects meta data about circuits and their methods +type CircuitContext = { + methodName: string; + proofs: ProofContext[]; +}; // internal API export { From d0ec20c39bd8a2bf64effbd9da27bad56019e1bb Mon Sep 17 00:00:00 2001 From: ymekuria Date: Sat, 1 Jun 2024 13:27:33 -0400 Subject: [PATCH 11/26] feat(provable-context.ts): add circuit context --- src/lib/provable/core/provable-context.ts | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/lib/provable/core/provable-context.ts b/src/lib/provable/core/provable-context.ts index 3b94490029..cc0ff02bff 100644 --- a/src/lib/provable/core/provable-context.ts +++ b/src/lib/provable/core/provable-context.ts @@ -29,6 +29,15 @@ type CircuitContext = { proofs: ProofContext[]; }; +let circuitContext = Context.create({}); + +const CircuitContext = { + enter(methodName: string) { + let context: CircuitContext = { methodName, proofs: [] }; + let id = circuitContext.enter(context); + return { id, context }; + }, +}; // internal API export { snarkContext, From 5a7510cdacfb033e4de40aec06b3db8d43199540 Mon Sep 17 00:00:00 2001 From: ymekuria Date: Sat, 1 Jun 2024 13:50:17 -0400 Subject: [PATCH 12/26] feat(provable-context.ts): export proof and circuit contexts --- src/lib/provable/core/provable-context.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/lib/provable/core/provable-context.ts b/src/lib/provable/core/provable-context.ts index cc0ff02bff..a8464ffce3 100644 --- a/src/lib/provable/core/provable-context.ts +++ b/src/lib/provable/core/provable-context.ts @@ -40,6 +40,9 @@ const CircuitContext = { }; // internal API export { + ProofContext, + circuitContext, + CircuitContext, snarkContext, SnarkContext, asProver, From c23dea95b4d56c449c170cdfb260afbde8e3f95e Mon Sep 17 00:00:00 2001 From: ymekuria Date: Sat, 1 Jun 2024 14:07:38 -0400 Subject: [PATCH 13/26] feat(zkprogram.ts): update proof proberty type in ProofBase to Unconstrained --- src/lib/proof-system/zkprogram.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/lib/proof-system/zkprogram.ts b/src/lib/proof-system/zkprogram.ts index 3fcb80cd39..064a9d3575 100644 --- a/src/lib/proof-system/zkprogram.ts +++ b/src/lib/proof-system/zkprogram.ts @@ -102,7 +102,7 @@ class ProofBase { }; publicInput: Input; publicOutput: Output; - proof: Pickles.Proof; + proof: Unconstrained; maxProofsVerified: 0 | 1 | 2; shouldVerify = Bool(false); @@ -129,7 +129,7 @@ class ProofBase { }) { this.publicInput = publicInput; this.publicOutput = publicOutput; - this.proof = proof; // TODO optionally convert from string? + this.proof = Unconstrained.from(proof); // TODO optionally convert from string? this.maxProofsVerified = maxProofsVerified; } } From 4230023a4fa7f8786c033d38991d18dd4a216630 Mon Sep 17 00:00:00 2001 From: ymekuria Date: Sat, 1 Jun 2024 14:18:19 -0400 Subject: [PATCH 14/26] feat(zkprogram.ts): make proofs provable --- src/lib/proof-system/zkprogram.ts | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/lib/proof-system/zkprogram.ts b/src/lib/proof-system/zkprogram.ts index 064a9d3575..2ee529641b 100644 --- a/src/lib/proof-system/zkprogram.ts +++ b/src/lib/proof-system/zkprogram.ts @@ -20,7 +20,11 @@ import { ProvablePureExtended, Struct, } from '../provable/types/struct.js'; -import { provable, provablePure } from '../provable/types/provable-derivers.js'; +import { + provable, + provablePure, + provableFromClass, +} from '../provable/types/provable-derivers.js'; import { Provable } from '../provable/provable.js'; import { assert, prettifyStacktracePromise } from '../util/errors.js'; import { @@ -1191,6 +1195,13 @@ ZkProgram.Proof = function < static publicInputType = program.publicInputType; static publicOutputType = program.publicOutputType; static tag = () => program; + static get provable() { + return provableFromClass(ZkProgramProof, { + publicInput: program.publicInputType, + publicOutput: program.publicOutputType, + proof: Unconstrained.provable, + }); + } }; }; From d3b3c78f6b9b3cb94a7937bcf6ce660298801bdf Mon Sep 17 00:00:00 2001 From: ymekuria Date: Sun, 2 Jun 2024 21:21:49 -0400 Subject: [PATCH 15/26] feat(zkprograms.ts): import proof and circuit contexts --- src/lib/proof-system/zkprogram.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/lib/proof-system/zkprogram.ts b/src/lib/proof-system/zkprogram.ts index 2ee529641b..01b0c3009f 100644 --- a/src/lib/proof-system/zkprogram.ts +++ b/src/lib/proof-system/zkprogram.ts @@ -31,6 +31,8 @@ import { inAnalyze, inCompile, inProver, + CircuitContext, + circuitContext, snarkContext, } from '../provable/core/provable-context.js'; import { hashConstant } from '../provable/crypto/poseidon.js'; From 157d142ea29e09281dcd6488f5ddc252e0e089a2 Mon Sep 17 00:00:00 2001 From: ymekuria Date: Sun, 2 Jun 2024 22:02:38 -0400 Subject: [PATCH 16/26] feat(zkprogram.ts): add declare method to add dependencies to global context --- src/lib/proof-system/zkprogram.ts | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/lib/proof-system/zkprogram.ts b/src/lib/proof-system/zkprogram.ts index 01b0c3009f..609a4eccc9 100644 --- a/src/lib/proof-system/zkprogram.ts +++ b/src/lib/proof-system/zkprogram.ts @@ -1197,6 +1197,18 @@ ZkProgram.Proof = function < static publicInputType = program.publicInputType; static publicOutputType = program.publicOutputType; static tag = () => program; + + static declare(proof: Proof) { + if (inAnalyze()) { + let ctx = circuitContext.get()!; + ctx.proofs.push({ + proof: this, + input: proof.publicInput, + output: proof.publicOutput, + }); + } + } + static get provable() { return provableFromClass(ZkProgramProof, { publicInput: program.publicInputType, From 3fb95592538c97e7537b653871d7ca9481126bfd Mon Sep 17 00:00:00 2001 From: ymekuria Date: Sun, 2 Jun 2024 22:15:02 -0400 Subject: [PATCH 17/26] feat(zkprogram.ts): add witness method to zkprogram proof --- src/lib/proof-system/zkprogram.ts | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/lib/proof-system/zkprogram.ts b/src/lib/proof-system/zkprogram.ts index 609a4eccc9..c5ff57ede0 100644 --- a/src/lib/proof-system/zkprogram.ts +++ b/src/lib/proof-system/zkprogram.ts @@ -1216,6 +1216,14 @@ ZkProgram.Proof = function < proof: Unconstrained.provable, }); } + + static witness( + cb: () => Proof + ): Proof { + let p = Provable.witness(this.provable, cb); + + return cb(); + } }; }; From 988f4367a60c16568aced0f5580147cb13524da6 Mon Sep 17 00:00:00 2001 From: ymekuria Date: Sun, 2 Jun 2024 22:25:04 -0400 Subject: [PATCH 18/26] feat(zkprogram.ts): add witnessed proofs to compile function --- src/lib/proof-system/zkprogram.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/lib/proof-system/zkprogram.ts b/src/lib/proof-system/zkprogram.ts index c5ff57ede0..d7560b78fb 100644 --- a/src/lib/proof-system/zkprogram.ts +++ b/src/lib/proof-system/zkprogram.ts @@ -521,6 +521,7 @@ function ZkProgram< } = {}) { let methodsMeta = await analyzeMethods(); let gates = methodKeys.map((k) => methodsMeta[k].gates); + let witnessedProofs = methodKeys.map((k) => methodsMeta[k].proofData); let { provers, verify, verificationKey } = await compileProgram({ publicInputType, publicOutputType, @@ -531,6 +532,7 @@ function ZkProgram< cache, forceRecompile, overrideWrapDomain: config.overrideWrapDomain, + witnessedProofs, }); compileOutput = { provers, verify }; return { verificationKey }; From b3a616a4d6a4f7ea90ab6ab880d2d436a2a251d4 Mon Sep 17 00:00:00 2001 From: ymekuria Date: Sun, 2 Jun 2024 23:08:44 -0400 Subject: [PATCH 19/26] feat(zkprogram.ts): add witnessed proofs to getPreviousProofsForProver function --- src/lib/proof-system/zkprogram.ts | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/src/lib/proof-system/zkprogram.ts b/src/lib/proof-system/zkprogram.ts index d7560b78fb..c2b9e613d9 100644 --- a/src/lib/proof-system/zkprogram.ts +++ b/src/lib/proof-system/zkprogram.ts @@ -34,6 +34,7 @@ import { CircuitContext, circuitContext, snarkContext, + ProofContext, } from '../provable/core/provable-context.js'; import { hashConstant } from '../provable/crypto/poseidon.js'; import { MlArray, MlBool, MlResult, MlPair } from '../ml/base.js'; @@ -515,13 +516,14 @@ function ZkProgram< } | undefined; + let witnessedProofs: ProofContext[][] = []; async function compile({ cache = Cache.FileSystemDefault, forceRecompile = false, } = {}) { let methodsMeta = await analyzeMethods(); let gates = methodKeys.map((k) => methodsMeta[k].gates); - let witnessedProofs = methodKeys.map((k) => methodsMeta[k].proofData); + witnessedProofs = methodKeys.map((k) => methodsMeta[k].proofData); let { provers, verify, verificationKey } = await compileProgram({ publicInputType, publicOutputType, @@ -554,8 +556,9 @@ function ZkProgram< ); } let publicInputFields = toFieldConsts(publicInputType, publicInput); + let previousProofs = MlArray.to( - getPreviousProofsForProver(args, methodIntfs[i]) + getPreviousProofsForProver(args, methodIntfs[i], witnessedProofs[i]) ); let id = snarkContext.enter({ witnesses: args, inProver: true }); @@ -744,7 +747,12 @@ function isDynamicProof( function getPreviousProofsForProver( methodArgs: any[], - { allArgs }: MethodInterface + { allArgs }: MethodInterface, + witnessedProofs: { + proof: Subclass; + input: ProvablePure; + output: ProvablePure; + }[] ) { let previousProofs: Pickles.Proof[] = []; for (let i = 0; i < allArgs.length; i++) { @@ -753,6 +761,11 @@ function getPreviousProofsForProver( previousProofs[arg.index] = (methodArgs[i] as Proof).proof; } } + + for (let i = 0; i < witnessedProofs.length; i++) { + previousProofs.push(witnessedProofs[i].proof); + } + return previousProofs; } From 415549856682d9a37b9224a4a063147f877554d8 Mon Sep 17 00:00:00 2001 From: ymekuria Date: Sun, 2 Jun 2024 23:12:46 -0400 Subject: [PATCH 20/26] feat(zkprogram.ts): add witnessed proofs to compileProgram function --- src/lib/proof-system/zkprogram.ts | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/lib/proof-system/zkprogram.ts b/src/lib/proof-system/zkprogram.ts index c2b9e613d9..28701416b4 100644 --- a/src/lib/proof-system/zkprogram.ts +++ b/src/lib/proof-system/zkprogram.ts @@ -792,6 +792,7 @@ async function compileProgram({ cache, forceRecompile, overrideWrapDomain, + witnessedProofs, }: { publicInputType: ProvablePure; publicOutputType: ProvablePure; @@ -801,6 +802,11 @@ async function compileProgram({ proofSystemTag: { name: string }; cache: Cache; forceRecompile: boolean; + witnessedProofs: { + proof: Subclass; + input: ProvablePure; + output: ProvablePure; + }[][]; overrideWrapDomain?: 0 | 1 | 2; }) { await initializeBindings(); @@ -816,7 +822,8 @@ If you are using a SmartContract, make sure you are using the @method decorator. methods[i], proofSystemTag, methodEntry, - gates[i] + gates[i], + witnessedProofs[i] ) ); let maxProofs = getMaxProofsVerified(methodIntfs); From bbed51421f074ae22986f20534cfc27219672ee3 Mon Sep 17 00:00:00 2001 From: ymekuria Date: Mon, 3 Jun 2024 00:28:15 -0400 Subject: [PATCH 21/26] feat(zkprogram.ts): update picklesRuleFromFunction --- src/lib/proof-system/zkprogram.ts | 50 ++++++++++++++++++++++++++++++- 1 file changed, 49 insertions(+), 1 deletion(-) diff --git a/src/lib/proof-system/zkprogram.ts b/src/lib/proof-system/zkprogram.ts index 28701416b4..7091f5d7cc 100644 --- a/src/lib/proof-system/zkprogram.ts +++ b/src/lib/proof-system/zkprogram.ts @@ -915,12 +915,19 @@ function analyzeMethod( methodIntf: MethodInterface, method: (...args: any) => unknown ) { + console.log('ANALYZING METHOD, ENTERING CONTEXT'); + + let { context } = CircuitContext.enter(methodIntf.methodName); + let id = circuitContext.enter(context); + let proofData = context.proofs; + circuitContext.leave(id); return Provable.constraintSystem(() => { let args = synthesizeMethodArguments(methodIntf, true); let publicInput = emptyWitness(publicInputType); // note: returning the method result here makes this handle async methods if (publicInputType === Undefined || publicInputType === Void) return method(...args); + return method(publicInput, ...args); }); } @@ -944,7 +951,12 @@ function picklesRuleFromFunction( func: (...args: unknown[]) => unknown, proofSystemTag: { name: string }, { methodName, witnessArgs, proofArgs, allArgs }: MethodInterface, - gates: Gate[] + gates: Gate[], + witnessedProofs: { + proof: Subclass; + input: ProvablePure; + output: ProvablePure; + }[] ): Pickles.Rule { async function main( publicInput: MlFieldArray @@ -960,6 +972,7 @@ function picklesRuleFromFunction( for (let i = 0; i < allArgs.length; i++) { let arg = allArgs[i]; if (arg.type === 'witness') { + console.log('argType === witness,', arg); let type = witnessArgs[arg.index]; try { finalArgs[i] = Provable.witness(type, () => { @@ -970,6 +983,7 @@ function picklesRuleFromFunction( throw e; } } else if (arg.type === 'proof') { + console.log('argType === proof,', arg); let Proof = proofArgs[arg.index]; let type = getStatementType(Proof); let proof_ = (argsWithoutPublicInput?.[i] as Proof) ?? { @@ -988,6 +1002,40 @@ function picklesRuleFromFunction( previousStatements.push(MlPair(input, output)); } } + + for (let i = 0; i < witnessedProofs.length; i++) { + console.log('WE ARE WITNESSING A PROOF'); + + let ProofData = witnessedProofs[i]; + let Proof = ProofData.proof; + let type = getStatementType(Proof); + Provable.log(Proof); + + let { input: input_, output: output_ } = ProofData; + Provable.log(input_); + console.log('---------'); + let proof_ = { + proof: undefined, + publicInput: emptyValue(type.input), + publicOutput: emptyValue(type.output), + }; + let { proof, publicInput, publicOutput } = proof_; + Provable.log(publicInput); + Provable.log(publicOutput); + publicInput = Provable.witness(type.input, () => publicInput); + publicOutput = Provable.witness(type.output, () => publicOutput); + let proofInstance = new Proof({ + publicInput, + publicOutput, + proof, + }); + finalArgs[i] = proofInstance; + proofs.push(proofInstance); + let input = toFieldVars(type.input, publicInput); + let output = toFieldVars(type.output, publicOutput); + previousStatements.push(MlPair(input, output)); + } + let result: any; if (publicInputType === Undefined || publicInputType === Void) { result = await func(...finalArgs); From 08f96d006526c57af8326d4a7eac13fa40da3e0d Mon Sep 17 00:00:00 2001 From: ymekuria Date: Mon, 3 Jun 2024 00:35:57 -0400 Subject: [PATCH 22/26] feat(zkprogram.ts): update witnessed proof type --- src/lib/proof-system/zkprogram.ts | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/src/lib/proof-system/zkprogram.ts b/src/lib/proof-system/zkprogram.ts index 7091f5d7cc..820d10590d 100644 --- a/src/lib/proof-system/zkprogram.ts +++ b/src/lib/proof-system/zkprogram.ts @@ -119,7 +119,7 @@ class ProofBase { publicInput: type.input.toFields(this.publicInput).map(String), publicOutput: type.output.toFields(this.publicOutput).map(String), maxProofsVerified: this.maxProofsVerified, - proof: Pickles.proofToBase64([this.maxProofsVerified, this.proof]), + proof: Pickles.proofToBase64([this.maxProofsVerified, this.proof.get()]), }; } @@ -748,11 +748,7 @@ function isDynamicProof( function getPreviousProofsForProver( methodArgs: any[], { allArgs }: MethodInterface, - witnessedProofs: { - proof: Subclass; - input: ProvablePure; - output: ProvablePure; - }[] + witnessedProofs: ProofContext[] ) { let previousProofs: Pickles.Proof[] = []; for (let i = 0; i < allArgs.length; i++) { @@ -763,7 +759,7 @@ function getPreviousProofsForProver( } for (let i = 0; i < witnessedProofs.length; i++) { - previousProofs.push(witnessedProofs[i].proof); + previousProofs.push(witnessedProofs[i].proof as Unconstrained); } return previousProofs; From 7d1b5ba85e3e158dba77c51518bd757916c3d721 Mon Sep 17 00:00:00 2001 From: ymekuria Date: Mon, 3 Jun 2024 00:46:28 -0400 Subject: [PATCH 23/26] feat(zkprogram.ts): update pickles rule function --- src/lib/proof-system/zkprogram.ts | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/src/lib/proof-system/zkprogram.ts b/src/lib/proof-system/zkprogram.ts index 820d10590d..feba93dbdf 100644 --- a/src/lib/proof-system/zkprogram.ts +++ b/src/lib/proof-system/zkprogram.ts @@ -798,11 +798,7 @@ async function compileProgram({ proofSystemTag: { name: string }; cache: Cache; forceRecompile: boolean; - witnessedProofs: { - proof: Subclass; - input: ProvablePure; - output: ProvablePure; - }[][]; + witnessedProofs: ProofContext[][]; overrideWrapDomain?: 0 | 1 | 2; }) { await initializeBindings(); @@ -1002,12 +998,13 @@ function picklesRuleFromFunction( for (let i = 0; i < witnessedProofs.length; i++) { console.log('WE ARE WITNESSING A PROOF'); - let ProofData = witnessedProofs[i]; - let Proof = ProofData.proof; - let type = getStatementType(Proof); + let proofContext = witnessedProofs[i]; + console.log('proofContext', proofContext.proof); + let ProofClass = proofContext.proofClass; + let type = getStatementType(proofContext.proofClass); Provable.log(Proof); - let { input: input_, output: output_ } = ProofData; + let { publicInput: input_, publicOutput: output_ } = proofContext; Provable.log(input_); console.log('---------'); let proof_ = { @@ -1020,12 +1017,13 @@ function picklesRuleFromFunction( Provable.log(publicOutput); publicInput = Provable.witness(type.input, () => publicInput); publicOutput = Provable.witness(type.output, () => publicOutput); - let proofInstance = new Proof({ + let proofInstance = new ProofClass({ publicInput, publicOutput, proof, }); - finalArgs[i] = proofInstance; + proofInstance.shouldVerify = Bool(true); + // finalArgs[i] = proofInstance; proofs.push(proofInstance); let input = toFieldVars(type.input, publicInput); let output = toFieldVars(type.output, publicOutput); From f92bbe4eb2285a51557a541e43e1a0966a719e49 Mon Sep 17 00:00:00 2001 From: ymekuria Date: Mon, 3 Jun 2024 00:58:07 -0400 Subject: [PATCH 24/26] feat(zkprogram.ts): update declare --- src/lib/proof-system/zkprogram.ts | 27 ++++++++++++++++++--------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/src/lib/proof-system/zkprogram.ts b/src/lib/proof-system/zkprogram.ts index feba93dbdf..e3db933ef8 100644 --- a/src/lib/proof-system/zkprogram.ts +++ b/src/lib/proof-system/zkprogram.ts @@ -1263,14 +1263,23 @@ ZkProgram.Proof = function < static tag = () => program; static declare(proof: Proof) { - if (inAnalyze()) { - let ctx = circuitContext.get()!; - ctx.proofs.push({ - proof: this, - input: proof.publicInput, - output: proof.publicOutput, - }); - } + let ctx = circuitContext.get()!; + console.log('declaring', { + proof: proof.proof, + publicInput: proof.publicInput, + publicOutput: proof.publicOutput, + maxProofsVerified: proof.maxProofsVerified, + proofClass: this, + shouldVerify: proof.shouldVerify, + }); + ctx.proofs.push({ + proof: proof.proof, + publicInput: proof.publicInput, + publicOutput: proof.publicOutput, + maxProofsVerified: proof.maxProofsVerified, + proofClass: this, + shouldVerify: proof.shouldVerify, + }); } static get provable() { @@ -1278,7 +1287,7 @@ ZkProgram.Proof = function < publicInput: program.publicInputType, publicOutput: program.publicOutputType, proof: Unconstrained.provable, - }); + }) satisfies ProvableExtended; } static witness( From 5e6b42679e7741c830988a5f1188c66d779e1baf Mon Sep 17 00:00:00 2001 From: ymekuria Date: Mon, 3 Jun 2024 01:12:39 -0400 Subject: [PATCH 25/26] feat(zkprogram.ts): update witnessedProofs type --- src/lib/proof-system/zkprogram.ts | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/src/lib/proof-system/zkprogram.ts b/src/lib/proof-system/zkprogram.ts index e3db933ef8..3f95e2aa9e 100644 --- a/src/lib/proof-system/zkprogram.ts +++ b/src/lib/proof-system/zkprogram.ts @@ -944,11 +944,7 @@ function picklesRuleFromFunction( proofSystemTag: { name: string }, { methodName, witnessArgs, proofArgs, allArgs }: MethodInterface, gates: Gate[], - witnessedProofs: { - proof: Subclass; - input: ProvablePure; - output: ProvablePure; - }[] + witnessedProofs: ProofContext[] ): Pickles.Rule { async function main( publicInput: MlFieldArray @@ -997,7 +993,6 @@ function picklesRuleFromFunction( for (let i = 0; i < witnessedProofs.length; i++) { console.log('WE ARE WITNESSING A PROOF'); - let proofContext = witnessedProofs[i]; console.log('proofContext', proofContext.proof); let ProofClass = proofContext.proofClass; From 4acdff0717f6ee58e0e39a559515f6f676b55803 Mon Sep 17 00:00:00 2001 From: ymekuria Date: Mon, 3 Jun 2024 23:35:26 -0400 Subject: [PATCH 26/26] feat(zkapp.ts): add witnessedProofs argument to getPreviousProofsForProver calls --- src/lib/mina/zkapp.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/lib/mina/zkapp.ts b/src/lib/mina/zkapp.ts index 84e73cc286..441d61afe8 100644 --- a/src/lib/mina/zkapp.ts +++ b/src/lib/mina/zkapp.ts @@ -342,7 +342,8 @@ function wrapMethod( // proofs actually don't have to be cloned previousProofs: getPreviousProofsForProver( actualArgs, - methodIntf + methodIntf, + [] ), ZkappClass, memoized, @@ -434,7 +435,8 @@ function wrapMethod( args: constantArgs, previousProofs: getPreviousProofsForProver( constantArgs, - methodIntf + methodIntf, + [] ), ZkappClass, memoized,