Skip to content

Commit df080d3

Browse files
[runtime-transaction] add secp256r1 to precompile signature details (#3878)
1 parent cfc53c7 commit df080d3

File tree

11 files changed

+52
-2
lines changed

11 files changed

+52
-2
lines changed

Cargo.lock

Lines changed: 2 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

cost-model/src/transaction_cost.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -246,7 +246,7 @@ impl solana_runtime_transaction::transaction_meta::StaticMeta for WritableKeysTr
246246

247247
fn signature_details(&self) -> &solana_sdk::message::TransactionSignatureDetails {
248248
const DUMMY: solana_sdk::message::TransactionSignatureDetails =
249-
solana_sdk::message::TransactionSignatureDetails::new(0, 0, 0);
249+
solana_sdk::message::TransactionSignatureDetails::new(0, 0, 0, 0);
250250
&DUMMY
251251
}
252252

programs/sbf/Cargo.lock

Lines changed: 2 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

runtime-transaction/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ solana-builtins-default-costs = { workspace = true }
1616
solana-compute-budget = { workspace = true }
1717
solana-pubkey = { workspace = true }
1818
solana-sdk = { workspace = true }
19+
solana-sdk-ids = { workspace = true }
1920
solana-svm-transaction = { workspace = true }
2021
thiserror = { workspace = true }
2122

runtime-transaction/src/runtime_transaction/sdk_transactions.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ impl RuntimeTransaction<SanitizedVersionedTransaction> {
4747
),
4848
precompile_signature_details.num_secp256k1_instruction_signatures,
4949
precompile_signature_details.num_ed25519_instruction_signatures,
50+
precompile_signature_details.num_secp256r1_instruction_signatures,
5051
);
5152
let compute_budget_instruction_details = ComputeBudgetInstructionDetails::try_from(
5253
sanitized_versioned_tx

runtime-transaction/src/runtime_transaction/transaction_view.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ impl<D: TransactionData> RuntimeTransaction<SanitizedTransactionView<D>> {
5757
u64::from(transaction.num_required_signatures()),
5858
precompile_signature_details.num_secp256k1_instruction_signatures,
5959
precompile_signature_details.num_ed25519_instruction_signatures,
60+
precompile_signature_details.num_secp256r1_instruction_signatures,
6061
);
6162
let compute_budget_instruction_details =
6263
ComputeBudgetInstructionDetails::try_from(transaction.program_instructions_iter())?;

runtime-transaction/src/signature_details.rs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ use {
77
pub struct PrecompileSignatureDetails {
88
pub num_secp256k1_instruction_signatures: u64,
99
pub num_ed25519_instruction_signatures: u64,
10+
pub num_secp256r1_instruction_signatures: u64,
1011
}
1112

1213
/// Get transaction signature details.
@@ -20,6 +21,7 @@ pub fn get_precompile_signature_details<'a>(
2021
// is low enough that the sum of all signatures will not overflow a u64.
2122
let mut num_secp256k1_instruction_signatures: u64 = 0;
2223
let mut num_ed25519_instruction_signatures: u64 = 0;
24+
let mut num_secp256r1_instruction_signatures: u64 = 0;
2325
for (program_id, instruction) in instructions {
2426
let program_id_index = instruction.program_id_index;
2527
match filter.is_signature(program_id_index, program_id) {
@@ -32,12 +34,17 @@ pub fn get_precompile_signature_details<'a>(
3234
num_ed25519_instruction_signatures = num_ed25519_instruction_signatures
3335
.wrapping_add(get_num_signatures_in_instruction(&instruction));
3436
}
37+
ProgramIdStatus::Secp256r1 => {
38+
num_secp256r1_instruction_signatures = num_secp256r1_instruction_signatures
39+
.wrapping_add(get_num_signatures_in_instruction(&instruction));
40+
}
3541
}
3642
}
3743

3844
PrecompileSignatureDetails {
3945
num_secp256k1_instruction_signatures,
4046
num_ed25519_instruction_signatures,
47+
num_secp256r1_instruction_signatures,
4148
}
4249
}
4350

@@ -51,6 +58,7 @@ enum ProgramIdStatus {
5158
NotSignature,
5259
Secp256k1,
5360
Ed25519,
61+
Secp256r1,
5462
}
5563

