国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

剖析非同質(zhì)化代幣ERC721-全面解析ERC721標(biāo)準(zhǔn)

Sike / 2743人閱讀

摘要:本文就來剖析下什么是是什么在創(chuàng)建代幣一篇,我們講到過代幣,和一樣,同樣是一個(gè)代幣標(biāo)準(zhǔn),官方簡(jiǎn)要解釋是,簡(jiǎn)寫為,多翻譯為非同質(zhì)代幣。返回合約代幣符號(hào),盡管是可選,但強(qiáng)烈建議實(shí)現(xiàn),即便是返回空字符串。

本文首發(fā)于深入淺出區(qū)塊鏈社區(qū)
原文鏈接:剖析非同質(zhì)化代幣ERC721-全面解析ERC721標(biāo)準(zhǔn)原文已更新,請(qǐng)讀者前往原文閱讀

什么是ERC-721?現(xiàn)在我們看到的各種加密貓貓狗狗都是基于ERC-721創(chuàng)造出來的,每只都是一個(gè)獨(dú)一無二的ERC-721代幣,不過ERC-721在區(qū)塊鏈?zhǔn)澜邕h(yuǎn)不止貓貓狗狗,它更大的想象空間在于將物理世界的資產(chǎn)映射到區(qū)塊鏈上。本文就來剖析下什么是ERC721.

ERC721是什么

在創(chuàng)建代幣一篇,我們講到過ERC20代幣,
和ERC20一樣,ERC721同樣是一個(gè)代幣標(biāo)準(zhǔn),ERC721官方簡(jiǎn)要解釋是Non-Fungible Tokens,簡(jiǎn)寫為NFTs,多翻譯為非同質(zhì)代幣。

