Programmi

Su Solana, uno smart contract è chiamato programma. Un programma è un account stateless che contiene codice eseguibile. Questo codice è organizzato in funzioni chiamate istruzioni. Gli utenti interagiscono con un programma inviando una transazione contenente una o più istruzioni. Una transazione può includere istruzioni da più programmi.

Quando un programma viene deployato, Solana utilizza LLVM per compilarlo in formato eseguibile e linkabile (ELF). Il file ELF contiene il binario del programma in Solana Bytecode Format (sBPF) ed è salvato on-chain in un account eseguibile.

sBPF è la versione personalizzata di Solana del bytecode eBPF.

Scrivere programmi

La maggior parte dei programmi è scritta in Rust, con due approcci di sviluppo comuni:

  • Anchor: Anchor è un framework progettato per uno sviluppo Solana veloce e semplice. Utilizza macro Rust per ridurre il codice boilerplate, rendendolo ideale per i principianti.
  • Rust nativo: scrivi programmi in Rust senza utilizzare alcun framework. Questo approccio offre maggiore flessibilità ma comporta una complessità aumentata.

Aggiornare programmi

Per modificare un programma esistente, un account deve essere designato come upgrade authority. (Tipicamente lo stesso account che ha originariamente deployato il programma.) Se l'upgrade authority viene revocata e impostata su None, il programma non può più essere aggiornato.

Verificare programmi

Solana supporta le build verificabili, che consentono agli utenti di verificare se il codice on-chain di un programma corrisponde al suo codice sorgente pubblico. Il framework Anchor fornisce supporto integrato per creare una build verificabile.

Per verificare se un programma esistente è verificato, cerca il suo ID programma su Solana Explorer. In alternativa, puoi utilizzare la Solana Verifiable Build CLI di Ellipsis Labs per verificare in modo indipendente i programmi on-chain.

Programmi integrati

Il System Program

Il System Program è l'unico account in grado di creare nuovi account. Per impostazione predefinita, tutti i nuovi account sono di proprietà del System Program, anche se molti vengono assegnati a un nuovo proprietario al momento della creazione. Il System Program esegue le seguenti funzioni chiave:

FunzioneDescrizione
Creazione di nuovi accountSolo il System Program può creare nuovi account.
Allocazione dello spazioImposta la capacità in byte per il campo dati di ciascun account.
Assegnazione della proprietà del programmaUna volta che il System Program crea un account, può riassegnare il proprietario del programma designato a un account di programma diverso. È così che i programmi personalizzati acquisiscono la proprietà dei nuovi account creati dal System Program.
Trasferimento di SOLTrasferisce lamport (SOL) dagli account di sistema ad altri account.

L'indirizzo del system program è 11111111111111111111111111111111.

Programmi loader

Ogni programma è di proprietà di un altro: il suo loader. I loader vengono utilizzati per distribuire, ridistribuire, aggiornare o chiudere i programmi. Vengono anche utilizzati per finalizzare un programma e trasferire l'autorità del programma.

I programmi loader sono talvolta chiamati 'BPF Loader'.

Attualmente esistono cinque programmi loader, come mostrato nella tabella seguente.

LoaderID programmaNoteLink istruzioni
nativeNativeLoader1111111111111111111111111111111Possiede gli altri quattro loader
v1BPFLoader1111111111111111111111111111111111Le istruzioni di gestione sono disabilitate, ma i programmi vengono comunque eseguiti
v2BPFLoader2111111111111111111111111111111111Le istruzioni di gestione sono disabilitate, ma i programmi vengono comunque eseguitiIstruzioni
v3BPFLoaderUpgradeab1e11111111111111111111111I programmi possono essere aggiornati dopo la distribuzione. L'eseguibile del programma è memorizzato in un account dati del programma separatoIstruzioni
v4LoaderV411111111111111111111111111111111111In fase di sviluppo (non rilasciato)Istruzioni

I programmi distribuiti con loader-v3 o loader-v4 possono essere modificabili dopo la distribuzione, come determinato dalla loro autorità di aggiornamento.

Quando viene distribuito un nuovo programma, verrà utilizzata per impostazione predefinita la versione più recente del loader.

Programmi precompilati

Oltre ai programmi loader, Solana fornisce i seguenti programmi precompilati.

Verifica firma ed25519

Il programma ed25519 viene utilizzato per verificare una o più firme ed25519.

ProgrammaProgram IDDescrizioneIstruzioni
Programma Ed25519Ed25519SigVerify111111111111111111111111111Verifica le firme ed25519. Se una qualsiasi firma fallisce, viene restituito un errore.Istruzioni

Il programma ed25519 elabora un'istruzione. Il primo u8 dell'istruzione contiene un conteggio del numero di firme da verificare, seguito da un singolo byte di riempimento. Successivamente, la seguente struttura viene serializzata, una per ogni firma da verificare.

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
}

