區塊鏈技術之以太坊ETH白皮書(全文翻譯)

基於中本聰區塊鏈比特幣1.0之後,天才少年Vitalik Buterin(V神)在2013年年末發佈了以太坊白皮書,其實他以前在比特社區是一名活躍分子,更是文章的供稿者,對比特幣的見解和不足獨到而專業。區塊鏈以太坊2.0是一個運行智能合約的去中心化平臺,平臺上的運用按照程序設定運行,不存在停機、審查、欺詐、第三方人為干預的可能,智能合約開發者可以使用官方提供的模塊進行開發以太坊區塊鏈協議的應用。今天給大家全文翻譯以太坊白皮書,共大家參考研究,全文如下:

區塊鏈技術之以太坊ETH白皮書(全文翻譯)

基於比特幣的下一代智能契約分散應用平臺

此處目錄省略……

比特幣及現有概念簡介

歷史

分散數字貨幣的概念,以及財產登記等替代應用,已經存在了幾十年了。上世紀80年代和90年代的匿名電子現金協議,主要依賴於一種名為Chaumian盲的密碼原語,提供了一種高度隱私的貨幣,但這些協議由於依賴於一個集中的中介,在很大程度上未能獲得支持。1998年, Wei Dai的 b-money成為第一個提出通過解決計算難題和分散協商一致來創造資金的建議,但該提案對於如何實際執行分散協商一致意見的細節很少。2005年,哈爾·芬尼提出了一個概念可重複使用的工作證明一種系統,它使用來自b-money的想法和adam back的計算困難的哈希函數題來創建一個加密貨幣的概念,但是由於要依賴可信的計算作為後端,它又一次沒有達到理想的目標。2009年,中本聰(Satoshi Nakamoto)首次在實踐中實施了一種分散的貨幣,將通過公鑰加密管理所有權的既定原語與追蹤誰擁有硬幣的協商一致算法(稱為“工作證明”)結合起來。

工作證明背後的機制是空間上的一個突破,因為它同時解決了兩個問題。首先,它提供了一個簡單和適度有效的協商一致算法,允許網絡中的節點共同商定一組比特幣分類賬狀態的規範更新。第二,它提供了一種允許自由進入協商一致進程的機制,解決了決定由誰來影響協商一致的政治問題,同時也防止了Sybil的攻擊。這樣做的辦法是用經濟障礙取代正式的參與障礙,例如要求在特定名單上登記為唯一實體-一個節點在協商一致投票過程中的權重與該節點所帶來的計算能力成正比。從那時起,人們提出了另一種方法,稱為樁的證明,計算節點的權重與其貨幣持有量成正比,而不是計算資源;關於這兩種方法的相對優點的討論超出了本文的範圍,但應當指出,這兩種方法都可以用作加密貨幣的主要計算方法。

這裡有一篇博文,來自以太坊創始人Vitalik buterin關於以太坊歷史(原文這裡有鏈接,鏈接了一篇文章)是另一篇有著更多歷史的博客文章。

比特幣作為一個STATE過渡系統

從技術角度看,比特幣等加密貨幣的分類賬可以看作是一個狀態轉換系統,其中存在一個“狀態”,它由所有現有比特幣的所有權狀態和接受狀態和事務的“狀態轉換函數”組成,並輸出一個新的狀態。例如,在標準銀行系統中,狀態是資產負債表,事務是將$X從A轉移到B的請求,狀態轉換函數將A的帳戶中的值減少$X並將B帳戶中的值增加$X。如果A的帳戶首先小於$X,狀態轉換函數將返回一個錯誤。因此,我們可以正式界定:

APPLY(S,TX) -> S' or ERROR

在上述銀行系統中:

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

比特幣中的“狀態”是指所有已被開採但尚未使用的硬幣(技術上,“未用交易輸出”或UTXO)的集合,每個UTXO都有一個面額和一個所有者(由一個20字節地址定義,該地址本質上是一個加密公鑰)。事務包含一個或多個輸入,每個輸入包含對現有UTXO的引用和與所有者地址關聯的私鑰生成的加密簽名,以及一個或多個輸出,每個輸出包含要添加到狀態的新UTXO。

狀態轉移函數APPLY(S,TX) -> S'大致可以定義如下:

中的每一個輸入TX:

  1. 如果引用的UTXO不在S,返回一個錯誤。
  2. 如果提供的簽名與UTXO的所有者不匹配,則返回一個錯誤。

如果所有輸入UTXO的面值之和小於所有輸出UTXO的值和,則返回一個錯誤。

迴歸S'刪除所有輸入UTXO,並添加所有輸出UTXO。

第一步的前半部分阻止交易發送者使用不存在的硬幣,第一步的後半部分阻止交易發送者使用他人的硬幣,第二步強制保護價值。為了用於支付,協議如下。假設愛麗絲想送11.7BTC給鮑勃。首先,Alice將尋找一組可用的UTXO,它擁有的UTXO總數至少可達11.7BTC。實際上,Alice不可能得到精確的11.7BTC;假設她能得到的最小值是6+4+2=12。然後她用這三個輸入和兩個輸出創建一個事務。第一個輸出為11.7BTC,其所有者為Bob的地址,第二個輸出為剩餘的0.3BTC“Change”,所有者為Alice本人。

採掘

如果我們能夠訪問可靠的集中式服務,那麼這個系統的實現就很簡單;它可以使用集中式服務器的硬盤驅動器來跟蹤狀態,只需按照描述的方式進行編碼即可。然而,有了比特幣,我們正試圖建立一個分散的貨幣體系,因此我們需要將國家過渡制度與共識體系結合起來,以確保每個人都同意交易的順序。比特幣的分散協商一致過程要求網絡中的節點不斷嘗試生成稱為“塊”的交易包。網絡的目的是每十分鐘產生大約一個塊,每個塊包含一個時間戳,一個現在,一個引用(即。)上一個塊的散列和自上一個塊以來發生的所有事務的列表。隨著時間的推移,這創造了一個持續不斷增長的“區塊鏈”,它不斷更新以代表比特幣分類賬的最新狀態。

在此範例中,用於檢查塊是否有效的算法如下:

  1. 檢查塊引用的前一個塊是否存在且是否有效。
  2. 檢查塊的時間戳是否大於前一個塊的時間戳,檢查塊上的工作證明是否有效。
  3. 放任S[0]是前一個塊末尾的狀態。
  4. 假設TX是塊的事務列表n交易。為所有人i在……裡面..n-1,集S[i+1] = APPLY(S[i],TX[i])如果任何應用程序返回錯誤,退出並返回false。
  5. 返回true,並註冊S[n]就像這個街區盡頭的以個塊。

本質上,塊中的每個事務必須提供一個有效的狀態轉換,從執行事務之前的規範狀態轉換到某種新的狀態。請注意,狀態不是以任何方式在塊中編碼的;它純粹是一個要由驗證節點記住的抽象,只能(安全地)計算任何塊的狀態,方法是從起始狀態開始並依次應用每個塊中的每個事務。另外,請注意,礦工將事務包含到塊中的順序很重要;如果一個塊中有兩個事務A和B,使得B花費由A創建的UTXO,則如果A位於B之前,則該塊將是有效的。

上述清單中沒有在其他系統中找到的一個有效條件是“工作證明”的要求。精確的條件是,每個塊的雙sha 256散列必須小於動態調整的目標,而在撰寫本文時該目標約為2。187..這樣做的目的是使塊創建在計算上“很難”,從而防止Sybil攻擊者重新構建有利於他們的整個區塊鏈。由於SHA 256被設計為一個完全不可預測的偽隨機函數,因此創建有效塊的唯一方法是簡單地嘗試和錯誤,反覆遞增當前值,並查看新哈希是否匹配。

目前的目標是~2187,網絡必須使平均~269在找到有效塊之前嘗試;一般來說,目標每2016塊由網絡重新校準,這樣網絡中的某個節點平均每十分鐘就產生一個新的塊。為了補償礦工的這一計算工作,每個區塊的礦工有權包括一筆交易,讓自己從不知道的地方得到12.5 BTC。此外,如果任何交易的投入總額高於其產出,則差額也作為“交易費”交給礦商。順便說一句,這也是BTC發行的唯一機制;創世狀態根本不含硬幣。

為了更好地理解挖掘的目的,讓我們檢查一下在發生惡意攻擊者時會發生什麼。由於比特幣的底層密碼系統眾所周知是安全的,攻擊者將攻擊比特幣系統中沒有直接受到加密保護的一個部分:交易順序。攻擊者的策略很簡單:

  1. 向商家發送100 btc以換取某種產品(最好是快速交付的數字商品)。
  2. 等待產品的交付
  3. 生成另一個事務,將相同的100 btc發送給自己。
  4. 試著說服網絡,他對自己的交易是第一位的。

