以太坊區塊鏈架構

買賣虛擬貨幣
上一節我們帶大家核心地認識了區塊鏈架構的全貌,相信大家都更加了解區塊鏈運作的機制和原理。本篇文章我們將接續上篇來介紹區塊鏈2.0 以太坊- Vitalik如何在中本聰設計的比特幣架構上進行升級與改動,透過首度揭曉的「以太坊區塊鏈架構圖」帶大家完整認識以太坊的運作原理!Vitalik Buterin 領銜設計的區塊鏈2.0 -以太坊EthereumHow Ethereum Blockchain Work

以太坊虛擬機器(EVM — Ethereum Virtual Machine )

介紹以太坊區塊鏈架構前必須要介紹一下「EVM 」,EVM是以太坊為了讓人人都能成為節點而創造的計算引擎。由於每個節點的軟硬體環境可能都不一樣,為了確保每個節能都能進行一樣的運算,於是各個節點都透過EVM 來執行Ethereum 交易的狀態轉移與智慧合約,以確保每一個節點都有相同的執行環境。

前言完畢,緊接著我們便來一探究竟:

以太坊交易的一生

有別於比特幣的UTXO,以太坊是採用Account 的架構。

由於以太坊多了智慧合約的設定,將會分成AB C 三個part 來做說明,

我們先從最單純的Ether 轉帳交易開始看起:

A. 單純的Ether 轉帳交易

