You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取基于Substrate的平行链中所有账户的完整列表

是否有直接获取平行链所有账户列表的途径

存在直接获取的方案,你可以通过本地运行的全节点调用Storage接口实现:

  • 调用system.account存储项的前缀查询接口,遍历该存储项下的所有key,每个key对应一个链上存在状态的账户地址。这个方法拿到的是当前区块高度下所有有效账户(包括余额不为0、存在质押/授权等其他链上状态的账户),不需要遍历历史交易。

注意:如果目标平行链有自定义的账户逻辑,需要确认是否额外使用了其他存储项存储账户信息,默认基于Substrate框架开发的平行链都通用system.account存储项。

无直接接口时通过转账记录统计地址的方案

如果你只需要统计所有发生过转账交互的地址,可以按以下步骤操作:

  1. 从创世块开始遍历所有区块的extrinsic和event
  2. 筛选两类转账相关记录:
    • 普通转账extrinsic:对应balances.transfer、balances.transferKeepAlive等调用,提取发送方地址、接收方地址
    • 其他触发转账的逻辑:比如质押赎回、跨链转账等操作也会产生账户余额变更,需要筛选balances.Transfer event,提取from、to两个字段的地址
  3. 对所有提取到的地址做去重处理,即可得到所有发生过转账交互的地址集合

注意:这种方法会遗漏从未发生过转账、仅通过创世分配或者其他非转账操作获得余额的账户,统计完整性弱于直接读取system.account存储的方案。

转账属于event还是extrinsic

两者都有对应实体,区别如下:

  • 转账操作本身属于extrinsic:用户签名提交的转账请求是一种extrinsic,会被打包进区块执行
  • 转账成功的结果通知属于event:转账extrinsic执行成功后,链上会抛出balances.Transfer event 标记本次转账的发送方、接收方、金额等信息

特殊情况:不需要用户主动提交extrinsic的链上逻辑触发的转账(比如区块奖励发放、清算触发的资金划转),不会有对应的转账extrinsic,但一定会抛出对应的balances.Transfer event。


内容的提问来源于stack exchange,提问作者Aviral Srivastava

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 16:24:02