探索以太坊生態

深入了解以太坊架構

(KJH) Kuan-Jung, Huang
7 min readDec 26, 2023
Image powered by DALLE

如果你想要在 Ethereum(以太坊) 上面發布 dApp 賺錢,你就要先了解以太坊一些知識。以太坊是一個極大的市場,以太坊相關的工程師一直都有著需求。不過這篇文章不討論幣價。

以太坊的架構

我們首先先透過這張圖片簡述一下以太坊的架構。在這個架構中有幾個東西要解釋的。

Client Application

我們常說的 dApp,或是錢包軟體等,指的是圖中的 Client Application。而這過應用程式介面可以不需要有後端的存在。如果你要做很直接跟區塊鏈互動的應用程式,可以透過等一下要介紹的 Web3 API 跟底層的以太坊互動。

Web3 API

這個 API 通常是包好的一個 SDK 給使用者,可以透過這樣的 API 呼叫區塊鏈,建立交易,甚至是跟鏈上的智能合約互動。在手機應用端可以透過 Web3J 來互動,在網頁端可以透過 Web3.js 來跟鏈互動。

JSON-RPC

Web3 API 其實是在內部使用 JSON-RPC 進行通訊。JSON-RPC 更偏向直接對底層的以太坊網路進行操作。JSON-RPC 讓我們可以透過 HTTP、HTTPS 或 WebSocket 協定進行資料的傳輸。我們通常會使用像是 Geth 或 Parity 這種應用程式,它們提供了JSON-RPC 的接口,讓開發者能夠直接跟鏈互動。

舉例來說,如果你想要透過 RPC 請求來查詢一個地址的以太幣餘額,你可能會發送一個包含 eth_getBalance 的請求到以太坊節點。節點會處理這個請求,並回傳該地址的餘額。如果你要利用 Web3 API 的話,簡單的版本如下:

const Web3 = require('web3');

// 初始化 Web3。這裡以 Infura 為例。
const web3 = new Web3(new Web3.providers.HttpProvider('https://mainnet.infura.io/v3/YOUR_INFURA_API_KEY'));

// 這是你要查詢的以太坊地址。
const address = '0x....';

// 使用 web3.eth.getBalance 查詢餘額
web3.eth.getBalance(address, (err, balance) => {
if (err) {
console.log('error:', err);
} else {
console.log('balance:', web3.utils.fromWei(balance, 'ether'), 'ETH');
}
});

以太坊網路

以太坊網路是部署和執行智能合約的去中心化區塊鏈平台。它由世界各地的個人和實體運行的節點組成。這個網路可以分成兩個面向討論:

Data,代表以太坊區塊鏈的狀態,比如一個帳號的餘額,智能合約的交易歷史紀錄等等。以太坊上的資料是不可變動的,一旦寫入就無法更改,這確保了歷史記錄的完整性。如果真的要修改就要再新增一筆交易去調整內容,但是就會留著修改的紀錄。

Code,是指部署在以太坊區塊鏈上的智能合約。比較知名的是運用 Solidity 撰寫的智能能約運行在以太坊虛擬機(EVM)上。我們常說的 dApps 的基礎就是來自於智能合約,我們可以運用已經存在的 ERC 標準快速部署智能合約。然後部署好的合約就會依照程式邏輯自動執行。

以太坊虛擬機

了解基礎架構後,我覺得 EVM 也是一塊需要花時間理解的東西。EVM是一個根據狀態而改變的虛擬機,它透過使用者發起交易來變更狀態。每當使用者發送一筆交易時,不論是簡單的以太幣轉帳還是複雜的智能合約操作,這些交易都會被全網的節點處理,確保全網狀態的一致。

確定性

在 EVM 中,同樣的輸入必定會產生相同的輸出結果,因為所有的節點必須對交易的結果達成共識。

隔離性

智能合約之間的互動不會影響主鏈的運作,也就是說智能合約被攻擊的時候,主鏈跟其他的智能合約是不會受到影響。

圖靈完備性

EVM 常常跟圖靈完備扯在一起,他們有什麼關係?圖靈完備是指一個計算系統如果能模擬任何圖靈機的計算過程,則稱該系統為圖靈完備的。簡單來說,如果一種程式語言或系統能夠進行足夠的計算,來執行任意的演算法,那麼這種語言或系統就被認為是圖靈完備的。所以在 EVM 中,我們認為只要有足夠的計算資源(如時間和Gas)可供使用,EVM 理論上能夠執行任何計算任務。

