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()