Odczyt z sieci

Ta sekcja omawia, jak odczytywać dane z sieci Solana, pobierając różne konta, aby zrozumieć strukturę konta Solana.

W Solanie wszystkie dane istnieją w "kontach". Możesz myśleć o danych w Solanie jako o publicznej bazie danych z jedną tabelą "Konta", gdzie każdy wpis to konto z tym samym podstawowym typem konta.

Base Account Type
#[derive(PartialEq, Eq, Clone, Default)]
pub struct Account {
/// lamports in the account
pub lamports: u64,
/// data held in this account
#[cfg_attr(feature = "serde", serde(with = "serde_bytes"))]
pub data: Vec<u8>,
/// the program that owns this account. If executable, the program that loads this account.
pub owner: Pubkey,
/// this account's data contains a loaded program (and is now read-only)
pub executable: bool,
/// the epoch at which this account will next owe rent
pub rent_epoch: Epoch,
}

KontaKonta

Konta w Solanie mogą przechowywać "stan" lub "wykonywalne" programy. Każde konto ma "adres" (klucz publiczny), który służy jako jego unikalny identyfikator używany do lokalizowania odpowiadających mu danych w łańcuchu bloków.

Konta Solana zawierają albo:

  • Stan: Dane przeznaczone do odczytu i przechowywania. Na przykład informacje o tokenach, dane użytkownika lub inne dane zdefiniowane w programie.
  • Wykonywalne programy: Konta zawierające rzeczywisty kod programów Solana. Te konta przechowują instrukcje, które użytkownicy mogą wywoływać.

To rozdzielenie kodu programu i stanu programu jest kluczową cechą modelu kont Solana. Więcej szczegółów znajdziesz na stronie Model kont Solana.

Pobieranie konta portfela

Ten przykład pokazuje, jak:

  1. Wygenerować nowy keypair (parę kluczy publiczny/prywatny).
  2. Poprosić o airdrop SOL, aby zasilić nowy adres.
  3. Pobierać dane konta dla zasilonego adresu.

W Solanie zasilenie nowego adresu SOL automatycznie tworzy konto należące do System Program. Wszystkie konta "portfela" to po prostu konta należące do System Program, które przechowują SOL i mogą podpisywać transakcje.

Fetch Account
import { Keypair, Connection, LAMPORTS_PER_SOL } from "@solana/web3.js";
const keypair = Keypair.generate();
console.log(`Public Key: ${keypair.publicKey}`);
const connection = new Connection("http://localhost:8899", "confirmed");
// Funding an address with SOL automatically creates an account
const signature = await connection.requestAirdrop(
keypair.publicKey,
LAMPORTS_PER_SOL
);
await connection.confirmTransaction(signature, "confirmed");
const accountInfo = await connection.getAccountInfo(keypair.publicKey);
console.log(JSON.stringify(accountInfo, null, 2));
Console
Click to execute the code.

„Portfel” na Solanie to konto należące do System Program, który jest jednym z wbudowanych programów Solany. Konta portfela są głównie używane do przechowywania SOL (śledzone w polu lamports) i do podpisywania transakcji.

Gdy pobierasz konto portfela, odpowiedź zawiera pola pokazane w przykładowym wyniku.

Pole data zawiera dane konta przechowywane jako bajty.

Dla kont portfela to pole jest puste (0 bajtów). Inne konta używają tego pola do przechowywania stanu programu lub wykonywalnego kodu programu.

Pole executable wskazuje, czy pole data konta zawiera wykonywalny kod programu.

Dla portfeli i kont przechowujących stan programu to pole ma wartość false.

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

Lamporty to najmniejsza jednostka SOL. 1 SOL = 1 000 000 000 lamportów.

Pole owner pokazuje program, który jest właścicielem konta.

W przypadku portfeli właścicielem jest zawsze System Program, z adresem 11111111111111111111111111111111.

Pole rentEpoch to pole związane z przestarzałym mechanizmem, w którym kontom naliczano "czynsz" (w lamportach) za przechowywanie danych w sieci.

