400-638-8808
|
微信公眾號





穩(wěn)定可靠 永不間斷

海外收發(fā) 暢通無阻

協(xié)同辦公 資源管理

超大郵件 超級功能

智能反垃圾郵件技術(shù)
易管理 免維護

領(lǐng)取完整版《以太坊白皮書.pdf》方法,請掃描下面二維碼關(guān)注微信公眾號:天下數(shù)據(jù)IDC,回復“以太坊”索要白皮書!

翻譯:巨蟹 、少平
譯者注:中文讀者可以到以太坊愛好者社區(qū)獲取最新的以太坊信息。
當中本聰在2009年1月啟動比特幣區(qū)塊鏈時,他同時向世界引入了兩種未經(jīng)測試的革命性的新概念。第一種就是比特幣(bitcoin),一種去中心化的點對點的網(wǎng)上貨幣,在沒有任何資產(chǎn)擔保、內(nèi)在價值或者中心發(fā)行者的情況下維持著價值。到目前為止,比特幣已經(jīng)吸引了大量的公眾注意力, 就政治方面而言它是一種沒有中央銀行的貨幣并且有著劇烈的價格波動。然而,中本聰?shù)膫ゴ笤囼炦有與比特幣同等重要的一部分:基于工作量證明的區(qū)塊鏈概念使得人們可以就交易順序達成共識。作為應(yīng)用的比特幣可以被描述為一個先申請(first-to-file)系統(tǒng):如果某人有50BTC并且同時向A和B發(fā)送這50BTC,只有被首先被確認的交易才會生效。沒有固有方法可以決定兩筆交易哪一筆先到,這個問題阻礙了去中心化數(shù)字貨幣的發(fā)展許多年。中本聰?shù)膮^(qū)塊鏈是第一個可靠的去中心化解決辦法,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)(域名幣)以及如去中心化交易所,金融衍生品,點到點賭博和鏈上身份和信譽系統(tǒng)等更高級的應(yīng)用。另一個常被問詢的重要領(lǐng)域是“智能合約”- 根據(jù)事先任意制訂的規(guī)則來自動轉(zhuǎn)移數(shù)字資產(chǎn)的系統(tǒng)。例如,一個人可能有一個存儲合約,形式為“A可以每天最多提現(xiàn)X個幣,B每天最多Y個,A和B一起可以隨意提取,A可以停掉B的提現(xiàn)權(quán)”。這種合約的符合邏輯的擴展就是去中心化自治組織(DAOs)-長期的包含一個組織的資產(chǎn)并把組織的規(guī)則編碼的智能合約。以太坊的目標就是提供一個帶有內(nèi)置的成熟的圖靈完備語言的區(qū)塊鏈,用這種語言可以創(chuàng)建合約來編碼任意狀態(tài)轉(zhuǎn)換功能,用戶只要簡單地用幾行代碼來實現(xiàn)邏輯,就能夠創(chuàng)建以上提及的所有系統(tǒng)以及許多我們還想象不到的的其它系統(tǒng)。
去中心化的數(shù)字貨幣概念,正如財產(chǎn)登記這樣的替代應(yīng)用一樣,早在幾十年以前就被提出來了。1980和1990年代的匿名電子現(xiàn)金協(xié)議,大部分是以喬姆盲簽技術(shù)(Chaumian blinding)為基礎(chǔ)的。這些電子現(xiàn)金協(xié)議提供具有高度隱私性的貨幣,但是這些協(xié)議都沒有流行起來,因為它們都依賴于一個中心化的中介機構(gòu)。1998年,戴偉(Wei Dai)的b-money首次引入了通過解決計算難題和去中心化共識創(chuàng)造貨幣的思想,但是該建議并未給出如何實現(xiàn)去中心化共識的具體方法。2005年,芬尼(Hal Finney)引入了“可重復使用的工作量證明機制”(reusable proofs of work)概念,它同時使用b-money的思想和Adam Back提出的計算困難的哈,F(xiàn)金(Hashcash)難題來創(chuàng)造密碼學貨幣。但是,這種概念再次迷失于理想化,因為它依賴于可信任的計算作為后端。
因為貨幣是一個先申請應(yīng)用,交易的順序至關(guān)重要,所以去中心化的貨幣需要找到實現(xiàn)去中心化共識的方法。比特幣以前的所有電子貨幣協(xié)議所遇到的主要障礙是,盡管對如何創(chuàng)建安全的拜占庭問題容錯(Byzantine-fault-tolerant)多方共識系統(tǒng)的研究已經(jīng)歷時多年,但是上述協(xié)議只解決了問題的一半。這些協(xié)議假設(shè)系統(tǒng)的所有參與者是已知的,并產(chǎn)生如“如果有N方參與到系統(tǒng)中,那么系統(tǒng)可以容忍N/4的惡意參與者”這樣形式的安全邊界。然而這個假設(shè)的問題在于,在匿名的情況下,系統(tǒng)設(shè)置的安全邊界容易遭受女巫攻擊,因為一個攻擊者可以在一臺服務(wù)器或者僵尸網(wǎng)絡(luò)上創(chuàng)建數(shù)以千計的節(jié)點,從而單方面確保擁有多數(shù)份額。
中本聰?shù)膭?chuàng)新是引入這樣一個理念:將一個非常簡單的基于節(jié)點的去中心化共識協(xié)議與工作量證明機制結(jié)合在一起。節(jié)點通過工作量證明機制獲得參與到系統(tǒng)的權(quán)利,每十分鐘將交易打包到“區(qū)塊”中,從而創(chuàng)建出不斷增長的區(qū)塊鏈。擁有大量算力的節(jié)點有更大的影響力,但獲得比整個網(wǎng)絡(luò)更多的算力比創(chuàng)建一百萬個節(jié)點困難得多。盡管比特幣區(qū)塊鏈模型非常簡陋,但是實踐證明它已經(jīng)足夠好用了,在未來五年,它將成為全世界兩百個以上的貨幣和協(xié)議的基石。

從技術(shù)角度講,比特幣賬本可以被認為是一個狀態(tài)轉(zhuǎn)換系統(tǒng),該系統(tǒng)包括所有現(xiàn)存的比特幣所有權(quán)狀態(tài)和“狀態(tài)轉(zhuǎn)換函數(shù)”。狀態(tài)轉(zhuǎn)換函數(shù)以當前狀態(tài)和交易為輸入,輸出新的狀態(tài)。例如,在標準的銀行系統(tǒng)中,狀態(tài)就是一個資產(chǎn)負債表,一個從A賬戶向B賬戶轉(zhuǎn)賬X美元的請求是一筆交易,狀態(tài)轉(zhuǎn)換函數(shù)將從A賬戶中減去X美元,向B賬戶增加X美元。如果A賬戶的余額小于X美元,狀態(tài)轉(zhuǎn)換函數(shù)就會返回錯誤提示。所以我們可以如下定義狀態(tài)轉(zhuǎn)換函數(shù):
APPLY(S,TX) > S’ or ERROR
在上面提到的銀行系統(tǒng)中,狀態(tài)轉(zhuǎn)換函數(shù)如下:
APPLY({ Alice: $50, Bob: $50 },"send $20 from Alice to Bob") = { Alice: $30,Bob: $70 }
但是:
APPLY({ Alice: $50, Bob: $50 },"send $70 from Alice to Bob") = ERROR
比特幣系統(tǒng)的“狀態(tài)”是所有已經(jīng)被挖出的、沒有花費的比特幣(技術(shù)上稱為“未花費的交易輸出,unspent transaction outputs 或UTXO”)的集合。每個UTXO都有一個面值和所有者(由20個字節(jié)的本質(zhì)上是密碼學公鑰的地址所定義[1])。一筆交易包括一個或多個輸入和一個或多個輸出。每個輸入包含一個對現(xiàn)有UTXO的引用和由與所有者地址相對應(yīng)的私鑰創(chuàng)建的密碼學簽名。每個輸出包含一個新的加入到狀態(tài)中的UTXO。
在比特幣系統(tǒng)中,狀態(tài)轉(zhuǎn)換函數(shù)APPLY(S,TX)->S’大體上可以如下定義:
S),返回錯誤提示S’,新狀態(tài)S中移除了所有的輸入UTXO,增加了所有的輸出UTXO。第一步的第一部分防止交易的發(fā)送者花費不存在的比特幣,第二部分防止交易的發(fā)送者花費其他人的比特幣。第二步確保價值守恒。比特幣的支付協(xié)議如下。假設(shè)Alice想給Bob發(fā)送11.7BTC。事實上,Alice不可能正好有11.7BTC。假設(shè),她能得到的最小數(shù)額比特幣的方式是:6+4+2=12。所以,她可以創(chuàng)建一筆有3個輸入,2個輸出的交易。第一個輸出的面值是11.7BTC,所有者是Bob(Bob的比特幣地址),第二個輸出的面值是0.3BTC,所有者是Alice自己,也就是找零。