「 單純的Ether 轉帳交易」示意圖
1. 一個使用者(EOA)欲發起一筆交易。2. 透過錢包(管理私鑰的工具)輸入交易資訊To:對方接收地址;Amount:欲轉移的Ether數量;
Gas Price:單位Gas給的手續費;(參閱第5節)Gas Limit:普通的Ether轉移交易都是21,000 Gas,不用動;Input Data:視是否要在交易中留下文字訊息。3. 以私鑰簽署交易。4. 廣播「加上簽名的交易封包」至鄰近的以太坊節點們。5. 節點接收到新交易時,會先至State Database 檢查交易發起地址是否具有足額Ether(Balance)可做轉移,若無則該交易會即刻被丟棄。
6. 若檢查後確認有足額,則該交易會被放入到Tx Pool中。(按照Gas Price設的多寡由高至低排序)7. 等待出塊的同時,各節點會A.廣播接收到的交易B.接收未在Tx Pool內的交易8. 礦工節點們(有在用電腦算力找nonce值,拼出塊獎勵的節點)會撈取手續費較高的交易們,進到EVM運算並更改狀態值後,將已完成運算的交易們來打包成新區塊(運算中出現錯誤的交易會被丟棄),隨後用電腦算力來計算nonce值。
*注:這邊的nonce值跟前面介紹過的以太坊地址的nonce值不同(以太坊有兩個nonce:一個是挖礦的;一個是地址的交易序次。)*注2:運算的同時便會消耗Gas。9. 成功找到nonce值,出塊的礦工會獲得出塊獎勵及該區塊所有打包交易給的手續費。10. 該礦工節點將新的區塊廣播至全世界的其他節點們。11. 其他節點同步 <8660586區塊高度(最新的區塊)>、<State Database>、<Tx Pool>資料,繼續廣播與接收新交易。
12. 礦工節點再從Tx Pool 中撈取未出塊的交易們運算並打包成新的區塊。以上,便是一筆以太坊交易從傳送到出塊會經歷的流程。緊接著我們來一探究竟智慧合約是如何部署的:B. 部署智慧合約(Smart Contract)我們在第2節其實有概略性的介紹過一次,此刻我們搭配示意圖更完整地來介紹一遍吧!
「 部署智慧合約」流程示意圖
1. 以Remix或其它開發工具撰寫完成智慧合約。2. 將原始碼編譯為Bytecode。3. 使用者(EOA)透過錢包(管理私鑰的工具)輸入交易資訊To: 0x0Amount:視是否要將Ether打入合約中Gas Limit:按照合約繁複程度決定要設多少
Gas Price:視交易狀況及欲出塊的時間急迫性Input Data:放入合約Bytecode4. 以私鑰簽署交易,廣播「加上簽名的交易封包」至鄰近的以太坊節點們。5. 節點接收到新交易時,一樣會先至State Database 檢查交易發起地址是否具有足額Ether(Balance)可做轉移(有些情況會把Ether打入合約) ,若無足額則該交易會即刻被丟棄。6. 若檢查後確認有足額,則該交易會被放入到Tx Pool中。(按照Gas Price設的多寡由高至低排序)
7.等待出塊的同時,各節點依舊會A.廣播接收到的交易B.接收未在Tx Pool內的交易8. 礦工節點們撈取起本筆合約部署交易,進到EVM運算。9. 將合約程式碼部署至Program Code ROM,是個部署後便不能進行更動的Read-Only Memory(唯獨記憶體)。10.同時,智慧合約亦可以另外使用記憶體(Memory)來儲存合約所需要紀錄的資訊。例如:一個發行ERC-20 Token的智慧合約,便可以使用記憶體來紀錄各個以太坊地址所「持有Token數量」,追蹤各個地址的ERC-20 Token Balance。
11. 上方步驟完成後,便會將運算後的結果(合約地址、Gas Used)寫回到該筆交易中。12. 礦工節點們將運算完的交易們打包成新區塊(運算中出現錯誤或Gas給不夠的交易會被丟棄),隨後用電腦算力來計算nonce值。13.成功找到nonce值,出塊的礦工會獲得出塊獎勵及該區塊所有打包交易給的手續費。14.該礦工節點將新的區塊廣播至全世界的其他節點們。15. 其他節點同步 <8660586區塊高度(最新的區塊)>、<State Database>、<Tx Pool>、<Contract Code ROM>、
<ERC-20 Token Balance>資料,繼續廣播與接收新交易。16. 礦工節點再從Tx Pool 中撈取未出塊的交易們運算並打包成新的區塊。以上,便是一筆智慧合約部署的交易從傳送到出塊會經歷的流程。最後,我們來解析呼叫智慧合約進行操作與互動:C. 呼叫合約進行互動這部分我們在第2節與第4節其實也有概略性的介紹過,
此刻我們搭配示意圖,更著重在節點的部分,較完整地來介紹一遍吧!
「 呼叫智慧合約」流程示意圖
1. 透過DApp 介面或其它方式來呼叫智慧合約進行互動2. 生成以下形式的交易格式:To:合約地址
Amount:視是否要將Ether打入合約中Gas Limit:按操作合約的繁複程度決定要設多少Gas Price:視交易狀況及欲出塊的時間急迫性Input Data:放入以hex型態表示的「要呼叫的合約function與引數」3. 以私鑰簽署交易,廣播「加上簽名的交易封包」至鄰近的以太坊節點們。4. 節點接收到新交易時,一樣會先至State Database 檢查交易發起地址是否具有足額Ether(Balance)可做轉移(如牽涉到) ,若無足額則該交易會即刻被丟棄。
5. 若檢查後確認有足額,則該交易會被放入到Tx Pool中。(按照Gas Price給的多寡由高至低排序)6. 等待出塊的同時,各節點依舊會A.廣播接收到的交易B.接收未在Tx Pool內的交易7. 礦工節點們撈取起本筆「合約操作交易」,進到EVM運算。
8. 根據合約地址撈出Program Code ROM 中的合約程式碼。9. 依照MethodID (Function Hash) 找到合約中對應的Function。10. 將相關引數填入進行對應運算。以ERC-20 Token的Transfer Function為例,運算時便會更改相關地址的ERC-20 Token Balance。11. 上方步驟完成後,便會將運算後的結果(新的Token Balance、Gas Used)寫回到該筆交易中。12.礦工節點們將運算完的交易們打包成新區塊(運算中出現錯誤或Gas給不夠的交易會被丟棄),隨後用電腦算力來計算nonce值。
13. 成功找到nonce值,出塊的礦工會獲得出塊獎勵及該區塊所有打包交易給的手續費。14. 該礦工節點將新的區塊廣播至全世界的其他節點們。15. 其他節點同步 <8660586區塊高度(最新的區塊)>、<State Database>、<Tx Pool>、<ERC-20 Token Balance>等資料,繼續廣播與接收新交易。16.礦工節點再從Tx Pool 中撈取未出塊的交易們運算並打包成新的區塊。以上,我們便核心地介紹完了以太坊區塊鏈的架構。儘管有許多的技術細節我們此時並未完整交代也未深入著墨,但相信對於初學區塊鏈技術讀者來說應該能逐步建立起區塊鏈架構的全貌。未來我們將持續在這基礎上解析更多面向的區塊鏈技術知識,謝謝大家!

免責聲明:

  1. 本文版權歸原作者所有,僅代表作者本人觀點,不代表鏈報觀點或立場。
  2. 如發現文章、圖片等侵權行爲,侵權責任將由作者本人承擔。
  3. 鏈報僅提供相關項目信息,不構成任何投資建議

推荐阅读

;