Écrire sur le réseau

Dans la section précédente, vous avez appris à lire des données du réseau Solana. Maintenant, vous allez apprendre à y écrire des données. Écrire sur le réseau Solana implique d'envoyer des transactions contenant une ou plusieurs instructions.

Les programmes (contrats intelligents) définissent la logique métier pour chaque instruction. Lorsque vous soumettez une transaction, le runtime Solana exécute chaque instruction en séquence et de manière atomique (ce qui signifie que soit toutes les instructions réussissent, soit la transaction entière échoue).

Cette section couvre les exemples suivants :

  1. Transférer des SOL entre comptes
  2. Créer 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.

Transférer des SOL

Dans cet exemple, vous apprendrez comment transférer des 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 des SOL, vous devez invoquer l'instruction transfer du System Program.

Transfer SOL
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}`);
Console
Click to execute the code.

Créer 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.

Connection
const connection = new Connection("http://localhost:8899", "confirmed");

Générer de nouvelles paires de clés à utiliser comme comptes émetteur et récepteur.

Un Keypair comprend :

  • Une clé publique qui sert d'adresse de compte
  • Une clé privée utilisée pour signer les transactions
Generate Keypairs
const sender = new Keypair();
const receiver = new Keypair();

Avant de pouvoir transférer des SOL, le compte émetteur doit avoir un solde en SOL.

Sur les réseaux autres que le mainnet, vous pouvez utiliser la méthode requestAirdrop pour obtenir des SOL pour les tests.

Airdrop
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 montant spécifié en lamports.

Transfer Instruction
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.

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.

Send Transaction
const transactionSignature = await sendAndConfirmTransaction(
connection,
transaction,
[sender]
);

La signature de la transaction est un identifiant unique qui peut être utilisé pour rechercher la transaction sur Solana Explorer.

Créer 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.

Connection
const connection = new Connection("http://localhost:8899", "confirmed");

Générer de nouvelles paires de clés à utiliser comme comptes émetteur et récepteur.

Un Keypair comprend :

  • Une clé publique qui sert d'adresse de compte
  • Une clé privée utilisée pour signer les transactions
Generate Keypairs
const sender = new Keypair();
const receiver = new Keypair();

Avant de pouvoir transférer des SOL, le compte émetteur doit avoir un solde en SOL.

Sur les réseaux autres que le mainnet, vous pouvez utiliser la méthode requestAirdrop pour obtenir des SOL pour les tests.

Airdrop
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 montant spécifié en lamports.

Transfer Instruction
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.

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.

Send Transaction
const transactionSignature = await sendAndConfirmTransaction(
connection,
transaction,
[sender]
);

La signature de la transaction est un identifiant unique qui peut être utilisé pour rechercher la transaction sur Solana Explorer.

Transfer SOL
import {
LAMPORTS_PER_SOL,
SystemProgram,
Transaction,
sendAndConfirmTransaction,
Keypair,
Connection
} from "@solana/web3.js";
const connection = new Connection("http://localhost:8899", "confirmed");

Créer un jeton

Dans cet exemple, vous apprendrez comment créer un nouveau jeton sur Solana en utilisant le Token Extensions Program. Cela nécessite deux instructions :

  1. Invoquer le System Program pour créer un nouveau compte.
  2. Invoquer le Token Extensions Program pour initialiser ce compte en tant que Mint.
Create Mint Account
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 SOL
const signature = await connection.requestAirdrop(
wallet.publicKey,
LAMPORTS_PER_SOL
);
await connection.confirmTransaction(signature, "confirmed");
// Generate keypair to use as address of mint account
const mint = new Keypair();
// Calculate lamports required for rent exemption
const rentExemptionLamports =
await getMinimumBalanceForRentExemptMint(connection);
// Instruction to create new account with space for new mint account
const createAccountInstruction = SystemProgram.createAccount({
fromPubkey: wallet.publicKey,
newAccountPubkey: mint.publicKey,
space: MINT_SIZE,
lamports: rentExemptionLamports,
programId: TOKEN_2022_PROGRAM_ID
});
// Instruction to initialize mint account
const initializeMintInstruction = createInitializeMint2Instruction(
mint.publicKey,
2, // decimals
wallet.publicKey, // mint authority
wallet.publicKey, // freeze authority
TOKEN_2022_PROGRAM_ID
);
// Build transaction with instructions to create new account and initialize mint account
const transaction = new Transaction().add(
createAccountInstruction,
initializeMintInstruction
);
const transactionSignature = await sendAndConfirmTransaction(
connection,
transaction,
[
wallet, // payer
mint // mint address keypair
]
);
console.log("Transaction Signature:", `${transactionSignature}`);
const mintData = await getMint(
connection,
mint.publicKey,
"confirmed",
TOKEN_2022_PROGRAM_ID
);
);
Console
Click to execute the code.

La création d'un token sur Solana nécessite l'utilisation des bibliothèques @solana/web3.js et @solana/spl-token.

  • Créer une connexion
  • Générer un keypair pour payer la transaction
  • Demander un airdrop pour financer le keypair
Connection & Wallet Setup
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 de ce keypair sera utilisée comme adresse pour le mint account.

Mint Keypair
const mint = new Keypair();

Calculer le minimum de lamports requis pour un mint account.

La fonction getMinimumBalanceForRentExemptMint calcule exactement combien de SOL (en lamports) doit être alloué pour les données sur un mint account.

Rent Exemption
const rentExemptionLamports =
await getMinimumBalanceForRentExemptMint(connection);

La première instruction invoque l'instruction createAccount du System Program pour :

  1. Allouer les octets nécessaires pour stocker les données du mint
  2. Transférer des lamports du portefeuille pour financer le nouveau compte
  3. Attribuer la propriété du compte au programme Token Extensions (TOKEN_2022_PROGRAM_ID)
Create Account Instruction
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
  • Le portefeuille comme autorité de mint et autorité de gel
Initialize Mint Instruction
const initializeMintInstruction = createInitializeMint2Instruction(
mint.publicKey,
2,
wallet.publicKey,
wallet.publicKey,
TOKEN_2022_PROGRAM_ID
);

Ajoutez les deux instructions à une seule transaction.

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.

Transaction
const transaction = new Transaction().add(
createAccountInstruction,
initializeMintInstruction
);

Signez et envoyez la transaction. Deux signatures sont requises :

  • Wallet signe en tant que payeur pour les frais de transaction et la création du compte
  • Mint signe pour autoriser l'utilisation de son adresse pour le nouveau compte
Send Transaction
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.

La création d'un token sur Solana nécessite l'utilisation des bibliothèques @solana/web3.js et @solana/spl-token.

  • Créer une connexion
  • Générer un keypair pour payer la transaction
  • Demander un airdrop pour financer le keypair
Connection & Wallet Setup
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 de ce keypair sera utilisée comme adresse pour le mint account.

Mint Keypair
const mint = new Keypair();

Calculer le minimum de lamports requis pour un mint account.

La fonction getMinimumBalanceForRentExemptMint calcule exactement combien de SOL (en lamports) doit être alloué pour les données sur un mint account.

Rent Exemption
const rentExemptionLamports =
await getMinimumBalanceForRentExemptMint(connection);

La première instruction invoque l'instruction createAccount du System Program pour :

  1. Allouer les octets nécessaires pour stocker les données du mint
  2. Transférer des lamports du portefeuille pour financer le nouveau compte
  3. Attribuer la propriété du compte au programme Token Extensions (TOKEN_2022_PROGRAM_ID)
Create Account Instruction
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
  • Le portefeuille comme autorité de mint et autorité de gel
Initialize Mint Instruction
const initializeMintInstruction = createInitializeMint2Instruction(
mint.publicKey,
2,
wallet.publicKey,
wallet.publicKey,
TOKEN_2022_PROGRAM_ID
);

Ajoutez les deux instructions à une seule transaction.

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.

Transaction
const transaction = new Transaction().add(
createAccountInstruction,
initializeMintInstruction
);

Signez et envoyez la transaction. Deux signatures sont requises :

  • Wallet signe en tant que payeur pour les frais de transaction et la création du compte
  • Mint signe pour autoriser l'utilisation de son adresse pour le nouveau compte
Send Transaction
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.

Create Mint Account
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();
const signature = await connection.requestAirdrop(
wallet.publicKey,
LAMPORTS_PER_SOL
);
await connection.confirmTransaction(signature, "confirmed");

Is this page helpful?

Table des matières

Modifier la page