solana_cost_model/block_cost_limits.rs
1//! defines block cost related limits
2//!
3
4// Cluster data, method of collecting at https://github.com/solana-labs/solana/issues/19627
5// Dashboard: https://metrics.solana.com/d/monitor-edge/cluster-telemetry?orgId=1
6
7/// Cluster averaged compute unit to micro-sec conversion rate
8pub const COMPUTE_UNIT_TO_US_RATIO: u64 = 30;
9/// Number of compute units for one signature verification.
10pub const SIGNATURE_COST: u64 = COMPUTE_UNIT_TO_US_RATIO * 24;
11/// Number of compute units for one secp256k1 signature verification.
12pub const SECP256K1_VERIFY_COST: u64 = COMPUTE_UNIT_TO_US_RATIO * 223;
13/// Number of compute units for one ed25519 signature verification.
14pub const ED25519_VERIFY_COST: u64 = COMPUTE_UNIT_TO_US_RATIO * 76;
15/// Number of compute units for one ed25519 strict signature verification.
16pub const ED25519_VERIFY_STRICT_COST: u64 = COMPUTE_UNIT_TO_US_RATIO * 80;
17/// Number of compute units for one secp256r1 signature verification.
18pub const SECP256R1_VERIFY_COST: u64 = COMPUTE_UNIT_TO_US_RATIO * 160;
19/// Number of compute units for one write lock
20pub const WRITE_LOCK_UNITS: u64 = COMPUTE_UNIT_TO_US_RATIO * 10;
21/// Number of data bytes per compute units
22pub const INSTRUCTION_DATA_BYTES_COST: u64 = 140 /*bytes per us*/ / COMPUTE_UNIT_TO_US_RATIO;
23
24/// Number of compute units that a block is allowed. A block's compute units are
25/// accumulated by Transactions added to it; A transaction's compute units are
26/// calculated by cost_model, based on transaction's signatures, write locks,
27/// data size and built-in and SBF instructions.
28pub const MAX_BLOCK_UNITS: u64 = 48_000_000;
29pub const MAX_BLOCK_UNITS_SIMD_0207: u64 = 50_000_000;
30
31/// Number of compute units that a writable account in a block is allowed. The
32/// limit is to prevent too many transactions write to same account, therefore
33/// reduce block's parallelism.
34pub const MAX_WRITABLE_ACCOUNT_UNITS: u64 = 12_000_000;
35
36/// Number of compute units that a block can have for vote transactions,
37/// set to less than MAX_BLOCK_UNITS to leave room for non-vote transactions
38pub const MAX_VOTE_UNITS: u64 = 36_000_000;
39
40/// The maximum allowed size, in bytes, that accounts data can grow, per block.
41/// This can also be thought of as the maximum size of new allocations per block.
42pub const MAX_BLOCK_ACCOUNTS_DATA_SIZE_DELTA: u64 = 100_000_000;
43
44/// Return the block limits that will be used upon activation of SIMD-0207.
45/// Returns as
46/// (account_limit, block_limit, vote_limit)
47// ^ Above order is used to be consistent with the order of
48// `CostTracker::set_limits`.
49pub const fn simd_0207_block_limits() -> (u64, u64, u64) {
50 (
51 MAX_WRITABLE_ACCOUNT_UNITS,
52 MAX_BLOCK_UNITS_SIMD_0207,
53 MAX_VOTE_UNITS,
54 )
55}