【中文版】以太坊白皮書_第1頁
【中文版】以太坊白皮書_第2頁
【中文版】以太坊白皮書_第3頁
【中文版】以太坊白皮書_第4頁
【中文版】以太坊白皮書_第5頁
已閱讀5頁,還剩42頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

【中文版】以太坊白皮書翻譯:少平、Seven當(dāng)中本聰在2009年1月啟動(dòng)比特幣區(qū)塊鏈時(shí),他同時(shí)向世界引入了兩種未經(jīng)測(cè)試的革命性的新概念。第一種就是比特幣(bitcoin),一種去中心化的點(diǎn)對(duì)點(diǎn)的網(wǎng)上貨幣,在沒有任何資產(chǎn)擔(dān)保、內(nèi)在價(jià)值或者中心發(fā)行者的情況下維持著價(jià)值。到目前為止,比特幣已經(jīng)吸引了大量的公眾注意力,就政治方面而言它是一種沒有中央銀行的貨幣并且有著劇烈的價(jià)格波動(dòng)。然而,中本聰?shù)膫ゴ笤囼?yàn)還有與比特幣同等重要的一部分:基于工作量證明的區(qū)塊鏈概念使得人們可以就交易順序達(dá)成共識(shí)。作為應(yīng)用的比特幣可以被描述為一個(gè)先申請(qǐng)(力網(wǎng)-6巾心)系統(tǒng):如果某人有50BTC并且同時(shí)向A和B發(fā)送這50BTC,只有被首先被確認(rèn)的交易才會(huì)生效。沒有固有方法可以決定兩筆交易哪一筆先到,這個(gè)問題阻礙了去中心化數(shù)字貨幣的發(fā)展許多年。中本聰?shù)膮^(qū)塊鏈?zhǔn)堑谝粋€(gè)可靠的去中心化解決辦法?,F(xiàn)在,開發(fā)者們的注意力開始迅速地轉(zhuǎn)向比特幣技術(shù)的第二部分,區(qū)塊鏈怎樣應(yīng)用于貨幣以外的領(lǐng)域。常被提及的應(yīng)用包括使用鏈上數(shù)字資產(chǎn)來代表定制貨幣和金融工具(彩色幣),某種基礎(chǔ)物理設(shè)備的所有權(quán)(智能資產(chǎn)),如域名一樣的沒有可替代性的資產(chǎn)(域名幣)以及如去中心化交易所,金融衍生品,點(diǎn)到點(diǎn)賭博和鏈上身份和信譽(yù)系統(tǒng)等更高級(jí)的應(yīng)用。另一個(gè)常被問詢的重要領(lǐng)域是“智能合約”-根據(jù)事先任意制訂的規(guī)則來自動(dòng)轉(zhuǎn)移數(shù)字資產(chǎn)的系統(tǒng)。例如,一個(gè)人可能有一個(gè)存儲(chǔ)合約,形式為“A可以每天最多提現(xiàn)X個(gè)幣,B每天最多Y個(gè),A和B一起可以隨意提取,A可以停掉B的提現(xiàn)權(quán)”。這種合約的符合邏輯的擴(kuò)展就是去中心化自治組織(DAOs)-長期的包含一個(gè)組織的資產(chǎn)并把組織的規(guī)則編碼的智能合約。以太坊的目標(biāo)就是提供一個(gè)帶有內(nèi)置的成熟的圖靈完備語言的區(qū)塊鏈,用這種語言可以創(chuàng)建合約來編碼任意狀態(tài)轉(zhuǎn)換功能,用戶只要簡單地用幾行代碼來實(shí)現(xiàn)邏輯,就能夠創(chuàng)建以上提及的所有系統(tǒng)以及許多我們還想象不到的的其它系統(tǒng)??傊?,我們相信這樣的設(shè)計(jì)是邁向“加密貨幣2.0”的堅(jiān)實(shí)一步;我們希望以太坊的出現(xiàn)之于加密貨幣生態(tài)系統(tǒng)的標(biāo)志性意義,正如1995年前后Web2.0之于互聯(lián)網(wǎng)。歷史去中心化的數(shù)字貨幣概念,正如財(cái)產(chǎn)登記這樣的替代應(yīng)用一樣,早在幾十年以前就被提出來了。1980和1990年代的匿名電子現(xiàn)金協(xié)議,大部分是以喬姆盲簽技術(shù)(Chaumianblinding)為基礎(chǔ)的。這些電子現(xiàn)金協(xié)議提供具有高度隱私性的貨幣,但是這些協(xié)議都沒有流行起來,因?yàn)樗鼈兌家蕾囉谝粋€(gè)中心化的中介機(jī)構(gòu)。1998年,戴偉(WeiDai)的b-money首次引入了通過解決計(jì)算難題和去中心化共識(shí)創(chuàng)造貨幣的思想,但是該建議并未給出如何實(shí)現(xiàn)去中心化共識(shí)的具體方法。2005年,芬尼(HalFinney)引入了“可重復(fù)使用的工作量證明機(jī)制”(reusableproofsofwork)概念,它同時(shí)使用b-money的思想和AdamBack提出的計(jì)算困難的哈?,F(xiàn)金Hashcash難題來創(chuàng)造密碼學(xué)貨幣。但是,這種概念再次迷失于理想化,因?yàn)樗蕾囉诳尚湃蔚挠?jì)算作為后端。因?yàn)樨泿攀且粋€(gè)先申請(qǐng)應(yīng)用,交易的順序至關(guān)重要,所以去中心化的貨幣需要找到實(shí)現(xiàn)去中心化共識(shí)的方法。比特幣以前的所有電子貨幣協(xié)議所遇到的主要障礙是,盡管對(duì)如何創(chuàng)建安全的拜占庭問題容錯(cuò)(Byzantine-fault-tolerant)多方共識(shí)系統(tǒng)的研究已經(jīng)歷時(shí)多年,但是上述協(xié)議只解決了問題的一半。這些協(xié)議假設(shè)系統(tǒng)的所有參與者是已知的,并產(chǎn)生如“如果有N方參與到系統(tǒng)中,那么系統(tǒng)可以容忍N(yùn)/4的惡意參與者”這樣形式的安全邊界。然而這個(gè)假設(shè)的問題在于,在匿名的情況下,系統(tǒng)設(shè)置的安全邊界容易遭受女巫攻擊,因?yàn)橐粋€(gè)攻擊者可以在一臺(tái)服務(wù)器或者僵尸網(wǎng)絡(luò)上創(chuàng)建數(shù)以千計(jì)的節(jié)點(diǎn),從而單方面確保擁有多數(shù)份額。中本聰?shù)膭?chuàng)新是引入這樣一個(gè)理念:將一個(gè)非常簡單的基于節(jié)點(diǎn)的去中心化共識(shí)協(xié)議與工作量證明機(jī)制結(jié)合在一起。節(jié)點(diǎn)通過工作量證明機(jī)制獲得參與到系統(tǒng)的權(quán)利,每十分鐘將交易打包到“區(qū)塊”中,從而創(chuàng)建出不斷增長的區(qū)塊鏈。擁有大量算力的節(jié)點(diǎn)有更大的影響力,但獲得比整個(gè)網(wǎng)絡(luò)更多的算力比創(chuàng)建一百萬個(gè)節(jié)點(diǎn)困難得多。盡管比特幣區(qū)塊鏈模型非常簡陋,但是實(shí)踐證明它已經(jīng)足夠好用了,在未來五年,它將成為全世界兩百個(gè)以上的貨幣和協(xié)議的基石。作為狀態(tài)轉(zhuǎn)換系統(tǒng)的比特幣image.png從技術(shù)角度講,比特幣賬本可以被認(rèn)為是一個(gè)狀態(tài)轉(zhuǎn)換系統(tǒng),該系統(tǒng)包括所有現(xiàn)存的比特幣所有權(quán)狀態(tài)和“狀態(tài)轉(zhuǎn)換函數(shù)”。狀態(tài)轉(zhuǎn)換函數(shù)以當(dāng)前狀態(tài)和交易為輸入,輸出新的狀態(tài)。例如,在標(biāo)準(zhǔn)的銀行系統(tǒng)中,狀態(tài)就是一個(gè)資產(chǎn)負(fù)債表,一個(gè)從A賬戶向B賬戶轉(zhuǎn)賬X美元的請(qǐng)求是一筆交易,狀態(tài)轉(zhuǎn)換函數(shù)將從A賬戶中減去X美元,向B賬戶增加X美元。如果A賬戶的余額小于X美元,狀態(tài)轉(zhuǎn)換函數(shù)就會(huì)返回錯(cuò)誤提示。所以我們可以如下定義狀態(tài)轉(zhuǎn)換函數(shù):APPLY(S,TX)->S'orERROR在上面提到的銀行系統(tǒng)中,狀態(tài)轉(zhuǎn)換函數(shù)如下:APPLY({Alice:$50,Bob:$50},"send$20fromAlicetoBob")={Alice:$30,Bob:$70}但是:APPLY({Alice:$50,Bob:$50},"send$70fromAlicetoBob")=ERROR比特幣系統(tǒng)的“狀態(tài)”是所有已經(jīng)被挖出的、沒有花費(fèi)的比特幣(技術(shù)上稱為“未花費(fèi)的交易輸出,unspenttransactionoutputs或UTXO”)的集合。每個(gè)UTXO都有一個(gè)面值和所有者(由20個(gè)字節(jié)的本質(zhì)上是密碼學(xué)公鑰的地址所定義[1]方一筆交易包括一個(gè)或多個(gè)輸入和一個(gè)或多個(gè)輸出。每個(gè)輸入包含一個(gè)對(duì)現(xiàn)有UTXO的引用和由與所有者地址相對(duì)應(yīng)的私鑰創(chuàng)建的密碼學(xué)簽名。每個(gè)輸出包含一個(gè)新的加入至I」?fàn)顟B(tài)中的UTXO。在比特幣系統(tǒng)中,狀態(tài)轉(zhuǎn)換函數(shù)APPLY(S,TX)->S,大體上可以如下定義:交易的每個(gè)輸入:如果引用的UTXO不存在于現(xiàn)在的狀態(tài)中(S),返回錯(cuò)誤提示如果簽名與UTXO所有者的簽名不一致,返回錯(cuò)誤提示如果所有的UTXO輸入面值總額小于所有的UTXO輸出面值總額,返回錯(cuò)誤提示返回新狀態(tài)S’,新狀態(tài)S中移除了所有的輸入U(xiǎn)TXO,增加了所有的輸出UTXO。第一步的第一部分防止交易的發(fā)送者花費(fèi)不存在的比特幣,第二部分防止交易的發(fā)送者花費(fèi)其他人的比特幣。第二步確保價(jià)值守恒。比特幣的支付協(xié)議如下。假設(shè)Alice想給Bob發(fā)送11.7BTC。事實(shí)上,Alice不可能正好有11.7BTC。假設(shè),她能得到的最小數(shù)額比特幣的方式是:6+4+2=12。所以,她可以創(chuàng)建一筆有3個(gè)輸入,2個(gè)輸出的交易。第一個(gè)輸出的面值是11.7BTC,所有者是Bob(Bob的比特幣地址),第二個(gè)輸出的面值是0.3BTC,所有者是Alice自己,也就是找零。挖礦image.png如果我們擁有可信任的中心化服務(wù)機(jī)構(gòu),狀態(tài)轉(zhuǎn)換系統(tǒng)可以很容易地實(shí)現(xiàn),可以簡單地將上述功能準(zhǔn)確編碼。然而,我們想把比特幣系統(tǒng)建成為去中心化的貨幣系統(tǒng),為了確保每個(gè)人都同意交易的順序,我們需要將狀態(tài)轉(zhuǎn)換系統(tǒng)與一個(gè)共識(shí)系統(tǒng)結(jié)合起來。比特幣的去中心化共識(shí)進(jìn)程要求網(wǎng)絡(luò)中的節(jié)點(diǎn)不斷嘗試將交易打包成“區(qū)塊”。網(wǎng)絡(luò)被設(shè)計(jì)為大約每十分鐘產(chǎn)生一個(gè)區(qū)塊,每個(gè)區(qū)塊包含一個(gè)時(shí)間戳、一個(gè)隨機(jī)數(shù)、一個(gè)對(duì)上一個(gè)區(qū)塊的引用(即哈希)和上一區(qū)塊生成以來發(fā)生的所有交易列表。這樣隨著時(shí)間流逝就創(chuàng)建出了一個(gè)持續(xù)增長的區(qū)塊鏈,它不斷地更新,從而能夠代表比特幣賬本的最新狀態(tài)。依照這個(gè)范式,檢查一個(gè)區(qū)塊是否有效的算法如下:檢查區(qū)塊引用的上一個(gè)區(qū)塊是否存在且有效。檢查區(qū)塊的時(shí)間戳是否晚于以前的區(qū)塊的時(shí)間戳,而且早于未來2小時(shí)[2]。檢查區(qū)塊的工作量證明是否有效。將上一個(gè)區(qū)塊的最終狀態(tài)賦于S[0]。假設(shè)TX是區(qū)塊的交易列表,包含n筆交易。對(duì)于屬于0……n-1的所有i,進(jìn)行狀態(tài)轉(zhuǎn)換S[i+1]=APPLY(S[i],TX[i])。如果任何一筆交易i在狀態(tài)轉(zhuǎn)換中出錯(cuò),退出程序,返回錯(cuò)誤。返回正確,狀態(tài)S[n]是這一區(qū)塊的最終狀態(tài)。本質(zhì)上,區(qū)塊中的每筆交易必須提供一個(gè)正確的狀態(tài)轉(zhuǎn)換,要注意的是「狀態(tài)”并不是編碼到區(qū)塊的。它純粹只是被校驗(yàn)節(jié)點(diǎn)記住的抽象概念,對(duì)于任意區(qū)塊都可以從創(chuàng)世狀態(tài)開始,按順序加上每一個(gè)區(qū)塊的每一筆交易,(妥妥地)計(jì)算出當(dāng)前的狀態(tài)。另外,需要注意礦工將交易收錄進(jìn)區(qū)塊的順序。如果一個(gè)區(qū)塊中有A、B兩筆交易,B花費(fèi)的是A創(chuàng)建的UTXO,如果A在B以前,這個(gè)區(qū)塊是有效的,否則,這個(gè)區(qū)塊是無效的。區(qū)塊驗(yàn)證算法的有趣部分是“工作量證明”概念:對(duì)每個(gè)區(qū)塊進(jìn)行SHA256哈希處理,將得到的哈希視為長度為256比特的數(shù)值,該數(shù)值必須小于不斷動(dòng)態(tài)調(diào)整的目標(biāo)數(shù)值,本書寫作時(shí)目標(biāo)數(shù)值大約是2八190。工作量證明的目的是使區(qū)塊的創(chuàng)建變得困難,從而阻止女巫攻擊者惡意重新生成區(qū)塊鏈。因?yàn)镾HA256是完全不可預(yù)測(cè)的偽隨機(jī)函數(shù),創(chuàng)建有效區(qū)塊的唯一方法就是簡單地不斷試錯(cuò),不斷地增加隨機(jī)數(shù)的數(shù)值,查看新的哈希數(shù)值是否小于目標(biāo)數(shù)值。如果當(dāng)前的目標(biāo)數(shù)值是2八192,就意味著平均需要嘗試2八64次才能生成有效的區(qū)塊。一般而言,比特幣網(wǎng)絡(luò)每隔2016個(gè)區(qū)塊重新設(shè)定目標(biāo)數(shù)值,保證平均每十分鐘生成一個(gè)區(qū)塊。為了對(duì)礦工的計(jì)算工作進(jìn)行獎(jiǎng)勵(lì),每一個(gè)成功生成區(qū)塊的礦工有權(quán)在區(qū)塊中包含一筆憑空發(fā)給他們自己25BTC的交易。另外,如果交易的輸入大于輸出,差額部分就作為“交易費(fèi)用”付給礦工。順便提一下,對(duì)礦工的獎(jiǎng)勵(lì)是比特幣發(fā)行的唯一機(jī)制,創(chuàng)世狀態(tài)中并沒有比特幣。為了更好地理解挖礦的目的,讓我們分析比特幣網(wǎng)絡(luò)出現(xiàn)惡意攻擊者時(shí)會(huì)發(fā)生什么。因?yàn)楸忍貛诺拿艽a學(xué)基礎(chǔ)是非常安全的,所以攻擊者會(huì)選擇攻擊沒有被密碼學(xué)直接保護(hù)的部分:交易順序。攻擊者的策略非常簡單:向賣家發(fā)送100BTC購買商品(尤其是無需郵寄的電子商品)。等待直至商品發(fā)出。創(chuàng)建另一筆交易,將相同的100BTC發(fā)送給自己的賬戶。使比特幣網(wǎng)絡(luò)相信發(fā)送給自己賬戶的交易是最先發(fā)出的。一旦步驟(1)發(fā)生,幾分鐘后礦工將把這筆交易打包到區(qū)塊,假設(shè)是第270000個(gè)區(qū)塊。大約一個(gè)小時(shí)以后,在此區(qū)塊后面將會(huì)有五個(gè)區(qū)塊,每個(gè)區(qū)塊間接地指向這筆交易,從而確認(rèn)這筆交易。這時(shí)賣家收到貨款,并向買家發(fā)貨。因?yàn)槲覀兗僭O(shè)這是數(shù)字商品,攻擊者可以即時(shí)收到貨?,F(xiàn)在,攻擊者創(chuàng)建另一筆交易,將相同的100BTC發(fā)送到自己的賬戶。如果攻擊者只是向全網(wǎng)廣播這一消息,這一筆交易不會(huì)被處理。礦工會(huì)運(yùn)行狀態(tài)轉(zhuǎn)換函數(shù)APPLY(S,TX),發(fā)現(xiàn)這筆交易將花費(fèi)已經(jīng)不在狀態(tài)中的UTXO。所以,攻擊者會(huì)對(duì)區(qū)塊鏈進(jìn)行分叉,將第269999個(gè)區(qū)塊作為父區(qū)塊重新生成第270000個(gè)區(qū)塊,在此區(qū)塊中用新的交易取代舊的交易。因?yàn)閰^(qū)塊數(shù)據(jù)是不同的,這要求重新進(jìn)行工作量證明。另外,因?yàn)楣粽呱傻男碌牡?70000個(gè)區(qū)塊有不同的哈希,所以原來的第270001到第270005的區(qū)塊不指向它,因此原有的區(qū)塊鏈和攻擊者的新區(qū)塊是完全分離的。在發(fā)生區(qū)塊鏈分叉時(shí),區(qū)塊鏈長的分支被認(rèn)為是誠實(shí)的區(qū)塊鏈,合法的的礦工將會(huì)沿著原有的第270005區(qū)塊后挖礦,只有攻擊者一人在新的第270000區(qū)塊后挖礦。攻擊者為了使得他的區(qū)塊鏈最長,他需要擁有比除了他以外的全網(wǎng)更多的算力來追趕(即51%攻擊)。默克爾樹圖1圖1:僅提供默克爾樹(Merkletree)上的少量節(jié)點(diǎn)已經(jīng)足夠給出分支的合法證明。圖2圖2:任何對(duì)于默克爾樹的任何部分進(jìn)行改變的嘗試都會(huì)最終導(dǎo)致鏈上某處的不一致。比特幣系統(tǒng)的一個(gè)重要的可擴(kuò)展特性是:它的區(qū)塊存儲(chǔ)在多層次的數(shù)據(jù)結(jié)構(gòu)中。一個(gè)區(qū)塊的哈希實(shí)際上只是區(qū)塊頭的哈希,區(qū)塊頭是包含時(shí)間戳、隨機(jī)數(shù)、上個(gè)區(qū)塊哈希和存儲(chǔ)了所有的區(qū)塊交易的默克爾樹的根哈希的長度大約為200字節(jié)的一段數(shù)據(jù)。默克爾樹是一種二叉樹,由一組葉節(jié)點(diǎn)、一組中間節(jié)點(diǎn)和一個(gè)根節(jié)點(diǎn)構(gòu)成。最下面的大量的葉節(jié)點(diǎn)包含基礎(chǔ)數(shù)據(jù),每個(gè)中間節(jié)點(diǎn)是它的兩個(gè)子節(jié)點(diǎn)的哈希,根節(jié)點(diǎn)也是由它的兩個(gè)子節(jié)點(diǎn)的哈希,代表了默克爾樹的頂部。默克爾樹的目的是允許區(qū)塊的數(shù)據(jù)可以零散地傳送:節(jié)點(diǎn)可以從一個(gè)源下載區(qū)塊頭,從另外的源下載與其有關(guān)的樹的其它部分,而依然能夠確認(rèn)所有的數(shù)據(jù)都是正確的。之所以如此是因?yàn)楣O蛏系臄U(kuò)散:如果一個(gè)惡意用戶嘗試在樹的下部加入一個(gè)偽造的交易,所引起的改動(dòng)將導(dǎo)致樹的上層節(jié)點(diǎn)的改動(dòng),以及更上層節(jié)點(diǎn)的改動(dòng),最終導(dǎo)致根節(jié)點(diǎn)的改動(dòng)以及區(qū)塊哈希的改動(dòng),這樣協(xié)議就會(huì)將其記錄為一個(gè)完全不同的區(qū)塊(幾乎可以肯定是帶著不正確的工作量證明的)。默克爾樹協(xié)議對(duì)比特幣的長期持續(xù)性可以說是至關(guān)重要的。在2014年4月,比特幣網(wǎng)絡(luò)中的一個(gè)全節(jié)點(diǎn)-存儲(chǔ)和處理所有區(qū)塊的全部數(shù)據(jù)的節(jié)點(diǎn)-需要占用15GB的內(nèi)存空間,而且還以每個(gè)月超過1GB的速度增長。目前,這一存儲(chǔ)空間對(duì)臺(tái)式計(jì)算機(jī)來說尚可接受,但是手機(jī)已經(jīng)負(fù)載不了如此巨大的數(shù)據(jù)了。未來只有商業(yè)機(jī)構(gòu)和愛好者才會(huì)充當(dāng)完整節(jié)點(diǎn)。簡化支付確認(rèn)(SPV)協(xié)議允許另一種節(jié)點(diǎn)存在,這樣的節(jié)點(diǎn)被成為“輕節(jié)點(diǎn)”,它下載區(qū)塊頭,使用區(qū)塊頭確認(rèn)工作量證明,然后只下載與其交易相關(guān)的默克爾樹“分支”。這使得輕節(jié)點(diǎn)只要下載整個(gè)區(qū)塊鏈的一小部分就可以安全地確定任何一筆比特幣交易的狀態(tài)和賬戶的當(dāng)前余額。其它的區(qū)塊鏈應(yīng)用將區(qū)塊鏈的思想應(yīng)用到其它領(lǐng)域的想法早就出現(xiàn)了。在2005年,尼克薩博提出了“用所有權(quán)為財(cái)產(chǎn)冠名”的概念,文中描述了復(fù)制數(shù)據(jù)庫技術(shù)的發(fā)展如何使基于區(qū)塊鏈的系統(tǒng)可以應(yīng)用于登記土地所有權(quán),創(chuàng)建包括例如房產(chǎn)權(quán)、違法侵占和喬治亞州土地稅等概念的詳細(xì)框架。然而,不幸的是在那時(shí)還沒有實(shí)用的復(fù)制數(shù)據(jù)庫系統(tǒng),所以這個(gè)協(xié)議被沒有被付諸實(shí)踐。不過,自2009年比特幣系統(tǒng)的去中心化共識(shí)開發(fā)成功以來,許多區(qū)塊鏈的其它應(yīng)用開始快速出現(xiàn)。域名幣(namecoin)-創(chuàng)建于2010年,被稱為去中心化的名稱注冊(cè)數(shù)據(jù)庫。像Tor、Bitcoin和BitMessage這樣的去中心化協(xié)議,需要一些確認(rèn)賬戶的方法,這樣其他人才能夠與用戶進(jìn)行交互。但是,在所有的現(xiàn)存的解決方案中僅有的可用的身份標(biāo)識(shí)是象1LW79wp5ZBqaHW1jL5TciBCrhQYtHagUWy這樣的偽隨機(jī)哈希。理想的情況下,人們希望擁有一個(gè)帶有象“george”這樣的名稱的賬戶。然而,問題是如果有人可以創(chuàng)建“george”賬戶,那么其他人同樣也可以創(chuàng)建“george”賬戶來假扮。唯一的解決方法是先申請(qǐng)?jiān)瓌t(first-to-file),只有第一個(gè)注冊(cè)者可以成功注冊(cè),第二個(gè)不能再次注冊(cè)同一個(gè)賬戶。這一問題就可以利用比特幣的共識(shí)協(xié)議。域名幣是利用區(qū)塊鏈實(shí)現(xiàn)名稱注冊(cè)系統(tǒng)的最早的、最成功的系統(tǒng)。彩色幣(Coloredcoins)-彩色幣的目的是為人們?cè)诒忍貛艆^(qū)塊鏈上創(chuàng)建自己的數(shù)字貨幣,或者,在更重要的一般意義上的貨幣-數(shù)字令牌提供服務(wù)。依照彩色幣協(xié)議,人們可以通過為某一特別的比特幣UTXO指定顏色,發(fā)行新的貨幣。該協(xié)議遞歸地將其它UTXO定義為與交易輸入U(xiǎn)TXO相同的顏色。這就允許用戶保持只包含某一特定顏色的UTXO,發(fā)送這些UTXO就像發(fā)送普通的比特幣一樣,通過回溯全部的區(qū)塊鏈判斷收到的UTXO顏色。元幣(Metacoins)-元幣的理念是在比特幣區(qū)塊鏈上創(chuàng)建新的協(xié)議,利用比特幣的交易保存元幣的交易,但是采用了不同的狀態(tài)轉(zhuǎn)換函數(shù)APPLY’。因?yàn)樵獛艆f(xié)議不能阻止比特幣區(qū)塊鏈上的無效的元幣交易,所以增加一個(gè)規(guī)則如果APPLY'(S,TX)返回錯(cuò)誤這一協(xié)議將默認(rèn)APPLY'(S,TX)=S。這為創(chuàng)建任意的、先進(jìn)的不能在比特幣系統(tǒng)中實(shí)現(xiàn)的密碼學(xué)貨幣協(xié)議提供了一個(gè)簡單的解決方法,而且開發(fā)成本非常低,因?yàn)橥诘V和網(wǎng)絡(luò)的問題已經(jīng)由比特幣協(xié)議處理好了。因此,一般而言,建立共識(shí)協(xié)議有兩種方法:建立一個(gè)獨(dú)立的網(wǎng)絡(luò)和在比特幣網(wǎng)絡(luò)上建立協(xié)議。雖然像域名幣這樣的應(yīng)用使用第一種方法已經(jīng)獲得了成功,但是該方法的實(shí)施非常困難,因?yàn)槊恳粋€(gè)應(yīng)用需要?jiǎng)?chuàng)建獨(dú)立的區(qū)塊鏈和建立、測(cè)試所有狀態(tài)轉(zhuǎn)換和網(wǎng)絡(luò)代碼。另外,我們預(yù)測(cè)去中心化共識(shí)技術(shù)的應(yīng)用將會(huì)服從事律分布,大多數(shù)的應(yīng)用太小不足以保證自由區(qū)塊鏈的安全,我們還注意到大量的去中心化應(yīng)用,尤其是去中心化自治組織,需要進(jìn)行應(yīng)用之間的交互。另一方面,基于比特幣的方法存在缺點(diǎn),它沒有繼承比特幣可以進(jìn)行簡化確認(rèn)支付(SPV)的特性。比特幣可以實(shí)現(xiàn)簡化確認(rèn)支付,因?yàn)楸忍貛趴梢詫^(qū)塊鏈深度作為有效性確認(rèn)代理。在某一點(diǎn)上,一旦一筆交易的祖先們距離現(xiàn)在足夠遠(yuǎn)時(shí),就可以認(rèn)為它們是合法狀態(tài)的一部分。與之相反,基于比特幣區(qū)塊鏈的元幣協(xié)議不能強(qiáng)迫區(qū)塊鏈不包括不符合元幣協(xié)議的交易。因此,安全的元幣協(xié)議的簡化支付確認(rèn)需要后向掃描所有的區(qū)塊,直到區(qū)塊鏈的初始點(diǎn),以確認(rèn)某一交易是否有效。目前,所有基于比特幣的元幣協(xié)議的“輕”實(shí)施都依賴可信任的服務(wù)器提供數(shù)據(jù),這對(duì)主要目的之一是消除信任需要的密碼學(xué)貨幣而言,只是一個(gè)相當(dāng)次優(yōu)的結(jié)果。腳本即使不對(duì)比特幣協(xié)議進(jìn)行擴(kuò)展,它也能在一定程度上實(shí)現(xiàn)”智能合約”。比特幣的UTXO可以被不只被一個(gè)公鑰擁有,也可以被用基于堆棧的編程語言所編寫的更加復(fù)雜的腳本所擁有。在這一模式下,花費(fèi)這樣的UTXO,必須提供滿足腳本的數(shù)據(jù)。事實(shí)上,基本的公鑰所有權(quán)機(jī)制也是通過腳本實(shí)現(xiàn)的:腳本將橢圓曲線簽名作為輸入,驗(yàn)證交易和擁有這一UTXO的地址,如果驗(yàn)證成功,返回1,否則返回0。更加復(fù)雜的腳本用于其它不同的應(yīng)用情況。例如,人們可以創(chuàng)建要求集齊三把私鑰中的兩把才能進(jìn)行交易確認(rèn)的腳本(多重簽名),對(duì)公司賬戶、儲(chǔ)蓄賬戶和某些商業(yè)代理來說,這種腳本是非常有用的。腳本也能用來對(duì)解決計(jì)算問題的用戶發(fā)送獎(jiǎng)勵(lì)。人們甚至可以創(chuàng)建這樣的腳本“如果你能夠提供你已經(jīng)發(fā)送一定數(shù)額的的狗幣給我的簡化確認(rèn)支付證明,這一比特幣UTXO就是你的了”,本質(zhì)上,比特幣系統(tǒng)允許不同的密碼學(xué)貨幣進(jìn)行去中心化的兌換。然而,比特幣系統(tǒng)的腳本語言存在一些嚴(yán)重的限制:缺少圖靈完備性-這就是說,盡管比特幣腳本語言可以支持多種計(jì)算,但是它不能支持所有的計(jì)算。最主要的缺失是循環(huán)語句。不支持循環(huán)語句的目的是避免交易確認(rèn)時(shí)出現(xiàn)無限循環(huán)。理論上,對(duì)于腳本程序員來說,這是可以克服的障礙,因?yàn)槿魏窝h(huán)都可以用多次重復(fù)if語句的方式來模擬,但是這樣做會(huì)導(dǎo)致腳本空間利用上的低效率,例如,實(shí)施一個(gè)替代的橢圓曲線簽名算法可能將需要256次重復(fù)的乘法,而每次都需要單獨(dú)編碼。價(jià)值盲(Value-blindness)。UTXO腳本不能為賬戶的取款額度提供精細(xì)的的控制。例如,預(yù)言機(jī)合約(oraclecontract)的一個(gè)強(qiáng)大應(yīng)用是對(duì)沖合約,A和B各自向?qū)_合約中發(fā)送價(jià)值1000美元的比特幣,30天以后,腳本向A發(fā)送價(jià)值1000美元的比特幣,向B發(fā)送剩余的比特幣。雖然實(shí)現(xiàn)對(duì)沖合約需要一個(gè)預(yù)言機(jī)(oracle)決定一比特幣值多少美元,但是與現(xiàn)在完全中心化的解決方案相比,這一機(jī)制已經(jīng)在減少信任和基礎(chǔ)設(shè)施方面有了巨大的進(jìn)步。然而,因?yàn)閁TXO是不可分割的,為實(shí)現(xiàn)此合約,唯一的方法是非常低效地采用許多有不同面值的UTXO(例如對(duì)應(yīng)于最大為30的每個(gè)k,有一個(gè)2”的UTXO)并使預(yù)言機(jī)挑出正確的UTXO發(fā)送給A和B。缺少狀態(tài)-UTXO只能是已花費(fèi)或者未花費(fèi)狀態(tài),這就沒有給需要任何其它內(nèi)部狀態(tài)的多階段合約或者腳本留出生存空間。這使得實(shí)現(xiàn)多階段期權(quán)合約、去中心化的交換要約或者兩階段加密承諾協(xié)議(對(duì)確保計(jì)算獎(jiǎng)勵(lì)非常必要)非常困難。這也意味著UTXO只能用于建立簡單的、一次性的合約,而不是例如去中心化組織這樣的有著更加復(fù)雜的狀態(tài)的合約,使得元協(xié)議難以實(shí)現(xiàn)。二元狀態(tài)與價(jià)值盲結(jié)合在一起意味著另一個(gè)重要的應(yīng)用-取款限額-是不可能實(shí)現(xiàn)的。區(qū)塊鏈盲(Blockchain-blindness)-UTXO看不到區(qū)塊鏈的數(shù)據(jù),例如隨機(jī)數(shù)和上一個(gè)區(qū)塊的哈希。這一缺陷剝奪了腳本語言所擁有的基于隨機(jī)性的潛在價(jià)值,嚴(yán)重地限制了博彩等其它領(lǐng)域應(yīng)用。我們已經(jīng)考察了在密碼學(xué)貨幣上建立高級(jí)應(yīng)用的三種方法:建立一個(gè)新的區(qū)塊鏈,在比特幣區(qū)塊鏈上使用腳本,在比特幣區(qū)塊鏈上建立元幣協(xié)議。建立新區(qū)塊鏈的方法可以自由地實(shí)現(xiàn)任意的特性,成本是開發(fā)時(shí)間和培育努力。使用腳本的方法非常容易實(shí)現(xiàn)和標(biāo)準(zhǔn)化,但是它的能力有限。元幣協(xié)議盡管非常容易實(shí)現(xiàn),但是存在擴(kuò)展性差的缺陷。在以太坊系統(tǒng)中,我們的目的是建立一個(gè)能夠同時(shí)具有這三種模式的所有優(yōu)勢(shì)的通用框架。以太坊以太坊的目的是基于腳本、競(jìng)爭幣和鏈上元協(xié)議(on-chainmeta-protocol)概念進(jìn)行整合和提高,使得開發(fā)者能夠創(chuàng)建任意的基于共識(shí)的、可擴(kuò)展的、標(biāo)準(zhǔn)化的、特性完備的、易于開發(fā)的和協(xié)同的應(yīng)用。以太坊通過建立終極的抽象的基礎(chǔ)層-內(nèi)置有圖靈完備編程語言的區(qū)塊鏈-使得任何人都能夠創(chuàng)建合約和去中心化應(yīng)用并在其中設(shè)立他們自由定義的所有權(quán)規(guī)則、交易方式和狀態(tài)轉(zhuǎn)換函數(shù)。域名幣的主體框架只需要兩行代碼就可以實(shí)現(xiàn),諸如貨幣和信譽(yù)系統(tǒng)等其它協(xié)議只需要不到二十行代碼就可以實(shí)現(xiàn)。智能合約-包含價(jià)值而且只有滿足某些條件才能打開的加密箱子-也能在我們的平臺(tái)上創(chuàng)建,并且因?yàn)閳D靈完備性、價(jià)值知曉(value-awareness入?yún)^(qū)塊鏈知曉(blockchain-awareness)和多狀態(tài)所增加的力量而比比特幣腳本所能提供的智能合約強(qiáng)大得多。以太坊賬戶在以太坊系統(tǒng)中,狀態(tài)是由被稱為“賬戶”(每個(gè)賬戶由一個(gè)20字節(jié)的地址)的對(duì)象和在兩個(gè)賬戶之間轉(zhuǎn)移價(jià)值和信息的狀態(tài)轉(zhuǎn)換構(gòu)成的。以太坊的賬戶包含四個(gè)部分:隨機(jī)數(shù),用于確定每筆交易只能被處理一次的計(jì)數(shù)器賬戶目前的以太幣余額賬戶的合約代碼,如果有的話賬戶的存儲(chǔ)(默認(rèn)為空)以太幣(Ether)是以太坊內(nèi)部的主要加密燃料,用于支付交易費(fèi)用。一般而言,以太坊有兩種類型的賬戶:外部所有的賬戶(由私鑰控制的)和合約賬戶(由合約代碼控制)。外部所有的賬戶沒有代碼,人們可以通過創(chuàng)建和簽名一筆交易從一個(gè)外部賬戶發(fā)送消息。每當(dāng)合約賬戶收到一條消息,合約內(nèi)部的代碼就會(huì)被激活,允許它對(duì)內(nèi)部存儲(chǔ)進(jìn)行讀取和寫入,和發(fā)送其它消息或者創(chuàng)建合約。消息和交易以太坊的消息在某種程度上類似于比特幣的交易,但是兩者之間存在三點(diǎn)重要的不同。第一,以太坊的消息可以由外部實(shí)體或者合約創(chuàng)建,然而比特幣的交易只能從外部創(chuàng)建。第二,以太坊消息可以選擇包含數(shù)據(jù)。第三,如果以太坊消息的接受者是合約賬戶,可以選擇進(jìn)行回應(yīng),這意味著以太坊消息也包含函數(shù)概念。以太坊中“交易”是指存儲(chǔ)從外部賬戶發(fā)出的消息的簽名數(shù)據(jù)包。交易包含消息的接收者、用于確認(rèn)發(fā)送者的簽名、以太幣賬戶余額、要發(fā)送的數(shù)據(jù)和兩個(gè)被稱為STARTGAS和GASPRICE的數(shù)值。為了防止代碼的指數(shù)型爆炸和無限循環(huán),每筆交易需要對(duì)執(zhí)行代碼所引發(fā)的計(jì)算步驟-包括初始消息和所有執(zhí)行中引發(fā)的消息-做出限制。STARTGAS就是限制,GASPRICE是每一計(jì)算步驟需要支付礦工的費(fèi)用。如果執(zhí)行交易的過程中「用完了瓦斯”,所有的狀態(tài)改變恢復(fù)原狀態(tài),但是已經(jīng)支付的交易費(fèi)用不可收回了。如果執(zhí)行交易中止時(shí)還剩余瓦斯,那么這些瓦斯將退還給發(fā)送者。創(chuàng)建合約有單獨(dú)的交易類型和相應(yīng)的消息類型;合約的地址是基于賬號(hào)隨機(jī)數(shù)和交易數(shù)據(jù)的哈希計(jì)算出來的。消息機(jī)制的一個(gè)重要后果是以太坊的“頭等公民”財(cái)產(chǎn)-合約與外部賬戶擁有同樣權(quán)利,包括發(fā)送消息和創(chuàng)建其它合約的權(quán)利。這使得合約可以同時(shí)充當(dāng)多個(gè)不同的角色,例如,用戶可以使去中心化組織(一個(gè)合約)的一個(gè)成員成為一個(gè)中介賬戶(另一個(gè)合約),為一個(gè)偏執(zhí)的使用定制的基于量子證明的蘭波特簽名(第三個(gè)合約)的個(gè)人和一個(gè)自身使用由五個(gè)私鑰保證安全的賬戶(第四個(gè)合約)的共同簽名實(shí)體提供居間服務(wù)。以太坊平臺(tái)的強(qiáng)大之處在于去中心化的組織和代理合約不需要關(guān)心合約的每一參與方是什么類型的賬戶。以太坊狀態(tài)轉(zhuǎn)換函數(shù)以太坊的狀態(tài)轉(zhuǎn)換函數(shù):APPLY(S,TX)->S',可以定義如下:檢查交易的格式是否正確(即有正確數(shù)值)、簽名是否有效和隨機(jī)數(shù)是否與發(fā)送者賬戶的隨機(jī)數(shù)匹配。如否,返回錯(cuò)誤。計(jì)算交易費(fèi)用:fee=STARTGAS*GASPRICE,并從簽名中確定發(fā)送者的地址。從發(fā)送者的賬戶中減去交易費(fèi)用和增加發(fā)送者的隨機(jī)數(shù)。如果賬戶余額不足,返回錯(cuò)誤。設(shè)定初值GAS=STARTGAS,并根據(jù)交易中的字節(jié)數(shù)減去一定量的瓦斯值。從發(fā)送者的賬戶轉(zhuǎn)移價(jià)值到接收者賬戶。如果接收賬戶還不存在,創(chuàng)建此賬戶。如果接收賬戶是一個(gè)合約,運(yùn)行合約的代碼,直到代碼運(yùn)行結(jié)束或者瓦斯用完。如果因?yàn)榘l(fā)送者賬戶沒有足夠的錢或者代碼執(zhí)行耗盡瓦斯導(dǎo)致價(jià)值轉(zhuǎn)移失敗,恢復(fù)原來的狀態(tài),但是還需要支付交易費(fèi)用,交易費(fèi)用加至礦工賬戶。否則,將所有剩余的瓦斯歸還給發(fā)送者,消耗掉的瓦斯作為交易費(fèi)用發(fā)送給礦工。例如,假設(shè)合約的代碼如下:if!self.storage[calldataload(0)]:self.storage[calldataload(0)]=calldataload(32)需要注意的是,在現(xiàn)實(shí)中合約代碼是用底層以太坊虛擬機(jī)(EVM)代碼寫成的。上面的合約是用我們的高級(jí)語言Serpent語言寫成的,它可以被編譯成EVM代碼。假設(shè)合約存儲(chǔ)器開始時(shí)是空的一個(gè)值為10以太瓦斯為2000,瓦斯價(jià)格為0.001以太并且64字節(jié)數(shù)據(jù),第一個(gè)三十二字節(jié)的快代表號(hào)碼2和第二個(gè)代表詞CHARLIEo的交易發(fā)送后,狀態(tài)轉(zhuǎn)換函數(shù)的處理過程如下:檢查交易是否有效、格式是否正確。檢查交易發(fā)送者至少有2000*0.001=2個(gè)以太幣。如果有,從發(fā)送者賬戶中減去2個(gè)以太幣。初始設(shè)定gas=2000,假設(shè)交易長為170字節(jié),每字節(jié)的費(fèi)用是5,減去850,所以還剩1150。從發(fā)送者賬戶減去10個(gè)以太幣,為合約賬戶增加10個(gè)以太幣。運(yùn)行代碼。在這個(gè)合約中,運(yùn)行代碼很簡單:它檢查合約存儲(chǔ)器索引為2處是否已使用,注意到它未被使用,然后將其值置為CHARLIE。假設(shè)這消耗了187單位的瓦斯,于是剩余的瓦斯為1150-187=963o6.向發(fā)送者的賬戶增加963*0.001=0.963個(gè)以太幣,返回最終狀態(tài)。如果沒有合約接收交易,那么所有的交易費(fèi)用就等于GASPRICE乘以交易的字節(jié)長度,交易的數(shù)據(jù)就與交易費(fèi)用無關(guān)了。另外,需要注意的是,合約發(fā)起的消息可以對(duì)它們產(chǎn)生的計(jì)算分配瓦斯限額,如果子計(jì)算的瓦斯用完了,它只恢復(fù)到消息發(fā)出時(shí)的狀態(tài)。因此,就像交易一樣,合約也可以通過對(duì)它產(chǎn)生的子計(jì)算設(shè)置嚴(yán)格的限制,保護(hù)它們的計(jì)算資源。代碼執(zhí)行以太坊合約的代碼使用低級(jí)的基于堆棧的字節(jié)碼的語言寫成的,被稱為“以太坊虛擬機(jī)代碼”或者“EVM代碼”。代碼由一系列字節(jié)構(gòu)成,每一個(gè)字節(jié)代表一種操作。一般而言,代碼執(zhí)行是無限循環(huán),程序計(jì)數(shù)器每增加一(初始值為零)就執(zhí)行一次操作,直到代碼執(zhí)行完畢或者遇到錯(cuò)誤,STOP或者RETURN指令。操作可以訪問三種存儲(chǔ)數(shù)據(jù)的空間:堆棧,一種后進(jìn)先出的數(shù)據(jù)存儲(chǔ),32字節(jié)的數(shù)值可以入棧,出棧。內(nèi)存,可無限擴(kuò)展的字節(jié)隊(duì)列。合約的長期存儲(chǔ),一個(gè)秘鑰/數(shù)值的存儲(chǔ),其中秘鑰和數(shù)值都是32字節(jié)大小,與計(jì)算結(jié)束即重置的堆棧和內(nèi)存不同,存儲(chǔ)內(nèi)容將長期保持。代碼可以象訪問區(qū)塊頭數(shù)據(jù)一樣訪問數(shù)值,發(fā)送者和接受到的消息中的數(shù)據(jù),代碼還可以返回?cái)?shù)據(jù)的字節(jié)隊(duì)列作為輸出。EVM代碼的正式執(zhí)行模型令人驚訝地簡單。當(dāng)以太坊虛擬機(jī)運(yùn)行時(shí),它的完整的計(jì)算狀態(tài)可以由元組(block_state,transaction,message,code,memory,stack,pc,gas)來定義,這里block_state是包含所有賬戶余額和存儲(chǔ)的全局狀態(tài)。每輪執(zhí)行時(shí),通過調(diào)出代碼的第pc(程序計(jì)數(shù)器)個(gè)字節(jié),當(dāng)前指令被找到,每個(gè)指令都有定義自己如何影響元組。例如,ADD將兩個(gè)元素出棧并將它們的和入棧,將gas(瓦斯)減一并將pc加一,SSTORE將頂部的兩個(gè)元素出棧并將第二個(gè)元素插入到由第一個(gè)元素定義的合約存儲(chǔ)位置,同樣減少最多200的gas值并將pc加一,雖然有許多方法通過即時(shí)編譯去優(yōu)化以太坊,但以太坊的基礎(chǔ)性的實(shí)施可以用幾百行代碼實(shí)現(xiàn)。區(qū)塊鏈和挖礦雖然有一些不同,但以太坊的區(qū)塊鏈在很多方面類似于比特幣區(qū)塊鏈。它們的區(qū)塊鏈架構(gòu)的不同在于,以太坊區(qū)塊不僅包含交易記錄和最近的狀態(tài),還包含區(qū)塊序號(hào)和難度值。以太坊中的區(qū)塊確認(rèn)算法如下:檢查區(qū)塊引用的上一個(gè)區(qū)塊是否存在和有效。檢查區(qū)塊的時(shí)間戳是否比引用的上一個(gè)區(qū)塊大,而且小于15分鐘。檢查區(qū)塊序號(hào)、難度值、交易根,叔根和瓦斯限額(許多以太坊特有的底層概念)是否有效。檢查區(qū)塊的工作量證明是否有效。將S[0]賦值為上一個(gè)區(qū)塊的STATE_ROOT。將TX賦值為區(qū)塊的交易列表,一共有n筆交易。對(duì)于屬于0……n-1的i,進(jìn)行狀態(tài)轉(zhuǎn)換S[i+1]=APPLY(S[i],TX[i])。如果任何一個(gè)轉(zhuǎn)換發(fā)生錯(cuò)誤,或者程序執(zhí)行到此處所花費(fèi)的瓦斯(gas)超過了GASLIMIT,返回錯(cuò)誤。用S[n]給S_FINAL賦值,向礦工支付區(qū)塊獎(jiǎng)勵(lì)。8檢查S-FINAL是否與STATE_ROOT相同。如果相同,區(qū)塊是有效的。否則,區(qū)塊是無效的。這一確認(rèn)方法乍看起來似乎效率很低,因?yàn)樗枰鎯?chǔ)每個(gè)區(qū)塊的所有狀態(tài),但是事實(shí)上以太坊的確認(rèn)效率可以與比特幣相提并論。原因是狀態(tài)存儲(chǔ)在樹結(jié)構(gòu)中(treestructure),每增加一個(gè)區(qū)塊只需要改變樹結(jié)構(gòu)的一小部分。因此,一般而言,兩個(gè)相鄰的區(qū)塊的樹結(jié)構(gòu)的大部分應(yīng)該是相同的,因此存儲(chǔ)一次數(shù)據(jù),可以利用指針(即子樹哈希)引用兩次。一種被稱為“帕特里夏樹”("PatriciaTree”)的樹結(jié)構(gòu)可以實(shí)現(xiàn)這一點(diǎn),其中包括了對(duì)默克爾樹概念的修改,不僅允許改變節(jié)點(diǎn),而且還可以插入和刪除節(jié)點(diǎn)。另外,因?yàn)樗械臓顟B(tài)信息是最后一個(gè)區(qū)塊的一部分,所以沒有必要存儲(chǔ)全部的區(qū)塊歷史-這一方法如果能夠可以應(yīng)用到比特幣系統(tǒng)中,經(jīng)計(jì)算可以對(duì)存儲(chǔ)空間有10-20倍的節(jié)省。應(yīng)用一般來講,以太坊之上有三種應(yīng)用。第一類是金融應(yīng)用,為用戶提供更強(qiáng)大的用他們的錢管理和參與合約的方法。包括子貨幣,金融衍生品,對(duì)沖合約,儲(chǔ)蓄錢包,遺囑,甚至一些種類的全面的雇傭合約。第二類是半金融應(yīng)用,這里有錢的存在但也有很重的非金錢的方面,一個(gè)完美的例子是為解決計(jì)算問題而設(shè)的自我強(qiáng)制懸賞。最后,還有在線投票和去中心化治理這樣的完全的非金融應(yīng)用。令牌系統(tǒng)鏈上令牌系統(tǒng)有很多應(yīng)用,從代表如美元或黃金等資產(chǎn)的子貨幣到公司股票,單獨(dú)的令牌代表智能資產(chǎn),安全的不可偽造的優(yōu)惠券,甚至與傳統(tǒng)價(jià)值完全沒有聯(lián)系的用來進(jìn)行積分獎(jiǎng)勵(lì)的令牌系統(tǒng)。在以太坊中實(shí)施令牌系統(tǒng)容易得讓人吃驚。關(guān)鍵的一點(diǎn)是理解,所有的貨幣或者令牌系統(tǒng),從根本上來說是一個(gè)帶有如下操作的數(shù)據(jù)庫:從A中減去X單位并把X單位加到B上,前提條件是(1)A在交易之前有至少X單位以及(2)交易被A批準(zhǔn)。實(shí)施一個(gè)令牌系統(tǒng)就是把這樣一個(gè)邏輯實(shí)施到一個(gè)合約中去。用Serpent語言實(shí)施一個(gè)令牌系統(tǒng)的基本代碼如下:defsend(to,value):ifself.storage[from]>=value:self.storage[from]=self.storage[from]-valueself.storage[to]=self.storage[to]+value這從本質(zhì)上來說是本文將要進(jìn)一步描述的“銀行系統(tǒng)”狀態(tài)轉(zhuǎn)變功能的一個(gè)最小化實(shí)施。需要增加一些額外的代碼以提供在初始和其它一些邊緣情況下分發(fā)貨幣的功能,理想情況下會(huì)增加一個(gè)函數(shù)讓其它合約來查詢一個(gè)地址的余額。就足夠了。理論上,基于以太坊的充當(dāng)子貨幣的令牌系統(tǒng)可能包括一個(gè)基于比特幣的鏈上元幣所缺乏的重要功能:直接用這種貨幣支付交易費(fèi)的能力。實(shí)現(xiàn)這種能力的方法是在合約里維護(hù)一個(gè)以太幣賬戶以用來為發(fā)送者支付交易費(fèi),通過收集被用來充當(dāng)交易費(fèi)用的內(nèi)部貨幣并把它們?cè)谝粋€(gè)不斷運(yùn)行的拍賣中拍賣掉,合約不斷為該以太幣賬戶注資。這樣用戶需要用以太幣“激活”他們的賬戶,但一旦賬戶中有以太幣它將會(huì)被重復(fù)使用因?yàn)槊看魏霞s都會(huì)為其充值。金融衍生品和價(jià)值穩(wěn)定的貨幣金融衍生品是“智能合約”的最普遍的應(yīng)用,也是最易于用代碼實(shí)現(xiàn)的之一。實(shí)現(xiàn)金融合約的主要挑戰(zhàn)是它們中的大部分需要參照一個(gè)外部的價(jià)格發(fā)布器;例如,一個(gè)需求非常大的應(yīng)用是一個(gè)用來對(duì)沖以太幣(或其它密碼學(xué)貨幣)相對(duì)美元價(jià)格波動(dòng)的智能合約,但該合約需要知道以太幣相對(duì)美元的價(jià)格。最簡單地方法是通過由某特定機(jī)構(gòu)(例如納斯達(dá)克)維護(hù)的“數(shù)據(jù)提供“合約進(jìn)行,該合約的設(shè)計(jì)使得該機(jī)構(gòu)能夠根據(jù)需要更新合約,并提供一個(gè)接口使得其它合約能夠通過發(fā)送一個(gè)消息給該合約以獲取包含價(jià)格信息的回復(fù)。當(dāng)這些關(guān)鍵要素都齊備,對(duì)沖合約看起來會(huì)是下面的樣子:等待A輸入1000以太幣。.等待B輸入1000以太幣。通過查詢數(shù)據(jù)提供合約,將1000以太幣的美元價(jià)值,例如,x美元,記錄至存儲(chǔ)器。30天后,允許A或B”重新激活”合約以發(fā)送價(jià)值x美元的以太幣(重新查詢數(shù)據(jù)提供合約以獲取新價(jià)格并計(jì)算)給A并將剩余的以太幣發(fā)送給B。這樣的合約在密碼學(xué)商務(wù)中有非同尋常的潛力。密碼學(xué)貨幣經(jīng)常被詬病的一個(gè)問題就是其價(jià)格的波動(dòng)性;雖然大量的用戶和商家可能需要密碼學(xué)資產(chǎn)所帶來的安全和便利,可他們不太會(huì)樂意面對(duì)一天中資產(chǎn)跌去23%價(jià)值的情形。直到現(xiàn)在,最為常見的推薦方案是發(fā)行者背書資產(chǎn);思想是發(fā)行者創(chuàng)建一種子貨幣,對(duì)此種子貨幣他們有權(quán)發(fā)行和贖回,給予(線下)提供給他們一個(gè)單位特定相關(guān)資產(chǎn)(例如黃金,美元)的人一個(gè)單位子貨幣。發(fā)行者承諾當(dāng)任何人送還一個(gè)單位密碼學(xué)資產(chǎn)時(shí)。發(fā)還一個(gè)單位的相關(guān)資產(chǎn)。這種機(jī)制能夠使任何非密碼學(xué)資產(chǎn)被“升級(jí)“為密碼學(xué)資產(chǎn),如果發(fā)行者值得信任的話。然而實(shí)踐中發(fā)行者并非總是值得信任的,并且一些情況下銀行體系太脆弱,或者不夠誠實(shí)守信從而使這樣的服務(wù)無法存在。金融衍生品提供了一種替代方案。這里將不再有提供儲(chǔ)備以支撐一種資產(chǎn)的單獨(dú)的發(fā)行者,取而代之的是一個(gè)由賭一種密碼學(xué)資產(chǎn)的價(jià)格會(huì)上升的投機(jī)者構(gòu)成的去中心化市場(chǎng)。與發(fā)行者不同,投機(jī)者一方?jīng)]有討價(jià)還價(jià)的權(quán)利,因?yàn)閷?duì)沖合約把他們的儲(chǔ)備凍結(jié)在了契約中。注意這種方法并非是完全去中心化的,因?yàn)橐廊恍枰粋€(gè)可信任的提供價(jià)格信息的數(shù)據(jù)源,盡管依然有爭議這依然是在降低基礎(chǔ)設(shè)施需求(與發(fā)行者不同,一個(gè)價(jià)格發(fā)布器不需要牌照并且似乎可歸為自由言論一類)和降低潛在欺詐風(fēng)險(xiǎn)方面的一個(gè)巨大的進(jìn)步。身份和信譽(yù)系統(tǒng)最早的替代幣,域名幣,嘗試使用一個(gè)類比特幣塊鏈來提供一個(gè)名稱注冊(cè)系統(tǒng),在那里用戶可以將他們的名稱和其它數(shù)據(jù)一起在一個(gè)公共數(shù)據(jù)庫注冊(cè)。最常用的應(yīng)用案例把象“b讓"(或者再域名幣中,"bitcoin.b讓“)一樣的域名與一個(gè)IP地址對(duì)應(yīng)的域名系統(tǒng)。其它的應(yīng)用案例包括電子郵件驗(yàn)證系統(tǒng)和潛在的更先進(jìn)的信譽(yù)系統(tǒng)。這里是以太坊中提供與域名幣類似的的名稱注冊(cè)系統(tǒng)的基礎(chǔ)合約:defregister(name,value):if!self.storage[name]:self.storage[name]=value合約非常簡單;就是一個(gè)以太坊網(wǎng)絡(luò)中的可以被添加但不能被修改或移除的數(shù)據(jù)庫。任何人都可以把一個(gè)名稱注冊(cè)為一個(gè)值并永遠(yuǎn)不變。一個(gè)更復(fù)雜的名稱注冊(cè)合約將包含允許其他合約查詢的“功能條款”,以及一個(gè)讓一個(gè)名稱的“擁有者“(即第一個(gè)注冊(cè)者)修改數(shù)據(jù)或者轉(zhuǎn)讓所有權(quán)的機(jī)制。甚至可以在其上添加信譽(yù)和信任網(wǎng)絡(luò)功能。去中心化存儲(chǔ)在過去的幾年里出現(xiàn)了一些大眾化的在線文件存儲(chǔ)初創(chuàng)公司,最突出的是Dropbox,它尋求允許用戶上傳他們的硬盤備份,提供備份存儲(chǔ)服務(wù)并允許用戶訪問從而按月向用戶收取費(fèi)用。然而,在這一點(diǎn)上這個(gè)文件存儲(chǔ)市場(chǎng)有時(shí)相對(duì)低效;對(duì)現(xiàn)存服務(wù)的粗略觀察表明,特別地在“神秘谷“20-200GB這一既沒有免費(fèi)空間也沒有企業(yè)級(jí)用戶折扣的水平上,主流文件存儲(chǔ)成本每月的價(jià)格意味著支付在一個(gè)月里支付整個(gè)硬盤的成本。以太坊合約允許去中心化存儲(chǔ)生態(tài)的開發(fā),這樣用戶通過將他們自己的硬盤或未用的網(wǎng)絡(luò)空間租出去以獲得少量收益,從而降低了文件存儲(chǔ)的成本。這樣的設(shè)施的基礎(chǔ)性構(gòu)件就是我們所謂的“去中心化Dropbox合約“。這個(gè)合約工作原理如下。首先,某人將需要上傳的數(shù)據(jù)分成快,對(duì)每一塊數(shù)據(jù)加密以保護(hù)隱私,并且以此構(gòu)建一個(gè)默克爾樹。然后創(chuàng)建一個(gè)含以下規(guī)則的合約,每N個(gè)塊,合約將從默克爾樹中抽取一個(gè)隨機(jī)索引(使用能夠被合約代碼訪問的上一個(gè)塊的哈希來提供隨機(jī)性),然后給第一個(gè)實(shí)體X以太以支撐一個(gè)帶有類似簡化驗(yàn)證支付(SPV)的在樹中特定索引處的塊的所有權(quán)證明。當(dāng)一個(gè)用戶想重新下載他的文件,他可以使用微支付通道協(xié)議(例如每32k字節(jié)支付1薩博)恢復(fù)文件;從費(fèi)用上講最高效的方法是支付者不到最后不發(fā)布交易,而是用一個(gè)略微更合算的帶有同樣隨機(jī)數(shù)的交易在每32k字節(jié)之后來代替原交易。這個(gè)協(xié)議的一個(gè)重要特征是,雖然看起來象是一個(gè)人信任許多不準(zhǔn)備丟失文件的隨機(jī)節(jié)點(diǎn),但是他可以通過秘密分享把文件分成許多小塊,然后通過監(jiān)視合同得知每個(gè)小塊都還被某個(gè)節(jié)點(diǎn)的保存著。如果一個(gè)合約依然在付款,那么就提供了某個(gè)人依然在保存文件的證據(jù)。去中心化自治組織通常意義上“去中心化自治組織(DAO,decentralizedautonomousorganization)”的概念指的是一^個(gè)擁有一定數(shù)量成員或股東的虛擬實(shí)體,依靠比如67%多數(shù)來決定花錢以及修改代碼。成員會(huì)集體決定組織如何分配資金。分配資金的方法可能是懸賞,工資或者更有吸引力的機(jī)制比如用內(nèi)部貨幣獎(jiǎng)勵(lì)工作。這僅僅使用密碼學(xué)塊鏈技術(shù)就從根本上復(fù)制了傳統(tǒng)公司或者非營利組織的法律意義以實(shí)現(xiàn)強(qiáng)制執(zhí)行。至此許多圍繞DAO的討論都是圍繞一個(gè)帶有接受分紅的股東和可交易的股份的“去中心化自治公司(DAC,decentralizedautonomouscorporation)”的“資本家”模式;作為替代者,一個(gè)被描述為“去中心化自治社區(qū)(decentralizedautonomouscommunity)”的實(shí)體將使所有成員都在決策上擁有同等的權(quán)利并且在增減成員時(shí)要求67%多數(shù)同意。每個(gè)人都只能擁有一個(gè)成員資格這一規(guī)則需要被群體強(qiáng)制實(shí)施。下面是一個(gè)如何用代碼實(shí)現(xiàn)DO的綱要。最簡單地設(shè)計(jì)就是一段如果三分之二成員同意就可以自我修改的代碼。雖然理論上代碼是不可更改的,然而通過把代碼主干放在一個(gè)單獨(dú)的合約內(nèi)并且把合約調(diào)用的地址指向一個(gè)可更改的存儲(chǔ)依然可以容易地繞開障礙而使代碼變得可修改,在一個(gè)這樣的DAO合約的簡單實(shí)現(xiàn)中有三種交易類型,由交易提供的數(shù)據(jù)區(qū)分:[0,i,K,V]注冊(cè)索引為i的對(duì)存儲(chǔ)地址索引為K至v的內(nèi)容的更改建議。[0,i]注冊(cè)對(duì)建議i的投票。[2,i]如有足夠投票則確認(rèn)建議io然后合約對(duì)每一項(xiàng)都有具體的條款。它將維護(hù)一個(gè)所有開放存儲(chǔ)的更改記錄以及一個(gè)誰投票表決的表。還有一個(gè)所有成員的表。當(dāng)任何存儲(chǔ)內(nèi)容的更改獲得了三分之二多數(shù)同意,一個(gè)最終的交易將執(zhí)行這項(xiàng)更改。一個(gè)更加復(fù)雜的框架會(huì)增加內(nèi)置的選舉功能以實(shí)現(xiàn)如發(fā)送交易,增減成員,甚至提供委任制民主一類的投票代表(即任何人都可以委托另外一個(gè)人來代表自己投票,而且這種委托關(guān)系是可以傳遞的,所以如果A委托了B然后B委托了C那么C將決定A的投票)。這種設(shè)計(jì)將使DAO作為一個(gè)去中心化社區(qū)有機(jī)地成長,使人們最終能夠把挑選合適人選的任務(wù)交給專家,與當(dāng)前系統(tǒng)不同,隨著社區(qū)成員不斷改變他們的站隊(duì)假以時(shí)日專家會(huì)容易地出現(xiàn)和消失。一個(gè)替代的模式是去中心化公司,那里任何賬戶可以擁有0到更多的股份,決策需要三分之二多數(shù)的股份同意。一個(gè)完整的框架將包括資產(chǎn)管理功能-可以提交買賣股份的訂單以及接受這種訂單的功能(前提是合約里有訂單匹配機(jī)制)。代表依然以委任制民主的方式存在,產(chǎn)生了“董事會(huì)”的概念。更先進(jìn)的組織治理機(jī)制可能會(huì)在將來實(shí)現(xiàn);現(xiàn)在一個(gè)去中心化組織(DO)可以從去中心化自治組織(DAO)開始描述。DO和DAO的區(qū)別是模糊的,一個(gè)大致的分割線是治理是否可以通過一個(gè)類似政治的過程或者一個(gè)“自動(dòng)”過程實(shí)現(xiàn),一個(gè)不錯(cuò)的直覺測(cè)試是“無通用語言”標(biāo)準(zhǔn):如果兩個(gè)成員不說同樣的語言組織還能正常運(yùn)行嗎?顯然,一個(gè)簡單的傳統(tǒng)的持股式公司會(huì)失敗,而象比特幣協(xié)議這樣的卻很可能成功,羅賓?漢森的“futarchy",一個(gè)通過預(yù)測(cè)市場(chǎng)實(shí)現(xiàn)組織化治理的機(jī)制是一個(gè)真正的說明“自治”式治理可能是什么樣子的好例子。注意一個(gè)人無需假設(shè)所有DAO比所有DO優(yōu)越;自治只是一個(gè)在一些特定場(chǎng)景下有很大優(yōu)勢(shì)的,但在其它地方未必可行的范式,許多半DAO可能存在。進(jìn)一步的應(yīng)用儲(chǔ)蓄錢包。假設(shè)Alice想確保她的資金安全,但她擔(dān)心丟失或者被黑客盜走私鑰。她把以太幣放到和Bob簽訂的一個(gè)合約里,如下所示,這合同是一個(gè)銀行:Alice單獨(dú)每天最多可提取1%的資金。Bob單獨(dú)每天最多可提取1%的資金,但Alice可以用她的私鑰創(chuàng)建一個(gè)交易取消Bob的提現(xiàn)權(quán)限。Alice和Bob一起可以任意提取資金。一般來講每天1%對(duì)Alice足夠了,如果Alice想提現(xiàn)更多她可以聯(lián)系Bob尋求幫助。如果Alice的私鑰被盜她可以立即找到Bob把她的資金轉(zhuǎn)移到一個(gè)新合同里。如果她弄丟了她的私鑰,Bob可以慢慢地把錢提出。如果Bob表現(xiàn)出了惡意,她可以關(guān)掉他的提現(xiàn)權(quán)限。作物保險(xiǎn)。一個(gè)人可以很容易地以天氣情況而不是任何價(jià)格指數(shù)作為數(shù)據(jù)輸入來創(chuàng)建一個(gè)金融衍生品合約。如果一個(gè)愛荷華的農(nóng)民購買了一個(gè)基于愛荷華的降雨情況進(jìn)行反向賠付的金融衍生品,那么如果遇到干旱,該農(nóng)民將自動(dòng)地收到賠付資金而如果有足量的降雨他會(huì)很開心因?yàn)樗淖魑锸粘蓵?huì)很好。一個(gè)去中心化的數(shù)據(jù)發(fā)布器。對(duì)于基于差異的金融合約,事實(shí)上通過過“謝林點(diǎn)”協(xié)議將數(shù)據(jù)發(fā)布器去中心化是可能的。謝林點(diǎn)的工作原理如下:N方為某個(gè)指定的數(shù)據(jù)提供輸入值到系統(tǒng)(例如ETH/USD價(jià)格),所有的值被排序,每個(gè)提供25%到75%之間的值的節(jié)點(diǎn)都會(huì)獲得獎(jiǎng)勵(lì),每個(gè)人都有激勵(lì)去提供他人將提供的答案,大量玩家可以真正同意的答案明顯默認(rèn)就是正確答案,這構(gòu)造了一個(gè)可以在理論上提供很多數(shù)值,包括ETH/USD價(jià)格,柏林的溫度甚至某個(gè)特別困難的計(jì)算的結(jié)果的去中心化協(xié)議。云計(jì)算。EVM技術(shù)還可被用來創(chuàng)建一個(gè)可驗(yàn)證的計(jì)算環(huán)境,允許用戶邀請(qǐng)他人進(jìn)行計(jì)算然后選擇性地要求提供在一定的隨機(jī)選擇的檢查點(diǎn)上計(jì)算被正確完成的證據(jù)。這使得創(chuàng)建一個(gè)任何用戶都可以用他們的臺(tái)式機(jī),筆記本電腦或者專用服務(wù)器參與的云計(jì)算市場(chǎng)成為可能,現(xiàn)場(chǎng)檢查和安全保證金可以被用來確保系統(tǒng)是值得信任的(即沒有節(jié)點(diǎn)可以因欺騙獲利)。雖然這樣一個(gè)系統(tǒng)可能并不適用所有任務(wù);例如,需要高級(jí)進(jìn)程間通信的任務(wù)就不易在一個(gè)大的節(jié)點(diǎn)云上完成。然而一些其它的任務(wù)就很容易實(shí)現(xiàn)并行;SETI@home,folding@home和基因算法這樣的項(xiàng)目就很容易在這樣的平臺(tái)上進(jìn)行。點(diǎn)對(duì)點(diǎn)賭博。任意數(shù)量的點(diǎn)對(duì)點(diǎn)賭博協(xié)議都可以搬到以太坊的區(qū)塊鏈上,例如FrankStajano和RichardClayton的Cyberdiceo最簡單的賭博協(xié)議事實(shí)上是這樣一個(gè)簡單的合約,它用來賭下一個(gè)區(qū)塊的哈稀值與猜測(cè)值之間的差額,據(jù)此可以創(chuàng)建更復(fù)雜的賭博協(xié)議,以實(shí)現(xiàn)近乎零費(fèi)用和無欺騙的賭博服務(wù)。預(yù)測(cè)市場(chǎng)。不管是有神諭還是有謝林幣,預(yù)測(cè)市場(chǎng)都會(huì)很容易實(shí)現(xiàn),帶有謝林幣的預(yù)測(cè)市場(chǎng)可能會(huì)被證明是第一個(gè)主流的作為去中心化組織管理協(xié)議的“futarchy”應(yīng)用。鏈上去中心化市場(chǎng),以身份和信譽(yù)系統(tǒng)為基礎(chǔ)o雜項(xiàng)和關(guān)注改進(jìn)版幽靈協(xié)議的實(shí)施“幽靈”協(xié)議("GreedyHeaviestObservedSubtree"(GHOST)protocol)是由YonatanSompolinsky和AvivZohar在2013年12月引入的創(chuàng)新。幽靈協(xié)議提出的動(dòng)機(jī)是當(dāng)前快速確認(rèn)的塊鏈因?yàn)閰^(qū)塊的高作廢率而受到低安全性困擾;因?yàn)閰^(qū)塊需要花一定時(shí)間(設(shè)為t)擴(kuò)散至全網(wǎng),如果礦工A挖出了一個(gè)區(qū)塊然后礦工B碰巧在A的區(qū)塊擴(kuò)散至B之前挖出了另外一個(gè)區(qū)塊,礦工B的區(qū)塊就會(huì)作廢并且沒有對(duì)網(wǎng)絡(luò)安全作出貢獻(xiàn)。此外,這里還有中心化問題:如果A是一個(gè)擁有全網(wǎng)30%算力的礦池而B擁有10%的算力,A將面臨70%的時(shí)間都在產(chǎn)生作廢區(qū)塊的風(fēng)險(xiǎn)而B在90%的時(shí)間里都在產(chǎn)生作廢區(qū)塊。因此,如果作廢率高,A將簡單地因?yàn)楦叩乃懔Ψ蓊~而更有效率,綜合這兩個(gè)因素,區(qū)塊產(chǎn)生速度快的塊鏈很可能導(dǎo)致一個(gè)礦池?fù)碛袑?shí)際上能夠控制挖礦過程的算力份額。正如Sompolinsky和Zohar所描述的,通過在計(jì)算哪條鏈“最長”的時(shí)候把廢區(qū)塊也包含進(jìn)來,幽靈協(xié)議解決了降低網(wǎng)絡(luò)安全性的第一個(gè)問題;這就是說,不僅一個(gè)區(qū)塊的父區(qū)塊和更早的祖先塊,祖先塊的作廢的后代區(qū)塊(以太坊術(shù)語中稱之為“叔區(qū)塊”)也被加進(jìn)來以計(jì)算哪一個(gè)區(qū)塊擁有支持其的最大工作量證明。我們超越了Sompolinsky和Zohar所描述的協(xié)議以解決第二個(gè)問題-中心化傾向,以太坊付給以“叔區(qū)塊”身份為新塊確認(rèn)作出貢獻(xiàn)的廢區(qū)塊87.5%的獎(jiǎng)勵(lì),把它們納入計(jì)算的“侄子區(qū)塊”將獲得獎(jiǎng)勵(lì)的12.5%,不過,交易費(fèi)用不獎(jiǎng)勵(lì)給叔區(qū)塊。以太坊實(shí)施了一個(gè)只下探到第五層的簡化版本的幽靈協(xié)議。其特點(diǎn)是,廢區(qū)塊只能以叔區(qū)塊的身份被其父母的第二代至第五代后輩區(qū)塊,而不是更遠(yuǎn)關(guān)系的后輩區(qū)塊(例如父母區(qū)塊的第六代后輩區(qū)塊,或祖父區(qū)塊的第三代后輩區(qū)塊)納入計(jì)算。這樣做有幾個(gè)原因。首先,無條件的幽靈協(xié)議將給計(jì)算給定區(qū)塊的哪一個(gè)叔區(qū)塊合法帶來過多的復(fù)雜性。其次,帶有以太坊所使用的補(bǔ)償?shù)臒o條件的幽靈協(xié)議剝奪了礦工在主鏈而不是一個(gè)公開攻擊者的鏈上挖礦的激勵(lì)。最后,計(jì)算表明帶有激勵(lì)的五層幽靈協(xié)議即使在出塊時(shí)間為15s的情況下也實(shí)現(xiàn)了了95%以上的效率,而擁有25%算力的礦工從中心化得到的益處小于3%。費(fèi)用因?yàn)槊總€(gè)發(fā)布的到區(qū)塊鏈的交易都占用了下載和驗(yàn)證的成本,需要有一個(gè)包括交易費(fèi)的規(guī)范機(jī)制來防范濫發(fā)交易。比特幣使用的默認(rèn)方法是純自愿的交易費(fèi)用,依靠礦工擔(dān)當(dāng)守門人并設(shè)定動(dòng)態(tài)的最低費(fèi)用。因?yàn)檫@種方法是“基于市場(chǎng)的二使得礦工和交易發(fā)送者能夠按供需來決定價(jià)格,所以這種方法在比特幣社區(qū)被很順利地接受了。然而,這個(gè)邏輯的問題在于,交易處理并非一個(gè)市場(chǎng);雖然根據(jù)直覺把交易處理解釋成礦工給發(fā)送者提供的服務(wù)是很有吸引力的,但事實(shí)上一個(gè)礦工收錄的交易是需要網(wǎng)絡(luò)中每個(gè)節(jié)點(diǎn)處理的,所以交易處理中最大部分的成本是由第三方而不是決定是否收錄交易的礦工承擔(dān)的。于是,非常有可能發(fā)生公地悲劇。然而,當(dāng)給出一個(gè)特殊的不夠精確的簡化假設(shè)時(shí),這個(gè)基于市場(chǎng)的機(jī)制的漏洞很神奇地消除了自己的影響。論證如下。假設(shè):一個(gè)交易帶來k步操作,提供獎(jiǎng)勵(lì)kR給任何收錄該交易的礦工,這里R由交易發(fā)布者設(shè)定,k和R對(duì)于礦工都是事先(大致上)可見的。每個(gè)節(jié)點(diǎn)處理每步操作的成本都是C(即所有節(jié)點(diǎn)的效率一致)。有N個(gè)挖礦節(jié)點(diǎn),每個(gè)算力一致(即全網(wǎng)算力的1/N)。沒有不挖礦的全節(jié)點(diǎn)。當(dāng)預(yù)期獎(jiǎng)勵(lì)大于成本時(shí),礦工愿意挖礦。這樣,因?yàn)榈V工有1/N的機(jī)會(huì)處理下一個(gè)區(qū)塊,所以預(yù)期的收益是kR/N,礦工的處理成本簡單為kC.這樣當(dāng)kR/N>kC,即R>NC時(shí)。礦工愿意收錄交易。注意R是由交易發(fā)送者提供的每步費(fèi)用,是礦工從處理交易中獲益的下限。NC是全網(wǎng)處理一個(gè)操作的成本。所以,礦工僅有動(dòng)機(jī)去收錄那些收益大于成本的交易。然而,這些假設(shè)與實(shí)際情況有幾點(diǎn)重要的偏離.因?yàn)轭~外的驗(yàn)證時(shí)間延遲了塊的廣播因而增加了塊成為廢塊的機(jī)會(huì),處理交易的礦工比其它的驗(yàn)證節(jié)點(diǎn)付出了更高的成本。不挖礦的全節(jié)點(diǎn)是存在的。實(shí)踐中算力分布可能最后是極端不平均的。以破壞網(wǎng)絡(luò)為己任的投機(jī)者,政敵和瘋子確實(shí)存在,并且他們能夠聰明地設(shè)置合同使得他們的成本比其它驗(yàn)證節(jié)點(diǎn)低得多。上面第1點(diǎn)驅(qū)使礦工收錄更少的交易,第2點(diǎn)增加了NC;因此這兩點(diǎn)的影響至少部分互相抵消了.第3點(diǎn)和第4點(diǎn)是主要問題;作為解決方案我們簡單地建立了一個(gè)浮動(dòng)的上限:沒有區(qū)塊能夠包含比BLK_LIMIT_FACTOR倍長期指數(shù)移動(dòng)平均值更多的操作數(shù)。具體地:blk.oplimit=floor((blk.parent.oplimit*(EMAFACTOR-1)+floor(parent.opcount*BLK_LIMIT_FACTOR))/EMA_FACTOR)BLK_LIMIT_FACTOR和EMA_FACTOR是暫且被設(shè)為65536和1.5的常數(shù),但可能會(huì)在更深入的分析后調(diào)整。回復(fù)計(jì)算和圖靈完備需要強(qiáng)調(diào)的是以太坊虛擬機(jī)是圖靈完備的;這意味著EVM代碼可以實(shí)現(xiàn)任何可以想象的計(jì)算,包括無限循環(huán)。EVM代碼有兩種方式實(shí)現(xiàn)循環(huán)。首先,JUMP指令可以讓程序跳回至代碼前面某處,還有允許如whilex正如在狀態(tài)轉(zhuǎn)換章節(jié)所述,我們的方案通過為每一個(gè)交易設(shè)定運(yùn)行執(zhí)行的最大計(jì)算步數(shù)來解決問題,如果超過則計(jì)算被恢復(fù)原狀但依然要支付費(fèi)用。消息以同樣的方式工作。為顯示這一方案背后的動(dòng)機(jī),請(qǐng)考慮下面的例子:一個(gè)攻擊者創(chuàng)建了一個(gè)運(yùn)行無限循環(huán)的合約,然后發(fā)送了一個(gè)激活循環(huán)的交易給礦工,礦工將處理交易,運(yùn)行無限循環(huán)直到瓦斯耗盡。即使瓦斯耗盡交易半途停止,交易依然正確(回到原處)并且礦工依然從攻擊者哪里掙到了每一步計(jì)算的費(fèi)用。一個(gè)攻擊者創(chuàng)建一個(gè)非常長的無限循環(huán)意圖迫使礦工長時(shí)間內(nèi)一直計(jì)算致使在計(jì)算結(jié)束前若干區(qū)塊已經(jīng)產(chǎn)生于是礦工無法收錄交易以賺取費(fèi)用。然而,攻擊者需要發(fā)布一個(gè)STARTGAS值以限制可執(zhí)行步數(shù),因而礦工將提前知道計(jì)算將耗費(fèi)過多的步數(shù)。一個(gè)攻擊者看到一個(gè)包含諸如send(A,self.storage);self.storage=0格式的合約然后發(fā)送帶有只夠執(zhí)行第一步的費(fèi)用的而不夠執(zhí)行第二步的交易(即提現(xiàn)但不減少賬戶余額)。合約作者無需擔(dān)心防衛(wèi)類似攻擊,因?yàn)槿绻麍?zhí)行中途停止則所有變更都被回復(fù)。一個(gè)金融合約靠提取九個(gè)專用數(shù)據(jù)發(fā)布器的中值來工作以最小化風(fēng)險(xiǎn),一個(gè)攻擊者接管了其中一個(gè)數(shù)據(jù)提供器,然后把這個(gè)按DAO章節(jié)所述的可變地址調(diào)用機(jī)制設(shè)計(jì)成可更改的數(shù)據(jù)提供器轉(zhuǎn)為運(yùn)行一個(gè)無限循環(huán),以求嘗試逼迫任何從此金融合約索要資金的嘗試都會(huì)因瓦斯耗盡而中止。然而,該金融合約可以在消息里設(shè)置瓦斯限制以防范此類問題。圖靈完備的替代是圖靈不完備,這里JUMP和JUMPI指令不存在并且在某個(gè)給定時(shí)間每個(gè)合約只允許有一個(gè)拷貝存在于調(diào)用堆棧內(nèi)。在這樣的系統(tǒng)里,上述的費(fèi)用系統(tǒng)和圍繞我們的方案的效率的不確定性可能都是不需要的,因?yàn)閳?zhí)行一個(gè)合約的成本將被它的大小決定。此外,圖靈不完備甚至不是一個(gè)大的限制,在我們內(nèi)部設(shè)想的所有合約例子中,至今只有一個(gè)需要循環(huán),而且即使這循環(huán)也可以被26個(gè)單行代碼段的重復(fù)所代替??紤]到圖靈完備帶來的嚴(yán)重的麻煩和有限的益處,為什么不簡單地使用一種圖靈不完備語言呢?事實(shí)上圖靈不完備遠(yuǎn)非一個(gè)簡潔的解決方案。為什么?請(qǐng)考慮下面的合約:C0:call(C1)?call(C1)?C1:call(C2)?call(C2)?C2:call(C3)?call(C3)?...C49:call(C50)?call(C50)?C50:(作一個(gè)圖靈機(jī)的步計(jì)算和記錄結(jié)果在合約的長期存儲(chǔ))現(xiàn)在,發(fā)送一個(gè)這樣的交易給A,這樣,在51個(gè)交易中,我們有了一個(gè)需要花費(fèi)2八50步計(jì)算的合約,礦工可能嘗試通過為每一個(gè)合約維護(hù)一個(gè)最高可執(zhí)行步數(shù)并且對(duì)于遞歸調(diào)用其它合約的合約計(jì)算可能執(zhí)行步數(shù)從而預(yù)先檢測(cè)這樣的邏輯炸彈,但是這會(huì)使礦工禁止創(chuàng)建其它合約的合約(因?yàn)樯厦?6個(gè)合約的創(chuàng)建和執(zhí)行可以很容易地放入一個(gè)單獨(dú)合約內(nèi))。另外一個(gè)問題點(diǎn)是一個(gè)消息的地址字段是一個(gè)變量,所以通常來講可能甚至無法預(yù)先知道一個(gè)合約將要調(diào)用的另外一個(gè)合約是哪一個(gè)。于是,最終我們有了一個(gè)驚人的結(jié)論:圖靈完備的管理驚人地容易,而在缺乏同樣的控制時(shí)圖靈不完備的管理驚人地困難-那為什么不讓協(xié)議圖靈完備呢?貨幣和發(fā)行以太坊網(wǎng)絡(luò)包含自身的內(nèi)置貨幣以太幣,以太幣扮演雙重角色,為各種數(shù)字資產(chǎn)交易提供主要的流動(dòng)性,更重要的是提供了了支付交易費(fèi)用的一種機(jī)制。為便利及避免將來的爭議期間(參見當(dāng)前的mBTC/uBTC/聰?shù)臓幷摚煌嬷档拿Q將被提前設(shè)置:1:偉10八12:薩博10八15:芬尼10八18:以太這應(yīng)該被當(dāng)作是“元”和“分”或者“比特幣”和“聰”的概念的擴(kuò)展版,在不遠(yuǎn)的將來,我們期望“以太”被用作普通交易,“芬尼”用來進(jìn)行微交易,“薩博”和“偉”用來進(jìn)行關(guān)于費(fèi)用和協(xié)議實(shí)施的討論。發(fā)行模式如下:通過發(fā)售活動(dòng),以太幣將以每BTC1337-2000以太的價(jià)格發(fā)售,一個(gè)旨在為以太坊組織籌資并且為開發(fā)者支付報(bào)酬的機(jī)制已經(jīng)在其它一些密碼學(xué)貨幣平臺(tái)上成功使用。早期購買者會(huì)享受較大的折扣,發(fā)售所得的BTC將完全用來支付開發(fā)者和研究者的工資和懸賞,以及投入密碼學(xué)貨幣生態(tài)系統(tǒng)的項(xiàng)目。0.099x(x為發(fā)售總量)將被分配給BTC融資或其它的確定性融資成功之前參與開發(fā)的早期貢獻(xiàn)者,另外一個(gè)0.099x將分配給長期研究項(xiàng)目。自上線時(shí)起每年都將有0.26(x為發(fā)售總量被礦工挖出。發(fā)行分解永久線性增長模型降低了在比特幣中出現(xiàn)的財(cái)富過于集中的風(fēng)險(xiǎn),并且給予了活在當(dāng)下和將來的人公平的機(jī)會(huì)去獲取貨幣,同時(shí)保持了對(duì)獲取和持有以太幣的激勵(lì),因?yàn)殚L期來看“貨幣供應(yīng)增長率”是趨于零的。我們還推斷,隨著時(shí)間流逝總會(huì)發(fā)生因?yàn)榇中暮退劳龅仍驇淼膸诺倪z失,假設(shè)幣的遺失是每年貨幣供應(yīng)量的一個(gè)固定比例,則最終總的流通中的貨幣供應(yīng)量會(huì)穩(wěn)定在一個(gè)等于年貨幣發(fā)行量除以遺失率的值上(例如,當(dāng)遺失率為1%時(shí),當(dāng)供應(yīng)量達(dá)到30x時(shí)每年有0.3x被挖出同時(shí)有0.3x丟失達(dá)到一個(gè)均衡)。除了線性的發(fā)行方式外,和比特幣一樣以太幣的的供應(yīng)量增長率長期來看也趨于零。挖礦的中心化比特幣挖礦算法基本上是讓礦工千萬次地輕微改動(dòng)區(qū)塊頭,直到最終某個(gè)節(jié)點(diǎn)的改動(dòng)版本的哈希小于目標(biāo)值(目前是大約2190)。然而,這種挖礦算法容易被兩種形式的中心化攻擊。第一種,挖礦生態(tài)系統(tǒng)被專門設(shè)計(jì)的因而在比特幣挖礦這一特殊任務(wù)上效率提高上千倍的ASICs(專用集成電路)和電腦芯片控制。這意味著比特幣挖礦不再是高度去中心化的和追求平等主義的,而是需要巨額資本的有效參與。第二種,大部分比特幣礦工事實(shí)上不再在本地完成區(qū)塊驗(yàn)證;而是依賴中心化的礦池提供區(qū)塊頭。這個(gè)問題可以說很嚴(yán)重:在本文寫作時(shí),最大的兩個(gè)礦池間接地控制了大約全網(wǎng)50%的算力,雖然當(dāng)一個(gè)礦池或聯(lián)合體嘗試51%攻擊時(shí)礦工可以轉(zhuǎn)換到其它礦池這一事實(shí)減輕了問題的嚴(yán)重性。以太坊現(xiàn)在的目的是使用一個(gè)基于為每1000個(gè)隨機(jī)數(shù)隨機(jī)產(chǎn)生唯一哈希的函數(shù)的挖礦算法,用足夠?qū)挼挠?jì)算域,去除專用硬件的優(yōu)勢(shì)。這樣的策略當(dāng)然不會(huì)使中心化的收益減少為零,但是也不需要。注意每單個(gè)用戶使用他們的私人筆記本電腦或臺(tái)式機(jī)就可以幾乎免費(fèi)地完成一定量的挖礦活動(dòng),但當(dāng)?shù)搅?00%的CPU使用率之后更多地挖礦就會(huì)需要他們支付電力和硬件成本。ASIC挖礦公司需要從第一個(gè)哈希開始就為電力和硬件支付成本。所以,如果中心化收益能夠保持在(E+H)/E以下,那么即使ASICs被制造出來普通礦工依然有生存空間。另外,我們計(jì)劃將挖礦算法設(shè)計(jì)成挖礦需要訪問整個(gè)區(qū)塊鏈,迫使礦工存儲(chǔ)完成的區(qū)塊鏈或者至少能夠驗(yàn)證每筆交易。這去除了對(duì)中心化礦池的需要;雖然礦池依然可以扮演平滑收益分配的隨機(jī)性的角色,但這功能可以被沒有中心化控制的P2P礦池完成地同樣好。這樣即使大部分普通用戶依然傾向選擇輕客戶端,通過增加網(wǎng)絡(luò)中的全節(jié)點(diǎn)數(shù)量也有助于抵御中心化。擴(kuò)展性擴(kuò)展性問題是以太坊常被關(guān)注的地方,與比特幣一樣,以太坊也遭受著每個(gè)交易都需要網(wǎng)絡(luò)中的每個(gè)節(jié)點(diǎn)處理這一困境的折磨。比特幣的當(dāng)前區(qū)塊鏈大小約為20GB,以每小時(shí)1MB的速度增長。如果比特幣網(wǎng)絡(luò)處理Visa級(jí)的2000tps的交易,它將以每三秒1MB的速度增長(1GB每小時(shí),8TB每年)。以太坊可能也會(huì)經(jīng)歷相似的甚至更糟的增長模式,因?yàn)樵谝蕴粎^(qū)塊鏈之上還有很多應(yīng)用,而不是像比特幣只是簡單的貨幣,但以太坊全節(jié)點(diǎn)只需存儲(chǔ)狀態(tài)而不是完整的區(qū)塊鏈歷史這一事實(shí)讓情況得到了改善。大區(qū)塊鏈的問題是中心化風(fēng)險(xiǎn)。如果塊鏈大小增加至比如100TB,可能的場(chǎng)景將是只有非常小數(shù)目的大商家會(huì)運(yùn)行全節(jié)點(diǎn),而常規(guī)用戶使用輕的SPV節(jié)點(diǎn)。這會(huì)增加對(duì)全節(jié)點(diǎn)合伙欺詐牟利(例如更改區(qū)塊獎(jiǎng)勵(lì),給他們自己BTC)的風(fēng)險(xiǎn)的擔(dān)憂。輕節(jié)點(diǎn)將沒有辦法立刻檢測(cè)到這種欺詐。當(dāng)然,至少可能存在一個(gè)誠實(shí)的全節(jié)點(diǎn),并且?guī)讉€(gè)小時(shí)之后有關(guān)詐騙的信息會(huì)通過Reddit這樣的渠道泄露但這時(shí)已經(jīng)太晚:任憑普通用戶做出怎樣的努力去廢除已經(jīng)產(chǎn)生的區(qū)塊,他們都會(huì)遇到與發(fā)動(dòng)一次成功的51%攻擊同等規(guī)模的巨大的不可行的協(xié)調(diào)問題。在比特幣這里,現(xiàn)在這是一個(gè)問題,但PeterTodd建議的一個(gè)改動(dòng)可以緩解這個(gè)問題。近期,以太坊會(huì)使用兩個(gè)附加的策略以應(yīng)對(duì)此問題。首先,因?yàn)榛趨^(qū)塊鏈的挖礦算法,至少每個(gè)礦工會(huì)被迫成為一個(gè)全節(jié)點(diǎn),這保證了一定數(shù)量的全節(jié)點(diǎn)。其次,更重要的是,處理完每筆交易后,我們會(huì)把一個(gè)中間狀態(tài)樹的根包含進(jìn)區(qū)塊鏈。即使區(qū)塊驗(yàn)證是中心化的,只要有一個(gè)誠實(shí)的驗(yàn)證節(jié)點(diǎn)存在,中心化的問題就可以通過一個(gè)驗(yàn)證協(xié)議避免。如果一個(gè)礦工發(fā)布了一個(gè)不正確的區(qū)塊,這區(qū)塊要么是格式錯(cuò),要么狀態(tài)S[n]是錯(cuò)的。因?yàn)镾[0]是正確的,必然有第一個(gè)錯(cuò)誤狀態(tài)S[i]但S[i-1]是正確的,驗(yàn)證節(jié)點(diǎn)將提供索引i,一起提供的還有處理APPLY(S[i-1],TX[i])->S[i]所需的帕特里夏樹節(jié)點(diǎn)的子集。這些節(jié)點(diǎn)將受命進(jìn)行這部分計(jì)算,看產(chǎn)生的S[i]與先前提供的值是否一致。另外,更復(fù)雜的是惡意礦工發(fā)布不完整區(qū)塊進(jìn)行攻擊,造成沒有足夠的信息去確定區(qū)塊是否正確。解決方案是質(zhì)疑-回應(yīng)協(xié)議:驗(yàn)證節(jié)點(diǎn)對(duì)目標(biāo)交易索引發(fā)起質(zhì)疑,接受到質(zhì)疑信息的輕節(jié)點(diǎn)會(huì)對(duì)相應(yīng)的區(qū)塊取消信任,直到另外一個(gè)礦工或者驗(yàn)證者提供一個(gè)帕特里夏節(jié)點(diǎn)子集作為正確的證據(jù)。綜述:去中心化應(yīng)用上述合約機(jī)制使得任何一個(gè)人能夠在一個(gè)虛擬機(jī)上建立通過全網(wǎng)共識(shí)來運(yùn)行命令行應(yīng)用(從根本上來說是),它能夠更改一個(gè)全網(wǎng)可訪問的狀態(tài)作為它的“硬盤”。然而,對(duì)于多數(shù)人來說,用作交易發(fā)送機(jī)制的命令行接口缺乏足夠的用戶友好使得去中心化成為有吸引力的替代方案。最后,一個(gè)完整的“去中心化應(yīng)用”應(yīng)該包括底層的商業(yè)邏輯組件【無論是否在以太坊完整實(shí)施,使用以太坊和其它系統(tǒng)組合(如一個(gè)P2P消息層,其中一個(gè)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論