Чтение из сети
Введение
Это руководство показывает, как читать данные из блокчейна TON. Вы научитесь:
- Получать информацию об аккаунте
- Вызывать
get-методы
- Получать данные о транзакциях аккаунта
В итоге вы поймёте, как взаимодействовать с TON API на основе HTTP. В этом руководстве используется TON Center — быстрый и надёжный HTTP API для TON.
Настройка окружения
Сначала посетите страницы установки и установите Node.js и npm для вашей ОС. Проверьте, что установка корректна, выполнив следующие команды:
node -v
npm -v
Версии node
и npm
должны быть по меньшей мере v20
и v10
соответственно.
Настройка проекта
Давайте настроим структуру вашего проекта:
- Создайте новый каталог для вашего проекта и перейдите в него.
- Инициализируйте проект Node.js.
- Установите необходимые зависимости.
- Инициализируйте конфигурацию TypeScript.
Выполните эти команды в терминале:
mkdir reading-from-ton && cd reading-from-ton
npm init -y
npm install typescript ts-node @ton/ton @ton/core @ton/crypto
npx tsc --init
Для запуска скрипта на TypeScript в вашей текущей директории можно выполнить такую команду (если, например, он называется script.ts
):
npx ts-node script.ts
Чтение информации об аккаунте
Информация об аккаунте включает составляющие balance
, state
, code
и data
.
balance
: Сумма TON на счету.state
: Состояние может быть одним из следующих:- Nonexist: По адресу ещё нет никаких данных.
- Uninit: У адреса есть баланс, но нет кода смарт-контракта.
- Active: Адрес уже активен, у него есть и код, и баланс.
- Frozen: Адрес заблокирован, поскольку баланс оказался недостаточным для расходов на хранение данных.
code
: Код контракта в «сыром формате».data
: Сериализованные данные контракта, хранящиеся в ячейке.
Состояние аккаунта может быть получено с помощью метода getContractState
.
Адрес аккаунта
Чтобы получить информацию об аккаунте, необходимо знать его адрес. В TON мы можем использовать формат «user-friendly address» — строку с форматом кодирования base64url, которая представляет аккаунт в блокчейне в человекочитаемом виде с защитой от ошибок.
Такие адреса также включают специальные флаги, определяющие, как этот адрес следует использовать. Например, некоторые адреса будут валидными только в тестнете, в то время как другие подходят любой сети. Эти флаги закодированы в первых нескольких битах, поэтому от них зависит первая буква адреса:
- Адреса, которые начинаются с E или U, используются в мейннете
- Адреса, которые начинаются с k или 0, используются в тестнете
Пример для мейннета:
EQDKbjIcfM6ezt8KjKJJLshZJJSqX7XOA4ff-W72r5gqPrHF
UQDKbjIcfM6ezt8KjKJJLshZJJSqX7XOA4ff-W72r5gqPuwA
Пример для тестнета:
kQDKbjIcfM6ezt8KjKJJLshZJJSqX7XOA4ff-W72r5gqPgpP
0QDKbjIcfM6ezt8KjKJJLshZJJSqX7XOA4ff-W72r5gqPleK
Ваш адрес в последующих примерах
В приведённых примерах кода можете смело заменять используемый адрес на адрес вашего тестового кошелька.
// Replace with any address
const accountAddress = Address.parse('0QD-SuoCHsCL2pIZfE8IAKsjc0aDpDUQAoo-ALHl2mje04A-');
Реализация
Создайте новый файл 1-get-account-state.ts
:
import { Address, TonClient } from "@ton/ton";
async function main() {
// Initializaing TON HTTP API Client
const tonClient = new TonClient({
endpoint: 'https://testnet.toncenter.com/api/v2/jsonRPC',
});
// Replace with any address
const accountAddress = Address.parse('0QD-SuoCHsCL2pIZfE8IAKsjc0aDpDUQAoo-ALHl2mje04A-');
// Calling method on http api
const state = await tonClient.getContractState(accountAddress);
console.log('State: ', state.state);
console.log('Balance: ', state.balance);
console.log('Data: ', state.data?.toString('hex'));
console.log('Code: ', state.code?.toString('hex'));
}
main();
Выполните этот пример, используя следующую команду:
npx ts-node 1-get-account-state.ts