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を自動接続する方法