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 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": [ diff --git a/src/bindings b/src/bindings index f52126e53..2c4c71339 160000 --- a/src/bindings +++ b/src/bindings @@ -1 +1 @@ -Subproject commit f52126e53ceb9cfe4e3beab0b6ac30f4a4cc77e4 +Subproject commit 2c4c71339073ffe1f038cd538eebfcb44eb526fa 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": { diff --git a/src/lib/account_update.ts b/src/lib/account_update.ts index 6c9bf9f7c..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, @@ -1802,7 +1808,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 +1867,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' }; }, 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 f9d191950..b334f6152 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, @@ -37,6 +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 { mocks } from '../../bindings/crypto/constants.js'; export { Random, sample, withHardCoded }; @@ -103,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); @@ -126,6 +129,7 @@ const Generators: Generators = { Events: events, Actions: actions, ActionState: actionState, + VerificationKeyHash: verificationKeyHash, ReceiptChainHash: receiptChainHash, ZkappUri: zkappUri, null: constant(null), @@ -228,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), @@ -255,8 +260,10 @@ const accountUpdateJson = mapWithInvalid( if (isProved && isSigned) { a.body.authorizationKind.isProved = false; } + if (!a.body.authorizationKind.isProved) { - a.body.authorizationKind.verificationKeyHash = '0'; + a.body.authorizationKind.verificationKeyHash = + mocks.dummyVerificationKeyHash; } // ensure mayUseToken is valid let { inheritFromParent, parentsOwnToken } = a.body.mayUseToken; diff --git a/src/mina-signer/MinaSigner.ts b/src/mina-signer/MinaSigner.ts index 4843219da..cc0d0df27 100644 --- a/src/mina-signer/MinaSigner.ts +++ b/src/mina-signer/MinaSigner.ts @@ -198,7 +198,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 @@ -226,7 +226,7 @@ class Client { return verifyPayment( { common: { fee, feePayer: from, nonce, validUntil, memo }, - body: { source: from, receiver: to, amount }, + body: { receiver: to, amount }, }, signature, publicKey, @@ -254,7 +254,7 @@ class Client { let signature = signStakeDelegation( { common: { fee, feePayer: from, nonce, validUntil, memo }, - body: { newDelegate: to, delegator: from }, + body: { newDelegate: to }, }, privateKey, this.network @@ -281,7 +281,7 @@ class Client { return verifyStakeDelegation( { common: { fee, feePayer: from, nonce, validUntil, memo }, - body: { newDelegate: to, delegator: from }, + body: { newDelegate: to }, }, signature, publicKey, @@ -306,7 +306,7 @@ class Client { signature, data: { common: { fee, feePayer: from, nonce, validUntil, memo }, - body: { source: from, receiver: to, amount }, + body: { receiver: to, amount }, }, }, options @@ -329,7 +329,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..2cc71b9e9 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, @@ -146,7 +148,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); } @@ -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,25 +177,25 @@ 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), }, }; } -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,17 +264,15 @@ type Common = { fee: UInt64; feePayer: PublicKey; nonce: UInt32; - validUntil: UInt32; + validUntil: { type: 'SinceGenesis'; value: UInt32 }; memo: string; }; 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/sign-zkapp-command.ts b/src/mina-signer/src/sign-zkapp-command.ts index da4bb1c20..69578ed19 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 { mocks } from '../../bindings/crypto/constants.js'; // external API export { signZkappCommand, verifyZkappCommandSignature }; @@ -196,7 +197,7 @@ function accountUpdateFromFeePayer({ body.authorizationKind = { isProved: Bool(false), isSigned: Bool(true), - verificationKeyHash: Field(0), + verificationKeyHash: Field(mocks.dummyVerificationKeyHash), }; return { body, authorization: { signature } }; } @@ -220,8 +221,11 @@ function assertAuthorizationKindValid(accountUpdate: AccountUpdate) { throw Error( 'Invalid authorization kind: Only one of `isProved` and `isSigned` may be true.' ); - if (!isProved && verificationKeyHash !== 0n) + if ( + !isProved && + verificationKeyHash !== Field(mocks.dummyVerificationKeyHash) + ) 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 ${mocks.dummyVerificationKeyHash}, 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..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,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 () { @@ -271,12 +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) { + a.body.authorizationKind.verificationKeyHash = Field( + mocks.dummyVerificationKeyHash + ); } diff --git a/src/mina-signer/src/test-vectors/accountUpdate.ts b/src/mina-signer/src/test-vectors/accountUpdate.ts index 4e71410b6..cb8817b9d 100644 --- a/src/mina-signer/src/test-vectors/accountUpdate.ts +++ b/src/mina-signer/src/test-vectors/accountUpdate.ts @@ -1,4 +1,5 @@ import * as Json from '../../../bindings/mina-transaction/gen/transaction-json.js'; +import { mocks } from '../../../bindings/crypto/constants.js'; export { accountUpdateExample }; @@ -88,7 +89,7 @@ let accountUpdateExample: Json.AccountUpdate = { authorizationKind: { isSigned: false, isProved: false, - verificationKeyHash: '0', + verificationKeyHash: mocks.dummyVerificationKeyHash, }, }, authorization: { proof: null, signature: null }, 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..7a8e56ef6 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, @@ -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 } }, }, }; } @@ -98,28 +98,31 @@ 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'] ); 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 +173,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 +185,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, }); @@ -197,7 +200,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 +230,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( @@ -239,7 +254,7 @@ const CommonV1 = with1( ) ) ); -type PaymentV1 = Payment & { tokenId: UInt64 }; +type PaymentV1 = Payment & { source: PublicKey, tokenId: UInt64 }; const PaymentV1 = with1( with1( record( @@ -253,23 +268,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 b8986f036..955f451cd 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, }; @@ -152,16 +154,16 @@ test.negative(RandomTransaction.signedDelegation.invalid!, (delegation) => { 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), }; } @@ -169,7 +171,7 @@ function paymentToOcaml({ function paymentToOcamlV1({ data: { common, - body: { source, receiver, amount }, + body: { receiver, amount }, }, signature, }: SignedLegacy) { @@ -178,10 +180,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), }; } @@ -189,7 +191,7 @@ function paymentToOcamlV1({ function delegationToOcaml({ data: { common, - body: { delegator, newDelegate }, + body: { newDelegate }, }, signature, }: SignedLegacy) { @@ -198,10 +200,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), }; } @@ -209,7 +211,7 @@ function delegationToOcaml({ function delegationToOcamlV1({ data: { common, - body: { delegator, newDelegate }, + body: { newDelegate }, }, signature, }: SignedLegacy) { @@ -218,10 +220,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), }; } @@ -232,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, }; } 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( diff --git a/src/mina-signer/tests/zkapp.unit-test.ts b/src/mina-signer/tests/zkapp.unit-test.ts index c2ea4b21e..bf6c7073b 100644 --- a/src/mina-signer/tests/zkapp.unit-test.ts +++ b/src/mina-signer/tests/zkapp.unit-test.ts @@ -6,6 +6,7 @@ import { expect } from 'expect'; import { Transaction } from '../../lib/mina.js'; import { PrivateKey } from '../../lib/signature.js'; import { Signature } from '../src/signature.js'; +import { mocks } from '../../bindings/crypto/constants.js'; const client = new Client({ network: 'testnet' }); let { publicKey, privateKey } = client.genKeys(); @@ -22,7 +23,7 @@ let accountUpdateExample2: TransactionJson.AccountUpdate = { authorizationKind: { isSigned: true, isProved: false, - verificationKeyHash: '0', + verificationKeyHash: mocks.dummyVerificationKeyHash, }, }, authorization: { proof: null, signature: dummySignature },