call函数
- call函数的用法
1.call(calldata)
2. call是address的方法
3. call返回值(bool success , bytes data)
4. 即(bool suc,bytes memory res)=地址.call(calldata);
- 关于calldata
1.call的参数是calldata
2.calldata的前四个字节是selector,剩下的的是参数编码–理解
3.如何从代码中获得calldata
bytes cdata= abi.encodeWithSignature(sig, ps);
encodeWithSignature:是abi函数:库函数
- call函数的出现让函数从静态调用转换成动态调用
静态调用实例:
contract Callee{
uint x;
function setX(uint px) public {
x = px;
}
}
import “callee.sol”;//依赖源码
contract Caller{
Callee callee;
function SetCaleeX(){
callee.setX(12);//编译时检查
}
}
动态调用实例:
contract Callee{
uint x;
function setX(uint px, uint y) public returns(string memory){
x = px;
}
}
//“callee.sol”;1.不必依赖被调用合约源码
contract Caller{
// Callee callee;
address callee;
function SetCaleeX(){
bytes memory calldata = abi.encodeWithSignature(“setY(uint)”, 12,13);
(bool suc, _) = callee.call(calldata);
if(!suc)//2. 不要忘记检查函数调用是否成功!
revert(“erro!”)
}
}
fallback函数
- 特殊函数,“备胎”函数
- 动态调用call绕过类型检查,或者自己定义一个接口函数,但是这个函数并不存在,fallback才有机会起作用
- proxy模式中有重要应用:delegatecall:支持合约升级
- 转账功能中有重要作用
其他
- delegatecall
- staticcall
- callcode