---
title: "什麼是 Solidity ABI(application binary interface)?"
description: "關於 Solidity Application Binary Interface(ABI)你需要知道的一切"
---

# 什麼是 Solidity ABI(application binary interface)?

Ethereum 開發者使用 Solidity 程式語言為 Ethereum 網路[撰寫智能合約程式碼](https://www.alchemy.com/overviews/solidity-smart-contract)。但 Solidity 究竟是如何運作並與[Ethereum Virtual Machine](https://www.alchemy.com/overviews/what-is-the-ethereum-virtual-machine-evm)（EVM）互動的呢？這一切都要從編譯智能合約開始說起。

本文將說明：

- 透過介紹智能合約編譯的必要性，解釋[Solidity ABI](https://www.alchemy.com/overviews/what-is-an-abi-of-a-smart-contract-examples-and-usage)是什麼
- ABI 如何作為 Solidity 編譯器運作
- bytecode 是什麼，以及它在編譯過程中的作用
- Solidity ABI 是什麼，以及它與 API 有何不同
- ABI 如何運作（附範例）

## **什麼是智能合約編譯？**

智能合約編譯是將 Solidity 智能合約程式碼轉換為與 Ethereum Virtual Machine 語言相容的過程。

開發者使用 Solidity 撰寫智能合約，[這是一種高階程式語言](https://www.alchemy.com/overviews/solidity)，只有人類能夠閱讀與理解。EVM 無法理解 Solidity。由於虛擬機器無法理解 Solidity，編譯的作用就是將人類可理解的 Solidity 程式碼轉換成機器可讀的語言。[Ethereum 生態系](https://www.alchemy.com/dapps/ecosystem/ethereum)使用 Solidity 編譯器來編譯其智能合約。

### **什麼是 Solidity 編譯器？**

[**Solidity 編譯器**](https://www.alchemy.com/overviews/solidity-compiler)，又稱 solc，會將以 Solidity 撰寫的智能合約編譯成 EVM 可理解的 bytecode 以及[**Application Binary Interface（ABI）**](https://docs.soliditylang.org/en/v0.8.13/abi-spec.html)。bytecode 與 Solidity 合約 ABI 是與 Ethereum 智能合約互動的主要組成部分。

## **什麼是 bytecode？**

bytecode 是智能合約資訊在 Ethereum Virtual Machine 上的二進位格式。bytecode 並非人類可讀，只能由機器（EVM）讀取。換句話說，Solidity 會被編譯並轉換成機器可讀的 bytecode，讓 EVM 能夠執行所需的功能。

bytecode 包含一系列機器可理解的指令，稱為 opcode，每個長度為一個位元組（八個位元）。因此，bytecode 就是由多個一位元組的 opcode 組合而成。

bytecode 分為兩種類型：

1. Creation bytecode
1. Runtime bytecode

### **什麼是 creation bytecode？**

**智能合約編譯會產生 creation bytecode，其中包含智能合約的建構子邏輯與建構子參數。** creation bytecode 負責產生 runtime bytecode。

當你在任何[整合開發環境（IDE）平台](https://www.alchemy.com/overviews/solidity-ide)上點選智能合約的「compilation details」時，看到的就是 creation bytecode。creation bytecode 只會在部署時執行一次。

若要取得鏈上的 creation bytecode，請使用：

若要透過 JSON RPC 呼叫取得鏈下的 creation bytecode，請使用此方法：[`getTransactionByHash`](https://www.alchemy.com/docs/chains/ethereum/ethereum-api-endpoints/eth-get-transaction-by-hash)*。*

### **什麼是 runtime bytecode？**

runtime bytecode 是已編譯的智能合約資料，以永久可執行程式碼的形式儲存在鏈上。與 creation bytecode 不同，runtime bytecode 不包含建構子邏輯與建構子參數。

若要取得鏈上的 runtime bytecode，請使用：

若要透過 JSON RPC 呼叫取得鏈下的 runtime bytecode，請使用此方法：[`getCode`](https://www.alchemy.com/docs/chains/ethereum/ethereum-api-endpoints/eth-get-code)

### **如何與 bytecode 互動**

智能合約資料在 EVM 上以機器可讀的 bytecode 儲存，而在外部應用程式中則以 Javascript 儲存，其他智能合約則以人類可讀的 Solidity 語言儲存，因為它們無法與 bytecode 溝通。這就是智能合約編譯的第二個組成部分——Application Binary Interface（ABI）——發揮作用、使互動成為可能的地方。

## **什麼是 Solidity 中的 application binary interface（ABI）？**

[**Application Binary Interface（ABI）**](https://www.alchemy.com/overviews/what-is-an-abi-of-a-smart-contract-examples-and-usage)是一種解譯器，用於促成與 EVM bytecode 之間的溝通。Solidity ABI 是智能合約上一份人類可讀的方法清單，用於執行特定的功能。你可以搭配像[ethers.js](https://www.alchemy.com/dapps/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](https://www.alchemy.com/overviews/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](https://ethereum.org/en/developers/docs/evm/opcodes/)組成的。**當 ABI encoding 呼叫某個函式時，它指向的是特定的 opcode。** 處理完交易後，opcode 會回傳結果，再由 ABI 為使用者解碼。

## **ABI 在 Solidity 中如何運作？**

**ABI 會指定要呼叫哪個函式（encoding），並執行該函式將資料回傳給使用者（decoding）。** 一份智能合約包含多個函式，這些函式會以 bytecode 的形式部署在 EVM 上，而每份智能合約都有自己的 ABI，這是取得結果所必需的。

由於智能合約是以二進位格式儲存，ABI 會定義用於與該二進位合約互動的結構與方法。編譯後的智能合約會產生以 Solidity JSON ABI 格式呈現的 ABI。

某些 IDE，例如 Remix，會自動產生合約 ABI。不過，你也可以使用[Solidity Compiler NPM 套件](https://www.npmjs.com/package/solc)手動建立 ABI。

Solidity JSON ABI 會產生以下組成部分：

- **Type**——定義[function](https://www.alchemy.com/overviews/solidity-functions)的性質（receive、fallback、constructor）
- **Name**——定義函式的名稱
- **Inputs**——由 name、type、components 組成的物件陣列
- **Outputs**——與 inputs 類似的物件陣列
- **stateMutability**——定義函式的可變性（pure、view、[non-payable 或 payable](https://www.alchemy.com/docs/solidity-payable-functions)）

## **交易如何與 ABI 一起運作？**

交易與 Solidity ABI 檔案的互動分為 3 個步驟：

1. 智能合約的 ABI 會提供給前端函式庫，例如 EtherJS。
1. 前端函式庫會將方法呼叫與參數轉換成 _calldata_，作為交易的一部分提供給 Ethereum 節點。
1. 交易通過驗證後，會產生一份 receipts trie，其中包含詳細的紀錄與所使用的 gas（交易費用）。

### 什麼是 receipts trie？

**Ethereum 交易會產生一份稱為「receipts trie」的收據，記錄成功交易的結果。** receipts trie 由四種資訊組成：

1. 交易的狀態
1. 累計使用的 gas
1. 執行過程中產生的一組 log
1. 由這些 log 組成的 bloom filter

若要更了解交易的運作方式，請參考以下範例。

## ERC-20 代幣轉帳範例

例如，你想要將一筆[ERC-20 代幣](https://www.alchemy.com/overviews/erc20-solidity)從一個錢包轉到另一個錢包。以下程式碼會指示 ABI 向 EVM-based bytecode 傳送訊息。

ABI encoding 會確保 bytecode 能夠識別該函式並執行交易。產生結果後，ABI decoding 會將結果轉換成人類可讀的格式。使用者會收到一份收據，證明 ERC-20 代幣已從一個地址轉移到另一個地址。

## **深入了解 Solidity 的 ABI**

在[學習 Solidity](https://www.alchemy.com/overviews/learn-solidity)的過程中，你會了解到 ABI 是 Ethereum 智能合約的基石。ABI 促成了區塊鏈生態系中的各種交易。儘管 ABI 在智能合約技術中如此重要，但在開發者教學文件中卻經常被忽略。雖然這超出本文的討論範圍，但了解什麼是[Solidity interface](https://www.alchemy.com/overviews/solidity-interface)，有助於你進一步理解合約之間是如何互動的。

深入理解 ABI 是邁向開發穩健智能合約與[應用程式](https://www.alchemy.com/dapps/top/defi-dapps)、以及[成為 Solidity 開發者](https://www.alchemy.com/overviews/how-to-become-a-solidity-developer)的重要基礎。
