Erc-721
獲取 ERC721 介面 ID
這裡有一個相關的問題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_ENUMERABLE
are 似乎是計算出來的(基於評論),但我不太確定何時需要進行此計算,以及如何進行?
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 常量,我寫了一個實用程序契約,這應該有助於它