什麼是 Solidity ABI(application binary interface)?
作者 Mohammad
Ethereum 開發者使用 Solidity 程式語言為 Ethereum 網路撰寫智能合約程式碼。但 Solidity 究竟是如何運作並與Ethereum Virtual Machine(EVM)互動的呢?這一切都要從編譯智能合約開始說起。
本文將說明:
- 透過介紹智能合約編譯的必要性,解釋Solidity ABI是什麼
- ABI 如何作為 Solidity 編譯器運作
- bytecode 是什麼,以及它在編譯過程中的作用
- Solidity ABI 是什麼,以及它與 API 有何不同
- ABI 如何運作(附範例)
什麼是智能合約編譯?
智能合約編譯是將 Solidity 智能合約程式碼轉換為與 Ethereum Virtual Machine 語言相容的過程。
開發者使用 Solidity 撰寫智能合約,這是一種高階程式語言,只有人類能夠閱讀與理解。EVM 無法理解 Solidity。由於虛擬機器無法理解 Solidity,編譯的作用就是將人類可理解的 Solidity 程式碼轉換成機器可讀的語言。Ethereum 生態系使用 Solidity 編譯器來編譯其智能合約。
什麼是 Solidity 編譯器?
Solidity 編譯器,又稱 solc,會將以 Solidity 撰寫的智能合約編譯成 EVM 可理解的 bytecode 以及Application Binary Interface(ABI)。bytecode 與 Solidity 合約 ABI 是與 Ethereum 智能合約互動的主要組成部分。
什麼是 bytecode?
bytecode 是智能合約資訊在 Ethereum Virtual Machine 上的二進位格式。bytecode 並非人類可讀,只能由機器(EVM)讀取。換句話說,Solidity 會被編譯並轉換成機器可讀的 bytecode,讓 EVM 能夠執行所需的功能。
bytecode 包含一系列機器可理解的指令,稱為 opcode,每個長度為一個位元組(八個位元)。因此,bytecode 就是由多個一位元組的 opcode 組合而成。
bytecode 分為兩種類型:
- Creation bytecode
- Runtime bytecode
什麼是 creation bytecode?
智能合約編譯會產生 creation bytecode,其中包含智能合約的建構子邏輯與建構子參數。 creation bytecode 負責產生 runtime bytecode。
當你在任何整合開發環境(IDE)平台上點選智能合約的「compilation details」時,看到的就是 creation bytecode。creation bytecode 只會在部署時執行一次。
若要取得鏈上的 creation bytecode,請使用:
若要透過 JSON RPC 呼叫取得鏈下的 creation bytecode,請使用此方法:getTransactionByHash。
什麼是 runtime bytecode?
runtime bytecode 是已編譯的智能合約資料,以永久可執行程式碼的形式儲存在鏈上。與 creation bytecode 不同,runtime bytecode 不包含建構子邏輯與建構子參數。
若要取得鏈上的 runtime bytecode,請使用:
若要透過 JSON RPC 呼叫取得鏈下的 runtime bytecode,請使用此方法:getCode
如何與 bytecode 互動
智能合約資料在 EVM 上以機器可讀的 bytecode 儲存,而在外部應用程式中則以 Javascript 儲存,其他智能合約則以人類可讀的 Solidity 語言儲存,因為它們無法與 bytecode 溝通。這就是智能合約編譯的第二個組成部分——Application Binary Interface(ABI)——發揮作用、使互動成為可能的地方。
什麼是 Solidity 中的 application binary interface(ABI)?
Application Binary Interface(ABI)是一種解譯器,用於促成與 EVM bytecode 之間的溝通。Solidity ABI 是智能合約上一份人類可讀的方法清單,用於執行特定的功能。你可以搭配像ethers.js這類的函式庫使用 ABI 來與智能合約互動。
Solidity 中的 ABI 與 API(Application Program Interface)既相似又不同。
Solidity ABI 與 API 有什麼差別?
在 web2 中,API 促成 web 應用程式與集中式伺服器之間的互動,而 Solidity ABI 則是將智能合約資料提供給應用程式與其他合約。當應用程式使用 API 向伺服器請求資料時,API 會提供資料;而 ABI 則是以稱為 Solidity Binaries 的二進位 bytecode 格式來存取智能合約資料。
在下一節中,我們將說明什麼是 Solidity Binaries。
什麼是 Solidity binaries?
Solidity Binaries 是 Ethereum 生態系中,智能合約專屬的一種資料儲存架構。
開發者無法將人類可讀的 Solidity 程式碼直接部署到 Ethereum 區塊鏈上。相反地,Solidity 智能合約資料會以原始 bytecode 的二進位格式(也就是一長串十六進位字元)儲存。這稱為Solidity Binaries,能讓資料儲存在區塊鏈上更具成本效益。
但 ABI 是如何存取 Solidity Binaries 的呢?答案是透過一個稱為 ABI encoding 的過程。
什麼是 Solidity ABI encoding?
ABI 會以 EVM-based bytecode 能夠理解的函式簽章與變數宣告來呼叫智能合約。 這稱為 ABI encoding,此時 ABI 會將必要的資訊編碼,供機器可讀的 bytecode 處理。在大多數情況下,ABI encoding 是自動化的,由智能合約編譯器完成。
什麼是 ABI decoding?
當 EVM-bytecode 執行指令並回傳結果時,該結果是以原始十六進位格式呈現的,而 ABI 會將這種人類無法閱讀的十六進位格式解碼成人類可讀的語言。 這稱為 ABI decoding。
你透過 ABI 取得 Solidity 程式碼,基本上 ABI 就是負責將資料編碼進機器碼、或從機器碼解碼出來的介面。
Solidity 程式碼如何對應到 EVM opcode?
EVM bytecode 是由許多opcode組成的。當 ABI encoding 呼叫某個函式時,它指向的是特定的 opcode。 處理完交易後,opcode 會回傳結果,再由 ABI 為使用者解碼。
ABI 在 Solidity 中如何運作?
ABI 會指定要呼叫哪個函式(encoding),並執行該函式將資料回傳給使用者(decoding)。 一份智能合約包含多個函式,這些函式會以 bytecode 的形式部署在 EVM 上,而每份智能合約都有自己的 ABI,這是取得結果所必需的。
由於智能合約是以二進位格式儲存,ABI 會定義用於與該二進位合約互動的結構與方法。編譯後的智能合約會產生以 Solidity JSON ABI 格式呈現的 ABI。
某些 IDE,例如 Remix,會自動產生合約 ABI。不過,你也可以使用Solidity Compiler NPM 套件手動建立 ABI。
Solidity JSON ABI 會產生以下組成部分:
- Type——定義function的性質(receive、fallback、constructor)
- Name——定義函式的名稱
- Inputs——由 name、type、components 組成的物件陣列
- Outputs——與 inputs 類似的物件陣列
- stateMutability——定義函式的可變性(pure、view、non-payable 或 payable)
交易如何與 ABI 一起運作?
交易與 Solidity ABI 檔案的互動分為 3 個步驟:
- 智能合約的 ABI 會提供給前端函式庫,例如 EtherJS。
- 前端函式庫會將方法呼叫與參數轉換成 calldata,作為交易的一部分提供給 Ethereum 節點。
- 交易通過驗證後,會產生一份 receipts trie,其中包含詳細的紀錄與所使用的 gas(交易費用)。
什麼是 receipts trie?
Ethereum 交易會產生一份稱為「receipts trie」的收據,記錄成功交易的結果。 receipts trie 由四種資訊組成:
- 交易的狀態
- 累計使用的 gas
- 執行過程中產生的一組 log
- 由這些 log 組成的 bloom filter
若要更了解交易的運作方式,請參考以下範例。
ERC-20 代幣轉帳範例
例如,你想要將一筆ERC-20 代幣從一個錢包轉到另一個錢包。以下程式碼會指示 ABI 向 EVM-based bytecode 傳送訊息。
ABI encoding 會確保 bytecode 能夠識別該函式並執行交易。產生結果後,ABI decoding 會將結果轉換成人類可讀的格式。使用者會收到一份收據,證明 ERC-20 代幣已從一個地址轉移到另一個地址。
深入了解 Solidity 的 ABI
在學習 Solidity的過程中,你會了解到 ABI 是 Ethereum 智能合約的基石。ABI 促成了區塊鏈生態系中的各種交易。儘管 ABI 在智能合約技術中如此重要,但在開發者教學文件中卻經常被忽略。雖然這超出本文的討論範圍,但了解什麼是Solidity interface,有助於你進一步理解合約之間是如何互動的。
深入理解 ABI 是邁向開發穩健智能合約與應用程式、以及成為 Solidity 開發者的重要基礎。
相關總覽

打造區塊鏈魔法
Alchemy 結合最強大的 Web3 開發者產品與工具,並提供資源、社群與卓越的支援。


