Erc-721

獲取 ERC721 介面 ID

  • April 1, 2022

這裡有一個相關的問題ERC721: Interface ID Registration但我無法從那裡得到我需要的答案。

在 OpenZeppelin ERC721 基本實現中,有這部分:

// Base URI
   string private _baseURI;

   /*
    *     bytes4(keccak256('balanceOf(address)')) == 0x70a08231
    *     bytes4(keccak256('ownerOf(uint256)')) == 0x6352211e
    *     bytes4(keccak256('approve(address,uint256)')) == 0x095ea7b3
    *     bytes4(keccak256('getApproved(uint256)')) == 0x081812fc
    *     bytes4(keccak256('setApprovalForAll(address,bool)')) == 0xa22cb465
    *     bytes4(keccak256('isApprovedForAll(address,address)')) == 0xe985e9c5
    *     bytes4(keccak256('transferFrom(address,address,uint256)')) == 0x23b872dd
    *     bytes4(keccak256('safeTransferFrom(address,address,uint256)')) == 0x42842e0e
    *     bytes4(keccak256('safeTransferFrom(address,address,uint256,bytes)')) == 0xb88d4fde
    *
    *     => 0x70a08231 ^ 0x6352211e ^ 0x095ea7b3 ^ 0x081812fc ^
    *        0xa22cb465 ^ 0xe985e9c ^ 0x23b872dd ^ 0x42842e0e ^ 0xb88d4fde == 0x80ac58cd
    */
   bytes4 private constant _INTERFACE_ID_ERC721 = 0x80ac58cd;

   /*
    *     bytes4(keccak256('name()')) == 0x06fdde03
    *     bytes4(keccak256('symbol()')) == 0x95d89b41
    *     bytes4(keccak256('tokenURI(uint256)')) == 0xc87b56dd
    *
    *     => 0x06fdde03 ^ 0x95d89b41 ^ 0xc87b56dd == 0x5b5e139f
    */
   bytes4 private constant _INTERFACE_ID_ERC721_METADATA = 0x5b5e139f;

   /*
    *     bytes4(keccak256('totalSupply()')) == 0x18160ddd
    *     bytes4(keccak256('tokenOfOwnerByIndex(address,uint256)')) == 0x2f745c59
    *     bytes4(keccak256('tokenByIndex(uint256)')) == 0x4f6ccce7
    *
    *     => 0x18160ddd ^ 0x2f745c59 ^ 0x4f6ccce7 == 0x780e9d63
    */
   bytes4 private constant _INTERFACE_ID_ERC721_ENUMERABLE = 0x780e9d63;

   constructor (string memory name, string memory symbol) public {
       _name = name;
       _symbol = symbol;

       // register the supported interfaces to conform to ERC721 via ERC165
       _registerInterface(_INTERFACE_ID_ERC721);
       _registerInterface(_INTERFACE_ID_ERC721_METADATA);
       _registerInterface(_INTERFACE_ID_ERC721_ENUMERABLE);
   }

_INTERFACE_ID_ERC721, _INTERFACE_ID_ERC721_METADATA, 和_INTERFACE_ID_ERC721_ENUMERABLEare 似乎是計算出來的(基於評論),但我不太確定何時需要進行此計算,以及如何進行?

https://eips.ethereum.org/EIPS/eip-165標準中描述的介面計算:

我們將介面標識符定義為介面中所有函式選擇器的異或。

_INTERFACE_ID_ERC721_METADATA例如這樣計算:

bytes4(keccak256('name()')) ^ bytes4(keccak256('symbol()')) ^ bytes4(keccak256('tokenURI(uint256)'))

但是因為所有函式都是 https://eips.ethereum.org/EIPS/eip-721#specification標準的一部分,並且介面總是有相同的函式集,所以不需要interfaceID每次都計算,大多數實現都使用常量值。

bytes4 public _INTERFACE_ID_MSNFT;
bytes4 public _INTERFACE_ID_IERC721ENUMERABLE;// should be 0x780e9d63
bytes4 public _INTERFACE_ID_IERC721METADATA; // 0x5b5e139f
bytes4 public _INTERFACE_ID_IERC721;    // 0x7aa5391d

https://gist.github.com/JackBekket/d1613e1aa91be56653f9cfc0b2141462

如果有人從 open-zeppeline 尋找不同介面的 interfaceID 常量,我寫了一個實用程序契約,這應該有助於它

引用自:https://ethereum.stackexchange.com/questions/82822