To pole jest obecnie nieużywane, ale zostało uwzględnione dla zachowania kompatybilności wstecznej.

Pole space pokazuje liczbę bajtów w polu data. Nie jest to pole w typie Account, ale zostało uwzględnione w odpowiedzi.

W tym przykładzie pole space wynosi 0, ponieważ pole data zawiera 0 bajtów danych.

„Portfel” na Solanie to konto należące do System Program, który jest jednym z wbudowanych programów Solany. Konta portfela są głównie używane do przechowywania SOL (śledzone w polu lamports) i do podpisywania transakcji.

Gdy pobierasz konto portfela, odpowiedź zawiera pola pokazane w przykładowym wyniku.

Pole data zawiera dane konta przechowywane jako bajty.

Dla kont portfela to pole jest puste (0 bajtów). Inne konta używają tego pola do przechowywania stanu programu lub wykonywalnego kodu programu.

Pole executable wskazuje, czy pole data konta zawiera wykonywalny kod programu.

Dla portfeli i kont przechowujących stan programu to pole ma wartość false.

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

Lamporty to najmniejsza jednostka SOL. 1 SOL = 1 000 000 000 lamportów.

Pole owner pokazuje program, który jest właścicielem konta.

W przypadku portfeli właścicielem jest zawsze System Program, z adresem 11111111111111111111111111111111.

Pole rentEpoch to pole związane z przestarzałym mechanizmem, w którym kontom naliczano "czynsz" (w lamportach) za przechowywanie danych w sieci.

To pole jest obecnie nieużywane, ale zostało uwzględnione dla zachowania kompatybilności wstecznej.

Pole space pokazuje liczbę bajtów w polu data. Nie jest to pole w typie Account, ale zostało uwzględnione w odpowiedzi.

W tym przykładzie pole space wynosi 0, ponieważ pole data zawiera 0 bajtów danych.

Example Output
{
"data": {
"type": "Buffer",
"data": []
},
"executable": false,
"lamports": 1000000000,
"owner": "11111111111111111111111111111111",
"rentEpoch": 0,
"space": 0
}

Pobierz Token Program

Ten przykład pobiera Token Program, aby pokazać różnicę między kontami portfela a kontami programu.

Konto programu przechowuje skompilowany kod bajtowy dla source code Token Programu. Możesz zobaczyć to konto programu na Solana Explorer.

Fetch Program Account
import { Connection, PublicKey } from "@solana/web3.js";
const connection = new Connection(
"https://api.mainnet-beta.solana.com",
"confirmed"
);
const address = new PublicKey("TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA");
const accountInfo = await connection.getAccountInfo(address);
Console
Click to execute the code.

Token Program to wykonywalne konto programu na Solanie. Podobnie jak konta portfela, programy mają tę samą podstawową strukturę danych konta, ale z kluczowymi różnicami w polach.

Pole executable jest ustawione na true, co wskazuje, że pole data tego konta zawiera wykonywalny kod programu.

Dla kont programów pole data przechowuje wykonywalny kod programu. W przeciwieństwie do tego, konta portfeli mają puste pole danych.

Podczas wdrażania programu Solana, wykonywalny kod programu jest przechowywany w polu data konta.

Wykonywalne konta programów mają również program wyznaczony jako owner konta.

Wszystkie konta programów są własnością programu Loader, który jest kategorią wbudowanych programów zarządzających wykonywalnymi kontami programów na Solanie.

Dla programu Token Program, owner to program BPFLoader2.

Token Program to wykonywalne konto programu na Solanie. Podobnie jak konta portfela, programy mają tę samą podstawową strukturę danych konta, ale z kluczowymi różnicami w polach.

Pole executable jest ustawione na true, co wskazuje, że pole data tego konta zawiera wykonywalny kod programu.

Dla kont programów pole data przechowuje wykonywalny kod programu. W przeciwieństwie do tego, konta portfeli mają puste pole danych.

Podczas wdrażania programu Solana, wykonywalny kod programu jest przechowywany w polu data konta.

