Odczyt z sieci

Odczytuj dane z sieci Solana, pobierając różne konta. Ten przewodnik wyjaśnia strukturę kont Solana. Każde konto Solana posiada unikalny adres służący do zlokalizowania danych konta w łańcuchu. Konta Solana zawierają albo dane stanu, albo wykonywalny program.

Pobierz konto portfela

Konto portfela to konto należące do System Program. Konta portfela służą przede wszystkim do przechowywania SOL i podpisywania transakcji. Gdy SOL jest wysyłany na nowy adres po raz pierwszy, konto systemowe jest tworzone automatycznie.

Poniższy przykład tworzy klienta Kit, generuje nowy signer, żąda SOL w celu zasilenia nowego adresu oraz pobiera dane konta z API RPC klienta.

Fetch account
import { createClient, generateKeyPairSigner, lamports } from "@solana/kit";
import { solanaRpc, rpcAirdrop } from "@solana/kit-plugin-rpc";
import { generatedPayer } from "@solana/kit-plugin-signer";
const client = await createClient()
.use(generatedPayer())
.use(
solanaRpc({
rpcUrl: "http://localhost:8899",
rpcSubscriptionsUrl: "ws://localhost:8900"
})
)
.use(rpcAirdrop());
const signer = await generateKeyPairSigner();
console.log(`Address: ${signer.address}`);
// Funding an address with SOL automatically creates an account
await client.airdrop(signer.address, lamports(1_000_000_000n));
const accountInfo = await client.rpc.getAccountInfo(signer.address).send();
console.log(accountInfo);
Console
Click to execute the code.

Gdy pobierasz konto portfela za pomocą getAccountInfo(), Kit zwraca odpowiedź RPC pokazaną w przykładowych danych wyjściowych po prawej stronie.

Odpowiedź zawiera dwa pola najwyższego poziomu: context opisuje moment odczytu, natomiast value zawiera pola konta zwrócone przez metodę RPC.

Example output
{
context: {
slot: 420602714n,
apiVersion: "3.1.6"
},
value: {
lamports: 1000000000n,
data: ["", "base64"],
owner: "11111111111111111111111111111111",
executable: false,
rentEpoch: 0n,
space: 0n
}
}

Pole context pokazuje slot użyty do odczytu konta oraz wersję API RPC, która obsłużyła odpowiedź. Późniejszy odczyt może zwrócić inny slot lub wersję API.

Example output
{
context: {
slot: 420602714n,
apiVersion: "3.1.6"
},
value: {
lamports: 1000000000n,
data: ["", "base64"],
owner: "11111111111111111111111111111111",
executable: false,
rentEpoch: 0n,
space: 0n
}
}

Pole value zawiera stan konta zwrócony przez metodę RPC. Kolejne kroki omawia pola wewnątrz value w kolejności, w jakiej się pojawiają.

Example output
{
context: {
slot: 420602714n,
apiVersion: "3.1.6"
},
value: {
lamports: 1000000000n,
data: ["", "base64"],
owner: "11111111111111111111111111111111",
executable: false,
rentEpoch: 0n,
space: 0n
}
}

Pole lamports zawiera saldo SOL konta, wyrażone w lamportach — najmniejszej jednostce SOL.

Example output
{
context: {
slot: 420602714n,
apiVersion: "3.1.6"
},
value: {
lamports: 1000000000n,
data: ["", "base64"],
owner: "11111111111111111111111111111111",
executable: false,
rentEpoch: 0n,
space: 0n
}
}

Pole data zawiera dane konta przechowywane jako bajty. RPC zwraca dane konta jako krotkę: zakodowany ciąg danych, a następnie kodowanie. W przypadku kont portfelowych zakodowany ciąg danych jest pusty, ponieważ konto przechowuje 0 bajtów danych.

Example output
{
context: {
slot: 420602714n,
apiVersion: "3.1.6"
},
value: {
lamports: 1000000000n,
data: ["", "base64"],
owner: "11111111111111111111111111111111",
executable: false,
rentEpoch: 0n,
space: 0n
}
}

Pole owner wskazuje program będący właścicielem konta. W przypadku portfeli właścicielem jest zawsze System Program, o adresie 11111111111111111111111111111111.

Example output
{
context: {
slot: 420602714n,
apiVersion: "3.1.6"
},
value: {
lamports: 1000000000n,
data: ["", "base64"],
owner: "11111111111111111111111111111111",
executable: false,
rentEpoch: 0n,
space: 0n
}
}

Pole executable informuje, czy adres konta jest wywoływalny. true oznacza, że adres reprezentuje program mogący przetwarzać instrukcje. false oznacza, że konto przechowuje stan, taki jak saldo portfela lub dane konta, i nie jest wywoływane jako program. Konta portfelowe używają false.

Pole rentEpoch jest polem dziedzicznym z wycofanego mechanizmu rent. Pole jest nadal zwracane w celu zachowania zgodności wstecznej.

