banner
leaf

leaf

It is better to manage the army than to manage the people. And the enemy.
follow
substack
tg_channel

智能合約初探:概念與演變

前言 ¶#

自 2009 年比特幣開啟區塊鏈時代以來,近 10 年裡,隨著技術與生態的發展,基於區塊鏈的分佈式應用(dapp)呈現出井噴的趨勢,而支撐著 dapp 的底層技術就是「區塊鏈 + 智能合約」。 智能合約與區塊鏈的結合,普遍被認為是區塊鏈世界中一次里程碑式的升級。第一個結合了區塊鏈與智能合約技術的平台–以太坊的誕生,被認為是開啟了「區塊鏈 2.0」時代。

什麼是智能合約 ¶#

1996 年,Nick Szabo 在文章《Smart Contracts: Building Blocks For Digital Markets》中提出了智能合約的概念。 所謂「合約」,就是條文、合同一類的東西,裡面記錄了發生的條件與對應執行的條款,以支持確權等操作;所謂「智能」,就意味著自動化、可編程。
所以,智能合約就是可編程的合同,也可以理解為一段自動執行的條文合同,在計算機中,就是一段自動執行的程序片段。它更易於合約保存,並且由確定的算法運行,給定輸入,就得到對應的輸出,極大保障了合約的執行力。 以自動售貨機做類比,可以幫助我們更好地理解智能合約的核心特徵。 當使用者選擇好要購買的貨物並完成支付,出貨邏輯就會被觸發,用戶就能得到想要的貨物,而這個過程不需要人工介入,節省了售賣貨物的人力成本。如果要破壞這個合約,就得物理破壞售貨機。像 POS 刷卡機、EDI(電子數據交換)等,也可作此類比。

智能合約與區塊鏈 ¶#

智能合約在上世紀被提出,而區塊鏈 2009 年才誕生,就定義而言,智能合約與區塊鏈關係不大。 那為什麼在這 10 年中,智能合約與區塊鏈卻產生了如此緊密的關聯?因為區塊鏈可以保證智能合約的不可篡改,不僅合約內容不可篡改,每次調用記錄亦不可篡改。 智能合約產生價值的最基本前提是有一個強有力的底層介質用於儲存,讓其不可被物理破壞。
然而,智能合約的本體是一份代碼,非常容易被篡改,如何為其提供強力的存儲介質就成了問題。這正好是區塊鏈擅長解決的 —— 通過比特幣的實踐,證明了區塊鏈可以在分佈式環境下讓電子記錄不可被篡改。 與此同時,智能合約也在反哺著區塊鏈,它極大地擴展了區塊鏈的業務場景。
與智能合約結合後,區塊鏈不再服務於單一的貨幣支付,可以延申到生活中的方方面面。豐富的應用場景也對區塊鏈的能力產生了新的挑戰。

區塊鏈 2.0:以太坊的誕生 ¶#

2009 年誕生的比特幣,運用區塊鏈等技術來保證生態,開創了區塊鏈 1.0 時代。 用戶可以通過腳本代碼來定制一些內容,例如如何解鎖一筆資金。這些腳本代碼會隨著交易一起保存,從而享有不可篡改的特質,並且是確定性的。所以從某種角度來說,這些腳本也可看作智能合約。可是它們並不好用。 首先,這些腳本代碼不是圖靈完備的,這限制了實現的功能;其次,開發門檻較高,編寫複雜邏輯的體驗會很差,好比用 JVM 字節碼來寫程序。
2013 年,一個青年 V 神提出了以太坊,其核心是通過世界狀態對區塊鏈數據進行更新和驗證。以太坊與比特幣最大的不同在於可通過智能合約執行複雜的邏輯操作。 在以太坊上,智能合約的語言是 Solidity,它是圖靈完備且較為上層的語言,極大地擴展了智能合約的能力範疇,降低了智能合約編寫難度。 正因為此,以太坊的誕生,也標誌著區塊鏈 2.0 時代開啟。隨後,智能合約技術逐步滲透了溯源、存證、供應鏈等多個業務場景。

智能合約的現狀與前景 ¶#

從編程角度而言,智能合約就是一段代碼。相比常規代碼,智能合約具有許多差別與限制,例如:

  • 單線程執行
  • 代碼執行會消耗資源,不能超出資源限制
  • 目前難以獲取鏈外數據,例如取得天氣信息、比賽結果等
  • 其他限制,如 TPS
    這些特點使得目前智能合約生態以鏈上資源的治理為核心。就像以太坊上各式各樣的 ERC 標準與治理方案;EOS 上有各種資源模型,比如 CPU、RAM、兼經濟模型、Rex、Bancor 協議等。 顯然,就目前的生態而言,智能合約對現實世界的影響力有限。 但事物總是在發展的。目前,已有許多致力於突破這些限制的研究,典型的有 Oracle(謂言機,但常被稱為預言機),它允許智能合約和鏈外進行交互,這樣就能大大提高智能合約的使用場景,彷彿一台電腦通上了網;再比如那些突破鏈自身性能瓶頸的嘗試,例如支付通道、跨鏈、plasma、rollup,它們都從不同角度打破安全與性能的枷鎖。 毋庸置疑,智能合約將扮演著越來越重要的角色,將來隨著以太坊 2.0 的落地,也許會開啟新一個區塊鏈時代。

智能合約技術 ¶#

以太坊採用了 Solidity 作為智能合約語言,Solidity 是一門為實現智能合約而創建的高級編程語言,能在允許以太坊程序的節點上運行。該語言吸收了 C++、JavaScript 的一些特性,例如它是靜態類型語言,支持繼承、庫等。 除了 Solidity,每個平台的智能合約技術也有所不同,接下來將從公有鏈、聯盟鏈作為切入,介紹其他平台所採用的技術。
公有鏈 ¶
首先,不妨先認識三大公鏈的智能合約技術。

圖片

比特幣系統#

比特幣是在 2009 年由中本聰發明的數字貨幣,主要是為了反抗中心化的銀行體系,因為其精巧的系統設計和安全性,價值也在迅速提升。同時,因為它並不與真實世界的身份綁定,具備強大的匿名性,也被用於非法交易、洗錢、勒索等惡意行為,引起了一些爭議。
作為一個去中心化的區塊鏈系統,所有人都可以訪問,也可以在本地維護一個節點參與到比特幣網絡中,下文也會應用 Bitcoin Core 客戶端在本地維護一個節點。

