Programmes

Sur Solana, un contrat intelligent est appelé un programme. Un programme est un compte sans état qui contient du code exécutable. Ce code est organisé en fonctions appelées instructions. Les utilisateurs interagissent avec un programme en envoyant une transaction contenant une ou plusieurs instructions. Une transaction peut inclure des instructions provenant de plusieurs programmes.

Lorsqu'un programme est déployé, Solana utilise LLVM pour le compiler en format exécutable et lié (ELF). Le fichier ELF contient le binaire du programme au format Solana Bytecode Format (sBPF) et est sauvegardé sur la chaîne dans un compte exécutable.

sBPF est la version personnalisée par Solana du bytecode eBPF.

Écrire des programmes

La majorité des programmes sont écrits en Rust, avec deux approches de développement courantes :

  • Anchor : Anchor est un framework conçu pour un développement Solana rapide et facile. Il utilise des macros Rust pour réduire le code répétitif—ce qui le rend idéal pour les débutants.
  • Rust natif : Écrire des programmes en Rust sans utiliser de frameworks. Cette approche offre plus de flexibilité mais implique une complexité accrue.

Mettre à jour des programmes

Pour modifier un programme existant, un compte doit être désigné comme autorité de mise à jour. (Généralement le même compte qui a initialement déployé le programme.) Si l'autorité de mise à jour est révoquée et définie sur None, le programme ne peut plus être mis à jour.

Vérifier des programmes

Solana prend en charge les builds vérifiables, qui permettent aux utilisateurs de vérifier si le code d'un programme sur la chaîne correspond à son code source public. Le framework Anchor fournit un support intégré pour créer un build vérifiable.

Pour vérifier si un programme existant est vérifié, recherchez son ID de programme sur le Solana Explorer. Alternativement, vous pouvez utiliser Solana Verifiable Build CLI d'Ellipsis Labs, pour vérifier indépendamment les programmes sur la chaîne.

Programmes intégrés

Le System Program

Le System Program est le seul compte qui peut créer de nouveaux comptes. Par défaut, tous les nouveaux comptes appartiennent au System Program, bien que beaucoup se voient attribuer un nouveau propriétaire lors de leur création. Le System Program remplit les fonctions clés suivantes :

FonctionDescription
Création de nouveaux comptesSeul le System Program peut créer de nouveaux comptes.
Allocation d'espaceDéfinit la capacité en octets pour le champ de données de chaque compte.
Attribution de propriété de programmeUne fois que le System Program crée un compte, il peut réattribuer le propriétaire désigné du programme à un autre program account. C'est ainsi que les programmes personnalisés prennent possession des nouveaux comptes créés par le System Program.
Transfert de SOLTransfère des lamports (SOL) des comptes système vers d'autres comptes.

L'adresse du System Program est 11111111111111111111111111111111.

Programmes chargeurs

Chaque programme appartient à un autre — son chargeur. Les chargeurs sont utilisés pour déployer, redéployer, mettre à niveau ou fermer des programmes. Ils sont également utilisés pour finaliser un programme et transférer l'autorité du programme.

Les programmes chargeurs sont parfois appelés « BPF Loaders ».

Il existe actuellement cinq programmes chargeurs, comme indiqué dans le tableau ci-dessous.

ChargeurID du programmeNotesLien vers les instructions
nativeNativeLoader1111111111111111111111111111111Possède les quatre autres chargeurs
v1BPFLoader1111111111111111111111111111111111Les instructions de gestion sont désactivées, mais les programmes s'exécutent toujours
v2BPFLoader2111111111111111111111111111111111Les instructions de gestion sont désactivées, mais les programmes s'exécutent toujoursInstructions
v3BPFLoaderUpgradeab1e11111111111111111111111Les programmes peuvent être mis à jour après déploiement. L'exécutable du programme est stocké dans un compte de données de programme séparéInstructions
v4LoaderV411111111111111111111111111111111111En développement (non publié)Instructions

Les programmes déployés avec loader-v3 ou loader-v4 peuvent être modifiables après leur déploiement, selon ce que détermine leur autorité de mise à niveau.

Lorsqu'un nouveau programme est déployé, la dernière version du chargeur sera utilisée par défaut.

Programmes précompilés

En plus des programmes de chargement, Solana fournit les programmes précompilés suivants.

