Écrire sur le réseau
Dans la section précédente, vous avez appris comment lire des données du réseau Solana. Maintenant, vous allez apprendre comment y écrire des données. Écrire sur le réseau Solana implique l'envoi de transactions contenant une ou plusieurs instructions.
Les programmes définissent la logique métier pour ce que chaque instruction fait. Lorsque vous soumettez une transaction, le runtime Solana exécute chaque instruction en séquence et de manière atomique. Les exemples dans cette section montrent comment construire et envoyer des transactions pour invoquer des programmes Solana, ils incluent :
- Transférer des SOL entre comptes
- Créer un nouveau token
Transférer des SOL
L'exemple ci-dessous transfère des SOL entre deux comptes. Chaque compte a un programme propriétaire, qui est le seul programme pouvant déduire le solde en SOL du compte.
Tous les comptes de portefeuille appartiennent au System Program. Pour transférer des 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}`);const senderBalance = await connection.getBalance(sender.publicKey);const receiverBalance = await connection.getBalance(receiver.publicKey);console.log("Sender Balance:", `${senderBalance}`);console.log("Receiver Balance:", `${receiverBalance}`);
Créez un Connection pour gérer l'envoi des transactions et la récupération des
données de compte.
Dans cet exemple, nous nous connectons au validateur de test local qui s'exécute
sur localhost:8899.
const connection = new Connection("http://localhost:8899", "confirmed");
Générez de nouvelles paires de clés à utiliser comme comptes émetteur et récepteur.
const sender = new Keypair();const receiver = new Keypair();
Ajoutez des SOL au compte émetteur. Sur les réseaux autres que le mainnet, vous
pouvez utiliser la méthode requestAirdrop pour obtenir des SOL à des fins de
test.
const signature = await connection.requestAirdrop(sender.publicKey,LAMPORTS_PER_SOL);await connection.confirmTransaction(signature, "confirmed");
La méthode SystemProgram.transfer() crée une instruction qui transfère des SOL
du compte fromPubkey vers le compte toPubkey
pour le nombre spécifié de lamports.
const transferInstruction = SystemProgram.transfer({fromPubkey: sender.publicKey,toPubkey: receiver.publicKey,lamports: 0.01 * LAMPORTS_PER_SOL});
Créez une transaction et ajoutez l'instruction à la transaction. Dans cet exemple, nous créons une transaction avec une seule instruction. Cependant, vous pouvez ajouter plusieurs instructions à une transaction.
const transaction = new Transaction().add(transferInstruction);
Signez et envoyez la transaction au réseau. Le keypair de l'expéditeur est requis dans le tableau des signataires pour autoriser le transfert de SOL depuis son compte.
const transactionSignature = await sendAndConfirmTransaction(connection,transaction,[sender]);
La signature de transaction est un identifiant unique qui peut être utilisé pour consulter la transaction sur Solana Explorer.
Créer un token
L'exemple ci-dessous crée un nouveau token sur Solana en utilisant le Token Extensions Program. Cela nécessite deux instructions :
- Invoquer le System Program pour créer un nouveau compte.
- Invoquer le Token Extensions Program 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,getMint} 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("Transaction Signature:", `${transactionSignature}`);const mintData = await getMint(connection,mint.publicKey,"confirmed",TOKEN_2022_PROGRAM_ID););
La création d'un token nécessite l'utilisation des bibliothèques
@solana/web3.js et @solana/spl-token. Le code dans l'exemple ci-dessous va :
- Créer une connexion
- Générer un keypair pour payer la transaction
- Demander un airdrop pour financer le keypair
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 un keypair pour le mint account. La clé publique sera utilisée comme adresse du mint account.
const mint = new Keypair();
Calculer le minimum de lamports requis pour un mint account. La fonction
getMinimumBalanceForRentExemptMint calcule combien de lamports doivent être
alloués pour les données sur un mint account.
const rentExemptionLamports =await getMinimumBalanceForRentExemptMint(connection);
La première instruction invoque l'instruction createAccount du System Program
pour :
- Allouer le nombre d'octets nécessaires pour stocker les données du mint.
- Transférer des lamports du portefeuille pour financer le nouveau compte.
- Attribuer la propriété du compte au programme Token Extensions.
const createAccountInstruction = SystemProgram.createAccount({fromPubkey: wallet.publicKey,newAccountPubkey: mint.publicKey,space: MINT_SIZE,lamports: rentExemptionLamports,programId: TOKEN_2022_PROGRAM_ID});
La deuxième instruction invoque l'instruction createInitializeMint2Instruction
du Token Extensions Program pour initialiser le mint
account avec les données suivantes :
- 2 décimales
- Portefeuille comme autorité de mint et autorité de gel
const initializeMintInstruction = createInitializeMint2Instruction(mint.publicKey,2,wallet.publicKey,wallet.publicKey,TOKEN_2022_PROGRAM_ID);
Ajoutez les deux instructions à une seule transaction. Cela garantit que la création du compte et son initialisation 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 complexes, car elle garantit que toutes les instructions s'exécutent ensemble.
const transaction = new Transaction().add(createAccountInstruction,initializeMintInstruction);
Signez et envoyez la transaction. Deux signatures sont requises :
- Le compte portefeuille signe en tant que payeur pour les frais de transaction et la création du compte
- Le compte mint signe pour autoriser l'utilisation de son adresse pour le nouveau compte
const transactionSignature = await sendAndConfirmTransaction(connection,transaction,[wallet,mint]);
La signature de transaction retournée peut être utilisée pour examiner la transaction sur Solana Explorer.
Is this page helpful?