圖片
節點分為全節點和輕節點兩種,早期所有的節點都是全節點,但隨著數據量越來越大,運行在手機或平板等設備上的比特幣客戶端不需要存儲整個區塊鏈的信息,稱為 Simplified Payment Verification (SPV) 節點,也叫輕節點。
Bitcoin Core 客戶端就是一個全節點,下文也會具體講述。全節點一直在線,維護著完整的區塊鏈信息;因為其內存裡維護著完整的 UTXO 集合,所以通過驗證整個區塊鏈的區塊和交易信息(從創世區塊到最新區塊)來驗證交易的合法性;也會決定哪些交易會被打包到區塊中;驗證交易即挖礦,可以決定沿著哪條鏈繼續挖,在出現等長的分叉時,也會選擇哪一個分叉;同時監聽別的礦工挖出來的區塊,驗證合法性。
輕節點不需要一直在線,也不需要保留整個區塊鏈(數據量龐大),只需要保留每個區塊的塊頭;且只需要保存與自己有關的區塊,而不需要保存鏈上全部交易;因為並沒有保存全部信息,無法驗證大多數交易的合法性和網上發布的新區塊的正確性,只能檢驗與自己有關的區塊;可以通過 Merkle Proof 驗證一筆交易存在,但不能確認一筆交易不存在;可以驗證挖礦的難度,因為保存在塊頭中。
下面通過一個示例來講解一下全節點和輕節點的交易驗證方式。
假如要驗證一個位於 block 300,000 的交易 T,全節點會查驗全部 300,000 個區塊(直到創世區塊),建立一個完整 UTXO 的數據庫來確保這個交易沒有被花費;而輕節點則會通過 Merkle Path 來鏈接所有和交易 T 相關的區塊,然後等待 300,001 至 300,006 個區塊來進行確認,從而驗證交易的合法性。

區塊鏈結構#

區塊鏈是由順序鏈接起來的區塊組成的一種數據結構,可以存於單文件或者數據庫中,Bitcoin Client 使用 Google 的 LevelDB 數據庫存儲數據。每一個區塊都指向前一個區塊,任何一個區塊進行了修改的話,其所有後面的區塊都會受到影響,所以想要篡改一個區塊的話需要同時篡改之後的所有區塊,這需要大量的算力,往往成本大於收益,因此極大地保障了安全性。
區塊鏈結構包含區塊 Block Size (4 bytes)、Block Header、Transaction Counter (1-9 bytes) 和 Transaction 幾個核心組成部分。
區塊鏈的塊頭大小為 80 bytes,存儲著 Version (4 bytes)、Previous Block Hash (32 bytes)、Merkle Tree Root (32 bytes)、Timestamp (4 bytes)、Difficulty Target (4 bytes) 和 Nonce (4 bytes)。
每一個區塊的哈希值通過對區塊頭進行兩次哈希運算,即 SHA256 (SHA256 (Block Header)),並不存在區塊鏈結構中,而是由每個節點接收到區塊後計算得到,是獨一無二的;此外,Block Height 也可以作為區塊的標識符。

Merkle Tree#

Merkle Tree 默克爾樹是區塊鏈中很重要的一個數據結構,主要通過哈希算法來驗證較大數據集(也是通過雙重哈希的方式 SHA256 (SHA256 (Block Header))),結構如下圖所示:

圖片
通過 Merkle Tree 的方式可以很快地驗證一個交易存在於某個區塊中(算法複雜度為 LogN),例如,如果要驗證一個交易 K 存在於區塊中,只需要訪問很少的節點

圖片
因為比特幣網絡中存在大量交易,這種方式能夠極大提高效率,如下圖所示:

圖片
因為輕節點(例如手機上的比特幣錢包)不保存整個區塊鏈數據,通過 Merkle Tree 結構可以很方便地查找交易,輕節點會構造一個 Bloom filter 布隆過濾器來得到與自身相關的交易:

  1. 首先,初始化布隆過濾器為空值,獲取錢包中的所有地址,創建一個檢索模式來匹配與這個交易輸出相關的地址,將檢索模式加入布隆過濾器;
  2. 然後布隆過濾器被發送至各個節點(通過 filterload 消息);
  3. 節點收到後會發送一個包含符合條件的區塊頭和符合交易的 Merkle Path 的 merkleblock 消息和一個包含過濾結果的 tx 消息。
    過程中,輕節點會使用 Merkle Path 來鏈接交易與區塊,並通過區塊頭來組成區塊鏈,從而能夠驗證交易存在於區塊鏈中。
    使用布隆過濾器會返回符合篩選條件的結果,也會存在著一些誤報,因此返回了很多不相關的結果,也能夠在輕節點向其他節點請求相關地址時保護了隱私性。
    比特幣網絡 #
    比特幣系統運行在一個 P2P 點對點網絡上,節點之間是平等的,沒有身份、權限的區別;沒有中心化的伺服器,網絡也沒有層級區分。
    每個節點都要維護一個等待上鏈的交易的集合,每個區塊大小為 1M,因此需要幾秒才能夠穿到大多數的節點。假設一個節點監聽到了 A->B 的交易,會將其寫入集合,如果同時又發現了一個 A->C 的雙花攻擊,則不會再寫入,而如果監聽到同樣一筆 A->B 的交易或者同一個幣來源的 A->C 的交易,則會將該集合中 A->B 的交易刪除。
    比特幣共識協議 #
    比特幣作為一個人人都可以參與的開發系統,需要解決惡意節點的威脅,解決思路為工作量證明機制,也就是算力投票機制,當產生一筆新交易,廣播新的數據記錄,全網執行共識算法,即礦工挖礦來驗證記錄,即求解隨機數,率先解出難題的礦工獲得記帳權,產生新區塊,然後對外廣播新區塊,其他節點驗證通過後加至主鏈。
    錢包 #
    作為一個數字貨幣系統,比特幣有自己的錢包系統,主要由私鑰、公鑰和錢包地址三個部分組成。
    生成錢包地址的過程如下:
  4. 采用 ECDSA (Elliptic Curve Digital Signature Algorithm) 椭圆曲线算法,利用私钥生成对应的公钥
  5. 公钥很长且难以输入和记忆,因此再通过 SHA256 和 RIPEMD160 算法得到一个公钥哈希值
  6. 最后再用 Base58Check 进行处理,得到一个可读性较强的钱包地址
    交易過程 #
    有了錢包(和資產)後,就可以開始交易了。我們來通過一個典型的比特幣交易來理解這一流程:
    A 和 B 都擁有一個比特幣錢包地址(可以用 Bitcoin Client 生成,原理如上),假設 A 要給 B 轉帳 5 個 BTC,A 需要得到 B 的錢包地址,然後用自己的私鑰對 A->B 轉帳 5 個 BTC 這筆交易簽名(因為 A 的私鑰僅有自己知道,所以擁有私鑰則是擁有錢包資產的歸屬權);然後發布這筆交易,在比特幣系統中發起交易需要支付小額礦工費作為交易手續費;礦工會開始驗證這筆交易的合法性,得到六個確認後交易就可以被比特幣帳本所接受,整個驗證過程約 10 分鐘。
    礦工為什麼要消耗大量算力來驗證交易呢?
    礦工在驗證過程中可以得到出塊獎勵和礦工費,出塊獎勵會四年遞減,因此,後期主要激勵是礦工費。
    為什麼驗證要 10 分鐘呢?
    比特幣其實並不是絕對安全的,新交易容易受到一些惡意攻擊,而通過控制挖礦難度把驗證過程控制在 10 分鐘左右則可以很大程度上阻止惡意攻擊,這只是一種概率上的保證。
    比特幣系統中怎麼避免雙重花費呢?
    比特幣採用了一種叫 UTXO (Unspent Transaction Outputs) 的概念,當一個用戶收到一筆 BTC 交易時,會計入 UTXO 中。
    在這個示例中,A 想要給 B 轉帳 5 個 BTC,A 的這 5 個 BTC 可能來自於兩個 UTXO (2 BTC + 3 BTC),因此 A 在轉帳給 B 時,礦工需要檢驗的是這兩筆 UTXO 在這筆交易之前有沒有被花掉,如果檢測已經被花費了,則交易不合法。
    下圖很好地闡釋了多筆交易的流向和 UTXO 的相關概念

