Solidity
ERC721:介面 ID 註冊
為什麼我們需要在 ERC721 令牌中註冊介面 ID。我剛剛瀏覽了 openzeppelin-solidity erc721 程式碼,很想知道為什麼我們需要使用它。該介面 id 註冊程式碼是這樣的:
/* * 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; 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_METADATA); }
介面支持使用 ERC-165 進行宣傳。這記錄在https://eips.ethereum.org/EIPS/eip-165
在兩種情況下這是有用的,這些原因促使將該功能添加為所有 ERC-721 合約的要求:
- 允許鏈下實體(錢包、區塊瀏覽器、Web3 客戶端)辨識合約的能力。例如,當您呼叫
safeTransferFrom
ERC-721 合約時,MetaMask 可以檢查您是否正在轉移代幣,而不僅僅是顯示原始的四字節函式標識符。2)允許鏈上合約詢問其他合約。例如,OpenSea 可以使用此功能檢測來辨識包含標準化批量傳輸擴展的 ERC-721 契約。它可以使用該功能在某些情況下更有效地轉移代幣。
老實說,鏈下客戶端的開發比我預期的要慢,而且大多數合約,比如 Compound,都是在受支持的代幣中硬編碼。因此,實施 ERC-165 所實現的價值比我們計劃的要少得多。但是還是有很多項目想要使用界面廣告,所以我們不妨使用標準化的方式。