區塊鏈技術概觀(四):以太幣運作模式拆解

作者 | 發布日期 2017 年 08 月 24 日 8:00 | 分類 Fintech , 數位貨幣 , 科技教育 follow us in feedly

在之前數篇文章中我們看到數位貨幣的元祖 Bitcoin 是如何從無到有定義了數位貨幣系統,現在也來看看其他貨幣是如何基於其上做了些改進,之後我們才能知道區塊鏈適合在什麼場景使用。今天要來看的就是號稱有美國五大企業支持,最近非常紅的以太幣(Ethereum)。



以太幣身為區塊鏈數位貨幣的一員,運作當然和比特幣有相當類似性,包括利用 Hash 來鏈住每個區塊、利用 PoW 保護資料、共識型決議協定、同樣有一個快速的 P2P 網等。但以太幣身為後進者,希望直接在鏈上達成智慧合約的目標,所以以太幣的實做難度其實更高,如果運作無誤,以太鏈也的確可提供更多方便的交易功能。

Ethereum 社群一直以來都很敢衝,套句中國一位挖礦名人對筆者講的話:這群人真是無法無天,什麼都敢做!因此早期出現過一次相當失敗的分裂(Hard fork),差點讓它一蹶不振。現在我們看到的以太幣分成兩個,一個叫 Ethereum,另一個叫 Ethereum Classic ,基本上就是那次分裂的結果。目前 Ethereum 的價格仍然高過 Ethereum Classic(維持早期協議法的鏈系統),因此分裂事件還算有收尾。不過我們也可以看見一個大原則:愈多功能的東西愈難維持高安全性!甚至有人已公開宣稱以太幣將成為駭客天堂。

Ethash

目前以太幣系統仍使用 PoW 技術來保護區塊鏈,既然如此,就必須有一套 Hash 技術來確保區塊驗證碼要花掉大量計算力才能找到。Ethash 就是以太幣的 hash 技術,Ethash 鮮少人直接講,因為它非常複雜,筆者在此先針對幾個特性來講:

  1. 是基於 SHA3 的變形,對計算力的要求並不高,過程中尤其沒用到什麼浮點運算。
  2. 用了非常多層查表法,也就是 STRICT MEMORY HARD HASHING FUNCTIONS 做法,所以非常吃記憶體,無論是記憶體頻寬、記憶體容量、讀寫的反應時間都非常重要。
  3. 之所以如此做,在於許多新數位貨幣的開發團隊看到當年 Bitcoin 只要靠一台挖礦機就抵過萬顆 CPU 的可怕情況,因此希望設計出一套演算法可讓 ASIC 無法得到大幅加速。至於用 ASIC 可加速到底帶來什麼壞處?我們以後有機會再來講。

由於 Ethash 的查表法極端複雜,所以過程基本就是不斷產生新表,再去查表,做完得到結果再記下來,再查表,再相減看看能不能小於特定範圍,所以 ASIC 基本上無法利用「改善運算線路架構」這種單純的方法來加速運算。當然,利用改善記憶體控制器或根本利用超高頻寬的記憶體(好比最暴力的 SRAM)的確可以得到一定效果,但恐怕無法像過去那樣增加運算單元,塞個 1 千萬個電晶體就把 CPU 和 GPU 活活打死。我們先做個小計算,如果今天真有人要搞多讀寫口的 SRAM 來增加效能,大概準備個 4GB 到 8GB 的 SRAM,且要能容許多個處理器以 64byte 的小區塊讀寫。撇開控制器的複雜度不談,光是電晶體數量,就會和在 CPU 內部塞進 48GB Cache 的難度一樣,得到的加速大概只有使用 DRAM 的數倍而不是數千倍。

計算流程

使用目前的區塊頭為種子數,利用這個種子數產生一個高達 16MB 的假亂數表(Pseudo Random number),為什麼叫它假亂數呢?因為是由一個種子數套用一套數學規則產生出來看起來很像亂數的表。但是不保證中間的亂法沒有規則可循,故稱為假亂數表。

利用這個假亂數表為快取,產生高達 1GB 以上的 DAG 表,使用的演算法基本上是改良版 Dagger-Hashimoto 演算法。DAG 的全名是 Direct Acyclic Graph,基本上有點像資料迷官,但不會有回頭路徑,就像玩一種遊戲,開頭時選擇一個入口,遇到分岔就轉彎,看最後會進入哪個結果。

