欢迎订阅专栏: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机制以及低级调用的存在,一笔交易中可以实现无数个低级调用,合约可以实现很复杂的功能,真实环境下合约之间的调用可能会非常复杂。