web3.eth.abi.encodeFunctionSignature 未按预期工作

web3.eth.abi.encodeFunctionSignature is not working as expected

我正在使用 ERC165 来查明我的合约是否支持接口,但我从 web3 的 functionEncoding 方法中得到了非常混乱的行为。这是我的界面

pragma solidity ^0.5.8;


interface ArrayExtraData {
    function submitOfferArrayExtra(uint offerID, uint[] calldata extra) external returns (int status, uint offID);

    function submitRequestArrayExtra(uint requestID, uint[] calldata extra) external returns (int status, uint reqID);
}

我希望得到 0x1ddeb71f 作为接口选择器,它本质上是函数选择器的异或,但我得到 0xe3bfed76。

这是我的 js 代码:

let interfaceFunctions = [
                 'submitOfferArrayExtra(uint,uint[])',
                'submitRequestArrayExtra(uint,uint[])'
             ]

let interfaceId =  interfaceFunctions.
                     map(web3.eth.abi.encodeFunctionSignature).
                     map((x) => parseInt(x, 16)).
                     reduce((x, y) => x ^ y);
interfaceId = interfaceId > 0 ? interfaceId :  0xFFFFFFFF + interfaceId + 1;
interfaceId = '0x' + interfaceId.toString(16);

好的! 我发现了它是如何工作的:)

您必须更具体地了解数据类型。例如,在这种情况下,您必须使用 uint256 而不是 uint

玩得开心。