▲ Direct Acyclic Graph 示意圖。

這個 DAG File 每 3 萬個區塊(大約 100 小時)只產生一次,每次都會比之前的再長大一些,所以這表的查詢難度就已經隨著時間增加了。驗算時,我們可以由快取的亂數表只產生出我們要用到的某幾項,所以驗算時可以不用把整張 DAG 表全部產生出來。目前產生 DAG File 大都是礦場主人的工作,礦工只要下載就好了。

挖礦時,代入 NONCE 後使用 SHA3 類型的方式不斷查表求出 MIX 值,然後兩兩相減看能否找到小於規定大小的最終數值,若是可以,就算找到該塊的解。由於系統等於是隨機在 DAG 中讀取一小塊資料,所以對記憶體的效能要求至高,且這件事恐怕也不是利用小小的快取記憶體可以搞定,因為隨機小區塊讀取通常會讓快取的失誤率拉得很高,反而可能變慢。以太幣的 NONCE 長度已經固定在欄位中,不像比特幣是浮動的,長達 64 位元。目前高檔 GPU 為挖礦主力,因為效能最好,一般使用 N 牌 1070 通常可以達到近 29M Hash/秒的速度,不像比特幣用 SHA1 型的雜湊函數,可以每秒幾 G 在跑。也因此 NONCE 的長度 64bit 是足夠的。

以太的區塊格式

接下來仍然稍微花點心思看一下以太幣的區塊格式。了解了比特幣的區塊格式後,現在來看以太幣應該會發現其實大同小異,有 87% 那麼像,只是以太幣的區塊有比較多功能且有支鏈能力,所以會多一些欄位。以太幣同樣使用 hash 值為區塊代表,同樣有隨時可調整的難度,以及挖到礦的人是誰等等。但其中有一個比較特別的欄位是 GAS Liimit,也就是瓦斯。為什麼會設置瓦斯呢?為什麼不乾脆叫 gasoline(油水)呢?呃,這問題多了,基本上瓦斯值代表以太網路目前處理交易的能力,當挖礦者的處理能力愈大,或參與的人愈多,使計算力增加,GAS 值就會跟著增加。目前以太幣所有交易動作都視為智慧合約執行,而執行智慧合約就需要計算力,當網路 GAS 用完就代表這個網路滿了,無法再進行任何交易,否則會有執行錯誤的風險。

Block Number:4167982(a few seconds ago)

Hash:

0x3b0780cc9c2d7d481db3a64089ba4d81fe4e3ac366ff067b079066ae72153072

Difficulty:

1,728,563,025,185,747

Difficulty Bomb factor:

549,755,813,888 (0.032 %)

Miner:

ethermine

Gas Limit:

6,718,978

Gas Usage:

15.3% (1,029,488 of 6,718,978)

Minimum gas price:

4 GWei

Time:

2017-08-17 07:43:41 (a few seconds ago)

Uncle Hash:

0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347

Root:

0x5827b79c10f4c801131c645ebf6a2787bef2e5aadb7bcfce9e50d014f97dbc3b

Tx Hash:

0x325c85c3e9152e797a27c8b8872233c2a26886533d98b533ef715f0c8fdc9578

Size:

5779 bytes

Extra:

ethermine-eu1 (Raw: 0x65746865726d696e652d657531)

Nonce:

0x88b5245d90031a5f36

Reward:

5.013354348262915 Ether ($1,512.08)

Transactions

Hash

From

To

Amount

Fee

0x00ec132f… 0x59F68158eD1cc… 0x089BACeeD3fFf… 714.9785635654157 Ether ($215,644.68) 0.000483586950861 Ether ($0.15)
0x04070b92… 0x544895d4aA1a4… 0xde2b2C0702cEb… 714.4275209323019 Ether ($215,478.48) 0.000483586950861 Ether ($0.15)
0x08e2dcdc… 0x7B9Bc474667Db… 0x011EfCeE2586e… 0.00323616 Ether ($0.98) 0.00021 Ether ($0.06)
0x0ab02217… nanopool 0x2969C6C6db419… 0.2007292783757419 Ether ($60.54) 0.000084 Ether ($0.03)
0x0d9650d0… 0x7B9Bc474667Db… 0x5b7d130bFA1dB… 0.00323616 Ether ($0.98) 0.00021 Ether ($0.06)
0x14131218… nanopool 0xF4b628fd2137B… 0.20558935288108643 Ether ($62.01) 0.000084 Ether ($0.03)
0x167ba1d3… nanopool 0x9a7e9033bebe2… 0.07793215496396376 Ether ($23.51) 0.000084 Ether ($0.03)
0x19acd3ef… nanopool 0x331077Cd09209… 0.21053147571349606 Ether ($63.50) 0.000084 Ether ($0.03)
0x263f485b… nanopool 0x8184fD65b9A69… 0.20702381089474336 Ether ($62.44) 0.000084 Ether ($0.03)

