跳至內容
0%

什麼是智能合約的 ABI?

Alchemy team headshot

作者 Alchemy

發布於 2022年3月9日閱讀時間 1 分鐘

智能合約的 Application Binary Interface(ABI)讓合約具備與外部應用程式及其他智能合約溝通、互動的能力。從外部來源接收資料,對於完成應用程式與使用者的目標來說相當重要。

在傳統的網頁開發中,資料的溝通是透過 API(Application Program Interface)在應用程式與伺服器之間進行。伺服器扮演集中式的資訊來源,依據請求將資料提供給應用程式。

在區塊鏈上,並不存在這種資料集中化的架構。節點基本上扮演伺服器的角色,而智能合約則是鏈上「託管」的函式。區塊鏈外部的應用程式(以及其他智能合約)需要一種方式來與鏈上的智能合約溝通,這正是 ABI 發揮作用的地方。

為什麼需要 ABI?

在深入探討 ABI 是什麼之前,先了解我們為何需要它會有幫助。

智能合約是 EVM(Ethereum Virtual Machine)的核心應用。智能合約的目的是在合約中定義的特定條件被滿足時執行交易。這些條件可以是鏈上或鏈下的事件。智能合約以高階語言撰寫,例如 Solidity,但它們儲存在 EVM 上時是以可執行的位元組碼(bytecode)形式存在,屬於二進位格式。

以可執行位元組碼形式儲存在 EVM 上的智能合約程式碼示意圖
EVM 上的可執行位元組碼

由於這種位元組碼並非人類可讀,因此需要經過解讀才能被理解。ABI 讓任何撰寫智能合約的人,都能在以 Javascript 等高階語言寫成的網頁應用程式,與 EVM 所理解的位元組碼之間進行溝通。

什麼是 ABI?

如同它在 Web2 世界的表親 API,ABI 扮演函式選擇器的角色,定義可以呼叫來執行智能合約的特定方法。這些特定方法及其相關的資料型別,會列在一個產生出來的 JSON RPC 檔案中。

ABI 作為智能合約方法函式選擇器的示意圖
ABI 函式選擇器

與 API 不同的是,我們無法直接以 JSON 格式向智能合約發送請求並期待收到回應,因為合約只能以位元組碼溝通。為了將其轉換成 EVM 能理解的內容,這些資訊會透過 ABI encoding 進行編碼。這些編碼包含函式簽章與變數宣告,讓 EVM 能確切知道要在智能合約中執行哪個函式。

ABI 編碼將函式呼叫轉換為 EVM 位元組碼的範例
ABI 編碼

回應也是以位元組碼呈現,因此在被網頁應用程式處理之前,同樣需要經過解讀。使用位元組碼作為回應格式的好處是,我們可以預期呼叫合約函式後會得到某種固定的結構。

如何使用 ABI?

產生方式

如果你使用像 Hardhart/Truffle 這類工具,或是像 Remix 這樣的 IDE,合約的 ABI 會自動為你產生。你也可以透過 Solidity Compiler NPM package 手動建立 ABI。安裝該套件後,你可以在終端機中執行「solcjs contractname.sol --abi」指令。若執行成功,將會產生一個 .abi 檔案。

現在你已經產生了 ABI,讓我們來看看這個檔案中的一些元素:

產生的智能合約 ABI JSON 檔案範例
產生的合約 ABI

執行

由於 ABI 是在網站的 Javascript 與 EVM 位元組碼之間扮演解譯者的角色,因此當你想要執行智能合約的任何函式時,就會需要用到它。除了 ABI 之外,還需要合約在區塊鏈上的地址。以下是一段簡短的 Javascript 程式碼片段,展示如何完成這件事:

使用 ABI 及地址執行合約函式的 JavaScript 程式碼片段
執行 ABI

如果你想找出某個已部署合約的 ABI,可以透過該合約的地址在 Etherscan 上搜尋。例如這裡

Etherscan 合約頁面顯示已部署合約的 ABI
已部署合約的 ABI

編碼

由於所有溝通都是以位元組碼進行,若要求開發者自行編碼這些訊息並不切實際。所幸像 Remix 這類常見的編譯器也能為你處理編碼工作。這些編碼遵循一定的模式,因此可以透過查閱 ABI Specification 來更了解其運作方式。

前四個位元組是函式簽章,用來指出智能合約中正在執行的是哪一種函式。一個常見的函式識別碼是 a9059cbb,代表這是一筆 ERC20 轉帳。這裡有一個函式簽章的資料庫目錄,可以進一步查閱。

ABI 函式簽章雜湊範例,包含 ERC20 transfer 選擇器
ABI 函式雜湊

從第五個位元組開始,就是參數編碼的部分。回應也遵循類似的結構,只是不包含函式簽章。

結語

ABI 常常是使用智能合約時容易被忽略的一環,但它在這項技術的可用性上扮演著重要角色。以智能合約教學為基礎繼續學習,是理解這個默默運作的幕後功臣的絕佳方式,也是實際應用所學知識的好機會。

Background gradient

打造區塊鏈魔法

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