區塊鏈2.0以太坊漫談(2)

尹成發表於2018-04-28

以太坊的目的是基於指令碼、競爭幣和鏈上元協議(on-chain meta-protocol)概念進行整合和提高,使得開發者能夠建立任意的基於共識的、可擴充套件的、標準化的、特性完備的、易於開發的和協同的應用。以太坊通過建立終極的抽象的基礎層-內建有圖靈完備程式語言的區塊鏈-使得任何人都能夠建立合約和去中心化應用並在其中設立他們自由定義的所有權規則、交易方式和狀態轉換函式。域名幣的主體框架只需要兩行程式碼就可以實現,諸如貨幣和信譽系統等其它協議只需要不到二十行程式碼就可以實現。智慧合約-包含價值而且只有滿足某些條件才能開啟的加密箱子-也能在我們的平臺上建立,並且因為圖靈完備性、價值知曉(value-awareness)、區塊鏈知曉(blockchain-awareness)和多狀態所增加的力量而比比特幣指令碼所能提供的智慧合約強大得多。

以太坊賬戶:

在以太坊系統中,狀態是由被稱為“賬戶”(每個賬戶由一個20位元組的地址)的物件和在兩個賬戶之間轉移價值和資訊的狀態轉換構成的。以太坊的賬戶包含四個部分:

(1)隨機數,用於確定每筆交易只能被處理一次的計數器

(2)賬戶目前的以太幣餘額

(3)賬戶的合約程式碼,如果有的話

(4)賬戶的儲存(預設為空)

以太幣(Ether)是以太坊內部的主要加密燃料,用於支付交易費用。一般而言,以太坊有兩種型別的賬戶:外部所有的賬戶(由私鑰控制的)和合約賬戶(由合約程式碼控制)。外部所有的賬戶沒有程式碼,人們可以通過建立和簽名一筆交易從一個外部賬戶傳送訊息。每當合約賬戶收到一條訊息,合約內部的程式碼就會被啟用,允許它對內部儲存進行讀取和寫入,和傳送其它訊息或者建立合約。

訊息和交易:

以太坊的訊息在某種程度上類似於比特幣的交易,但是兩者之間存在三點重要的不同:

第一,以太坊的訊息可以由外部實體或者合約建立,然而比特幣的交易只能從外部建立。

第二,以太坊訊息可以選擇包含資料。

第三,如果以太坊訊息的接受者是合約賬戶,可以選擇進行迴應,這意味著以太坊訊息也包含函式概念。

以太坊中“交易”是指儲存從外部賬戶發出的訊息的簽名資料包。交易包含訊息的接收者、用於確認傳送者的簽名、以太幣賬戶餘額、要傳送的資料和兩個被稱為STARTGAS和GASPRICE的數值。為了防止程式碼的指數型爆炸和無限迴圈,每筆交易需要對執行程式碼所引發的計算步驟-包括初始訊息和所有執行中引發的訊息-做出限制。STARTGAS就是限制,GASPRICE是每一計算步驟需要支付礦工的費用。如果執行交易的過程中,“用完了瓦斯”,所有的狀態改變恢復原狀態,但是已經支付的交易費用不可收回了。如果執行交易中止時還剩餘瓦斯,那麼這些瓦斯將退還給傳送者。建立合約有單獨的交易型別和相應的訊息型別;合約的地址是基於賬號隨機數和交易資料的雜湊計算出來的。

訊息機制的一個重要結果:是以太坊的“頭等公民”財產-合約與外部賬戶擁有同樣權利,包括髮送訊息和建立其它合約的權利。這使得合約可以同時充當多個不同的角色,例如,使用者可以使去中心化組織(一個合約)的一個成員成為一箇中介賬戶(另一個合約),為一個偏執的使用定製的基於量子證明的蘭波特簽名(第三個合約)的個人和一個自身使用由五個私鑰保證安全的賬戶(第四個合約)的共同簽名實體提供中介服務。以太坊平臺的強大之處在於去中心化的組織和代理合約不需要關心合約的每一參與方是什麼型別的賬戶。

以太坊狀態轉換函式:


以太坊的狀態轉換函式:APPLY(S,TX) -> S'可以定義如下:

(1)檢查交易的格式是否正確(即有正確數值)、簽名是否有效和隨機數是否與傳送者賬戶的隨機數匹配。如否,返回錯誤。

(2)計算交易費用:fee=STARTGAS * GASPRICE,並從簽名中確定傳送者的地址。從傳送者的賬戶中減去交易費用和增加傳送者的隨機數。如果賬戶餘額不足,返回錯誤。