一個區(qū)塊,每個區(qū)塊包含一個時間戳、一個隨機數(shù)、一個對上一個區(qū)塊的引用(即哈希)和上一區(qū)塊生成以來發(fā)生的所有交易列表。這樣隨著時間流逝就創(chuàng)建出了一個持續(xù)增長的區(qū)塊鏈,它不斷地更新,從而能夠代表比特幣賬本的最新狀態(tài)。
依照這個范式,檢查一個區(qū)塊是否有效的算法如下:
S[0]。S[i+1] = APPLY(S[i],TX[i])。如果任何一筆交易i在狀態(tài)轉(zhuǎn)換中出錯,退出程序,返回錯誤。S[n]是這一區(qū)塊的最終狀態(tài)。本質(zhì)上,區(qū)塊中的每筆交易必須提供一個正確的狀態(tài)轉(zhuǎn)換,要注意的是,“狀態(tài)”并不是編碼到區(qū)塊的。它純粹只是被校驗節(jié)點記住的抽象概念,對于任意區(qū)塊都可以從創(chuàng)世狀態(tài)開始,按順序加上每一個區(qū)塊的每一筆交易,(妥妥地)計算出當前的狀態(tài)。另外,需要注意礦工將交易收錄進區(qū)塊的順序。如果一個區(qū)塊中有A、B兩筆交易,B花費的是A創(chuàng)建的UTXO,如果A在B以前,這個區(qū)塊是有效的,否則,這個區(qū)塊是無效的。
區(qū)塊驗證算法的有趣部分是“工作量證明”概念:對每個區(qū)塊進行SHA256哈希處理,將得到的哈希視為長度為256比特的數(shù)值,該數(shù)值必須小于不斷動態(tài)調(diào)整的目標數(shù)值,本書寫作時目標數(shù)值大約是2^190。工作量證明的目的是使區(qū)塊的創(chuàng)建變得困難,從而阻止女巫攻擊者惡意重新生成區(qū)塊鏈。因為SHA256是完全不可預測的偽隨機函數(shù),創(chuàng)建有效區(qū)塊的唯一方法就是簡單地不斷試錯,不斷地增加隨機數(shù)的數(shù)值,查看新的哈希數(shù)值是否小于目標數(shù)值。如果當前的目標數(shù)值是2^192,就意味著平均需要嘗試2^64次才能生成有效的區(qū)塊。一般而言,比特幣網(wǎng)絡(luò)每隔2016個區(qū)塊重新設(shè)定目標數(shù)值,保證平均每十分鐘生成一個區(qū)塊。為了對礦工的計算工作進行獎勵,每一個成功生成區(qū)塊的礦工有權(quán)在區(qū)塊中包含一筆憑空發(fā)給他們自己25BTC的交易。另外,如果交易的輸入大于輸出,差額部分就作為“交易費用”付給礦工。順便提一下,對礦工的獎勵是比特幣發(fā)行的唯一機制,創(chuàng)世狀態(tài)中并沒有比特幣。
為了更好地理解挖礦的目的,讓我們分析比特幣網(wǎng)絡(luò)出現(xiàn)惡意攻擊者時會發(fā)生什么。因為比特幣的密碼學基礎(chǔ)是非常安全的,所以攻擊者會選擇攻擊沒有被密碼學直接保護的部分:交易順序。攻擊者的策略非常簡單:
一旦步驟(1)發(fā)生,幾分鐘后礦工將把這筆交易打包到區(qū)塊,假設(shè)是第270000個區(qū)塊。大約一個小時以后,在此區(qū)塊后面將會有五個區(qū)塊,每個區(qū)塊間接地指向這筆交易,從而確認這筆交易。這時賣家收到貨款,并向買家發(fā)貨。因為我們假設(shè)這是數(shù)字商品,攻擊者可以即時收到貨。現(xiàn)在,攻擊者創(chuàng)建另一筆交易,將相同的100BTC發(fā)送到自己的賬戶。如果攻擊者只是向全網(wǎng)廣播這一消息,這一筆交易不會被處理。礦工會運行狀態(tài)轉(zhuǎn)換函數(shù)APPLY(S,TX),發(fā)現(xiàn)這筆交易將花費已經(jīng)不在狀態(tài)中的UTXO。所以,攻擊者會對區(qū)塊鏈進行分叉,將第269999個區(qū)塊作為父區(qū)塊重新生成第270000個區(qū)塊,在此區(qū)塊中用新的交易取代舊的交易。因為區(qū)塊數(shù)據(jù)是不同的,這要求重新進行工作量證明。另外,因為攻擊者生成的新的第270000個區(qū)塊有不同的哈希,所以原來的第270001到第270005的區(qū)塊不指向它,因此原有的區(qū)塊鏈和攻擊者的新區(qū)塊是完全分離的。在發(fā)生區(qū)塊鏈分叉時,區(qū)塊鏈長的分支被認為是誠實的區(qū)塊鏈,合法的的礦工將會沿著原有的第270005區(qū)塊后挖礦,只有攻擊者一人在新的第270000區(qū)塊后挖礦。攻擊者為了使得他的區(qū)塊鏈最長,他需要擁有比除了他以外的全網(wǎng)更多的算力來追趕(即51%攻擊)。

