
十三123
V1
2023/03/19阅读:22主题:极客黑
Call与DelegateCall调用 用代码示范对比
下面的代码示例演示了Call和DelegateCall的使用方法和区别。
Call调用示例
contract ContractA {
function add(uint a, uint b) public pure returns(uint) {
return a + b;
}
}
contract ContractB {
function callContractA(address _contractA) public returns(uint) {
bytes memory payload = abi.encodeWithSignature("add(uint256,uint256)", 2, 3);
(bool success, bytes memory data) = _contractA.call(payload);
require(success, "Call failed.");
uint result = abi.decode(data, (uint));
return result;
}
}
在上面的代码中,ContractA定义了一个add函数,用于将两个数字相加。ContractB中的callContractA函数使用Call调用了ContractA中的add函数,并将2和3作为参数传递给它。
在调用后,ContractB将返回值解码为一个uint类型的变量并返回它
DelegateCall调用示例
contract ContractA {
uint public value;
function setValue(uint _value) public {
value = _value;
}
}
contract ContractB {
uint public value;
function delegateCallContractA(address _contractA, uint _value) public {
bytes memory payload = abi.encodeWithSignature("setValue(uint256)", _value);
(bool success, bytes memory data) = _contractA.delegatecall(payload);
require(success, "DelegateCall failed.");
value = abi.decode(data, (uint));
}
}
在上面的代码中,ContractA定义了一个value变量和一个setValue函数,用于设置value变量的值。
ContractB中的delegateCallContractA函数使用DelegateCall调用了ContractA中的setValue函数,并将_value作为参数传递给它。在调用后,ContractB将value变量设置为与ContractA中相同的值。
从上面的示例可以看出,Call调用与DelegateCall调用的主要区别在于:
Call调用只能访问自己合约的状态和存储器,而DelegateCall调用可以访问调用合约的状态和存储器。

Call调用不能修改被调用合约的状态,而DelegateCall调用可以修改被调用合约的状态。

温馨提示:本文内容不构成投资建议,投资有风险,入市需谨慎,请理性投资,风险自负。
想获取更多区块链干货和资讯,请关注V公众号:兔兔先生DEFI
作者介绍

十三123
V1