Example output
{
context: {
slot: 420602714n,
apiVersion: "3.1.6"
},
value: {
lamports: 1000000000n,
data: ["", "base64"],
owner: "11111111111111111111111111111111",
executable: false,
rentEpoch: 0n,
space: 0n
}
}

Pole space pokazuje liczbę bajtów zawartych w polu data. Pole space jest zwracane wraz z odpowiedzią pobierającą konto, ale nie jest częścią typu danych konta.

Dla przykładowego konta portfelowego pole space wynosi 0, ponieważ pole data zawiera 0 bajtów danych.

Example output
{
context: {
slot: 420602714n,
apiVersion: "3.1.6"
},
value: {
lamports: 1000000000n,
data: ["", "base64"],
owner: "11111111111111111111111111111111",
executable: false,
rentEpoch: 0n,
space: 0n
}
}

Gdy pobierasz konto portfela za pomocą getAccountInfo(), Kit zwraca odpowiedź RPC pokazaną w przykładowych danych wyjściowych po prawej stronie.

Odpowiedź zawiera dwa pola najwyższego poziomu: context opisuje moment odczytu, natomiast value zawiera pola konta zwrócone przez metodę RPC.

Pole context pokazuje slot użyty do odczytu konta oraz wersję API RPC, która obsłużyła odpowiedź. Późniejszy odczyt może zwrócić inny slot lub wersję API.

Pole value zawiera stan konta zwrócony przez metodę RPC. Kolejne kroki omawia pola wewnątrz value w kolejności, w jakiej się pojawiają.

Pole lamports zawiera saldo SOL konta, wyrażone w lamportach — najmniejszej jednostce SOL.

Pole data zawiera dane konta przechowywane jako bajty. RPC zwraca dane konta jako krotkę: zakodowany ciąg danych, a następnie kodowanie. W przypadku kont portfelowych zakodowany ciąg danych jest pusty, ponieważ konto przechowuje 0 bajtów danych.

Pole owner wskazuje program będący właścicielem konta. W przypadku portfeli właścicielem jest zawsze System Program, o adresie 11111111111111111111111111111111.

Pole executable informuje, czy adres konta jest wywoływalny. true oznacza, że adres reprezentuje program mogący przetwarzać instrukcje. false oznacza, że konto przechowuje stan, taki jak saldo portfela lub dane konta, i nie jest wywoływane jako program. Konta portfelowe używają false.

Pole rentEpoch jest polem dziedzicznym z wycofanego mechanizmu rent. Pole jest nadal zwracane w celu zachowania zgodności wstecznej.

Pole space pokazuje liczbę bajtów zawartych w polu data. Pole space jest zwracane wraz z odpowiedzią pobierającą konto, ale nie jest częścią typu danych konta.

Dla przykładowego konta portfelowego pole space wynosi 0, ponieważ pole data zawiera 0 bajtów danych.

Example output
{
context: {
slot: 420602714n,
apiVersion: "3.1.6"
},
value: {
lamports: 1000000000n,
data: ["", "base64"],
owner: "11111111111111111111111111111111",
executable: false,
rentEpoch: 0n,
space: 0n
}
}

Pobierz Token Program

Poniższy przykład pobiera Token Program, aby zademonstrować różnicę między kontami portfela a kontami programów. Token Program definiuje instrukcje dotyczące pracy z tokenami, takie jak tworzenie i przesyłanie tokenów. Programy są wywoływane w celu przetwarzania instrukcji. Stan programu, taki jak dane tokenów i salda, są przechowywane w oddzielnych kontach należących do programu.

Adres Token Program to onchain program account. Dla uproszczenia możesz myśleć o adresie programu jak o samym programie, ponieważ to właśnie ten adres jest używany do jego wywołania. W przypadku programów z możliwością aktualizacji, program account przechowuje metadane i wskazuje na oddzielny ProgramData account, który przechowuje wdrożony kod wykonywalny. Możesz przeglądać kod źródłowy Token Program oraz program account na Solana Explorer.

Fetch program account
import { address, createClient, fetchJsonParsedAccount } from "@solana/kit";
import { solanaRpc } from "@solana/kit-plugin-rpc";
import { generatedPayer } from "@solana/kit-plugin-signer";
const client = await createClient()
.use(generatedPayer())
.use(
solanaRpc({
rpcUrl: "https://api.mainnet.solana.com"
})
);
const tokenProgramAddress = address(
"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"
);
const accountInfo = await client.rpc
.getAccountInfo(tokenProgramAddress, {
encoding: "base64"
})
.send();
console.log(accountInfo);
const parsedAccount = await fetchJsonParsedAccount(
client.rpc,
tokenProgramAddress
);
console.log(parsedAccount);
Console
Click to execute the code.

Token Program to konto wykonywalnego programu. Programy mają te same podstawowe pola co wszystkie konta, ale z kluczowymi różnicami.

Przykład Token Program używa kodowania base64, aby zwrócić surowe dane program account.

Poniższe kroki opisują pola wewnątrz value w kolejności, w jakiej się pojawiają.

