我已经看到了这里和其他几个地方,正确的方法是调用.call{}()方法来将以太从合同发送到地址。
然后是这里,我看到这个方法与参数一起使用,如下所示:
addr.call{value: msg.value, gas: 5000}(
abi.encodeWithSignature("foo(string,uint256)", "call foo", 123)
);我理解花括号里的论点。value:是您想发送的eth,而gas:是您愿意支付的交易要开采的天然气量(如果我错了,请纠正我)。
我不明白的是括号内的论点。
abi.encodeWithSignature()方法是做什么的?发布于 2021-04-11 11:57:25
经过一番研究,我终于得到了问题的答案。
根据坚实的文档的说法:
二进制接口(ABI)是Ethereum生态系统中与合同交互的标准方法,无论是从区块链之外还是从合同到合同的交互。数据按照其类型进行编码,如本规范所述。编码不是自描述的,因此需要一个模式来解码。
因此,包含abi方法的encodeWithSignature()对象是与Ethereum生态系统中的契约交互的标准方法。
abi.encodeWithSignature()方法做什么?此方法以空刺或功能签名作为其第一个参数。函数签名通常是被调用的契约中的函数,但如果不是,则会出现稳健的处理方式。当它是被调用的契约中的函数时,该函数在调用abi.encodeWithSignature()方法时被调用。因此,在问题中的代码示例中,被调用的契约有一个函数:function foo(string var1, uint256 var2){},它在调用方契约中每次调用abi.encodeWithSignature("foo(string,uint256)", "call foo", 123)方法时都会调用。abi.encodeWithSignature()中的其他两个参数是在调用foo()函数时传递给它的参数。
call方法中的括号,即:
addr.call{value: msg.value, gas: 5000}(/** I am talking about this bracket*/);需要一个字节参数。因此,如果您不想传递abi.encodeWithSignature()方法,您应该传递一个空字符串,否则编译器会抛出一个错误。
发布于 2021-04-05 06:01:14
address.call(bytes memory msg)接受一个输入参数:发送给契约的消息(通常是函数调用)。abi.encodeWithSignature(functionSignature, param1, param2, ...)接受任意数量的参数,但需要第一个参数。它创建一个函数调用消息,对函数和参数进行编码。代码可以编写如下:
interface IFoo {
function foo(string, uint256) external payable;
}
IFoo(addr).foo{value: msg.value, gas: 5000}("call foo", 123)有关更多详细信息,请参阅文档https://docs.soliditylang.org/en/v0.8.3/types.html#address
https://ethereum.stackexchange.com/questions/96685
复制相似问题