From 770f0b219665bebeeec44038987d2ba88a70d6c2 Mon Sep 17 00:00:00 2001 From: samkim-crypto Date: Wed, 4 Dec 2024 15:49:15 +0900 Subject: [PATCH] add secp256r1 to `cost-model` --- cost-model/src/block_cost_limits.rs | 4 ++++ cost-model/src/cost_model.rs | 5 +++++ cost-model/src/cost_tracker.rs | 14 ++++++++++++++ cost-model/src/transaction_cost.rs | 10 ++++++++++ 4 files changed, 33 insertions(+) diff --git a/cost-model/src/block_cost_limits.rs b/cost-model/src/block_cost_limits.rs index 7fc4b2fe670b39..7eae91606c4757 100644 --- a/cost-model/src/block_cost_limits.rs +++ b/cost-model/src/block_cost_limits.rs @@ -22,6 +22,10 @@ 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 secp256k1 signature verification. +/// +/// TODO: update actual compute cost +pub const SECP256R1_VERIFY_COST: u64 = COMPUTE_UNIT_TO_US_RATIO * 999_999; /// 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 diff --git a/cost-model/src/cost_model.rs b/cost-model/src/cost_model.rs index cce3b1015b1a36..e652b6035ad13e 100644 --- a/cost-model/src/cost_model.rs +++ b/cost-model/src/cost_model.rs @@ -129,6 +129,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 { diff --git a/cost-model/src/cost_tracker.rs b/cost-model/src/cost_tracker.rs index 3ca2c84d048b98..429524cfaca201 100644 --- a/cost-model/src/cost_tracker.rs +++ b/cost-model/src/cost_tracker.rs @@ -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 { @@ -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, } } } @@ -256,6 +258,11 @@ impl CostTracker { self.in_flight_transaction_count, i64 ), + ( + "secp256r1_instruction_signature_count", + self.secp256r1_instruction_signature_count, + i64 + ) ); } @@ -334,6 +341,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()) } @@ -353,6 +364,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 diff --git a/cost-model/src/transaction_cost.rs b/cost-model/src/transaction_cost.rs index 2c704394a9ccc5..6692ce830f205e 100644 --- a/cost-model/src/transaction_cost.rs +++ b/cost-model/src/transaction_cost.rs @@ -132,6 +132,16 @@ impl<'a, Tx: TransactionWithMeta> TransactionCost<'a, 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