8
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【Solidity】ブロックチェーン上の外部コントラクトの関数を実行する方法

Last updated at Posted at 2020-07-08

ブロックチェーン上で公開されている外部のコントラクトの関数を呼び出すことができる。
呼び出すには最初に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のものに限られます。

注意点として、この例では説明を簡単にするため外部コントラクトのアドレスをハードコーディングしていますが、通常このような書き方はしません。

外部コントラクトのアドレスが変更された場合、このコントラクトも使い物にならなくなるからです。(ブロックチェーンにデプロイされたコントラクトは編集、更新ができないため)

よって、本来であれば後からアドレスが変更できるような形で保持する必要があります。

8
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?