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 (smart kontrakty) definiują logikę biznesową dla każdej instrukcji. Kiedy przesyłasz transakcję, środowisko wykonawcze Solana wykonuje każdą instrukcję w kolejności i atomowo (co oznacza, że albo wszystkie instrukcje się powiodą, albo cała transakcja zakończy się niepowodzeniem).

Ta sekcja obejmuje następujące 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 zmniejszyć saldo SOL (lamport) konta.

System Program jest właścicielem wszystkich kont "portfela". 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}`);
const senderBalance = await connection.getBalance(sender.publicKey);
const receiverBalance = await connection.getBalance(receiver.publicKey);
console.log("Sender Balance:", `${senderBalance}`);
console.log("Receiver Balance:", `${receiverBalance}`);
Console
Click to execute the code.

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.

Connection
const connection = new Connection("http://localhost:8899", "confirmed");

Wygeneruj nowe keypairy do użycia jako konta nadawcy i odbiorcy.

Keypair zawiera:

  • Klucz publiczny, który służy jako adres konta
  • Klucz prywatny używany do podpisywania transakcji
Generate Keypairs
const sender = new Keypair();
const receiver = new Keypair();

Zanim będziemy mogli przelać SOL, konto nadawcy musi mieć pewien balans SOL.

Na sieciach innych niż mainnet możesz użyć metody requestAirdrop, aby uzyskać SOL do testowania.

Airdrop
const signature = await connection.requestAirdrop(
sender.publicKey,
LAMPORTS_PER_SOL
);
await connection.confirmTransaction(signature, "confirmed");

Metoda SystemProgram.transfer() tworzy instrukcję, która przenosi SOL z konta fromPubkey na konto toPubkey na określoną kwotę lamports.

Transfer Instruction
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.

Transaction
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 jego konta.

Send Transaction
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 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.

Connection
const connection = new Connection("http://localhost:8899", "confirmed");

Wygeneruj nowe keypairy do użycia jako konta nadawcy i odbiorcy.

Keypair zawiera:

  • Klucz publiczny, który służy jako adres konta
  • Klucz prywatny używany do podpisywania transakcji
Generate Keypairs
const sender = new Keypair();
const receiver = new Keypair();

Zanim będziemy mogli przelać SOL, konto nadawcy musi mieć pewien balans SOL.

Na sieciach innych niż mainnet możesz użyć metody requestAirdrop, aby uzyskać SOL do testowania.

Airdrop
const signature = await connection.requestAirdrop(
sender.publicKey,
LAMPORTS_PER_SOL
);
await connection.confirmTransaction(signature, "confirmed");

Metoda SystemProgram.transfer() tworzy instrukcję, która przenosi SOL z konta fromPubkey na konto toPubkey na określoną kwotę lamports.

Transfer Instruction
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.

Transaction
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 jego konta.

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

Podpis transakcji to unikalny identyfikator, który można wykorzystać do wyszukania transakcji w Solana Explorer.

Transfer SOL
import {
LAMPORTS_PER_SOL,
SystemProgram,
Transaction,
sendAndConfirmTransaction,
Keypair,
Connection
} from "@solana/web3.js";
const connection = new Connection("http://localhost:8899", "confirmed");

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:

  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,
getMint
} 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("Transaction Signature:", `${transactionSignature}`);
const mintData = await getMint(
connection,
mint.publicKey,
"confirmed",
TOKEN_2022_PROGRAM_ID
);
);
Console
Click to execute the code.

Tworzenie tokena na Solanie wymaga użycia zarówno bibliotek @solana/web3.js, jak i @solana/spl-token.

  • Utwórz połączenie
  • Wygeneruj keypair do opłacenia transakcji
  • Poproś o airdrop w celu sfinansowania keypair
Connection & Wallet Setup
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 tego keypaira będzie używany jako adres dla konta mint.

Mint Keypair
const mint = new Keypair();

Oblicz minimalną liczbę lamportów wymaganą dla konta mint.

Funkcja getMinimumBalanceForRentExemptMint oblicza dokładnie, ile SOL (w lamportach) musi zostać przydzielone na dane na koncie mint.

Rent Exemption
const rentExemptionLamports =
await getMinimumBalanceForRentExemptMint(connection);

Pierwsza instrukcja wywołuje instrukcję createAccount programu System Program, aby:

  1. Przydzielić wymagane bajty do przechowywania danych mint
  2. Przenieść lamporty z portfela w celu sfinansowania nowego konta
  3. Przypisać 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
});

Druga instrukcja wywołuje instrukcję programu Token Extensions Program createInitializeMint2Instruction w celu zainicjalizowania konta mint z następującymi danymi:

  • 2 miejsca po przecinku
  • Portfel jako zarówno autorytet mint, jak i autorytet zamrażania
Initialize Mint Instruction
const initializeMintInstruction = createInitializeMint2Instruction(
mint.publicKey,
2,
wallet.publicKey,
wallet.publicKey,
TOKEN_2022_PROGRAM_ID
);

Dodaj obie instrukcje do jednej transakcji.

Łącząc obie instrukcje w jedną transakcję, zapewniasz, że utworzenie i inicjalizacja konta odbywają się atomowo. Albo obie instrukcje zakończą się sukcesem, albo żadna z nich.

To podejście jest powszechne przy budowaniu bardziej złożonych transakcji na Solanie, ponieważ gwarantuje, że wszystkie instrukcje zostaną wykonane razem.

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

Podpisz i wyślij transakcję. Wymagane są dwa podpisy:

  • Wallet podpisuje jako płatnik opłat transakcyjnych i tworzenia konta
  • Mint podpisuje, aby autoryzować użycie swojego adresu dla nowego konta
Send Transaction
const transactionSignature = await sendAndConfirmTransaction(
connection,
transaction,
[
wallet,
mint
]
);

Zwrócony podpis transakcji można wykorzystać do sprawdzenia transakcji w Solana Explorer.

Tworzenie tokena na Solanie wymaga użycia zarówno bibliotek @solana/web3.js, jak i @solana/spl-token.

  • Utwórz połączenie
  • Wygeneruj keypair do opłacenia transakcji
  • Poproś o airdrop w celu sfinansowania keypair
Connection & Wallet Setup
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 tego keypaira będzie używany jako adres dla konta mint.

Mint Keypair
const mint = new Keypair();

Oblicz minimalną liczbę lamportów wymaganą dla konta mint.

Funkcja getMinimumBalanceForRentExemptMint oblicza dokładnie, ile SOL (w lamportach) musi zostać przydzielone na dane na koncie mint.

Rent Exemption
const rentExemptionLamports =
await getMinimumBalanceForRentExemptMint(connection);

Pierwsza instrukcja wywołuje instrukcję createAccount programu System Program, aby:

  1. Przydzielić wymagane bajty do przechowywania danych mint
  2. Przenieść lamporty z portfela w celu sfinansowania nowego konta
  3. Przypisać 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
});

Druga instrukcja wywołuje instrukcję programu Token Extensions Program createInitializeMint2Instruction w celu zainicjalizowania konta mint z następującymi danymi:

  • 2 miejsca po przecinku
  • Portfel jako zarówno autorytet mint, jak i autorytet zamrażania
Initialize Mint Instruction
const initializeMintInstruction = createInitializeMint2Instruction(
mint.publicKey,
2,
wallet.publicKey,
wallet.publicKey,
TOKEN_2022_PROGRAM_ID
);

Dodaj obie instrukcje do jednej transakcji.

Łącząc obie instrukcje w jedną transakcję, zapewniasz, że utworzenie i inicjalizacja konta odbywają się atomowo. Albo obie instrukcje zakończą się sukcesem, albo żadna z nich.

To podejście jest powszechne przy budowaniu bardziej złożonych transakcji na Solanie, ponieważ gwarantuje, że wszystkie instrukcje zostaną wykonane razem.

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

Podpisz i wyślij transakcję. Wymagane są dwa podpisy:

  • Wallet podpisuje jako płatnik opłat transakcyjnych i tworzenia konta
  • Mint podpisuje, aby autoryzować użycie swojego adresu dla nowego konta
Send Transaction
const transactionSignature = await sendAndConfirmTransaction(
connection,
transaction,
[
wallet,
mint
]
);

Zwrócony podpis transakcji można wykorzystać do sprawdzenia transakcji w Solana Explorer.

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,
getMint
} from "@solana/spl-token";
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");

Is this page helpful?

Spis treści

Edytuj stronę