Vérification de signature ed25519

Le programme ed25519 est utilisé pour vérifier une ou plusieurs signatures ed25519.

ProgrammeID du programmeDescriptionInstructions
Programme Ed25519Ed25519SigVerify111111111111111111111111111Vérifie les signatures ed25519. Si une signature échoue, une erreur est renvoyée.Instructions

Le programme ed25519 traite une instruction. Le premier u8 de l'instruction contient un compteur du nombre de signatures à vérifier, suivi d'un octet de remplissage. Ensuite, la structure suivante est sérialisée, une pour chaque signature à vérifier.

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
}

Vérification de récupération secp256k1

Le programme secp256k1 est utilisé pour vérifier les opérations de récupération de clé publique secp256k1.

ProgrammeID du programmeDescriptionInstructions
Programme Secp256k1KeccakSecp256k11111111111111111111111111111Vérifie les opérations de récupération de clé publique secp256k1 (ecrecover).Instructions

Le programme secp256k1 traite une instruction. Le premier octet de l'instruction contient un compteur du nombre de clés publiques à vérifier. Ensuite, la structure suivante est créée une fois pour chaque clé publique, puis sérialisée et ajoutée aux données d'instruction.

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
}

Cela permet à l'utilisateur de spécifier n'importe quelles données d'instruction dans la transaction pour les données de signature et de message. En spécifiant une sysvar d'instructions spéciale, on peut aussi recevoir des données de la transaction elle-même.

Le coût de la transaction comptera le nombre de signatures à vérifier multiplié par le multiplicateur de coût de vérification de signature.

Le programme secp256r1 est utilisé pour vérifier jusqu'à 8 signatures secp256r1.

ProgrammeID du programmeDescriptionInstructions
Programme Secp256r1Secp256r1SigVerify1111111111111111111111111Vérifie jusqu'à 8 signatures secp256r1. Prend une signature, une clé publique et un message. Renvoie une erreur en cas d'échec.Instructions

Le programme secp256r1 traite une instruction. Le premier u8 de l'instruction est un compteur du nombre de signatures à vérifier, suivi d'un octet unique de remplissage. Ensuite, la structure suivante est créée pour chaque signature, puis sérialisée et ajoutée aux données d'instruction.

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
}

Les valeurs S basses sont imposées pour toutes les signatures afin d'éviter une malléabilité accidentelle des signatures.

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
}

Programmes de base

Les programmes de la liste ci-dessous fournissent les fonctionnalités de base du réseau.

ProgrammeID du programmeDescriptionInstructions
System11111111111111111111111111111111Créer de nouveaux comptes, allouer des données de compte, assigner des comptes aux programmes propriétaires, transférer des lamports depuis des comptes appartenant au Programme Système et payer les frais de transactionSystemInstruction
VoteVote111111111111111111111111111111111111111Créer et gérer des comptes qui suivent l'état de vote du validator et les récompensesVoteInstruction
StakeStake11111111111111111111111111111111111111Créer et gérer des comptes représentant les enjeux et les récompenses pour les délégations aux validatorsStakeInstruction
ConfigConfig1111111111111111111111111111111111111Ajouter des données de configuration à la chaîne, suivies de la liste des clés publiques autorisées à les modifier. Contrairement aux autres programmes, le programme Config ne définit pas d'instructions individuelles. Il n'a qu'une seule instruction implicite : "store". Ses données d'instruction sont un ensemble de clés qui contrôlent l'accès au compte et aux données qui y sont stockéesConfigInstruction
Compute BudgetComputeBudget111111111111111111111111111111Définir les limites et les prix des unités de calcul pour les transactions, permettant aux utilisateurs de contrôler les ressources de calcul et les frais de priorisationComputeBudgetInstruction
Address Lookup TableAddressLookupTab1e1111111111111111111111111Gérer les tables de recherche d'adresses, qui permettent aux transactions de référencer plus de comptes que ce qui pourrait normalement tenir dans la liste de comptes de la transactionProgramInstruction
ZK ElGamal ProofZkE1Gama1Proof11111111111111111111111111111Fournit une vérification de preuve à connaissance nulle pour les données chiffrées ElGamal

Is this page helpful?

Table des matières

Modifier la page

Géré par

© 2025 Fondation Solana.
Tous droits réservés.
Restez connecté
Programmes | Solana