Schrijven naar het netwerk
In de vorige sectie heb je geleerd hoe je gegevens van het Solana-netwerk kunt lezen. 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 definiëren de bedrijfslogica voor wat elke instructie doet. Wanneer je een transactie indient, voert de Solana-runtime elke instructie in volgorde en atomisch uit. De voorbeelden in deze sectie laten zien hoe je transacties kunt bouwen en versturen om Solana-programma's aan te roepen, waaronder:
- SOL overmaken tussen accounts
- Een nieuw token aanmaken
SOL overmaken
Het onderstaande voorbeeld maakt SOL over tussen twee accounts. Elk account heeft een eigenaar- programma, wat het enige programma is dat het SOL-saldo van het account kan verminderen.
Alle wallet-accounts zijn eigendom van het System Program. 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 het verzenden van transacties en het ophalen van
accountgegevens af te handelen.
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 verzender- en ontvanger-accounts.
const sender = new Keypair();const receiver = new Keypair();
Voeg SOL toe aan het verzender-account. Op andere netwerken dan mainnet kun je
de requestAirdrop methode gebruiken om SOL te krijgen voor testen.
const signature = await connection.requestAirdrop(sender.publicKey,LAMPORTS_PER_SOL);await connection.confirmTransaction(signature, "confirmed");
De SystemProgram.transfer() methode maakt een instructie die SOL overboekt van
het fromPubkey account naar het toPubkey
account voor het opgegeven aantal lamports.
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 verzend de transactie naar het netwerk. De verzender keypair is vereist in de signers array om de overdracht van SOL vanuit hun account te autoriseren.
const transactionSignature = await sendAndConfirmTransaction(connection,transaction,[sender]);
De transactiehandtekening is een unieke identificatie die kan worden gebruikt om de transactie op te zoeken in Solana Explorer.
Een token maken
Het onderstaande voorbeeld maakt een nieuw token op Solana met behulp van het Token Extensions Program. Dit vereist twee instructies:
- Roep het System Program aan om een nieuwe account te maken.
- Roep het Token Extensions Program aan om die 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 vereist het gebruik van zowel de @solana/web3.js als
de @solana/spl-token bibliotheken. De code in het onderstaande voorbeeld zal:
- Een verbinding maken
- Een keypair genereren om de transactie te betalen
- Een airdrop aanvragen 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 het mint account. De publieke sleutel zal worden gebruikt als het adres van het mint account.
const mint = new Keypair();
Bereken het minimum aantal lamports dat nodig is voor een mint account. De
getMinimumBalanceForRentExemptMint functie berekent hoeveel lamports er moeten
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:
- Reserveer het aantal bytes dat nodig is om de mint-gegevens op te slaan.
- Draag lamports over van de wallet om het nieuwe account te financieren.
- Wijs eigendom toe van het account aan het Token Extensions program.
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 het mint account te
initialiseren met de volgende gegevens:
- 2 decimalen
- Wallet als zowel mint authority als freeze authority
const initializeMintInstruction = createInitializeMint2Instruction(mint.publicKey,2,wallet.publicKey,wallet.publicKey,TOKEN_2022_PROGRAM_ID);
Voeg beide instructies toe aan één transactie. Dit zorgt ervoor dat het aanmaken van het account en de initialisatie atomair gebeuren. (Ofwel beide instructies slagen, ofwel geen van beide.)
Deze aanpak is gebruikelijk bij het bouwen van complexe Solana-transacties, omdat het garandeert dat alle instructies samen worden uitgevoerd.
const transaction = new Transaction().add(createAccountInstruction,initializeMintInstruction);
Onderteken en verzend de transactie. Twee handtekeningen zijn vereist:
- Het wallet account ondertekent als betaler voor transactiekosten en het aanmaken van het account
- Het mint account ondertekent om het gebruik van zijn adres voor het 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?