Pole data przechowuje stan program account modułu ładującego BPF Upgradeable Loader. Pierwszy element krotki zawiera pełne dane konta zakodowane jako base64. Drugi element krotki określa kodowanie. W tym przypadku 36 bajtów zawiera metadane i adres programdata account.

W przypadku programów z możliwością aktualizacji, stan program account wskazuje na oddzielny programdata account, który przechowuje kod wykonywalny programu.

Token program account
{
context: {
apiVersion: "3.1.14",
slot: 420601581n
},
value: {
data: ["AgAAACfxkLHTr5i4znFMROjK3/n4/EXLjl+sQgLv+BENl903", "base64"],
executable: true,
lamports: 2191440n,
owner: "BPFLoaderUpgradeab1e11111111111111111111111",
rentEpoch: 18446744073709551615n,
space: 36n
}
}

Pole executable jest ustawione na true, co oznacza, że adres konta może być wywoływany jako program.

Token program account
{
context: {
apiVersion: "3.1.14",
slot: 420601581n
},
value: {
data: ["AgAAACfxkLHTr5i4znFMROjK3/n4/EXLjl+sQgLv+BENl903", "base64"],
executable: true,
lamports: 2191440n,
owner: "BPFLoaderUpgradeab1e11111111111111111111111",
rentEpoch: 18446744073709551615n,
space: 36n
}
}

Pole lamports zawiera saldo SOL przechowywane przez program account. Program accounts muszą posiadać wystarczającą ilość lamport, aby pozostać zwolnionymi z rent.

Token program account
{
context: {
apiVersion: "3.1.14",
slot: 420601581n
},
value: {
data: ["AgAAACfxkLHTr5i4znFMROjK3/n4/EXLjl+sQgLv+BENl903", "base64"],
executable: true,
lamports: 2191440n,
owner: "BPFLoaderUpgradeab1e11111111111111111111111",
rentEpoch: 18446744073709551615n,
space: 36n
}
}

Każdy program account jest własnością programu ładującego. W przypadku Token Program account, owner to BPF Upgradeable Loader.

Token program account
{
context: {
apiVersion: "3.1.14",
slot: 420601581n
},
value: {
data: ["AgAAACfxkLHTr5i4znFMROjK3/n4/EXLjl+sQgLv+BENl903", "base64"],
executable: true,
lamports: 2191440n,
owner: "BPFLoaderUpgradeab1e11111111111111111111111",
rentEpoch: 18446744073709551615n,
space: 36n
}
}

Pole rentEpoch jest polem dziedziczonym z przestarzałego mechanizmu rent. Pole nadal jest zwracane w celu zachowania wstecznej kompatybilności.

Token program account
{
context: {
apiVersion: "3.1.14",
slot: 420601581n
},
value: {
data: ["AgAAACfxkLHTr5i4znFMROjK3/n4/EXLjl+sQgLv+BENl903", "base64"],
executable: true,
lamports: 2191440n,
owner: "BPFLoaderUpgradeab1e11111111111111111111111",
rentEpoch: 18446744073709551615n,
space: 36n
}
}

Pole space pokazuje pełny rozmiar danych program account w bajtach. Wartość space wynosi tylko 36 bajtów, ponieważ program account przechowuje metadane modułu ładującego oraz adres konta ProgramData, a nie skompilowany program w całości.

Token program account
{
context: {
apiVersion: "3.1.14",
slot: 420601581n
},
value: {
data: ["AgAAACfxkLHTr5i4znFMROjK3/n4/EXLjl+sQgLv+BENl903", "base64"],
executable: true,
lamports: 2191440n,
owner: "BPFLoaderUpgradeab1e11111111111111111111111",
rentEpoch: 18446744073709551615n,
space: 36n
}
}

Poprzednia odpowiedź zwróciła pole data program account jako krotkę base64. Odparsowana odpowiedź deserializuje te bajty do nazwanych pól obiektu data. Pole programData zawiera adres konta ProgramData, które przechowuje wykonywalny kod programu.

Parsed Token program account
{
executable: true,
lamports: 43712780n,
programAddress: "BPFLoaderUpgradeab1e11111111111111111111111",
space: 36n,
address: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
data: {
programData: "3gvYRKWyXRR9xKWe1ZjPhLY5ZJRN7KDB4rFZFGoJfFk2",
parsedAccountMeta: { program: "bpf-upgradeable-loader", type: "program" }
},
exists: true
}

Token Program to konto wykonywalnego programu. Programy mają te same podstawowe pola co wszystkie konta, ale z kluczowymi różnicami.

Przykład Token Program używa kodowania base64, aby zwrócić surowe dane program account.

Poniższe kroki opisują pola wewnątrz value w kolejności, w jakiej się pojawiają.

Pole data przechowuje stan program account modułu ładującego BPF Upgradeable Loader. Pierwszy element krotki zawiera pełne dane konta zakodowane jako base64. Drugi element krotki określa kodowanie. W tym przypadku 36 bajtów zawiera metadane i adres programdata account.

