《以太坊白皮書》筆記(3)—— 以太坊介紹. 下
《以太坊白皮書》原文連結: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
以太坊中的狀態轉化函式 APPLY(S, TX) -> S'
可以被定義為:
- 檢查交易格式是否正確(例如是否有正確的金額),數字簽名是否有效,以及隨機數是否匹配傳送者的賬戶中的隨機數。如果上述的條件不滿足,則返回錯誤。
- 計算交易的費用是否等於
STARTGAS * GASPRICE
,並通過數字簽名確認傳送者的地址。在傳送者的賬戶餘額中減去交易的費用並增加傳送者賬戶的隨機數。如果賬戶餘額不足,則返回錯誤。 - 初始化
GAS = STARTGAS
,然後根據交易中每個位元組所需要的 gas 去掉一部分 gas。 - 把交易的數額從傳送者賬戶轉移到接受者賬戶。如果接受者賬戶不存在,就建立一個新的賬戶。如果接受者賬戶是一個合約,那麼執行合約中的程式碼直到完成執行或者消耗完所有的 gas。
- 如果因為傳送者的餘額不足導致數額轉移失敗,或者合約程式碼執行完成前消耗完所有 gas,那麼把狀態回退到交易之前,但交易的手續費並不會退回,而且會加到礦工的賬戶中。
- 如果交易成功,退換剩餘的 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
)的交易。在這個情景下狀態轉化函式的過程為:
- 檢查交易是否合法以及交易格式是否正確
- 檢查交易的傳送至是否有
2000 * 0.001 = 2
的以太餘額。如果有,那麼從傳送者的賬戶中減去 2 個以太 - 初始化 gas 值為2000;假設交易的長度為 170 位元組,且每個位元組的手續費為 5。gas 值減去 850 剩下 1150
- 從傳送者的賬戶餘額中減去 10 以太,並在接收者賬戶中增加 10 以太
- 執行這段程式碼(這個例子中程式碼的結果很簡單:檢查儲存中索引為
2
的值,如果這個索引下的儲存中沒有值,那麼把它賦值為字串CHARLIE
)。假如這段程式碼耗費了 187 gas,那麼 gas 值剩餘 `1150 - 187 = 963 - 返還
963 * 0.001 = 0.963
以太到傳送者的賬戶中,並返回結果的狀態。
如果交易的接收端沒有合約,那麼整個交易的手續費用會變得很簡單:用 GASPRICE
乘上整個交易的位元組長度就能獲得最後的交易手續費用。而且交易中一併傳送的資料會變得無關緊要。
#5 Blockchain & Mining
以太坊中的區塊鏈和比特幣的區塊鏈大致相同,但也有不同之處:以太坊的區塊鏈架構和比特幣的不同,交易的列表和最近的狀態會在以太坊的區塊鏈中儲存一份拷貝。除此之外,以太坊中的區塊的數量和挖礦難度都會儲存在區塊鏈中。
以太坊中基本的區塊驗證演算法如下:
- 檢查引用的上一個區塊是否存在且有效
- 檢查當前區塊的時間戳是否大於上一區塊且差值小於15分鐘
- 檢查區塊序號、難度、交易根、叔根和 gas 限額 (一些低等級以太坊特有的) 是否有效
- 檢查 POW 是否有效
- 令
S[0]
為上一區塊的最終狀態 - 令
TX
為區塊包含的 n 條交易的列表。對於0...n-1
中所有的i
,讓S[i+1] = APPLY(S[i], TX[i])
。如果任一應用返回錯誤,或者 gas 的消耗超出額度,直接返回錯誤。 - 令
S_FINAL
為S[n]
,然後把獎勵給予礦工。 - 檢查
S_FINAL
在 Merkle Tree 中的根節點是否和當前區塊鏈中最後一個區塊的狀態在 Merkle Tree 中的根節點相同。如果相同,那麼這個區塊有效。
這樣的演算法似乎看上去效率很低,因為每個區塊都需要儲存所有狀態的資訊。但其實在以太坊中,其效率與比特幣系統可以相提並論,因為所有狀態都是以樹結構儲存的,每個區塊的生成只需要對整個樹的某一小部分做修改。通常,對兩個相連的區塊,其樹結構大致相同。因此,資料可以只儲存一次,通過指標(子樹的雜湊值)達到多次引用。另外,由於最新的所有狀態資訊儲存在區塊鏈中最後一個區塊中,那麼就沒有必要再儲存整個區塊鏈的歷史記錄了 —— 這種策略如果應用在比特幣系統中,大概可以節省 5 - 20 倍的儲存空間。
#6 Applications
通常來講,以太坊為基礎的應用有三種型別:
- 金融應用。提供給使用者更為強大的渠道去管理使用者的資金,且使用者可以通過這些資金進入一些合約。包含子貨幣,金融衍生品,對衝合約,儲蓄錢包,遺囑,甚至一些種類的全面的僱傭合約。
- 半金融應用。這些應用中,使用者的資金需要參與,但資金相關的只是一小部分,更多的是與錢無關的部分。例如一個強制自我獎勵機制的解決計算性問題的應用(並不能懂這是什麼應用。。)。
- 非金融應用。例如一些去中心自治系統或者線上投票。
白皮書中還列舉了幾種比較有特點的應用:令牌系統、金融衍生品和穩定價值貨幣、身份和信譽系統、去中心儲存、去中心自治組織等。其中比較有意思的是去中心自治組織,下面會詳細闡述。
DAO
去中心化自治組織(DAO, decentralized autonomous organization)的概念,最早在 Oei Brafman 2007年出版的《海星和蜘蛛》一書中提出:
蜘蛛是中心化(細胞)組織的例子,如果把它的頭切掉後(整個組織)就無法生存了。海星則是由彼此對等(無中心)的一堆細胞組成,海星撕下的每隻觸手都可成長為完整的海星。
文中的蜘蛛和海星,分別對映了中心化組織 (現實中的絕大部分組織) 和去中心化組織。基於區塊鏈的技術,這種 “海星“ 得以存在:執行在以太坊系統上的一系列可以實現組織職能的智慧合約集合。
對於現在的傳統公司或組織來說,通常其等級結構都是自上而下的。例如股份制公司,董事會和 CEO 負責公司整體的的運營和管理。普通員工的決策並不能影響到整家公司。
去中心化自治組織,或者去中心化自治公司 (DAC, decentralized autonomous company) 與傳統組織或公司相比,最大的不同是:這種公司或組織由所有成員共同擁有和經營,而不是單一個人擁有並經營。比特幣就是一個很好的例子,整個比特幣由所有參與的節點共同維護,而沒有一箇中心化的 “中央管理者”。網路中的任一節點都是對等的,沒有權力上的優劣。
在這種 DAO 或者 DACs 中,其 “規則” 通常以程式碼的形式寫在智慧合約當中。這些 “規則” 決定了這家公司或組織可以幹什麼:它是賣東西的,還是提供服務的等等。而且,這個 “規則” 是可以被修改的:只要超過一定數量的人蔘與投票並同意,那麼創始人就可以修改原先寫好的智慧合約(可以理解成人人都是董事會成員,人人都可以參與決定公司的未來,同時人人都需要承擔決策的風險)。
最重要的是,以太坊系統,或者區塊鏈,並不限定這個組織或公司的功能和領域,它只提供給組織或公司一個經濟激勵平臺作為基礎。也就是說,就像股份制公司一樣,區塊鏈只是像股市一樣提供給其一個獲得激勵、回報的平臺,而公司的產業,取決於參與的股東(DAO/DACs 中的每個節點)。
Tom Ding 在《2020: A Call for DApps and DAOs》中解釋,這種形式的公司非常適合完成一些小而簡單,重複性的工作。
每個工作在網路中能夠輕易地被分割,從而工作可被程式或者人為驗證,這個過程非常難被操縱。
因為這種形式的公司其職能由其智慧合約的內容決定,而智慧合約的執行則可以完全自動化,“人” 在其中所扮演的角色只是負責一些機器力所不能及的事:例如修正整個公司的目標或者部分職能。就像一家完全自動化的無人商店,顧客想購買某樣產品只需要在以太坊中發起相應的交易,其餘的工作都交給了智慧合約去執行,“人” 所需要做的只是修改商品的內容等等(其實與一些電商平臺如淘寶、京東等很類似)。
閱讀 Github 上 《Ethereum - White Paper》 的一些筆記
相關文章
- 以太坊學習筆記————6、以太坊客戶端選擇與介紹筆記客戶端
- 以太坊學習筆記————10、錢包、以太幣、Gas介紹筆記
- 以太坊虛擬機器介紹虛擬機
- 以太坊學習筆記————1、以太坊是什麼?筆記
- 以太坊學習筆記————7、以太坊賬戶管理筆記
- [以太坊] OpenZeppelin 使用筆記筆記
- 以太坊原始碼分析(53)以太坊測試網路Clique_PoA介紹原始碼
- 以太坊簡介
- 以太坊Solidity型別介紹+實戰Solid型別
- 以太坊學習筆記————4、以太坊發展歷史回顧筆記
- 以太坊學習筆記————2、如何使用文件以及以太坊路線圖筆記
- 以太坊學習筆記————5、以太坊社群、基金會、貢獻者筆記
- 以太坊開發框架Truffle基礎使用介紹框架
- 以太坊:Dapp及相關開發工具介紹APP
- 以太坊學習筆記————3、WEB:去中心化應用平臺筆記Web中心化
- 以太坊原始碼分析(2)go ethereum 目錄大概介紹原始碼Go
- 以太坊原始碼分析(3)以太坊交易手續費明細原始碼
- 開發者的以太坊入門指南 | Jeth 以太坊系列線下活動
- 介紹一個 GitHub 上的 Laravel 以太坊包 Laravel-ethereumGithubLaravel
- 區塊鏈2.0架構:以太坊區塊鏈的介紹區塊鏈架構
- 以太坊智慧合約 Solidity 的常用資料型別介紹Solid資料型別
- 5.3 以太坊原始碼詳解3原始碼
- MM 學習筆記 - 以銷定採筆記
- 以太坊學習筆記——————11、公有鏈、聯盟鏈、私有鏈筆記
- EventBridge 特性介紹|以 IaC 的方式使用 EventBridge
- EEA為以太坊以隱私為主的Web應用釋出標準化架構棧Web架構
- 區塊鏈2.0以太坊漫談(3)區塊鏈
- 區塊鏈——以太坊、智慧合約簡介區塊鏈
- 以太坊原始碼分析(4)accounts包簡介原始碼
- 以太坊原始碼分析(17)Internal包簡介原始碼
- 開發者的以太坊入門指南 | Jeth 以太坊系列線下活動第三期
- 以書面形式來思考
- 以太坊原始碼分析(18)以太坊交易執行分析原始碼
- 以太坊原始碼分析(37)eth以太坊協議分析原始碼協議
- 以太坊是什麼 - 以太坊開發入門指南
- 以太坊學習筆記————8、錢包匯入與賬戶管理筆記
- 以太坊學習筆記————9、什麼是以太幣?如何獲取?筆記
- 以太坊學習筆記————12、搭建測試網路和私有鏈筆記