10分钟智能合约:进阶实战-2.4 低级调用

18 阅读1分钟

欢迎订阅专栏10分钟智能合约:进阶实战

什么是低级调用

Solidity中的低级调用指的是通过call、delegatecall、staticcall等底层函数与其他地址进行交互,而不依赖于高层抽象(如调用合约函数)。当不知道目标合约的代码或ABI时,依然可以使用低级调用的方式与合约地址交互,需要手动编码调用数据。

特点:灵活,不安全,底层交互

低级调用函数

函数调用相关

目标地址.call{value:x, gas:y}(calldata)
目标地址.delegatecall(calldata)
目标地址.staticcall(calldata)

ether相关

目标地址.transfer(amount)
目标地址.send(amount)
目标地址.balance

调用任意合约方法

通过call、delegatecall、staticcall等底层函数与其他合约地址进行交互

合约调用编码

abi.encodeWithSignature(string memory Signature,...) returns (bytes memory)
abi.encodeWithSeltector(bytes selector, ...) returns (bytes memory)
abi.encodeCall(function functionPointer, (...)) returns (bytes memory)

代码演示

call

  • 通用的合约调用方式,可以调用其他合约函数或发送以太币
  • 在目标合约的上下文中运行
  • 可指定calldata外,还支持gas、value参数

delegatecall

  • 委托调用
  • 在当前主调合约的上下文中运行
  • 目标合约本身的存储不会被修改,所有操作作用于主调合约
  • 只可指定calldata

staticcall

  • 调用逻辑不允许修改任何区块链的状态
  • 确保调用函数为pure或者view

合约调用问题

由于EVM机制以及低级调用的存在,一笔交易中可以实现无数个低级调用,合约可以实现很复杂的功能,真实环境下合约之间的调用可能会非常复杂。