在阅读了本文关于Solidity、call()和delegateCall():https://medium.com/coinmonks/delegatecall-calling-another-contract-function-in-solidity-b579f804178c的文章之后
我有以下问题:
它最后提到(叠起来一节):
但是,如果我们查看Calculator契约示例的call()和delegateCall(),我们仍然需要计算器地址和函数签名,如下所示。那么,区别是什么呢?call()和delegateCall()也需要目标函数的ABI。
function addValuesWithDelegateCall(address calculator, uint256 a, uint256 b) public returns (uint256) {
(bool success, bytes memory result) = calculator.delegatecall(abi.encodeWithSignature("add(uint256,uint256)", a, b));
emit AddedValuesByDelegateCall(a, b, success);
return abi.decode(result, (uint256));
}
function addValuesWithCall(address calculator, uint256 a, uint256 b) public returns (uint256) {
(bool success, bytes memory result) = calculator.call(abi.encodeWithSignature("add(uint256,uint256)", a, b));
emit AddedValuesByCall(a, b, success);
return abi.decode(result, (uint256));
}它还提到:
在Ethereum中,函数调用可以用字节表示,长度可达4+ 32 *N字节。这个字节码由两部分组成
N代表什么?
发布于 2021-08-09 10:19:29
N表示函数使用的参数数。
对于函数:add(uint256,uint256),N为2,因此函数调用为4+ 32*2 = 68字节
区别在于,当合同A对合同B执行委托时,B的代码是用合同A的存储、msg.sender和msg.value执行的。
为了给你一个简单的例子:
pragma solidity >0.8.0;
contract Receiver {
string greeting = "Hello";
event Greeting(string greeting);
function greet() external {
emit Greeting(greeting);
}
}
contract Sender {
string greeting = "Hi";
function delegatedGreeting(address _contract) external {
(bool success,) = _contract.delegatecall(
abi.encodeWithSignature("greet()")
);
}
function callGreeting(address _contract) external {
(bool success,) = _contract.call(
abi.encodeWithSignature("greet()")
);
}
}你可以在Remix上试试这个。以下是事件日志:
Greeting event after call from Sender to Receiver.greet:
{
"event": "Greeting",
"args": {
"0": "Hello",
"greeting": "Hello"
}
Greeting event after delegating call from Sender to Receiver.greet:
{
"event": "Greeting",
"args": {
"0": "Hi",
"greeting": "Hi"
}
}https://ethereum.stackexchange.com/questions/103830
复制相似问题