Skip to content
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

chore: Compute function tree root in ts. #3326

Merged
merged 5 commits into from
Nov 18, 2023

Conversation

charlielye
Copy link
Contributor

@charlielye charlielye commented Nov 16, 2023

One step closer to not needing circuits.wasm.

  • This creates a new class MerkleTreeRootCalculator. It wouldn't have had to exist except for the fact that the zero leaf of the function tree is the hash of a zeroed function leaf (5 fields) rather than just a 0 buffer. Kinda annoying. Needed?
  • I tried putting the class in the merkle-tree package, but worryingly that created a circular dependency because everything depends on this generic "types" catch all package, and it depends on circuits... Seems sus. For now the class sits next to where it's used in abis.
  • When performing a naive tree hash, this actually beats the wasm performance by around 5%. Perhaps due to the wasm always computing the zero leaf. Assuming that's the reason, the performance is equal despite overhead of calling into wasm (so we can assume such overheads are negligible).
  • The algorithm performs much better than the wasm version however, when the tree is not full, as it leverages zero layer caches to not have to hash the entire tree. The test adds 4 leaves to a 16 leaf tree, and as expected is 4 times faster.

Just for clarity, this still uses wasm, but it uses bb.js wasm and at a lower level. Just calling pedersenHash.

@charlielye charlielye requested a review from ludamad November 16, 2023 17:40
@AztecBot
Copy link
Collaborator

AztecBot commented Nov 16, 2023

Benchmark results

Metrics with a significant change:

  • circuit_simulation_time_in_ms (public-kernel-private-input): 40.9 (-93%)
  • circuit_simulation_time_in_ms (public-kernel-non-first-iteration): 25.8 (-94%)
  • l2_block_building_time_in_ms (8): 13,239 (-36%)
  • l2_block_building_time_in_ms (32): 52,686 (-35%)
  • l2_block_building_time_in_ms (128): 209,515 (-36%)
  • l2_block_public_tx_process_time_in_ms (8): 1,304 (-85%)
  • l2_block_public_tx_process_time_in_ms (32): 5,160 (-85%)
  • l2_block_public_tx_process_time_in_ms (128): 20,536 (-85%)
Detailed results

All benchmarks are run on txs on the Benchmarking contract on the repository. Each tx consists of a batch call to create_note and increment_balance, which guarantees that each tx has a private call, a nested private call, a public call, and a nested public call, as well as an emitted private note, an unencrypted log, and public storage read and write.

This benchmark source data is available in JSON format on S3 here.

Values are compared against data from master at commit 15a522ba and shown if the difference exceeds 1%.

L2 block published to L1

Each column represents the number of txs on an L2 block published to L1.

Metric 8 txs 32 txs 128 txs
l1_rollup_calldata_size_in_bytes 45,444 179,588 716,132
l1_rollup_calldata_gas 223,008 868,160 3,449,432
l1_rollup_execution_gas 842,095 3,595,268 22,204,801
l2_block_processing_time_in_ms 1,981 (-1%) 7,744 (+2%) 30,001 (-1%)
note_successful_decrypting_time_in_ms 296 (+2%) 870 3,158 (-3%)
note_trial_decrypting_time_in_ms 98.8 (+6%) 78.5 (+4%) 133 (-1%)
l2_block_building_time_in_ms ⚠️ 13,239 (-36%) ⚠️ 52,686 (-35%) ⚠️ 209,515 (-36%)
l2_block_rollup_simulation_time_in_ms 11,895 (-2%) 47,393 188,487
l2_block_public_tx_process_time_in_ms ⚠️ 1,304 (-85%) ⚠️ 5,160 (-85%) ⚠️ 20,536 (-85%)

L2 chain processing

Each column represents the number of blocks on the L2 chain where each block has 16 txs.

Metric 5 blocks 10 blocks
node_history_sync_time_in_ms 21,719 (-2%) 42,454 (-1%)
note_history_successful_decrypting_time_in_ms 2,035 (-2%) 3,954 (-3%)
note_history_trial_decrypting_time_in_ms 122 (+1%) 144
node_database_size_in_bytes 1,631,322 1,099,541
pxe_database_size_in_bytes 29,748 59,307

Circuits stats

Stats on running time and I/O sizes collected for every circuit run across all benchmarks.

Circuit circuit_simulation_time_in_ms circuit_input_size_in_bytes circuit_output_size_in_bytes
private-kernel-init 763 (-1%) 61,697 18,905
private-kernel-ordering 125 (-1%) 24,297 8,153
base-rollup 1,765 (-1%) 656,311 814 (-7%)
root-rollup 172 (+2%) 4,072 1,097
private-kernel-inner 787 (-1%) 81,568 18,905
public-kernel-private-input ⚠️ 40.9 (-93%) 41,519 18,841
public-kernel-non-first-iteration ⚠️ 25.8 (-94%) 41,497 18,841
merge-rollup 15.1 (-1%) 2,592 873

Miscellaneous

Transaction sizes based on how many contracts are deployed in the tx.

Metric 0 deployed contracts 1 deployed contracts
tx_size_in_bytes 8,787 27,547

Copy link
Collaborator

@ludamad ludamad left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

@charlielye charlielye merged commit 48d8c7f into master Nov 18, 2023
@charlielye charlielye deleted the cl/compute_function_tree_root_in_ts branch November 18, 2023 09:59
rahul-kothari pushed a commit that referenced this pull request Nov 21, 2023
🤖 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).
AztecBot added a commit to AztecProtocol/barretenberg that referenced this pull request Nov 23, 2023
🤖 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).
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
Archived in project
Development

Successfully merging this pull request may close these issues.

3 participants