跳至內容
0%

什麼是 Solidity contract interface?

Alchemy team headshot

作者 Alchemy

發布於 2022年10月4日閱讀時間 1 分鐘

Solidity 是一種物件導向的高階語言,用於實作智能合約。在用 Solidity 撰寫智能合約時,你可能會想使用介面(interface)與其他智能合約互動。了解如何使用介面,有助於加深你對 Solidity 語言的理解,也可能激發你對其他有趣的 Solidity 智能合約專案的想法。

本文將說明什麼是 Solidity 合約介面,並示範如何建立一個介面。我們也提供了一些介面實作與宣告的範例,供你撰寫時參考。

什麼是 Solidity 介面?

**Solidity 合約介面是一份只有函式定義、沒有實作的清單。**換句話說,介面描述的是一個物件要能運作所必須具備的所有函式。介面會強制合約遵循一組定義好的屬性與函式。

Solidity 允許你在不擁有其程式碼的情況下,透過介面與其他合約互動。舉例來說,如果你想從自己的合約與另一個合約互動,可以用介面包裝來提供呼叫。透過宣告介面,你可以與其他合約互動,並呼叫另一個合約中的函式

介面通常位於 Solidity 合約的最上方,並以「interface」關鍵字標示。由於介面能減少程式碼重複與開銷,因此在去中心化應用程式需要可擴充性、並希望避免複雜度時特別有用。

Solidity 介面的特性

  1. Solidity 介面可以繼承自其他介面
  2. 合約可以像繼承其他合約一樣繼承介面
  3. 你可以覆寫(override)介面函式
  4. 介面內定義的資料型別可以被其他合約存取

所有繼承自介面的函式,凡是覆寫介面函式者,都必須設定 override 修飾詞,否則Solidity 編譯器會拋出錯誤。

抽象合約 vs. 介面

抽象合約與介面是 web3 開發者用來建構更大、更複雜的分散式應用程式的兩種方式,因為它們讓 Solidity 具備可擴充性。

抽象合約至少有一個函式缺乏實作,因此無法被編譯。不過,抽象合約可以作為基底合約,供其他合約繼承。

介面與抽象合約類似,但介面不能有任何已實作的函式。此外,介面僅限於合約的應用二進位介面(Application Binary Interface, ABI)所能表達的範圍。在 ABI 與介面之間轉換不會遺失任何資訊。

如何建立 Solidity 介面

介面通常位於程式最上方,並以「interface」關鍵字宣告。之後你可以用該介面與另一個合約溝通,或直接實作該介面。

假設你正在撰寫一個智能合約錢包,程式碼可能會像這樣:

如何建立 Solidity Interface
如何建立 Solidity Interface

注意這裡使用了「is IWallet」。在這個例子中,我們繼承了 IWallet 介面,並在我們的合約 Wallet 中實作它。

接著,如果你有某個智能合約想要能與錢包(此處為 WalletFriendlyContract)通訊,你可以重複使用這個介面:

重複使用 Solidity interface
重複使用 Solidity interface

Solidity 介面的規範

在 Solidity 中建立介面有一些限制,開發者應牢記以下主要的介面規範:

  1. 介面不能有任何已實作的函式
  2. 介面的函式只能是 external 型別
  3. 介面不能宣告建構子(constructor)
  4. 介面不能宣告狀態變數

Solidity 介面範例

本節提供一些範例,協助你撰寫 Solidity 介面程式碼。

以下這段介面程式碼範例取自Solidity 官方文件,建立了一個名為「Token」的介面,用來取得交易資訊。它包含一個函式,可用來存取來自其他合約的接收位址與轉帳金額等資訊。

Interface 程式碼範例
Interface 程式碼範例

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

包含 interface 宣告與實作的完整合約
包含 interface 宣告與實作的完整合約

開始用 Alchemy 建構 Solidity 應用程式

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

如果開發者對開發領域完全陌生,Alchemy University 的為期 3 週的 JavaScript 速成課程,是進入 Ethereum 訓練營前的絕佳先修課程。

Background gradient

打造區塊鏈魔法

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