Skip to content

Commit

Permalink
[secp256r1] Add CU costs (#3826)
Browse files Browse the repository at this point in the history
* add secp256r1 to `builtins-default-costs`

* add secp256r1 to `cost-model`

* cargo lock

* update cost

* add secp256r1 behind feature gate in the cost model

* rekey secp256r1 precompile feature key

* remove default builtin costs for `secp256r1_program`

* cargo lock
  • Loading branch information
samkim-crypto authored Dec 20, 2024
1 parent 30c284a commit ee31e31
Show file tree
Hide file tree
Showing 5 changed files with 39 additions and 1 deletion.
2 changes: 2 additions & 0 deletions cost-model/src/block_cost_limits.rs
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@ pub const SECP256K1_VERIFY_COST: u64 = COMPUTE_UNIT_TO_US_RATIO * 223;
pub const ED25519_VERIFY_COST: u64 = COMPUTE_UNIT_TO_US_RATIO * 76;
/// Number of compute units for one ed25519 strict signature verification.
pub const ED25519_VERIFY_STRICT_COST: u64 = COMPUTE_UNIT_TO_US_RATIO * 80;
/// Number of compute units for one secp256r1 signature verification.
pub const SECP256R1_VERIFY_COST: u64 = COMPUTE_UNIT_TO_US_RATIO * 160;
/// Number of compute units for one write lock
pub const WRITE_LOCK_UNITS: u64 = COMPUTE_UNIT_TO_US_RATIO * 10;
/// Number of data bytes per compute units
Expand Down
12 changes: 12 additions & 0 deletions cost-model/src/cost_model.rs
Original file line number Diff line number Diff line change
Expand Up @@ -163,6 +163,13 @@ impl CostModel {
ED25519_VERIFY_COST
};

let secp256r1_verify_cost =
if feature_set.is_active(&feature_set::enable_secp256r1_precompile::id()) {
SECP256R1_VERIFY_COST
} else {
0
};

signatures_count_detail
.num_transaction_signatures()
.saturating_mul(SIGNATURE_COST)
Expand All @@ -176,6 +183,11 @@ impl CostModel {
.num_ed25519_instruction_signatures()
.saturating_mul(ed25519_verify_cost),
)
.saturating_add(
signatures_count_detail
.num_secp256r1_instruction_signatures()
.saturating_mul(secp256r1_verify_cost),
)
}

fn get_writable_accounts(message: &impl SVMMessage) -> impl Iterator<Item = &Pubkey> {
Expand Down
14 changes: 14 additions & 0 deletions cost-model/src/cost_tracker.rs
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,7 @@ pub struct CostTracker {
/// the tracker, but are still waiting for an update with actual usage or
/// removal if the transaction does not end up getting committed.
in_flight_transaction_count: usize,
secp256r1_instruction_signature_count: u64,
}

impl Default for CostTracker {
Expand All @@ -102,6 +103,7 @@ impl Default for CostTracker {
secp256k1_instruction_signature_count: 0,
ed25519_instruction_signature_count: 0,
in_flight_transaction_count: 0,
secp256r1_instruction_signature_count: 0,
}
}
}
Expand Down Expand Up @@ -261,6 +263,11 @@ impl CostTracker {
self.in_flight_transaction_count,
i64
),
(
"secp256r1_instruction_signature_count",
self.secp256r1_instruction_signature_count,
i64
)
);
}

Expand Down Expand Up @@ -339,6 +346,10 @@ impl CostTracker {
self.ed25519_instruction_signature_count,
tx_cost.num_ed25519_instruction_signatures()
);
saturating_add_assign!(
self.secp256r1_instruction_signature_count,
tx_cost.num_secp256r1_instruction_signatures()
);
self.add_transaction_execution_cost(tx_cost, tx_cost.sum())
}

Expand All @@ -358,6 +369,9 @@ impl CostTracker {
self.ed25519_instruction_signature_count = self
.ed25519_instruction_signature_count
.saturating_sub(tx_cost.num_ed25519_instruction_signatures());
self.secp256r1_instruction_signature_count = self
.secp256r1_instruction_signature_count
.saturating_sub(tx_cost.num_secp256r1_instruction_signatures());
}

/// Apply additional actual execution units to cost_tracker
Expand Down
10 changes: 10 additions & 0 deletions cost-model/src/transaction_cost.rs
Original file line number Diff line number Diff line change
Expand Up @@ -135,6 +135,16 @@ impl<Tx: StaticMeta> TransactionCost<'_, Tx> {
.num_ed25519_instruction_signatures(),
}
}

pub fn num_secp256r1_instruction_signatures(&self) -> u64 {
match self {
Self::SimpleVote { .. } => 0,
Self::Transaction(usage_cost) => usage_cost
.transaction
.signature_details()
.num_secp256r1_instruction_signatures(),
}
}
}

// costs are stored in number of 'compute unit's
Expand Down
2 changes: 1 addition & 1 deletion sdk/feature-set/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -893,7 +893,7 @@ pub mod disable_account_loader_special_case {
}

pub mod enable_secp256r1_precompile {
solana_pubkey::declare_id!("sr11RdZWgbHTHxSroPALe6zgaT5A1K9LcE4nfsZS4gi");
solana_pubkey::declare_id!("sryYyFwxzJop1Bh9XpyiVWjZP4nfHExiqNp3Dh71W9i");
}

pub mod accounts_lt_hash {
Expand Down

0 comments on commit ee31e31

Please sign in to comment.