W przypadku programów z możliwością aktualizacji, stan program account wskazuje na oddzielny programdata account, który przechowuje kod wykonywalny programu.

Pole executable jest ustawione na true, co oznacza, że adres konta może być wywoływany jako program.

Pole lamports zawiera saldo SOL przechowywane przez program account. Program accounts muszą posiadać wystarczającą ilość lamport, aby pozostać zwolnionymi z rent.

Każdy program account jest własnością programu ładującego. W przypadku Token Program account, owner to BPF Upgradeable Loader.

Pole rentEpoch jest polem dziedziczonym z przestarzałego mechanizmu rent. Pole nadal jest zwracane w celu zachowania wstecznej kompatybilności.

Pole space pokazuje pełny rozmiar danych program account w bajtach. Wartość space wynosi tylko 36 bajtów, ponieważ program account przechowuje metadane modułu ładującego oraz adres konta ProgramData, a nie skompilowany program w całości.

Poprzednia odpowiedź zwróciła pole data program account jako krotkę base64. Odparsowana odpowiedź deserializuje te bajty do nazwanych pól obiektu data. Pole programData zawiera adres konta ProgramData, które przechowuje wykonywalny kod programu.

Token program account
{
context: {
apiVersion: "3.1.14",
slot: 420601581n
},
value: {
data: ["AgAAACfxkLHTr5i4znFMROjK3/n4/EXLjl+sQgLv+BENl903", "base64"],
executable: true,
lamports: 2191440n,
owner: "BPFLoaderUpgradeab1e11111111111111111111111",
rentEpoch: 18446744073709551615n,
space: 36n
}
}

Pobierz mint account

mint account to konto należące do Token Program, które przechowuje globalne metadane dla konkretnego tokena. mint account przechowuje całkowitą podaż tokena, liczbę miejsc dziesiętnych, uprawnienia do mintowania oraz uprawnienia do zamrażania. Adres mint account jednoznacznie identyfikuje token w sieci Solana.

Poniższy przykład pobiera mint account USD Coin, aby zademonstrować, jak stan programu jest przechowywany w osobnym koncie. Dokładne salda i wartości podaży mogą się różnić w zależności od slot, z którego odczytuje Twój węzeł RPC.

Fetch mint account
import { address, createClient } from "@solana/kit";
import { solanaRpc } from "@solana/kit-plugin-rpc";
import { generatedPayer } from "@solana/kit-plugin-signer";
const client = await createClient()
.use(generatedPayer())
.use(
solanaRpc({
rpcUrl: "https://api.mainnet.solana.com"
})
);
const mintAddress = address("EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v");
const accountInfo = await client.rpc
.getAccountInfo(mintAddress, {
encoding: "base64"
})
.send();
console.log(accountInfo);
Console
Click to execute the code.

mint account przechowują stan, a nie wykonywalny kod. mint account są własnością Token Program, który zawiera instrukcje definiujące sposób tworzenia i aktualizowania mint account.

Poniższe kroki omawiają pola wewnątrz value w kolejności, w jakiej się pojawiają.

Mint account
{
context: {
slot: 325000000n,
apiVersion: "3.1.14"
},
value: {
data: [
"AQAAAJj+huiNm+Lqi8HMpIeLKYjCQPUrhCS/tA7Rot3LXhmbbq9O2SvsHwAGAQEAAABicKqKWcWUBbRShshncubNEm6bil06OFNtN/e0FOi2Zw==",
"base64"
],
executable: false,
lamports: 407438077149n,
owner: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
rentEpoch: 18446744073709551615n,
space: 82n
}
}

Pole data zawiera zserializowany stan konta Mint. Pierwszy element krotki zawiera pełne 82-bajtowe dane konta zakodowane w formacie base64. Drugi element krotki określa kodowanie.

Aby odczytać dane z mint account, należy zdeserializować pole data do typu danych Mint, co zostało pokazane w następnym przykładzie.

Mint account
{
context: {
slot: 325000000n,
apiVersion: "3.1.14"
},
value: {
data: [
"AQAAAJj+huiNm+Lqi8HMpIeLKYjCQPUrhCS/tA7Rot3LXhmbbq9O2SvsHwAGAQEAAABicKqKWcWUBbRShshncubNEm6bil06OFNtN/e0FOi2Zw==",
"base64"
],
executable: false,
lamports: 407438077149n,
owner: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
rentEpoch: 18446744073709551615n,
space: 82n
}
}

Pole executable wskazuje, czy konto może być wywoływane jako program. mint account przechowują stan, więc pole executable ma wartość false.

Mint account
{
context: {
slot: 325000000n,
apiVersion: "3.1.14"
},
value: {
data: [
"AQAAAJj+huiNm+Lqi8HMpIeLKYjCQPUrhCS/tA7Rot3LXhmbbq9O2SvsHwAGAQEAAABicKqKWcWUBbRShshncubNEm6bil06OFNtN/e0FOi2Zw==",
"base64"
],
executable: false,
lamports: 407438077149n,
owner: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
rentEpoch: 18446744073709551615n,
space: 82n
}
}