一旦第(1)步發生,幾分鐘後,一些礦工將把交易包括在一個塊中,例如區塊編號270。大約一個小時後,又有五個塊被添加到該塊之後的鏈中,每個塊都間接地指向事務,從而“確認”了它。此時,商家將接受付款作為最後確定和交付產品;因為我們假設這是一個數字商品,交貨是即時的。現在,攻擊者創建另一個事務,將100 BTC發送給自己。如果攻擊者簡單地將其釋放到野外,則事務將不會被處理;礦工將嘗試運行。APPLY(S,TX)注意到TX使用不再處於狀態的UTXO。因此,攻擊者創建塊鏈的“叉”,首先是挖掘塊270的另一個版本,指向作為父塊的同一塊269,但以新事務代替舊事務。因為塊數據是不同的,這需要重新做工作的證明。此外,攻擊者的新版本的塊270具有不同的哈希,因此原始塊271至275不“指向”它;因此,原始鏈和攻擊者的新鏈是完全獨立的。規則是,在叉子中,最長的區塊鏈被認為是事實,因此合法的礦工將在275鏈上工作,而攻擊者單獨處理270鏈。為了讓攻擊者使他的區塊鏈最長,他需要比網絡其他部分加起來有更多的計算能力才能趕上(因此,“51%攻擊”)。

梅克爾樹

左:只需在梅克爾樹中顯示少量的節點就可以證明分支的有效性。

右:任何試圖改變梅克爾樹的任何部分,最終都會導致鏈上某個地方的不一致。

比特幣的一個重要的可擴展性特點是該塊存儲在一個多層次的數據結構中。塊的“散列”實際上只是塊頭的散列,這是一個大約200字節的數據段,包含時間戳、現在、前一個塊哈希和一個名為梅克爾樹的數據結構的根散列,該數據結構存儲了塊中的所有事務。梅克爾樹是二叉樹的一種類型,它由一組包含底層數據的具有大量葉節點的節點、一組中間節點組成,其中每個節點是其兩個子節點的散列,最後是由兩個子節點的散列組成的單個根節點,表示樹的“頂部”。梅克爾樹的目的是允許塊中的數據被分段地傳遞:節點只能從一個源下載一個塊的頭,從另一個源下載與其相關的樹的一小部分,並且仍然可以確保所有數據都是正確的。這樣做的原因是哈希向上傳播:如果惡意用戶試圖在假事務中交換到梅克爾樹的底部,此更改將導致上面節點發生更改,然後在該節點上發生更改,最後更改樹根,從而更改塊的散列,從而導致協議將其註冊為一個完全不同的塊(幾乎可以肯定是無效的工作證明)。

梅克爾樹協議可以說是長期可持續發展的關鍵。比特幣網絡中的一個“完整節點”負責存儲和處理所有塊,截至2014年4月,它在比特幣網絡中佔據了大約15 GB的磁盤空間,並且每月增長超過1千兆字節。目前,這是可行的一些臺式機,而不是手機,以後只有企業和愛好者才能參與。稱為“簡化支付驗證”(SPV)的協議允許另一類節點存在,稱為“輕型節點”,它下載塊頭,驗證塊頭的工作證明,然後只下載與它們相關的事務的“分支”。這使得輕節點可以在安全的有力保證下,確定任何比特幣交易的狀態,以及它們當前的餘額,同時只下載整個區塊鏈的一小部分。

可供選擇的BlockChain應用程序

採用底層區塊鏈概念並將其應用於其他概念的想法也有著悠久的歷史。1998年,Nick Szabo提出了擁有權的財產所有權的安全一份文件描述了“複製數據庫技術的新進展”將如何允許一個基於區塊鏈的系統來存儲誰擁有什麼土地的登記冊,從而創建了一個包括定居、不利佔有和格魯吉亞土地稅等概念在內的複雜框架。然而,不幸的是,當時沒有有效的複製數據庫系統,因此該協議從未在實踐中得到實施。然而,2009年之後,比特幣的分散協商一致意見一經形成,許多替代應用就開始迅速出現。

  • 幣命名-2010年創建,幣命名最好描述為一個分散的名稱註冊數據庫。在分散協議如Tor、比特幣和BitMessage中,需要有某種方式來識別帳戶,以便其他人可以與它們進行交互,但在所有現有解決方案中,唯一可用的標識符是偽隨機散列。1LW79wp5ZBqaHW1jL5TCiBCrhQYtHagUWy..理想的情況下,一個人希望能夠有一個帳戶的名字,如“喬治”。然而,問題是,如果一個人可以創建一個名為“george”的帳戶,那麼其他人也可以使用相同的過程為自己註冊“george”並模仿它們。唯一的解決方案是第一個文件模式,第一個寄存器成功,第二個寄存器失敗-這個問題非常適合比特幣協商一致協議。命名是使用這種思想實現名稱註冊系統的最古老和最成功的方法。
  • 染色幣-染色幣(這裡有人翻譯成彩色硬幣,是錯誤的,染色幣是一種所有權和轉讓的技術)是作為一種協議,允許人們創建自己的數字貨幣-或者,在比特幣區塊鏈上,一種只有一個單位的貨幣-數字令牌-的重要情況下。在有色硬幣協議中,一種通過向特定比特幣UTXO公開分配顏色來“發行”一種新貨幣,該協議遞歸地定義其他UTXO的顏色與創建它們的事務所使用的輸入的顏色相同(在混合顏色輸入的情況下適用一些特殊規則)。這允許用戶維護僅包含特定顏色的UTXO的錢包,並將其發送到與普通比特幣非常類似的位置,通過塊鏈回溯以確定它們接收到的任何UTXO的顏色。
  • 元硬幣-元貨幣的思想是要有一種生活在比特幣之上的協議,使用比特幣交易來存儲元貨幣交易,但具有不同的狀態轉換功能,APPLY'..由於元現金協議不能阻止無效的元現金交易出現在比特幣區塊鏈中,因此添加了一條規則,即如果APPLY'(S,TX)返回一個錯誤,協議默認為APPLY'(S,TX) = S..這為創建任意加密貨幣協議提供了一種簡單的機制,可能具有無法在比特幣內部實現的高級功能,但開發成本非常低,因為比特幣協議已經處理了挖掘和聯網的複雜性。元賬戶已被用於執行某些類別的金融合同、名稱登記和分散的交換。

因此,一般來說,有兩種方法來建立一個共識協議:建立一個獨立的網絡和建立一個基於比特幣的協議。前一種方法雖然在幣命名這樣的應用程序中相當成功,但很難實現;每個單獨的實現都需要引導獨立的塊鏈,以及構建和測試所有必要的狀態轉換和網絡代碼。此外,我們預測,分散協商一致技術的應用集將遵循冪律分佈,其中絕大多數應用程序太小,無法保證自己的區塊鏈,我們注意到存在大量分散應用程序,特別是分散的自治組織,它們需要相互交互。

另一方面,基於比特幣的方法存在一個缺陷,即它沒有繼承比特幣的簡化支付驗證功能。SPV適用於比特幣,因為它可以使用區塊鏈深度作為有效性的代理;在某種程度上,一旦交易的祖先走得足夠遠,就可以肯定地說,他們是國家的合法一部分。另一方面,基於塊鏈的元協議不能強迫區塊鏈不包括在它們自己的協議上下文中無效的事務。因此,一個完全安全的SPV元協議實現需要一直向後掃描到比特幣塊鏈的開始,以確定某些事務是否有效。目前,所有基於比特幣的元協議的“輕量級”實現都依賴於可信的服務器來提供數據,這可以說是一種高度次優的結果,尤其是當加密貨幣的主要目的之一是消除對信任的需求時。

腳本編寫

即使沒有任何擴展,比特幣協議實際上也為“智能合同”概念的薄弱版本提供了便利。比特幣中的UTXO不僅可以由公鑰擁有,還可以由使用簡單的基於堆棧的編程語言表示的更復雜的腳本所擁有。在這個範例中,UTXO必須提供滿足腳本的數據的事務開銷。實際上,甚至基本的公鑰所有權機制也是通過腳本實現的:腳本以一個橢圓曲線簽名作為輸入,根據事務和擁有UTXO的地址驗證它,如果驗證成功返回1,否則返回0。其他更復雜的腳本存在於各種附加用例中。例如,可以構造一個腳本,它需要從給定的三個私鑰中的兩個簽名來驗證(“multisig”),這是一個對公司帳戶、安全儲蓄帳戶和一些商家託管情況有用的設置。腳本也可以用來支付解決計算問題的賞金,甚至可以構造一個腳本,上面寫著“如果你能提供SPV證據證明你發送了這個面額的Dogecoin交易給我”,你甚至可以構造一個類似於“這個比特幣UTXO是你的”的腳本,實質上是允許分散的跨加密貨幣交換。

