1. 程式人生 > >以太坊 ERC20 與 ERC721 深度解密

以太坊 ERC20 與 ERC721 深度解密

去年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);
}

知識星球二維碼380.png