在Ubuntu18.04 基于以太坊搭建单机多节点私有链,本人尝试开启多个节点同时进行挖矿。发现矿工账户中出现了非整数的以太币,请教清华大佬后才知道,原来这是因为叔块的存在。
//节点01的账户余额
> web3.fromWei(eth.getBalance(eth.accounts[0]),"ether")
668.875
> web3.fromWei(eth.getBalance(eth.accounts[1]),"ether")
8
//节点02的账户余额
> web3.fromWei(eth.getBalance(eth.accounts[0]),"ether")
208.4375
> web3.fromWei(eth.getBalance(eth.accounts[1]),"ether")
0
1. 临时分叉
- 区块链由于是一种去中心化的技术,全世界所有的矿工同时工作,各自独立的挖掘满足要求的区块。由于是各自独立的工作,就有可能出现两个独立的矿工先后发现了两个不同的满足要求的区块,就像下面这种情况,被称为临时分叉。
**注意:**箭头指向某区块,代表该区块保存了自身的Hash
- 两位矿工都发现了高度2的区块,那么该采用谁的呢?区块链是个势利眼,
只承认最长的链,黄色和绿色的区块谁先有后继区块,变成最长的链,谁就会被承认,失败的就会被抛弃
。 - 为了成为最长的链,两个矿工都拼命的把自己挖到的区块通过广播的方式告诉更多的节点,并希望他们能把自己的区块传播得更广,从而使更多的矿工在自己挖出的区块下挖掘下一个区块,最终让自己的区块变成最长链的一部分。
- 然而,胜利者只有一个,胜利者写历史,失败者将被抛弃,其中的交易会重新被打包到之后的区块中。下面这张图就是绿色区块获得了胜利,黄色区块成为孤儿区块,被抛弃。
- 上图就是比特币所采用的奖励机制:
赢者通吃,失败者一无所有,竹篮打水一场空
。挖出黄区块的矿工心都要碎了,因此他在哭泣
!
2. 孤块(orphan block)
- 在比特币协议中,最长的链被认为是绝对的正确。如果一个块不是最长链的一部分,那么它被称为是
“孤块”
,就是上图中的黄色区块
。 - 一个孤块是一个块,它也是合法的,但是发现的稍晚,或者是网络传输稍慢,而没有能成为最长的链的一部分。
- 在比特币中,孤块没有意义,随后将被抛弃,发现这个孤块的矿工也拿不到采矿相关的奖励。
3. 最重的链(heaviest)
- 以太坊中的
GHOST协议
,不认为孤块没有价值,而是会给与发现孤块的矿工以回报。在以太坊中,孤块被称为“叔块”(uncle block)
,它们可以为主链的安全作出贡献。 - 相对来说,比特币有很长的块间隔时间。在比特币区块中,平均约10分钟可以得到一个确认(也就是发现一个新的后续区块)。
- 但是自从比特币成立以来,大量关于块链技术的研究已经发展起来。这些研究表明,更短的块间隔确实是可能的,而且在很多应用场景下是需要的。然而,随着拥有
更快的出块速度
,孤块的增加
而带来的昂贵的成本和浪费
也随之增加。 -
GHOST协议
不仅会支付报酬给发现叔块的矿工
,还会给打包叔块的后继矿工
奖励,引用叔块使主链更重
。因此成了下图所示的情况(这是发现*别的叔块的场景)。
- 我们统一将打包叔块的矿工称为
引用者
,产生叔块的矿工称为生产者
。 - 在比特币,最长的链是主链。在
以太坊
中,主链是指最重的链
。
4. 叔块(uncle block)
① 什么是叔块
- 根据前面的讲解可以知道,所谓的叔块是指矿工在打包区块是,发现有与自己的父区块指向相同的区块,这种块被称为叔块。
- 这里的父区块,并不是单纯地只直接父区块。比如下图所示,打包
绿色区块107
的时候,发现黄色106区块
是叔块
,黄色106区块
与自己的父区块(绿色106区块)
有相同的指向(绿色105区块
);也可能发现黄色105区块
是叔块
,黄色105区块
与自己的父区块(绿色105区块)
有相同的指向(绿色104区块
)。以此类推。
- 那么问题来了,如果发现有很多孤块与自己的高级(是指靠近创世区块)父区块有相同的指向呢?他们都是叔块吗?答案:当然不一定,哪些层次的孤块能称为叔块是有要求的!
② 哪些孤块能称为叔块?
- 以太坊中规定:位于区块的
前K层(2<= k <= 7)
的孤块,才能称为区块的叔块。 - 如上图中的
绿色107区块
,只有位于第2~7层的孤块,才是他的叔块。即只有黄色106区块
(第2层),黄色105区块
(第3层),黄色104区块
(第4层),黄色103区块
(第5层),黄色102区块
(第6层),黄色101区块
(第7层)才是绿色107区块
的叔块。黄色100区块
(第8层)不是绿色107区块
的叔块。
③ 叔块的引用要求以及对引用者的报酬
- 被引用过的叔块不能重复引用
- 引用叔块的区块,可以获得挖矿报酬的
1/32
,也就是5*1/32=0.15625 Ether
,本文默认blockReward = 5ether
。 - 区块可以不引用,或者最多引用两个叔块。因此,一个区块最多获得
2*0.15625=0.3125 Ether
的奖励。
④ 叔块被引用后,叔块生产者的报酬
- 被引用的叔块,其
叔块生产者
和叔块与引用区块之间的间隔层数
有关系。 - 叔块生产者的报酬计算公式:
fee = (uncleNumer + 8) - headerNumber)*blockReward/8
。如下图所示,headerNumber
是指107,uncleNumer
是101-106,blockReward
= 5 ether。
- 上图区块107发现不同层次的区块可以获取的报酬如下表所示,可以发现一个区块打包叔块获得的
最少报酬
为1.25 ether
。
第K层 | uncleNumer | headerNumber | 报酬比例,即 (uncleNumer + 8) - headerNumber)/8 | 报酬(ether) |
---|---|---|---|---|
2 | 106 | 107 | 7/8 | 4.375 |
3 | 105 | 107 | 6/8 | 3.75 |
4 | 104 | 107 | 5/8 | 3.125 |
5 | 103 | 107 | 4/8 | 2.5 |
6 | 102 | 107 | 3/8 | 1.875 |
7 | 101 | 107 | 2/8 | 1.25 |