既存の記事がありましたがsolidityのバージョンが上がったことで動作しなくなっていたため以下の記事を参考にし改良しました。
参考にさせていただいた記事
【Solidity】ブロックチェーン上の外部コントラクトの関数を実行する方法
@ryu-yama(株式会社FromTo) 様
https://qiita.com/ryu-yama/items/bc94b43a0d0a20de12c7
勉強を始めたばかりですので間違いなどあるかもしれませんがご容赦ください。
実行の流れ
1.既存のコントラクト sub.sol=>Memo をデプロイ
2.Memoのコントラクトアドレスをコピー
3.呼び出し元のコントラクトに interfaceを定義する
4.呼び出し元のコントラクト内で2.でコピーしたコントラクトアドレスを貼り付ける
5.4.のコントラクトアドレスを引数として宣言を行う
6.呼び出し元のコントラクト内で実行を行う
プログラム
main.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.2;
interface MemoInterface {
function getMemo(address _myAddress) external view returns (string memory);
}
contract MyContract {
// 使用したいコントラクト(BloodTypeコントラクト)のイーサリアム上のアドレス
address BloodInterfaceAddress = 0x794387c524f7......................;
MemoInterface memoContract = MemoInterface(BloodInterfaceAddress);
function execFunction() public view returns (string memory) {
string memory memo = memoContract.getMemo(msg.sender);
return memo;
}
}
sub.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.2;
contract Memo {
mapping(address => string) memos;
function setMemo(string memory _memo) public {
memos[msg.sender] = _memo;
}
function getMemo(address _myAddress) public view returns (string memory) {
return memos[_myAddress];
}
}