ERC721 標(biāo)準(zhǔn)
ERC721 是非同質(zhì)化代幣(NFT)標(biāo)準(zhǔn)。ERC721 通過(guò)在以太坊區(qū)塊鏈上創(chuàng)建代幣,使得每個(gè)代幣都是唯一的、不可分割和可跟蹤的。
簡(jiǎn)介
ERC721 標(biāo)準(zhǔn)實(shí)現(xiàn)了以太坊上的非同質(zhì)化代幣。每個(gè) ERC721 代幣都是唯一的,不可分割和可跟蹤的,這意味著每個(gè) ERC721 代幣都具有獨(dú)特的屬性和價(jià)值。ERC721 代幣的價(jià)值通常是由它的稀缺性、獨(dú)特性和可交易性所決定的。
ERC721 合約
ERC721 合約是實(shí)現(xiàn) ERC721 標(biāo)準(zhǔn)的智能合約。通過(guò)使用 ERC721 合約,用戶可以創(chuàng)建、鑄造、銷毀和轉(zhuǎn)移 ERC721 代幣。ERC721 合約必須實(shí)現(xiàn)一組標(biāo)準(zhǔn)的接口,以便其他合約和應(yīng)用程序可以與之交互。這些標(biāo)準(zhǔn)接口確保了 ERC721 合約可以與其他 ERC721 合約和應(yīng)用程序無(wú)縫協(xié)作。
標(biāo)準(zhǔn)接口
以下是 ERC721 標(biāo)準(zhǔn)定義的接口:
ERC721 接口
interface ERC721 /* is ERC165 */ {
event Transfer(address indexed _from, address indexed _to, uint256 indexed _tokenId);
event Approval(address indexed _owner, address indexed _approved, uint256 indexed _tokenId);
event ApprovalForAll(address indexed _owner, address indexed _operator, bool _approved);
function balanceOf(address _owner) external view returns (uint256);
function ownerOf(uint256 _tokenId) external view returns (address);
function safeTransferFrom(address _from, address _to, uint256 _tokenId, bytes data) external payable;
function safeTransferFrom(address _from, address _to, uint256 _tokenId) external payable;
function transferFrom(address _from, address _to, uint256 _tokenId) external payable;
function approve(address _approved, uint256 _tokenId) external payable;
function setApprovalForAll(address _operator, bool _approved) external;
function getApproved(uint256 _tokenId) external view returns (address);
function isApprovedForAll(address _owner, address _operator) external view returns (bool);
}
balanceOf
function balanceOf(address owner) external view returns (uint256);
該函數(shù)接受一個(gè)地址參數(shù) owner,返回該地址所擁有的 ERC721 代幣數(shù)量。
ownerOf
function ownerOf(uint256 tokenId) external view returns (address);
該函數(shù)接受一個(gè)整數(shù)參數(shù) tokenId,返回該代幣的擁有者地址。
safeTransferFrom
function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;
該函數(shù)將一個(gè) ERC721 代幣從一個(gè)地址轉(zhuǎn)移到另一個(gè)地址,并調(diào)用目標(biāo)地址的接收函數(shù),確保轉(zhuǎn)移的安全性。其中參數(shù) from 是當(dāng)前擁有者地址,參數(shù) to 是新的擁有者地址,參數(shù) tokenId 是要轉(zhuǎn)移的代幣 ID,參數(shù) data 是可選的數(shù)據(jù)參數(shù)。
safeTransferFrom
function safeTransferFrom(address from, address to, uint256 tokenId) external;
與上一個(gè)函數(shù)類似,該函數(shù)也將一個(gè) ERC721 代幣從一個(gè)地址轉(zhuǎn)移到另一個(gè)地址,但不會(huì)攜帶額外的數(shù)據(jù)參數(shù)。
transferFrom
function transferFrom(address from, address to, uint256 tokenId) external;
該函數(shù)將一個(gè) ERC721 代幣從一個(gè)地址轉(zhuǎn)移到另一個(gè)地址,其中參數(shù) from 是當(dāng)前擁有者地址,參數(shù) to 是新的擁有者地址,參數(shù) tokenId 是要轉(zhuǎn)移的代幣 ID。
approve
function approve(address to, uint256 tokenId) external;
該函數(shù)將一個(gè) ERC721 代幣的授權(quán)轉(zhuǎn)移到另一個(gè)地址,其中參數(shù) to 是新的授權(quán)地址,參數(shù) tokenId 是要授權(quán)的代幣 ID。
setApprovalForAll
function setApprovalForAll(address operator, bool approved) external;
該函數(shù)將當(dāng)前地址對(duì)所有 ERC721 代幣的授權(quán)轉(zhuǎn)移到另一個(gè)地址,其中參數(shù) operator 是新的授權(quán)地址,參數(shù) approved 表示是否授權(quán)。
getApproved
function getApproved(uint256 tokenId) external view returns (address);
該函數(shù)返回一個(gè) ERC721 代幣當(dāng)前的授權(quán)地址,其中參數(shù) tokenId 是要查詢的代幣 ID。
isApprovedForAll
function isApprovedForAll(address owner, address operator) external view returns (bool);
該函數(shù)返回一個(gè)地址是否已被授權(quán)管理一個(gè)地址所擁有的所有 ERC721 代幣,其中參數(shù) owner 是代幣擁有者地址,參數(shù) operator 是被查詢的
ERC721Metadata 接口
繼承自 ERC721,它定義了一些關(guān)于 NFT 元數(shù)據(jù)的標(biāo)準(zhǔn)方法。
interface ERC721Metadata /* is ERC721 */ {
function name() external view returns (string memory _name);
function symbol() external view returns (string memory _symbol);
function tokenURI(uint256 _tokenId) external view returns (string memory);
}
function name() external view returns (string memory) 返回 NFT 的名稱。
function symbol() external view returns (string memory) 返回 NFT 的簡(jiǎn)稱。
function tokenURI(uint256 tokenId) external view returns (string memory) 返回與指定 NFT 關(guān)聯(lián)的元數(shù)據(jù) URI,該 URI 包含有關(guān) NFT 的詳細(xì)信息,如名稱、描述、圖像等。
這些方法在實(shí)現(xiàn) NFT 元數(shù)據(jù)時(shí)非常有用,因?yàn)樗鼈冊(cè)试S開(kāi)發(fā)者標(biāo)準(zhǔn)化他們的元數(shù)據(jù)格式,并為用戶提供更多信息和交互性。
ERC721Enumerable 接口
繼承了 ERC721 和 ERC165 接口,并新增了以下方法:
interface ERC721Enumerable /* is ERC721 */ {
function totalSupply() external view returns (uint256);
function tokenOfOwnerByIndex(address _owner, uint256 _index) external view returns (uint256 _tokenId);
function tokenByIndex(uint256 _index) external view returns (uint256);
}
totalSupply(): 返回已經(jīng)鑄造的 NFT 的數(shù)量。
tokenByIndex(uint256 index): 返回指定索引處的 NFT ID。在所有鑄造的 NFT 中,它定義了一個(gè)唯一的順序。
tokenOfOwnerByIndex(address owner, uint256 index): 返回指定地址的 NFT 列表中指定索引處的 NFT ID。在所有該地址擁有的 NFT 中,它定義了一個(gè)唯一的順序。
這些方法使得 ERC721 合約支持按照順序枚舉所有已鑄造的 NFT,或者按照擁有者地址枚舉特定地址擁有的 NFT。這對(duì)于一些場(chǎng)景,例如 NFT 游戲,非常有用。