首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >delegateCall()和delegateCall()

delegateCall()和delegateCall()
EN

Ethereum用户
提问于 2021-07-20 20:16:42
回答 1查看 4.7K关注 0票数 1

在阅读了本文关于Solidity、call()delegateCall()https://medium.com/coinmonks/delegatecall-calling-another-contract-function-in-solidity-b579f804178c的文章之后

我有以下问题:

它最后提到(叠起来一节):

  • 如果我们知道目标函数的ABI,就可以直接使用目标函数签名。
  • 如果我们不知道目标函数的ABI,我们可以使用调用()或委托所有()。但是在委托- field ()的情况下,我们需要关注字段变量的顺序。

但是,如果我们查看Calculator契约示例的call()delegateCall(),我们仍然需要计算器地址和函数签名,如下所示。那么,区别是什么呢?call()delegateCall()也需要目标函数的ABI。

代码语言:javascript
复制
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代表什么?

EN

回答 1

Ethereum用户

发布于 2021-08-09 10:19:29

N表示函数使用的参数数。

对于函数:add(uint256,uint256),N为2,因此函数调用为4+ 32*2 = 68字节

区别在于,当合同A对合同B执行委托时,B的代码是用合同A的存储、msg.sender和msg.value执行的。

为了给你一个简单的例子:

代码语言:javascript
复制
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上试试这个。以下是事件日志:

代码语言:javascript
复制
    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"
        }
    }
票数 2
EN
页面原文内容由Ethereum提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://ethereum.stackexchange.com/questions/103830

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档