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.
| Ohjelma | Ohjelmatunniste | Kuvaus | Instruktiot | Lähdekoodi |
|---|---|---|---|---|
| Ed25519-ohjelma | Ed25519SigVerify111111111111111111111111111 | Vahvistaa ed25519-allekirjoitukset. Jos jokin allekirjoitus epäonnistuu, palautetaan virhe. | Instruktiot | Lä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:
struct Ed25519SignatureOffsets {signature_offset: u16, // offset to ed25519 signature of 64 bytessignature_instruction_index: u16, // instruction index to find signaturepublic_key_offset: u16, // offset to public key of 32 bytespublic_key_instruction_index: u16, // instruction index to find public keymessage_data_offset: u16, // offset to start of message datamessage_data_size: u16, // size of message datamessage_instruction_index: u16, // index of instruction data to get message data}
process_instruction() {for i in 0..count {// i'th index values referenced:instructions = &transaction.message().instructionsinstruction_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).
| Ohjelma | Ohjelmatunniste | Kuvaus | Instruktiot | Lähdekoodi |
|---|---|---|---|---|
| Secp256k1-ohjelma | KeccakSecp256k11111111111111111111111111111 | Vahvistaa secp256k1-julkisen avaimen palautusoperaatiot (ecrecover). | Instruktiot | Lä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:
struct SecpSignatureOffsets {signature_offset: u16, // offset to [signature,recovery_id] of 64+1 bytessignature_instruction_index: u8, // instruction index to find signatureeth_address_offset: u16, // offset to ethereum_address of 20 byteseth_address_instruction_index: u8, // instruction index to find ethereum addressmessage_data_offset: u16, // offset to start of message datamessage_data_size: u16, // size of message datamessage_instruction_index: u8, // instruction index to find message data}
process_instruction() {for i in 0..count {// i'th index values referenced:instructions = &transaction.message().instructionssignature = 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.
| Ohjelma | Ohjelmatunnus | Kuvaus | Käskyt | Lähde |
|---|---|---|---|---|
| Secp256r1-ohjelma | Secp256r1SigVerify1111111111111111111111111 | Vahvistaa jopa 8 secp256r1-allekirjoitusta. Ottaa allekirjoituksen, julkisen avaimen ja viestin. Palauttaa virheen, jos jokin epäonnistuu. | Käskyt | Lä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:
struct Secp256r1SignatureOffsets {signature_offset: u16, // offset to compact secp256r1 signature of 64 bytessignature_instruction_index: u16, // instruction index to find signaturepublic_key_offset: u16, // offset to compressed public key of 33 bytespublic_key_instruction_index: u16, // instruction index to find public keymessage_data_offset: u16, // offset to start of message datamessage_data_size: u16, // size of message datamessage_instruction_index: u16, // index of instruction data to get message data}
Matalat S-arvot pakotetaan kaikille allekirjoituksille tahattoman allekirjoituksen muokattavuuden välttämiseksi.
process_instruction() {if data.len() < SIGNATURE_OFFSETS_START {return Error}num_signatures = data[0] as usizeif num_signatures == 0 || num_signatures > 8 {return Error}expected_data_size = num_signatures * SIGNATURE_OFFSETS_SERIALIZED_SIZE + SIGNATURE_OFFSETS_STARTif 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?