【智能合约】 函数动态调用-call函数和fallback函数

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)”, 1213);
 
 (bool suc, _) = callee.call(calldata);
 if(!suc)//2. 不要忘记检查函数调用是否成功!
 revert(“erro!)
 }
}

fallback函数

  1. 特殊函数,“备胎”函数
  2. 动态调用call绕过类型检查,或者自己定义一个接口函数,但是这个函数并不存在,fallback才有机会起作用
  3. proxy模式中有重要应用:delegatecall:支持合约升级
  4. 转账功能中有重要作用

其他

  1. delegatecall
  2. staticcall
  3. callcode

猜你喜欢

转载自blog.csdn.net/weixin_42918559/article/details/127778179