Pole lamports zawiera saldo SOL przechowywane przez mint account. Wartość w lamport stanowi saldo zwolnione z czynszu mint account, a nie podaż tokena.

Mint account
{
context: {
slot: 325000000n,
apiVersion: "3.1.14"
},
value: {
data: [
"AQAAAJj+huiNm+Lqi8HMpIeLKYjCQPUrhCS/tA7Rot3LXhmbbq9O2SvsHwAGAQEAAABicKqKWcWUBbRShshncubNEm6bil06OFNtN/e0FOi2Zw==",
"base64"
],
executable: false,
lamports: 407438077149n,
owner: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
rentEpoch: 18446744073709551615n,
space: 82n
}
}

mint account jest własnością Token Program. Pole data mint account może być modyfikowane wyłącznie przez instrukcje Token Program.

Mint account
{
context: {
slot: 325000000n,
apiVersion: "3.1.14"
},
value: {
data: [
"AQAAAJj+huiNm+Lqi8HMpIeLKYjCQPUrhCS/tA7Rot3LXhmbbq9O2SvsHwAGAQEAAABicKqKWcWUBbRShshncubNEm6bil06OFNtN/e0FOi2Zw==",
"base64"
],
executable: false,
lamports: 407438077149n,
owner: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
rentEpoch: 18446744073709551615n,
space: 82n
}
}

Pole rentEpoch jest polem dziedziczonym z przestarzałego mechanizmu rent. Pole to jest nadal zwracane w celu zachowania wstecznej kompatybilności.

Mint account
{
context: {
slot: 325000000n,
apiVersion: "3.1.14"
},
value: {
data: [
"AQAAAJj+huiNm+Lqi8HMpIeLKYjCQPUrhCS/tA7Rot3LXhmbbq9O2SvsHwAGAQEAAABicKqKWcWUBbRShshncubNEm6bil06OFNtN/e0FOi2Zw==",
"base64"
],
executable: false,
lamports: 407438077149n,
owner: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
rentEpoch: 18446744073709551615n,
space: 82n
}
}

Pole space wskazuje, że mint account zawiera 82 bajty danych.

Mint account
{
context: {
slot: 325000000n,
apiVersion: "3.1.14"
},
value: {
data: [
"AQAAAJj+huiNm+Lqi8HMpIeLKYjCQPUrhCS/tA7Rot3LXhmbbq9O2SvsHwAGAQEAAABicKqKWcWUBbRShshncubNEm6bil06OFNtN/e0FOi2Zw==",
"base64"
],
executable: false,
lamports: 407438077149n,
owner: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
rentEpoch: 18446744073709551615n,
space: 82n
}
}

mint account przechowują stan, a nie wykonywalny kod. mint account są własnością Token Program, który zawiera instrukcje definiujące sposób tworzenia i aktualizowania mint account.

Poniższe kroki omawiają pola wewnątrz value w kolejności, w jakiej się pojawiają.

Pole data zawiera zserializowany stan konta Mint. Pierwszy element krotki zawiera pełne 82-bajtowe dane konta zakodowane w formacie base64. Drugi element krotki określa kodowanie.

Aby odczytać dane z mint account, należy zdeserializować pole data do typu danych Mint, co zostało pokazane w następnym przykładzie.

Pole executable wskazuje, czy konto może być wywoływane jako program. mint account przechowują stan, więc pole executable ma wartość false.

Pole lamports zawiera saldo SOL przechowywane przez mint account. Wartość w lamport stanowi saldo zwolnione z czynszu mint account, a nie podaż tokena.

mint account jest własnością Token Program. Pole data mint account może być modyfikowane wyłącznie przez instrukcje Token Program.

Pole rentEpoch jest polem dziedziczonym z przestarzałego mechanizmu rent. Pole to jest nadal zwracane w celu zachowania wstecznej kompatybilności.

Pole space wskazuje, że mint account zawiera 82 bajty danych.

Mint account
{
context: {
slot: 325000000n,
apiVersion: "3.1.14"
},
value: {
data: [
"AQAAAJj+huiNm+Lqi8HMpIeLKYjCQPUrhCS/tA7Rot3LXhmbbq9O2SvsHwAGAQEAAABicKqKWcWUBbRShshncubNEm6bil06OFNtN/e0FOi2Zw==",
"base64"
],
executable: false,
lamports: 407438077149n,
owner: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
rentEpoch: 18446744073709551615n,
space: 82n
}
}

Deserializacja mint account

Dane konta są przechowywane w polu data w formacie serializowanym. Aby odczytać te dane jako pola takie jak supply czy decimals, należy zdeserializować pole data do typu konta zdefiniowanego przez program właściciela. Większość programów Solana dostarcza biblioteki klienckie z funkcjami pomocniczymi do tego kroku. Pomocniki te zwracają ustrukturyzowane dane konta, co ułatwia pracę z wynikiem.

