如何获取基于Substrate的平行链中所有账户的完整列表
是否有直接获取平行链所有账户列表的途径
存在直接获取的方案,你可以通过本地运行的全节点调用Storage接口实现:
- 调用
system.account存储项的前缀查询接口,遍历该存储项下的所有key,每个key对应一个链上存在状态的账户地址。这个方法拿到的是当前区块高度下所有有效账户(包括余额不为0、存在质押/授权等其他链上状态的账户),不需要遍历历史交易。
注意:如果目标平行链有自定义的账户逻辑,需要确认是否额外使用了其他存储项存储账户信息,默认基于Substrate框架开发的平行链都通用
system.account存储项。
无直接接口时通过转账记录统计地址的方案
如果你只需要统计所有发生过转账交互的地址,可以按以下步骤操作:
- 从创世块开始遍历所有区块的extrinsic和event
- 筛选两类转账相关记录:
- 普通转账extrinsic:对应
balances.transfer、balances.transferKeepAlive等调用,提取发送方地址、接收方地址 - 其他触发转账的逻辑:比如质押赎回、跨链转账等操作也会产生账户余额变更,需要筛选
balances.Transferevent,提取from、to两个字段的地址
- 普通转账extrinsic:对应
- 对所有提取到的地址做去重处理,即可得到所有发生过转账交互的地址集合
注意:这种方法会遗漏从未发生过转账、仅通过创世分配或者其他非转账操作获得余额的账户,统计完整性弱于直接读取
system.account存储的方案。
转账属于event还是extrinsic
两者都有对应实体,区别如下:
- 转账操作本身属于
extrinsic:用户签名提交的转账请求是一种extrinsic,会被打包进区块执行 - 转账成功的结果通知属于
event:转账extrinsic执行成功后,链上会抛出balances.Transferevent 标记本次转账的发送方、接收方、金额等信息
特殊情况:不需要用户主动提交extrinsic的链上逻辑触发的转账(比如区块奖励发放、清算触发的资金划转),不会有对应的转账extrinsic,但一定会抛出对应的
balances.Transferevent。
内容的提问来源于stack exchange,提问作者Aviral Srivastava
相关产品推荐
相关产品推荐

