前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >区块链技术与应用05 北大肖臻

区块链技术与应用05 北大肖臻

原创
作者头像
Daffy
修改2020-11-16 09:52:28
1.3K0
修改2020-11-16 09:52:28
举报

ETH-挖矿算法

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中预留的那些资产,通过出售的方式获得资产用于加密货币的开发工作。

ETH-挖矿难度调整

原来担心大家不愿意转向权益证明,但是发现权益证明问题很多,现在还没转成,结果难度炸弹越来越难,挖矿越来越难了,但是还得继续挖。新的共识机制还没有开发出来。后来出块时间从15s增加到了30s。怎么办呢?回退三百万个区块来计算,H_i'就是个假的区块号。

高峰就是回调的时刻。

以太坊发展的四个阶段。难度炸弹回调就是在拜占庭阶段进行的,同时将以太币从5个以太币降低到3个以太币。

BIP:bitcoin improvement proposal

具体代码实现。

ETH-权益证明(Proof of stake)

比特币和以太坊目前都是工作量证明,普遍的问题,费电。

挖矿的收益本质上是拼钱的。虚拟挖矿(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 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • ETH-挖矿算法
  • ETH-挖矿难度调整
  • ETH-权益证明(Proof of stake)
相关产品与服务
区块链
云链聚未来,协同无边界。腾讯云区块链作为中国领先的区块链服务平台和技术提供商,致力于构建技术、数据、价值、产业互联互通的区块链基础设施,引领区块链底层技术及行业应用创新,助力传统产业转型升级,推动实体经济与数字经济深度融合。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档