初探 Ethereum
July 26, 2022
初探 Ethereum
前言
由於以太坊與比特幣的相關性非常多,因此這一篇文章會假設大家已經了解比特幣的基本知識,包含其區塊運作方式、共識機制以及它的歷史脈絡等。在這一章節中會介紹關於以太坊運作的方式,可以把這一篇當作以太坊的淺顯介紹。
以我目前的能力沒辦法給出太深切的介紹,因此主要會分享一些關於以太坊的基本運行方式,一些更深入的東西就暫時交給其他大神們,或是未來的我來分享吧!
Ethereum 是什麼?
比特幣在 2008 年金融危機時橫空出世,吸引了許多人的目光,它的區塊鏈上記錄著從創世區塊以來的所有交易,而其主要機制是利用雜湊函式 (hash function )與電子簽名 (digital signature )等方法來驗證目前的所有交易都是沒有被竄改與驗證雙花問題 (double-spending problem )的。 在 2013 年底,以太坊的創辦人 Vitalik Buterin 構想了一個超越當時想法的提案,也就是在比特幣區塊鏈的基礎上建立智能合約的概念,但是當時的開源團隊 Mastercoin 因這個提案不符合當前目標而沒有採用。直到 2013 的 12 月,Vitalik 發起了以太坊的白皮書,隨後才獲得許多人的注意,這時才開始了以太坊建構。
經過多人的研究,最後 Ethereum
的創世區塊 (Genesis Block )在 2015 年的 7 月被挖出,它的架構繼承了比特幣的特色如基於區塊鏈上運作,也融合了許多新的功能如智能合約與狀態紀錄,因此可以暫時先把 Ethereum
想像成具有更多功能的比特幣網路。
紀錄狀態
剛剛有提到,Ethereum
具有「紀錄狀態」的功能,但是所謂的狀態到底是什麼?
首先我們要先來介紹一下「帳戶 (Account )」的概念:帳戶是一串 16 進位的數字,代表著這個以太鏈上的地址。
在 Ethereum 中帳戶可以分成兩種:
- 第一種是
External-owned account (EOA)
,由擁有私鑰的人控制,像 metamask 上面複製的那個地址就是屬於 EOA。 - 第二種是
合約 (contract)
,是由已經撰寫並部屬到區塊鏈上的程式控制。
兩種帳號的功能都有: 發送、接收、持有代幣。 此外也可以與合約互動 (沒錯,也就是說合約也可以與合約互動 )。
每一個帳戶中都有一個狀態,這個「帳戶的狀態」可以想成一個 structure,裡面具有四個 attribute: nonce、balance、storageRoot 與 codeHash。
- nonce: 這個帳戶以 sender 的方式送出了多少個交易。
- balance: 帳戶擁有的 Wei 數量 (10 ^ 5 Wei = 1 ETH ),其實就是裡面有多少$。
- storage hash: 以 Merkle Patricia Tree 儲存的 state hash。
- code hash: 以 byteCode 形式儲存的程式碼 (也就是智能合約 )。
不同的帳戶中儲存著自己獨有的狀態:
A -> state_A
B -> state_B
C -> state_C
最後我們把全世界的以太帳號中的狀態全部統整起來,這個狀態就被稱為 World State (如下圖所示)。
這些狀態再經由交易 (transaction) 而產生變化。可以把這些狀態的改變想像成一個 function:
其中 S 代表原本的 World State;S'則代表新的。// T 代表這個區塊中的交易。
這樣的改變可以變成像是下面這張圖:
而以太鏈就是利用這樣的方式將以太鏈上所有帳戶的狀態記錄下來,將一個一個的 World State 串接起來就會形成一個區塊鏈了!
另外這邊附上一張更巨觀的圖,上面記錄了在以太鏈上每一個 block 儲存的東西有哪些?未來可能會再深入的討論關於 header、transaction 的內容,但是就這一篇文而言先就暫停在這吧!
EVM (Ethereum Virtual Machine)
比特幣的運作方式比較像一種「分散式帳本」 (distributed ledger),上面記錄著比特幣的所有交易;但是 Ethereum
除了可以做為帳本以外,它還具有「智能合約」的功能。
但是問題來了,以太鏈究竟是如何讓這些智能合約儲存並在整個網路中運作的呢?
其實並不難理解,就如前面所提到,所有帳戶的 state 都會經過交易的洗禮變成新的 state。還記得在每個帳戶的 state 中,有一個 attribute 叫做 codeHash 的嗎?他就是用來儲存這個帳戶上傳的程式碼。
在以太鏈中,交易可以分成兩類:
- 產生合約 (Contract Creation ): 由某個帳戶撰寫了智能合約並部屬 >> 產生合約並儲存在區塊鏈上 >> 產生一個合約專用的地址。
- 呼叫函式 (Message Call ): 由某個帳戶呼叫別人已經寫好的合約地址中的函式 >> 執行儲存在鏈上的 EVM code >> 使狀態改變。
而在儲存後,通常會產生一個合約地址,別人就可以透過這個地址來呼叫合約中的一些函式。
例如:
帳戶 A 將合約上傳後產生了一個新的合約,若帳戶 B 透過 Message Call 呼叫其中的函式 (例如: transfer(address _to, uint256 _value)
),這時就會執行 EVM code,B 就會轉 _value
的某個 ERC20 token 給在 _to
的地址。
透過將 EVM code 儲存在鏈上的方式 (不過若是要變成開源的合約還是要進行 verify 的動作! ),便可以透明化這些程式,讓使用者了解合約中到底寫了些什麼、有沒有什麼漏洞或是詐騙等。利用區塊鏈儲存也可以保證合約只要在上鏈之後便不會被任何人竄改,因為竄改後便會使整個區塊的 hash 值改變而無法驗證。總而言之,EVM 的架構同時保證了合約的公平性與安全性。
- 公平性: 讓資訊對稱化,使用者可以清楚看見合約內容。
- 安全性: 使用者了解合約內容後可以看到漏洞、詐騙等可能性。
OPcode / EVM code
OPcode 或是 EVM code 究竟是什麼? 大家可以參考這個網站裡面紀錄的 OPcode,其實他就像是個比較低階的機器語言,在我們利用高階語言部屬後,會先經過一個 compiler,轉譯成機器看得懂的語言加以執行。詳細可見下圖。
以太坊基金會
以太坊具有一個基金會,這個基金會是由一些區塊鏈公司創立 (但是其組成遍佈全球 ),他們成立的目的是為了以太坊的底層開發、研究、維護等,或是提供一些關於以太坊的教育。且不管是誰都可以向基金會提出一些提案,只要通過他們的審核便可以進行提案的運作並獲得相對應的 $$
來做為開發或是執行專案的基金!
像是西西老師在 2018 拿到以太基金會提供的基金來拍攝線上課程 (參見西西拿到以太社群基金 ECF 的補助 ),有興趣的可以進入看看。但是要注意的是其提案只能與以太坊有關,雖然我不是數學家,但這聽起來也很合理,畢竟是以太坊專屬的基金會嘛!
就我自己而言,是很喜歡這樣的運行方式的。就我目前的觀察而言,以太坊就像是一個歡迎大家加入的大團體,對於一些能力尚不足的人如我也很大方地給予很多的資源幫助,像是以太坊的網站中就有很多關於以太坊的知識與教學。
小結
在蒐集資料時,以太坊的網站真的提供了很多學習資源。文章中大部分的內容都採自於這個文件裡面,當然也參考了像是 Yellow Paper 那種天書等級的文件 (當然是一個字也沒看懂哈哈)。除此以外以太坊也在他們網站中有放入外部的學習資源,之後我也打算要慢慢把一些資源消化完!