New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
feat: Slow updates experimentation #2732
Conversation
c040203
to
6335662
Compare
0b8aae4
to
8a9f09f
Compare
Benchmark resultsMetrics with a significant change:
Detailed resultsAll benchmarks are run on txs on the This benchmark source data is available in JSON format on S3 here. Values are compared against data from master at commit L2 block published to L1Each column represents the number of txs on an L2 block published to L1.
L2 chain processingEach column represents the number of blocks on the L2 chain where each block has 16 txs.
Circuits statsStats on running time and I/O sizes collected for every circuit run across all benchmarks.
MiscellaneousTransaction sizes based on how many contracts are deployed in the tx.
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Looks good, but would not merge until the slow updates tree e2e is reliably passing and enabled in CI.
yarn-project/noir-contracts/src/contracts/slow_tree_contract/src/main.nr
Outdated
Show resolved
Hide resolved
); | ||
} | ||
|
||
unconstrained fn un_read_leaf_at(address: Field, key: Field) -> Leaf { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
why "un"? because currently anyone can read any key?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I also don't understand. @LHerskind ser, please enlighten us
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Because unconstrained
🤷
|
||
const db = levelup(createMemDown()); | ||
const depth = 254; | ||
const tree = await newTree(SparseTree, db, hasher, 'test', depth); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
const tree = await newTree(SparseTree, db, hasher, 'test', depth); | |
// a simulator to help keep track of the state of the expected tree and generate sibling paths | |
const tree = await newTree(SparseTree, db, hasher, 'test', depth); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@LHerskind renaming it to treeSimulator or something would really improve readability.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Damn naming. Holding me back 😆
.wait(); | ||
await tree.updateLeaf(new Fr(4).toBuffer(), key); | ||
|
||
await status(key); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
should this require any expects?
yarn-project/noir-contracts/src/contracts/slow_tree_contract/src/main.nr
Outdated
Show resolved
Hide resolved
5537285
to
9acfac9
Compare
Experimental, very much in progress. Fixes #2852, building on top of #2732. For the experimentation here needed a name for my "data-stack" as it could practically hold whatever you want to throw at it. Was listening to https://www.youtube.com/watch?v=DTrNwbemNK0 while building so its the pez dispenser. The PEZ dispenser is essentially a stack managed by the PXE that hold `mint`s (PEZ Dispenser = "PfeffErminZ"/peppermint dispenser). A `mint` is `Fr[]` which can hold whatever data really, here just used to feed membership proofs and update proofs into the slow updates map.
Experimental, very much in progress. Fixes #2852, building on top of #2732. For the experimentation here needed a name for my "data-stack" as it could practically hold whatever you want to throw at it. Was listening to https://www.youtube.com/watch?v=DTrNwbemNK0 while building so its the pez dispenser. The PEZ dispenser is essentially a stack managed by the PXE that hold `mint`s (PEZ Dispenser = "PfeffErminZ"/peppermint dispenser). A `mint` is `Fr[]` which can hold whatever data really, here just used to feed membership proofs and update proofs into the slow updates map.
09c13d6
to
f07c219
Compare
Experimental, very much in progress. Fixes #2852, building on top of #2732. For the experimentation here needed a name for my "data-stack" as it could practically hold whatever you want to throw at it. Was listening to https://www.youtube.com/watch?v=DTrNwbemNK0 while building so its the pez dispenser. The PEZ dispenser is essentially a stack managed by the PXE that hold `mint`s (PEZ Dispenser = "PfeffErminZ"/peppermint dispenser). A `mint` is `Fr[]` which can hold whatever data really, here just used to feed membership proofs and update proofs into the slow updates map.
1c206cd
to
bc2fd1f
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Great job getting this to work. My brain almost melted when reviewing this.
Will approve once the naming and maybe the slow tree test gets improved.
|
||
const db = levelup(createMemDown()); | ||
const depth = 254; | ||
const tree = await newTree(SparseTree, db, hasher, 'test', depth); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@LHerskind renaming it to treeSimulator or something would really improve readability.
@@ -20,6 +20,7 @@ export class MemoryDB extends MemoryContractDatabase implements Database { | |||
private globalVariablesHash: Fr | undefined; | |||
private addresses: CompleteAddress[] = []; | |||
private authWitnesses: Record<string, Fr[]> = {}; | |||
private pezDispenser: Fr[][] = []; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I know it's a way more boring name but simply calling this a slow tree stack or just slow stack and explain what it does here would be quite helpful readability-wise 😆
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
+1
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Damn. You guys are killing me 😭.
@@ -53,6 +53,12 @@ export class Oracle { | |||
return witness.map(toACVMField); | |||
} | |||
|
|||
async popMint(): Promise<ACVMField[]> { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Super boring but calling it popSlow and adding a comment here that it pops value of slow tree stack stored in PXE would be helpful.
|
||
afterAll(() => teardown()); | ||
|
||
it('Messing around with noir slow tree', async () => { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This currently contains only one assert/expect on error. Could we test more stuff here or do you think the blacklist token is enough?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The reads and writes will throw if invalid, but I can create some more.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Cannot perform any of the reads as unconstrained since the return values are dependent on the global variables which are not populated for unconstrained as I recall (might have been changed).
Can add some unconstrained and do the computations manually but it is not really showing as nicely that the value is as expected 🤷.
// This contract allow us to "read" public storage in private through a delayed tree. | ||
// More documentation need to be outlined for this properly, but there is some in | ||
// https://github.com/AztecProtocol/aztec-packages/pull/2732/files | ||
// This is made as a separate contract for one thing mainly. Making it a simpler to use. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
// This is made as a separate contract for one thing mainly. Making it a simpler to use. | |
// This is made as a separate contract for one thing mainly. Making it simpler to use. |
amount: Field, | ||
nonce: Field, | ||
) -> Field { | ||
let slow = SlowMap::at(AztecAddress::new(storage.slow_update.get_note().value)); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think it would be clearer if the interface was called SlowTree given that it is calling the slow tree contract. It confused me for a bit when I instinctively navigated to read_at functionality in SlowMap struct and I was confused why public context was used there (given that bellow it's calling a private func).
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Ah, got it. Ye it might be a little odd here since it is practically calling the slow tree contract to look up at a specific slow map, but doing a lot of the checks for you.
Will change it.
this.notesTable.push(note); | ||
return Promise.resolve(); | ||
} | ||
|
||
public addMint(mint: Fr[]): Promise<void> { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Maybe pushSlow?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I'd go for pushToSlowUpdatesTree()
to make it easy for external devs
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
That only makes sense it was only used for the slow updates tree. But you can use it for other stuff, e.g., @benesjan considering using for historic access etc.
@rahul-kothari it is used for both reads and updates atm, so that would be more confusing I think.
return Promise.resolve(); | ||
} | ||
|
||
public popMint(): Promise<Fr[] | undefined> { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
And popSlow?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Referring to above.
@@ -42,6 +42,12 @@ export interface PXE { | |||
*/ | |||
addAuthWitness(authWitness: AuthWitness): Promise<void>; | |||
|
|||
/** | |||
* Adding a mint to the pez dispenser. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Consider using the full form of PEZ - external folks look at it as docs
Also as @benesjan highlighted, add/popMint() could be changed to addTo/popFromSlowUpdatesTree()?
Not sure if mint
is the right term here as well
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Will look at the name, but it will probably not include slow updates reference since it is to be used for other stuff as well. It is just a generic blob.
this.notesTable.push(note); | ||
return Promise.resolve(); | ||
} | ||
|
||
public addMint(mint: Fr[]): Promise<void> { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I'd go for pushToSlowUpdatesTree()
to make it easy for external devs
@@ -20,6 +20,7 @@ export class MemoryDB extends MemoryContractDatabase implements Database { | |||
private globalVariablesHash: Fr | undefined; | |||
private addresses: CompleteAddress[] = []; | |||
private authWitnesses: Record<string, Fr[]> = {}; | |||
private pezDispenser: Fr[][] = []; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
+1
* Get the next mint from the pez dispenser. | ||
* @returns A promise that resolves to an array of field elements representing the mint. | ||
*/ | ||
popMint(): Promise<Fr[] | undefined>; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
do we want to throw or just return undefined?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Return undefined, similar to getCompleteAddress
it will throw separately if undefined is actually returned because it don't match what you expect in the contract.
[package] | ||
name = "slow_updates_tree" | ||
authors = ["aztec-labs"] | ||
compiler_version = "0.1" |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
compiler version is enforced now. Maybe do >=0.18.0
use crate::types::token_note::{TokenNote, TOKEN_NOTE_LEN, TokenNoteMethods}; | ||
|
||
// A set implementing standard manipulation of balances. | ||
// Does not require spending key, but only knowledge. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
but only knowledge of what?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Of the notes that are in the set.
// This will call the the `compute_nullifer` function of the `token_note` | ||
// which require knowledge of the secret key (currently the users encryption key). | ||
// The contract logic must ensure that the spending key is used as well. | ||
// docs:start:remove |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
we can remove docs references from this file since it is a copy passte
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Easier would be if we could import contract dirs and not only libraries, then it could just be imported 👀 @kevaundray
@@ -0,0 +1,501 @@ | |||
// docs:start:token_all |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
probably can remove these doc references
mod types; | ||
mod interfaces; | ||
|
||
// Minimal token implementation that supports `AuthWit` accounts. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
replace this with the slow updates tree stuff
|
||
|
||
// TODO's: @LHerskind | ||
// We are currently unable to do constructor -> private calls |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
reference the issue you created
Experimental, very much in progress. Fixes #2852, building on top of #2732. For the experimentation here needed a name for my "data-stack" as it could practically hold whatever you want to throw at it. Was listening to https://www.youtube.com/watch?v=DTrNwbemNK0 while building so its the pez dispenser. The PEZ dispenser is essentially a stack managed by the PXE that hold `mint`s (PEZ Dispenser = "PfeffErminZ"/peppermint dispenser). A `mint` is `Fr[]` which can hold whatever data really, here just used to feed membership proofs and update proofs into the slow updates map.
1e8a52c
to
8173996
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM! Just a few tsdocs improvements
|
||
/** | ||
* Gets some notes for a contract address and storage slot. | ||
* Returns a flattened array containing real-note-count and note preimages. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
* Returns a flattened array containing real-note-count and note preimages. | |
* Returns a flattened array containing filtered notes. |
Why the "real-note-count"? It just returns an array of notes.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Think that have come from a merge at some point 🤔 I don't recall every adding real-note-count
addCapsule(capsule: Fr[]): Promise<void>; | ||
|
||
/** | ||
* Get the next capsule from the capsule dispenser. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
* Get the next capsule from the capsule dispenser. | |
* Get the next capsule from the capsule dispenser. | |
* @remarks A capsule is a "blob" of data that is passed to the contract through an oracle. |
@@ -24,6 +24,18 @@ export interface Database extends ContractDatabase { | |||
*/ | |||
getAuthWitness(messageHash: Fr): Promise<Fr[]>; | |||
|
|||
/** | |||
* Adding a capsule to the capsule dispenser. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
* Adding a capsule to the capsule dispenser. | |
* Adding a capsule to the capsule dispenser. | |
* @remarks A capsule is a "blob" of data that is passed to the contract through an oracle. |
Everybody would be searching what a capsule is.
@@ -42,6 +42,12 @@ export interface PXE { | |||
*/ | |||
addAuthWitness(authWitness: AuthWitness): Promise<void>; | |||
|
|||
/** | |||
* Adding a capsule to the capsule dispenser. | |||
* @param capsule - An array of field elements representing the capsule. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
* @param capsule - An array of field elements representing the capsule. | |
* @param capsule - An array of field elements representing the capsule. | |
* @remarks A capsule is a "blob" of data that is passed to the contract through an oracle. |
@@ -35,6 +35,12 @@ export interface DBOracle extends CommitmentsDB { | |||
*/ | |||
getAuthWitness(messageHash: Fr): Promise<Fr[]>; | |||
|
|||
/** | |||
* Retrieve a capsule from the capsule dispenser. | |||
* @returns A promise that resolves to an array of field elements representing the capsule. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
* @returns A promise that resolves to an array of field elements representing the capsule. | |
* @returns A promise that resolves to an array of field elements representing the capsule. | |
* @remarks A capsule is a "blob" of data that is passed to the contract through an oracle. |
@@ -57,7 +57,16 @@ export class ViewDataOracle extends TypedOracle { | |||
} | |||
|
|||
/** | |||
* Gets some notes for a storage slot. | |||
* Pops a capsule from the capsule dispenser | |||
* @returns The capsule values |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
* @returns The capsule values | |
* @returns The capsule values | |
* @remarks A capsule is a "blob" of data that is passed to the contract through an oracle. |
@@ -42,6 +42,12 @@ export interface PXE { | |||
*/ | |||
addAuthWitness(authWitness: AuthWitness): Promise<void>; | |||
|
|||
/** | |||
* Adding a capsule to the capsule dispenser. | |||
* @param capsule - An array of field elements representing the capsule. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
* @param capsule - An array of field elements representing the capsule. | |
* @param capsule - An array of field elements representing the capsule. | |
* @remarks A capsule is a "blob" of data that is passed to the contract through an oracle. |
#[oracle(popCapsule)] | ||
fn pop_capsule_oracle<N>() -> [Field; N] {} | ||
|
||
unconstrained pub fn pop_capsule<N>() -> [Field; N] { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
unconstrained pub fn pop_capsule<N>() -> [Field; N] { | |
// A capsule is a "blob" of data that is passed to the contract through an oracle. | |
unconstrained pub fn pop_capsule<N>() -> [Field; N] { |
|
||
/** | ||
* Gets some notes for a contract address and storage slot. | ||
* Returns a flattened array containing real-note-count and note preimages. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
* Returns a flattened array containing real-note-count and note preimages. | |
* Returns a flattened array containing filtered notes. |
Why the "real-note-count"? It just returns an array of notes.
Experimental, very much in progress. Fixes #2852, building on top of #2732. For the experimentation here needed a name for my "data-stack" as it could practically hold whatever you want to throw at it. Was listening to https://www.youtube.com/watch?v=DTrNwbemNK0 while building so its the pez dispenser. The PEZ dispenser is essentially a stack managed by the PXE that hold `mint`s (PEZ Dispenser = "PfeffErminZ"/peppermint dispenser). A `mint` is `Fr[]` which can hold whatever data really, here just used to feed membership proofs and update proofs into the slow updates map.
2025939
to
e0aea78
Compare
55854be
to
401ab5d
Compare
🤖 I have created a release *beep* *boop* --- <details><summary>aztec-packages: 0.15.1</summary> ## [0.15.1](aztec-packages-v0.15.0...aztec-packages-v0.15.1) (2023-11-21) ### Features * **bb:** Add ability to write pk to file or stdout ([#3335](#3335)) ([c99862c](c99862c)) * DataBus PoC (UltraHonk as extension of Ultra) ([#3181](#3181)) ([dd9dd84](dd9dd84)) * Deploy docs from CCI w/ netlify-cli ([#3348](#3348)) ([624d733](624d733)) * Fold batching challenge (alpha) ([#3291](#3291)) ([bc99a4f](bc99a4f)) * Open transcript polys as univariates in ECCVM ([#3331](#3331)) ([436b22e](436b22e)) * Sandbox packages ([#3360](#3360)) ([0dc2d58](0dc2d58)) * Slow updates experimentation ([#2732](#2732)) ([193e6c8](193e6c8)) * ZM updates for Translator concatenated polys ([#3343](#3343)) ([0e425db](0e425db)) ### Bug Fixes * Bootstrap bbjs. ([#3337](#3337)) ([06aedcb](06aedcb)) * Noir-compiler breadth-first resolver ([#3307](#3307)) ([02348cf](02348cf)) * Update command looks at devDeps ([#3276](#3276)) ([54ee38d](54ee38d)), closes [#3275](#3275) * Updating pedersen benchmarks ([#3211](#3211)) ([7e89ff3](7e89ff3)) * Warn on circular imports. ([#3350](#3350)) ([5bfbddb](5bfbddb)) ### Miscellaneous * All hashes in ts ([#3333](#3333)) ([6307e12](6307e12)) * Compute function tree root in ts. ([#3326](#3326)) ([48d8c7f](48d8c7f)) * **docs:** Suggest CLI install per project ([#3267](#3267)) ([b4c967b](b4c967b)) * Enforce bracing around blocks. Generally considered easier to read and less error prone. ([#3349](#3349)) ([ee11dec](ee11dec)) * Fix circulars in foundation. Also cleanup fields and optimise to be buffer underlying. ([#3351](#3351)) ([c4bf8d3](c4bf8d3)) * Public kernel tests ([#3325](#3325)) ([bace972](bace972)) ### Documentation * Fixed errors in Gas and Fees yellow paper ([#3363](#3363)) ([d818206](d818206)) * Initial network section of yellow paper ([#3341](#3341)) ([5a18615](5a18615)) * Yellow paper section on Gas and Fees ([#3327](#3327)) ([caa7e10](caa7e10)) </details> <details><summary>barretenberg.js: 0.15.1</summary> ## [0.15.1](barretenberg.js-v0.15.0...barretenberg.js-v0.15.1) (2023-11-21) ### Features * **bb:** Add ability to write pk to file or stdout ([#3335](#3335)) ([c99862c](c99862c)) ### Miscellaneous * All hashes in ts ([#3333](#3333)) ([6307e12](6307e12)) </details> <details><summary>barretenberg: 0.15.1</summary> ## [0.15.1](barretenberg-v0.15.0...barretenberg-v0.15.1) (2023-11-21) ### Features * **bb:** Add ability to write pk to file or stdout ([#3335](#3335)) ([c99862c](c99862c)) * DataBus PoC (UltraHonk as extension of Ultra) ([#3181](#3181)) ([dd9dd84](dd9dd84)) * Fold batching challenge (alpha) ([#3291](#3291)) ([bc99a4f](bc99a4f)) * Open transcript polys as univariates in ECCVM ([#3331](#3331)) ([436b22e](436b22e)) * ZM updates for Translator concatenated polys ([#3343](#3343)) ([0e425db](0e425db)) ### Bug Fixes * Bootstrap bbjs. ([#3337](#3337)) ([06aedcb](06aedcb)) * Updating pedersen benchmarks ([#3211](#3211)) ([7e89ff3](7e89ff3)) ### Miscellaneous * All hashes in ts ([#3333](#3333)) ([6307e12](6307e12)) </details> --- This PR was generated with [Release Please](https://github.com/googleapis/release-please). See [documentation](https://github.com/googleapis/release-please#release-please).
🤖 I have created a release *beep* *boop* --- <details><summary>aztec-packages: 0.15.1</summary> ## [0.15.1](AztecProtocol/aztec-packages@aztec-packages-v0.15.0...aztec-packages-v0.15.1) (2023-11-21) ### Features * **bb:** Add ability to write pk to file or stdout ([#3335](AztecProtocol/aztec-packages#3335)) ([c99862c](AztecProtocol/aztec-packages@c99862c)) * DataBus PoC (UltraHonk as extension of Ultra) ([#3181](AztecProtocol/aztec-packages#3181)) ([dd9dd84](AztecProtocol/aztec-packages@dd9dd84)) * Deploy docs from CCI w/ netlify-cli ([#3348](AztecProtocol/aztec-packages#3348)) ([624d733](AztecProtocol/aztec-packages@624d733)) * Fold batching challenge (alpha) ([#3291](AztecProtocol/aztec-packages#3291)) ([bc99a4f](AztecProtocol/aztec-packages@bc99a4f)) * Open transcript polys as univariates in ECCVM ([#3331](AztecProtocol/aztec-packages#3331)) ([436b22e](AztecProtocol/aztec-packages@436b22e)) * Sandbox packages ([#3360](AztecProtocol/aztec-packages#3360)) ([0dc2d58](AztecProtocol/aztec-packages@0dc2d58)) * Slow updates experimentation ([#2732](AztecProtocol/aztec-packages#2732)) ([193e6c8](AztecProtocol/aztec-packages@193e6c8)) * ZM updates for Translator concatenated polys ([#3343](AztecProtocol/aztec-packages#3343)) ([0e425db](AztecProtocol/aztec-packages@0e425db)) ### Bug Fixes * Bootstrap bbjs. ([#3337](AztecProtocol/aztec-packages#3337)) ([06aedcb](AztecProtocol/aztec-packages@06aedcb)) * Noir-compiler breadth-first resolver ([#3307](AztecProtocol/aztec-packages#3307)) ([02348cf](AztecProtocol/aztec-packages@02348cf)) * Update command looks at devDeps ([#3276](AztecProtocol/aztec-packages#3276)) ([54ee38d](AztecProtocol/aztec-packages@54ee38d)), closes [#3275](AztecProtocol/aztec-packages#3275) * Updating pedersen benchmarks ([#3211](AztecProtocol/aztec-packages#3211)) ([7e89ff3](AztecProtocol/aztec-packages@7e89ff3)) * Warn on circular imports. ([#3350](AztecProtocol/aztec-packages#3350)) ([5bfbddb](AztecProtocol/aztec-packages@5bfbddb)) ### Miscellaneous * All hashes in ts ([#3333](AztecProtocol/aztec-packages#3333)) ([6307e12](AztecProtocol/aztec-packages@6307e12)) * Compute function tree root in ts. ([#3326](AztecProtocol/aztec-packages#3326)) ([48d8c7f](AztecProtocol/aztec-packages@48d8c7f)) * **docs:** Suggest CLI install per project ([#3267](AztecProtocol/aztec-packages#3267)) ([b4c967b](AztecProtocol/aztec-packages@b4c967b)) * Enforce bracing around blocks. Generally considered easier to read and less error prone. ([#3349](AztecProtocol/aztec-packages#3349)) ([ee11dec](AztecProtocol/aztec-packages@ee11dec)) * Fix circulars in foundation. Also cleanup fields and optimise to be buffer underlying. ([#3351](AztecProtocol/aztec-packages#3351)) ([c4bf8d3](AztecProtocol/aztec-packages@c4bf8d3)) * Public kernel tests ([#3325](AztecProtocol/aztec-packages#3325)) ([bace972](AztecProtocol/aztec-packages@bace972)) ### Documentation * Fixed errors in Gas and Fees yellow paper ([#3363](AztecProtocol/aztec-packages#3363)) ([d818206](AztecProtocol/aztec-packages@d818206)) * Initial network section of yellow paper ([#3341](AztecProtocol/aztec-packages#3341)) ([5a18615](AztecProtocol/aztec-packages@5a18615)) * Yellow paper section on Gas and Fees ([#3327](AztecProtocol/aztec-packages#3327)) ([caa7e10](AztecProtocol/aztec-packages@caa7e10)) </details> <details><summary>barretenberg.js: 0.15.1</summary> ## [0.15.1](AztecProtocol/aztec-packages@barretenberg.js-v0.15.0...barretenberg.js-v0.15.1) (2023-11-21) ### Features * **bb:** Add ability to write pk to file or stdout ([#3335](AztecProtocol/aztec-packages#3335)) ([c99862c](AztecProtocol/aztec-packages@c99862c)) ### Miscellaneous * All hashes in ts ([#3333](AztecProtocol/aztec-packages#3333)) ([6307e12](AztecProtocol/aztec-packages@6307e12)) </details> <details><summary>barretenberg: 0.15.1</summary> ## [0.15.1](AztecProtocol/aztec-packages@barretenberg-v0.15.0...barretenberg-v0.15.1) (2023-11-21) ### Features * **bb:** Add ability to write pk to file or stdout ([#3335](AztecProtocol/aztec-packages#3335)) ([c99862c](AztecProtocol/aztec-packages@c99862c)) * DataBus PoC (UltraHonk as extension of Ultra) ([#3181](AztecProtocol/aztec-packages#3181)) ([dd9dd84](AztecProtocol/aztec-packages@dd9dd84)) * Fold batching challenge (alpha) ([#3291](AztecProtocol/aztec-packages#3291)) ([bc99a4f](AztecProtocol/aztec-packages@bc99a4f)) * Open transcript polys as univariates in ECCVM ([#3331](AztecProtocol/aztec-packages#3331)) ([436b22e](AztecProtocol/aztec-packages@436b22e)) * ZM updates for Translator concatenated polys ([#3343](AztecProtocol/aztec-packages#3343)) ([0e425db](AztecProtocol/aztec-packages@0e425db)) ### Bug Fixes * Bootstrap bbjs. ([#3337](AztecProtocol/aztec-packages#3337)) ([06aedcb](AztecProtocol/aztec-packages@06aedcb)) * Updating pedersen benchmarks ([#3211](AztecProtocol/aztec-packages#3211)) ([7e89ff3](AztecProtocol/aztec-packages@7e89ff3)) ### Miscellaneous * All hashes in ts ([#3333](AztecProtocol/aztec-packages#3333)) ([6307e12](AztecProtocol/aztec-packages@6307e12)) </details> --- This PR was generated with [Release Please](https://github.com/googleapis/release-please). See [documentation](https://github.com/googleapis/release-please#release-please).
Fixes #2801. (Also fixes #3214)
Experimentation with slow updates in Noir.
From #2878:
For the experimentation here needed a name for my "data-stack" as it could practically hold whatever you want to throw at it. Was listening to https://www.youtube.com/watch?v=DTrNwbemNK0 while building so its the pez dispenser. The PEZ dispenser is essentially a stack managed by the PXE that hold mints (PEZ Dispenser = "PfeffErminZ"/peppermint dispenser). A mint is Fr[] which can hold whatever data really, here just used to feed membership proofs and update proofs into the slow updates map.
Checklist:
Remove the checklist to signal you've completed it. Enable auto-merge if the PR is ready to merge.