Zapisywanie do sieci

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:

  1. Przelewać SOL między kontami
  2. 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ę.

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

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.

Client setup
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().

Receiver signer
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.

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

Send transaction
const result = await client.sendTransaction([transferInstruction]);
console.log("Transaction Signature:", result.context.signature);

Po potwierdzeniu transakcji pobierz oba salda za pomocą client.rpc.

Fetch balances
const { value: senderBalance } = await client.rpc
.getBalance(client.payer.address)
.send();
const { value: receiverBalance } = await client.rpc
.getBalance(receiver.address)
.send();

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.

Client setup
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().

Receiver signer
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.

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

Send transaction
const result = await client.sendTransaction([transferInstruction]);
console.log("Transaction Signature:", result.context.signature);

Po potwierdzeniu transakcji pobierz oba salda za pomocą client.rpc.

Fetch balances
const { value: senderBalance } = await client.rpc
.getBalance(client.payer.address)
.send();
const { value: receiverBalance } = await client.rpc
.getBalance(receiver.address)
.send();
Transfer SOL
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)));

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:

  1. Wywołaj System Program, aby utworzyć nowe konto należące do Token Extensions Program.
  2. Wywołaj Token Extensions Program, aby zainicjować to konto jako mint.
Create mint account
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);
Console
Click to execute the code.

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ę.

Client and mint setup
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.

Mint account size and 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.

Create account instruction
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.

Initialize mint instruction
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.

Send transaction
const result = await client.sendTransaction([
createAccountInstruction,
initializeMintInstruction
]);

Po potwierdzeniu transakcji pobierz mint account.

Fetch mint account
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ę.

Client and mint setup
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.

Mint account size and 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.

Create account instruction
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.

Initialize mint instruction
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.

Send transaction
const result = await client.sendTransaction([
createAccountInstruction,
initializeMintInstruction
]);

Po potwierdzeniu transakcji pobierz mint account.

Fetch mint account
const mintAccount = await fetchMint(client.rpc, mint.address);
console.log("Mint Account:", mintAccount);
Create mint account
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();

Is this page helpful?

Spis treści

Edytuj stronę