iT邦幫忙

2022 iThome 鐵人賽

DAY 20
0
Web 3

Smart Contract Development Breakdown系列 第 20

Day 20 - Proof-Of-Work (內有空投活動)

  • 分享至 

  • xImage
  •  

Proof-Of-Work

為了增加觸及:大家在下方留言你的 Polygon 地址,前 5 位可以免費獲得最近我同學做的 NFT 空投(Bakajohn)!

Synchronization Link Tree


Intro

Proof Of Work 是一種區塊鏈結點們取得共識的過程,在一筆交易於鏈上發起時並不會馬上完成,而是會進入一種未完成的 Pending 狀態,這時候交易會被存在 MemPool 中等待礦工的打包與驗證。打包交易時礦工會挑出手續費最優渥的交易,確認其簽名正確和合法,最後才開始解 POW(隨意猜想 Nonce 然後計算 Hash(pre-block-hash | Tx | nonce),當 Hash 結果小於 targetNum 時代表挖礦成功),過程之中系統可以藉由調整 Hash Function 來調整挖礦難度。

雖然 PoW 即將從以太坊上消失,但我覺得這仍然是一個了解區塊鏈原理和 Nonce 的好機會,所以仍選擇在 2.0 上線之際介紹 PoW!

除了 PoW 還有大家知道以太坊即將進入的 PoS 和其他共識機制,以及礦工除了從 PoW 中獲利之外,其實還可以從 MEV 部分探討礦工獲利!但關於 ETH2.0 的 PoS、其他共識機制、MEV 等主題可能都會讓這次系列文篇幅變得過大,希望大家可以關注我的 Medium,未來可能也會提到相關的內容!

Proof-Of-Work

Nonce

Proof-Of-Work 中的 Nonce 即為在每個 block 中的隨機數,長度為 32-bit (4-byte),被用來證明 "Proof of Work" 已經被滿足了。他可以是一個數學題目的結果,但理論上需要跟運算技巧無關而是一個必須重複嘗試(窮舉)的值。

Progress

我們可以先來看看 Bitcoin 之中的 PoW 是如何運作的,待會再來比較跟 Ethereum 的差別。

  1. 從 Tx Pool 這樣一個 Pending Pool 裡面蒐集交易,並且製造一個完整且大小不超過 1 MB 的區塊。
  2. 用 double-SHA256 計算 Block Header(Version + Previous Block Hash + Merkle Root + Timestamp + Difficulty Bits + Nonce),關於 Block Header 我們等下講。
  3. 比較第二步的結果是不是能算出 0 開頭的 hash 值(實務上小於 hash target value),如果不是就把 nonce + 1 或進行調整,並且回到前面步驟重來。
  4. 持續比較 hashing result 與 target number,值到 hash 小於 target。
  5. 只要礦工們發現有計算成功的區塊被廣播到各個節點,他們可以自行去對其進行運算(對其做一次 SHA-256 後確認符合區塊難度即可),如果大家都同意這樣的區塊是合法的,打包該區塊的礦工就能夠獲得獎勵。
  6. 如果有一個強大算力的節點加入或者有人退出,而區塊建立時間就有可能變少。
    • 為了讓出塊時間維持在 10min,大約每兩個禮拜或說 2016 個區塊,區塊難度就會被調整。
    • 增加區塊難度意味著將 target 值降低,在比特幣創世區塊中設定了 10 個 0 的 target,也就是:"0000000000HEX",可以理解到如果把前方的 0 位數增加,那要低於這個值就越困難,礦工得要窮舉的次數與時間就會變多。
  7. 當兩個區塊同時遞交給節點,則算力較高的礦工(由區塊難度判斷)會被選擇。

當然這邊的難度不代表我們可以精準判斷一個礦工算了這個 hash 幾次,只能判斷「機率」為多少

在比特幣系統裡面有一些規則來維持系統穩定及安全,例如:最長鏈原則、10 min 內只能有一個礦工打包成功、所有節點會接收成功區塊的廣播並自行驗證一次等。此外打包成功的獎勵每產出 21 萬個區塊(每四年)減半一次,最原始是 50 顆比特幣作為獎勵,2021 年以後獎勵為 6.25 顆。