Wykonywalne konta programów mają również program wyznaczony jako owner konta.

Wszystkie konta programów są własnością programu Loader, który jest kategorią wbudowanych programów zarządzających wykonywalnymi kontami programów na Solanie.

Dla programu Token Program, owner to program BPFLoader2.

Token Program Account
{
"data": {
"type": "Buffer",
"data": [127, "...truncated, total bytes: 134080...", 0]
},
"executable": true,
"lamports": 4522329612,
"owner": "BPFLoader2111111111111111111111111111111111",
"rentEpoch": 18446744073709552000,
"space": 134080
}

Pobierz konto Mint

Ten przykład pobiera konto Mint dla USD Coin (USDC), aby pokazać, jak programy na Solanie przechowują stan w oddzielnych kontach.

Konto Mint jest kontem należącym do programu Token Program. Przechowuje globalne metadane dla konkretnego tokena, w tym całkowitą podaż, liczbę miejsc dziesiętnych oraz konta autoryzowane do mintowania lub zamrażania tokenów. Adres konta Mint jednoznacznie identyfikuje token w sieci Solana.

Fetch Program Account
import { Connection, PublicKey } from "@solana/web3.js";
const connection = new Connection(
"https://api.mainnet-beta.solana.com",
"confirmed"
);
const address = new PublicKey("EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v");
const accountInfo = await connection.getAccountInfo(address);
Console
Click to execute the code.

Kluczowym punktem w tym przykładzie jest to, że konto Mint przechowuje stan, a nie kod wykonywalny.

Konta Mint są własnością Token Program, który zawiera instrukcje definiujące, jak tworzyć i aktualizować konta Mint.

Pole executable jest false, ponieważ pole data konta Mint przechowuje stan, a nie kod wykonywalny.

Token Program definiuje typ danych Mint, który jest przechowywany w polu data konta Mint.

Pole data zawiera zserializowany stan konta Mint, taki jak autorytet mint, całkowita podaż, liczba miejsc dziesiętnych.

Aby odczytać dane z konta Mint, musisz deserializować pole data do typu danych Mint. To zostanie omówione w następnym kroku.

Token Program (TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA) jest właścicielem konta Mint.

Oznacza to, że pole data konta Mint może być modyfikowane tylko przez instrukcje zdefiniowane w Token Program.

Kluczowym punktem w tym przykładzie jest to, że konto Mint przechowuje stan, a nie kod wykonywalny.

Konta Mint są własnością Token Program, który zawiera instrukcje definiujące, jak tworzyć i aktualizować konta Mint.

Pole executable jest false, ponieważ pole data konta Mint przechowuje stan, a nie kod wykonywalny.

Token Program definiuje typ danych Mint, który jest przechowywany w polu data konta Mint.

Pole data zawiera zserializowany stan konta Mint, taki jak autorytet mint, całkowita podaż, liczba miejsc dziesiętnych.

Aby odczytać dane z konta Mint, musisz deserializować pole data do typu danych Mint. To zostanie omówione w następnym kroku.

Token Program (TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA) jest właścicielem konta Mint.

Oznacza to, że pole data konta Mint może być modyfikowane tylko przez instrukcje zdefiniowane w Token Program.

Mint Account
{
"data": {
"type": "Buffer",
"data": [1, "...truncated, total bytes: 82...", 103]
},
"executable": false,
"lamports": 407438077149,
"owner": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
"rentEpoch": 18446744073709552000,
"space": 82
}

Deserializacja konta Mint

Pole data konta Solana zawiera surowe bajty. Aby zinterpretować te dane w sposób znaczący, musisz je deserializować do odpowiedniego typu danych zdefiniowanego przez program, który jest właścicielem konta.

Większość programów Solana dostarcza biblioteki klienckie z funkcjami pomocniczymi, które upraszczają proces deserializacji. Te funkcje konwertują surowe bajty konta na ustrukturyzowane typy danych, co ułatwia pracę z danymi konta.

Na przykład @solana/spl-token zawiera funkcję getMint(), która pomaga deserializować pole data konta Mint do typu danych Mint.

