Esikäännetyt ohjelmat

Yhteenveto

Esikäännökset (Ed25519, Secp256k1, Secp256r1) vahvistavat allekirjoitukset natiivikoodina, ohittaen sBPF VM:n. Ne käsittelevät kryptografisia operaatioita, joissa sBPF- suoritus olisi liian hidasta. Esikäännöksiä ei voi kutsua CPI:n kautta.

Esikäännetyt ohjelmat

Esikäännetyt ohjelmat ohittavat sBPF-virtuaalikoneen ja suoritetaan natiivikoodina validatorissa. Ne käsittelevät kryptografisia operaatioita, joissa sBPF-suoritus olisi liian hidasta.

Vahvista ed25519-allekirjoitus

Ed25519-ohjelma vahvistaa yhden tai useamman ed25519-allekirjoituksen yhdessä instruktiossa.

OhjelmaOhjelmatunnisteKuvausInstruktiotLähdekoodi
Ed25519-ohjelmaEd25519SigVerify111111111111111111111111111Vahvistaa ed25519-allekirjoitukset. Jos jokin allekirjoitus epäonnistuu, palautetaan virhe.InstruktiotLähdekoodi

Instruktion ensimmäinen u8 sisältää tarkistettavien allekirjoitusten lukumäärän, jota seuraa yksi täytetavu. Tämän jälkeen seuraava struct sarjallistetaan kerran per allekirjoitus:

Ed25519SignatureOffsets
struct Ed25519SignatureOffsets {
signature_offset: u16, // offset to ed25519 signature of 64 bytes
signature_instruction_index: u16, // instruction index to find signature
public_key_offset: u16, // offset to public key of 32 bytes
public_key_instruction_index: u16, // instruction index to find public key
message_data_offset: u16, // offset to start of message data
message_data_size: u16, // size of message data
message_instruction_index: u16, // index of instruction data to get message data
}
Signature verification pseudocode
process_instruction() {
for i in 0..count {
// i'th index values referenced:
instructions = &transaction.message().instructions
instruction_index = ed25519_signature_instruction_index != u16::MAX ? ed25519_signature_instruction_index : current_instruction;
signature = instructions[instruction_index].data[ed25519_signature_offset..ed25519_signature_offset + 64]
instruction_index = ed25519_pubkey_instruction_index != u16::MAX ? ed25519_pubkey_instruction_index : current_instruction;
pubkey = instructions[instruction_index].data[ed25519_pubkey_offset..ed25519_pubkey_offset + 32]
instruction_index = ed25519_message_instruction_index != u16::MAX ? ed25519_message_instruction_index : current_instruction;
message = instructions[instruction_index].data[ed25519_message_data_offset..ed25519_message_data_offset + ed25519_message_data_size]
if pubkey.verify(signature, message) != Success {
return Error
}
}
return Success
}

Vahvista secp256k1-palautus

Secp256k1-ohjelma vahvistaa secp256k1-julkisen avaimen palautusoperaatiot (ecrecover).

OhjelmaOhjelmatunnisteKuvausInstruktiotLähdekoodi
Secp256k1-ohjelmaKeccakSecp256k11111111111111111111111111111Vahvistaa secp256k1-julkisen avaimen palautusoperaatiot (ecrecover).InstruktiotLähdekoodi

Instruktion ensimmäinen tavu sisältää tarkistettavien julkisten avainten lukumäärän. Tämän jälkeen seuraava struct sarjallistetaan kerran per julkinen avain:

