É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 :

  1. Transfert de SOL entre comptes
  2. 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.

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

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.

Instruction
const transferInstruction = SystemProgram.transfer({
fromPubkey: sender.publicKey,
toPubkey: receiver.publicKey,
lamports: 0.01 * LAMPORTS_PER_SOL
});

Ajouter l'instruction à une transaction :

Transaction
const transaction = new Transaction().add(transferInstruction);

Signer et envoyer la transaction :

Send 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 :

  1. Invoquer le Programme Système pour créer un nouveau compte.
  2. Invoquer le Programme d'Extensions de Jetons 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
} 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("Mint Account:", `${mint.publicKey}`);
console.log("Transaction Signature:", `${transactionSignature}`);
Click to execute the code.

Voici une analyse étape par étape de ce que fait l'exemple :

Créer une connexion et financer le portefeuille

Connection and Wallet
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

Mint Keypair
const mint = new Keypair();

Calculer le minimum de lamports pour l'exemption de loyer

Rent Exemption
const rentExemptionLamports =
await getMinimumBalanceForRentExemptMint(connection);

Créer une instruction pour créer un nouveau compte

  1. Allouer l'espace requis pour stocker les données de 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
});

Créer une instruction pour initialiser le compte Mint

Initialize Mint Instruction
const initializeMintInstruction = createInitializeMint2Instruction(
mint.publicKey,
2, // decimals
wallet.publicKey, // mint authority
wallet.publicKey, // freeze authority
TOKEN_2022_PROGRAM_ID
);

Ajouter les deux instructions à une transaction

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

Envoyer et confirmer la transaction avec les deux signataires requis

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

Afficher le compte Mint et la signature de transaction

Output
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?

Table des matières

Modifier la page