以太坊 ERC20 與 ERC721 深度解密
阿新 • • 發佈:2019-02-12
去年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);
}