---
title: "Solidityのコントラクトインターフェースとは？"
description: "Solidityのスマートコントラクトインターフェースについて知っておくべきこと"
---

# Solidityのコントラクトインターフェースとは？

**[Solidity](https://www.alchemy.com/overviews/solidity)**は、スマートコントラクトを実装するためのオブジェクト指向の高水準言語です。[Solidityでスマートコントラクトを書く](https://www.alchemy.com/overviews/solidity-smart-contract)際、他のスマートコントラクトとやり取りするためにインターフェースを使いたい場合があります。インターフェースの使い方を知ることで、Solidity言語への理解が深まり、他にどんな興味深いSolidityスマートコントラクトが作れるか、新しいアイデアが得られるかもしれません。

この記事では、Solidityのコントラクトインターフェースとは何かを説明し、その作成方法を示します。インターフェースの実装と宣言の例をいくつか挙げるので、書く際のガイドとして使ってください。

## **Solidityのインターフェースとは**

**Solidityのコントラクトインターフェースは、実装を伴わない関数定義のリストです。** 言い換えると、インターフェースはオブジェクトが動作するために持つべき全ての関数の記述です。インターフェースは、コントラクトに対して定義済みのプロパティと関数の集合を強制します。

Solidityでは、インターフェースを使うことで、コードを持たない他のコントラクトともやり取りできます。例えば、自分のコントラクトから別のコントラクトとやり取りしたい場合、呼び出しにインターフェースのラッパーを付けます。インターフェースを宣言することで、他のコントラクトとやり取りしたり、[別のコントラクト内の関数を呼び出したり](https://www.alchemy.com/overviews/solidity-call-another-contract)できます。

インターフェースは通常Solidityコントラクトの先頭に置かれ、「interface」というキーワードで識別されます。インターフェースはコードの重複とオーバーヘッドを減らすため、分散型アプリケーションが拡張性を必要とし、複雑さを避けたい場合に最も有用です。

### **Solidityインターフェースの特徴**

1. Solidityのインターフェースは他のインターフェースを継承できる
1. コントラクトは他のコントラクトを継承するのと同様に、インターフェースを継承できる
1. インターフェースの関数をオーバーライドできる
1. インターフェース内で定義されたデータ型は、他のコントラクトからアクセスできる

インターフェースを継承する全ての関数は、インターフェース関数をオーバーライドする各関数にoverride修飾子を設定する必要があります。そうしないと、[Solidityコンパイラ](https://www.alchemy.com/overviews/solidity-compiler)がエラーを出します。

### **抽象コントラクトとインターフェースの違い**

**抽象コントラクトとインターフェースは、web3開発者がより大規模で複雑な分散アプリケーションを構築するための2つの方法であり、どちらもSolidityにおける拡張性を可能にします。**

抽象コントラクトは、実装を持たない関数を少なくとも1つ持つため、コンパイルできません。しかし、抽象コントラクトは、他のコントラクトが継承するベースコントラクトとして使用できます。

インターフェースは抽象コントラクトに似ていますが、実装された関数を一切持つことができません。さらに、インターフェースはコントラクトの[Application Binary Interface（ABI）](https://www.alchemy.com/overviews/solidity-abi)が表現できる範囲に限定されます。ABIとインターフェースの間の変換は、情報を失うことなく行えます。

## **Solidityインターフェースの作成方法**

**インターフェースは通常プログラムの先頭に置かれ、「interface」キーワードで宣言されます。そのインターフェースを使って他のコントラクトと通信することも、インターフェースを実装することもできます。**

スマートコントラクトウォレットを書く場合、次のようになるでしょう。

<ImageBlock
  src="https://media.alchemy.com/1703924327-how-to-create-a-solidity-interface.png"
  alt="Solidityインターフェースの作成方法"
  width={1346}
  height={894}
  caption="Solidityインターフェースの作成方法"
/>

ここで「`is IWallet`」の使い方に注目してください。この場合、`IWallet`インターフェースを継承し、自分のコントラクトである`Wallet`内で実装しています。

次に、ウォレット（ここでは`WalletFriendlyContract`）と通信したい何らかのスマートコントラクトがある場合、このインターフェースを再利用できます。

<ImageBlock
  src="https://media.alchemy.com/1703924551-re-use-solidity-interface.png"
  alt="Solidityインターフェースの再利用"
  width={1548}
  height={894}
  caption="Solidityインターフェースの再利用"
/>

### Solidityインターフェースの要件

Solidityでインターフェースを作成する際にはいくつかの制約があり、開発者は主なインターフェース要件として以下を覚えておく必要があります。

1. インターフェースは関数を実装できない
1. インターフェースの[関数](https://www.alchemy.com/overviews/solidity-functions)はexternal型のみである必要がある
1. インターフェースはコンストラクタを宣言できない
1. インターフェースは状態変数を宣言できない

## **Solidityインターフェースの例**

このセクションでは、Solidityのインターフェースコードを書く際のガイドとなるいくつかの例を紹介します。

**Solidityのドキュメント**から引用した次の[インターフェースコード例](https://docs.soliditylang.org/en/v0.8.17/contracts.html#interfaces)は、トランザクションに関する情報を取得するための「Token」というインターフェースを作成しています。これには、受信者アドレスと、他のコントラクトから転送された金額の情報にアクセスするための関数が含まれています。

<ImageBlock
  src="https://media.alchemy.com/1703924819-example-interface-code.png"
  alt="インターフェースコードの例"
  width={1318}
  height={550}
  caption="インターフェースコードの例"
/>

次の[Solidityインターフェースの例](https://www.solidity-by-example.org/interface/)は、**Solidity by Example**から引用したもので、インターフェースの宣言と実装を含む完全なコントラクトを示しています。

<ImageBlock
  src="https://media.alchemy.com/1703924953-full-contract-with-interface-declaration-and-implementation.jpg"
  alt="インターフェースの宣言と実装を含む完全なコントラクト"
  width={1053}
  height={1600}
  caption="インターフェースの宣言と実装を含む完全なコントラクト"
/>

## **Alchemyで Solidityアプリの開発を始めよう**

この記事では、Solidityのインターフェースについて紹介し、開発者がSolidityでアプリケーションを構築する際に、インターフェースを使うことでどのように時間を節約し、複雑さを減らせるかを示しました。[Solidityについてさらに学ぶ](https://www.alchemy.com/overviews/learn-solidity)には、Alchemy Universityの[無料Ethereum Developer Bootcamp](https://university.alchemy.com/?a=d3f70d2955)を試してみてください。これは、Solidity開発の中核となる概念を、7週間、自分のペースで進められるコースで解説しており、コーディング課題、動画レッスン、Solidityを習得するための最良のリソースが詰まっています。

一般的な開発経験がまだない開発者にとっては、Alchemy Universityの**3週間のJavaScript集中講座**が、Ethereumブートキャンプを始める前の前提知識として最適です。