圖片
此外,UTXO 有一個很重要的特性,不可分割,假如 A 有 20 個 BTC,他想轉帳 5 個 BTC 給 B,那交易會先將 20 個 BTC 作為輸入,然後產生兩個輸出,一個向 B 轉帳 5 個 BTC,一個返還給 A 剩下的 15 個 BTC,因此,A 又擁有了一筆價值為 15 BTC 的 UTXO;如果單個 UTXO 不夠支付,則可以組合多個形成輸入,但總額一定要大於交易額。
礦工怎麼驗證交易發起者有足夠的餘額呢?
這個問題看起來很簡單,第一反應是像支付寶這樣查詢一下餘額是否足夠就可以。但比特幣是一種基於交易的帳本模式,並沒有帳戶概念,因此並不能直接查詢餘額,要想知道一個帳戶的剩餘資產,則需要回顧以前所有的交易,並且找到所有 UTXO 並相加。
交易模型 #
上文講了一个交易是怎么发生的,那比特币交易由哪些部分组成呢?

圖片
如圖,最開始的部分是 Version,表示版本。
然後是 Input 相關的信息:Input Count 表示數量,Input Info 表示輸入的內容,也就是 Unlocking Script,主要用於核對輸入來源、輸入是否可用以及其他輸入的細節。

  • Previous output hash 所有輸入都能追溯回一個輸出,這指向包含將在該輸入中花費的 UTXO,該 UTXO 的哈希值在這裡以相反的順序保存
  • Previous output index 一個交易可以有多個由它們的索引號引用的 UTXO,第一个索引是 0
  • Unlocking Script Size - Unlocking Script 的字節大小
  • Unlocking Script 滿足 UTXO Unlocking Script 的哈希
  • Sequence Number 默認為 ffffffff
    接著是 Output 相關的信息,Output Count 表示數量,Output Info 表示輸出的內容,也就是 Locking Script, 主要用於記錄輸出了多少比特幣,未來支出的條件以及輸出的細節。
  • Amount 以 Satoshis (最小的比特幣單位) 表示的輸出比特幣數量,10^8 Satoshis = 1 比特幣
  • Locking Script Size 這是 Locking Script 的字節大小
  • Locking Script 這是 Locking Script 的哈希,它指定了使用此輸出必須滿足的條件
    最後是 Locktime,表示一個交易可以被最早添加到區塊鏈的時間 / 塊,如果小於 500 million 的話直接讀取塊高度,而如果大於 500 million 則讀取時間戳。

比特幣腳本#

在交易中有提到 Unlocking script 和 Locking script,那什麼是比特幣腳本呢?
比特幣腳本是記錄在每個交易中的指令列表,當腳本被執行時可以檢驗交易是否有效、比特幣是否可以使用等。一个典型的脚本如下

<sig> <pubKey> OP_DUP OP_HASH160 <pubKeyHash> OP_EQUALVERIFY OP_CHECKSIG

比特幣腳本是基於堆棧從左至右執行的,使用 Opcodes 對數據進行操作,在上面這個腳本語言中,<> 包含的是要被推入 stack 的數據,沒有 <> 包括、以 OP_ 為前綴的是操作符(OP 可省略),腳本也可以嵌入數據永久記錄在鏈上(不超過 40 bytes),所記錄的數據不會影響 UTXO。
在交易中, 是 Unlocking script,OP_DUP OP_HASH160 OP_EQUALVERIFY OP_CHECKSIG 部分是 Locking script。
跟大多數編程語言相比,比特幣腳本是非圖靈完備的,沒有循環或複雜的流程控制,執行起來很簡單,不論在哪裡執行結果都是確定性的,也不會保存狀態,且腳本與腳本之間是相互獨立的。因為以上特徵,雖然比特幣腳本相對安全,但沒辦法處理很複雜的邏輯,因此不適合用來處理一些複雜的業務,Ethereum 所提供的智能合約就在這一點上實現了創新性的突破,因此誕生了很多去中心化應用。

挖礦#

在上文對整個交易過程中提到了挖礦,接下來我們詳細講一下。
有的節點為了得到出塊獎勵和礦工費,賺取收益,因此會對交易進行驗證,稱為礦工挖礦。出塊獎勵由 coinbase 創建,每四年會遞減,從 2009 年的 25 個,到現在已經減少為 6.5 個。
挖礦其實是一個不斷嘗試隨機數以達到某個設定目標值的過程,如小於某個 target 值,這個難度是人為設置來調整驗證時間、提升安全性的,而不是解決數學難題。
礦工們會不斷嘗試這個值,成功率很低,但是嘗試次數可以很多,因此,算力強的節點有成比例的優勢,更容易解出難題。
那挖礦難度為什麼要進行調整呢?
因為在比特幣系統中,出塊時間太短容易出現分叉,如果分叉過多則會影響系統達成共識,危害系統安全性。比特幣系統通過難度調整把出塊速度穩定在 10 分鐘左右,從而防止交易被算改。
挖礦難度是如何調整的呢?
系統會在每產生 2016 個區塊時(約兩周)調整一次目標閾值,存在塊頭中,全網所有節點需要遵從新的難度進行挖礦,如果惡意節點不調整代碼中的 target 的話,誠實的礦工則不會認可
目標閾值 = 目標閾值 * (產生 2016 個區塊的實際時間 / 產生 2016 個區塊的預計時間)
比特幣誕生之初,礦工很少,挖礦難度也較低,大多都是用家用電腦(CPU)直接挖礦;隨著越來越多的人參與到比特幣生態中,挖礦的難度也越來越高,慢慢開始用一些算力較強的 GPU 進行挖礦,也有一些專用的 ASIC (Application Specific Integrated circuit) 專用挖礦芯片以及礦機隨著市場需求逐步誕生;而現在也出現了很多大型礦池,集合了全網大量算力進行集中挖礦。
在這種大型礦池系統中,Pool Manager 擔任了全節點的作用,而集合的大量礦工會一起計算哈希值,最後通過工作量證明機制來分配收益。但算力過於集中容易產生一些中心化風險,如某個大型礦池達到了全網 51% 以上算力的話就可以對交易進行回滾或者對某些交易進行抵制等。
分叉 #
比特幣系統中,也會有未達成一致性意見的情況發生,稱為分叉。分叉是主要分為兩種類型,一種是狀態分叉,往往是一些節點故意進行的;另一種稱為協議分叉,也就是說對比特幣協議產生了一些分歧。
協議分叉又可以分為兩種類型,一種叫硬分叉,也就是對於協議的部分內容產生了不可兼容的修改,比如將比特幣的塊大小由 1M 調整為 4M,這種分叉方式是永久的,從某個節點開始形成了兩條平行發展的鏈,比如 Bitcoin Classic,形成了兩種幣。
另一種則叫軟分叉,比如還是調整比特幣的塊大小,但是從 1M 調整為 0.5M,這樣調整後,就會出現新節點挖小區塊,舊的節點挖大的區塊的情況,軟分叉是非永久性的,比較典型的例子是對 coinbase 的內容進行修改以及 P2SH (Pay to Script Hash) 產生的分叉。

Bitcoin Core 客戶端#

Bitcoin Core 是比特幣的實現,又被稱為 Bitcoin-QT 或 Satoshi-client,可以通過這個客戶端連接至比特幣網絡、驗證區塊鏈、發送與接收比特幣等。有 Mainnet、Testnet 和 Regnet 三個網絡,可以進行切換。
提供了一個 Debug Console 來與比特幣區塊鏈直接進行交互,常見操作如下:
Blockchain

  • getblockchaininfo: 返回有關區塊鏈處理的各種狀態信息
  • getblockcount: 返回區塊鏈中的塊數
  • verifychain: 驗證區塊鏈數據庫
    Hash
  • getblockhash: 返回所提供的區塊哈希值
  • getnetworkhashps: 基於指定數量的最近塊,返回每秒網絡哈希數
  • getbestblockhash: 返回最佳塊的哈希值
    Blocks
  • getblock: 返回塊信息的詳細信息
  • getblockheader: 返回有關區塊頭信息
  • generate: 立即將指定數量的塊挖礦到錢包中的一個地址
    Wallet
  • getwalletinfo: 返回一個對象,該對象包含有關錢包狀態的各種信息
  • listwallets: 返回當前加載的錢包列表
  • walletpassphrasechange: 更改錢包密碼
    Mempool
  • getmempoolinfo: 返回內存池活動狀態的詳細信息
  • getrawmempool: 返回內存池中的所有交易詳細信息
  • getmempoolentry: 返回給定交易的內存池數據
    Transaction
  • getchaintxstats: 計算關於鏈中交易總數和速率的統計數據
  • getrawtransaction: 返回原始交易數據
  • listtransactions: 返回給定帳戶的交易列表
    Signature
  • signrawtransaction: 簽署原始交易的輸入
  • signmessage: 使用地址的私鑰對信息進行簽名
  • dumpprivkey: 獲取私鑰
    Network
  • getnetworkinfo: 返回 P2P 網絡的狀態信息
  • getpeerinfo: 返回每個連接網絡節點的數據
  • getconnectioncount: 返回節點的連接數
    Mining
  • getmininginfo: 返回包含挖掘相關信息的對象
  • getblocktemplate: 返回構造塊所需的數據
  • prioritisetransaction: 以較高或較低的優先級接受交易進入挖掘的塊

總結#

以上就是對比特幣核心技術的一些解讀,主要從它的基礎原理和數據模型層面進行了一些深入了解,通過對比特幣的學習,能夠很好地理解區塊鏈的設計理念和運行機制,接下來將會對被稱為區塊鏈 2.0 的以太坊進行學習和分析,敬請期待!

參考資料#

  1. COMP7408 Distributed Ledger and Blockchain Technology, Professor S.M. Yiu, HKU
  2. Udacity Blockchain Developer Nanodegree, Udacity
    Ethereum 核心技術解讀 #

前言#

比特幣作為一種去中心化的數字貨幣,是極其成功的,但受限於比特幣腳本(非圖靈完備,只能處理一些簡單的邏輯),並不能處理很複雜的業務。而 Ethereum 引入了智能合約,使去中心化的概念能夠應用於更豐富的應用場景,因此也被稱為區塊鏈 2.0。本文將對以太坊核心技術進行解讀,如有錯漏,歡迎交流指正。

Ethereum 系統#

2014 年 1 月,俄羅斯開發者 Vitalik Buterin 發布了以太坊白皮書並成立團隊,旨在創造一個集成更通用的腳本語言的區塊鏈平台。其中一位成員 Dr. Gavin Wood 發布了一份黃皮書,涉及 Ethereum Virtual Machin (EVM) 以太坊虛擬的相關技術,這就是 Ethereum 的誕生

圖片

簡單來說,Ethereum 是一個開源的去中心化系統,使用區塊鏈來存儲系統狀態變化,因此也被稱為「世界計算機」;它支持開發者在區塊鏈上部署運行不可變的程序,稱為智能合約,因此可以支持廣泛的應用場景;它使用數字貨幣 Ether 來衡量系統資源消耗,激勵更多人參與 Ethereum 系統建設。

去中心化應用 DApp#

狹義來說,DApp 其實就是一個集成了用戶界面、支持智能合約、運行於以太坊區塊鏈上的應用。

圖片
如上圖所示,Ethereum 應用實例部署在區塊鏈網絡上(智能合約運行於區塊鏈虛擬機中),而 Web 程序只需要通過 Web3.js 對區塊鏈網絡進行 RPC 遠程調用,這樣用戶就可以通過瀏覽器(DApp 瀏覽器或 MetaMask 等插件工具)訪問去中心化服務應用了。

賬本#

Ethereum 區塊鏈是一個去中心化的賬本(數據庫),網絡中的所有交易都會存儲在區塊鏈中,所有節點都要本地保存一份數據,並且確保每一筆交易的可信度;所有的交易都是公開且不可篡改的,網絡中的所有節點都可以查看和驗證。

賬戶#

當我們需要登錄一個網站或系統(比如郵箱)時,往往需要一個帳號和一個密碼,密碼通過加密算法以暗文的形式存儲在中心化的數據庫中。然而,以太坊是一個去中心化的系統,那是怎麼生成賬戶的呢?

和比特幣系統原理類似

首先生成一個僅有自己知道的私鑰,假設為 sk,采用 ECDSA (Elliptic Curve Digital Signature Algorithm) 椭圆曲线算法生成對應的公鑰 pk
采用 keccak256 算法對公鑰 pk 求哈希值
截取後 160 位作為以太坊的地址
用戶的私鑰和地址一起組成了以太坊的賬戶,可以存儲餘額、發起交易等(比特幣的餘額是通過計算所有的 UTXO 得到的,而不是像以太坊一樣存儲在賬戶中)。

其實 Ethereum 賬戶分為兩種類型,上述方式生成的叫 Externally Owned Accounts (EOA),外部賬戶,也就是常規用戶擁有的賬戶,主要是用來發送 / 接收 Ether 代幣或者向智能合約發送交易(即調用智能合約)。

而另一種則是 Contract Accounts,合約賬戶,不同於外部賬戶,這種賬戶是沒有對應的私鑰的,而是在部署合約的時候生成的,存儲智能合約代碼。值得注意的是,合約賬戶必須要被外部賬戶或者其他合約調用才能夠發送或接收 Ether,而不能自己主動執行交易。

錢包#

存儲和管理 Ethereum 賬戶的軟件 / 插件稱為錢包,提供了諸如交易簽名、餘額管理等功能。錢包生成主要有兩種方式,非確定性隨機生成或根據隨機種子生成。

Gas#

Ethereum 網絡上的操作也需要「手續費」,稱為 Gas,在區塊鏈上部署智能合約以及轉帳都需要消耗一定單位的 Gas,這也是鼓勵礦工參與 Ethereum 網絡建設的激勵機制,從而使整個網絡更加安全、可靠。

