コミュニティ

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

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

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

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

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

ryu-yama
フリーランスのSE、WEBエンジニアです。 最近よく使う技術はRuby on Rails、Go、Vue、Docker。GCPを少々。 ブロックチェーン学習中。
from-to
ふるさと開拓サービス「flato」の開発・運用をしています。
ユーザー登録して、Qiitaをもっと便利に使ってみませんか。
  1. あなたにマッチした記事をお届けします
    ユーザーやタグをフォローすることで、あなたが興味を持つ技術分野の情報をまとめてキャッチアップできます
  2. 便利な情報をあとで効率的に読み返せます
    気に入った記事を「ストック」することで、あとからすぐに検索できます
ユーザーは見つかりませんでした