如何通过cardano-db-sync正确查询Cardano ADA当前总供应量
基于cardano-db-sync的ADA全链总供应量正确查询方案与异常排查
现有官方查询逻辑的偏差定位
- 官方文档提供的总供应量查询语句,实际仅覆盖UTXO集合中的未花费交易输出金额,未纳入链上其余形态的ADA持有规模,计算结果会随日常UTXO交易的动态变化持续波动,与参考平台的实际总供给数据存在百万级ADA的统计偏差
- 全链总供应量的构成缺口,主要来自所有质押账户中尚未触发提取操作的可支取资金,这部分资金不属于UTXO集合的统计范围,是原查询遗漏的核心模块
奖励与提取总额统计倒挂的原因说明
实际执行统计查询时,会得到“已提取资金总规模远大于已发放奖励总规模”的结果,示例输出如下:
-- 已发放奖励总规模(单位:ADA) select sum(amount) / 1000000 from reward; -------------------- 554006568 -- 已完成提取的资金总规模(单位:ADA) select sum(amount) / 1000000 from withdrawal; -------------------- 875322654
该异常并非链上数据错误,核心原因是两张表的统计口径并不完全对等:
withdrawal表记录的是用户从质押账户地址向外划转的所有可支取资金,不区分资金来源:既包括协议自动分发的质押奖励,也包括用户从外部地址转入质押账户、后续又划转出去的自有本金reward表仅记录协议层面自动分发的质押类奖励,不统计用户自行转入质押账户的资金,也未覆盖协议迭代历史中部分早期奖励条目的归档内容
因此两张表的统计结果不存在“已发放总额必须大于已提取总额”的对应关系,提取总额高于奖励发放总额是正常的统计口径差异,不是链上数据异常。
正确的全链总供应量查询逻辑
全链ADA总供应量的核心构成分为两部分:
- UTXO集合中所有未被花费的交易输出总金额
- 所有质押账户中尚未提取的可支取余额(这部分金额不会体现在UTXO集合的统计范围内)
注意:不要通过“已发放奖励总和 - 已提取资金总和”来计算未提取奖励余额,两者统计口径不对等,会产生大幅偏差,直接读取
account表的withdrawable_amount字段求和是唯一准确的统计方式。
参考查询语句:
WITH unspent_utxo_total AS ( SELECT SUM(value)::DOUBLE PRECISION / 1000000 AS total_utxo FROM tx_out -- 排除所有已经被花费的UTXO WHERE NOT EXISTS ( SELECT 1 FROM tx_in WHERE tx_in.tx_out_id = tx_out.tx_id AND tx_in.tx_out_index = tx_out.index ) ), account_available_balance AS ( SELECT SUM(withdrawable_amount)::DOUBLE PRECISION / 1000000 AS total_unwithdrawn FROM account ) SELECT total_utxo + total_unwithdrawn AS current_chain_total_supply FROM unspent_utxo_total, account_available_balance;
内容来源于stack exchange,答案作者user3755529
相关产品推荐
相关产品推荐