然而,在比特幣中實現的腳本語言有幾個重要的限制:

  • 缺乏完備性也就是說,雖然比特幣腳本語言支持的計算子集很大,但它幾乎不支持一切。缺少的主要類別是循環。這樣做是為了避免事務驗證過程中的無限循環;理論上,這對於腳本程序員來說是一個可以克服的障礙,因為任何循環都可以通過使用if語句多次重複底層代碼來模擬,但是它確實導致腳本的空間效率非常低。例如,實現另一種橢圓曲線簽名算法可能需要256個重複乘法輪,所有這些都單獨包含在代碼中。
  • 價值盲目-UTXO腳本無法對可以提取的金額提供細粒度控制。例如,甲骨文合同的一個強大的用例是套期保值合同,其中A和B投入了價值1000美元的BTC,30天后腳本將價值1000美元的BTC發送給A,其餘的發送給B。這將需要一個甲骨文來確定1 BTC的美元價值,但即便如此,在信任和基礎設施需求方面,與現在可獲得的完全集中的解決方案相比,這仍是一個巨大的改進。然而,由於UTXO是全部或無意義的,實現這一目標的唯一途徑是通過非常低效的攻擊,即擁有許多不同教派的UTXO(例如。一個UTXO為2k對於每k到30)和有O選擇哪個UTXO發送給A和哪個到B。
  • 區塊缺乏-aUTXO既可以用也可以不用沒有機會進行多階段的合同或腳本來保留任何其他內部狀態。這使得很難達成多級期權合同、分散交換提議或兩階段密碼承諾協議(對於安全的計算賞金來說是必要的)。這也意味著UTXO只能用於構建簡單的一次性契約,而不能用於構建更復雜的“有狀態”契約,比如分散的組織,並且使得元協議難以實現。二元狀態與價值盲目性相結合,也意味著另一個重要的應用-退出限制-是不可能的.
  • 分塊盲目-UTXO對塊鏈數據(如現在、時間戳和以前的塊哈希)是盲的。這嚴重限制了博彩和其他幾個類別的應用程序,因為它剝奪了腳本語言潛在價值的隨機性來源。

因此,我們看到了三種在加密貨幣之上構建高級應用程序的方法:構建一個新的區塊鏈,在比特幣上使用腳本,以及在比特幣之上構建一個元協議。構建一個新的區塊鏈允許無限自由地構建一個特性集,但代價是開發時間、引導工作和安全性。使用腳本很容易實現和標準化,但它的能力非常有限,而元協議雖然容易,但在可伸縮性方面存在缺陷。我們打算建立一個可供選擇的框架,提供更大的開發輕鬆收益以及更強大的輕量級客戶端屬性,同時允許應用程序共享經濟環境和區塊鏈安全。

以太坊

以太坊的目的是創建一種構建分散應用程序的替代協議,提供一套不同的折衷方案,我們認為這些協議對於大量分散應用程序非常有用,特別強調快速開發時間、小型和很少使用的應用程序的安全性以及不同應用程序非常有效地進行交互的能力的情況。以太坊通過構建本質上是最抽象的基礎層來實現這一點:一個帶有內置圖靈完整編程語言的區塊鏈,允許任何人編寫智能契約和分散應用程序,在這些應用程序中,他們可以為所有權、事務格式和狀態轉換函數創建自己的任意規則。命名的基本版本可以用兩行代碼編寫,其他協議(如貨幣和聲譽系統)可以在20以下構建。智能合同,即包含價值的密碼“盒子”,只有在滿足特定條件的情況下才能解鎖,也可以建立在平臺之上,由於圖靈的完整性、價值意識、區塊鏈意識和狀態的增加,比特幣腳本提供的能力要大得多。

原理

以太坊背後的設計旨在遵循以下原則:

  1. 簡約:以太坊協議應該儘可能簡單,即使代價是一些數據存儲或時間效率低下。FN。三理想情況下,一個普通的程序員應該能夠遵循並實現整個規範,FN。四從而充分認識到密碼貨幣所帶來的前所未有的民主化潛力,並進一步實現了以太坊作為一種向所有人開放的協議的願景。任何增加複雜性的優化都不應該包括在內,除非該優化提供了非常大的好處。
  2. 普遍性:以太的設計哲學的一個基本部分是,以太沒有“特徵”。FN。五相反,以太坊提供了一種內部圖靈完整的腳本語言,程序員可以使用它來構造任何可以通過數學定義的智能契約或事務類型。想發明你自己的金融衍生產品嗎?有了以太,你可以。想製造自己的貨幣嗎?把它設為以太合同。想要建立一個全面的守護進程或天網嗎?你可能需要幾千個連鎖合同,並確保慷慨地餵養他們,這樣做,但沒有什麼能阻止你與以太在你的指尖。
  3. 模塊化*“以太協議”的部分應儘可能模塊化和可分離。在開發過程中,我們的目標是創建一個程序,如果在一個地方進行一個小的協議修改,那麼應用程序棧將繼續工作,而無需進行任何進一步的修改。諸如ethash之類的創新(見黃紙附錄或Wiki文章)、改良的Patricia樹(黃紙, 維基)和RLP(yp, 維基)應該並且是作為獨立的、功能完整的庫實現的。這是因為,即使這些特性在以太坊中使用,即使以太坊不需要某些特性,這些特性在其他協議中也是可用的。應該最大限度地開發,以使整個加密貨幣生態系統受益,而不僅僅是它本身。
  4. 敏捷性“以太協議”的細節不是一成不變的。雖然我們將非常明智地修改高級別結構,例如使用切分路線圖,抽象執行,僅以協商一致的方式提供數據。稍後在開發過程中進行的計算測試可能會導致我們發現某些修改,例如對協議體系結構或EIT虛擬機(EVM)的修改,將大大提高可伸縮性或安全性。如果有任何這樣的機會,我們將加以利用。
  5. 非歧視非審查*議定書不應試圖積極限制或阻止特定類別的使用。議定書中的所有管制機制都應設計成直接管制危害,而不是試圖反對具體的不良應用。一個程序員甚至可以運行一個無限循環腳本,只要他們願意繼續支付每個計算步驟的事務費。

以太帳戶

在以太坊中,狀態由稱為“Account”的對象組成,每個帳戶都有一個20字節的地址,狀態轉換是在帳戶之間直接傳輸值和信息。以太坊帳戶包含四個字段:

  • 目前這個,用於確保每個事務只能處理一次的計數器。
  • 帳戶活期幣平衡
  • 賬戶合同代碼
  • 賬戶儲物

“以太”是“以太”的主要內部密碼燃料,用於支付交易費用。一般而言,有兩類帳戶:外部擁有賬戶,由私鑰控制,以及合同賬戶由他們的合同代碼控制。外部擁有的帳戶沒有代碼,您可以通過創建和簽署事務從外部擁有的帳戶發送消息;在合同帳戶中,每次合同帳戶收到其代碼激活的消息時,都允許它讀取和寫入內部存儲,併發送其他消息或依次創建合同。

請注意,不應將以太坊中的“Contracts”視為應該“實現”或“遵守”的東西;相反,它們更像是生活在以太坊執行環境中的“自主代理”,在被消息或事務“戳”時總是執行特定的代碼段,並直接控制自己的以太平衡和自己的鍵/值存儲,以跟蹤持久變量。

消息和事務

術語“Transaction”在以太坊中用於指已簽名的數據包,該數據包存儲從外部擁有的帳戶發送的消息。交易包括:

  • 消息的接收方
  • 標識發件人的簽名
  • 從發送方轉移到收件人的以太幣數量。
  • 可選數據字段
  • 一個區塊鏈值,表示允許事務執行所採取的最大計算步驟數。
  • A GASPRICE值,表示發送方按計算步驟支付的費用。

前三個是任何加密貨幣中預期的標準字段。默認情況下,數據字段沒有功能,但是虛擬機有一個操作碼,合同可以用來訪問數據;例如,如果合同作為塊鏈域註冊服務運行,那麼它可能希望將傳遞給它的數據解釋為包含兩個“字段”,第一個字段是要註冊的域,第二個字段是要註冊到的IP地址。契約將從消息數據中讀取這些值,並將它們適當地放在存儲中。

這個STARTGAS和GASPRICE字段對於以太坊的反拒絕服務模型來說是至關重要的。為了防止代碼中意外或敵對的無限循環或其他計算浪費,每個事務都需要對它可以使用的代碼執行的計算步驟設置一個限制。計算的基本單位是“GAS”;通常,計算步驟花費1 GAS,但是一些操作花費更高的氣體量,因為它們在計算上更昂貴,或者增加了必須作為狀態一部分存儲的數據量。事務數據中的每個字節也要收取5 GAS的費用。收費系統的目的是要求攻擊者按比例支付所消耗的每一個資源,包括計算、帶寬和存儲;因此,任何導致網絡消耗更多這些資源的事務都必須具有與增量大致成比例的煤氣費。

通訊

合同能夠向其他合同發送“信息”。消息是從未序列化過的虛擬對象,並且僅存在於以太坊執行環境中。一條信息包含:

  • 消息的發送方(隱式)
  • 消息的接收方
  • 與消息一起傳輸的以太幣的數量。
  • 可選數據字段
  • 一個區塊鏈價值

