Solidity的三种合约间的调用方式 call、delegatecall 和 callcode

最近开始学习以太坊智能合约编程,其中涉及到智能合约之间的函数调用。
Solidity的三种合约间的调用方式有call、delegatecall 和 callcode这3种方式。参考了下面的文章:
https://www.cnblogs.com/x-poior/p/10511552.html

对于文章中提到的三种调用方式的异同点
call: 最常用的调用方式,调用后内置变量 msg 的值会修改为调用者,执行环境为被调用者的运行环境(合约的 storage)。
delegatecall: 调用后内置变量 msg 的值不会修改为调用者,但执行环境为调用者的运行环境。
callcode: 调用后内置变量 msg 的值会修改为调用者,但执行环境为调用者的运行环境。

初步感觉不好理解,于是按文中给出的智能合约例子直接运行一次。我使用Solidity在线编译器remix IDE进行测试。直接打开浏览器,输入http://remix.ethereum.org
图 1

点击“+”按钮,然后输入Solidity智能合约文件名:test3.sol

test3.sol的代码如下:

pragma solidity ^0.4.0; 
contract A {
    address public temp1;
    uint256 public temp2;
    function three_call(address addr) public {
            addr.call(bytes4(keccak256("test()")));                 // 情况1
            //addr.delegatecall(bytes4(keccak256("test()")));       // 情况2
            //addr.callcode(bytes4(keccak256("test()")));           // 情况3   
    }
} 

contract B {
    address public temp1;
    uint256 public temp2;    
    function test() public  {
            temp1 = msg.sender;        temp2 = 100;    
    }
}

图 2

 点击图2中的Solidity按钮,就会弹出左边的几个功能按钮。

图 3

 点击图3左边的“Solidity compiler”按钮,在test3.sol中输入上面的代码,然后点击“Compile test3.sol”

图 4

 

点击图4左边的“Deploy & run transactions”按钮,因为这里有A和B 2个合约,需要分别部署。先选择A合约,然后点击“Deploy”。对B合约进行同样的操作。这样A和B 2个合约就部署完成了。

下面我们来看看运行结果。运行过程是:先复制B合约的地址,粘贴到three_call函数的参数栏中,然后点击函数名即可。调用A合约的以太坊账号地址为:0xCA35b7d915458EF540aDe6068dFe2F44E8fa733c

运行结果如下:
情况 1:call

调用call

 情况 2 delegatecall
调用delegatecall

 情况 3 callcode
调用callcode

 

从上面的运行结果,我们是不是已经看得很明白了。总结一下:
情况 1:call
A合约:
temp1 = 0
temp2 = 0

B合约:
temp1 = A合约地址
temp2 = 100

说明:call调用后内置变量 msg 的值会修改为调用者(A合约地址),执行环境为被调用者(B合约)的运行环境(运行环境指合约的 storage)

情况 2:delegatecall
A合约:
temp1 = 调用A合约的以太坊账号地址
temp2 = 100

B合约:
temp1 = 0
temp2 = 0

说明:delegatecall调用后内置变量 msg 的值不会修改为调用者(A合约地址),但执行环境为调用者(A合约)的运行环境

情况 3:callcode
A合约:
temp1 = A合约地址
temp2 = 100

B合约:
temp1 = 0
temp2 = 0

说明:callcode调用后内置变量 msg 的值会修改为调用者(A合约地址),但执行环境为调用者(A合约)的运行环境。
 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值