以太坊原理及实现
A. 011:Ethash算法|《ETH原理与智能合约开发》笔记
待字闺中开发了一门区块链方面的课程:《深入浅出ETH原理与智能合约开发》,马良老师讲授。此文集记录我的学习笔记。
课程共8节课。其中,前四课讲ETH原理,后四课讲智能合约。
第四课分为三部分:
这篇文章是第四课第一部分的学习笔记:Ethash算法。
在介绍Ethash算法之前,先讲一些背景知识。其实区块链技术主要是解决一个共识的问题,而共识是一个层次很丰富的概念,这里把范畴缩小,只讨论区块链中的共识。
什么是共识?
在区块链中,共识是指哪个节点有记账权。网络中有多个节点,理论上都有记账权,首先面临的问题就是,到底谁来记帐。另一个问题,交易一定是有顺序的,即谁在前,前在后。这样可以解决双花问题。区块链中的共识机制就是解决这两个问题,谁记帐和交易的顺序。
什么是工作量证明算法
为了决定众多节点中谁来记帐,可以有多种方案。其中,工作量证明就让节点去算一个哈希值,满足难度目标值的胜出。这个过程只能通过枚举计算,谁算的快,谁获胜的概率大。收益跟节点的工作量有关,这就是工作量证明算法。
为什么要引入工作量证明算法?
Hash Cash 由Adam Back 在1997年发表,中本聪首次在比特币中应用来解决共识问题。
它最初用来解决垃圾邮件问题。
其主要设计思想是通过暴力搜索,找到一种Block头部组合(通过调整nonce)使得嵌套的SHA256单向散列值输出小于一个特定的值(Target)。
这个算法是计算密集型算法,一开始从CPU挖矿,转而为GPU,转而为FPGA,转而为ASIC,从而使得算力变得非常集中。
算力集中就会带来一个问题,若有一个矿池的算力达到51%,则它就会有作恶的风险。这是比特币等使用工作量证明算法的系统的弊端。而以太坊则吸取了这个教训,进行了一些改进,诞生了Ethash算法。
Ethash算法吸取了比特币的教训,专门设计了非常不利用计算的模型,它采用了I/O密集的模型,I/O慢,计算再快也没用。这样,对专用集成电路则不是那么有效。
该算法对GPU友好。一是考虑如果只支持CPU,担心易被木马攻击;二是现在的显存都很大。
轻型客户端的算法不适于挖矿,易于验证;快速启动
算法中,主要依赖于Keccake256 。
数据源除了传统的Block头部,还引入了随机数阵列DAG(有向非循环图)(Vitalik提出)
种子值很小。根据种子值生成缓存值,缓存层的初始值为16M,每个世代增加128K。
在缓存层之下是矿工使用的数据值,数据层的初始值是1G,每个世代增加8M。整个数据层的大小是128Bytes的素数倍。
框架主要分为两个部分,一是DAG的生成,二是用Hashimoto来计算最终的结果。
DAG分为三个层次,种子层,缓存层,数据层。三个层次是逐渐增大的。
种子层很小,依赖上个世代的种子层。
缓存层的第一个数据是根据种子层生成的,后面的根据前面的一个来生成,它是一个串行化的过程。其初始大小是16M,每个世代增加128K。每个元素64字节。
数据层就是要用到的数据,其初始大小1G,现在约2个G,每个元素128字节。数据层的元素依赖缓存层的256个元素。
整个流程是内存密集型。
首先是头部信息和随机数结合在一起,做一个Keccak运算,获得初始的单向散列值Mix[0],128字节。然后,通过另外一个函数,映射到DAG上,获取一个值,再与Mix[0]混合得到Mix[1],如此循环64次,得到Mix[64],128字节。
接下来经过后处理过程,得到 mix final 值,32字节。(这个值在前面两个小节《 009:GHOST协议 》、《 010:搭建测试网络 》都出现过)
再经过计算,得出结果。把它和目标值相比较,小于则挖矿成功。
难度值大,目标值小,就越难(前面需要的 0 越多)。
这个过程也是挖矿难,验证容易。
为防止矿机,mix function函数也有更新过。
难度公式见课件截图。
根据上一个区块的难度,来推算下一个。
从公式看出,难度由三部分组成,首先是上一区块的难度,然后是线性部分,最后是非线性部分。
非线性部分也叫难度炸弹,在过了一个特定的时间节点后,难度是指数上升。如此设计,其背后的目的是,在以太坊的项目周期中,在大都会版本后的下一个版本中,要转换共识,由POW变为POW、POS混合型的协议。基金会的意思可能是使得挖矿变得没意思。
难度曲线图显示,2017年10月,难度有一个大的下降,奖励也由5个变为3个。
本节主要介绍了Ethash算法,不足之处,请批评指正。
B. eth挖矿是什么原理
凡是涉及到币,就一定离不开挖矿。以太坊网络中,想要获得以太坊,也要通过挖矿来实现。说到挖矿,就一定离不开共识机制。
不知道大家还记得比特币的共识机制是什么吗?比特币的共识机制是 PoW (这是英文 Proof of Work 的缩写,意思是“工作量证明机制”)。简单来说,就是多劳多得,你付出的计算工作越高,那么你就越有可能第一个找到正确的哈希值,就越有可能得到比特币奖励。
但是,比特币的PoW存在着一定的缺陷,就是它处理交易的速度太慢,矿工们需要不断地通过计算来碰撞哈希值,这是劳民伤财且效率低下的。对区块链知识有涉猎的朋友们应该看到这样一种说法:
以太坊为了弥补比特币的不足,提出了新的共识机制,名叫 PoS(这是英文的缩写,意思是“权益证明”,也有翻译成“股权证明”的)。
PoS 简单来讲,其实就跟它的字面意思一样:权益嘛,股权嘛,你持有的币越多相当于你的股权越多,你的权益越高。
以太坊的PoS就是说:你持币越多,你持有币的时间越久,你的计算难度就会降低,挖矿会容易一些。
在以太坊最初的设定中,以太坊希望能够通过阶段性的升级,在前期依旧采用PoW来构建一个相对稳定的系统,之后逐渐采用 PoW+PoS,最后完全过渡到 PoS。所以,说以太坊的共识机制是PoS,没错,但是PoS只是以太坊发布之初的一个计划或者说目标,目前以太坊还没有过渡到 PoS,以太坊采用的共识机制仍是 PoW,就是比特币那个 PoW,但是又和比特币的PoW稍稍不同。
这里的信息量有点大,
第一个信息点是:以太坊目前采用的共识机制也是PoW,但是和比特币的PoW稍稍不同。那么,和比特币的PoW到底有什么不同呢:简单来说,就是以太坊挖矿难度可以调节,比特币挖矿难度不能调节。就好比咱们高考,因为各个省份的教学情况、生源人数都不一样,所以高考分为全国卷和各省自主命题。
以太坊说我赞成这样分地区出题,比特币说:不行,必须全国同一卷,大家难度都一样!
通俗解释,就是,比特币是利用计算机算力做大量的哈希碰撞,列举出各种可能性,来找到一个正确哈希值。而以太坊系统呢,它有一个特殊的公式用来计算之后的每个块的难度。如果某个区块比前一个区块验证的更快,以太坊协议就会增加区块的难度。通过调整区块难度,就可以调整验证区块所需的时间。
以太坊协议规定,难度的动态调整方式是使全网创建新区块的时间间隔为 15 秒,网络用 15 秒时间创建区块链,这样一来,因为时间太快,系统的同步性就大大提升,恶意参与者很难在如此短的时间发动51%(也就是半数以上)的算力去修改历史数据。
第二个信息点是:以太坊最初的设定中,希望通过阶段性升级来最终实现由 PoW 向
PoS过渡的。
时间追溯到 2014 年,在以太坊发布之初,团队宣布将项目的发布分为四个阶段,即 Froniter(前沿)、Homestead(家园)、Metropolis(大都会)和 Serenity(宁静)。前三个阶段共识机制采用 PoW(工作量证明机制),第四个阶段切换到 PoS(权益证明机制)。
2015年7月30号,以太坊第一个阶段“前沿”正式发布,这个阶段只适用于开发者使用,开发人员可于在以太坊网络上编写智能合约和去中心化应用程序 DAPP,矿工开始进入以太坊网络维护网络安全并挖矿得到以太币。前沿版本类似于测试版,证明以太坊网络到底是不是可靠的。
2016年3月14日,以太坊进入到第二个阶段“家园”,这一阶段,以太坊提供了钱包功能,让普通用户也可以方便体验和使用以太坊。其他方面没有什么明显的技术提升,只是表明以太坊网络已经可以平稳运行。
2017 年 9 月,以太坊已经进行到第三个阶段“大都会”。“大都会”由拜占庭和君士坦丁堡两次升级组成,这个阶段的的目标是希望能够引入 PoW 和 PoS 的混合链模式,为 PoW向PoS的顺滑过渡做准备。最近比较热门的“以太坊君士坦丁堡升级”升级的就是这个,在君士坦丁堡升级中呢,以太坊将对底层协议和算法做一些改变,来为实现 PoW 和
PoS奠定良好的基础。
以太坊挖矿会得到对多少奖励呢?赢得区块创建竞争成功的矿工会得到这么几项收入:
1、 静态奖励,5个以太坊;
2、 区块内所花费的燃料成本,也就是Gas,这部分我们上一期内容讲过;
3、 作为区块组成部分,包含“叔区块”的额外奖励,叔就是叔叔的叔,每个叔区块可以得到挖矿报酬的1/32作为奖励,也就是5乘以1/32,等于0.15625 个以太坊。这里我们简单解释一下“叔区块”,“叔区块”这个概念是以太坊提出来的,为什么要引进叔块的概念?这还要从比特币说起。在比特币协议中,最长的链被认为是绝对的正确。如果一个块不是最长链的一部分,那么它被称为是“孤块”。一个孤立的块是一个块,它也是合法的,但是可能发现的稍晚,或者是网络传输稍慢,而没有能成为最长的链的一部分。在比特币中,孤块没有意义,随后将被抛弃掉,发现这个孤块的矿工也拿不到采矿相关的奖励。
但是,以太坊不认为孤块是没有价值的,以太坊系统也会给与发现孤块的矿工回报。在以太坊中,孤块被称为“叔块”(uncle block),它们可以为主链的安全作出贡献。 以太坊十几秒的出块间隔太快了,会降低安全性,通过鼓励引用叔块,使引用主链获得更多的安全保证(因为孤块本身也是合法的) ,而且,支付报酬给叔块,还能激发矿工积极挖矿,积极引用叔块,所以,以太坊认为,它是有价值的。
C. 浠ュお甯佹槸鎬庝箞鏍
浠ュお甯佹槸鎬庝箞
浠ュお甯佹槸涓绉嶆暟瀛楄揣甯侊紝瀹冩槸鍩轰簬浠ュお鍧婂尯鍧楅摼鎶鏈鍒涘缓鐨勩備互澶鍧婃槸涓绉嶅幓涓蹇冨寲鐨勮$畻骞冲彴锛屽厑璁稿紑鍙戜汉鍛樺垱寤哄垎鏁e簲鐢ㄧ▼搴忥紙DApps锛夊拰鏅鸿兘鍚堢害銆
浠ュお甯佺殑宸ヤ綔鍘熺悊绫讳技浜庢瘮鐗瑰竵锛屼絾瀹冨叿鏈夋洿澶氱殑鍔熻兘銆備互澶甯佹槸閫氳繃鈥滄寲鐭库濆垱寤虹殑锛岃繖鏄涓绉嶄娇鐢ㄨ$畻鏈虹畻鍔涜В鍐虫暟瀛﹂毦棰樼殑杩囩▼銆傝繖浜涢棶棰樿绉颁负鈥滃伐浣滈噺璇佹槑鈥濓紙ProofofWork锛夛紝姣忓綋涓涓闂棰樿瑙e喅鏃讹紝涓瀹氭暟閲忕殑浠ュお甯佸氨浼氳鐢熸垚骞跺栧姳缁欑熆宸ャ
浠ュお甯佹槸涓绉嶆湁闄愮殑璐у竵锛岀洰鍓嶉勮℃渶澶氬彲浠ュ彂琛1浜夸釜銆傝繖绉嶈揣甯佸彲浠ヨ鐢ㄤ綔鏀浠橈紝涔熷彲浠ヨ鐢ㄦ潵鏀浠樹互澶鍧婁笂鐨勬櫤鑳藉悎绾︽墽琛岃垂鐢ㄣ傛櫤鑳藉悎绾︽槸涓绉嶅湪浠ュお鍧婁笂杩愯岀殑浠g爜锛屽畠鍙浠ュ疄鐜板氱嶅姛鑳斤紝渚嬪備唬甯佸彂琛屻佹姇绁ㄣ佷紬绛圭瓑绛夈
浠ュお甯佺殑浜ゆ槗鏄鍦ㄤ互澶鍧婄綉缁滀腑杩涜岀殑锛岃繖涓杩囩▼鏄鍘讳腑蹇冨寲鐨勶紝鍥犳や氦鏄撹板綍鏄鍏寮鐨勶紝浣嗕笉娑夊強鐪熷疄韬浠戒俊鎭銆備氦鏄撶殑瀹夊叏鎬ф槸閫氳繃鍖哄潡閾炬妧鏈鐨勫姞瀵嗙畻娉曟潵淇濊瘉鐨勶紝杩欎娇寰椾互澶甯佷氦鏄撻潪甯稿畨鍏ㄥ拰闅句互绡℃敼銆
鎬荤殑鏉ヨ达紝浠ュお甯佹槸涓绉嶅幓涓蹇冨寲鐨勬暟瀛楄揣甯侊紝鍏锋湁鏇村氱殑鍔熻兘鍜屾洿骞挎硾鐨勫簲鐢ㄥ満鏅锛屽畠鍙浠ョ敤浜庢敮浠樺拰鏅鸿兘鍚堢害鎵ц岃垂鐢ㄣ
D. 浠涔堟槸浠ュお甯/浠ュお鍧奅TH锛
浠ュお鍧婏紙鑻辫锛欵thereum锛夋槸涓涓寮婧愮殑鏈夋櫤鑳藉悎绾﹀姛鑳界殑鍏鍏卞尯鍧楅摼骞冲彴銆傞氳繃鍏朵笓鐢ㄥ姞瀵嗚揣甯佷互澶甯侊紙Ether锛屽張绉扳滀互澶甯佲濓級鎻愪緵鍘讳腑蹇冨寲鐨勮櫄鎷熸満锛堢О涓衡滀互澶铏氭嫙鏈衡滶thereum Virtual Machine锛夋潵澶勭悊鐐瑰圭偣鍚堢害銆
鍧婂尯鍧楅摼涓婄殑浠e竵绉颁负浠ュお甯侊紙Ether锛夛紝浠g爜涓篍TH锛屽彲鍦ㄨ稿氬姞瀵嗚揣甯佺殑澶栨眹甯傚満涓婁氦鏄擄紝瀹冧篃鏄浠ュお鍧婁笂鐢ㄦ潵鏀浠樹氦鏄撴墜缁璐瑰拰杩愮畻鏈嶅姟鐨勫獟浠嬨
浠ュお鍧婄殑姒傚康棣栨″湪2013鑷2014骞撮棿鐢辩▼搴忓憳Vitalik Buterin锛屽彈姣旂壒甯佸惎鍙戝悗鎻愬嚭锛屽ぇ鎰忎负鈥滀笅涓浠e姞瀵嗚揣甯佷笌鍘讳腑蹇冨寲搴旂敤骞冲彴鈥濓紝鍦2014骞撮氳繃ICO浼楃瑰緱浠ュ紑濮嬪彂灞曘傛埅鑷2018骞2鏈堬紝浠ュお甯佹槸甯傚肩浜岄珮鐨勫姞瀵嗚揣甯侊紝浠呮′簬姣旂壒甯併
璧勬枡鎷撳睍锛浠ュお鍧婃渶鍒濈敱 Vitalik Buterin 鍦2013骞存彁鍑恒俈italik 鏈鏄涓鍚嶅弬涓庢瘮鐗瑰竵绀惧尯鐨勭▼搴忓憳锛屾浘鍚戞瘮鐗瑰竵鏍稿績寮鍙戜汉鍛樹富寮犳瘮鐗瑰竵骞冲彴搴旇ヨ佹湁涓鏇村畬鍠勭殑缂栫▼璇瑷璁╀汉寮鍙戠▼搴忥紝浣嗘湭寰楀埌浠栦滑鐨勫悓鎰忥紝鍥犳ゅ喅瀹氬紑鍙戜竴涓鏂扮殑骞冲彴浣滄ょ敤閫斻侭uterin 璁や负寰堝氱▼搴忛兘鍙浠ョ敤绫讳技姣旂壒甯佺殑鍘熺悊鏉ヨ揪鎴愯繘涓姝ョ殑鍙戝睍銆侭uterin 鍦2013骞村啓涓嬩簡銆婁互澶鍧婄櫧鐨涔︺嬶紝璇存槑浜嗗缓閫犲幓涓蹇冨寲绋嬪簭鐨勭洰鏍囥傜劧鍚2014骞撮氳繃缃戠粶鍏寮鍕熻祫寰楀埌寮鍙戠殑璧勯噾锛屾姇璧勪汉鐢ㄦ瘮鐗瑰竵鍚戝熀閲戜細璐涔颁互澶甯併
鏈鍒濅互澶鍧婄▼搴忔槸鐢变竴闂翠綅鍦ㄧ憺澹鐨勫叕鍙 Ethereum Switzerland GmbH 寮鍙戯紝涔嬪悗杞绉昏嚦涓涓闈炶惀鍒╂満鏋勨滀互澶鍧婂熀閲戜細鈥濓紙Ethereum Foundation锛夈
鐜板湪浠ュお鍧婃寲鐭挎敹鐩婅繖涔堥珮锛屾墜鏈虹湡鐨勫彲浠ユ寲鍒颁互澶鍧婂悧锛
浠ュお鍧婄殑鎸栫熆杩囩▼涓庢瘮鐗瑰竵鐨勫嚑涔庢槸涓鏍风殑銆侲TH閫氳繃鎸栫熆浜х敓锛屽钩鍧囨瘡15绉掍骇鐢1涓鍧楋紝鎸栫熆鐨勬椂鍊欙紝鐭垮伐浣跨敤璁$畻鏈哄幓璁$畻涓閬撳嚱鏁拌$畻棰樼殑绛旀堬紝鐩村埌鏈夌熆宸ヨ$畻鍒版g‘绛旀堝嵆瀹屾垚鍖哄潡鐨勬墦鍖呬俊鎭锛岃屼綔涓虹涓涓璁$畻鍑烘潵鐨勭熆宸ュ皢浼氬緱鍒3鏋欵TH鐨勫栧姳銆
濡傛灉鐭垮伐A鐜囧厛绠楀嚭姝g‘鐨勭瓟妗堬紝閭d箞鐭垮伐A灏嗚幏寰椾互澶甯佷綔涓哄栧姳锛屽苟鍦ㄥ叏缃戝箍鎾鍛婅瘔鎵鏈夌熆宸モ滄垜宸茬粡鎶婄瓟妗堢畻鍑烘潵浜嗏濆苟璁╂墍鏈夊湪绛旈樼殑鐭垮伐浠杩涜岄獙璇佸苟鏇存柊姝g‘绛旀堛傚傛灉鐭垮伐B绠楀嚭姝g‘绛旀堬紝閭d箞鍏朵粬鐭垮伐灏嗕細鍋滄㈠綋鍓嶇殑瑙i樿繃绋嬶紝璁板綍姝g‘绛旀堬紝骞跺紑濮嬪仛涓嬩竴閬撻橈紝鐩村埌绠楀嚭姝g‘绛旀堬紝骞朵竴鐩撮噸澶嶆よ繃绋嬨
鐭垮伐鍦ㄨ繖涓娓告垙涓寰堥毦浣滃紛銆備粬浠鏄娌℃硶浼瑁呭伐浣滃張寰楀嚭姝g‘绛旀堛傝繖灏辨槸涓轰粈涔堣繖涓瑙i樼殑杩囩▼琚绉颁负鈥滃伐浣滈噺璇佹槑鈥濓紙POW锛夈
瑙i樼殑杩囩▼澶х害姣12-15绉掞紝鐭垮伐灏变細鎸栧嚭涓涓鍖哄潡銆傚傛灉鐭垮伐鎸栫熆鐨勯熷害杩囧揩鎴栬呰繃鎱锛岀畻娉曚細鑷鍔ㄨ皟鏁撮樼洰鐨勯毦搴︼紝鎶婂嚭鍧楅熷害淇濇寔鍦13绉掑乏鍙炽
鐭垮伐鑾峰彇杩欎簺ETH甯佹槸鏈夐殢鏈烘х殑锛屾寲鐭跨殑鏀剁泭鍙栧喅浜庢姇鍏ョ殑绠楀姏锛屽氨鐩稿綋浣犵殑璁$畻鏈鸿秺澶氾紝浣犵瓟棰樼殑姝g‘鐨勬傜巼涔熷氨瓒婇珮锛屾洿瀹规槗鑾峰緱鍖哄潡濂栧姳銆
鎵嬫満缁濆逛笉鍙鑳芥寲鍒颁互澶鍧婏紝鍥犱负浠ュお鍧婂彧鑳介氳繃鐢佃剳鏄惧崱鏉ユ寲鐭裤
浠ュお鍧婃寲鐭跨殑鐭挎疆纭瀹為潪甯哥伀鐑锛屽艰嚧寰堝氫粠鏉ユ病鏈夊弬涓庤繃铏氭嫙璐у竵鎶曡祫鐨勪汉涔熷弬涓庤繘鏉ャ備粠鏌愮嶇▼搴︿笂鏉ヨ达紝褰撹秺鏉ヨ秺澶氱殑浜哄紑濮嬭窡椋庣殑鏃跺欙紝杩欎釜鏃跺欑殑琛屾儏鍙嶈屼細姣旇緝鍗遍櫓銆備互澶鍧婃寲鐭挎湰韬闇瑕佷竴瀹氱殑鎶曡祫鎴愭湰锛岃繖娆$殑鐭挎疆鍙鑳戒細瀵艰嚧寰堝氫汉鍑虹幇閲嶅ぇ浜忔崯锛屾墍浠ユ垜涓嶅缓璁澶у剁洸鐩鍙備笌杩涙潵銆
涓銆佷互澶鍧婃寲鐭垮惛寮曚簡寰堝氫汉鐨勫叧娉ㄣ
鍦ㄨ繖涓娆¤櫄鎷熻揣甯佺殑鐗涘競褰撲腑锛屾垜浠鍙浠ョ湅鍒颁互澶鍧婄殑琛ㄧ幇鐗瑰埆濂姐傚洜涓轰互澶鍧婃湰韬闇瑕丳OW鐨勬寲鐭匡紝鏈変簺浜哄紑濮嬫敹闆嗘樉鍗℃潵涓撻棬鎸栦互澶鍧娿備粠鏌愮嶇▼搴︿笂鏉ヨ达紝浠ュお鍧婃寲鐭跨‘瀹炴瘮鐐掍綔铏氭嫙璐у竵寮轰竴浜涳紝浣嗕緷鐒舵湁寰堝ぇ鐨勬姇璧勯庨櫓锛屾瘯绔熺洰鍓嶇殑鏄惧崱鎴愭湰鐗瑰埆楂樸
浜屻佷互澶鍧婁笉鑳介氳繃鎵嬫満鏉ユ寲銆
浠ュお鍧婃寲鐭跨殑妯″紡鏈韬鏄宸ヤ綔閲忕殑璇佹槑锛岃繖涓宸ヤ綔閲忛渶瑕侀氳繃鏄惧崱鐨勮$畻鏉ヨ幏寰椼備絾鍑′竴涓浜哄硅櫄鎷熻揣甯佹湁鎵浜嗚В锛岃繖涓浜哄氨涓嶄細鐩镐俊鎵嬫満鍙浠ユ寲浠ュお鍧娿傚傛灉涓涓浜鸿〃绀哄彲浠ョ敤鎵嬫満鐜╀互澶鍧婏紝杩100%鏄楠楀眬锛屼綘瑕佸皬蹇冭皑鎱庛備互澶鍧婄洰鍓嶇殑琛屾儏闈炲父鐏鐑锛屾垜涔熷缓璁澶у跺皬蹇冪湅寰呭綋鍓嶇殑琛屾儏锛屼竴瀹氫笉瑕佺洸鐩璺熼庛
涓夈佷互澶鍧婂彲浠ラ氳繃鐢佃剳鏄惧崱鏉ユ寲鐭裤
灏卞儚鎴戝湪涓婇潰鎵璁茬殑閭f牱锛屼互澶鍧婃寲鐭跨殑宸ヤ綔閫昏緫灏辨槸宸ヤ綔閲忚瘉鏄庯紝鎵浠ラ渶瑕侀氳繃鏄惧崱鏉ヨ幏寰椾互澶鍧婄殑浠e竵銆傚傛灉浣犱箣鍓嶄粠鏉ユ病鏈夊弬涓庤繃浠ュお鍧婃寲鐭匡紝鎴戜笉寤鸿浣犵幇鍦ㄥ弬涓庤繘鏉ャ傛渶蹇鍦ㄥ勾搴曠殑鏃跺欙紝浠ュお鍧婁細浠庝箣鍓嶇殑宸ヤ綔閲忚瘉鏄庤浆鍖栦负鏉冪泭璇佹槑锛岄偅涓鏃跺欏氨涓嶈兘閫氳繃鏄惧崱鏉ユ寲鐭夸簡銆傚傛灉浣犵幇鍦ㄩ夋嫨鍦ㄩ珮浣嶅弬涓庢姇璧勶紝寰堝彲鑳戒綘鐨勬湰閲戦兘鏀朵笉鍥炴潵銆
E. 浠ュお鍧婁腑Ghost鍗忚璇﹁В
浠ュお鍧婁腑鐨凣host鍗忚锛氳В鍐抽珮棰戠巼鍑哄潡甯︽潵鐨勬寫鎴
鍦ㄤ互澶鍧婄殑涓栫晫閲岋紝姣忎釜鍖哄潡鐨勮癁鐢熸爣蹇楃潃涓涓鏂版椂浠g殑寮鍚銆傜劧鑰岋紝骞冲潎15绉掔殑鍑哄潡鏃堕棿鐩歌緝浜庢瘮鐗瑰竵鐨10鍒嗛挓锛岃櫧鐒舵彁鍗囦簡绯荤粺鐨勫弽搴旈熷害鍜屽悶鍚愰噺锛屽嵈涔熷甫鏉ヤ簡鏂扮殑鎸戞垬鈥斺旈戠箒鐨勫垎鍙夈傝繖鏄涓鍦哄叧浜庢晥鐜囦笌绋冲畾鎬х殑鍗氬紙锛屽備綍鍦ㄥ揩閫熷嚭鍧楃殑鐜澧冧腑淇濇寔绯荤粺鐨勭З搴忎笌瀹夊叏鎬э紵绛旀堝氨闅愯棌鍦℅host鍗忚涔嬩腑銆
鍒嗗弶鐨勬牴婧愬湪浜庡揩閫熷嚭鍧楀甫鏉ョ殑鎸栫熆闅惧害闄嶄綆銆傛兂璞′竴涓嬶紝鐭垮伐Zarten1鍜孼arten2鍑犱箮鍚屾椂鍙戠幇鏂板尯鍧楋紝浣嗕俊鎭鍦ㄧ綉缁滀腑鐨勪紶鎾閫熷害鍙鑳芥參浜15绉掋傝繖灏卞舰鎴愪簡澶氫釜鍒嗗弶鐐癸紝姣忎釜鍒嗗弶鐐归兘鏈夊彲鑳芥垚涓烘柊鐨勪富閾俱傚ぇ鍨嬬熆姹犵殑绠楀姏浼樺娍浣垮緱浠栦滑鏇村规槗鑾峰緱鏂板尯鍧楋紝浣嗚繖鍚屾椂涔熷姞澶т簡灏忕熆宸ョ殑鍥版壈鍜岀郴缁熺殑瀹夊叏椋庨櫓銆
Ghost鍗忚鐨勭櫥鍦
涓轰簡鎵撶牬杩欎竴鍍靛眬锛屼互澶鍧婂紩鍏ヤ簡Ghost锛圙reedy Heaviest Observed Subtree锛夊崗璁銆傝繖涓鍒涙柊鐨勮В鍐虫柟妗堟簮浜嶻onatan Sompolinsky鍜孉viv Zohar鍦2013骞寸殑鏅烘収銆侴host鐨勬牳蹇冪悊蹇垫槸寮曞肩熆宸ヤ滑鍦ㄤ富閾句笂寤剁画鎸栫熆锛岃岄潪鍦ㄥ垎鍙夌偣缁х画绔炰簤锛屼粠鑰屽噺灏戜笉蹇呰佺殑鍒嗗弶銆
Ghost鍗忚鐨勫伐浣滃師鐞嗗備笅锛氬綋鍖哄潡A涔嬪悗鍑虹幇澶氫釜鍒嗗弶锛屽傚尯鍧梈arten鏈鍏堝彂甯冿紝瀹冨氨鏈夊彲鑳芥垚涓轰富閾俱傚傛灉鍚庣画鐨勫尯鍧梈arten_a鑾峰緱鐭挎潈锛屽畠浼氶夋嫨鎺ョ撼Zarten1銆乑arten2銆乑arten3绛夊彅鐖跺潡锛岀粰浜堜竴瀹氱殑濂栧姳锛岄紦鍔变粬浠鏀惧純鍦ㄨ嚜宸辩殑鍒嗘敮涓婄户缁鎸栫熆锛岃浆鑰屽姞鍏ヤ富閾俱傝繖鏍风殑鏈哄埗纭淇濅簡澶ч儴鍒嗙畻鍔涢泦涓鍦ㄤ富閾句笂锛岄檷浣庝簡榛戝㈡敾鍑荤殑鎴愭湰锛屽悓鏃舵縺鍙戜簡鐭垮伐鐨勭Н鏋佹с
鍦ㄥ栧姳鏈哄埗涓锛屽彅鐖跺潡鏄鍏抽敭銆傛瘡涓鍖哄潡鏈澶氭帴绾充袱涓鍙旂埗鍧楋紝涓斿栧姳閫掑噺锛岃窛绂昏秺杩滅殑鍙旂埗鍧楄幏寰楃殑濂栧姳瓒婂皯锛屼互姝ら紦鍔辩熆宸ュ敖鏃╁悎骞讹紝鍑忓皯鍒嗗弶銆備緥濡傦紝鎺ョ撼n涓鍙旂埗鍧楃殑鍖哄潡鍙浠ヨ幏寰楀嚭鍧楀栧姳鐨刵*1/32銆傝繖鏍风殑璁捐℃棦淇濊瘉浜嗙郴缁熺殑绋冲畾锛屽張骞宠浜嗗埄鐩婂垎閰嶃
鐪熷疄妗堜緥瑙f瀽
璁╂垜浠閫氳繃涓涓瀹炰緥鏉ョ悊瑙h繖涓澶嶆潅鏈哄埗銆傛煡鐪嬪尯鍧9634573锛岄氳繃Blockchain Explorer锛屾垜浠鐪嬪埌鍖呭惈涓涓鍙旂埗鍧楃殑鍖哄潡锛屽叾濂栧姳涓2.171342981784463037 ETH锛屽彅鐖跺潡鏈韬濂栧姳涓1.5 ETH銆傞氳繃璁$畻鍏寮忥紝鎴戜滑鍙浠ラ獙璇佸栧姳鐨勫噯纭鎬э細鍥哄畾鍑哄潡濂栧姳鍔犱笂鍖哄潡Gas璐圭敤鍜屽彅鐖跺潡濂栧姳鐨勬诲拰锛屼笌缃戠珯鏄剧ず鐨勫栧姳瀹屽叏鍚诲悎銆
Ghost鍗忚鐨勫疄鏂斤紝浣垮緱浠ュお鍧婂湪蹇閫熷嚭鍧楃殑鐜澧冧腑鎵惧埌浜嗗钩琛°傚畠涓嶄粎鏄瀵圭幇鏈夐棶棰樼殑瑙e喅锛屼篃鏄浠ュお鍧婁笉鏂浼樺寲杩浠g殑浣撶幇锛岄勭ず鐫鏈鏉ユ洿楂樻晥銆佹洿瀹夊叏鐨勭綉缁滅幆澧冦傞氳繃鐞嗚В杩欎竴鍗忚锛屾垜浠鏇磋兘娆h祻鍒颁互澶鍧婅儗鍚庣殑鎶鏈榄呭姏鍜屽伐绋嬪笀浠鐨勬櫤鎱с
F. 002:以太坊简介|《ETH原理与智能合约开发》笔记
待字闺中开发了一门区块链方面的课程:《深入浅出ETH原理与智能合约开发》,马良老师讲授。此文集记录我的学习笔记。
课程共8节课。其中,前四课讲ETH原理,后四课讲智能合约。
第一课分为四部分:
这篇文章是第一部分的学习笔记:以太坊简介。
以太坊是目前公认的区块链2.0,相比于区块链1.0(比特币),其最大的特点是引入了智能合约,从而从单一的数字加密 Token 技术转化为一个区块链分布式应用的平台。以太坊本身不包含任何具体的应用,它主要是提供基础平台和工具,使得开发者可以在其基础之上开发出各种各样的应用。可以说,以太坊有着巨大的潜力,它最终可能会发展出分布式、自动化、自组织的最高形态。
第一,我们可以通过学习以太坊的技术,领会区块链技术发展的脉络,改进的思路/路径,从而紧跟区块链技术发展的前沿,预测下一步的趋势。
第二,DAPP(分布式应用)生态系统目前的发展也是蒸蒸日上,蓬勃发展,据不完全统计,现在有数百种应用之多,显而易见的,对于开发人员的需求也是水涨船高,需要大量的开发人员。目前非常有名的应用有加密猫、各类侧链应用、ERC20 Token如币安币火币等等。
2013年,创始人 Vitalik Buterin 针对比特币存在的一些问题以及局限性,提出把“智能合约”构想应用于区块链领域,希望打造一个基于区块链的多方计算的智能化通用平台,并通过比特币融资进行开发。
2014年,以太坊基金会在瑞士成立,管理并运营整个项目。
前5大矿池占83%的算力,很集中。
目前大约有16000个全节点,其中,美国5461(34%),中国1839(11.5%),俄罗斯963(6%),德国920(5.7%),加拿大875(5.45%)。全节点每天都有动态变化。分布情况也反映出各个国家的参与热度。
G. 浠ュお鍧婃槸浠涔
浠ュお鍧婃槸浠涔堬紵浜嗚В浠ュお鍧婂尯鍧楅摼鎶鏈
浠ュお鍧婃槸鏈鐭ュ悕鐨勫尯鍧楅摼鎶鏈涔嬩竴锛岃瑾変负鍖哄潡閾炬妧鏈鐨勬湭鏉ャ傚畠鏄姣旂壒甯佸尯鍧楅摼鐨勪竴绉嶆敼杩涳紝骞跺叿鏈夋洿澶氱殑鍔熻兘鍜岀敤閫斻傛湰鏂囧皢涓烘偍浠嬬粛浠ュお鍧婃槸浠涔堬紝浠ュ強瀹冨備綍宸ヤ綔鍜屼娇鐢ㄣ
浠涔堟槸浠ュお鍧婏紵
浠ュお鍧婃槸涓绉嶅紑鏀炬簮浠g爜鐨勫幓涓蹇冨寲骞冲彴锛屼娇鐢ㄤ互澶鍧婃妧鏈鍙浠ュ疄鐜版櫤鑳藉悎绾﹀拰鍒嗗竷寮忓簲鐢ㄧ▼搴忋備互澶鍧婄殑鐩鏍囨槸涓哄紑鍙戜汉鍛樻彁渚涗竴涓瀹夊叏銆佺ǔ瀹氱殑骞冲彴锛岃╀粬浠鍙浠ヨ交鏉惧湴鍒涘缓鍜屼娇鐢ㄥ幓涓蹇冨寲搴旂敤绋嬪簭銆傚畠鏄涓涓鍔熻兘寮哄ぇ鐨勫钩鍙帮紝鍙浠ユ敼鍙橀噾铻嶃佺ぞ浼氬拰鍟嗕笟棰嗗煙銆
浠ュお鍧婃槸濡備綍宸ヤ綔鐨勶紵
浠ュお鍧婄殑涓昏佸姛鑳芥槸瀹炵幇鏅鸿兘鍚堢害銆傛櫤鑳藉悎绾︽槸涓绉嶈嚜鍔ㄦ墽琛屼唬鐮佺殑鏂规硶銆傚叾鍩烘湰鎬濇兂鏄涓虹敤鎴锋彁渚涗竴涓瀹夊叏鐨勫钩鍙帮紝浠ヤ究浠栦滑鍙浠ュ垱寤哄拰浣跨敤鏅鸿兘鍚堢害銆傛櫤鑳藉悎绾﹀彲浠ヨ╀汉浠閫氳繃缂栧啓绋嬪簭鏉ュ疄鐜拌嚜鍔ㄥ寲浜ゆ槗锛屼粠鑰屼繚鎶や粬浠鍏嶅彈娆鸿瘓鍜屽叾浠栦笉鑹琛屼负鐨勫奖鍝嶃
浜掕仈缃戠殑瀹夊叏鏄浠ュお鍧婄殑涓昏佽冭檻鍥犵礌銆備互澶鍧婂湪鍏跺伐浣滃師鐞嗕腑浣跨敤瀵嗙爜瀛﹀拰鍘讳腑蹇冨寲鎶鏈锛屼繚鎶ょ敤鎴风殑淇℃伅鍏嶅彈娆鸿瘓鍜屽悇绉嶆敾鍑荤殑褰卞搷銆傚逛簬浣跨敤鍔犲瘑璐у竵鐨勭敤鎴凤紝浠ュお鍧婃彁渚涗簡涓涓闈炲父瀹夊叏鐨勫钩鍙般
浠ュお鍧婄殑鐢ㄩ
浠ュお鍧婄殑鐢ㄩ旈潪甯稿箍娉涖傚畠琚骞挎硾搴旂敤浜庨噾铻嶃佺墿娴併佸尰鐤椼佷緵搴旈摼绛夐嗗煙锛屼互瀹炵幇鍘讳腑蹇冨寲鐨勫簲鐢ㄧ▼搴忋傚畠杩樺彲浠ョ敤浜庡垱寤烘暟瀛楄揣甯併佹父鎴忋侀煶涔愩佹姇绁ㄥ拰鍏朵粬涓撲笟搴旂敤绋嬪簭銆
浠ュお鍧婁笌姣旂壒甯佺殑鍖哄埆
浠ュお鍧婁笌姣旂壒甯佹湁璁稿氫笉鍚屼箣澶勩傞栧厛锛屾瘮鐗瑰竵涓昏佹槸涓绉嶅姞瀵嗚揣甯侊紝鑰屼互澶鍧婂垯鏄涓娆惧钩鍙帮紝鍙浠ュ疄鐜板幓涓蹇冨寲搴旂敤绋嬪簭鍜屾櫤鑳藉悎绾︺傚叾娆★紝浠ュお鍧婁娇鐢ㄧ殑鐩鏍囩畻娉曚笌姣旂壒甯佷笉鍚岋紝杩欐剰鍛崇潃瀹冨彲浠ュ勭悊鏇村氱殑浠诲姟銆傛渶鍚庯紝浠ュお鍧婄殑浜ゆ槗閫熷害鏇村揩锛屼氦鏄撹垂鐢ㄦ洿浣庛
缁撹
浠ュお鍧婃槸涓涓闈炲父鏈夊墠閫旂殑鍖哄潡閾炬妧鏈锛屽畠鎻愪緵浜嗚稿氭柊鐨勫姛鑳藉拰鐢ㄩ斻傚傛灉鎮ㄦ湁鍏磋叮浜嗚В鏇村氭湁鍏充互澶鍧婄殑淇℃伅锛岃疯繘琛岃繘涓姝ョ殑鐮旂┒锛屽苟寮濮嬫帰绱浠ュお鍧婄殑鏃犻檺鍙鑳姐
H. 以太坊stratum协议原理
参照比特币的 stratum协议 和 NiceHash的stratum协议规范 编写了一版以太坊版本的stratum协议说明.
stratum协议是目前最常用的矿机和矿池之间的TCP通讯协议。
以太坊是一个去中心化的网络架构,通过安装Mist客户端的节点来转发新交易和新区块。而矿机、矿池也同时形成了另一个网络,我们称之为矿工网络。
矿工网络分成矿机、矿池、钱包等几个主要部分,有时矿池软件与钱包安装在一起,可合称为矿池。
矿机与矿池软件之间的通讯协议是 stratum ,而矿池软件与钱包之间的通讯是 bitcoinrpc 接口。
stratum是 JSON 为数据格式.
矿机启动,首先以 mining.subscribe 方法向矿池连接,用来订阅工作。
矿池以 mining.notify 返回订阅号、ExtraNonce1和ExtraNonce2_size。
Client:
Server:
其中:
是 订阅号 ;
080c是 extranonce ,Extranonce可能最大3字节;
矿机以 mining.authorize 方法,用某个帐号和密码登录到矿池,密码可空,矿池返回 true 登录成功。该方法必须是在初始化连接之后马上进行,否则矿机得不到矿池任务。
Client:
Server:
难度调整由矿池下发给矿机,以 mining.set_difficulty 方法调整难度, params 中是难度值。
Server:
矿机会在下一个任务时采用新难度,矿池有时会马上下发一个新任务并且把清理任务设为true,以便矿机马上以新难度工作。
该命令由矿池定期发给矿机,当矿机以 mining.subscribe 方法登记后,矿池应该马上以 mining.notify 返回该任务。
Server:
任务ID : bf0488aa ;
seedhash : 。每一个任务都发送一个seedhash来支持尽可能多的矿池,这可能会很快地在货币之间交换。
headerhash : 。
boolean cleanjobs : true 。如果设为true,那么矿工需要清理任务队列,并立即开始从事新提供的任务,因为所有旧的任务分享都将导致陈旧的分享错误。如果是 false 则等当前任务结束才开始新任务。
矿工使用seedhash识别DAG,然后带着headerhash,extranonce和自己的minernonce寻找低于目标的share(这是由提供的难度而产生的)。
矿机找到合法share时,就以” mining.submit “方法向矿池提交任务。矿池返回true即提交成功,如果失败则error中有具体原因。
Client:
任务ID : bf0488aa
minernonce : 6a909d9bbc0f 。注意minernonce是6个字节,因为提供的extranonce是2个字节。如果矿池提供3字节的extranonce,那么minernonce必须是5字节
Server:
一般的矿机与矿池通讯过程就如下所示:
I. 一文了解以太坊矿机及挖矿原理
在以前的文章中,我们分别了解了比特币挖矿和以太坊挖矿的区别。本文重点介绍以太坊挖矿及矿机部分。
以太坊是一个开源的有智能合约功能的公共区块链平台,通过其专用加密货币ETH提供去中心化的以太虚拟机来处理点对点合约。目前ETH的挖矿主要是通过显卡矿机,所谓显卡矿机,其实就是类似家用台式机,只不过每台机器里面有6-10张显卡,并且没有显示器(如图)。
图:显卡矿机
之所以以太坊没有发展出类似于BTC一样的ASIC矿机,主要是由于ETH的特殊挖矿机制决定的。
在ETH挖矿过程中,会产生一个DAG文件,该文件需要一直被调用,因此必须有专门的存储空间放置。这个对于存储空间的硬性需求会导致即使生产出来了ASIC芯片,也并不能大幅度降低单位算力的成本。简单来说,就是性价比很差。
以太坊的DAG大小自2016年6月份引入Dagger-Hashimoto 算法时的1GB开始,以每年约520MB的速度增大到了现在的 3.7G,预计2020年底以太坊的DAG大小将增加至4G。届时,显存小于4G的显卡都将被陆续淘汰。
还需要介绍一点的是,由于显卡矿机的体积通常是比特币矿机的2-4倍,而消耗的电力却只有比特币矿机的1/2甚至更低,这就导致一般人不愿意修建专门的显卡矿机矿场(因为矿场主要赚取的是电费差价,同样面积的场地,可以放置的显卡数量少,消耗的电量更少)。即使有少量的显卡矿场,收取的电费成本通常也比比特币矿机矿场的高。