メインコンテンツまでスキップ

32 Delegatecall

  • delegatecallは低いレベル(よりマシン語に近い)の関数でcallと似ている。
  • 以下の例では、コントラクト A がdelegatecallを使って B のコードを実行すると、callと違うのは、コンテキストを維持することができる。(この場合は A の msg.sender, msg.value や storage になる)
  • つまり、B のロジックコードを使って A の状態管理をすることができることを意味する
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.13;

// このコントラクトをまずデプロイする
contract B {
// NOTE: ストレージの構成はAと同じでなければならない
uint public num;
address public sender;
uint public value;

function setVars(uint _num) public payable {
num = _num;
sender = msg.sender;
value = msg.value;
}
}

contract A {
uint public num;
address public sender;
uint public value;

function setVars(address _contract, uint _num) public payable {
// この関数を呼ぶと、Bの状態は変更なしで、Aの状態だけが変更される
(bool success, bytes memory data) = _contract.delegatecall(
abi.encodeWithSignature("setVars(uint256)", _num)
);
}
}

Remixで試す