從本質上說,一個消息就像一個事務,除了它是由一個合同而不是一個外部參與者產生的。噹噹前執行代碼的契約執行CALL操作碼,它生成並執行一條消息。與事務一樣,郵件會導致收件人帳戶運行其代碼。因此,合同可以與外部行為者完全相同的方式與其他合同建立關係。

請注意,由交易或合同分配的氣體餘量適用於該交易和所有次執行所消耗的氣體總量。例如,如果外部參與者A向B發送一個事務,其中有1000種氣體,而B在向C發送消息之前消耗600種氣體,而C的內部執行在返回之前消耗300種氣體,則B可以在耗盡氣體之前再消耗100種氣體。

以太坊區塊函數轉移

以太坊轉變函數,APPLY(S,TX) -> S'可定義如下:

  1. 檢查交易是否格式良好,簽名是有效的,並且該簽名與發件人帳戶中的當前值相匹配。如果沒有,則返回一個錯誤。
  2. 計算交易費用STARTGAS * GASPRICE,並根據簽名確定發送地址。從寄件人的帳戶餘額中減去費用,並增加寄件人的現值。如果沒有足夠的餘額來消費,請返回一個錯誤。
  3. 初始化GAS = STARTGAS,然後每字節取出一定數量的氣體來支付事務中的字節。
  4. 將事務值從發件人的帳戶轉移到接收帳戶。如果接收帳戶還不存在,請創建它。如果接收帳戶是合同,則運行合同代碼以完成或直到執行完為止。
  5. 如果由於發件人沒有足夠的錢或代碼執行的氣體用完而導致價值轉移失敗,則恢復除支付費用以外的所有狀態更改,並將費用添加到礦工帳戶。
  6. 否則,將所有剩餘氣體的費用退還給發件人,並將所支付的煤氣費發送給礦工。

例如,假設合同的代碼是:

if !self.storage[calldataload(0)]:

self.storage[calldataload(0)] = calldataload(32)

注意,實際上契約代碼是用低級別的EVM代碼編寫的;為了清晰起見,這個示例是用我們的一種高級語言-毒蛇編寫的,可以編譯成EVM代碼。假設契約的存儲從空開始,事務以10以太值、2000年天然氣、0.001以太幣汽油價格和64字節數據發送,字節0-31表示數字。2和表示字符串的字節32-63。CHARLIE.FN。六在這種情況下,狀態轉換函數的過程如下:

  1. 檢查事務是否有效且格式良好。
  2. 檢查事務發送方是否至少有2000*0.001=2以太。如果是,那麼從寄件人的帳戶中減去2以太。
  3. 初始化GAS=2000;假設事務長170字節,字節費為5,減去850,剩下1150個GAS。
  4. 從發件人的帳戶中再減去10個以太,並將其添加到合同的帳戶中。
  5. 運行代碼。在本例中,這很簡單:它檢查合同是否存儲在索引處2時,注意到它不是,因此它在索引處設置了存儲。2價值CHARLIE..假設這需要187個氣體,那麼剩餘的氣體量是1150-187=963。
  6. 將963*0.001=0.963以太添加回發送方帳戶,並返回結果狀態。

如果在交易的接收端沒有合同,那麼交易費用總額就等於提供的交易費用。GASPRICE乘以事務的長度(以字節為單位),以及在事務旁邊發送的數據將是不相關的。

請注意,消息在恢復方面等效於事務:如果消息執行耗盡了GAS,則該消息的執行以及由該執行觸發的所有其他執行將恢復,但父執行不需要恢復。這意味著一個合同調用另一個合同是“安全的”,就好像A用G氣體調用B,那麼A的執行就保證最多損失G氣體。最後,請注意有一個操作碼,CREATE,這就創建了一個契約;它的執行機制通常類似於CALL,除非執行的輸出決定新創建的契約的代碼。

代碼執行

以太坊Contracts中的代碼是用一種低級的、基於堆棧的字節碼語言編寫的,稱為“Etruum虛擬機代碼”或“EVM代碼”。代碼由一系列字節組成,每個字節代表一個操作。通常,代碼執行是一個無限循環,它包括在當前程序計數器(從零開始)重複執行操作,然後將程序計數器遞增一個,直到到達代碼的末尾或出現錯誤或STOP或RETURN檢測到指令。這些操作可以訪問三種類型的存儲數據的空間:

  • 這個堆疊,是一種可以將值推送和彈出的先入先出的容器。
  • 記憶,一個可無限擴展的字節數組。
  • 合同的長期期限儲物、鑰匙/價值商店。與堆棧和內存不同,堆棧和內存在計算結束後重置,存儲將長期保持。

代碼還可以訪問傳入消息的值、發送方和數據以及塊頭數據,代碼還可以返回數據的字節數組作為輸出。

EVM代碼的形式執行模型非常簡單。當以太坊虛擬機運行時,它的全部計算狀態可以由元組定義。(block_state, transaction, message, code, memory, stack, pc, gas),在哪裡block_state包含所有帳戶幷包括餘額和存儲的全局狀態。在每一輪執行開始時,通過接受pc-第四字節code(或0如果pc >= len(code)),每個指令都有自己的定義,說明它如何影響元組。例如,ADD從堆棧中彈出兩個項,並將它們的和推入,減少gas增加1和增量pc增加1,以及SSTORE彈出堆棧中的前兩項,並將第二項插入到由第一項指定的索引處的合同存儲中。雖然有許多方法可以通過實時編譯來優化以太坊虛擬機的執行,但可以在幾百行代碼中完成以太坊的基本實現。

區塊鏈與採礦

以太坊區塊鏈在許多方面與比特幣區塊鏈相似,儘管它確實有一些不同之處。與比特幣在區塊鏈結構方面的主要區別在於,與比特幣不同(比特幣只包含交易列表的副本),以太坊塊包含事務列表和最近狀態的副本。除此之外,還在塊中存儲了另外兩個值,塊號和難度。以太坊中的基本塊驗證算法如下:

  1. 檢查前面引用的塊是否存在且是否有效。
  2. 檢查該塊的時間戳是否大於所引用的前一個塊的時間戳,並且在以後不到15分鐘內。
  3. 檢查區塊號、難度、交易根、伯伯根和氣體限值(各種低層次的具體概念)是否有效。
  4. 檢查塊上的工作證明是否有效。
  5. 放任S[0]是前一個塊末尾的狀態。
  6. 放任TX是塊的事務列表,與n交易。為所有人i在……裡面..n-1,集S[i+1] = APPLY(S[i],TX[i])..如果任何應用程序返回錯誤,或者在此之前塊中消耗的氣體總量超過GASLIMIT,返回一個錯誤。
  7. 放任S_FINAL成S[n],但加上付給礦工的整塊報酬。
  8. 檢查狀態的梅克爾樹根是否為S_FINAL等於塊標頭中提供的最終狀態根。如果是,則該塊有效;否則,該塊無效。