Na przykład biblioteka @solana-program/token zawiera funkcję fetchMint() do pobierania mint account i deserializacji pola data mint account do typu danych Mint zdefiniowanego przez Token Program.

Deserialize mint account data
import { address, createClient } from "@solana/kit";
import { solanaRpc } from "@solana/kit-plugin-rpc";
import { generatedPayer } from "@solana/kit-plugin-signer";
import { fetchMint } from "@solana-program/token";
const client = await createClient()
.use(generatedPayer())
.use(
solanaRpc({
rpcUrl: "https://api.mainnet.solana.com"
})
);
const mintAddress = address("EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v");
const mint = await fetchMint(client.rpc, mintAddress);
console.log(mint);
Console
Click to execute the code.
Mint account type
pub struct Mint {
/// Optional authority used to mint new tokens. The mint authority may only
/// be provided during mint creation. If no mint authority is present
/// then the mint has a fixed supply and no further tokens may be
/// minted.
pub mint_authority: COption<Pubkey>,
/// Total supply of tokens.
pub supply: u64,
/// Number of base 10 digits to the right of the decimal place.
pub decimals: u8,
/// Is `true` if this structure has been initialized
pub is_initialized: bool,
/// Optional authority to freeze token accounts.
pub freeze_authority: COption<Pubkey>,
}

Funkcja fetchMint() pobiera mint account i deserializuje pole data mint account do typu Mint account.

Mint account
{
context: {
slot: 325000000n,
apiVersion: "3.1.14"
},
value: {
data: [
"AQAAAJj+huiNm+Lqi8HMpIeLKYjCQPUrhCS/tA7Rot3LXhmbbq9O2SvsHwAGAQEAAABicKqKWcWUBbRShshncubNEm6bil06OFNtN/e0FOi2Zw==",
"base64"
],
executable: false,
lamports: 407438077149n,
owner: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
rentEpoch: 18446744073709551615n,
space: 82n
}
}

Możesz zobaczyć w pełni zdeserializowane dane mint account na Solana Explorer.

Decoded mint account
{
address: "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
data: {
mintAuthority: {
__option: "Some",
value: "BJE5MMbqXjVwjAF7oxwPYXnTXDyspzZyt4vwenNw5ruG"
},
supply: 8985397351591790n,
decimals: 6,
isInitialized: true,
freezeAuthority: {
__option: "Some",
value: "7dGbd2QZcCKcTndnHcTL8q7SMVXAkp688NTQYwrRCrar"
}
},
executable: false,
lamports: 407438077149n,
programAddress: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
space: 82n
}

Pole address zawiera adres mint account.

Decoded mint account
{
address: "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
data: {
mintAuthority: {
__option: "Some",
value: "BJE5MMbqXjVwjAF7oxwPYXnTXDyspzZyt4vwenNw5ruG"
},
supply: 8985397351591790n,
decimals: 6,
isInitialized: true,
freezeAuthority: {
__option: "Some",
value: "7dGbd2QZcCKcTndnHcTL8q7SMVXAkp688NTQYwrRCrar"
}
},
executable: false,
lamports: 407438077149n,
programAddress: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
space: 82n
}

Pole data zawiera zdeserializowany stan konta Mint. Zagnieżdżone pola w data pochodzą z typu konta Mint Token Program.

Decoded mint account
{
address: "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
data: {
mintAuthority: {
__option: "Some",
value: "BJE5MMbqXjVwjAF7oxwPYXnTXDyspzZyt4vwenNw5ruG"
},
supply: 8985397351591790n,
decimals: 6,
isInitialized: true,
freezeAuthority: {
__option: "Some",
value: "7dGbd2QZcCKcTndnHcTL8q7SMVXAkp688NTQYwrRCrar"
}
},
executable: false,
lamports: 407438077149n,
programAddress: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
space: 82n
}

Pole data.mintAuthority wskazuje jedyne konto, które może tworzyć nowe jednostki tokena.

Decoded mint account
{
address: "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
data: {
mintAuthority: {
__option: "Some",
value: "BJE5MMbqXjVwjAF7oxwPYXnTXDyspzZyt4vwenNw5ruG"
},
supply: 8985397351591790n,
decimals: 6,
isInitialized: true,
freezeAuthority: {
__option: "Some",
value: "7dGbd2QZcCKcTndnHcTL8q7SMVXAkp688NTQYwrRCrar"
}
},
executable: false,
lamports: 407438077149n,
programAddress: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
space: 82n
}

Pole supply pokazuje łączną liczbę wyemitowanych tokenów. Wartość podaży jest wyrażona w najmniejszej jednostce tokena. Aby uzyskać całkowitą podaż w standardowych jednostkach, podziel wartość pola supply przez decimals.

