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 :
| Fonction | Description | 
|---|---|
| Création de nouveaux comptes | Seul le System Program peut créer de nouveaux comptes. | 
| Allocation d'espace | Définit la capacité en octets pour le champ de données de chaque compte. | 
| Attribution de propriété de programme | Une 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 SOL | Transfè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.
| Chargeur | ID du programme | Notes | Lien vers les instructions | 
|---|---|---|---|
| native | NativeLoader1111111111111111111111111111111 | Possède les quatre autres chargeurs | — | 
| v1 | BPFLoader1111111111111111111111111111111111 | Les instructions de gestion sont désactivées, mais les programmes s'exécutent toujours | — | 
| v2 | BPFLoader2111111111111111111111111111111111 | Les instructions de gestion sont désactivées, mais les programmes s'exécutent toujours | Instructions | 
| v3 | BPFLoaderUpgradeab1e11111111111111111111111 | Les 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 | 
| v4 | LoaderV411111111111111111111111111111111111 | En 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.
| Programme | ID du programme | Description | Instructions | 
|---|---|---|---|
| Programme Ed25519 | Ed25519SigVerify111111111111111111111111111 | Vé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 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}
Signature verification pseudocode
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}
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.
| Programme | ID du programme | Description | Instructions | 
|---|---|---|---|
| Programme Secp256k1 | KeccakSecp256k11111111111111111111111111111 | Vé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 bytessecp_signature_instruction_index: u8, // instruction index to find signaturesecp_pubkey_offset: u16, // offset to ethereum_address pubkey of 20 bytessecp_pubkey_instruction_index: u8, // instruction index to find pubkeysecp_message_data_offset: u16, // offset to start of message datasecp_message_data_size: u16, // size of message datasecp_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().instructionssignature = 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.
| Programme | ID du programme | Description | Instructions | 
|---|---|---|---|
| Programme Secp256r1 | Secp256r1SigVerify1111111111111111111111111 | Vé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 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}
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 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}
Programmes de base
Les programmes de la liste ci-dessous fournissent les fonctionnalités de base du réseau.
| Programme | ID du programme | Description | Instructions | 
|---|---|---|---|
| System | 11111111111111111111111111111111 | Cré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 transaction | SystemInstruction | 
| Vote | Vote111111111111111111111111111111111111111 | Créer et gérer des comptes qui suivent l'état de vote du validator et les récompenses | VoteInstruction | 
| Stake | Stake11111111111111111111111111111111111111 | Créer et gérer des comptes représentant les enjeux et les récompenses pour les délégations aux validators | StakeInstruction | 
| Config | Config1111111111111111111111111111111111111 | Ajouter 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ées | ConfigInstruction | 
| Compute Budget | ComputeBudget111111111111111111111111111111 | Dé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 priorisation | ComputeBudgetInstruction | 
| Address Lookup Table | AddressLookupTab1e1111111111111111111111111 | Gé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 transaction | ProgramInstruction | 
| ZK ElGamal Proof | ZkE1Gama1Proof11111111111111111111111111111 | Fournit une vérification de preuve à connaissance nulle pour les données chiffrées ElGamal | — | 
Is this page helpful?