嗨,我是新人,但我想学习,我刚刚在 Solidity 中 fork 了一个项目并部署了它。我想知道如何使用 calldata 来调用外部函数。例如:
function transferOwnership(address newOwner) public virtual onlyOwner {
require(newOwner != address(0), "Ownable: new owner is the zero address");
emit OwnershipTransferred(_owner, newOwner);
_owner = newOwner;
}
你能举个例子吗? 我部署了,我想从 https://remix.ethereum.org/ 调用该函数
谢谢
最佳答案
Remix 中的 CALLDATA
字段允许您手动输入以太坊交易中 data
字段的任何值。
data
字段始终以 0x
开头,然后包含函数签名的 4 个字节(8 个十六进制字符),其余数据是函数参数。
函数签名计算为包含函数名称和参数类型的字符串的 keccak-256 哈希值的前 4 个字节。
示例:
transferOwnership(address)
- 这是要进行哈希处理的字符串f2fde38b092330466c661fc723d5289b90272a3e580e3187d1d7ef788506c557
是该字符串的 keccak-256 哈希f2fde38b
是前4个字节,这是函数签名
然后参数的排序方式与函数中相同(在您的情况下,只有一个参数)。每个值的长度取决于其数据类型(有些是固定的,有些是动态的)。对于 address
类型,长度为 256 位(64 个十六进制字符)。
因此,如果您有一个地址 0xFFfFfFffFFfffFFfFFfFFFFFffFFFffffFfFFFfFF
,作为参数传递的实际值将是 000000000000000000000000ffffffffffffffffffffffffffffffffffffffff
(左侧填充零,长度为 256 位) ).
所有组合在一起:
0xf2fde38b000000000000000000000000ffffffffffffffffffffffffffffffffffffffff
调用函数transferOwnership(address)
并传递地址0xFFfFfFffFFfffFFfFFfFFFFFffFFFffffFfFFFfF
作为参数
注意:您可以在我的 answer 中找到另一个示例类似的问题。
关于solidity - 调用 remix.ethereum 中的外部函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66946024/