Zapisywanie do sieci

W poprzedniej sekcji nauczyłeś(-aś) się, jak odczytywać dane z sieci Solana. Teraz dowiedz się, jak zapisywać dane do tej sieci. 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:

  1. Przesyłanie SOL między kontami
  2. 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 na Solana.

Przesyłanie SOL

W tym przykładzie dowiesz się, jak przesyłać SOL między dwoma kontami.

Na 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 typu "portfel". Aby przesłać SOL, musisz wywołać instrukcję transfer System Program.

Transfer SOL
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}`);
Click to execute the code.

Oto kroki budowania transakcji w celu interakcji z dowolnym programem na Solanie.

Utwórz instrukcję, którą chcesz wywołać.

Instruction
const transferInstruction = SystemProgram.transfer({
fromPubkey: sender.publicKey,
toPubkey: receiver.publicKey,
lamports: 0.01 * LAMPORTS_PER_SOL
});

Dodaj instrukcję do transakcji:

Transaction
const transaction = new Transaction().add(transferInstruction);

Podpisz i wyślij transakcję:

Send Transaction
const transactionSignature = await sendAndConfirmTransaction(
connection,
transaction,
[sender] // signer keypair
);

Utwórz token

W tym przykładzie dowiesz się, jak utworzyć nowy token na Solanie, używając Token Extensions Program. Wymaga to dwóch instrukcji:

  1. Wywołaj System Program, aby utworzyć nowe konto.
  2. Wywołaj Token Extensions Program, aby zainicjalizować to konto jako Mint.
Create Mint Account
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 SOL
const signature = await connection.requestAirdrop(
wallet.publicKey,
LAMPORTS_PER_SOL
);
await connection.confirmTransaction(signature, "confirmed");
// Generate keypair to use as address of mint account
const mint = new Keypair();
// Calculate lamports required for rent exemption
const rentExemptionLamports =
await getMinimumBalanceForRentExemptMint(connection);
// Instruction to create new account with space for new mint account
const createAccountInstruction = SystemProgram.createAccount({
fromPubkey: wallet.publicKey,
newAccountPubkey: mint.publicKey,
space: MINT_SIZE,
lamports: rentExemptionLamports,
programId: TOKEN_2022_PROGRAM_ID
});
// Instruction to initialize mint account
const initializeMintInstruction = createInitializeMint2Instruction(
mint.publicKey,
2, // decimals
wallet.publicKey, // mint authority
wallet.publicKey, // freeze authority
TOKEN_2022_PROGRAM_ID
);
// Build transaction with instructions to create new account and initialize mint account
const transaction = new Transaction().add(
createAccountInstruction,
initializeMintInstruction
);
const transactionSignature = await sendAndConfirmTransaction(
connection,
transaction,
[
wallet, // payer
mint // mint address keypair
]
);
console.log("Mint Account:", `${mint.publicKey}`);
console.log("Transaction Signature:", `${transactionSignature}`);
Click to execute the code.

Oto szczegółowy podział tego, co robi przykład:

Utwórz połączenie i zasil portfel

Connection and Wallet
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

Mint Keypair
const mint = new Keypair();

Oblicz minimalną liczbę lamportów dla zwolnienia z opłaty za wynajem

Rent Exemption
const rentExemptionLamports =
await getMinimumBalanceForRentExemptMint(connection);

Utwórz instrukcję do stworzenia nowego konta

  1. Przydziel wymaganą przestrzeń do przechowywania danych mint
  2. Przenieś lamporty z portfela, aby sfinansować nowe konto
  3. Przypisz własność konta do programu Token Extensions (TOKEN_2022_PROGRAM_ID)
Create Account Instruction
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

Initialize Mint Instruction
const initializeMintInstruction = createInitializeMint2Instruction(
mint.publicKey,
2, // decimals
wallet.publicKey, // mint authority
wallet.publicKey, // freeze authority
TOKEN_2022_PROGRAM_ID
);

Dodaj obie instrukcje do transakcji

Build Transaction
const transaction = new Transaction().add(
createAccountInstruction,
initializeMintInstruction
);

Wyślij i potwierdź transakcję z obydwoma wymaganymi podpisami

Send Transaction
const transactionSignature = await sendAndConfirmTransaction(
connection,
transaction,
[wallet, mint]
);

Wydrukuj konto Mint i podpis transakcji

Output
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. Takie podejście jest powszechne przy budowaniu bardziej złożonych transakcji Solana, ponieważ gwarantuje, że wszystkie instrukcje zostaną wykonane razem.

Is this page helpful?

Spis treści

Edytuj stronę