SecpSignatureOffsets
struct SecpSignatureOffsets {
signature_offset: u16, // offset to [signature,recovery_id] of 64+1 bytes
signature_instruction_index: u8, // instruction index to find signature
eth_address_offset: u16, // offset to ethereum_address of 20 bytes
eth_address_instruction_index: u8, // instruction index to find ethereum address
message_data_offset: u16, // offset to start of message data
message_data_size: u16, // size of message data
message_instruction_index: u8, // instruction index to find message data
}
Recovery verification pseudocode
process_instruction() {
for i in 0..count {
// i'th index values referenced:
instructions = &transaction.message().instructions
signature = instructions[signature_instruction_index].data[signature_offset..signature_offset + 64]
recovery_id = instructions[signature_instruction_index].data[signature_offset + 64]
ref_eth_pubkey = instructions[eth_address_instruction_index].data[eth_address_offset..eth_address_offset + 20]
message_hash = keccak256(instructions[message_instruction_index].data[message_data_offset..message_data_offset + message_data_size])
pubkey = ecrecover(signature, recovery_id, message_hash)
eth_pubkey = keccak256(pubkey[1..])[12..]
if eth_pubkey != ref_eth_pubkey {
return Error
}
}
return Success
}

Allekirjoitus ja viestidata voivat viitata mihin tahansa instruction dataan transaktiossa. Määrittämällä erityisen instructions sysvarin, ohjelmat voivat myös lukea dataa itse transaktiosta.

Transaktio kustannus on yhtä suuri kuin allekirjoitusten määrä kerrottuna allekirjoituskohtaisella vahvistuskustannuksella.

Vahvista secp256r1-allekirjoitus

Secp256r1-ohjelma vahvistaa jopa 8 secp256r1-allekirjoitusta per käsky.

OhjelmaOhjelmatunnusKuvausKäskytLähde
Secp256r1-ohjelmaSecp256r1SigVerify1111111111111111111111111Vahvistaa jopa 8 secp256r1-allekirjoitusta. Ottaa allekirjoituksen, julkisen avaimen ja viestin. Palauttaa virheen, jos jokin epäonnistuu.KäskytLähde

Käskyn ensimmäinen u8 on tarkistettavien allekirjoitusten määrä, jota seuraa yksi täytetavu. Sen jälkeen seuraava rakenne sarjallistetaan kerran per allekirjoitus:

Secp256r1SignatureOffsets
struct Secp256r1SignatureOffsets {
signature_offset: u16, // offset to compact secp256r1 signature of 64 bytes
signature_instruction_index: u16, // instruction index to find signature
public_key_offset: u16, // offset to compressed public key of 33 bytes
public_key_instruction_index: u16, // instruction index to find public key
message_data_offset: u16, // offset to start of message data
message_data_size: u16, // size of message data
message_instruction_index: u16, // index of instruction data to get message data
}

Matalat S-arvot pakotetaan kaikille allekirjoituksille tahattoman allekirjoituksen muokattavuuden välttämiseksi.

Signature verification pseudocode
process_instruction() {
if data.len() < SIGNATURE_OFFSETS_START {
return Error
}
num_signatures = data[0] as usize
if num_signatures == 0 || num_signatures > 8 {
return Error
}
expected_data_size = num_signatures * SIGNATURE_OFFSETS_SERIALIZED_SIZE + SIGNATURE_OFFSETS_START
if data.len() < expected_data_size {
return Error
}
for i in 0..num_signatures {
offsets = parse_signature_offsets(data, i)
signature = get_data_slice(data, instruction_datas, offsets.signature_instruction_index, offsets.signature_offset, SIGNATURE_SERIALIZED_SIZE)
if s > half_curve_order {
return Error
}
pubkey = get_data_slice(data, instruction_datas, offsets.public_key_instruction_index, offsets.public_key_offset, COMPRESSED_PUBKEY_SERIALIZED_SIZE)
message = get_data_slice(data, instruction_datas, offsets.message_instruction_index, offsets.message_data_offset, offsets.message_data_size)
if !verify_signature(signature, pubkey, message) {
return Error
}
}
return Success
}

Is this page helpful?

Sisällysluettelo

Muokkaa sivua

Hallinnoi

© 2026 Solana Foundation.
Kaikki oikeudet pidätetään.
Yhdistä