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で試す