十三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调用
Call调用

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

Delegatecall调用
Delegatecall调用

温馨提示:本文内容不构成投资建议,投资有风险,入市需谨慎,请理性投资,风险自负。

想获取更多区块链干货和资讯,请关注V公众号:兔兔先生DEFI

分类:

后端

标签:

后端

作者介绍

十三123
V1