区块里有什么:区块头、高度、大小与区块补贴
区块由一个固定的小区块头和装着交易的区块体组成。了解区块头的六个字段、挖矿哈希的是什么,以及高度和大小的含义。
区块由什么组成?
区块分为两部分:区块头和区块体。挖矿只对区块头做哈希。
- 区块体装着交易。根据链上有多繁忙,它可能只有几百字节,也可能有好几兆字节。
- 区块头是区块的固定摘要。在大多数链上,它正好是 80 字节。
- 挖矿只对区块头做哈希,别的都不碰。
最后这一点是本文最有用的事实。矿机每秒要尝试数十亿种变化。如果每次尝试都要重新哈希一个装满交易的区块,这根本做不到。它只需重新哈希 80 字节。
区块头里的六个字段是什么?
区块头包含六个字段。每个字段都有它的用处,其中两个承担了大部分工作。
- 版本号。
- 上一个区块的哈希。
- merkle 根,一个概括所有交易的哈希。
- 时间戳。
- 难度位。
- nonce,矿工可以改动的计数器。
上一个区块的哈希让区块连成链。每个区块头都指向它前面的那个区块。改写一个旧区块会改变它的哈希。这会破坏下一个区块头,再下一个也会被破坏,一直延续到链的末端。工作量证明的整个安全性就建立在这一个字段上。
merkle 根概括了区块体中的每一笔交易。只要把一笔交易改动一个字节,merkle 根就会变。于是区块头也变了,之前尝试过的所有哈希全部作废。正因如此,80 字节才能如实代表任意大小的区块。
难度位是哈希必须低于的目标值,以压缩形式表示。时间戳大致是区块生成的时间,可能并不精确。nonce 是矿工可以随意改动的字段。正是这份自由,让搜索成为可能。
nonce 用完了会怎样?
nonce 是一个很小的计数器。现代矿机几乎瞬间就能用完它能容纳的所有值。但这不是死路。nonce 只是最容易改动的东西,从来不是唯一能改的东西。
nonce 用完后,矿机会改动区块头中的其他输入。
- 时间戳可以调整。
- coinbase 交易(区块中的第一笔交易,下文会解释)可以稍作改动。这会改变 merkle 根,从而得到一个全新的区块头去搜索。
在矿池中,extra nonce 就是干这个的。矿池给每个矿工不同的起点。这样就不会有两个矿工去算同样的数字。
什么是区块高度?
区块高度是某个区块之前已有多少个区块。创世区块,也就是第一个区块,高度为零。下一个是 1,依此类推。矿池区块页面和任何区块浏览器上每一条记录旁边的数字就是它。
高度其实并不存储在区块头里。它来自区块在链中的位置。
在大多数现代链上,高度也会写进 coinbase 交易。这条规则是后来加上的,这样两个高度不同的区块就不可能逐字节相同。不过,一个区块的高度,最权威的答案仍然是它的位置。
高度也是计算确认数的自然方式。一笔被埋在六个区块深处的交易,所在区块比链末端低六个。每多一个区块,改写它的代价就更高。
区块大小衡量的是什么?
区块大小基本上就是区块体的大小。与之相比,区块头小到可以忽略。区块大小限制关乎能装多少笔交易,与区块头无关。
满区块和空区块需要的挖矿工作完全相同。找到一个区块有多难,由难度决定。区块装多少东西,由大小决定。两者毫无关系,把它们混为一谈会让人对手续费产生很多错误的直觉。
大小确实会影响手续费市场。当想挤进区块的交易多于能装下的数量时,出价更高的交易先进去。区块里的总手续费随之上升,并直接计入区块的报酬。
什么是 coinbase 交易?
每个区块的第一笔交易都很特殊。它没有发送方。它凭空创造币,并支付给产出该区块的一方。
它叫做 coinbase 交易,与同名的交易所毫无关系。
它支付区块奖励,区块奖励由两部分组成。
- 补贴,即新发行的币。它由链的发行计划决定,在大多数币上会随时间减少。
- 区块中所有其他交易的手续费。用户附上手续费,是为了让自己的交易被打包。
在矿池中,coinbase 支付给矿池。矿池再把奖励分给该轮所有提交了份额的人。这不是绕远路。奖励以一笔不可分割的款项到账,而这正是矿池把它分给许多人的方式。
这在挖矿时为什么重要?
弄清区块的结构后,有三件事就显而易见了。这三件事都经常遇到。
- 新区块一出现,您手上的工作就立刻作废。上一个区块的哈希变了,您正在搜索的区块头已不复存在。之后再为它提交的任何东西都是过期份额,再快也无济于事。
- 矿池会经常给您发新工作。矿池每想加入一笔新交易,merkle 根就会变。更新的工作带有更多手续费,同样的付出就能换来更多奖励。
- 区块大小从不出现在收益估算中。您的收益取决于难度、补贴和手续费,与区块体的字节数无关。
矿池区块页面显示每个区块的高度、奖励和找到的时间。上面这些内容中,有用的部分就是那一行。其余的可以在区块浏览器中查看,包括支付该区块奖励的 coinbase 交易。