@aztec/stdlib 0.0.1-commit.b2a5d0dd1 → 0.0.1-commit.b3d3157a
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/abi.d.ts +121 -1197
- package/dest/abi/abi.d.ts.map +1 -1
- package/dest/abi/abi.js +31 -16
- package/dest/abi/authorization_selector.d.ts +2 -2
- package/dest/abi/authorization_selector.d.ts.map +1 -1
- package/dest/abi/contract_artifact.d.ts +1 -1
- package/dest/abi/contract_artifact.d.ts.map +1 -1
- package/dest/abi/contract_artifact.js +14 -7
- package/dest/abi/event_selector.d.ts +2 -2
- package/dest/abi/event_selector.d.ts.map +1 -1
- package/dest/abi/function_call.d.ts +7 -25
- package/dest/abi/function_call.d.ts.map +1 -1
- package/dest/abi/note_selector.d.ts +2 -2
- package/dest/abi/note_selector.d.ts.map +1 -1
- package/dest/abi/utils.d.ts +1 -1
- package/dest/abi/utils.d.ts.map +1 -1
- package/dest/abi/utils.js +1 -1
- package/dest/auth_witness/auth_witness.d.ts +2 -2
- package/dest/auth_witness/auth_witness.d.ts.map +1 -1
- package/dest/avm/avm.d.ts +1756 -10463
- package/dest/avm/avm.d.ts.map +1 -1
- package/dest/avm/avm.js +6 -3
- package/dest/avm/avm_accumulated_data.d.ts +22 -86
- package/dest/avm/avm_accumulated_data.d.ts.map +1 -1
- package/dest/avm/avm_circuit_public_inputs.d.ts +180 -932
- package/dest/avm/avm_circuit_public_inputs.d.ts.map +1 -1
- package/dest/avm/avm_proving_request.d.ts +653 -5446
- package/dest/avm/avm_proving_request.d.ts.map +1 -1
- package/dest/avm/message_pack.js +12 -3
- package/dest/avm/public_data_write.d.ts +6 -12
- package/dest/avm/public_data_write.d.ts.map +1 -1
- package/dest/avm/revert_code.d.ts +1 -7
- package/dest/avm/revert_code.d.ts.map +1 -1
- package/dest/avm/revert_code.js +0 -3
- package/dest/aztec-address/index.d.ts +6 -3
- package/dest/aztec-address/index.d.ts.map +1 -1
- package/dest/aztec-address/index.js +7 -2
- package/dest/block/attestation_info.d.ts +3 -2
- package/dest/block/attestation_info.d.ts.map +1 -1
- package/dest/block/attestation_info.js +7 -5
- package/dest/block/block_data.d.ts +9 -34
- package/dest/block/block_data.d.ts.map +1 -1
- package/dest/block/block_parameter.d.ts +37 -4
- package/dest/block/block_parameter.d.ts.map +1 -1
- package/dest/block/block_parameter.js +53 -2
- package/dest/block/in_block.d.ts +5 -24
- package/dest/block/in_block.d.ts.map +1 -1
- package/dest/block/index.d.ts +1 -2
- package/dest/block/index.d.ts.map +1 -1
- package/dest/block/index.js +0 -1
- package/dest/block/l2_block.d.ts +13 -41
- package/dest/block/l2_block.d.ts.map +1 -1
- package/dest/block/l2_block_info.d.ts +7 -27
- package/dest/block/l2_block_info.d.ts.map +1 -1
- package/dest/block/l2_block_source.d.ts +199 -425
- package/dest/block/l2_block_source.d.ts.map +1 -1
- package/dest/block/l2_block_source.js +66 -1
- package/dest/block/l2_block_stream/l2_block_stream.d.ts +2 -2
- package/dest/block/l2_block_stream/l2_block_stream.d.ts.map +1 -1
- package/dest/block/l2_block_stream/l2_block_stream.js +44 -17
- package/dest/block/l2_block_stream/l2_tips_memory_store.d.ts +3 -1
- package/dest/block/l2_block_stream/l2_tips_memory_store.d.ts.map +1 -1
- package/dest/block/l2_block_stream/l2_tips_memory_store.js +3 -0
- package/dest/block/l2_block_stream/l2_tips_store_base.d.ts +4 -1
- package/dest/block/l2_block_stream/l2_tips_store_base.d.ts.map +1 -1
- package/dest/block/l2_block_stream/l2_tips_store_base.js +26 -7
- package/dest/block/proposal/attestations_and_signers.d.ts +19 -30
- package/dest/block/proposal/attestations_and_signers.d.ts.map +1 -1
- package/dest/block/proposal/attestations_and_signers.js +26 -18
- package/dest/block/proposal/committee_attestation.d.ts +6 -12
- package/dest/block/proposal/committee_attestation.d.ts.map +1 -1
- package/dest/block/test/l2_tips_store_test_suite.js +1 -1
- package/dest/checkpoint/checkpoint.d.ts +24 -96
- package/dest/checkpoint/checkpoint.d.ts.map +1 -1
- package/dest/checkpoint/checkpoint_data.d.ts +40 -129
- package/dest/checkpoint/checkpoint_data.d.ts.map +1 -1
- package/dest/checkpoint/checkpoint_data.js +2 -0
- package/dest/checkpoint/checkpoint_info.d.ts +7 -23
- package/dest/checkpoint/checkpoint_info.d.ts.map +1 -1
- package/dest/checkpoint/checkpoint_reexecution_tracker.d.ts +60 -0
- package/dest/checkpoint/checkpoint_reexecution_tracker.d.ts.map +1 -0
- package/dest/checkpoint/checkpoint_reexecution_tracker.js +108 -0
- package/dest/checkpoint/digest.d.ts +18 -0
- package/dest/checkpoint/digest.d.ts.map +1 -0
- package/dest/checkpoint/digest.js +12 -0
- package/dest/checkpoint/index.d.ts +4 -1
- package/dest/checkpoint/index.d.ts.map +1 -1
- package/dest/checkpoint/index.js +3 -0
- package/dest/checkpoint/previous_checkpoint_out_hashes.d.ts +33 -0
- package/dest/checkpoint/previous_checkpoint_out_hashes.d.ts.map +1 -0
- package/dest/checkpoint/previous_checkpoint_out_hashes.js +45 -0
- package/dest/checkpoint/published_checkpoint.d.ts +42 -194
- package/dest/checkpoint/published_checkpoint.d.ts.map +1 -1
- package/dest/config/chain-config.d.ts +4 -9
- package/dest/config/chain-config.d.ts.map +1 -1
- package/dest/config/chain-config.js +6 -11
- package/dest/config/index.d.ts +1 -2
- package/dest/config/index.d.ts.map +1 -1
- package/dest/config/index.js +0 -1
- package/dest/config/sequencer-config.d.ts +5 -3
- package/dest/config/sequencer-config.d.ts.map +1 -1
- package/dest/config/sequencer-config.js +13 -6
- package/dest/contract/complete_address.d.ts +3 -2
- package/dest/contract/complete_address.d.ts.map +1 -1
- package/dest/contract/complete_address.js +6 -2
- package/dest/contract/contract_address.d.ts +5 -5
- package/dest/contract/contract_address.d.ts.map +1 -1
- package/dest/contract/contract_address.js +5 -4
- package/dest/contract/contract_deployment_data.d.ts +15 -61
- package/dest/contract/contract_deployment_data.d.ts.map +1 -1
- package/dest/contract/contract_instance.d.ts +4 -2
- package/dest/contract/contract_instance.d.ts.map +1 -1
- package/dest/contract/contract_instance.js +10 -3
- package/dest/contract/interfaces/contract_class.d.ts +15 -86
- package/dest/contract/interfaces/contract_class.d.ts.map +1 -1
- package/dest/contract/interfaces/contract_instance.d.ts +41 -95
- package/dest/contract/interfaces/contract_instance.d.ts.map +1 -1
- package/dest/contract/interfaces/contract_instance.js +4 -2
- package/dest/contract/interfaces/contract_instance_update.d.ts +6 -26
- package/dest/contract/interfaces/contract_instance_update.d.ts.map +1 -1
- package/dest/contract/interfaces/protocol_contract_addresses.d.ts +2 -12
- package/dest/contract/interfaces/protocol_contract_addresses.d.ts.map +1 -1
- package/dest/database-version/database_version.d.ts +5 -11
- package/dest/database-version/database_version.d.ts.map +1 -1
- package/dest/database-version/version_manager.d.ts +6 -2
- package/dest/database-version/version_manager.d.ts.map +1 -1
- package/dest/database-version/version_manager.js +12 -1
- package/dest/epoch-helpers/index.d.ts +4 -22
- package/dest/epoch-helpers/index.d.ts.map +1 -1
- package/dest/gas/gas.d.ts +9 -14
- package/dest/gas/gas.d.ts.map +1 -1
- package/dest/gas/gas.js +6 -3
- package/dest/gas/gas_fees.d.ts +9 -14
- package/dest/gas/gas_fees.d.ts.map +1 -1
- package/dest/gas/gas_fees.js +7 -3
- package/dest/gas/gas_settings.d.ts +27 -84
- package/dest/gas/gas_settings.d.ts.map +1 -1
- package/dest/gas/gas_settings.js +6 -3
- package/dest/ha-signing/config.d.ts +9 -73
- package/dest/ha-signing/config.d.ts.map +1 -1
- package/dest/ha-signing/config.js +5 -15
- package/dest/ha-signing/local_config.d.ts +3 -34
- package/dest/ha-signing/local_config.d.ts.map +1 -1
- package/dest/ha-signing/local_config.js +2 -2
- package/dest/hash/hash.d.ts +1 -1
- package/dest/hash/hash.d.ts.map +1 -1
- package/dest/hash/hash.js +2 -2
- package/dest/interfaces/allowed_element.d.ts +4 -28
- package/dest/interfaces/allowed_element.d.ts.map +1 -1
- package/dest/interfaces/api_limit.d.ts +1 -1
- package/dest/interfaces/api_limit.js +1 -1
- package/dest/interfaces/archiver.d.ts +16 -36
- package/dest/interfaces/archiver.d.ts.map +1 -1
- package/dest/interfaces/archiver.js +211 -71
- package/dest/interfaces/aztec-node-admin.d.ts +62 -292
- package/dest/interfaces/aztec-node-admin.d.ts.map +1 -1
- package/dest/interfaces/aztec-node-admin.js +57 -14
- package/dest/interfaces/aztec-node-debug.js +4 -1
- package/dest/interfaces/aztec-node.d.ts +100 -106
- package/dest/interfaces/aztec-node.d.ts.map +1 -1
- package/dest/interfaces/aztec-node.js +308 -70
- package/dest/interfaces/block-builder.d.ts +3 -1
- package/dest/interfaces/block-builder.d.ts.map +1 -1
- package/dest/interfaces/block_response.d.ts +90 -0
- package/dest/interfaces/block_response.d.ts.map +1 -0
- package/dest/interfaces/block_response.js +30 -0
- package/dest/interfaces/chain_tips.d.ts +50 -0
- package/dest/interfaces/chain_tips.d.ts.map +1 -0
- package/dest/interfaces/chain_tips.js +11 -0
- package/dest/interfaces/checkpoint_parameter.d.ts +14 -0
- package/dest/interfaces/checkpoint_parameter.d.ts.map +1 -0
- package/dest/interfaces/checkpoint_parameter.js +18 -0
- package/dest/interfaces/checkpoint_response.d.ts +122 -0
- package/dest/interfaces/checkpoint_response.d.ts.map +1 -0
- package/dest/interfaces/checkpoint_response.js +26 -0
- package/dest/interfaces/client.d.ts +7 -2
- package/dest/interfaces/client.d.ts.map +1 -1
- package/dest/interfaces/client.js +6 -1
- package/dest/interfaces/configs.d.ts +41 -130
- package/dest/interfaces/configs.d.ts.map +1 -1
- package/dest/interfaces/configs.js +9 -1
- package/dest/interfaces/l1_publish_info.d.ts +29 -0
- package/dest/interfaces/l1_publish_info.d.ts.map +1 -0
- package/dest/interfaces/l1_publish_info.js +26 -0
- package/dest/interfaces/l2_logs_source.d.ts +14 -36
- package/dest/interfaces/l2_logs_source.d.ts.map +1 -1
- package/dest/interfaces/l2_logs_source.js +5 -0
- package/dest/interfaces/merkle_tree_operations.d.ts +9 -3
- package/dest/interfaces/merkle_tree_operations.d.ts.map +1 -1
- package/dest/interfaces/p2p-bootstrap.js +8 -2
- package/dest/interfaces/p2p.d.ts +15 -5
- package/dest/interfaces/p2p.d.ts.map +1 -1
- package/dest/interfaces/p2p.js +28 -5
- package/dest/interfaces/private_kernel_prover.d.ts +62 -2
- package/dest/interfaces/private_kernel_prover.d.ts.map +1 -1
- package/dest/interfaces/prover-agent.d.ts +5 -23
- package/dest/interfaces/prover-agent.d.ts.map +1 -1
- package/dest/interfaces/prover-agent.js +4 -1
- package/dest/interfaces/prover-client.d.ts +6 -27
- package/dest/interfaces/prover-client.d.ts.map +1 -1
- package/dest/interfaces/prover-node.js +22 -8
- package/dest/interfaces/proving-job-source.js +24 -4
- package/dest/interfaces/proving-job.d.ts +725 -5776
- package/dest/interfaces/proving-job.d.ts.map +1 -1
- package/dest/interfaces/proving-job.js +1 -1
- package/dest/interfaces/public_storage_override.d.ts +22 -0
- package/dest/interfaces/public_storage_override.d.ts.map +1 -0
- package/dest/interfaces/public_storage_override.js +7 -0
- package/dest/interfaces/server.d.ts +6 -1
- package/dest/interfaces/server.d.ts.map +1 -1
- package/dest/interfaces/server.js +5 -0
- package/dest/interfaces/slasher.d.ts +25 -56
- package/dest/interfaces/slasher.d.ts.map +1 -1
- package/dest/interfaces/slasher.js +8 -2
- package/dest/interfaces/tx_provider.d.ts +6 -1
- package/dest/interfaces/tx_provider.d.ts.map +1 -1
- package/dest/interfaces/validator.d.ts +40 -229
- package/dest/interfaces/validator.d.ts.map +1 -1
- package/dest/interfaces/validator.js +5 -0
- package/dest/interfaces/world_state.d.ts +2 -2
- package/dest/interfaces/world_state.d.ts.map +1 -1
- package/dest/kernel/hints/key_validation_request.d.ts +12 -8
- package/dest/kernel/hints/key_validation_request.d.ts.map +1 -1
- package/dest/kernel/hints/key_validation_request.js +20 -18
- package/dest/kernel/index.d.ts +5 -1
- package/dest/kernel/index.d.ts.map +1 -1
- package/dest/kernel/index.js +4 -0
- package/dest/kernel/log_hash.d.ts +6 -2
- package/dest/kernel/log_hash.d.ts.map +1 -1
- package/dest/kernel/log_hash.js +21 -9
- package/dest/kernel/private_circuit_public_inputs.d.ts +2 -2
- package/dest/kernel/private_circuit_public_inputs.d.ts.map +1 -1
- package/dest/kernel/private_kernel_circuit_public_inputs.d.ts +2 -2
- package/dest/kernel/private_kernel_circuit_public_inputs.d.ts.map +1 -1
- package/dest/kernel/private_kernel_init_2_circuit_private_inputs.d.ts +23 -0
- package/dest/kernel/private_kernel_init_2_circuit_private_inputs.d.ts.map +1 -0
- package/dest/kernel/private_kernel_init_2_circuit_private_inputs.js +35 -0
- package/dest/kernel/private_kernel_init_3_circuit_private_inputs.d.ts +24 -0
- package/dest/kernel/private_kernel_init_3_circuit_private_inputs.d.ts.map +1 -0
- package/dest/kernel/private_kernel_init_3_circuit_private_inputs.js +37 -0
- package/dest/kernel/private_kernel_inner_2_circuit_private_inputs.d.ts +16 -0
- package/dest/kernel/private_kernel_inner_2_circuit_private_inputs.d.ts.map +1 -0
- package/dest/kernel/private_kernel_inner_2_circuit_private_inputs.js +23 -0
- package/dest/kernel/private_kernel_inner_3_circuit_private_inputs.d.ts +17 -0
- package/dest/kernel/private_kernel_inner_3_circuit_private_inputs.d.ts.map +1 -0
- package/dest/kernel/private_kernel_inner_3_circuit_private_inputs.js +25 -0
- package/dest/kernel/private_kernel_prover_output.d.ts +3 -29
- package/dest/kernel/private_kernel_prover_output.d.ts.map +1 -1
- package/dest/kernel/private_kernel_tail_circuit_public_inputs.d.ts +9 -6
- package/dest/kernel/private_kernel_tail_circuit_public_inputs.d.ts.map +1 -1
- package/dest/kernel/private_kernel_tail_circuit_public_inputs.js +22 -7
- package/dest/kernel/private_to_avm_accumulated_data.d.ts +25 -69
- package/dest/kernel/private_to_avm_accumulated_data.d.ts.map +1 -1
- package/dest/kernel/private_to_avm_accumulated_data.js +11 -5
- package/dest/kernel/private_to_public_accumulated_data.d.ts +4 -3
- package/dest/kernel/private_to_public_accumulated_data.d.ts.map +1 -1
- package/dest/kernel/private_to_public_accumulated_data.js +6 -3
- package/dest/kernel/private_to_public_kernel_circuit_public_inputs.d.ts +5 -4
- package/dest/kernel/private_to_public_kernel_circuit_public_inputs.d.ts.map +1 -1
- package/dest/kernel/private_to_public_kernel_circuit_public_inputs.js +7 -3
- package/dest/kernel/private_to_rollup_accumulated_data.d.ts +5 -4
- package/dest/kernel/private_to_rollup_accumulated_data.d.ts.map +1 -1
- package/dest/kernel/private_to_rollup_accumulated_data.js +6 -3
- package/dest/kernel/private_to_rollup_kernel_circuit_public_inputs.d.ts +5 -4
- package/dest/kernel/private_to_rollup_kernel_circuit_public_inputs.d.ts.map +1 -1
- package/dest/kernel/private_to_rollup_kernel_circuit_public_inputs.js +7 -3
- package/dest/kernel/public_call_request.d.ts +15 -30
- package/dest/kernel/public_call_request.d.ts.map +1 -1
- package/dest/kernel/public_call_request.js +16 -7
- package/dest/keys/derivation.d.ts +6 -2
- package/dest/keys/derivation.d.ts.map +1 -1
- package/dest/keys/derivation.js +16 -6
- package/dest/keys/public_key.d.ts +22 -3
- package/dest/keys/public_key.d.ts.map +1 -1
- package/dest/keys/public_key.js +20 -1
- package/dest/keys/public_keys.d.ts +55 -82
- package/dest/keys/public_keys.d.ts.map +1 -1
- package/dest/keys/public_keys.js +102 -74
- package/dest/kv-store/config.d.ts +3 -6
- package/dest/kv-store/config.d.ts.map +1 -1
- package/dest/kv-store/config.js +2 -7
- package/dest/logs/app_tagging_secret.d.ts +46 -0
- package/dest/logs/app_tagging_secret.d.ts.map +1 -0
- package/dest/logs/{extended_directional_app_tagging_secret.js → app_tagging_secret.js} +51 -21
- package/dest/logs/app_tagging_secret_kind.d.ts +7 -0
- package/dest/logs/app_tagging_secret_kind.d.ts.map +1 -0
- package/dest/logs/app_tagging_secret_kind.js +17 -0
- package/dest/logs/contract_class_log.d.ts +16 -34
- package/dest/logs/contract_class_log.d.ts.map +1 -1
- package/dest/logs/contract_class_log.js +11 -9
- package/dest/logs/index.d.ts +7 -7
- package/dest/logs/index.d.ts.map +1 -1
- package/dest/logs/index.js +6 -6
- package/dest/logs/log_cursor.d.ts +51 -0
- package/dest/logs/log_cursor.d.ts.map +1 -0
- package/dest/logs/log_cursor.js +82 -0
- package/dest/logs/log_result.d.ts +54 -0
- package/dest/logs/log_result.d.ts.map +1 -0
- package/dest/logs/log_result.js +56 -0
- package/dest/logs/logs_query.d.ts +82 -0
- package/dest/logs/logs_query.d.ts.map +1 -0
- package/dest/logs/logs_query.js +50 -0
- package/dest/logs/message_context.d.ts +3 -2
- package/dest/logs/message_context.d.ts.map +1 -1
- package/dest/logs/message_context.js +4 -0
- package/dest/logs/pre_tag.d.ts +11 -24
- package/dest/logs/pre_tag.d.ts.map +1 -1
- package/dest/logs/pre_tag.js +2 -2
- package/dest/logs/private_log.d.ts +7 -12
- package/dest/logs/private_log.d.ts.map +1 -1
- package/dest/logs/private_log.js +6 -3
- package/dest/logs/query_all_logs_by_tags.d.ts +24 -0
- package/dest/logs/query_all_logs_by_tags.d.ts.map +1 -0
- package/dest/logs/query_all_logs_by_tags.js +64 -0
- package/dest/logs/siloed_tag.d.ts +1 -1
- package/dest/logs/siloed_tag.d.ts.map +1 -1
- package/dest/logs/siloed_tag.js +3 -1
- package/dest/logs/tagging_index_range.d.ts +13 -31
- package/dest/logs/tagging_index_range.d.ts.map +1 -1
- package/dest/logs/tagging_index_range.js +2 -2
- package/dest/messaging/append_l1_to_l2_messages.d.ts +9 -0
- package/dest/messaging/append_l1_to_l2_messages.d.ts.map +1 -0
- package/dest/messaging/append_l1_to_l2_messages.js +12 -0
- package/dest/messaging/index.d.ts +2 -1
- package/dest/messaging/index.d.ts.map +1 -1
- package/dest/messaging/index.js +1 -0
- package/dest/messaging/l2_to_l1_membership.d.ts +43 -6
- package/dest/messaging/l2_to_l1_membership.d.ts.map +1 -1
- package/dest/messaging/l2_to_l1_membership.js +72 -12
- package/dest/messaging/l2_to_l1_message.d.ts +38 -112
- package/dest/messaging/l2_to_l1_message.d.ts.map +1 -1
- package/dest/messaging/l2_to_l1_message.js +21 -12
- package/dest/noir/index.d.ts +3 -1
- package/dest/noir/index.d.ts.map +1 -1
- package/dest/note/note.d.ts +2 -2
- package/dest/note/note.d.ts.map +1 -1
- package/dest/p2p/block_proposal.d.ts +29 -10
- package/dest/p2p/block_proposal.d.ts.map +1 -1
- package/dest/p2p/block_proposal.js +56 -33
- package/dest/p2p/checkpoint_attestation.d.ts +14 -6
- package/dest/p2p/checkpoint_attestation.d.ts.map +1 -1
- package/dest/p2p/checkpoint_attestation.js +24 -20
- package/dest/p2p/checkpoint_proposal.d.ts +31 -10
- package/dest/p2p/checkpoint_proposal.d.ts.map +1 -1
- package/dest/p2p/checkpoint_proposal.js +58 -31
- package/dest/p2p/consensus_payload.d.ts +26 -20
- package/dest/p2p/consensus_payload.d.ts.map +1 -1
- package/dest/p2p/consensus_payload.js +38 -19
- package/dest/p2p/signature_utils.d.ts +28 -19
- package/dest/p2p/signature_utils.d.ts.map +1 -1
- package/dest/p2p/signature_utils.js +118 -21
- package/dest/p2p/signed_txs.d.ts +15 -13
- package/dest/p2p/signed_txs.d.ts.map +1 -1
- package/dest/p2p/signed_txs.js +26 -24
- package/dest/parity/parity_base_private_inputs.d.ts +8 -4
- package/dest/parity/parity_base_private_inputs.d.ts.map +1 -1
- package/dest/parity/parity_base_private_inputs.js +7 -5
- package/dest/parity/parity_public_inputs.d.ts +8 -4
- package/dest/parity/parity_public_inputs.d.ts.map +1 -1
- package/dest/parity/parity_public_inputs.js +6 -3
- package/dest/parity/parity_root_private_inputs.d.ts +2 -2
- package/dest/parity/parity_root_private_inputs.d.ts.map +1 -1
- package/dest/proofs/chonk_proof.d.ts +17 -11
- package/dest/proofs/chonk_proof.d.ts.map +1 -1
- package/dest/proofs/chonk_proof.js +44 -22
- package/dest/proofs/recursive_proof.d.ts +2 -2
- package/dest/proofs/recursive_proof.d.ts.map +1 -1
- package/dest/rollup/block_merge_rollup_private_inputs.d.ts +2 -2
- package/dest/rollup/block_merge_rollup_private_inputs.d.ts.map +1 -1
- package/dest/rollup/block_rollup_public_inputs.d.ts +12 -2
- package/dest/rollup/block_rollup_public_inputs.d.ts.map +1 -1
- package/dest/rollup/block_rollup_public_inputs.js +12 -0
- package/dest/rollup/block_root_rollup_private_inputs.d.ts +6 -6
- package/dest/rollup/block_root_rollup_private_inputs.d.ts.map +1 -1
- package/dest/rollup/checkpoint_merge_rollup_private_inputs.d.ts +2 -2
- package/dest/rollup/checkpoint_merge_rollup_private_inputs.d.ts.map +1 -1
- package/dest/rollup/checkpoint_rollup_public_inputs.d.ts +9 -2
- package/dest/rollup/checkpoint_rollup_public_inputs.d.ts.map +1 -1
- package/dest/rollup/checkpoint_rollup_public_inputs.js +9 -0
- package/dest/rollup/checkpoint_root_rollup_private_inputs.d.ts +5 -5
- package/dest/rollup/checkpoint_root_rollup_private_inputs.d.ts.map +1 -1
- package/dest/rollup/private_tx_base_rollup_private_inputs.d.ts +2 -2
- package/dest/rollup/private_tx_base_rollup_private_inputs.d.ts.map +1 -1
- package/dest/rollup/public_chonk_verifier_private_inputs.d.ts +2 -2
- package/dest/rollup/public_chonk_verifier_private_inputs.d.ts.map +1 -1
- package/dest/rollup/public_chonk_verifier_public_inputs.d.ts +2 -2
- package/dest/rollup/public_chonk_verifier_public_inputs.d.ts.map +1 -1
- package/dest/rollup/public_tx_base_rollup_private_inputs.d.ts +2 -2
- package/dest/rollup/public_tx_base_rollup_private_inputs.d.ts.map +1 -1
- package/dest/rollup/root_rollup_private_inputs.d.ts +2 -2
- package/dest/rollup/root_rollup_private_inputs.d.ts.map +1 -1
- package/dest/rollup/root_rollup_public_inputs.d.ts +2 -2
- package/dest/rollup/root_rollup_public_inputs.d.ts.map +1 -1
- package/dest/rollup/tx_merge_rollup_private_inputs.d.ts +2 -2
- package/dest/rollup/tx_merge_rollup_private_inputs.d.ts.map +1 -1
- package/dest/rollup/tx_rollup_public_inputs.d.ts +2 -2
- package/dest/rollup/tx_rollup_public_inputs.d.ts.map +1 -1
- package/dest/schemas/schemas.d.ts +32 -78
- package/dest/schemas/schemas.d.ts.map +1 -1
- package/dest/schemas/schemas.js +2 -2
- package/dest/slashing/helpers.d.ts +2 -2
- package/dest/slashing/helpers.d.ts.map +1 -1
- package/dest/slashing/helpers.js +10 -7
- package/dest/slashing/types.d.ts +15 -23
- package/dest/slashing/types.d.ts.map +1 -1
- package/dest/slashing/types.js +16 -10
- package/dest/snapshots/types.d.ts +15 -78
- package/dest/snapshots/types.d.ts.map +1 -1
- package/dest/stats/stats.d.ts +2 -2
- package/dest/stats/stats.d.ts.map +1 -1
- package/dest/tests/factories.d.ts +23 -23
- package/dest/tests/factories.d.ts.map +1 -1
- package/dest/tests/factories.js +70 -47
- package/dest/tests/mocks.d.ts +8 -5
- package/dest/tests/mocks.d.ts.map +1 -1
- package/dest/tests/mocks.js +31 -38
- package/dest/timetable/index.d.ts +7 -10
- package/dest/timetable/index.d.ts.map +1 -1
- package/dest/timetable/index.js +60 -80
- package/dest/trees/append_only_tree_snapshot.d.ts +9 -14
- package/dest/trees/append_only_tree_snapshot.d.ts.map +1 -1
- package/dest/trees/append_only_tree_snapshot.js +6 -3
- package/dest/trees/nullifier_leaf.d.ts +18 -42
- package/dest/trees/nullifier_leaf.d.ts.map +1 -1
- package/dest/trees/nullifier_membership_witness.d.ts +16 -59
- package/dest/trees/nullifier_membership_witness.d.ts.map +1 -1
- package/dest/trees/nullifier_membership_witness.js +2 -14
- package/dest/trees/public_data_leaf.d.ts +21 -53
- package/dest/trees/public_data_leaf.d.ts.map +1 -1
- package/dest/trees/public_data_witness.d.ts +16 -58
- package/dest/trees/public_data_witness.d.ts.map +1 -1
- package/dest/tx/block_header.d.ts +4 -3
- package/dest/tx/block_header.d.ts.map +1 -1
- package/dest/tx/block_header.js +6 -3
- package/dest/tx/call_context.d.ts +4 -14
- package/dest/tx/call_context.d.ts.map +1 -1
- package/dest/tx/capsule.d.ts +2 -2
- package/dest/tx/capsule.d.ts.map +1 -1
- package/dest/tx/function_data.d.ts +4 -10
- package/dest/tx/function_data.d.ts.map +1 -1
- package/dest/tx/global_variables.d.ts +16 -49
- package/dest/tx/global_variables.d.ts.map +1 -1
- package/dest/tx/global_variables.js +8 -12
- package/dest/tx/hashed_values.d.ts +4 -3
- package/dest/tx/hashed_values.d.ts.map +1 -1
- package/dest/tx/hashed_values.js +6 -3
- package/dest/tx/in_tx.d.ts +5 -17
- package/dest/tx/in_tx.d.ts.map +1 -1
- package/dest/tx/indexed_tx_effect.d.ts +8 -19
- package/dest/tx/indexed_tx_effect.d.ts.map +1 -1
- package/dest/tx/indexed_tx_effect.js +8 -4
- package/dest/tx/partial_state_reference.d.ts +22 -65
- package/dest/tx/partial_state_reference.d.ts.map +1 -1
- package/dest/tx/partial_state_reference.js +6 -3
- package/dest/tx/private_execution_result.d.ts +6 -16
- package/dest/tx/private_execution_result.d.ts.map +1 -1
- package/dest/tx/profiling.d.ts +54 -352
- package/dest/tx/profiling.d.ts.map +1 -1
- package/dest/tx/profiling.js +4 -4
- package/dest/tx/protocol_contracts.d.ts +5 -9
- package/dest/tx/protocol_contracts.d.ts.map +1 -1
- package/dest/tx/proven_tx.d.ts +30 -74
- package/dest/tx/proven_tx.d.ts.map +1 -1
- package/dest/tx/proven_tx.js +6 -0
- package/dest/tx/public_call_request_with_calldata.d.ts +4 -3
- package/dest/tx/public_call_request_with_calldata.d.ts.map +1 -1
- package/dest/tx/public_call_request_with_calldata.js +6 -3
- package/dest/tx/simulated_tx.d.ts +62 -1249
- package/dest/tx/simulated_tx.d.ts.map +1 -1
- package/dest/tx/simulated_tx.js +12 -10
- package/dest/tx/state_reference.d.ts +30 -117
- package/dest/tx/state_reference.d.ts.map +1 -1
- package/dest/tx/state_reference.js +6 -4
- package/dest/tx/tree_snapshots.d.ts +27 -84
- package/dest/tx/tree_snapshots.d.ts.map +1 -1
- package/dest/tx/tree_snapshots.js +6 -4
- package/dest/tx/tx.d.ts +12 -11
- package/dest/tx/tx.d.ts.map +1 -1
- package/dest/tx/tx.js +30 -23
- package/dest/tx/tx_constant_data.d.ts +4 -3
- package/dest/tx/tx_constant_data.d.ts.map +1 -1
- package/dest/tx/tx_constant_data.js +6 -3
- package/dest/tx/tx_context.d.ts +32 -131
- package/dest/tx/tx_context.d.ts.map +1 -1
- package/dest/tx/tx_context.js +6 -6
- package/dest/tx/tx_hash.d.ts +6 -4
- package/dest/tx/tx_hash.d.ts.map +1 -1
- package/dest/tx/tx_hash.js +13 -5
- package/dest/tx/tx_receipt.d.ts +144 -67
- package/dest/tx/tx_receipt.d.ts.map +1 -1
- package/dest/tx/tx_receipt.js +141 -51
- package/dest/tx/validator/tx_validator.d.ts +5 -27
- package/dest/tx/validator/tx_validator.d.ts.map +1 -1
- package/dest/tx/validator/tx_validator.js +0 -4
- package/dest/types/shared.d.ts +4 -3
- package/dest/types/shared.d.ts.map +1 -1
- package/dest/types/shared.js +6 -3
- package/dest/update-checker/dev_version.d.ts +3 -0
- package/dest/update-checker/dev_version.d.ts.map +1 -0
- package/dest/update-checker/dev_version.js +1 -0
- package/dest/update-checker/index.d.ts +2 -1
- package/dest/update-checker/index.d.ts.map +1 -1
- package/dest/update-checker/index.js +1 -0
- package/dest/update-checker/package_version.d.ts +6 -3
- package/dest/update-checker/package_version.d.ts.map +1 -1
- package/dest/update-checker/package_version.js +8 -19
- package/dest/validators/schemas.d.ts +147 -614
- package/dest/validators/schemas.d.ts.map +1 -1
- package/dest/validators/schemas.js +6 -4
- package/dest/validators/types.d.ts +20 -3
- package/dest/validators/types.d.ts.map +1 -1
- package/dest/versioning/versioning.js +1 -1
- package/dest/vks/verification_key.d.ts +3 -3
- package/dest/vks/verification_key.d.ts.map +1 -1
- package/dest/world-state/genesis_data.d.ts +3 -1
- package/dest/world-state/genesis_data.d.ts.map +1 -1
- package/dest/world-state/genesis_data.js +3 -0
- package/dest/world-state/world_state_revision.d.ts +4 -39
- package/dest/world-state/world_state_revision.d.ts.map +1 -1
- package/dest/world-state/world_state_revision.js +0 -20
- package/package.json +12 -11
- package/src/abi/abi.ts +53 -19
- package/src/abi/contract_artifact.ts +11 -6
- package/src/abi/utils.ts +6 -4
- package/src/avm/avm.ts +5 -0
- package/src/avm/message_pack.ts +12 -3
- package/src/avm/revert_code.ts +0 -6
- package/src/aztec-address/index.ts +12 -3
- package/src/block/attestation_info.ts +11 -11
- package/src/block/block_parameter.ts +72 -4
- package/src/block/index.ts +0 -1
- package/src/block/l2_block_source.ts +201 -149
- package/src/block/l2_block_stream/l2_block_stream.ts +39 -28
- package/src/block/l2_block_stream/l2_tips_memory_store.ts +5 -0
- package/src/block/l2_block_stream/l2_tips_store_base.ts +29 -7
- package/src/block/proposal/attestations_and_signers.ts +32 -17
- package/src/block/test/l2_tips_store_test_suite.ts +1 -1
- package/src/checkpoint/checkpoint_data.ts +4 -0
- package/src/checkpoint/checkpoint_reexecution_tracker.ts +167 -0
- package/src/checkpoint/digest.ts +28 -0
- package/src/checkpoint/index.ts +3 -0
- package/src/checkpoint/previous_checkpoint_out_hashes.ts +61 -0
- package/src/config/chain-config.ts +6 -15
- package/src/config/index.ts +0 -1
- package/src/config/sequencer-config.ts +25 -7
- package/src/contract/complete_address.ts +7 -3
- package/src/contract/contract_address.ts +6 -6
- package/src/contract/contract_instance.ts +11 -2
- package/src/contract/interfaces/contract_instance.ts +6 -2
- package/src/database-version/version_manager.ts +17 -0
- package/src/gas/gas.ts +8 -3
- package/src/gas/gas_fees.ts +9 -9
- package/src/gas/gas_settings.ts +8 -3
- package/src/ha-signing/config.ts +9 -16
- package/src/ha-signing/local_config.ts +2 -2
- package/src/hash/hash.ts +2 -2
- package/src/interfaces/api_limit.ts +1 -1
- package/src/interfaces/archiver.ts +80 -94
- package/src/interfaces/aztec-node-admin.ts +32 -15
- package/src/interfaces/aztec-node-debug.ts +1 -1
- package/src/interfaces/aztec-node.ts +296 -262
- package/src/interfaces/block-builder.ts +2 -0
- package/src/interfaces/block_response.ts +92 -0
- package/src/interfaces/chain_tips.ts +24 -0
- package/src/interfaces/checkpoint_parameter.ts +20 -0
- package/src/interfaces/checkpoint_response.ts +84 -0
- package/src/interfaces/client.ts +6 -1
- package/src/interfaces/configs.ts +40 -1
- package/src/interfaces/l1_publish_info.ts +40 -0
- package/src/interfaces/l2_logs_source.ts +13 -42
- package/src/interfaces/merkle_tree_operations.ts +9 -2
- package/src/interfaces/p2p-bootstrap.ts +2 -2
- package/src/interfaces/p2p.ts +35 -15
- package/src/interfaces/private_kernel_prover.ts +88 -0
- package/src/interfaces/prover-agent.ts +1 -1
- package/src/interfaces/prover-node.ts +7 -7
- package/src/interfaces/proving-job-source.ts +4 -4
- package/src/interfaces/proving-job.ts +3 -3
- package/src/interfaces/public_storage_override.ts +26 -0
- package/src/interfaces/server.ts +5 -0
- package/src/interfaces/slasher.ts +17 -4
- package/src/interfaces/tx_provider.ts +6 -0
- package/src/interfaces/validator.ts +18 -2
- package/src/interfaces/world_state.ts +1 -1
- package/src/kernel/hints/key_validation_request.ts +18 -16
- package/src/kernel/index.ts +4 -0
- package/src/kernel/log_hash.ts +29 -9
- package/src/kernel/private_kernel_init_2_circuit_private_inputs.ts +49 -0
- package/src/kernel/private_kernel_init_3_circuit_private_inputs.ts +52 -0
- package/src/kernel/private_kernel_inner_2_circuit_private_inputs.ts +29 -0
- package/src/kernel/private_kernel_inner_3_circuit_private_inputs.ts +31 -0
- package/src/kernel/private_kernel_tail_circuit_public_inputs.ts +29 -14
- package/src/kernel/private_to_avm_accumulated_data.ts +16 -5
- package/src/kernel/private_to_public_accumulated_data.ts +9 -3
- package/src/kernel/private_to_public_kernel_circuit_public_inputs.ts +10 -4
- package/src/kernel/private_to_rollup_accumulated_data.ts +8 -3
- package/src/kernel/private_to_rollup_kernel_circuit_public_inputs.ts +9 -9
- package/src/kernel/public_call_request.ts +22 -7
- package/src/keys/derivation.ts +21 -9
- package/src/keys/public_key.ts +26 -2
- package/src/keys/public_keys.ts +124 -110
- package/src/kv-store/config.ts +3 -10
- package/src/logs/{extended_directional_app_tagging_secret.ts → app_tagging_secret.ts} +62 -23
- package/src/logs/app_tagging_secret_kind.ts +21 -0
- package/src/logs/contract_class_log.ts +15 -5
- package/src/logs/index.ts +6 -6
- package/src/logs/log_cursor.ts +110 -0
- package/src/logs/log_result.ts +104 -0
- package/src/logs/logs_query.ts +138 -0
- package/src/logs/message_context.ts +5 -1
- package/src/logs/pre_tag.ts +3 -6
- package/src/logs/private_log.ts +9 -3
- package/src/logs/query_all_logs_by_tags.ts +98 -0
- package/src/logs/siloed_tag.ts +6 -1
- package/src/logs/tagging_index_range.ts +4 -10
- package/src/messaging/append_l1_to_l2_messages.ts +21 -0
- package/src/messaging/index.ts +1 -0
- package/src/messaging/l2_to_l1_membership.ts +108 -19
- package/src/messaging/l2_to_l1_message.ts +29 -9
- package/src/noir/index.ts +2 -0
- package/src/p2p/block_proposal.ts +99 -28
- package/src/p2p/checkpoint_attestation.ts +26 -26
- package/src/p2p/checkpoint_proposal.ts +109 -39
- package/src/p2p/consensus_payload.ts +59 -28
- package/src/p2p/signature_utils.ts +110 -25
- package/src/p2p/signed_txs.ts +46 -28
- package/src/parity/parity_base_private_inputs.ts +10 -4
- package/src/parity/parity_public_inputs.ts +9 -2
- package/src/proofs/chonk_proof.ts +49 -15
- package/src/rollup/block_rollup_public_inputs.ts +13 -0
- package/src/rollup/checkpoint_rollup_public_inputs.ts +10 -0
- package/src/schemas/schemas.ts +6 -1
- package/src/slashing/helpers.ts +13 -9
- package/src/slashing/types.ts +21 -14
- package/src/stats/stats.ts +4 -0
- package/src/tests/factories.ts +97 -68
- package/src/tests/mocks.ts +49 -57
- package/src/timetable/index.ts +63 -105
- package/src/trees/append_only_tree_snapshot.ts +8 -3
- package/src/trees/nullifier_membership_witness.ts +2 -12
- package/src/tx/block_header.ts +8 -3
- package/src/tx/global_variables.ts +10 -18
- package/src/tx/hashed_values.ts +8 -3
- package/src/tx/indexed_tx_effect.ts +17 -4
- package/src/tx/partial_state_reference.ts +8 -3
- package/src/tx/profiling.ts +4 -4
- package/src/tx/proven_tx.ts +6 -0
- package/src/tx/public_call_request_with_calldata.ts +8 -3
- package/src/tx/simulated_tx.ts +18 -21
- package/src/tx/state_reference.ts +9 -4
- package/src/tx/tree_snapshots.ts +9 -4
- package/src/tx/tx.ts +41 -22
- package/src/tx/tx_constant_data.ts +8 -3
- package/src/tx/tx_context.ts +8 -3
- package/src/tx/tx_hash.ts +20 -5
- package/src/tx/tx_receipt.ts +263 -80
- package/src/tx/validator/tx_validator.ts +1 -5
- package/src/types/shared.ts +8 -3
- package/src/update-checker/dev_version.ts +2 -0
- package/src/update-checker/index.ts +1 -0
- package/src/update-checker/package_version.ts +10 -23
- package/src/validators/schemas.ts +6 -4
- package/src/validators/types.ts +21 -2
- package/src/versioning/versioning.ts +1 -1
- package/src/world-state/genesis_data.ts +12 -0
- package/src/world-state/world_state_revision.ts +0 -33
- package/dest/block/checkpointed_l2_block.d.ts +0 -150
- package/dest/block/checkpointed_l2_block.d.ts.map +0 -1
- package/dest/block/checkpointed_l2_block.js +0 -46
- package/dest/config/pipelining-config.d.ts +0 -19
- package/dest/config/pipelining-config.d.ts.map +0 -1
- package/dest/config/pipelining-config.js +0 -18
- package/dest/interfaces/get_logs_response.d.ts +0 -97
- package/dest/interfaces/get_logs_response.d.ts.map +0 -1
- package/dest/interfaces/get_logs_response.js +0 -12
- package/dest/logs/extended_contract_class_log.d.ts +0 -51
- package/dest/logs/extended_contract_class_log.d.ts.map +0 -1
- package/dest/logs/extended_contract_class_log.js +0 -67
- package/dest/logs/extended_directional_app_tagging_secret.d.ts +0 -47
- package/dest/logs/extended_directional_app_tagging_secret.d.ts.map +0 -1
- package/dest/logs/extended_public_log.d.ts +0 -106
- package/dest/logs/extended_public_log.d.ts.map +0 -1
- package/dest/logs/extended_public_log.js +0 -73
- package/dest/logs/log_filter.d.ts +0 -25
- package/dest/logs/log_filter.d.ts.map +0 -1
- package/dest/logs/log_filter.js +0 -12
- package/dest/logs/log_id.d.ts +0 -85
- package/dest/logs/log_id.d.ts.map +0 -1
- package/dest/logs/log_id.js +0 -93
- package/dest/logs/tx_scoped_l2_log.d.ts +0 -51
- package/dest/logs/tx_scoped_l2_log.d.ts.map +0 -1
- package/dest/logs/tx_scoped_l2_log.js +0 -77
- package/src/block/checkpointed_l2_block.ts +0 -70
- package/src/config/pipelining-config.ts +0 -31
- package/src/interfaces/get_logs_response.ts +0 -35
- package/src/logs/extended_contract_class_log.ts +0 -87
- package/src/logs/extended_public_log.ts +0 -94
- package/src/logs/log_filter.ts +0 -36
- package/src/logs/log_id.ts +0 -124
- package/src/logs/tx_scoped_l2_log.ts +0 -114
|
@@ -17,10 +17,7 @@ export class L2BlockStream {
|
|
|
17
17
|
private hasStarted = false;
|
|
18
18
|
|
|
19
19
|
constructor(
|
|
20
|
-
private l2BlockSource: Pick<
|
|
21
|
-
L2BlockSource,
|
|
22
|
-
'getBlocks' | 'getBlockHeader' | 'getL2Tips' | 'getCheckpoints' | 'getCheckpointedBlocks'
|
|
23
|
-
>,
|
|
20
|
+
private l2BlockSource: Pick<L2BlockSource, 'getBlocks' | 'getBlockData' | 'getL2Tips' | 'getCheckpoints'>,
|
|
24
21
|
private localData: L2BlockStreamLocalDataProvider,
|
|
25
22
|
private handler: L2BlockStreamEventHandler,
|
|
26
23
|
private readonly log = createLogger('types:block_stream'),
|
|
@@ -77,6 +74,22 @@ export class L2BlockStream {
|
|
|
77
74
|
let latestBlockNumber = localTips.proposed.number;
|
|
78
75
|
const sourceCache = new BlockHashCache([sourceTips.proposed]);
|
|
79
76
|
while (!(await this.areBlockHashesEqualAt(latestBlockNumber, { sourceCache }))) {
|
|
77
|
+
if (latestBlockNumber === 0) {
|
|
78
|
+
// We walked all the way back to genesis and the hashes still differ. This means the
|
|
79
|
+
// local store and the source disagree on the genesis block itself — typically because
|
|
80
|
+
// they were configured with different `genesisTimestamp`/prefilled state. Continuing
|
|
81
|
+
// would underflow into negative block numbers and surface as "block hash not found
|
|
82
|
+
// for -1" further down. Fail loudly with a meaningful error instead.
|
|
83
|
+
this.log.error(`Genesis block hash mismatch between local store and source`, {
|
|
84
|
+
localBlockHash: await this.localData.getL2BlockHash(BlockNumber.ZERO),
|
|
85
|
+
sourceBlockHash: sourceCache.get(0) ?? (await this.getBlockHashFromSource(BlockNumber.ZERO)),
|
|
86
|
+
});
|
|
87
|
+
throw new Error(
|
|
88
|
+
'Genesis block hash mismatch between local store and source: refusing to walk past block 0. ' +
|
|
89
|
+
'This usually indicates the two sides were configured with different genesis values ' +
|
|
90
|
+
'(e.g. genesisTimestamp or prefilled public data).',
|
|
91
|
+
);
|
|
92
|
+
}
|
|
80
93
|
latestBlockNumber--;
|
|
81
94
|
}
|
|
82
95
|
|
|
@@ -97,8 +110,9 @@ export class L2BlockStream {
|
|
|
97
110
|
}
|
|
98
111
|
|
|
99
112
|
// If we are just starting, use the starting block number from the options.
|
|
100
|
-
|
|
101
|
-
|
|
113
|
+
const startingBlock = this.opts.startingBlock !== undefined ? BlockNumber(this.opts.startingBlock) : undefined;
|
|
114
|
+
if (latestBlockNumber === 0 && startingBlock !== undefined) {
|
|
115
|
+
latestBlockNumber = BlockNumber(Math.max(startingBlock - 1, 0));
|
|
102
116
|
}
|
|
103
117
|
|
|
104
118
|
// Only log this entry once (for sanity)
|
|
@@ -112,21 +126,18 @@ export class L2BlockStream {
|
|
|
112
126
|
|
|
113
127
|
// When startingBlock is set, also skip ahead for checkpoints.
|
|
114
128
|
if (
|
|
115
|
-
|
|
116
|
-
|
|
129
|
+
startingBlock !== undefined &&
|
|
130
|
+
startingBlock >= 1 &&
|
|
117
131
|
nextCheckpointToEmit <= sourceTips.checkpointed.checkpoint.number
|
|
118
132
|
) {
|
|
119
|
-
|
|
120
|
-
BlockNumber(this.opts.startingBlock),
|
|
121
|
-
1,
|
|
122
|
-
);
|
|
123
|
-
if (startingBlockCheckpoints.length > 0) {
|
|
124
|
-
nextCheckpointToEmit = CheckpointNumber(
|
|
125
|
-
Math.max(nextCheckpointToEmit, startingBlockCheckpoints[0].checkpointNumber),
|
|
126
|
-
);
|
|
127
|
-
} else {
|
|
133
|
+
if (startingBlock > sourceTips.checkpointed.block.number) {
|
|
128
134
|
// startingBlock is past all checkpointed blocks; skip Loop 1 entirely.
|
|
129
135
|
nextCheckpointToEmit = CheckpointNumber(sourceTips.checkpointed.checkpoint.number + 1);
|
|
136
|
+
} else {
|
|
137
|
+
const startingBlockData = await this.l2BlockSource.getBlockData({ number: startingBlock });
|
|
138
|
+
if (startingBlockData) {
|
|
139
|
+
nextCheckpointToEmit = CheckpointNumber(Math.max(nextCheckpointToEmit, startingBlockData.checkpointNumber));
|
|
140
|
+
}
|
|
130
141
|
}
|
|
131
142
|
}
|
|
132
143
|
|
|
@@ -149,7 +160,7 @@ export class L2BlockStream {
|
|
|
149
160
|
if (!this.opts.ignoreCheckpoints) {
|
|
150
161
|
let loop1Iterations = 0;
|
|
151
162
|
while (nextCheckpointToEmit <= sourceTips.checkpointed.checkpoint.number) {
|
|
152
|
-
const checkpoints = await this.l2BlockSource.getCheckpoints(nextCheckpointToEmit, 1);
|
|
163
|
+
const checkpoints = await this.l2BlockSource.getCheckpoints({ from: nextCheckpointToEmit, limit: 1 });
|
|
153
164
|
if (checkpoints.length === 0) {
|
|
154
165
|
break;
|
|
155
166
|
}
|
|
@@ -184,9 +195,9 @@ export class L2BlockStream {
|
|
|
184
195
|
|
|
185
196
|
// Find the starting checkpoint number
|
|
186
197
|
if (nextBlockNumber <= sourceTips.checkpointed.block.number) {
|
|
187
|
-
const
|
|
188
|
-
if (
|
|
189
|
-
nextCheckpointNumber =
|
|
198
|
+
const blockData = await this.l2BlockSource.getBlockData({ number: BlockNumber(nextBlockNumber) });
|
|
199
|
+
if (blockData) {
|
|
200
|
+
nextCheckpointNumber = blockData.checkpointNumber;
|
|
190
201
|
}
|
|
191
202
|
}
|
|
192
203
|
|
|
@@ -194,7 +205,10 @@ export class L2BlockStream {
|
|
|
194
205
|
// Refill the prefetch buffer when exhausted
|
|
195
206
|
if (prefetchIdx >= prefetchedCheckpoints.length) {
|
|
196
207
|
const prefetchLimit = this.opts.checkpointPrefetchLimit ?? CHECKPOINT_PREFETCH_LIMIT;
|
|
197
|
-
prefetchedCheckpoints = await this.l2BlockSource.getCheckpoints(
|
|
208
|
+
prefetchedCheckpoints = await this.l2BlockSource.getCheckpoints({
|
|
209
|
+
from: nextCheckpointNumber,
|
|
210
|
+
limit: prefetchLimit,
|
|
211
|
+
});
|
|
198
212
|
prefetchIdx = 0;
|
|
199
213
|
if (prefetchedCheckpoints.length === 0) {
|
|
200
214
|
break;
|
|
@@ -234,7 +248,7 @@ export class L2BlockStream {
|
|
|
234
248
|
while (nextBlockNumber <= sourceTips.proposed.number) {
|
|
235
249
|
const limit = Math.min(this.opts.batchSize ?? 50, sourceTips.proposed.number - nextBlockNumber + 1);
|
|
236
250
|
this.log.trace(`Requesting blocks from ${nextBlockNumber} limit ${limit}`);
|
|
237
|
-
const blocks = await this.l2BlockSource.getBlocks(BlockNumber(nextBlockNumber),
|
|
251
|
+
const blocks = await this.l2BlockSource.getBlocks({ from: BlockNumber(nextBlockNumber), limit });
|
|
238
252
|
if (blocks.length === 0) {
|
|
239
253
|
break;
|
|
240
254
|
}
|
|
@@ -266,9 +280,6 @@ export class L2BlockStream {
|
|
|
266
280
|
* @param args - A cache of data already requested from source, to avoid re-requesting it.
|
|
267
281
|
*/
|
|
268
282
|
private async areBlockHashesEqualAt(blockNumber: BlockNumber, args: { sourceCache: BlockHashCache }) {
|
|
269
|
-
if (blockNumber === 0) {
|
|
270
|
-
return true;
|
|
271
|
-
}
|
|
272
283
|
const localBlockHash = await this.localData.getL2BlockHash(blockNumber);
|
|
273
284
|
if (!localBlockHash && this.opts.skipFinalized) {
|
|
274
285
|
// Failing to find a block hash when skipping finalized blocks can be highly problematic as we'd potentially need
|
|
@@ -291,8 +302,8 @@ export class L2BlockStream {
|
|
|
291
302
|
|
|
292
303
|
private getBlockHashFromSource(blockNumber: BlockNumber) {
|
|
293
304
|
return this.l2BlockSource
|
|
294
|
-
.
|
|
295
|
-
.then(
|
|
305
|
+
.getBlockData({ number: blockNumber })
|
|
306
|
+
.then(d => d?.header.hash())
|
|
296
307
|
.then(hash => hash?.toString());
|
|
297
308
|
}
|
|
298
309
|
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { BlockNumber, CheckpointNumber } from '@aztec/foundation/branded-types';
|
|
2
2
|
|
|
3
3
|
import type { PublishedCheckpoint } from '../../checkpoint/published_checkpoint.js';
|
|
4
|
+
import type { BlockHash } from '../block_hash.js';
|
|
4
5
|
import type { L2BlockTag } from '../l2_block_source.js';
|
|
5
6
|
import { L2TipsStoreBase } from './l2_tips_store_base.js';
|
|
6
7
|
|
|
@@ -9,6 +10,10 @@ import { L2TipsStoreBase } from './l2_tips_store_base.js';
|
|
|
9
10
|
* @dev Tests in kv-store/src/stores/l2_tips_memory_store.test.ts
|
|
10
11
|
*/
|
|
11
12
|
export class L2TipsMemoryStore extends L2TipsStoreBase {
|
|
13
|
+
constructor(initialBlockHash: BlockHash) {
|
|
14
|
+
super(initialBlockHash);
|
|
15
|
+
}
|
|
16
|
+
|
|
12
17
|
private readonly tips = new Map<L2BlockTag, BlockNumber>();
|
|
13
18
|
private readonly blockHashes = new Map<number, string>();
|
|
14
19
|
private readonly blockToCheckpoint = new Map<number, CheckpointNumber>();
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { BlockNumber, CheckpointNumber } from '@aztec/foundation/branded-types';
|
|
2
2
|
|
|
3
3
|
import type { PublishedCheckpoint } from '../../checkpoint/published_checkpoint.js';
|
|
4
|
-
import {
|
|
4
|
+
import type { BlockHash } from '../block_hash.js';
|
|
5
5
|
import type { L2Block } from '../l2_block.js';
|
|
6
6
|
import {
|
|
7
7
|
type CheckpointId,
|
|
@@ -17,6 +17,7 @@ import type { L2BlockStreamEvent, L2BlockStreamEventHandler, L2BlockStreamLocalD
|
|
|
17
17
|
* while delegating storage operations to subclasses.
|
|
18
18
|
*/
|
|
19
19
|
export abstract class L2TipsStoreBase implements L2BlockStreamEventHandler, L2BlockStreamLocalDataProvider {
|
|
20
|
+
constructor(protected readonly initialBlockHash: BlockHash) {}
|
|
20
21
|
// Abstract storage primitives - subclasses implement these based on their backing store
|
|
21
22
|
|
|
22
23
|
/** Gets the block number for a given tag. */
|
|
@@ -60,7 +61,10 @@ export abstract class L2TipsStoreBase implements L2BlockStreamEventHandler, L2Bl
|
|
|
60
61
|
|
|
61
62
|
// Public interface implementation
|
|
62
63
|
|
|
63
|
-
public getL2BlockHash(number: BlockNumber): Promise<string | undefined> {
|
|
64
|
+
public async getL2BlockHash(number: BlockNumber): Promise<string | undefined> {
|
|
65
|
+
if (number === 0) {
|
|
66
|
+
return (await this.getStoredBlockHash(number)) ?? this.initialBlockHash.toString();
|
|
67
|
+
}
|
|
64
68
|
return this.getStoredBlockHash(number);
|
|
65
69
|
}
|
|
66
70
|
|
|
@@ -123,7 +127,7 @@ export abstract class L2TipsStoreBase implements L2BlockStreamEventHandler, L2Bl
|
|
|
123
127
|
private async getBlockId(tag: L2BlockTag): Promise<L2BlockId> {
|
|
124
128
|
const blockNumber = await this.getTip(tag);
|
|
125
129
|
if (blockNumber === undefined || blockNumber === 0) {
|
|
126
|
-
return { number: BlockNumber.ZERO, hash:
|
|
130
|
+
return { number: BlockNumber.ZERO, hash: this.initialBlockHash.toString() };
|
|
127
131
|
}
|
|
128
132
|
const blockHash = await this.getStoredBlockHash(blockNumber);
|
|
129
133
|
if (!blockHash) {
|
|
@@ -139,7 +143,6 @@ export abstract class L2TipsStoreBase implements L2BlockStreamEventHandler, L2Bl
|
|
|
139
143
|
}
|
|
140
144
|
const checkpointNumber = await this.getCheckpointNumberForBlock(blockNumber);
|
|
141
145
|
if (checkpointNumber === undefined) {
|
|
142
|
-
// No checkpoint associated with this block yet
|
|
143
146
|
return { number: CheckpointNumber.ZERO, hash: GENESIS_CHECKPOINT_HEADER_HASH.toString() };
|
|
144
147
|
}
|
|
145
148
|
const checkpoint = await this.getCheckpoint(checkpointNumber);
|
|
@@ -210,11 +213,30 @@ export abstract class L2TipsStoreBase implements L2BlockStreamEventHandler, L2Bl
|
|
|
210
213
|
await this.saveTag('finalized', event.block);
|
|
211
214
|
const finalizedCheckpointNumber = await this.getCheckpointNumberForBlock(event.block.number);
|
|
212
215
|
|
|
213
|
-
|
|
214
|
-
|
|
216
|
+
// Cap the deletion bound at the lowest live tip. This should always be the finalized tip, but
|
|
217
|
+
// we have hit bugs where this is not the case. Deleting the block hash, block-to-checkpoint mapping,
|
|
218
|
+
// or enclosing checkpoint object for a live tip would dangle subsequent `getBlockId`/`getCheckpointId`
|
|
219
|
+
// lookups and lock the block stream into an error loop.
|
|
220
|
+
const tips = await Promise.all([
|
|
221
|
+
this.getTip('proposed'),
|
|
222
|
+
this.getTip('proposedCheckpoint'),
|
|
223
|
+
this.getTip('checkpointed'),
|
|
224
|
+
this.getTip('proven'),
|
|
225
|
+
]);
|
|
226
|
+
const liveTipBlocks = tips.filter((t): t is BlockNumber => t !== undefined && t > 0);
|
|
227
|
+
const safeBlockBound = BlockNumber(Math.min(event.block.number, ...liveTipBlocks));
|
|
228
|
+
await this.deleteBlockHashesBefore(safeBlockBound);
|
|
229
|
+
await this.deleteBlockToCheckpointBefore(safeBlockBound);
|
|
215
230
|
|
|
216
231
|
if (finalizedCheckpointNumber !== undefined) {
|
|
217
|
-
await this.
|
|
232
|
+
const tipCheckpoints = await Promise.all(liveTipBlocks.map(b => this.getCheckpointNumberForBlock(b)));
|
|
233
|
+
const safeCheckpointBound = CheckpointNumber(
|
|
234
|
+
Math.min(
|
|
235
|
+
finalizedCheckpointNumber,
|
|
236
|
+
...tipCheckpoints.filter((c): c is CheckpointNumber => c !== undefined && c > 0),
|
|
237
|
+
),
|
|
238
|
+
);
|
|
239
|
+
await this.deleteCheckpointsBefore(safeCheckpointBound);
|
|
218
240
|
}
|
|
219
241
|
});
|
|
220
242
|
}
|
|
@@ -4,26 +4,37 @@ import { hexToBuffer } from '@aztec/foundation/string';
|
|
|
4
4
|
import { encodeAbiParameters, parseAbiParameters } from 'viem';
|
|
5
5
|
import { z } from 'zod';
|
|
6
6
|
|
|
7
|
-
import
|
|
7
|
+
import {
|
|
8
|
+
type CoordinationSignatureContext,
|
|
9
|
+
type CoordinationSignatureType,
|
|
10
|
+
type Signable,
|
|
11
|
+
coordinationSignatureContextSchema,
|
|
12
|
+
} from '../../p2p/signature_utils.js';
|
|
8
13
|
import { CommitteeAttestation, EthAddress } from './committee_attestation.js';
|
|
9
14
|
|
|
10
15
|
export class CommitteeAttestationsAndSigners implements Signable {
|
|
11
|
-
|
|
16
|
+
readonly primaryType: CoordinationSignatureType = 'AttestationsAndSigners';
|
|
17
|
+
|
|
18
|
+
constructor(
|
|
19
|
+
public attestations: CommitteeAttestation[],
|
|
20
|
+
public readonly signatureContext: CoordinationSignatureContext,
|
|
21
|
+
) {}
|
|
12
22
|
|
|
13
23
|
static get schema() {
|
|
14
24
|
return z
|
|
15
25
|
.object({
|
|
16
26
|
attestations: CommitteeAttestation.schema.array(),
|
|
27
|
+
signatureContext: coordinationSignatureContextSchema,
|
|
17
28
|
})
|
|
18
|
-
.transform(obj => new CommitteeAttestationsAndSigners(obj.attestations));
|
|
29
|
+
.transform(obj => new CommitteeAttestationsAndSigners(obj.attestations, obj.signatureContext));
|
|
19
30
|
}
|
|
20
31
|
|
|
21
|
-
getPayloadToSign(
|
|
22
|
-
|
|
32
|
+
getPayloadToSign(): Buffer {
|
|
33
|
+
// Matches the L1 abi.encode(attestations, signers) in AttestationLib.sol#getAttestationsAndSignersDigest.
|
|
34
|
+
const abi = parseAbiParameters('(bytes,bytes),address[]');
|
|
23
35
|
const packed = this.getPackedAttestations();
|
|
24
36
|
|
|
25
37
|
const encodedData = encodeAbiParameters(abi, [
|
|
26
|
-
domainSeparator,
|
|
27
38
|
[packed.signatureIndices, packed.signaturesOrAddresses],
|
|
28
39
|
this.getSigners().map(s => s.toString()),
|
|
29
40
|
]);
|
|
@@ -31,8 +42,8 @@ export class CommitteeAttestationsAndSigners implements Signable {
|
|
|
31
42
|
return hexToBuffer(encodedData);
|
|
32
43
|
}
|
|
33
44
|
|
|
34
|
-
static empty(): CommitteeAttestationsAndSigners {
|
|
35
|
-
return new CommitteeAttestationsAndSigners([]);
|
|
45
|
+
static empty(signatureContext: CoordinationSignatureContext): CommitteeAttestationsAndSigners {
|
|
46
|
+
return new CommitteeAttestationsAndSigners([], signatureContext);
|
|
36
47
|
}
|
|
37
48
|
|
|
38
49
|
toString() {
|
|
@@ -53,9 +64,9 @@ export class CommitteeAttestationsAndSigners implements Signable {
|
|
|
53
64
|
* @param attestations - Array of committee attestations with addresses and signatures
|
|
54
65
|
* @returns Packed attestations with bitmap and tightly packed signature/address data
|
|
55
66
|
*/
|
|
56
|
-
|
|
57
|
-
const length =
|
|
58
|
-
const
|
|
67
|
+
static packAttestations(attestations: CommitteeAttestation[]): ViemCommitteeAttestations {
|
|
68
|
+
const length = attestations.length;
|
|
69
|
+
const viemAttestations = attestations.map(a => a.toViem());
|
|
59
70
|
|
|
60
71
|
// Calculate bitmap size (1 bit per attestation, rounded up to nearest byte)
|
|
61
72
|
const bitmapSize = Math.ceil(length / 8);
|
|
@@ -63,8 +74,8 @@ export class CommitteeAttestationsAndSigners implements Signable {
|
|
|
63
74
|
|
|
64
75
|
// Calculate total data size needed
|
|
65
76
|
let totalDataSize = 0;
|
|
66
|
-
for (
|
|
67
|
-
const signature =
|
|
77
|
+
for (const attestation of viemAttestations) {
|
|
78
|
+
const signature = attestation.signature;
|
|
68
79
|
// Check if signature is empty (v = 0)
|
|
69
80
|
const isEmpty = signature.v === 0;
|
|
70
81
|
|
|
@@ -79,8 +90,7 @@ export class CommitteeAttestationsAndSigners implements Signable {
|
|
|
79
90
|
let dataIndex = 0;
|
|
80
91
|
|
|
81
92
|
// Pack the data
|
|
82
|
-
for (
|
|
83
|
-
const attestation = attestations[i];
|
|
93
|
+
for (const [i, attestation] of viemAttestations.entries()) {
|
|
84
94
|
const signature = attestation.signature;
|
|
85
95
|
|
|
86
96
|
// Check if signature is empty
|
|
@@ -90,7 +100,7 @@ export class CommitteeAttestationsAndSigners implements Signable {
|
|
|
90
100
|
// Set bit in bitmap (bit 7-0 in each byte, left to right)
|
|
91
101
|
const byteIndex = Math.floor(i / 8);
|
|
92
102
|
const bitIndex = 7 - (i % 8);
|
|
93
|
-
signatureIndices[byteIndex]
|
|
103
|
+
signatureIndices[byteIndex] = (signatureIndices[byteIndex] ?? 0) | (1 << bitIndex);
|
|
94
104
|
|
|
95
105
|
// Pack signature: v + r + s
|
|
96
106
|
signaturesOrAddresses[dataIndex] = signature.v;
|
|
@@ -118,6 +128,10 @@ export class CommitteeAttestationsAndSigners implements Signable {
|
|
|
118
128
|
signaturesOrAddresses: `0x${Buffer.from(signaturesOrAddresses).toString('hex')}`,
|
|
119
129
|
};
|
|
120
130
|
}
|
|
131
|
+
|
|
132
|
+
getPackedAttestations(): ViemCommitteeAttestations {
|
|
133
|
+
return CommitteeAttestationsAndSigners.packAttestations(this.attestations);
|
|
134
|
+
}
|
|
121
135
|
}
|
|
122
136
|
|
|
123
137
|
/**
|
|
@@ -130,8 +144,9 @@ export class MaliciousCommitteeAttestationsAndSigners extends CommitteeAttestati
|
|
|
130
144
|
constructor(
|
|
131
145
|
attestations: CommitteeAttestation[],
|
|
132
146
|
private signers: EthAddress[],
|
|
147
|
+
signatureContext: CoordinationSignatureContext,
|
|
133
148
|
) {
|
|
134
|
-
super(attestations);
|
|
149
|
+
super(attestations, signatureContext);
|
|
135
150
|
}
|
|
136
151
|
|
|
137
152
|
override getSigners(): EthAddress[] {
|
|
@@ -10,7 +10,7 @@ import {
|
|
|
10
10
|
} from '@aztec/stdlib/block';
|
|
11
11
|
import { Checkpoint, L1PublishedData, PublishedCheckpoint } from '@aztec/stdlib/checkpoint';
|
|
12
12
|
|
|
13
|
-
import {
|
|
13
|
+
import { expect } from 'vitest';
|
|
14
14
|
|
|
15
15
|
import { GENESIS_BLOCK_HEADER_HASH } from '../block_hash.js';
|
|
16
16
|
import type { L2TipsStore } from '../l2_block_stream/index.js';
|
|
@@ -32,6 +32,8 @@ export type L1EnrichedCheckpointData = {
|
|
|
32
32
|
export type StorageEnrichedCheckpointData = {
|
|
33
33
|
archive: AppendOnlyTreeSnapshot;
|
|
34
34
|
checkpointOutHash: Fr;
|
|
35
|
+
/** Fee asset price modifier in basis points. Defaults to 0 (no change) when not explicitly set. */
|
|
36
|
+
feeAssetPriceModifier: bigint;
|
|
35
37
|
};
|
|
36
38
|
|
|
37
39
|
/** Data stored only with proposed checkpoint data */
|
|
@@ -70,6 +72,7 @@ export const CheckpointDataSchema = z
|
|
|
70
72
|
checkpointOutHash: schemas.Fr,
|
|
71
73
|
startBlock: BlockNumberSchema,
|
|
72
74
|
blockCount: schemas.Integer,
|
|
75
|
+
feeAssetPriceModifier: schemas.BigInt,
|
|
73
76
|
attestations: z.array(CommitteeAttestation.schema),
|
|
74
77
|
l1: L1PublishedData.schema,
|
|
75
78
|
})
|
|
@@ -81,6 +84,7 @@ export const CheckpointDataSchema = z
|
|
|
81
84
|
checkpointOutHash: obj.checkpointOutHash,
|
|
82
85
|
startBlock: obj.startBlock,
|
|
83
86
|
blockCount: obj.blockCount,
|
|
87
|
+
feeAssetPriceModifier: obj.feeAssetPriceModifier,
|
|
84
88
|
attestations: obj.attestations,
|
|
85
89
|
l1: obj.l1,
|
|
86
90
|
}),
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
import type { CheckpointNumber, SlotNumber } from '@aztec/foundation/branded-types';
|
|
2
|
+
import type { Fr } from '@aztec/foundation/curves/bn254';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Outcome of attempting to re-execute a checkpoint proposal locally.
|
|
6
|
+
*
|
|
7
|
+
* - `valid` — re-execution succeeded and the computed checkpoint matched the proposal.
|
|
8
|
+
* - `invalid` — the proposal disagreed with the computed checkpoint, or violated a deterministic
|
|
9
|
+
* constraint (limits, signatures, etc).
|
|
10
|
+
* - `unvalidated` — the local node could not complete validation for non-deterministic reasons
|
|
11
|
+
* (missing blocks/txs, timeouts, infra errors). Treated as proposer-fault for
|
|
12
|
+
* slashing but surfaced separately for telemetry.
|
|
13
|
+
*/
|
|
14
|
+
export type ReexecutionOutcome = 'valid' | 'invalid' | 'unvalidated';
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Tracks two pieces of per-slot state collected during proposal handling:
|
|
18
|
+
*
|
|
19
|
+
* 1. Whether each block proposal's transactions were successfully collected locally
|
|
20
|
+
* (keyed by `slot` + `indexWithinCheckpoint`). Consumed by the data-withholding watcher.
|
|
21
|
+
* 2. The outcome of locally re-executing each checkpoint proposal (keyed by
|
|
22
|
+
* `(checkpointNumber, archiveRoot)` and by `slot`). Consumed by the data-withholding
|
|
23
|
+
* watcher (via `hasReexecuted`) and the sentinel (via `getOutcomeForSlot`).
|
|
24
|
+
*
|
|
25
|
+
* Both pieces of state live on the same per-slot `Entry`, so cleanup via `removeBefore`
|
|
26
|
+
* naturally drops everything for a pruned slot in one step.
|
|
27
|
+
*/
|
|
28
|
+
interface Entry {
|
|
29
|
+
// Set by recordOutcome — these may be undefined until the checkpoint proposal has been
|
|
30
|
+
// evaluated. recordTxsCollected may create an Entry before any of them are known.
|
|
31
|
+
checkpointNumber: CheckpointNumber | undefined;
|
|
32
|
+
archiveRoot: string | undefined;
|
|
33
|
+
outcome: ReexecutionOutcome | undefined;
|
|
34
|
+
|
|
35
|
+
slot: SlotNumber;
|
|
36
|
+
|
|
37
|
+
// Per block-proposal at this slot: indexWithinCheckpoint → true (collected) | false (failed to collect).
|
|
38
|
+
txsCollected: Map<number, boolean>;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
export class CheckpointReexecutionTracker {
|
|
42
|
+
private readonly byCheckpoint = new Map<CheckpointNumber, Map<string, Entry>>();
|
|
43
|
+
private readonly bySlot = new Map<SlotNumber, Entry>();
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Record the outcome of evaluating a checkpoint proposal.
|
|
47
|
+
* @param slot - Slot the proposal was for. Always required.
|
|
48
|
+
* @param archiveRoot - Archive root in the proposal.
|
|
49
|
+
* @param outcome - Outcome of evaluation.
|
|
50
|
+
* @param checkpointNumber - Checkpoint number, if known. Required for `valid` outcomes; optional
|
|
51
|
+
* for `invalid`/`unvalidated` because some early rejections fire before blocks are loaded.
|
|
52
|
+
*/
|
|
53
|
+
public recordOutcome(
|
|
54
|
+
slot: SlotNumber,
|
|
55
|
+
archiveRoot: Fr,
|
|
56
|
+
outcome: ReexecutionOutcome,
|
|
57
|
+
checkpointNumber?: CheckpointNumber,
|
|
58
|
+
): void {
|
|
59
|
+
const archiveRootStr = archiveRoot.toString();
|
|
60
|
+
|
|
61
|
+
// Preserve any per-block txsCollected already accumulated for this slot.
|
|
62
|
+
const existing = this.bySlot.get(slot);
|
|
63
|
+
const entry: Entry = {
|
|
64
|
+
checkpointNumber,
|
|
65
|
+
archiveRoot: archiveRootStr,
|
|
66
|
+
slot,
|
|
67
|
+
outcome,
|
|
68
|
+
txsCollected: existing?.txsCollected ?? new Map(),
|
|
69
|
+
};
|
|
70
|
+
|
|
71
|
+
if (checkpointNumber !== undefined) {
|
|
72
|
+
let archives = this.byCheckpoint.get(checkpointNumber);
|
|
73
|
+
if (!archives) {
|
|
74
|
+
archives = new Map();
|
|
75
|
+
this.byCheckpoint.set(checkpointNumber, archives);
|
|
76
|
+
}
|
|
77
|
+
archives.set(archiveRootStr, entry);
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
this.bySlot.set(slot, entry);
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* Record whether the local node successfully collected the transactions for a block proposal.
|
|
85
|
+
* Called from the validator's proposal handler immediately after tx collection completes
|
|
86
|
+
* (regardless of whether re-execution will subsequently succeed). The data-withholding
|
|
87
|
+
* watcher consults these records as an authoritative signal: tx availability now is too
|
|
88
|
+
* weak (txs may have been evicted from the mempool by the time the watcher runs), but a
|
|
89
|
+
* record that the txs *were* available at proposal time still vouches for the proposer.
|
|
90
|
+
*
|
|
91
|
+
* @param slot - Slot the block proposal was for.
|
|
92
|
+
* @param indexWithinCheckpoint - Index of the block within its enclosing checkpoint.
|
|
93
|
+
* @param collected - True if every tx in the proposal was collected locally before deadline.
|
|
94
|
+
*/
|
|
95
|
+
public recordTxsCollected(slot: SlotNumber, indexWithinCheckpoint: number, collected: boolean): void {
|
|
96
|
+
let entry = this.bySlot.get(slot);
|
|
97
|
+
if (!entry) {
|
|
98
|
+
entry = {
|
|
99
|
+
checkpointNumber: undefined,
|
|
100
|
+
archiveRoot: undefined,
|
|
101
|
+
slot,
|
|
102
|
+
outcome: undefined,
|
|
103
|
+
txsCollected: new Map(),
|
|
104
|
+
};
|
|
105
|
+
this.bySlot.set(slot, entry);
|
|
106
|
+
}
|
|
107
|
+
entry.txsCollected.set(indexWithinCheckpoint, collected);
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
/**
|
|
111
|
+
* Returns true if the given (checkpoint number, archive root) has been successfully
|
|
112
|
+
* re-executed locally (outcome `valid`).
|
|
113
|
+
*/
|
|
114
|
+
public hasReexecuted(checkpointNumber: CheckpointNumber, archiveRoot: Fr): boolean {
|
|
115
|
+
return this.byCheckpoint.get(checkpointNumber)?.get(archiveRoot.toString())?.outcome === 'valid';
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
/** Returns the recorded outcome for a given slot, or undefined if no proposal was evaluated. */
|
|
119
|
+
public getOutcomeForSlot(slot: SlotNumber): ReexecutionOutcome | undefined {
|
|
120
|
+
return this.bySlot.get(slot)?.outcome;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
/**
|
|
124
|
+
* Returns the recorded tx-collection result for a block proposal at the given slot and
|
|
125
|
+
* `indexWithinCheckpoint`, or `undefined` if no record exists.
|
|
126
|
+
*
|
|
127
|
+
* Three-valued by design:
|
|
128
|
+
* - `true` — we collected every tx for this block proposal before the deadline.
|
|
129
|
+
* - `false` — we tried and failed (missing txs at the deadline).
|
|
130
|
+
* - `undefined` — no record (e.g. we never saw the block proposal). Callers should fall
|
|
131
|
+
* back to a current-state check (e.g. mempool probe) for this case.
|
|
132
|
+
*/
|
|
133
|
+
public getTxsCollectedRecord(slot: SlotNumber, indexWithinCheckpoint: number): boolean | undefined {
|
|
134
|
+
return this.bySlot.get(slot)?.txsCollected.get(indexWithinCheckpoint);
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
/** Drops entries for checkpoints with `number < checkpointNumber`. */
|
|
138
|
+
public removeBefore(checkpointNumber: CheckpointNumber): void {
|
|
139
|
+
// Track the highest slot among checkpoints we're pruning. Once we know it, any slot
|
|
140
|
+
// strictly below that watermark is older than the most recently pruned checkpoint and
|
|
141
|
+
// can be dropped from `bySlot` too — including slot-only entries (no checkpoint number)
|
|
142
|
+
// which would otherwise leak, because removing by checkpoint number can't reach them.
|
|
143
|
+
let maxRemovedSlot: SlotNumber | undefined;
|
|
144
|
+
for (const [n, archives] of this.byCheckpoint) {
|
|
145
|
+
if (n < checkpointNumber) {
|
|
146
|
+
for (const entry of archives.values()) {
|
|
147
|
+
// Only drop the slot index if it still points at the entry we're removing.
|
|
148
|
+
if (this.bySlot.get(entry.slot) === entry) {
|
|
149
|
+
this.bySlot.delete(entry.slot);
|
|
150
|
+
}
|
|
151
|
+
if (maxRemovedSlot === undefined || entry.slot > maxRemovedSlot) {
|
|
152
|
+
maxRemovedSlot = entry.slot;
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
this.byCheckpoint.delete(n);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
if (maxRemovedSlot !== undefined) {
|
|
160
|
+
for (const slot of [...this.bySlot.keys()]) {
|
|
161
|
+
if (slot < maxRemovedSlot) {
|
|
162
|
+
this.bySlot.delete(slot);
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { Buffer32 } from '@aztec/foundation/buffer';
|
|
2
|
+
import type { Fr } from '@aztec/foundation/curves/bn254';
|
|
3
|
+
|
|
4
|
+
import { ConsensusPayload } from '../p2p/consensus_payload.js';
|
|
5
|
+
import { type CoordinationSignatureContext, getHashedSignaturePayloadTypedData } from '../p2p/signature_utils.js';
|
|
6
|
+
import { CheckpointHeader } from '../rollup/checkpoint_header.js';
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Computes the EIP-712 payload digest for a checkpoint proposal — the digest validators sign
|
|
10
|
+
* and the L1 contract verifies during `propose()`. Mirrors `ProposeLib.digest(ProposePayload)` on L1.
|
|
11
|
+
*
|
|
12
|
+
* The result is the same `bytes32` that gets stored in `tempCheckpointLogs[checkpointNumber].payloadDigest`,
|
|
13
|
+
* so this helper is also reused when constructing simulation state overrides for pipelined proposals.
|
|
14
|
+
*/
|
|
15
|
+
export function computeCheckpointPayloadDigest(args: {
|
|
16
|
+
header: CheckpointHeader;
|
|
17
|
+
archiveRoot: Fr;
|
|
18
|
+
feeAssetPriceModifier: bigint;
|
|
19
|
+
signatureContext: CoordinationSignatureContext;
|
|
20
|
+
}): Buffer32 {
|
|
21
|
+
const consensusPayload = new ConsensusPayload(
|
|
22
|
+
args.header,
|
|
23
|
+
args.archiveRoot,
|
|
24
|
+
args.feeAssetPriceModifier,
|
|
25
|
+
args.signatureContext,
|
|
26
|
+
);
|
|
27
|
+
return getHashedSignaturePayloadTypedData(consensusPayload);
|
|
28
|
+
}
|
package/src/checkpoint/index.ts
CHANGED
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
export * from './checkpoint.js';
|
|
2
2
|
export * from './checkpoint_data.js';
|
|
3
3
|
export * from './checkpoint_info.js';
|
|
4
|
+
export * from './checkpoint_reexecution_tracker.js';
|
|
5
|
+
export * from './digest.js';
|
|
6
|
+
export * from './previous_checkpoint_out_hashes.js';
|
|
4
7
|
export * from './published_checkpoint.js';
|
|
5
8
|
export * from './validate.js';
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { CheckpointNumber, type EpochNumber } from '@aztec/foundation/branded-types';
|
|
2
|
+
import type { Fr } from '@aztec/foundation/curves/bn254';
|
|
3
|
+
import type { Logger } from '@aztec/foundation/log';
|
|
4
|
+
|
|
5
|
+
import type { L2BlockSource } from '../block/l2_block_source.js';
|
|
6
|
+
import { type L1RollupConstants, getEpochAtSlot } from '../epoch-helpers/index.js';
|
|
7
|
+
import type { ProposedCheckpointData } from './checkpoint_data.js';
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Returns the out hashes (in epoch order) of all checkpoints in `epoch` that precede
|
|
11
|
+
* `checkpointNumber`, used to compute the `epochOutHash` baked into that checkpoint's header.
|
|
12
|
+
*
|
|
13
|
+
* Under proposer pipelining the parent checkpoint may not be confirmed on L1 by the time the
|
|
14
|
+
* builder runs, so the on-chain archiver query (`getCheckpointsData`) is missing it and the
|
|
15
|
+
* resulting `epochOutHash` would diverge from what other validators (and L1) compute after the
|
|
16
|
+
* parent lands. To avoid that, the parent's `checkpointOutHash` is spliced in from the locally
|
|
17
|
+
* known proposed checkpoint when:
|
|
18
|
+
* - pipelining is enabled,
|
|
19
|
+
* - the archiver lookup is genuinely short (its last entry is not already cp `N-1`),
|
|
20
|
+
* - and the proposed cp `N-1` is in the same target epoch (otherwise we're at an epoch boundary
|
|
21
|
+
* and the previous-epoch cps must be excluded).
|
|
22
|
+
*
|
|
23
|
+
* Callers may either pass the already-loaded `proposedCheckpointData` (the proposer has it on
|
|
24
|
+
* hand) or leave it undefined, in which case it's fetched via `getProposedCheckpointData`.
|
|
25
|
+
*/
|
|
26
|
+
export async function getPreviousCheckpointOutHashes(input: {
|
|
27
|
+
blockSource: Pick<L2BlockSource, 'getCheckpointsData' | 'getProposedCheckpointData'>;
|
|
28
|
+
epoch: EpochNumber;
|
|
29
|
+
checkpointNumber: CheckpointNumber;
|
|
30
|
+
l1Constants: Pick<L1RollupConstants, 'epochDuration'>;
|
|
31
|
+
pipeliningEnabled: boolean;
|
|
32
|
+
proposedCheckpointData?: ProposedCheckpointData;
|
|
33
|
+
log?: Logger;
|
|
34
|
+
}): Promise<Fr[]> {
|
|
35
|
+
const { blockSource, epoch, checkpointNumber, l1Constants, pipeliningEnabled, log } = input;
|
|
36
|
+
|
|
37
|
+
const checkpointed = (await blockSource.getCheckpointsData({ epoch }))
|
|
38
|
+
.filter(c => c.checkpointNumber < checkpointNumber)
|
|
39
|
+
.sort((a, b) => a.checkpointNumber - b.checkpointNumber);
|
|
40
|
+
|
|
41
|
+
if (!pipeliningEnabled || checkpointNumber === 0) {
|
|
42
|
+
return checkpointed.map(c => c.checkpointOutHash);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
const parentCheckpoint = CheckpointNumber(checkpointNumber - 1);
|
|
46
|
+
if (checkpointed.at(-1)?.checkpointNumber === parentCheckpoint) {
|
|
47
|
+
return checkpointed.map(c => c.checkpointOutHash);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
const proposedParent =
|
|
51
|
+
input.proposedCheckpointData ?? (await blockSource.getProposedCheckpointData({ number: parentCheckpoint }));
|
|
52
|
+
if (!proposedParent || proposedParent.checkpointNumber !== parentCheckpoint) {
|
|
53
|
+
return checkpointed.map(c => c.checkpointOutHash);
|
|
54
|
+
}
|
|
55
|
+
if (getEpochAtSlot(proposedParent.header.slotNumber, l1Constants) !== epoch) {
|
|
56
|
+
return checkpointed.map(c => c.checkpointOutHash);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
log?.debug(`Splicing pipelined parent cp ${parentCheckpoint} outHash for cp ${checkpointNumber}`);
|
|
60
|
+
return [...checkpointed.map(c => c.checkpointOutHash), proposedParent.checkpointOutHash];
|
|
61
|
+
}
|