左:僅提供默克爾樹(Merkle tree)上的少量節(jié)點已經(jīng)足夠給出分支的合法證明。
右:任何對于默克爾樹的任何部分進行改變的嘗試都會最終導致鏈上某處的不一致。
比特幣系統(tǒng)的一個重要的可擴展特性是:它的區(qū)塊存儲在多層次的數(shù)據(jù)結(jié)構(gòu)中。一個區(qū)塊的哈希實際上只是區(qū)塊頭的哈希,區(qū)塊頭是包含時間戳、隨機數(shù)、上個區(qū)塊哈希和存儲了所有的區(qū)塊交易的默克爾樹的根哈希的長度大約為200字節(jié)的一段數(shù)據(jù)。
默克爾樹是一種二叉樹,由一組葉節(jié)點、一組中間節(jié)點和一個根節(jié)點構(gòu)成。最下面的大量的葉節(jié)點包含基礎(chǔ)數(shù)據(jù),每個中間節(jié)點是它的兩個子節(jié)點的哈希,根節(jié)點也是由它的兩個子節(jié)點的哈希,代表了默克爾樹的頂部。默克爾樹的目的是允許區(qū)塊的數(shù)據(jù)可以零散地傳送:節(jié)點可以從一個源下載區(qū)塊頭,從另外的源下載與其有關(guān)的樹的其它部分,而依然能夠確認所有的數(shù)據(jù)都是正確的。之所以如此是因為哈希向上的擴散:如果一個惡意用戶嘗試在樹的下部加入一個偽造的交易,所引起的改動將導致樹的上層節(jié)點的改動,以及更上層節(jié)點的改動,最終導致根節(jié)點的改動以及區(qū)塊哈希的改動,這樣協(xié)議就會將其記錄為一個完全不同的區(qū)塊(幾乎可以肯定是帶著不正確的工作量證明的)。
默克爾樹協(xié)議對比特幣的長期持續(xù)性可以說是至關(guān)重要的。在2014年4月,比特幣網(wǎng)絡(luò)中的一個全節(jié)點-存儲和處理所有區(qū)塊的全部數(shù)據(jù)的節(jié)點-需要占用15GB的內(nèi)存空間,而且還以每個月超過1GB的速度增長。目前,這一存儲空間對臺式計算機來說尚可接受,但是手機已經(jīng)負載不了如此巨大的數(shù)據(jù)了。未來只有商業(yè)機構(gòu)和愛好者才會充當完整節(jié)點。簡化支付確認(SPV)協(xié)議允許另一種節(jié)點存在,這樣的節(jié)點被成為“輕節(jié)點”,它下載區(qū)塊頭,使用區(qū)塊頭確認工作量證明,然后只下載與其交易相關(guān)的默克爾樹“分支”。這使得輕節(jié)點只要下載整個區(qū)塊鏈的一小部分就可以安全地確定任何一筆比特幣交易的狀態(tài)和賬戶的當前余額。
將區(qū)塊鏈的思想應(yīng)用到其它領(lǐng)域的想法早就出現(xiàn)了。在2005年,尼克薩博提出了“用所有權(quán)為財產(chǎn)冠名”的概念,文中描述了復制數(shù)據(jù)庫技術(shù)的發(fā)展如何使基于區(qū)塊鏈的系統(tǒng)可以應(yīng)用于登記土地所有權(quán),創(chuàng)建包括例如房產(chǎn)權(quán)、違法侵占和喬治亞州土地稅等概念的詳細框架。然而,不幸的是在那時還沒有實用的復制數(shù)據(jù)庫系統(tǒng),所以這個協(xié)議被沒有被付諸實踐。不過,自2009年比特幣系統(tǒng)的去中心化共識開發(fā)成功以來,許多區(qū)塊鏈的其它應(yīng)用開始快速出現(xiàn)。
1LW79wp5ZBqaHW1jL5TciBCrhQYtHagUWy這樣的偽隨機哈希。理想的情況下,人們希望擁有一個帶有象“george”這樣的名稱的賬戶。然而,問題是如果有人可以創(chuàng)建“george”賬戶,那么其他人同樣也可以創(chuàng)建“george”賬戶來假扮。唯一的解決方法是先申請原則(first-to-file),只有第一個注冊者可以成功注冊,第二個不能再次注冊同一個賬戶。這一問題就可以利用比特幣的共識協(xié)議。域名幣是利用區(qū)塊鏈實現(xiàn)名稱注冊系統(tǒng)的最早的、最成功的系統(tǒng)。因此,一般而言,建立共識協(xié)議有兩種方法:建立一個獨立的網(wǎng)絡(luò)和在比特幣網(wǎng)絡(luò)上建立協(xié)議。雖然像域名幣這樣的應(yīng)用使用第一種方法已經(jīng)獲得了成功,但是該方法的實施非常困難,因為每一個應(yīng)用需要創(chuàng)建獨立的區(qū)塊鏈和建立、測試所有狀態(tài)轉(zhuǎn)換和網(wǎng)絡(luò)代碼。另外,我們預測去中心化共識技術(shù)的應(yīng)用將會服從冪律分布,大多數(shù)的應(yīng)用太小不足以保證自由區(qū)塊鏈的安全,我們還注意到大量的去中心化應(yīng)用,尤其是去中心化自治組織,需要進行應(yīng)用之間的交互。
另一方面,基于比特幣的方法存在缺點,它沒有繼承比特幣可以進行簡化確認支付(SPV) 的特性。比特幣可以實現(xiàn)簡化確認支付,因為比特幣可以將區(qū)塊鏈深度作為有效性確認代理。在某一點上,一旦一筆交易的祖先們距離現(xiàn)在足夠遠時,就可以認為它們是合法狀態(tài)的一部分。與之相反,基于比特幣區(qū)塊鏈的元幣協(xié)議不能強迫區(qū)塊鏈不包括不符合元幣協(xié)議的交易。因此,安全的元幣協(xié)議的簡化支付確認需要后向掃描所有的區(qū)塊,直到區(qū)塊鏈的初始點,以確認某一交易是否有效。目前,所有基于比特幣的元幣協(xié)議的“輕”實施都依賴可信任的服務(wù)器提供數(shù)據(jù),這對主要目的之一是消除信任需要的密碼學貨幣而言,只是一個相當次優(yōu)的結(jié)果。
即使不對比特幣協(xié)議進行擴展,它也能在一定程度上實現(xiàn)”智能合約”。比特幣的UTXO可以被不只被一個公鑰擁有,也可以被用基于堆棧的編程語言所編寫的更加復雜的腳本所擁有。在這一模式下,花費這樣的UTXO,必須提供滿足腳本的數(shù)據(jù)。事實上,基本的公鑰所有權(quán)機制也是通過腳本實現(xiàn)的:腳本將橢圓曲線簽名作為輸入,驗證交易和擁有這一UTXO的地址,如果驗證成功,返回1,否則返回0。更加復雜的腳本用于其它不同的應(yīng)用情況。例如,人們可以創(chuàng)建要求集齊三把私鑰中的兩把才能進行交易確認的腳本(多重簽名),對公司賬戶、儲蓄賬戶和某些商業(yè)代理來說,這種腳本是非常有用的。腳本也能用來對解決計算問題的用戶發(fā)送獎勵。人們甚至可以創(chuàng)建這樣的腳本“如果你能夠提供你已經(jīng)發(fā)送一定數(shù)額的的狗幣給我的簡化確認支付證明,這一比特幣UTXO就是你的了”,本質(zhì)上,比特幣系統(tǒng)允許不同的密碼學貨幣進行去中心化的兌換。
然而,比特幣系統(tǒng)的腳本語言存在一些嚴重的限制:
我們已經(jīng)考察了在密碼學貨幣上建立高級應(yīng)用的三種方法:建立一個新的區(qū)塊鏈,在比特幣區(qū)塊鏈上使用腳本,在比特幣區(qū)塊鏈上建立元幣協(xié)議。建立新區(qū)塊鏈的方法可以自由地實現(xiàn)任意的特性,成本是開發(fā)時間和培育努力。使用腳本的方法非常容易實現(xiàn)和標準化,但是它的能力有限。元幣協(xié)議盡管非常容易實現(xiàn),但是存在擴展性差的缺陷。在以太坊系統(tǒng)中,我們的目的是建立一個能夠同時具有這三種模式的所有優(yōu)勢的通用框架。
以太坊的目的是基于腳本、競爭幣和鏈上元協(xié)議(on-chain meta-protocol)概念進行整合和提高,使得開發(fā)者能夠創(chuàng)建任意的基于共識的、可擴展的、標準化的、特性完備的、易于開發(fā)的和協(xié)同的應(yīng)用。以太坊通過建立終極的抽象的基礎(chǔ)層-內(nèi)置有圖靈完備編程語言的區(qū)塊鏈-使得任何人都能夠創(chuàng)建合約和去中心化應(yīng)用并在其中設(shè)立他們自由定義的所有權(quán)規(guī)則、交易方式和狀態(tài)轉(zhuǎn)換函數(shù)。域名幣的主體框架只需要兩行代碼就可以實現(xiàn),諸如貨幣和信譽系統(tǒng)等其它協(xié)議只需要不到二十行代碼就可以實現(xiàn)。智能合約-包含價值而且只有滿足某些條件才能打開的加密箱子-也能在我們的平臺上創(chuàng)建,并且因為圖靈完備性、價值知曉(value-awareness)、區(qū)塊鏈知曉(blockchain-awareness)和多狀態(tài)所增加的力量而比比特幣腳本所能提供的智能合約強大得多。
在以太坊系統(tǒng)中,狀態(tài)是由被稱為“賬戶”(每個賬戶由一個20字節(jié)的地址)的對象和在兩個賬戶之間轉(zhuǎn)移價值和信息的狀態(tài)轉(zhuǎn)換構(gòu)成的。以太坊的賬戶包含四個部分:
以太幣(Ether)是以太坊內(nèi)部的主要加密燃料,用于支付交易費用。一般而言,以太坊有兩種類型的賬戶:外部所有的賬戶(由私鑰控制的)和合約賬戶(由合約代碼控制)。外部所有的賬戶沒有代碼,人們可以通過創(chuàng)建和簽名一筆交易從一個外部賬戶發(fā)送消息。每當合約賬戶收到一條消息,合約內(nèi)部的代碼就會被激活,允許它對內(nèi)部存儲進行讀取和寫入,和發(fā)送其它消息或者創(chuàng)建合約。
以太坊的消息在某種程度上類似于比特幣的交易,但是兩者之間存在三點重要的不同。第一,以太坊的消息可以由外部實體或者合約創(chuàng)建,然而比特幣的交易只能從外部創(chuàng)建。第二,以太坊消息可以選擇包含數(shù)據(jù)。第三,如果以太坊消息的接受者是合約賬戶,可以選擇進行回應(yīng),這意味著以太坊消息也包含函數(shù)概念。
以太坊中“交易”是指存儲從外部賬戶發(fā)出的消息的簽名數(shù)據(jù)包。交易包含消息的接收者、用于確認發(fā)送者的簽名、以太幣賬戶余額、要發(fā)送的數(shù)據(jù)和兩個被稱為STARTGAS和GASPRICE的數(shù)值。為了防止代碼的指數(shù)型爆炸和無限循環(huán),每筆交易需要對執(zhí)行代碼所引發(fā)的計算步驟-包括初始消息和所有執(zhí)行中引發(fā)的消息-做出限制。STARTGAS就是限制,GASPRICE是每一計算步驟需要支付礦工的費用。如果執(zhí)行交易的過程中,“用完了瓦斯”,所有的狀態(tài)改變恢復原狀態(tài),但是已經(jīng)支付的交易費用不可收回了。如果執(zhí)行交易中止時還剩余瓦斯,那么這些瓦斯將退還給發(fā)送者。創(chuàng)建合約有單獨的交易類型和相應(yīng)的消息類型;合約的地址是基于賬號隨機數(shù)和交易數(shù)據(jù)的哈希計算出來的。
消息機制的一個重要后果是以太坊的“頭等公民”財產(chǎn)-合約與外部賬戶擁有同樣權(quán)利,包括發(fā)送消息和創(chuàng)建其它合約的權(quán)利。這使得合約可以同時充當多個不同的角色,例如,用戶可以使去中心化組織(一個合約)的一個成員成為一個中介賬戶(另一個合約),為一個偏執(zhí)的使用定制的基于量子證明的蘭波特簽名(第三個合約)的個人和一個自身使用由五個私鑰保證安全的賬戶(第四個合約)的共同簽名實體提供居間服務(wù)。以太坊平臺的強大之處在于去中心化的組織和代理合約不需要關(guān)心合約的每一參與方是什么類型的賬戶。

