跳转到正文
buybitcoinsmart

术语表 /交易与手续费

Coinbase 区块高度

Coinbase 区块高度是什么?
coinbase 区块高度是区块自身的高度,写在 coinbase 字段的开头几个字节中,自2013年3月起,BIP34 要求每个区块都必须如此。

规定于 BIP-34。

这是比特币针对一个真实漏洞所采用的成本最低的修复方案。在该规则出现之前,两个 coinbase 交易完全相同的区块会产生完全相同的交易 ID,2010年的区块91,842和91,880就出现过这种情况。把高度写入其中,可使每笔 coinbase 交易都独一无二,也让任何人都能从区块本身读出它所处的位置。

运作方式

高度以脚本数据推送的形式存储,因此解析器先读取一个长度字节,再读取相应数量的字节作为数值。

该数值采用小端序写入,并按最小长度编码,与比特币脚本对任何整数的编码方式相同。在目前的区块高度下,它占三个字节,因此数据推送先是03,再是高度。所以区块840,000(减半区块)的 coinbase 以03 40 d1 0c开头:先是一个三字节的数据推送,再是840,000,最低有效字节在前。三个字节可覆盖直至8,388,607的所有高度,按每个区块十分钟计算,距今还有一个多世纪,到那一天编码会自动扩展为四个字节。

BIP34 以矿工激活的软分叉方式部署,依据区块版本号来触发。声明版本2的区块在1,000个区块的滚动窗口内计数:当最近1,000个区块中有750个达到条件时,缺少高度的版本2区块即为无效;当达到950个时,旧的版本1格式则被直接拒绝。最后一个被接受的版本1区块是227,835,时间戳为2013年3月24日,而 Bitcoin Core 至今仍将激活高度硬编码为227,931。

该规则还用一项零成本的检查取代了一项高成本的检查。BIP30 已经禁止新交易重复使用现有未花费交易的 ID,但要执行这一规定,每个区块中的每笔交易都需要查询一次数据库。一旦每笔 coinbase 交易在构造上都互不相同,就不会出现重复的 ID,因此对于切换之后挖出的所有区块,节点都会跳过这一查询。一条共识规则使验证变得更快而不是更慢,实属罕见,值得留意。

在哪里会遇到它

任何区块浏览器都会显示解码后的 coinbase,其中最先出现的就是高度。

它造成影响的场合是挖矿。矿池根据其节点提供的区块模板自行组装 coinbase 交易,如果矿池写入了错误的高度(通常发生在与刚刚到达的区块竞争之时),产出的区块就会被所有节点以bad-cb-height错误丢弃。电力已经耗费,工作量证明是有效的,但奖励为零。

对于不持有完整区块链、却需要证明某个区块相关事实的人来说,这一点同样重要。区块头不会说明自身的高度,只能通过一路回溯到创世区块来计数得知。完整区块则会写明高度,且所在位置被默克尔根覆盖,因而也被工作量证明覆盖,所以有 coinbase 和默克尔分支作为依据的高度声明可以独立成立。侧链、时间戳服务和轻客户端协议都依赖这一特性。

Coinbase 区块高度 vs 区块高度

区块高度是区块在区块链中的位置,任何人通过回溯到中本聪于2009年1月3日挖出的区块,即可数出这个数字。coinbase 区块高度则是同一个数字,因共识要求而写入区块自身的数据之中。前者是对区块所处位置的观察,后者是矿工可能写错并因此损失一个区块的字段。

请勿混淆

常见问题

为什么区块需要写明一个本可以通过计数得出的高度?

因为计数需要完整的区块链,也因为过去完全相同的 coinbase 交易会产生完全相同的交易 ID。把高度放进区块内部,可使每笔 coinbase 交易都独一无二,并使高度仅凭区块本身即可证明。

如果矿工写入了错误的高度会怎样?

所有节点都会以 bad-cb-height 错误拒绝该区块,矿工一无所获。这类错误通常出现在矿池按某一高度构建模板时,恰有竞争区块到达并使链顶发生变动。

接着阅读

相关术语

交易与手续费中的更多术语

阅读本页英文版