Schrijven naar het netwerk
In de vorige sectie heb je geleerd hoe je gegevens kunt lezen van het Solana-netwerk. Nu ga je leren hoe je er gegevens naar kunt schrijven. Schrijven naar het Solana-netwerk houdt in dat je transacties verstuurt die één of meer instructies bevatten.
Programma's (smart contracts) definiëren de bedrijfslogica voor wat elke instructie doet. Wanneer je een transactie indient, voert de Solana-runtime elke instructie opeenvolgend en atomisch uit (wat betekent dat ofwel alle instructies slagen of de hele transactie mislukt).
Deze sectie behandelt de volgende voorbeelden:
- SOL overmaken tussen accounts
- Een nieuwe token creëren
Deze voorbeelden laten zien hoe je transacties kunt bouwen en verzenden om Solana- programma's aan te roepen. Voor meer details, raadpleeg de Transacties en instructies en Kosten op Solana pagina's.
SOL overmaken
In dit voorbeeld leer je hoe je SOL kunt overmaken tussen twee accounts.
Op Solana heeft elk account een specifiek programma als eigenaar. Alleen de programma- eigenaar kan het SOL (lamport) saldo van een account verminderen.
Het System Program is de eigenaar van alle "wallet" accounts. Om SOL over te maken, moet je de transfer instructie van het System Program aanroepen.
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}`);
Maak een Connection
om transacties te verzenden en accountgegevens op te
halen.
In dit voorbeeld maken we verbinding met de lokale testvalidator die draait op
localhost:8899
.
const connection = new Connection("http://localhost:8899", "confirmed");
Genereer nieuwe keypairs om te gebruiken als de verzender- en ontvangeraccounts.
Een Keypair
bevat:
- Een publieke sleutel die dient als het accountadres
- Een privésleutel die wordt gebruikt voor het ondertekenen van transacties
const sender = new Keypair();const receiver = new Keypair();
Voordat we SOL kunnen overmaken, moet het verzenderaccount een SOL-saldo hebben.
Op andere netwerken dan het mainnet kun je de requestAirdrop
methode gebruiken
om SOL voor testen te krijgen.
const signature = await connection.requestAirdrop(sender.publicKey,LAMPORTS_PER_SOL);await connection.confirmTransaction(signature, "confirmed");
De SystemProgram.transfer()
methode creëert een instructie die SOL overboekt
van het fromPubkey
account naar het toPubkey
account voor het gespecificeerde lamports
bedrag.
const transferInstruction = SystemProgram.transfer({fromPubkey: sender.publicKey,toPubkey: receiver.publicKey,lamports: 0.01 * LAMPORTS_PER_SOL});
Maak een transactie en voeg de instructie toe aan de transactie.
In dit voorbeeld maken we een transactie met een enkele instructie. Je kunt echter meerdere instructies aan een transactie toevoegen.
const transaction = new Transaction().add(transferInstruction);
Onderteken en verstuur de transactie naar het netwerk.
Het keypair van de afzender is vereist in de signers array om de overdracht van SOL vanaf hun account te autoriseren.
const transactionSignature = await sendAndConfirmTransaction(connection,transaction,[sender]);
De transactiehandtekening is een unieke identificatie die gebruikt kan worden om de transactie op te zoeken in Solana Explorer.
Een token maken
In dit voorbeeld leer je hoe je een nieuw token op Solana kunt maken met behulp van het Token Extensions Program. Dit vereist twee instructies:
- Roep het System Program aan om een nieuw account te maken.
- Roep het Token Extensions Program aan om dat account te initialiseren als een 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););
Het creëren van een token op Solana vereist het gebruik van zowel de
@solana/web3.js
als de @solana/spl-token
bibliotheken.
- Maak een verbinding
- Genereer een keypair om te betalen voor de transactie
- Vraag een airdrop aan om de keypair te financieren
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");
Genereer een keypair voor de mint account.
De publieke sleutel van deze keypair zal worden gebruikt als het adres voor de mint account.
const mint = new Keypair();
Bereken de minimale hoeveelheid lamports die nodig is voor een mint account.
De getMinimumBalanceForRentExemptMint
functie berekent precies hoeveel SOL (in
lamports) er moet worden toegewezen voor de gegevens op een mint account.
const rentExemptionLamports =await getMinimumBalanceForRentExemptMint(connection);
De eerste instructie roept de createAccount
instructie van het System Program
aan om:
- De vereiste bytes toe te wijzen voor het opslaan van mint gegevens
- Lamports over te maken van de wallet om de nieuwe account te financieren
- Eigendom toe te wijzen van de account aan het Token
Extensions programma (
TOKEN_2022_PROGRAM_ID
)
const createAccountInstruction = SystemProgram.createAccount({fromPubkey: wallet.publicKey,newAccountPubkey: mint.publicKey,space: MINT_SIZE,lamports: rentExemptionLamports,programId: TOKEN_2022_PROGRAM_ID});
De tweede instructie roept de Token Extensions Program's
createInitializeMint2Instruction
instructie aan om de mint account te
initialiseren met de volgende gegevens:
- 2 decimalen
- Wallet als zowel mint autoriteit als freeze autoriteit
const initializeMintInstruction = createInitializeMint2Instruction(mint.publicKey,2,wallet.publicKey,wallet.publicKey,TOKEN_2022_PROGRAM_ID);
Voeg beide instructies toe aan een enkele transactie.
Door beide instructies te combineren in één transactie, zorg je ervoor dat het aanmaken en initialiseren van de account atomisch gebeurt. Ofwel beide instructies slagen, ofwel geen van beide.
Deze aanpak is gebruikelijk bij het bouwen van complexere Solana-transacties, omdat het garandeert dat alle instructies samen worden uitgevoerd.
const transaction = new Transaction().add(createAccountInstruction,initializeMintInstruction);
Onderteken en verstuur de transactie. Twee handtekeningen zijn vereist:
- Wallet ondertekent als betaler voor transactiekosten en het aanmaken van de account
- Mint ondertekent om het gebruik van zijn adres voor de nieuwe account te autoriseren
const transactionSignature = await sendAndConfirmTransaction(connection,transaction,[wallet,mint]);
De geretourneerde transactiehandtekening kan worden gebruikt om de transactie te inspecteren op Solana Explorer.
Is this page helpful?