Чтение из сети
В этом разделе рассматривается, как читать данные из сети Solana путем получения различных аккаунтов для понимания структуры аккаунта Solana.
В Solana все данные существуют в "аккаунтах". Вы можете представить данные в Solana как публичную базу данных с единственной таблицей "Аккаунты", где каждая запись — это аккаунт с одинаковым базовым типом аккаунта.
Аккаунты
Аккаунты в Solana могут хранить "состояние" или "исполняемые" программы. Каждый аккаунт имеет "адрес" (публичный ключ), который служит его уникальным идентификатором, используемым для поиска соответствующих данных в блокчейне.
Аккаунты Solana содержат либо:
- Состояние: Данные, которые предназначены для чтения и сохранения. Например, информация о токенах, пользовательские данные или другие данные, определенные в программе.
- Исполняемые программы: Аккаунты, содержащие фактический код программ Solana. Эти аккаунты хранят инструкции, которые пользователи могут вызывать.
Это разделение программного кода и состояния программы является ключевой особенностью модели аккаунтов Solana. Для получения дополнительной информации обратитесь к странице Модель аккаунтов Solana.
Получение аккаунта кошелька
Этот пример демонстрирует, как:
- Сгенерировать новую пару ключей (пару публичного/приватного ключа).
- Запросить аирдроп SOL для финансирования нового адреса.
- Получить данные аккаунта для финансируемого адреса.
В Solana финансирование нового адреса с помощью SOL автоматически создает аккаунт, принадлежащий Системной программе. Все аккаунты "кошельков" — это просто аккаунты, принадлежащие Системной программе, которые хранят SOL и могут подписывать транзакции.
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));
Получение Token Program
Этот пример получает Token Program, чтобы продемонстрировать разницу между аккаунтами кошельков и программными аккаунтами.
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);
Получение mint account
Этот пример получает mint account USD Coin (USDC), чтобы показать, как программы в Solana хранят состояние в отдельных аккаунтах.
Mint аккаунт - это аккаунт, принадлежащий Token Program. Он хранит глобальные метаданные для конкретного токена, включая общее предложение, количество десятичных знаков и аккаунты, авторизованные для создания или заморозки токенов. Адрес mint account уникально идентифицирует токен в сети 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);
Десериализация mint account
Поле data
аккаунта Solana содержит необработанные байты. Чтобы осмысленно
интерпретировать эти данные, вы должны десериализовать их в соответствующий тип
данных, определенный программой, которая владеет аккаунтом.
Большинство программ Solana предоставляют клиентские библиотеки с вспомогательными функциями, которые абстрагируют процесс десериализации. Эти функции преобразуют необработанные байты аккаунта в структурированные типы данных, облегчая работу с данными аккаунта.
Например, @solana/spl-token
включает функцию
getMint()
, которая помогает десериализовать поле data
аккаунта Mint в тип данных
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");
Is this page helpful?