Skip to content

Latest commit

 

History

History
344 lines (245 loc) · 23.7 KB

CHANGELOG.md

File metadata and controls

344 lines (245 loc) · 23.7 KB

Changelog

All notable changes to this project are documented in this file.

The format is based on Keep a Changelog. This project adheres to Semantic Versioning.

No unreleased changes yet

Fixed

  • getActions to handle multiple actions with multiple Account Updates o1-labs#801

Added

  • Use fetchEvents() to fetch events for a specified zkApp from a GraphQL endpoint that implements this schema. Mina.Network accepts an additional endpoint which points to a GraphQL server. o1-labs#749
    • Use the mina property for the Mina node.
    • Use archive for the archive node.
  • Use getActions to fetch actions for a specified zkApp from a GraphQL endpoint GraphQL endpoint that implements the same schema as fetchEvents. o1-labs#788

Fixed

  • Added the missing export of Mina.TransactionId o1-labs#785
  • Added an option to specify tokenId as Field in fetchAccount() o1-labs#787

Added

  • this.network.timestamp is added back and is implemented on top of this.network.globalSlotSinceGenesis o1-labs#755

Changed

  • On-chain value globalSlot is replaced by the clearer currentSlot o1-labs#755
    • currentSlot refers to the slot at which the transaction will be included in a block.
    • the only supported method is currentSlot.assertBetween() because currentSlot.get() is impossible to implement since the value is determined in the future and currentSlot.assertEquals() is error-prone

Fixed

  • Incorrect counting of limit on events and actions o1-labs#758
  • Type error when using Circuit.array in on-chain state or events o1-labs#758
  • Bug when using Circuit.witness outside the prover o1-labs#774

Fixed

  • Bug when using this.<state>.get() outside a transaction o1-labs#754

Added

  • Transaction.fromJSON to recover transaction object from JSON o1-labs#705
  • New precondition: provedState, a boolean which is true if the entire on-chain state of this account was last modified by a proof o1-labs#741
    • Same API as all preconditions: this.account.provedState.assertEquals(Bool(true))
    • Can be used to assert that the state wasn't tampered with by the zkApp developer using non-contract logic, for example, before deploying the zkApp
  • New on-chain value globalSlot, to make assertions about the current time o1-labs#649
    • example: this.globalSlot.get(), this.globalSlot.assertBetween(lower, upper)
    • Replaces network.timestamp, network.globalSlotSinceGenesis and network.globalSlotSinceHardFork. o1-labs#560
  • New permissions:
    • access to control whether account updates for this account can be used at all o1-labs#500
    • setTiming to control who can update the account's timing field o1-labs#685
    • Example: this.permissions.set({ ...Permissions.default(), access: Permissions.proofOrSignature() })
  • Expose low-level view into the PLONK gates created by a smart contract method o1-labs#687
    • MyContract.analyzeMethods().<method name>.gates

Changed

  • BREAKING CHANGE: Modify signature algorithm used by Signature.{create,verify} to be compatible with mina-signer o1-labs#710
    • Signatures created with mina-signer's client.signFields() can now be verified inside a SNARK!
    • Breaks existing deployed smart contracts which use Signature.verify()
  • BREAKING CHANGE: Circuits changed due to core protocol and cryptography changes; this breaks all deployed contracts.
  • BREAKING CHANGE: Change structure of Account type which is returned by Mina.getAccount() o1-labs#741
  • Test accounts hard-coded in LocalBlockchain now have default permissions, not permissions allowing everything. Fixes some unintuitive behaviour in tests, like requiring no signature when using these accounts to send MINA o1-labs#638

Removed

  • Preconditions timestamp and globalSlotSinceHardFork o1-labs#560
    • timestamp is expected to come back as a wrapper for the new globalSlot

