(三)solidity代理调用

vvEcho 2025-11-29 19:33:17
Categories: Tags:

代理调用代码示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
// Note:deploy this contract first
contract B {
// Note: storage layout must be the same sa contract A
// 状态变量的声明顺序必须和A一致
uint256 public num;
address public sender;
uint256 public value;

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

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

//代理调用B的函数
function setVars(address _contract, uint256 _num) public payable {
// _contract.delegatecall(abi.encodeWithSignature("setVars(uint256",_num));

// 使用函数选择器的好处是,不用写死函数名及参数名在字符串中,只需要B修改后就会同步更新过来
(bool success,bytes memory data) = _contract.delegatecall(abi.encodeWithSelector(B.setVars.selector, _num));
require (success,"delegatecall failed");
}
}

delegatecall的原理

如上代码中演示:

实际执行的过程是:

代理调用,存储布局必须要一致:

代理调用的实际应用场景

A. 可升级合约模式(Upgradeable Contracts)

B. 库合约调用(Library Calls)

C. 多签钱包实现

D. 模块化设计

E. Gas优化