【Solidity】importの使い方は?

Solidityのコードでよく見かけるimportの使い方について解説します。

importとは“外部ファイル取込み”のこと

import文を書くことで現在のコードに外部ファイルを取込むことができます。

それにより、外部ファイルで定義された変数/関数をそのコード内で扱えるようになります。

importの書き方

import文の書き方ですが、以下のようにします。

import "フォルダパス/インポートするファイル名.sol";

実際の記述例は以下となります。

import "./sample.sol";

補足として、「フォルダパス」や「インポートするファイル名」について、以下に記します。

また、インポートしたファイルの変数/関数を扱うには“継承”を行う必要があり、そちらについても記します。

フォルダパスについて

フォルダパスは、“ファイルのある場所までの位置を指すもの”となります。

以下に図を交えながら実際の記述例を記します。

同じ階層にあるファイルの場合
同じ階層にあるファイルの場合

上図のように、現在のコードと同じ階層にあるファイルの場合は "./ファイル名.sol" となります。

一つ上の階層にある場合
一つ上の階層にある場合

上図のように、一つ上の階層にある場合は "../ファイル名.sol"二つ上の階層にある場合は "../../ファイル名.sol" となります。

下の階層にある場合
下の階層にある場合

上図のように、下の階層にある場合は "./フォルダ名/ファイル名.sol" となります。

一つ上の階層のフォルダにある場合
一つ上の階層のフォルダにある場合

上図のように、一つ上の階層のフォルダにある場合は "../フォルダ名/ファイル名.sol" となります。

他にも様々なケースがあると思いますが、基本的には、上記を応用すれば大丈夫です。

インポートするファイル名について

基本的には自身で作成したファイルをインポートすることが多いと思いますが、openzeppelinなどのライブラリ(外部ファイル)をインポートすることもできます

実際の記述例を以下に記します。

import "@openzeppelin/contracts/utils/Strings.sol";

これによりライブラリに含まれている便利なメソッドを利用できます。

継承について

インポートしたファイルの変数/関数を呼び出すには、ファイルをimportするだけでは不十分です。

さらにインポートしたファイルにあるコントラクトを“継承”させる必要があります。

継承の書き方ですが以下となります。

contract 現在のコントラクト is インポートしたいコントラクト {
}

現在のコントラクトが“TestContract”、インポートしたいコントラクト(取り込みたい変数/関数のあるコントラクト)が“Sample”である場合、記述例は以下となります。

contract TestContract is Sample {
}

継承部分だけでなくコード全文も見たい場合は、次章の「サンプルコード」をご覧ください。

サンプルコード

test.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;

// 同階層にあるsample.solをインポート
import "./sample.sol";

// sample.solにあるSampleコントラクトを継承
contract TestContract is Sample {

    function callSayHelloOfSample() public view returns(string memory) {
        // sample.sol(Sampleコントラクト)にあるsayHello関数を呼び出し
        return sayHello();
    }

}
sample.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;
 
contract Sample {

    string hello = "test";

    function sayHello() internal view returns(string memory) {
        return hello;
    }

}

プログラムの記述量が多くなったりコントラクトを分けたい場合には、ファイルを分割する必要があります。その際にimport文でそれらのファイル(コントラクト)を取り込みます。必ず使うものなので確実におさえておきましょう。

タイトルとURLをコピーしました