乍一看,這種方法看起來效率很低,因為它需要用每個塊存儲整個狀態,但實際上效率應該可以與比特幣相媲美。原因是狀態存儲在樹結構中,在每個塊之後只需要更改樹的一小部分。因此,一般來說,在兩個相鄰的塊之間,樹的絕大部分應該是相同的,因此數據可以使用指針存儲一次和引用兩次(即。(子樹的散列)。為此,使用了一種稱為“Patricia樹”的特殊樹,包括對梅克爾樹概念的修改,該概念允許插入和刪除節點,而不僅僅是有效地更改節點。此外,由於所有的狀態信息都是最後一個塊的一部分,所以沒有必要存儲整個區塊鏈歷史-如果可以將其應用於比特幣,就可以計算出這種策略可以節省5到20倍的空間。

在物理硬件方面,一個常見的問題是“在哪裡”執行合同代碼。這有一個簡單的答案:執行合同代碼的過程是狀態轉換函數定義的一部分,而狀態轉換函數是塊驗證算法的一部分,因此,如果將事務添加到塊中。B該事務產生的代碼執行將由下載和驗證塊的所有節點(現在和將來)執行。B.

應用

一般來說,在以太坊頂部有三種類型的應用程序。第一類是金融應用程序,為用戶提供更強大的管理和簽訂合同的方法。這包括子貨幣、金融衍生品、套期保值合同、儲蓄錢包、遺囑,甚至還有一些類別的全面就業合同。第二類是半金融應用,其中涉及資金,但也有一個沉重的非貨幣方面的工作正在進行;一個完美的例子是解決計算問題的自我執行獎金。最後,有些應用程序,如在線投票和分散治理,根本就不是財務問題。

令牌系統

區塊鏈令牌系統有許多應用程序,從代表美元或黃金等資產的子貨幣到公司股票,代表智能財產的單個令牌,安全令人難忘的優惠券,甚至與傳統價值完全無關的令牌系統,作為激勵的點系統。令牌系統在以太坊中非常容易實現。需要理解的關鍵是,貨幣或令牌系統基本上是一個數據庫,只有一個操作:從A中減去X單位並將X單位交給B,並規定:(1)A在交易之前至少有X個單位,(2)事務是由A批准的。實現令牌系統所需的全部工作就是將這種邏輯應用到合同中。

在Serpent中實現令牌系統的基本代碼如下:

def send(to, value):

if self.storage[msg.sender] >= value:

self.storage[msg.sender] = self.storage[msg.sender] - value

self.storage[to] = self.storage[to] + value

這本質上是本文檔中進一步描述的“銀行系統”狀態轉換功能的字面實現。需要添加一些額外的代碼行,以便首先提供分發貨幣單位的初始步驟和一些其他邊緣情況,理想情況下將添加一個函數,讓其他契約查詢地址的餘額。但僅此而已。理論上講,作為子貨幣的電子令牌系統可能包含基於比特幣的元貨幣鏈上的另一個重要特徵:以該貨幣直接支付交易費用的能力。執行這一辦法的方式是,合同將保持以太幣餘額,它將用以太幣向發件人退還用於支付費用的以太幣,並通過收取費用所收取的內部貨幣單位並在不斷進行的拍賣中轉售來補充這一餘額。因此,用戶需要用以太幣“激活”他們的帳戶,但是一旦以太幣出現,它就可以被重用,因為合同每次都會退款。

金融衍生工具及穩定價值貨幣

金融衍生品是“智能契約”最常見的應用,也是最簡單的代碼實現方法之一。執行金融合同的主要挑戰是,其中大多數都需要參考外部標價機;例如,一個非常可取的應用程序是一種智能合同,它針對美元的以太幣(或另一種加密貨幣)的波動進行對衝,但要做到這一點,就需要合同知道ETH/美元的價值。最簡單的方法是通過特定方維護的“數據輸入”契約(例如。(納斯達克(Nasdaq)的設計,使各方能夠根據需要更新合同,並提供一個界面,允許其他合同向該合同發送信息,並得到提供價格的回覆。

鑑於這一關鍵因素,套期保值合同看起來如下:

  1. 等待甲方輸入1000幣。
  2. 等待乙方輸入1000幣。
  3. 通過查詢數據提要合同,在存儲中記錄1000幣的美元值,假設這是$x。
  4. 30天后,允許A或B“重新激活”合同,以便將價值x美元的以太幣(通過再次查詢數據提要合同以獲得新的價格)發送到A,其餘的發送到B。

這樣的合同在密碼商業方面將有很大的潛力。關於密碼貨幣的一個主要問題是,它是不穩定的;雖然許多用戶和商人可能想要處理密碼資產的安全和方便,但他們可能不希望面對這樣的前景,即在一天之內損失他們資金價值的23%。到目前為止,最普遍提出的解決方案是發行者支持的資產;其想法是發行人創建一種子貨幣,他們有權發行和撤銷貨幣單位,並向任何向其(脫機)提供特定基礎資產單位(例如)的人提供一種貨幣單位。黃金,美元)。然後,發行人承諾向任何將密碼資產的一個單位發還的人提供基礎資產的一個單位。這種機制允許任何非加密資產被“提升”到加密資產,條件是發行者可以被信任。

然而,在實踐中,發行人並不總是值得信賴的,在某些情況下,銀行基礎設施過於薄弱,或過於敵對,以致於此類服務無法存在。金融衍生品提供了另一種選擇。在這裡,不只是一個發行人提供資金來支持一項資產,而是一個分散的投機者市場,押注密碼參考資產的價格(例如。會上升,扮演這個角色。與發行者不同的是,投機者沒有選擇在交易中違約,因為套期保值合約將他們的資金存放在代管中。請注意,這種方法並不是完全分散的,因為仍然需要一個可信的源來提供價格代碼,儘管可以說,這在降低基礎設施需求方面仍然是一個巨大的改進(與發行者不同,發佈價格提要不需要許可證,很可能被歸類為言論自由)和減少欺詐的可能性。

身份和聲譽系統

最早的替代密碼貨幣,幣的命名,試圖使用類似比特幣的區塊鏈來提供名稱註冊系統,用戶可以在公共數據庫中與其他數據一起註冊自己的名字。引用的主要用例是dns系統,將諸如“bitcoin.org”之類的域名(或者,在命名的例子中,是“bitcoin.bit”)映射到一個IP地址。其他用例包括電子郵件認證和可能更先進的信譽系統。以下是在Etruum上提供類似命名的名稱註冊系統的基本合同:

def register(name, value):

if !self.storage[name]:

self.storage[name] = value

契約非常簡單,所有這些都是以太坊網絡中的一個數據庫,可以添加,但不能修改或刪除。任何人都可以註冊一個具有某種價值的名稱,然後註冊就會永遠保持不變。更復雜的名稱登記合同還將有一個“功能條款”,允許其他合同對其進行查詢,併為“所有者”(即“所有者”)提供一種機制。更改數據或傳輸所有權的名稱的第一個寄存器。人們甚至可以在上面添加聲譽和信任網絡功能。

分散文件存儲

在過去幾年裡,出現了許多流行的在線文件存儲初創公司,其中最著名的是Dropbox,它們尋求允許用戶上傳硬盤的備份,並讓服務商店進行備份,並允許用戶以月費換取訪問。但是,在這一點上,文件存儲市場有時效率相對較低;粗略地看一下各種文件存儲市場。現有解決方案顯示,特別是在“不可思議的山谷”20-200 GB的水平上,無論是免費配額還是企業級折扣,主流文件存儲成本的每月價格都是如此,以至於你在一個月內支付的硬盤成本超過了整個硬盤的成本。以太坊合同可以開發一個分散的文件存儲生態系統,個人用戶可以通過出租自己的硬盤來賺取少量的錢,而未使用的空間可以用來進一步降低文件存儲的成本。

這種設備的關鍵支撐部分將是我們所稱的“分散的Dropbox合同”。本合同的作用如下。首先,將所需的數據分割成塊,對每個塊進行加密以實現隱私,並從中構建一棵梅克爾樹。然後,我們按照這樣的規則訂立合同:每N個塊,契約將在梅克爾樹中選擇一個隨機索引(使用以前的塊散列,從合同代碼中訪問,作為隨機性的來源),並將X以太交給第一個向交易提供簡化支付驗證的實體-就像在樹中的特定索引處證明塊的所有權一樣。當用戶想要重新下載他們的文件時,他們可以使用微支付通道協議(例如。支付1 Szabo/32 KB)來恢復該文件;最節省費用的方法是支付方在交易結束前不發佈交易,而是在每32 KB之後用相同的一次替換為稍微有利可圖的交易。

該協議的一個重要特徵是,儘管人們似乎相信許多隨機節點不會決定忘記文件,但通過祕密共享將文件分成多個片段,並通過查看每個節點的合同,可以將該風險降低到接近零。如果合同仍在支付款項,這就提供了一個密碼證明,證明有人仍在保存該文件。

分散自治組織

“分權自治組織”的一般概念是一個虛擬實體,它有一定的成員或股東,這些成員或股東可能以67%的多數,有權使用實體的資金並修改其代碼。成員們將集體決定該組織應如何分配其資金。分配DAO的資金的方法可以從賞金、薪水到更奇特的機制,比如內部貨幣來獎勵工作。這在本質上覆制了傳統公司或非營利組織的法律裝束,但只使用加密區塊鏈技術來執行。到目前為止,關於DAOS的大部分討論都圍繞著“分散的自治公司”(DAC)的“資本主義”模式,這種模式包括分紅股東和流通股;另一種可能被稱為“分權自治社區”的選擇,將讓所有成員在決策中享有平等的份額,並要求67%的現有成員同意增減一名成員。這樣,一個人只能有一個成員的要求就需要由該集團集體執行。

關於如何編寫DAO代碼的一般大綱如下。最簡單的設計就是一段自我修改的代碼,如果三分之二的成員同意修改,它就會改變。儘管代碼在理論上是不可變的,但通過將代碼塊放在單獨的契約中,並且具有存儲在可修改存儲中的可調用契約的地址,可以輕鬆地繞過這一問題,並具有事實上的可更改性。在這樣一個DAO合同的簡單實現中,將有三種事務類型,通過事務中提供的數據來區分:

  • [0,i,K,V]用索引註冊提案i更改存儲索引處的地址K重視V
  • [1,i]對提案投贊成票i
  • [2,i]最後確定提案i如果有足夠的選票

然後,合同中的每一項都有條款。它將保存所有開放存儲更改的記錄,以及誰投票支持它們的列表。它還將有一份所有成員的名單。當任何存儲更改都有三分之二的成員投票贊成時,最終事務就可以執行該更改。一個更復雜的骨架還可以為諸如發送事務、添加成員和刪除成員等功能內置投票能力,甚至還可以提供以下功能:液態民主-投票制代表團任何人都可以指派某人為他們投票,而分配是傳遞性的,所以如果A分配B和B分配C,則C決定A的投票)。這種設計將使DAO作為一個分散的社區有機地發展,使人們最終能夠將過濾成員的任務交給專家,儘管與“當前系統”的專家不同的是,隨著時間的推移,個體社區成員改變了他們的組合,專家們可以很容易地進入或消失。

另一種模式是分散的公司,任何帳戶都可以擁有零股或更多股份,三分之二的股份才能作出決定。一個完整的框架將涉及資產管理功能、股票買賣要約的能力以及接受要約的能力(最好在合同中有一個訂單匹配機制)。代表團也將存在流動性民主風格,概括了“董事會”的概念。

進一步應用

1.儲蓄錢包..假設愛麗絲想要保證她的資金安全,但是擔心她會輸,或者有人會黑她的私鑰。她與一家銀行Bob簽訂瞭如下合同:

  • 僅愛麗絲一人每天最多可提取1%的資金。
  • 只有Bob每天最多可以提取1%的資金,但是Alice有能力用她的鑰匙關閉這個能力進行交易。
  • 愛麗絲和鮑勃一起可以收回任何東西。

正常情況下,每天1%對愛麗絲來說就足夠了,如果愛麗絲想多取點錢,她可以聯繫鮑勃尋求幫助。如果愛麗絲的鑰匙被黑了,她就跑去找鮑勃,把錢轉移到一份新的合同上。如果她丟了鑰匙,鮑勃最終會把錢拿出來的。如果鮑勃被證明是惡意的,那麼她就可以關掉他退出的能力。

2.資金的對衝保險..人們可以輕鬆地達成金融衍生品合約,但可以使用天氣數據,而不是任何價格指數。如果一個衣阿華州的農民購買了一種衍生產品,這種衍生產品是根據愛荷華州的降雨量反向支付的,那麼如果發生乾旱,農民就會自動收到錢,如果有足夠的雨水,農民會很高興,因為他們的莊稼會很好。這可以擴展到一般的自然災害保險。

3.分散的數據輸入..對於不同的金融合同,實際上可以通過一種名為謝林..SchellingCoin基本上是這樣工作的:n個締約方都將給定數據的值(如:1)投入到系統中。(ETH/美元價格),值被排序,第25和75百分位數之間的每個人都得到一個作為獎勵的記號。每個人都有動機提供其他人都會提供的答案,而很多玩家能夠現實地達成一致的唯一價值就是明顯的違約:真相。這就創建了一個分散的協議,理論上可以提供任意數量的值,包括ETH/美元的價格、柏林的溫度,甚至是特定的硬計算的結果。

4.智能多重簽名代管..比特幣允許多個簽名的交易合同,例如,在給定的五個密鑰中,有三個可以使用這些資金。以太坊允許更多的粒度;例如,五分之四的人可以花掉所有的東西,五分之三的人每天可以花10%的錢,五分之二的人每天最多可以花0.5%。另外,以太坊Multisig是異步的-雙方可以在不同的時間在塊鏈上註冊他們的簽名,最後一個簽名將自動發送事務。

5.雲計算..EVM技術還可以用來創建一個可驗證的計算環境,允許用戶要求他人進行計算,然後可選擇地要求證明在某些隨機選擇的檢查點上進行的計算是正確的。這允許創建一個雲計算市場,任何用戶都可以使用他們的臺式機、筆記本電腦或專用服務器參與其中,並且可以使用現場檢查和安全存款來確保系統是可信的(即。節點無法盈利地欺騙)。雖然這樣的系統可能不適用於所有的任務;例如,需要高級別進程間通信的任務不能很容易地在一個龐大的節點雲中完成。然而,其他任務更容易並行化;像SETI@HOME、摺疊@HOME和遺傳算法這樣的項目可以很容易地在這樣的平臺上實現。

6.點對點賭博..任何數目的點對點賭博協議,如Frank Stajano和Richard Clayton的賽博骰子,可以在以太坊塊鏈上實現。最簡單的賭博協議實際上只是下一個塊哈希上的差異契約,可以從那裡建立更高級的協議,以幾乎零的費用創建沒有欺騙能力的賭博服務。

7.預測市場..如果有一個甲骨文或SchellingCoin,預測市場也很容易實現,而預測市場連同SchellingCoin可能被證明是第一個主流應用程序。急躁作為分散組織的治理協議。

8.連鎖分散市場,以身份和聲譽體系為基礎。

聯合體與關注點

實現修改GHOST

“貪婪最重觀察子樹”協議是由Yonatan Sompolinsky和Aviv Zohar於2013年12月..背後的動機是,具有快速確認時間的塊鏈目前由於過期率過高而導致安全性降低-因為塊需要一定的時間才能在網絡中傳播,如果礦工A挖掘一個塊,然後礦工B在礦A的塊傳播到B之前碰巧挖掘另一個塊,則Miner B的塊將被浪費掉,不會對網絡安全做出貢獻。此外,還有一個集中問題:如果礦工A是一個具有30%哈希能量的採礦池,而B有10%的哈希能量,則A將有70%的時間產生陳舊塊的風險(因為其他30%的時間A產生了最後一個塊,因此將立即獲得挖掘數據),而B則有可能在90%的時間內產生一個陳舊的塊。因此,如果塊間隔足夠短,以致老化率較高,則A僅僅憑藉其大小就會大大提高效率。將這兩種效應結合在一起,快速生成塊的區塊鏈很可能導致一個採礦池擁有足夠大的網絡哈希能力,從而對採礦過程進行實際控制。

正如Sompolinsky和Zohar所描述的那樣,幽靈解決了網絡安全損失的第一個問題,在計算哪個鏈是“最長”的鏈時,包含了陳舊的塊;也就是說,不僅是塊的父級和進一步的祖先,而且是塊祖先的陳腐後代(用以太坊術語來說,“叔叔”)被添加到計算中,在計算中添加了哪個塊有最大的工作支持證據。為了解決集中化偏見的第二個問題,我們超越了Sompolinsky和Zohar所描述的協議,併為Stales提供塊獎勵:一個陳舊塊獲得其基本獎勵的87.5%,而包含陳舊塊的侄子得到其餘12.5%。然而,交易費不判給叔叔。

以太坊實現了一個簡化版本的,它只下降了七個層次。具體來說,它的定義如下:

  • 塊必須指定父塊,並且必須指定0或多個叔父。
  • 包括在街區內的叔叔B必須具有下列屬性:
  • 它一定是k-第一代祖先B,在哪裡2 <= k <= 7.
  • 它不可能是B
  • 叔父必須是有效的塊頭,但不需要是以前驗證過的塊,甚至不需要是有效的塊。
  • 叔父必須與以前各區塊中包括的所有叔父和在同一塊中的所有其他叔父不同(非雙重包含)。
  • 為每一個叔叔U在塊B.的礦工B獲得一個額外的125%添加到它的Coinbase獎勵,而U的礦工得到標準Coinbase獎勵的93.75%。

這種有限版本的魂,其叔父只能包括7代人,被使用的原因有兩個。首先,在計算給定塊的叔父是否有效時,無限的魂會包含太多的複雜因素。第二,無限制的與補償使用在以太消除地雷礦工在主鏈,而不是公共攻擊者的鏈。

收費

由於在區塊鏈中發佈的每一項事務都要求網絡需要下載和驗證它的成本,因此需要某種監管機制,通常涉及交易費用,以防止濫用。比特幣使用的默認方法是純粹自願收費,依靠礦商充當守門人,並設定動態最低收費標準。這種方式在比特幣界得到了很好的接受,特別是因為它是“以市場為基礎的”,允許礦商和交易發送者之間的供求決定價格。然而,這條推理的問題是,交易處理不是一個市場;雖然將交易處理理解為礦工向發送方提供的服務具有直觀的吸引力,但實際上,礦工所包含的每一筆交易都需要由網絡中的每個節點處理,因此交易處理的絕大部分費用由第三方承擔,而不是由決定是否將其包括在內的採礦者承擔。因此,公地悲劇問題很有可能發生。

然而,事實證明,在以市場為基礎的機制中,當給定一個特別不準確的簡化假設時,它會神奇地抵消自身的缺陷。論點如下。假設:

  1. 事務導致k行動,懸賞kR任何包括它在內的礦工R由發送方設置,並且k和R對礦工來說(大致上)是事先可見的。
  2. 操作的處理成本為C任何節點(即。所有節點都有相同的效率)
  3. 確實有N挖掘節點,每個節點具有完全相同的處理能力(即。1/N共計)
  4. 不存在非挖掘的完整節點。

如果預期報酬大於成本,礦商將願意處理一筆交易。因此,預期的回報是kR/N因為礦工有1/N處理下一個塊的機會,而礦工的處理成本很簡單。kC..因此,礦工將包括交易kR/N > kC,或R > NC..請注意R是發件人提供的每次業務費用,因此是發件人從交易中獲得的利益的下限,以及NC是整個網絡一起處理一個操作的成本。因此,礦商有動機只包括那些總功利大於成本的交易。

然而,在現實中,與這些假設有若干重大偏差:

  1. 由於額外的驗證時間延遲了塊傳播,從而增加了塊變得陳舊的機會,因此,礦工確實支付了比其他驗證節點更高的事務處理成本。
  2. 確實存在非挖掘的完整節點。
  3. 採礦權力分配在實踐中可能最終會出現根本的不平等。
  4. 投機者、政敵和瘋子,他們的效用功能包括對網絡造成傷害,他們可以聰明地建立合同,他們的成本遠遠低於其他驗證節點支付的成本。

(1)使礦商有減少交易的趨勢;(2)增加NC因此,這兩種影響至少部分地相互抵消。怎麼回事呢?(3)和(4)是主要的問題;為了解決這些問題,我們只需設置一個浮動蓋:沒有任何區塊可以有比浮標更多的操作。BLK_LIMIT_FACTOR乘以長期指數移動平均。具體而言:

blk.oplimit = floor((blk.parent.oplimit \* (EMAFACTOR - 1) +

floor(parent.opcount \* BLK\_LIMIT\_FACTOR)) / EMA\_FACTOR)

BLK_LIMIT_FACTOR和EMA_FACTOR是暫時設置為65536和1.5的常量,但在進一步分析後可能會更改。

另一個抑制比特幣大塊大小的因素是:較大的塊需要更長的傳播時間,因此成為死板的可能性更高。在以太坊中,高消耗氣體的塊也可能需要更長的時間來傳播,因為它們在物理上更大,也因為它們需要更長的時間來處理事務狀態轉換來驗證。這種延遲抑制在比特幣中是一個重要的考慮因素,但在以太坊中則是如此,因為有了協議;因此,依賴受管制的塊限制提供了一個更穩定的基線。

圖靈(英國數學家)的計算-完備性

一個重要的注意是以太坊虛擬機是以圖靈的理論計算機完備性為基礎;這意味著EVM代碼可以編碼任何可以想象的計算,包括無限循環。EVM代碼允許以兩種方式循環。首先,有一個JUMP指令,該指令允許程序跳回代碼中的前一個位置,以及JUMPI指令執行條件跳轉,允許執行如下語句while x < 27: x = x * 2..其次,契約可以調用其他契約,可能允許通過遞歸循環。這很自然地導致了一個問題:惡意用戶能夠通過迫使礦工進入無限循環而使礦工和節點完全關閉嗎?這個問題的產生是因為計算機科學中一個被稱為停止問題的問題:在一般情況下,無法判斷給定的程序是否會停止運行。

正如在狀態轉換部分中描述的那樣,我們的解決方案的工作方式是要求事務設置它允許採取的最大計算步驟數,如果執行所需的計算時間較長,則恢復計算,但仍要支付費用。信息以同樣的方式工作。為了展示解決方案背後的動機,請考慮以下示例:

  • 攻擊者創建一個運行無限循環的契約,然後將激活該循環的事務發送給礦工。礦工將處理事務,運行無限循環,並等待它耗盡氣體。即使執行過程已經用光了,並且中途停止了,事務仍然是有效的,礦工仍然要求攻擊者為每一個計算步驟收取費用。
  • 攻擊者創建一個非常長的無限循環,目的是迫使礦工在如此長的時間內繼續計算,到計算完成時,還會出現更多的塊,礦工將不可能將交易包括進來以索取費用。但是,攻擊者將被要求提交一個STARTGAS限制執行所能採取的計算步驟的數量,因此礦工將提前知道計算將採取過多的步驟。
  • 攻擊者看到一個具有如下形式的代碼的契約send(A,contract.storage[A]); contract.storage[A] = 0,併發送一個帶有足夠氣體的事務,以運行第一步,而不是第二步(即。退出但不讓餘額下降)。合同作者不需要擔心防止此類攻擊,因為如果執行過程中途停止,他們就會被恢復。
  • 金融合同的工作方式是取9個專有數據源的中位數,以便將風險降到最低。攻擊者接管數據提要之一,該數據提要設計為可通過DAOS部分中描述的可變地址調用機制修改,並將其轉換為運行無限循環,從而試圖迫使從金融合同中索要資金的任何嘗試耗盡汽油。然而,金融合同可以設定一個氣體限制的信息,以防止這一問題。

圖靈-完整性的替代方法是圖靈-不完備(密碼破譯),其中JUMP和JUMPI不存在,並且在任何給定時間只允許每個合同的一個副本存在於調用堆棧中。使用這個系統,所描述的收費制度和圍繞我們解決方案有效性的不確定性可能是不必要的,因為執行一項合同的成本將受到其規模的限制。此外,圖靈-不完全性甚至沒有那麼大的限制;在我們內部構思的所有契約示例中,到目前為止,只有一個需要一個循環,即使是這個循環也可以通過26次一行代碼的重複來消除。考慮到圖靈-完整性的嚴重影響和有限的利益,為什麼不簡單地使用圖靈-不完整的語言呢?然而,在現實中,圖靈不全遠非解決問題的好辦法。要了解原因,請考慮以下合同:

C0: call(C1); call(C1);

C1: call(C2); call(C2);

C2: call(C3); call(C3);

...

C49: call(C50); call(C50);

C50: (run one step of a program and record the change in storage)

現在,將一筆交易發送給A。因此,在51項交易中,我們有一項需要2項的合同。50計算步驟礦商可以嘗試提前發現這種邏輯炸彈,方法是在每一份合同旁邊保持一個值,指定它可以採取的最大計算步驟數,併為遞歸調用其他合同的合同計算這個值,但這將要求礦商禁止訂立其他合同的合同(因為上述26項合同的訂立和執行可以很容易地納入一項合同)。另一個有問題的問題是,消息的Address字段是一個變量,因此一般情況下,甚至不可能提前判斷給定合同將調用哪些其他合同。因此,總而言之,我們有一個令人驚訝的結論:圖靈-完整性令人驚訝地易於管理,而缺乏圖靈完整性同樣令人驚訝地難以管理,除非完全相同的控制到位-但在這種情況下,為什麼不讓協議是圖靈-完整?

貨幣和發行

以太坊網絡包括自己的內置貨幣Ether,其雙重目的是提供初級流動性層,以便在各種類型的數字資產之間進行有效的交換,更重要的是提供支付交易費用的機制。為了方便和避免將來的爭論(見當前比特幣中的mbtc/ubtc/satoshi辯論),這些面額將預先貼上標籤:

  • 1:魏
  • 1012*Szabo
  • 1015芬尼
  • 1018*以太幣

這應被視為“美元”和“美分”或“BTC”和“Satoshi”概念的擴展版本。在不久的將來,我們預計“以太”將用於普通交易,“Finney”用於微型交易,“Szabo”和“weo”將用於關於收費和協議執行的技術討論;其餘的名稱可能會在以後有用,此時不應包括在客戶中。

發行模式如下:

  • 以太將在貨幣銷售中以每BTC 1000-2000個以太幣的價格發行,這一機制旨在為以太坊組織提供資金併為發展支付費用,而Master硬幣和NXT等其他平臺已經成功地使用了這一機制。較早的買家將受益於更大的折扣。從出售中獲得的BTC將完全用於支付開發商的工資和獎金,並投資於以太坊和加密貨幣生態系統中的各種盈利性和非營利項目。
  • 銷售總額(60102216 Eth)的0.099倍將分配給組織,以補償早期貢獻者,並在創世紀塊之前支付ETH標價的費用。
  • 銷售總額的099倍將作為長期儲備。
  • 26倍,銷售總額將分配給礦工每年永遠在那個點之後。

5年後則成立

貨幣單位1.198X 1.458X 2.498X購買者83.5%68.6%40.0%預售前支出8.26%6.79%3.96%準備金用於售後8.26%6.79%3.96%礦工0%17.8%52.0%

長期供應增長率(百分比)

儘管貨幣發行呈線性趨勢,但就像比特幣一樣,隨著時間的推移,供應增長率仍趨於零。

上述模式的兩個主要選擇是:(1)捐贈池的存在和規模;(2)長期增長的線性供應的存在,而不是比特幣的封頂供應。捐贈池的理由如下。如果不存在捐贈池,並將線性發行減少到0.217倍以提供相同的通貨膨脹率,那麼以太幣的總量將減少16.5%,因此每個單位的價值將增加19.8%。因此,在均衡狀態下,更多的以太幣會在銷售中被購買,所以每一個單位都會再一次和以前一樣有價值。該組織也將有1.198倍的BTC,這可以被認為是分成兩部分:最初的BTC和額外的0.198x。因此,這種情況是完全等價對於捐贈,但有一個重要的區別:組織持有純粹的BTC,因此沒有激勵支持以太單位的價值。

永久線性供應增長模型降低了一些人認為比特幣財富過度集中的風險,併為生活在當前和未來時代的個人提供了獲得貨幣單位的公平機會,同時保留了獲得和持有以太幣的強烈動機,因為“供應增長率”的百分比隨著時間的推移仍趨於零。我們還認為,由於硬幣總是由於疏忽、死亡等原因而隨著時間的推移而丟失,而硬幣損失可以被模擬為每年總供應量的一個百分比,因此流通中的貨幣總供應量最終將最終穩定在相當於年發行量除以損失率(如損失率)的數值上。在損失率為1%的情況下,一旦供應達到26倍,則每年將開採0.26倍,損失0.26倍,從而形成平衡)。

請注意,在未來,以太坊很可能會轉向一種股權證明模型,將發行要求降低到每年0到0.05倍之間。如果以太組織失去資金或因任何其他原因而消失,我們將留下一個“社會契約”:任何人都有權創建未來的以太坊候選版本,唯一的條件是以太的數量最多必須等於。60102216 * (1.198 + 0.26 * n)哪裡n是發生地塊後的年數。創建者可以自由地聚集、出售或以其他方式分配pos驅動的供應擴張與最大允許供應擴張之間的部分或全部差異,以支付開發費用。不符合社會契約的候選升級可以被合理地分為兼容版本。

採礦集中化

比特幣挖掘算法的工作原理是讓礦工一次又一次地在稍微修改過的塊標頭版本上計算SHA 256,直到最終有一個節點的哈希值小於目標(目前大約為2)。192)。然而,這種挖掘算法容易受到兩種集中化形式的影響。首先,採礦生態系統已由專用集成電路ASIC(應用專用集成電路)、專門為比特幣挖掘的具體任務設計的計算機芯片,因此其效率提高了數千倍。這意味著比特幣開採不再是高度分散和平等的追求,需要數百萬美元的資本才能有效參與。其次,大多數比特幣礦工實際上並不在本地執行塊驗證;相反,他們依賴於一個集中的挖掘池來提供塊頭。這個問題可以說更糟:截至本文撰寫之時,前三大礦業池間接控制了比特幣網絡中大約50%的處理能力,不過,如果一個池或聯盟試圖進行51%的攻擊,礦商可以切換到其他礦池,這一事實緩解了這一局面。

