我偶然发现了这个可靠的代码:
tx.destination.call.value(tx.value)(tx.data)但不了解它是如何工作的..。尤其是结尾的tx.data。
发布于 2018-06-09 07:28:43
此语句在tx.destination处的地址上调用由tx.data表示的函数,并传入wei (tx.value)。
要进一步细分,请执行以下操作:
tx.destination是一个address。address具有内置的成员和函数,包括call,它允许您在没有ABI的情况下在合同上执行函数(请参阅Address type definition)。例如,您可以在没有定义接口的情况下对约定调用方法foobar,如下所示:
contractAddress.call(bytes4(keccak256("foobar(uint256,uint256)")), val1, val2); // where val1 and val2 are the uint256 parameters to pass in在调用另一个合约的方法时,单独使用call将使用一些默认值。例如,所有剩余的气体都将被转发。如果你想改变这些值,你可以通过提供你自己的gas和/或wei值来调整它,这看起来像是一个函数调用本身:
contractAddress.call.value(9999999)();这将把9999999个wei发送到contractAddress。您可以通过链接多个函数调用来覆盖发送的气体和以太:
contractAddress.call.value(99999999).gas(77777)();这两个示例中的最后一组括号指示在发送wei时使用回退函数。您可以在Solidity docs FAQ中看到类似的示例。
如果你想调用回退函数以外的其他函数,你可以组合上面的两个例子,这就是你发布的代码所做的事情。他们使用tx的事实有点令人困惑,因为这通常是一个内置的引用,但他们很可能掩盖了这一点,它引用了一个具有destination、value和data成员的结构。
https://stackoverflow.com/questions/50762019
复制相似问题