独立观察 · 非币安官方网站
NBNBNOTE

BNB 用途与规则观察核查日期以各页署名为准

质押和锁仓的 BNB 要不要从总供应量里扣掉

不算。质押、解绑等待、跨链锁定,这些 BNB 都还有一条合约写好的路可以回到普通地址;销毁是送进没有私钥的地址,再也出不来。前者留在总供应量里,最多在“能不能马上动用”这一栏另作标注。

看一笔 BNB 能不能回来
质押中
发起解绑,7 天后可领取
TokenHub
按恢复流程解锁后转出
黑洞地址
没有私钥,没有转出路径

前两行留在总供应量里,只有最后一行从总量中扣除。

本文内容
  1. 判断“锁住”还是“销毁”:只问一件事,它还能不能转出来
  2. BSC 质押的 BNB 停在哪里:每个验证人各有一个 StakeCredit 合约
  3. 解绑后的 7 天:为什么合约余额比质押总额多出 94 万枚
  4. TokenHub 里的两千五百多万枚:旧跨链合约,留着恢复通道
  5. 把质押当销毁,总量会少算多少
  6. 那“流通量”要不要扣掉质押?看数据网站自己的定义
  7. 遇到一个装着大量 BNB 的地址,按这四步归类

在 BSC 上随便翻几个系统合约,会看到很大的 BNB 余额:验证人质押合约加起来两千五百万枚上下,一个叫 TokenHub 的旧跨链合约里也有两千五百多万枚。两笔合起来,占官方公布剩余总量的三分之一以上。于是有人把它们当成“退出流通”,从总量里扣掉,算出一个小得多的数字。

这样扣是错的。这些 BNB 没有被销毁:质押的可以解绑取回,TokenHub 里的有一条写在合约里的恢复路径。总供应量只扣真正出不来的那部分。下面分别给出合约依据、可复查的查询办法,以及扣错之后数字会偏多少。

判断“锁住”还是“销毁”:只问一件事,它还能不能转出来

锁仓和销毁在区块浏览器上看起来很像——都是 BNB 从普通地址转进一个特殊地址。区别在那个地址之后还能做什么。

销毁地址 0x000000000000000000000000000000000000dEaD 没有人掌握私钥,也不是合约,里面的 BNB 没有任何转出方式。第 36 次季度销毁公告写明,BNB Chain Fusion 之后季度销毁就是把 BNB 发到这个地址。销毁地址本身能证明什么、不能证明什么,另一篇已经单独讲过。

锁仓合约不一样:它的代码里写着“满足条件就转出去”的函数。条件可能是等够天数、提交一份证明,或者由治理投票决定。只要这条路存在,余额就是暂时停放,不是消失。判断时去看合约源码或官方文档里有没有提取、领取、解锁这类函数,比看地址的名字可靠。

BSC 质押的 BNB 停在哪里:每个验证人各有一个 StakeCredit 合约

BNB Chain 官方的质押概览说,质押入口是 Stake Hub 系统合约,每个验证人另有一个自己的合约管理质押凭证;凭证的名字是“stake {验证人名} credit”,符号是“st{验证人名}”,委托时铸造,取回时销毁。注意这里销毁的是凭证,不是 BNB。

BNB 本身去了哪里,概览页没写,要看合约代码。StakeHub.sol 的 delegate 函数把用户转来的 BNB 原样转给该验证人的 StakeCredit 合约;StakeCredit.sol 收到后记进 totalPooledBNB。所以质押中的 BNB,就是各个 StakeCredit 合约的原生余额。

几个参数可以直接向 StakeHub(0x0000000000000000000000000000000000002002)读出来。2026 年 10 月 16 日 09:21(UTC),BSC 区块 127,953,465 时:

  • unbondPeriod() 返回 604,800 秒,也就是 7 天,和官方用户指南写的解绑期一致;
  • minDelegationBNBChange() 返回 1 BNB,单次委托少于这个数会被拒绝;
  • getValidators(0, 200) 列出 56 个已注册验证人及其 StakeCredit 地址。

把这 56 个 StakeCredit 地址在同一区块的 eth_getBalance 加起来,约为 25,096,338.96 BNB;同一时刻各合约 totalPooledBNB() 之和约为 24,148,377.93 BNB。这只是那一个区块的读数,示例用,换个区块就会变。

解绑后的 7 天:为什么合约余额比质押总额多出 94 万枚