(3)設定初值GAS =STARTGAS,並根據交易中的位元組數減去一定量的瓦斯值。

(4)從傳送者的賬戶轉移價值到接收者賬戶。如果接收賬戶還不存在,建立此賬戶。如果接收賬戶是一個合約,執行合約的程式碼,直到程式碼執行結束或者瓦斯用完。

(5)如果因為傳送者賬戶沒有足夠的錢或者程式碼執行耗盡瓦斯導致價值轉移失敗,恢復原來的狀態,但是還需要支付交易費用,交易費用加至礦工賬戶。

(6)否則,將所有剩餘的瓦斯歸還給傳送者,消耗掉的瓦斯作為交易費用傳送給礦工。 例如,假設合約的程式碼如下:


需要注意的是,在現實中合約程式碼是用底層以太坊虛擬機器(EVM)程式碼寫成的。上面的合約是用我們的高階語言Serpent語言寫成的,它可以被編譯成EVM程式碼。假設合約儲存器開始時是空的,一個值為10以太,瓦斯為2000,瓦斯價格為0.001以太並且64位元組資料,第一個三十二位元組的塊代表號碼2和第二個CHARLIE的交易傳送後,狀態轉換函式的處理過程如下:

(1)檢查交易是否有效、格式是否正確。

(2)檢查交易傳送者至少有2000*0.001=2個以太幣。如果有,從傳送者賬戶中減去2個以太幣。

(3)初始設定gas=2000,假設交易長為170位元組,每位元組的費用是5,減去850,所以還剩1150。

(4)從傳送者賬戶減去10個以太幣,為合約賬戶增加10個以太幣。

(5)執行程式碼。在這個合約中,執行程式碼很簡單:它檢查合約儲存器索引為2處是否已使用,注意到它未被使用,然後將其值置為CHARLIE。假設這消耗了187單位的瓦斯,於是剩餘的瓦斯為1150 - 187 = 963。

(6)向傳送者的賬戶增加963*0.001=0.963個以太幣,返回最終狀態。 如果沒有合約接收交易,那麼所有的交易費用就等於GASPRICE乘以交易的位元組長度,交易的資料就與交易費用無關了。另外,需要注意的是,合約發起的訊息可以對它們產生的計算分配瓦斯限額,如果子計算的瓦斯用完了,它只恢復到訊息發出時的狀態。因此,就像交易一樣,合約也可以通過對它產生的子計算設定嚴格的限制,保護它們的計算資源。

程式碼執行:

以太坊合約的程式碼使用低階的基於堆疊的位元組碼的語言寫成的,被稱為“以太坊虛擬機器程式碼”或者“EVM程式碼”。程式碼由一系列位元組構成,每一個位元組代表一種操作。一般而言,程式碼執行是無限迴圈,程式計數器每增加一(初始值為零)就執行一次操作,直到程式碼執行完畢或者遇到錯誤,STOP或者RETURN指令。操作可以訪問三種儲存資料的空間:

·     堆疊,一種後進先出的資料儲存,32位元組的數值可以入棧,出棧。

·     記憶體,可無限擴充套件的位元組佇列。

·     合約的長期儲存,一個金鑰/數值的儲存,其中金鑰和數值都是32位元組大小,與計算結束即重置的堆疊和記憶體不同,儲存內容將長期保持。

程式碼可以像訪問區塊頭資料一樣訪問數值,傳送者和接受到的訊息中的資料,程式碼還可以返回資料的位元組佇列作為輸出。

EVM程式碼的正式執行模型令人驚訝地簡單。當以太坊虛擬機器執行時,它的完整的計算狀態可以由元組(block_state, transaction, message, code,memory, stack, pc, gas)來定義,這裡block_state是包含所有賬戶餘額和儲存的全域性狀態。每輪執行時,通過調出程式碼的第pc(程式計數器)個位元組,當前指令被找到,每個指令都有定義自己如何影響元組。例如,ADD將兩個元素出棧並將它們的和入棧,將gas(瓦斯)減一併將pc加一,SSTORE將頂部的兩個元素出棧並將第二個元素插入到由第一個元素定義的合約儲存位置,同樣減少最多200的gas值並將pc加一,雖然有許多方法通過即時編譯去優化以太坊,但以太坊的基礎性的實施可以用幾百行程式碼實現。

區塊鏈和挖礦:


雖然有一些不同,但以太坊的區塊鏈在很多方面類似於比特幣區塊鏈。它們的區塊鏈架構的不同在於,以太坊區塊不僅包含交易記錄和最近的狀態,還包含區塊序號和難度值。以太坊中的區塊確認演算法如下:

(1)檢查區塊引用的上一個區塊是否存在和有效。

(2)檢查區塊的時間戳是否比引用的上一個區塊大,而且小於15分鐘。

(3)檢查區塊序號、難度值、 交易根,叔根和瓦斯限額(許多以太坊特有的底層概念)是否有效。

(4)檢查區塊的工作量證明是否有效。

(5)將S[0]賦值為上一個區塊的STATE_ROOT

(6)將TX賦值為區塊的交易列表,一共有n筆交易。對於屬於0……n-1i,進行狀態轉換S[i+1]= APPLY(S[i],TX[i])。如果任何一個轉換髮生錯誤,或者程式執行到此處所花費的瓦斯(gas)超過了GASLIMIT,返回錯誤。

(7)用S[n]S_FINAL賦值, 向礦工支付區塊獎勵。

(8)檢查S-FINAL是否與STATE_ROOT相同。如果相同,區塊是有效的。否則,區塊是無效的。

這一確認方法乍看起來似乎效率很低,因為它需要儲存每個區塊的所有狀態,但是事實上以太坊的確認效率可以與比特幣相提並論。原因是狀態儲存在樹結構中(tree structure),每增加一個區塊只需要改變樹結構的一小部分。因此,一般而言,兩個相鄰的區塊的樹結構的大部分應該是相同的,因此儲存一次資料,可以利用指標(即子樹雜湊)引用兩次。一種被稱為“帕特里夏樹”(“Patricia Tree”)的樹結構可以實現這一點,其中包括了對默克爾樹概念的修改,不僅允許改變節點,而且還可以插入和刪除節點。另外,因為所有的狀態資訊是最後一個區塊的一部分,所以沒有必要儲存全部的區塊歷史-這一方法如果能夠可以應用到比特幣系統中,經計算可以對儲存空間有10-20倍的節省。

 

應用:

一般來講,以太坊之上有三種應用。第一類是金融應用,為使用者提供更強大的用他們的錢管理和參與合約的方法。包括子貨幣,金融衍生品,對衝合約,儲蓄錢包,遺囑,甚至一些種類的全面的僱傭合約。第二類是半金融應用,這裡有錢的存在但也有很重的非金錢的方面,一個完美的例子是為解決計算問題而設的自我強制懸賞。最後,還有線上投票和去中心化治理這樣的完全的非金融應用。

令牌系統:

鏈上令牌系統有很多應用,從代表如美元或黃金等資產的子貨幣到公司股票,單獨的令牌代表智慧資產,安全的不可偽造的優惠券,甚至與傳統價值完全沒有聯絡的用來進行積分獎勵的令牌系統。在以太坊中實施令牌系統容易得讓人吃驚。

關鍵的一點是理解所有的貨幣或者令牌系統,從根本上來說是一個帶有如下操作的資料庫:從A中減去X單位並把X單位加到B上,前提條件是:(1):A在交易之前有至少X單位,(2):交易被A批准。實施一個令牌系統就是把這樣一個邏輯實施到一個合約中去。

用Serpent語言實施一個令牌系統的基本程式碼如下:

這從本質上來說是本文將要進一步描述的“銀行系統”狀態轉變功能的一個最小化實施。需要增加一些額外的程式碼以提供在初始和其它一些邊緣情況下分發貨幣的功能,理想情況下會增加一個函式讓其它合約來查詢一個地址的餘額。就足夠了。

理論上,基於以太坊的充當子貨幣的令牌系統可能包括一個基於比特幣的鏈上元幣所缺乏的重要功能:直接用這種貨幣支付交易費的能力。

實現這種能力的方法是在合約裡維護一個以太幣賬戶以用來為傳送者支付交易費,通過收集被用來充當交易費用的內部貨幣並把它們在一個不斷執行的拍賣中拍賣掉,合約不斷為該以太幣賬戶注資。這樣使用者需要用以太幣“啟用”他們的賬戶,但一旦賬戶中有以太幣它將會被重複使用因為每次合約都會為其充值。

金融衍生品和價值穩定的貨幣:

金融衍生品是“智慧合約”的最普遍的應用,也是最易於用程式碼實現的之一。實現金融合約的主要挑戰是它們中的大部分需要參照一個外部的價格釋出器;例如,一個需求非常大的應用是一個用來對衝以太幣(或其它密碼學貨幣)相對美元價格波動的智慧合約,但該合約需要知道以太幣相對美元的價格。最簡單地方法是通過由某特定機構(例如納斯達克)維護的“資料提供“合約進行,該合約的設計使得該機構能夠根據需要更新合約,並提供一個介面使得其它合約能夠通過傳送一個訊息給該合約以獲取包含價格資訊的回覆。