Deserialize Mint Account Data
import { PublicKey, Connection } from "@solana/web3.js";
import { getMint } from "@solana/spl-token";
const connection = new Connection(
"https://api.mainnet-beta.solana.com",
"confirmed"
);
const address = new PublicKey("EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v");
const mintData = await getMint(connection, address, "confirmed");
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 getMint() deserializuje pole data konta mint do typu danych Mint zdefiniowanego przez Token Program.

Mint Account
{
"data": {
"type": "Buffer",
"data": [1, "...truncated, total bytes: 82...", 103]
},
"executable": false,
"lamports": 407438077149,
"owner": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
"rentEpoch": 18446744073709552000,
"space": 82
}

Możesz zobaczyć w pełni zdeserializowane dane Konta Mint w Solana Explorer.

Pole address zawiera adres konta Mint.

Adres konta mint jest używany do identyfikacji tokena w sieci Solana.

Pole mintAuthority pokazuje uprawnienia do mintowania nowych tokenów.

To jedyne konto, które może tworzyć nowe jednostki tokena.

Pole supply pokazuje całkowitą liczbę tokenów, które zostały wyemitowane.

Ta wartość jest podana w najmniejszej jednostce tokena. Aby uzyskać całkowitą podaż w standardowych jednostkach, dostosuj wartość pola supply za pomocą decimals.

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

Pole isInitialized wskazuje, czy konto Mint zostało zainicjalizowane. To pole jest kontrolą bezpieczeństwa używaną w Token Program.

Pole freezeAuthority pokazuje uprawnienia do zamrażania kont tokenów.

Zamrożone konto tokena nie może przenosić ani spalać tokenów znajdujących się na koncie.

Pole tlvData zawiera dodatkowe dane dla Token Extensions (wymaga dalszej deserializacji).

To pole dotyczy tylko kont utworzonych przez Token Extension Program (Token2022).

Funkcja getMint() deserializuje pole data konta mint do typu danych Mint zdefiniowanego przez Token Program.

Mint Account
{
"data": {
"type": "Buffer",
"data": [1, "...truncated, total bytes: 82...", 103]
},
"executable": false,
"lamports": 407438077149,
"owner": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
"rentEpoch": 18446744073709552000,
"space": 82
}

Możesz zobaczyć w pełni zdeserializowane dane Konta Mint w Solana Explorer.

Pole address zawiera adres konta Mint.

Adres konta mint jest używany do identyfikacji tokena w sieci Solana.

Pole mintAuthority pokazuje uprawnienia do mintowania nowych tokenów.

To jedyne konto, które może tworzyć nowe jednostki tokena.

Pole supply pokazuje całkowitą liczbę tokenów, które zostały wyemitowane.

Ta wartość jest podana w najmniejszej jednostce tokena. Aby uzyskać całkowitą podaż w standardowych jednostkach, dostosuj wartość pola supply za pomocą decimals.

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

Pole isInitialized wskazuje, czy konto Mint zostało zainicjalizowane. To pole jest kontrolą bezpieczeństwa używaną w Token Program.

Pole freezeAuthority pokazuje uprawnienia do zamrażania kont tokenów.

Zamrożone konto tokena nie może przenosić ani spalać tokenów znajdujących się na koncie.

Pole tlvData zawiera dodatkowe dane dla Token Extensions (wymaga dalszej deserializacji).

To pole dotyczy tylko kont utworzonych przez Token Extension Program (Token2022).

Deserialized Mint Data
{
"address": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
"mintAuthority": "BJE5MMbqXjVwjAF7oxwPYXnTXDyspzZyt4vwenNw5ruG",
"supply": "8985397351591790",
"decimals": 6,
"isInitialized": true,
"freezeAuthority": "7dGbd2QZcCKcTndnHcTL8q7SMVXAkp688NTQYwrRCrar",
"tlvData": {
"type": "Buffer",
"data": []
}
}

Is this page helpful?

Spis treści

Edytuj stronę