以太幣的產生與使用

目前以太幣的產生與比特幣仍然 87% 像,也就是找到解的礦池或礦工自己分了!每次主鏈上找到一個解,就產生 5 個新以太幣,而支鏈(Uncle Blocks)找到的解就得到 4.375 個以太幣。就一般而言以太幣的使用也沒什麼特別之處,與比特幣一樣都是轉帳而已,但以太幣支援智慧合約,因此它的電子錢包就多了發送合約的功能,這點對於不會程式的人就是一大難題了,之後我們再來看什麼是智慧合約。

以太幣本來預期是每 15 秒產生一個區塊,但是最近兩個月挖礦能力大增,許多人加入挖礦行列,因此網路總算力由 50G Hash/秒快速漲至 100G Hash/秒,開發社群就有人又開始動歪腦筋了。大部分數位貨幣升級都是為了技術提升,不過這次倒是為了讓新貨幣產生速度慢下來的所謂經濟面做法,因此很可能短期內產生區塊的時間會由 15 秒拉長成 45 秒。未來更有可能直接走上廢除 PoW 改採 PoS 的路,這對以太幣的發展和未來價值影響都很大,就好好看著這個很敢玩的社群最終會如何收場。

GHOST 演算法

以太幣的系統最重要的就是共識型協議 GHOST(Greedy Heaviest Observed Subtree),筆者有時真懷疑這些發明人是不是《攻殼機動隊》的粉絲……

以太幣的區塊產生速度非常快,這代表交易速度也非常快,基本上開始之初是 12 秒產出一個區塊,因此網路不同步的情況一定常常發生,所以它允許網路上有良性分支,叫做 Uncle chain,Uncle blocks 產生的因必然是合法交易在短時間內無法傳遍整個網路,所以有些人現在收不到,但通常一至五個區塊後都會收到,所以通常五、六個區塊後大家整併一下,就會發現原來過去五、六個區塊雖然每個區塊內容都不同,但整併起來看後會一模一樣,如果發生這種情況,Uncle block 就會整併回來,所以計算 Uncle chain 的人也會有獎勵金。以太坊使用 Uncle 的意思很明顯,就是雖然它不是目前主鏈的區塊,但承認合法性,就好像你叔叔雖然不是你父母,但血統上他仍然是祖父母血緣傳下來的,也算一家人。

所以原則上來說,系統同時看得到二條以上的支線,但通常會快速收斂回來不會一路分支出無限多條鏈。GHOST 目前可讓一個同號碼的區塊同時存在兩個 Uncle block,每個 Uncle chain 最長只到六個區塊。Uncle 的產生情況通常都是兩個挖礦機在接近同時間同時對全網廣播說:我找到區塊解了!結果大家一檢查發現,兩個區塊竟然不一樣!但偏偏兩個區塊的交易都通過合法性檢驗!這時就會自動記入 Uncle block。

目前有許多專家對 Uncle 的存在表示擔心,因為認為 PoW 的設計在這種高速交易的系統已帶來安全性問題,因為在不同步的情況下很有可能某人的錢只有 1 元,但那個 1 元發送了三、四次,會造成錯帳。但是也有其他專家認為只要做好 Uncle block 的合法性檢查,其實 Uncle 的存在反而讓駭客更難欺騙系統。筆者也認為只要每個區塊產生時,系統都緊盯所有 Uncle blocks,反而更容易得到全局視野。事實證明以太幣發生過的重大安全問題,反而是在智慧合約而不是單純的帳務鏈。試圖改善帳務鏈而沒有考量好智慧合約執行問題,反而會製造出更大危機。

(首圖來源:shutterstock)

延伸閱讀: