--- tags: it 鐵人賽 30 天, Web 3, ethereum --- # 從以太坊白皮書理解 web 3 概念 - Day3 ## Ethereum 節點: 全節點,礦工節點,輕節點 Light Node, 歸檔節點 Archive Node 上一章節介紹了區塊鏈的基礎概念。 現在回過頭來看 Ethereum Ethereum 是一個建構在區塊鏈上的能夠運行智能合約的平台 Ethereum 該如何達成這個目的呢? ## Ethereum Network Ethereum Network 是由 Ethereum 節點所串列起來的網路 ![](https://i.imgur.com/YzIUV2z.png) 所謂 Ethereum 節點是指運行 ethereum 客戶端程式並且遵守 ethereum protocol 連結其他 ethereum 節點的執行個體,可以是一台是實體伺服器或是一台虛擬機器。 這些 Ethereum 節點運行的程式裡會包含用來運行智能合約的執行環境也就是 EVM(Ethereum Virtual Machine),透過 EVM 執行智能合約並且把狀態紀錄在 blockchain 上。 ## Ethereum Virtual Machine Ethereum Virtual Machine (簡寫 EVM) 的職責是運行智能和約,本質是一個有限狀態機。 ![](https://i.imgur.com/CVmTPxG.png) ![https://cypherpunks-core.github.io/ethereumbook_zh/images/evm-architecture.png](https://cypherpunks-core.github.io/ethereumbook_zh/images/evm-architecture.png) ## Ethereum Account Ethereum 的 blockchain 主要是用來紀錄 Ethereum Account 的狀態 ![https://ethereum.org/static/19443ab40f108c985fb95b07bac29bcb/302a4/accounts.png](https://ethereum.org/static/19443ab40f108c985fb95b07bac29bcb/302a4/accounts.png) **Ethereum Account** 分為以下兩種 | 類別 | 建立是否需要費用 | 能否以 Account 初始化 Transaction | Transaction 類別 | | ------------------ | ---------------------------------- | --------------------------------------- | -------------------------------------- | | EOA(外部持有) | 建立無需花費 | 可以 | EOA 彼此只能是 Ether/Token Transaction | | Contract(智能合約) | 建立需要費用,因為需要佔用 Storage | 不能,只能根據輸入的 Transaction 來傳送 | 除了 EOA 能送的那些之外,還能建立 Contract| Ethereum Account 狀態包含以下四個部份: ![](https://i.imgur.com/0n10K07.png) 1. nonce: 是一個計數器,用來計算在在這個 account 送出過多少個 Transaction。避免重複傳送一樣的 Transaction。 2. balacne: 該 account 所擁有的貨幣數。以 wei 為單位。一個 Ether 等於 10^18 個 wei。 3. codeHash: 這個 code 用來對應 Contract Acoount 在 EVM 所執行程式碼的 hash。如果是 EOA,這個欄位是空字串的 hash。 4. storageRoot: 又稱為 storageHash,是一個長度 256 bit 的 hash 用來表示EVM 執行位置所在 Merkle 樹的 Root 節點資訊的 Hash。 這裡的 Account 都是已長度 42 字元的 16 進位表示,舉例來說: "0x5e97870f263700f46aa00d967821199b9bc5a120"。 EOA 是透過使用者非對稱加密的公鑰以 Ethereum 規範所產生的 Hash 值。 Contract Address 則是透過建立者的 address 與建立 contract 所產生的 nonce 結合在一起所產生的 Hash。 ## EVM 如何運作 ![](https://i.imgur.com/nWx3lMK.png) EVM 有兩個模式,透過 Ethereum api 當在唯讀模式時,會透過 EVM 執行 eth_call 執行 EVM 內對應的邏輯。 當在可寫入模式時,使用者會傳送 Transaction 給礦工節點。等礦工結點會循序指派 Transaction 給 EVM 處理。 EVM 將會驗證傳入的 Transaction ,然後在根據傳入的 Transaction 更改狀態 ![](https://i.imgur.com/pYuXj41.png) ## Ethereum 節點介紹 Ethereum 節點前面提到是運行 ethereum 客戶端程式並且遵守 ethereum protocol 連接其他 Ethereum 結點的執行個體。 具體上, Ethereum 節點的具體負責項目如下: Receive Transactions:接收來自 Dapp、錢包 或 其它節點 的交易資訊 Receive Blocks:從其它節點接收區塊資訊同步至最新的區塊高度 Validating:驗證新的區塊之正確性、驗證待處理交易之有效性 Executing:處理交易,進行運算並更改狀態值,打包成新區塊 Mining:用電腦算力來計算 Hash 值,最先找到 Hash 值出塊並廣播的礦工可以獲得區塊獎勵與所有交易之手續費(Gas) Consensus:通過共識機制達成全網帳本之一致性或區塊重組(reorg) 以下根據節點不同功能來分類介紹: ### 全節點 全節點是擁有完整區塊鏈帳本資料的節點,具備獨立驗證的能力來確認交易之有效性。 具體來說全節點主要在處理下列四件事: 1. 儲存所有歷史交易資訊,資料公開透明 2. 監測礦工挖出來的新區塊,驗證其合法性後同步該區塊 3. 監測區塊鏈網路中的新交易資訊,驗證每個交易的合法性 4. 將驗證過的「交易/區塊資訊」廣播給全網路節點 一個節點只要下載了完整且最新的區塊鏈資料,穩定運行驗證交易和同步區塊資訊,那它就是一個全節點了。由於每一個全節點都保有全網資料,所以即使其中部分節點出現問題,例如斷網或被駭客攻擊,都不會影響整個區塊鏈網路的資料一致性。這即是「去中心化」記帳系統的優勢所在。 ### 礦工節點 挖礦的過程即是將驗證過的待處理交易打包成新區塊,並以電腦算力來計算 「Hash 值」,最先找到 Hash 值成功出塊並廣播的礦工會獲得區塊獎勵與所有交易之手續費(gas)作為報酬。 礦工必須要運行全節點才能即時瀏覽區塊鏈歷史資料進行交易驗證,再將驗證通過的交易進行打包。因此,**所有礦工必定是全節點;然而全節點未必是礦工**,運行全節點的人未必會花費電腦算力去參與新區塊 Hash 值的運算來爭取區塊獎勵。 ### 輕節點 Light Node 輕節點顧名思義即是輕量級的節點,具體定義是不儲存或維護完整的區塊鏈副本,只儲存最小量的狀態來作為發送或傳遞交易訊息的節點。至於輕節點究竟儲存了哪些狀態,我們得先透過下圖瞭解以太坊的資料結構: ![https://miro.medium.com/max/1400/0*vvstXw73nDKDOZvv.png](https://miro.medium.com/max/1400/0*vvstXw73nDKDOZvv.png) 圖片來源:[https://blog.ethereum.org/](https://blog.ethereum.org/) #### Block Header and Body 以太坊的每個區塊主要分為 Header 和 Body 兩個部分存儲,Body 即是交易列表;Block Header 則較為複雜,包含了前個區塊的 Hash、時間戳及挖礦難度等相關參數。 在 Block Header 中採用一種名為 Merkle-Patricia Trie (MPT) 的核心資料結構來儲存區塊鏈資訊,可以理解為把帳本分割成無數個小的資料塊,每個資料塊像是一棵樹中的無數葉片,而我們把每兩個相鄰的葉片合併成一個字串,並算出該字串的 Hash 值。如此過程經過無數次後,最終如同所有樹枝歸向一個樹幹一般,會得到一個包含了所有區塊資料的 Hash 值,稱為「Merkle Root」。 #### 輕節點資訊 全節點儲存了所有區塊的 Block Header 與 Body(交易列表),而輕節點只儲存最小量的狀態:即「區塊標頭 Block Header」,藉此大幅降低儲存空間的需求。 #### 輕節點如何驗證交易 由於割捨掉區塊的 Body,即所有歷史的交易列表,因此當輕節點需要驗證某個交易的合法性時,具體做法為: 1. 向鄰近的全節點發起確認請求 2. 全節點收到請求後提供所需相關資訊供驗證 需要向全節點請求的原因是:假設有一個合約執行的交易,那麼便必須要有該合約部署時的原始碼(位在 Contract Created 之交易中)。由於該交易位於某個區塊之 Body,故輕節點必須要向全節點請求該合約之相關資訊方能進行交易驗證。 #### 輕節點的特色摘要 整體而言,輕節點大致上具備以下幾點特色: * 只儲存每個區塊的區塊標頭 Block Header * 不一定保持隨時在線(獲取最新的 Block Header 資訊) * 根據需求可以只保存與自己相關的交易內容 * 無法驗證大多數交易的合法性,只能驗證與自己相關交易的合法性 * 無法驗證新區塊的正確性 * 只能檢測到當前的最長鏈,但無法知道哪條是最長合法鏈 由於輕節點必須要向全節點請求與交易驗證相關的 Block Body 資訊,那麼要怎麼知道全節點回傳的資訊是正確的呢? 這時就要回到以太坊的資料結構來談,前面提到輕節點為了減少儲存空間,而割捨掉 Block Body,僅保留作為驗證之用的 Block Header。由於存有已經驗證合法之 Block Header,因此當未來需要驗證相關交易時只要透過跟全節點請求相關的 Block Body 資訊即可進行驗證,不需要從頭驗證整個區塊。 #### Block Header 與交易驗證 輕節點能夠利用 Block Header 驗證交易的原因為: Block Header 中的 Merkle Root 即是由 Block Body 中的交易資訊經由雜湊演算法(Hash Algorithm)生成的「數位指紋(Digital Fingerprint)」,因此 Block Header 可以充分代表 Block Body 內的資訊。 Block Header 中的 Merkle-Patricia Trie 是一個生成 Hash 需要花費大量算力,但驗證非常迅速的結構。當輕節點收到全節點提供的資訊時,便能夠利用已有的 Block Header 相關訊息迅速驗證該資訊是否正確,進一步進行交易驗證。 ### 歸檔節點 Archive Node 「歸檔節點」是在全節點的基礎之上,額外儲存了每個區塊高度的區塊狀態(個人帳戶與合約帳戶之當時餘額等資訊),即針對每個區塊高度當下的狀態進行快照並存檔。歸檔節點能讓你快速回到某個區塊高度去查詢當下狀態:例如你想要知道某一個帳戶在區塊高度 #5,000,000 的餘額時便會派上用場。 ## 概念整理 今天介紹了 Ethereum 用來運行智能合約的機制 [EVM](https://zh.wikipedia.org/zh-tw/%E4%BB%A5%E5%A4%AA%E5%9D%8A%E8%99%9A%E6%8B%9F%E6%9C%BA)。 Ethereum 可以透過 ethereum api 來執行寫在 [EVM](https://zh.wikipedia.org/zh-tw/%E4%BB%A5%E5%A4%AA%E5%9D%8A%E8%99%9A%E6%8B%9F%E6%9C%BA) 上的智能合約,並且把狀態更新到鏈上。 ## 參考文獻 [https://ethereum.org/en/developers/docs/](https://ethereum.org/en/developers/docs/) [https://www.youtube.com/watch?v=HfTTbxQWWvg](https://www.youtube.com/watch?v=HfTTbxQWWvg) [https://ethereum.org/en/developers/docs/accounts/#externally-owned-accounts-and-key-pairs/](https://ethereum.org/en/developers/docs/accounts/#externally-owned-accounts-and-key-pairs/) [https://medium.com/pelith/ethereum-nodes-d3e07745d189](https://medium.com/pelith/ethereum-nodes-d3e07745d189)