【Solidity】第5章第6回:外部コントラクトを呼び出す方法

本記事では、Solidityを使用して外部コントラクトを呼び出す方法について解説します。外部コントラクトとの連携により、スマートコントラクトの機能を拡張し、より複雑なDAppの構築が可能になります。
0. 記事の概要
この記事を読むメリット
- 外部コントラクト呼び出しの基礎理解:外部コントラクトとのやり取り方法を学べます。
- スマートコントラクトの機能拡張:外部コントラクトを利用することで、機能を柔軟に拡張できます。
- DApp構築の応用力向上:複数のコントラクトを連携させた設計が可能になります。
この記事で学べること
- 外部コントラクトを呼び出す基本的な手法
- ABIを使用した外部コントラクトのインターフェース設計
- 外部コントラクト呼び出し時の注意点とベストプラクティス
1. 外部コントラクトを呼び出す基本構文

1.1 基本的な呼び出し方法
Solidityでは、外部コントラクトを呼び出す際に、そのコントラクトのインターフェースを定義する必要があります。これにより、関数の署名と呼び出し方法が明確になります。
1.2 コード例
// 外部コントラクトのインターフェース
interface IExternalContract {
function getValue() external view returns (uint256);
function setValue(uint256 _value) external;
}
// 外部コントラクトを呼び出すコントラクト
contract CallerContract {
address public externalAddress;
constructor(address _externalAddress) {
externalAddress = _externalAddress;
}
function readValue() public view returns (uint256) {
return IExternalContract(externalAddress).getValue();
}
function writeValue(uint256 _value) public {
IExternalContract(externalAddress).setValue(_value);
}
}
動作解説
このコードでは、IExternalContract
というインターフェースを通じて、外部コントラクトのgetValue
関数とsetValue
関数を呼び出しています。
2. ABIを使用した外部コントラクトの連携

2.1 ABIとは?
ABI(Application Binary Interface)は、コントラクトと外部からのインタラクションを定義するものです。コントラクトの関数や引数、戻り値の形式が含まれています。
2.2 ABIを使用したコード例
// ABIを利用した外部コントラクト呼び出し
contract ABIInteraction {
address public externalAddress;
constructor(address _externalAddress) {
externalAddress = _externalAddress;
}
function callExternal(bytes memory data) public returns (bytes memory) {
(bool success, bytes memory result) = externalAddress.call(data);
require(success, "外部コントラクトの呼び出しに失敗しました");
return result;
}
}
動作解説
この例では、call
関数を使用して、外部コントラクトの関数を動的に呼び出しています。これにより、任意の関数をABIを通じて操作可能です。
3. 外部コントラクト呼び出し時の注意点
3.1 ガスコストの計算
外部コントラクトを呼び出す際には、ガスコストが追加で発生します。呼び出す関数がどれだけガスを消費するかを事前に確認してください。
3.2 安全な呼び出し
外部コントラクトを呼び出す際には、require
ステートメントを使用して失敗時の処理を実装することが重要です。
4. 練習問題

以下の課題に挑戦してみましょう:
- 複数の外部コントラクトを呼び出すコントラクトを作成し、それぞれのアドレスと関数を記録する仕組みを実装してください。
- 外部コントラクトの戻り値を検証し、その値に基づいて処理を実行するロジックを構築してください。
5. まとめ
本記事では、外部コントラクトを呼び出す方法と、ABIを使用した動的な呼び出しについて解説しました。これらのスキルを活用することで、複雑なDAppを構築するための基盤を築くことができます。