以太坊的狀態(tài)轉(zhuǎn)換函數(shù):APPLY(S,TX) -> S’,可以定義如下:
fee=STARTGAS * GASPRICE,并從簽名中確定發(fā)送者的地址。從發(fā)送者的賬戶中減去交易費用和增加發(fā)送者的隨機數(shù)。如果賬戶余額不足,返回錯誤。GAS = STARTGAS,并根據(jù)交易中的字節(jié)數(shù)減去一定量的瓦斯值。if !self.storage[calldataload(0)]: self.storage[calldataload(0)] = calldataload(32)
需要注意的是,在現(xiàn)實中合約代碼是用底層以太坊虛擬機(EVM)代碼寫成的。上面的合約是用我們的高級語言Serpent語言寫成的,它可以被編譯成EVM代碼。假設(shè)合約存儲器開始時是空的,一個值為10以太,瓦斯為2000,瓦斯價格為0.001以太并且64字節(jié)數(shù)據(jù),第一個三十二字節(jié)的快代表號碼2和第二個代表詞CHARLIE。的交易發(fā)送后,狀態(tài)轉(zhuǎn)換函數(shù)的處理過程如下:
以太坊合約的代碼使用低級的基于堆棧的字節(jié)碼的語言寫成的,被稱為“以太坊虛擬機代碼”或者“EVM代碼”。代碼由一系列字節(jié)構(gòu)成,每一個字節(jié)代表一種操作。一般而言,代碼執(zhí)行是無限循環(huán),程序計數(shù)器每增加一(初始值為零)就執(zhí)行一次操作,直到代碼執(zhí)行完畢或者遇到錯誤,STOP或者RETURN指令。操作可以訪問三種存儲數(shù)據(jù)的空間:
代碼可以象訪問區(qū)塊頭數(shù)據(jù)一樣訪問數(shù)值,發(fā)送者和接受到的消息中的數(shù)據(jù),代碼還可以返回數(shù)據(jù)的字節(jié)隊列作為輸出。
EVM代碼的正式執(zhí)行模型令人驚訝地簡單。當以太坊虛擬機運行時,它的完整的計算狀態(tài)可以由元組(block_state, transaction, message, code, memory, stack, pc, gas)來定義,這里block_state是包含所有賬戶余額和存儲的全局狀態(tài)。每輪執(zhí)行時,通過調(diào)出代碼的第pc(程序計數(shù)器)個字節(jié),當前指令被找到,每個指令都有定義自己如何影響元組。例如,ADD將兩個元素出棧并將它們的和入棧,將gas(瓦斯)減一并將pc加一,SSTORE將頂部的兩個元素出棧并將第二個元素插入到由第一個元素定義的合約存儲位置,同樣減少最多200的gas值并將pc加一,雖然有許多方法通過即時編譯去優(yōu)化以太坊,但以太坊的基礎(chǔ)性的實施可以用幾百行代碼實現(xiàn)。

