In het vorige gedeelte hebt u geleerd hoe u gegevens van het Solana-netwerk kunt lezen door accounts op te halen. Het schrijven van gegevens naar het Solana-netwerk vereist een transactie. Een transactie bevat een of meer instructies, en elke instructie roept een programma aan.
Programma's definiëren de bedrijfslogica voor elke instructie. Wanneer u een transactie verzendt, voert de Solana-runtime de instructies van de transactie op volgorde uit. Transacties zijn atomair. Ofwel slaagt elke instructie in de transactie, ofwel mislukt de gehele transactie.
De voorbeelden in dit gedeelte laten zien hoe u:
- SOL overdraagt tussen accounts
- Een nieuwe token mint aanmaakt
SOL overdragen
Het onderstaande voorbeeld draagt SOL over van het ene account naar het andere. Alleen het programma dat is aangewezen als eigenaar van een account kan de gegevens van dat account wijzigen of lamports van het saldo aftrekken. Wallet-accounts zijn eigendom van het System Program, dus voor het overdragen van SOL tussen wallet-accounts is een instructie vereist die het System Program's transfer instructie aanroept. Het bronaccount moet de transactie ook ondertekenen.
import { createClient, generateKeyPairSigner, lamports } from "@solana/kit";import { solanaRpc, rpcAirdrop } from "@solana/kit-plugin-rpc";import { generatedPayer, airdropPayer } from "@solana/kit-plugin-signer";import { getTransferSolInstruction } from "@solana-program/system";const client = await createClient().use(generatedPayer()).use(solanaRpc({rpcUrl: "http://localhost:8899",rpcSubscriptionsUrl: "ws://localhost:8900"})).use(rpcAirdrop()).use(airdropPayer(lamports(1_000_000_000n)));const receiver = await generateKeyPairSigner();const transferInstruction = getTransferSolInstruction({source: client.payer,destination: receiver.address,amount: lamports(10_000_000n)});const result = await client.sendTransaction([transferInstruction]);console.log("Transaction Signature:", result.context.signature);const { value: senderBalance } = await client.rpc.getBalance(client.payer.address).send();const { value: receiverBalance } = await client.rpc.getBalance(receiver.address).send();console.log("Sender Balance:", senderBalance);console.log("Receiver Balance:", receiverBalance);
Maak een Kit-client aan voor de lokale test-validator. Dit fragment voegt een betalende ondertekenaar toe, maakt verbinding met het lokale RPC-eindpunt, schakelt airdrops in en financiert de betaler met test-SOL voor de overdracht.
const client = await createClient().use(generatedPayer()).use(solanaRpc({rpcUrl: "http://localhost:8899",rpcSubscriptionsUrl: "ws://localhost:8900"})).use(rpcAirdrop()).use(airdropPayer(lamports(1_000_000_000n)));
Genereer een ondertekenaar voor de ontvanger. De verzender is client.payer,
die werd aangemaakt door generatedPayer() en gefinancierd door
airdropPayer().
const receiver = await generateKeyPairSigner();
De getTransferSolInstruction() helper maakt een System Program instructie aan.
De instructie draagt SOL over van de source ondertekenaar
naar het destination adres voor het opgegeven
amount aan lamports.
const transferInstruction = getTransferSolInstruction({source: client.payer,destination: receiver.address,amount: lamports(10_000_000n)});
Roep client.sendTransaction() aan met een reeks instructies. De Kit-client zet
de instructies om in één transactie, ondertekent met de ondertekenaars die aan
de instructies zijn gekoppeld, verstuurt de transactie en wacht op bevestiging.
const result = await client.sendTransaction([transferInstruction]);console.log("Transaction Signature:", result.context.signature);
Nadat de transactie is bevestigd, haal je beide saldi op met client.rpc.
const { value: senderBalance } = await client.rpc.getBalance(client.payer.address).send();const { value: receiverBalance } = await client.rpc.getBalance(receiver.address).send();
Een token aanmaken
Het onderstaande voorbeeld maakt een nieuwe token mint aan met behulp van het Token Extensions Program. Een mint account is het account dat de algemene instellingen van een token definieert, zoals decimalen, aanbod, mint authoriteit en bevriezingsauthoriteit.
Het aanmaken van een mint account vereist twee instructies:
- Roep het System Program aan om een nieuw account te maken dat eigendom is van het Token Extensions Program.
- Roep het Token Extensions Program aan om dat account te initialiseren als een mint.
import { createClient, generateKeyPairSigner, lamports } from "@solana/kit";import { solanaRpc, rpcAirdrop } from "@solana/kit-plugin-rpc";import { generatedPayer, airdropPayer } from "@solana/kit-plugin-signer";import { getCreateAccountInstruction } from "@solana-program/system";import {fetchMint,getInitializeMintInstruction,getMintSize,TOKEN_2022_PROGRAM_ADDRESS} from "@solana-program/token-2022";const client = await createClient().use(generatedPayer()).use(solanaRpc({rpcUrl: "http://localhost:8899",rpcSubscriptionsUrl: "ws://localhost:8900"})).use(rpcAirdrop()).use(airdropPayer(lamports(1_000_000_000n)));const mint = await generateKeyPairSigner();const space = BigInt(getMintSize());const rent = await client.rpc.getMinimumBalanceForRentExemption(space).send();const createAccountInstruction = getCreateAccountInstruction({payer: client.payer,newAccount: mint,space,lamports: rent,programAddress: TOKEN_2022_PROGRAM_ADDRESS});const initializeMintInstruction = getInitializeMintInstruction({mint: mint.address,decimals: 2,mintAuthority: client.payer.address,freezeAuthority: client.payer.address,tokenProgram: TOKEN_2022_PROGRAM_ADDRESS});const result = await client.sendTransaction([createAccountInstruction,initializeMintInstruction]);console.log("Mint Address:", mint.address);console.log("Transaction Signature:", result.context.signature);const mintAccount = await fetchMint(client.rpc, mint.address);console.log("Mint Account:", mintAccount);
Maak een Kit-client aan en financier deze, genereer vervolgens een ondertekenaar om te gebruiken als adres van het nieuwe mint account. De betalende client financiert het aanmaken van het account en betaalt de transactiekosten.
const client = await createClient().use(generatedPayer()).use(solanaRpc({rpcUrl: "http://localhost:8899",rpcSubscriptionsUrl: "ws://localhost:8900"})).use(rpcAirdrop()).use(airdropPayer(lamports(1_000_000_000n)));const mint = await generateKeyPairSigner();
Bereken de grootte van het mint account in bytes en doe vervolgens een RPC-verzoek om de benodigde lamports te berekenen voor het opslaan van die gegevens in het account. Dit vereiste saldo wordt rent genoemd.
const space = BigInt(getMintSize());const rent = await client.rpc.getMinimumBalanceForRentExemption(space).send();
De eerste instructie roept het System Program aan. De instructie gebruikt de
payer om een newAccount te
financieren, wijst de mint account space toe, draagt de
rent-vrijgestelde lamports over en wijst het eigendom toe
aan het programAddress.
const createAccountInstruction = getCreateAccountInstruction({payer: client.payer,newAccount: mint,space,lamports: rent,programAddress: TOKEN_2022_PROGRAM_ADDRESS});
De tweede instructie roept het Token Extensions Program aan. De instructie
initialiseert het mint adres met een
decimals waarde, een
mintAuthority, een
freezeAuthority, en specificeert het
tokenProgram dat eigenaar is van het mint account.
const initializeMintInstruction = getInitializeMintInstruction({mint: mint.address,decimals: 2,mintAuthority: client.payer.address,freezeAuthority: client.payer.address,tokenProgram: TOKEN_2022_PROGRAM_ADDRESS});
Verstuur beide instructies in één transactie. De instructie voor het aanmaken van de account moet komen vóór de instructie voor het initialiseren van de mint, omdat de mint account moet bestaan voordat het Token Extensions Program mint-gegevens naar de account kan schrijven.
const result = await client.sendTransaction([createAccountInstruction,initializeMintInstruction]);
Nadat de transactie is bevestigd, haal je de mint account op.
const mintAccount = await fetchMint(client.rpc, mint.address);console.log("Mint Account:", mintAccount);
Is this page helpful?