Écriture sur le réseau
Dans la section précédente, vous avez appris à lire des données du réseau Solana. Explorez maintenant comment y écrire des données. L'écriture sur le réseau Solana implique l'envoi de transactions contenant une ou plusieurs instructions.
Les programmes (smart contracts) traitent ces instructions selon leur logique métier pour chaque instruction respective. Lorsque vous soumettez une transaction, le runtime Solana exécute chaque instruction séquentiellement et de manière atomique (ce qui signifie que soit toutes les instructions réussissent, soit la transaction entière échoue).
Dans cette section, vous verrez deux exemples fondamentaux :
- Transfert de SOL entre comptes
- Création d'un nouveau jeton
Ces exemples montrent comment construire et envoyer des transactions pour invoquer des programmes Solana. Pour plus de détails, consultez les pages Transactions et Instructions et Frais sur Solana.
Transfert de SOL
Dans cet exemple, vous apprendrez comment transférer du SOL entre deux comptes.
Sur Solana, chaque compte a un programme spécifique comme propriétaire. Seul le programme propriétaire peut déduire le solde en SOL (lamport) d'un compte.
Le System Program est le propriétaire de tous les comptes "portefeuille". Pour transférer du SOL, vous devez invoquer l'instruction transfer du System Program.
import {LAMPORTS_PER_SOL,SystemProgram,Transaction,sendAndConfirmTransaction,Keypair,Connection} from "@solana/web3.js";const connection = new Connection("http://localhost:8899", "confirmed");const sender = new Keypair();const receiver = new Keypair();const signature = await connection.requestAirdrop(sender.publicKey,LAMPORTS_PER_SOL);await connection.confirmTransaction(signature, "confirmed");const transferInstruction = SystemProgram.transfer({fromPubkey: sender.publicKey,toPubkey: receiver.publicKey,lamports: 0.01 * LAMPORTS_PER_SOL});const transaction = new Transaction().add(transferInstruction);const transactionSignature = await sendAndConfirmTransaction(connection,transaction,[sender]);console.log("Transaction Signature:", `${transactionSignature}`);
Voici les étapes pour construire des transactions afin d'interagir avec n'importe quel programme sur Solana.
Créer l'instruction que vous souhaitez invoquer.
const transferInstruction = SystemProgram.transfer({fromPubkey: sender.publicKey,toPubkey: receiver.publicKey,lamports: 0.01 * LAMPORTS_PER_SOL});
Ajouter l'instruction à une transaction :
const transaction = new Transaction().add(transferInstruction);
Signer et envoyer la transaction :
const transactionSignature = await sendAndConfirmTransaction(connection,transaction,[sender] // signer keypair);
Créer un jeton
Dans cet exemple, vous apprendrez comment créer un nouveau jeton sur Solana en utilisant le Programme d'Extensions de Jetons. Cela nécessite deux instructions :
- Invoquer le Programme Système pour créer un nouveau compte.
- Invoquer le Programme d'Extensions de Jetons pour initialiser ce compte en tant que Mint.
import {Connection,Keypair,SystemProgram,Transaction,sendAndConfirmTransaction,LAMPORTS_PER_SOL} from "@solana/web3.js";import {MINT_SIZE,TOKEN_2022_PROGRAM_ID,createInitializeMint2Instruction,getMinimumBalanceForRentExemptMint} from "@solana/spl-token";const connection = new Connection("http://localhost:8899", "confirmed");const wallet = new Keypair();// Fund the wallet with SOLconst signature = await connection.requestAirdrop(wallet.publicKey,LAMPORTS_PER_SOL);await connection.confirmTransaction(signature, "confirmed");// Generate keypair to use as address of mint accountconst mint = new Keypair();// Calculate lamports required for rent exemptionconst rentExemptionLamports =await getMinimumBalanceForRentExemptMint(connection);// Instruction to create new account with space for new mint accountconst createAccountInstruction = SystemProgram.createAccount({fromPubkey: wallet.publicKey,newAccountPubkey: mint.publicKey,space: MINT_SIZE,lamports: rentExemptionLamports,programId: TOKEN_2022_PROGRAM_ID});// Instruction to initialize mint accountconst initializeMintInstruction = createInitializeMint2Instruction(mint.publicKey,2, // decimalswallet.publicKey, // mint authoritywallet.publicKey, // freeze authorityTOKEN_2022_PROGRAM_ID);// Build transaction with instructions to create new account and initialize mint accountconst transaction = new Transaction().add(createAccountInstruction,initializeMintInstruction);const transactionSignature = await sendAndConfirmTransaction(connection,transaction,[wallet, // payermint // mint address keypair]);console.log("Mint Account:", `${mint.publicKey}`);console.log("Transaction Signature:", `${transactionSignature}`);
Voici une analyse étape par étape de ce que fait l'exemple :
Créer une connexion et financer le portefeuille
const connection = new Connection("http://localhost:8899", "confirmed");const wallet = new Keypair();const signature = await connection.requestAirdrop(wallet.publicKey,LAMPORTS_PER_SOL);await connection.confirmTransaction(signature, "confirmed");
Générer une paire de clés pour le compte Mint
const mint = new Keypair();
Calculer le minimum de lamports pour l'exemption de loyer
const rentExemptionLamports =await getMinimumBalanceForRentExemptMint(connection);
Créer une instruction pour créer un nouveau compte
- Allouer l'espace requis pour stocker les données de mint
- Transférer des lamports du portefeuille pour financer le nouveau compte
- Attribuer la propriété du compte au programme Token
Extensions (
TOKEN_2022_PROGRAM_ID
)
const createAccountInstruction = SystemProgram.createAccount({fromPubkey: wallet.publicKey,newAccountPubkey: mint.publicKey,space: MINT_SIZE,lamports: rentExemptionLamports,programId: TOKEN_2022_PROGRAM_ID});
Créer une instruction pour initialiser le compte Mint
const initializeMintInstruction = createInitializeMint2Instruction(mint.publicKey,2, // decimalswallet.publicKey, // mint authoritywallet.publicKey, // freeze authorityTOKEN_2022_PROGRAM_ID);
Ajouter les deux instructions à une transaction
const transaction = new Transaction().add(createAccountInstruction,initializeMintInstruction);
Envoyer et confirmer la transaction avec les deux signataires requis
const transactionSignature = await sendAndConfirmTransaction(connection,transaction,[wallet, mint]);
Afficher le compte Mint et la signature de transaction
console.log("Mint Account:", `${mint.publicKey}`);console.log("Transaction Signature:", `${transactionSignature}`);
En combinant les deux instructions dans une seule transaction, vous garantissez que la création et l'initialisation du compte se produisent de manière atomique. Soit les deux instructions réussissent, soit aucune ne réussit. Cette approche est courante lors de la construction de transactions Solana plus complexes, car elle garantit que toutes les instructions s'exécutent ensemble.
Is this page helpful?