前言,下篇相對上篇主要就以太坊的區(qū)塊鏈架構(gòu)進(jìn)行總結(jié)绑榴,同時(shí)會(huì)結(jié)合同比特幣架構(gòu)的差異性進(jìn)行比對分析哪轿。
一、以太坊區(qū)塊鏈架構(gòu)及要素
以太坊的架構(gòu)基于比特幣翔怎,但同時(shí)是將區(qū)塊鏈作為了一個(gè)可編程的分布式信用基礎(chǔ)設(shè)施窃诉,并支持智能合約應(yīng)用,與僅作為虛擬貨幣支撐的比特幣區(qū)塊鏈有明顯優(yōu)化改進(jìn)赤套,基本架構(gòu)及要素參見下圖所示:
而相對比特幣的改進(jìn)主要體現(xiàn)在以下幾方面
1.前端部分
包括去中心化應(yīng)用飘痛、智能合約開發(fā)工具以及JS框架的引入,主要為解決相對比特幣更為復(fù)雜應(yīng)用場景或全新的領(lǐng)域開發(fā)容握,重點(diǎn)是對智能合約的支持宣脉。這部分會(huì)在后續(xù)關(guān)于智能合約開發(fā)的文章中講解,此處不展開說明唯沮。
這里僅簡單講一下DApp脖旱,DApp是由只能合約和客戶端代碼構(gòu)成,架構(gòu)上類似于傳統(tǒng)Web應(yīng)用介蛉,但是這里智能邏輯部分是運(yùn)行在區(qū)塊鏈上萌庆,客戶端代碼運(yùn)行在特殊瀏覽器Mist中。相對于傳統(tǒng)錢包的簡單支付業(yè)務(wù)币旧,為復(fù)雜的去中心化應(yīng)用的設(shè)計(jì)引入践险。
2.賬戶
以太坊引入了賬戶概念,可劃分為兩種類型:1)外部所有賬戶(EOA)吹菱,即一般意義上的用戶賬戶巍虫;2)合約賬戶(Contract),是一種特殊的可編程賬戶鳍刷,是代碼和數(shù)據(jù)的集合占遥,受代碼控制并由EOA賬戶激活。
如何理解外部所有賬戶和合約賬戶的基本區(qū)別输瓜?
一個(gè)EOA賬戶可以創(chuàng)建和使用自有私鑰對交易進(jìn)行簽名瓦胎,發(fā)送消息給另一個(gè)EOA賬戶或合約賬戶芬萍。兩個(gè)外部所有賬戶之間傳送的消息類似于比特幣的簡單支付交易僅為價(jià)值的轉(zhuǎn)移。但EOA賬戶到合約賬戶的消息會(huì)激活合約賬戶的代碼搔啊。
而合約賬戶可以執(zhí)行圖靈完備的計(jì)算任務(wù)柬祠,并可以在合約賬戶之間傳遞消息。調(diào)用時(shí)负芋,EOA賬戶需要提供一些參數(shù):EOA地址漫蛔、合約的地址以及數(shù)據(jù),數(shù)據(jù)部分則包括需要調(diào)用合約里的方法以及傳遞的參數(shù)旧蛾。
不同于EOA賬戶莽龟,合約賬戶不可以自己發(fā)起一個(gè)交易。相反蚜点,合約賬戶只有在接收到一個(gè)交易之后(從一個(gè)EOA賬戶或另一個(gè)合約賬戶處)轧房,為了響應(yīng)此交易而觸發(fā)一個(gè)交易拌阴。
直觀表示如下圖
3.區(qū)塊鏈管理及結(jié)構(gòu)
比特幣的區(qū)塊鏈組織是采用Merkle數(shù)將交易的哈希值按一定的算法組成二叉樹結(jié)構(gòu)绍绘,頂層節(jié)點(diǎn)哈希值相當(dāng)于整個(gè)交易清單的指紋用于驗(yàn)證交易清單。因?yàn)橐蕴灰肓藢ο鬆顟B(tài)管理(即上述賬戶)概念迟赃,除了交易清單還需要保存最新的狀態(tài)陪拘,進(jìn)而帶來了復(fù)雜的校驗(yàn)和查詢需求:
(1)以太坊的狀態(tài)包含一個(gè)鍵值表,即(地址-賬戶聲明對的變量)纤壁,變量包括余額左刽、隨機(jī)數(shù)、代碼和賬戶的存儲(chǔ)酌媒,賬戶的狀態(tài)可以經(jīng)常改變欠痴,其余額、隨機(jī)數(shù)也經(jīng)常變秒咨。
(2)新的賬戶可以被插入喇辽,健在存儲(chǔ)里也可以被插入和刪除。
(3)基于上述兩點(diǎn)雨席,需要引入一種可以在插入菩咨、更新和刪除操作后快速計(jì)算新的樹根哈希值,并不需要重新計(jì)算整棵樹的數(shù)據(jù)結(jié)構(gòu)陡厘。并需要具備:樹的深度是受限的以防止拒絕服務(wù)攻擊抽米;樹的根哈希只是與樹的數(shù)據(jù)有關(guān),而與更新的順序無關(guān)糙置。
滿足上述要求的實(shí)現(xiàn)即為Patricia樹
而在區(qū)塊鏈的區(qū)塊報(bào)頭中云茸,以太坊實(shí)現(xiàn)上則是存放了3個(gè)根哈希:1)交易的merkle根哈希值;2)狀態(tài)的根哈希值谤饭;3)收據(jù)的根哈希值(收據(jù)的作用會(huì)在后續(xù)部分講到)
直觀表示如下圖
還有一個(gè)和比特幣不一樣的地方标捺,以太坊的區(qū)塊鏈中每個(gè)區(qū)塊保存區(qū)塊鏈號和區(qū)塊難度(引出一個(gè)問題:作用是什么胖笛?)
在區(qū)塊鏈的構(gòu)建上,以太坊也采用了一個(gè)不同于比特幣的算法——GHOST算法宜岛,中文直譯為“貪婪最重觀察子樹”长踊,該算法使得以太坊的區(qū)塊鏈組織不是一個(gè)鏈條,而更像一棵樹萍倡。
4.工作量證明及收益
按照比特幣的挖礦設(shè)計(jì)難度身弊,整個(gè)網(wǎng)絡(luò)產(chǎn)生新區(qū)塊的速度被動(dòng)態(tài)控制在10分鐘左右,并且工作量證明僅是依靠CPU的計(jì)算難度來決定列敲。而以太坊的pow(工作量證明)算法經(jīng)過優(yōu)化相比較比特幣的工作量證明相對簡單且更為靈活阱佛。首先,新區(qū)塊的產(chǎn)生被控制在每次15s左右戴而,同時(shí)以太坊的工作量證明機(jī)制加入了內(nèi)存難度凑术,該特點(diǎn)具有抵抗針對單哈希優(yōu)化的ASIC挖礦機(jī)屬性,避免了算力局部集中化的風(fēng)險(xiǎn)所意。
而在礦工的收益方面淮逊,以太坊的獎(jiǎng)勵(lì)制度也要復(fù)雜一些。類似比特幣以太坊在產(chǎn)生一個(gè)新的區(qū)塊時(shí)會(huì)獲取一定的靜態(tài)收益(5個(gè)以太幣)扶踊,礦工還可以依靠交易用戶支付的“燃料”來獲取收益泄鹏,此外還會(huì)獲得一個(gè)產(chǎn)生“叔區(qū)塊”包含入鏈的額外獎(jiǎng)勵(lì)。
這里有必要對“燃料”和“叔區(qū)塊”做一下解釋:
“燃料”——以太坊具有圖靈完備屬性秧耗,在此基礎(chǔ)上存在對無限循環(huán)和跳轉(zhuǎn)指令惡意使用的使用的可能备籽,為了防止針對系統(tǒng)的惡意攻擊,規(guī)定需要每個(gè)交易給出最大的計(jì)算步驟分井,同時(shí)交易人需要支付一定的交易費(fèi)用給與礦工將交易加入?yún)^(qū)塊车猬,該費(fèi)用即為“燃料”〕呙“燃料”決定了交易能否有效執(zhí)行珠闰,如果交易中的實(shí)際運(yùn)行超過了最大計(jì)算步驟則燃料耗盡,交易終止同時(shí)交易費(fèi)用歸屬挖到塊區(qū)的礦工所有缩麸。
“叔區(qū)塊”——也稱為“廢塊”铸磅,是指符合以太坊難度條件產(chǎn)生的區(qū)塊,但是該區(qū)塊里的交易未被確認(rèn)而失效杭朱,這種情況通常發(fā)生在A阅仔、B礦工同時(shí)產(chǎn)生符合條件的區(qū)塊,之后因?yàn)榫W(wǎng)絡(luò)延遲確認(rèn)及區(qū)塊重組導(dǎo)致一方區(qū)塊無效時(shí)出現(xiàn)弧械“司疲“叔區(qū)塊”的引入一方面完善了因?yàn)橐蕴痪W(wǎng)絡(luò)每15s一次更新可能產(chǎn)生大量非區(qū)塊的算力浪費(fèi)的經(jīng)濟(jì)補(bǔ)償,另一方面增強(qiáng)了整個(gè)區(qū)塊量的安全性刃唐,使攻擊者不易模擬帶有廢塊的區(qū)塊鏈主鏈羞迷。
5.圖靈完備界轩、EVM(以太坊虛擬機(jī))和高級語言
以太坊相比比特幣的創(chuàng)新即引入圖靈完備,進(jìn)而使智能合約的應(yīng)用成為可能衔瓮。同時(shí)浊猾,還具備一個(gè)基礎(chǔ)計(jì)算環(huán)境——以太坊虛擬機(jī),合約代碼的執(zhí)行均在EVM上進(jìn)行热鞍。
同時(shí)葫慎,以太坊提供高級語言便于編寫智能合約,最終高級語言會(huì)被編譯成為EVM中執(zhí)行的EVM字節(jié)碼薇宠,并部署在以太網(wǎng)區(qū)塊鏈上偷办。目前有提供三種編程語言:
1)Solidity,類似JavaScript語言
2)Serpent澄港,類似Python語言椒涯,整合了低級語言的效率及易用性
3)LLL(Lisp like language),是一個(gè)像Lisp的語言回梧,設(shè)計(jì)簡約有些象匯編語言
6.合約執(zhí)行及事件
以太坊上的合約執(zhí)行是在區(qū)塊驗(yàn)證時(shí)被交易觸發(fā)的废岂,通常是接收到外部賬戶消息所激活,其執(zhí)行過程是異步的漂辐,即沒有返回值無法直接獲知結(jié)果泪喊。因此合約與外部的通信是通過日志事件實(shí)現(xiàn)的,該日志事件是交易執(zhí)行時(shí)產(chǎn)生的收據(jù)一部分髓涯。
而以太坊中的事件是一個(gè)日志和事件監(jiān)測協(xié)議的抽象,日志的記錄中提供合約的地址哈扮、一組最多4個(gè)議題和一些任意長度的二進(jìn)制數(shù)據(jù)纬纪。事件可以利用現(xiàn)有ABI(Application Binary Interface)功能解析日志記錄。
總結(jié):比特幣滑肉、以太坊的架構(gòu)分析是建立在對系統(tǒng)構(gòu)成要素及基本概念包各、相互之間作用的基礎(chǔ)之上,其中涉及諸多的工作原理靶庙、流程等內(nèi)容都未深入展開及說明问畅,后續(xù)文章中會(huì)針對各主要流程及原理進(jìn)行闡述。
附參考文章: