《以太坊白皮書》筆記(3)—— 以太坊介紹. 下

weixin_33782386發表於2018-01-02
797083-cc709d55f7efb147.jpg

《以太坊白皮書》原文連結:https://github.com/ethereum/wiki/wiki/White-Paper

Ethereum

Ethereum: a blockchain with a built-in Turing-complete programming language, allowing anyone to write smart contracts and decentralized applications where they can create their own arbitrary rules for ownership, transaction formats and state transition functions.

以太坊: 一個內建了圖靈完備的程式語言的區塊鏈。任何人可以編寫智慧合約;或者 “可以創造任意屬於自己的規則” 的去中心化應用;以及交易格式和狀態轉化函式。


#4 Ethereum State Transition Function

797083-8e5508d0cbdbeeb5.png
以太坊中的狀態轉化函式

以太坊中的狀態轉化函式 APPLY(S, TX) -> S' 可以被定義為:

  1. 檢查交易格式是否正確(例如是否有正確的金額),數字簽名是否有效,以及隨機數是否匹配傳送者的賬戶中的隨機數。如果上述的條件不滿足,則返回錯誤。
  2. 計算交易的費用是否等於 STARTGAS * GASPRICE,並通過數字簽名確認傳送者的地址。在傳送者的賬戶餘額中減去交易的費用並增加傳送者賬戶的隨機數。如果賬戶餘額不足,則返回錯誤。
  3. 初始化 GAS = STARTGAS,然後根據交易中每個位元組所需要的 gas 去掉一部分 gas。
  4. 把交易的數額從傳送者賬戶轉移到接受者賬戶。如果接受者賬戶不存在,就建立一個新的賬戶。如果接受者賬戶是一個合約,那麼執行合約中的程式碼直到完成執行或者消耗完所有的 gas。
  5. 如果因為傳送者的餘額不足導致數額轉移失敗,或者合約程式碼執行完成前消耗完所有 gas,那麼把狀態回退到交易之前,但交易的手續費並不會退回,而且會加到礦工的賬戶中。
  6. 如果交易成功,退換剩餘的 gas 對應的費用給傳送者,然後把消耗掉的 gas 對應的費用支付給礦工。

舉個例子,假設合約程式碼為:

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

Note

通常來說合約程式碼是低等級的 EVM 程式碼。上面使用的是一種高等級語言 Serpent。因為這樣更加清晰,而且也可以執行為 EVM 程式碼。

假設合約在空的儲存情況下執行,且傳送了一個金額為 10,gas 為 2000,每個以太的 gas 價格為 0.001,以及 64 位元組資料(0-31 位元組表示數字 2,32-63 位元組表示字串 CHARLIE)的交易。在這個情景下狀態轉化函式的過程為:

  1. 檢查交易是否合法以及交易格式是否正確
  2. 檢查交易的傳送至是否有 2000 * 0.001 = 2 的以太餘額。如果有,那麼從傳送者的賬戶中減去 2 個以太
  3. 初始化 gas 值為2000;假設交易的長度為 170 位元組,且每個位元組的手續費為 5。gas 值減去 850 剩下 1150
  4. 從傳送者的賬戶餘額中減去 10 以太,並在接收者賬戶中增加 10 以太
  5. 執行這段程式碼(這個例子中程式碼的結果很簡單:檢查儲存中索引為 2 的值,如果這個索引下的儲存中沒有值,那麼把它賦值為字串 CHARLIE)。假如這段程式碼耗費了 187 gas,那麼 gas 值剩餘 `1150 - 187 = 963
  6. 返還 963 * 0.001 = 0.963 以太到傳送者的賬戶中,並返回結果的狀態。

如果交易的接收端沒有合約,那麼整個交易的手續費用會變得很簡單:用 GASPRICE 乘上整個交易的位元組長度就能獲得最後的交易手續費用。而且交易中一併傳送的資料會變得無關緊要。


#5 Blockchain & Mining

797083-de1b9378a093604d.png
以太坊中狀態轉化的過程

以太坊中的區塊鏈和比特幣的區塊鏈大致相同,但也有不同之處:以太坊的區塊鏈架構和比特幣的不同,交易的列表和最近的狀態會在以太坊的區塊鏈中儲存一份拷貝。除此之外,以太坊中的區塊的數量和挖礦難度都會儲存在區塊鏈中。

以太坊中基本的區塊驗證演算法如下:

  1. 檢查引用的上一個區塊是否存在且有效
  2. 檢查當前區塊的時間戳是否大於上一區塊且差值小於15分鐘
  3. 檢查區塊序號、難度、交易根、叔根和 gas 限額 (一些低等級以太坊特有的) 是否有效
  4. 檢查 POW 是否有效
  5. S[0] 為上一區塊的最終狀態
  6. TX 為區塊包含的 n 條交易的列表。對於 0...n-1 中所有的 i ,讓 S[i+1] = APPLY(S[i], TX[i])。如果任一應用返回錯誤,或者 gas 的消耗超出額度,直接返回錯誤。
  7. S_FINALS[n],然後把獎勵給予礦工。
  8. 檢查 S_FINAL在 Merkle Tree 中的根節點是否和當前區塊鏈中最後一個區塊的狀態在 Merkle Tree 中的根節點相同。如果相同,那麼這個區塊有效。

這樣的演算法似乎看上去效率很低,因為每個區塊都需要儲存所有狀態的資訊。但其實在以太坊中,其效率與比特幣系統可以相提並論,因為所有狀態都是以樹結構儲存的,每個區塊的生成只需要對整個樹的某一小部分做修改。通常,對兩個相連的區塊,其樹結構大致相同。因此,資料可以只儲存一次,通過指標(子樹的雜湊值)達到多次引用。另外,由於最新的所有狀態資訊儲存在區塊鏈中最後一個區塊中,那麼就沒有必要再儲存整個區塊鏈的歷史記錄了 —— 這種策略如果應用在比特幣系統中,大概可以節省 5 - 20 倍的儲存空間。


#6 Applications

通常來講,以太坊為基礎的應用有三種型別:

  1. 金融應用。提供給使用者更為強大的渠道去管理使用者的資金,且使用者可以通過這些資金進入一些合約。包含子貨幣,金融衍生品,對衝合約,儲蓄錢包,遺囑,甚至一些種類的全面的僱傭合約。
  2. 半金融應用。這些應用中,使用者的資金需要參與,但資金相關的只是一小部分,更多的是與錢無關的部分。例如一個強制自我獎勵機制的解決計算性問題的應用(並不能懂這是什麼應用。。)。
  3. 非金融應用。例如一些去中心自治系統或者線上投票。

白皮書中還列舉了幾種比較有特點的應用:令牌系統、金融衍生品和穩定價值貨幣、身份和信譽系統、去中心儲存、去中心自治組織等。其中比較有意思的是去中心自治組織,下面會詳細闡述。

DAO

去中心化自治組織(DAO, decentralized autonomous organization)的概念,最早在 Oei Brafman 2007年出版的《海星和蜘蛛》一書中提出:

蜘蛛是中心化(細胞)組織的例子,如果把它的頭切掉後(整個組織)就無法生存了。海星則是由彼此對等(無中心)的一堆細胞組成,海星撕下的每隻觸手都可成長為完整的海星。

文中的蜘蛛和海星,分別對映了中心化組織 (現實中的絕大部分組織) 和去中心化組織。基於區塊鏈的技術,這種 “海星“ 得以存在:執行在以太坊系統上的一系列可以實現組織職能的智慧合約集合。

797083-8da7ec9c3ce244b3.png
中心化的公司或組織結構

對於現在的傳統公司或組織來說,通常其等級結構都是自上而下的。例如股份制公司,董事會和 CEO 負責公司整體的的運營和管理。普通員工的決策並不能影響到整家公司。

去中心化自治組織,或者去中心化自治公司 (DAC, decentralized autonomous company) 與傳統組織或公司相比,最大的不同是:這種公司或組織由所有成員共同擁有和經營,而不是單一個人擁有並經營。比特幣就是一個很好的例子,整個比特幣由所有參與的節點共同維護,而沒有一箇中心化的 “中央管理者”。網路中的任一節點都是對等的,沒有權力上的優劣。

在這種 DAO 或者 DACs 中,其 “規則” 通常以程式碼的形式寫在智慧合約當中。這些 “規則” 決定了這家公司或組織可以幹什麼:它是賣東西的,還是提供服務的等等。而且,這個 “規則” 是可以被修改的:只要超過一定數量的人蔘與投票並同意,那麼創始人就可以修改原先寫好的智慧合約(可以理解成人人都是董事會成員,人人都可以參與決定公司的未來,同時人人都需要承擔決策的風險)。

最重要的是,以太坊系統,或者區塊鏈,並不限定這個組織或公司的功能和領域,它只提供給組織或公司一個經濟激勵平臺作為基礎。也就是說,就像股份制公司一樣,區塊鏈只是像股市一樣提供給其一個獲得激勵、回報的平臺,而公司的產業,取決於參與的股東(DAO/DACs 中的每個節點)。

Tom Ding 在《2020: A Call for DApps and DAOs》中解釋,這種形式的公司非常適合完成一些小而簡單,重複性的工作

每個工作在網路中能夠輕易地被分割,從而工作可被程式或者人為驗證,這個過程非常難被操縱。

因為這種形式的公司其職能由其智慧合約的內容決定,而智慧合約的執行則可以完全自動化,“人” 在其中所扮演的角色只是負責一些機器力所不能及的事:例如修正整個公司的目標或者部分職能。就像一家完全自動化的無人商店,顧客想購買某樣產品只需要在以太坊中發起相應的交易,其餘的工作都交給了智慧合約去執行,“人” 所需要做的只是修改商品的內容等等(其實與一些電商平臺如淘寶、京東等很類似)。


閱讀 Github 上 《Ethereum - White Paper》 的一些筆記

相關文章