Decoded mint account
{
address: "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
data: {
mintAuthority: {
__option: "Some",
value: "BJE5MMbqXjVwjAF7oxwPYXnTXDyspzZyt4vwenNw5ruG"
},
supply: 8985397351591790n,
decimals: 6,
isInitialized: true,
freezeAuthority: {
__option: "Some",
value: "7dGbd2QZcCKcTndnHcTL8q7SMVXAkp688NTQYwrRCrar"
}
},
executable: false,
lamports: 407438077149n,
programAddress: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
space: 82n
}

Pole decimals pokazuje liczbę miejsc dziesiętnych dla tokena.

Decoded mint account
{
address: "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
data: {
mintAuthority: {
__option: "Some",
value: "BJE5MMbqXjVwjAF7oxwPYXnTXDyspzZyt4vwenNw5ruG"
},
supply: 8985397351591790n,
decimals: 6,
isInitialized: true,
freezeAuthority: {
__option: "Some",
value: "7dGbd2QZcCKcTndnHcTL8q7SMVXAkp688NTQYwrRCrar"
}
},
executable: false,
lamports: 407438077149n,
programAddress: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
space: 82n
}

Pole isInitialized wskazuje, czy mint account został zainicjowany. Pole isInitialized jest mechanizmem kontroli bezpieczeństwa używanym w Token Program.

Decoded mint account
{
address: "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
data: {
mintAuthority: {
__option: "Some",
value: "BJE5MMbqXjVwjAF7oxwPYXnTXDyspzZyt4vwenNw5ruG"
},
supply: 8985397351591790n,
decimals: 6,
isInitialized: true,
freezeAuthority: {
__option: "Some",
value: "7dGbd2QZcCKcTndnHcTL8q7SMVXAkp688NTQYwrRCrar"
}
},
executable: false,
lamports: 407438077149n,
programAddress: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
space: 82n
}

Pole data.freezeAuthority wskazuje konto z uprawnieniem do zamrażania token accounts. token account to oddzielne konto przechowujące jednostki tokena dla właściciela. Po zamrożeniu token account nie może przenosić ani spalać swojego salda tokenów.

Decoded mint account
{
address: "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
data: {
mintAuthority: {
__option: "Some",
value: "BJE5MMbqXjVwjAF7oxwPYXnTXDyspzZyt4vwenNw5ruG"
},
supply: 8985397351591790n,
decimals: 6,
isInitialized: true,
freezeAuthority: {
__option: "Some",
value: "7dGbd2QZcCKcTndnHcTL8q7SMVXAkp688NTQYwrRCrar"
}
},
executable: false,
lamports: 407438077149n,
programAddress: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
space: 82n
}

Pole executable ma wartość false. mint account USDC przechowuje stan tokena, dlatego mint account USDC nie może być wywoływany jako program.

Decoded mint account
{
address: "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
data: {
mintAuthority: {
__option: "Some",
value: "BJE5MMbqXjVwjAF7oxwPYXnTXDyspzZyt4vwenNw5ruG"
},
supply: 8985397351591790n,
decimals: 6,
isInitialized: true,
freezeAuthority: {
__option: "Some",
value: "7dGbd2QZcCKcTndnHcTL8q7SMVXAkp688NTQYwrRCrar"
}
},
executable: false,
lamports: 407438077149n,
programAddress: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
space: 82n
}

Pole lamports zawiera saldo SOL przechowywane przez mint account. Wartość lamports odpowiada saldzie zwalniającemu mint account z czynszu, a nie podaży tokenów.

Decoded mint account
{
address: "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
data: {
mintAuthority: {
__option: "Some",
value: "BJE5MMbqXjVwjAF7oxwPYXnTXDyspzZyt4vwenNw5ruG"
},
supply: 8985397351591790n,
decimals: 6,
isInitialized: true,
freezeAuthority: {
__option: "Some",
value: "7dGbd2QZcCKcTndnHcTL8q7SMVXAkp688NTQYwrRCrar"
}
},
executable: false,
lamports: 407438077149n,
programAddress: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
space: 82n
}

Pole programAddress wskazuje program będący właścicielem mint account. W przypadku USDC programem właścicielem jest Token Program. Tylko program będący właścicielem konta może modyfikować jego pole data za pomocą wdrożonych instrukcji programu.

Decoded mint account
{
address: "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
data: {
mintAuthority: {
__option: "Some",
value: "BJE5MMbqXjVwjAF7oxwPYXnTXDyspzZyt4vwenNw5ruG"
},
supply: 8985397351591790n,
decimals: 6,
isInitialized: true,
freezeAuthority: {
__option: "Some",
value: "7dGbd2QZcCKcTndnHcTL8q7SMVXAkp688NTQYwrRCrar"
}
},
executable: false,
lamports: 407438077149n,
programAddress: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
space: 82n
}

Pole space pokazuje rozmiar oryginalnych danych mint account w bajtach. Bazowe konto Mint Token Program ma rozmiar 82 bajtów.

