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
。
玩得开心。
我正在使用 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
。
玩得开心。