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.
#[derive(PartialEq, Eq, Clone, Default)]pub struct Account {/// lamports in the accountpub 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 rentpub rent_epoch: Epoch,}
Konta
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:
- Wygenerować nowy keypair (parę kluczy publiczny/prywatny).
- Poprosić o airdrop SOL, aby zasilić nowy adres.
- 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.
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 accountconst 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));
„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.
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.
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);
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.
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.
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);
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.
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.
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");
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 initializedpub 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.
{"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).
Is this page helpful?