Zapisywanie do sieci
W poprzedniej sekcji nauczyłeś się, jak odczytywać dane z sieci Solana. Teraz nauczysz się, jak zapisywać dane do niej. Zapisywanie do sieci Solana polega na wysyłaniu transakcji zawierających jedną lub więcej instrukcji.
Programy definiują logikę biznesową dla każdej instrukcji. Gdy przesyłasz transakcję, środowisko wykonawcze Solana wykonuje każdą instrukcję sekwencyjnie i atomowo. Przykłady w tej sekcji pokazują, jak budować i wysyłać transakcje w celu wywołania programów Solana, obejmują one:
- Przelewanie SOL między kontami
- Tworzenie nowego tokena
Przelew SOL
Poniższy przykład pokazuje, jak przelać SOL między dwoma kontami. Każde konto ma program właściciela, który jest jedynym programem mogącym obciążyć saldo SOL konta.
Wszystkie konta portfela są własnością System Program. Aby przelać SOL, musisz wywołać instrukcję transfer System Program.
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}`);
Utwórz Connection do obsługi wysyłania transakcji i pobierania danych konta.
W tym przykładzie łączymy się z lokalnym testowym validatorem, który działa na
localhost:8899.
const connection = new Connection("http://localhost:8899", "confirmed");
Wygeneruj nowe pary kluczy do użycia jako konta nadawcy i odbiorcy.
const sender = new Keypair();const receiver = new Keypair();
Dodaj SOL do konta nadawcy. Na sieciach innych niż mainnet możesz użyć metody
requestAirdrop, aby uzyskać SOL do testowania.
const signature = await connection.requestAirdrop(sender.publicKey,LAMPORTS_PER_SOL);await connection.confirmTransaction(signature, "confirmed");
Metoda SystemProgram.transfer() tworzy instrukcję, która przesyła SOL z konta
fromPubkey na konto toPubkey dla określonej
liczby lamports.
const transferInstruction = SystemProgram.transfer({fromPubkey: sender.publicKey,toPubkey: receiver.publicKey,lamports: 0.01 * LAMPORTS_PER_SOL});
Utwórz transakcję i dodaj instrukcję do transakcji. W tym przykładzie tworzymy transakcję z jedną instrukcją. Jednakże możesz dodać wiele instrukcji do jednej transakcji.
const transaction = new Transaction().add(transferInstruction);
Podpisz i wyślij transakcję do sieci. Klucz nadawcy jest wymagany w tablicy podpisujących, aby autoryzować transfer SOL z ich konta.
const transactionSignature = await sendAndConfirmTransaction(connection,transaction,[sender]);
Podpis transakcji to unikalny identyfikator, który można wykorzystać do wyszukania transakcji w Solana Explorer.
Utwórz token
Poniższy przykład tworzy nowy token na Solanie przy użyciu Token Extensions Program. Wymaga to dwóch instrukcji:
- Wywołaj System Program, aby utworzyć nowe konto.
- Wywołaj Token Extensions Program, aby zainicjalizować to konto jako 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););
Tworzenie tokena wymaga użycia zarówno bibliotek @solana/web3.js, jak i
@solana/spl-token. Kod w poniższym przykładzie wykona następujące czynności:
- Utwórz połączenie
- Wygeneruj keypair do opłacenia transakcji
- Poproś o airdrop w celu zasilenia keypair
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");
Wygeneruj keypair dla konta mint. Klucz publiczny będzie używany jako adres konta mint.
const mint = new Keypair();
Oblicz minimalną liczbę lamportów wymaganą dla konta mint. Funkcja
getMinimumBalanceForRentExemptMint oblicza, ile lamportów musi zostać
przydzielonych na dane na koncie mint.
const rentExemptionLamports =await getMinimumBalanceForRentExemptMint(connection);
Pierwsza instrukcja wywołuje instrukcję createAccount System Program, aby:
- Przydziel liczbę bajtów potrzebnych do przechowywania danych mint.
- Przenieś lamporty z portfela, aby sfinansować nowe konto.
- Przypisz własność konta do Token Extensions Program.
const createAccountInstruction = SystemProgram.createAccount({fromPubkey: wallet.publicKey,newAccountPubkey: mint.publicKey,space: MINT_SIZE,lamports: rentExemptionLamports,programId: TOKEN_2022_PROGRAM_ID});
Druga instrukcja wywołuje instrukcję programu
Token Extensions Program
createInitializeMint2Instruction, aby zainicjalizować konto mint z
następującymi danymi:
- 2 miejsca dziesiętne
- Portfel jako zarówno autorytet mint, jak i autorytet zamrażania
const initializeMintInstruction = createInitializeMint2Instruction(mint.publicKey,2,wallet.publicKey,wallet.publicKey,TOKEN_2022_PROGRAM_ID);
Dodaj obie instrukcje do jednej transakcji. Zapewnia to, że tworzenie i inicjalizacja konta odbywają się atomowo. (Albo obie instrukcje zakończą się sukcesem, albo żadna z nich.)
To podejście jest powszechne przy budowaniu złożonych transakcji Solana, ponieważ gwarantuje, że wszystkie instrukcje są wykonywane razem.
const transaction = new Transaction().add(createAccountInstruction,initializeMintInstruction);
Podpisz i wyślij transakcję. Wymagane są dwa podpisy:
- Konto portfela podpisuje jako płatnik za opłaty transakcyjne i tworzenie konta
- Konto mint podpisuje, aby autoryzować użycie swojego adresu dla nowego konta
const transactionSignature = await sendAndConfirmTransaction(connection,transaction,[wallet,mint]);
Podpis transakcji zwrócony może być użyty do sprawdzenia transakcji w Solana Explorer.
Is this page helpful?