當前的目的是使用一種挖掘算法,其中要求礦工從狀態中獲取隨機數據,從區塊鏈中的最後N個塊中計算一些隨機選擇的事務,並返回結果的散列。這有兩個重要的好處。首先,以太坊契約可以包括任何類型的計算,因此以太坊 ASIC本質上是用於一般計算的ASIC。更好的CPU。其次,挖掘需要訪問整個區塊鏈,迫使礦工存儲整個區塊鏈,並至少能夠驗證每個事務。這就消除了對集中式採礦池的需求;雖然挖掘池仍然可以發揮晚間報酬分配的隨機性這一合法作用,但這種功能可以由沒有中央控制的對等池提供同樣好的服務。

該模型未經測試,在使用合同執行作為挖掘算法時,在避免某些聰明的優化方面可能會遇到困難。然而,該算法的一個顯著有趣的特性是,它允許任何人“毒害井”,方法是在專門設計來阻止某些ASIC的區塊鏈中引入大量合同。ASIC製造商利用這種手段互相攻擊的經濟動機是存在的。因此,我們正在制定的解決辦法最終是一種適應性的人類經濟解決方案,而不是純粹的技術解決辦法。

可伸縮性

以太坊的一個共同關注點是可伸縮性問題。與比特幣一樣,以太坊也存在這樣的缺陷,即每個事務都需要由網絡中的每個節點處理。使用比特幣,當前區塊鏈的大小約為15 GB,以每小時約1MB的速度增長。如果比特幣網絡每秒處理Visa的2000事務,它將以每3秒1MB的速度增長(每小時1GB,每年8TB)。以太坊可能會遭遇類似的增長模式,更糟糕的是,以太坊區塊鏈上將有許多應用程序,而不僅僅是比特幣那樣的一種貨幣,但以太坊完全節點只需要存儲狀態而不是整個區塊鏈歷史這一事實就改善了這一狀況。