雖然有一些不同,但以太坊的區(qū)塊鏈在很多方面類似于比特幣區(qū)塊鏈。它們的區(qū)塊鏈架構(gòu)的不同在于,以太坊區(qū)塊不僅包含交易記錄和最近的狀態(tài),還包含區(qū)塊序號和難度值。以太坊中的區(qū)塊確認算法如下:
S[0]賦值為上一個區(qū)塊的STATE_ROOT。TX賦值為區(qū)塊的交易列表,一共有n筆交易。對于屬于0……n-1的i,進行狀態(tài)轉(zhuǎn)換S[i+1] = APPLY(S[i],TX[i])。如果任何一個轉(zhuǎn)換發(fā)生錯誤,或者程序執(zhí)行到此處所花費的瓦斯(gas)超過了GASLIMIT,返回錯誤。S[n]給S_FINAL賦值, 向礦工支付區(qū)塊獎勵。 8 檢查S-FINAL是否與STATE_ROOT相同。如果相同,區(qū)塊是有效的。否則,區(qū)塊是無效的。這一確認方法乍看起來似乎效率很低,因為它需要存儲每個區(qū)塊的所有狀態(tài),但是事實上以太坊的確認效率可以與比特幣相提并論。原因是狀態(tài)存儲在樹結(jié)構(gòu)中(tree structure),每增加一個區(qū)塊只需要改變樹結(jié)構(gòu)的一小部分。因此,一般而言,兩個相鄰的區(qū)塊的樹結(jié)構(gòu)的大部分應(yīng)該是相同的,因此存儲一次數(shù)據(jù),可以利用指針(即子樹哈希)引用兩次。一種被稱為“帕特里夏樹”(“Patricia Tree”)的樹結(jié)構(gòu)可以實現(xiàn)這一點,其中包括了對默克爾樹概念的修改,不僅允許改變節(jié)點,而且還可以插入和刪除節(jié)點。另外,因為所有的狀態(tài)信息是最后一個區(qū)塊的一部分,所以沒有必要存儲全部的區(qū)塊歷史-這一方法如果能夠可以應(yīng)用到比特幣系統(tǒng)中,經(jīng)計算可以對存儲空間有10-20倍的節(jié)省。
一般來講,以太坊之上有三種應(yīng)用。第一類是金融應(yīng)用,為用戶提供更強大的用他們的錢管理和參與合約的方法。包括子貨幣,金融衍生品,對沖合約,儲蓄錢包,遺囑,甚至一些種類的全面的雇傭合約。第二類是半金融應(yīng)用,這里有錢的存在但也有很重的非金錢的方面,一個完美的例子是為解決計算問題而設(shè)的自我強制懸賞。最后,還有在線投票和去中心化治理這樣的完全的非金融應(yīng)用。
鏈上令牌系統(tǒng)有很多應(yīng)用,從代表如美元或黃金等資產(chǎn)的子貨幣到公司股票,單獨的令牌代表智能資產(chǎn),安全的不可偽造的優(yōu)惠券,甚至與傳統(tǒng)價值完全沒有聯(lián)系的用來進行積分獎勵的令牌系統(tǒng)。在以太坊中實施令牌系統(tǒng)容易得讓人吃驚。關(guān)鍵的一點是理解,所有的貨幣或者令牌系統(tǒng),從根本上來說是一個帶有如下操作的數(shù)據(jù)庫:從A中減去X單位并把X單位加到B上,前提條件是(1)A在交易之前有至少X單位以及(2)交易被A批準。實施一個令牌系統(tǒng)就是把這樣一個邏輯實施到一個合約中去。
用Serpent語言實施一個令牌系統(tǒng)的基本代碼如下:
def send(to, value): if self.storage[from] >= value: self.storage[from] = self.storage[from] value self.storage[to] = self.storage[to] + value
這從本質(zhì)上來說是本文將要進一步描述的“銀行系統(tǒng)”狀態(tài)轉(zhuǎn)變功能的一個最小化實施。需要增加一些額外的代碼以提供在初始和其它一些邊緣情況下分發(fā)貨幣的功能,理想情況下會增加一個函數(shù)讓其它合約來查詢一個地址的余額。就足夠了。理論上,基于以太坊的充當子貨幣的令牌系統(tǒng)可能包括一個基于比特幣的鏈上元幣所缺乏的重要功能:直接用這種貨幣支付交易費的能力。實現(xiàn)這種能力的方法是在合約里維護一個以太幣賬戶以用來為發(fā)送者支付交易費,通過收集被用來充當交易費用的內(nèi)部貨幣并把它們在一個不斷運行的拍賣中拍賣掉,合約不斷為該以太幣賬戶注資。這樣用戶需要用以太幣“激活”他們的賬戶,但一旦賬戶中有以太幣它將會被重復使用因為每次合約都會為其充值。
金融衍生品是“智能合約”的最普遍的應(yīng)用,也是最易于用代碼實現(xiàn)的之一。實現(xiàn)金融合約的主要挑戰(zhàn)是它們中的大部分需要參照一個外部的價格發(fā)布器;例如,一個需求非常大的應(yīng)用是一個用來對沖以太幣(或其它密碼學貨幣)相對美元價格波動的智能合約,但該合約需要知道以太幣相對美元的價格。最簡單地方法是通過由某特定機構(gòu)(例如納斯達克)維護的“數(shù)據(jù)提供“合約進行,該合約的設(shè)計使得該機構(gòu)能夠根據(jù)需要更新合約,并提供一個接口使得其它合約能夠通過發(fā)送一個消息給該合約以獲取包含價格信息的回復。
當這些關(guān)鍵要素都齊備,對沖合約看起來會是下面的樣子:
最早的替代幣,域名幣,嘗試使用一個類比特幣塊鏈來提供一個名稱注冊系統(tǒng),在那里用戶可以將他們的名稱和其它數(shù)據(jù)一起在一個公共數(shù)據(jù)庫注冊。最常用的應(yīng)用案例把象“bitcoin.org“(或者再域名幣中,”bitcoin.bit“)一樣的域名與一個IP地址對應(yīng)的域名系統(tǒng)。其它的應(yīng)用案例包括電子郵件驗證系統(tǒng)和潛在的更先進的信譽系統(tǒng)。這里是以太坊中提供與域名幣類似的的名稱注冊系統(tǒng)的基礎(chǔ)合約:
def register(name, value): if !self.storage[name]: self.storage[name] = value
合約非常簡單;就是一個以太坊網(wǎng)絡(luò)中的可以被添加但不能被修改或移除的數(shù)據(jù)庫。任何人都可以把一個名稱注冊為一個值并永遠不變。一個更復雜的名稱注冊合約將包含允許其他合約查詢的“功能條款“,以及一個讓一個名稱的”擁有者“(即第一個注冊者)修改數(shù)據(jù)或者轉(zhuǎn)讓所有權(quán)的機制。甚至可以在其上添加信譽和信任網(wǎng)絡(luò)功能。
在過去的幾年里出現(xiàn)了一些大眾化的在線文件存儲初創(chuàng)公司,最突出的是Dropbox,它尋求允許用戶上傳他們的硬盤備份,提供備份存儲服務(wù)并允許用戶訪問從而按月向用戶收取費用。然而,在這一點上這個文件存儲市場有時相對低效;對現(xiàn)存服務(wù)的粗略觀察表明,特別地在“神秘谷“20-200GB這一既沒有免費空間也沒有企業(yè)級用戶折扣的水平上,主流文件存儲成本每月的價格意味著支付在一個月里支付整個硬盤的成本。以太坊合約允許去中心化存儲生態(tài)的開發(fā),這樣用戶通過將他們自己的硬盤或未用的網(wǎng)絡(luò)空間租出去以獲得少量收益,從而降低了文件存儲的成本。
這樣的設(shè)施的基礎(chǔ)性構(gòu)件就是我們所謂的“去中心化Dropbox合約“。這個合約工作原理如下。首先,某人將需要上傳的數(shù)據(jù)分成快,對每一塊數(shù)據(jù)加密以保護隱私,并且以此構(gòu)建一個默克爾樹。然后創(chuàng)建一個含以下規(guī)則的合約,每N個塊,合約將從默克爾樹中抽取一個隨機索引(使用能夠被合約代碼訪問的上一個塊的哈希來提供隨機性), 然后給第一個實體X以太以支撐一個帶有類似簡化驗證支付(SPV)的在樹中特定索引處的塊的所有權(quán)證明。當一個用戶想重新下載他的文件,他可以使用微支付通道協(xié)議(例如每32k字節(jié)支付1薩博)恢復文件;從費用上講最高效的方法是支付者不到最后不發(fā)布交易,而是用一個略微更合算的帶有同樣隨機數(shù)的交易在每32k字節(jié)之后來代替原交易。
這個協(xié)議的一個重要特征是,雖然看起來象是一個人信任許多不準備丟失文件的隨機節(jié)點,但是他可以通過秘密分享把文件分成許多小塊,然后通過監(jiān)視合同得知每個小塊都還被某個節(jié)點的保存著。如果一個合約依然在付款,那么就提供了某個人依然在保存文件的證據(jù)。
通常意義上“去中心化自治組織(DAO, decentralized autonomous organization)”的概念指的是一個擁有一定數(shù)量成員或股東的虛擬實體,依靠比如67%多數(shù)來決定花錢以及修改代碼。成員會集體決定組織如何分配資金。分配資金的方法可能是懸賞,工資或者更有吸引力的機制比如用內(nèi)部貨幣獎勵工作。這僅僅使用密碼學塊鏈技術(shù)就從根本上復制了傳統(tǒng)公司或者非營利組織的法律意義以實現(xiàn)強制執(zhí)行。至此許多圍繞DAO的討論都是圍繞一個帶有接受分紅的股東和可交易的股份的“去中心化自治公司(DAC,decentralized autonomous corporation)”的“資本家”模式;作為替代者,一個被描述為“去中心化自治社區(qū)(decentralized autonomous community)”的實體將使所有成員都在決策上擁有同等的權(quán)利并且在增減成員時要求67%多數(shù)同意。每個人都只能擁有一個成員資格這一規(guī)則需要被群體強制實施。
下面是一個如何用代碼實現(xiàn)DO的綱要。最簡單地設(shè)計就是一段如果三分之二成員同意就可以自我修改的代碼。雖然理論上代碼是不可更改的,然而通過把代碼主干放在一個單獨的合約內(nèi)并且把合約調(diào)用的地址指向一個可更改的存儲依然可以容易地繞開障礙而使代碼變得可修改,在一個這樣的DAO合約的簡單實現(xiàn)中有三種交易類型,由交易提供的數(shù)據(jù)區(qū)分:
[0,i,K,V] 注冊索引為i 的對存儲地址索引為K 至 v 的內(nèi)容的更改建議。[0,i] 注冊對建議i 的投票。[2,i] 如有足夠投票則確認建議i。然后合約對每一項都有具體的條款。它將維護一個所有開放存儲的更改記錄以及一個誰投票表決的表。還有一個所有成員的表。當任何存儲內(nèi)容的更改獲得了三分之二多數(shù)同意,一個最終的交易將執(zhí)行這項更改。一個更加復雜的框架會增加內(nèi)置的選舉功能以實現(xiàn)如發(fā)送交易,增減成員,甚至提供委任制民主一類的投票代表(即任何人都可以委托另外一個人來代表自己投票,而且這種委托關(guān)系是可以傳遞的,所以如果A委托了B然后B委托了C那么C將決定A的投票)。這種設(shè)計將使DAO作為一個去中心化社區(qū)有機地成長, 使人們最終能夠把挑選合適人選的任務(wù)交給專家,與當前系統(tǒng)不同,隨著社區(qū)成員不斷改變他們的站隊假以時日專家會容易地出現(xiàn)和消失。 一個替代的模式是去中心化公司,那里任何賬戶可以擁有0到更多的股份,決策需要三分之二多數(shù)的股份同意。一個完整的框架將包括資產(chǎn)管理功能-可以提交買賣股份的訂單以及接受這種訂單的功能(前提是合約里有訂單匹配機制)。代表依然以委任制民主的方式存在,產(chǎn)生了“董事會”的概念。
更先進的組織治理機制可能會在將來實現(xiàn);現(xiàn)在一個去中心化組織(DO)可以從去中心化自治組織(DAO)開始描述。DO和DAO的區(qū)別是模糊的,一個大致的分割線是治理是否可以通過一個類似政治的過程或者一個“自動”過程實現(xiàn),一個不錯的直覺測試是“無通用語言”標準:如果兩個成員不說同樣的語言組織還能正常運行嗎?顯然,一個簡單的傳統(tǒng)的持股式公司會失敗,而象比特幣協(xié)議這樣的卻很可能成功,羅賓·漢森的“futarchy”,一個通過預測市場實現(xiàn)組織化治理的機制是一個真正的說明“自治”式治理可能是什么樣子的好例子。注意一個人無需假設(shè)所有DAO比所有DO優(yōu)越;自治只是一個在一些特定場景下有很大優(yōu)勢的,但在其它地方未必可行的范式,許多半DAO可能存在。
儲蓄錢包。 假設(shè)Alice想確保她的資金安全,但她擔心丟失或者被黑客盜走私鑰。她把以太幣放到和Bob簽訂的一個合約里,如下所示,這合同是一個銀行:
作物保險。一個人可以很容易地以天氣情況而不是任何價格指數(shù)作為數(shù)據(jù)輸入來創(chuàng)建一個金融衍生品合約。如果一個愛荷華的農(nóng)民購買了一個基于愛荷華的降雨情況進行反向賠付的金融衍生品,那么如果遇到干旱,該農(nóng)民將自動地收到賠付資金而如果有足量的降雨他會很開心因為他的作物收成會很好。
一個去中心化的數(shù)據(jù)發(fā)布器。 對于基于差異的金融合約,事實上通過過“謝林點”協(xié)議將數(shù)據(jù)發(fā)布器去中心化是可能的。謝林點的工作原理如下:N方為某個指定的數(shù)據(jù)提供輸入值到系統(tǒng)(例如ETH/USD價格),所有的值被排序,每個提供25%到75%之間的值的節(jié)點都會獲得獎勵,每個人都有激勵去提供他人將提供的答案,大量玩家可以真正同意的答案明顯默認就是正確答案,這構(gòu)造了一個可以在理論上提供很多數(shù)值,包括ETH/USD價格,柏林的溫度甚至某個特別困難的計算的結(jié)果的去中心化協(xié)議。
5.云計算。EVM技術(shù)還可被用來創(chuàng)建一個可驗證的計算環(huán)境,允許用戶邀請他人進行計算然后選擇性地要求提供在一定的隨機選擇的檢查點上計算被正確完成的證據(jù)。這使得創(chuàng)建一個任何用戶都可以用他們的臺式機,筆記本電腦或者專用服務(wù)器參與的云計算市場成為可能,現(xiàn)場檢查和安全保證金可以被用來確保系統(tǒng)是值得信任的(即沒有節(jié)點可以因欺騙獲利)。雖然這樣一個系統(tǒng)可能并不適用所有任務(wù);例如,需要高級進程間通信的任務(wù)就不易在一個大的節(jié)點云上完成。然而一些其它的任務(wù)就很容易實現(xiàn)并行;SETI@home, folding@home和基因算法這樣的項目就很容易在這樣的平臺上進行。
6.點對點賭博。任意數(shù)量的點對點賭博協(xié)議都可以搬到以太坊的區(qū)塊鏈上,例如Frank Stajano和Richard Clayton的Cyberdice。 最簡單的賭博協(xié)議事實上是這樣一個簡單的合約,它用來賭下一個區(qū)塊的哈稀值與猜測值之間的差額, 據(jù)此可以創(chuàng)建更復雜的賭博協(xié)議,以實現(xiàn)近乎零費用和無欺騙的賭博服務(wù)。
7.預測市場。 不管是有神諭還是有謝林幣,預測市場都會很容易實現(xiàn),帶有謝林幣的預測市場可能會被證明是第一個主流的作為去中心化組織管理協(xié)議的“futarchy”應(yīng)用。
8.鏈上去中心化市場,以身份和信譽系統(tǒng)為基礎(chǔ)。
“幽靈“協(xié)議("Greedy Heaviest Observed Subtree" (GHOST) protocol)是由Yonatan Sompolinsky 和 Aviv Zohar在2013年12月引入的創(chuàng)新。幽靈協(xié)議提出的動機是當前快速確認的塊鏈因為區(qū)塊的高作廢率而受到低安全性困擾;因為區(qū)塊需要花一定時間(設(shè)為t)擴散至全網(wǎng),如果礦工A挖出了一個區(qū)塊然后礦工B碰巧在A的區(qū)塊擴散至B之前挖出了另外一個區(qū)塊,礦工B的區(qū)塊就會作廢并且沒有對網(wǎng)絡(luò)安全作出貢獻。此外,這里還有中心化問題:如果A是一個擁有全網(wǎng)30%算力的礦池而B擁有10%的算力,A將面臨70%的時間都在產(chǎn)生作廢區(qū)塊的風險而B在90%的時間里都在產(chǎn)生作廢區(qū)塊。因此,如果作廢率高,A將簡單地因為更高的算力份額而更有效率,綜合這兩個因素,區(qū)塊產(chǎn)生速度快的塊鏈很可能導致一個礦池擁有實際上能夠控制挖礦過程的算力份額。
正如Sompolinsky 和 Zohar所描述的,通過在計算哪條鏈“最長”的時候把廢區(qū)塊也包含進來,幽靈協(xié)議解決了降低網(wǎng)絡(luò)安全性的第一個問題;這就是說,不僅一個區(qū)塊的父區(qū)塊和更早的祖先塊,祖先塊的作廢的后代區(qū)塊(以太坊術(shù)語中稱之為“叔區(qū)塊”)也被加進來以計算哪一個區(qū)塊擁有支持其的最大工作量證明。我們超越了Sompolinsky 和 Zohar所描述的協(xié)議以解決第二個問題 – 中心化傾向,以太坊付給以“叔區(qū)塊”身份為新塊確認作出貢獻的廢區(qū)塊87.5%的獎勵,把它們納入計算的“侄子區(qū)塊”將獲得獎勵的12.5%,不過,交易費用不獎勵給叔區(qū)塊。 以太坊實施了一個只下探到第五層的簡化版本的幽靈協(xié)議。其特點是,廢區(qū)塊只能以叔區(qū)塊的身份被其父母的第二代至第五代后輩區(qū)塊,而不是更遠關(guān)系的后輩區(qū)塊(例如父母區(qū)塊的第六代后輩區(qū)塊,或祖父區(qū)塊的第三代后輩區(qū)塊)納入計算。這樣做有幾個原因。首先,無條件的幽靈協(xié)議將給計算給定區(qū)塊的哪一個叔區(qū)塊合法帶來過多的復雜性。其次,帶有以太坊所使用的補償?shù)臒o條件的幽靈協(xié)議剝奪了礦工在主鏈而不是一個公開攻擊者的鏈上挖礦的激勵。最后,計算表明帶有激勵的五層幽靈協(xié)議即使在出塊時間為15s的情況下也實現(xiàn)了了95%以上的效率,而擁有25%算力的礦工從中心化得到的益處小于3%。
因為每個發(fā)布的到區(qū)塊鏈的交易都占用了下載和驗證的成本,需要有一個包括交易費的規(guī)范機制來防范濫發(fā)交易。比特幣使用的默認方法是純自愿的交易費用,依靠礦工擔當守門人并設(shè)定動態(tài)的最低費用。因為這種方法是“基于市場的”,使得礦工和交易發(fā)送者能夠按供需來決定價格,所以這種方法在比特幣社區(qū)被很順利地接受了。然而,這個邏輯的問題在于,交易處理并非一個市場;雖然根據(jù)直覺把交易處理解釋成礦工給發(fā)送者提供的服務(wù)是很有吸引力的,但事實上一個礦工收錄的交易是需要網(wǎng)絡(luò)中每個節(jié)點處理的,所以交易處理中最大部分的成本是由第三方而不是決定是否收錄交易的礦工承擔的。于是,非常有可能發(fā)生公地悲劇。
然而,當給出一個特殊的不夠精確的簡化假設(shè)時,這個基于市場的機制的漏洞很神奇地消除了自己的影響。論證如下。假設(shè):
當預期獎勵大于成本時,礦工愿意挖礦。這樣,因為礦工有1/N 的機會處理下一個區(qū)塊,所以預期的收益是 kR/N , 礦工的處理成本簡單為 kC. 這樣當 kR/N > kC, 即 R > NC時。礦工愿意收錄交易。注意 R 是由交易發(fā)送者提供的每步費用,是礦工從處理交易中獲益的下限。 NC 是全網(wǎ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ù),但可能會在更深入的分析后調(diào)整。 回復
需要強調(diào)的是以太坊虛擬機是圖靈完備的; 這意味著EVM代碼可以實現(xiàn)任何可以想象的計算,包括無限循環(huán)。EVM代碼有兩種方式實現(xiàn)循環(huán)。首先, JUMP 指令可以讓程序跳回至代碼前面某處,還有允許如 while x < 27: x = x * 2 一樣的條件語句的JUMPI 指令實現(xiàn)條件跳轉(zhuǎn)。其次,合約可以調(diào)用其它合約,有通過遞歸實現(xiàn)循環(huán)的潛力。這很自然地導致了一個問題:惡意用戶能夠通過迫使礦工和全節(jié)點進入無限循環(huán)而不得不關(guān)機嗎? 這問題出現(xiàn)是因為計算機科學中一個叫停機問題的問題:一般意義上沒有辦法知道,一個給定的程序是否能在有限的時間內(nèi)結(jié)束運行。
正如在狀態(tài)轉(zhuǎn)換章節(jié)所述,我們的方案通過為每一個交易設(shè)定運行執(zhí)行的最大計算步數(shù)來解決問題,如果超過則計算被恢復原狀但依然要支付費用。消息以同樣的方式工作。為顯示這一方案背后的動機,請考慮下面的例子:
C0: call(C1); call(C1); C1: call(C2); call(C2); C2: call(C3); call(C3); ... C49: call(C50); call(C50); C50: (作一個圖靈機的步計算和記錄結(jié)果在合約的長期存儲)
現(xiàn)在,發(fā)送一個這樣的交易給A,這樣,在51個交易中,我們有了一個需要花費2^50 步計算的合約,礦工可能嘗試通過為每一個合約維護一個最高可執(zhí)行步數(shù)并且對于遞歸調(diào)用其它合約的合約計算可能執(zhí)行步數(shù)從而預先檢測這樣的邏輯炸彈,但是這會使礦工禁止創(chuàng)建其它合約的合約(因為上面26個合約的創(chuàng)建和執(zhí)行可以很容易地放入一個單獨合約內(nèi))。另外一個問題點是一個消息的地址字段是一個變量,所以通常來講可能甚至無法預先知道一個合約將要調(diào)用的另外一個合約是哪一個。于是,最終我們有了一個驚人的結(jié)論:圖靈完備的管理驚人地容易,而在缺乏同樣的控制時圖靈不完備的管理驚人地困難- 那為什么不讓協(xié)議圖靈完備呢?
以太坊網(wǎng)絡(luò)包含自身的內(nèi)置貨幣以太幣,以太幣扮演雙重角色,為各種數(shù)字資產(chǎn)交易提供主要的流動性,更重要的是提供了了支付交易費用的一種機制。為便利及避免將來的爭議期間(參見當前的mBTC/uBTC/聰?shù)臓幷摚,不同面值的名稱將被提前設(shè)置:
這應(yīng)該被當作是“元”和“分”或者“比特幣”和“聰”的概念的擴展版,在不遠的將來,我們期望“以太”被用作普通交易,“芬尼”用來進行微交易,“薩博”和“偉”用來進行關(guān)于費用和協(xié)議實施的討論。
發(fā)行模式如下:
永久線性增長模型降低了在比特幣中出現(xiàn)的財富過于集中的風險,并且給予了活在當下和將來的人公平的機會去獲取貨幣,同時保持了對獲取和持有以太幣的激勵,因為長期來看“貨幣供應(yīng)增長率”是趨于零的。我們還推斷,隨著時間流逝總會發(fā)生因為粗心和死亡等原因帶來的幣的遺失,假設(shè)幣的遺失是每年貨幣供應(yīng)量的一個固定比例,則最終總的流通中的貨幣供應(yīng)量會穩(wěn)定在一個等于年貨幣發(fā)行量除以遺失率的值上(例如,當遺失率為1%時,當供應(yīng)量達到30x時,每年有0.3x被挖出同時有0.3x丟失,達到一個均衡)。
| Group | At launch | After 1 year | After 5 years |
|---|---|---|---|
| Currency units | 1.198X | 1.458X | 2.498X |
| Purchasers | 83.5% | 68.6% | 40.0% |
| Reserve spent pre-sale | 8.26% | 6.79% | 3.96% |
| Reserve used post-sale | 8.26% | 6.79% | 3.96% |
| Miners | 0% | 17.8% | 52.0% |
除了線性的發(fā)行方式外,和比特幣一樣以太幣的的供應(yīng)量增長率長期來看也趨于零。

