@aztec/stdlib 0.0.1-commit.f504929 → 0.0.1-commit.f5d02921e
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 +138 -1
- package/dest/abi/abi.d.ts.map +1 -1
- package/dest/abi/abi.js +10 -2
- package/dest/abi/buffer.d.ts +14 -4
- package/dest/abi/buffer.d.ts.map +1 -1
- package/dest/abi/buffer.js +25 -4
- package/dest/abi/decoder.d.ts +5 -44
- package/dest/abi/decoder.d.ts.map +1 -1
- package/dest/abi/decoder.js +12 -67
- package/dest/abi/function_selector.js +1 -1
- package/dest/abi/function_signature_decoder.d.ts +43 -0
- package/dest/abi/function_signature_decoder.d.ts.map +1 -0
- package/dest/abi/function_signature_decoder.js +66 -0
- package/dest/abi/index.d.ts +2 -1
- package/dest/abi/index.d.ts.map +1 -1
- package/dest/abi/index.js +1 -0
- package/dest/avm/avm.d.ts +300 -300
- package/dest/block/l2_block.d.ts +9 -1
- package/dest/block/l2_block.d.ts.map +1 -1
- package/dest/block/l2_block.js +12 -2
- package/dest/block/l2_block_source.d.ts +95 -10
- package/dest/block/l2_block_source.d.ts.map +1 -1
- package/dest/block/l2_block_source.js +1 -0
- package/dest/block/l2_block_stream/l2_tips_store_base.d.ts +1 -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 +17 -4
- package/dest/block/test/l2_tips_store_test_suite.d.ts +1 -1
- package/dest/block/test/l2_tips_store_test_suite.d.ts.map +1 -1
- package/dest/block/test/l2_tips_store_test_suite.js +3 -2
- package/dest/checkpoint/checkpoint.d.ts +8 -1
- package/dest/checkpoint/checkpoint.d.ts.map +1 -1
- package/dest/checkpoint/checkpoint.js +18 -5
- package/dest/checkpoint/checkpoint_data.d.ts +71 -5
- package/dest/checkpoint/checkpoint_data.d.ts.map +1 -1
- package/dest/checkpoint/checkpoint_data.js +10 -0
- package/dest/checkpoint/index.d.ts +2 -1
- package/dest/checkpoint/index.d.ts.map +1 -1
- package/dest/checkpoint/index.js +1 -0
- package/dest/checkpoint/validate.d.ts +36 -0
- package/dest/checkpoint/validate.d.ts.map +1 -0
- package/dest/checkpoint/validate.js +120 -0
- package/dest/config/index.d.ts +2 -1
- package/dest/config/index.d.ts.map +1 -1
- package/dest/config/index.js +1 -0
- package/dest/config/pipelining-config.d.ts +19 -0
- package/dest/config/pipelining-config.d.ts.map +1 -0
- package/dest/config/pipelining-config.js +18 -0
- package/dest/config/sequencer-config.d.ts +2 -2
- package/dest/config/sequencer-config.d.ts.map +1 -1
- package/dest/config/sequencer-config.js +1 -2
- package/dest/contract/contract_address.d.ts +3 -3
- package/dest/contract/contract_address.js +3 -3
- package/dest/contract/contract_class_id.d.ts +2 -2
- package/dest/contract/contract_class_id.js +2 -2
- 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_class.d.ts +3 -156
- package/dest/contract/interfaces/contract_class.d.ts.map +1 -1
- package/dest/contract/interfaces/contract_class.js +1 -28
- package/dest/epoch-helpers/index.d.ts +11 -1
- package/dest/epoch-helpers/index.d.ts.map +1 -1
- package/dest/epoch-helpers/index.js +16 -2
- package/dest/file-store/factory.d.ts +4 -3
- package/dest/file-store/factory.d.ts.map +1 -1
- package/dest/file-store/factory.js +2 -2
- package/dest/file-store/http.d.ts +9 -2
- package/dest/file-store/http.d.ts.map +1 -1
- package/dest/file-store/http.js +20 -9
- package/dest/file-store/index.d.ts +2 -1
- package/dest/file-store/index.d.ts.map +1 -1
- package/dest/ha-signing/config.d.ts +49 -14
- package/dest/ha-signing/config.d.ts.map +1 -1
- package/dest/ha-signing/config.js +20 -15
- package/dest/ha-signing/index.d.ts +3 -2
- package/dest/ha-signing/index.d.ts.map +1 -1
- package/dest/ha-signing/index.js +2 -1
- package/dest/ha-signing/local_config.d.ts +63 -0
- package/dest/ha-signing/local_config.d.ts.map +1 -0
- package/dest/ha-signing/local_config.js +24 -0
- package/dest/hash/hash.d.ts +19 -1
- package/dest/hash/hash.d.ts.map +1 -1
- package/dest/hash/hash.js +29 -0
- package/dest/interfaces/allowed_element.d.ts +25 -1
- package/dest/interfaces/allowed_element.d.ts.map +1 -1
- package/dest/interfaces/allowed_element.js +8 -2
- package/dest/interfaces/archiver.d.ts +1 -1
- package/dest/interfaces/archiver.d.ts.map +1 -1
- package/dest/interfaces/archiver.js +6 -3
- package/dest/interfaces/aztec-node-admin.d.ts +70 -13
- package/dest/interfaces/aztec-node-admin.d.ts.map +1 -1
- package/dest/interfaces/aztec-node.d.ts +12 -6
- package/dest/interfaces/aztec-node.d.ts.map +1 -1
- package/dest/interfaces/aztec-node.js +5 -2
- package/dest/interfaces/block-builder.d.ts +38 -11
- package/dest/interfaces/block-builder.d.ts.map +1 -1
- package/dest/interfaces/block-builder.js +12 -5
- package/dest/interfaces/configs.d.ts +47 -7
- package/dest/interfaces/configs.d.ts.map +1 -1
- package/dest/interfaces/configs.js +3 -1
- package/dest/interfaces/l2_logs_source.d.ts +5 -3
- package/dest/interfaces/l2_logs_source.d.ts.map +1 -1
- package/dest/interfaces/merkle_tree_operations.d.ts +9 -19
- package/dest/interfaces/merkle_tree_operations.d.ts.map +1 -1
- package/dest/interfaces/prover-client.d.ts +6 -1
- package/dest/interfaces/prover-client.d.ts.map +1 -1
- package/dest/interfaces/prover-client.js +7 -1
- package/dest/interfaces/proving-job.d.ts +200 -200
- package/dest/interfaces/validator.d.ts +101 -30
- package/dest/interfaces/validator.d.ts.map +1 -1
- package/dest/interfaces/validator.js +7 -5
- package/dest/interfaces/world_state.d.ts +5 -4
- package/dest/interfaces/world_state.d.ts.map +1 -1
- package/dest/kernel/private_kernel_tail_circuit_public_inputs.d.ts +2 -1
- package/dest/kernel/private_kernel_tail_circuit_public_inputs.d.ts.map +1 -1
- package/dest/kernel/private_kernel_tail_circuit_public_inputs.js +4 -0
- package/dest/kv-store/config.d.ts +17 -0
- package/dest/kv-store/config.d.ts.map +1 -0
- package/dest/kv-store/config.js +26 -0
- package/dest/kv-store/index.d.ts +2 -0
- package/dest/kv-store/index.d.ts.map +1 -0
- package/dest/kv-store/index.js +1 -0
- package/dest/logs/index.d.ts +2 -1
- package/dest/logs/index.d.ts.map +1 -1
- package/dest/logs/index.js +1 -0
- package/dest/logs/log_filter.d.ts +4 -1
- package/dest/logs/log_filter.d.ts.map +1 -1
- package/dest/logs/log_filter.js +2 -1
- package/dest/logs/message_context.d.ts +4 -7
- package/dest/logs/message_context.d.ts.map +1 -1
- package/dest/logs/message_context.js +23 -9
- package/dest/logs/pending_tagged_log.d.ts +2 -3
- package/dest/logs/pending_tagged_log.d.ts.map +1 -1
- package/dest/logs/pending_tagged_log.js +2 -2
- package/dest/logs/shared_secret_derivation.d.ts +11 -10
- package/dest/logs/shared_secret_derivation.d.ts.map +1 -1
- package/dest/logs/shared_secret_derivation.js +15 -9
- package/dest/logs/siloed_tag.d.ts +4 -1
- package/dest/logs/siloed_tag.d.ts.map +1 -1
- package/dest/logs/siloed_tag.js +7 -3
- package/dest/logs/tagging_index_range.d.ts +40 -0
- package/dest/logs/tagging_index_range.d.ts.map +1 -0
- package/dest/logs/tagging_index_range.js +8 -0
- package/dest/logs/tx_scoped_l2_log.d.ts +3 -1
- package/dest/logs/tx_scoped_l2_log.d.ts.map +1 -1
- package/dest/logs/tx_scoped_l2_log.js +7 -0
- package/dest/messaging/l1_to_l2_message.d.ts +3 -2
- package/dest/messaging/l1_to_l2_message.d.ts.map +1 -1
- package/dest/messaging/l1_to_l2_message.js +11 -13
- package/dest/messaging/l1_to_l2_message_source.d.ts +4 -2
- package/dest/messaging/l1_to_l2_message_source.d.ts.map +1 -1
- package/dest/messaging/l2_to_l1_membership.d.ts +32 -6
- package/dest/messaging/l2_to_l1_membership.d.ts.map +1 -1
- package/dest/messaging/l2_to_l1_membership.js +69 -26
- package/dest/noir/index.d.ts +3 -3
- package/dest/noir/index.d.ts.map +1 -1
- package/dest/note/note_dao.d.ts +1 -1
- package/dest/note/note_dao.d.ts.map +1 -1
- package/dest/note/note_dao.js +1 -4
- package/dest/p2p/checkpoint_proposal.d.ts +1 -6
- package/dest/p2p/checkpoint_proposal.d.ts.map +1 -1
- package/dest/p2p/checkpoint_proposal.js +13 -23
- package/dest/p2p/peer_error.d.ts +3 -1
- package/dest/p2p/peer_error.d.ts.map +1 -1
- package/dest/p2p/peer_error.js +5 -0
- package/dest/proofs/chonk_proof.d.ts +46 -2
- package/dest/proofs/chonk_proof.d.ts.map +1 -1
- package/dest/proofs/chonk_proof.js +85 -10
- package/dest/slashing/tally.d.ts +5 -6
- package/dest/slashing/tally.d.ts.map +1 -1
- package/dest/slashing/tally.js +19 -10
- package/dest/tests/factories.d.ts +2 -4
- package/dest/tests/factories.d.ts.map +1 -1
- package/dest/tests/factories.js +10 -27
- package/dest/tests/mocks.d.ts +4 -2
- package/dest/tests/mocks.d.ts.map +1 -1
- package/dest/tests/mocks.js +13 -8
- package/dest/tx/block_header.d.ts +3 -1
- package/dest/tx/block_header.d.ts.map +1 -1
- package/dest/tx/block_header.js +4 -0
- package/dest/tx/capsule.d.ts +6 -2
- package/dest/tx/capsule.d.ts.map +1 -1
- package/dest/tx/capsule.js +9 -3
- package/dest/tx/global_variable_builder.d.ts +14 -2
- package/dest/tx/global_variable_builder.d.ts.map +1 -1
- package/dest/tx/private_execution_result.d.ts +6 -6
- package/dest/tx/private_execution_result.d.ts.map +1 -1
- package/dest/tx/private_execution_result.js +6 -6
- package/dest/tx/profiling.d.ts +14 -2
- package/dest/tx/profiling.d.ts.map +1 -1
- package/dest/tx/profiling.js +13 -3
- package/dest/tx/simulated_tx.d.ts +109 -1
- package/dest/tx/simulated_tx.d.ts.map +1 -1
- package/dest/tx/tx.d.ts +6 -5
- package/dest/tx/tx.d.ts.map +1 -1
- package/dest/tx/tx.js +18 -6
- package/dest/tx/tx_receipt.d.ts +7 -2
- package/dest/tx/tx_receipt.d.ts.map +1 -1
- package/dest/tx/tx_receipt.js +6 -3
- package/dest/tx/validator/error_texts.d.ts +8 -1
- package/dest/tx/validator/error_texts.d.ts.map +1 -1
- package/dest/tx/validator/error_texts.js +9 -0
- package/dest/update-checker/index.d.ts +3 -2
- package/dest/update-checker/index.d.ts.map +1 -1
- package/dest/update-checker/index.js +2 -1
- package/dest/update-checker/package_version.d.ts +3 -0
- package/dest/update-checker/package_version.d.ts.map +1 -0
- package/dest/update-checker/package_version.js +24 -0
- package/dest/update-checker/version_checker.d.ts +25 -0
- package/dest/update-checker/version_checker.d.ts.map +1 -0
- package/dest/update-checker/version_checker.js +50 -0
- package/dest/validators/errors.d.ts +6 -1
- package/dest/validators/errors.d.ts.map +1 -1
- package/dest/validators/errors.js +7 -0
- package/dest/versioning/versioning.d.ts +4 -2
- package/dest/versioning/versioning.d.ts.map +1 -1
- package/dest/versioning/versioning.js +4 -1
- package/package.json +10 -9
- package/src/abi/abi.ts +25 -2
- package/src/abi/buffer.ts +25 -4
- package/src/abi/decoder.ts +23 -78
- package/src/abi/function_selector.ts +1 -1
- package/src/abi/function_signature_decoder.ts +77 -0
- package/src/abi/index.ts +1 -0
- package/src/block/l2_block.ts +13 -1
- package/src/block/l2_block_source.ts +26 -9
- package/src/block/l2_block_stream/l2_tips_store_base.ts +24 -12
- package/src/block/test/l2_tips_store_test_suite.ts +8 -1
- package/src/checkpoint/checkpoint.ts +23 -4
- package/src/checkpoint/checkpoint_data.ts +40 -4
- package/src/checkpoint/index.ts +1 -0
- package/src/checkpoint/validate.ts +230 -0
- package/src/config/index.ts +1 -0
- package/src/config/pipelining-config.ts +31 -0
- package/src/config/sequencer-config.ts +2 -2
- package/src/contract/contract_address.ts +3 -3
- package/src/contract/contract_class_id.ts +2 -2
- package/src/contract/index.ts +0 -2
- package/src/contract/interfaces/contract_class.ts +2 -82
- package/src/epoch-helpers/index.ts +27 -0
- package/src/file-store/factory.ts +13 -4
- package/src/file-store/http.ts +29 -10
- package/src/file-store/index.ts +1 -0
- package/src/gas/README.md +123 -0
- package/src/ha-signing/config.ts +45 -38
- package/src/ha-signing/index.ts +9 -0
- package/src/ha-signing/local_config.ts +46 -0
- package/src/hash/hash.ts +34 -0
- package/src/interfaces/allowed_element.ts +28 -4
- package/src/interfaces/archiver.ts +6 -3
- package/src/interfaces/aztec-node.ts +24 -5
- package/src/interfaces/block-builder.ts +56 -13
- package/src/interfaces/configs.ts +15 -4
- package/src/interfaces/l2_logs_source.ts +4 -1
- package/src/interfaces/merkle_tree_operations.ts +8 -18
- package/src/interfaces/prover-client.ts +8 -0
- package/src/interfaces/validator.ts +46 -29
- package/src/interfaces/world_state.ts +4 -3
- package/src/kernel/private_kernel_tail_circuit_public_inputs.ts +9 -0
- package/src/kv-store/config.ts +36 -0
- package/src/kv-store/index.ts +1 -0
- package/src/logs/index.ts +1 -0
- package/src/logs/log_filter.ts +5 -0
- package/src/logs/message_context.ts +17 -7
- package/src/logs/pending_tagged_log.ts +1 -3
- package/src/logs/shared_secret_derivation.ts +21 -10
- package/src/logs/siloed_tag.ts +7 -2
- package/src/logs/tagging_index_range.ts +24 -0
- package/src/logs/tx_scoped_l2_log.ts +16 -0
- package/src/messaging/l1_to_l2_message.ts +12 -9
- package/src/messaging/l1_to_l2_message_source.ts +3 -1
- package/src/messaging/l2_to_l1_membership.ts +98 -33
- package/src/noir/index.ts +2 -2
- package/src/note/note_dao.ts +1 -4
- package/src/p2p/checkpoint_proposal.ts +23 -37
- package/src/p2p/peer_error.ts +7 -0
- package/src/proofs/chonk_proof.ts +91 -5
- package/src/slashing/tally.ts +22 -4
- package/src/tests/factories.ts +4 -33
- package/src/tests/mocks.ts +18 -7
- package/src/tx/block_header.ts +6 -0
- package/src/tx/capsule.ts +10 -2
- package/src/tx/global_variable_builder.ts +15 -0
- package/src/tx/private_execution_result.ts +5 -5
- package/src/tx/profiling.ts +11 -2
- package/src/tx/tx.ts +20 -11
- package/src/tx/tx_receipt.ts +7 -2
- package/src/tx/validator/error_texts.ts +11 -0
- package/src/update-checker/index.ts +2 -1
- package/src/update-checker/package_version.ts +30 -0
- package/src/update-checker/version_checker.ts +65 -0
- package/src/validators/errors.ts +9 -0
- package/src/versioning/versioning.ts +4 -1
- package/dest/contract/private_function_membership_proof.d.ts +0 -32
- package/dest/contract/private_function_membership_proof.d.ts.map +0 -1
- package/dest/contract/private_function_membership_proof.js +0 -124
- package/dest/contract/utility_function_membership_proof.d.ts +0 -27
- package/dest/contract/utility_function_membership_proof.d.ts.map +0 -1
- package/dest/contract/utility_function_membership_proof.js +0 -87
- package/dest/update-checker/update-checker.d.ts +0 -49
- package/dest/update-checker/update-checker.d.ts.map +0 -1
- package/dest/update-checker/update-checker.js +0 -130
- package/src/contract/private_function_membership_proof.ts +0 -167
- package/src/contract/utility_function_membership_proof.ts +0 -118
- package/src/update-checker/update-checker.ts +0 -166
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
# Aztec Gas and Fee Model
|
|
2
|
+
|
|
3
|
+
The minimum fee per mana and its components are computed on L1 in
|
|
4
|
+
`l1-contracts/src/core/libraries/rollup/FeeLib.sol`. This document describes the
|
|
5
|
+
formulas, the oracle lag/lifetime mechanism, and the TypeScript types in this directory.
|
|
6
|
+
|
|
7
|
+
## Mana
|
|
8
|
+
|
|
9
|
+
Aztec uses **mana** as its unit of work (analogous to Ethereum gas). Transactions consume
|
|
10
|
+
mana in two dimensions: **DA** (data availability) and **L2** (execution). The total fee
|
|
11
|
+
is `gasUsed * feePerMana` summed across both dimensions.
|
|
12
|
+
|
|
13
|
+
## Fee Components
|
|
14
|
+
|
|
15
|
+
The minimum fee per mana has four components:
|
|
16
|
+
|
|
17
|
+
### Sequencer Cost
|
|
18
|
+
|
|
19
|
+
L1 cost to propose a checkpoint (calldata gas + blob data), amortized over `manaTarget`:
|
|
20
|
+
|
|
21
|
+
```
|
|
22
|
+
sequencerCost = ((L1_GAS_PER_CHECKPOINT_PROPOSED * baseFee)
|
|
23
|
+
+ (BLOBS_PER_CHECKPOINT * BLOB_GAS_PER_BLOB * blobFee))
|
|
24
|
+
/ manaTarget
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
### Prover Cost
|
|
28
|
+
|
|
29
|
+
L1 cost to verify an epoch proof, amortized over epoch duration and `manaTarget`, plus a
|
|
30
|
+
governance-set proving cost that compensates for off-chain proof generation:
|
|
31
|
+
|
|
32
|
+
```
|
|
33
|
+
proverCost = (L1_GAS_PER_EPOCH_VERIFIED * baseFee / epochDuration) / manaTarget
|
|
34
|
+
+ provingCostPerMana
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
### Congestion Cost
|
|
38
|
+
|
|
39
|
+
An exponential surcharge when the network is congested (inspired by EIP-1559; the
|
|
40
|
+
implementation uses the `fakeExponential` Taylor series approximation from EIP-4844):
|
|
41
|
+
|
|
42
|
+
```
|
|
43
|
+
baseCost = sequencerCost + proverCost
|
|
44
|
+
congestionCost = baseCost * congestionMultiplier / MINIMUM_CONGESTION_MULTIPLIER - baseCost
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
When there is no congestion the multiplier equals `MINIMUM_CONGESTION_MULTIPLIER` (1e9)
|
|
48
|
+
and congestion cost is zero.
|
|
49
|
+
|
|
50
|
+
### Congestion Multiplier
|
|
51
|
+
|
|
52
|
+
```
|
|
53
|
+
excessMana = max(0, prevExcessMana + prevManaUsed - manaTarget)
|
|
54
|
+
congestionMultiplier = fakeExponential(MINIMUM_CONGESTION_MULTIPLIER, excessMana, denominator)
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
Each additional `manaTarget` of excess mana increases the multiplier by ~12.5%.
|
|
58
|
+
|
|
59
|
+
### Total
|
|
60
|
+
|
|
61
|
+
```
|
|
62
|
+
minFeePerMana = sequencerCost + proverCost + congestionCost
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
## L1 Gas Oracle: Lag and Lifetime
|
|
66
|
+
|
|
67
|
+
The oracle feeds Ethereum's `baseFee` and `blobFee` into the fee model using a two-phase
|
|
68
|
+
(`pre` / `post`) system that smooths out L1 fee volatility.
|
|
69
|
+
|
|
70
|
+
- **LAG = 2 slots** — when new L1 fees are observed, they activate `LAG` slots later
|
|
71
|
+
(`slotOfChange = currentSlot + LAG`). This gives mempool transactions time to land
|
|
72
|
+
before fees change.
|
|
73
|
+
- **LIFETIME = 5 slots** — after an oracle update, the next update is rejected until
|
|
74
|
+
`slotOfChange + (LIFETIME - LAG)` = 3 more slots have passed. This rate-limits how
|
|
75
|
+
frequently L1 fee data can change.
|
|
76
|
+
|
|
77
|
+
Fee resolution at a given timestamp:
|
|
78
|
+
|
|
79
|
+
```
|
|
80
|
+
if slot < slotOfChange → use pre (old fees)
|
|
81
|
+
else → use post (new fees)
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
**Net effect**: L1 fee changes reach L2 with a 2-slot delay and can update at most once
|
|
85
|
+
every 5 slots.
|
|
86
|
+
|
|
87
|
+
## Fee Asset Price
|
|
88
|
+
|
|
89
|
+
Fees are computed in ETH internally but converted to the fee asset (Fee Juice) via
|
|
90
|
+
`ethPerFeeAsset` (1e12 precision). The price updates at most ±1% (±100 bps) per
|
|
91
|
+
checkpoint:
|
|
92
|
+
|
|
93
|
+
```
|
|
94
|
+
newPrice = currentPrice * (10000 + modifierBps) / 10000
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
## Maximum Fee Change Rate
|
|
98
|
+
|
|
99
|
+
| Component | Bound |
|
|
100
|
+
| ---------------------- | ------------------------------------------------------- |
|
|
101
|
+
| L1 base fee / blob fee | At most once every 5 slots (oracle LIFETIME) |
|
|
102
|
+
| Fee asset price | ±1% per checkpoint |
|
|
103
|
+
| Congestion multiplier | Depends on excess mana accumulation/drain per checkpoint |
|
|
104
|
+
| Sequencer/prover costs | Scale linearly with L1 fees |
|
|
105
|
+
|
|
106
|
+
## Key Constants
|
|
107
|
+
|
|
108
|
+
| Constant | Value |
|
|
109
|
+
| ------------------------------ | -------------- |
|
|
110
|
+
| `L1_GAS_PER_CHECKPOINT_PROPOSED` | 300,000 |
|
|
111
|
+
| `L1_GAS_PER_EPOCH_VERIFIED` | 3,600,000 |
|
|
112
|
+
| `BLOBS_PER_CHECKPOINT` | 3 |
|
|
113
|
+
| `BLOB_GAS_PER_BLOB` | 2^17 |
|
|
114
|
+
| `MINIMUM_CONGESTION_MULTIPLIER` | 1e9 |
|
|
115
|
+
| `LAG` | 2 slots |
|
|
116
|
+
| `LIFETIME` | 5 slots |
|
|
117
|
+
|
|
118
|
+
## TypeScript Types
|
|
119
|
+
|
|
120
|
+
- **`Gas`** — mana quantity in two dimensions (`daGas`, `l2Gas`).
|
|
121
|
+
- **`GasFees`** — per-unit price in each dimension (`feePerDaGas`, `feePerL2Gas`).
|
|
122
|
+
- **`GasSettings`** — sender-chosen fee parameters: gas limits, teardown limits, max fees, priority fees.
|
|
123
|
+
- **`GasUsed`** — actual consumption after execution. Note: `billedGas` uses the teardown gas *limit*, not actual usage.
|
package/src/ha-signing/config.ts
CHANGED
|
@@ -13,14 +13,9 @@ import type { ZodFor } from '@aztec/foundation/schemas';
|
|
|
13
13
|
import { z } from 'zod';
|
|
14
14
|
|
|
15
15
|
/**
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
* This config is used for distributed locking and slashing protection
|
|
19
|
-
* when running multiple validator nodes in a high-availability setup.
|
|
16
|
+
* Base signing protection configuration shared by both HA (Postgres) and local (LMDB) signers.
|
|
20
17
|
*/
|
|
21
|
-
export interface
|
|
22
|
-
/** Whether HA signing / slashing protection is enabled */
|
|
23
|
-
haSigningEnabled: boolean;
|
|
18
|
+
export interface BaseSignerConfig {
|
|
24
19
|
/** L1 contract addresses (rollup address required) */
|
|
25
20
|
l1Contracts: Pick<L1ContractAddresses, 'rollupAddress'>;
|
|
26
21
|
/** Unique identifier for this node */
|
|
@@ -33,30 +28,9 @@ export interface ValidatorHASignerConfig {
|
|
|
33
28
|
maxStuckDutiesAgeMs?: number;
|
|
34
29
|
/** Optional: clean up old duties after this many hours (disabled if not set) */
|
|
35
30
|
cleanupOldDutiesAfterHours?: number;
|
|
36
|
-
/**
|
|
37
|
-
* PostgreSQL connection string
|
|
38
|
-
* Format: postgresql://user:password@host:port/database
|
|
39
|
-
*/
|
|
40
|
-
databaseUrl?: string;
|
|
41
|
-
/**
|
|
42
|
-
* PostgreSQL connection pool configuration
|
|
43
|
-
*/
|
|
44
|
-
/** Maximum number of clients in the pool (default: 10) */
|
|
45
|
-
poolMaxCount?: number;
|
|
46
|
-
/** Minimum number of clients in the pool (default: 0) */
|
|
47
|
-
poolMinCount?: number;
|
|
48
|
-
/** Idle timeout in milliseconds (default: 10000) */
|
|
49
|
-
poolIdleTimeoutMs?: number;
|
|
50
|
-
/** Connection timeout in milliseconds (default: 0, no timeout) */
|
|
51
|
-
poolConnectionTimeoutMs?: number;
|
|
52
31
|
}
|
|
53
32
|
|
|
54
|
-
export const
|
|
55
|
-
haSigningEnabled: {
|
|
56
|
-
env: 'VALIDATOR_HA_SIGNING_ENABLED',
|
|
57
|
-
description: 'Whether HA signing / slashing protection is enabled',
|
|
58
|
-
...booleanConfigHelper(false),
|
|
59
|
-
},
|
|
33
|
+
export const baseSignerConfigMappings: ConfigMappingsType<BaseSignerConfig> = {
|
|
60
34
|
l1Contracts: {
|
|
61
35
|
description: 'L1 contract addresses (rollup address required)',
|
|
62
36
|
nested: {
|
|
@@ -91,6 +65,47 @@ export const validatorHASignerConfigMappings: ConfigMappingsType<ValidatorHASign
|
|
|
91
65
|
description: 'Optional: clean up old duties after this many hours (disabled if not set)',
|
|
92
66
|
...optionalNumberConfigHelper(),
|
|
93
67
|
},
|
|
68
|
+
};
|
|
69
|
+
|
|
70
|
+
export const BaseSignerConfigSchema = z.object({
|
|
71
|
+
l1Contracts: z.object({ rollupAddress: z.instanceof(EthAddress) }),
|
|
72
|
+
nodeId: z.string(),
|
|
73
|
+
pollingIntervalMs: z.number().min(0),
|
|
74
|
+
signingTimeoutMs: z.number().min(0),
|
|
75
|
+
maxStuckDutiesAgeMs: z.number().min(0).optional(),
|
|
76
|
+
cleanupOldDutiesAfterHours: z.number().min(0).optional(),
|
|
77
|
+
}) satisfies ZodFor<BaseSignerConfig>;
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* Configuration for the Validator HA Signer.
|
|
81
|
+
*
|
|
82
|
+
* Extends BaseSignerConfig with a flag to enable HA mode and Postgres connection settings.
|
|
83
|
+
*/
|
|
84
|
+
export interface ValidatorHASignerConfig extends BaseSignerConfig {
|
|
85
|
+
/** Whether HA signing / slashing protection is enabled */
|
|
86
|
+
haSigningEnabled: boolean;
|
|
87
|
+
/**
|
|
88
|
+
* PostgreSQL connection string
|
|
89
|
+
* Format: postgresql://user:password@host:port/database
|
|
90
|
+
*/
|
|
91
|
+
databaseUrl?: string;
|
|
92
|
+
/** Maximum number of clients in the pool (default: 10) */
|
|
93
|
+
poolMaxCount?: number;
|
|
94
|
+
/** Minimum number of clients in the pool (default: 0) */
|
|
95
|
+
poolMinCount?: number;
|
|
96
|
+
/** Idle timeout in milliseconds (default: 10000) */
|
|
97
|
+
poolIdleTimeoutMs?: number;
|
|
98
|
+
/** Connection timeout in milliseconds (default: 0, no timeout) */
|
|
99
|
+
poolConnectionTimeoutMs?: number;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
export const validatorHASignerConfigMappings: ConfigMappingsType<ValidatorHASignerConfig> = {
|
|
103
|
+
...baseSignerConfigMappings,
|
|
104
|
+
haSigningEnabled: {
|
|
105
|
+
env: 'VALIDATOR_HA_SIGNING_ENABLED',
|
|
106
|
+
description: 'Whether HA signing / slashing protection is enabled',
|
|
107
|
+
...booleanConfigHelper(false),
|
|
108
|
+
},
|
|
94
109
|
databaseUrl: {
|
|
95
110
|
env: 'VALIDATOR_HA_DATABASE_URL',
|
|
96
111
|
description:
|
|
@@ -131,16 +146,8 @@ export function getConfigEnvVars(): ValidatorHASignerConfig {
|
|
|
131
146
|
return getConfigFromMappings<ValidatorHASignerConfig>(validatorHASignerConfigMappings);
|
|
132
147
|
}
|
|
133
148
|
|
|
134
|
-
export const ValidatorHASignerConfigSchema =
|
|
149
|
+
export const ValidatorHASignerConfigSchema = BaseSignerConfigSchema.extend({
|
|
135
150
|
haSigningEnabled: z.boolean(),
|
|
136
|
-
l1Contracts: z.object({
|
|
137
|
-
rollupAddress: z.instanceof(EthAddress),
|
|
138
|
-
}),
|
|
139
|
-
nodeId: z.string(),
|
|
140
|
-
pollingIntervalMs: z.number().min(0),
|
|
141
|
-
signingTimeoutMs: z.number().min(0),
|
|
142
|
-
maxStuckDutiesAgeMs: z.number().min(0).optional(),
|
|
143
|
-
cleanupOldDutiesAfterHours: z.number().min(0).optional(),
|
|
144
151
|
databaseUrl: z.string().optional(),
|
|
145
152
|
poolMaxCount: z.number().min(0).optional(),
|
|
146
153
|
poolMinCount: z.number().min(0).optional(),
|
package/src/ha-signing/index.ts
CHANGED
|
@@ -1,10 +1,19 @@
|
|
|
1
1
|
export {
|
|
2
|
+
type BaseSignerConfig,
|
|
3
|
+
BaseSignerConfigSchema,
|
|
4
|
+
baseSignerConfigMappings,
|
|
2
5
|
type ValidatorHASignerConfig,
|
|
3
6
|
ValidatorHASignerConfigSchema,
|
|
4
7
|
defaultValidatorHASignerConfig,
|
|
5
8
|
getConfigEnvVars,
|
|
6
9
|
validatorHASignerConfigMappings,
|
|
7
10
|
} from './config.js';
|
|
11
|
+
export {
|
|
12
|
+
type LocalSignerConfig,
|
|
13
|
+
LocalSignerConfigSchema,
|
|
14
|
+
getLocalSignerConfigEnvVars,
|
|
15
|
+
localSignerConfigMappings,
|
|
16
|
+
} from './local_config.js';
|
|
8
17
|
export {
|
|
9
18
|
DutyType,
|
|
10
19
|
type BlockProposalSigningContext,
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { type ConfigMappingsType, getConfigFromMappings } from '@aztec/foundation/config';
|
|
2
|
+
import { zodFor } from '@aztec/foundation/schemas';
|
|
3
|
+
import { type DataStoreConfig, dataConfigMappings } from '@aztec/stdlib/kv-store';
|
|
4
|
+
|
|
5
|
+
import { z } from 'zod';
|
|
6
|
+
|
|
7
|
+
import { type BaseSignerConfig, BaseSignerConfigSchema, baseSignerConfigMappings } from './config.js';
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Configuration for local (single-node) slashing protection.
|
|
11
|
+
*
|
|
12
|
+
* Combines the base signing protection fields (shared with HA mode) with
|
|
13
|
+
* DataStoreConfig for the local LMDB backing store, plus a per-store map-size
|
|
14
|
+
* override. Used when HA signing is disabled.
|
|
15
|
+
*/
|
|
16
|
+
export type LocalSignerConfig = BaseSignerConfig &
|
|
17
|
+
DataStoreConfig & {
|
|
18
|
+
/** Maximum size of the local signing-protection LMDB store in KB. Overwrites the general dataStoreMapSizeKb. */
|
|
19
|
+
signingProtectionMapSizeKb?: number;
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
export const localSignerConfigMappings: ConfigMappingsType<LocalSignerConfig> = {
|
|
23
|
+
...baseSignerConfigMappings,
|
|
24
|
+
...dataConfigMappings,
|
|
25
|
+
signingProtectionMapSizeKb: {
|
|
26
|
+
env: 'SIGNING_PROTECTION_MAP_SIZE_KB',
|
|
27
|
+
description:
|
|
28
|
+
'Maximum size of the local signing-protection LMDB store in KB. Overwrites the general dataStoreMapSizeKb.',
|
|
29
|
+
parseEnv: (val: string | undefined) => (val ? +val : undefined),
|
|
30
|
+
},
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
export const LocalSignerConfigSchema = zodFor<LocalSignerConfig>()(
|
|
34
|
+
BaseSignerConfigSchema.extend({
|
|
35
|
+
dataDirectory: z.string().optional(),
|
|
36
|
+
dataStoreMapSizeKb: z.number(),
|
|
37
|
+
signingProtectionMapSizeKb: z.number().optional(),
|
|
38
|
+
}),
|
|
39
|
+
);
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Returns the local signer configuration from environment variables.
|
|
43
|
+
*/
|
|
44
|
+
export function getLocalSignerConfigEnvVars(): LocalSignerConfig {
|
|
45
|
+
return getConfigFromMappings<LocalSignerConfig>(localSignerConfigMappings);
|
|
46
|
+
}
|
package/src/hash/hash.ts
CHANGED
|
@@ -58,6 +58,35 @@ export function siloNullifier(contract: AztecAddress, innerNullifier: Fr): Promi
|
|
|
58
58
|
return poseidon2HashWithSeparator([contract, innerNullifier], DomainSeparator.SILOED_NULLIFIER);
|
|
59
59
|
}
|
|
60
60
|
|
|
61
|
+
/**
|
|
62
|
+
* Computes the siloed private initialization nullifier for a contract, given its address and initialization hash.
|
|
63
|
+
* @param contract - The contract address.
|
|
64
|
+
* @param initializationHash - The contract's initialization hash.
|
|
65
|
+
* @returns The siloed private initialization nullifier.
|
|
66
|
+
*/
|
|
67
|
+
export async function computeSiloedPrivateInitializationNullifier(
|
|
68
|
+
contract: AztecAddress,
|
|
69
|
+
initializationHash: Fr,
|
|
70
|
+
): Promise<Fr> {
|
|
71
|
+
const innerNullifier = await poseidon2HashWithSeparator(
|
|
72
|
+
[contract, initializationHash],
|
|
73
|
+
DomainSeparator.PRIVATE_INITIALIZATION_NULLIFIER,
|
|
74
|
+
);
|
|
75
|
+
return siloNullifier(contract, innerNullifier);
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* Computes the siloed public initialization nullifier for a contract. Not all contracts emit this nullifier: it is only
|
|
80
|
+
* emitted when the contract has public functions that perform initialization checks (i.e. external public functions that
|
|
81
|
+
* are not `#[noinitcheck]` or `#[only_self]`).
|
|
82
|
+
* @param contract - The contract address.
|
|
83
|
+
* @returns The siloed public initialization nullifier.
|
|
84
|
+
*/
|
|
85
|
+
export async function computeSiloedPublicInitializationNullifier(contract: AztecAddress): Promise<Fr> {
|
|
86
|
+
const innerNullifier = await poseidon2HashWithSeparator([contract], DomainSeparator.PUBLIC_INITIALIZATION_NULLIFIER);
|
|
87
|
+
return siloNullifier(contract, innerNullifier);
|
|
88
|
+
}
|
|
89
|
+
|
|
61
90
|
/**
|
|
62
91
|
* Computes the protocol nullifier, which is the hash of the initial tx request siloed with the null msg sender address.
|
|
63
92
|
* @param txRequestHash - The hash of the initial tx request.
|
|
@@ -69,6 +98,11 @@ export function computeProtocolNullifier(txRequestHash: Fr): Promise<Fr> {
|
|
|
69
98
|
return siloNullifier(AztecAddress.fromBigInt(NULL_MSG_SENDER_CONTRACT_ADDRESS), txRequestHash);
|
|
70
99
|
}
|
|
71
100
|
|
|
101
|
+
/** Domain-separates a raw log tag with the given domain separator. */
|
|
102
|
+
export function computeLogTag(rawTag: number | bigint | boolean | Fr | Buffer, domSep: DomainSeparator): Promise<Fr> {
|
|
103
|
+
return poseidon2HashWithSeparator([new Fr(rawTag)], domSep);
|
|
104
|
+
}
|
|
105
|
+
|
|
72
106
|
export function computeSiloedPrivateLogFirstField(contract: AztecAddress, field: Fr): Promise<Fr> {
|
|
73
107
|
return poseidon2HashWithSeparator([contract, field], DomainSeparator.PRIVATE_LOG_FIRST_FIELD);
|
|
74
108
|
}
|
|
@@ -6,14 +6,38 @@ import type { FunctionSelector } from '../abi/function_selector.js';
|
|
|
6
6
|
import type { AztecAddress } from '../aztec-address/index.js';
|
|
7
7
|
import { schemas, zodFor } from '../schemas/index.js';
|
|
8
8
|
|
|
9
|
-
type AllowedInstanceFunction = {
|
|
10
|
-
|
|
9
|
+
type AllowedInstanceFunction = {
|
|
10
|
+
address: AztecAddress;
|
|
11
|
+
selector: FunctionSelector;
|
|
12
|
+
onlySelf?: boolean;
|
|
13
|
+
rejectNullMsgSender?: boolean;
|
|
14
|
+
calldataLength?: number;
|
|
15
|
+
};
|
|
16
|
+
type AllowedClassFunction = {
|
|
17
|
+
classId: Fr;
|
|
18
|
+
selector: FunctionSelector;
|
|
19
|
+
onlySelf?: boolean;
|
|
20
|
+
rejectNullMsgSender?: boolean;
|
|
21
|
+
calldataLength?: number;
|
|
22
|
+
};
|
|
11
23
|
|
|
12
24
|
export type AllowedElement = AllowedInstanceFunction | AllowedClassFunction;
|
|
13
25
|
|
|
14
26
|
export const AllowedElementSchema = zodFor<AllowedElement>()(
|
|
15
27
|
z.union([
|
|
16
|
-
z.object({
|
|
17
|
-
|
|
28
|
+
z.object({
|
|
29
|
+
address: schemas.AztecAddress,
|
|
30
|
+
selector: schemas.FunctionSelector,
|
|
31
|
+
onlySelf: z.boolean().optional(),
|
|
32
|
+
rejectNullMsgSender: z.boolean().optional(),
|
|
33
|
+
calldataLength: z.number().optional(),
|
|
34
|
+
}),
|
|
35
|
+
z.object({
|
|
36
|
+
classId: schemas.Fr,
|
|
37
|
+
selector: schemas.FunctionSelector,
|
|
38
|
+
onlySelf: z.boolean().optional(),
|
|
39
|
+
rejectNullMsgSender: z.boolean().optional(),
|
|
40
|
+
calldataLength: z.number().optional(),
|
|
41
|
+
}),
|
|
18
42
|
]),
|
|
19
43
|
);
|
|
@@ -11,7 +11,7 @@ import { L2Block } from '../block/l2_block.js';
|
|
|
11
11
|
import { type L2BlockSource, L2TipsSchema } from '../block/l2_block_source.js';
|
|
12
12
|
import { ValidateCheckpointResultSchema } from '../block/validate_block_result.js';
|
|
13
13
|
import { Checkpoint } from '../checkpoint/checkpoint.js';
|
|
14
|
-
import { CheckpointDataSchema } from '../checkpoint/checkpoint_data.js';
|
|
14
|
+
import { CheckpointDataSchema, ProposedCheckpointDataSchema } from '../checkpoint/checkpoint_data.js';
|
|
15
15
|
import { PublishedCheckpoint } from '../checkpoint/published_checkpoint.js';
|
|
16
16
|
import {
|
|
17
17
|
ContractClassPublicSchema,
|
|
@@ -86,6 +86,7 @@ export const ArchiverApiSchema: ApiSchemaFor<ArchiverApi> = {
|
|
|
86
86
|
getBlockNumber: z.function().args().returns(BlockNumberSchema),
|
|
87
87
|
getProvenBlockNumber: z.function().args().returns(BlockNumberSchema),
|
|
88
88
|
getCheckpointedL2BlockNumber: z.function().args().returns(BlockNumberSchema),
|
|
89
|
+
getCheckpointNumber: z.function().args().returns(CheckpointNumberSchema),
|
|
89
90
|
getFinalizedL2BlockNumber: z.function().args().returns(BlockNumberSchema),
|
|
90
91
|
getBlock: z.function().args(BlockNumberSchema).returns(L2Block.schema.optional()),
|
|
91
92
|
getBlockHeader: z
|
|
@@ -113,8 +114,8 @@ export const ArchiverApiSchema: ApiSchemaFor<ArchiverApi> = {
|
|
|
113
114
|
getL2BlockByArchive: z.function().args(schemas.Fr).returns(L2Block.schema.optional()),
|
|
114
115
|
getTxEffect: z.function().args(TxHash.schema).returns(indexedTxSchema().optional()),
|
|
115
116
|
getSettledTxReceipt: z.function().args(TxHash.schema).returns(TxReceipt.schema.optional()),
|
|
116
|
-
|
|
117
|
-
|
|
117
|
+
getSyncedL2SlotNumber: z.function().args().returns(schemas.SlotNumber.optional()),
|
|
118
|
+
getSyncedL2EpochNumber: z.function().args().returns(EpochNumberSchema.optional()),
|
|
118
119
|
getCheckpointsForEpoch: z.function().args(EpochNumberSchema).returns(z.array(Checkpoint.schema)),
|
|
119
120
|
getCheckpointsDataForEpoch: z.function().args(EpochNumberSchema).returns(z.array(CheckpointDataSchema)),
|
|
120
121
|
getCheckpointedBlocksForEpoch: z.function().args(EpochNumberSchema).returns(z.array(CheckpointedL2Block.schema)),
|
|
@@ -149,6 +150,8 @@ export const ArchiverApiSchema: ApiSchemaFor<ArchiverApi> = {
|
|
|
149
150
|
.args()
|
|
150
151
|
.returns(z.object({ genesisArchiveRoot: schemas.Fr })),
|
|
151
152
|
getL1Timestamp: z.function().args().returns(schemas.BigInt.optional()),
|
|
153
|
+
getProposedCheckpoint: z.function().args().returns(ProposedCheckpointDataSchema.optional()),
|
|
154
|
+
getProposedCheckpointOnly: z.function().args().returns(ProposedCheckpointDataSchema.optional()),
|
|
152
155
|
syncImmediate: z.function().args().returns(z.void()),
|
|
153
156
|
isPendingChainInvalid: z.function().args().returns(z.boolean()),
|
|
154
157
|
getPendingChainValidationStatus: z.function().args().returns(ValidateCheckpointResultSchema),
|
|
@@ -4,7 +4,9 @@ import {
|
|
|
4
4
|
BlockNumber,
|
|
5
5
|
BlockNumberPositiveSchema,
|
|
6
6
|
BlockNumberSchema,
|
|
7
|
+
CheckpointNumber,
|
|
7
8
|
CheckpointNumberPositiveSchema,
|
|
9
|
+
CheckpointNumberSchema,
|
|
8
10
|
EpochNumber,
|
|
9
11
|
EpochNumberSchema,
|
|
10
12
|
type SlotNumber,
|
|
@@ -23,6 +25,7 @@ import { CheckpointedL2Block } from '../block/checkpointed_l2_block.js';
|
|
|
23
25
|
import { type DataInBlock, dataInBlockSchemaFor } from '../block/in_block.js';
|
|
24
26
|
import { L2Block } from '../block/l2_block.js';
|
|
25
27
|
import { type L2BlockSource, type L2Tips, L2TipsSchema } from '../block/l2_block_source.js';
|
|
28
|
+
import { CheckpointDataSchema } from '../checkpoint/checkpoint_data.js';
|
|
26
29
|
import { PublishedCheckpoint } from '../checkpoint/published_checkpoint.js';
|
|
27
30
|
import {
|
|
28
31
|
type ContractClassPublic,
|
|
@@ -72,7 +75,12 @@ import { type WorldStateSyncStatus, WorldStateSyncStatusSchema } from './world_s
|
|
|
72
75
|
export interface AztecNode
|
|
73
76
|
extends Pick<
|
|
74
77
|
L2BlockSource,
|
|
75
|
-
|
|
78
|
+
| 'getBlocks'
|
|
79
|
+
| 'getCheckpoints'
|
|
80
|
+
| 'getBlockHeader'
|
|
81
|
+
| 'getL2Tips'
|
|
82
|
+
| 'getCheckpointedBlocks'
|
|
83
|
+
| 'getCheckpointsDataForEpoch'
|
|
76
84
|
> {
|
|
77
85
|
/**
|
|
78
86
|
* Returns the tips of the L2 chain.
|
|
@@ -114,6 +122,7 @@ export interface AztecNode
|
|
|
114
122
|
* @param referenceBlock - The block parameter (block number, block hash, or 'latest') at which to get the data.
|
|
115
123
|
* @param nullifier - Nullifier we try to find the low nullifier witness for.
|
|
116
124
|
* @returns The low nullifier membership witness (if found).
|
|
125
|
+
* @throws If the nullifier already exists in the tree, since non-inclusion cannot be proven.
|
|
117
126
|
* @remarks Low nullifier witness can be used to perform a nullifier non-inclusion proof by leveraging the "linked
|
|
118
127
|
* list structure" of leaves and proving that a lower nullifier is pointing to a bigger next value than the nullifier
|
|
119
128
|
* we are trying to prove non-inclusion for.
|
|
@@ -172,14 +181,14 @@ export interface AztecNode
|
|
|
172
181
|
l1ToL2Message: Fr,
|
|
173
182
|
): Promise<[bigint, SiblingPath<typeof L1_TO_L2_MSG_TREE_HEIGHT>] | undefined>;
|
|
174
183
|
|
|
175
|
-
/** Returns the L2
|
|
176
|
-
|
|
184
|
+
/** Returns the L2 checkpoint number in which this L1 to L2 message becomes available, or undefined if not found. */
|
|
185
|
+
getL1ToL2MessageCheckpoint(l1ToL2Message: Fr): Promise<CheckpointNumber | undefined>;
|
|
177
186
|
|
|
178
187
|
/**
|
|
179
188
|
* Returns whether an L1 to L2 message is synced by archiver.
|
|
180
189
|
* @param l1ToL2Message - The L1 to L2 message to check.
|
|
181
190
|
* @returns Whether the message is synced.
|
|
182
|
-
* @deprecated Use `
|
|
191
|
+
* @deprecated Use `getL1ToL2MessageCheckpoint` instead. This method may return true even if the message is not ready to use.
|
|
183
192
|
*/
|
|
184
193
|
isL1ToL2MessageSynced(l1ToL2Message: Fr): Promise<boolean>;
|
|
185
194
|
|
|
@@ -230,6 +239,12 @@ export interface AztecNode
|
|
|
230
239
|
*/
|
|
231
240
|
getCheckpointedBlockNumber(): Promise<BlockNumber>;
|
|
232
241
|
|
|
242
|
+
/**
|
|
243
|
+
* Method to fetch the latest checkpoint number synchronized by the node.
|
|
244
|
+
* @returns The checkpoint number.
|
|
245
|
+
*/
|
|
246
|
+
getCheckpointNumber(): Promise<CheckpointNumber>;
|
|
247
|
+
|
|
233
248
|
/**
|
|
234
249
|
* Method to determine if the node is ready to accept transactions.
|
|
235
250
|
* @returns - Flag indicating the readiness for tx submission.
|
|
@@ -517,7 +532,7 @@ export const AztecNodeApiSchema: ApiSchemaFor<AztecNode> = {
|
|
|
517
532
|
.args(BlockParameterSchema, schemas.Fr)
|
|
518
533
|
.returns(z.tuple([schemas.BigInt, SiblingPath.schemaFor(L1_TO_L2_MSG_TREE_HEIGHT)]).optional()),
|
|
519
534
|
|
|
520
|
-
|
|
535
|
+
getL1ToL2MessageCheckpoint: z.function().args(schemas.Fr).returns(CheckpointNumberSchema.optional()),
|
|
521
536
|
|
|
522
537
|
isL1ToL2MessageSynced: z.function().args(schemas.Fr).returns(z.boolean()),
|
|
523
538
|
|
|
@@ -534,6 +549,8 @@ export const AztecNodeApiSchema: ApiSchemaFor<AztecNode> = {
|
|
|
534
549
|
|
|
535
550
|
getBlockNumber: z.function().returns(BlockNumberSchema),
|
|
536
551
|
|
|
552
|
+
getCheckpointNumber: z.function().returns(CheckpointNumberSchema),
|
|
553
|
+
|
|
537
554
|
getProvenBlockNumber: z.function().returns(BlockNumberSchema),
|
|
538
555
|
|
|
539
556
|
getCheckpointedBlockNumber: z.function().returns(BlockNumberSchema),
|
|
@@ -557,6 +574,8 @@ export const AztecNodeApiSchema: ApiSchemaFor<AztecNode> = {
|
|
|
557
574
|
.args(BlockNumberPositiveSchema, z.number().gt(0).lte(MAX_RPC_BLOCKS_LEN))
|
|
558
575
|
.returns(z.array(CheckpointedL2Block.schema)),
|
|
559
576
|
|
|
577
|
+
getCheckpointsDataForEpoch: z.function().args(EpochNumberSchema).returns(z.array(CheckpointDataSchema)),
|
|
578
|
+
|
|
560
579
|
getCurrentMinFees: z.function().returns(GasFees.schema),
|
|
561
580
|
|
|
562
581
|
getMaxPriorityFees: z.function().returns(GasFees.schema),
|
|
@@ -35,24 +35,59 @@ export interface IBlockFactory extends ProcessedTxHandler {
|
|
|
35
35
|
setBlockCompleted(expectedBlockHeader?: BlockHeader): Promise<L2Block>;
|
|
36
36
|
}
|
|
37
37
|
|
|
38
|
-
|
|
38
|
+
/** Limits passed to the public processor for tx processing within a block. */
|
|
39
|
+
export type PublicProcessorLimits = {
|
|
40
|
+
/** Maximum number of txs to process. */
|
|
39
41
|
maxTransactions?: number;
|
|
40
|
-
|
|
42
|
+
/** L2 and DA gas limits. */
|
|
41
43
|
maxBlockGas?: Gas;
|
|
44
|
+
/** Maximum number of blob fields allowed. */
|
|
42
45
|
maxBlobFields?: number;
|
|
46
|
+
/** Deadline for processing the txs. Processor will stop as soon as it hits this time. */
|
|
43
47
|
deadline?: Date;
|
|
44
|
-
|
|
48
|
+
/** Whether this processor is building a proposal (as opposed to re-executing one). Skipping txs due to gas or blob limits is only done during proposal building. */
|
|
49
|
+
isBuildingProposal?: boolean;
|
|
50
|
+
};
|
|
51
|
+
|
|
52
|
+
/** Base fields shared by both proposer and validator block builder options. */
|
|
53
|
+
type BlockBuilderOptionsBase = PublicProcessorLimits & {
|
|
54
|
+
/** Minimum number of successfully processed txs required. Block is rejected if fewer succeed. */
|
|
55
|
+
minValidTxs: number;
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
/** Proposer mode: redistribution params are required. */
|
|
59
|
+
type ProposerBlockBuilderOptions = BlockBuilderOptionsBase & {
|
|
60
|
+
isBuildingProposal: true;
|
|
61
|
+
/** Maximum number of blocks per checkpoint, derived from the timetable. */
|
|
62
|
+
maxBlocksPerCheckpoint: number;
|
|
63
|
+
/** Per-block gas budget multiplier. Budget = (remaining / remainingBlocks) * multiplier. */
|
|
64
|
+
perBlockAllocationMultiplier: number;
|
|
65
|
+
};
|
|
66
|
+
|
|
67
|
+
/** Validator mode: no redistribution params needed. */
|
|
68
|
+
type ValidatorBlockBuilderOptions = BlockBuilderOptionsBase & {
|
|
69
|
+
isBuildingProposal: false;
|
|
70
|
+
};
|
|
71
|
+
|
|
72
|
+
/** Options for building a block within a checkpoint. When proposing, redistribution params are required. */
|
|
73
|
+
export type BlockBuilderOptions = ProposerBlockBuilderOptions | ValidatorBlockBuilderOptions;
|
|
45
74
|
|
|
46
75
|
export interface PublicProcessorValidator {
|
|
47
76
|
preprocessValidator?: TxValidator<Tx>;
|
|
48
77
|
nullifierCache?: { addNullifiers: (nullifiers: Buffer[]) => void };
|
|
49
78
|
}
|
|
50
79
|
|
|
51
|
-
export type FullNodeBlockBuilderConfig = Pick<L1RollupConstants, 'l1GenesisTime' | 'slotDuration'> &
|
|
80
|
+
export type FullNodeBlockBuilderConfig = Pick<L1RollupConstants, 'l1GenesisTime' | 'slotDuration' | 'rollupManaLimit'> &
|
|
52
81
|
Pick<ChainConfig, 'l1ChainId' | 'rollupVersion'> &
|
|
53
82
|
Pick<
|
|
54
83
|
SequencerConfig,
|
|
55
|
-
|
|
84
|
+
| 'txPublicSetupAllowListExtend'
|
|
85
|
+
| 'fakeProcessingDelayPerTxMs'
|
|
86
|
+
| 'fakeThrowAfterProcessingTxCount'
|
|
87
|
+
| 'maxTxsPerBlock'
|
|
88
|
+
| 'maxTxsPerCheckpoint'
|
|
89
|
+
| 'maxL2BlockGas'
|
|
90
|
+
| 'maxDABlockGas'
|
|
56
91
|
>;
|
|
57
92
|
|
|
58
93
|
export const FullNodeBlockBuilderConfigKeys: (keyof FullNodeBlockBuilderConfig)[] = [
|
|
@@ -63,34 +98,42 @@ export const FullNodeBlockBuilderConfigKeys: (keyof FullNodeBlockBuilderConfig)[
|
|
|
63
98
|
'txPublicSetupAllowListExtend',
|
|
64
99
|
'fakeProcessingDelayPerTxMs',
|
|
65
100
|
'fakeThrowAfterProcessingTxCount',
|
|
101
|
+
'maxTxsPerBlock',
|
|
102
|
+
'maxTxsPerCheckpoint',
|
|
103
|
+
'maxL2BlockGas',
|
|
104
|
+
'maxDABlockGas',
|
|
105
|
+
'rollupManaLimit',
|
|
66
106
|
] as const;
|
|
67
107
|
|
|
68
|
-
/** Thrown when
|
|
69
|
-
export class
|
|
70
|
-
constructor(
|
|
71
|
-
|
|
72
|
-
|
|
108
|
+
/** Thrown when the number of successfully processed transactions is below the required minimum. */
|
|
109
|
+
export class InsufficientValidTxsError extends Error {
|
|
110
|
+
constructor(
|
|
111
|
+
public readonly processedCount: number,
|
|
112
|
+
public readonly minRequired: number,
|
|
113
|
+
public readonly failedTxs: FailedTx[],
|
|
114
|
+
) {
|
|
115
|
+
super(`Insufficient valid txs: got ${processedCount} but need ${minRequired}`);
|
|
116
|
+
this.name = 'InsufficientValidTxsError';
|
|
73
117
|
}
|
|
74
118
|
}
|
|
75
119
|
|
|
76
120
|
/** Result of building a block within a checkpoint. */
|
|
77
121
|
export type BuildBlockInCheckpointResult = {
|
|
78
122
|
block: L2Block;
|
|
79
|
-
publicGas: Gas;
|
|
80
123
|
publicProcessorDuration: number;
|
|
81
124
|
numTxs: number;
|
|
82
125
|
failedTxs: FailedTx[];
|
|
83
126
|
usedTxs: Tx[];
|
|
84
|
-
usedTxBlobFields: number;
|
|
85
127
|
};
|
|
86
128
|
|
|
87
129
|
/** Interface for building blocks within a checkpoint context. */
|
|
88
130
|
export interface ICheckpointBlockBuilder {
|
|
131
|
+
/** Builds a single block within this checkpoint. Throws InsufficientValidTxsError if fewer than minValidTxs succeed. */
|
|
89
132
|
buildBlock(
|
|
90
133
|
pendingTxs: Iterable<Tx> | AsyncIterable<Tx>,
|
|
91
134
|
blockNumber: BlockNumber,
|
|
92
135
|
timestamp: bigint,
|
|
93
|
-
opts:
|
|
136
|
+
opts: BlockBuilderOptions,
|
|
94
137
|
): Promise<BuildBlockInCheckpointResult>;
|
|
95
138
|
}
|
|
96
139
|
|