@aztec/stdlib 0.0.1-commit.e588bc7e5 → 0.0.1-commit.e5a3663dd
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/authorization_selector.d.ts +3 -6
- package/dest/abi/authorization_selector.d.ts.map +1 -1
- package/dest/abi/encoder.d.ts +1 -1
- package/dest/abi/encoder.d.ts.map +1 -1
- package/dest/abi/encoder.js +32 -6
- package/dest/abi/event_selector.d.ts +3 -6
- package/dest/abi/event_selector.d.ts.map +1 -1
- package/dest/abi/function_selector.d.ts +3 -6
- package/dest/abi/function_selector.d.ts.map +1 -1
- package/dest/abi/function_selector.js +1 -3
- package/dest/abi/note_selector.d.ts +3 -6
- package/dest/abi/note_selector.d.ts.map +1 -1
- package/dest/abi/note_selector.js +1 -3
- package/dest/abi/selector.d.ts +2 -2
- package/dest/abi/selector.d.ts.map +1 -1
- package/dest/abi/selector.js +1 -1
- package/dest/avm/revert_code.d.ts +8 -18
- package/dest/avm/revert_code.d.ts.map +1 -1
- package/dest/avm/revert_code.js +15 -30
- package/dest/aztec-address/index.d.ts +3 -6
- package/dest/aztec-address/index.d.ts.map +1 -1
- package/dest/aztec-address/index.js +2 -4
- 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 +297 -8
- package/dest/block/block_data.d.ts.map +1 -1
- package/dest/block/block_data.js +16 -2
- package/dest/block/block_hash.d.ts +11 -10
- package/dest/block/block_hash.d.ts.map +1 -1
- package/dest/block/block_hash.js +10 -9
- package/dest/block/block_parameter.d.ts +30 -3
- package/dest/block/block_parameter.d.ts.map +1 -1
- package/dest/block/block_parameter.js +36 -2
- package/dest/block/l2_block_info.d.ts +6 -5
- package/dest/block/l2_block_info.d.ts.map +1 -1
- package/dest/block/l2_block_info.js +6 -5
- package/dest/block/l2_block_source.d.ts +39 -4
- package/dest/block/l2_block_source.d.ts.map +1 -1
- package/dest/block/l2_block_stream/interfaces.d.ts +6 -3
- package/dest/block/l2_block_stream/interfaces.d.ts.map +1 -1
- 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 +1 -1
- package/dest/block/proposal/attestations_and_signers.d.ts +13 -6
- 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/test/l2_tips_store_test_suite.js +1 -1
- package/dest/checkpoint/checkpoint_data.d.ts +7 -1
- package/dest/checkpoint/checkpoint_data.d.ts.map +1 -1
- package/dest/checkpoint/checkpoint_data.js +2 -0
- package/dest/config/chain-config.d.ts +2 -2
- package/dest/config/chain-config.d.ts.map +1 -1
- package/dest/config/chain-config.js +9 -3
- 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 +18 -4
- package/dest/contract/contract_address.d.ts +1 -1
- package/dest/contract/contract_address.js +2 -2
- package/dest/contract/private_function.d.ts +1 -1
- package/dest/contract/private_function.d.ts.map +1 -1
- package/dest/contract/private_function.js +2 -4
- package/dest/gas/fee_math.d.ts +49 -0
- package/dest/gas/fee_math.d.ts.map +1 -0
- package/dest/gas/fee_math.js +80 -0
- package/dest/gas/gas_fees.d.ts +5 -1
- package/dest/gas/gas_fees.d.ts.map +1 -1
- package/dest/gas/gas_fees.js +10 -1
- package/dest/gas/gas_settings.d.ts +40 -3
- package/dest/gas/gas_settings.d.ts.map +1 -1
- package/dest/gas/gas_settings.js +50 -6
- package/dest/gas/index.d.ts +2 -1
- package/dest/gas/index.d.ts.map +1 -1
- package/dest/gas/index.js +1 -0
- package/dest/ha-signing/config.d.ts +6 -6
- package/dest/ha-signing/config.d.ts.map +1 -1
- package/dest/ha-signing/config.js +4 -3
- package/dest/ha-signing/index.d.ts +2 -2
- package/dest/ha-signing/index.d.ts.map +1 -1
- package/dest/ha-signing/index.js +1 -1
- package/dest/ha-signing/local_config.d.ts +1 -1
- package/dest/ha-signing/local_config.d.ts.map +1 -1
- package/dest/ha-signing/local_config.js +2 -2
- package/dest/ha-signing/types.d.ts +37 -32
- package/dest/ha-signing/types.d.ts.map +1 -1
- package/dest/ha-signing/types.js +13 -6
- package/dest/hash/hash.d.ts +16 -1
- package/dest/hash/hash.d.ts.map +1 -1
- package/dest/hash/hash.js +32 -0
- package/dest/interfaces/archiver.d.ts +11 -1
- package/dest/interfaces/archiver.d.ts.map +1 -1
- package/dest/interfaces/archiver.js +10 -4
- package/dest/interfaces/aztec-node-admin.d.ts +22 -14
- package/dest/interfaces/aztec-node-admin.d.ts.map +1 -1
- package/dest/interfaces/aztec-node-admin.js +5 -4
- package/dest/interfaces/aztec-node-debug.d.ts +21 -0
- package/dest/interfaces/aztec-node-debug.d.ts.map +1 -0
- package/dest/interfaces/aztec-node-debug.js +18 -0
- package/dest/interfaces/aztec-node.d.ts +54 -55
- package/dest/interfaces/aztec-node.d.ts.map +1 -1
- package/dest/interfaces/aztec-node.js +20 -16
- package/dest/interfaces/block_response.d.ts +156 -0
- package/dest/interfaces/block_response.d.ts.map +1 -0
- package/dest/interfaces/block_response.js +24 -0
- package/dest/interfaces/chain_tips.d.ts +304 -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 +27 -0
- package/dest/interfaces/checkpoint_parameter.d.ts.map +1 -0
- package/dest/interfaces/checkpoint_parameter.js +20 -0
- package/dest/interfaces/checkpoint_response.d.ts +312 -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 -1
- package/dest/interfaces/client.d.ts.map +1 -1
- package/dest/interfaces/client.js +6 -0
- package/dest/interfaces/configs.d.ts +12 -2
- package/dest/interfaces/configs.d.ts.map +1 -1
- package/dest/interfaces/configs.js +3 -1
- package/dest/interfaces/l1_publish_info.d.ts +43 -0
- package/dest/interfaces/l1_publish_info.d.ts.map +1 -0
- package/dest/interfaces/l1_publish_info.js +26 -0
- package/dest/interfaces/merkle_tree_operations.d.ts +4 -3
- package/dest/interfaces/merkle_tree_operations.d.ts.map +1 -1
- package/dest/interfaces/prover-client.d.ts +1 -1
- package/dest/interfaces/prover-client.d.ts.map +1 -1
- package/dest/interfaces/prover-client.js +0 -3
- package/dest/interfaces/proving-job.d.ts +166 -166
- 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 +1 -10
- package/dest/interfaces/slasher.d.ts.map +1 -1
- package/dest/interfaces/slasher.js +0 -2
- package/dest/interfaces/validator.d.ts +27 -18
- package/dest/interfaces/validator.d.ts.map +1 -1
- package/dest/interfaces/validator.js +2 -0
- package/dest/l1-contracts/index.d.ts +2 -2
- package/dest/l1-contracts/index.d.ts.map +1 -1
- package/dest/l1-contracts/index.js +1 -1
- package/dest/logs/log_id.d.ts +1 -1
- package/dest/logs/log_id.d.ts.map +1 -1
- package/dest/logs/log_id.js +1 -2
- package/dest/logs/siloed_tag.d.ts +5 -7
- package/dest/logs/siloed_tag.d.ts.map +1 -1
- package/dest/logs/siloed_tag.js +4 -0
- package/dest/logs/tag.d.ts +5 -6
- package/dest/logs/tag.d.ts.map +1 -1
- package/dest/logs/tag.js +4 -0
- package/dest/p2p/block_proposal.d.ts +22 -14
- package/dest/p2p/block_proposal.d.ts.map +1 -1
- package/dest/p2p/block_proposal.js +45 -40
- package/dest/p2p/checkpoint_attestation.d.ts +10 -8
- package/dest/p2p/checkpoint_attestation.d.ts.map +1 -1
- package/dest/p2p/checkpoint_attestation.js +17 -24
- package/dest/p2p/checkpoint_proposal.d.ts +20 -14
- package/dest/p2p/checkpoint_proposal.d.ts.map +1 -1
- package/dest/p2p/checkpoint_proposal.js +34 -51
- package/dest/p2p/consensus_payload.d.ts +18 -7
- package/dest/p2p/consensus_payload.d.ts.map +1 -1
- package/dest/p2p/consensus_payload.js +31 -19
- package/dest/p2p/gossipable.d.ts +4 -4
- package/dest/p2p/gossipable.d.ts.map +1 -1
- 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 +7 -3
- 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 +7 -3
- package/dest/parity/parity_public_inputs.d.ts.map +1 -1
- package/dest/parity/parity_public_inputs.js +6 -3
- package/dest/rollup/block_headers_hash.d.ts +1 -1
- package/dest/rollup/block_headers_hash.d.ts.map +1 -1
- package/dest/rollup/block_headers_hash.js +8 -2
- package/dest/slashing/index.d.ts +2 -3
- package/dest/slashing/index.d.ts.map +1 -1
- package/dest/slashing/index.js +1 -2
- package/dest/slashing/serialization.d.ts +2 -6
- package/dest/slashing/serialization.d.ts.map +1 -1
- package/dest/slashing/serialization.js +0 -60
- package/dest/slashing/types.d.ts +4 -90
- package/dest/slashing/types.d.ts.map +1 -1
- package/dest/slashing/types.js +0 -14
- package/dest/slashing/{tally.d.ts → votes.d.ts} +1 -1
- package/dest/slashing/{tally.d.ts.map → votes.d.ts.map} +1 -1
- package/dest/slashing/{tally.js → votes.js} +1 -1
- package/dest/tests/factories.d.ts +2 -7
- package/dest/tests/factories.d.ts.map +1 -1
- package/dest/tests/factories.js +9 -19
- package/dest/tests/mocks.d.ts +7 -1
- package/dest/tests/mocks.d.ts.map +1 -1
- package/dest/tests/mocks.js +39 -30
- package/dest/timetable/index.d.ts +51 -1
- package/dest/timetable/index.d.ts.map +1 -1
- package/dest/timetable/index.js +218 -14
- package/dest/trees/nullifier_leaf.d.ts +2 -1
- package/dest/trees/nullifier_leaf.d.ts.map +1 -1
- package/dest/trees/nullifier_leaf.js +3 -0
- package/dest/tx/block_header.d.ts +2 -2
- package/dest/tx/block_header.d.ts.map +1 -1
- package/dest/tx/block_header.js +1 -1
- package/dest/tx/fee_provider.d.ts +10 -0
- package/dest/tx/fee_provider.d.ts.map +1 -0
- package/dest/tx/fee_provider.js +1 -0
- package/dest/tx/global_variable_builder.d.ts +3 -16
- package/dest/tx/global_variable_builder.d.ts.map +1 -1
- package/dest/tx/index.d.ts +2 -1
- package/dest/tx/index.d.ts.map +1 -1
- package/dest/tx/index.js +1 -0
- package/dest/tx/indexed_tx_effect.d.ts +1 -1
- package/dest/tx/indexed_tx_effect.d.ts.map +1 -1
- package/dest/tx/indexed_tx_effect.js +1 -2
- package/dest/tx/profiling.js +4 -4
- package/dest/tx/simulated_tx.d.ts +4 -4
- package/dest/tx/simulated_tx.d.ts.map +1 -1
- package/dest/tx/simulated_tx.js +3 -3
- package/dest/tx/tx.d.ts +3 -3
- package/dest/tx/tx.d.ts.map +1 -1
- package/dest/tx/tx_receipt.d.ts +8 -4
- package/dest/tx/tx_receipt.d.ts.map +1 -1
- package/dest/tx/tx_receipt.js +8 -15
- package/dest/types/shared.d.ts +1 -10
- package/dest/types/shared.d.ts.map +1 -1
- package/dest/types/shared.js +0 -9
- package/dest/vks/verification_key.d.ts +2 -137
- package/dest/vks/verification_key.d.ts.map +1 -1
- package/dest/vks/verification_key.js +5 -126
- package/dest/world-state/genesis_data.d.ts +11 -0
- package/dest/world-state/genesis_data.d.ts.map +1 -0
- package/dest/world-state/genesis_data.js +4 -0
- package/dest/world-state/index.d.ts +2 -1
- package/dest/world-state/index.d.ts.map +1 -1
- package/dest/world-state/index.js +1 -0
- package/dest/world-state/world_state_revision.d.ts +8 -1
- package/dest/world-state/world_state_revision.d.ts.map +1 -1
- package/dest/world-state/world_state_revision.js +7 -1
- package/package.json +8 -8
- package/src/abi/authorization_selector.ts +2 -8
- package/src/abi/encoder.ts +42 -6
- package/src/abi/event_selector.ts +2 -8
- package/src/abi/function_selector.ts +3 -12
- package/src/abi/note_selector.ts +3 -12
- package/src/abi/selector.ts +1 -1
- package/src/avm/revert_code.ts +25 -39
- package/src/aztec-address/index.ts +4 -10
- package/src/block/attestation_info.ts +11 -11
- package/src/block/block_data.ts +20 -4
- package/src/block/block_hash.ts +21 -14
- package/src/block/block_parameter.ts +35 -2
- package/src/block/l2_block_info.ts +8 -6
- package/src/block/l2_block_source.ts +43 -3
- package/src/block/l2_block_stream/interfaces.ts +6 -2
- package/src/block/l2_block_stream/l2_tips_store_base.ts +1 -1
- 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/config/chain-config.ts +9 -4
- package/src/config/sequencer-config.ts +34 -6
- package/src/contract/contract_address.ts +2 -2
- package/src/contract/private_function.ts +3 -1
- package/src/gas/README.md +31 -0
- package/src/gas/fee_math.ts +120 -0
- package/src/gas/gas_fees.ts +17 -4
- package/src/gas/gas_settings.ts +65 -12
- package/src/gas/index.ts +1 -0
- package/src/ha-signing/config.ts +5 -2
- package/src/ha-signing/index.ts +3 -1
- package/src/ha-signing/local_config.ts +2 -2
- package/src/ha-signing/types.ts +48 -34
- package/src/hash/hash.ts +27 -0
- package/src/interfaces/archiver.ts +21 -3
- package/src/interfaces/aztec-node-admin.ts +8 -8
- package/src/interfaces/aztec-node-debug.ts +40 -0
- package/src/interfaces/aztec-node.ts +120 -95
- package/src/interfaces/block_response.ts +79 -0
- package/src/interfaces/chain_tips.ts +24 -0
- package/src/interfaces/checkpoint_parameter.ts +22 -0
- package/src/interfaces/checkpoint_response.ts +84 -0
- package/src/interfaces/client.ts +6 -0
- package/src/interfaces/configs.ts +8 -1
- package/src/interfaces/l1_publish_info.ts +40 -0
- package/src/interfaces/merkle_tree_operations.ts +3 -2
- package/src/interfaces/prover-client.ts +2 -5
- package/src/interfaces/server.ts +5 -0
- package/src/interfaces/slasher.ts +0 -6
- package/src/interfaces/validator.ts +22 -9
- package/src/l1-contracts/index.ts +1 -1
- package/src/logs/log_id.ts +1 -2
- package/src/logs/siloed_tag.ts +8 -9
- package/src/logs/tag.ts +8 -8
- package/src/p2p/block_proposal.ts +96 -36
- package/src/p2p/checkpoint_attestation.ts +20 -29
- package/src/p2p/checkpoint_proposal.ts +88 -71
- package/src/p2p/consensus_payload.ts +50 -28
- package/src/p2p/gossipable.ts +4 -4
- 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/rollup/block_headers_hash.ts +11 -2
- package/src/slashing/index.ts +1 -2
- package/src/slashing/serialization.ts +1 -81
- package/src/slashing/types.ts +3 -35
- package/src/slashing/{tally.ts → votes.ts} +1 -1
- package/src/tests/factories.ts +15 -21
- package/src/tests/mocks.ts +63 -39
- package/src/timetable/index.ts +308 -13
- package/src/trees/nullifier_leaf.ts +4 -0
- package/src/tx/block_header.ts +2 -2
- package/src/tx/fee_provider.ts +10 -0
- package/src/tx/global_variable_builder.ts +2 -18
- package/src/tx/index.ts +1 -0
- package/src/tx/indexed_tx_effect.ts +1 -2
- package/src/tx/profiling.ts +4 -4
- package/src/tx/simulated_tx.ts +6 -2
- package/src/tx/tx.ts +2 -2
- package/src/tx/tx_receipt.ts +11 -14
- package/src/types/shared.ts +0 -10
- package/src/vks/verification_key.ts +5 -184
- package/src/world-state/genesis_data.ts +15 -0
- package/src/world-state/index.ts +1 -0
- package/src/world-state/world_state_revision.ts +9 -1
- package/dest/abi/mocked_keys.d.ts +0 -2
- package/dest/abi/mocked_keys.d.ts.map +0 -1
- package/dest/abi/mocked_keys.js +0 -1
- package/dest/l1-contracts/slash_factory.d.ts +0 -45
- package/dest/l1-contracts/slash_factory.d.ts.map +0 -1
- package/dest/l1-contracts/slash_factory.js +0 -158
- package/dest/slashing/empire.d.ts +0 -31
- package/dest/slashing/empire.d.ts.map +0 -1
- package/dest/slashing/empire.js +0 -87
- package/src/abi/mocked_keys.ts +0 -2
- package/src/l1-contracts/slash_factory.ts +0 -180
- package/src/slashing/empire.ts +0 -104
package/src/tests/mocks.ts
CHANGED
|
@@ -14,8 +14,11 @@ import { padArrayEnd, times } from '@aztec/foundation/collection';
|
|
|
14
14
|
import { randomBytes } from '@aztec/foundation/crypto/random';
|
|
15
15
|
import { Secp256k1Signer } from '@aztec/foundation/crypto/secp256k1-signer';
|
|
16
16
|
import { Fr } from '@aztec/foundation/curves/bn254';
|
|
17
|
+
import { EthAddress } from '@aztec/foundation/eth-address';
|
|
17
18
|
import { Signature } from '@aztec/foundation/eth-signature';
|
|
18
19
|
|
|
20
|
+
import { type TypedDataDefinition, hashTypedData } from 'viem';
|
|
21
|
+
|
|
19
22
|
import type { ContractArtifact } from '../abi/abi.js';
|
|
20
23
|
import { PublicTxEffect } from '../avm/avm.js';
|
|
21
24
|
import type { AvmAccumulatedData } from '../avm/avm_accumulated_data.js';
|
|
@@ -51,7 +54,7 @@ import { BlockProposal } from '../p2p/block_proposal.js';
|
|
|
51
54
|
import { CheckpointAttestation } from '../p2p/checkpoint_attestation.js';
|
|
52
55
|
import { CheckpointProposal } from '../p2p/checkpoint_proposal.js';
|
|
53
56
|
import { ConsensusPayload } from '../p2p/consensus_payload.js';
|
|
54
|
-
import {
|
|
57
|
+
import { type CoordinationSignatureContext, getHashedSignaturePayloadTypedData } from '../p2p/signature_utils.js';
|
|
55
58
|
import { ChonkProof } from '../proofs/chonk_proof.js';
|
|
56
59
|
import { ProvingRequestType } from '../proofs/proving_request_type.js';
|
|
57
60
|
import { CheckpointHeader } from '../rollup/checkpoint_header.js';
|
|
@@ -86,6 +89,15 @@ import {
|
|
|
86
89
|
makePublicDataWrite,
|
|
87
90
|
} from './factories.js';
|
|
88
91
|
|
|
92
|
+
export const TEST_COORDINATION_SIGNATURE_CONTEXT: CoordinationSignatureContext = {
|
|
93
|
+
chainId: 31337,
|
|
94
|
+
rollupAddress: EthAddress.fromNumber(1),
|
|
95
|
+
};
|
|
96
|
+
|
|
97
|
+
function signTypedData(signer: Secp256k1Signer, typedData: TypedDataDefinition): Signature {
|
|
98
|
+
return signer.sign(Buffer32.fromString(hashTypedData(typedData)));
|
|
99
|
+
}
|
|
100
|
+
|
|
89
101
|
export const randomTxHash = (): TxHash => TxHash.random();
|
|
90
102
|
|
|
91
103
|
export const mockTx = async (
|
|
@@ -134,7 +146,7 @@ export const mockTx = async (
|
|
|
134
146
|
const data = PrivateKernelTailCircuitPublicInputs.empty();
|
|
135
147
|
const firstNullifier = new Nullifier(new Fr(seed + 1), Fr.ZERO, 0);
|
|
136
148
|
data.constants.anchorBlockHeader = anchorBlockHeader;
|
|
137
|
-
data.constants.txContext.gasSettings = GasSettings.
|
|
149
|
+
data.constants.txContext.gasSettings = GasSettings.fallback({ gasLimits, maxFeesPerGas, maxPriorityFeesPerGas });
|
|
138
150
|
data.feePayer = feePayer ?? (await AztecAddress.random());
|
|
139
151
|
data.gasUsed = gasUsed;
|
|
140
152
|
data.constants.txContext.chainId = chainId;
|
|
@@ -200,7 +212,7 @@ export async function mockProcessedTx({
|
|
|
200
212
|
db,
|
|
201
213
|
chainId = Fr.ZERO,
|
|
202
214
|
version = Fr.ZERO,
|
|
203
|
-
gasSettings = GasSettings.
|
|
215
|
+
gasSettings = GasSettings.fallback({ maxFeesPerGas: new GasFees(10, 10) }),
|
|
204
216
|
vkTreeRoot = Fr.ZERO,
|
|
205
217
|
protocolContracts = makeProtocolContracts(seed + 0x100),
|
|
206
218
|
globalVariables = GlobalVariables.empty(),
|
|
@@ -519,6 +531,7 @@ export interface MakeConsensusPayloadOptions {
|
|
|
519
531
|
txHashes?: TxHash[];
|
|
520
532
|
txs?: Tx[];
|
|
521
533
|
feeAssetPriceModifier?: bigint;
|
|
534
|
+
signatureContext?: CoordinationSignatureContext;
|
|
522
535
|
}
|
|
523
536
|
|
|
524
537
|
export interface MakeBlockProposalOptions {
|
|
@@ -529,6 +542,7 @@ export interface MakeBlockProposalOptions {
|
|
|
529
542
|
archiveRoot?: Fr;
|
|
530
543
|
txHashes?: TxHash[];
|
|
531
544
|
txs?: Tx[];
|
|
545
|
+
signatureContext?: CoordinationSignatureContext;
|
|
532
546
|
}
|
|
533
547
|
|
|
534
548
|
export interface MakeCheckpointProposalOptions {
|
|
@@ -536,6 +550,7 @@ export interface MakeCheckpointProposalOptions {
|
|
|
536
550
|
checkpointHeader?: CheckpointHeader;
|
|
537
551
|
archiveRoot?: Fr;
|
|
538
552
|
feeAssetPriceModifier?: bigint;
|
|
553
|
+
signatureContext?: CoordinationSignatureContext;
|
|
539
554
|
/** Options for the lastBlock - if undefined, no lastBlock is included */
|
|
540
555
|
lastBlock?: {
|
|
541
556
|
blockHeader?: BlockHeader;
|
|
@@ -546,10 +561,7 @@ export interface MakeCheckpointProposalOptions {
|
|
|
546
561
|
}
|
|
547
562
|
|
|
548
563
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
549
|
-
const makeAndSignConsensusPayload = (
|
|
550
|
-
domainSeparator: SignatureDomainSeparator,
|
|
551
|
-
options?: MakeConsensusPayloadOptions,
|
|
552
|
-
) => {
|
|
564
|
+
const makeAndSignConsensusPayload = (options?: MakeConsensusPayloadOptions) => {
|
|
553
565
|
const header = options?.header ?? makeCheckpointHeader(1);
|
|
554
566
|
const { signer = Secp256k1Signer.random(), archive = Fr.random(), feeAssetPriceModifier = 0n } = options ?? {};
|
|
555
567
|
|
|
@@ -557,9 +569,10 @@ const makeAndSignConsensusPayload = (
|
|
|
557
569
|
header,
|
|
558
570
|
archive,
|
|
559
571
|
feeAssetPriceModifier,
|
|
572
|
+
signatureContext: TEST_COORDINATION_SIGNATURE_CONTEXT,
|
|
560
573
|
});
|
|
561
574
|
|
|
562
|
-
const hash =
|
|
575
|
+
const hash = getHashedSignaturePayloadTypedData(payload);
|
|
563
576
|
const signature = signer.sign(hash);
|
|
564
577
|
|
|
565
578
|
return { blockNumber: header.slotNumber, payload, signature };
|
|
@@ -569,10 +582,7 @@ export const makeAndSignCommitteeAttestationsAndSigners = (
|
|
|
569
582
|
attestationsAndSigners: CommitteeAttestationsAndSigners,
|
|
570
583
|
signer: Secp256k1Signer = Secp256k1Signer.random(),
|
|
571
584
|
) => {
|
|
572
|
-
const hash =
|
|
573
|
-
attestationsAndSigners,
|
|
574
|
-
SignatureDomainSeparator.attestationsAndSigners,
|
|
575
|
-
);
|
|
585
|
+
const hash = getHashedSignaturePayloadTypedData(attestationsAndSigners);
|
|
576
586
|
return signer.sign(hash);
|
|
577
587
|
};
|
|
578
588
|
|
|
@@ -584,41 +594,51 @@ export const makeBlockProposal = (options?: MakeBlockProposalOptions): Promise<B
|
|
|
584
594
|
const txHashes = options?.txHashes ?? [0, 1, 2, 3, 4, 5].map(() => TxHash.random());
|
|
585
595
|
const txs = options?.txs;
|
|
586
596
|
const signer = options?.signer ?? Secp256k1Signer.random();
|
|
597
|
+
const signatureContext = options?.signatureContext ?? TEST_COORDINATION_SIGNATURE_CONTEXT;
|
|
587
598
|
|
|
588
599
|
return BlockProposal.createProposalFromSigner(
|
|
589
600
|
blockHeader,
|
|
601
|
+
CheckpointNumber(1),
|
|
590
602
|
indexWithinCheckpoint,
|
|
591
603
|
inHash,
|
|
592
604
|
archiveRoot,
|
|
593
605
|
txHashes,
|
|
594
606
|
txs,
|
|
595
|
-
|
|
607
|
+
signatureContext,
|
|
608
|
+
(typedData, _context) => Promise.resolve(signTypedData(signer, typedData)),
|
|
609
|
+
(typedData, _context) => Promise.resolve(signTypedData(signer, typedData)),
|
|
596
610
|
);
|
|
597
611
|
};
|
|
598
612
|
|
|
599
|
-
export const makeCheckpointProposal = (options?: MakeCheckpointProposalOptions): Promise<CheckpointProposal> => {
|
|
600
|
-
const blockHeader = options?.lastBlock?.blockHeader ?? makeBlockHeader(1);
|
|
613
|
+
export const makeCheckpointProposal = async (options?: MakeCheckpointProposalOptions): Promise<CheckpointProposal> => {
|
|
601
614
|
const checkpointHeader = options?.checkpointHeader ?? makeCheckpointHeader(1);
|
|
602
615
|
const archiveRoot = options?.archiveRoot ?? Fr.random();
|
|
603
616
|
const feeAssetPriceModifier = options?.feeAssetPriceModifier ?? 0n;
|
|
604
617
|
const signer = options?.signer ?? Secp256k1Signer.random();
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
618
|
+
const signatureContext = options?.signatureContext ?? TEST_COORDINATION_SIGNATURE_CONTEXT;
|
|
619
|
+
|
|
620
|
+
// Build a signed block proposal if lastBlock options are provided
|
|
621
|
+
const lastBlockProposal = options?.lastBlock
|
|
622
|
+
? await makeBlockProposal({
|
|
623
|
+
blockHeader: options.lastBlock.blockHeader,
|
|
624
|
+
indexWithinCheckpoint: options.lastBlock.indexWithinCheckpoint ?? IndexWithinCheckpoint(4),
|
|
625
|
+
inHash: checkpointHeader.inHash,
|
|
626
|
+
archiveRoot,
|
|
627
|
+
txHashes: options.lastBlock.txHashes,
|
|
612
628
|
txs: options.lastBlock.txs,
|
|
613
|
-
|
|
629
|
+
signer,
|
|
630
|
+
signatureContext,
|
|
631
|
+
})
|
|
614
632
|
: undefined;
|
|
615
633
|
|
|
616
634
|
return CheckpointProposal.createProposalFromSigner(
|
|
617
635
|
checkpointHeader,
|
|
618
636
|
archiveRoot,
|
|
637
|
+
CheckpointNumber(1),
|
|
619
638
|
feeAssetPriceModifier,
|
|
620
|
-
|
|
621
|
-
|
|
639
|
+
lastBlockProposal,
|
|
640
|
+
signatureContext,
|
|
641
|
+
typedData => Promise.resolve(signTypedData(signer, typedData)),
|
|
622
642
|
);
|
|
623
643
|
};
|
|
624
644
|
|
|
@@ -632,6 +652,7 @@ export type MakeCheckpointAttestationOptions = {
|
|
|
632
652
|
attesterSigner?: Secp256k1Signer;
|
|
633
653
|
proposerSigner?: Secp256k1Signer;
|
|
634
654
|
signer?: Secp256k1Signer;
|
|
655
|
+
signatureContext?: CoordinationSignatureContext;
|
|
635
656
|
};
|
|
636
657
|
|
|
637
658
|
/**
|
|
@@ -641,26 +662,27 @@ export const makeCheckpointAttestation = (options: MakeCheckpointAttestationOpti
|
|
|
641
662
|
const header = options.header ?? makeCheckpointHeader(1);
|
|
642
663
|
const archive = options.archive ?? Fr.random();
|
|
643
664
|
const feeAssetPriceModifier = options.feeAssetPriceModifier ?? 0n;
|
|
665
|
+
const signatureContext = options.signatureContext ?? TEST_COORDINATION_SIGNATURE_CONTEXT;
|
|
644
666
|
const { signer, attesterSigner = signer, proposerSigner = signer } = options;
|
|
645
667
|
|
|
646
|
-
const payload = new ConsensusPayload(header, archive, feeAssetPriceModifier);
|
|
668
|
+
const payload = new ConsensusPayload(header, archive, feeAssetPriceModifier, signatureContext);
|
|
647
669
|
|
|
648
670
|
// Sign as attester
|
|
649
|
-
const attestationHash =
|
|
650
|
-
payload,
|
|
651
|
-
SignatureDomainSeparator.checkpointAttestation,
|
|
652
|
-
);
|
|
671
|
+
const attestationHash = getHashedSignaturePayloadTypedData(payload);
|
|
653
672
|
const attestationSigner = attesterSigner ?? Secp256k1Signer.random();
|
|
654
673
|
const attestationSignature = attestationSigner.sign(attestationHash);
|
|
655
674
|
|
|
656
675
|
// Sign as proposer - use CheckpointProposal's payload format (serializeToBuffer)
|
|
657
676
|
// This is different from ConsensusPayload's format (ABI encoding)
|
|
658
677
|
const proposalSignerToUse = proposerSigner ?? Secp256k1Signer.random();
|
|
659
|
-
const tempProposal = new CheckpointProposal(
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
|
|
678
|
+
const tempProposal = new CheckpointProposal(
|
|
679
|
+
header,
|
|
680
|
+
archive,
|
|
681
|
+
feeAssetPriceModifier,
|
|
682
|
+
Signature.empty(),
|
|
683
|
+
signatureContext,
|
|
663
684
|
);
|
|
685
|
+
const proposalHash = getHashedSignaturePayloadTypedData(tempProposal);
|
|
664
686
|
const proposerSignature = proposalSignerToUse.sign(proposalHash);
|
|
665
687
|
|
|
666
688
|
return new CheckpointAttestation(payload, attestationSignature, proposerSignature);
|
|
@@ -673,13 +695,15 @@ export const makeCheckpointAttestationFromProposal = (
|
|
|
673
695
|
proposal: CheckpointProposal,
|
|
674
696
|
attesterSigner?: Secp256k1Signer,
|
|
675
697
|
): CheckpointAttestation => {
|
|
676
|
-
const payload = new ConsensusPayload(
|
|
698
|
+
const payload = new ConsensusPayload(
|
|
699
|
+
proposal.checkpointHeader,
|
|
700
|
+
proposal.archive,
|
|
701
|
+
proposal.feeAssetPriceModifier,
|
|
702
|
+
proposal.signatureContext,
|
|
703
|
+
);
|
|
677
704
|
|
|
678
705
|
// Sign as attester
|
|
679
|
-
const attestationHash =
|
|
680
|
-
payload,
|
|
681
|
-
SignatureDomainSeparator.checkpointAttestation,
|
|
682
|
-
);
|
|
706
|
+
const attestationHash = getHashedSignaturePayloadTypedData(payload);
|
|
683
707
|
const attestationSigner = attesterSigner ?? Secp256k1Signer.random();
|
|
684
708
|
const attestationSignature = attestationSigner.sign(attestationHash);
|
|
685
709
|
|
package/src/timetable/index.ts
CHANGED
|
@@ -25,6 +25,234 @@ export const DEFAULT_L1_PUBLISHING_TIME = 12;
|
|
|
25
25
|
/** Minimum execution time for building a block in seconds */
|
|
26
26
|
export const MIN_EXECUTION_TIME = 2;
|
|
27
27
|
|
|
28
|
+
export type CheckpointTimingConfig = {
|
|
29
|
+
aztecSlotDuration: number;
|
|
30
|
+
ethereumSlotDuration?: number;
|
|
31
|
+
blockDuration?: number;
|
|
32
|
+
checkpointAssembleTime?: number;
|
|
33
|
+
checkpointInitializationTime?: number;
|
|
34
|
+
l1PublishingTime?: number;
|
|
35
|
+
minExecutionTime?: number;
|
|
36
|
+
p2pPropagationTime?: number;
|
|
37
|
+
pipelining?: boolean;
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
export interface CheckpointTiming {
|
|
41
|
+
readonly aztecSlotDuration: number;
|
|
42
|
+
readonly blockDuration: number | undefined;
|
|
43
|
+
readonly checkpointAssembleTime: number;
|
|
44
|
+
readonly checkpointInitializationTime: number;
|
|
45
|
+
readonly l1PublishingTime: number;
|
|
46
|
+
readonly minExecutionTime: number;
|
|
47
|
+
readonly p2pPropagationTime: number;
|
|
48
|
+
readonly checkpointFinalizationTime: number;
|
|
49
|
+
readonly pipeliningAttestationGracePeriod: number;
|
|
50
|
+
readonly timeReservedAtEnd: number;
|
|
51
|
+
readonly minimumBuildSlotWork: number;
|
|
52
|
+
readonly initializeDeadline: number;
|
|
53
|
+
readonly checkpointAssemblyDeadline: number;
|
|
54
|
+
readonly checkpointAttestationStartDeadline: number;
|
|
55
|
+
readonly checkpointAttestationDeadline: number;
|
|
56
|
+
readonly checkpointPublishingDeadline: number;
|
|
57
|
+
|
|
58
|
+
calculateMaxBlocksPerSlot(): number;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
export interface PipelinedCheckpointTiming extends CheckpointTiming {
|
|
62
|
+
readonly proposalWindowIntoTargetSlot: number;
|
|
63
|
+
readonly attestationWindowIntoTargetSlot: number;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* Shared base for checkpoint timing implementations.
|
|
68
|
+
*
|
|
69
|
+
* This class owns the common inputs and formulas used by both pipelined and
|
|
70
|
+
* non-pipelined scheduling. Variant-specific deadline math is delegated to the
|
|
71
|
+
* concrete subclasses below.
|
|
72
|
+
*/
|
|
73
|
+
abstract class BaseCheckpointTiming implements CheckpointTiming {
|
|
74
|
+
public readonly aztecSlotDuration: number;
|
|
75
|
+
public readonly blockDuration: number | undefined;
|
|
76
|
+
public readonly checkpointAssembleTime: number;
|
|
77
|
+
public readonly checkpointInitializationTime: number;
|
|
78
|
+
public readonly l1PublishingTime: number;
|
|
79
|
+
public readonly minExecutionTime: number;
|
|
80
|
+
public readonly p2pPropagationTime: number;
|
|
81
|
+
|
|
82
|
+
constructor(opts: CheckpointTimingConfig) {
|
|
83
|
+
this.aztecSlotDuration = opts.aztecSlotDuration;
|
|
84
|
+
this.blockDuration = opts.blockDuration;
|
|
85
|
+
|
|
86
|
+
this.checkpointAssembleTime = opts.checkpointAssembleTime ?? CHECKPOINT_ASSEMBLE_TIME;
|
|
87
|
+
this.checkpointInitializationTime = opts.checkpointInitializationTime ?? CHECKPOINT_INITIALIZATION_TIME;
|
|
88
|
+
this.l1PublishingTime = opts.l1PublishingTime ?? DEFAULT_L1_PUBLISHING_TIME;
|
|
89
|
+
this.minExecutionTime = opts.minExecutionTime ?? MIN_EXECUTION_TIME;
|
|
90
|
+
this.p2pPropagationTime = opts.p2pPropagationTime ?? DEFAULT_P2P_PROPAGATION_TIME;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
public get checkpointFinalizationTime(): number {
|
|
94
|
+
// Allow enough time to
|
|
95
|
+
// - build the checkpoint
|
|
96
|
+
// - Round-trip over p2p
|
|
97
|
+
// - Publish to L1
|
|
98
|
+
return this.checkpointAssembleTime + this.p2pPropagationTime * 2 + this.l1PublishingTime;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
public get pipeliningAttestationGracePeriod(): number {
|
|
102
|
+
// Allow enough time to
|
|
103
|
+
// - build the block
|
|
104
|
+
// - pass it back over p2p
|
|
105
|
+
return (this.blockDuration ?? 0) + this.p2pPropagationTime;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
public abstract get timeReservedAtEnd(): number;
|
|
109
|
+
public abstract get minimumBuildSlotWork(): number;
|
|
110
|
+
|
|
111
|
+
public get initializeDeadline(): number {
|
|
112
|
+
return this.aztecSlotDuration - this.minimumBuildSlotWork;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
public abstract get checkpointAssemblyDeadline(): number;
|
|
116
|
+
|
|
117
|
+
public get checkpointAttestationStartDeadline(): number {
|
|
118
|
+
return this.checkpointAssemblyDeadline;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
public abstract get checkpointAttestationDeadline(): number;
|
|
122
|
+
public abstract get checkpointPublishingDeadline(): number;
|
|
123
|
+
|
|
124
|
+
public calculateMaxBlocksPerSlot(): number {
|
|
125
|
+
if (!this.blockDuration) {
|
|
126
|
+
return 1;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
const timeAvailableForBlocks = this.aztecSlotDuration - this.checkpointInitializationTime - this.timeReservedAtEnd;
|
|
130
|
+
return Math.floor(timeAvailableForBlocks / this.blockDuration);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
/**
|
|
135
|
+
* Checkpoint timing model for the non-pipelined sequencer flow.
|
|
136
|
+
*
|
|
137
|
+
* In this mode, checkpoint assembly, attestation collection, and L1 publishing
|
|
138
|
+
* must all complete within the current Aztec slot.
|
|
139
|
+
*/
|
|
140
|
+
class StandardCheckpointTimingModel extends BaseCheckpointTiming {
|
|
141
|
+
public get timeReservedAtEnd(): number {
|
|
142
|
+
return (this.blockDuration ?? 0) + this.checkpointFinalizationTime;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
public get minimumBuildSlotWork(): number {
|
|
146
|
+
return this.checkpointInitializationTime + this.minExecutionTime * 2 + this.checkpointFinalizationTime;
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
public get checkpointAssemblyDeadline(): number {
|
|
150
|
+
return this.aztecSlotDuration - this.l1PublishingTime - 2 * this.p2pPropagationTime;
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
public get checkpointAttestationDeadline(): number {
|
|
154
|
+
return this.aztecSlotDuration - this.l1PublishingTime;
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
public get checkpointPublishingDeadline(): number {
|
|
158
|
+
return this.aztecSlotDuration - this.l1PublishingTime;
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
/**
|
|
163
|
+
* Checkpoint timing model for proposer pipelining.
|
|
164
|
+
*
|
|
165
|
+
* In this mode, the build work starts at the wall-clock slot boundary and the
|
|
166
|
+
* checkpoint proposal is broadcast early enough that attestations complete by
|
|
167
|
+
* the end of the build slot. L1 submission can then be sent at the boundary of
|
|
168
|
+
* the target slot. The extra target-slot window getters are intended for
|
|
169
|
+
* consumers such as P2P validators that need to validate pipelined messages
|
|
170
|
+
* against wallclock time.
|
|
171
|
+
*/
|
|
172
|
+
class PipelinedCheckpointTimingModel extends BaseCheckpointTiming implements PipelinedCheckpointTiming {
|
|
173
|
+
public get proposalWindowIntoTargetSlot(): number {
|
|
174
|
+
// Proposals no longer spill into the target slot: they are broadcast early
|
|
175
|
+
// enough in the build slot that attestations complete before the boundary.
|
|
176
|
+
// Any residual tolerance into the target slot is covered by clock disparity.
|
|
177
|
+
return 0;
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
public get attestationWindowIntoTargetSlot(): number {
|
|
181
|
+
// Straggler grace: attestations aim to complete by build-slot end. Allow a
|
|
182
|
+
// small window into the target slot for late arrivals (round-trip p2p).
|
|
183
|
+
return 2 * this.p2pPropagationTime;
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
public override get pipeliningAttestationGracePeriod(): number {
|
|
187
|
+
// Under the early-pipelining regime attestations complete inside the build
|
|
188
|
+
// slot itself, so there is no extra grace into the target slot.
|
|
189
|
+
return 0;
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
public get timeReservedAtEnd(): number {
|
|
193
|
+
// Reserve enough time at the end of the build slot for:
|
|
194
|
+
// - assembling and broadcasting the checkpoint proposal
|
|
195
|
+
// - round-trip p2p propagation (proposal out, attestations back)
|
|
196
|
+
// - validators re-executing the last block
|
|
197
|
+
return this.checkpointAssembleTime + 2 * this.p2pPropagationTime + (this.blockDuration ?? 0);
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
public get minimumBuildSlotWork(): number {
|
|
201
|
+
return this.checkpointInitializationTime + this.minExecutionTime * 2;
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
public get checkpointAssemblyDeadline(): number {
|
|
205
|
+
// Allow enough time to build all blocks and receive attestations. With
|
|
206
|
+
// `pipeliningAttestationGracePeriod = 0` this equals `aztecSlotDuration`.
|
|
207
|
+
return this.aztecSlotDuration + this.pipeliningAttestationGracePeriod;
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
public get checkpointAttestationDeadline(): number {
|
|
211
|
+
// Allowed to be into the next wallclock slot minus the allocated l1 publishing time
|
|
212
|
+
return this.aztecSlotDuration * 2 - this.l1PublishingTime;
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
public get checkpointPublishingDeadline(): number {
|
|
216
|
+
// Allowed to be into the next wallclock slot minus the allocated l1 Publishing time
|
|
217
|
+
return this.aztecSlotDuration * 2 - this.l1PublishingTime;
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
/**
|
|
222
|
+
* Creates a checkpoint timing model for the requested scheduling mode.
|
|
223
|
+
*
|
|
224
|
+
* Most callers should use this factory and depend only on the shared
|
|
225
|
+
* `CheckpointTiming` interface. The returned implementation is selected from
|
|
226
|
+
* `opts.pipelining`.
|
|
227
|
+
*/
|
|
228
|
+
export function createCheckpointTimingModel(opts: CheckpointTimingConfig): CheckpointTiming {
|
|
229
|
+
validateCheckpointTimingConfig(opts);
|
|
230
|
+
const normalizedOpts = normalizeCheckpointTimingConfig(opts);
|
|
231
|
+
|
|
232
|
+
const timing = normalizedOpts.pipelining
|
|
233
|
+
? new PipelinedCheckpointTimingModel(normalizedOpts)
|
|
234
|
+
: new StandardCheckpointTimingModel(normalizedOpts);
|
|
235
|
+
validateCheckpointTimingModel(timing);
|
|
236
|
+
return timing;
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
/**
|
|
240
|
+
* Creates a pipelined checkpoint timing model with target-slot window accessors.
|
|
241
|
+
*
|
|
242
|
+
* Use this when the caller specifically needs the pipelined-only timing surface,
|
|
243
|
+
* such as proposal or attestation acceptance windows into the target slot.
|
|
244
|
+
*/
|
|
245
|
+
export function createPipelinedCheckpointTimingModel(
|
|
246
|
+
opts: Omit<CheckpointTimingConfig, 'pipelining'>,
|
|
247
|
+
): PipelinedCheckpointTiming {
|
|
248
|
+
validateCheckpointTimingConfig(opts);
|
|
249
|
+
const normalizedOpts = normalizeCheckpointTimingConfig(opts);
|
|
250
|
+
|
|
251
|
+
const timing = new PipelinedCheckpointTimingModel(normalizedOpts);
|
|
252
|
+
validateCheckpointTimingModel(timing);
|
|
253
|
+
return timing;
|
|
254
|
+
}
|
|
255
|
+
|
|
28
256
|
/**
|
|
29
257
|
* Calculates the maximum number of blocks that can be built in a slot.
|
|
30
258
|
* Used by both the sequencer timetable and p2p gossipsub scoring.
|
|
@@ -42,25 +270,92 @@ export function calculateMaxBlocksPerSlot(
|
|
|
42
270
|
checkpointAssembleTime?: number;
|
|
43
271
|
p2pPropagationTime?: number;
|
|
44
272
|
l1PublishingTime?: number;
|
|
273
|
+
pipelining?: boolean;
|
|
45
274
|
} = {},
|
|
46
275
|
): number {
|
|
47
|
-
|
|
48
|
-
|
|
276
|
+
return createCheckpointTimingModel({
|
|
277
|
+
aztecSlotDuration: aztecSlotDurationSec,
|
|
278
|
+
blockDuration: blockDurationSec,
|
|
279
|
+
checkpointAssembleTime: opts.checkpointAssembleTime,
|
|
280
|
+
checkpointInitializationTime: opts.checkpointInitializationTime,
|
|
281
|
+
l1PublishingTime: opts.l1PublishingTime,
|
|
282
|
+
p2pPropagationTime: opts.p2pPropagationTime,
|
|
283
|
+
pipelining: opts.pipelining,
|
|
284
|
+
}).calculateMaxBlocksPerSlot();
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
function assertNonNegative(name: string, value: number): void {
|
|
288
|
+
if (value < 0) {
|
|
289
|
+
throw new Error(`${name} must be non-negative (got ${value})`);
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
function validateCheckpointTimingConfig(opts: CheckpointTimingConfig): void {
|
|
294
|
+
if (opts.aztecSlotDuration <= 0) {
|
|
295
|
+
throw new Error(`aztecSlotDuration must be positive (got ${opts.aztecSlotDuration})`);
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
if (opts.ethereumSlotDuration !== undefined && opts.ethereumSlotDuration <= 0) {
|
|
299
|
+
throw new Error(`ethereumSlotDuration must be positive when provided (got ${opts.ethereumSlotDuration})`);
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
if (opts.blockDuration !== undefined && opts.blockDuration <= 0) {
|
|
303
|
+
throw new Error(`blockDuration must be positive when provided (got ${opts.blockDuration})`);
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
if (opts.minExecutionTime !== undefined && opts.minExecutionTime <= 0) {
|
|
307
|
+
throw new Error(`minExecutionTime must be positive when provided (got ${opts.minExecutionTime})`);
|
|
49
308
|
}
|
|
50
309
|
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
310
|
+
if (opts.checkpointAssembleTime !== undefined) {
|
|
311
|
+
assertNonNegative('checkpointAssembleTime', opts.checkpointAssembleTime);
|
|
312
|
+
}
|
|
313
|
+
if (opts.checkpointInitializationTime !== undefined) {
|
|
314
|
+
assertNonNegative('checkpointInitializationTime', opts.checkpointInitializationTime);
|
|
315
|
+
}
|
|
316
|
+
if (opts.l1PublishingTime !== undefined) {
|
|
317
|
+
assertNonNegative('l1PublishingTime', opts.l1PublishingTime);
|
|
318
|
+
}
|
|
319
|
+
if (opts.p2pPropagationTime !== undefined) {
|
|
320
|
+
assertNonNegative('p2pPropagationTime', opts.p2pPropagationTime);
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
function normalizeCheckpointTimingConfig(opts: CheckpointTimingConfig): CheckpointTimingConfig {
|
|
325
|
+
let checkpointAssembleTime = opts.checkpointAssembleTime ?? CHECKPOINT_ASSEMBLE_TIME;
|
|
326
|
+
let checkpointInitializationTime = opts.checkpointInitializationTime ?? CHECKPOINT_INITIALIZATION_TIME;
|
|
327
|
+
let minExecutionTime = opts.minExecutionTime ?? MIN_EXECUTION_TIME;
|
|
328
|
+
let p2pPropagationTime = opts.p2pPropagationTime ?? DEFAULT_P2P_PROPAGATION_TIME;
|
|
55
329
|
|
|
56
|
-
|
|
57
|
-
|
|
330
|
+
if (opts.ethereumSlotDuration !== undefined && opts.ethereumSlotDuration < 8) {
|
|
331
|
+
p2pPropagationTime = 0;
|
|
332
|
+
checkpointAssembleTime = 0.5;
|
|
333
|
+
checkpointInitializationTime = 0.5;
|
|
334
|
+
minExecutionTime = 1;
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
if (opts.blockDuration !== undefined && minExecutionTime > opts.blockDuration) {
|
|
338
|
+
minExecutionTime = opts.blockDuration;
|
|
339
|
+
}
|
|
58
340
|
|
|
59
|
-
|
|
60
|
-
|
|
341
|
+
return {
|
|
342
|
+
...opts,
|
|
343
|
+
checkpointAssembleTime,
|
|
344
|
+
checkpointInitializationTime,
|
|
345
|
+
minExecutionTime,
|
|
346
|
+
p2pPropagationTime,
|
|
347
|
+
};
|
|
348
|
+
}
|
|
61
349
|
|
|
62
|
-
|
|
63
|
-
|
|
350
|
+
function validateCheckpointTimingModel(model: CheckpointTiming): void {
|
|
351
|
+
if (model.blockDuration === undefined) {
|
|
352
|
+
return;
|
|
353
|
+
}
|
|
64
354
|
|
|
65
|
-
|
|
355
|
+
const timeAvailableForBlocks = model.aztecSlotDuration - model.checkpointInitializationTime - model.timeReservedAtEnd;
|
|
356
|
+
if (timeAvailableForBlocks < model.blockDuration) {
|
|
357
|
+
throw new Error(
|
|
358
|
+
`Invalid timing configuration: only ${timeAvailableForBlocks}s available for block building, which is less than one blockDuration (${model.blockDuration}s).`,
|
|
359
|
+
);
|
|
360
|
+
}
|
|
66
361
|
}
|
|
@@ -86,6 +86,10 @@ export class NullifierLeafPreimage implements IndexedTreeLeafPreimage {
|
|
|
86
86
|
];
|
|
87
87
|
}
|
|
88
88
|
|
|
89
|
+
isEmpty(): boolean {
|
|
90
|
+
return this.leaf.isEmpty() && this.nextKey.isZero() && this.nextIndex === 0n;
|
|
91
|
+
}
|
|
92
|
+
|
|
89
93
|
toFields(): Fr[] {
|
|
90
94
|
return this.toHashInputs().map(buf => Fr.fromBuffer(buf));
|
|
91
95
|
}
|
package/src/tx/block_header.ts
CHANGED
|
@@ -172,8 +172,8 @@ export class BlockHeader {
|
|
|
172
172
|
}
|
|
173
173
|
|
|
174
174
|
/** Manually set the hash for this block header if already computed */
|
|
175
|
-
setHash(hashed:
|
|
176
|
-
this._cachedHash = Promise.resolve(
|
|
175
|
+
setHash(hashed: BlockHash) {
|
|
176
|
+
this._cachedHash = Promise.resolve(hashed);
|
|
177
177
|
}
|
|
178
178
|
|
|
179
179
|
/** Recomputes the cached hash. Used for testing when header fields are mutated via unfreeze. */
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { ManaUsageEstimate } from '../gas/fee_math.js';
|
|
2
|
+
import type { GasFees } from '../gas/gas_fees.js';
|
|
3
|
+
|
|
4
|
+
/** Provides current and predicted fee information for transaction pricing. */
|
|
5
|
+
export interface FeeProvider {
|
|
6
|
+
/** Returns the current minimum fees for inclusion in the next block. */
|
|
7
|
+
getCurrentMinFees(): Promise<GasFees>;
|
|
8
|
+
/** Returns predicted min fees for each slot in the prediction window. */
|
|
9
|
+
getPredictedMinFees(manaUsage?: ManaUsageEstimate): Promise<GasFees[]>;
|
|
10
|
+
}
|
|
@@ -1,31 +1,15 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
import type { CheckpointNumber } from '@aztec/foundation/branded-types';
|
|
1
|
+
import type { SimulationOverridesPlan } from '@aztec/ethereum/contracts';
|
|
3
2
|
import type { EthAddress } from '@aztec/foundation/eth-address';
|
|
4
3
|
import type { SlotNumber } from '@aztec/foundation/schemas';
|
|
5
4
|
|
|
6
5
|
import type { AztecAddress } from '../aztec-address/index.js';
|
|
7
|
-
import type { GasFees } from '../gas/gas_fees.js';
|
|
8
6
|
import type { UInt32 } from '../types/index.js';
|
|
9
7
|
import type { CheckpointGlobalVariables, GlobalVariables } from './global_variables.js';
|
|
10
8
|
|
|
11
|
-
/** Fee header fields needed for pipelining overrides. */
|
|
12
|
-
export type ForceProposedFeeHeader = {
|
|
13
|
-
checkpointNumber: CheckpointNumber;
|
|
14
|
-
feeHeader: FeeHeader;
|
|
15
|
-
};
|
|
16
|
-
|
|
17
|
-
/** Options for building checkpoint global variables during pipelining. */
|
|
18
|
-
export type BuildCheckpointGlobalVariablesOpts = {
|
|
19
|
-
forcePendingCheckpointNumber?: CheckpointNumber;
|
|
20
|
-
forceProposedFeeHeader?: ForceProposedFeeHeader;
|
|
21
|
-
};
|
|
22
|
-
|
|
23
9
|
/**
|
|
24
10
|
* Interface for building global variables for Aztec blocks.
|
|
25
11
|
*/
|
|
26
12
|
export interface GlobalVariableBuilder {
|
|
27
|
-
getCurrentMinFees(): Promise<GasFees>;
|
|
28
|
-
|
|
29
13
|
/**
|
|
30
14
|
* Builds global variables for a given block.
|
|
31
15
|
* @param blockNumber - The block number to build global variables for.
|
|
@@ -46,6 +30,6 @@ export interface GlobalVariableBuilder {
|
|
|
46
30
|
coinbase: EthAddress,
|
|
47
31
|
feeRecipient: AztecAddress,
|
|
48
32
|
slotNumber: SlotNumber,
|
|
49
|
-
|
|
33
|
+
simulationOverridesPlan?: SimulationOverridesPlan,
|
|
50
34
|
): Promise<CheckpointGlobalVariables>;
|
|
51
35
|
}
|
package/src/tx/index.ts
CHANGED
|
@@ -24,6 +24,7 @@ export * from './validator/tx_validator.js';
|
|
|
24
24
|
export * from './validator/empty_validator.js';
|
|
25
25
|
export * from './validator/error_texts.js';
|
|
26
26
|
export * from './capsule.js';
|
|
27
|
+
export * from './fee_provider.js';
|
|
27
28
|
export * from './global_variable_builder.js';
|
|
28
29
|
export * from './hashed_values.js';
|
|
29
30
|
export * from './indexed_tx_effect.js';
|