feat: truncate SHA hashes inside circuits#5160
Conversation
Changes to circuit sizes
🧾 Summary (100% most significant diffs)
Full diff report 👇
|
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.
Tree insertion statsThe duration to insert a fixed batch of leaves into each tree type.
MiscellaneousTransaction sizes based on how many contract classes are registered in the tx.
Transaction processing duration by data writes.
|
LeilaWang
left a comment
There was a problem hiding this comment.
Just some small things and questions. Looks good overall 😃
| // Computes the messages hash from the leaves array | ||
| // | ||
| // Returns the hash split into two field elements | ||
| // TODO(Miranda): should this be merged with a generic version of accumulate_sha256? (The logic is largely the same) |
There was a problem hiding this comment.
I had a go at this, but found the gas cost would increase quite a lot in replicating for calculating the inHash. Basically, l1toL2Msgs are stored in bytes32 in solidity so replicating the accumulate nr hash requires truncating each one manually over a loop, then concatenating and hashing.
Unfortunately, to avoid casting issues, I've already changed other hashes (like the txEffectHash) to be bytes31 so this creates a discrepancy. Perhaps in another PR I have two choices:
- force all sha hashes that are touched in nr to be bytes31 (requires a lot of changes in ts/sol and possibly higher gas)
- revert the hashes that I have cast to bytes31, and prepend/drop a byte where required in solidity (probably messier code)
I think both are valid choices, so would appreciate a pointer!
There was a problem hiding this comment.
We have decided to go for 32 bytes everywhere, however we would require two generics in accumulate_sha256 - one for the number of input fields and one for 32 * that number. Unfortunately Noir doesn't realise 32*N can be known at compile time, so I would need another generic or some constant, which wouldn't make sense.
I did notice though that this function (compute_messages_hash) now appears to be unused, so perhaps this is not a problem anymore?
| reader.readArray(NUM_FIELDS_PER_SHA256, Fr) as [Fr, Fr], | ||
| reader.readArray(NUM_FIELDS_PER_SHA256, Fr) as [Fr, Fr], | ||
| reader.readArray(NUM_FIELDS_PER_SHA256, Fr) as [Fr], | ||
| reader.readArray(NUM_FIELDS_PER_SHA256, Fr) as [Fr], |
There was a problem hiding this comment.
Can probably drop the as [Fr]s?
There was a problem hiding this comment.
Doable but as it will touch a lot of files, I will do this in a future PR if that's ok!
| * @return The hash of the provided data as a field element | ||
| */ | ||
| function sha256ToField32(bytes memory _data) internal pure returns (bytes32) { | ||
| return bytes32(bytes.concat(new bytes(1), bytes31(sha256(_data)))); |
There was a problem hiding this comment.
In integrating the truncated SHA into this PR, I discovered a discrepancy in byte casting between Solidity and Noir/ts.
e.g. say normal sha256 gives a result of 0x2e7ff14389eef3dc51597529149e01b49cb33829f7089438c8c145c8f352c17b.
In Solidity the cleanest way it seems to drop a byte is bytes31(thing). Turning it back into a bytes32 for checks and structs gives:
0x2e7ff14389eef3dc51597529149e01b49cb33829f7089438c8c145c8f352c100.
However, both toBuffer() in ts and to_be_bytes() in Noir would give:
0x002e7ff14389eef3dc51597529149e01b49cb33829f7089438c8c145c8f352c1
The solidity version fails in-field checks since it still fills the most significant bytes, so I went for the Noir/TS version wherever checks are needed. That's why in some places sha256ToField32 is used, and in others sha256ToField (which returns bytes31).
I also changed logs hashes to be treated as bytes31 wherever possible to avoid any issues with casting. The above fixes are a bit janky so I'm happy for any feedback on them.
…es#5160) Will close #2019 This PR converts SHA hashing inside noir circuits from outputting 2 128-bit fields to outputting 1 248-bit field. To fit inside the field, we truncate one byte. --- ### Noir Changes The constant `NUM_FIELDS_PER_SHA256` is now 1, so any hardcoded test values and function returns have been changed to use an array of one. I've kept it as an array rather than a single `Fr` to minimise changes across the repo and ensure if we want to revert `NUM_FIELDS_PER_SHA256` in future, it won't be so painful. However, we can also just use a single `Fr` if that's preferable. `TX_EFFECTS_HASH_LOG_FIELDS` Methods: - `field_from_bytes_32_trunc`: Converts a 32 byte array to a 31 byte field element (useful for comparisons with new `sha256_to_field`), tests in `types/src/utils/field.nr`. - `sha256_to_field`: Uses the same method as the previous version to convert the sha result (BE) bytes array to field, but leaves out the final byte. - `accumulate_sha256`: Used almost exclusively for enc/unenc logs hashing - takes in 2 31 byte field elements, assumed to be outputs of a previous sha hash, pads to 32 bytes and hashes them with `sha256_to_field` as a 64 byte array. Note that as before, other circuits that use sha (like tx effects hash and messages hash) do not use this method and instead create a flat byte array, then call `sha256_to_field`. --- ### L1 Contract Changes To match the Noir method, the `sha256ToField` function now truncates a byte and prepends a blank byte. Not prepending the blank byte means changing many struct fields from `bytes32` to `bytes31`. This (IIRC) is the same gas cost and creates more awkward encoding, so I kept the length with a blank byte. This also changes the slither file, as I removed some of the old encoding which flagged with new encoding... which also flags. ~Only the 'leaves' used in computing the `txsHash` in `TxsDecoder` and logs hashes have been changed to 31 bytes to match the Noir SHA accumulation (since we are repeating hashes of hashes).~ ~The TS code (see below) does pack the Header struct with 31 bytes per SHA, so we must shift the decoding in HeaderLib` by 3 bytes.~ As of 21.3, there have been a lot of changes in master to the way the txs effect hash (formerly calldata hash/txs hash) is calculated. Plus, now we actually recalculate the in/outHash (i.e. the root of the sha tree of messages) in the contract, so I have reverted to using 32 bytes everywhere with a prepended blank byte. --- ### TS Changes All `.hash()` methods which are also computed in the circuit have been changed to match the Noir code. In most places this just means truncating a byte with `.subarray(0, 31)` on the buffer. ~The `ContentCommitment` serialise/deserialise methods have been modified, as keeping `NUM_BYTES_PER_SHA256 = 32` caused a lot of issues in the background. Changing it to 31 to match Noir does mean slightly different encoding, but many fewer changes across the repo (and hopefully less confusion).~ As of 21.3, due to changes in master, it's now cleaner to keep `NUM_BYTES_PER_SHA256 = 32` and be sure to truncate and pad all SHA hashes which touch the Noir circuits. Since I've kept the hash output as an array of one in Noir, there are many tuples of one in ts (for the above reasoning) - this can be changed if preferable. Methods: - `toTruncField`: Mirrors Noir's `field_from_bytes_32_trunc` to convert to a field element - used in place of old method `to2Fields` (tested in `free_funcs.test.ts`). - `fromTruncField`: Converts the above back to a 31 byte buffer (tested as above). ---
Will close #2019 This PR converts SHA hashing inside noir circuits from outputting 2 128-bit fields to outputting 1 248-bit field. To fit inside the field, we truncate one byte. --- ### Noir Changes The constant `NUM_FIELDS_PER_SHA256` is now 1, so any hardcoded test values and function returns have been changed to use an array of one. I've kept it as an array rather than a single `Fr` to minimise changes across the repo and ensure if we want to revert `NUM_FIELDS_PER_SHA256` in future, it won't be so painful. However, we can also just use a single `Fr` if that's preferable. `TX_EFFECTS_HASH_LOG_FIELDS` Methods: - `field_from_bytes_32_trunc`: Converts a 32 byte array to a 31 byte field element (useful for comparisons with new `sha256_to_field`), tests in `types/src/utils/field.nr`. - `sha256_to_field`: Uses the same method as the previous version to convert the sha result (BE) bytes array to field, but leaves out the final byte. - `accumulate_sha256`: Used almost exclusively for enc/unenc logs hashing - takes in 2 31 byte field elements, assumed to be outputs of a previous sha hash, pads to 32 bytes and hashes them with `sha256_to_field` as a 64 byte array. Note that as before, other circuits that use sha (like tx effects hash and messages hash) do not use this method and instead create a flat byte array, then call `sha256_to_field`. --- ### L1 Contract Changes To match the Noir method, the `sha256ToField` function now truncates a byte and prepends a blank byte. Not prepending the blank byte means changing many struct fields from `bytes32` to `bytes31`. This (IIRC) is the same gas cost and creates more awkward encoding, so I kept the length with a blank byte. This also changes the slither file, as I removed some of the old encoding which flagged with new encoding... which also flags. ~Only the 'leaves' used in computing the `txsHash` in `TxsDecoder` and logs hashes have been changed to 31 bytes to match the Noir SHA accumulation (since we are repeating hashes of hashes).~ ~The TS code (see below) does pack the Header struct with 31 bytes per SHA, so we must shift the decoding in HeaderLib` by 3 bytes.~ As of 21.3, there have been a lot of changes in master to the way the txs effect hash (formerly calldata hash/txs hash) is calculated. Plus, now we actually recalculate the in/outHash (i.e. the root of the sha tree of messages) in the contract, so I have reverted to using 32 bytes everywhere with a prepended blank byte. --- ### TS Changes All `.hash()` methods which are also computed in the circuit have been changed to match the Noir code. In most places this just means truncating a byte with `.subarray(0, 31)` on the buffer. ~The `ContentCommitment` serialise/deserialise methods have been modified, as keeping `NUM_BYTES_PER_SHA256 = 32` caused a lot of issues in the background. Changing it to 31 to match Noir does mean slightly different encoding, but many fewer changes across the repo (and hopefully less confusion).~ As of 21.3, due to changes in master, it's now cleaner to keep `NUM_BYTES_PER_SHA256 = 32` and be sure to truncate and pad all SHA hashes which touch the Noir circuits. Since I've kept the hash output as an array of one in Noir, there are many tuples of one in ts (for the above reasoning) - this can be changed if preferable. Methods: - `toTruncField`: Mirrors Noir's `field_from_bytes_32_trunc` to convert to a field element - used in place of old method `to2Fields` (tested in `free_funcs.test.ts`). - `fromTruncField`: Converts the above back to a 31 byte buffer (tested as above). ---
Continuation of #5160 This PR removes all reference to NUM_FIELDS_PER_SHA256, as we are truncating SHAs to 31 bytes inside the circuits/contracts, so they can be represented as a single field. It also tidies up `toTruncField(sha256(thing))` using a new TS method `sha256ToField`. `toTruncField` now never actually truncates the number, as it expects a truncated output from `sha256ToField` or directly from Noir, which should solve any issues with tests where test values weren't getting truncated correctly. --------- Co-authored-by: sklppy88 <esau@aztecprotocol.com> Co-authored-by: esau <152162806+sklppy88@users.noreply.github.com>
🤖 I have created a release *beep* *boop* --- <details><summary>aztec-package: 0.31.0</summary> ## [0.31.0](aztec-package-v0.30.1...aztec-package-v0.31.0) (2024-03-26) ### Features * Add batched signerless contract calls ([#5313](#5313)) ([be60eb3](be60eb3)) * Dynamic proving ([#5346](#5346)) ([6a7ccca](6a7ccca)) * Less earthly runners + e2e GA runners, bb bench ([#5356](#5356)) ([2136a66](2136a66)) </details> <details><summary>barretenberg.js: 0.31.0</summary> ## [0.31.0](barretenberg.js-v0.30.1...barretenberg.js-v0.31.0) (2024-03-26) ### Features * Earthly bb tests + arm + satellites ([#5268](#5268)) ([eca12b3](eca12b3)) * Less earthly runners + e2e GA runners, bb bench ([#5356](#5356)) ([2136a66](2136a66)) * Simplified bb Honk interface ([#5319](#5319)) ([a2d138f](a2d138f)) </details> <details><summary>aztec-cli: 0.31.0</summary> ## [0.31.0](aztec-cli-v0.30.1...aztec-cli-v0.31.0) (2024-03-26) ### Features * Capture broadcasted functions in node ([#5353](#5353)) ([bc05db2](bc05db2)) ### Bug Fixes * **cli:** Support initializers not named constructor in cli ([#5397](#5397)) ([85f14c5](85f14c5)) </details> <details><summary>aztec-packages: 0.31.0</summary> ## [0.31.0](aztec-packages-v0.30.1...aztec-packages-v0.31.0) (2024-03-26) ### ⚠ BREAKING CHANGES * **avm:** per function avm run ([#5421](#5421)) * rename storage inclusion proof to historical storage read ([#5379](#5379)) * plug-in new outbox and update examples to use api to fetch inclusion proofs #4769 ([#5292](#5292)) * Mark transactions as reverted on L1 ([#5226](#5226)) ### Features * Add batched signerless contract calls ([#5313](#5313)) ([be60eb3](be60eb3)) * Add specific error for attempting `string[x] = ".."` (noir-lang/noir#4611) ([13a12d5](13a12d5)) * **AuthWit:** Chain_id and version in hash ([#5331](#5331)) ([5235c95](5235c95)) * **Authwit:** Lookup the validity of authwits ([#5316](#5316)) ([7c24870](7c24870)) * Avm lookup and/or/xor ([#5338](#5338)) ([489bc2c](489bc2c)) * **avm:** Add AvmContextInputs ([#5396](#5396)) ([12e2844](12e2844)) * **avm:** Per function avm run ([#5421](#5421)) ([f024751](f024751)) * **avm:** Track gas usage in AVM simulator ([#5438](#5438)) ([4884d83](4884d83)) * Capture broadcasted functions in node ([#5353](#5353)) ([bc05db2](bc05db2)) * Dynamic proving ([#5346](#5346)) ([6a7ccca](6a7ccca)) * Earthly bb tests + arm + satellites ([#5268](#5268)) ([eca12b3](eca12b3)) * Fix awkward snippet indention in docs ([#5367](#5367)) ([c55d3da](c55d3da)) * Fold proving key polys instead of prover polys ([#5436](#5436)) ([239ebfb](239ebfb)) * Implement serdes for u64 [#4990](#4990) ([#5411](#5411)) ([5a6bcef](5a6bcef)) * Introduce max_block_number ([#5251](#5251)) ([6573173](6573173)) * Less earthly runners + e2e GA runners, bb bench ([#5356](#5356)) ([2136a66](2136a66)) * Mark transactions as reverted on L1 ([#5226](#5226)) ([40ecc02](40ecc02)) * Plug-in new outbox and update examples to use api to fetch inclusion proofs [#4769](#4769) ([#5292](#5292)) ([fec1008](fec1008)) * Read_calldata ([#5409](#5409)) ([034fbf0](034fbf0)) * Remove NUM_FIELDS_PER_SHA256 ([#5392](#5392)) ([86a181b](86a181b)) * Rename storage inclusion proof to historical storage read ([#5379](#5379)) ([b6e7216](b6e7216)) * Returning non-nullified messages only ([#5390](#5390)) ([4c671be](4c671be)) * Simplified bb Honk interface ([#5319](#5319)) ([a2d138f](a2d138f)) * Simplify offsets and sizing using new block structure ([#5404](#5404)) ([efa0842](efa0842)) * Throw by default when awaiting a tx that reverted ([#5431](#5431)) ([c9113ec](c9113ec)) * Truncate SHA hashes inside circuits ([#5160](#5160)) ([9dc0d2a](9dc0d2a)) * Unified CircuitChecker interface ([#5343](#5343)) ([13cef1f](13cef1f)) * ZeroMorph working with IPA and integration with ECCVM ([#5246](#5246)) ([c4dce94](c4dce94)) ### Bug Fixes * Addressing flakiness of `uniswap_trade_on_l1_from_l2.test.ts` ([#5443](#5443)) ([2db9cad](2db9cad)) * **avm-simulator:** Hashing opcodes indirection ([#5376](#5376)) ([a4b1ebc](a4b1ebc)) * Broadcasting unconstrained function with empty sibling ([#5429](#5429)) ([933145e](933145e)) * **ci:** Disable uniswap test in earthly build ([#5344](#5344)) ([0d69162](0d69162)) * **cli:** Support initializers not named constructor in cli ([#5397](#5397)) ([85f14c5](85f14c5)) * Copy and deploy complete contents of l1-contracts ([#5447](#5447)) ([501c5e9](501c5e9)) * Don't cancel protocol-circuits-gate-diff in master ([#5441](#5441)) ([6894a78](6894a78)) * E2e_static_calls.test.ts bad merge ([#5405](#5405)) ([4c56536](4c56536)) * Generate noir interface for constructors ([#5352](#5352)) ([8434d2f](8434d2f)) * Limit earthly to few users ([#5375](#5375)) ([71e8ab4](71e8ab4)) * Login to dockerhub before 'docker compose' ([#5440](#5440)) ([4f7696b](4f7696b)) * Revert cbind breakage ([#5348](#5348)) ([c237193](c237193)) * **ssa:** Use accurate type during SSA AsSlice simplficiation (noir-lang/noir#4610) ([13a12d5](13a12d5)) * Track class registered count in tx stats ([#5417](#5417)) ([ff8eafc](ff8eafc)) * Watch command should not spawn more than one tsc watch ([#5391](#5391)) ([25caf4d](25caf4d)) ### Miscellaneous * Always use serialize function to get hash preimage in noir circuits or when comparing structs etc [#3595](#3595) ([#5439](#5439)) ([22e0f0d](22e0f0d)) * **aztec-nr:** Unify contexts behind interfaces ([#5294](#5294)) ([36e0f59](36e0f59)) * **bb:** Removed powers of eta in lookup and auxiliary relations ([#4695](#4695)) ([f4e62ae](f4e62ae)) * CamelCase in noir-projects -> snake_case ([#5381](#5381)) ([eea711f](eea711f)) * **ci:** Create a dedicated job for the AVM unit tests ([#5369](#5369)) ([59ca2ac](59ca2ac)), closes [#5366](#5366) * Clean out prover instance and remove instance from oink ([#5314](#5314)) ([a83368c](a83368c)) * Cleaning up messaging types ([#5442](#5442)) ([dfffe5d](dfffe5d)), closes [#5420](#5420) * Compute registerer address on the fly ([#5394](#5394)) ([5d669b9](5d669b9)) * Delete slither output from version control ([#5393](#5393)) ([41107e3](41107e3)) * Fix migration notes ([#5452](#5452)) ([8c4e576](8c4e576)) * **github:** Improve PR template "document later" checkbox description (noir-lang/noir#4625) ([13a12d5](13a12d5)) * Make get_notes fail if returning no notes [#4988](#4988) ([#5320](#5320)) ([be86ed3](be86ed3)) * Meld flavor and and circuit builder modules ([#5406](#5406)) ([f0d9d1b](f0d9d1b)) * Messaging naming fixes ([#5383](#5383)) ([0226102](0226102)) * Moving public inputs back to instance ([#5315](#5315)) ([9cbe368](9cbe368)) * Name change: gen perm sort to delta range constraint ([#5378](#5378)) ([841855f](841855f)) * Nuking l1 to l2 messages from block body ([#5272](#5272)) ([ee176d2](ee176d2)), closes [#5072](#5072) * Reduce size of revert code from Field to u8 ([#5309](#5309)) ([1868e25](1868e25)) * Remove mocking function in `EccOpQueue` again ([#5413](#5413)) ([6fb4a75](6fb4a75)) * Remove snapshots from protocol-contracts ([#5342](#5342)) ([31ca344](31ca344)) * Remove unused FunctionLeafPreimage struct ([#5354](#5354)) ([dc51c2b](dc51c2b)) * Rename reverted to revertCode ([#5301](#5301)) ([950a96d](950a96d)) * Replace relative paths to noir-protocol-circuits ([262ae02](262ae02)) * Replace relative paths to noir-protocol-circuits ([91a60db](91a60db)) * Replace relative paths to noir-protocol-circuits ([9fc9fbd](9fc9fbd)) * Replace relative paths to noir-protocol-circuits ([9939e99](9939e99)) * Replace relative paths to noir-protocol-circuits ([0b24aae](0b24aae)) * Replace relative paths to noir-protocol-circuits ([c4d89d5](c4d89d5)) * Reverting accidental changes ([#5371](#5371)) ([c1484ce](c1484ce)) * Skip foundry install if possible ([#5398](#5398)) ([060fa1e](060fa1e)) * Skip slither in docker ([#5384](#5384)) ([8a76068](8a76068)) * Update docs with function names to match version 0.25.0 specifications (noir-lang/noir#4466) ([13a12d5](13a12d5)) * Update integers.md to note support for Fields using `from_integer` (noir-lang/noir#4536) ([13a12d5](13a12d5)) * Update min compiler version of contracts ([#5305](#5305)) ([dcf6bb3](dcf6bb3)) * Use random tmp directory and cleanup afterwards ([#5368](#5368)) ([5c0e15d](5c0e15d)) ### Documentation * Update versions-updating.md ([#5358](#5358)) ([0f09b63](0f09b63)) </details> <details><summary>barretenberg: 0.31.0</summary> ## [0.31.0](barretenberg-v0.30.1...barretenberg-v0.31.0) (2024-03-26) ### Features * Avm lookup and/or/xor ([#5338](#5338)) ([489bc2c](489bc2c)) * Earthly bb tests + arm + satellites ([#5268](#5268)) ([eca12b3](eca12b3)) * Fold proving key polys instead of prover polys ([#5436](#5436)) ([239ebfb](239ebfb)) * Less earthly runners + e2e GA runners, bb bench ([#5356](#5356)) ([2136a66](2136a66)) * Read_calldata ([#5409](#5409)) ([034fbf0](034fbf0)) * Simplified bb Honk interface ([#5319](#5319)) ([a2d138f](a2d138f)) * Simplify offsets and sizing using new block structure ([#5404](#5404)) ([efa0842](efa0842)) * Unified CircuitChecker interface ([#5343](#5343)) ([13cef1f](13cef1f)) * ZeroMorph working with IPA and integration with ECCVM ([#5246](#5246)) ([c4dce94](c4dce94)) ### Bug Fixes * Revert cbind breakage ([#5348](#5348)) ([c237193](c237193)) ### Miscellaneous * **bb:** Removed powers of eta in lookup and auxiliary relations ([#4695](#4695)) ([f4e62ae](f4e62ae)) * **ci:** Create a dedicated job for the AVM unit tests ([#5369](#5369)) ([59ca2ac](59ca2ac)), closes [#5366](#5366) * Clean out prover instance and remove instance from oink ([#5314](#5314)) ([a83368c](a83368c)) * Meld flavor and and circuit builder modules ([#5406](#5406)) ([f0d9d1b](f0d9d1b)) * Moving public inputs back to instance ([#5315](#5315)) ([9cbe368](9cbe368)) * Name change: gen perm sort to delta range constraint ([#5378](#5378)) ([841855f](841855f)) * Remove mocking function in `EccOpQueue` again ([#5413](#5413)) ([6fb4a75](6fb4a75)) </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-package: 0.31.0</summary> ## [0.31.0](AztecProtocol/aztec-packages@aztec-package-v0.30.1...aztec-package-v0.31.0) (2024-03-26) ### Features * Add batched signerless contract calls ([#5313](AztecProtocol/aztec-packages#5313)) ([be60eb3](AztecProtocol/aztec-packages@be60eb3)) * Dynamic proving ([#5346](AztecProtocol/aztec-packages#5346)) ([6a7ccca](AztecProtocol/aztec-packages@6a7ccca)) * Less earthly runners + e2e GA runners, bb bench ([#5356](AztecProtocol/aztec-packages#5356)) ([2136a66](AztecProtocol/aztec-packages@2136a66)) </details> <details><summary>barretenberg.js: 0.31.0</summary> ## [0.31.0](AztecProtocol/aztec-packages@barretenberg.js-v0.30.1...barretenberg.js-v0.31.0) (2024-03-26) ### Features * Earthly bb tests + arm + satellites ([#5268](AztecProtocol/aztec-packages#5268)) ([eca12b3](AztecProtocol/aztec-packages@eca12b3)) * Less earthly runners + e2e GA runners, bb bench ([#5356](AztecProtocol/aztec-packages#5356)) ([2136a66](AztecProtocol/aztec-packages@2136a66)) * Simplified bb Honk interface ([#5319](AztecProtocol/aztec-packages#5319)) ([a2d138f](AztecProtocol/aztec-packages@a2d138f)) </details> <details><summary>aztec-cli: 0.31.0</summary> ## [0.31.0](AztecProtocol/aztec-packages@aztec-cli-v0.30.1...aztec-cli-v0.31.0) (2024-03-26) ### Features * Capture broadcasted functions in node ([#5353](AztecProtocol/aztec-packages#5353)) ([bc05db2](AztecProtocol/aztec-packages@bc05db2)) ### Bug Fixes * **cli:** Support initializers not named constructor in cli ([#5397](AztecProtocol/aztec-packages#5397)) ([85f14c5](AztecProtocol/aztec-packages@85f14c5)) </details> <details><summary>aztec-packages: 0.31.0</summary> ## [0.31.0](AztecProtocol/aztec-packages@aztec-packages-v0.30.1...aztec-packages-v0.31.0) (2024-03-26) ### ⚠ BREAKING CHANGES * **avm:** per function avm run ([#5421](AztecProtocol/aztec-packages#5421)) * rename storage inclusion proof to historical storage read ([#5379](AztecProtocol/aztec-packages#5379)) * plug-in new outbox and update examples to use api to fetch inclusion proofs #4769 ([#5292](AztecProtocol/aztec-packages#5292)) * Mark transactions as reverted on L1 ([#5226](AztecProtocol/aztec-packages#5226)) ### Features * Add batched signerless contract calls ([#5313](AztecProtocol/aztec-packages#5313)) ([be60eb3](AztecProtocol/aztec-packages@be60eb3)) * Add specific error for attempting `string[x] = ".."` (noir-lang/noir#4611) ([13a12d5](AztecProtocol/aztec-packages@13a12d5)) * **AuthWit:** Chain_id and version in hash ([#5331](AztecProtocol/aztec-packages#5331)) ([5235c95](AztecProtocol/aztec-packages@5235c95)) * **Authwit:** Lookup the validity of authwits ([#5316](AztecProtocol/aztec-packages#5316)) ([7c24870](AztecProtocol/aztec-packages@7c24870)) * Avm lookup and/or/xor ([#5338](AztecProtocol/aztec-packages#5338)) ([489bc2c](AztecProtocol/aztec-packages@489bc2c)) * **avm:** Add AvmContextInputs ([#5396](AztecProtocol/aztec-packages#5396)) ([12e2844](AztecProtocol/aztec-packages@12e2844)) * **avm:** Per function avm run ([#5421](AztecProtocol/aztec-packages#5421)) ([f024751](AztecProtocol/aztec-packages@f024751)) * **avm:** Track gas usage in AVM simulator ([#5438](AztecProtocol/aztec-packages#5438)) ([4884d83](AztecProtocol/aztec-packages@4884d83)) * Capture broadcasted functions in node ([#5353](AztecProtocol/aztec-packages#5353)) ([bc05db2](AztecProtocol/aztec-packages@bc05db2)) * Dynamic proving ([#5346](AztecProtocol/aztec-packages#5346)) ([6a7ccca](AztecProtocol/aztec-packages@6a7ccca)) * Earthly bb tests + arm + satellites ([#5268](AztecProtocol/aztec-packages#5268)) ([eca12b3](AztecProtocol/aztec-packages@eca12b3)) * Fix awkward snippet indention in docs ([#5367](AztecProtocol/aztec-packages#5367)) ([c55d3da](AztecProtocol/aztec-packages@c55d3da)) * Fold proving key polys instead of prover polys ([#5436](AztecProtocol/aztec-packages#5436)) ([239ebfb](AztecProtocol/aztec-packages@239ebfb)) * Implement serdes for u64 [#4990](AztecProtocol/aztec-packages#4990) ([#5411](AztecProtocol/aztec-packages#5411)) ([5a6bcef](AztecProtocol/aztec-packages@5a6bcef)) * Introduce max_block_number ([#5251](AztecProtocol/aztec-packages#5251)) ([6573173](AztecProtocol/aztec-packages@6573173)) * Less earthly runners + e2e GA runners, bb bench ([#5356](AztecProtocol/aztec-packages#5356)) ([2136a66](AztecProtocol/aztec-packages@2136a66)) * Mark transactions as reverted on L1 ([#5226](AztecProtocol/aztec-packages#5226)) ([40ecc02](AztecProtocol/aztec-packages@40ecc02)) * Plug-in new outbox and update examples to use api to fetch inclusion proofs [#4769](AztecProtocol/aztec-packages#4769) ([#5292](AztecProtocol/aztec-packages#5292)) ([fec1008](AztecProtocol/aztec-packages@fec1008)) * Read_calldata ([#5409](AztecProtocol/aztec-packages#5409)) ([034fbf0](AztecProtocol/aztec-packages@034fbf0)) * Remove NUM_FIELDS_PER_SHA256 ([#5392](AztecProtocol/aztec-packages#5392)) ([86a181b](AztecProtocol/aztec-packages@86a181b)) * Rename storage inclusion proof to historical storage read ([#5379](AztecProtocol/aztec-packages#5379)) ([b6e7216](AztecProtocol/aztec-packages@b6e7216)) * Returning non-nullified messages only ([#5390](AztecProtocol/aztec-packages#5390)) ([4c671be](AztecProtocol/aztec-packages@4c671be)) * Simplified bb Honk interface ([#5319](AztecProtocol/aztec-packages#5319)) ([a2d138f](AztecProtocol/aztec-packages@a2d138f)) * Simplify offsets and sizing using new block structure ([#5404](AztecProtocol/aztec-packages#5404)) ([efa0842](AztecProtocol/aztec-packages@efa0842)) * Throw by default when awaiting a tx that reverted ([#5431](AztecProtocol/aztec-packages#5431)) ([c9113ec](AztecProtocol/aztec-packages@c9113ec)) * Truncate SHA hashes inside circuits ([#5160](AztecProtocol/aztec-packages#5160)) ([9dc0d2a](AztecProtocol/aztec-packages@9dc0d2a)) * Unified CircuitChecker interface ([#5343](AztecProtocol/aztec-packages#5343)) ([13cef1f](AztecProtocol/aztec-packages@13cef1f)) * ZeroMorph working with IPA and integration with ECCVM ([#5246](AztecProtocol/aztec-packages#5246)) ([c4dce94](AztecProtocol/aztec-packages@c4dce94)) ### Bug Fixes * Addressing flakiness of `uniswap_trade_on_l1_from_l2.test.ts` ([#5443](AztecProtocol/aztec-packages#5443)) ([2db9cad](AztecProtocol/aztec-packages@2db9cad)) * **avm-simulator:** Hashing opcodes indirection ([#5376](AztecProtocol/aztec-packages#5376)) ([a4b1ebc](AztecProtocol/aztec-packages@a4b1ebc)) * Broadcasting unconstrained function with empty sibling ([#5429](AztecProtocol/aztec-packages#5429)) ([933145e](AztecProtocol/aztec-packages@933145e)) * **ci:** Disable uniswap test in earthly build ([#5344](AztecProtocol/aztec-packages#5344)) ([0d69162](AztecProtocol/aztec-packages@0d69162)) * **cli:** Support initializers not named constructor in cli ([#5397](AztecProtocol/aztec-packages#5397)) ([85f14c5](AztecProtocol/aztec-packages@85f14c5)) * Copy and deploy complete contents of l1-contracts ([#5447](AztecProtocol/aztec-packages#5447)) ([501c5e9](AztecProtocol/aztec-packages@501c5e9)) * Don't cancel protocol-circuits-gate-diff in master ([#5441](AztecProtocol/aztec-packages#5441)) ([6894a78](AztecProtocol/aztec-packages@6894a78)) * E2e_static_calls.test.ts bad merge ([#5405](AztecProtocol/aztec-packages#5405)) ([4c56536](AztecProtocol/aztec-packages@4c56536)) * Generate noir interface for constructors ([#5352](AztecProtocol/aztec-packages#5352)) ([8434d2f](AztecProtocol/aztec-packages@8434d2f)) * Limit earthly to few users ([#5375](AztecProtocol/aztec-packages#5375)) ([71e8ab4](AztecProtocol/aztec-packages@71e8ab4)) * Login to dockerhub before 'docker compose' ([#5440](AztecProtocol/aztec-packages#5440)) ([4f7696b](AztecProtocol/aztec-packages@4f7696b)) * Revert cbind breakage ([#5348](AztecProtocol/aztec-packages#5348)) ([c237193](AztecProtocol/aztec-packages@c237193)) * **ssa:** Use accurate type during SSA AsSlice simplficiation (noir-lang/noir#4610) ([13a12d5](AztecProtocol/aztec-packages@13a12d5)) * Track class registered count in tx stats ([#5417](AztecProtocol/aztec-packages#5417)) ([ff8eafc](AztecProtocol/aztec-packages@ff8eafc)) * Watch command should not spawn more than one tsc watch ([#5391](AztecProtocol/aztec-packages#5391)) ([25caf4d](AztecProtocol/aztec-packages@25caf4d)) ### Miscellaneous * Always use serialize function to get hash preimage in noir circuits or when comparing structs etc [#3595](AztecProtocol/aztec-packages#3595) ([#5439](AztecProtocol/aztec-packages#5439)) ([22e0f0d](AztecProtocol/aztec-packages@22e0f0d)) * **aztec-nr:** Unify contexts behind interfaces ([#5294](AztecProtocol/aztec-packages#5294)) ([36e0f59](AztecProtocol/aztec-packages@36e0f59)) * **bb:** Removed powers of eta in lookup and auxiliary relations ([#4695](AztecProtocol/aztec-packages#4695)) ([f4e62ae](AztecProtocol/aztec-packages@f4e62ae)) * CamelCase in noir-projects -> snake_case ([#5381](AztecProtocol/aztec-packages#5381)) ([eea711f](AztecProtocol/aztec-packages@eea711f)) * **ci:** Create a dedicated job for the AVM unit tests ([#5369](AztecProtocol/aztec-packages#5369)) ([59ca2ac](AztecProtocol/aztec-packages@59ca2ac)), closes [#5366](AztecProtocol/aztec-packages#5366) * Clean out prover instance and remove instance from oink ([#5314](AztecProtocol/aztec-packages#5314)) ([a83368c](AztecProtocol/aztec-packages@a83368c)) * Cleaning up messaging types ([#5442](AztecProtocol/aztec-packages#5442)) ([dfffe5d](AztecProtocol/aztec-packages@dfffe5d)), closes [#5420](AztecProtocol/aztec-packages#5420) * Compute registerer address on the fly ([#5394](AztecProtocol/aztec-packages#5394)) ([5d669b9](AztecProtocol/aztec-packages@5d669b9)) * Delete slither output from version control ([#5393](AztecProtocol/aztec-packages#5393)) ([41107e3](AztecProtocol/aztec-packages@41107e3)) * Fix migration notes ([#5452](AztecProtocol/aztec-packages#5452)) ([8c4e576](AztecProtocol/aztec-packages@8c4e576)) * **github:** Improve PR template "document later" checkbox description (noir-lang/noir#4625) ([13a12d5](AztecProtocol/aztec-packages@13a12d5)) * Make get_notes fail if returning no notes [#4988](AztecProtocol/aztec-packages#4988) ([#5320](AztecProtocol/aztec-packages#5320)) ([be86ed3](AztecProtocol/aztec-packages@be86ed3)) * Meld flavor and and circuit builder modules ([#5406](AztecProtocol/aztec-packages#5406)) ([f0d9d1b](AztecProtocol/aztec-packages@f0d9d1b)) * Messaging naming fixes ([#5383](AztecProtocol/aztec-packages#5383)) ([0226102](AztecProtocol/aztec-packages@0226102)) * Moving public inputs back to instance ([#5315](AztecProtocol/aztec-packages#5315)) ([9cbe368](AztecProtocol/aztec-packages@9cbe368)) * Name change: gen perm sort to delta range constraint ([#5378](AztecProtocol/aztec-packages#5378)) ([841855f](AztecProtocol/aztec-packages@841855f)) * Nuking l1 to l2 messages from block body ([#5272](AztecProtocol/aztec-packages#5272)) ([ee176d2](AztecProtocol/aztec-packages@ee176d2)), closes [#5072](AztecProtocol/aztec-packages#5072) * Reduce size of revert code from Field to u8 ([#5309](AztecProtocol/aztec-packages#5309)) ([1868e25](AztecProtocol/aztec-packages@1868e25)) * Remove mocking function in `EccOpQueue` again ([#5413](AztecProtocol/aztec-packages#5413)) ([6fb4a75](AztecProtocol/aztec-packages@6fb4a75)) * Remove snapshots from protocol-contracts ([#5342](AztecProtocol/aztec-packages#5342)) ([31ca344](AztecProtocol/aztec-packages@31ca344)) * Remove unused FunctionLeafPreimage struct ([#5354](AztecProtocol/aztec-packages#5354)) ([dc51c2b](AztecProtocol/aztec-packages@dc51c2b)) * Rename reverted to revertCode ([#5301](AztecProtocol/aztec-packages#5301)) ([950a96d](AztecProtocol/aztec-packages@950a96d)) * Replace relative paths to noir-protocol-circuits ([262ae02](AztecProtocol/aztec-packages@262ae02)) * Replace relative paths to noir-protocol-circuits ([91a60db](AztecProtocol/aztec-packages@91a60db)) * Replace relative paths to noir-protocol-circuits ([9fc9fbd](AztecProtocol/aztec-packages@9fc9fbd)) * Replace relative paths to noir-protocol-circuits ([9939e99](AztecProtocol/aztec-packages@9939e99)) * Replace relative paths to noir-protocol-circuits ([0b24aae](AztecProtocol/aztec-packages@0b24aae)) * Replace relative paths to noir-protocol-circuits ([c4d89d5](AztecProtocol/aztec-packages@c4d89d5)) * Reverting accidental changes ([#5371](AztecProtocol/aztec-packages#5371)) ([c1484ce](AztecProtocol/aztec-packages@c1484ce)) * Skip foundry install if possible ([#5398](AztecProtocol/aztec-packages#5398)) ([060fa1e](AztecProtocol/aztec-packages@060fa1e)) * Skip slither in docker ([#5384](AztecProtocol/aztec-packages#5384)) ([8a76068](AztecProtocol/aztec-packages@8a76068)) * Update docs with function names to match version 0.25.0 specifications (noir-lang/noir#4466) ([13a12d5](AztecProtocol/aztec-packages@13a12d5)) * Update integers.md to note support for Fields using `from_integer` (noir-lang/noir#4536) ([13a12d5](AztecProtocol/aztec-packages@13a12d5)) * Update min compiler version of contracts ([#5305](AztecProtocol/aztec-packages#5305)) ([dcf6bb3](AztecProtocol/aztec-packages@dcf6bb3)) * Use random tmp directory and cleanup afterwards ([#5368](AztecProtocol/aztec-packages#5368)) ([5c0e15d](AztecProtocol/aztec-packages@5c0e15d)) ### Documentation * Update versions-updating.md ([#5358](AztecProtocol/aztec-packages#5358)) ([0f09b63](AztecProtocol/aztec-packages@0f09b63)) </details> <details><summary>barretenberg: 0.31.0</summary> ## [0.31.0](AztecProtocol/aztec-packages@barretenberg-v0.30.1...barretenberg-v0.31.0) (2024-03-26) ### Features * Avm lookup and/or/xor ([#5338](AztecProtocol/aztec-packages#5338)) ([489bc2c](AztecProtocol/aztec-packages@489bc2c)) * Earthly bb tests + arm + satellites ([#5268](AztecProtocol/aztec-packages#5268)) ([eca12b3](AztecProtocol/aztec-packages@eca12b3)) * Fold proving key polys instead of prover polys ([#5436](AztecProtocol/aztec-packages#5436)) ([239ebfb](AztecProtocol/aztec-packages@239ebfb)) * Less earthly runners + e2e GA runners, bb bench ([#5356](AztecProtocol/aztec-packages#5356)) ([2136a66](AztecProtocol/aztec-packages@2136a66)) * Read_calldata ([#5409](AztecProtocol/aztec-packages#5409)) ([034fbf0](AztecProtocol/aztec-packages@034fbf0)) * Simplified bb Honk interface ([#5319](AztecProtocol/aztec-packages#5319)) ([a2d138f](AztecProtocol/aztec-packages@a2d138f)) * Simplify offsets and sizing using new block structure ([#5404](AztecProtocol/aztec-packages#5404)) ([efa0842](AztecProtocol/aztec-packages@efa0842)) * Unified CircuitChecker interface ([#5343](AztecProtocol/aztec-packages#5343)) ([13cef1f](AztecProtocol/aztec-packages@13cef1f)) * ZeroMorph working with IPA and integration with ECCVM ([#5246](AztecProtocol/aztec-packages#5246)) ([c4dce94](AztecProtocol/aztec-packages@c4dce94)) ### Bug Fixes * Revert cbind breakage ([#5348](AztecProtocol/aztec-packages#5348)) ([c237193](AztecProtocol/aztec-packages@c237193)) ### Miscellaneous * **bb:** Removed powers of eta in lookup and auxiliary relations ([#4695](AztecProtocol/aztec-packages#4695)) ([f4e62ae](AztecProtocol/aztec-packages@f4e62ae)) * **ci:** Create a dedicated job for the AVM unit tests ([#5369](AztecProtocol/aztec-packages#5369)) ([59ca2ac](AztecProtocol/aztec-packages@59ca2ac)), closes [#5366](AztecProtocol/aztec-packages#5366) * Clean out prover instance and remove instance from oink ([#5314](AztecProtocol/aztec-packages#5314)) ([a83368c](AztecProtocol/aztec-packages@a83368c)) * Meld flavor and and circuit builder modules ([#5406](AztecProtocol/aztec-packages#5406)) ([f0d9d1b](AztecProtocol/aztec-packages@f0d9d1b)) * Moving public inputs back to instance ([#5315](AztecProtocol/aztec-packages#5315)) ([9cbe368](AztecProtocol/aztec-packages@9cbe368)) * Name change: gen perm sort to delta range constraint ([#5378](AztecProtocol/aztec-packages#5378)) ([841855f](AztecProtocol/aztec-packages@841855f)) * Remove mocking function in `EccOpQueue` again ([#5413](AztecProtocol/aztec-packages#5413)) ([6fb4a75](AztecProtocol/aztec-packages@6fb4a75)) </details> --- This PR was generated with [Release Please](https://github.com/googleapis/release-please). See [documentation](https://github.com/googleapis/release-please#release-please).
Will close #2019
This PR converts SHA hashing inside noir circuits from outputting 2 128-bit fields to outputting 1 248-bit field. To fit inside the field, we truncate one byte.
Noir Changes
The constant
NUM_FIELDS_PER_SHA256is now 1, so any hardcoded test values and function returns have been changed to use an array of one. I've kept it as an array rather than a singleFrto minimise changes across the repo and ensure if we want to revertNUM_FIELDS_PER_SHA256in future, it won't be so painful. However, we can also just use a singleFrif that's preferable.TX_EFFECTS_HASH_LOG_FIELDSMethods:
field_from_bytes_32_trunc: Converts a 32 byte array to a 31 byte field element (useful for comparisons with newsha256_to_field), tests intypes/src/utils/field.nr.sha256_to_field: Uses the same method as the previous version to convert the sha result (BE) bytes array to field, but leaves out the final byte.accumulate_sha256: Used almost exclusively for enc/unenc logs hashing - takes in 2 31 byte field elements, assumed to be outputs of a previous sha hash, pads to 32 bytes and hashes them withsha256_to_fieldas a 64 byte array. Note that as before, other circuits that use sha (like tx effects hash and messages hash) do not use this method and instead create a flat byte array, then callsha256_to_field.L1 Contract Changes
To match the Noir method, the
sha256ToFieldfunction now truncates a byte and prepends a blank byte. Not prepending the blank byte means changing many struct fields frombytes32tobytes31. This (IIRC) is the same gas cost and creates more awkward encoding, so I kept the length with a blank byte. This also changes the slither file, as I removed some of the old encoding which flagged with new encoding... which also flags.Only the 'leaves' used in computing thetxsHashinTxsDecoderand logs hashes have been changed to 31 bytes to match the Noir SHA accumulation (since we are repeating hashes of hashes).The TS code (see below) does pack the Header struct with 31 bytes per SHA, so we must shift the decoding in HeaderLib` by 3 bytes.As of 21.3, there have been a lot of changes in master to the way the txs effect hash (formerly calldata hash/txs hash) is calculated. Plus, now we actually recalculate the in/outHash (i.e. the root of the sha tree of messages) in the contract, so I have reverted to using 32 bytes everywhere with a prepended blank byte.
TS Changes
All
.hash()methods which are also computed in the circuit have been changed to match the Noir code. In most places this just means truncating a byte with.subarray(0, 31)on the buffer.TheContentCommitmentserialise/deserialise methods have been modified, as keepingNUM_BYTES_PER_SHA256 = 32caused a lot of issues in the background. Changing it to 31 to match Noir does mean slightly different encoding, but many fewer changes across the repo (and hopefully less confusion).As of 21.3, due to changes in master, it's now cleaner to keep
NUM_BYTES_PER_SHA256 = 32and be sure to truncate and pad all SHA hashes which touch the Noir circuits.Since I've kept the hash output as an array of one in Noir, there are many tuples of one in ts (for the above reasoning) - this can be changed if preferable.
Methods:
toTruncField: Mirrors Noir'sfield_from_bytes_32_truncto convert to a field element - used in place of old methodto2Fields(tested infree_funcs.test.ts).fromTruncField: Converts the above back to a 31 byte buffer (tested as above).