solidity - 调用 remix.ethereum 中的外部函数

标签 solidity

enter image description here

嗨,我是新人,但我想学习,我刚刚在 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/

相关文章:

javascript - 在智能合约部署脚本中解构为 {getNamedAccounts, devployments, getChainId } 的对象是什么?

sql - 使用以太坊地址作为 SQL 数据库的主键

ethereum - 过滤掉 web3.js 中的空地址

encryption - Solidity 合约中的 AES 解密

solidity - 在 Solidity 中返回多个数组

javascript - 获取另一个合约部署的合约的地址

ethereum - 存储兼容性 : Solidity upgradable smart contract using "proxy" design pattern and changing the mapping type

ethereum - 跟踪 ERC721 智能合约上所有类型转换的代币

ethereum - 使用 if 语句时如何计算 gas 使用量

ethereum - Solidity:如何将 bytes32 表示为字符串