目錄
正文
1? ERC721 接口
事件
方法
2? ERC165 接口
3? 可選實現接口:ERC721Metadata
4? 可選實現接口:ERC721Enumerable
補充說明
1? NTF IDs
2? 與 ERC-20 的兼容性
3? 交易、挖礦、銷毀
??原文:剖析非同質化代幣 ERC721 標準
??寫在前面:本文屬搬運博客,自己留存學習。
正文
ERC721 作為一個合約標準,提供了在實現 ERC721 代幣時必須要遵守的協(xié)議,要求每個 ERC721 標準合約需要實現「ERC721」及「ERC165」接口。ERC721 標準的合約一旦被部署,它將負責跟蹤在以太坊上創(chuàng)建的代幣。
1? ERC721 接口
ERC721 的接口定義如下。
interface ERC721 {
/// event
/// function
}
事件
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);
- Transfer 事件:當任何 NFT 的所有權通過任何機制發(fā)生變化時觸發(fā)此事件。此事件在 NFT 被創(chuàng)建(from == 0)和銷毀(to == 0)時觸發(fā)。例外情況:在合約創(chuàng)建期間,可以創(chuàng)建并分配任意數量的 NFT 而不觸發(fā) Transfer 事件。在任何轉移時,該 NFT 上的被授權地址將被重置為無。
- Approval 事件:當 NFT 的被授權地址被更改或確立時觸發(fā)此事件。零地址表示沒有被授權地址。當 Transfer 事件被觸發(fā)時,這也表示該 NFT 上的被授權地址被重置為無。
- ApprovalForAll 事件:這個事件在操作員為某個所有者啟用或禁用時觸發(fā)。這個操作員可以管理所有者的所有 NFT 。?
方法
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( ):返回 _owner 持有的 NFTs 的數量。
- ownerOf( ):返回 _tokenId 對應代幣的持有者的地址。
- approve( ):授予地址 _to 具有 _tokenId 的控制權,方法成功后需觸發(fā) Approval 事件。
- setApprovalForAll( ):授予地址 _operator 具有所有 NFTs 的控制權,成功后需觸發(fā) ApprovalForAll 事件。
- getApproved( ), isApprovedForAll( ):用于查詢授權。
- safeTransferFrom( ):轉移 NFT 所有權,一次成功的轉移操作必須發(fā)起 Transer 事件。
- transferFrom( ):用來轉移 NFTs,方法成功后需觸發(fā) Transfer 事件。調用者自己確認 _to 地址能正常接收 NFT,否則將丟失此 NFT 。此函數實現時需要檢查下面條件的前四條。
也就是說,transferFrom( ) 滿足調用 safeTransferFrom( ) 的條件的前四條即可。
調用 safeTransferFrom( ) 的條件:
- 調用者 msg.sender 應該是當前 _tokenId 的所有者或被授權的地址;
- _from 必須是 _tokenId 的所有者;
- _tokenId 應該是當前合約正在監(jiān)測的 NFTs 中的任何一個;
- _to 地址不應該為 0;
- 如果 _to 是一個合約,則應該調用它的 onERC721Received 方法,并且檢查其返回值。如果返回值不為 bytes4(keccak256("onERC721Received(address,uint256,bytes)")),則拋出異常。
一個可接收 NFT 的合約必須實現 ERC721TokenReceiver 接口:
interface ERC721TokenReceiver {
/// @return `bytes4(keccak256("onERC721Received(address,uint256,bytes)"))`
function onERC721Received(address _from, uint256 _tokenId, bytes data) external returns(bytes4);
}
2? ERC165 接口
ERC165 的接口定義如下:
interface ERC165 {
function supportsInterface(bytes4 interfaceID) external view returns (bool);
}
ERC165 同樣是一個合約標準,這個標準要求合約提供其實現了哪些接口,這樣在與合約進行交互的時候可以先調用此接口進行查詢。
interfaceID 為函數選擇器,計算方式有兩種,如:bytes4(keccak256('supportsInterface(bytes4)')); 或 ERC165.supportsInterface.selector,多個函數的接口 ID 為函數選擇器的異或值。
就是說可以通過 ERC165 查詢 ERC721 實現了哪些接口?
3? 可選實現接口:ERC721Metadata
ERC721Metadata 接口用于提供合約的元數據:name,symbol 以及 URI,其接口定義如下:
interface ERC721Metadata {
function name() external pure returns (string _name);
function symbol() external pure returns (string _symbol);
function tokenURI(uint256 _tokenId) external view returns (string);
}
接口說明:
- name( ):返回合約名字,盡管是可選,但強烈建議實現,即便是返回空字符串。
- symbol( ):返回合約代幣符號,盡管是可選,但強烈建議實現,即便是返回空字符串。
- tokenURI( ):返回 _tokenId 所對應的外部資源文件的 URI(通常是 IPFS 或 HTTP(S) 路徑)。
外部資源文件需要包含名字、描述、圖片,其格式的要求如下:?
{
"title": "Asset Metadata",
"type": "object",
"properties": {
"name": {
"type": "string",
"description": "Identifies the asset to which this NFT represents",
},
"description": {
"type": "string",
"description": "Describes the asset to which this NFT represents",
},
"image": {
"type": "string",
"description": "A URI pointing to a resource with mime type image/* representing the asset to which this NFT represents. Consider making any images at a width between 320 and 1080 pixels and aspect ratio between 1.91:1 and 4:5 inclusive.",
}
}
}
采用的是 JSON 格式。
4? 可選實現接口:ERC721Enumerable
ERC721Enumerable 的主要目的是提高合約中 NTF 的可訪問性,其接口定義如下:
interface ERC721Enumerable {
function totalSupply() external view returns (uint256);
function tokenByIndex(uint256 _index) external view returns (uint256);
function tokenOfOwnerByIndex(address _owner, uint256 _index) external view returns (uint256);
}
接口說明:
- totalSupply( ):返回 NFT 總量。
- tokenByIndex( ):通過索引返回對應的 tokenId 。
- tokenOfOwnerByIndex( ):所有者可以一次擁有多個的 NFT,此函數返回 _owner 擁有的 NFT 列表中對應索引的 tokenId 。
NFT 總量應該就是該 NFT 合約鑄造的 NFT 代幣的總量吧?
補充說明
1? NTF IDs
NTF 的 ID,即 tokenId,在合約中用唯一的 uint265 進行標識,每個 NFT 的 ID 在智能合約的生命周期內不允許改變。推薦的實現方式有:
- 第一種:從 0 開始,每新加一個 NFT,NTF 的 ID 加 1 。
- 第二種:使用 sha3 后 uuid 轉換為 NTF 的 ID 。
2? 與 ERC-20 的兼容性
ERC721 標準盡可能遵循 ERC-20 的語義,但由于同質代幣與非同質代幣之間的根本差異,并不能完全兼容 ERC-20 。
3? 交易、挖礦、銷毀
在實現 transter 相關接口時除了滿足上面的的條件外,我們可以根據需要添加自己的邏輯,如加入黑名單等。同時挖礦、銷毀盡管不是標準的一部分,我們可以根據需要實現。文章來源:http://www.zghlxwxcb.cn/news/detail-860415.html
官方:ERC-721: Non-Fungible Token Standard文章來源地址http://www.zghlxwxcb.cn/news/detail-860415.html
到了這里,關于區(qū)塊鏈 | ERC721 標準的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!