Zapisywanie do sieci
W poprzedniej sekcji nauczyłeś się, jak odczytywać dane z sieci Solana. Teraz dowiedz się, jak zapisywać dane do niej. Zapisywanie do sieci Solana polega na wysyłaniu transakcji zawierających jedną lub więcej instrukcji.
Programy (smart kontrakty) przetwarzają te instrukcje zgodnie z ich logiką biznesową dla każdej odpowiedniej instrukcji. Gdy przesyłasz transakcję, środowisko wykonawcze Solana wykonuje każdą instrukcję w kolejności i atomowo (co oznacza, że albo wszystkie instrukcje zakończą się sukcesem, albo cała transakcja zakończy się niepowodzeniem).
W tej sekcji zobaczysz dwa podstawowe przykłady:
- Przesyłanie SOL między kontami
- Tworzenie nowego tokena
Te przykłady pokazują, jak budować i wysyłać transakcje w celu wywoływania programów Solana. Więcej szczegółów znajdziesz na stronach Transakcje i Instrukcje oraz Opłaty w Solana.
Przesyłanie SOL
W tym przykładzie dowiesz się, jak przesyłać SOL między dwoma kontami.
W Solana każde konto ma określony program jako swojego właściciela. Tylko program właściciel może odjąć saldo SOL (lamport) z konta.
System Program jest właścicielem wszystkich kont "portfela". Aby przesłać 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}`);
Oto kroki budowania transakcji do interakcji z dowolnym programem na Solanie.
Utwórz instrukcję, którą chcesz wywołać.
const transferInstruction = SystemProgram.transfer({fromPubkey: sender.publicKey,toPubkey: receiver.publicKey,lamports: 0.01 * LAMPORTS_PER_SOL});
Dodaj instrukcję do transakcji:
const transaction = new Transaction().add(transferInstruction);
Podpisz i wyślij transakcję:
const transactionSignature = await sendAndConfirmTransaction(connection,transaction,[sender] // signer keypair);
Utwórz token
W tym przykładzie dowiesz się, jak utworzyć nowy token na Solanie za pomocą 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} 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("Mint Account:", `${mint.publicKey}`);console.log("Transaction Signature:", `${transactionSignature}`);
Oto szczegółowy opis krok po kroku, co robi przykład:
Utwórz połączenie i zasil portfel
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
const mint = new Keypair();
Oblicz minimalną liczbę lamportów dla zwolnienia z opłaty za wynajem
const rentExemptionLamports =await getMinimumBalanceForRentExemptMint(connection);
Utwórz instrukcję do stworzenia nowego konta
- Przydziel wymaganą przestrzeń do przechowywania danych mint
- Przenieś lamporty z portfela, aby sfinansować nowe konto
- Przypisz własność konta do programu Token Extensions
(
TOKEN_2022_PROGRAM_ID
)
const createAccountInstruction = SystemProgram.createAccount({fromPubkey: wallet.publicKey,newAccountPubkey: mint.publicKey,space: MINT_SIZE,lamports: rentExemptionLamports,programId: TOKEN_2022_PROGRAM_ID});
Utwórz instrukcję do inicjalizacji konta Mint
const initializeMintInstruction = createInitializeMint2Instruction(mint.publicKey,2, // decimalswallet.publicKey, // mint authoritywallet.publicKey, // freeze authorityTOKEN_2022_PROGRAM_ID);
Dodaj obie instrukcje do transakcji
const transaction = new Transaction().add(createAccountInstruction,initializeMintInstruction);
Wyślij i potwierdź transakcję z obydwoma wymaganymi podpisami
const transactionSignature = await sendAndConfirmTransaction(connection,transaction,[wallet, mint]);
Wydrukuj konto Mint i podpis transakcji
console.log("Mint Account:", `${mint.publicKey}`);console.log("Transaction Signature:", `${transactionSignature}`);
Łącząc obie instrukcje w jedną transakcję, zapewniasz, że utworzenie i inicjalizacja konta odbywają się atomowo. Albo obie instrukcje zostaną wykonane pomyślnie, albo żadna z nich. Takie podejście jest powszechne przy tworzeniu bardziej złożonych transakcji Solana, ponieważ gwarantuje, że wszystkie instrukcje zostaną wykonane razem.
Is this page helpful?