@aztec/stdlib 4.0.0-nightly.20260113 → 4.0.0-nightly.20260115
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dest/abi/function_call.d.ts +9 -1
- package/dest/abi/function_call.d.ts.map +1 -1
- package/dest/abi/utils.d.ts +7 -1
- package/dest/abi/utils.d.ts.map +1 -1
- package/dest/abi/utils.js +7 -0
- package/dest/auth_witness/auth_witness.d.ts +2 -1
- package/dest/auth_witness/auth_witness.d.ts.map +1 -1
- package/dest/avm/avm.d.ts +362 -362
- package/dest/avm/avm_accumulated_data.d.ts +30 -3
- package/dest/avm/avm_accumulated_data.d.ts.map +1 -1
- package/dest/avm/avm_circuit_public_inputs.d.ts +9 -9
- package/dest/avm/avm_proving_request.d.ts +299 -299
- package/dest/avm/contract_storage_read.d.ts +13 -1
- package/dest/avm/contract_storage_read.d.ts.map +1 -1
- package/dest/avm/contract_storage_update_request.d.ts +13 -1
- package/dest/avm/contract_storage_update_request.d.ts.map +1 -1
- package/dest/avm/public_call_stack_item_compressed.d.ts +3 -1
- package/dest/avm/public_call_stack_item_compressed.d.ts.map +1 -1
- package/dest/avm/public_data_read.d.ts +10 -1
- package/dest/avm/public_data_read.d.ts.map +1 -1
- package/dest/avm/public_data_update_request.d.ts +10 -1
- package/dest/avm/public_data_update_request.d.ts.map +1 -1
- package/dest/avm/public_data_write.d.ts +7 -1
- package/dest/avm/public_data_write.d.ts.map +1 -1
- package/dest/avm/public_inner_call_request.d.ts +4 -1
- package/dest/avm/public_inner_call_request.d.ts.map +1 -1
- package/dest/avm/revert_code.d.ts +4 -4
- package/dest/avm/revert_code.d.ts.map +1 -1
- package/dest/block/body.d.ts +1 -1
- package/dest/block/body.d.ts.map +1 -1
- package/dest/block/body.js +2 -1
- package/dest/block/checkpointed_l2_block.d.ts +13 -13
- package/dest/block/checkpointed_l2_block.d.ts.map +1 -1
- package/dest/block/checkpointed_l2_block.js +5 -4
- package/dest/block/l2_block.d.ts +8 -4
- package/dest/block/l2_block.d.ts.map +1 -1
- package/dest/block/l2_block.js +4 -3
- package/dest/block/l2_block_code_to_purge.d.ts +1 -1
- package/dest/block/l2_block_code_to_purge.d.ts.map +1 -1
- package/dest/block/l2_block_code_to_purge.js +1 -1
- package/dest/block/l2_block_header.d.ts +14 -2
- package/dest/block/l2_block_header.d.ts.map +1 -1
- package/dest/block/l2_block_header.js +14 -7
- package/dest/block/l2_block_new.d.ts +9 -4
- package/dest/block/l2_block_new.d.ts.map +1 -1
- package/dest/block/l2_block_new.js +2 -2
- package/dest/block/l2_block_source.d.ts +3 -2
- package/dest/block/l2_block_source.d.ts.map +1 -1
- package/dest/block/validate_block_result.d.ts +1 -1
- package/dest/block/validate_block_result.d.ts.map +1 -1
- package/dest/block/validate_block_result.js +5 -4
- package/dest/checkpoint/checkpoint.d.ts +9 -4
- package/dest/checkpoint/checkpoint.d.ts.map +1 -1
- package/dest/checkpoint/checkpoint.js +10 -1
- package/dest/checkpoint/published_checkpoint.d.ts +5 -5
- package/dest/checkpoint/published_checkpoint.d.ts.map +1 -1
- package/dest/checkpoint/published_checkpoint.js +4 -3
- package/dest/contract/complete_address.d.ts +4 -1
- package/dest/contract/complete_address.d.ts.map +1 -1
- package/dest/contract/contract_deployment_data.d.ts +5 -5
- package/dest/contract/index.d.ts +1 -3
- package/dest/contract/index.d.ts.map +1 -1
- package/dest/contract/index.js +0 -2
- package/dest/contract/interfaces/contract_instance.d.ts +16 -16
- package/dest/database-version/version_manager.d.ts +4 -2
- package/dest/database-version/version_manager.d.ts.map +1 -1
- package/dest/deserialization/index.d.ts +11 -0
- package/dest/deserialization/index.d.ts.map +1 -0
- package/dest/deserialization/index.js +10 -0
- package/dest/errors/proving_error.d.ts +2 -2
- package/dest/errors/proving_error.d.ts.map +1 -1
- package/dest/interfaces/aztec-node-admin.d.ts +23 -26
- package/dest/interfaces/aztec-node-admin.d.ts.map +1 -1
- package/dest/interfaces/block-builder.d.ts +2 -2
- package/dest/interfaces/block-builder.d.ts.map +1 -1
- package/dest/interfaces/configs.d.ts +6 -6
- package/dest/interfaces/get_logs_response.d.ts +1 -1
- package/dest/interfaces/proving-job.d.ts +180 -180
- package/dest/interfaces/validator.d.ts +1 -9
- package/dest/interfaces/validator.d.ts.map +1 -1
- package/dest/interfaces/validator.js +0 -1
- package/dest/kernel/hints/key_validation_hint.d.ts +2 -1
- package/dest/kernel/hints/key_validation_hint.d.ts.map +1 -1
- package/dest/kernel/hints/key_validation_request.d.ts +2 -1
- package/dest/kernel/hints/key_validation_request.d.ts.map +1 -1
- package/dest/kernel/hints/key_validation_request_and_generator.d.ts +6 -1
- package/dest/kernel/hints/key_validation_request_and_generator.d.ts.map +1 -1
- package/dest/kernel/hints/private_kernel_reset_hints.d.ts +13 -1
- package/dest/kernel/hints/private_kernel_reset_hints.d.ts.map +1 -1
- package/dest/kernel/hints/read_request.d.ts +7 -1
- package/dest/kernel/hints/read_request.d.ts.map +1 -1
- package/dest/kernel/hints/read_request_hints.d.ts +7 -1
- package/dest/kernel/hints/read_request_hints.d.ts.map +1 -1
- package/dest/kernel/private_accumulated_data.d.ts +23 -1
- package/dest/kernel/private_accumulated_data.d.ts.map +1 -1
- package/dest/kernel/private_call_data.d.ts +25 -1
- package/dest/kernel/private_call_data.d.ts.map +1 -1
- package/dest/kernel/private_call_request.d.ts +16 -1
- package/dest/kernel/private_call_request.d.ts.map +1 -1
- package/dest/kernel/private_circuit_public_inputs.d.ts +74 -1
- package/dest/kernel/private_circuit_public_inputs.d.ts.map +1 -1
- package/dest/kernel/private_kernel_circuit_public_inputs.d.ts +31 -1
- package/dest/kernel/private_kernel_circuit_public_inputs.d.ts.map +1 -1
- package/dest/kernel/private_kernel_data.d.ts +7 -1
- package/dest/kernel/private_kernel_data.d.ts.map +1 -1
- package/dest/kernel/private_kernel_init_circuit_private_inputs.d.ts +22 -1
- package/dest/kernel/private_kernel_init_circuit_private_inputs.d.ts.map +1 -1
- package/dest/kernel/private_kernel_inner_circuit_private_inputs.d.ts +7 -1
- package/dest/kernel/private_kernel_inner_circuit_private_inputs.d.ts.map +1 -1
- package/dest/kernel/private_kernel_reset_circuit_private_inputs.d.ts +4 -1
- package/dest/kernel/private_kernel_reset_circuit_private_inputs.d.ts.map +1 -1
- package/dest/kernel/private_kernel_tail_circuit_private_inputs.d.ts +10 -1
- package/dest/kernel/private_kernel_tail_circuit_private_inputs.d.ts.map +1 -1
- package/dest/kernel/private_kernel_tail_circuit_public_inputs.d.ts +23 -1
- package/dest/kernel/private_kernel_tail_circuit_public_inputs.d.ts.map +1 -1
- package/dest/kernel/private_to_avm_accumulated_data.d.ts +2 -2
- package/dest/kernel/private_to_rollup_accumulated_data.d.ts +17 -1
- package/dest/kernel/private_to_rollup_accumulated_data.d.ts.map +1 -1
- package/dest/kernel/private_to_rollup_kernel_circuit_public_inputs.d.ts +16 -1
- package/dest/kernel/private_to_rollup_kernel_circuit_public_inputs.d.ts.map +1 -1
- package/dest/kernel/private_validation_requests.d.ts +10 -1
- package/dest/kernel/private_validation_requests.d.ts.map +1 -1
- package/dest/kernel/public_call_request.d.ts +22 -1
- package/dest/kernel/public_call_request.d.ts.map +1 -1
- package/dest/kernel/utils/optional_number.d.ts +7 -1
- package/dest/kernel/utils/optional_number.d.ts.map +1 -1
- package/dest/keys/public_keys.d.ts +5 -1
- package/dest/keys/public_keys.d.ts.map +1 -1
- package/dest/logs/extended_contract_class_log.d.ts +3 -1
- package/dest/logs/extended_contract_class_log.d.ts.map +1 -1
- package/dest/logs/extended_public_log.d.ts +5 -3
- package/dest/logs/extended_public_log.d.ts.map +1 -1
- package/dest/logs/log_id.d.ts +5 -1
- package/dest/logs/log_id.d.ts.map +1 -1
- package/dest/messaging/inbox_leaf.d.ts +3 -1
- package/dest/messaging/inbox_leaf.d.ts.map +1 -1
- package/dest/messaging/l1_actor.d.ts +7 -1
- package/dest/messaging/l1_actor.d.ts.map +1 -1
- package/dest/messaging/l1_to_l2_message.d.ts +6 -1
- package/dest/messaging/l1_to_l2_message.d.ts.map +1 -1
- package/dest/messaging/l2_actor.d.ts +7 -1
- package/dest/messaging/l2_actor.d.ts.map +1 -1
- package/dest/messaging/l2_to_l1_membership.d.ts +1 -1
- package/dest/messaging/l2_to_l1_membership.d.ts.map +1 -1
- package/dest/messaging/l2_to_l1_membership.js +5 -3
- package/dest/messaging/out_hash.d.ts +41 -4
- package/dest/messaging/out_hash.d.ts.map +1 -1
- package/dest/messaging/out_hash.js +52 -26
- package/dest/note/note_dao.d.ts +36 -5
- package/dest/note/note_dao.d.ts.map +1 -1
- package/dest/note/note_dao.js +15 -12
- package/dest/p2p/block_proposal.d.ts +8 -1
- package/dest/p2p/block_proposal.d.ts.map +1 -1
- package/dest/p2p/block_proposal.js +6 -1
- package/dest/p2p/checkpoint_attestation.d.ts +5 -1
- package/dest/p2p/checkpoint_attestation.d.ts.map +1 -1
- package/dest/p2p/checkpoint_proposal.d.ts +6 -1
- package/dest/p2p/checkpoint_proposal.d.ts.map +1 -1
- package/dest/p2p/checkpoint_proposal.js +6 -1
- package/dest/p2p/consensus_payload.d.ts +4 -1
- package/dest/p2p/consensus_payload.d.ts.map +1 -1
- package/dest/p2p/signed_txs.d.ts +3 -1
- package/dest/p2p/signed_txs.d.ts.map +1 -1
- package/dest/p2p/signed_txs.js +6 -1
- package/dest/p2p/topic_type.js +2 -1
- package/dest/parity/parity_base_private_inputs.d.ts +3 -1
- package/dest/parity/parity_base_private_inputs.d.ts.map +1 -1
- package/dest/parity/parity_public_inputs.d.ts +4 -1
- package/dest/parity/parity_public_inputs.d.ts.map +1 -1
- package/dest/parity/parity_root_private_inputs.d.ts +2 -1
- package/dest/parity/parity_root_private_inputs.d.ts.map +1 -1
- package/dest/proofs/chonk_proof.d.ts +1 -1
- package/dest/proofs/chonk_proof.d.ts.map +1 -1
- package/dest/proofs/chonk_proof.js +9 -4
- package/dest/proofs/proof.d.ts +4 -1
- package/dest/proofs/proof.d.ts.map +1 -1
- package/dest/proofs/recursive_proof.d.ts +10 -1
- package/dest/proofs/recursive_proof.d.ts.map +1 -1
- package/dest/rollup/base_rollup_hints.d.ts +34 -1
- package/dest/rollup/base_rollup_hints.d.ts.map +1 -1
- package/dest/rollup/block_constant_data.d.ts +12 -1
- package/dest/rollup/block_constant_data.d.ts.map +1 -1
- package/dest/rollup/block_headers_hash.js +1 -1
- package/dest/rollup/block_merge_rollup_private_inputs.d.ts +4 -1
- package/dest/rollup/block_merge_rollup_private_inputs.d.ts.map +1 -1
- package/dest/rollup/block_rollup_public_inputs.d.ts +44 -3
- package/dest/rollup/block_rollup_public_inputs.d.ts.map +1 -1
- package/dest/rollup/block_rollup_public_inputs.js +2 -2
- package/dest/rollup/block_root_rollup_private_inputs.d.ts +64 -1
- package/dest/rollup/block_root_rollup_private_inputs.d.ts.map +1 -1
- package/dest/rollup/checkpoint_constant_data.d.ts +10 -1
- package/dest/rollup/checkpoint_constant_data.d.ts.map +1 -1
- package/dest/rollup/checkpoint_header.d.ts +29 -2
- package/dest/rollup/checkpoint_header.d.ts.map +1 -1
- package/dest/rollup/checkpoint_header.js +21 -5
- package/dest/rollup/checkpoint_merge_rollup_private_inputs.d.ts +4 -1
- package/dest/rollup/checkpoint_merge_rollup_private_inputs.d.ts.map +1 -1
- package/dest/rollup/checkpoint_rollup_public_inputs.d.ts +41 -6
- package/dest/rollup/checkpoint_rollup_public_inputs.d.ts.map +1 -1
- package/dest/rollup/checkpoint_rollup_public_inputs.js +10 -6
- package/dest/rollup/checkpoint_root_rollup_private_inputs.d.ts +44 -3
- package/dest/rollup/checkpoint_root_rollup_private_inputs.d.ts.map +1 -1
- package/dest/rollup/checkpoint_root_rollup_private_inputs.js +13 -2
- package/dest/rollup/epoch_constant_data.d.ts +16 -1
- package/dest/rollup/epoch_constant_data.d.ts.map +1 -1
- package/dest/rollup/root_rollup_private_inputs.d.ts +6 -1
- package/dest/rollup/root_rollup_private_inputs.d.ts.map +1 -1
- package/dest/rollup/root_rollup_public_inputs.d.ts +12 -2
- package/dest/rollup/root_rollup_public_inputs.d.ts.map +1 -1
- package/dest/rollup/root_rollup_public_inputs.js +4 -1
- package/dest/rollup/tree_snapshot_diff_hints.d.ts +24 -1
- package/dest/rollup/tree_snapshot_diff_hints.d.ts.map +1 -1
- package/dest/rollup/tx_merge_rollup_private_inputs.d.ts +4 -1
- package/dest/rollup/tx_merge_rollup_private_inputs.d.ts.map +1 -1
- package/dest/rollup/tx_rollup_public_inputs.d.ts +29 -1
- package/dest/rollup/tx_rollup_public_inputs.d.ts.map +1 -1
- package/dest/schemas/schemas.d.ts +1 -1
- package/dest/tests/factories.d.ts +1 -1
- package/dest/tests/factories.d.ts.map +1 -1
- package/dest/tests/factories.js +3 -2
- package/dest/trees/append_only_tree_snapshot.d.ts +13 -1
- package/dest/trees/append_only_tree_snapshot.d.ts.map +1 -1
- package/dest/trees/nullifier_leaf.d.ts +13 -1
- package/dest/trees/nullifier_leaf.d.ts.map +1 -1
- package/dest/trees/nullifier_membership_witness.d.ts +10 -1
- package/dest/trees/nullifier_membership_witness.d.ts.map +1 -1
- package/dest/trees/public_data_leaf.d.ts +16 -1
- package/dest/trees/public_data_leaf.d.ts.map +1 -1
- package/dest/trees/public_data_witness.d.ts +11 -1
- package/dest/trees/public_data_witness.d.ts.map +1 -1
- package/dest/tx/block_header.d.ts +10 -1
- package/dest/tx/block_header.d.ts.map +1 -1
- package/dest/tx/call_context.d.ts +13 -1
- package/dest/tx/call_context.d.ts.map +1 -1
- package/dest/tx/capsule.d.ts +4 -1
- package/dest/tx/capsule.d.ts.map +1 -1
- package/dest/tx/execution_payload.d.ts +9 -1
- package/dest/tx/execution_payload.d.ts.map +1 -1
- package/dest/tx/function_data.d.ts +4 -2
- package/dest/tx/function_data.d.ts.map +1 -1
- package/dest/tx/global_variables.d.ts +9 -1
- package/dest/tx/global_variables.d.ts.map +1 -1
- package/dest/tx/hashed_values.d.ts +7 -1
- package/dest/tx/hashed_values.d.ts.map +1 -1
- package/dest/tx/in_tx.d.ts +1 -1
- package/dest/tx/partial_state_reference.d.ts +4 -1
- package/dest/tx/partial_state_reference.d.ts.map +1 -1
- package/dest/tx/private_execution_result.d.ts +22 -1
- package/dest/tx/private_execution_result.d.ts.map +1 -1
- package/dest/tx/private_tx_constant_data.d.ts +16 -1
- package/dest/tx/private_tx_constant_data.d.ts.map +1 -1
- package/dest/tx/protocol_contracts.d.ts +1 -1
- package/dest/tx/public_call_request_with_calldata.d.ts +7 -1
- package/dest/tx/public_call_request_with_calldata.d.ts.map +1 -1
- package/dest/tx/state_reference.d.ts +3 -1
- package/dest/tx/state_reference.d.ts.map +1 -1
- package/dest/tx/tx.d.ts +23 -1
- package/dest/tx/tx.d.ts.map +1 -1
- package/dest/tx/tx_context.d.ts +2 -1
- package/dest/tx/tx_context.d.ts.map +1 -1
- package/dest/tx/tx_effect.d.ts +32 -6
- package/dest/tx/tx_effect.d.ts.map +1 -1
- package/dest/tx/tx_effect.js +0 -7
- package/dest/tx/tx_execution_request.d.ts +30 -1
- package/dest/tx/tx_execution_request.d.ts.map +1 -1
- package/dest/tx/tx_hash.d.ts +2 -1
- package/dest/tx/tx_hash.d.ts.map +1 -1
- package/dest/tx/tx_receipt.d.ts +7 -1
- package/dest/tx/tx_receipt.d.ts.map +1 -1
- package/dest/tx/tx_request.d.ts +6 -1
- package/dest/tx/tx_request.d.ts.map +1 -1
- package/dest/types/shared.d.ts +4 -1
- package/dest/types/shared.d.ts.map +1 -1
- package/dest/validators/schemas.d.ts +8 -8
- package/dest/vks/verification_key.d.ts +22 -1
- package/dest/vks/verification_key.d.ts.map +1 -1
- package/dest/vks/vk_data.d.ts +7 -1
- package/dest/vks/vk_data.d.ts.map +1 -1
- package/package.json +11 -10
- package/src/abi/utils.ts +17 -0
- package/src/block/body.ts +2 -1
- package/src/block/checkpointed_l2_block.ts +5 -4
- package/src/block/l2_block.ts +4 -2
- package/src/block/l2_block_code_to_purge.ts +1 -0
- package/src/block/l2_block_header.ts +13 -0
- package/src/block/l2_block_new.ts +8 -2
- package/src/block/l2_block_source.ts +3 -1
- package/src/block/validate_block_result.ts +5 -4
- package/src/checkpoint/checkpoint.ts +11 -1
- package/src/checkpoint/published_checkpoint.ts +4 -3
- package/src/contract/index.ts +0 -2
- package/src/deserialization/index.ts +21 -0
- package/src/interfaces/block-builder.ts +1 -0
- package/src/interfaces/validator.ts +0 -4
- package/src/messaging/l2_to_l1_membership.ts +5 -3
- package/src/messaging/out_hash.ts +60 -29
- package/src/note/note_dao.ts +18 -13
- package/src/p2p/block_proposal.ts +6 -1
- package/src/p2p/checkpoint_proposal.ts +6 -1
- package/src/p2p/signed_txs.ts +6 -1
- package/src/p2p/topic_type.ts +1 -1
- package/src/proofs/chonk_proof.ts +9 -5
- package/src/rollup/block_headers_hash.ts +1 -1
- package/src/rollup/block_rollup_public_inputs.ts +2 -2
- package/src/rollup/checkpoint_header.ts +20 -0
- package/src/rollup/checkpoint_rollup_public_inputs.ts +12 -6
- package/src/rollup/checkpoint_root_rollup_private_inputs.ts +14 -1
- package/src/rollup/root_rollup_public_inputs.ts +4 -1
- package/src/tests/factories.ts +4 -1
- package/src/tx/tx_effect.ts +0 -9
- package/dest/contract/contract_class_metadata.d.ts +0 -8
- package/dest/contract/contract_class_metadata.d.ts.map +0 -1
- package/dest/contract/contract_class_metadata.js +0 -1
- package/dest/contract/contract_metadata.d.ts +0 -7
- package/dest/contract/contract_metadata.d.ts.map +0 -1
- package/dest/contract/contract_metadata.js +0 -1
- package/src/contract/contract_class_metadata.ts +0 -8
- package/src/contract/contract_metadata.ts +0 -7
|
@@ -1,46 +1,77 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { OUT_HASH_TREE_LEAF_COUNT } from '@aztec/constants';
|
|
2
2
|
import { padArrayEnd } from '@aztec/foundation/collection';
|
|
3
3
|
import { Fr } from '@aztec/foundation/curves/bn254';
|
|
4
|
-
import {
|
|
4
|
+
import { computeBalancedShaRoot, computeUnbalancedShaRoot, computeWonkyShaRoot } from '@aztec/foundation/trees';
|
|
5
5
|
|
|
6
|
+
/**
|
|
7
|
+
* Computes the out hash of a tx. It's the root of the unbalanced tree of all the L2-to-L1 messages emitted by the tx.
|
|
8
|
+
* @param messages - The L2-to-L1 messages emitted by the tx.
|
|
9
|
+
* @returns The out hash of the tx.
|
|
10
|
+
*/
|
|
6
11
|
export function computeTxOutHash(messages: Fr[]): Fr {
|
|
12
|
+
// Must match the implementation in `tx_base_public_inputs_composer.nr > compute_kernel_out_hash()`
|
|
7
13
|
if (!messages.length) {
|
|
8
14
|
return Fr.ZERO;
|
|
9
15
|
}
|
|
10
|
-
//
|
|
11
|
-
// Zero hashes (which should not happen) are not compressed.
|
|
16
|
+
// It's an unbalanced tree because zero hashes (which should not happen) will be included.
|
|
12
17
|
return Fr.fromBuffer(computeUnbalancedShaRoot(messages.map(msg => msg.toBuffer())));
|
|
13
18
|
}
|
|
14
19
|
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
20
|
+
/**
|
|
21
|
+
* Computes the out hash of a block. It's the root of the wonky tree of all the tx out hashes.
|
|
22
|
+
* @param messagesPerTx - The L2-to-L1 messages emitted by the txs in the block. This is an array of message arrays.
|
|
23
|
+
* The array at index 0 contains the messages emitted by the first tx, the array at index 1 contains the messages
|
|
24
|
+
* emitted by the second tx, and so on.
|
|
25
|
+
* @returns The out hash of the block.
|
|
26
|
+
*/
|
|
27
|
+
export function computeBlockOutHash(messagesPerTx: Fr[][]): Fr {
|
|
28
|
+
// See how the tx out hashes are aggregated into a block out hash in `merge_tx_rollups.nr > accumulate_out_hash()`.
|
|
29
|
+
const txOutHashes = messagesPerTx.map(messages => computeTxOutHash(messages));
|
|
30
|
+
return Fr.fromBuffer(computeWonkyShaRoot(txOutHashes.map(hash => hash.toBuffer())));
|
|
18
31
|
}
|
|
19
32
|
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
33
|
+
/**
|
|
34
|
+
* Computes the out hash of a checkpoint. It's the root of the wonky tree of all the block out hashes.
|
|
35
|
+
* @param messagesPerBlock - The L2-to-L1 messages emitted by the txs in the blocks in the checkpoint. This is an array
|
|
36
|
+
* of arrays of messages. The array at index 0 contains the arrays of messages emitted by the first block, the array at
|
|
37
|
+
* index 1 contains the arrays of messages emitted by the second block, and so on.
|
|
38
|
+
* @returns The out hash of the checkpoint.
|
|
39
|
+
*/
|
|
40
|
+
export function computeCheckpointOutHash(messagesPerBlock: Fr[][][]): Fr {
|
|
41
|
+
// See how the block out hashes are aggregated into a checkpoint out hash in `merge_block_rollups.nr > accumulate_out_hash()`.
|
|
42
|
+
const blockOutHashes = messagesPerBlock.map(block => computeBlockOutHash(block));
|
|
43
|
+
return Fr.fromBuffer(computeWonkyShaRoot(blockOutHashes.map(hash => hash.toBuffer())));
|
|
23
44
|
}
|
|
24
45
|
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
const paddedOutHashes = padArrayEnd(
|
|
35
|
-
|
|
46
|
+
/**
|
|
47
|
+
* Computes the accumulated (epoch) out hash of a checkpoint. It's the root of the balanced tree of all the out hashes
|
|
48
|
+
* from the first checkpoint in an epoch to the current checkpoint.
|
|
49
|
+
* It's this value that's set to the checkpoint header and validated on L1 instead of the checkpoint out hash.
|
|
50
|
+
* @param checkpointOutHashes - The out hashes of all checkpoints in the epoch.
|
|
51
|
+
* @returns The accumulated (epoch) out hash.
|
|
52
|
+
*/
|
|
53
|
+
export function accumulateCheckpointOutHashes(checkpointOutHashes: Fr[]): Fr {
|
|
54
|
+
// See how the checkpoint out hashes are accumulated in `checkpoint_rollup_public_inputs_composer.nr > accumulate_checkpoint_out_hash()`.
|
|
55
|
+
const paddedOutHashes = padArrayEnd(
|
|
56
|
+
checkpointOutHashes.map(hash => hash.toBuffer()),
|
|
57
|
+
Buffer.alloc(32),
|
|
58
|
+
OUT_HASH_TREE_LEAF_COUNT,
|
|
59
|
+
);
|
|
60
|
+
return Fr.fromBuffer(computeBalancedShaRoot(paddedOutHashes));
|
|
36
61
|
}
|
|
37
62
|
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
63
|
+
/**
|
|
64
|
+
* Computes the epoch out hash. It's the root of the balanced tree of all the checkpoint out hashes.
|
|
65
|
+
* It should match the **accumulated** out hash of the last checkpoint in the epoch.
|
|
66
|
+
* This value will be inserted into the Outbox on L1.
|
|
67
|
+
* @param messagesPerCheckpoint - The L2-to-L1 messages emitted by the txs in the blocks in the checkpoints in the epoch.
|
|
68
|
+
* This is an array of arrays of arrays of messages. The array at index 0 contains the arrays of arrays of messages
|
|
69
|
+
* emitted by the first checkpoint, the array at index 1 contains the arrays of arrays of messages emitted by the second
|
|
70
|
+
* checkpoint, and so on.
|
|
71
|
+
* @returns The epoch out hash.
|
|
72
|
+
*/
|
|
73
|
+
export function computeEpochOutHash(messagesPerCheckpoint: Fr[][][][]): Fr {
|
|
74
|
+
// See how the accumulated out hash is assigned to the root rollup's public inputs in `root_rollup.nr`.
|
|
75
|
+
const checkpointOutHashes = messagesPerCheckpoint.map(checkpoint => computeCheckpointOutHash(checkpoint));
|
|
76
|
+
return accumulateCheckpointOutHashes(checkpointOutHashes);
|
|
46
77
|
}
|
package/src/note/note_dao.ts
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { toBigIntBE } from '@aztec/foundation/bigint-buffer';
|
|
2
1
|
import { BlockNumber } from '@aztec/foundation/branded-types';
|
|
3
2
|
import { Fr } from '@aztec/foundation/curves/bn254';
|
|
4
3
|
import { Point } from '@aztec/foundation/curves/grumpkin';
|
|
@@ -56,8 +55,10 @@ export class NoteDao {
|
|
|
56
55
|
/** The L2 block hash in which the tx with this note was included. Used for note management while processing
|
|
57
56
|
* reorgs.*/
|
|
58
57
|
public l2BlockHash: string,
|
|
59
|
-
/** The index of the
|
|
60
|
-
public
|
|
58
|
+
/** The index of the tx within the block, used for ordering notes. */
|
|
59
|
+
public txIndexInBlock: number,
|
|
60
|
+
/** The index of the note within the tx (based on note hash position), used for ordering notes. */
|
|
61
|
+
public noteIndexInTx: number,
|
|
61
62
|
) {}
|
|
62
63
|
|
|
63
64
|
toBuffer(): Buffer {
|
|
@@ -73,7 +74,8 @@ export class NoteDao {
|
|
|
73
74
|
this.txHash,
|
|
74
75
|
this.l2BlockNumber,
|
|
75
76
|
Fr.fromHexString(this.l2BlockHash),
|
|
76
|
-
this.
|
|
77
|
+
this.txIndexInBlock,
|
|
78
|
+
this.noteIndexInTx,
|
|
77
79
|
]);
|
|
78
80
|
}
|
|
79
81
|
|
|
@@ -91,7 +93,8 @@ export class NoteDao {
|
|
|
91
93
|
const txHash = reader.readObject(TxHash);
|
|
92
94
|
const l2BlockNumber = BlockNumber(reader.readNumber());
|
|
93
95
|
const l2BlockHash = Fr.fromBuffer(reader).toString();
|
|
94
|
-
const
|
|
96
|
+
const txIndexInBlock = reader.readNumber();
|
|
97
|
+
const noteIndexInTx = reader.readNumber();
|
|
95
98
|
|
|
96
99
|
return new NoteDao(
|
|
97
100
|
note,
|
|
@@ -105,7 +108,8 @@ export class NoteDao {
|
|
|
105
108
|
txHash,
|
|
106
109
|
l2BlockNumber,
|
|
107
110
|
l2BlockHash,
|
|
108
|
-
|
|
111
|
+
txIndexInBlock,
|
|
112
|
+
noteIndexInTx,
|
|
109
113
|
);
|
|
110
114
|
}
|
|
111
115
|
|
|
@@ -134,7 +138,8 @@ export class NoteDao {
|
|
|
134
138
|
this.txHash.equals(other.txHash) &&
|
|
135
139
|
this.l2BlockNumber === other.l2BlockNumber &&
|
|
136
140
|
this.l2BlockHash === other.l2BlockHash &&
|
|
137
|
-
this.
|
|
141
|
+
this.txIndexInBlock === other.txIndexInBlock &&
|
|
142
|
+
this.noteIndexInTx === other.noteIndexInTx
|
|
138
143
|
);
|
|
139
144
|
}
|
|
140
145
|
|
|
@@ -143,11 +148,9 @@ export class NoteDao {
|
|
|
143
148
|
* @returns - Its size in bytes.
|
|
144
149
|
*/
|
|
145
150
|
public getSize() {
|
|
146
|
-
const indexSize = Math.ceil(Math.log2(Number(this.index)));
|
|
147
151
|
const noteSize = 4 + this.note.items.length * Fr.SIZE_IN_BYTES;
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
);
|
|
152
|
+
// 2 numbers for txIndexInBlock and noteIndexInTx (4 bytes each)
|
|
153
|
+
return noteSize + AztecAddress.SIZE_IN_BYTES * 2 + Fr.SIZE_IN_BYTES * 4 + TxHash.SIZE + Point.SIZE_IN_BYTES + 8;
|
|
151
154
|
}
|
|
152
155
|
|
|
153
156
|
static async random({
|
|
@@ -162,7 +165,8 @@ export class NoteDao {
|
|
|
162
165
|
txHash = TxHash.random(),
|
|
163
166
|
l2BlockNumber = BlockNumber(Math.floor(Math.random() * 1000)),
|
|
164
167
|
l2BlockHash = Fr.random().toString(),
|
|
165
|
-
|
|
168
|
+
txIndexInBlock = Math.floor(Math.random() * 100),
|
|
169
|
+
noteIndexInTx = Math.floor(Math.random() * 100),
|
|
166
170
|
}: Partial<NoteDao> = {}) {
|
|
167
171
|
return new NoteDao(
|
|
168
172
|
note,
|
|
@@ -176,7 +180,8 @@ export class NoteDao {
|
|
|
176
180
|
txHash,
|
|
177
181
|
l2BlockNumber,
|
|
178
182
|
l2BlockHash,
|
|
179
|
-
|
|
183
|
+
txIndexInBlock,
|
|
184
|
+
noteIndexInTx,
|
|
180
185
|
);
|
|
181
186
|
}
|
|
182
187
|
}
|
|
@@ -9,6 +9,7 @@ import { BufferReader, serializeToBuffer } from '@aztec/foundation/serialize';
|
|
|
9
9
|
|
|
10
10
|
import type { L2Block } from '../block/l2_block.js';
|
|
11
11
|
import type { L2BlockInfo } from '../block/l2_block_info.js';
|
|
12
|
+
import { MAX_TXS_PER_BLOCK } from '../deserialization/index.js';
|
|
12
13
|
import { BlockHeader } from '../tx/block_header.js';
|
|
13
14
|
import { TxHash } from '../tx/index.js';
|
|
14
15
|
import type { Tx } from '../tx/tx.js';
|
|
@@ -204,7 +205,11 @@ export class BlockProposal extends Gossipable {
|
|
|
204
205
|
const inHash = reader.readObject(Fr);
|
|
205
206
|
const archiveRoot = reader.readObject(Fr);
|
|
206
207
|
const signature = reader.readObject(Signature);
|
|
207
|
-
const
|
|
208
|
+
const txHashCount = reader.readNumber();
|
|
209
|
+
if (txHashCount > MAX_TXS_PER_BLOCK) {
|
|
210
|
+
throw new Error(`txHashes count ${txHashCount} exceeds maximum ${MAX_TXS_PER_BLOCK}`);
|
|
211
|
+
}
|
|
212
|
+
const txHashes = reader.readArray(txHashCount, TxHash);
|
|
208
213
|
|
|
209
214
|
if (!reader.isEmpty()) {
|
|
210
215
|
const hasSignedTxs = reader.readNumber();
|
|
@@ -8,6 +8,7 @@ import { Signature } from '@aztec/foundation/eth-signature';
|
|
|
8
8
|
import { BufferReader, serializeToBuffer } from '@aztec/foundation/serialize';
|
|
9
9
|
|
|
10
10
|
import type { L2BlockInfo } from '../block/l2_block_info.js';
|
|
11
|
+
import { MAX_TXS_PER_BLOCK } from '../deserialization/index.js';
|
|
11
12
|
import { CheckpointHeader } from '../rollup/checkpoint_header.js';
|
|
12
13
|
import { BlockHeader } from '../tx/block_header.js';
|
|
13
14
|
import { TxHash } from '../tx/index.js';
|
|
@@ -248,7 +249,11 @@ export class CheckpointProposal extends Gossipable {
|
|
|
248
249
|
const blockHeader = reader.readObject(BlockHeader);
|
|
249
250
|
const indexWithinCheckpoint = reader.readNumber();
|
|
250
251
|
const blockSignature = reader.readObject(Signature);
|
|
251
|
-
const
|
|
252
|
+
const txHashCount = reader.readNumber();
|
|
253
|
+
if (txHashCount > MAX_TXS_PER_BLOCK) {
|
|
254
|
+
throw new Error(`txHashes count ${txHashCount} exceeds maximum ${MAX_TXS_PER_BLOCK}`);
|
|
255
|
+
}
|
|
256
|
+
const txHashes = reader.readArray(txHashCount, TxHash);
|
|
252
257
|
|
|
253
258
|
let signedTxs: SignedTxs | undefined;
|
|
254
259
|
if (!reader.isEmpty()) {
|
package/src/p2p/signed_txs.ts
CHANGED
|
@@ -4,6 +4,7 @@ import type { EthAddress } from '@aztec/foundation/eth-address';
|
|
|
4
4
|
import { Signature } from '@aztec/foundation/eth-signature';
|
|
5
5
|
import { BufferReader, serializeToBuffer } from '@aztec/foundation/serialize';
|
|
6
6
|
|
|
7
|
+
import { MAX_TXS_PER_BLOCK } from '../deserialization/index.js';
|
|
7
8
|
import { Tx } from '../tx/tx.js';
|
|
8
9
|
import {
|
|
9
10
|
SignatureDomainSeparator,
|
|
@@ -64,7 +65,11 @@ export class SignedTxs {
|
|
|
64
65
|
|
|
65
66
|
static fromBuffer(buf: Buffer | BufferReader): SignedTxs {
|
|
66
67
|
const reader = BufferReader.asReader(buf);
|
|
67
|
-
const
|
|
68
|
+
const txCount = reader.readNumber();
|
|
69
|
+
if (txCount > MAX_TXS_PER_BLOCK) {
|
|
70
|
+
throw new Error(`txs count ${txCount} exceeds maximum ${MAX_TXS_PER_BLOCK}`);
|
|
71
|
+
}
|
|
72
|
+
const txs = reader.readArray(txCount, Tx);
|
|
68
73
|
const signature = reader.readObject(Signature);
|
|
69
74
|
return new SignedTxs(txs, signature);
|
|
70
75
|
}
|
package/src/p2p/topic_type.ts
CHANGED
|
@@ -31,7 +31,7 @@ export function getTopicTypeForClientType(clientType: P2PClientType) {
|
|
|
31
31
|
if (clientType === P2PClientType.Full) {
|
|
32
32
|
return [TopicType.tx, TopicType.block_proposal, TopicType.checkpoint_proposal, TopicType.checkpoint_attestation];
|
|
33
33
|
} else if (clientType === P2PClientType.Prover) {
|
|
34
|
-
return [TopicType.tx, TopicType.block_proposal];
|
|
34
|
+
return [TopicType.tx, TopicType.block_proposal, TopicType.checkpoint_proposal];
|
|
35
35
|
} else {
|
|
36
36
|
const _: never = clientType;
|
|
37
37
|
return [TopicType.tx];
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { CHONK_PROOF_LENGTH } from '@aztec/constants';
|
|
2
|
+
import { times } from '@aztec/foundation/collection';
|
|
2
3
|
import { randomBytes } from '@aztec/foundation/crypto/random';
|
|
3
4
|
import { Fr } from '@aztec/foundation/curves/bn254';
|
|
4
5
|
import { bufferSchemaFor } from '@aztec/foundation/schemas';
|
|
@@ -31,12 +32,15 @@ export class ChonkProof {
|
|
|
31
32
|
|
|
32
33
|
static random() {
|
|
33
34
|
// NB: Not using Fr.random here because it slows down some tests that require a large number of txs significantly.
|
|
35
|
+
// NB2: generate one fewer random bytes to not have to deal with buffers representing numbers greater than the field modulus
|
|
36
|
+
// NB3: a chonk proof can be compressed. Simulate this by filling 1/4 of the proof with zero data
|
|
34
37
|
const reducedFrSize = Fr.SIZE_IN_BYTES - 1;
|
|
35
|
-
const
|
|
36
|
-
const
|
|
37
|
-
|
|
38
|
-
(
|
|
39
|
-
|
|
38
|
+
const nonZeroFields = Math.floor((3 * CHONK_PROOF_LENGTH) / 4);
|
|
39
|
+
const randomFields = randomBytes(nonZeroFields * Fr.SIZE_IN_BYTES);
|
|
40
|
+
const proof = [
|
|
41
|
+
...times(nonZeroFields, i => new Fr(randomFields.subarray(i * reducedFrSize, (i + 1) * reducedFrSize))),
|
|
42
|
+
...times(CHONK_PROOF_LENGTH - nonZeroFields, () => Fr.ZERO),
|
|
43
|
+
];
|
|
40
44
|
return new ChonkProof(proof);
|
|
41
45
|
}
|
|
42
46
|
|
|
@@ -5,7 +5,7 @@ import type { BlockHeader } from '../tx/block_header.js';
|
|
|
5
5
|
|
|
6
6
|
export async function computeBlockHeadersHash(blockHeaders: BlockHeader[]): Promise<Fr> {
|
|
7
7
|
const blockHeaderHashes = await Promise.all(blockHeaders.map(header => header.hash()));
|
|
8
|
-
// Must match the implementation in merge_block_rollups.nr, with the **
|
|
8
|
+
// Must match the implementation in merge_block_rollups.nr, with the **unbalanced** rollup structure
|
|
9
9
|
// (see validate_consecutive_block_rollups.nr > assert_rollups_filled_greedily.nr).
|
|
10
10
|
const blockHeadersHash = await computeUnbalancedPoseidonRoot(blockHeaderHashes.map(hash => hash.toBuffer()));
|
|
11
11
|
return Fr.fromBuffer(blockHeadersHash);
|
|
@@ -48,8 +48,8 @@ export class BlockRollupPublicInputs {
|
|
|
48
48
|
public timestamp: UInt64,
|
|
49
49
|
/**
|
|
50
50
|
* Hash of the headers of all blocks in this block range. It will be combined with the `blockHeadersHash` from
|
|
51
|
-
* other blocks in the same checkpoint to form
|
|
52
|
-
* the checkpoint header, enabling validation of the blocks included in a checkpoint given their headers.
|
|
51
|
+
* other blocks in the same checkpoint to form an unbalanced tree. The root of that tree becomes the final hash
|
|
52
|
+
* stored in the checkpoint header, enabling validation of the blocks included in a checkpoint given their headers.
|
|
53
53
|
*/
|
|
54
54
|
public blockHeadersHash: Fr,
|
|
55
55
|
/**
|
|
@@ -32,6 +32,14 @@ export class CheckpointHeader {
|
|
|
32
32
|
public blobsHash: Fr,
|
|
33
33
|
/** Root of the l1 to l2 messages subtree. */
|
|
34
34
|
public inHash: Fr,
|
|
35
|
+
/**
|
|
36
|
+
* The root of the epoch out hash balanced tree. The out hash of the first checkpoint in the epoch is inserted at
|
|
37
|
+
* index 0, the second at index 1, and so on.
|
|
38
|
+
* Note: This is not necessarily the final epoch out hash. It includes only the out hashes of checkpoints up to and
|
|
39
|
+
* including the current checkpoint. Any subsequent checkpoints added to the same epoch are not reflected in this
|
|
40
|
+
* value.
|
|
41
|
+
*/
|
|
42
|
+
public epochOutHash: Fr,
|
|
35
43
|
/** Slot number of the L2 block */
|
|
36
44
|
public slotNumber: SlotNumber,
|
|
37
45
|
/** Timestamp of the L2 block. */
|
|
@@ -53,6 +61,7 @@ export class CheckpointHeader {
|
|
|
53
61
|
blockHeadersHash: schemas.Fr,
|
|
54
62
|
blobsHash: schemas.Fr,
|
|
55
63
|
inHash: schemas.Fr,
|
|
64
|
+
epochOutHash: schemas.Fr,
|
|
56
65
|
slotNumber: schemas.SlotNumber,
|
|
57
66
|
timestamp: schemas.BigInt,
|
|
58
67
|
coinbase: schemas.EthAddress,
|
|
@@ -69,6 +78,7 @@ export class CheckpointHeader {
|
|
|
69
78
|
fields.blockHeadersHash,
|
|
70
79
|
fields.blobsHash,
|
|
71
80
|
fields.inHash,
|
|
81
|
+
fields.epochOutHash,
|
|
72
82
|
fields.slotNumber,
|
|
73
83
|
fields.timestamp,
|
|
74
84
|
fields.coinbase,
|
|
@@ -90,6 +100,7 @@ export class CheckpointHeader {
|
|
|
90
100
|
reader.readObject(Fr),
|
|
91
101
|
reader.readObject(Fr),
|
|
92
102
|
reader.readObject(Fr),
|
|
103
|
+
reader.readObject(Fr),
|
|
93
104
|
SlotNumber(Fr.fromBuffer(reader).toNumber()),
|
|
94
105
|
reader.readUInt64(),
|
|
95
106
|
reader.readObject(EthAddress),
|
|
@@ -105,6 +116,7 @@ export class CheckpointHeader {
|
|
|
105
116
|
this.blockHeadersHash.equals(other.blockHeadersHash) &&
|
|
106
117
|
this.blobsHash.equals(other.blobsHash) &&
|
|
107
118
|
this.inHash.equals(other.inHash) &&
|
|
119
|
+
this.epochOutHash.equals(other.epochOutHash) &&
|
|
108
120
|
this.slotNumber === other.slotNumber &&
|
|
109
121
|
this.timestamp === other.timestamp &&
|
|
110
122
|
this.coinbase.equals(other.coinbase) &&
|
|
@@ -132,6 +144,7 @@ export class CheckpointHeader {
|
|
|
132
144
|
this.blockHeadersHash,
|
|
133
145
|
this.blobsHash,
|
|
134
146
|
this.inHash,
|
|
147
|
+
this.epochOutHash,
|
|
135
148
|
new Fr(this.slotNumber),
|
|
136
149
|
bigintToUInt64BE(this.timestamp),
|
|
137
150
|
this.coinbase,
|
|
@@ -151,6 +164,7 @@ export class CheckpointHeader {
|
|
|
151
164
|
blockHeadersHash: Fr.ZERO,
|
|
152
165
|
blobsHash: Fr.ZERO,
|
|
153
166
|
inHash: Fr.ZERO,
|
|
167
|
+
epochOutHash: Fr.ZERO,
|
|
154
168
|
slotNumber: SlotNumber.ZERO,
|
|
155
169
|
timestamp: 0n,
|
|
156
170
|
coinbase: EthAddress.ZERO,
|
|
@@ -167,6 +181,7 @@ export class CheckpointHeader {
|
|
|
167
181
|
blockHeadersHash: Fr.random(),
|
|
168
182
|
blobsHash: Fr.random(),
|
|
169
183
|
inHash: Fr.random(),
|
|
184
|
+
epochOutHash: Fr.random(),
|
|
170
185
|
slotNumber: SlotNumber(Math.floor(Math.random() * 1000) + 1),
|
|
171
186
|
timestamp: BigInt(Math.floor(Date.now() / 1000)),
|
|
172
187
|
coinbase: EthAddress.random(),
|
|
@@ -183,6 +198,7 @@ export class CheckpointHeader {
|
|
|
183
198
|
this.blockHeadersHash.isZero() &&
|
|
184
199
|
this.blobsHash.isZero() &&
|
|
185
200
|
this.inHash.isZero() &&
|
|
201
|
+
this.epochOutHash.isZero() &&
|
|
186
202
|
this.slotNumber === 0 &&
|
|
187
203
|
this.timestamp === 0n &&
|
|
188
204
|
this.coinbase.isZero() &&
|
|
@@ -210,6 +226,7 @@ export class CheckpointHeader {
|
|
|
210
226
|
Fr.fromString(header.blockHeadersHash),
|
|
211
227
|
Fr.fromString(header.blobsHash),
|
|
212
228
|
Fr.fromString(header.inHash),
|
|
229
|
+
Fr.fromString(header.outHash),
|
|
213
230
|
SlotNumber.fromBigInt(header.slotNumber),
|
|
214
231
|
header.timestamp,
|
|
215
232
|
new EthAddress(hexToBuffer(header.coinbase)),
|
|
@@ -233,6 +250,7 @@ export class CheckpointHeader {
|
|
|
233
250
|
blockHeadersHash: this.blockHeadersHash.toString(),
|
|
234
251
|
blobsHash: this.blobsHash.toString(),
|
|
235
252
|
inHash: this.inHash.toString(),
|
|
253
|
+
outHash: this.epochOutHash.toString(),
|
|
236
254
|
slotNumber: BigInt(this.slotNumber),
|
|
237
255
|
timestamp: this.timestamp,
|
|
238
256
|
coinbase: this.coinbase.toString(),
|
|
@@ -251,6 +269,7 @@ export class CheckpointHeader {
|
|
|
251
269
|
blockHeadersHash: this.blockHeadersHash.toString(),
|
|
252
270
|
blobsHash: this.blobsHash.toString(),
|
|
253
271
|
inHash: this.inHash.toString(),
|
|
272
|
+
epochOutHash: this.epochOutHash.toString(),
|
|
254
273
|
slotNumber: this.slotNumber,
|
|
255
274
|
timestamp: this.timestamp,
|
|
256
275
|
coinbase: this.coinbase.toString(),
|
|
@@ -266,6 +285,7 @@ export class CheckpointHeader {
|
|
|
266
285
|
blockHeadersHash: ${this.blockHeadersHash.toString()},
|
|
267
286
|
blobsHash: ${inspect(this.blobsHash)},
|
|
268
287
|
inHash: ${inspect(this.inHash)},
|
|
288
|
+
epochOutHash: ${inspect(this.epochOutHash)},
|
|
269
289
|
slotNumber: ${this.slotNumber},
|
|
270
290
|
timestamp: ${this.timestamp},
|
|
271
291
|
coinbase: ${this.coinbase.toString()},
|
|
@@ -28,13 +28,17 @@ export class CheckpointRollupPublicInputs {
|
|
|
28
28
|
*/
|
|
29
29
|
public newArchive: AppendOnlyTreeSnapshot,
|
|
30
30
|
/**
|
|
31
|
-
* The
|
|
31
|
+
* The out hash tree snapshot immediately before this checkpoint range.
|
|
32
32
|
*/
|
|
33
|
-
public
|
|
33
|
+
public previousOutHash: AppendOnlyTreeSnapshot,
|
|
34
34
|
/**
|
|
35
|
-
* The
|
|
35
|
+
* The out hash tree snapshot after applying this checkpoint range.
|
|
36
36
|
*/
|
|
37
|
-
public
|
|
37
|
+
public newOutHash: AppendOnlyTreeSnapshot,
|
|
38
|
+
/**
|
|
39
|
+
* The hashes of the headers of the constituent checkpoints.
|
|
40
|
+
*/
|
|
41
|
+
public checkpointHeaderHashes: Tuple<Fr, typeof AZTEC_MAX_EPOCH_DURATION>,
|
|
38
42
|
/**
|
|
39
43
|
* The summed transaction fees and recipients of the constituent checkpoints.
|
|
40
44
|
*/
|
|
@@ -59,7 +63,8 @@ export class CheckpointRollupPublicInputs {
|
|
|
59
63
|
reader.readObject(EpochConstantData),
|
|
60
64
|
reader.readObject(AppendOnlyTreeSnapshot),
|
|
61
65
|
reader.readObject(AppendOnlyTreeSnapshot),
|
|
62
|
-
reader.
|
|
66
|
+
reader.readObject(AppendOnlyTreeSnapshot),
|
|
67
|
+
reader.readObject(AppendOnlyTreeSnapshot),
|
|
63
68
|
reader.readArray(AZTEC_MAX_EPOCH_DURATION, Fr),
|
|
64
69
|
reader.readArray(AZTEC_MAX_EPOCH_DURATION, FeeRecipient),
|
|
65
70
|
reader.readObject(BlobAccumulator),
|
|
@@ -73,8 +78,9 @@ export class CheckpointRollupPublicInputs {
|
|
|
73
78
|
this.constants,
|
|
74
79
|
this.previousArchive,
|
|
75
80
|
this.newArchive,
|
|
81
|
+
this.previousOutHash,
|
|
82
|
+
this.newOutHash,
|
|
76
83
|
this.checkpointHeaderHashes,
|
|
77
|
-
this.outHashes,
|
|
78
84
|
this.fees,
|
|
79
85
|
this.startBlobAccumulator,
|
|
80
86
|
this.endBlobAccumulator,
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { BlobAccumulator, FinalBlobBatchingChallenges } from '@aztec/blob-lib/types';
|
|
2
|
-
import { ARCHIVE_HEIGHT, BLOBS_PER_CHECKPOINT, FIELDS_PER_BLOB } from '@aztec/constants';
|
|
2
|
+
import { ARCHIVE_HEIGHT, BLOBS_PER_CHECKPOINT, FIELDS_PER_BLOB, OUT_HASH_TREE_HEIGHT } from '@aztec/constants';
|
|
3
3
|
import { BLS12Point } from '@aztec/foundation/curves/bls12';
|
|
4
4
|
import { Fr } from '@aztec/foundation/curves/bn254';
|
|
5
5
|
import { bufferSchemaFor } from '@aztec/foundation/schemas';
|
|
@@ -8,6 +8,7 @@ import { bufferToHex, hexToBuffer } from '@aztec/foundation/string';
|
|
|
8
8
|
import type { FieldsOf } from '@aztec/foundation/types';
|
|
9
9
|
|
|
10
10
|
import { ProofData, type RollupHonkProofData } from '../proofs/proof_data.js';
|
|
11
|
+
import { AppendOnlyTreeSnapshot } from '../trees/append_only_tree_snapshot.js';
|
|
11
12
|
import { BlockHeader } from '../tx/block_header.js';
|
|
12
13
|
import { BlockRollupPublicInputs } from './block_rollup_public_inputs.js';
|
|
13
14
|
|
|
@@ -21,6 +22,14 @@ export class CheckpointRootRollupHints {
|
|
|
21
22
|
* Hint for checking the hash of previous_block_header is the last leaf of the previous archive.
|
|
22
23
|
*/
|
|
23
24
|
public previousArchiveSiblingPath: Tuple<Fr, typeof ARCHIVE_HEIGHT>,
|
|
25
|
+
/**
|
|
26
|
+
* The out hash tree snapshot immediately before this checkpoint.
|
|
27
|
+
*/
|
|
28
|
+
public previousOutHash: AppendOnlyTreeSnapshot,
|
|
29
|
+
/**
|
|
30
|
+
* Hint for inserting the new out hash into the out hash tree.
|
|
31
|
+
*/
|
|
32
|
+
public newOutHashSiblingPath: Tuple<Fr, typeof OUT_HASH_TREE_HEIGHT>,
|
|
24
33
|
/**
|
|
25
34
|
* The current blob accumulation state across the epoch.
|
|
26
35
|
*/
|
|
@@ -54,6 +63,8 @@ export class CheckpointRootRollupHints {
|
|
|
54
63
|
return [
|
|
55
64
|
fields.previousBlockHeader,
|
|
56
65
|
fields.previousArchiveSiblingPath,
|
|
66
|
+
fields.previousOutHash,
|
|
67
|
+
fields.newOutHashSiblingPath,
|
|
57
68
|
fields.startBlobAccumulator,
|
|
58
69
|
fields.finalBlobChallenges,
|
|
59
70
|
fields.blobFields,
|
|
@@ -71,6 +82,8 @@ export class CheckpointRootRollupHints {
|
|
|
71
82
|
return new CheckpointRootRollupHints(
|
|
72
83
|
BlockHeader.fromBuffer(reader),
|
|
73
84
|
reader.readArray(ARCHIVE_HEIGHT, Fr),
|
|
85
|
+
reader.readObject(AppendOnlyTreeSnapshot),
|
|
86
|
+
reader.readArray(OUT_HASH_TREE_HEIGHT, Fr),
|
|
74
87
|
reader.readObject(BlobAccumulator),
|
|
75
88
|
reader.readObject(FinalBlobBatchingChallenges),
|
|
76
89
|
// Below line gives error 'Type instantiation is excessively deep and possibly infinite. ts(2589)'
|
|
@@ -21,7 +21,10 @@ export class RootRollupPublicInputs {
|
|
|
21
21
|
public previousArchiveRoot: Fr,
|
|
22
22
|
/** Root of the archive tree after this rollup is processed */
|
|
23
23
|
public endArchiveRoot: Fr,
|
|
24
|
-
/**
|
|
24
|
+
/**
|
|
25
|
+
* Root of the balanced merkle tree consisting of the out hashes of all checkpoints in this epoch.
|
|
26
|
+
* The out hash of the first checkpoint in the epoch is inserted at index 0, the second at index 1, and so on.
|
|
27
|
+
*/
|
|
25
28
|
public outHash: Fr,
|
|
26
29
|
/** Hashes of checkpoint headers for this rollup. */
|
|
27
30
|
public checkpointHeaderHashes: Tuple<Fr, typeof AZTEC_MAX_EPOCH_DURATION>,
|
package/src/tests/factories.ts
CHANGED
|
@@ -850,7 +850,8 @@ export function makeCheckpointRollupPublicInputs(seed = 0) {
|
|
|
850
850
|
makeEpochConstantData(seed),
|
|
851
851
|
makeAppendOnlyTreeSnapshot(seed + 0x100),
|
|
852
852
|
makeAppendOnlyTreeSnapshot(seed + 0x200),
|
|
853
|
-
|
|
853
|
+
makeAppendOnlyTreeSnapshot(seed + 0x300),
|
|
854
|
+
makeAppendOnlyTreeSnapshot(seed + 0x350),
|
|
854
855
|
makeTuple(AZTEC_MAX_EPOCH_DURATION, () => fr(seed), 0x400),
|
|
855
856
|
makeTuple(AZTEC_MAX_EPOCH_DURATION, () => makeFeeRecipient(seed), 0x500),
|
|
856
857
|
makeBlobAccumulator(seed + 0x600),
|
|
@@ -920,6 +921,7 @@ export function makeL2BlockHeader(
|
|
|
920
921
|
makeAppendOnlyTreeSnapshot(seed + 0x100),
|
|
921
922
|
overrides?.blobsHash ?? fr(seed + 0x200),
|
|
922
923
|
overrides?.inHash ?? fr(seed + 0x300),
|
|
924
|
+
overrides?.epochOutHash ?? fr(seed + 0x400),
|
|
923
925
|
overrides?.state ?? makeStateReference(seed + 0x600),
|
|
924
926
|
makeGlobalVariables((seed += 0x700), {
|
|
925
927
|
...(blockNumber !== undefined ? { blockNumber: BlockNumber(blockNumber) } : {}),
|
|
@@ -938,6 +940,7 @@ export function makeCheckpointHeader(seed = 0) {
|
|
|
938
940
|
blockHeadersHash: fr(seed + 0x150),
|
|
939
941
|
blobsHash: fr(seed + 0x200),
|
|
940
942
|
inHash: fr(seed + 0x210),
|
|
943
|
+
epochOutHash: fr(seed + 0x220),
|
|
941
944
|
slotNumber: SlotNumber(seed + 0x300),
|
|
942
945
|
timestamp: BigInt(seed + 0x400),
|
|
943
946
|
coinbase: makeEthAddress(seed + 0x500),
|
package/src/tx/tx_effect.ts
CHANGED
|
@@ -28,7 +28,6 @@ import { RevertCode } from '../avm/revert_code.js';
|
|
|
28
28
|
import { ContractClassLog } from '../logs/contract_class_log.js';
|
|
29
29
|
import { PrivateLog } from '../logs/private_log.js';
|
|
30
30
|
import { FlatPublicLogs, PublicLog } from '../logs/public_log.js';
|
|
31
|
-
import { computeTxOutHash } from '../messaging/out_hash.js';
|
|
32
31
|
import { TxHash } from './tx_hash.js';
|
|
33
32
|
|
|
34
33
|
export class TxEffect {
|
|
@@ -184,14 +183,6 @@ export class TxEffect {
|
|
|
184
183
|
);
|
|
185
184
|
}
|
|
186
185
|
|
|
187
|
-
/**
|
|
188
|
-
* Computes txOutHash of this tx effect.
|
|
189
|
-
* @dev Follows new_sha in unbalanced_merkle_tree.nr
|
|
190
|
-
*/
|
|
191
|
-
txOutHash(): Fr {
|
|
192
|
-
return computeTxOutHash(this.l2ToL1Msgs);
|
|
193
|
-
}
|
|
194
|
-
|
|
195
186
|
static async random({
|
|
196
187
|
numNoteHashes,
|
|
197
188
|
numNullifiers,
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
import type { ContractArtifact } from '../abi/abi.js';
|
|
2
|
-
import type { ContractClassWithId } from './interfaces/contract_class.js';
|
|
3
|
-
export interface ContractClassMetadata {
|
|
4
|
-
contractClass?: ContractClassWithId | undefined;
|
|
5
|
-
isContractClassPubliclyRegistered: boolean;
|
|
6
|
-
artifact?: ContractArtifact | undefined;
|
|
7
|
-
}
|
|
8
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udHJhY3RfY2xhc3NfbWV0YWRhdGEuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb250cmFjdC9jb250cmFjdF9jbGFzc19tZXRhZGF0YS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN0RCxPQUFPLEtBQUssRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBRTFFLE1BQU0sV0FBVyxxQkFBcUI7SUFDcEMsYUFBYSxDQUFDLEVBQUUsbUJBQW1CLEdBQUcsU0FBUyxDQUFDO0lBQ2hELGlDQUFpQyxFQUFFLE9BQU8sQ0FBQztJQUMzQyxRQUFRLENBQUMsRUFBRSxnQkFBZ0IsR0FBRyxTQUFTLENBQUM7Q0FDekMifQ==
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"contract_class_metadata.d.ts","sourceRoot":"","sources":["../../src/contract/contract_class_metadata.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACtD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AAE1E,MAAM,WAAW,qBAAqB;IACpC,aAAa,CAAC,EAAE,mBAAmB,GAAG,SAAS,CAAC;IAChD,iCAAiC,EAAE,OAAO,CAAC;IAC3C,QAAQ,CAAC,EAAE,gBAAgB,GAAG,SAAS,CAAC;CACzC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export { };
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
import type { ContractInstanceWithAddress } from './interfaces/contract_instance.js';
|
|
2
|
-
export interface ContractMetadata {
|
|
3
|
-
contractInstance?: ContractInstanceWithAddress | undefined;
|
|
4
|
-
isContractInitialized: boolean;
|
|
5
|
-
isContractPublished: boolean;
|
|
6
|
-
}
|
|
7
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udHJhY3RfbWV0YWRhdGEuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb250cmFjdC9jb250cmFjdF9tZXRhZGF0YS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssRUFBRSwyQkFBMkIsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBRXJGLE1BQU0sV0FBVyxnQkFBZ0I7SUFDL0IsZ0JBQWdCLENBQUMsRUFBRSwyQkFBMkIsR0FBRyxTQUFTLENBQUM7SUFDM0QscUJBQXFCLEVBQUUsT0FBTyxDQUFDO0lBQy9CLG1CQUFtQixFQUFFLE9BQU8sQ0FBQztDQUM5QiJ9
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"contract_metadata.d.ts","sourceRoot":"","sources":["../../src/contract/contract_metadata.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,mCAAmC,CAAC;AAErF,MAAM,WAAW,gBAAgB;IAC/B,gBAAgB,CAAC,EAAE,2BAA2B,GAAG,SAAS,CAAC;IAC3D,qBAAqB,EAAE,OAAO,CAAC;IAC/B,mBAAmB,EAAE,OAAO,CAAC;CAC9B"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export { };
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
import type { ContractArtifact } from '../abi/abi.js';
|
|
2
|
-
import type { ContractClassWithId } from './interfaces/contract_class.js';
|
|
3
|
-
|
|
4
|
-
export interface ContractClassMetadata {
|
|
5
|
-
contractClass?: ContractClassWithId | undefined;
|
|
6
|
-
isContractClassPubliclyRegistered: boolean;
|
|
7
|
-
artifact?: ContractArtifact | undefined;
|
|
8
|
-
}
|