コンテンツへスキップ
0%

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

Alchemy team headshot

執筆者 Alchemy

2022年10月4日 公開読了時間 1 分

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

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

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

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

Solidityでは、インターフェースを使うことで、コードを持たない他のコントラクトともやり取りできます。例えば、自分のコントラクトから別のコントラクトとやり取りしたい場合、呼び出しにインターフェースのラッパーを付けます。インターフェースを宣言することで、他のコントラクトとやり取りしたり、別のコントラクト内の関数を呼び出したりできます。

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

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

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

インターフェースを継承する全ての関数は、インターフェース関数をオーバーライドする各関数にoverride修飾子を設定する必要があります。そうしないと、Solidityコンパイラがエラーを出します。

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

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

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

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

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

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

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

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

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

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

Solidityインターフェースの再利用
Solidityインターフェースの再利用

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

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

  1. インターフェースは関数を実装できない
  2. インターフェースの関数はexternal型のみである必要がある
  3. インターフェースはコンストラクタを宣言できない
  4. インターフェースは状態変数を宣言できない

Solidityインターフェースの例

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

Solidityのドキュメントから引用した次のインターフェースコード例は、トランザクションに関する情報を取得するための「Token」というインターフェースを作成しています。これには、受信者アドレスと、他のコントラクトから転送された金額の情報にアクセスするための関数が含まれています。

インターフェースコードの例
インターフェースコードの例

次のSolidityインターフェースの例は、Solidity by Exampleから引用したもので、インターフェースの宣言と実装を含む完全なコントラクトを示しています。

インターフェースの宣言と実装を含む完全なコントラクト
インターフェースの宣言と実装を含む完全なコントラクト

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

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

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

Background gradient

ブロックチェーンで魔法を生み出す

Alchemyは、最も強力なweb3開発者向けプロダクトとツールを、豊富なリソース、コミュニティ、そして卓越したサポートと組み合わせて提供します。