如此大的區塊鏈大小的問題是集中化風險。如果區塊鏈的大小增加到100 TB,那麼可能的情況是隻有極少數的大型企業將運行完整的節點,所有常規用戶都使用輕型SPV節點。在這種情況下,出現了潛在的擔憂,即整個節點可能會結合在一起,並且都同意以某種有利可圖的方式進行欺騙(例如。改變街區獎勵,給自己BTC)。光節點無法立即檢測到這一點。當然,至少會有一個誠實的完整節點存在,幾個小時後,有關欺詐的信息就會通過Reddit這樣的渠道洩露出來,但到那時已經太晚了:這將取決於普通用戶組織一項努力,將給定的區塊列入黑名單,這是一個大規模且可能不可行的協調問題,規模類似於成功的51%攻擊。就比特幣而言,這是一個問題,但存在一個區塊鏈修改。彼得·託德這將緩解這個問題。

在短期內,以太坊將使用兩種額外的策略來解決這個問題。首先,由於基於塊鏈的挖掘算法,至少每個礦工都將被迫成為一個完整的節點,從而在完整節點的數量上創建一個下限。第二,也是更重要的是,在處理每個事務之後,我們將在塊鏈中包含一箇中間狀態樹根。即使塊驗證是集中的,只要存在一個誠實的驗證節點,集中化問題也可以通過驗證協議來解決。如果礦工發佈無效塊,則該塊必須格式化錯誤,或者狀態。S[n]是不正確的。自S[0]是正確的,一定有第一種狀態S[i]這是不正確的地方S[i-1]是對的。驗證節點將提供索引。i,以及由需要處理的Patricia樹節點的子集組成的“無效證明”。APPLY(S[i-1],TX[i]) -> S[i]..節點將能夠使用那些Patricia節點來運行計算的這一部分,並看到S[i]生成的不匹配S[i]提供。