上面两个数差了约 947,961.03 BNB。按 StakeCredit 的代码,用户发起解绑时,totalPooledBNB 立刻减掉对应数量,同时生成一条带 unlockTime 的解绑请求;BNB 本身留在合约里,直到用户调用领取才转出。已经过了 7 天但没人去点领取的,也还在里面。

所以这 94 万枚处在一种中间状态:已经不算质押,不再产生奖励,但也还没回到用户地址。它同样没有离开总供应量。要估算“质押中”的数量,用 totalPooledBNB;要估算“停在质押合约里”的数量,用合约余额。两个数回答的是两个问题,别混着用。

还有一个细节:totalPooledBNB 里包括已经分配给这个池子的奖励,不全是用户最初存进去的本金。

TokenHub 里的两千五百多万枚:旧跨链合约,留着恢复通道

TokenHub 是 BSC 的系统合约,地址 0x0000000000000000000000000000000000001004。在已经停用的 BNB Beacon Chain 时代,BNB 在两条链之间转移时,BSC 这一侧经过它。2026 年 10 月 16 日 09:22(UTC),BSC 区块 127,953,698 时,它的原生余额约为 25,968,558.55 BNB。

这笔余额也能出来。TokenRecoverPortal.sol 里的 recover 函数会调用 TokenHub 的 recoverBCAsset,代码注释和常量 LOCK_PERIOD_FOR_TOKEN_RECOVER 都写着 7 天后解锁;TokenHub 里还有 withdrawUnlockedToken 把解锁的资产转给接收人。

这 2,597 万枚里,最终会有多少被恢复、多少永远没人来领,官方没有公布过对账数字,本文也不做推测。能确定的只有一点:它不在黑洞地址里,合约有转出路径。它留在总供应量里,在分布记录上单列一行“TokenHub 锁定”即可。

把质押当销毁,总量会少算多少

假设你拿官方总量做分母,计算某个指标,比如每枚 BNB 对应多少销毁。官方最新的剩余总量是第 36 次销毁后公布的 133,166,127.91 BNB。

  1. 正确做法:分母就用 133,166,127.91,质押和锁定余额都不动。
  2. 错误做法:先减掉同一时刻的质押合约余额 25,096,338.96,得到 108,069,788.95。分母少了约 18.8%,算出来的比例会被放大同样的幅度。
  3. 再把 TokenHub 的 25,968,558.55 也减掉,分母只剩八千二百万出头,误差超过三分之一。

另外,这两组读数来自 10 月 16 日的区块,官方总量则截至 7 月 15 日的公告。两次公告之间,链上总量也不是静止的:BEP-95 按区块把一部分 Gas 费送进销毁地址(同一天向 BSCValidatorSet 读 burnRatio(),返回 1,000,按合约里 10,000 的分母即 10%)。所以就算要比较,也要在记录里写清两边各自的时间点。

那“流通量”要不要扣掉质押?看数据网站自己的定义

“总供应量”和“流通量”是两个概念。总供应量只扣销毁;流通量各家数据网站的算法不一样,有的把锁仓、质押、托管的部分排除,有的不排除。BNB Chain 的季度销毁公告只公布总供应量,没有公布流通量。

所以在两个网站上看到 BNB 流通量不一样,先去找它们各自的方法说明页,看它对“质押中的代币”怎么处理,再决定能不能比较。要自己记一个“可立即动用”的数字,就在总量下面开一栏写“其中质押中 / 解绑待领 / TokenHub 锁定”,各写读数区块,总量那一行本身不改。

遇到一个装着大量 BNB 的地址,按这四步归类

  1. 它是 0x…dEaD 这类没有私钥、不是合约的地址吗?是,就记作销毁,从总量里扣。官方季度销毁和 BEP-95 都用这个地址。
  2. 它是合约吗?找到源码或官方文档,搜提取、领取、解锁、withdraw、claim、unlock 这类函数。有,就是锁定,不扣。
  3. 如果是锁定,写下解锁条件:等多少天、要什么证明、谁能触发。质押是 7 天解绑期,TokenHub 恢复也是 7 天锁定。
  4. 记下查询的区块号和时间(UTC)。锁定余额每个区块都可能变,没有区块号的数字没法复查。

交易所热钱包、冷钱包是有私钥的普通地址,既不是销毁,也不是这里说的合约锁定,照常算在总量里。跨到 opBNB 时停在桥合约里的那部分,判断方法相同,具体合约和数字见 opBNB 那篇。历次季度销毁的总量变化,可以对照销毁档案。