當這些關鍵要素都齊備,對衝合約看起來會是下面的樣子:

(1)等待A輸入1000以太幣。.

(2)等待B 輸入1000以太幣。

(3)通過查詢資料提供合約,將1000以太幣的美元價值,例如,x美元,記錄至儲存器。

(4)30天后,允許A或B“重新啟用“合約以傳送價值x美元的以太幣(重新查詢資料提供合約以獲取新價格並計算)給A並將剩餘的以太幣傳送給B。

這樣的合約在密碼學商務中有非同尋常的潛力。密碼學貨幣經常被詬病的一個問題就是其價格的波動性;雖然大量的使用者和商家可能需要密碼學資產所帶來的安全和便利,可他們不太會樂意麵對一天中資產跌去23%價值的情形。直到現在,最為常見的推薦方案是發行者背書資產;思想是發行者建立一種子貨幣,對此種子貨幣他們有權發行和贖回,給予(線下)提供給他們一個單位特定相關資產(例如黃金,美元)的人一個單位子貨幣。發行者承諾當任何人送還一個單位密碼學資產時。發還一個單位的相關資產。這種機制能夠使任何非密碼學資產被“升級“為密碼學資產,如果發行者值得信任的話。 然而實踐中發行者並非總是值得信任的,並且一些情況下銀行體系太脆弱,或者不夠誠實守信從而使這樣的服務無法存在。

金融衍生品提供了一種替代方案。這裡將不再有提供儲備以支撐一種資產的單獨的發行者,取而代之的是一個由賭一種密碼學資產的價格會上升的投機者構成的去中心化市場。與發行者不同,投機者一方沒有討價還價的權利,因為對衝合約把他們的儲備凍結在了契約中。注意這種方法並非是完全去中心化的,因為依然需要一個可信任的提供價格資訊的資料來源,儘管依然有爭議這依然是在降低基礎設施需求(與發行者不同,一個價格釋出器不需要牌照並且似乎可歸為自由言論一類)和降低潛在欺詐風險方面的一個巨大的進步。

身份和信譽系統:

最早的替代幣,域名幣,嘗試使用一個類比特幣塊鏈來提供一個名稱註冊系統,在那裡使用者可以將他們的名稱和其它資料一起在一個公共資料庫註冊。最常用的應用案例把象“bitcoin.org“(或者再域名幣中,”bitcoin.bit“)一樣的域名與一個IP地址對應的域名系統。其它的應用案例包括電子郵件驗證系統和潛在的更先進的信譽系統。這裡是以太坊中提供與域名幣類似的的名稱註冊系統的基礎合約:


合約非常簡單就是一個以太坊網路中的可以被新增但不能被修改或移除的資料庫。任何人都可以把一個名稱註冊為一個值並永遠不變。一個更復雜的名稱註冊合約將包含允許其他合約查詢的“功能條款“,以及一個讓一個名稱的擁有者(即第一個註冊者)修改資料或者轉讓所有權的機制。甚至可以在其上新增信譽和信任網路功能。

去中心化儲存:

在過去的幾年裡出現了一些大眾化的線上檔案儲存初創公司,最突出的是Dropbox,它尋求允許使用者上傳他們的硬碟備份,提供備份儲存服務並允許使用者訪問從而按月向使用者收取費用。然而,在這一點上這個檔案儲存市場有時相對低效;對現存服務的粗略觀察表明,特別地在“神祕谷“20-200GB這一既沒有免費空間也沒有企業級使用者折扣的水平上,主流檔案儲存成本每月的價格意味著支付在一個月裡支付整個硬碟的成本。以太坊合約允許去中心化儲存生態的開發,這樣使用者通過將他們自己的硬碟或未用的網路空間租出去以獲得少量收益,從而降低了檔案儲存的成本。

這樣的設施的基礎性構件就是我們所謂的“去中心化Dropbox合約“。這個合約工作原理如下:首先,某人將需要上傳的資料分成快,對每一塊資料加密以保護隱私,並且以此構建一個默克爾樹。然後建立一個含以下規則的合約,每N個塊,合約將從默克爾樹中抽取一個隨機索引(使用能夠被合約程式碼訪問的上一個塊的雜湊來提供隨機性)。

