有人能告诉我为什么有时要调用外部契约上的函数(下面的第一个示例)时,必须使用.call方法和abi.encodeWithSignature,而其他时候,您只需使用参数调用契约name.function (下面第二个示例)。
除了构造函数和函数的明显区别之外,我假设第二种调用方法不必使用.call,因为我们已经导入了合同,但是如果有人能够澄清什么时候使用不同的方法会更好呢?
使用
pragma solidity 0.8.13;
contract callerContract{
address payable targetAddress = payable(0x3328358128832A260C76A4141e19E2A943CD4B6D);
bytes public result;
constructor() payable{}
function callExternal(uint256 _number) public{
(bool success, bytes memory returnData) = targetAddress.call{value: 100, gas: 10000}(abi.encodeWithSignature("targetFunction(uint256)",_number));
result = returnData;
}
}使用带有值和函数参数的契约name.functionName调用函数(这里没有.call方法,也没有abiEncodeWithSignature访问函数),我指的是gateway.depositETH.等等。
pragma solidity ^0.7.5;
import "./IERC20.sol";
import "./IWETHGateway.sol";
contract Escrow {
address arbiter;
address depositor;
address beneficiary;
uint initialDeposit;
IWETHGateway gateway = IWETHGateway(0xDcD33426BA191383f1c9B431A342498fdac73488);
IERC20 aWETH = IERC20(0x030bA81f1c18d280636F32af80b9AAd02Cf0854e);
constructor(address _arbiter, address _beneficiary) payable {
arbiter = _arbiter;
beneficiary = _beneficiary;
depositor = msg.sender;
initialDeposit = msg.value;
gateway.depositETH{value: address(this).balance}(address(this), 0);
}发布于 2022-09-21 13:42:37
第一种方法称为“低级调用”。它通常用于在呼叫时节省汽油或处理还原。
示例:
// this is a low level call
(bool success, bytes memory returndata) = token.call(abi.encodeWithSignature(IERC20.transfer.selector, to, value));
// this is a normal call
IERC20(token).transfer(to, value);
// this is a how a normal call works using low-level call
require(token.code.size > 0);
(bool success, bytes memory returndata) = token.call(abi.encodeWithSignature(IERC20.transfer.selector, to, value));
require(success); // ... also forwards the error message基本上,一个普通的调用会自动添加一个检查,确认合同是否存在,并且调用是否成功。使用低级别电话,您可以跳过这些检查,以节省汽油。
发布于 2022-09-21 11:20:06
在使用call时,需要在调用的契约上指定目标函数。因此,用(abi.encodeWithSignature("targetFunction(uint256)"编码函数签名,后面跟着作为参数传递的值(在本例中为"uint",_number)。编码指定函数签名所调用的函数。你可以得到更多的这里
https://ethereum.stackexchange.com/questions/136075
复制相似问题