@aztec-labs/stdlib 6.0.0-nightly.20261001 → 6.0.0-nightly.20261003
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/config/network-consensus-config.d.ts +17 -5
- package/dest/config/network-consensus-config.d.ts.map +1 -1
- package/dest/config/network-consensus-config.js +54 -8
- package/dest/gas/gas_fees.d.ts +27 -1
- package/dest/gas/gas_fees.d.ts.map +1 -1
- package/dest/gas/gas_fees.js +3 -0
- package/package.json +7 -7
- package/src/config/network-consensus-config.ts +70 -11
- package/src/gas/gas_fees.ts +35 -0
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { type L1ContractsConfig } from '@aztec-labs/ethereum/config';
|
|
2
2
|
import type { SequencerConfig } from '../interfaces/configs.js';
|
|
3
3
|
/**
|
|
4
|
-
* Environment variables whose values must be identical across every node of a network. They fall into
|
|
4
|
+
* Environment variables whose values must be identical across every node of a network. They fall into four
|
|
5
5
|
* categories, all consensus-critical:
|
|
6
6
|
*
|
|
7
7
|
* - Timing/protocol consensus: slot and epoch durations, block sub-slot duration, max blocks per checkpoint, and
|
|
@@ -13,14 +13,22 @@ import type { SequencerConfig } from '../interfaces/configs.js';
|
|
|
13
13
|
* it points at would compute the wrong epoch geometry, fees, or slashing rounds.
|
|
14
14
|
* - Node-side slashing offense consensus: the offense detection/penalty parameters validators apply locally to
|
|
15
15
|
* decide which payloads to sign. Validators must agree on these to reach the on-chain slashing quorum.
|
|
16
|
+
* - Validator acceptance limits: the most txs a validator accepts in a peer's checkpoint. These are floors rather
|
|
17
|
+
* than exact values (see {@link NETWORK_CONSENSUS_RAISABLE_ENV_VARS}), and proposers must build within them.
|
|
16
18
|
*
|
|
17
19
|
* Deliberately excluded: bootnodes, P2P/store/OTEL/sentinel settings, SEQ_MIN_TX_PER_BLOCK, SEQ_MAX_TX_PER_*,
|
|
18
20
|
* AZTEC_SLASHER_ENABLED, PROVER_REAL_PROOFS, TRANSACTIONS_DISABLED, and AZTEC_ENTRY_QUEUE_* (mainnet-only genesis
|
|
19
21
|
* params enforced by L1).
|
|
20
22
|
*/
|
|
21
|
-
export declare const NETWORK_CONSENSUS_ENV_VARS: readonly ["ETHEREUM_SLOT_DURATION", "AZTEC_SLOT_DURATION", "AZTEC_EPOCH_DURATION", "SEQ_BLOCK_DURATION_MS", "MAX_BLOCKS_PER_CHECKPOINT", "CHECKPOINT_PROPOSAL_SYNC_GRACE_SECONDS", "L1_CHAIN_ID", "AZTEC_TARGET_COMMITTEE_SIZE", "AZTEC_LAG_IN_EPOCHS_FOR_VALIDATOR_SET", "AZTEC_LAG_IN_EPOCHS_FOR_RANDAO", "AZTEC_ACTIVATION_THRESHOLD", "AZTEC_EJECTION_THRESHOLD", "AZTEC_LOCAL_EJECTION_THRESHOLD", "AZTEC_EXIT_DELAY_SECONDS", "AZTEC_PROOF_SUBMISSION_EPOCHS", "AZTEC_MANA_TARGET", "AZTEC_PROVING_COST_PER_MANA", "AZTEC_INITIAL_ETH_PER_FEE_ASSET", "AZTEC_GOVERNANCE_PROPOSER_ROUND_SIZE", "AZTEC_GOVERNANCE_PROPOSER_QUORUM", "AZTEC_SLASHING_QUORUM", "AZTEC_SLASHING_ROUND_SIZE_IN_EPOCHS", "AZTEC_SLASHING_LIFETIME_IN_ROUNDS", "AZTEC_SLASHING_OFFSET_IN_ROUNDS", "AZTEC_SLASHING_EXECUTION_DELAY_IN_ROUNDS", "AZTEC_SLASHING_VETOER", "AZTEC_SLASHING_DISABLE_DURATION", "AZTEC_SLASH_AMOUNT_SMALL", "AZTEC_SLASH_AMOUNT_MEDIUM", "AZTEC_SLASH_AMOUNT_LARGE", "SLASH_OFFENSE_EXPIRATION_ROUNDS", "SLASH_MAX_PAYLOAD_SIZE", "SLASH_EXECUTE_ROUNDS_LOOK_BACK", "SLASH_DATA_WITHHOLDING_TOLERANCE_SLOTS", "SLASH_DATA_WITHHOLDING_PENALTY", "SLASH_INACTIVITY_TARGET_PERCENTAGE", "SLASH_INACTIVITY_CONSECUTIVE_EPOCH_THRESHOLD", "SLASH_INACTIVITY_PENALTY", "SLASH_PROPOSE_INVALID_ATTESTATIONS_PENALTY", "SLASH_DUPLICATE_PROPOSAL_PENALTY", "SLASH_DUPLICATE_ATTESTATION_PENALTY", "SLASH_PROPOSE_DESCENDANT_OF_CHECKPOINT_WITH_INVALID_ATTESTATIONS_PENALTY", "SLASH_ATTEST_INVALID_CHECKPOINT_PROPOSAL_PENALTY", "SLASH_UNKNOWN_PENALTY", "SLASH_INVALID_BLOCK_PENALTY", "SLASH_INVALID_CHECKPOINT_PROPOSAL_PENALTY", "SLASH_GRACE_PERIOD_L2_SLOTS"];
|
|
23
|
+
export declare const NETWORK_CONSENSUS_ENV_VARS: readonly ["ETHEREUM_SLOT_DURATION", "AZTEC_SLOT_DURATION", "AZTEC_EPOCH_DURATION", "SEQ_BLOCK_DURATION_MS", "MAX_BLOCKS_PER_CHECKPOINT", "CHECKPOINT_PROPOSAL_SYNC_GRACE_SECONDS", "L1_CHAIN_ID", "AZTEC_TARGET_COMMITTEE_SIZE", "AZTEC_LAG_IN_EPOCHS_FOR_VALIDATOR_SET", "AZTEC_LAG_IN_EPOCHS_FOR_RANDAO", "AZTEC_ACTIVATION_THRESHOLD", "AZTEC_EJECTION_THRESHOLD", "AZTEC_LOCAL_EJECTION_THRESHOLD", "AZTEC_EXIT_DELAY_SECONDS", "AZTEC_PROOF_SUBMISSION_EPOCHS", "AZTEC_MANA_TARGET", "AZTEC_PROVING_COST_PER_MANA", "AZTEC_INITIAL_ETH_PER_FEE_ASSET", "AZTEC_GOVERNANCE_PROPOSER_ROUND_SIZE", "AZTEC_GOVERNANCE_PROPOSER_QUORUM", "AZTEC_SLASHING_QUORUM", "AZTEC_SLASHING_ROUND_SIZE_IN_EPOCHS", "AZTEC_SLASHING_LIFETIME_IN_ROUNDS", "AZTEC_SLASHING_OFFSET_IN_ROUNDS", "AZTEC_SLASHING_EXECUTION_DELAY_IN_ROUNDS", "AZTEC_SLASHING_VETOER", "AZTEC_SLASHING_DISABLE_DURATION", "AZTEC_SLASH_AMOUNT_SMALL", "AZTEC_SLASH_AMOUNT_MEDIUM", "AZTEC_SLASH_AMOUNT_LARGE", "SLASH_OFFENSE_EXPIRATION_ROUNDS", "SLASH_MAX_PAYLOAD_SIZE", "SLASH_EXECUTE_ROUNDS_LOOK_BACK", "SLASH_DATA_WITHHOLDING_TOLERANCE_SLOTS", "SLASH_DATA_WITHHOLDING_PENALTY", "SLASH_INACTIVITY_TARGET_PERCENTAGE", "SLASH_INACTIVITY_CONSECUTIVE_EPOCH_THRESHOLD", "SLASH_INACTIVITY_PENALTY", "SLASH_PROPOSE_INVALID_ATTESTATIONS_PENALTY", "SLASH_DUPLICATE_PROPOSAL_PENALTY", "SLASH_DUPLICATE_ATTESTATION_PENALTY", "SLASH_PROPOSE_DESCENDANT_OF_CHECKPOINT_WITH_INVALID_ATTESTATIONS_PENALTY", "SLASH_ATTEST_INVALID_CHECKPOINT_PROPOSAL_PENALTY", "SLASH_UNKNOWN_PENALTY", "SLASH_INVALID_BLOCK_PENALTY", "SLASH_INVALID_CHECKPOINT_PROPOSAL_PENALTY", "SLASH_GRACE_PERIOD_L2_SLOTS", "VALIDATOR_MAX_TX_PER_CHECKPOINT"];
|
|
22
24
|
/** A consensus-critical environment variable name; see {@link NETWORK_CONSENSUS_ENV_VARS}. */
|
|
23
25
|
export type ConsensusEnvVar = (typeof NETWORK_CONSENSUS_ENV_VARS)[number];
|
|
26
|
+
/**
|
|
27
|
+
* Consensus-critical vars an operator may raise above the network value but never lower. A validator that accepts
|
|
28
|
+
* more than the network limit still accepts every checkpoint an honest proposer builds within it, whereas a stricter
|
|
29
|
+
* one would reject a protocol-valid checkpoint and decline to attest to it.
|
|
30
|
+
*/
|
|
31
|
+
export declare const NETWORK_CONSENSUS_RAISABLE_ENV_VARS: readonly ConsensusEnvVar[];
|
|
24
32
|
/**
|
|
25
33
|
* The subset of consensus-critical timing config whose geometry can be validated in isolation. Composed by
|
|
26
34
|
* picking the canonical fields from their owning config types so the field set never drifts from the config
|
|
@@ -52,13 +60,17 @@ export declare function validateNetworkConsensusConfig(config: NetworkConsensusC
|
|
|
52
60
|
*
|
|
53
61
|
* For each var in {@link NETWORK_CONSENSUS_ENV_VARS} present in `networkConfig`: if the operator set it in `env`
|
|
54
62
|
* to a conflicting value, this throws unless `ALLOW_OVERRIDING_NETWORK_CONFIG` is truthy (in which case it logs
|
|
55
|
-
* and keeps the operator value).
|
|
63
|
+
* and keeps the operator value). For a var in {@link NETWORK_CONSENSUS_RAISABLE_ENV_VARS}, only a value below the
|
|
64
|
+
* network one conflicts. The same applies to a `SEQ_MAX_TX_PER_CHECKPOINT` (from `env`, or else from
|
|
65
|
+
* `networkConfig`) above the network `VALIDATOR_MAX_TX_PER_CHECKPOINT`: validators running the network value would
|
|
66
|
+
* reject every checkpoint this node proposed over it.
|
|
56
67
|
*
|
|
57
68
|
* This function is pure: it never writes to `env`. Instead it returns the canonical env writes the caller
|
|
58
69
|
* should apply — a map of env-var name to canonical string value for every numeric var whose env value matched
|
|
59
70
|
* the network value numerically. Applying these closes a bypass where the config layer parses some vars with
|
|
60
71
|
* `parseInt` (which reads '6e3' as 6); rewriting them to the network value's string form keeps the operator's
|
|
61
|
-
* numerically-equal value but in canonical form.
|
|
72
|
+
* numerically-equal value but in canonical form. A raisable var set above the network value is canonicalized to
|
|
73
|
+
* its own numeric value for the same reason. Vars kept under `ALLOW_OVERRIDING_NETWORK_CONFIG` (genuine
|
|
62
74
|
* conflicts) are not included, so the operator value is preserved untouched.
|
|
63
75
|
*
|
|
64
76
|
* @returns Canonical env writes (env-var name -> canonical string value) for the caller to apply.
|
|
@@ -70,4 +82,4 @@ export declare function checkConsensusEnvOverrides(networkConfig: Record<string,
|
|
|
70
82
|
export declare function allowsNetworkConfigOverride(env?: {
|
|
71
83
|
[key: string]: string | undefined;
|
|
72
84
|
}): boolean;
|
|
73
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
85
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmV0d29yay1jb25zZW5zdXMtY29uZmlnLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29uZmlnL25ldHdvcmstY29uc2Vuc3VzLWNvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsS0FBSyxpQkFBaUIsRUFBb0QsTUFBTSw2QkFBNkIsQ0FBQztBQUl2SCxPQUFPLEtBQUssRUFBRSxlQUFlLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQVdoRTs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW1CRztBQUNILGVBQU8sTUFBTSwwQkFBMEIsMm1EQXdERCxDQUFDO0FBRXZDLDhGQUE4RjtBQUM5RixNQUFNLE1BQU0sZUFBZSxHQUFHLENBQUMsT0FBTywwQkFBMEIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBRTFFOzs7O0dBSUc7QUFDSCxlQUFPLE1BQU0sbUNBQW1DLEVBQUUsU0FBUyxlQUFlLEVBQXdDLENBQUM7QUFFbkg7Ozs7O0dBS0c7QUFDSCxNQUFNLE1BQU0sc0JBQXNCLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixFQUFFLG1CQUFtQixHQUFHLHNCQUFzQixDQUFDLEdBQ3hHLFFBQVEsQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFLGlCQUFpQixHQUFHLHdCQUF3QixHQUFHLG9DQUFvQyxDQUFDLENBQUMsQ0FBQztBQVl2SDs7Ozs7O0dBTUc7QUFDSCx3QkFBZ0IsZ0NBQWdDLENBQzlDLE1BQU0sRUFBRSxNQUFNLENBQUMsTUFBTSxFQUFFLE1BQU0sR0FBRyxNQUFNLEdBQUcsT0FBTyxDQUFDLEdBQ2hELHNCQUFzQixDQWlCeEI7QUFFRDs7Ozs7Ozs7O0dBU0c7QUFDSCx3QkFBZ0IsOEJBQThCLENBQUMsTUFBTSxFQUFFLHNCQUFzQixHQUFHLE1BQU0sRUFBRSxDQThFdkY7QUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW1CRztBQUNILHdCQUFnQiwwQkFBMEIsQ0FDeEMsYUFBYSxFQUFFLE1BQU0sQ0FBQyxNQUFNLEVBQUUsTUFBTSxHQUFHLE1BQU0sR0FBRyxPQUFPLENBQUMsRUFDeEQsR0FBRyxHQUFFO0lBQUUsQ0FBQyxHQUFHLEVBQUUsTUFBTSxHQUFHLE1BQU0sR0FBRyxTQUFTLENBQUE7Q0FBZ0IsRUFDeEQsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsTUFBTSxLQUFLLElBQUksR0FDMUIsTUFBTSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FrRXhCO0FBNEJELDhHQUE4RztBQUM5Ryx3QkFBZ0IsMkJBQTJCLENBQUMsR0FBRyxHQUFFO0lBQUUsQ0FBQyxHQUFHLEVBQUUsTUFBTSxHQUFHLE1BQU0sR0FBRyxTQUFTLENBQUE7Q0FBZ0IsR0FBRyxPQUFPLENBRzdHIn0=
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"network-consensus-config.d.ts","sourceRoot":"","sources":["../../src/config/network-consensus-config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,iBAAiB,EAAoD,MAAM,6BAA6B,CAAC;AAIvH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAWhE
|
|
1
|
+
{"version":3,"file":"network-consensus-config.d.ts","sourceRoot":"","sources":["../../src/config/network-consensus-config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,iBAAiB,EAAoD,MAAM,6BAA6B,CAAC;AAIvH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAWhE;;;;;;;;;;;;;;;;;;;GAmBG;AACH,eAAO,MAAM,0BAA0B,2mDAwDD,CAAC;AAEvC,8FAA8F;AAC9F,MAAM,MAAM,eAAe,GAAG,CAAC,OAAO,0BAA0B,CAAC,CAAC,MAAM,CAAC,CAAC;AAE1E;;;;GAIG;AACH,eAAO,MAAM,mCAAmC,EAAE,SAAS,eAAe,EAAwC,CAAC;AAEnH;;;;;GAKG;AACH,MAAM,MAAM,sBAAsB,GAAG,IAAI,CAAC,iBAAiB,EAAE,mBAAmB,GAAG,sBAAsB,CAAC,GACxG,QAAQ,CAAC,IAAI,CAAC,eAAe,EAAE,iBAAiB,GAAG,wBAAwB,GAAG,oCAAoC,CAAC,CAAC,CAAC;AAYvH;;;;;;GAMG;AACH,wBAAgB,gCAAgC,CAC9C,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,GAChD,sBAAsB,CAiBxB;AAED;;;;;;;;;GASG;AACH,wBAAgB,8BAA8B,CAAC,MAAM,EAAE,sBAAsB,GAAG,MAAM,EAAE,CA8EvF;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,0BAA0B,CACxC,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,EACxD,GAAG,GAAE;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAA;CAAgB,EACxD,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,GAC1B,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAkExB;AA4BD,8GAA8G;AAC9G,wBAAgB,2BAA2B,CAAC,GAAG,GAAE;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAA;CAAgB,GAAG,OAAO,CAG7G"}
|
|
@@ -6,7 +6,7 @@ import { DEFAULT_CHECKPOINT_PROPOSAL_INIT_TIME, DEFAULT_CHECKPOINT_PROPOSAL_PREP
|
|
|
6
6
|
import { ProposerTimetable } from '../timetable/proposer_timetable.js';
|
|
7
7
|
import { sharedSequencerConfigMappings } from './sequencer-config.js';
|
|
8
8
|
/**
|
|
9
|
-
* Environment variables whose values must be identical across every node of a network. They fall into
|
|
9
|
+
* Environment variables whose values must be identical across every node of a network. They fall into four
|
|
10
10
|
* categories, all consensus-critical:
|
|
11
11
|
*
|
|
12
12
|
* - Timing/protocol consensus: slot and epoch durations, block sub-slot duration, max blocks per checkpoint, and
|
|
@@ -18,6 +18,8 @@ import { sharedSequencerConfigMappings } from './sequencer-config.js';
|
|
|
18
18
|
* it points at would compute the wrong epoch geometry, fees, or slashing rounds.
|
|
19
19
|
* - Node-side slashing offense consensus: the offense detection/penalty parameters validators apply locally to
|
|
20
20
|
* decide which payloads to sign. Validators must agree on these to reach the on-chain slashing quorum.
|
|
21
|
+
* - Validator acceptance limits: the most txs a validator accepts in a peer's checkpoint. These are floors rather
|
|
22
|
+
* than exact values (see {@link NETWORK_CONSENSUS_RAISABLE_ENV_VARS}), and proposers must build within them.
|
|
21
23
|
*
|
|
22
24
|
* Deliberately excluded: bootnodes, P2P/store/OTEL/sentinel settings, SEQ_MIN_TX_PER_BLOCK, SEQ_MAX_TX_PER_*,
|
|
23
25
|
* AZTEC_SLASHER_ENABLED, PROVER_REAL_PROOFS, TRANSACTIONS_DISABLED, and AZTEC_ENTRY_QUEUE_* (mainnet-only genesis
|
|
@@ -72,7 +74,16 @@ import { sharedSequencerConfigMappings } from './sequencer-config.js';
|
|
|
72
74
|
'SLASH_UNKNOWN_PENALTY',
|
|
73
75
|
'SLASH_INVALID_BLOCK_PENALTY',
|
|
74
76
|
'SLASH_INVALID_CHECKPOINT_PROPOSAL_PENALTY',
|
|
75
|
-
'SLASH_GRACE_PERIOD_L2_SLOTS'
|
|
77
|
+
'SLASH_GRACE_PERIOD_L2_SLOTS',
|
|
78
|
+
// Validator acceptance limits.
|
|
79
|
+
'VALIDATOR_MAX_TX_PER_CHECKPOINT'
|
|
80
|
+
];
|
|
81
|
+
/**
|
|
82
|
+
* Consensus-critical vars an operator may raise above the network value but never lower. A validator that accepts
|
|
83
|
+
* more than the network limit still accepts every checkpoint an honest proposer builds within it, whereas a stricter
|
|
84
|
+
* one would reject a protocol-valid checkpoint and decline to attest to it.
|
|
85
|
+
*/ export const NETWORK_CONSENSUS_RAISABLE_ENV_VARS = [
|
|
86
|
+
'VALIDATOR_MAX_TX_PER_CHECKPOINT'
|
|
76
87
|
];
|
|
77
88
|
/** Config mappings for the slot-timing fields of {@link NetworkConsensusConfig}, picked from their owners. */ const networkConsensusConfigMappings = {
|
|
78
89
|
...pickConfigMappings(l1ContractsConfigMappings, [
|
|
@@ -177,13 +188,17 @@ import { sharedSequencerConfigMappings } from './sequencer-config.js';
|
|
|
177
188
|
*
|
|
178
189
|
* For each var in {@link NETWORK_CONSENSUS_ENV_VARS} present in `networkConfig`: if the operator set it in `env`
|
|
179
190
|
* to a conflicting value, this throws unless `ALLOW_OVERRIDING_NETWORK_CONFIG` is truthy (in which case it logs
|
|
180
|
-
* and keeps the operator value).
|
|
191
|
+
* and keeps the operator value). For a var in {@link NETWORK_CONSENSUS_RAISABLE_ENV_VARS}, only a value below the
|
|
192
|
+
* network one conflicts. The same applies to a `SEQ_MAX_TX_PER_CHECKPOINT` (from `env`, or else from
|
|
193
|
+
* `networkConfig`) above the network `VALIDATOR_MAX_TX_PER_CHECKPOINT`: validators running the network value would
|
|
194
|
+
* reject every checkpoint this node proposed over it.
|
|
181
195
|
*
|
|
182
196
|
* This function is pure: it never writes to `env`. Instead it returns the canonical env writes the caller
|
|
183
197
|
* should apply — a map of env-var name to canonical string value for every numeric var whose env value matched
|
|
184
198
|
* the network value numerically. Applying these closes a bypass where the config layer parses some vars with
|
|
185
199
|
* `parseInt` (which reads '6e3' as 6); rewriting them to the network value's string form keeps the operator's
|
|
186
|
-
* numerically-equal value but in canonical form.
|
|
200
|
+
* numerically-equal value but in canonical form. A raisable var set above the network value is canonicalized to
|
|
201
|
+
* its own numeric value for the same reason. Vars kept under `ALLOW_OVERRIDING_NETWORK_CONFIG` (genuine
|
|
187
202
|
* conflicts) are not included, so the operator value is preserved untouched.
|
|
188
203
|
*
|
|
189
204
|
* @returns Canonical env writes (env-var name -> canonical string value) for the caller to apply.
|
|
@@ -191,6 +206,13 @@ import { sharedSequencerConfigMappings } from './sequencer-config.js';
|
|
|
191
206
|
const allowOverride = allowsNetworkConfigOverride(env);
|
|
192
207
|
const canonical = {};
|
|
193
208
|
const conflicts = [];
|
|
209
|
+
const reportConflict = (conflict)=>{
|
|
210
|
+
if (allowOverride) {
|
|
211
|
+
log?.(`Environment variable ${conflict}. Consensus-critical values must match across the network, but ` + `ALLOW_OVERRIDING_NETWORK_CONFIG is set so the operator value is kept (only do this if you know what ` + `you are doing).`);
|
|
212
|
+
} else {
|
|
213
|
+
conflicts.push(conflict);
|
|
214
|
+
}
|
|
215
|
+
};
|
|
194
216
|
for (const envVar of NETWORK_CONSENSUS_ENV_VARS){
|
|
195
217
|
const networkValue = networkConfig[envVar];
|
|
196
218
|
if (networkValue === undefined) {
|
|
@@ -208,12 +230,19 @@ import { sharedSequencerConfigMappings } from './sequencer-config.js';
|
|
|
208
230
|
}
|
|
209
231
|
continue;
|
|
210
232
|
}
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
233
|
+
if (NETWORK_CONSENSUS_RAISABLE_ENV_VARS.includes(envVar) && networkIsNumeric) {
|
|
234
|
+
if (Number(current) > networkValue) {
|
|
235
|
+
canonical[envVar] = String(Number(current));
|
|
236
|
+
continue;
|
|
237
|
+
}
|
|
238
|
+
reportConflict(`${envVar}=${current} is below the network value ${networkValue} and may only be raised`);
|
|
214
239
|
continue;
|
|
215
240
|
}
|
|
216
|
-
conflicts
|
|
241
|
+
reportConflict(`${envVar}=${current} conflicts with the network value ${networkValue}`);
|
|
242
|
+
}
|
|
243
|
+
const proposerConflict = getProposerTxLimitConflict(networkConfig, env);
|
|
244
|
+
if (proposerConflict !== undefined) {
|
|
245
|
+
reportConflict(proposerConflict);
|
|
217
246
|
}
|
|
218
247
|
// Accumulate every conflict so the operator sees all the env vars they need to reconcile at once, rather than
|
|
219
248
|
// fixing them one failed startup at a time.
|
|
@@ -222,6 +251,23 @@ import { sharedSequencerConfigMappings } from './sequencer-config.js';
|
|
|
222
251
|
}
|
|
223
252
|
return canonical;
|
|
224
253
|
}
|
|
254
|
+
/**
|
|
255
|
+
* Returns a conflict when this node would propose checkpoints with more txs than the network's validators accept:
|
|
256
|
+
* its `SEQ_MAX_TX_PER_CHECKPOINT` (from `env`, or else from `networkConfig`) exceeds the network
|
|
257
|
+
* `VALIDATOR_MAX_TX_PER_CHECKPOINT`. Compares against the network value, not this node's own raised one, since
|
|
258
|
+
* that is what the rest of the committee enforces.
|
|
259
|
+
*/ function getProposerTxLimitConflict(networkConfig, env) {
|
|
260
|
+
const validatorMax = networkConfig.VALIDATOR_MAX_TX_PER_CHECKPOINT;
|
|
261
|
+
if (typeof validatorMax !== 'number') {
|
|
262
|
+
return undefined;
|
|
263
|
+
}
|
|
264
|
+
const fromEnv = env.SEQ_MAX_TX_PER_CHECKPOINT;
|
|
265
|
+
const proposerMax = fromEnv !== undefined && fromEnv !== '' ? Number(fromEnv) : Number(networkConfig.SEQ_MAX_TX_PER_CHECKPOINT);
|
|
266
|
+
if (!Number.isFinite(proposerMax) || proposerMax <= validatorMax) {
|
|
267
|
+
return undefined;
|
|
268
|
+
}
|
|
269
|
+
return `SEQ_MAX_TX_PER_CHECKPOINT=${proposerMax} exceeds the network VALIDATOR_MAX_TX_PER_CHECKPOINT of ` + `${validatorMax}, so validators would reject checkpoints this node proposes above it`;
|
|
270
|
+
}
|
|
225
271
|
/** Whether the env opts into overriding network-wide consensus values (`ALLOW_OVERRIDING_NETWORK_CONFIG`). */ export function allowsNetworkConfigOverride(env = process.env) {
|
|
226
272
|
const value = env.ALLOW_OVERRIDING_NETWORK_CONFIG;
|
|
227
273
|
return value === '1' || value?.toLowerCase() === 'true';
|
package/dest/gas/gas_fees.d.ts
CHANGED
|
@@ -31,6 +31,8 @@ export declare class GasFees {
|
|
|
31
31
|
*/
|
|
32
32
|
static fromPlainObject(obj: any): GasFees;
|
|
33
33
|
static random(): GasFees;
|
|
34
|
+
/** The lower of the two fees on each dimension independently. */
|
|
35
|
+
static min(a: GasFees, b: GasFees): GasFees;
|
|
34
36
|
static empty(): GasFees;
|
|
35
37
|
isEmpty(): boolean;
|
|
36
38
|
static fromBuffer(buffer: Buffer | BufferReader): GasFees;
|
|
@@ -48,4 +50,28 @@ export declare class GasFees {
|
|
|
48
50
|
export interface BlockMinFeesProvider {
|
|
49
51
|
getCurrentMinFees(): Promise<GasFees>;
|
|
50
52
|
}
|
|
51
|
-
|
|
53
|
+
/**
|
|
54
|
+
* Provides the mana min fee the next block this node would build is going to charge.
|
|
55
|
+
*
|
|
56
|
+
* Distinct from {@link BlockMinFeesProvider}, which answers the L1-anchored price after the on-chain pending
|
|
57
|
+
* checkpoint and therefore cannot see the fee a locally proposed in-progress checkpoint already froze.
|
|
58
|
+
*/
|
|
59
|
+
export interface NextBlockMinFeesProvider {
|
|
60
|
+
/**
|
|
61
|
+
* The fee the next block will charge, or undefined when the node cannot resolve it right now. For callers that
|
|
62
|
+
* must not act on a stand-in price, such as evicting transactions the next block could not include.
|
|
63
|
+
*/
|
|
64
|
+
getNextBlockMinFees(): Promise<GasFees | undefined>;
|
|
65
|
+
}
|
|
66
|
+
/** Provides the mana min fees a transaction is held to on its way into this node, over gossip or into the pool. */
|
|
67
|
+
export interface TxAdmissionMinFeesProvider extends NextBlockMinFeesProvider {
|
|
68
|
+
/**
|
|
69
|
+
* The fee a transaction must be able to pay to enter this node, over gossip or into the pending pool. The
|
|
70
|
+
* next-block fee when it resolves, otherwise the L1-forward fee, so admission never runs without a floor: a
|
|
71
|
+
* zero `maxFeesPerGas` has a zero fee limit, which a fee payer with no balance also covers.
|
|
72
|
+
*/
|
|
73
|
+
getAdmissionMinFees(): Promise<GasFees>;
|
|
74
|
+
/** The L1-anchored fee projected after the on-chain pending checkpoint, as {@link BlockMinFeesProvider} reports. */
|
|
75
|
+
getL1ForwardMinFees(): Promise<GasFees>;
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2FzX2ZlZXMuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9nYXMvZ2FzX2ZlZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBRXpELE9BQU8sRUFBRSxZQUFZLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBcUIsTUFBTSxrQ0FBa0MsQ0FBQztBQUM1RyxPQUFPLEtBQUssRUFBRSxRQUFRLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUM3RCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQy9CLE9BQU8sRUFBRSxDQUFDLEVBQUUsTUFBTSxLQUFLLENBQUM7QUFFeEIsT0FBTyxLQUFLLEVBQUUsT0FBTyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDbEQsT0FBTyxLQUFLLEVBQUUsYUFBYSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBYTlDLHFDQUFxQztBQUNyQyxxQkFBYSxPQUFPO0lBQ2xCLFNBQWdCLFdBQVcsRUFBRSxPQUFPLENBQUM7SUFDckMsU0FBZ0IsV0FBVyxFQUFFLE9BQU8sQ0FBQztJQUVyQyxZQUFZLFdBQVcsRUFBRSxNQUFNLEdBQUcsTUFBTSxFQUFFLFdBQVcsRUFBRSxNQUFNLEdBQUcsTUFBTSxFQUdyRTtJQUVELE1BQU0sS0FBSyxNQUFNOzs7Ozs7UUFPaEI7SUFFRCxLQUFLLElBQUksT0FBTyxDQUVmO0lBRUQsTUFBTSxDQUFDLEtBQUssRUFBRSxPQUFPLFdBRXBCO0lBRUQsR0FBRyxDQUFDLFNBQVMsRUFBRSxhQUFhLFVBTzNCO0lBRUQsR0FBRyxDQUFDLE1BQU0sRUFBRSxNQUFNLEdBQUcsTUFBTSxXQVcxQjtJQUVELE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxPQUFPLENBQUMsV0FFcEM7SUFFRDs7Ozs7O09BTUc7SUFDSCxNQUFNLENBQUMsZUFBZSxDQUFDLEdBQUcsRUFBRSxHQUFHLEdBQUcsT0FBTyxDQUt4QztJQUVELE1BQU0sQ0FBQyxNQUFNLFlBRVo7SUFFRCxpRUFBaUU7SUFDakUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsT0FBTyxFQUFFLENBQUMsRUFBRSxPQUFPLFdBS2hDO0lBRUQsTUFBTSxDQUFDLEtBQUssWUFFWDtJQUVELE9BQU8sWUFFTjtJQUVELE1BQU0sQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUFFLE1BQU0sR0FBRyxZQUFZLEdBQUcsT0FBTyxDQUd4RDtJQUVELFFBQVEsSUFBSSxNQUFNLENBQUM7SUFDbkIsUUFBUSxDQUFDLElBQUksRUFBRSxVQUFVLEdBQUcsSUFBSSxDQUFDO0lBU2pDLE1BQU0sQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUFFLEVBQUUsRUFBRSxHQUFHLFdBQVcsV0FHM0M7SUFFRCxRQUFRLFNBRVA7SUFFRCxTQUFTOzs7TUFLUjtJQUVELENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxXQUVmO0NBQ0Y7QUFFRCw4REFBOEQ7QUFDOUQsTUFBTSxXQUFXLG9CQUFvQjtJQUNuQyxpQkFBaUIsSUFBSSxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7Q0FDdkM7QUFFRDs7Ozs7R0FLRztBQUNILE1BQU0sV0FBVyx3QkFBd0I7SUFDdkM7OztPQUdHO0lBQ0gsbUJBQW1CLElBQUksT0FBTyxDQUFDLE9BQU8sR0FBRyxTQUFTLENBQUMsQ0FBQztDQUNyRDtBQUVELG1IQUFtSDtBQUNuSCxNQUFNLFdBQVcsMEJBQTJCLFNBQVEsd0JBQXdCO0lBQzFFOzs7O09BSUc7SUFDSCxtQkFBbUIsSUFBSSxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7SUFFeEMsb0hBQW9IO0lBQ3BILG1CQUFtQixJQUFJLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztDQUN6QyJ9
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gas_fees.d.ts","sourceRoot":"","sources":["../../src/gas/gas_fees.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,qCAAqC,CAAC;AAEzD,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,WAAW,EAAqB,MAAM,kCAAkC,CAAC;AAC5G,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AAC7D,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAC/B,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAa9C,qCAAqC;AACrC,qBAAa,OAAO;IAClB,SAAgB,WAAW,EAAE,OAAO,CAAC;IACrC,SAAgB,WAAW,EAAE,OAAO,CAAC;IAErC,YAAY,WAAW,EAAE,MAAM,GAAG,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,EAGrE;IAED,MAAM,KAAK,MAAM;;;;;;QAOhB;IAED,KAAK,IAAI,OAAO,CAEf;IAED,MAAM,CAAC,KAAK,EAAE,OAAO,WAEpB;IAED,GAAG,CAAC,SAAS,EAAE,aAAa,UAO3B;IAED,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,WAW1B;IAED,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,OAAO,CAAC,WAEpC;IAED;;;;;;OAMG;IACH,MAAM,CAAC,eAAe,CAAC,GAAG,EAAE,GAAG,GAAG,OAAO,CAKxC;IAED,MAAM,CAAC,MAAM,YAEZ;IAED,MAAM,CAAC,KAAK,YAEX;IAED,OAAO,YAEN;IAED,MAAM,CAAC,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,YAAY,GAAG,OAAO,CAGxD;IAED,QAAQ,IAAI,MAAM,CAAC;IACnB,QAAQ,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI,CAAC;IASjC,MAAM,CAAC,UAAU,CAAC,MAAM,EAAE,EAAE,EAAE,GAAG,WAAW,WAG3C;IAED,QAAQ,SAEP;IAED,SAAS;;;MAKR;IAED,CAAC,OAAO,CAAC,MAAM,CAAC,WAEf;CACF;AAED,8DAA8D;AAC9D,MAAM,WAAW,oBAAoB;IACnC,iBAAiB,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;CACvC"}
|
|
1
|
+
{"version":3,"file":"gas_fees.d.ts","sourceRoot":"","sources":["../../src/gas/gas_fees.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,qCAAqC,CAAC;AAEzD,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,WAAW,EAAqB,MAAM,kCAAkC,CAAC;AAC5G,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AAC7D,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAC/B,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAa9C,qCAAqC;AACrC,qBAAa,OAAO;IAClB,SAAgB,WAAW,EAAE,OAAO,CAAC;IACrC,SAAgB,WAAW,EAAE,OAAO,CAAC;IAErC,YAAY,WAAW,EAAE,MAAM,GAAG,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,EAGrE;IAED,MAAM,KAAK,MAAM;;;;;;QAOhB;IAED,KAAK,IAAI,OAAO,CAEf;IAED,MAAM,CAAC,KAAK,EAAE,OAAO,WAEpB;IAED,GAAG,CAAC,SAAS,EAAE,aAAa,UAO3B;IAED,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,WAW1B;IAED,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,OAAO,CAAC,WAEpC;IAED;;;;;;OAMG;IACH,MAAM,CAAC,eAAe,CAAC,GAAG,EAAE,GAAG,GAAG,OAAO,CAKxC;IAED,MAAM,CAAC,MAAM,YAEZ;IAED,iEAAiE;IACjE,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,WAKhC;IAED,MAAM,CAAC,KAAK,YAEX;IAED,OAAO,YAEN;IAED,MAAM,CAAC,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,YAAY,GAAG,OAAO,CAGxD;IAED,QAAQ,IAAI,MAAM,CAAC;IACnB,QAAQ,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI,CAAC;IASjC,MAAM,CAAC,UAAU,CAAC,MAAM,EAAE,EAAE,EAAE,GAAG,WAAW,WAG3C;IAED,QAAQ,SAEP;IAED,SAAS;;;MAKR;IAED,CAAC,OAAO,CAAC,MAAM,CAAC,WAEf;CACF;AAED,8DAA8D;AAC9D,MAAM,WAAW,oBAAoB;IACnC,iBAAiB,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;CACvC;AAED;;;;;GAKG;AACH,MAAM,WAAW,wBAAwB;IACvC;;;OAGG;IACH,mBAAmB,IAAI,OAAO,CAAC,OAAO,GAAG,SAAS,CAAC,CAAC;CACrD;AAED,mHAAmH;AACnH,MAAM,WAAW,0BAA2B,SAAQ,wBAAwB;IAC1E;;;;OAIG;IACH,mBAAmB,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;IAExC,oHAAoH;IACpH,mBAAmB,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;CACzC"}
|
package/dest/gas/gas_fees.js
CHANGED
|
@@ -70,6 +70,9 @@ _computedKey = inspect.custom;
|
|
|
70
70
|
static random() {
|
|
71
71
|
return new GasFees(Math.floor(Math.random() * 1e9), Math.floor(Math.random() * 1e9));
|
|
72
72
|
}
|
|
73
|
+
/** The lower of the two fees on each dimension independently. */ static min(a, b) {
|
|
74
|
+
return new GasFees(a.feePerDaGas < b.feePerDaGas ? a.feePerDaGas : b.feePerDaGas, a.feePerL2Gas < b.feePerL2Gas ? a.feePerL2Gas : b.feePerL2Gas);
|
|
75
|
+
}
|
|
73
76
|
static empty() {
|
|
74
77
|
return new GasFees(0, 0);
|
|
75
78
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aztec-labs/stdlib",
|
|
3
|
-
"version": "6.0.0-nightly.
|
|
3
|
+
"version": "6.0.0-nightly.20261003",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"inherits": [
|
|
6
6
|
"../package.common.json",
|
|
@@ -92,12 +92,12 @@
|
|
|
92
92
|
},
|
|
93
93
|
"dependencies": {
|
|
94
94
|
"@aws-sdk/client-s3": "^3.892.0",
|
|
95
|
-
"@aztec-foundation/bb.js": "6.0.0-
|
|
96
|
-
"@aztec-foundation/noir-noirc_abi": "6.0.0-
|
|
97
|
-
"@aztec-labs/blob-lib": "6.0.0-nightly.
|
|
98
|
-
"@aztec-labs/constants": "6.0.0-nightly.
|
|
99
|
-
"@aztec-labs/ethereum": "6.0.0-nightly.
|
|
100
|
-
"@aztec-labs/foundation": "6.0.0-nightly.
|
|
95
|
+
"@aztec-foundation/bb.js": "6.0.0-nightly.20261001",
|
|
96
|
+
"@aztec-foundation/noir-noirc_abi": "6.0.0-nightly.20261001",
|
|
97
|
+
"@aztec-labs/blob-lib": "6.0.0-nightly.20261003",
|
|
98
|
+
"@aztec-labs/constants": "6.0.0-nightly.20261003",
|
|
99
|
+
"@aztec-labs/ethereum": "6.0.0-nightly.20261003",
|
|
100
|
+
"@aztec-labs/foundation": "6.0.0-nightly.20261003",
|
|
101
101
|
"@google-cloud/storage": "^7.15.0",
|
|
102
102
|
"axios": "^1.15.1",
|
|
103
103
|
"json-stringify-deterministic": "1.0.12",
|
|
@@ -14,7 +14,7 @@ import { ProposerTimetable } from '../timetable/proposer_timetable.js';
|
|
|
14
14
|
import { sharedSequencerConfigMappings } from './sequencer-config.js';
|
|
15
15
|
|
|
16
16
|
/**
|
|
17
|
-
* Environment variables whose values must be identical across every node of a network. They fall into
|
|
17
|
+
* Environment variables whose values must be identical across every node of a network. They fall into four
|
|
18
18
|
* categories, all consensus-critical:
|
|
19
19
|
*
|
|
20
20
|
* - Timing/protocol consensus: slot and epoch durations, block sub-slot duration, max blocks per checkpoint, and
|
|
@@ -26,6 +26,8 @@ import { sharedSequencerConfigMappings } from './sequencer-config.js';
|
|
|
26
26
|
* it points at would compute the wrong epoch geometry, fees, or slashing rounds.
|
|
27
27
|
* - Node-side slashing offense consensus: the offense detection/penalty parameters validators apply locally to
|
|
28
28
|
* decide which payloads to sign. Validators must agree on these to reach the on-chain slashing quorum.
|
|
29
|
+
* - Validator acceptance limits: the most txs a validator accepts in a peer's checkpoint. These are floors rather
|
|
30
|
+
* than exact values (see {@link NETWORK_CONSENSUS_RAISABLE_ENV_VARS}), and proposers must build within them.
|
|
29
31
|
*
|
|
30
32
|
* Deliberately excluded: bootnodes, P2P/store/OTEL/sentinel settings, SEQ_MIN_TX_PER_BLOCK, SEQ_MAX_TX_PER_*,
|
|
31
33
|
* AZTEC_SLASHER_ENABLED, PROVER_REAL_PROOFS, TRANSACTIONS_DISABLED, and AZTEC_ENTRY_QUEUE_* (mainnet-only genesis
|
|
@@ -84,11 +86,21 @@ export const NETWORK_CONSENSUS_ENV_VARS = [
|
|
|
84
86
|
'SLASH_INVALID_BLOCK_PENALTY',
|
|
85
87
|
'SLASH_INVALID_CHECKPOINT_PROPOSAL_PENALTY',
|
|
86
88
|
'SLASH_GRACE_PERIOD_L2_SLOTS',
|
|
89
|
+
|
|
90
|
+
// Validator acceptance limits.
|
|
91
|
+
'VALIDATOR_MAX_TX_PER_CHECKPOINT',
|
|
87
92
|
] as const satisfies readonly EnvVar[];
|
|
88
93
|
|
|
89
94
|
/** A consensus-critical environment variable name; see {@link NETWORK_CONSENSUS_ENV_VARS}. */
|
|
90
95
|
export type ConsensusEnvVar = (typeof NETWORK_CONSENSUS_ENV_VARS)[number];
|
|
91
96
|
|
|
97
|
+
/**
|
|
98
|
+
* Consensus-critical vars an operator may raise above the network value but never lower. A validator that accepts
|
|
99
|
+
* more than the network limit still accepts every checkpoint an honest proposer builds within it, whereas a stricter
|
|
100
|
+
* one would reject a protocol-valid checkpoint and decline to attest to it.
|
|
101
|
+
*/
|
|
102
|
+
export const NETWORK_CONSENSUS_RAISABLE_ENV_VARS: readonly ConsensusEnvVar[] = ['VALIDATOR_MAX_TX_PER_CHECKPOINT'];
|
|
103
|
+
|
|
92
104
|
/**
|
|
93
105
|
* The subset of consensus-critical timing config whose geometry can be validated in isolation. Composed by
|
|
94
106
|
* picking the canonical fields from their owning config types so the field set never drifts from the config
|
|
@@ -231,13 +243,17 @@ export function validateNetworkConsensusConfig(config: NetworkConsensusConfig):
|
|
|
231
243
|
*
|
|
232
244
|
* For each var in {@link NETWORK_CONSENSUS_ENV_VARS} present in `networkConfig`: if the operator set it in `env`
|
|
233
245
|
* to a conflicting value, this throws unless `ALLOW_OVERRIDING_NETWORK_CONFIG` is truthy (in which case it logs
|
|
234
|
-
* and keeps the operator value).
|
|
246
|
+
* and keeps the operator value). For a var in {@link NETWORK_CONSENSUS_RAISABLE_ENV_VARS}, only a value below the
|
|
247
|
+
* network one conflicts. The same applies to a `SEQ_MAX_TX_PER_CHECKPOINT` (from `env`, or else from
|
|
248
|
+
* `networkConfig`) above the network `VALIDATOR_MAX_TX_PER_CHECKPOINT`: validators running the network value would
|
|
249
|
+
* reject every checkpoint this node proposed over it.
|
|
235
250
|
*
|
|
236
251
|
* This function is pure: it never writes to `env`. Instead it returns the canonical env writes the caller
|
|
237
252
|
* should apply — a map of env-var name to canonical string value for every numeric var whose env value matched
|
|
238
253
|
* the network value numerically. Applying these closes a bypass where the config layer parses some vars with
|
|
239
254
|
* `parseInt` (which reads '6e3' as 6); rewriting them to the network value's string form keeps the operator's
|
|
240
|
-
* numerically-equal value but in canonical form.
|
|
255
|
+
* numerically-equal value but in canonical form. A raisable var set above the network value is canonicalized to
|
|
256
|
+
* its own numeric value for the same reason. Vars kept under `ALLOW_OVERRIDING_NETWORK_CONFIG` (genuine
|
|
241
257
|
* conflicts) are not included, so the operator value is preserved untouched.
|
|
242
258
|
*
|
|
243
259
|
* @returns Canonical env writes (env-var name -> canonical string value) for the caller to apply.
|
|
@@ -251,6 +267,18 @@ export function checkConsensusEnvOverrides(
|
|
|
251
267
|
const canonical: Record<string, string> = {};
|
|
252
268
|
const conflicts: string[] = [];
|
|
253
269
|
|
|
270
|
+
const reportConflict = (conflict: string) => {
|
|
271
|
+
if (allowOverride) {
|
|
272
|
+
log?.(
|
|
273
|
+
`Environment variable ${conflict}. Consensus-critical values must match across the network, but ` +
|
|
274
|
+
`ALLOW_OVERRIDING_NETWORK_CONFIG is set so the operator value is kept (only do this if you know what ` +
|
|
275
|
+
`you are doing).`,
|
|
276
|
+
);
|
|
277
|
+
} else {
|
|
278
|
+
conflicts.push(conflict);
|
|
279
|
+
}
|
|
280
|
+
};
|
|
281
|
+
|
|
254
282
|
for (const envVar of NETWORK_CONSENSUS_ENV_VARS) {
|
|
255
283
|
const networkValue = networkConfig[envVar];
|
|
256
284
|
if (networkValue === undefined) {
|
|
@@ -271,16 +299,21 @@ export function checkConsensusEnvOverrides(
|
|
|
271
299
|
continue;
|
|
272
300
|
}
|
|
273
301
|
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
);
|
|
302
|
+
if (NETWORK_CONSENSUS_RAISABLE_ENV_VARS.includes(envVar) && networkIsNumeric) {
|
|
303
|
+
if (Number(current) > networkValue) {
|
|
304
|
+
canonical[envVar] = String(Number(current));
|
|
305
|
+
continue;
|
|
306
|
+
}
|
|
307
|
+
reportConflict(`${envVar}=${current} is below the network value ${networkValue} and may only be raised`);
|
|
281
308
|
continue;
|
|
282
309
|
}
|
|
283
|
-
|
|
310
|
+
|
|
311
|
+
reportConflict(`${envVar}=${current} conflicts with the network value ${networkValue}`);
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
const proposerConflict = getProposerTxLimitConflict(networkConfig, env);
|
|
315
|
+
if (proposerConflict !== undefined) {
|
|
316
|
+
reportConflict(proposerConflict);
|
|
284
317
|
}
|
|
285
318
|
|
|
286
319
|
// Accumulate every conflict so the operator sees all the env vars they need to reconcile at once, rather than
|
|
@@ -297,6 +330,32 @@ export function checkConsensusEnvOverrides(
|
|
|
297
330
|
return canonical;
|
|
298
331
|
}
|
|
299
332
|
|
|
333
|
+
/**
|
|
334
|
+
* Returns a conflict when this node would propose checkpoints with more txs than the network's validators accept:
|
|
335
|
+
* its `SEQ_MAX_TX_PER_CHECKPOINT` (from `env`, or else from `networkConfig`) exceeds the network
|
|
336
|
+
* `VALIDATOR_MAX_TX_PER_CHECKPOINT`. Compares against the network value, not this node's own raised one, since
|
|
337
|
+
* that is what the rest of the committee enforces.
|
|
338
|
+
*/
|
|
339
|
+
function getProposerTxLimitConflict(
|
|
340
|
+
networkConfig: Record<string, string | number | boolean>,
|
|
341
|
+
env: { [key: string]: string | undefined },
|
|
342
|
+
): string | undefined {
|
|
343
|
+
const validatorMax = networkConfig.VALIDATOR_MAX_TX_PER_CHECKPOINT;
|
|
344
|
+
if (typeof validatorMax !== 'number') {
|
|
345
|
+
return undefined;
|
|
346
|
+
}
|
|
347
|
+
const fromEnv = env.SEQ_MAX_TX_PER_CHECKPOINT;
|
|
348
|
+
const proposerMax =
|
|
349
|
+
fromEnv !== undefined && fromEnv !== '' ? Number(fromEnv) : Number(networkConfig.SEQ_MAX_TX_PER_CHECKPOINT);
|
|
350
|
+
if (!Number.isFinite(proposerMax) || proposerMax <= validatorMax) {
|
|
351
|
+
return undefined;
|
|
352
|
+
}
|
|
353
|
+
return (
|
|
354
|
+
`SEQ_MAX_TX_PER_CHECKPOINT=${proposerMax} exceeds the network VALIDATOR_MAX_TX_PER_CHECKPOINT of ` +
|
|
355
|
+
`${validatorMax}, so validators would reject checkpoints this node proposes above it`
|
|
356
|
+
);
|
|
357
|
+
}
|
|
358
|
+
|
|
300
359
|
/** Whether the env opts into overriding network-wide consensus values (`ALLOW_OVERRIDING_NETWORK_CONFIG`). */
|
|
301
360
|
export function allowsNetworkConfigOverride(env: { [key: string]: string | undefined } = process.env): boolean {
|
|
302
361
|
const value = env.ALLOW_OVERRIDING_NETWORK_CONFIG;
|
package/src/gas/gas_fees.ts
CHANGED
|
@@ -90,6 +90,14 @@ export class GasFees {
|
|
|
90
90
|
return new GasFees(Math.floor(Math.random() * 1e9), Math.floor(Math.random() * 1e9));
|
|
91
91
|
}
|
|
92
92
|
|
|
93
|
+
/** The lower of the two fees on each dimension independently. */
|
|
94
|
+
static min(a: GasFees, b: GasFees) {
|
|
95
|
+
return new GasFees(
|
|
96
|
+
a.feePerDaGas < b.feePerDaGas ? a.feePerDaGas : b.feePerDaGas,
|
|
97
|
+
a.feePerL2Gas < b.feePerL2Gas ? a.feePerL2Gas : b.feePerL2Gas,
|
|
98
|
+
);
|
|
99
|
+
}
|
|
100
|
+
|
|
93
101
|
static empty() {
|
|
94
102
|
return new GasFees(0, 0);
|
|
95
103
|
}
|
|
@@ -138,3 +146,30 @@ export class GasFees {
|
|
|
138
146
|
export interface BlockMinFeesProvider {
|
|
139
147
|
getCurrentMinFees(): Promise<GasFees>;
|
|
140
148
|
}
|
|
149
|
+
|
|
150
|
+
/**
|
|
151
|
+
* Provides the mana min fee the next block this node would build is going to charge.
|
|
152
|
+
*
|
|
153
|
+
* Distinct from {@link BlockMinFeesProvider}, which answers the L1-anchored price after the on-chain pending
|
|
154
|
+
* checkpoint and therefore cannot see the fee a locally proposed in-progress checkpoint already froze.
|
|
155
|
+
*/
|
|
156
|
+
export interface NextBlockMinFeesProvider {
|
|
157
|
+
/**
|
|
158
|
+
* The fee the next block will charge, or undefined when the node cannot resolve it right now. For callers that
|
|
159
|
+
* must not act on a stand-in price, such as evicting transactions the next block could not include.
|
|
160
|
+
*/
|
|
161
|
+
getNextBlockMinFees(): Promise<GasFees | undefined>;
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
/** Provides the mana min fees a transaction is held to on its way into this node, over gossip or into the pool. */
|
|
165
|
+
export interface TxAdmissionMinFeesProvider extends NextBlockMinFeesProvider {
|
|
166
|
+
/**
|
|
167
|
+
* The fee a transaction must be able to pay to enter this node, over gossip or into the pending pool. The
|
|
168
|
+
* next-block fee when it resolves, otherwise the L1-forward fee, so admission never runs without a floor: a
|
|
169
|
+
* zero `maxFeesPerGas` has a zero fee limit, which a fee payer with no balance also covers.
|
|
170
|
+
*/
|
|
171
|
+
getAdmissionMinFees(): Promise<GasFees>;
|
|
172
|
+
|
|
173
|
+
/** The L1-anchored fee projected after the on-chain pending checkpoint, as {@link BlockMinFeesProvider} reports. */
|
|
174
|
+
getL1ForwardMinFees(): Promise<GasFees>;
|
|
175
|
+
}
|