Block

已知一個區塊構造中有一個 Block Header,他儲存了 Version + Previous Block Hash + Merkle Root + Timestamp + Difficulty Bits + Nonce 等元素。其中 Merkle Root 是我們沒有解釋過的,他其實就是將所有的交易當作 Merkle Tree 的葉子,將成一棵 Merkle Tree 之後把 Merkle Root 存到這,基本上就是一個元素子集合的哈希最終值。Merkle Tree 對有 CS 背景的朋友們應該非常熟悉,這邊就不介紹這個資料結構了。

Merkle Root 可以做為 Merkle Proof 被提交之後的 Verify 值,也就是當你想要證明一個交易在這個區塊中,你只需要把這筆交易的資訊 + 他的 Merkle Proof 丟進 Verify(),看結果是否與 Merkle Root 相同即可。

Block Difficulty

區塊難度是在每一個節點中獨立發生的,為了要讓新區塊的產生速度都維持在每十分鐘一塊每 2016 個區塊區塊難度會自動調整一次,NewDifficulty = OldDifficulty * ( Past2016TotalConsumeTime / 2016)

而目標值的計算則為:Target = 0x00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF / NowDifficulty

Comparision

基本上以太坊之中的 PoW 和 Bitcoin 相差無幾,需要注意的是 nonce 這個詞在 account 和 contract 都有,我們之前也有提過了。

Progress in Ethereum

  1. 用戶會使用他們的私鑰去簽核一筆交易(單純匯錢或者與智能合約互動)
  2. 用戶透過 Provider 將其交易送到以太坊網路的節點上,進入 mempool 等待打包與驗證。
  3. 偵測到新的交易進來時,每個節點就會開始利用他們的 local mempool,也就是交易列表,來去驗證這筆交易是否合法。
  4. 在挑選交易組合的時候,礦工會選擇挑能夠獲得最高手續的組合,這部分就與 MEV 息息相關(不只是 gas fee,你也能在智能合約中直接把錢匯給礦工,這也算在 MEV 中,但今天不討論),挑選完之後就會開始:
    1. 驗證交易合法性,將其內部的程式碼進行執行(如果有的話)並根據結果修改區塊中的狀態(State)。這部分還停留在他們 Local 建立的區塊,不是最後整個的以太坊網路的狀態。
    2. 當區塊內部的交易與程式碼都被徹底執行之後,礦工可以開始進行 PoW 的工作,爭取將這個區塊推上主網的機會。
  5. 最後如果礦工獲得廣播這個區塊的機會,就可以把它廣播給其他節點。
  6. 其他節點如果聆聽到這個新區塊,就會去驗證這個區塊的合法性,也就是把所有交易跑一次以及確認 EVM State 的 checksum。
  7. 如果這個新區塊是合法的,那礦工們(節點)就把自己正在嘗試建立的區塊(Local Mempool)刪掉,等待下一次機會。
  8. 如果有新節點想要加入,則把所有的區塊資料都下載下來,然後初始化 EVM 方便未來跑狀態更新的程式碼。

Closing

Reference


最後歡迎大家拍打餵食大學生0x2b83c71A59b926137D3E1f37EF20394d0495d72d


上一篇
Day 19 - Nonce(內有空投活動)
下一篇
Day 21 - Internet Protocol & JSON-RPC
系列文
Smart Contract Development Breakdown30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
0

好文推推
0x92ecbaf626aBF02b4B5Aa86B34E485eD540C2Fc5

ALu iT邦新手 3 級 ‧ 2022-09-20 00:18:09 檢舉
0
koopa
iT邦新手 5 級 ‧ 2022-09-20 11:54:49

支持!
0x5eE7d5Ae60d3FD642d9716a696B71B37aC8927dC

ALu iT邦新手 3 級 ‧ 2022-09-20 14:12:59 檢舉
0
marvinhsu
iT邦新手 4 級 ‧ 2022-09-20 22:57:26

0x3ea43F6d608AE0C914A245B09f67c4049ba2CC20

ALu iT邦新手 3 級 ‧ 2022-09-21 00:03:29 檢舉

我要留言

立即登入留言