Added

  • this.account.<field>.set() as a unified API to update fields on the account o1-labs#643
    • covers permissions, verificationKey, zkappUri, tokenSymbol, delegate, votingFor
    • exists on SmartContract.account and AccountUpdate.account
  • this.sender to get the public key of the transaction's sender o1-labs#652
    • To get the sender outside a smart contract, there's now Mina.sender()
  • tx.wait() is now implemented. It waits for the transactions inclusion in a block o1-labs#645
    • wait() also now takes an optional options parameter to specify the polling interval or maximum attempts. wait(options?: { maxAttempts?: number; interval?: number }): Promise<void>;
  • Circuit.constraintSystemFromKeypair(keypair) to inspect the circuit at a low level o1-labs#529
    • Works with a keypair (prover + verifier key) generated with the Circuit API
  • Mina.faucet() can now be used to programmatically fund an address on the testnet, using the faucet provided by faucet.minaprotocol.com o1-labs#693

Changed

  • BREAKING CHANGE: Constraint changes in sign(), requireSignature() and createSigned() on AccountUpdate / SmartContract. This means that smart contracts using these methods in their proofs won't be able to create valid proofs against old deployed verification keys. o1-labs#637
  • Mina.transaction now takes a public key as the fee payer argument (passing in a private key is deprecated) o1-labs#652
    • Before: Mina.transaction(privateKey, ...). Now: Mina.transaction(publicKey, ...)
    • AccountUpdate.fundNewAccount() now enables funding multiple accounts at once, and deprecates the initialBalance argument
  • New option enforceTransactionLimits for LocalBlockchain (default value: true), to disable the enforcement of protocol transaction limits (maximum events, maximum sequence events and enforcing certain layout of AccountUpdates depending on their authorization) o1-labs#620
  • Change the default send permissions (for sending MINA or tokens) that get set when deploying a zkApp, from signature() to proof() o1-labs#648
  • Functions for making assertions and comparisons have been renamed to their long form, instead of the initial abbreviation. Old function names have been deprecated o1-labs#681
    • .lt -> .lessThan
    • .lte -> .lessThanOrEqual
    • .gt -> .greaterThan
    • .gte -> greaterThanOrEqual
    • .assertLt -> .assertLessThan
    • .assertLte -> .assertLessThanOrEqual
    • .assertGt -> .assertGreaterThan
    • .assertGte -> assertGreaterThanOrEqual
    • .assertBoolean -> .assertBool

Deprecated

  • this.setPermissions() in favor of this.account.permissions.set() o1-labs#643
    • this.tokenSymbol.set() in favor of this.account.tokenSymbol.set()
    • this.setValue() in favor of this.account.<field>.set()
  • Mina.transaction(privateKey: PrivateKey, ...) in favor of new signature Mina.transaction(publicKey: PublicKey, ...)
  • AccountUpdate.createSigned(privateKey: PrivateKey) in favor of new signature AccountUpdate.createSigned(publicKey: PublicKey) o1-labs#637
  • .lt, .lte, gt, gte, .assertLt, .assertLte, .assertGt, .assertGte have been deprecated. o1-labs#681

Fixed

  • Fixed Apple silicon performance issue o1-labs#491
  • Type inference for Structs with instance methods o1-labs#567
    • also fixes Struct.fromJSON
  • SmartContract.fetchEvents fixed when multiple event types existed o1-labs#627
  • Error when using reduce with a Struct as state type o1-labs#689
  • Fix use of stale cached accounts in Mina.transaction o1-labs#430

Fixed

  • Bug in deploy() when initializing a contract that already exists o1-labs#588

Deprecated

  • Mina.BerkeleyQANet in favor of the clearer-named Mina.Network o1-labs#588

Added

Fixed

  • Bug in Circuit.log printing account updates o1-labs#578

Fixed

  • Testnet-incompatible signatures in v0.7.0 o1-labs#565

Added

  • Added an optional string parameter to certain assert methods o1-labs#470
  • Struct, a new primitive for declaring composite, SNARK-compatible types o1-labs#416
    • With this, we also added a way to include auxiliary, non-field element data in composite types
    • Added VerificationKey, which is a Struct with auxiliary data, to pass verification keys to a @method
    • BREAKING CHANGE: Change names related to circuit types: AsFieldsAndAux<T> -> Provable<T>, AsFieldElement<T> -> ProvablePure<T>, circuitValue -> provable
    • BREAKING CHANGE: Change all ofFields and ofBits methods on circuit types to fromFields and fromBits
  • New option proofsEnabled for LocalBlockchain (default value: true), to quickly test transaction logic with proofs disabled o1-labs#462
    • with proofsEnabled: true, proofs now get verified locally o1-labs#423
  • SmartContract.approve() to approve a tree of child account updates o1-labs#428 o1-labs#534
    • AccountUpdates are now valid @method arguments, and approve() is intended to be used on them when passed to a method
    • Also replaces Experimental.accountUpdateFromCallback()
  • Circuit.log() to easily log Fields and other provable types inside a method, with the same API as console.log() o1-labs#484
  • SmartContract.init() is a new method on the base SmartContract that will be called only during the first deploy (not if you re-deploy later to upgrade the contract) o1-labs#543
    • Overriding init() is the new recommended way to add custom state initialization logic.
  • transaction.toPretty() and accountUpdate.toPretty() for debugging transactions by printing only the pieces that differ from default account updates o1-labs#428
  • AccountUpdate.attachToTransaction() for explicitly adding an account update to the current transaction. This replaces some previous behaviour where an account update got attached implicitly o1-labs#484
  • SmartContract.requireSignature() and AccountUpdate.requireSignature() as a simpler, better-named replacement for .sign() o1-labs#558

Changed

  • BREAKING CHANGE: tx.send() is now asynchronous: old: send(): TransactionId new: send(): Promise<TransactionId> and tx.send() now directly waits for the network response, as opposed to tx.send().wait() o1-labs#423
  • Sending transactions to LocalBlockchain now involves
  • Circuit.witness can now be called outside circuits, where it will just directly return the callback result o1-labs#484
  • The FeePayerSpec, which is used to specify properties of the transaction via Mina.transaction(), now has another optional parameter to specify the nonce manually. Mina.transaction({ feePayerKey: feePayer, nonce: 1 }, () => {}) o1-labs#497
  • BREAKING CHANGE: Static methods of type .fromString(), .fromNumber() and .fromBigInt() on Field, UInt64, UInt32 and Int64 are no longer supported o1-labs#519
    • use Field(number | string | bigint) and UInt64.from(number | string | bigint)
  • Move several features out of 'experimental' o1-labs#555
    • Reducer replaces Experimental.Reducer
    • MerkleTree and MerkleWitness replace Experimental.{MerkleTree,MerkleWitness}
    • In a SmartContract, this.token replaces this.experimental.token

Deprecated

  • CircuitValue deprecated in favor of Struct o1-labs#416
  • Static props Field.zero, Field.one, Field.minusOne deprecated in favor of Field(number) o1-labs#524
  • SmartContract.sign() and AccountUpdate.sign() in favor of .requireSignature() o1-labs#558

Fixed

  • Uint comparisons and division fixed inside the prover o1-labs#503
  • Callback arguments are properly passed into method invocations o1-labs#516
  • Removed internal type JSONValue from public interfaces o1-labs#536
  • Returning values from a zkApp o1-labs#461

Fixed

  • Callback arguments are properly passed into method invocations o1-labs#516

Fixed

Added

  • reducer.getActions partially implemented for local testing o1-labs#327
  • gte and assertGte methods on UInt32, UInt64 o1-labs#349
  • Return sent transaction hash for RemoteBlockchain o1-labs#399

Changed

  • BREAKING CHANGE: Rename the Party class to AccountUpdate. Also, rename other occurrences of "party" to "account update". o1-labs#393
  • BREAKING CHANGE: Don't require the account address as input to SmartContract.compile(), SmartContract.digest() and SmartContract.analyzeMethods() o1-labs#406
    • This works because the address / public key is now a variable in the method circuit; it used to be a constant
  • BREAKING CHANGE: Move ZkProgram to Experimental.ZkProgram

Fixed

Fixed

  • Infinite loop when compiling in web version o1-labs#379, by @maht0rz

Fixed

  • Crash of the web version introduced in 0.5.0
  • Issue with Experimental.MerkleWitness o1-labs#368

Fixed

Added

  • Recursive proofs. RFC: o1-labs#89, PRs: o1-labs#245 o1-labs#250 o1-labs#261
    • Enable smart contract methods to take previous proofs as arguments, and verify them in the circuit
    • Add ZkProgram, a new primitive which represents a collection of circuits that produce instances of the same proof. So, it's a more general version of SmartContract, without any of the Mina-related API.
      ZkProgram is suitable for rollup-type systems and offchain usage of Pickles + Kimchi.
  • zkApp composability -- calling other zkApps from inside zkApps. RFC: o1-labs#303, PRs: o1-labs#285, o1-labs#296, o1-labs#294, o1-labs#297
  • Events support via SmartContract.events, this.emitEvent. RFC: o1-labs#248, PR: o1-labs#272
    • fetchEvents partially implemented for local testing: o1-labs#323
  • Payments: this.send({ to, amount }) as an easier API for sending Mina from smart contracts o1-labs#325
    • Party.send() to transfer Mina between any accounts, for example, from users to smart contracts
  • SmartContract.digest() to quickly compute a hash of the contract's circuit. This is used by the zkApp CLI to figure out whether compile should be re-run or a cached verification key can be used. o1-labs#268
  • Circuit.constraintSystem() for creating a circuit from a function, counting the number of constraints and computing a digest of the circuit o1-labs#279
  • this.account.isNew to assert that an account did not (or did) exist before the transaction MinaProtocol/mina#11524
  • LocalBlockchain.setTimestamp and other setters for network state, to test network preconditions locally o1-labs#329
  • Experimental APIs are now collected under the Experimental import, or on this.experimental in a smart contract.
  • Custom tokens (experimental), via this.token. RFC: o1-labs#233, PR: o1-labs#273,
  • Actions / sequence events support (experimental), via Experimental.Reducer. RFC: o1-labs#265, PR: o1-labs#274
  • Merkle tree implementation (experimental) via Experimental.MerkleTree o1-labs#343

Changed

  • BREAKING CHANGE: Make on-chain state consistent with other preconditions - throw an error when state is not explicitly constrained o1-labs#267
  • CircuitValue improvements o1-labs#269, o1-labs#306, o1-labs#341
    • Added a base constructor, so overriding the constructor on classes that extend CircuitValue is now optional. When overriding, the base constructor can be called without arguments, as previously: super(). When not overriding, the expected arguments are all the @props on the class, in the order they were defined in: new MyCircuitValue(prop1, prop2).
    • CircuitValue.fromObject({ prop1, prop2 }) is a new, better-typed alternative for using the base constructor.
    • Fixed: the overridden constructor is now free to have any argument structure -- previously, arguments had to be the props in their declared order. I.e., the behaviour that's now used by the base constructor used to be forced on all constructors, which is no longer the case.
  • Mina.transaction improvements
    • Support zkApp proofs when there are other account updates in the same transaction block o1-labs#280
    • Support multiple independent zkApp proofs in one transaction block o1-labs#296
  • Add previously unimplemented preconditions, like this.network.timestamp o1-labs#324 MinaProtocol/mina#11577
  • Improve error messages thrown from Wasm, by making Rust's panic log to the JS console MinaProtocol/mina#11644
  • Not user-facing, but essential: Smart contracts fully constrain the account updates they create, inside the circuit o1-labs#278

Fixed

Added

  • Implement the precondition RFC:
    • new fields this.account and this.network on both SmartContract and Party
    • this.<account|network>.<property>.get() to use on-chain values in a circuit, e.g. account balance or block height
    • this.<account|network>.<property>.{assertEqual, assertBetween, assertNothing}() to constrain what values to allow for these
  • CircuitString, a snark-compatible string type with methods like .append() o1-labs#155
  • bool.assertTrue(), bool.assertFalse() as convenient aliases for existing functionality
  • Ledger.verifyPartyProof which can check if a proof on a transaction is valid o1-labs#208
  • Memo field in APIs like Mina.transaction to attach arbitrary messages o1-labs#244
  • This changelog

Changed

Removed

  • Unused functions call and callUnproved, which were embryonic versions of what is now the transaction API to call smart contract methods
  • Some unimplemented fields on SmartContract

Fixed