【初心者向け】Solidity 外部コントラクトの呼び出し方法を徹底解説

 

Solidityで別コントラクトを呼び出したい時の呼び出し方法と注意点をまとめていきたいと思います。

Solidityでは、Java等の他のプラグラミング言語のように、別のコントラクトを呼び出すことができますが、
ちょっと癖があるので、今回備忘録も兼ねて別コントラクトの呼び出し方を紹介していきたいと思います。

<スポンサードリンク>

Solidity 公式

solidity公式(http://solidity.readthedocs.io/en/v0.4.24/contracts.html)

サンプルコード

pragma solidity ^0.4.24;

contract Caller {
  // 直接呼び出し
  function mcSet(address metaCoin, uint num, address account) public{
      MetaCoin mc = MetaCoin(metaCoin);
      mc.set(num, account);
  }
  
  function mcGet(address metaCoin, address account) public view returns(uint256) {
      MetaCoin mc = MetaCoin(metaCoin);
      return mc.get(account);
  }

  // call 呼び出し
  function callSet(address metaCoin, uint num, address account) public {
    if(!(metaCoin.call(bytes4(sha3("set(uint256,address)")), num, account))) { 
        revert();
    }
  }

  // delegatecall 呼び出し
  function delegatecallSet(address metaCoin, uint num, address account) public {
    if(!(metaCoin.delegatecall(bytes4(sha3("set(uint256,address)")), num, account))) {
        revert();
    }
  }
}

contract MetaCoin {
  mapping (address => uint256) public balances;
  
  function set(uint num, address account) public {
      balances[account] += num;
  }
  
  function get(address account) public view returns(uint256) {
      return balances[account];
  }
}

 

解説

直接呼び出し

直接呼び出しは最もオーソドックな外部コントラクトの呼び出し方です。
呼び出し先の外部コントラクトのアドレスを知っていれば、Javaのように外部コントラクトを呼び出すことができます。

ポイントとしては、下記の通りです。
Storageは呼び出し先
呼び出し先のmsg.senderは、大元のtransaction発行者でなく、呼び出し元

 

call

呼び出し先の外部コントラクトのアドレスと呼び出すメソッド情報を使用し呼び出します。

ポイントとしては、下記の通りです。
Storageは呼び出し先
呼び出し先のmsg.senderは、大元のtransaction発行者でなく、呼び出し元
呼び出し先のデータの値を呼び出し元で参照できない。(戻り値がbool)

delegrateCall

呼び出し先の外部コントラクトアドレスと呼び出すメソッド情報を使用し呼び出します。

ポイントとしては、下記の通りです。
Storageは呼び出し元
呼び出し先のmsg.senderは、大元のtransaction発行者 
呼び出し先のデータの値を呼び出し元で参照できない。(戻りがbool)



表形式

関数 Storage 呼び出し先のmsg.sender 呼び出し元で、呼び出し先のデータの参照可否
直接呼び出し 呼び出し先(MetaCoin) 呼び出し元(Caller)
call 呼び出し先(MetaCoin) 呼び出し元(Caller) 不可
deleratecall 呼び出し元(Caller) transactionの発行者(from) 不可

 

関連

【solidity】業務ロジックとデータロジックを分断するコントラクト設計

【初心者向け】solidity基礎 modifierの使い方を徹底解説

Solidity(Remix)とgitを連携させ、Ethereumの開発をする

Ethereum プライベートネットワークでgeth起動時にnodeを自動接続する方法

スポンサードリンク



コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA