W poprzedniej sekcji nauczyłeś się, jak odczytywać dane z sieci Solana pobierając konta. Zapisywanie danych w sieci Solana wymaga transakcji. Transakcja zawiera jedną lub więcej instrukcji, a każda instrukcja wywołuje program.
Programy definiują logikę biznesową dla każdej instrukcji. Gdy wysyłasz transakcję, środowisko uruchomieniowe Solana wykonuje instrukcje transakcji w kolejności. Transakcje są atomowe. Albo każda instrukcja w transakcji zakończy się sukcesem, albo cała transakcja zakończy się niepowodzeniem.
Przykłady w tej sekcji pokazują, jak:
- Przelewać SOL między kontami
- Utworzyć nowy mint tokenów
Przelew SOL
Poniższy przykład przelewa SOL z jednego konta na drugie. Tylko program wyznaczony jako właściciel konta może modyfikować dane konta lub odejmować lamport z jego salda. Konta portfela są własnością System Program, więc przelanie SOL między kontami portfela wymaga instrukcji wywołującej instrukcję transfer System Program. Konto źródłowe musi również podpisać transakcję.
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);
Utwórz klienta Kit dla lokalnego testowego validator. Ten fragment dodaje sygnatariusza płatnika, łączy się z lokalnym punktem końcowym RPC, włącza airdropy i zasila płatnika testowym SOL do transferu.
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)));
Wygeneruj sygnatariusza dla odbiorcy. Nadawcą jest client.payer, który został
utworzony przez generatedPayer() i zasilony przez airdropPayer().
const receiver = await generateKeyPairSigner();
Helper getTransferSolInstruction() tworzy instrukcję System Program.
Instrukcja transferuje SOL od sygnatariusza source do adresu
destination dla określonej liczby
amount lamports.
const transferInstruction = getTransferSolInstruction({source: client.payer,destination: receiver.address,amount: lamports(10_000_000n)});
Wywołaj client.sendTransaction() z tablicą instrukcji. Klient Kit przekształca
instrukcje w jedną transakcję, podpisuje sygnatariuszami dołączonymi do
instrukcji, wysyła transakcję i czeka na potwierdzenie.
const result = await client.sendTransaction([transferInstruction]);console.log("Transaction Signature:", result.context.signature);
Po potwierdzeniu transakcji pobierz oba salda za pomocą client.rpc.
const { value: senderBalance } = await client.rpc.getBalance(client.payer.address).send();const { value: receiverBalance } = await client.rpc.getBalance(receiver.address).send();
Utwórz token
Poniższy przykład tworzy nowy mint tokena przy użyciu Token Extensions Program. mint account to konto definiujące globalne ustawienia tokena, takie jak liczba miejsc po przecinku, podaż, uprawnienia do mintowania oraz uprawnienia do zamrażania.
Utworzenie mint account wymaga dwóch instrukcji:
- Wywołaj System Program, aby utworzyć nowe konto należące do Token Extensions Program.
- Wywołaj Token Extensions Program, aby zainicjować to konto jako 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);
Utwórz i zasilij klienta Kit, a następnie wygeneruj sygnatariusza, który będzie adresem nowego mint account. Płatnik klienta finansuje utworzenie konta i opłaca prowizję za transakcję.
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();
Oblicz rozmiar mint account w bajtach, a następnie wykonaj żądanie RPC w celu obliczenia lamports wymaganych do przechowywania tych danych na koncie. Wymagane saldo jest określane jako rent.
const space = BigInt(getMintSize());const rent = await client.rpc.getMinimumBalanceForRentExemption(space).send();
Pierwsza instrukcja wywołuje System Program. Instrukcja używa
payer do zasilenia newAccount,
przydziela mint account space, przekazuje zwolnione z rent
lamports i przypisuje własność do
programAddress.
const createAccountInstruction = getCreateAccountInstruction({payer: client.payer,newAccount: mint,space,lamports: rent,programAddress: TOKEN_2022_PROGRAM_ADDRESS});
Druga instrukcja wywołuje Token Extensions Program. Instrukcja inicjalizuje
adres mint z wartością decimals,
mintAuthority,
freezeAuthority oraz określa
tokenProgram będący właścicielem mint account.
const initializeMintInstruction = getInitializeMintInstruction({mint: mint.address,decimals: 2,mintAuthority: client.payer.address,freezeAuthority: client.payer.address,tokenProgram: TOKEN_2022_PROGRAM_ADDRESS});
Wyślij obie instrukcje w jednej transakcji. Instrukcja tworzenia konta musi poprzedzać instrukcję inicjalizacji mint, ponieważ mint account musi istnieć, zanim Token Extensions Program będzie mógł zapisać dane mint na koncie.
const result = await client.sendTransaction([createAccountInstruction,initializeMintInstruction]);
Po potwierdzeniu transakcji pobierz mint account.
const mintAccount = await fetchMint(client.rpc, mint.address);console.log("Mint Account:", mintAccount);
Is this page helpful?