摘要:本文就來剖析下什么是是什么在創建代幣一篇,我們講到過代幣,和一樣,同樣是一個代幣標準,官方簡要解釋是,簡寫為,多翻譯為非同質代幣。返回合約代幣符號,盡管是可選,但強烈建議實現,即便是返回空字符串。
本文首發于深入淺出區塊鏈社區
原文鏈接:剖析非同質化代幣ERC721-全面解析ERC721標準原文已更新,請讀者前往原文閱讀
什么是ERC-721?現在我們看到的各種加密貓貓狗狗都是基于ERC-721創造出來的,每只都是一個獨一無二的ERC-721代幣,不過ERC-721在區塊鏈世界遠不止貓貓狗狗,它更大的想象空間在于將物理世界的資產映射到區塊鏈上。本文就來剖析下什么是ERC721.
ERC721是什么在創建代幣一篇,我們講到過ERC20代幣,
和ERC20一樣,ERC721同樣是一個代幣標準,ERC721官方簡要解釋是Non-Fungible Tokens,簡寫為NFTs,多翻譯為非同質代幣。
ERC721 是由Dieter Shirley 在2017年9月提出。Dieter Shirley 正是謎戀貓CryptoKitties背后的公司Axiom Zen的技術總監。因此謎戀貓也是第一個實現了ERC721 標準的去中心化應用。ERC721號提議已經被以太坊作為標準接受,但該標準仍處于草稿階段。本文介紹的ERC721標準基于最新(2018/03/23官方提議。
那怎么理解非同質代幣呢?
非同質代表獨一無二,謎戀貓為例,每只貓都被賦予擁有基因,是獨一無二的(一只貓就是一個NFTs),貓之間是不能置換的。這種獨特性使得某些稀有貓具有收藏價值,也因此受到追捧。
ERC20代幣是可置換的,且可細分為N份(1 = 10 * 0.1), 而ERC721的Token最小的單位為1,無法再分割。
如果同一個集合的兩個物品具有不同的特征,這兩個物品是非同質的,而同質是某個部分或數量可以被另一個同等部分或數量所代替。
非同質性其實廣泛存在于我們的生活中,如圖書館的每一本,寵物商店的每一只寵物,歌手所演唱的歌曲,花店里不同的花等等,因此ERC721合約必定有廣泛的應用場景。通過這樣一個標準,也可建立跨功能的NFTs管理和銷售平臺(就像有支持ERC20的交易所和錢包一樣),使生態更加強大。
ERC721標準ERC721最為一個合約標準,提供了在實現ERC721代幣時必須要遵守的協議,要求每個ERC721標準合約需要實現ERC721及ERC165接口,接口定義如下:
pragma solidity ^0.4.20; interface ERC721 /* is ERC165 */ { event Transfer(address indexed _from, address indexed _to, uint256 _tokenId); event Approval(address indexed _owner, address indexed _approved, uint256 _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(): 返回由_owner 持有的NFTs的數量。
ownerOf(): 返回tokenId代幣持有者的地址。
approve(): 授予地址_to具有_tokenId的控制權,方法成功后需觸發Approval 事件。
setApprovalForAll(): 授予地址_operator具有所有NFTs的控制權,成功后需觸發ApprovalForAll事件。
getApproved()、isApprovedForAll(): 用來查詢授權。
safeTransferFrom(): 轉移NFT所有權,一次成功的轉移操作必須發起 Transer 事件。函數的實現需要做一下幾種檢查:
調用者msg.sender應該是當前tokenId的所有者或被授權的地址
_from 必須是 _tokenId的所有者
_tokenId 應該是當前合約正在監測的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); }
transferFrom(): 用來轉移NFTs, 方法成功后需觸發Transfer事件。調用者自己確認_to地址能正常接收NFT,否則將丟失此NFT。此函數實現時需要檢查上面條件的前4條。
ERC165 標準ERC721標準同時要求必須符合ERC165標準 ,其接口如下:
interface ERC165 { function supportsInterface(bytes4 interfaceID) external view returns (bool); }
ERC165同樣是一個合約標準,這個標準要求合約提供其實現了哪些接口,這樣再與合約進行交互的時候可以先調用此接口進行查詢。
interfaceID為函數選擇器,計算方式有兩種,如:bytes4(keccak256("supportsInterface(bytes4)"));或ERC165.supportsInterface.selector,多個函數的接口ID為函數選擇器的異或值。
關于ERC165,這里不深入介紹,有興趣的同學可以閱讀官方提案。
ERC721Metadata 接口用于提供合約的元數據:name , symbol 及 URI(NFT所對應的資源)。
其接口定義如下:
interface ERC721Metadata /* is ERC721 */ { 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.", } } }
tokenURI通常是被web3調用,以便在應用層做相應的查詢和展示。
可選實現接口:ERC721EnumerableERC721Enumerable的主要目的是提高合約中NTF的可訪問性,其接口定義如下:
interface ERC721Enumerable /* is ERC721 */ { 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。
補充說明 NTF IDsNTF ID,即tokenId,在合約中用唯一的uint265進行標識,每個NFT的ID在智能合約的生命周期內不允許改變。推薦的實現方式有:
從0開始,每新加一個NFT,NTF ID加1
使用sha3后uuid 轉換為 NTF ID
與ERC-20的兼容性ERC721標準盡可能遵循 ERC-20 的語義,但由于同質代幣與非同質代幣之間的根本差異,并不能完全兼容ERC-20。
交易、挖礦、銷毀在實現transter相關接口時除了滿足上面的的條件外,我們可以根據需要添加自己的邏輯,如加入黑名單等。
同時挖礦、銷毀盡管不是標準的一部分,我們可以根據需要實現。
參考實現為訂閱用戶專有福利,請訂閱我的小專欄:區塊鏈技術查看。
EIPS-165
EIPS-721
? 深入淺出區塊鏈 - 系統學習區塊鏈,打造最好的區塊鏈技術博客。
? 我的知識星球為各位解答區塊鏈技術問題,歡迎加入討論。
? 關注公眾號“深入淺出區塊鏈技術”第一時間獲取區塊鏈技術信息。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/24089.html
摘要:它和我寫的上一篇源碼分析介紹的有所不同,最小的單位為無法再分割,代表獨一無二的,針對不可置換的的智能合約標準接口。源碼分析到這里就結束了。 ERC721 官方簡介是:A standard interface for non-fungible tokens, also known as deeds.也叫非同質代幣,或者不可置換代幣(NFTs)。提到ERC721,一個好理解的例子就是Cry...
摘要:從這節開始,我們將學習代幣標準以及加密收集資產等知識。聲明一個繼承的新合約,命名為。注意目前是一個草稿,還沒有正式商定的實現。所以把這一個可能的實現當作考慮,但不要把它作為代幣的官方標準。 從這節開始,我們將學習代幣, ERC721標準, 以及加密收集資產等知識。 一、代幣 代幣 讓我們來聊聊以太坊上的代幣。 如果你對以太坊的世界有一些了解,你很可能聽過人們聊到代幣——尤其是 ERC2...
摘要:目前市面上,凡是基于以太坊的令牌,在交易所上線交易的均是令牌,那么今天我們就來聊聊令牌的標準方案吧。 0x00 寫在前面 眾所周知,以太坊在現階段最大的應用就是令牌發行,而在以太坊中有很多類型的令牌,最著名的當屬ERC20了,但是對于其他幾種令牌類型,可能還有一些朋友不知道,所以最近規劃了一個系列,就是以太坊標準令牌系列。 目前市面上,凡是基于以太坊的令牌,在交易所上線交易的均是ERC...
摘要:是企業與區塊鏈相遇的地方。的框架旨在成為開發區塊鏈解決方案的支柱。以太坊,主要是針對工程師使用進行區塊鏈以太坊開發的詳解。 如果你想將區塊鏈合并到一個Java項目中,現在我們來看看就是這個細分領域中三個最大的OSS玩家。 好的伙計們,我們都聽說過比特幣,以太坊或其他加密貨幣,其中有一些時髦的名字圍繞著我們常見的新聞,但我們作為Java開發人員知道如何輕松地與這些區塊鏈技術進行交互嗎?以...
閱讀 1725·2021-09-22 10:02
閱讀 1946·2021-09-02 15:40
閱讀 2848·2019-08-30 15:55
閱讀 2258·2019-08-30 15:44
閱讀 3603·2019-08-30 13:18
閱讀 3234·2019-08-30 11:00
閱讀 1959·2019-08-29 16:57
閱讀 573·2019-08-29 16:41