本系列分享一些关于区块链的深度技术见解。
区块链,作为分布式系统的一种形式,其通过区块高度建立区块链的顺序,在几乎所有基于PoW共识出块的公链系统中,都需要使用动态的难度调整机制,以在全网算力大小动态变化的情况下,控制固定的区块时间。例如在bitcoin中,区块时间被为10分钟。
那么,在中本聪设计Bitcoin之初,为何选取10分钟为区块时间?为何不选取更短的区块时间,以加快区块生产速率呢?如果这样,比特币交易的处理速度就会快得多。
Satoshi Nakamoto (比特币的发明者)自己决定,区块生产速度应保持每 10 分钟 1 个区块的稳定平均速度。这是因为,区块链估计需要 10 分钟将最新区块传播到全球所有节点,以便区块链保持适当的同步。
如果块以更快的速度生成,地球另一端的一些节点可能无法足够快地赶上最新的交易数据,这可能导致节点不再正确对齐,从而导致“叔块”(链分裂),这基本上是一个区块链必须尽可能避免的事情,以便保持安全。换言之,其目的在于防止主链频繁fork出现支链。
有好奇心的读者可能会发问,同样是PoW共识算法的以太坊,为什么可以做到17秒的区块时间呢?
以太坊通过GHOST协议来实现对区块时间的加速。幽灵协议,英文为“GHOST(Greedy Heaviest Observed Subtree) Protocol”,由 Yonatan Sompolinsky 和 Aviv Zohar 在 2013 年 12 月提出。GHOST 是一种主链选择协议,经典的 PoW 共识协议是取最长链为主链的原则,进行下区块的选择。GHOST 协议是包含子树数目最多为基本原则,进行下区块的选择,这是 GHOST 与 POW 协议的最大差异也是唯一差异。
统计上,以太坊有 10% 的分叉率。因此以太主网发生分叉后尽快合并以维护主网的同意尤为重要。
下图中,假设一个大型矿池 A 打包了一个黑色的 3 号区块,并将 3 号区块 flooding 发送出去,告知其他矿工 3 号区块已经被 A 挖掘出来了。以太坊中的出快时间是 15 秒,在 15 秒内这个 3 号区块并没有完全扩散到整个区块链网络中,因此其他没有收到这个区块的节点会继续挖掘 3 号区块。
发布了 3 号区块之后 A 继续挖 4 号区块,在此过程中 A 陆续收到了其他节点挖出的 3 号区块的通知。上图中假设 A 收到了来自其他四个节点发布的 3 号区块(上图中灰色表示,分别是 3A、3B、3C 和 3D (代表叔块而不是父块)),A 收到这四个区块之后,意识到必须尽快挖出 4 号区块以证明自己所在的链才是主链,让他们在 A 发布的 3 号黑色区块上继续挖掘 4 号区块。有什么办法让其他节点认同并合并到 A 发布的 3 号区块呢?
A 会在正在挖掘的 4 号区块上打包两笔铸币交易(因为以太坊规定每个区块最多包含 2 个对叔父区块的奖励),这两笔交易分别奖励给发布 3A 和 3B 区块的矿工,这两笔交易的价值分别是出块奖励的 7/8,即 3A 和 3B 被 A 招安,除了出块奖励以外,还能获得出块奖励额外 1/32 的奖励。
这样,3A 和 3B 在收到招安奖励后,会停止在 3A 和 3B 继续挖矿而是会在 A 的 4 号区块后挖掘,因为他们已经获得了叔块奖励,继续挖掘的意义不大。
3C 和 3D 几乎同时与 3A 和 3B 发布区块,后者得到了奖励,那么前者就要被主网抛弃吗?显然,这是不合理的。所以以太坊考虑到一个区块会发生多个分叉的情况,设计了二代叔块概念,即当在 4 号区块之后的 5 号区块的发布者可以继续招安 3C 和 3D,但是因为区块中间隔着 3 号区块,3C 和 3D 仅可以获得 6/8 的出块奖励。而 5 号区块的发布者可以获得出块奖励之外的额外 1/32 的招安奖励。
通过GHOST协议,未被包含在主链中的叔块与二代叔块同样可以获得挖矿奖励。但值得注意的是,这些叔父区块后面继续挖掘出来的区块不会得到任何奖励,这是为了激励其他区块在发现最长的区块链之后尽快进行合并。
作为系列第一篇,我们阐释了block time的含义及作用,以及在PoW共识中Bitcoin与Ethereum不同的处理方式。下一篇我们将把目光放在timestamp,讨论其在调整区块难度方面的作用,以及其潜在的不足。
参考:
1. https://www.chainnews.com/articles/795894083736.htm
2. https://blog.ethereum.org/2015/09/14/on-slow-and-fast-block-times/
3. https://www.chainnews.com/articles/910462138902.htm
4. https://medium.facilelogin.com/the-mystery-behind-block-time-63351e35603a
6. https://bitcointalk.org/index.php?topic=10241.20
7. https://en.bitcoin.it/wiki/Weaknesses
8. https://en.bitcoin.it/wiki/Block_timestamp
9. https://bitcoin.stackexchange.com/questions/20479/how-accurate-is-bitcoin-network-time
10. http://culubas.blogspot.com/2011/05/timejacking-bitcoin_802.html
11. https://blog.bitmex.com/bitcoins-block-timestamp-protection-rules/
12. https://arxiv.org/pdf/1803.09028.pdf
13. https://lists.linuxfoundation.org/pipermail/bitcoin-dev/2018-January/015677.html
14. https://mp.weixin.qq.com/s/LQqs47kBEbHqUGc3wH7G4g
15.https://github.com/ethereum/wiki/wiki/Problems/89fd07ffff8b042134e4ca67a0ce143d574016bd