zoukankan      html  css  js  c++  java
  • call()、delegatecall()

    call()
    当使用方法是:require(msg.sender.call.value(_weiToWithdraw)());
    则作用是将_weiToWithdraw个以太币发送给msg.sender地址,并且调用msg.sender地址的fallback函数

    当使用方法是:

    bytes4 methodId = bytes4(keccak256("increaseAge(string,uint)"));//函数hash
    addr.call(methodId,"jack",1);
    那就是调用了函数increaseAge,并且传入参数是"jack",1

    函数的结果

    call()的返回结果是一个bool,表示是否成功的调用,或者是失败引起了EVM异常。该方法无法直接访问函数返回结果(因为需要事前知道编码和返回结果大小)。

    call()的返回结果即使成功,并不能说操作成功了,只是没有出现异常,比如我们第一个例子中,实际是调用到了fallback()函数。

    delegatecall()

    calldelegatecall的功能类似,区别仅在于后者仅使用给定地址的代码,其它信息则使用当前合约(如存储,余额等等)。

    函数的设计目的是为了使用存储在另一个合约的库代码。

    二者执行代码的上下文环境的不同,当使用call调用其它合约的函数时,代码是在被调用的合约的环境里执行,对应的,使用delegatecall进行函数调用时代码则是在调用函数的合约的环境里执行,通过代码测试说明:

    pragma solidity ^0.4.23;
    contract Calltest {
        address public b;
     
        function test() public returns (address a){
            a=address(this);
            b=a;
     
        }
    }
    contract Compare {
        address public b;
        
        address public testaddress;
        constructor(address _addressOfCalltest) public {
            testaddress = _addressOfCalltest;
        }
        function withcall() public {
            testaddress.call(bytes4(keccak256("test()")));
        }
        function withdelegatecall() public {
            testaddress.delegatecall(bytes4(keccak256("test()")));
        }
    }

    1)首先先测试call()的使用:

    由下图可见,一开始两个合约的b都是0x0

    当运行了Compare合约的withcall()函数后,我们可以看见Calltest合约中的b值有了变化,但是Compare合约的b值并没有变化,这就可以很好地说明,调用call()时,上下文环境是被调用的合约的环境

     2)然后是测试delegatecall()的测试:

    一开始两个合约的b都是0x0

     当运行完Compare合约的withdelegatecall()函数后,我们可以看见Compare合约中的b值有了变化,但是Calltest合约的b值并没有变化,这就可以很好地说明,调用delegatecall()时,上下文环境是正在调用的合约的环境

     delegatecall()的不当使用看本博客the security of smart contract- 2

  • 相关阅读:
    VBA宏-转载记录备份 2021年5月21日 星期五
    (记)利用Word发布文章到cnblogs博客
    赖氏经典英语语法—虚拟语气
    MFC进阶教程深入浅出版.笔记第5天
    MFC进阶教程深入浅出版.笔记第4天
    MFC进阶教程深入浅出版.笔记第3天
    MFC进阶教程深入浅出版.笔记第2天
    MFC进阶教程深入浅出版.笔记第1天
    介词7:during, through, besides, since…
    2.无人机无人车轨迹优化分类
  • 原文地址:https://www.cnblogs.com/wanghui-garcia/p/9619350.html
Copyright © 2011-2022 走看看