ブロックチェーン上で公開されている外部のコントラクトの関数を呼び出すことができる。
呼び出すには最初にinterfaceを定義する必要がある。
例えば、ブロックチェーン上に以下のようなコントラクトが公開されていたとする。
contract BloodType {
mapping(address => string) bloodtypes;
function setType(string _bloodtype) public {
bloodtypes[msg.sender] = _bloodtype;
}
function getBloodType(address _myAddress) public view returns (string) {
return bloodtypes[_myAddress];
}
}
例なのでとても簡単なやつ。
イーサリアムのアドレスと血液型を関連づけられるものになります。
このコントラクトを呼び出したい場合は、まず以下のようなinterfaceを定義する。
contract BloodInterface {
function getBloodType(address _myAddress) public view returns (string);
}
ここでは呼び出したい関数(この例の場合はgetBloodType)のみを宣言する。
宣言では関数の中身(括弧{}を書いての処理)は書かない。
このinterfaceは自分のコントラクト内で使用することができる。
contract MyContract {
// 使用したいコントラクト(BloodTypeコントラクト)のイーサリアム上のアドレス
address BloodInterfaceAddress = 0xaaaaa.....;
BloodInterface bloodtypeContract = BloodInterface(BloodInterfaceAddress)
function execFunction() public {
// コントラクトから`getBloodType`を呼び出す
string bloodtype = bloodtypeContract.getBloodType(msg.sender);
}
}
これで外部の公開されているコントラクトの関数を呼び出せます。
呼び出せる関数はpublic、又はexternalのものに限られます。
注意点として、この例では説明を簡単にするため外部コントラクトのアドレスをハードコーディングしていますが、通常このような書き方はしません。
外部コントラクトのアドレスが変更された場合、このコントラクトも使い物にならなくなるからです。(ブロックチェーンにデプロイされたコントラクトは編集、更新ができないため)
よって、本来であれば後からアドレスが変更できるような形で保持する必要があります。