From ac73fcb9fc4f3c9a8a6e8a5206285d82444e40cb Mon Sep 17 00:00:00 2001 From: Gregor Date: Fri, 5 May 2023 17:34:34 +0200 Subject: [PATCH 01/44] fixup global slot binable / json --- src/bindings | 2 +- src/mina-signer/src/sign-legacy.ts | 8 +++---- src/mina-signer/src/transaction-hash.ts | 24 +++++++++++++++---- .../src/transaction-hash.unit-test.ts | 2 +- 4 files changed, 26 insertions(+), 10 deletions(-) diff --git a/src/bindings b/src/bindings index 89e2d3c29..57d987874 160000 --- a/src/bindings +++ b/src/bindings @@ -1 +1 @@ -Subproject commit 89e2d3c295bb35dfe7bea6a318686c05c8023897 +Subproject commit 57d987874bd2b0df4c7e51bfed0a3b2432898583 diff --git a/src/mina-signer/src/sign-legacy.ts b/src/mina-signer/src/sign-legacy.ts index a31450093..5ce2e954e 100644 --- a/src/mina-signer/src/sign-legacy.ts +++ b/src/mina-signer/src/sign-legacy.ts @@ -146,7 +146,7 @@ function commonToInputLegacy({ HashInputLegacy.bits(legacyTokenId), PublicKey.toInputLegacy(feePayer), HashInputLegacy.bits(UInt32.toBits(nonce)), - HashInputLegacy.bits(UInt32.toBits(validUntil)), + HashInputLegacy.bits(UInt32.toBits(validUntil.value)), HashInputLegacy.bits(Memo.toBits(memo)), ].reduce(HashInputLegacy.append); } @@ -188,12 +188,12 @@ function delegationFromJson({ }; } -function commonFromJson(c: CommonJson) { +function commonFromJson(c: CommonJson): Common { return { fee: UInt64.fromJSON(c.fee), feePayer: PublicKey.fromJSON(c.feePayer), nonce: UInt32.fromJSON(c.nonce), - validUntil: UInt32.fromJSON(c.validUntil), + validUntil: { type: 'SinceGenesis', value: UInt32.fromJSON(c.validUntil) }, // TODO: this might need to be fromBase58 memo: Memo.fromString(c.memo), }; @@ -262,7 +262,7 @@ type Common = { fee: UInt64; feePayer: PublicKey; nonce: UInt32; - validUntil: UInt32; + validUntil: { type: 'SinceGenesis'; value: UInt32 }; memo: string; }; diff --git a/src/mina-signer/src/transaction-hash.ts b/src/mina-signer/src/transaction-hash.ts index af6e04913..4f65d229c 100644 --- a/src/mina-signer/src/transaction-hash.ts +++ b/src/mina-signer/src/transaction-hash.ts @@ -1,4 +1,4 @@ -import { Bool, Field, UInt64 } from '../../provable/field-bigint.js'; +import { Bool, Field, UInt32, UInt64 } from '../../provable/field-bigint.js'; import { Binable, BinableString, @@ -98,13 +98,17 @@ function userCommandToEnum({ common, body }: UserCommand): UserCommandEnum { // binable let BinablePublicKey = record({ x: Field, isOdd: Bool }, ['x', 'isOdd']); +type GlobalSlotSinceGenesis = Common['validUntil']; +let GlobalSlotSinceGenesis = enumWithArgument<[GlobalSlotSinceGenesis]>([ + { type: 'SinceGenesis', value: BinableUint32 }, +]); const Common = record( { fee: BinableUint64, feePayer: BinablePublicKey, nonce: BinableUint32, - validUntil: BinableUint32, + validUntil: GlobalSlotSinceGenesis, memo: BinableString, }, ['fee', 'feePayer', 'nonce', 'validUntil', 'memo'] @@ -197,7 +201,11 @@ function hashSignedCommandV1(command: SignedCommandV1) { function userCommandToV1({ common, body }: UserCommand): UserCommandV1 { let { tag: type, ...value } = body; - let commonV1: CommonV1 = { ...common, feeToken: 1n }; + let commonV1: CommonV1 = { + ...common, + validUntil: common.validUntil.value, + feeToken: 1n, + }; switch (type) { case 'Payment': let paymentV1: PaymentV1 = { ...value, tokenId: 1n }; @@ -223,7 +231,15 @@ function userCommandToV1({ common, body }: UserCommand): UserCommandV1 { const with1 = (binable: Binable) => withVersionNumber(binable, 1); const Uint64V1 = with1(with1(BinableUint64)); const Uint32V1 = with1(with1(BinableUint32)); -type CommonV1 = Common & { feeToken: UInt64 }; +type CommonV1 = { + fee: UInt64; + feePayer: PublicKey; + nonce: UInt32; + validUntil: UInt32; + memo: string; + feeToken: UInt64; +}; + const CommonV1 = with1( with1( record( diff --git a/src/mina-signer/src/transaction-hash.unit-test.ts b/src/mina-signer/src/transaction-hash.unit-test.ts index e1da47acf..a0cc4fd16 100644 --- a/src/mina-signer/src/transaction-hash.unit-test.ts +++ b/src/mina-signer/src/transaction-hash.unit-test.ts @@ -234,7 +234,7 @@ function commonToOcaml({ fee, feePayer, nonce, validUntil, memo }: CommonJson) { fee: fee === '0' ? fee : fee.slice(0, -9), fee_payer_pk: feePayer, nonce, - valid_until: validUntil, + valid_until: ['Since_genesis', validUntil], memo, }; } From a51a84db61d3586c55c9978ce9ecc8f657167f3d Mon Sep 17 00:00:00 2001 From: Gregor Date: Fri, 5 May 2023 17:51:09 +0200 Subject: [PATCH 02/44] bindings --- src/bindings | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/bindings b/src/bindings index 57d987874..5b009c5f8 160000 --- a/src/bindings +++ b/src/bindings @@ -1 +1 @@ -Subproject commit 57d987874bd2b0df4c7e51bfed0a3b2432898583 +Subproject commit 5b009c5f859ba9dd35a93a358f1f33abec35aeeb From e6106e2a6a7ec0c4b4da72f2b4d3339d394b5171 Mon Sep 17 00:00:00 2001 From: Gregor Date: Fri, 5 May 2023 18:19:20 +0200 Subject: [PATCH 03/44] bindings --- src/bindings | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/bindings b/src/bindings index 89e2d3c29..785c7b781 160000 --- a/src/bindings +++ b/src/bindings @@ -1 +1 @@ -Subproject commit 89e2d3c295bb35dfe7bea6a318686c05c8023897 +Subproject commit 785c7b781e1c41c3d86c0c3966f7a0e04a5df7a4 From 36627c59b6d01219a85a3384e149f3e3cb519e40 Mon Sep 17 00:00:00 2001 From: Gregor Date: Fri, 5 May 2023 20:35:49 +0200 Subject: [PATCH 04/44] bindings --- src/bindings | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/bindings b/src/bindings index 785c7b781..2dd5515dd 160000 --- a/src/bindings +++ b/src/bindings @@ -1 +1 @@ -Subproject commit 785c7b781e1c41c3d86c0c3966f7a0e04a5df7a4 +Subproject commit 2dd5515dd68f8fa91a93386ae3b7162a4b2e7be1 From 9e06f9c7dab4719ae2a286941cc8684508cae4e6 Mon Sep 17 00:00:00 2001 From: Gregor Date: Mon, 8 May 2023 12:38:39 +0200 Subject: [PATCH 05/44] bindings --- src/bindings | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/bindings b/src/bindings index 5b009c5f8..a13d3868a 160000 --- a/src/bindings +++ b/src/bindings @@ -1 +1 @@ -Subproject commit 5b009c5f859ba9dd35a93a358f1f33abec35aeeb +Subproject commit a13d3868a4b79e469f8f42078f91de484c210009 From 835c6fc36c13c2e096f8e6cb07f5fa84b7c0c1e3 Mon Sep 17 00:00:00 2001 From: Nathan Holland Date: Mon, 1 May 2023 14:43:24 -0600 Subject: [PATCH 06/44] Remove duplicate user command fields --- src/mina-signer/MinaSigner.ts | 12 +++---- src/mina-signer/src/random-transaction.ts | 2 -- src/mina-signer/src/sign-legacy.ts | 27 +++++++++++---- src/mina-signer/src/sign-legacy.unit-test.ts | 14 -------- .../src/test-vectors/legacySignatures.ts | 12 +++---- src/mina-signer/src/transaction-hash.ts | 33 +++++++++--------- .../src/transaction-hash.unit-test.ts | 34 ++++++++++--------- src/mina-signer/tests/rosetta.test.ts | 2 +- 8 files changed, 69 insertions(+), 67 deletions(-) diff --git a/src/mina-signer/MinaSigner.ts b/src/mina-signer/MinaSigner.ts index e75af8aa2..67d75a8a3 100644 --- a/src/mina-signer/MinaSigner.ts +++ b/src/mina-signer/MinaSigner.ts @@ -197,7 +197,7 @@ class Client { let signature = signPayment( { common: { fee, feePayer: from, nonce, validUntil, memo }, - body: { source: from, receiver: to, amount }, + body: { receiver: to, amount }, }, privateKey, this.network @@ -225,7 +225,7 @@ class Client { return verifyPayment( { common: { fee, feePayer: from, nonce, validUntil, memo }, - body: { source: from, receiver: to, amount }, + body: { receiver: to, amount }, }, signature, publicKey, @@ -253,7 +253,7 @@ class Client { let signature = signStakeDelegation( { common: { fee, feePayer: from, nonce, validUntil, memo }, - body: { newDelegate: to, delegator: from }, + body: { newDelegate: to }, }, privateKey, this.network @@ -280,7 +280,7 @@ class Client { return verifyStakeDelegation( { common: { fee, feePayer: from, nonce, validUntil, memo }, - body: { newDelegate: to, delegator: from }, + body: { newDelegate: to }, }, signature, publicKey, @@ -305,7 +305,7 @@ class Client { signature, data: { common: { fee, feePayer: from, nonce, validUntil, memo }, - body: { source: from, receiver: to, amount }, + body: { receiver: to, amount }, }, }, options @@ -328,7 +328,7 @@ class Client { signature, data: { common: { fee, feePayer: from, nonce, validUntil, memo }, - body: { newDelegate: to, delegator: from }, + body: { newDelegate: to }, }, }, options diff --git a/src/mina-signer/src/random-transaction.ts b/src/mina-signer/src/random-transaction.ts index b7eceb350..80ecf9d7f 100644 --- a/src/mina-signer/src/random-transaction.ts +++ b/src/mina-signer/src/random-transaction.ts @@ -23,7 +23,6 @@ const common = record({ const payment = record({ common, body: record({ - source: Random.json.publicKey, receiver: Random.json.publicKey, amount: Random.json.uint64, }), @@ -36,7 +35,6 @@ const signedPayment = record>({ const delegation = record({ common, body: record({ - delegator: Random.json.publicKey, newDelegate: Random.json.publicKey, }), }); diff --git a/src/mina-signer/src/sign-legacy.ts b/src/mina-signer/src/sign-legacy.ts index a31450093..4dae20cc0 100644 --- a/src/mina-signer/src/sign-legacy.ts +++ b/src/mina-signer/src/sign-legacy.ts @@ -23,7 +23,9 @@ export { delegationFromJson, commonFromJson, PaymentJson, + PaymentJsonV1, DelegationJson, + DelegationJsonV1, CommonJson, Tag, UserCommand, @@ -160,13 +162,13 @@ const legacyTokenId = [true, ...Array(63).fill(false)]; function paymentFromJson({ common, - body: { source, receiver, amount }, + body: { receiver, amount }, }: PaymentJson): UserCommand { return { common: commonFromJson(common), body: { tag: 'Payment', - source: PublicKey.fromJSON(source), + source: PublicKey.fromJSON(common.feePayer), receiver: PublicKey.fromJSON(receiver), amount: UInt64.fromJSON(amount), }, @@ -175,13 +177,13 @@ function paymentFromJson({ function delegationFromJson({ common, - body: { delegator, newDelegate }, + body: { newDelegate }, }: DelegationJson): UserCommand { return { common: commonFromJson(common), body: { tag: 'StakeDelegation', - source: PublicKey.fromJSON(delegator), + source: PublicKey.fromJSON(common.feePayer), receiver: PublicKey.fromJSON(newDelegate), amount: UInt64(0), }, @@ -267,12 +269,10 @@ type Common = { }; type Payment = { - source: PublicKey; receiver: PublicKey; amount: UInt64; }; type Delegation = { - delegator: PublicKey; newDelegate: PublicKey; }; @@ -285,6 +285,14 @@ type CommonJson = { }; type PaymentJson = { + common: CommonJson; + body: { + receiver: Json.PublicKey; + amount: Json.UInt64; + }; +}; + +type PaymentJsonV1 = { common: CommonJson; body: { source: Json.PublicKey; @@ -294,6 +302,13 @@ type PaymentJson = { }; type DelegationJson = { + common: CommonJson; + body: { + newDelegate: Json.PublicKey; + }; +}; + +type DelegationJsonV1 = { common: CommonJson; body: { delegator: Json.PublicKey; diff --git a/src/mina-signer/src/sign-legacy.unit-test.ts b/src/mina-signer/src/sign-legacy.unit-test.ts index 566ab16da..f414f1c7f 100644 --- a/src/mina-signer/src/sign-legacy.unit-test.ts +++ b/src/mina-signer/src/sign-legacy.unit-test.ts @@ -106,13 +106,6 @@ let amountTooLarge = { amount: (2n ** 64n).toString(), }, }; -let invalidPublicKey: PaymentJson = { - common: validPayment.common, - body: { - ...validPayment.body, - source: PublicKey.toBase58({ x: 0n, isOdd: 0n }), - }, -}; let signature = Signature.toJSON({ r: Field.random(), s: Scalar.random() }); expect(() => signPayment(amountTooLarge, privateKey, 'mainnet')).toThrow( @@ -122,13 +115,6 @@ expect(verifyPayment(amountTooLarge, signature, publicKey, 'mainnet')).toEqual( false ); -expect(() => signPayment(invalidPublicKey, privateKey, 'mainnet')).toThrow( - 'not a valid group element' -); -expect( - verifyPayment(invalidPublicKey, signature, publicKey, 'mainnet') -).toEqual(false); - // negative tests with invalid signatures let garbageSignature = { field: 'garbage', scalar: 'garbage' }; diff --git a/src/mina-signer/src/test-vectors/legacySignatures.ts b/src/mina-signer/src/test-vectors/legacySignatures.ts index 82c0c450f..d31f538f5 100644 --- a/src/mina-signer/src/test-vectors/legacySignatures.ts +++ b/src/mina-signer/src/test-vectors/legacySignatures.ts @@ -14,7 +14,7 @@ let newDelegate = 'B62qkfHpLpELqpMK6ZvUTJ5wRqKDRF3UHyJ4Kv3FU79Sgs4qpBnx5RR'; let payments: PaymentJson[] = [ { - body: { source: keypair.publicKey, receiver, amount: '42' }, + body: { receiver, amount: '42' }, common: { fee: '3', feePayer: keypair.publicKey, @@ -24,7 +24,7 @@ let payments: PaymentJson[] = [ }, }, { - body: { source: keypair.publicKey, receiver, amount: '2048' }, + body: { receiver, amount: '2048' }, common: { fee: '15', feePayer: keypair.publicKey, @@ -34,7 +34,7 @@ let payments: PaymentJson[] = [ }, }, { - body: { source: keypair.publicKey, receiver, amount: '109' }, + body: { receiver, amount: '109' }, common: { fee: '2001', feePayer: keypair.publicKey, @@ -47,7 +47,7 @@ let payments: PaymentJson[] = [ let delegations: DelegationJson[] = [ { - body: { delegator: keypair.publicKey, newDelegate }, + body: { newDelegate }, common: { fee: '3', feePayer: keypair.publicKey, @@ -57,7 +57,7 @@ let delegations: DelegationJson[] = [ }, }, { - body: { delegator: keypair.publicKey, newDelegate }, + body: { newDelegate }, common: { fee: '10', feePayer: keypair.publicKey, @@ -67,7 +67,7 @@ let delegations: DelegationJson[] = [ }, }, { - body: { delegator: keypair.publicKey, newDelegate }, + body: { newDelegate }, common: { fee: '8', feePayer: keypair.publicKey, diff --git a/src/mina-signer/src/transaction-hash.ts b/src/mina-signer/src/transaction-hash.ts index af6e04913..de8357295 100644 --- a/src/mina-signer/src/transaction-hash.ts +++ b/src/mina-signer/src/transaction-hash.ts @@ -51,7 +51,7 @@ function hashPayment( if (!berkeley) return hashPaymentV1(signed); let payload = userCommandToEnum(paymentFromJson(signed.data)); return hashSignedCommand({ - signer: PublicKey.fromBase58(signed.data.body.source), + signer: PublicKey.fromBase58(signed.data.common.feePayer), signature: dummySignature, payload, }); @@ -64,7 +64,7 @@ function hashStakeDelegation( if (!berkeley) return hashStakeDelegationV1(signed); let payload = userCommandToEnum(delegationFromJson(signed.data)); return hashSignedCommand({ - signer: PublicKey.fromBase58(signed.data.body.delegator), + signer: PublicKey.fromBase58(signed.data.common.feePayer), signature: dummySignature, payload, }); @@ -82,14 +82,14 @@ function userCommandToEnum({ common, body }: UserCommand): UserCommandEnum { let { tag: type, ...value } = body; switch (type) { case 'Payment': - return { common, body: { type, value } }; + return { common, body: { type, value: { receiver: body.receiver, amount: body.amount } } }; case 'StakeDelegation': - let { source: delegator, receiver: newDelegate } = value; + let { receiver: newDelegate } = value; return { common, body: { type, - value: { type: 'SetDelegate', value: { delegator, newDelegate } }, + value: { type: 'SetDelegate', value: { newDelegate } }, }, }; } @@ -111,15 +111,14 @@ const Common = record( ); const Payment = record( { - source: BinablePublicKey, receiver: BinablePublicKey, amount: BinableUint64, }, - ['source', 'receiver', 'amount'] + ['receiver', 'amount'] ); const Delegation = record( - { delegator: BinablePublicKey, newDelegate: BinablePublicKey }, - ['delegator', 'newDelegate'] + { newDelegate: BinablePublicKey }, + ['newDelegate'] ); type DelegationEnum = { type: 'SetDelegate'; value: Delegation }; const DelegationEnum = enumWithArgument<[DelegationEnum]>([ @@ -170,7 +169,7 @@ const HashBase58 = base58( function hashPaymentV1({ data, signature }: SignedLegacy) { let paymentV1 = userCommandToV1(paymentFromJson(data)); return hashSignedCommandV1({ - signer: PublicKey.fromBase58(data.body.source), + signer: PublicKey.fromBase58(data.common.feePayer), signature: Signature.fromJSON(signature), payload: paymentV1, }); @@ -182,7 +181,7 @@ function hashStakeDelegationV1({ }: SignedLegacy) { let payload = userCommandToV1(delegationFromJson(data)); return hashSignedCommandV1({ - signer: PublicKey.fromBase58(data.body.delegator), + signer: PublicKey.fromBase58(data.common.feePayer), signature: Signature.fromJSON(signature), payload, }); @@ -239,7 +238,7 @@ const CommonV1 = with1( ) ) ); -type PaymentV1 = Payment & { tokenId: UInt64 }; +type PaymentV1 = Payment & { source: PublicKey, tokenId: UInt64 }; const PaymentV1 = with1( with1( record( @@ -253,23 +252,25 @@ const PaymentV1 = with1( ) ) ); -const DelegationV1 = record( +type DelegationV1 = Delegation & { delegator: PublicKey }; +const DelegationV1 = record( { delegator: PublicKey, newDelegate: PublicKey }, ['delegator', 'newDelegate'] ); +type DelegationEnumV1 = { type: 'SetDelegate'; value: DelegationV1 }; const DelegationEnumV1 = with1( - enumWithArgument<[DelegationEnum]>([ + enumWithArgument<[DelegationEnumV1]>([ { type: 'SetDelegate', value: DelegationV1 }, ]) ); type BodyV1 = | { type: 'Payment'; value: PaymentV1 } - | { type: 'StakeDelegation'; value: DelegationEnum }; + | { type: 'StakeDelegation'; value: DelegationEnumV1 }; const BodyV1 = with1( enumWithArgument< [ { type: 'Payment'; value: PaymentV1 }, - { type: 'StakeDelegation'; value: DelegationEnum } + { type: 'StakeDelegation'; value: DelegationEnumV1 } ] >([ { type: 'Payment', value: PaymentV1 }, diff --git a/src/mina-signer/src/transaction-hash.unit-test.ts b/src/mina-signer/src/transaction-hash.unit-test.ts index e1da47acf..9e89280eb 100644 --- a/src/mina-signer/src/transaction-hash.unit-test.ts +++ b/src/mina-signer/src/transaction-hash.unit-test.ts @@ -11,10 +11,12 @@ import { } from './transaction-hash.js'; import { PaymentJson, + PaymentJsonV1, commonFromJson, paymentFromJson, CommonJson, DelegationJson, + DelegationJsonV1, delegationFromJson, } from './sign-legacy.js'; import { Signature, SignatureJson } from './signature.js'; @@ -44,7 +46,7 @@ test( let paymentBytes0 = [...result.data]; let payload = userCommandToEnum(paymentFromJson(payment.data)); let command = { - signer: PublicKey.fromBase58(payment.data.body.source), + signer: PublicKey.fromBase58(payment.data.common.feePayer), signature: Signature.fromJSON(payment.signature), payload, }; @@ -68,7 +70,7 @@ test( let delegationBytes0 = [...result.data]; payload = userCommandToEnum(delegationFromJson(delegation.data)); command = { - signer: PublicKey.fromBase58(delegation.data.body.delegator), + signer: PublicKey.fromBase58(delegation.data.common.feePayer), signature: Signature.fromJSON(delegation.signature), payload, }; @@ -94,7 +96,7 @@ test( ); let paymentV1Body = userCommandToV1(paymentFromJson(payment.data)); let paymentV1 = { - signer: PublicKey.fromBase58(payment.data.body.source), + signer: PublicKey.fromBase58(payment.data.common.feePayer), signature: Signature.fromJSON(payment.signature), payload: paymentV1Body, }; @@ -114,7 +116,7 @@ test( ); let delegationV1Body = userCommandToV1(delegationFromJson(delegation.data)); let delegationV1 = { - signer: PublicKey.fromBase58(delegation.data.body.delegator), + signer: PublicKey.fromBase58(delegation.data.common.feePayer), signature: Signature.fromJSON(delegation.signature), payload: delegationV1Body, }; @@ -154,16 +156,16 @@ shutdown(); function paymentToOcaml({ data: { common, - body: { source, receiver, amount }, + body: { receiver, amount }, }, signature, }: SignedLegacy) { return { payload: { common: commonToOcaml(common), - body: ['Payment', { source_pk: source, receiver_pk: receiver, amount }], + body: ['Payment', { receiver_pk: receiver, amount }], }, - signer: source, + signer: common.feePayer, signature: signatureToOCaml(signature), }; } @@ -171,7 +173,7 @@ function paymentToOcaml({ function paymentToOcamlV1({ data: { common, - body: { source, receiver, amount }, + body: { receiver, amount }, }, signature, }: SignedLegacy) { @@ -180,10 +182,10 @@ function paymentToOcamlV1({ common: commonToOcamlV1(common), body: [ 'Payment', - { source_pk: source, receiver_pk: receiver, amount, token_id: '1' }, + { source_pk: common.feePayer, receiver_pk: receiver, amount, token_id: '1' }, ], }, - signer: source, + signer: common.feePayer, signature: signatureToOCaml(signature), }; } @@ -191,7 +193,7 @@ function paymentToOcamlV1({ function delegationToOcaml({ data: { common, - body: { delegator, newDelegate }, + body: { newDelegate }, }, signature, }: SignedLegacy) { @@ -200,10 +202,10 @@ function delegationToOcaml({ common: commonToOcaml(common), body: [ 'Stake_delegation', - ['Set_delegate', { delegator, new_delegate: newDelegate }], + ['Set_delegate', { new_delegate: newDelegate }], ], }, - signer: delegator, + signer: common.feePayer, signature: signatureToOCaml(signature), }; } @@ -211,7 +213,7 @@ function delegationToOcaml({ function delegationToOcamlV1({ data: { common, - body: { delegator, newDelegate }, + body: { newDelegate }, }, signature, }: SignedLegacy) { @@ -220,10 +222,10 @@ function delegationToOcamlV1({ common: commonToOcamlV1(common), body: [ 'Stake_delegation', - ['Set_delegate', { delegator, new_delegate: newDelegate }], + ['Set_delegate', { delegator: common.feePayer, new_delegate: newDelegate }], ], }, - signer: delegator, + signer: common.feePayer, signature: signatureToOCaml(signature), }; } diff --git a/src/mina-signer/tests/rosetta.test.ts b/src/mina-signer/tests/rosetta.test.ts index 73f6ecae9..5db94f21e 100644 --- a/src/mina-signer/tests/rosetta.test.ts +++ b/src/mina-signer/tests/rosetta.test.ts @@ -34,7 +34,7 @@ describe('Rosetta', () => { ); expect(signedRosettaTnxMockJson.payment.from).toEqual( - signedGraphQLCommandJson.data.payload.body[1].source_pk + signedGraphQLCommandJson.data.payload.common.fee_payer_pk ); expect(signedRosettaTnxMockJson.payment.amount).toEqual( From 885e2fa9ef732eccbab161dc5a561c56553dbd0a Mon Sep 17 00:00:00 2001 From: Gregor Date: Wed, 10 May 2023 08:25:16 +0200 Subject: [PATCH 07/44] bindings --- src/bindings | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/bindings b/src/bindings index 6bd470e06..081a9d26d 160000 --- a/src/bindings +++ b/src/bindings @@ -1 +1 @@ -Subproject commit 6bd470e06da32f471afe9e57209e5ff9aa31d5b0 +Subproject commit 081a9d26d45c00b07f3f799f6366049e87994fcf From 91eb907d2e7ce392a8c9527467a072fd061cf9dc Mon Sep 17 00:00:00 2001 From: Gregor Date: Wed, 10 May 2023 09:12:04 +0200 Subject: [PATCH 08/44] bindings --- src/bindings | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/bindings b/src/bindings index 081a9d26d..5eb6b3e77 160000 --- a/src/bindings +++ b/src/bindings @@ -1 +1 @@ -Subproject commit 081a9d26d45c00b07f3f799f6366049e87994fcf +Subproject commit 5eb6b3e77f343daa68a6d93be45b55c47d45b989 From 310a89fd174982c963ebd2830d0ec217cdeaabd2 Mon Sep 17 00:00:00 2001 From: Gregor Date: Wed, 10 May 2023 22:12:38 +0200 Subject: [PATCH 09/44] bindings --- src/bindings | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/bindings b/src/bindings index a13d3868a..df892d69a 160000 --- a/src/bindings +++ b/src/bindings @@ -1 +1 @@ -Subproject commit a13d3868a4b79e469f8f42078f91de484c210009 +Subproject commit df892d69a4fb1c19a287f6facb41dbc8f66bfe67 From 618b35a8a837c039a8ebd426c43c1522e0f50f14 Mon Sep 17 00:00:00 2001 From: Gregor Date: Thu, 11 May 2023 07:46:27 +0200 Subject: [PATCH 10/44] delete uninteresting unit test which fails CI --- src/lib/caller.unit-test.ts | 35 ----------------------------------- 1 file changed, 35 deletions(-) delete mode 100644 src/lib/caller.unit-test.ts diff --git a/src/lib/caller.unit-test.ts b/src/lib/caller.unit-test.ts deleted file mode 100644 index bb599d0ff..000000000 --- a/src/lib/caller.unit-test.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { isReady } from '../snarky.js'; -import { AccountUpdate, TokenId } from './account_update.js'; -import * as Mina from './mina.js'; -import { expect } from 'expect'; - -await isReady; - -let Local = Mina.LocalBlockchain(); -Mina.setActiveInstance(Local); - -let [{ privateKey, publicKey }] = Local.testAccounts; - -let parentId = TokenId.derive(publicKey); - -/** - * tests whether the following two account updates gives the child token permissions: - * - * InheritFromParent -> ParentsOwnToken - */ -let tx = await Mina.transaction(privateKey, () => { - let parent = AccountUpdate.defaultAccountUpdate(publicKey); - parent.body.mayUseToken = AccountUpdate.MayUseToken.InheritFromParent; - parent.balance.subInPlace(Mina.accountCreationFee()); - - let child = AccountUpdate.defaultAccountUpdate(publicKey, parentId); - child.body.mayUseToken = AccountUpdate.MayUseToken.ParentsOwnToken; - - AccountUpdate.attachToTransaction(parent); - parent.approve(child); -}); - -// according to this test, the child doesn't get token permissions -await expect(tx.send()).rejects.toThrow( - 'can not use or pass on token permissions' -); From 80ed0c0ae04d44ba85e34b0c1be6cde203ee70c4 Mon Sep 17 00:00:00 2001 From: Gregor Date: Thu, 11 May 2023 07:51:10 +0200 Subject: [PATCH 11/44] bindings --- src/bindings | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/bindings b/src/bindings index df892d69a..810766846 160000 --- a/src/bindings +++ b/src/bindings @@ -1 +1 @@ -Subproject commit df892d69a4fb1c19a287f6facb41dbc8f66bfe67 +Subproject commit 8107668466d832646e28813f900b2dd9080032ff From 4a2277bea90ef89e2e880d93c226726c3e209d15 Mon Sep 17 00:00:00 2001 From: Gregor Date: Thu, 1 Jun 2023 18:18:41 +0200 Subject: [PATCH 12/44] bindings --- src/bindings | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/bindings b/src/bindings index f8307e359..6d95c50c5 160000 --- a/src/bindings +++ b/src/bindings @@ -1 +1 @@ -Subproject commit f8307e359b3f7ee5f3b132a47a80561358279ee3 +Subproject commit 6d95c50c5aa81fce256173fcdd092953558ab17e From c309fb15df14982420f7e5edaadaf4265b5bc908 Mon Sep 17 00:00:00 2001 From: Gregor Date: Thu, 1 Jun 2023 18:24:58 +0200 Subject: [PATCH 13/44] bindings --- src/bindings | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/bindings b/src/bindings index 6d95c50c5..14c0c647c 160000 --- a/src/bindings +++ b/src/bindings @@ -1 +1 @@ -Subproject commit 6d95c50c5aa81fce256173fcdd092953558ab17e +Subproject commit 14c0c647c9da0c515d7b86e9ef35a9e023ff071a From abe02ddd324c05e2f2773a694282e759081cb3c0 Mon Sep 17 00:00:00 2001 From: Gregor Date: Fri, 2 Jun 2023 22:01:12 +0200 Subject: [PATCH 14/44] bindings --- src/bindings | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/bindings b/src/bindings index 6961e0dd6..3a2480baa 160000 --- a/src/bindings +++ b/src/bindings @@ -1 +1 @@ -Subproject commit 6961e0dd6b4e1707c825483b159a4a80844237e2 +Subproject commit 3a2480baa486362ea3d306168c48d31bde1f8d87 From 1b66620d1b399da0df4b94d2a56de3563956bb3f Mon Sep 17 00:00:00 2001 From: Gregor Date: Thu, 15 Jun 2023 15:48:08 +0200 Subject: [PATCH 15/44] bindings --- src/bindings | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/bindings b/src/bindings index 557cdddc4..6778f7800 160000 --- a/src/bindings +++ b/src/bindings @@ -1 +1 @@ -Subproject commit 557cdddc4696b8e3476cda3180d2b09d7b2e5d46 +Subproject commit 6778f78002e19f0f6a4f9be077416fed8ba2ceab From 108cd2aeb6f5d2d58549c615f4255bd1892ee67f Mon Sep 17 00:00:00 2001 From: Gregor Date: Fri, 16 Jun 2023 17:48:18 +0200 Subject: [PATCH 16/44] type import changes for no ts build --- src/index.ts | 20 ++++++++++++-------- src/lib/circuit_value.ts | 2 ++ 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/src/index.ts b/src/index.ts index b33f1d553..0813d3da4 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,19 +1,22 @@ -export { ProvablePure, Ledger } from './snarky.js'; +export type { ProvablePure } from './snarky.js'; +export { Ledger } from './snarky.js'; export { Field, Bool, Group, Scalar } from './lib/core.js'; export { Poseidon, TokenSymbol } from './lib/hash.js'; export * from './lib/signature.js'; +export type { + ProvableExtended, + FlexibleProvable, + FlexibleProvablePure, + InferProvable, +} from './lib/circuit_value.js'; export { CircuitValue, - ProvableExtended, prop, arrayProp, matrixProp, provable, provablePure, Struct, - FlexibleProvable, - FlexibleProvablePure, - InferProvable, } from './lib/circuit_value.js'; export { Provable } from './lib/provable.js'; export { Circuit, Keypair, public_, circuitMain } from './lib/circuit.js'; @@ -21,21 +24,22 @@ export { UInt32, UInt64, Int64, Sign } from './lib/int.js'; export { Types } from './bindings/mina-transaction/types.js'; export * as Mina from './lib/mina.js'; +export type { DeployArgs } from './lib/zkapp.js'; export { SmartContract, method, - DeployArgs, declareMethods, Account, VerificationKey, Reducer, } from './lib/zkapp.js'; export { state, State, declareState } from './lib/state.js'; + +export type { JsonProof } from './lib/proof_system.js'; export { Proof, SelfProof, verify, - JsonProof, Empty, Undefined, Void, @@ -49,13 +53,13 @@ export { ZkappPublicInput, } from './lib/account_update.js'; +export type { TransactionStatus } from './lib/fetch.js'; export { fetchAccount, fetchLastBlock, fetchTransactionStatus, checkZkappTransaction, fetchEvents, - TransactionStatus, addCachedAccount, setGraphqlEndpoint, setGraphqlEndpoints, diff --git a/src/lib/circuit_value.ts b/src/lib/circuit_value.ts index 0481c95d9..37ee2c8c6 100644 --- a/src/lib/circuit_value.ts +++ b/src/lib/circuit_value.ts @@ -6,6 +6,8 @@ import { provablePure, HashInput, NonMethods, +} from '../bindings/lib/provable-snarky.js'; +import type { InferJson, InferProvable, InferredProvable, From 2e6df12494e12bdf4b48397ff30f82f0133595f9 Mon Sep 17 00:00:00 2001 From: Gregor Date: Fri, 16 Jun 2023 17:49:51 +0200 Subject: [PATCH 17/44] run examples without requiring ts build --- package.json | 3 ++- src/bindings | 2 +- src/build/buildExample.js | 22 +++++++++++++++++++++- src/tests/test.ts | 4 ++++ 4 files changed, 28 insertions(+), 3 deletions(-) create mode 100644 src/tests/test.ts diff --git a/package.json b/package.json index c6040520a..a9afd0adc 100644 --- a/package.json +++ b/package.json @@ -46,8 +46,9 @@ "type-check": "tsc --noEmit", "dev": "npx tsc -p tsconfig.node.json && cp src/snarky.d.ts dist/node/snarky.d.ts", "make": "make -C ../../.. snarkyjs", + "make:no-types": "npm run clean && make -C ../../.. snarkyjs_no_types", "bindings": "cd ../../.. && ./scripts/update-snarkyjs-bindings.sh && cd src/lib/snarkyjs", - "build": "rimraf ./dist/node && npx tsc -p tsconfig.node.json && cp -r src/bindings/compiled/node_bindings dist/node/_node_bindings && node src/build/buildNode.js && cp src/snarky.d.ts dist/node/snarky.d.ts", + "build": "rimraf ./dist/node && npx tsc -p tsconfig.node.json && mkdir -p dist/node/bindings/compiled && cp -r src/bindings/compiled/node_bindings dist/node/bindings/compiled/_node_bindings && node src/build/buildNode.js && cp src/snarky.d.ts dist/node/snarky.d.ts", "build:test": "npx tsc -p tsconfig.test.json && cp src/snarky.d.ts dist/node/snarky.d.ts", "build:node": "npm run build", "build:web": "rimraf ./dist/web && node src/build/buildWeb.js", diff --git a/src/bindings b/src/bindings index 6778f7800..b42f13f31 160000 --- a/src/bindings +++ b/src/bindings @@ -1 +1 @@ -Subproject commit 6778f78002e19f0f6a4f9be077416fed8ba2ceab +Subproject commit b42f13f31fbdad08def45369f21a50dd36600ce7 diff --git a/src/build/buildExample.js b/src/build/buildExample.js index 286cf74e1..ef5929ba0 100644 --- a/src/build/buildExample.js +++ b/src/build/buildExample.js @@ -32,7 +32,11 @@ async function build(srcPath, isWeb = false) { logLevel: 'error', plugins: isWeb ? [typescriptPlugin(tsConfig)] - : [typescriptPlugin(tsConfig), makeNodeModulesExternal()], + : [ + typescriptPlugin(tsConfig), + makeNodeModulesExternal(), + makeJsooExternal(), + ], }); let absPath = path.resolve('.', outfile); @@ -105,6 +109,22 @@ function makeNodeModulesExternal() { }; } +function makeJsooExternal() { + let isJsoo = /(bc.cjs|plonk_wasm.cjs)$/; + return { + name: 'plugin-external', + setup(build) { + build.onResolve({ filter: isJsoo }, ({ path: filePath, resolveDir }) => { + filePath = filePath.replace('_node_bindings', 'node_bindings'); + return { + path: path.resolve(resolveDir, filePath), + external: true, + }; + }); + }, + }; +} + function findTsConfig() { let tsConfigPath = ts.findConfigFile(process.cwd(), ts.sys.fileExists); if (tsConfigPath === undefined) return; diff --git a/src/tests/test.ts b/src/tests/test.ts new file mode 100644 index 000000000..cd5dcb444 --- /dev/null +++ b/src/tests/test.ts @@ -0,0 +1,4 @@ +import { Field } from '../index.js'; +// we can build snarkyjs and run tests without type checking +let wrongType: string = Field.random().toBigInt(); +console.log(wrongType); From f50d7e8ef19c120659e8cbb616ef811ce88b00c5 Mon Sep 17 00:00:00 2001 From: Gregor Date: Fri, 16 Jun 2023 17:50:01 +0200 Subject: [PATCH 18/44] port inductive proofs example --- src/tests/inductive-proofs.ts | 156 ++++++++++++++++++++++++++++++++++ 1 file changed, 156 insertions(+) create mode 100644 src/tests/inductive-proofs.ts diff --git a/src/tests/inductive-proofs.ts b/src/tests/inductive-proofs.ts new file mode 100644 index 000000000..10667aa31 --- /dev/null +++ b/src/tests/inductive-proofs.ts @@ -0,0 +1,156 @@ +import { + SelfProof, + Field, + Experimental, + isReady, + shutdown, + Proof, +} from '../index.js'; +import { tic, toc } from '../examples/zkapps/tictoc.js'; + +await isReady; + +let MaxProofsVerifiedZero = Experimental.ZkProgram({ + publicInput: Field, + + methods: { + baseCase: { + privateInputs: [], + + method(publicInput: Field) { + publicInput.assertEquals(Field(0)); + }, + }, + }, +}); + +let MaxProofsVerifiedOne = Experimental.ZkProgram({ + publicInput: Field, + + methods: { + baseCase: { + privateInputs: [], + + method(publicInput: Field) { + publicInput.assertEquals(Field(0)); + }, + }, + + mergeOne: { + privateInputs: [SelfProof], + + method(publicInput: Field, earlierProof: SelfProof) { + earlierProof.verify(); + earlierProof.publicInput.add(1).assertEquals(publicInput); + }, + }, + }, +}); + +let MaxProofsVerifiedTwo = Experimental.ZkProgram({ + publicInput: Field, + + methods: { + baseCase: { + privateInputs: [], + + method(publicInput: Field) { + publicInput.assertEquals(Field(0)); + }, + }, + + mergeOne: { + privateInputs: [SelfProof], + + method(publicInput: Field, earlierProof: SelfProof) { + earlierProof.verify(); + earlierProof.publicInput.add(1).assertEquals(publicInput); + }, + }, + + mergeTwo: { + privateInputs: [SelfProof, SelfProof], + + method( + publicInput: Field, + p1: SelfProof, + p2: SelfProof + ) { + p1.verify(); + p1.publicInput.add(1).assertEquals(p2.publicInput); + p2.verify(); + p2.publicInput.add(1).assertEquals(publicInput); + }, + }, + }, +}); +tic('compiling three programs..'); +await MaxProofsVerifiedZero.compile(); +await MaxProofsVerifiedOne.compile(); +await MaxProofsVerifiedTwo.compile(); +toc(); + +await testRecursion(MaxProofsVerifiedZero as any, 0); +await testRecursion(MaxProofsVerifiedOne as any, 1); +await testRecursion(MaxProofsVerifiedTwo, 2); + +async function testRecursion( + Program: typeof MaxProofsVerifiedTwo, + maxProofsVerified: number +) { + console.log(`testing maxProofsVerified = ${maxProofsVerified}`); + + let ProofClass = Experimental.ZkProgram.Proof(Program); + + tic('executing base case..'); + let initialProof = await Program.baseCase(Field(0)); + toc(); + initialProof = testJsonRoundtrip(ProofClass, initialProof); + initialProof.verify(); + initialProof.publicInput.assertEquals(Field(0)); + + if (initialProof.maxProofsVerified != maxProofsVerified) { + throw Error( + `Expected initialProof to have maxProofsVerified = ${maxProofsVerified} but has ${initialProof.maxProofsVerified}` + ); + } + + let p1, p2; + if (initialProof.maxProofsVerified === 0) return; + + tic('executing mergeOne..'); + p1 = await Program.mergeOne(Field(1), initialProof); + toc(); + p1 = testJsonRoundtrip(ProofClass, p1); + p1.verify(); + p1.publicInput.assertEquals(Field(1)); + if (p1.maxProofsVerified != maxProofsVerified) { + throw Error( + `Expected p1 to have maxProofsVerified = ${maxProofsVerified} but has ${p1.maxProofsVerified}` + ); + } + + if (initialProof.maxProofsVerified === 1) return; + tic('executing mergeTwo..'); + p2 = await Program.mergeTwo(Field(2), initialProof, p1); + toc(); + p2 = testJsonRoundtrip(ProofClass, p2); + p2.verify(); + p2.publicInput.assertEquals(Field(2)); + if (p2.maxProofsVerified != maxProofsVerified) { + throw Error( + `Expected p2 to have maxProofsVerified = ${maxProofsVerified} but has ${p2.maxProofsVerified}` + ); + } +} + +function testJsonRoundtrip(ProofClass: any, proof: Proof) { + let jsonProof = proof.toJSON(); + console.log( + 'json roundtrip', + JSON.stringify({ ...jsonProof, proof: jsonProof.proof.slice(0, 10) + '..' }) + ); + return ProofClass.fromJSON(jsonProof); +} + +shutdown(); From fd3e1979f973237ed3244d0ce1e7ce6e93341ffc Mon Sep 17 00:00:00 2001 From: Gregor Date: Tue, 20 Jun 2023 09:53:14 +0200 Subject: [PATCH 19/44] add script to run minimal snarkyjs tests --- run-minimal-mina-tests.sh | 4 ++++ 1 file changed, 4 insertions(+) create mode 100755 run-minimal-mina-tests.sh diff --git a/run-minimal-mina-tests.sh b/run-minimal-mina-tests.sh new file mode 100755 index 000000000..c21d178aa --- /dev/null +++ b/run-minimal-mina-tests.sh @@ -0,0 +1,4 @@ +#!/bin/bash +set -e + +./run src/tests/inductive-proofs.ts --bundle From d638b67a557fffa7d5be70ee68c366f3a91ec9c5 Mon Sep 17 00:00:00 2001 From: Gregor Date: Tue, 20 Jun 2023 10:01:28 +0200 Subject: [PATCH 20/44] minor --- src/tests/inductive-proofs.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/tests/inductive-proofs.ts b/src/tests/inductive-proofs.ts index 10667aa31..61c1c9dc1 100644 --- a/src/tests/inductive-proofs.ts +++ b/src/tests/inductive-proofs.ts @@ -84,7 +84,7 @@ let MaxProofsVerifiedTwo = Experimental.ZkProgram({ }, }, }); -tic('compiling three programs..'); +tic('compiling three programs'); await MaxProofsVerifiedZero.compile(); await MaxProofsVerifiedOne.compile(); await MaxProofsVerifiedTwo.compile(); @@ -102,7 +102,7 @@ async function testRecursion( let ProofClass = Experimental.ZkProgram.Proof(Program); - tic('executing base case..'); + tic('executing base case'); let initialProof = await Program.baseCase(Field(0)); toc(); initialProof = testJsonRoundtrip(ProofClass, initialProof); @@ -118,7 +118,7 @@ async function testRecursion( let p1, p2; if (initialProof.maxProofsVerified === 0) return; - tic('executing mergeOne..'); + tic('executing mergeOne'); p1 = await Program.mergeOne(Field(1), initialProof); toc(); p1 = testJsonRoundtrip(ProofClass, p1); @@ -131,7 +131,7 @@ async function testRecursion( } if (initialProof.maxProofsVerified === 1) return; - tic('executing mergeTwo..'); + tic('executing mergeTwo'); p2 = await Program.mergeTwo(Field(2), initialProof, p1); toc(); p2 = testJsonRoundtrip(ProofClass, p2); From ff69674d50deae6cf1103bd6342a003e16c6193a Mon Sep 17 00:00:00 2001 From: Gregor Date: Tue, 20 Jun 2023 12:58:31 +0200 Subject: [PATCH 21/44] use smaller example in test --- run-minimal-mina-tests.sh | 2 +- src/tests/inductive-proofs-small.ts | 88 +++++++++++++++++++++++++++++ 2 files changed, 89 insertions(+), 1 deletion(-) create mode 100644 src/tests/inductive-proofs-small.ts diff --git a/run-minimal-mina-tests.sh b/run-minimal-mina-tests.sh index c21d178aa..3aae238cc 100755 --- a/run-minimal-mina-tests.sh +++ b/run-minimal-mina-tests.sh @@ -1,4 +1,4 @@ #!/bin/bash set -e -./run src/tests/inductive-proofs.ts --bundle +./run src/tests/inductive-proofs-small.ts --bundle diff --git a/src/tests/inductive-proofs-small.ts b/src/tests/inductive-proofs-small.ts new file mode 100644 index 000000000..271a2bb6c --- /dev/null +++ b/src/tests/inductive-proofs-small.ts @@ -0,0 +1,88 @@ +import { + SelfProof, + Field, + Experimental, + isReady, + shutdown, + Proof, +} from '../index.js'; +import { tic, toc } from '../examples/zkapps/tictoc.js'; + +await isReady; + +let MaxProofsVerifiedOne = Experimental.ZkProgram({ + publicInput: Field, + + methods: { + baseCase: { + privateInputs: [], + + method(publicInput: Field) { + publicInput.assertEquals(Field(0)); + }, + }, + + mergeOne: { + privateInputs: [SelfProof], + + method(publicInput: Field, earlierProof: SelfProof) { + earlierProof.verify(); + earlierProof.publicInput.add(1).assertEquals(publicInput); + }, + }, + }, +}); + +tic('compiling program'); +await MaxProofsVerifiedOne.compile(); +toc(); + +await testRecursion(MaxProofsVerifiedOne, 1); + +async function testRecursion( + Program: typeof MaxProofsVerifiedOne, + maxProofsVerified: number +) { + console.log(`testing maxProofsVerified = ${maxProofsVerified}`); + + let ProofClass = Experimental.ZkProgram.Proof(Program); + + tic('executing base case'); + let initialProof = await Program.baseCase(Field(0)); + toc(); + initialProof = testJsonRoundtrip(ProofClass, initialProof); + initialProof.verify(); + initialProof.publicInput.assertEquals(Field(0)); + + if (initialProof.maxProofsVerified != maxProofsVerified) { + throw Error( + `Expected initialProof to have maxProofsVerified = ${maxProofsVerified} but has ${initialProof.maxProofsVerified}` + ); + } + + let p1; + if (initialProof.maxProofsVerified === 0) return; + + tic('executing mergeOne'); + p1 = await Program.mergeOne(Field(1), initialProof); + toc(); + p1 = testJsonRoundtrip(ProofClass, p1); + p1.verify(); + p1.publicInput.assertEquals(Field(1)); + if (p1.maxProofsVerified != maxProofsVerified) { + throw Error( + `Expected p1 to have maxProofsVerified = ${maxProofsVerified} but has ${p1.maxProofsVerified}` + ); + } +} + +function testJsonRoundtrip(ProofClass: any, proof: Proof) { + let jsonProof = proof.toJSON(); + console.log( + 'json roundtrip', + JSON.stringify({ ...jsonProof, proof: jsonProof.proof.slice(0, 10) + '..' }) + ); + return ProofClass.fromJSON(jsonProof); +} + +shutdown(); From 47a6034eea4a37709dc8990d37bf3fd38ea7b821 Mon Sep 17 00:00:00 2001 From: Gregor Date: Tue, 20 Jun 2023 20:55:22 +0200 Subject: [PATCH 22/44] add a script to copy files --- .gitignore | 1 + package.json | 8 ++++---- src/build/buildExample.js | 3 +-- src/build/copy-to-dist.js | 22 ++++++++++++++++++++++ 4 files changed, 28 insertions(+), 6 deletions(-) create mode 100644 src/build/copy-to-dist.js diff --git a/.gitignore b/.gitignore index c41b02b8b..fcb737b15 100644 --- a/.gitignore +++ b/.gitignore @@ -6,3 +6,4 @@ tests/report/ tests/test-artifacts/ profiling.md snarkyjs-reference +*.tmp.js diff --git a/package.json b/package.json index a9afd0adc..f97f093ba 100644 --- a/package.json +++ b/package.json @@ -44,11 +44,11 @@ }, "scripts": { "type-check": "tsc --noEmit", - "dev": "npx tsc -p tsconfig.node.json && cp src/snarky.d.ts dist/node/snarky.d.ts", + "dev": "npx tsc -p tsconfig.node.json && node src/build/copy-to-dist.js", "make": "make -C ../../.. snarkyjs", "make:no-types": "npm run clean && make -C ../../.. snarkyjs_no_types", "bindings": "cd ../../.. && ./scripts/update-snarkyjs-bindings.sh && cd src/lib/snarkyjs", - "build": "rimraf ./dist/node && npx tsc -p tsconfig.node.json && mkdir -p dist/node/bindings/compiled && cp -r src/bindings/compiled/node_bindings dist/node/bindings/compiled/_node_bindings && node src/build/buildNode.js && cp src/snarky.d.ts dist/node/snarky.d.ts", + "build": "rimraf ./src/bindings/compiled/_node_bindings && cp -r src/bindings/compiled/node_bindings src/bindings/compiled/_node_bindings && rimraf ./dist/node && npx tsc -p tsconfig.node.json && node src/build/copy-to-dist.js && node src/build/buildNode.js", "build:test": "npx tsc -p tsconfig.test.json && cp src/snarky.d.ts dist/node/snarky.d.ts", "build:node": "npm run build", "build:web": "rimraf ./dist/web && node src/build/buildWeb.js", @@ -62,8 +62,8 @@ "bootstrap": "npm run build && node src/build/extractJsooMethods.cjs && npm run build", "format": "prettier --write --ignore-unknown **/*", "test": "./run-jest-tests.sh", - "clean": "rimraf ./dist", - "clean-all": "rimraf ./dist && rimraf ./tests/report && rimraf ./tests/test-artifacts", + "clean": "rimraf ./dist && rimraf ./src/bindings/compiled/_node_bindings", + "clean-all": "npm run clean && rimraf ./tests/report && rimraf ./tests/test-artifacts", "test:integration": "./run-integration-tests.sh", "test:unit": "./run-unit-tests.sh", "test:e2e": "rimraf ./tests/report && rimraf ./tests/test-artifacts && npx playwright test", diff --git a/src/build/buildExample.js b/src/build/buildExample.js index ef5929ba0..a7f75c303 100644 --- a/src/build/buildExample.js +++ b/src/build/buildExample.js @@ -110,12 +110,11 @@ function makeNodeModulesExternal() { } function makeJsooExternal() { - let isJsoo = /(bc.cjs|plonk_wasm.cjs)$/; + let isJsoo = /(bc.cjs|plonk_wasm.cjs|wrapper.js)$/; return { name: 'plugin-external', setup(build) { build.onResolve({ filter: isJsoo }, ({ path: filePath, resolveDir }) => { - filePath = filePath.replace('_node_bindings', 'node_bindings'); return { path: path.resolve(resolveDir, filePath), external: true, diff --git a/src/build/copy-to-dist.js b/src/build/copy-to-dist.js new file mode 100644 index 000000000..a338d0a1e --- /dev/null +++ b/src/build/copy-to-dist.js @@ -0,0 +1,22 @@ +// copy some files from /src to /dist/node that tsc doesn't copy because +// we have .d.ts files for them +import fse from 'fs-extra'; + +let files = ['src/snarky.d.ts', 'src/bindings/compiled/_node_bindings']; + +await copyToDist(files); + +async function copyToDist(files) { + let promises = []; + for (let source of files) { + let target = source.replace('src/', 'dist/node/'); + promises.push( + fse.copy(source, target, { + recursive: true, + overwrite: true, + dereference: true, + }) + ); + } + await Promise.all(promises); +} From 4b99e4dfe06739711d7ffc99ff39c39ebf05cbdd Mon Sep 17 00:00:00 2001 From: Gregor Date: Tue, 20 Jun 2023 21:07:01 +0200 Subject: [PATCH 23/44] simplify --- package.json | 2 +- src/build/copy-artifacts.js | 8 ++++++++ src/build/copy-to-dist.js | 28 +++++++--------------------- src/build/utils.js | 18 ++++++++++++++++++ 4 files changed, 34 insertions(+), 22 deletions(-) create mode 100644 src/build/copy-artifacts.js create mode 100644 src/build/utils.js diff --git a/package.json b/package.json index f97f093ba..c6ada8e39 100644 --- a/package.json +++ b/package.json @@ -48,7 +48,7 @@ "make": "make -C ../../.. snarkyjs", "make:no-types": "npm run clean && make -C ../../.. snarkyjs_no_types", "bindings": "cd ../../.. && ./scripts/update-snarkyjs-bindings.sh && cd src/lib/snarkyjs", - "build": "rimraf ./src/bindings/compiled/_node_bindings && cp -r src/bindings/compiled/node_bindings src/bindings/compiled/_node_bindings && rimraf ./dist/node && npx tsc -p tsconfig.node.json && node src/build/copy-to-dist.js && node src/build/buildNode.js", + "build": "node src/build/copy-artifacts.js && rimraf ./dist/node && npm run dev && node src/build/buildNode.js", "build:test": "npx tsc -p tsconfig.test.json && cp src/snarky.d.ts dist/node/snarky.d.ts", "build:node": "npm run build", "build:web": "rimraf ./dist/web && node src/build/buildWeb.js", diff --git a/src/build/copy-artifacts.js b/src/build/copy-artifacts.js new file mode 100644 index 000000000..b5a218e8b --- /dev/null +++ b/src/build/copy-artifacts.js @@ -0,0 +1,8 @@ +// copy some files from /src to /dist/node that tsc doesn't copy because we have .d.ts files for them +import { copyFromTo } from './utils.js'; + +await copyFromTo( + ['src/bindings/compiled/node_bindings/'], + 'node_bindings', + '_node_bindings' +); diff --git a/src/build/copy-to-dist.js b/src/build/copy-to-dist.js index a338d0a1e..635f76159 100644 --- a/src/build/copy-to-dist.js +++ b/src/build/copy-to-dist.js @@ -1,22 +1,8 @@ -// copy some files from /src to /dist/node that tsc doesn't copy because -// we have .d.ts files for them -import fse from 'fs-extra'; +// copy some files from /src to /dist/node that tsc doesn't copy because we have .d.ts files for them +import { copyFromTo } from './utils.js'; -let files = ['src/snarky.d.ts', 'src/bindings/compiled/_node_bindings']; - -await copyToDist(files); - -async function copyToDist(files) { - let promises = []; - for (let source of files) { - let target = source.replace('src/', 'dist/node/'); - promises.push( - fse.copy(source, target, { - recursive: true, - overwrite: true, - dereference: true, - }) - ); - } - await Promise.all(promises); -} +await copyFromTo( + ['src/snarky.d.ts', 'src/bindings/compiled/_node_bindings'], + 'src', + 'dist/node' +); diff --git a/src/build/utils.js b/src/build/utils.js new file mode 100644 index 000000000..6eb7635fa --- /dev/null +++ b/src/build/utils.js @@ -0,0 +1,18 @@ +import fse from 'fs-extra'; + +export { copyFromTo }; + +async function copyFromTo(files, srcDir = undefined, targetDir = undefined) { + let promises = []; + for (let source of files) { + let target = source.replace(`${srcDir}/`, `${targetDir}/`); + promises.push( + fse.copy(source, target, { + recursive: true, + overwrite: true, + dereference: true, + }) + ); + } + await Promise.all(promises); +} From 9179211ee56999c9b741c0f816b6e9e13f7e5a54 Mon Sep 17 00:00:00 2001 From: Gregor Date: Thu, 22 Jun 2023 14:55:28 +0200 Subject: [PATCH 24/44] delete pointless file --- src/tests/test.ts | 4 ---- 1 file changed, 4 deletions(-) delete mode 100644 src/tests/test.ts diff --git a/src/tests/test.ts b/src/tests/test.ts deleted file mode 100644 index cd5dcb444..000000000 --- a/src/tests/test.ts +++ /dev/null @@ -1,4 +0,0 @@ -import { Field } from '../index.js'; -// we can build snarkyjs and run tests without type checking -let wrongType: string = Field.random().toBigInt(); -console.log(wrongType); From 0f95b8e6298afa25438ca795f4b1d14977eef9a4 Mon Sep 17 00:00:00 2001 From: Gregor Date: Thu, 22 Jun 2023 15:01:37 +0200 Subject: [PATCH 25/44] clean up some build logic --- src/build/copy-artifacts.js | 3 ++- src/build/copy-to-dist.js | 4 ++-- src/build/utils.js | 18 ++++++++---------- 3 files changed, 12 insertions(+), 13 deletions(-) diff --git a/src/build/copy-artifacts.js b/src/build/copy-artifacts.js index b5a218e8b..116abfab5 100644 --- a/src/build/copy-artifacts.js +++ b/src/build/copy-artifacts.js @@ -1,4 +1,5 @@ -// copy some files from /src to /dist/node that tsc doesn't copy because we have .d.ts files for them +// copy compiled jsoo/wasm artifacts from a folder in the source tree to the folder where they are imported from +// (these are not the same folders so that we don't automatically pollute the source tree when rebuilding artifacts) import { copyFromTo } from './utils.js'; await copyFromTo( diff --git a/src/build/copy-to-dist.js b/src/build/copy-to-dist.js index 635f76159..96bc96937 100644 --- a/src/build/copy-to-dist.js +++ b/src/build/copy-to-dist.js @@ -3,6 +3,6 @@ import { copyFromTo } from './utils.js'; await copyFromTo( ['src/snarky.d.ts', 'src/bindings/compiled/_node_bindings'], - 'src', - 'dist/node' + 'src/', + 'dist/node/' ); diff --git a/src/build/utils.js b/src/build/utils.js index 6eb7635fa..346ba82a0 100644 --- a/src/build/utils.js +++ b/src/build/utils.js @@ -2,17 +2,15 @@ import fse from 'fs-extra'; export { copyFromTo }; -async function copyFromTo(files, srcDir = undefined, targetDir = undefined) { - let promises = []; - for (let source of files) { - let target = source.replace(`${srcDir}/`, `${targetDir}/`); - promises.push( - fse.copy(source, target, { +function copyFromTo(files, srcDir = undefined, targetDir = undefined) { + return Promise.all( + files.map((source) => { + let target = source.replace(srcDir, targetDir); + return fse.copy(source, target, { recursive: true, overwrite: true, dereference: true, - }) - ); - } - await Promise.all(promises); + }); + }) + ); } From 50b05ead9284823618fe26dc7896e0a140ca2582 Mon Sep 17 00:00:00 2001 From: Martin Minkov Date: Mon, 10 Jul 2023 12:10:56 -0700 Subject: [PATCH 26/44] feat(bindings): update bindings --- src/bindings | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/bindings b/src/bindings index 6de59fde2..32e343952 160000 --- a/src/bindings +++ b/src/bindings @@ -1 +1 @@ -Subproject commit 6de59fde24db4d793b9b3c03f5953a6f1cefb545 +Subproject commit 32e3439528880a9cfedd162e1b5e886eeac5da96 From 9b4805dc28b1892187dd9c4c442cbb7a1aaf2571 Mon Sep 17 00:00:00 2001 From: Martin Minkov Date: Mon, 10 Jul 2023 13:26:32 -0700 Subject: [PATCH 27/44] feat(vk_hash): update hardcoded vk hash to use new mina dummy --- src/lib/account_update.ts | 22 +++++++++++++++---- src/lib/testing/random.ts | 7 +++++- src/mina-signer/src/sign-zkapp-command.ts | 10 ++++++--- .../src/sign-zkapp-command.unit-test.ts | 9 ++++++++ .../src/test-vectors/accountUpdate.ts | 6 ++++- src/mina-signer/tests/zkapp.unit-test.ts | 6 ++++- 6 files changed, 50 insertions(+), 10 deletions(-) diff --git a/src/lib/account_update.ts b/src/lib/account_update.ts index 6c9bf9f7c..4d4e975ee 100644 --- a/src/lib/account_update.ts +++ b/src/lib/account_update.ts @@ -33,6 +33,7 @@ import { MlArray } from './ml/base.js'; import { Signature, signFieldElement } from '../mina-signer/src/signature.js'; import { MlFieldConstArray } from './ml/fields.js'; import { transactionCommitments } from '../mina-signer/src/sign-zkapp-command.js'; +import { Field as Fp } from './field.js'; // external API export { AccountUpdate, Permissions, ZkappPublicInput }; @@ -445,7 +446,7 @@ const Body = { tokenId?: Field, mayUseToken?: MayUseToken ): Body { - let { body } = Types.AccountUpdate.emptyValue(); + let { body } = AccountUpdate.emptyValue(); body.publicKey = publicKey; if (tokenId) { body.tokenId = tokenId; @@ -463,7 +464,7 @@ const Body = { }, dummy(): Body { - return Types.AccountUpdate.emptyValue().body; + return AccountUpdate.emptyValue().body; }, }; @@ -1288,6 +1289,12 @@ class AccountUpdate implements Types.AccountUpdate { other ); } + static emptyValue() { + let empty = Types.AccountUpdate.emptyValue(); + empty.body.authorizationKind.verificationKeyHash = + dummyVerificationKeyHash(); + return empty; + } static witness( type: FlexibleProvable, @@ -1802,7 +1809,8 @@ const Authorization = { signature ??= {}; accountUpdate.body.authorizationKind.isSigned = Bool(true); accountUpdate.body.authorizationKind.isProved = Bool(false); - accountUpdate.body.authorizationKind.verificationKeyHash = Field(0); + accountUpdate.body.authorizationKind.verificationKeyHash = + dummyVerificationKeyHash(); accountUpdate.authorization = {}; accountUpdate.lazyAuthorization = { ...signature, kind: 'lazy-signature' }; }, @@ -1860,7 +1868,8 @@ const Authorization = { setLazyNone(accountUpdate: AccountUpdate) { accountUpdate.body.authorizationKind.isSigned = Bool(false); accountUpdate.body.authorizationKind.isProved = Bool(false); - accountUpdate.body.authorizationKind.verificationKeyHash = Field(0); + accountUpdate.body.authorizationKind.verificationKeyHash = + dummyVerificationKeyHash(); accountUpdate.authorization = {}; accountUpdate.lazyAuthorization = { kind: 'lazy-none' }; }, @@ -1946,6 +1955,11 @@ function dummySignature() { return Signature.toBase58(Signature.dummy()); } +function dummyVerificationKeyHash() { + let [, , hash] = Pickles.dummyVerificationKey(); + return Fp.fromBytes([...hash]); +} + /** * The public input for zkApps consists of certain hashes of the proving AccountUpdate (and its child accountUpdates) which is constructed during method diff --git a/src/lib/testing/random.ts b/src/lib/testing/random.ts index f9d191950..7eff04a2a 100644 --- a/src/lib/testing/random.ts +++ b/src/lib/testing/random.ts @@ -37,6 +37,7 @@ import { Memo } from '../../mina-signer/src/memo.js'; import { ProvableExtended } from '../../bindings/lib/provable-bigint.js'; import { tokenSymbolLength } from '../../bindings/mina-transaction/derived-leaves.js'; import { stringLengthInBytes } from '../../bindings/lib/binable.js'; +import { Pickles } from '../../snarky.js'; export { Random, sample, withHardCoded }; @@ -255,8 +256,12 @@ const accountUpdateJson = mapWithInvalid( if (isProved && isSigned) { a.body.authorizationKind.isProved = false; } + if (!a.body.authorizationKind.isProved) { - a.body.authorizationKind.verificationKeyHash = '0'; + let [, , hash] = Pickles.dummyVerificationKey(); + a.body.authorizationKind.verificationKeyHash = Field.fromBytes([ + ...hash, + ]).toString(); } // ensure mayUseToken is valid let { inheritFromParent, parentsOwnToken } = a.body.mayUseToken; diff --git a/src/mina-signer/src/sign-zkapp-command.ts b/src/mina-signer/src/sign-zkapp-command.ts index da4bb1c20..a1146f113 100644 --- a/src/mina-signer/src/sign-zkapp-command.ts +++ b/src/mina-signer/src/sign-zkapp-command.ts @@ -17,6 +17,7 @@ import { signFieldElement, verifyFieldElement, } from './signature.js'; +import { Pickles } from '../../snarky.js'; // external API export { signZkappCommand, verifyZkappCommandSignature }; @@ -180,6 +181,7 @@ function accountUpdateFromFeePayer({ authorization: signature, }: FeePayer): AccountUpdate { let { body } = AccountUpdate.emptyValue(); + let [, , hash] = Pickles.dummyVerificationKey(); body.publicKey = publicKey; body.balanceChange = { magnitude: fee, sgn: Sign(-1) }; body.incrementNonce = Bool(true); @@ -196,7 +198,7 @@ function accountUpdateFromFeePayer({ body.authorizationKind = { isProved: Bool(false), isSigned: Bool(true), - verificationKeyHash: Field(0), + verificationKeyHash: Field.fromBytes([...hash]), }; return { body, authorization: { signature } }; } @@ -216,12 +218,14 @@ function isCallDepthValid(zkappCommand: ZkappCommand) { function assertAuthorizationKindValid(accountUpdate: AccountUpdate) { let { isSigned, isProved, verificationKeyHash } = accountUpdate.body.authorizationKind; + let [, , hash] = Pickles.dummyVerificationKey(); + const dummyVK = Field.fromBytes([...hash]); if (isProved && isSigned) throw Error( 'Invalid authorization kind: Only one of `isProved` and `isSigned` may be true.' ); - if (!isProved && verificationKeyHash !== 0n) + if (!isProved && verificationKeyHash !== dummyVK) throw Error( - `Invalid authorization kind: If \`isProved\` is false, verification key hash must be 0, got ${verificationKeyHash}` + `Invalid authorization kind: If \`isProved\` is false, verification key hash must be ${dummyVK}, got ${verificationKeyHash}` ); } diff --git a/src/mina-signer/src/sign-zkapp-command.unit-test.ts b/src/mina-signer/src/sign-zkapp-command.unit-test.ts index 6c088329c..ec56fd5b7 100644 --- a/src/mina-signer/src/sign-zkapp-command.unit-test.ts +++ b/src/mina-signer/src/sign-zkapp-command.unit-test.ts @@ -62,6 +62,7 @@ test(Random.json.publicKey, (publicKeyBase58) => { // empty account update let dummy = AccountUpdate.emptyValue(); +fixVerificationKeyHash(dummy); let dummySnarky = AccountUpdateSnarky.dummy(); expect(AccountUpdate.toJSON(dummy)).toEqual( AccountUpdateSnarky.toJSON(dummySnarky) @@ -81,6 +82,7 @@ expect(stringify(dummyInput.packed)).toEqual( ); test(Random.accountUpdate, (accountUpdate) => { + fixVerificationKeyHash(accountUpdate); fixVerificationKey(accountUpdate); // example account update @@ -125,6 +127,7 @@ test(memoGenerator, (memoString) => { // zkapp transaction - basic properties & commitment test(RandomTransaction.zkappCommand, (zkappCommand, assert) => { + zkappCommand.accountUpdates.forEach(fixVerificationKeyHash); zkappCommand.accountUpdates.forEach(fixVerificationKey); assert(isCallDepthValid(zkappCommand)); @@ -151,6 +154,7 @@ test.negative( test( RandomTransaction.zkappCommandAndFeePayerKey, ({ feePayerKey, zkappCommand }) => { + zkappCommand.accountUpdates.forEach(fixVerificationKeyHash); zkappCommand.accountUpdates.forEach(fixVerificationKey); let feePayerKeyBase58 = PrivateKey.toBase58(feePayerKey); @@ -280,3 +284,8 @@ function fixVerificationKey(a: AccountUpdate) { a.body.update.verificationKey.value = { data: '', hash: Field(0) }; } } + +function fixVerificationKeyHash(a: AccountUpdate) { + let [, , hash] = Pickles.dummyVerificationKey(); + a.body.authorizationKind.verificationKeyHash = Field.fromBytes([...hash]); +} diff --git a/src/mina-signer/src/test-vectors/accountUpdate.ts b/src/mina-signer/src/test-vectors/accountUpdate.ts index 4e71410b6..de021ab8e 100644 --- a/src/mina-signer/src/test-vectors/accountUpdate.ts +++ b/src/mina-signer/src/test-vectors/accountUpdate.ts @@ -1,7 +1,11 @@ import * as Json from '../../../bindings/mina-transaction/gen/transaction-json.js'; +import { Field } from '../../../provable/field-bigint.js'; +import { Pickles } from '../../../snarky.js'; export { accountUpdateExample }; +let [, , hash] = Pickles.dummyVerificationKey(); + // an example account update, to be used for tests let accountUpdateExample: Json.AccountUpdate = { body: { @@ -88,7 +92,7 @@ let accountUpdateExample: Json.AccountUpdate = { authorizationKind: { isSigned: false, isProved: false, - verificationKeyHash: '0', + verificationKeyHash: Field.fromBytes([...hash]).toString(), }, }, authorization: { proof: null, signature: null }, diff --git a/src/mina-signer/tests/zkapp.unit-test.ts b/src/mina-signer/tests/zkapp.unit-test.ts index c2ea4b21e..3c4c53935 100644 --- a/src/mina-signer/tests/zkapp.unit-test.ts +++ b/src/mina-signer/tests/zkapp.unit-test.ts @@ -6,12 +6,16 @@ import { expect } from 'expect'; import { Transaction } from '../../lib/mina.js'; import { PrivateKey } from '../../lib/signature.js'; import { Signature } from '../src/signature.js'; +import { Pickles } from '../../snarky.js'; +import { Field } from '../../index.js'; const client = new Client({ network: 'testnet' }); let { publicKey, privateKey } = client.genKeys(); let dummy = ZkappCommand.toJSON(ZkappCommand.emptyValue()); let dummySignature = Signature.toBase58(Signature.dummy()); +let [, , hash] = Pickles.dummyVerificationKey(); +let dummyVK = Field.fromBytes([...hash]); // we construct a transaction which needs signing of the fee payer and another account update let accountUpdateExample2: TransactionJson.AccountUpdate = { @@ -22,7 +26,7 @@ let accountUpdateExample2: TransactionJson.AccountUpdate = { authorizationKind: { isSigned: true, isProved: false, - verificationKeyHash: '0', + verificationKeyHash: dummyVK.toString(), }, }, authorization: { proof: null, signature: dummySignature }, From 1fc38c0eecf6738c9885f59d7b371c9a1549201a Mon Sep 17 00:00:00 2001 From: Martin Minkov Date: Mon, 10 Jul 2023 13:56:03 -0700 Subject: [PATCH 28/44] chore(vk_regression): update vk regression dumps --- src/examples/regression_test.json | 68 +++++++++++++++---------------- 1 file changed, 34 insertions(+), 34 deletions(-) diff --git a/src/examples/regression_test.json b/src/examples/regression_test.json index 0072acb53..12a838e3e 100644 --- a/src/examples/regression_test.json +++ b/src/examples/regression_test.json @@ -1,14 +1,14 @@ { "Voting_": { - "digest": "be2fb91778c112dba345230d33f53b60d6aebc9d21c34af42d2d06169c03521", + "digest": "1ea9c9b3a7a4a496b7ff475c22703afc1d76e1d43a083f158a8e0fcdf5c38299", "methods": { "voterRegistration": { - "rows": 1259, - "digest": "252726e585fdd28607537e32214069ab" + "rows": 1260, + "digest": "bc9b5a182fe80fa0b43f69288260cdb6" }, "candidateRegistration": { - "rows": 1259, - "digest": "7dc288527edd810f3c783657a601c1c4" + "rows": 1260, + "digest": "d438f0c0e3cb25047169b9337fc14c82" }, "approveRegistrations": { "rows": 1146, @@ -24,16 +24,16 @@ } }, "verificationKey": { - "data": "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", - "hash": "19660443494021854527802902390933343450736384143471742497399717759257180156257" + "data": "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", + "hash": "16088361010868812988430255572780959696328959791764991287776763833553815662393" } }, "Membership_": { - "digest": "20f27b15aa065df16fd1b5653eea3fac87a682d42e899b2b42c9c8f43dd8fab2", + "digest": "29f5da6bf80f85afa4c650a076a7c0635156604111daca1caf850a38fe793221", "methods": { "addEntry": { - "rows": 1353, - "digest": "4c8fef89cf61238eb8b76a9f6654d9b3" + "rows": 1354, + "digest": "e92325079707d82f16658d137cdd1f62" }, "isMember": { "rows": 470, @@ -45,8 +45,8 @@ } }, "verificationKey": { - "data": "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", - "hash": "25142559489010514551225407990905109333510883659762869393785257160030709140494" + "data": "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", + "hash": "26949318246233087045520854747894573043663192899239087552226340963263465727896" } }, "HelloWorld": { @@ -63,19 +63,19 @@ } }, "TokenContract": { - "digest": "3f7b82bb5d0aa4a349f8fec7d55a513db4505b91cd7809c224fc23fec5d2c31", + "digest": "3f97cd7633f9f4bda4da70fe8b5be3e4c330aa3da672d77071214846c10497fa", "methods": { "init": { - "rows": 655, - "digest": "f70ee741569f58c79880927f600447eb" + "rows": 656, + "digest": "421d2cc638792380c37a6122f812a81b" }, "init2": { "rows": 653, - "digest": "b0a2c5dc60db678eec6958d6070d01cd" + "digest": "825095c422222e189bee65e5a9b85e4c" }, "deployZkapp": { - "rows": 702, - "digest": "aba2a3ce9a3a9938c01f42c9c68cab88" + "rows": 703, + "digest": "12328ddb729b9a80aee4d63faec5760a" }, "approveUpdate": { "rows": 1929, @@ -87,32 +87,32 @@ }, "approveUpdateAndSend": { "rows": 2322, - "digest": "334536e42c982fb88416a9ba60f5ec4e" + "digest": "07a3c3067fd51710b5d94e0cdd3bbbf7" }, "transferToAddress": { - "rows": 1044, - "digest": "993432cac8b21c8711d00a1e3f4b59b2" + "rows": 1045, + "digest": "f5e8e39fc8ca8842fb5de72f82380007" }, "transferToUpdate": { - "rows": 2326, - "digest": "ec0ab4c66e0f9ffe9ae6b464dc958f91" + "rows": 2327, + "digest": "9de912b958ed80d6e5fa153d19fa362e" }, "getBalance": { "rows": 687, - "digest": "2582608a57284514cd4e5e606398658d" + "digest": "d88c3c16a17f8f8982523f2e37e3bfdc" } }, "verificationKey": { - "data": "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", - "hash": "6155486567758623619833493294960611240514732748370489740943279582502839222938" + "data": "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", + "hash": "18314844323530173907586590420689136318904984002610804536021168972801980443018" } }, "Dex": { - "digest": "26690a8deb2871a469dc694debd92a86bd35b8e9ff442eb0bb13f696eeeb884c", + "digest": "1bec7721157a004731bfe275e990951f53edc1bd8094ae75fe29ee9daffafab0", "methods": { "supplyLiquidityBase": { - "rows": 3750, - "digest": "44f81dcd43bdeca0087a3739a116f117" + "rows": 3752, + "digest": "e655bc364f246c3acf40f044f605f403" }, "swapX": { "rows": 1986, @@ -124,16 +124,16 @@ }, "burnLiquidity": { "rows": 719, - "digest": "195792d9247af6beac2a47098cbe3853" + "digest": "f15f2cb57be380f8eed647e9cf693c9d" }, "transfer": { - "rows": 1044, - "digest": "bff9ae6e5f3679ed889b7d88c5f0c661" + "rows": 1045, + "digest": "c3f6cd2bd5e2b502ed77d54e07525808" } }, "verificationKey": { - "data": "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", - "hash": "22927084896663477016096997193081299898252315402907206057377208440233983904154" + "data": "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", + "hash": "26666290820393812024160635916660181119426685959977866416932801123172621619133" } }, "Group Primitive": { From c37c459967a94022740ca74ef88df95514538cb3 Mon Sep 17 00:00:00 2001 From: Martin Minkov Date: Mon, 10 Jul 2023 13:56:46 -0700 Subject: [PATCH 29/44] feat(tsconfig.mina-signer.json): fix building by enabling decorators --- tsconfig.mina-signer.json | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tsconfig.mina-signer.json b/tsconfig.mina-signer.json index 9a6debaf3..98a0f8388 100644 --- a/tsconfig.mina-signer.json +++ b/tsconfig.mina-signer.json @@ -10,7 +10,11 @@ "moduleResolution": "nodenext", // comply with node + "type": "module" "esModuleInterop": true, // to silence jest + "experimentalDecorators": true, // needed for decorators + "emitDecoratorMetadata": true, // needed for decorators + "strict": true, // for the full TypeScript experience + "strictPropertyInitialization": false, // to enable generic constructors, e.g. on CircuitValue "importHelpers": true, // reduces size "declaration": true, // declaration files are how library consumers get our types "noEmitOnError": false, // avoid accidentally shipping with type errors From a20d1f924b98231393695f246dfad6281774d1df Mon Sep 17 00:00:00 2001 From: Martin Minkov Date: Mon, 10 Jul 2023 14:59:24 -0700 Subject: [PATCH 30/44] Revert "feat(tsconfig.mina-signer.json): fix building by enabling decorators" This reverts commit c37c459967a94022740ca74ef88df95514538cb3. --- tsconfig.mina-signer.json | 4 ---- 1 file changed, 4 deletions(-) diff --git a/tsconfig.mina-signer.json b/tsconfig.mina-signer.json index 98a0f8388..9a6debaf3 100644 --- a/tsconfig.mina-signer.json +++ b/tsconfig.mina-signer.json @@ -10,11 +10,7 @@ "moduleResolution": "nodenext", // comply with node + "type": "module" "esModuleInterop": true, // to silence jest - "experimentalDecorators": true, // needed for decorators - "emitDecoratorMetadata": true, // needed for decorators - "strict": true, // for the full TypeScript experience - "strictPropertyInitialization": false, // to enable generic constructors, e.g. on CircuitValue "importHelpers": true, // reduces size "declaration": true, // declaration files are how library consumers get our types "noEmitOnError": false, // avoid accidentally shipping with type errors From b3b4cb15e27cd4e92666ab644443608c2232e26c Mon Sep 17 00:00:00 2001 From: Martin Minkov Date: Tue, 11 Jul 2023 11:05:41 -0700 Subject: [PATCH 31/44] feat(account_update): correctly create empty verification key hash --- src/lib/account_update.ts | 24 +++++++++--------------- src/lib/account_update.unit-test.ts | 9 +++++++++ src/lib/proof_system.ts | 6 ++++++ src/lib/testing/random.ts | 4 ++++ 4 files changed, 28 insertions(+), 15 deletions(-) diff --git a/src/lib/account_update.ts b/src/lib/account_update.ts index 4d4e975ee..7a5511efd 100644 --- a/src/lib/account_update.ts +++ b/src/lib/account_update.ts @@ -18,7 +18,13 @@ import { UInt64, UInt32, Int64, Sign } from './int.js'; import * as Mina from './mina.js'; import { SmartContract } from './zkapp.js'; import * as Precondition from './precondition.js'; -import { dummyBase64Proof, Empty, Proof, Prover } from './proof_system.js'; +import { + dummyBase64Proof, + dummyVerificationKeyHash, + Empty, + Proof, + Prover, +} from './proof_system.js'; import { Memo } from '../mina-signer/src/memo.js'; import { Events, @@ -33,7 +39,6 @@ import { MlArray } from './ml/base.js'; import { Signature, signFieldElement } from '../mina-signer/src/signature.js'; import { MlFieldConstArray } from './ml/fields.js'; import { transactionCommitments } from '../mina-signer/src/sign-zkapp-command.js'; -import { Field as Fp } from './field.js'; // external API export { AccountUpdate, Permissions, ZkappPublicInput }; @@ -446,7 +451,7 @@ const Body = { tokenId?: Field, mayUseToken?: MayUseToken ): Body { - let { body } = AccountUpdate.emptyValue(); + let { body } = Types.AccountUpdate.emptyValue(); body.publicKey = publicKey; if (tokenId) { body.tokenId = tokenId; @@ -464,7 +469,7 @@ const Body = { }, dummy(): Body { - return AccountUpdate.emptyValue().body; + return Types.AccountUpdate.emptyValue().body; }, }; @@ -1289,12 +1294,6 @@ class AccountUpdate implements Types.AccountUpdate { other ); } - static emptyValue() { - let empty = Types.AccountUpdate.emptyValue(); - empty.body.authorizationKind.verificationKeyHash = - dummyVerificationKeyHash(); - return empty; - } static witness( type: FlexibleProvable, @@ -1955,11 +1954,6 @@ function dummySignature() { return Signature.toBase58(Signature.dummy()); } -function dummyVerificationKeyHash() { - let [, , hash] = Pickles.dummyVerificationKey(); - return Fp.fromBytes([...hash]); -} - /** * The public input for zkApps consists of certain hashes of the proving AccountUpdate (and its child accountUpdates) which is constructed during method diff --git a/src/lib/account_update.unit-test.ts b/src/lib/account_update.unit-test.ts index 62f33962b..df435fefd 100644 --- a/src/lib/account_update.unit-test.ts +++ b/src/lib/account_update.unit-test.ts @@ -9,6 +9,7 @@ import { } from '../index.js'; import { Test } from '../snarky.js'; import { expect } from 'expect'; +import { dummyVerificationKeyHash } from './proof_system.js'; let address = PrivateKey.random().toPublicKey(); @@ -97,6 +98,14 @@ function createAccountUpdate() { ); } +// creates the right empty vk hash +{ + let accountUpdate = createAccountUpdate(); + expect( + accountUpdate.body.authorizationKind.verificationKeyHash.toString() + ).toEqual(dummyVerificationKeyHash().toString()); +} + // does not throw an error if private key is missing unless if .send is executed { let Local = Mina.LocalBlockchain({ proofsEnabled: false }); diff --git a/src/lib/proof_system.ts b/src/lib/proof_system.ts index 2b13a320e..a4cd287d1 100644 --- a/src/lib/proof_system.ts +++ b/src/lib/proof_system.ts @@ -52,6 +52,7 @@ export { isAsFields, Prover, dummyBase64Proof, + dummyVerificationKeyHash, }; type Undefined = undefined; @@ -808,6 +809,11 @@ function dummyBase64Proof() { return withThreadPool(async () => Pickles.dummyBase64Proof()); } +function dummyVerificationKeyHash() { + let [, , hash] = Pickles.dummyVerificationKey(); + return Field.fromBytes([...hash]); +} + // helpers for circuit context function Prover() { diff --git a/src/lib/testing/random.ts b/src/lib/testing/random.ts index 7eff04a2a..2ab1c352a 100644 --- a/src/lib/testing/random.ts +++ b/src/lib/testing/random.ts @@ -14,6 +14,7 @@ import { Field, Actions, ActionState, + VerificationKeyHash, ReceiptChainHash, Sign, TokenId, @@ -104,6 +105,7 @@ const actions = mapWithInvalid( Actions.fromList ); const actionState = oneOf(ActionState.emptyValue(), field); +const verificationKeyHash = oneOf(VerificationKeyHash.emptyValue(), field); const receiptChainHash = oneOf(ReceiptChainHash.emptyValue(), field); const zkappUri = map(string(nat(50)), ZkappUri.fromJSON); @@ -127,6 +129,7 @@ const Generators: Generators = { Events: events, Actions: actions, ActionState: actionState, + VerificationKeyHash: verificationKeyHash, ReceiptChainHash: receiptChainHash, ZkappUri: zkappUri, null: constant(null), @@ -229,6 +232,7 @@ const JsonGenerators: JsonGenerators = { Events: mapWithInvalid(events, Events.toJSON), Actions: mapWithInvalid(actions, Actions.toJSON), ActionState: mapWithInvalid(actionState, ActionState.toJSON), + VerificationKeyHash: mapWithInvalid(verificationKeyHash, Field.toJSON), ReceiptChainHash: mapWithInvalid(receiptChainHash, ReceiptChainHash.toJSON), ZkappUri: string(nat(50)), null: constant(null), From 6e624eb996e46ae35f441ba6ac032d3e80f76b84 Mon Sep 17 00:00:00 2001 From: Martin Minkov Date: Tue, 11 Jul 2023 11:28:22 -0700 Subject: [PATCH 32/44] refactor(sign-zkapp-command.ts, accountUpdate.ts): replace Pickles.dummyVerificationKey() with mocks.dummyVerificationKeyHash --- src/mina-signer/src/sign-zkapp-command.ts | 14 +++++++------- src/mina-signer/src/test-vectors/accountUpdate.ts | 7 ++----- 2 files changed, 9 insertions(+), 12 deletions(-) diff --git a/src/mina-signer/src/sign-zkapp-command.ts b/src/mina-signer/src/sign-zkapp-command.ts index a1146f113..69578ed19 100644 --- a/src/mina-signer/src/sign-zkapp-command.ts +++ b/src/mina-signer/src/sign-zkapp-command.ts @@ -17,7 +17,7 @@ import { signFieldElement, verifyFieldElement, } from './signature.js'; -import { Pickles } from '../../snarky.js'; +import { mocks } from '../../bindings/crypto/constants.js'; // external API export { signZkappCommand, verifyZkappCommandSignature }; @@ -181,7 +181,6 @@ function accountUpdateFromFeePayer({ authorization: signature, }: FeePayer): AccountUpdate { let { body } = AccountUpdate.emptyValue(); - let [, , hash] = Pickles.dummyVerificationKey(); body.publicKey = publicKey; body.balanceChange = { magnitude: fee, sgn: Sign(-1) }; body.incrementNonce = Bool(true); @@ -198,7 +197,7 @@ function accountUpdateFromFeePayer({ body.authorizationKind = { isProved: Bool(false), isSigned: Bool(true), - verificationKeyHash: Field.fromBytes([...hash]), + verificationKeyHash: Field(mocks.dummyVerificationKeyHash), }; return { body, authorization: { signature } }; } @@ -218,14 +217,15 @@ function isCallDepthValid(zkappCommand: ZkappCommand) { function assertAuthorizationKindValid(accountUpdate: AccountUpdate) { let { isSigned, isProved, verificationKeyHash } = accountUpdate.body.authorizationKind; - let [, , hash] = Pickles.dummyVerificationKey(); - const dummyVK = Field.fromBytes([...hash]); if (isProved && isSigned) throw Error( 'Invalid authorization kind: Only one of `isProved` and `isSigned` may be true.' ); - if (!isProved && verificationKeyHash !== dummyVK) + if ( + !isProved && + verificationKeyHash !== Field(mocks.dummyVerificationKeyHash) + ) throw Error( - `Invalid authorization kind: If \`isProved\` is false, verification key hash must be ${dummyVK}, got ${verificationKeyHash}` + `Invalid authorization kind: If \`isProved\` is false, verification key hash must be ${mocks.dummyVerificationKeyHash}, got ${verificationKeyHash}` ); } diff --git a/src/mina-signer/src/test-vectors/accountUpdate.ts b/src/mina-signer/src/test-vectors/accountUpdate.ts index de021ab8e..cb8817b9d 100644 --- a/src/mina-signer/src/test-vectors/accountUpdate.ts +++ b/src/mina-signer/src/test-vectors/accountUpdate.ts @@ -1,11 +1,8 @@ import * as Json from '../../../bindings/mina-transaction/gen/transaction-json.js'; -import { Field } from '../../../provable/field-bigint.js'; -import { Pickles } from '../../../snarky.js'; +import { mocks } from '../../../bindings/crypto/constants.js'; export { accountUpdateExample }; -let [, , hash] = Pickles.dummyVerificationKey(); - // an example account update, to be used for tests let accountUpdateExample: Json.AccountUpdate = { body: { @@ -92,7 +89,7 @@ let accountUpdateExample: Json.AccountUpdate = { authorizationKind: { isSigned: false, isProved: false, - verificationKeyHash: Field.fromBytes([...hash]).toString(), + verificationKeyHash: mocks.dummyVerificationKeyHash, }, }, authorization: { proof: null, signature: null }, From 5e1e10af6988e65d2ed005adb764adada4dd00b7 Mon Sep 17 00:00:00 2001 From: Martin Minkov Date: Tue, 11 Jul 2023 11:42:41 -0700 Subject: [PATCH 33/44] feat(sign-zkapp-command.unit-test.ts): use mocks for dummyVerificationKeyHash --- .../src/sign-zkapp-command.unit-test.ts | 20 ++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/src/mina-signer/src/sign-zkapp-command.unit-test.ts b/src/mina-signer/src/sign-zkapp-command.unit-test.ts index ec56fd5b7..3959b8090 100644 --- a/src/mina-signer/src/sign-zkapp-command.unit-test.ts +++ b/src/mina-signer/src/sign-zkapp-command.unit-test.ts @@ -43,6 +43,7 @@ import { Random, test, withHardCoded } from '../../lib/testing/property.js'; import { RandomTransaction } from './random-transaction.js'; import { Ml, MlHashInput } from '../../lib/ml/conversion.js'; import { FieldConst } from '../../lib/field.js'; +import { mocks } from '../..//bindings/crypto/constants.js'; // monkey-patch bigint to json (BigInt.prototype as any).toJSON = function () { @@ -62,7 +63,6 @@ test(Random.json.publicKey, (publicKeyBase58) => { // empty account update let dummy = AccountUpdate.emptyValue(); -fixVerificationKeyHash(dummy); let dummySnarky = AccountUpdateSnarky.dummy(); expect(AccountUpdate.toJSON(dummy)).toEqual( AccountUpdateSnarky.toJSON(dummySnarky) @@ -82,7 +82,6 @@ expect(stringify(dummyInput.packed)).toEqual( ); test(Random.accountUpdate, (accountUpdate) => { - fixVerificationKeyHash(accountUpdate); fixVerificationKey(accountUpdate); // example account update @@ -127,7 +126,6 @@ test(memoGenerator, (memoString) => { // zkapp transaction - basic properties & commitment test(RandomTransaction.zkappCommand, (zkappCommand, assert) => { - zkappCommand.accountUpdates.forEach(fixVerificationKeyHash); zkappCommand.accountUpdates.forEach(fixVerificationKey); assert(isCallDepthValid(zkappCommand)); @@ -154,7 +152,6 @@ test.negative( test( RandomTransaction.zkappCommandAndFeePayerKey, ({ feePayerKey, zkappCommand }) => { - zkappCommand.accountUpdates.forEach(fixVerificationKeyHash); zkappCommand.accountUpdates.forEach(fixVerificationKey); let feePayerKeyBase58 = PrivateKey.toBase58(feePayerKey); @@ -275,17 +272,22 @@ console.log('to/from json, hashes & signatures are consistent! 🎉'); function fixVerificationKey(a: AccountUpdate) { // ensure verification key is valid if (a.body.update.verificationKey.isSome === 1n) { - let [, data, hash] = Pickles.dummyVerificationKey(); + let [, data] = Pickles.dummyVerificationKey(); a.body.update.verificationKey.value = { data, - hash: Field.fromBytes([...hash]), + hash: Field(mocks.dummyVerificationKeyHash), }; } else { - a.body.update.verificationKey.value = { data: '', hash: Field(0) }; + a.body.update.verificationKey.value = { + data: '', + hash: Field(0), + }; } + fixVerificationKeyHash(a); } function fixVerificationKeyHash(a: AccountUpdate) { - let [, , hash] = Pickles.dummyVerificationKey(); - a.body.authorizationKind.verificationKeyHash = Field.fromBytes([...hash]); + a.body.authorizationKind.verificationKeyHash = Field( + mocks.dummyVerificationKeyHash + ); } From 4bc172daeff5ea9e7b3ebb26953ca49f42f77d81 Mon Sep 17 00:00:00 2001 From: Martin Minkov Date: Tue, 11 Jul 2023 11:43:20 -0700 Subject: [PATCH 34/44] fix(tsconfig.mina-signer.json): fix mina-signer building due to inclusion of snarkyjs signature.ts --- tsconfig.mina-signer.json | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tsconfig.mina-signer.json b/tsconfig.mina-signer.json index 9a6debaf3..98a0f8388 100644 --- a/tsconfig.mina-signer.json +++ b/tsconfig.mina-signer.json @@ -10,7 +10,11 @@ "moduleResolution": "nodenext", // comply with node + "type": "module" "esModuleInterop": true, // to silence jest + "experimentalDecorators": true, // needed for decorators + "emitDecoratorMetadata": true, // needed for decorators + "strict": true, // for the full TypeScript experience + "strictPropertyInitialization": false, // to enable generic constructors, e.g. on CircuitValue "importHelpers": true, // reduces size "declaration": true, // declaration files are how library consumers get our types "noEmitOnError": false, // avoid accidentally shipping with type errors From cf070a3b8d40c11ad1d76e47b54daf2dc5cd8705 Mon Sep 17 00:00:00 2001 From: Martin Minkov Date: Tue, 11 Jul 2023 11:43:35 -0700 Subject: [PATCH 35/44] chore(bindings): update subproject commit hash to 988f7b8445a5d1597304ecdca93da3b56a6a9662 for latest changes --- src/bindings | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/bindings b/src/bindings index 32e343952..988f7b844 160000 --- a/src/bindings +++ b/src/bindings @@ -1 +1 @@ -Subproject commit 32e3439528880a9cfedd162e1b5e886eeac5da96 +Subproject commit 988f7b8445a5d1597304ecdca93da3b56a6a9662 From eaea0d5947eec88761d497bea2cbb1161b69d602 Mon Sep 17 00:00:00 2001 From: Martin Minkov Date: Tue, 11 Jul 2023 11:47:40 -0700 Subject: [PATCH 36/44] chore(package.json): bump version from 0.11.4 to 0.12.0 for the new release --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 11aa3263c..fa0fd5599 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "snarkyjs", - "version": "0.11.4", + "version": "0.12.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "snarkyjs", - "version": "0.11.4", + "version": "0.12.0", "license": "Apache-2.0", "dependencies": { "blakejs": "1.2.1", diff --git a/package.json b/package.json index 0da199a18..f5c574608 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "snarkyjs", "description": "TypeScript framework for zk-SNARKs and zkApps", - "version": "0.11.4", + "version": "0.12.0", "license": "Apache-2.0", "homepage": "https://github.com/o1-labs/snarkyjs/", "keywords": [ From 8cec003335f6bf53bbb495fc99ef8b2984eff682 Mon Sep 17 00:00:00 2001 From: Martin Minkov Date: Tue, 11 Jul 2023 11:53:58 -0700 Subject: [PATCH 37/44] docs(CHANGELOG.md): update unreleased changes and add version 0.12.0 details This commit updates the unreleased changes link and adds the details of version 0.12.0. The breaking changes in version 0.12.0 are also documented, specifically the fix to the default verification key hash for AccountUpdates. This change adopts the default mechanism provided by Mina Protocol and may affect the verification key of already deployed contracts. --- CHANGELOG.md | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index cfd37a26a..81eb52546 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,10 +15,17 @@ This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm _Security_ in case of vulnerabilities. --> -## [Unreleased](https://github.com/o1-labs/snarkyjs/compare/eaa39dca0...HEAD) +## [Unreleased](https://github.com/o1-labs/snarkyjs/compare/161b69d602...HEAD) > No unreleased changes yet +## [0.12.0](https://github.com/o1-labs/snarkyjs/compare/eaa39dca0...161b69d602) + +### Breaking Changes + +- Fix the default verification key hash that was generated for AccountUpdates. This change adopts the default mechanism provided by Mina Protocol https://github.com/o1-labs/snarkyjs/pull/1021 + - Please be aware that this alteration results in a breaking change affecting the verification key of already deployed contracts. + ## [0.11.4](https://github.com/o1-labs/snarkyjs/compare/544489609...eaa39dca0) ### Fixed From e0af7327b2e2d7d7e088c61d0aa69f752c50e948 Mon Sep 17 00:00:00 2001 From: Martin Minkov Date: Tue, 11 Jul 2023 11:58:40 -0700 Subject: [PATCH 38/44] fix(zkapp.unit-test.ts): replace vk with with mocked version --- src/mina-signer/tests/zkapp.unit-test.ts | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/mina-signer/tests/zkapp.unit-test.ts b/src/mina-signer/tests/zkapp.unit-test.ts index 3c4c53935..bf6c7073b 100644 --- a/src/mina-signer/tests/zkapp.unit-test.ts +++ b/src/mina-signer/tests/zkapp.unit-test.ts @@ -6,16 +6,13 @@ import { expect } from 'expect'; import { Transaction } from '../../lib/mina.js'; import { PrivateKey } from '../../lib/signature.js'; import { Signature } from '../src/signature.js'; -import { Pickles } from '../../snarky.js'; -import { Field } from '../../index.js'; +import { mocks } from '../../bindings/crypto/constants.js'; const client = new Client({ network: 'testnet' }); let { publicKey, privateKey } = client.genKeys(); let dummy = ZkappCommand.toJSON(ZkappCommand.emptyValue()); let dummySignature = Signature.toBase58(Signature.dummy()); -let [, , hash] = Pickles.dummyVerificationKey(); -let dummyVK = Field.fromBytes([...hash]); // we construct a transaction which needs signing of the fee payer and another account update let accountUpdateExample2: TransactionJson.AccountUpdate = { @@ -26,7 +23,7 @@ let accountUpdateExample2: TransactionJson.AccountUpdate = { authorizationKind: { isSigned: true, isProved: false, - verificationKeyHash: dummyVK.toString(), + verificationKeyHash: mocks.dummyVerificationKeyHash, }, }, authorization: { proof: null, signature: dummySignature }, From e1573042075553166ae1a01a361050a594c691de Mon Sep 17 00:00:00 2001 From: Martin Minkov Date: Tue, 11 Jul 2023 11:58:48 -0700 Subject: [PATCH 39/44] Revert "fix(tsconfig.mina-signer.json): fix mina-signer building due to inclusion of snarkyjs signature.ts" This reverts commit 4bc172daeff5ea9e7b3ebb26953ca49f42f77d81. --- tsconfig.mina-signer.json | 4 ---- 1 file changed, 4 deletions(-) diff --git a/tsconfig.mina-signer.json b/tsconfig.mina-signer.json index 98a0f8388..9a6debaf3 100644 --- a/tsconfig.mina-signer.json +++ b/tsconfig.mina-signer.json @@ -10,11 +10,7 @@ "moduleResolution": "nodenext", // comply with node + "type": "module" "esModuleInterop": true, // to silence jest - "experimentalDecorators": true, // needed for decorators - "emitDecoratorMetadata": true, // needed for decorators - "strict": true, // for the full TypeScript experience - "strictPropertyInitialization": false, // to enable generic constructors, e.g. on CircuitValue "importHelpers": true, // reduces size "declaration": true, // declaration files are how library consumers get our types "noEmitOnError": false, // avoid accidentally shipping with type errors From 38c12fbb1b6a6b3847e83b59101e1e941dd502ef Mon Sep 17 00:00:00 2001 From: Martin Minkov Date: Tue, 11 Jul 2023 12:00:11 -0700 Subject: [PATCH 40/44] fix(sign-zkapp-command.unit-test.ts): correct the import path for mocks from constants.js --- src/mina-signer/src/sign-zkapp-command.unit-test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mina-signer/src/sign-zkapp-command.unit-test.ts b/src/mina-signer/src/sign-zkapp-command.unit-test.ts index 3959b8090..a0c943d03 100644 --- a/src/mina-signer/src/sign-zkapp-command.unit-test.ts +++ b/src/mina-signer/src/sign-zkapp-command.unit-test.ts @@ -43,7 +43,7 @@ import { Random, test, withHardCoded } from '../../lib/testing/property.js'; import { RandomTransaction } from './random-transaction.js'; import { Ml, MlHashInput } from '../../lib/ml/conversion.js'; import { FieldConst } from '../../lib/field.js'; -import { mocks } from '../..//bindings/crypto/constants.js'; +import { mocks } from '../../bindings/crypto/constants.js'; // monkey-patch bigint to json (BigInt.prototype as any).toJSON = function () { From 89beca35b0af61f638cb31cc6c0a79968c52367f Mon Sep 17 00:00:00 2001 From: Martin Minkov Date: Tue, 11 Jul 2023 12:16:32 -0700 Subject: [PATCH 41/44] refactor(random.ts): replace Pickles.dummyVerificationKey() with mocks.dummyVerificationKeyHash for simplicity and readability --- src/lib/testing/random.ts | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/lib/testing/random.ts b/src/lib/testing/random.ts index 2ab1c352a..b334f6152 100644 --- a/src/lib/testing/random.ts +++ b/src/lib/testing/random.ts @@ -38,7 +38,7 @@ import { Memo } from '../../mina-signer/src/memo.js'; import { ProvableExtended } from '../../bindings/lib/provable-bigint.js'; import { tokenSymbolLength } from '../../bindings/mina-transaction/derived-leaves.js'; import { stringLengthInBytes } from '../../bindings/lib/binable.js'; -import { Pickles } from '../../snarky.js'; +import { mocks } from '../../bindings/crypto/constants.js'; export { Random, sample, withHardCoded }; @@ -262,10 +262,8 @@ const accountUpdateJson = mapWithInvalid( } if (!a.body.authorizationKind.isProved) { - let [, , hash] = Pickles.dummyVerificationKey(); - a.body.authorizationKind.verificationKeyHash = Field.fromBytes([ - ...hash, - ]).toString(); + a.body.authorizationKind.verificationKeyHash = + mocks.dummyVerificationKeyHash; } // ensure mayUseToken is valid let { inheritFromParent, parentsOwnToken } = a.body.mayUseToken; From 4a5cffa40c8e431c3287e89cf8b2133491c722b6 Mon Sep 17 00:00:00 2001 From: Martin Minkov Date: Tue, 11 Jul 2023 12:20:35 -0700 Subject: [PATCH 42/44] feat(tsconfig.mina-signer.json): enable experimentalDecorators, emitDecoratorMetadata, useDefineForClassFields, and strictPropertyInitialization to support decorators and generic constructors in TypeScript --- tsconfig.mina-signer.json | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/tsconfig.mina-signer.json b/tsconfig.mina-signer.json index 9a6debaf3..6dbe2e7b2 100644 --- a/tsconfig.mina-signer.json +++ b/tsconfig.mina-signer.json @@ -10,6 +10,11 @@ "moduleResolution": "nodenext", // comply with node + "type": "module" "esModuleInterop": true, // to silence jest + "experimentalDecorators": true, // needed for decorators + "emitDecoratorMetadata": true, // needed for decorators + "useDefineForClassFields": false, // ensure correct behaviour of class fields with decorators + "strictPropertyInitialization": false, // to enable generic constructors, e.g. on CircuitValue + "strict": true, // for the full TypeScript experience "importHelpers": true, // reduces size "declaration": true, // declaration files are how library consumers get our types From bd477a7dd163e2db91148bbb2a2e62264839aa9d Mon Sep 17 00:00:00 2001 From: Martin Minkov Date: Tue, 11 Jul 2023 13:05:14 -0700 Subject: [PATCH 43/44] refactor(tsconfig.mina-signer.json): remove unnecessary decorator-related options --- tsconfig.mina-signer.json | 5 ----- 1 file changed, 5 deletions(-) diff --git a/tsconfig.mina-signer.json b/tsconfig.mina-signer.json index 6dbe2e7b2..9a6debaf3 100644 --- a/tsconfig.mina-signer.json +++ b/tsconfig.mina-signer.json @@ -10,11 +10,6 @@ "moduleResolution": "nodenext", // comply with node + "type": "module" "esModuleInterop": true, // to silence jest - "experimentalDecorators": true, // needed for decorators - "emitDecoratorMetadata": true, // needed for decorators - "useDefineForClassFields": false, // ensure correct behaviour of class fields with decorators - "strictPropertyInitialization": false, // to enable generic constructors, e.g. on CircuitValue - "strict": true, // for the full TypeScript experience "importHelpers": true, // reduces size "declaration": true, // declaration files are how library consumers get our types From 97869a682f220cbc23d1e2a5883bb1fa2d46840a Mon Sep 17 00:00:00 2001 From: Martin Minkov Date: Tue, 11 Jul 2023 13:05:36 -0700 Subject: [PATCH 44/44] chore(bindings): update subproject commit hash to 2c4c71339073ffe1f038cd538eebfcb44eb526fa for latest changes --- src/bindings | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/bindings b/src/bindings index 988f7b844..2c4c71339 160000 --- a/src/bindings +++ b/src/bindings @@ -1 +1 @@ -Subproject commit 988f7b8445a5d1597304ecdca93da3b56a6a9662 +Subproject commit 2c4c71339073ffe1f038cd538eebfcb44eb526fa