去年11月份的一段時間,Ethereum網絡突然變的特別擁堵,原因是興起了一款以太坊養貓的Dapp游戲,超級可愛的貓形象,再加上配種,繁殖和拍賣等豐富的玩法,風靡了幣圈。 一時間幣圈大大小小的人都在擼貓,以太坊網絡不堪負荷,最近更是爆出消息,一只貓可以拍到8w 多人民幣。基於以太貓,國內也興起了一整浪潮,后續又出款了很多的類似的游戲,網易招財貓,百度萊茨狗和加密魚等等,不過玩法套路都是差不多。
實際上,這款游戲的核心是以太坊的智能合約,也是第一款基於智能合約的游戲,這款游戲的核心是基於ERC721的。
基於以太坊養貓,我們可以先理解一下ERC721 的概念。
ERC是以太坊代幣標准的縮寫。常見ERC標准有ERC20, ERC721和ERC825。
ERC20是標准Token接口,這個規定了Token的基本功能, 方便第三方使用。在一些開源組織的工作推動下,ERC20的標准已經簡單到能5分鍾
發行一個ERC20的Token。ERC721是針對不可置換Token的智能合約標准接口,(non-fungiletokens)不可置換Token簡稱NFTs,操作標准
API的實現方法。以太坊養貓中的貓都是ERC721的Token,每只貓都是擁有不一樣基因的貓, 歸根到底也就是擁有不一樣屬性的Token。
貓的編號其實也就是Token的編號,貓的基因也就是Token的屬性。
擼貓歸根到底其實是改變ERC721標准下的Token屬性,從而達到每個貓都具有不一樣的基因。
ERC20 與ERC721 標准的區別
首先且先說ERC20,他是基於同質化的代幣,是可置換的,意味着所有的Token直接沒有區別,、所有Token都是一樣的,我有兩個ERC20的Token,並不會因為我花的方式不一樣而不一樣。
然而ERC721 的代幣是基於是非同質化的,不可互換的Token,簡單理解為每個Token都是獨一無二的。也就是說ERC721的每個Token都擁有獨立唯一的tokenId編號。像在CryptoKitties中的貓都被賦予擁有基因,每只貓的基因都是不一樣的,零代貓是最有收藏價值的。另外在某些情況下, 某些貓的屬性比較罕見, 也會受到追捧。
基於ERC20 和基於ERC721 應用場景.
ERC20 是基於標准的代幣協議,它能夠用於網站流通價值的積分,虛擬幣等等.ERC721的NFT讓數字資產變得更有收藏價值,尤其是在加密貨幣收藏和網絡游戲領域擁有巨大的潛力,用ERC20 的代幣用於游戲的流通價值積分,用ERC721代表網站的虛擬裝備,獨一無二的道具等等,設計出基於雙重代幣游戲模型。
ERC20 和ERC721 的具體接口實現.
基於ERC20 的代幣實現
contract ERC20{
//總共要發多少幣
function totalSupply() constant returns (uint totalSupply);
//返回當前指定地址的余額
function balanceOf(address _owner) constant returns (uint balance);
//調用transfer 將自己的token 轉移 到 _to 地址 _value 為轉賬到數量
function transfer(address _to, uint _value) returns (bool success);
//與_approve 函數配合使用, _approve 批准之后,調用transerFrom 轉移token
function transferFrom(address _from, address _to, uint _value) returns (bool success);
// 授權_spender 可以從 自己的賬戶轉移的余額,可以分多次轉移.
function approve(address _spender, uint _value) returns (bool success);
// 返回spender 還能提取的token 數量.
function allowance(address _owner, address _spender) constant returns (uint remaining);
// 當token 轉移之后會觸發事件
event Transfer(address indexed _from, address indexed _to, uint _value);
//當任何的approve 被觸發之后,都會調用此函數. .
event Approval(address indexed _owner, address indexed _spender, uint _value);
}
基於ERC721 的接口標准
contract ERC721{
//發行代幣的總量
function totalSupply() public view returns (uint256 total);
//根據指定的地址返回代幣的數量
function balanceOf(address _owner) public view returns (uint256 balance);
//根據指定的tokenId 返回 當前擁有者
function ownerOf(uint256 _tokenId) external view returns (address owner);
//當前用戶是否有轉移代幣的權力.
function approve(address _to, uint256 _tokenId) external;
//tokenid 資產轉移。
function transfer(address _to, uint256 _tokenId) external;
//將指定的tokenid 從 _from 轉移 到 _to
function transferFrom(address _from, address _to, uint256 _tokenId) external;
event Transfer(address from, address to, uint256 tokenId);
event Approval(address owner, address approved, uint256 tokenId);
}