solidity的call跟delegatecall

本文详细介绍了Solidity中的call和delegatecall两种调用方式,包括它们的原型、用途和区别。call会修改msg.sender为被调用合约地址,而delegatecall则保持msg.sender不变,允许在不传递自身状态的情况下使用其他合约的代码。通过实例展示了两者在实际操作中的不同效果,并通过测试验证了其行为。此外,文章还提供了相关测试的logs分析,帮助读者更好地理解这两种调用方式的实现细节。
摘要由CSDN通过智能技术生成

call
原型
<address>.call(...) returns (bool)
简介
调用后内置变量 msg .sender的值会修改为调用者合约地址,涉及存储修改,修改的是被调用者合约的内存(<address>的)。默认情况下将所有可用的gas传输过去,gas传输量可调。执行失败时返回false。
如果调用的函数不存在,则调用fallback函数;

实例
//call的函数调用
nameReg.call("register", "MyName");
nameReg.call(bytes4(keccak256("fun(uint256)")), a);
//设置调用时的gas和传输的钱
nameReg.call.gas(1000000).value(1 ether)("register", "MyName");

delegatecall
原型
<address>.delegatecall(...) returns (bool)

简介
调用后内置变量 msg .sender的值不会修改为调用者合约地址,
涉及存储修改,修改的是调用者合约的内存(当前合约的),默认情况下将所有可用的gas传输过去,gas传输量可调。执行失败时返回false。
本函数目的在于让合约能够在不传输自身状态(如balance、storage)的情况下使用其他合约的代码。

实例
nameReg.delagatecall.gas(1000000)("register", "MyName");
//delegatecall不支持.value


call与delegatecall对比简析
相同之处
(1)调用时会将本合约所有可用的gas传输过去
(2)执行失败均返回false

不同之处
(1)call可以使用.value传ETH给被调用合约
(2)假设在contract_test合约中分别有nameReg.call("somefunction")以及nameReg.delegatecall("somefunction")
    nameReg.call以nameReg合约的身份在nameReg中执行somefunction
    nameReg.delegatecall以contract_test合约的身份在nameReg中执行somefunction
(3)delegatecall的目的就是让合约在不用传输自身状态(如balance、storage)的情况下可以使用其他合约的代码

测试如下:

pragma solidity ^0.4.0;

contract Proxy {
  /**
  * @dev Tells the address of the implementation where every call will be delegated.
  * @return address of the implementation to which it will be delegated
  */
  function implementation()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值