Wie überprüfe ich die Solidität, wenn die Schnittstelle unterstützt wird?

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];
}

Antworten (2)

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 supportsInterfaceFunktion verwenden:

function supportsInterface(bytes4 interfaceID) external view returns (bool) {
    return interfaceID == INTERFACE_ID;
}
Danke für die Antwort.. also, wie würde das im Solidity-Code aussehen? Muss ich den obigen Code für jede Funktion verwenden?
Ich habe die Antwort erweitert. Am Ende des Dokuments befindet sich hinter dem zweiten Link auch Beispielcode, der die Verwendung demonstriert.

Sehen Sie sich den ERC165Checker von OpenZeppelin an , der wie das aussieht, was Sie brauchen.