什麼是 Solidity contract interface?
作者 Alchemy
Solidity 是一種物件導向的高階語言,用於實作智能合約。在用 Solidity 撰寫智能合約時,你可能會想使用介面(interface)與其他智能合約互動。了解如何使用介面,有助於加深你對 Solidity 語言的理解,也可能激發你對其他有趣的 Solidity 智能合約專案的想法。
本文將說明什麼是 Solidity 合約介面,並示範如何建立一個介面。我們也提供了一些介面實作與宣告的範例,供你撰寫時參考。
什麼是 Solidity 介面?
**Solidity 合約介面是一份只有函式定義、沒有實作的清單。**換句話說,介面描述的是一個物件要能運作所必須具備的所有函式。介面會強制合約遵循一組定義好的屬性與函式。
Solidity 允許你在不擁有其程式碼的情況下,透過介面與其他合約互動。舉例來說,如果你想從自己的合約與另一個合約互動,可以用介面包裝來提供呼叫。透過宣告介面,你可以與其他合約互動,並呼叫另一個合約中的函式。
介面通常位於 Solidity 合約的最上方,並以「interface」關鍵字標示。由於介面能減少程式碼重複與開銷,因此在去中心化應用程式需要可擴充性、並希望避免複雜度時特別有用。
Solidity 介面的特性
- Solidity 介面可以繼承自其他介面
- 合約可以像繼承其他合約一樣繼承介面
- 你可以覆寫(override)介面函式
- 介面內定義的資料型別可以被其他合約存取
所有繼承自介面的函式,凡是覆寫介面函式者,都必須設定 override 修飾詞,否則Solidity 編譯器會拋出錯誤。
抽象合約 vs. 介面
抽象合約與介面是 web3 開發者用來建構更大、更複雜的分散式應用程式的兩種方式,因為它們讓 Solidity 具備可擴充性。
抽象合約至少有一個函式缺乏實作,因此無法被編譯。不過,抽象合約可以作為基底合約,供其他合約繼承。
介面與抽象合約類似,但介面不能有任何已實作的函式。此外,介面僅限於合約的應用二進位介面(Application Binary Interface, ABI)所能表達的範圍。在 ABI 與介面之間轉換不會遺失任何資訊。
如何建立 Solidity 介面
介面通常位於程式最上方,並以「interface」關鍵字宣告。之後你可以用該介面與另一個合約溝通,或直接實作該介面。
假設你正在撰寫一個智能合約錢包,程式碼可能會像這樣:

注意這裡使用了「is IWallet」。在這個例子中,我們繼承了 IWallet 介面,並在我們的合約 Wallet 中實作它。
接著,如果你有某個智能合約想要能與錢包(此處為 WalletFriendlyContract)通訊,你可以重複使用這個介面:

Solidity 介面的規範
在 Solidity 中建立介面有一些限制,開發者應牢記以下主要的介面規範:
- 介面不能有任何已實作的函式
- 介面的函式只能是 external 型別
- 介面不能宣告建構子(constructor)
- 介面不能宣告狀態變數
Solidity 介面範例
本節提供一些範例,協助你撰寫 Solidity 介面程式碼。
以下這段介面程式碼範例取自Solidity 官方文件,建立了一個名為「Token」的介面,用來取得交易資訊。它包含一個函式,可用來存取來自其他合約的接收位址與轉帳金額等資訊。

下一個Solidity 介面範例取自 Solidity by Example,展示了一個包含介面宣告與實作的完整合約。

開始用 Alchemy 建構 Solidity 應用程式
本文介紹了 Solidity 介面,並示範開發者如何運用介面在建構 Solidity 應用程式時節省時間、降低複雜度。若想進一步學習 Solidity,可參考 Alchemy University 的免費 Ethereum 開發者訓練營,這是一套為期 7 週、可自行安排進度的課程,說明 Solidity 開發的核心概念,內含大量程式挑戰、影片課程,以及精通 Solidity 的最佳資源。
如果開發者對開發領域完全陌生,Alchemy University 的為期 3 週的 JavaScript 速成課程,是進入 Ethereum 訓練營前的絕佳先修課程。
相關總覽

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


