1整以、FT(Fungible Token)
FT即同質(zhì)化代幣胧辽,同質(zhì)化的加密貨幣構(gòu)成了目前市場(chǎng)上大部分的代幣。
FT以這樣的方式配置的數(shù)字資產(chǎn)——即每個(gè)代幣(或代幣的碎片)與下一個(gè)代幣等同公黑。
可替代性是法定貨幣中的一個(gè)特征邑商。例如摄咆,一張20美元的鈔票可以?xún)稉Q成任何其他20美元的鈔票,甚至可以?xún)稉Q成零頭人断。即使不是絕對(duì)的20美元鈔票吭从,它也可以是5美元鈔票的倍數(shù),甚至更少恶迈,總之總量等于20美元涩金。
?
2、NFT(Non-Fungible Token)
??NFT即非同質(zhì)化代幣暇仲,非同質(zhì)化代幣通常是指開(kāi)發(fā)者在以太坊平臺(tái)上根據(jù) ERC-721 標(biāo)準(zhǔn)/協(xié)議所發(fā)行的代幣步做。用來(lái)描述一種獨(dú)特的數(shù)字資產(chǎn),它的所有權(quán)是在區(qū)塊鏈上可以進(jìn)行溯源的奈附。
??NFT 是唯一的全度、不可拆分的 token,所有的藝術(shù)品斥滤,不管是圖書(shū)文字将鸵、音樂(lè)或是影像…等各種形式,甚至是數(shù)字化的收藏品與線上游戲都可以通過(guò) NFT 的特殊認(rèn)證方式來(lái)驗(yàn)證其獨(dú)特與稀有價(jià)值佑颇。
因此NFT 與傳統(tǒng)經(jīng)濟(jì)體系中的收藏品相比具有不同的特征:
- 所有權(quán):中心化機(jī)構(gòu)(比如游戲運(yùn)營(yíng)方)可以隨意掌控甚至奪走虛擬資產(chǎn)顶掉,而 NFT是玩家錢(qián)包中真正擁有的資產(chǎn)。
- 永久性:一旦 NFT 被鑄造挑胸,就可以永遠(yuǎn)存在于區(qū)塊鏈上痒筒。
- 稀缺性可證明:由于所有記錄都可公開(kāi)訪問(wèn),因此可以隨時(shí)確認(rèn) NFT 現(xiàn)存的數(shù)量嗜暴。
- 出處可證明:可以確切知道誰(shuí)曾持有過(guò)該 NFT凸克,一直追溯到 NFT 的創(chuàng)作者。
- 可編程性:使用智能合約技術(shù)闷沥,NFT 可以在玩家之間甚至與其他游戲或應(yīng)用之間進(jìn)行交易萎战。
- 去中心化:經(jīng)濟(jì)以完全信任的方式保持其完整性,一旦啟動(dòng)舆逃,即便離開(kāi)游戲項(xiàng)目方仍然可以由社區(qū)自發(fā)推動(dòng)運(yùn)行蚂维。
?
3、FT和NFT的區(qū)別
同質(zhì)化代幣(Fungible Token路狮, FT) | 非同質(zhì)化代幣(Non-Fungible Token) |
---|---|
可互換性 FT 可與同種 FT 進(jìn)行互換虫啥。舉例來(lái)說(shuō),美元可與其他美元進(jìn)行互換奄妨,且不影響價(jià)值涂籽。 | 不可互換性 NFT 不可與同種 NFT 進(jìn)行互換。如將 NFT 借出砸抛,返還為同一 NFT评雌,而不是其他 NFT树枫。舉例來(lái)說(shuō),自己的出生證明不可與別人進(jìn)行互換 |
統(tǒng)一性 所有同種 FT 規(guī)格相同景东,代幣之間相同砂轻。 | 獨(dú)特性 每個(gè) NFT 獨(dú)一無(wú)二,與同種 NFT 各不相同斤吐。 |
可分性 FT 可劃分為更小單元搔涝,價(jià)值同等即可。舉例來(lái)說(shuō)和措,1 美元可換成 2 個(gè) 50 美分或 4 個(gè) 25 美分庄呈。 | 不可分性 NFT 不可分割∨哨澹基本單元為一個(gè)代幣抒痒,也只存在一個(gè)代幣。 |
方便性 易于拆分和交換 | 防盜性 每個(gè)代幣具有獨(dú)特性颁褂,應(yīng)用場(chǎng)景多種多樣,如游戲傀广、知識(shí)產(chǎn)權(quán)颁独、實(shí)體資產(chǎn)、身份證明伪冰、金融文書(shū)誓酒、票務(wù)等 |
ERC-20 以太坊區(qū)塊鏈著名協(xié)議,支持發(fā)布了 OMG贮聂、SNC靠柑、TRX 等代幣。 | ERC-721 以太坊區(qū)塊鏈新協(xié)議吓懈,支持發(fā)布獨(dú)特的非同質(zhì)化代幣歼冰,最佳用例包括加密貓(CryptoKitties)等加密收藏項(xiàng)目。 |
?
4耻警、ERC20標(biāo)準(zhǔn)
官方說(shuō)明文檔地址:https://github.com/ethereum/EIPs/blob/master/EIPS/eip-20.md
??ERC20標(biāo)準(zhǔn)以太坊上的一個(gè)代幣協(xié)議隔嫡,所有基于以太坊開(kāi)發(fā)的代幣合約都遵守這個(gè)協(xié)議。
?
4.1 協(xié)議中包含的方法
//1.name
//返回string類(lèi)型的ERC20代幣的名字甘穿,例如:StatusNetwork
function name() constant returns (string name)
//2.symbol
//返回string類(lèi)型的ERC20代幣的符號(hào)腮恩,也就是代幣的簡(jiǎn)稱(chēng),例如:SNT
function name() constant returns (string name)
//3.decimals
//支持幾位小數(shù)點(diǎn)后幾位温兼。如果設(shè)置為3秸滴。也就是支持0.001表示。
function symbol() constant returns (string symbol)
//4.totalSupply
//發(fā)行代幣的總量募判,可以通過(guò)這個(gè)函數(shù)來(lái)獲取荡含。所有智能合約發(fā)行的代幣總量是一定的咒唆,totalSupply必須設(shè)置初始值。如果不設(shè)置初始值内颗,這個(gè)代幣發(fā)行就說(shuō)明有問(wèn)題钧排。
function totalSupply() constant returns (uint256 totalSupply)
//5.balanceOf
//輸入地址,可以獲取該地址代幣的余額均澳。
function balanceOf(address _owner) constant returns (uint256 balance)
//6.transfer
//調(diào)用transfer函數(shù)將自己的token轉(zhuǎn)賬給_to地址恨溜,_value為轉(zhuǎn)賬個(gè)數(shù)
function transfer(address _to, uint256 _value) returns (bool success)
//7.approve
//批準(zhǔn)_spender賬戶(hù)從自己的賬戶(hù)轉(zhuǎn)移_value個(gè)token≌仪埃可以分多次轉(zhuǎn)移糟袁。
function approve(address _spender, uint256 _value) returns (bool success)
//8.transferFrom
//與approve搭配使用,approve批準(zhǔn)之后躺盛,調(diào)用transferFrom函數(shù)來(lái)轉(zhuǎn)移token项戴。
function transferFrom(address _from, address _to, uint256 _value) returns (bool success)
//9.allowance
//返回_spender仍然允許從_owner提取的金額。
function allowance(address _owner, address _spender) constant returns (uint256 remaining)
?
4.2 協(xié)議中包含的事件
//1.Transfer
//在發(fā)生代幣轉(zhuǎn)移時(shí)必須觸發(fā)槽惫,包括生成新代幣
event Transfer(address indexed _from, address indexed _to, uint256 _value)
//2.Approval
//成功調(diào)用approve(address _spender, uint256 _value)方法時(shí)觸發(fā)
event Approval(address indexed _owner, address indexed _spender, uint256 _value)
?
4.3 例子
賬戶(hù)A有1000個(gè)ETH周叮,想允許B賬戶(hù)隨意調(diào)用100個(gè)ETH。
- A賬戶(hù)按照以下形式調(diào)用approve函數(shù)approve(B,100)
- 當(dāng)B賬戶(hù)想用這100個(gè)ETH中的10個(gè)ETH給C賬戶(hù)時(shí)界斜,則調(diào)用transferFrom(A, C, 10)
- 這時(shí)調(diào)用allowance(A, B)仿耽,可以查看B賬戶(hù)還能夠調(diào)用A賬戶(hù)多少個(gè)token。
?
5各薇、ERC-721
官方說(shuō)明文檔:https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md
?
??ERC-721兼容了ERC-20的一些特性项贺,與ERC-20的主要區(qū)別是定義了token的owner, 即每個(gè)token都詳細(xì)記錄它歷史的擁有者峭判,以及定義了token的Metadata, 即元數(shù)據(jù)开缎。ERC-721還需要實(shí)現(xiàn)ERC165中的接口。
?
5.1 ERC165接口
interface ERC165 {
//ERC165標(biāo)準(zhǔn)要求合約提供其實(shí)現(xiàn)了哪些接口,如若對(duì)應(yīng)接口實(shí)現(xiàn)則返回true
function supportsInterface(bytes4 interfaceID) external view returns (bool);
}
?
5.2 ERC-721接口
interface ERC721 /* is ERC165 */ {
//NFT 資產(chǎn)的轉(zhuǎn)移林螃,包括生成新代幣
event Transfer(address indexed _from, address indexed _to, uint256 indexed _tokenId);
//特定 NFT 資產(chǎn)第三方操作的授權(quán)
event Approval(address indexed _owner, address indexed _approved, uint256 indexed _tokenId);
//特定地址下所有 NFT 資產(chǎn)第三方操作的授權(quán)
event ApprovalForAll(address indexed _owner, address indexed _operator, bool _approved);
//與ERC20兼容的接口
//代幣名字
function name() constant returns (string name);
//代幣符號(hào)
function symbol() constant returns (string symbol);
//發(fā)行的總代幣數(shù)
function totalSupply() constant returns (uint256 totalSupply);
//_owner擁有的代幣數(shù)
function balanceOf(address _owner) constant returns (uint balance);
//返回Token擁有者的地址奕删,由于每個(gè)ERC721令牌都是不可替代的,因此它們是唯一的疗认,它通過(guò)唯一ID在區(qū)塊鏈中引用急侥,我們可以使用其ID來(lái)確定Token的所有者。
function ownerOf(uint256 _tokenId) external view returns (address);
// _from將_tokenId轉(zhuǎn)移給_to侮邀,轉(zhuǎn)移前會(huì)先檢查是否具備轉(zhuǎn)移該 NFT 的資格
//調(diào)用者自己確認(rèn)_to地址能正常接收NFT坏怪,否則將永久丟失此NFT
function transferFrom(address _from, address _to, uint256 _tokenId) external payable;
// _from將_tokenId轉(zhuǎn)移給_to
//要求_tokenId屬于_from
//要求_tokenId合法,即是當(dāng)前合約正在監(jiān)測(cè)的NFTs 中的任何一個(gè)
//要求_to的地址不為0绊茧,如果_to是智能合約(地址的size大于0)铝宵,調(diào)用onERC721Received方法
//安全是指如果交易失敗會(huì)進(jìn)行回滾
//實(shí)際data為空字符串
function safeTransferFrom(address _from, address _to, uint256 _tokenId) external payable;
//data是沒(méi)有指定格式的附加數(shù)據(jù)
//其他與不帶數(shù)據(jù)的safeTransferFrom方法相同
function safeTransferFrom(address _from, address _to, uint256 _tokenId, bytes data) external payable;
//我是小氣鬼,只授權(quán)你花一個(gè)
//允許_approved對(duì)_tokenId的所有權(quán)進(jìn)行操作
function approve(address _approved, uint256 _tokenId) external payable;
//TA 真的授權(quán)給我花 TA 其中的一個(gè) NFT 了嗎?
//返回_tokenId的授權(quán)地址
function getApproved(uint256 _tokenId) external view returns (address);
//我的就是你的鹏秋,全讓你花
//授予或撤銷(xiāo)_operator所具有的所有NFTs的控制權(quán)尊蚁,成功后觸發(fā)ApprovalForAll事件
function setApprovalForAll(address _operator, bool _approved) external;
//TA 真的為我傾盡所有了嗎?
//查詢(xún)_owner所持有的全部NFTs對(duì)_operator的操作授權(quán)狀態(tài)侣夷,true為全授權(quán)操作
function isApprovedForAll(address _owner, address _operator) external view returns (bool);
}
?
5.3 可選實(shí)現(xiàn)接口:ERC721Metadata
?? Metadata用于定義單個(gè)代幣的唯一特征横朋,為一個(gè)特定的代幣ID提供描述性信息 。以加密貓為例百拓,每只加密貓都有不同的顏色琴锭、形狀、名稱(chēng)等衙传。
interface ERC721Metadata /* is ERC721 */ {
//代幣名字
function name() external pure returns (string _name);
//代幣符號(hào)
function symbol() external pure returns (string _symbol);
//返回_tokenId所對(duì)應(yīng)的外部資源文件的URI,外部資源文件(json)需要包含名字决帖、描述呛伴、圖片
function tokenURI(uint256 _tokenId) external view returns (string);
}
?
5.3.1 外部資源文件的模板
{
"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."
}
}
}
?
5.3.2 Metadata的存儲(chǔ)位置
- 鏈上:
- 元數(shù)據(jù)與代幣一起永久存在灾螃,在任何應(yīng)用的生命周期結(jié)束后仍會(huì)存在
- 元數(shù)據(jù)可以根據(jù)鏈上邏輯進(jìn)行更改
- 鏈的存儲(chǔ)空間有限
- 鏈下:通過(guò)tokenURI方法告訴應(yīng)用程序在何處查找給定項(xiàng)的元數(shù)據(jù)
?
5.3.3 ERC-721規(guī)范的NFT一般具有以下屬性
? tokenId:在合約內(nèi)唯一的 NFT ID,在NFT的生命周期中不可改變(要實(shí)現(xiàn)全鏈唯一的必須用(contractAddr, tokenId)組成的元組)
? name:名稱(chēng)扔枫,類(lèi)似于ERC-20的名稱(chēng)
? symbol:符號(hào)俊鱼,類(lèi)似于ERC-20的符號(hào)
? uri:指向外部信息的鏈接刻像,一般是一個(gè)JSON,而在JSON中有進(jìn)一步更加具體的信息
?
5.4 可選實(shí)現(xiàn)接口:ERC721Enumerable
interface ERC721Enumerable /* is ERC721 */ {
//合約當(dāng)前管理的NTFs數(shù)量
function totalSupply() external view returns (uint256);
//查詢(xún)索引為_(kāi)index的資產(chǎn)對(duì)應(yīng)的tokenId
function tokenByIndex(uint256 _index) external view returns (uint256);
//查詢(xún)_owner擁有的NFT列表中對(duì)應(yīng)索引的tokenId
function tokenOfOwnerByIndex(address _owner, uint256 _index) external view returns (uint256);
}
?
如有不對(duì)并闲,煩請(qǐng)指出绎速,感謝~