Polkadot 开发教程:使用 SDK 查询链上状态(Dedot 完整指南)

原文作者:PaperMoon团队

简介(Introduction)

基于 Polkadot SDK 构建的区块链,其底层数据存储采用 Key-Value 键值数据库模型。
链上的所有信息(On-Chain State)本质上都保存在 Runtime 的 Storage 中,外部应用可以通过 RPC 接口进行读取。

链上状态通常包括:
    •    账户余额(Account Balances)
    •    资产信息(Assets Metadata)
    •    治理提案(Governance Proposals)
    •    Runtime 管理的任意业务数据

换句话说:区块链 ≈ 一个公开可读的状态数据库(State Machine),而 SDK 的作用就是提供读取这个数据库的“客户端工具”。

SDK

语言

特点

Polkadot API (PAPI)

TypeScript

新一代类型安全 API

Polkadot.js API

JavaScript

生态最广(维护模式)

Dedot

TypeScript

轻量高性能

Python Substrate Interface

Python

数据分析友好

Subxt

Rust

编译期类型安全

本文以 Dedot 为完整可运行示例,其它 SDK 原理一致。

在 Polkadot 中:
    •    Runtime → 管理状态
    •    Storage → 保存状态
    •    RPC → 提供读取入口
    •    SDK → 帮你调用 RPC

典型流程如下:

查询链上状态的逻辑:
    1.    SDK 连接节点 RPC
    2.    请求 Runtime Storage
    3.    节点读取数据库
    4.    返回编码后的数据
    5.    SDK 解码并输出

环境准备(Prerequisites)

需要安装:
    •    Node.js v18+
    •    npm / pnpm / yarn

1)创建项目

mkdir dedot-query-example && cd dedot-query-example && \
npm init -y && npm pkg set type=module

2)安装依赖

npm install dedot && \
npm install --save-dev @dedot/chaintypes @types/node tsx typescript

查询账户余额(System.Account)

该示例将读取 Runtime 中的:system.account

它是 Substrate 最核心的存储项,保存每个账户的原生代币余额。

新建文件

query-balance.ts

代码

import { DedotClient, WsProvider } from 'dedot';
import type { PolkadotAssetHubApi } from '@dedot/chaintypes';

const ASSET_HUB_RPC = 'INSERT_WS_ENDPOINT';

// 查询地址(Polkadot 地址)
const ADDRESS = 'INSERT_ADDRESS';

async function main() {
  // 连接节点
  const provider = new WsProvider(ASSET_HUB_RPC);
  const client = await DedotClient.new<PolkadotAssetHubApi>(provider);

  console.log('Connected to Polkadot Hub');
  console.log(`Querying balance for: ${ADDRESS}\n`);

  // 查询链上账户存储
  const accountInfo = await client.query.system.account(ADDRESS);

  // 解析返回数据
  const { nonce, data } = accountInfo;
  const { free, reserved, frozen } = data;

  console.log('Account Information:');
  console.log(`  Nonce: ${nonce}`);
  console.log(`  Free Balance: ${free}`);
  console.log(`  Reserved: ${reserved}`);
  console.log(`  Frozen: ${frozen}`);

  await client.disconnect();
}

main().catch(console.error);

参数说明

必须替换:

INSERT_WS_ENDPOINT

例如:

wss://polkadot-asset-hub-rpc.polkadot.io
INSERT_ADDRESS

替换为要查询的地址。

运行

npx tsx query-balance.ts

输出示例

Connected to Polkadot Hub
Querying balance for: 14E5nqKAp3oAJcmzgZhUD2RcptBeUBScxKHgJKU4HPNcKVf3

Account Information:
 Nonce: 0
 Free Balance: 0
 Reserved: 0
 Frozen: 0

字段解释

字段

含义

nonce

交易计数器(防止重放攻击)

free

可用余额

reserved

被锁定保证金

frozen

冻结余额(不可转账)

查询资产信息(Assets Pallet)

下面查询 USDT(资产 ID = 1984)。

我们会读取三类数据:
    1.    资产元数据
    2.    资产全局信息
    3.    指定账户持仓

新建文件

query-asset.ts

代码

import { DedotClient, WsProvider } from 'dedot';
import { hexToString } from 'dedot/utils';
import type { PolkadotAssetHubApi } from '@dedot/chaintypes';

const ASSET_HUB_RPC = 'INSERT_WS_ENDPOINT';

const USDT_ASSET_ID = 1984;
const ADDRESS = 'INSERT_ADDRESS';

async function main() {
  const provider = new WsProvider(ASSET_HUB_RPC);
  const client = await DedotClient.new<PolkadotAssetHubApi>(provider);

  console.log('Connected to Polkadot Hub');
  console.log(`Querying asset ID: ${USDT_ASSET_ID}\n`);

  // 元数据
  const assetMetadata = await client.query.assets.metadata(USDT_ASSET_ID);

  console.log('Asset Metadata:');
  console.log(`  Name: ${hexToString(assetMetadata.name)}`);
  console.log(`  Symbol: ${hexToString(assetMetadata.symbol)}`);
  console.log(`  Decimals: ${assetMetadata.decimals}`);

  // 资产详情
  const assetDetails = await client.query.assets.asset(USDT_ASSET_ID);

  if (assetDetails) {
    console.log('\nAsset Details:');
    console.log(`  Owner: ${assetDetails.owner.address()}`);
    console.log(`  Supply: ${assetDetails.supply}`);
    console.log(`  Accounts: ${assetDetails.accounts}`);
    console.log(`  Min Balance: ${assetDetails.minBalance}`);
    console.log(`  Status: ${JSON.stringify(assetDetails.status)}`);
  }

  // 查询账户持仓
  console.log(`\nQuerying asset balance for: ${ADDRESS}`);
  const assetAccount = await client.query.assets.account([
    USDT_ASSET_ID,
    ADDRESS,
  ]);

  if (assetAccount) {
    console.log('\nAsset Account:');
    console.log(`  Balance: ${assetAccount.balance}`);
    console.log(`  Status: ${JSON.stringify(assetAccount.status)}`);
  } else {
    console.log('\nNo asset balance found for this account');
  }

  await client.disconnect();
}

main().catch(console.error);

运行

npx tsx query-asset.ts

输出示例

Asset Metadata:
 Name: Tether USD
 Symbol: USDT
 Decimals: 6

Asset Details:
 Owner: 5Gy6UDPQNFG6vBL...
 Supply: 77998622834581
 Accounts: 13544
 Min Balance: 10000
 Status: "Live"

在 EVM 世界:
你只能通过区块浏览器(如 Etherscan)。

在 Polkadot:
你可以直接读取 Runtime Storage。

本质区别:

EVM

Polkadot

事件日志为主

状态存储为主

浏览器驱动

SDK 驱动

偏用户

偏开发者

阅读原文:https://docs.polkadot.com/chain-interactions/query-data/query-sdks/#__tabbed_1_3

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值