每個交易都可以設置相應的 Gas 量和 Gas 的價格,設置較高的 Gas 費則往往礦工會更快處理你的交易,但為了預防交易多次執行消耗大量 Gas 費,可以通過 Gas Limit 來設置限制。Gas 相關信息可以通過 [https://etherscan.io/gastracker](Ethereum Gas Tracker)

圖片

智能合約#

上文提到,Ethereum 區塊鏈不僅僅存儲交易信息,還會存儲與執行智能合約代碼。
智能合約控制應用和交易邏輯,Ethereum 系統中的智能合約採用專屬 Solidity 語言,語法類似於 JavaScript,除此之外,還有 Vyper、Bamboo 等編程語言。智能合約代碼會被編譯為字節碼並部署至區塊鏈中,一旦上鏈則不可以再編輯。EVM 作為一個智能合約執行環境,能夠保障執行結果的確定性。
智能合約示例:眾籌 #
讓我們想象一個更複雜的場景,假設我要眾籌 10000 元開發一個新產品,通過現有眾籌平台需要支付不菲的手續費,而且很難解決信任問題,於是,可以通過一個眾籌的 DApp 來解決這個問題。
先為眾籌設置一些規則

  1. 每個想參與眾籌的人可以捐款 10-10000 元的金額
  2. 如果目標金額達成了,金額會通過智能合約發送給我(即眾籌發起人)
  3. 如果目標在一定時間內(如 1 個月)沒有達成,眾籌的資金會原路返回至眾籌用戶
  4. 也可以設置一些規則,比如一周後,如果目標金額沒有達成,用戶可以申請退款
    因為這些眾籌條款是通過智能合約實現並部署在公開的區塊鏈上的,即使是發起者也不能篡改條款,且任何人都可以查看,解決了信任問題。
    完整代碼可以點擊這裡查看:https://www.toshblocks.com/solidity/complete-example-crowd-funding-smart-contract/

交易#

在 Ethereum 中,一個典型的交易是怎麼樣的呢?

  1. 開發者部署智能合約至區塊鏈
  2. DApp 實例化合約、傳入相應值以執行合約
  3. DApp 對交易進行數字簽名
  4. 本地對交易進行驗證
  5. 廣播交易至網絡中
  6. 礦工節點接收交易並進行驗證
  7. 礦工節點確認可信區塊後廣播至網絡中
  8. 本地節點與網絡進行同步,接收新區塊

架構#

工具進行查詢。

圖片

智能合約#

上文提到,Ethereum 區塊鏈不僅僅存儲交易信息,還會存儲與執行智能合約代碼。
智能合約控制應用和交易邏輯,Ethereum 系統中的智能合約採用專屬 Solidity 語言,語法類似於 JavaScript,除此之外,還有 Vyper、Bamboo 等編程語言。智能合約代碼會被編譯為字節碼並部署至區塊鏈中,一旦上鏈則不可以再編輯。EVM 作為一個智能合約執行環境,能夠保障執行結果的確定性。

智能合約示例:眾籌#

讓我們想象一個更複雜的場景,假設我要眾籌 10000 元開發一個新產品,通過現有眾籌平台需要支付不菲的手續費,而且很難解決信任問題,於是,可以通過一個眾籌的 DApp 來解決這個問題。
先為眾籌設置一些規則

  1. 每個想參與眾籌的人可以捐款 10-10000 元的金額
  2. 如果目標金額達成了,金額會通過智能合約發送給我(即眾籌發起人)
  3. 如果目標在一定時間內(如 1 個月)沒有達成,眾籌的資金會原路返回至眾籌用戶
  4. 也可以設置一些規則,比如一周後,如果目標金額沒有達成,用戶可以申請退款
    因為這些眾籌條款是通過智能合約實現並部署在公開的區塊鏈上的,即使是發起者也不能篡改條款,且任何人都可以查看,解決了信任問題。
    完整代碼可以點擊這裡查看:Demo

交易#

在 Ethereum 中,一個典型的交易是怎麼樣的呢?

  1. 開發者部署智能合約至區塊鏈
  2. DApp 實例化合約、傳入相應值以執行合約
  3. DApp 對交易進行數字簽名
  4. 本地對交易進行驗證
  5. 廣播交易至網絡中
  6. 礦工節點接收交易並進行驗證
  7. 礦工節點確認可信區塊後廣播至網絡中
  8. 本地節點與網絡進行同步,接收新區塊

架構#

圖片

Ethereum 採用的是一種 Order - Execute - Validate - Update State 的系統架構。在這種架構下,當產生一筆新的交易,礦工會進行 PoW 工作量證明機制的運算;驗證完成後,將區塊通過 gossip 協議廣播至網絡中;網絡中的其他節點接收到新區塊後,也會對區塊進行驗證;最終,提交至區塊鏈,更新狀態。
具體來看,Ethereum 系統有共識層、數據層、應用層等核心組件,其交互邏輯如下

圖片

如上圖所示,Ethereum 數據由 Transaction Root 和 State Root 組成。Transaction Root 是所有交易組成的樹,包含 From、To、Data、Value、Gas Limit 和 Gas Price;而 State Root 則是所有賬戶組成的樹,包含 Address、Code、Storage、Balance 和 Nonce。

總結#

以上就是對 Ethereum 核心技術的一些解讀,智能合約的引入給區塊鏈的應用帶來了更多可能性,但仍有很多安全性、隱私性和效率問題需要考慮。針對複雜的企業級應用場景,聯盟鏈是更好的選擇,後續將會對 Hyperledger Fabric 進行詳盡的分析,敬請期待!

參考資料#

  1. COMP7408 Distributed Ledger and Blockchain Technology, Professor S.M. Yiu, HKU
  2. Udacity Blockchain Developer Nanodegree, Udacity

EOS#

Pomelo Coin EOS 簡介 Pomelo Coin EOS 是區塊鏈巫師 BM (Daniel Larimer) 開發的類似於操作系統的區塊鏈架構平台,旨在實現分佈式應用的性能擴展。EOS 在數百個 CPU 或集群上提供賬戶、認證、數據庫、異步通信和程序調度。這項技術的最終形式是一種區塊鏈架構,可以支持每秒數百萬次的交易,普通用戶不用支付使用費

EOS.IO 的https://github.com/EOSIO/Documentation/blob/master/zh-CN/TechnicalWhitePaper.md](白皮書):#

EOS.IO 軟件引入一種新的區塊鏈架構設計,它使得去中心化的應用可以橫向和縱向的擴展。 這通過構建一個仿操作系統的方式來實現,在它之上可以構建應用程序。 该软件提供帐户、身份验证、数据库、异步通信和跨越数百个 CPU 内核或集群的应用程序调度。 由此产生的技术是一种区块链架构,它可以扩展至每秒处理百万级交易,消除用户的手续费,并且允许快速和轻松的部署去中心化的应用。
EOS.IO 的白皮書還講到了 EOS.IO 在設計之初的幾個主要目標:

  • 支持成百上千的用戶
  • 免費的使用
  • 簡單升級和 bug 修復
  • 低延時
  • 時序性能
  • 並發性能
    這其中,最吸引人的應該就是所謂的每秒處理百萬級交易,因為有了這樣級別的處理能力才能讓區塊鏈有了真正的大規模應用的可能性。與之相對應的有 Ethereum,初期的測試網絡的處理能力是 25 筆交易每秒,經過逐漸的優化之後,可能可以達到 50-100 筆交易每秒。而這 50-100 筆的每秒交易筆數顯然是不能滿足大規模應用的,在 2017 年時候出現的爆紅一時的
    Cryptokitties(以太貓)就很明顯的暴露了這個問題。
    支持百萬級別的每秒交易筆數也是 EOS.IO 相對 Ethereum 來說最核心,也是最本質的革命。
    當然,先別高興的太早,究竟能不能實現,我們之後再來探究。
    識算法
    EOS.IO 採用委託股權證明算法,全稱是 delegated proof of stake,縮寫就是 DPOS.
    DPOS 最早在數字貨幣的應用應該是 BitShare(比特股),也就是 ByteMaster 的第一個區塊鏈產品,最早的時候是為了出一個基於區塊鏈的去中心化交易所和去中心的化的區塊鏈銀行,所以出現了一個稱為比特股內盤的平台,有興趣的可以去這個地址看一下什麼是比特股內盤。
    在這裡要提到比特股內盤的原因是,比特股是一個很好的體現 ByteMaster 想法的應用,也正是因為其中存在的質押模式,讓 EOS.IO 最近受到了很大的質疑。這個我們也在後面再談。
    先簡單介紹一下 DPOS,後面在考慮單獨出一篇文章介紹一下各種不同的共識算法。
    DPOS 顧名思義,就是講共識機制委託給對應的人進行決定。以比特股作為例子,DPOS 會讓每一個持有比特股的人進行投票,產生 101 位代表,這 101 位代表每個人擁有相同的權益,而最終的來決定哪一條鏈是有效的真實的鏈,則是由這 101 位代表的情況來決定。
    這聽起來是不是有點像人大會議或者是議會制度?由多數人選出少數人,再由這部分少數人來投票出最後的決定。而這樣的投票最終的目標是確保沒有任何人能夠篡改歷史。
    具體為什麼這樣的模式可以做到這一點,可以參考 Steemit 上 dantheman 在 2017 年 6 月發表的文章《DPOS Consensus Algorithm - The Missing White Paper》。
    想要看中文翻譯的版本的,可以參考奚海峰在萬雲 BaaS 上發表的翻譯稿,可以在此看到當時的具體內容。

回到 EOS.IO 來看共識算法,基於 DPOS 的 EOS.IO 會每三秒產生一個新的區塊,這個區塊必須由投票產生的 21 位生產者輪流生產出來,這樣,完成一個輪回之後,就會重新選出 21 位生產者。選擇的過程中,獲得票數數量的前 20 名自動被選中,剩下的一個生產者則需要按照得票比例來選出。
可能只是這樣簡單的說會比較不好理解,之後可以根據具體的代碼來做進一步的分析。
其餘的特性

  • 交易確認: 15/21(也就是所謂的一個節點可以等待 21 個生產者中的 15 個給出確認來確認現有交易的合法性)
  • EOS.IO 允許長度在 2 到 32 個字符之間的自定義名稱來作為索引。賬戶支持命名空間(簡單來說就是支持 @)。同時,賬戶支持權限管理,允許權限映射和權限評估。而最特別是支持恢復被盜的密鑰:原理和大家現在用的微信找回密碼需要多個活躍好友發送消息驗證非常類似。
  • EOS.IO 支持區塊生產者使用並發算法來調度交易

EOS EVM 簡述#

EVM 指的是以太坊虛擬機。 在以太坊生態系統中,它是一系列的智能合約,允許開發者部署和運行使用 Solidity 編寫的去中心化應用程序(dApp)。 EOS EVM 是對以太坊 EVM 的模擬,並位於 EOS 智能合約中。
EOS EVM 將提供與該領域其他 EVM 同等的功能,但具有無與倫比的速度、性能和兼容性優勢。 這些優勢歸功於 EOS EVM 的架構設計和 EOS 原生系統的強大特性。
EOS Native 在大規模採用中所扮演的角色
儘管目前的重點是 EOS EVM,但 EOS Native Layer 仍然是生態的旗艦產品。 隨著 Leap v4.0.0 的即將發布,EOS Native 將與 EOS EVM 一起繼續創新。
EOS Native 是用 C++ 編寫的,這是一種在傳統開發者中非常受歡迎的語言,擁有速度和強大的庫優勢。 它經常被用於對性能有嚴格要求的技術項目,如操作系統和遊戲。
由於這種底層架構,基於 EOS Native 構建的智能合約更加高效、強大,並且經常受到從 Web2 或其他傳統計算機科學領域進入 Web3 領域開發者的青睞。 隨著 GameFi 的興起,EOS Native 仍然是一個實現大規模採用的強大載體平台,它使那些已經在 Web2 環境中構建的遊戲開發者能夠根據需求,無縫集成 Web3 元素。
隨著 EOS Native 基礎設施優化工作的持續開展,以及目前來自以太坊生態系統的工具在 EOS EVM 上的推出,可以預見 EOS 生態將出現在任何其他生態系統中都不可能的出現的創新機會。 基於此,EOS 正將自己定位為一個積極的正和開發環境

EOS EVM 技術細節#

EOS EVM 的幕後開發工作中發生了很多事情,以確保它最大限度地提高性能和易用性。 下面我們將要介紹過去一年中實施的一些創新設計選擇。

圖片

Architecture of Silkworm#

圖片
最初,Silkworm 的開發專注於創建和測試分離的各個階段。Erigon 用於為這些階段準備數據庫狀態。後來,工作開始於實現兩個階段,這取決於與對等體的交互(通過 Erigon 提供的 Sentry 組件),以及 Silkworm StageLoop 的組裝,並將不同的二進制文件(每個階段一個)轉換為可用的產品,所有階段都集成到一個二進制文件中。

如圖所示,目前正在負責下載塊體和維護狀態根哈希的階段上進行工作。
Erigon 的執行時間 vs Silkworm 的執行時間

圖片

參考資料#

Want to learn more, check out the Erigon blogs
https://erigon.substack.com/p/current-status-of-silkworm-and-silkrpc
https://erigon.substack.com/p/staged-sync-and-short-history-of?s=w

聯盟鏈#

除了公鏈,聯盟鏈也是重要的區塊鏈類型。比之公鏈,聯盟鏈共識的複雜度被大大縮減,因此具有更高的執行效率。 聯盟鏈受企業級機構青睞,一般而言,相關機構之間會形成聯盟,通過聯盟鏈來共享數據。聯盟鏈可覆蓋供應鏈金融、司法存證、溯源等多種場景,未來還會與 IOT、AI 等技術結合。 在當今聯盟鏈生態中,除去採用 chaincode 的 Fabric,大部分平台都採用 Solidity 作為智能合約語言,FISCO BCOS 即是如此。
聯盟鏈是介於公有鏈和私有鏈之間,具備部分去中心化的特性。
聯盟鏈是由若干機構聯合發起,由盟友共同來維護,它只針對特定某個群體的成員和有限的第三方開放。

什麼是聯盟鏈#

聯盟鏈是區塊鏈的一種。所謂聯盟鏈,簡單來說,是指由多個機構或組織組成的、並且共同控制的區塊鏈。個人或組織想要接入某個聯盟鏈,必須得到授權。

目前,在討論區塊鏈時,大家通常根據區塊鏈的開放程度,將區塊鏈公有鏈、私有鏈、聯盟鏈三類。公有鏈就是比特幣、以太坊那種,任何人都可以隨時接入,獲得鏈上的數據或向鏈上提交新的數據。當然,你也可以隨時退出網絡。私有鏈是指那些由單個機構或組織控制的區塊鏈。這種區塊鏈不開放給別人參與,只有自己內部使用。

而聯盟鏈則介於公有鏈與私有鏈之間,它的成員由多個機構或組織組成。因此它不像私有鏈那樣,由某個組織獨自掌握控制權;但也不會像公有鏈那樣,任何人都能訪問。
聯盟鏈的英文為「 Consortium Blockchain 」,我覺得「聯盟」這個詞翻譯得非常好,即使不作任何解釋,我們也能從「聯盟鏈」這個名字裡體會到它的特點。
Solidity 可謂佔據了智能合約的 C 位,掌握 Solidity 是學習智能合約和區塊鏈的重要一環。
後面系列也將對如何用 Solidity 編寫、運行以及測試智能合約作深入介紹解析,敬請關注。 除了 Solidity,WebAssembly、Libra 的 Move 等一些智能合約語言也在發展中,可以保持關注。
2016 年的時侯,聯盟鏈是非常火熱的,當時的公鏈還處於探索階段,以太坊也不夠成熟,這給了很多聯盟鏈湧現的機會。所以說,從技術上來看,聯盟鏈其實非常強勁,毫不遜色於著名的區塊鏈項目,下面我們就一起來看看聯盟鏈技術。
簡介
  聯盟鏈源自於 Vitalik 對區塊鏈的概念分類,是他第一次提出了聯盟鏈的說法,聯盟鏈的英文是 Consortium Blockchain。
  我們回顧一下聯盟鏈。所謂聯盟鏈,就是這個區塊鏈具有準入許可,不像公鏈,任何人都可以隨時進入,準入許可意味著候選節點進入區塊鏈時需要得到已經在網絡中的節點的許可。  
  所以聯盟鏈也叫做許可鏈,也就是 Permisson Chain,這個叫法在國外比較常見。聯盟鏈的節點數通常不多,維護成本相比公鏈要低。
  有關聯盟鏈與公鏈的概念區別,它們的區別僅僅是看新加入的節點是否要經過全網中其他節點的許可,這決定了一個區塊鏈是否開放,開放程度決定了項目生態的大小,這也是最直觀的區別。
  聯盟鏈的技術框架很多,其中又以超級賬本項目下的技術框架最為知名,應用也最為廣泛,它基本代表了聯盟鏈,所以,今天我們就重點來介紹一下超級賬本項目。
超級賬本 HyperLedger
  超級賬本在 2015 年年底被發起,吸納了眾多重量級公司加入,它們包括大家耳熟能詳的 IBM、Intel、Accenture、日立、JP 摩根、Digital Asset Holdings 等公司。
  超級賬本的代碼和組織結構都結構清晰、層次分明。可以說無論從聲勢還是實力上來說,它都可以完勝公鏈。
  例如,超級賬本組織是會員制的,加入超級賬本需要繳納一筆入會費,入會費決定了你的會員等級。再如,超級賬本 Frabric 的架構設計簡直就是教科書級別的,乾淨利落、模塊清楚,幾乎挑不出毛病。
 
超級賬本由 Linux 基金會主持,宗旨是構建一個面向企業應用場景的開源分佈式賬本技術平台。

  因為企業應用場景的多樣性,所以超級賬本包含了不只一個項目,它是由多個項目組成的。一共 9 個項目,其中 5 個是主要的技術框架,其他 4 個是輔助性工具。
  它的主要技術框架分別是下面的 5 種。
  1.Hyperledger Fabric :沒有中文名,暫譯【紡布克】,是 IBM 提供的,超級賬本第一個項目。 纺布克旨在用模塊化架構作為開發區塊鏈程序或解決方案的基礎,允許一些組件 —— 例如共識算法和成員管理變成即插即用的服務。
  2.Hyperledger Sawtooth:中文名【鋸齒湖】,Intel 提供,是超級賬本第二個項目。 鋸齒湖是一個可以創建、部署和運行分佈式賬本的模塊化平台,基於硬件依賴的 PoET 共識,可以面向大型分佈式驗證器群,同時也比較低功耗。
  3.Hyperledger Iroha:沒有中文名,暫譯【伊路哈】,由 Soramitsu 提供。 伊路哈是為了將分佈式賬本技術簡單容易地與基礎設施型項目集成而設計的一個區塊鏈框架。
  4.Hyperledger Burrow:沒有中文名,暫譯【掘地者】,由 Monax 提供。 掘地者提供了一個模塊化的區塊鏈客戶端,提供了權限管理的智能合約虛擬機,它部分建立在以太坊虛擬機(EVM)規範的基礎上。
  5.Hyperledger Indy:沒有中文名,暫譯【因迪】。 因迪是特別為去中心化的身份而建立的一種分佈式賬本。它提供了基於區塊鏈或者其它分佈式賬本互操作來創建和使用獨立數字身份的工具、代碼庫和可以重用的組件。
  另外 4 個輔助性工具是:Cello、Composer、Explorer、Quilt,這四個輔助性工具可以對以上 5 個框架進行管理,例如 Composer 可以類比 Docker 中的 Composer,Explorer 就是區塊瀏覽器。
  我們不排除隨著超級賬本的發展,還有新的技術框架加入,當然,也可能存在既有的框架被市場淘汰。不過這些都不是本文的重點,所以我們不作過多介紹,你可以通過查閱超級賬本官方網站獲得更多內容。
1. 紡布克 Fabric
  纺布克是由 IBM 提供的,它基於 Go 語言,前身是 Openchain 項目。在超級賬本成立之初,Openchain 的代碼量就已經達到 4 萬行了,隨著項目的推進,項目成員對 Openchian 進行了重構,也就是我們看到的纺布克 1.0 版本。
  纺布克提供了比較完備的模塊化組件,如下圖所示。

圖片
它的架構上分成了:成員關係管理、區塊鏈服務、Chaincode 服務三個大模塊。
  成員關係管理相當於賬戶和權限管理系統,區塊鏈服務提供了區塊鏈一樣的賬本結構,Chaincode 服務相當於智能合約。
  成員關係管理是基於 PKI 的成員權限管理,平台可以對接入的節點和客戶端的能力進行限制。
  區塊鏈服務提供一個分佈式賬本平台,多個交易被可以被打包進一個區塊中,多個區塊單向鏈接成一條區塊鏈。區塊鏈代表的是賬本狀態機發生變更的歷史過程,這與公鏈區別不大。
  Chaincode 包含核心的業務處理邏輯,並對外提供接口,外部通過調用 Chaincode 接口來改變賬本數據,在纺布克中,Chaincode 是運行在隔離環境中的,也就是 Docker。
  纺布克的一個可能的工作模式如下圖

圖片
如果 Chaincode 運行在 Docker 中,我們按照經典的 IT 架構來分析,可以發現纺布克基本就是經典分佈式系統的升級版,它可以提供宕機容錯,可插拔的共識模塊讓用戶自行選擇是否需要拜占庭容錯。

2. 鋸齒湖 Sawtooth#

  鋸齒湖也是一個高度模塊化的區塊鏈技術框架,它基於 Python 語言,1.0 版本之後和纺布克一樣,作為一套穩定的框架,它已經有了實際的應用了。
  它是第一真正意義上提供拜占庭容錯共識選項的超級賬本項目,有以下四個特點。

  1. 鏈上治理:利用智能合約進行投票運營成員管理彼此之間的關係。
  2. 高級交易執行引擎:可以並行處理交易的創建和驗證,性能可觀。
  3. 支持以太坊智能合約:兼容了以太坊智能合約技術棧。
  4. 支持主流語言編寫智能合約:編寫智能合約不局限 Solidity,可以是 Go、Javascript、Python 等語言。
      相比以上四個特點,最引人注意的其實是鋸齒湖提供了一個新的共識算法,叫做 PoET(Proof of Elapsed Time),它的中文譯作:時間流逝證明。
      如果你熟悉 Raft 共識算法的話,我們知道 Raft 算法是一類強 Leader 的共識算法,選舉 Leader 的時候,每個節點自己倒計時(CountDown),最先數完的那個成為候選人。
      這個過程叫做超時選舉(Election Timeout)。每個節點每輪選舉中得到的倒計時時間是不同的,它的代碼實現為隨機產生,通常是 150 毫秒到 300 毫秒。
      PoET 與上述規則類似,只是倒計時的時間的產生變更為硬件依賴的,這裡的硬件目前是由英特爾提供的 SGX,Software Guard Extensions,它可以提供可信的程序執行環境。
      SGX 提供了一種名為 Enclave 的機制,它支持兩個函數「CreateTimer」和「CheckTimer」。CreateTimer 用於從 Enclave 中產生一個計時器。
      CheckTimer 會去校驗這個計時器是不是由 Enclave 產生並驗證是否已經過期。如果滿足這兩個條件就給該節點開具一個證明,這個證明可以被其他節點驗證,驗證通過則表示同意該節點成為記帳節點。
      我們看出,PoET 共識算法的拜占庭容錯是由 SGX 保證的,具有一定的硬件依賴。
      鋸齒湖官方提供了的四種工作模式:開發模式、PoET 模式、PoET 仿真模式以及 Raft 模式。
      可以發現,鋸齒湖相當於 Raft 協議的變種版本,選擇 Raft 模式使得鋸齒湖可以退化成經典分佈式系統。
    3. 掘地者 Burrow
      掘地者也是一個基於以太坊 EVM 的智能合約執行引擎的區塊鏈技術框架,最初項目名叫 Eris,它是基於 Go 語言構造的。
      掘地者主要由下述組件組成。
  • 共識引擎:提供了基於 Tendermint PBFT 算法的高性能拜占庭容錯共識算法。
  • 應用程序區塊鏈接口 ABCI:為共識引擎和智能合約引擎提供接口規範。
  • 许可型以太坊虛擬機 EVM:權限許可是可以通過本地安全接口強制綁定到智能合約上,其他與以太坊智能合約一樣。
  • API 網關:提供 REST 和 JSON-RPC 兩種 API 接口。
      掘地者也是模塊化的分佈式賬本技術,提供許可型的智能合約執行環境,它也基於 EVM 規
載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。