在 Solidity 上构建方法 ID

Constructing a Method ID on Solidity

大家下午好!基于 the official website. 上的示例,他们提供的示例是:

// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.4.16 <0.9.0;

contract Foo {
    function bar(bytes3[2] memory) public pure {}
    function baz(uint32 x, bool y) public pure returns (bool r) { r = x > 32 || y; }
    function sam(bytes memory, bool, uint[] memory) public pure {}
}

以身作则;我理解以 ASCII 形式获取方法名称及其参数,您应该能够生成 0xcdcd77c0(获取前 4 个字节后)

因此,为了了解该过程以便以编程方式重新创建它,我在网上找到了一个 Keccak-256 Converter 并生成了:

cdcd77c0992ec5bbfc459984220f8c45084cc24d9b6efed1fae540db8de801d2

根据我的理解,前 4 个字节应该是 cdcd ,但这是不正确的。然后我发现自己掉进了一个兔子洞,并试图做一个文本 > ASCII > Keccak 签名,但仍然没有产生我需要的东西。所以我请求社区帮助我理解 4 个字节是如何变成 10 个字符的。 ...请谢谢。

来自每个散列函数的响应,如 keccak-256,是表示这些字节的字节或十六进制字符串。每个字节由十六进制字符串中的 2 个字符表示。所以 4 个第一个字节是 8 个第一个字符。在你的例子中有

['cd', 'cd', '77', 'c0']

为了表明一些字符串应该被解释为一个字节,有前缀0x

当您组合这两个规则时,您会得到 0xcdcd77c0 函数选择器。