先说结论:矿到币不等于马上能花
比特币协议规定:每个区块第一笔交易,也就是 coinbase 交易(区块奖励加手续费的收款交易)的输出,必须在它所在区块之后再叠满 100 个新区块,才允许被再次花费。没到 100 个之前,这些输出在节点眼里处于 immature(未成熟)状态——谁拿它当交易输入,谁的交易就是无效的共识级无效,不是某个钱包的保守提示。这条规则来自共识常数 COINBASE_MATURITY,取值 100,写死在比特币核心源码的共识参数头文件里。按平均十分钟一个块,一百个块约合十六七个小时。
没有这条规则会发生什么
想象没有成熟期的世界。矿工张三挖出区块 A,coinbase 交易把奖励付给自己。几分钟后,另一条矿工挖出更长的链,把张三的对手李四的链接成主链,而区块 A 被孤立成孤儿块。问题来了:张三的奖励输出在 A 里存在过,在李四那条不含 A 的链上却从未存在过。如果张三在分叉发生前已经花掉了这笔钱,那么在新主链看来,他花的是一笔”从来没有过的输出”,交易无效;反过来,如果张三同时在两条链上各挖一块并都花掉奖励,同一段脚本签名就会构成双花。链回滚越深,这类”来自孤儿块的幽灵输出”越多,全网络的账本校验就会陷入连锁混乱。
成熟期把这个问题干净地切掉:任何 coinbase 输出至少要等 100 个块才进入流通,而 100 个块的深度回滚在比特币主网上从来没有发生过——实际发生过的重组大多是一两个块。也就是说,规则保证了”能被花费的区块奖励”必然位于一条深到不可能被推翻的链上,孤儿块双花的窗口被彻底焊死。这与闪电网络用惩罚时间窗对付旧状态广播是同一种思路:不指望实时知道谁分叉了,而是让作恶的时间窗口先于收益关闭。
你会在哪些地方看见它
自托管全节点钱包最直观:挖矿产出刚到账时,余额面板会区分总余额与可用余额(可花费余额),未成熟的 coinbase 输出只计入前者。等第 100 个确认落地,那笔钱才会跳进可用余额。矿池用户通常感知不到这个过程,因为主流矿池普遍用矿池自己的链上交易定期给用户结算,成熟期被矿池内部账务吸收,个人拿到的已经是普通交易输出。需要区分的是:矿池如果直接把块奖励原样付给你(早期 PPLNS 变种有过类似做法),成熟期就会暴露在你自己的钱包里。
和”六确认”是不是一回事
不是一回事,但常被混为一谈。商家和交易所引用的”六确认”是行业惯例,衡量的是普通交易被回滚的实用风险;一百块成熟期是协议硬规则,只适用于区块奖励本身,而且衡量的是另一种风险:区块归属本身可能反转。普通转账即使只有 1 个确认,只要没被重组回滚,输出随时可花,没有成熟期概念;反过来,coinbase 输出哪怕确认了 99 个块,也仍然不能出现在任何交易的输入里。判断链上数据时把这两套数字分清,就不会得出”我的挖矿收益被冻结”的误判。
设计上的取舍
一百不是精确推导出来的,它是工程上的宽松安全值:按当时的经验,几十分钟的等价时间已经足够把深回滚的概率压到可忽略。规则只作用于最危险的输出类别,其余交易保持即时可花,安全性和易用性各得其所。理解成熟期,本质是理解比特币的一个底层事实:确认数不是”到账进度条”,而是”这段历史被后续工作量压得有多实”。
发表评论
还没有评论,来说两句吧。
评论区为展示样式,提交不会被处理。