然而在實際應用中,由於 Gas 的使用限制,為了防止網路攻擊和無限循環等問題,EVM上運行的智能合約實際上是受限的。接下來會介紹 Gas 的機制。

Gas 的機制

常常聽到 Gas 不夠導致交易失敗,什麼是 Gas?在 EVM 中,每個操作都需要消耗一定量的 Gas。Gas 是執行操作的費用,也是防止網路濫用和管理網路資源的一種機制。使用者在發送交易時需支付 Gas 作為執行的費用,這筆費用會由礦工或驗證者收取,以換取他們執行和驗證交易的勞務。

在進行交易時需要指定一個 Gas Price,這是願意為每單位 Gas 支付的以太幣價格。還需要指定一個 Gas Limit,即他們願意為這次交易支付的最大 Gas 數量。最終的交易費用是 Gas Price 跟每單位 Gas 價格的兩個數字的乘積。

在網路繁忙甚至塞車的時候,我們可以提高 Gas Price 讓我們的交易被優先處理。Gas Price 較低的交易就會一直被往後排,直到後面才會被處理。

最後,以往以太坊的 gas 是跟 Bitcoin 礦工透過挖礦機制(PoW)在賺的錢是一樣的。不過現在以太坊2.0 的 PoS 機制的引入,現在我們透過進行質押以太幣的驗證者來進行驗證。

驗證者是怎麼被選擇出來的呢?驗證者主要是被隨機選擇和他們質押的以太幣數量。一旦被選中,驗證者就有責任去打包和提出新的區塊。如果驗證者試圖進行詐欺或是不遵守協議,他們所質押的以太幣可能會被沒收,這一機制被稱為 slashing。

隨機數的產生

EVM 在隨機數的產生上一直很不隨機,所以我們通常會用 Oracles 來產生隨機數。Chainlink VRF 就是一個以太坊的合約可以透過外部服務來取得隨機數。Chainlink 節點運行 VRF 函數,生成一個隨機數以及一個證明,這個證明可以被鏈上的智能合約驗證,以確保隨機數的真實性和公正性。

有哪些比較知名的 ERC 標準

ERC-20

ERC-20標準為加密貨幣市場引入了同質化代幣的概念,這個標準訂定了一系列的合約規範,以實現代幣的轉移、交易以及餘額查詢。在此標準下,每一枚代幣都與其他代幣功能上完全相同,這是 2017 年時,ICO 活動中最普遍採用的標準形式。

和接下來會介紹的 ERC-721 相比,同質化代幣是可以有「找回」的概念,比如給 100 元可以找回 90 元。

ERC-223

ERC-223 標準主要是在解決 ERC-20 中存在的代幣損失問題。當代幣錯誤地發送到不相容的合約地址時,ERC-223 提供了一個防錯機制,降低了錯付的風險,進而增強了整個以太坊生態系統的安全性

ERC-721

與ERC-20的可替代性相對,ERC-721標準打造了一種獨一無二的非同質化代幣(NFT)。每一枚NFT都帶有獨特的識別碼和 metadata,確保了其不可替代的特性。此類代幣廣泛應用於藝術、收藏品以及遊戲中的獨特資產,並能夠精確追踪每個代幣的所有權歷史。

ERC-1155

ERC-1155 標準引入了一個革命性的概念,允許在單一合約中定義和管理多種類型的代幣。這個標準同時結合了ERC-20的可替代性與ERC-721的獨特性,特別適用於遊戲和虛擬資產等應用場景,為資產的多樣性提供了無限可能。

相較於ERC-721標準,ERC-1155標準提供了更靈活的代幣管理方式,特別是在處理限量獨特物品時。以100把白金劍為例,若使用ERC-1155標準,我們可以將這100把劍統一表達為單一的代幣,並將其分配給100名不同的持有者,每人持有該代幣的一部分。而在ERC-721的架構下,則需要發行100個獨立的代幣,每把劍對應一個獨立的代幣,由100名不同的持有者各自擁有。這顯示了ERC-1155在代幣化多個獨特資產時的高效率和便捷性。

--

--

(KJH) Kuan-Jung, Huang
(KJH) Kuan-Jung, Huang

Written by (KJH) Kuan-Jung, Huang

CTO at Metablox.co, Founder of AI Users Community in Taiwan

No responses yet