In den neuen ERC721-Dokumenten (erc721.org) sagt die Schnittstelle, dass eine der Funktionen sein sollte:
/**
* @dev Returns `true` if the contract implements `interfaceID` and`interfaceID` is not 0xffffffff, `false` otherwise
* @param interfaceID The interface identifier, as specified in ERC-165
*/
function supportsInterface(bytes4 interfaceID) external view returns (bool);
Hat jemand Beispiele für diese Funktion und woher zieht sie die InterfaceId?
Ich habe diesen Basiscode geschrieben, um zu überprüfen, ob er eine Funktion hat, aber wie überprüft man eine gesamte Schnittstelle?
function ERC721() {
supportedInterfaces[this.supportsInterface.selector] = true;
}
function supportsInterface(bytes4 interfaceID) external view returns (bool) {
return supportedInterfaces[interfaceID];
}
Sie verweisen auf https://github.com/ethereum/EIPs/issues/165
Dies wurde in https://github.com/ethereum/EIPs/issues/881 weiterentwickelt
Die Spezifikation dort sagt:
Wir definieren die Schnittstellenkennung als das XOR aller Funktionsselektoren in der Schnittstelle.
Daher müssen Sie so etwas tun:
supportedInterfaces[this.ifc_method_1.selector ^ ... ^ this.ifc_method_n.selector] = true;
Alternativ zu Mappings könnten Sie den XOR-Ausdruck einfach vorberechnen und den konstanten Wert in der supportsInterface
Funktion verwenden:
function supportsInterface(bytes4 interfaceID) external view returns (bool) {
return interfaceID == INTERFACE_ID;
}
Sehen Sie sich den ERC165Checker von OpenZeppelin an , der wie das aussieht, was Sie brauchen.
das Fett
ivicaa