ERC721 是由Dieter Shirley 在2017年9月提出。Dieter Shirley 正是謎戀貓CryptoKitties背后的公司Axiom Zen的技術(shù)總監(jiān)。因此謎戀貓也是第一個(gè)實(shí)現(xiàn)了ERC721 標(biāo)準(zhǔn)的去中心化應(yīng)用。ERC721號(hào)提議已經(jīng)被以太坊作為標(biāo)準(zhǔn)接受,但該標(biāo)準(zhǔn)仍處于草稿階段。本文介紹的ERC721標(biāo)準(zhǔn)基于最新(2018/03/23官方提議。

那怎么理解非同質(zhì)代幣呢?

非同質(zhì)代表獨(dú)一無二,謎戀貓為例,每只貓都被賦予擁有基因,是獨(dú)一無二的(一只貓就是一個(gè)NFTs),貓之間是不能置換的。這種獨(dú)特性使得某些稀有貓具有收藏價(jià)值,也因此受到追捧。

ERC20代幣是可置換的,且可細(xì)分為N份(1 = 10 * 0.1), 而ERC721的Token最小的單位為1,無法再分割。

如果同一個(gè)集合的兩個(gè)物品具有不同的特征,這兩個(gè)物品是非同質(zhì)的,而同質(zhì)是某個(gè)部分或數(shù)量可以被另一個(gè)同等部分或數(shù)量所代替。

非同質(zhì)性其實(shí)廣泛存在于我們的生活中,如圖書館的每一本,寵物商店的每一只寵物,歌手所演唱的歌曲,花店里不同的花等等,因此ERC721合約必定有廣泛的應(yīng)用場(chǎng)景。通過這樣一個(gè)標(biāo)準(zhǔn),也可建立跨功能的NFTs管理和銷售平臺(tái)(就像有支持ERC20的交易所和錢包一樣),使生態(tài)更加強(qiáng)大。

ERC721標(biāo)準(zhǔn)

ERC721最為一個(gè)合約標(biāo)準(zhǔn),提供了在實(shí)現(xiàn)ERC721代幣時(shí)必須要遵守的協(xié)議,要求每個(gè)ERC721標(biāo)準(zhǔn)合約需要實(shí)現(xiàn)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的數(shù)量。

ownerOf(): 返回tokenId代幣持有者的地址。

approve(): 授予地址_to具有_tokenId的控制權(quán),方法成功后需觸發(fā)Approval 事件。

setApprovalForAll(): 授予地址_operator具有所有NFTs的控制權(quán),成功后需觸發(fā)ApprovalForAll事件。

getApproved()、isApprovedForAll(): 用來查詢授權(quán)。

safeTransferFrom(): 轉(zhuǎn)移NFT所有權(quán),一次成功的轉(zhuǎn)移操作必須發(fā)起 Transer 事件。函數(shù)的實(shí)現(xiàn)需要做一下幾種檢查:

調(diào)用者msg.sender應(yīng)該是當(dāng)前tokenId的所有者或被授權(quán)的地址

_from 必須是 _tokenId的所有者

_tokenId 應(yīng)該是當(dāng)前合約正在監(jiān)測(cè)的NFTs 中的任何一個(gè)

_to 地址不應(yīng)該為 0

如果_to 是一個(gè)合約應(yīng)該調(diào)用其onERC721Received方法, 并且檢查其返回值,如果返回值不為bytes4(keccak256("onERC721Received(address,uint256,bytes)"))拋出異常。

一個(gè)可接收NFT的合約必須實(shí)現(xiàn)ERC721TokenReceiver接口:

    interface ERC721TokenReceiver {
        /// @return `bytes4(keccak256("onERC721Received(address,uint256,bytes)"))`
        function onERC721Received(address _from, uint256 _tokenId, bytes data) external returns(bytes4);
    }

transferFrom(): 用來轉(zhuǎn)移NFTs, 方法成功后需觸發(fā)Transfer事件。調(diào)用者自己確認(rèn)_to地址能正常接收NFT,否則將丟失此NFT。此函數(shù)實(shí)現(xiàn)時(shí)需要檢查上面條件的前4條。

ERC165 標(biāo)準(zhǔn)

ERC721標(biāo)準(zhǔn)同時(shí)要求必須符合ERC165標(biāo)準(zhǔn) ,其接口如下:

interface ERC165 {
    function supportsInterface(bytes4 interfaceID) external view returns (bool);
}

ERC165同樣是一個(gè)合約標(biāo)準(zhǔn),這個(gè)標(biāo)準(zhǔn)要求合約提供其實(shí)現(xiàn)了哪些接口,這樣再與合約進(jìn)行交互的時(shí)候可以先調(diào)用此接口進(jìn)行查詢。
interfaceID為函數(shù)選擇器,計(jì)算方式有兩種,如:bytes4(keccak256("supportsInterface(bytes4)"));ERC165.supportsInterface.selector,多個(gè)函數(shù)的接口ID為函數(shù)選擇器的異或值。
關(guān)于ERC165,這里不深入介紹,有興趣的同學(xué)可以閱讀官方提案。

可選實(shí)現(xiàn)接口:ERC721Metadata

ERC721Metadata 接口用于提供合約的元數(shù)據(jù):name , symbol 及 URI(NFT所對(duì)應(yīng)的資源)。
其接口定義如下:

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(): 返回合約名字,盡管是可選,但強(qiáng)烈建議實(shí)現(xiàn),即便是返回空字符串。

symbol(): 返回合約代幣符號(hào),盡管是可選,但強(qiáng)烈建議實(shí)現(xiàn),即便是返回空字符串。

tokenURI(): 返回_tokenId所對(duì)應(yīng)的外部資源文件的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調(diào)用,以便在應(yīng)用層做相應(yīng)的查詢和展示。

可選實(shí)現(xiàn)接口:ERC721Enumerable

ERC721Enumerable的主要目的是提高合約中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(): 通過索引返回對(duì)應(yīng)的tokenId。

tokenOfOwnerByIndex(): 所有者可以一次擁有多個(gè)的NFT, 此函數(shù)返回_owner擁有的NFT列表中對(duì)應(yīng)索引的tokenId。

補(bǔ)充說明 NTF IDs

NTF ID,即tokenId,在合約中用唯一的uint265進(jìn)行標(biāo)識(shí),每個(gè)NFT的ID在智能合約的生命周期內(nèi)不允許改變。推薦的實(shí)現(xiàn)方式有:

從0開始,每新加一個(gè)NFT,NTF ID加1

使用sha3后uuid 轉(zhuǎn)換為 NTF ID

與ERC-20的兼容性

ERC721標(biāo)準(zhǔn)盡可能遵循 ERC-20 的語義,但由于同質(zhì)代幣與非同質(zhì)代幣之間的根本差異,并不能完全兼容ERC-20。

交易、挖礦、銷毀

在實(shí)現(xiàn)transter相關(guān)接口時(shí)除了滿足上面的的條件外,我們可以根據(jù)需要添加自己的邏輯,如加入黑名單等。
同時(shí)挖礦、銷毀盡管不是標(biāo)準(zhǔn)的一部分,我們可以根據(jù)需要實(shí)現(xiàn)。

參考實(shí)現(xiàn)

參考實(shí)現(xiàn)為訂閱用戶專有福利,請(qǐng)訂閱我的小專欄:區(qū)塊鏈技術(shù)查看。

參考文獻(xiàn)

EIPS-165

EIPS-721

? 深入淺出區(qū)塊鏈 - 系統(tǒng)學(xué)習(xí)區(qū)塊鏈,打造最好的區(qū)塊鏈技術(shù)博客。

? 我的知識(shí)星球為各位解答區(qū)塊鏈技術(shù)問題,歡迎加入討論。

? 關(guān)注公眾號(hào)“深入淺出區(qū)塊鏈技術(shù)”第一時(shí)間獲取區(qū)塊鏈技術(shù)信息。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/24089.html

相關(guān)文章

  • OpenZeppelin ERC721源碼分析

    摘要:它和我寫的上一篇源碼分析介紹的有所不同,最小的單位為無法再分割,代表獨(dú)一無二的,針對(duì)不可置換的的智能合約標(biāo)準(zhǔn)接口。源碼分析到這里就結(jié)束了。 ERC721 官方簡(jiǎn)介是:A standard interface for non-fungible tokens, also known as deeds.也叫非同質(zhì)代幣,或者不可置換代幣(NFTs)。提到ERC721,一個(gè)好理解的例子就是Cry...

    ctriptech 評(píng)論0 收藏0
  • 區(qū)塊鏈技術(shù)學(xué)習(xí)指引

    摘要:引言給迷失在如何學(xué)習(xí)區(qū)塊鏈技術(shù)的同學(xué)一個(gè)指引,區(qū)塊鏈技術(shù)是隨比特幣誕生,因此要搞明白區(qū)塊鏈技術(shù),應(yīng)該先了解下比特幣。但區(qū)塊鏈技術(shù)不單應(yīng)用于比特幣,還有非常多的現(xiàn)實(shí)應(yīng)用場(chǎng)景,想做區(qū)塊鏈應(yīng)用開發(fā),可進(jìn)一步閱讀以太坊系列。 本文始發(fā)于深入淺出區(qū)塊鏈社區(qū), 原文:區(qū)塊鏈技術(shù)學(xué)習(xí)指引 原文已更新,請(qǐng)讀者前往原文閱讀 本章的文章越來越多,本文是一個(gè)索引帖,方便找到自己感興趣的文章,你也可以使用左側(cè)...

    Cristic 評(píng)論0 收藏0
  • 以太坊開發(fā)實(shí)戰(zhàn)學(xué)習(xí)-ERC721標(biāo)準(zhǔn)(七)

    摘要:從這節(jié)開始,我們將學(xué)習(xí)代幣標(biāo)準(zhǔn)以及加密收集資產(chǎn)等知識(shí)。聲明一個(gè)繼承的新合約,命名為。注意目前是一個(gè)草稿,還沒有正式商定的實(shí)現(xiàn)。所以把這一個(gè)可能的實(shí)現(xiàn)當(dāng)作考慮,但不要把它作為代幣的官方標(biāo)準(zhǔn)。 從這節(jié)開始,我們將學(xué)習(xí)代幣, ERC721標(biāo)準(zhǔn), 以及加密收集資產(chǎn)等知識(shí)。 一、代幣 代幣 讓我們來聊聊以太坊上的代幣。 如果你對(duì)以太坊的世界有一些了解,你很可能聽過人們聊到代幣——尤其是 ERC2...

    android_c 評(píng)論0 收藏0
  • 以太坊標(biāo)準(zhǔn)令牌系列之質(zhì)化令牌ERC20

    摘要:目前市面上,凡是基于以太坊的令牌,在交易所上線交易的均是令牌,那么今天我們就來聊聊令牌的標(biāo)準(zhǔn)方案吧。 0x00 寫在前面 眾所周知,以太坊在現(xiàn)階段最大的應(yīng)用就是令牌發(fā)行,而在以太坊中有很多類型的令牌,最著名的當(dāng)屬ERC20了,但是對(duì)于其他幾種令牌類型,可能還有一些朋友不知道,所以最近規(guī)劃了一個(gè)系列,就是以太坊標(biāo)準(zhǔn)令牌系列。 目前市面上,凡是基于以太坊的令牌,在交易所上線交易的均是ERC...

    Little_XM 評(píng)論0 收藏0
  • Java開發(fā)區(qū)塊鏈的三大sdk庫

    摘要:是企業(yè)與區(qū)塊鏈相遇的地方。的框架旨在成為開發(fā)區(qū)塊鏈解決方案的支柱。以太坊,主要是針對(duì)工程師使用進(jìn)行區(qū)塊鏈以太坊開發(fā)的詳解。 如果你想將區(qū)塊鏈合并到一個(gè)Java項(xiàng)目中,現(xiàn)在我們來看看就是這個(gè)細(xì)分領(lǐng)域中三個(gè)最大的OSS玩家。 好的伙計(jì)們,我們都聽說過比特幣,以太坊或其他加密貨幣,其中有一些時(shí)髦的名字圍繞著我們常見的新聞,但我們作為Java開發(fā)人員知道如何輕松地與這些區(qū)塊鏈技術(shù)進(jìn)行交互嗎?以...

    iKcamp 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<