Decoded mint account
{
address: "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
data: {
mintAuthority: {
__option: "Some",
value: "BJE5MMbqXjVwjAF7oxwPYXnTXDyspzZyt4vwenNw5ruG"
},
supply: 8985397351591790n,
decimals: 6,
isInitialized: true,
freezeAuthority: {
__option: "Some",
value: "7dGbd2QZcCKcTndnHcTL8q7SMVXAkp688NTQYwrRCrar"
}
},
executable: false,
lamports: 407438077149n,
programAddress: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
space: 82n
}

Funkcja fetchMint() pobiera mint account i deserializuje pole data mint account do typu Mint account.

Mint account
{
context: {
slot: 325000000n,
apiVersion: "3.1.14"
},
value: {
data: [
"AQAAAJj+huiNm+Lqi8HMpIeLKYjCQPUrhCS/tA7Rot3LXhmbbq9O2SvsHwAGAQEAAABicKqKWcWUBbRShshncubNEm6bil06OFNtN/e0FOi2Zw==",
"base64"
],
executable: false,
lamports: 407438077149n,
owner: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
rentEpoch: 18446744073709551615n,
space: 82n
}
}

Możesz zobaczyć w pełni zdeserializowane dane mint account na Solana Explorer.

Pole address zawiera adres mint account.

Pole data zawiera zdeserializowany stan konta Mint. Zagnieżdżone pola w data pochodzą z typu konta Mint Token Program.

Pole data.mintAuthority wskazuje jedyne konto, które może tworzyć nowe jednostki tokena.

Pole supply pokazuje łączną liczbę wyemitowanych tokenów. Wartość podaży jest wyrażona w najmniejszej jednostce tokena. Aby uzyskać całkowitą podaż w standardowych jednostkach, podziel wartość pola supply przez decimals.

Pole decimals pokazuje liczbę miejsc dziesiętnych dla tokena.

Pole isInitialized wskazuje, czy mint account został zainicjowany. Pole isInitialized jest mechanizmem kontroli bezpieczeństwa używanym w Token Program.

Pole data.freezeAuthority wskazuje konto z uprawnieniem do zamrażania token accounts. token account to oddzielne konto przechowujące jednostki tokena dla właściciela. Po zamrożeniu token account nie może przenosić ani spalać swojego salda tokenów.

Pole executable ma wartość false. mint account USDC przechowuje stan tokena, dlatego mint account USDC nie może być wywoływany jako program.

Pole lamports zawiera saldo SOL przechowywane przez mint account. Wartość lamports odpowiada saldzie zwalniającemu mint account z czynszu, a nie podaży tokenów.

Pole programAddress wskazuje program będący właścicielem mint account. W przypadku USDC programem właścicielem jest Token Program. Tylko program będący właścicielem konta może modyfikować jego pole data za pomocą wdrożonych instrukcji programu.

Pole space pokazuje rozmiar oryginalnych danych mint account w bajtach. Bazowe konto Mint Token Program ma rozmiar 82 bajtów.

Decoded mint account
{
address: "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
data: {
mintAuthority: {
__option: "Some",
value: "BJE5MMbqXjVwjAF7oxwPYXnTXDyspzZyt4vwenNw5ruG"
},
supply: 8985397351591790n,
decimals: 6,
isInitialized: true,
freezeAuthority: {
__option: "Some",
value: "7dGbd2QZcCKcTndnHcTL8q7SMVXAkp688NTQYwrRCrar"
}
},
executable: false,
lamports: 407438077149n,
programAddress: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
space: 82n
}

Dane zserializowane a odserializowane

Oba przykłady odczytują to samo mint account USDC. Pierwsza odpowiedź pozostawia pole data w formie zserializowanej. Aby odczytać zawartość mint account, należy zdekodować te dane jako typ konta zdefiniowany przez program właściciela. W przypadku mint account Token Program definiuje typ Mint widoczny po prawej stronie.

Przed dekodowaniem pole data zawiera zserializowane dane konta.

Serialized mint account
{
context: {
slot: 325000000n,
apiVersion: "3.1.14"
},
value: {
data: [
"AQAAAJj+huiNm+Lqi8HMpIeLKYjCQPUrhCS/tA7Rot3LXhmbbq9O2SvsHwAGAQEAAABicKqKWcWUBbRShshncubNEm6bil06OFNtN/e0FOi2Zw==",
"base64"
],
executable: false,
lamports: 407438077149n,
owner: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
rentEpoch: 18446744073709551615n,
space: 82n
}
}

Po zdekodowaniu danych jako Mint, pole data zawiera nazwane pola konta.

Deserialized mint account
{
address: "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
data: {
mintAuthority: {
__option: "Some",
value: "BJE5MMbqXjVwjAF7oxwPYXnTXDyspzZyt4vwenNw5ruG"
},
supply: 8985397351591790n,
decimals: 6,
isInitialized: true,
freezeAuthority: {
__option: "Some",
value: "7dGbd2QZcCKcTndnHcTL8q7SMVXAkp688NTQYwrRCrar"
}
},
executable: false,
lamports: 407438077149n,
programAddress: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
space: 82n
}

Is this page helpful?

Spis treści

Edytuj stronę