5664
struct SignatureDetailsFilter {
@@ -86,6 +94,8 @@ impl SignatureDetailsFilter {
8694
ProgramIdStatus::Secp256k1
8795
} else if program_id == &solana_sdk::ed25519_program::ID {
8896
ProgramIdStatus::Ed25519
97+
} else if program_id == &solana_sdk_ids::secp256r1_program::ID {
98+
ProgramIdStatus::Secp256r1
8999
} else {
90100
ProgramIdStatus::NotSignature
91101
}
@@ -140,26 +150,31 @@ mod tests {
140150
Pubkey::new_unique(),
141151
solana_sdk::secp256k1_program::ID,
142152
solana_sdk::ed25519_program::ID,
153+
solana_sdk_ids::secp256r1_program::ID,
143154
];
144155
let instructions = [
145156
make_instruction(&program_ids, 1, &[5]),
146157
make_instruction(&program_ids, 2, &[3]),
158+
make_instruction(&program_ids, 3, &[4]),
147159
make_instruction(&program_ids, 0, &[]),
148160
make_instruction(&program_ids, 2, &[2]),
149161
make_instruction(&program_ids, 1, &[1]),
150162
make_instruction(&program_ids, 0, &[]),
163+
make_instruction(&program_ids, 3, &[3]),
151164
];
152165

153166
let signature_details = get_precompile_signature_details(instructions.into_iter());
154167
assert_eq!(signature_details.num_secp256k1_instruction_signatures, 6);
155168
assert_eq!(signature_details.num_ed25519_instruction_signatures, 5);
169+
assert_eq!(signature_details.num_secp256r1_instruction_signatures, 7);
156170
}
157171

158172
#[test]
159173
fn test_get_signature_details_missing_num_signatures() {
160174
let program_ids = [
161175
solana_sdk::secp256k1_program::ID,
162176
solana_sdk::ed25519_program::ID,
177+
solana_sdk_ids::secp256r1_program::ID,
163178
];
164179
let instructions = [
165180
make_instruction(&program_ids, 0, &[]),
@@ -169,5 +184,6 @@ mod tests {
169184
let signature_details = get_precompile_signature_details(instructions.into_iter());
170185
assert_eq!(signature_details.num_secp256k1_instruction_signatures, 0);
171186
assert_eq!(signature_details.num_ed25519_instruction_signatures, 0);
187+
assert_eq!(signature_details.num_secp256r1_instruction_signatures, 0);
172188
}
173189
}

sdk/message/src/sanitized.rs

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ use {
1414
solana_instruction::{BorrowedAccountMeta, BorrowedInstruction},
1515
solana_pubkey::Pubkey,
1616
solana_sanitize::Sanitize,
17-
solana_sdk_ids::{ed25519_program, secp256k1_program},
17+
solana_sdk_ids::{ed25519_program, secp256k1_program, secp256r1_program},
1818
std::{borrow::Cow, collections::HashSet, convert::TryFrom},
1919
};
2020

@@ -411,6 +411,13 @@ impl SanitizedMessage {
411411
.num_ed25519_instruction_signatures
412412
.saturating_add(u64::from(*num_verifies));
413413
}
414+
} else if secp256r1_program::check_id(program_id) {
415+
if let Some(num_verifies) = instruction.data.first() {
416+
transaction_signature_details.num_secp256r1_instruction_signatures =
417+
transaction_signature_details
418+
.num_secp256r1_instruction_signatures
419+
.saturating_add(u64::from(*num_verifies));
420+
}
414421
}
415422
}
416423

@@ -425,18 +432,21 @@ pub struct TransactionSignatureDetails {
425432
num_transaction_signatures: u64,
426433
num_secp256k1_instruction_signatures: u64,
427434
num_ed25519_instruction_signatures: u64,
435+
num_secp256r1_instruction_signatures: u64,
428436
}
429437

430438
impl TransactionSignatureDetails {
431439
pub const fn new(
432440
num_transaction_signatures: u64,
433441
num_secp256k1_instruction_signatures: u64,
434442
num_ed25519_instruction_signatures: u64,
443+
num_secp256r1_instruction_signatures: u64,
435444
) -> Self {
436445
Self {
437446
num_transaction_signatures,
438447
num_secp256k1_instruction_signatures,
439448
num_ed25519_instruction_signatures,
449+
num_secp256r1_instruction_signatures,
440450
}
441451
}
442452

@@ -445,6 +455,7 @@ impl TransactionSignatureDetails {
445455
self.num_transaction_signatures
446456
.saturating_add(self.num_secp256k1_instruction_signatures)
447457
.saturating_add(self.num_ed25519_instruction_signatures)
458+
.saturating_add(self.num_secp256r1_instruction_signatures)
448459
}
449460

450461
/// return the number of transaction signatures
@@ -461,6 +472,11 @@ impl TransactionSignatureDetails {
461472
pub fn num_ed25519_instruction_signatures(&self) -> u64 {
462473
self.num_ed25519_instruction_signatures
463474
}
475+
476+
/// return the number of secp256k1 instruction signatures
477+
pub fn num_secp256r1_instruction_signatures(&self) -> u64 {
478+
self.num_secp256r1_instruction_signatures
479+
}
464480
}
465481

466482
#[cfg(test)]

svm/examples/Cargo.lock

Lines changed: 2 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

transaction-view/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ edition = { workspace = true }
1111

1212
[dependencies]
1313
solana-sdk = { workspace = true }
14+
solana-sdk-ids = { workspace = true }
1415
solana-svm-transaction = { workspace = true }
1516

1617
[dev-dependencies]

0 commit comments

Comments
 (0)