然後給第一個實體X以太以支撐一個帶有類似簡化驗證支付(SPV)的在樹中特定索引處的塊的所有權證明。當一個使用者想重新下載他的檔案,他可以使用微支付通道協議(例如每32k位元組支付1薩博)恢復檔案;從費用上講最高效的方法是支付者不到最後不釋出交易,而是用一個略微更合算的帶有同樣隨機數的交易在每32k位元組之後來代替原交易。

這個協議的一個重要特徵是,雖然看起來象是一個人信任許多不準備丟失檔案的隨機節點,但是他可以通過祕密分享把檔案分成許多小塊,然後通過監視合同得知每個小塊都還被某個節點的儲存著。如果一個合約依然在付款,那麼就提供了某個人依然在儲存檔案的證據。

去中心化自治組織:

通常意義上“去中心化自治組織(DAO, decentralized autonomous organization)”的概念指的是一個擁有一定數量成員或股東的虛擬實體,依靠比如67%多數來決定花錢以及修改程式碼。成員會集體決定組織如何分配資金。分配資金的方法可能是懸賞,工資或者更有吸引力的機制比如用內部貨幣獎勵工作。這僅僅使用密碼學塊鏈技術就從根本上覆制了傳統公司或者非營利組織的法律意義以實現強制執行。至此許多圍繞DAO的討論都是圍繞一個帶有接受分紅的股東和可交易的股份的“去中心化自治公司(DAC,decentralized autonomous corporation)”的“資本家”模式;作為替代者,一個被描述為“去中心化自治社群(decentralized autonomous community)”的實體將使所有成員都在決策上擁有同等的權利並且在增減成員時要求67%多數同意。每個人都只能擁有一個成員資格這一規則需要被群體強制實施。

下面是一個如何用程式碼實現DO的綱要。最簡單地設計就是一段如果三分之二成員同意就可以自我修改的程式碼。雖然理論上程式碼是不可更改的,然而通過把程式碼主幹放在一個單獨的合約內並且把合約呼叫的地址指向一個可更改的儲存依然可以容易地繞開障礙而使程式碼變得可修改,在一個這樣的DAO合約的簡單實現中有三種交易型別,由交易提供的資料區分:

(1)[0,i,K,V] 註冊索引為i 的對儲存地址索引為K 至 v 的內容的更改建議。

(2)[0,i] 註冊對建議i 的投票。

(3)[2,i] 如有足夠投票則確認建議i。

然後合約對每一項都有具體的條款。它將維護一個所有開放儲存的更改記錄以及一個誰投票表決的表。還有一個所有成員的表。當任何儲存內容的更改獲得了三分之二多數同意,一個最終的交易將執行這項更改。一個更加複雜的框架會增加內建的選舉功能以實現如傳送交易,增減成員,甚至提供委任制民主一類的投票代表(即任何人都可以委託另外一個人來代表自己投票,而且這種委託關係是可以傳遞的,所以如果A委託了B然後B委託了C那麼C將決定A的投票)。這種設計將使DAO作為一個去中心化社群有機地成長, 使人們最終能夠把挑選合適人選的任務交給專家,與當前系統不同,隨著社群成員不斷改變他們的站隊假以時日專家會容易地出現和消失。 一個替代的模式是去中心化公司,那裡任何賬戶可以擁有0到更多的股份,決策需要三分之二多數的股份同意。一個完整的框架將包括資產管理功能-可以提交買賣股份的訂單以及接受這種訂單的功能(前提是合約裡有訂單匹配機制)。代表依然以委任制民主的方式存在,產生了“董事會”的概念。

更先進的組織治理機制可能會在將來實現;現在一個去中心化組織(DO)可以從去中心化自治組織(DAO)開始描述。DO和DAO的區別是模糊的,一個大致的分割線是治理是否可以通過一個類似政治的過程或者一個“自動”過程實現,一個不錯的直覺測試是“無通用語言”標準:如果兩個成員不說同樣的語言組織還能正常執行嗎?顯然,一個簡單的傳統的持股式公司會失敗,而象比特幣協議這樣的卻很可能成功,羅賓·漢森的“futarchy”,一個通過預測市場實現組織化治理的機制是一個真正的說明“自治”式治理可能是什麼樣子的好例子。注意一個人無需假設所有DAO比所有DO優越;自治只是一個在一些特定場景下有很大優勢的,但在其它地方未必可行的正規化,許多半DAO可能存在。


網址:http://www.qukuailianxueyuan.io/



欲領取造幣技術與全套虛擬機器資料

區塊鏈技術交流QQ群:756146052  備註:CSDN

尹成學院微信:備註:CSDN


相關文章