Block chain is secured by mining. Bug bounty 悬赏找漏洞。
现在只能用特定的ASIC卡才能挖矿,这是不公平,违背了去中心化的理念。
中本聪提出,one CPU, one vote.普通人也能挖矿。
后面的很多加密货币要做到 ASIC resistance。增加puzzle对内存访问的需求,也就是Memory hard mining puzzle。
ASIC芯片主要优势是算力强,但是在内存访问性能和普通的显卡差距不大。
一个早期货币,莱特币(litecoin),puzzle基于scrypt,是一个对内存要求很高的哈希函数。
基本思想:开设一个很大的数组,然后按照顺序填充一些伪随机数,第一个数,有一个种子节点seed,把seed通过一些运算算的第一个数,后面每一个值都是后面取哈希值得到,用这些伪随机数填充完。特点是数组里面的数是有前后依赖关系的。
读取出A的数,经过一些取值,经过运算,算出下一次读取的位置,把B的位置读取出来,再经过运算,得到C位置。 需要读数,要保存数组,如果不保存的话,计算复杂度会大幅度上升。比如你要求A,如果没有这个数组的话,你得依次算,从头算到A。如果没有存,要读第二个还得从头算。只存奇偶数(time-memory tradeoff)
优缺点:好处,对矿工是memory hard;坏处,对轻节点也是memory hard。
所以,莱特币内存不敢设计很大,实际使用时,莱特币数组只有128K。当时莱特币目标不仅是ASIC resistance还要对GPU resistance,128K内存不足以威胁他们,所以这样来讲莱特币没有达到设计目标。早期这种目标对莱特币的冷启动还是不错的。
莱特币出块速度是两分半,除此之外,和比特币基本一样。
以太坊也是memory hard puzzle ,但是设计完全不一样。
用两个数据集,一大一小,一个16M cache小数据集,轻节点保存。生成方式跟上面差不多,从seed算出第一个值,依次取哈希。
另一个1G dataset大数据集 (DAG),矿工需要保存。1G是从16M里面生成出来的。这两个数据集是定期增大的。比如现在的大数据集已经涨到2.5G。DAG里的每个元素都是从小cacahe按照伪随机的书讯读256个值不断地迭代更新计算出一个元素的。求解puzzle用得是大数据集中的元素。按照伪随机顺序,从大的数据集中读取128个元素,根据区块块头和nonce,算出一个初始哈希,映射到大数据集的某个位置,读取出来,进行运算,算出下一个要读取的位置。每次读取的时候除了计算位置的元素还要把相邻的元素读取出来。每次读取读取相邻的元素,循环64次,每次读2个,所以一共128个数。最后算出一个哈希跟我们目标难度比较,看是否符合要求,不符合的话替换nonce。
ethash算法伪代码。
第一步,首先生成16M的cache。
第二步,通过cache生成大数据集中的元素。
第三步,生成1G大数据集的过程。
第四步,矿工用来挖矿的函数和轻节点用来验证的函数。
每次读出大数据集相邻位置两个哈希值,这两个值有什么联系吗?没有关系,这两个哈希值虽然位置相邻,但是生成过程是独立的,每个都是由前面的16M的cache中的256个数据生成的,而且这256个位置是伪随机产生的,这是构造大数据集的一个特点,每个元素独立生成。这给轻节点的验证提供了方便。
轻节点验证的full-size也是大数据集的。区别就是轻节点要从cache中生成大数据集中的这个元素。
第五步,矿工挖矿的主循环。
整个流程的伪代码,解释了为什么轻节点只需要保持cache,矿工需要保存整个大数据集(dataset)?
到目前为止,以太坊挖矿还是以GPU为主,用ASIC矿机的很少,比莱特币要成功。与以太坊需要的大内存很有关系。还有一个原因,从工作量证明(proof of work)转向权益证明(proof of stake)。到现在还没转型过来。Proof of stake,不挖矿,类似于股份制公司。
以太坊采用预挖矿(pre-mining)的过程。给早期开发者留点币。
Pre-sale,把pre-mining中预留的那些资产,通过出售的方式获得资产用于加密货币的开发工作。
原来担心大家不愿意转向权益证明,但是发现权益证明问题很多,现在还没转成,结果难度炸弹越来越难,挖矿越来越难了,但是还得继续挖。新的共识机制还没有开发出来。后来出块时间从15s增加到了30s。怎么办呢?回退三百万个区块来计算,H_i'就是个假的区块号。
高峰就是回调的时刻。
以太坊发展的四个阶段。难度炸弹回调就是在拜占庭阶段进行的,同时将以太币从5个以太币降低到3个以太币。
BIP:bitcoin improvement proposal
具体代码实现。
比特币和以太坊目前都是工作量证明,普遍的问题,费电。
挖矿的收益本质上是拼钱的。虚拟挖矿(Virtual mining)。
采用权益证明的交易货币一般在正式发布之前,会先预留一部分货币给开发者,也会出售一部分货币来换取开发这个加密货币所需要的资金。按照权益证明的共识机制,每个人按照持有的货币数量进行投票的。
优点:1.省去了挖矿的过程,避免了能耗和对环境的影响。2.基于工作量的证明,外在的资源可以转换成挖矿的算力,转换成对加密货币攻击的能力,小币种(Altcoin 除了比特币之外的小币种)容易被干死,扼杀在摇篮(Altcoin infanticide)。基于权益的证明,首先要用外在资源买到足够多的币,才可以发动攻击,如果大量买入币种,币种大涨,开发者很开心,是一个闭环。
两种方法结合。挖矿你持有的币越多,挖矿难度越小。并且用来降低挖矿难度投入的币在挖出来区块后要锁定一段时间(Proof of deposit)。
早期的基于权益证明的共识机制遇到的问题。
两边下注(nothing at stake)。
挖矿会选择一条链挖,不能让自己的算力下降,减少竞争力。然后基于权益的话,可以两边下注。
以太坊早期用的基于权益的共识机制(Casper the Friendly Finality Gadget (FFG))。
在过渡阶段要和工作量证明混合使用,为工作量证明提供 finality 。finality 是一种最终的状态,包含在finality 中的交易不会被取消。单纯基于工作量的区块是可能回滚的,缺乏finality 。
引入验证者(validator),要想成为验证者,需要交点保证金,保证金会被系统锁定。验证者的职责是推动系统达成共识,投票决定那条链是最长合法链,投票的权重取决于保证金数目的大小。每挖出100个区块作为epoch,投票决定是否可以成为一个finality。要进行 two-phase commit。第一阶段 prepare message;第二阶段 commit message。Casper 规定每一轮投票都要超过三分之二的验证者通过才能通过。
现实中的机制,减为了50个区块作为一个epoch,每个 epoch 只用一轮投票,这轮投票对上一轮叫做commit message ,对下一轮叫做prepare message,连续两个都达到2/3的多数才算有效。
验证者的工作可以得到奖励。如果不作为,扣掉一部分保证金。乱投票或者两边下注,没收全部保证金。任期满了换届,等待期大家觉得你没问题,过一段时间可以取回保证金和奖励。
Finality是验证者投出来的,有没有可能被推翻?
只凭矿工是推翻不了的。至少有三分之一的验证者两边下注才可以。
以太坊想要逐步从工作量证明达到权益证明。挖矿的奖励越来越少,验证者越来越多。工作量证明比较成熟了,权益证明还不够成熟。
EOS加密货币用的权益证明思想,用的不是Casper 协议,而是DPOS(delegated proof of stake)协议。
先用投票方式选出20个超级节点,由他们产生区块,还在调试和完善。
挖矿消耗的电并不是很多,对环境的影响有限,电很难存储和传输,把多余的电能转化成加密货币,有效化解过剩产能,带动经济发展。。。。。。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。