另一種更復雜的攻擊將涉及惡意礦工發佈不完整的塊,因此,甚至不存在完整的信息來確定塊是否有效。這一解決方案是一種挑戰-響應協議:驗證節點以目標事務索引的形式發出“挑戰”,在接收到節點時,輕節點將該塊視為不受信任的塊,直到另一個節點(無論是礦工節點還是另一個驗證器)提供Patricia節點的子集作為有效性的證明。

結語

以太坊協議最初被認為是加密貨幣的升級版本,通過一種高度通用的編程語言提供了諸如區塊鏈託管、提取限制、金融合同、賭博市場等高級功能。以太坊協議不會直接支持任何應用程序,但是圖靈全編程語言的存在意味著理論上可以為任何事務類型或應用程序創建任意契約。然而,更有趣的是,以太坊協議遠遠超出了貨幣的範圍。關於分散文件存儲、分散計算和分散預測市場的協議,以及其他幾十個這樣的概念,都有可能大大提高計算行業的效率,並通過第一次增加一個經濟層,為其他對等協議提供巨大的推動力。最後,還有大量與金錢無關的應用程序。

由etal um協議實現的任意狀態轉換函數的概念提供了一個具有獨特潛力的平臺;它不是一個封閉的、單一用途的協議,而是用於數據存儲、賭博或金融領域的一系列特定應用程序,它是通過設計實現的,我們認為它非常適合作為未來大量金融和非金融協議的基礎層。

總結

  1. 一個老練的讀者可能會注意到,事實上,比特幣地址是橢圓曲線公鑰的散列,而不是公鑰本身。然而,事實上,將公共密鑰哈希稱為公鑰本身是完全合法的密碼術語。這是因為比特幣的密碼學可以被認為是一種自定義的數字簽名算法,其中公鑰由ECC公鑰的哈希組成,簽名由ECC公開密鑰與ECC簽名連接而成,驗證算法包括根據作為公鑰提供的ECC公鑰哈希檢查簽名中的ECC公鑰,然後根據ECC公鑰驗證ECC簽名。
  2. 從技術上講,前11個街區的中位數。
  3. 以太坊協議應該儘可能簡單實用,但可能需要相當高的複雜性,例如規模,將存儲、帶寬和I/O的成本內部化,以便安全、隱私、透明等。在需要複雜的地方,文檔應該儘可能清晰、簡潔和最新,這樣一個完全沒有在以太坊接受教育的人就可以學習它併成為專家。
  4. 見黃皮書對於以太坊虛擬機(它作為規範和從零開始構建以太坊客戶端的參考),同時也有許多主題在以太坊WIKI裡,例如分片開發、核心開發、DAPP開發、研究、Casper研發和網絡協議。為了進行研究和今後可能的實施,有道德的研究。
  5. 表達這一點的另一種方式是抽象。這個最新路線圖正在計劃抽象執行,允許執行引擎不一定必須遵循一個規範,但例如,它可以針對特定的應用程序以及碎片進行定製。(路線圖中沒有明確說明執行引擎的這種異質性。也有異構切分,VLADZamfir將其概念化。)
  6. 在內部,2和“Charlie”都是數字,後者處於大端基256表示中。數字至少可以是0,最多可以是2。256-1.

本文經過軟件翻譯,加上作者對以太坊的理解和堅持不懈的閱讀修改,對某些生僻詞彙的揣測,全文翻譯如上。感興趣的朋友拿走不謝,希望關注收藏,以供日後學習研究。

【本文經區塊鏈技術原創認證】

相關推薦

推薦中...