比特幣挖礦算法基本上是讓礦工千萬次地輕微改動區(qū)塊頭,直到最終某個節(jié)點的改動版本的哈希小于目標值(目前是大約2190)。然而,這種挖礦算法容易被兩種形式的中心化攻擊。第一種,挖礦生態(tài)系統(tǒng)被專門設(shè)計的因而在比特幣挖礦這一特殊任務(wù)上效率提高上千倍的ASICs(專用集成電路)和電腦芯片控制。這意味著比特幣挖礦不再是高度去中心化的和追求平等主義的,而是需要巨額資本的有效參與。第二種,大部分比特幣礦工事實上不再在本地完成區(qū)塊驗證;而是依賴中心化的礦池提供區(qū)塊頭。這個問題可以說很嚴重:在本文寫作時,最大的兩個礦池間接地控制了大約全網(wǎng)50%的算力,雖然當一個礦池或聯(lián)合體嘗試51%攻擊時礦工可以轉(zhuǎn)換到其它礦池這一事實減輕了問題的嚴重性。
以太坊現(xiàn)在的目的是使用一個基于為每1000個隨機數(shù)隨機產(chǎn)生唯一哈希的函數(shù)的挖礦算法,用足夠?qū)挼挠嬎阌,去除專用硬件的?yōu)勢。這樣的策略當然不會使中心化的收益減少為零,但是也不需要。注意每單個用戶使用他們的私人筆記本電腦或臺式機就可以幾乎免費地完成一定量的挖礦活動,但當?shù)搅?00%的CPU使用率之后更多地挖礦就會需要他們支付電力和硬件成本。ASIC挖礦公司需要從第一個哈希開始就為電力和硬件支付成本。所以,如果中心化收益能夠保持在(E + H) /E 以下,那么即使ASICs被制造出來普通礦工依然有生存空間。另外,我們計劃將挖礦算法設(shè)計成挖礦需要訪問整個區(qū)塊鏈,迫使礦工存儲完成的區(qū)塊鏈或者至少能夠驗證每筆交易。這去除了對中心化礦池的需要;雖然礦池依然可以扮演平滑收益分配的隨機性的角色,但這功能可以被沒有中心化控制的P2P礦池完成地同樣好。這樣即使大部分普通用戶依然傾向選擇輕客戶端,通過增加網(wǎng)絡(luò)中的全節(jié)點數(shù)量也有助于抵御中心化。
擴展性問題是以太坊常被關(guān)注的地方,與比特幣一樣,以太坊也遭受著每個交易都需要網(wǎng)絡(luò)中的每個節(jié)點處理這一困境的折磨。比特幣的當前區(qū)塊鏈大小約為20GB,以每小時1MB的速度增長。如果比特幣網(wǎng)絡(luò)處理Visa級的2000tps的交易,它將以每三秒1MB的速度增長(1GB每小時,8TB每年)。以太坊可能也會經(jīng)歷相似的甚至更糟的增長模式,因為在以太坊區(qū)塊鏈之上還有很多應(yīng)用,而不是像比特幣只是簡單的貨幣,但以太坊全節(jié)點只需存儲狀態(tài)而不是完整的區(qū)塊鏈歷史這一事實讓情況得到了改善。
大區(qū)塊鏈的問題是中心化風險。如果塊鏈大小增加至比如100TB,可能的場景將是只有非常小數(shù)目的大商家會運行全節(jié)點,而常規(guī)用戶使用輕的SPV節(jié)點。這會增加對全節(jié)點合伙欺詐牟利(例如更改區(qū)塊獎勵,給他們自己BTC)的風險的擔憂。輕節(jié)點將沒有辦法立刻檢測到這種欺詐。當然,至少可能存在一個誠實的全節(jié)點,并且?guī)讉小時之后有關(guān)詐騙的信息會通過Reddit這樣的渠道泄露,但這時已經(jīng)太晚:任憑普通用戶做出怎樣的努力去廢除已經(jīng)產(chǎn)生的區(qū)塊,他們都會遇到與發(fā)動一次成功的51%攻擊同等規(guī)模的巨大的不可行的協(xié)調(diào)問題。在比特幣這里,現(xiàn)在這是一個問題,但Peter Todd建議的一個改動可以緩解這個問題。
近期,以太坊會使用兩個附加的策略以應(yīng)對此問題。首先,因為基于區(qū)塊鏈的挖礦算法,至少每個礦工會被迫成為一個全節(jié)點,這保證了一定數(shù)量的全節(jié)點。其次,更重要的是,處理完每筆交易后,我們會把一個中間狀態(tài)樹的根包含進區(qū)塊鏈。即使區(qū)塊驗證是中心化的,只要有一個誠實的驗證節(jié)點存在,中心化的問題就可以通過一個驗證協(xié)議避免。如果一個礦工發(fā)布了一個不正確的區(qū)塊,這區(qū)塊要么是格式錯,要么狀態(tài)S[n]是錯的。因為S[0]是正確的,必然有第一個錯誤狀態(tài)S[i]但S[i-1]是正確的,驗證節(jié)點將提供索引i,一起提供的還有處理APPLY(S[i-1],TX[i]) -> S[i]所需的帕特里夏樹節(jié)點的子集。這些節(jié)點將受命進行這部分計算,看產(chǎn)生的S[i]與先前提供的值是否一致。
另外,更復雜的是惡意礦工發(fā)布不完整區(qū)塊進行攻擊,造成沒有足夠的信息去確定區(qū)塊是否正確。解決方案是質(zhì)疑-回應(yīng)協(xié)議:驗證節(jié)點對目標交易索引發(fā)起質(zhì)疑,接受到質(zhì)疑信息的輕節(jié)點會對相應(yīng)的區(qū)塊取消信任,直到另外一個礦工或者驗證者提供一個帕特里夏節(jié)點子集作為正確的證據(jù)。
上述合約機制使得任何一個人能夠在一個虛擬機上建立通過全網(wǎng)共識來運行命令行應(yīng)用(從根本上來說是),它能夠更改一個全網(wǎng)可訪問的狀態(tài)作為它的“硬盤”。然而,對于多數(shù)人來說,用作交易發(fā)送機制的命令行接口缺乏足夠的用戶友好使得去中心化成為有吸引力的替代方案。最后,一個完整的“去中心化應(yīng)用”應(yīng)該包括底層的商業(yè)邏輯組件【無論是否在以太坊完整實施,使用以太坊和其它系統(tǒng)組合(如一個P2P消息層,其中一個正在計劃放入以太坊客戶端)或者僅有其它系統(tǒng)的方式】和上層的圖形用戶接口組件。以太坊客戶端被設(shè)計成一個網(wǎng)絡(luò)瀏覽器,但包括對“eth” Javascript API對象的支持,可被客戶端里看到的特定的網(wǎng)頁用來與以太坊區(qū)塊鏈交互。從“傳統(tǒng)”網(wǎng)頁的角度看來,這些網(wǎng)頁是完全靜態(tài)的內(nèi)容,因為區(qū)塊鏈和其它去中心化協(xié)議將完全代替服務(wù)器來處理用戶發(fā)起的請求。最后,去中心化協(xié)議有希望自己利用某種方式使用以太坊來存儲網(wǎng)頁。
以太坊協(xié)議最初是作為一個通過高度通用的語言提供如鏈上契約,提現(xiàn)限制和金融合約,賭博市場等高級功能的升級版密碼學貨幣來構(gòu)思的。以太坊協(xié)議將不直接“支持”任何應(yīng)用,但圖靈完備編程語言的存在意味著理論上任意的合約都可以為任何交易類型和應(yīng)用創(chuàng)建出來。然而關(guān)于以太坊更有趣的是,以太坊協(xié)議比單純的貨幣走得更遠,圍繞去中心化存儲,去中心化計算和去中心化預測市場以及數(shù)十個類似概念建立的協(xié)議和去中心化應(yīng)用,有潛力從根本上提升計算行業(yè)的效率,并通過首次添加經(jīng)濟層為其它的P2P協(xié)議提供有力支撐,最終,同樣會有大批與金錢毫無關(guān)系的應(yīng)用出現(xiàn)。
以太坊協(xié)議實現(xiàn)的任意狀態(tài)轉(zhuǎn)換概念提供了一個具有獨特潛力的平臺;與封閉式的,為諸如數(shù)據(jù)存儲,賭博或金融等單一目的設(shè)計的協(xié)議不同,以太坊從設(shè)計上是開放式的,并且我們相信它極其適合作為基礎(chǔ)層服務(wù)于在將來的年份里出現(xiàn)的極其大量的金融和非金融協(xié)議。
1.一個有經(jīng)驗的讀者會注意到事實上比特幣地址是橢圓曲線公鑰的哈希,而非公鑰本身,然而事實上從密碼學術(shù)語角度把公鑰哈希稱為公鑰完全合理。這是因為比特幣密碼學可以被認為是一個定制的數(shù)字簽名算法,公鑰由橢圓曲線公鑰的哈希組成,簽名由橢圓曲線簽名連接的橢圓曲線公鑰組成,而驗證算法包括用作為公鑰提供的橢圓曲線公鑰哈希來檢查橢圓曲線公鑰,以及之后的用橢圓曲線公鑰來驗證橢圓曲線簽名。
2.技術(shù)上來說,前11個區(qū)塊的中值。
3.在內(nèi)部,2和“CHARLIE”都是數(shù)字,后一個有巨大的base256編碼格式,數(shù)字可以從0到2^256-1。
Intrinsic value: https://tinyurl.com/BitcoinMag-IntrinsicValue
Smart property: https://en.bitcoin.it/wiki/Smart_Property
Smart contracts: https://en.bitcoin.it/wiki/Contracts
B-money: http://www.weidai.com/bmoney.txt
Reusable proofs of work: http://www.finney.org/~hal/rpow/
Secure property titles with owner authority: http://szabo.best.vwh.net/securetitle.html
Bitcoin whitepaper: http://bitcoin.org/bitcoin.pdf
Namecoin: https://namecoin.org/
Zooko’s triangle: http://en.wikipedia.org/wiki/Zooko’s_triangle
Colored coins whitepaper: https://tinyurl.com/coloredcoin-whitepaper
Mastercoin whitepaper: https://github.com/mastercoin-MSC/spec
Decentralized autonomous corporations, Bitcoin Magazine: https://tinyurl.com/Bootstrapping-DACs
Simplified payment verification:https://en.bitcoin.it/wiki/Scalability#Simplifiedpaymentverification
Merkle trees: http://en.wikipedia.org/wiki/Merkle_tree
Patricia trees: http://en.wikipedia.org/wiki/Patricia_tree
GHOST: http://www.cs.huji.ac.il/~avivz/pubs/13/btc_scalability_full.pdf
StorJ and Autonomous Agents, Jeff Garzik: https://tinyurl.com/storj-agents
Mike Hearn on Smart Property at Turing Festival: http://www.youtube.com/watch?v=Pu4PAMFPo5Y
Ethereum RLP: https://github.com/ethereum/wiki/wiki/%5BEnglish%5D-RLP
Ethereum Merkle Patricia trees: https://github.com/ethereum/wiki/wiki/%5BEnglish%5D-Patricia-Tree
Peter Todd on Merkle sum trees:http://sourceforge.net/p/bitcoin/mailman/message/31709140/
產(chǎn)品與服務(wù)
香港服務(wù)器 香港高防服務(wù)器 美國服務(wù)器 韓國服務(wù)器 新加坡服務(wù)器 日本服務(wù)器 臺灣服務(wù)器云服務(wù)器
香港云主機 美國云主機 韓國云主機 新加坡云主機 臺灣云主機 日本云主機 德國云主機 全球云主機高防專線
海外高防IP 海外無限防御 SSL證書 高防CDN套餐 全球節(jié)點定制 全球?qū)>GPLC關(guān)于我們
關(guān)于天下數(shù)據(jù) 數(shù)據(jù)招商加盟 天下數(shù)據(jù)合作伙伴 天下數(shù)據(jù)團隊建設(shè) 加入天下數(shù)據(jù) 媒體報道 榮譽資質(zhì) 付款方式關(guān)注我們
微信公眾賬號
新浪微博
天下數(shù)據(jù)手機站 關(guān)于天下數(shù)據(jù) 聯(lián)系我們 誠聘英才 付款方式 幫助中心 網(wǎng)站備案 解決方案 域名注冊 網(wǎng)站地圖
天下數(shù)據(jù)18年專注海外香港服務(wù)器、美國服務(wù)器、海外云主機、海外vps主機租用托管以及服務(wù)器解決方案-做天下最好的IDC服務(wù)商
《中華人民共和國增值電信業(yè)務(wù)經(jīng)營許可證》 ISP證:粵ICP備07026347號
朗信天下發(fā)展有限公司(控股)深圳市朗玥科技有限公司(運營)聯(lián)合版權(quán)
深圳總部:中國.深圳市南山區(qū)深圳國際創(chuàng)新谷6棟B座10層 香港總部:香港上環(huán)蘇杭街49-51號建安商業(yè)大廈7樓
7×24小時服務(wù)熱線:4006388808香港服務(wù)電話:+852 67031102
本網(wǎng)站的域名注冊業(yè)務(wù)代理北京新網(wǎng)數(shù)碼信息技術(shù)有限公司的產(chǎn)品