先看一组区块链架构图:
目前对区块链的研究大多是针对共识层(共识算法研究)、合约层(智能和约编写,且大多也是用solidity编写以太坊部署)、加密层(对非对称加密研究偏多),网络层数据层和激励层的研究较少。
有专家提过,没有通证和代币激励机制的链是一条死链?但也有文章是这么说的,任何一个区块链项目,起码要具备:数据层、网络层、共识层,而其上的激励层、合约层、应用层确是有项目而异。比特币是第一个区块链项目上的成功应用,其最开始只有数据层、网络层、共识层和激励层。而对于fabric没有激励机制它也能被广泛应用,对于激励机制的加成,作者认为有好有坏,好在有了激励机制,用户会积极加入到区块链节点,而节点多了,对于去中心化是非常有利的,多节点实现完全去中心化化对于数据不可篡改是非常有利的,而带来的问题是,现在主流平台的激励都是需要代币消耗的。
本期针对区块链架构中的激励层展开分析以下目前主流的平台(以太坊和比特币)的激励机制,fabric目前是没有激励机制一说的,也并不需要代币加持,所以本期不涉及fabric的知识。
平台 | 比特币平台 | 以太坊平台 | Fabric平台 |
---|---|---|---|
应用层 | 比特币交易 | Dapp/以太币交易 | 企业级区块链应用 |
编程语言 | Script | Solidity/Serpent | Go/java |
沙盒环境 | EVM | Docker | |
数据结构 | Merkle树区块链表 | Merkle树 Patricia树/区块链表 | Merkle树 Patricia树/区块链表 |
数据模型 | 基于交易的模型 | 基于账户的模型 | 基于账户的模型 |
区块存储 | 文件存储 | Level DB | 文件存储 |
共识层 | POW | PoW/PoS | PBFT/SBFT |
网络层 | TCP-based P2P | TCP-based P2P | HTTP/2-based P2P |
以太坊(Ethereum ETH)
临时分叉
区块链由于是一种去中心化的技术,全世界所有的矿工同时工作,各自独立的挖掘满足要求的区块。由于是各自独立的工作,就有可能出现两个独立的矿工先后发现了两个不同的满足要求的区块,就像下面这种情况,被称为临时分叉。
注:箭头指向某区块代表它保存了前一个区块的Hash
两位矿工都发现了高度2的区块,那么该采用谁的呢?
于是撕逼开始,区块链是个势利眼,只承认最长的链,黄色和绿色的区块谁先有后继区块,变成最长的链,谁就会被承认,失败的就会被抛弃。为了成为最长的链,两个矿工都拼命的把自己挖到的区块通过广播的方式告诉更多的节点,并希望他们能把自己的区块传播得更广,从而使更多的矿工在自己挖出的区块下挖掘下一个区块,最终让自己的区块变成最长链的一部分。
然而,胜利者只有一个,胜利者写历史,失败者将被抛弃,其中的交易会重新被打包到之后的区块中。下面这张图就是绿色区块获得了胜利,黄色区块成为孤儿区块,被抛弃。
这种事其实每时每刻都在上演,并不罕见。区块如果被废弃了,其中包含的挖矿奖励怎么办呢?对比特币来说,赢者通吃,失败者一无所有,竹篮打水一场空。挖出黄区块的矿工心都要碎了,他在哭泣?。
叔块(Uncle Block)
以太坊创造了一个新的名词叔块(Uncle Block)。对高度3的区块来说,绿色区块是他的父区块。黄色区块虽然失败了,但好歹也是高度1的区块的子区块,绿区块的兄弟区块。于是,高度3的区块就尊称这个黄区块为叔叔,叔块就是这么得名的。
注意:虚线部分仅仅用来陈述关系,不表示有实际连接。
不能成为主链一部分的孤儿区块,如果有幸被后来的区块通过uncles字段收留进区块链就变成了叔块。如果一个孤儿区块没有被任何区块收留,这个孤儿区块还是会被丢弃,不会进入区块链,也就是说孤儿区块被收留后才会变成叔块。
以太坊的设计比比特币人性的多,叔块也是可以获得奖励的,矿工们再也不用担心白忙乎了。而且以后的区块谁要是把叔块收留了,收留了叔块的区块还有额外的奖励,收留叔块也被称为包含叔块。
下图就是高度3的区块包含了一个叔块,不过叔块也就仅仅是被包含而已,叔块中的交易会重新回归交易池,等待重新打包。一个区块最多只能包含2个叔块。
以太坊为什么要这么设计呢?因为以太坊的区块时间是20秒左右,相对于比特币,更容易出现临时分叉和孤儿区块。而且较短的区块时间,也使得区块在整个网络中更难以充分传播,尤其是对那些网速慢的矿工,这是一种极大的不公平。为了平衡各方利益,才设计了这样一个叔块机制。叔块在全部挖掘出来的区块中占的比例叫叔块率,目前叔块率在9.7%左右。
数据来源:The ethereum blockchain explorer
驱动着程序运行的汽油(Gas)
以太坊是一个运行智能合约的去中心化平台,提供了一个以太坊虚拟机(Ethereum Virtual Machine),简称EVM,开发者可以在其上开发各种应用。你可以把这个EVM想像成你的电脑,它能够运行一些以太坊定义的指令。与比特币的脚本引擎不同,以太坊的EVM功能非常强大,号称“图灵完备”。先不管什么是“图灵完备”,你只要知道“图灵完备”的虚拟机可以实现循环语句,有了循环就一定会有小坏蛋或者不合格的程序员弄出死循环,电脑死循环了大不了死机,重启就好,不过以太坊是去中心化的,EVM要是死循环了,可没法重启。
有没有办法能解决这个问题呢?
很遗憾,这个问题很多年前就有人研究过了,叫图灵停机问题(The Halting Problem),已经证明不存在一种能够检测程序是否会死循环的方法。
既然不能检测,还有没有别的方法阻止死循环呢?
在加油站加油的空闲,以太坊的开发者们陷入了沉思,自言自语道:为什么汽车不会一直暴走停不下来?“因为会没油!”加油的师傅边拔出加油枪边说。
这个故事只是我自己脑补的,增加点儿趣味性。
如果让EVM上的程序的每条指令都要消耗一点儿“资源”,“资源”用光了,无论程序执行完没有,都会被强行终止,这样无论是不是死循环都没关系了。
这个执行程序时要消耗的资源就被称为汽油(Gas),每一条指令都要消耗不同数量的汽油。
举几个例子:
- ADD:加法操作 3Gas
- MUL:乘法操作 5Gas
- SUB:减法操作 3Gas
- DIV:除法操作 5Gas
- HASH:计算哈希值 30Gas
越复杂的运算,需要消耗的Gas越多,只要给程序加上一个消耗Gas的上限,就可以防止程序出现死循环而不能停止的情况了。同时,以太坊还给每个区块包含的程序消耗的总Gas设定了上限,以免区块中包含的程序过多,影响一些性能比较弱的节点。每个区块能消耗的Gas上限也是可以调整的,由矿工们进行投票决定,目前是6725538Gas,也就是下图中的GAS LIMIT部分。
数据来源:Ethereum Network Status
汽油在现实生活中不是免费的,在以太坊中也不是,要用以太币购买Gas。每个程序都会给出他们愿意用多少以太币购买1单位的Gas,这被称为汽油价格(Gas Price)。
每个程序需要为Gas支付的以太币可以用如下公式计算:
Gas花费 = 消耗的Gas数量 x Gas的价格
你愿意支付的Gas价格越高,你的交易就会越快被矿工打包,这和比特币的交易费很类似。
以太坊的区块奖励
前面介绍了叔块和Gas,下面进入核心部分,以太坊的奖励机制。前面已经说过了,以太坊的区块有两种,普通区块和叔块,我们需要分情况来讨论每种区块的奖励。
普通区块奖励:
- 固定奖励5ETH,每个普通区块都有
- 区块内包含的所有程序的Gas花费的总和
- 如果普通区块包含了叔块,每包含一个叔块可以得到固定奖励5ETH的1/32,也就是0.15625ETH。
叔块奖励:
叔块的奖励计算有些复杂,公式为:
叔块奖励 = ( 叔块高度 8 - 包含叔块的区块的高度 ) * 普通区块奖励 / 8
实践一下
首先推荐一个以太坊区块浏览器Ethereum Blocks Information,这个浏览器可以很详细的查看每个区块的奖励。
我们来看一个刚挖出来的区块4222300,由于我们是在主链上看到它的,所以它是普通区块。
它的奖励包含三部分:
固定奖励:5ETH
Gas总花费(也有人称之为交易费):0.281837168043699381ETH
将两个叔块包含进来的奖励:5 * ( 1 / 32 ) * 2 = 0.3125ETH
这里有一点要注意,官方文档中的原文是“an extra reward for including uncles as part of the block”,我在2015年刚接触以太坊时不少网上的文章直接说成了“包含叔块奖励”,使我误以为是得到与挖掘出这些叔块得到的奖励等同数额的奖励,也就是上图中的Uncles Reward:8.75ETH,这是错误的,“包含叔块奖励”指的是将叔块包含进区块链这个行为的奖励,希望大家能够避免踩进这个坑。
我们再来看一个叔块0x1c2cbba0403f1079dcdb70e5971a87ce0fbc03d4572be30e2d17e4e4a0f136d5,是不是看着挺别扭,叔块不方便用高度来表示,因为同一个高度上已经有了个主链区块,就是这么惨。其实叔块也是有高度的,叔块的父区块的高度 1就是叔块的高度。
直接代入公式:
( 4222271 8 - 4222272 ) * 5 / 8 = 4.375ETH
比特币
规定在任意区块所记录的交易中,第一笔交易可以没有付款人,只有收款人(就是区块创建者的钱包地址),金额是会发生变动的。比特币系统的激励机制总共有两种:进行特定运算争夺记账权,每获得一个区块的记账权可以获得相应的奖励;bitcoin交易过程中打包区块所收取的手续费。 1、每四年时间(区块链上新增二十一万个区块左右),记账单个区块可以获得的奖励减少一半。这个数值在中本聪挖出传世区块时是50个,也就是说2009年到2013年间记账一个区块可以获得50个BTC,2013至2017年可以获得25个BTC,而从2017开始到2021可以获得的区块只有12.5个。基于BTC每四年区块产出量减半与BTC牛市波动的关系,很多人推断下一次牛市来临的时间点应该也是在2021前后。背后的经济学原理是供需关系的转变,到2021年,知道BTC的人会越来越多,对BTC感兴趣想要进行购买的人变多,而BTC的产量却在变少,供小于求之后会造成BTC价格的上涨。 2、矿工可以获得的另一部分收入来自,系统中使用BTC进行交易的人员支付的手续费用。BTC的系统大约每10分钟打包一个区块,里面包含1MB大小的交易信息记录,其中的每一笔交易信息使用人都需要向矿工支付自己的交易手续费,有的时候同一时间转账的人较多时,还需要加高手续费才能够将交易提前进行打包。只有被矿工打包通过系统运转记录在链上的交易才被称为有效交易。
那么激励机制的意义是什么呢?
激励机制在BTC这么多年的发展过程中的确是起到黄重要的作用,没有奖励,就不会有矿工去购买设备来进行挖矿,也不会有那么多的投机者相信BTC的创富神话,进而带着资金进来炒热市场,更不会有那么多人真正的开始关心BTC这个项目,乃至区块链这项技术。激励机制从本质上来说,是满足人们的底层心理需求:趋利性。想要宣传一种精神也好,还是向人们推广一款产品,其能给用户带来的价值越大,所产生的传播就越广,理念真正深入人心的可能性就会越大。 BTC激励机制的重要意义不仅在于构建起一个完整的生态体系,还有一个不那么容易发现但却意义重大的点是,激励机制为BTC系统的安全性提供保障。如果不是BTC 具有挖矿和手续费分配的激励机制,就不会有那么多的矿工花费巨大的代价去购买矿机,顶着维修费、电费、电厂租赁费去挖取BTC。没有这些激励机制,也就不会有那么多人会相信BTC在未来会持续的增值,也就不会有人愿意选择持有而不是直接出售BTC。所以,激励机制对于BTC而已是非常重要的,在安全方面尤其如此。 你或许已经知道,区块链项目分成公有链、私有链、联盟链,而激励机制在公有链中应用的最多。之所以在公有链中的激励机制最多主要的原因是公有链的治理由社区全员共同决定,社区成员既是系统的使用者,也是系统的管理者,通过激励机制让更多的人参与到社区中来,凝聚更多的共识,让区块链项目的理念向更广大的人群传播开去。而之前很多人都在争论是有币区块链有发展还是无币区块链更容易被认可,从公有链的角度出发,有币区块链其实就是有激励层,这一层对于公有链项目来说很重要,没有奖励节点怎么会有动力去维护区块链项目的正常运行。没有获利的动力,或者起码是能够覆盖成本的收益,节点是不会花费人力、物力去做记账、维护系统这些工作的。所以,激励机制对区块链非常重要,同时有币区块链是公有链的最核心方向。
参考:https://www.jianshu.com/p/f3e2f672e22d
https://zhuanlan.zhihu.com/p/28928827