Verifica recupero secp256k1

Il programma secp256k1 viene utilizzato per verificare le operazioni di recupero della chiave pubblica secp256k1.

ProgrammaProgram IDDescrizioneIstruzioni
Programma Secp256k1KeccakSecp256k11111111111111111111111111111Verifica le operazioni di recupero della chiave pubblica secp256k1 (ecrecover).Istruzioni

Il programma secp256k1 elabora un'istruzione. Il primo byte dell'istruzione contiene un conteggio del numero di chiavi pubbliche da verificare. Successivamente, la seguente struttura viene creata una volta per ogni chiave pubblica, quindi serializzata e aggiunta ai dati dell'istruzione.

Secp256k1SignatureOffsets
struct Secp256k1SignatureOffsets {
secp_signature_offset: u16, // offset to [signature,recovery_id] of 64+1 bytes
secp_signature_instruction_index: u8, // instruction index to find signature
secp_pubkey_offset: u16, // offset to ethereum_address pubkey of 20 bytes
secp_pubkey_instruction_index: u8, // instruction index to find pubkey
secp_message_data_offset: u16, // offset to start of message data
secp_message_data_size: u16, // size of message data
secp_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[secp_signature_instruction_index].data[secp_signature_offset..secp_signature_offset + 64]
recovery_id = instructions[secp_signature_instruction_index].data[secp_signature_offset + 64]
ref_eth_pubkey = instructions[secp_pubkey_instruction_index].data[secp_pubkey_offset..secp_pubkey_offset + 20]
message_hash = keccak256(instructions[secp_message_instruction_index].data[secp_message_data_offset..secp_message_data_offset + secp_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
}

Questo consente all'utente di specificare qualsiasi dato di istruzione nella transazione per i dati di firma e messaggio. Specificando una sysvar di istruzioni speciale, è anche possibile ricevere dati dalla transazione stessa.

Il costo della transazione conterà il numero di firme da verificare moltiplicato per il moltiplicatore del costo di verifica della firma.

Il programma secp256r1 viene utilizzato per verificare fino a 8 firme secp256r1.

ProgrammaProgram IDDescrizioneIstruzioni
Programma Secp256r1Secp256r1SigVerify1111111111111111111111111Verifica fino a 8 firme secp256r1. Accetta una firma, una chiave pubblica e un messaggio. Restituisce un errore se una qualsiasi fallisce.Istruzioni

Il programma secp256r1 elabora un'istruzione. Il primo u8 dell'istruzione è un conteggio del numero di firme da verificare, seguito da un singolo byte di riempimento. Successivamente, la seguente struttura viene creata per ogni firma, quindi serializzata e aggiunta ai dati dell'istruzione.

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
}

I valori S bassi sono imposti per tutte le firme per evitare la malleabilità accidentale della firma.

Signature verification psuedocode
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
}

Programmi core

I programmi nell'elenco seguente forniscono le funzionalità core della rete.

ProgrammaProgram IDDescrizioneIstruzioni
System11111111111111111111111111111111Crea nuovi account, alloca dati dell'account, assegna account ai programmi proprietari, trasferisce lamport da account di proprietà del programma System e paga le commissioni di transazioneSystemInstruction
VoteVote111111111111111111111111111111111111111Crea e gestisce account che tracciano lo stato di voto del validatore e le ricompenseVoteInstruction
StakeStake11111111111111111111111111111111111111Crea e gestisce account che rappresentano lo stake e le ricompense per le deleghe ai validatoriStakeInstruction
ConfigConfig1111111111111111111111111111111111111Aggiunge dati di configurazione alla chain, seguiti dall'elenco delle chiavi pubbliche autorizzate a modificarli. A differenza degli altri programmi, il programma Config non definisce istruzioni individuali. Ha solo un'istruzione implicita: "store". I suoi dati di istruzione sono un insieme di chiavi che controllano l'accesso all'account e ai dati memorizzati al suo internoConfigInstruction
Compute BudgetComputeBudget111111111111111111111111111111Imposta limiti e prezzi delle unità di calcolo per le transazioni, consentendo agli utenti di controllare le risorse di calcolo e le commissioni di prioritizzazioneComputeBudgetInstruction
Address Lookup TableAddressLookupTab1e1111111111111111111111111Gestisce le tabelle di ricerca degli indirizzi, che consentono alle transazioni di fare riferimento a più account di quanti potrebbero altrimenti rientrare nell'elenco degli account della transazioneProgramInstruction
ZK ElGamal ProofZkE1Gama1Proof11111111111111111111111111111Fornisce la verifica delle prove a conoscenza zero per i dati crittografati con ElGamal

Is this page helpful?

Indice

Modifica Pagina

Gestito da

© 2026 Solana Foundation.
Tutti i diritti riservati.
Rimani Connesso