精华内容
下载资源
问答
  • 什么是以太坊ERC20和ERC721
    千次阅读
    2021-08-18 11:42:34

    什么是以太坊ERC20和ERC721

    首先,ERC是什么?

    ERC是由Etherum开发人员为益泰坊社区编写的。为了创建一个以太坊平台的标准,开发人员应当提交了一个以太坊改进方案(EIPEthereum Improvement Protocol),改进方案中包括协议规范和合约标准。一旦EIP被委员会批准并最终确定,它就成为ERC。

    由于这些标准,智能合同和令牌交互更加容易,因此开发人员可以在以太坊子上创建 dapps。你会听到一个常见的类比来解释这个好处: 以太坊类似于IOS和Android的dapps——一个支持应用程序并使其易于构建的操作系统。

    目前,最常见的以太网标记标准是ERC-20和ERC-721。那么ERC20和ERC721代表什么,它们之间有什么区别

    先简单介绍一下什么是ERC-20和ERC-721。

    1、ERC-20

    ERC-20是最广为人知的标准。

    Erc-20标准规定令牌必须有其名称、符号、总供应量和其他功能,包括转账和汇款。这个标准的优点是,只要令牌符合 erc-20标准,它将与以太钱包兼容。也就是说,你可以把代币加到你的乙醚房子钱包里,然后通过你的钱包发送给别人。

    由于ERC-20标准的存在,发行Token非常简单。目前,以太坊的ERC-20代币数量超过18万。

    2、ERC-721

    如果 erc-20如此强大,为什么还有额外的 erc-721标准?前面提到的 erc-20标准令牌在价值上没有差别,而且不再适用于需要独特属性的资产,比如加密的收藏品和游戏道具。

    ERC-721标准规定,每个符合其标准的令牌都有一个唯一的令牌标识。在ERC-721标准中,每个令牌都是唯一的。也就是说,在ERC-721标准下,你的100元和我的100元是不一样的,因为两个100元的数字是不一样的。

    如何区分ER-20和ERC-721?

    用一个例子直接说明。如果在区块链有一个虚拟宠物应用程序,里面有100只猫。如果这个应用的Token是基于ERC-20标准开发的,我们同时都有一只猫,那么你的猫和我的猫是一样的,猫的Token是可以分的。例如,如果它被分成10个副本,那么每个副本都是0.1 Token。

    如果这个应用的Token是基于ERC-721标准开发的,那么反正你的猫和我的不一样,因为我们的猫ID是不一样的,猫作为一个整体是不可分割的,是唯一的。

    在这个例子中,我们可以看到ERC20令牌和ERC721令牌之间的两个区别:

    1.ERC-20标准的令牌没有价值区分,可以互换;ERC-721标准中的令牌不可互换,每个令牌都有唯一的标识。

    2.ERC-20标准的令牌是可以划分的,而ERC-721标准的令牌是不能划分的。

    这是因为两个标准之间的差异,它们可以应用于不同的场景。事实上,ERC还有ERC233,ERC777等标准,请期待小编的后续讲解。

    更多相关内容
  • #资源达人分享计划#
  • 以太坊ERC20合约源码

    2018-06-05 14:26:10
    以太坊ERC20合约源码以太坊ERC20合约源码以太坊ERC20合约源码以太坊ERC20合约源码
  • 以太坊标准ERC721

    千次阅读 2018-07-15 20:54:56
    来自Eth的官网Token介绍,其中包含代币的详细阐述和示例代码,本文从中摘取部分...而通过以ETH为基础实现的一系列标准协议实现的代币,称之为以太坊代币。实现功能1、创建数字货币,设定货币的symbol(名称)、suppl...

    来自Eth的官网Token介绍,其中包含代币的详细阐述和示例代码,本文从中摘取部分进行简单阐述。

    官方地址:https://ethereum.org/token


    1、什么是以太坊代币

    代币是通过以太坊的智能合约编写的数字货币。通过编写智能合约代码,创建出一种新的货币。而通过以ETH为基础实现的一系列标准协议实现的代币,称之为以太坊代币。

    实现功能

    1、创建数字货币,设定货币的symbol(名称)、supply(发行量)、icon(图标)等参数

    2、货币的交易功能,实现不同地址之间的资产转移

    3、创建Manager(管理者),去中心的区块链技术,在很多应用当中同样也会需要合约的管理者

    4、增减数字货币的黑(白)名单账本,有效维权,公平交易

    5、货币发行,在原有基础上增加货币的发行总量

    6、实现挖坑,实现POW、POS、DPOS等挖矿的奖励机制

    7、实现代币和其它数字货币的自动兑换

    8、Gas消耗设计

    9、代币分叉、代码测试等等


    2、ERC721

    从区块链技术的逐渐扩张之中,了解ERC721之前,不得不提的就是带火此代币的一个用例,就是以太猫 (Cryptokitties)

    在github里cryptokitties-bounty程序代码提到,用 ERC-721 token 合约来定义每只以太猫:

    “CryptoKitties are non-fungible tokens (see ERC #721) that are indivisible and unique.”以太猫是非同质代币,不可分割且独一无二。


    3、定义

    ERC721定义了一种Ethereum生态中不可分割的、具有唯一性的token交互、流通的接口规范。该规范本质上是Ethereum上的智能合约,依托于EVM运行。符合该规范的token (Non-Fungible Token, NFT),具有以下特性:

    a、在该合约范围内,唯一的token_id

    b、token_id只能被一个owner(i.e. eth address) 所拥有

    c、一个owner可以拥有多个NFTs,它的balance只记数量。有另外的存储列表记录token_id - owner_addr的对应关系

    d、NFT有approve, transfer, takeOwnerShip等接口方法适于流通的功能。即所属权转移。这些方法是在ERC721标准中定义的。

    e、定义一个multiaddr型式的复合地址来索引该token对应的元数据(名称、图片、各种信息)。通过tokenMetadata方法,获取这个multiaddr (形如url的字符串),来获取token元数据。

    f、ERC721与ERC20的token,有兼容的地方,即token name, token symbol。这是便于ERC20的钱包可以显示ERC721的token


    4、ERC、EIP

    ERC(Ethereum Requests for Comments)以太坊意见征集,是EIP(Ethereum Improvement Proposals )以太坊改进建议的一部分,包括一些关于以太坊网络建设的技术指导,它是Ethereum开发者为以太坊社区编写的。

    RFC(Requests for Comments)意见征集是由互联网工程任务组制定的一个概念, RFC中的备忘录包含技术和组织注意事项。 

    EIPs旨在为以太坊平台制定统一的标准,包括核心协议的规范,用户的API调用标准以及智能合约的标准。最终确定的EIP为以太坊开发者提供了一套可实施的标准。 这使得智能合约可以遵循这些通用的接口标准来构建。EIP的完整列表可以在https://eips.ethereum.org/all找到,它的主要分类见下图:


    Standard Track EIP (强制),Informational EIP (参考,非强制),Meta EIP(强制)


    对于区块链公链的基础构架我们可以用下图来表示,并结合StandardTrack EIP的划分理解会更加充分:

    由此可见,ERC系列的确是以太坊相当核心的一部分改进意见征集。对于所有的EIPs以太坊社区有一套完整的工作流程,让全球开发者可以针对以太坊生态进行开发和提出改进建议,并提供了一个标准的提交申请模板供大家提交、审核和批准。

    截止到目前,ERC家族Final可以用下图表示:

    ERC20代币标准,ENS域名标准以及当前热门的ERC721非同质化代币标准都属于ERC家族中比较重要的改进了。


    文章部分内容,参考至:

    火币区块链、https://eips.ethereum.org/、https://eips.ethereum.org/EIPS/eip-721等


    -------------------------------------------

    有任何建议或问题,欢迎加微信一起学习交流,欢迎从事IT,热爱IT,喜欢深挖源代码的行业大牛加入,一起探讨。

    个人微信号:bboyHan


    展开全文
  • interface ERC721 /* is ERC165 */ { //变更NFT所有权 //NFT的创建和销毁时触发 //除外情况:创建合约时,不需要transfer也可以创建和分配NFT //发起transfer时,approved address会被重置为none event Transfer...

    前言

    contract ERC721Full is ERC721, ERC721Enumerable, ERC721Metadata {
        constructor (string memory name, string memory symbol) public ERC721Metadata(name, symbol) {
            // solhint-disable-previous-line no-empty-blocks
        }
    }
    
    contract ERC721 is Context, ERC165, IERC721 
    

    主要介绍ERC721 所相关的ERC165,ERC721Enumerable,ERC721Metadata
    /// Note: the ERC-165 identifier for this interface is 0x80ac58cd.

    ERC721

    interface ERC721 /* is ERC165 */ {
    

    //变更NFT所有权
    //NFT的创建和销毁时触发
    //除外情况:创建合约时,不需要transfer也可以创建和分配NFT
    //发起transfer时,approved address会被重置为none

     event Transfer(address indexed _from, address indexed _to, uint256 indexed _tokenId);
    

    //在NFT的approved address变更或重新确认时被触发。
    //zero address代表没有approved address。
    //当i一个transfer事件发生时,approved address会被重置为none。

     event Approval(address indexed _owner, address indexed _approved, uint256 indexed _tokenId);
    

    //operator被授权或撤权时触发。
    //operator可以管理owner 的所有NFT。

     event ApprovalForAll(address indexed _owner, address indexed _operator, bool _approved);
    

    //计数owner名下的所有NFT。
    //分配NFT给zero address 是无效的。同时,query zero address 的时候,函数抛出异常。
    //参数是发起查询的人。
    //返回NFT数量,可能是0。

    function balanceOf(address _owner) external view returns (uint256);
    

    //获取NFT所有者。
    //分配NFT给zero address 是无效的。同时,query zero address 的时候,函数抛出异常。
    // 参数 _tokenId 是NFT的标识符identifier。
    //返回owner地址。

    function ownerOf(uint256 _tokenId) external view returns (address);
    

    //将NFT的所有权从一个地址转移到另一个地址。
    //抛出异常的情况包括:
    // _from 不是当前所有者,
    // _to 是zero address,
    //_tokenId 不是有效NFT,
    //当转移完成,函数会校验_to 是不是一个合约。
    //如果是,就会使用_to 来调用onERC721Received 方法,
    //并且这个方法,在返回值不是 bytes4(keccak256(“onERC721Received(address,address,uint256,bytes)”)) 时抛出异常。
    // _from 是NFT当前所有者,
    // _to 是新所有者,
    // _tokenId 是要被转移的NFT ,
    // data是没有特定格式的数据,用来sent in call to _to

     function safeTransferFrom(address _from, address _to, uint256 _tokenId, bytes data) external payable;
    

    //如上,只是将data参数置空,“”。

    function safeTransferFrom(address _from, address _to, uint256 _tokenId) external payable;
    

    //转移NFT所有权。
    //调用方有责任检查 _to 是否能够有效接收NFT,如果无作为可能会导致永久丢失。
    //抛出异常:当msg.sender不是当前owner,不是approved address,不是authorized operator。
    //三个参数任一无效,则抛出异常。

       function transferFrom(address _from, address _to, uint256 _tokenId) external payable;
    

    //为NFT设置或重新确认approved address。
    //zero address代表没有approved address。
    //抛出异常:当msg.sender不是当前owner,不是approved address,不是authorized operator。
    //_approved 将被设为owner的角色。
    //_tokenId 当前被操作的币。

     function approve(address _approved, uint256 _tokenId) external payable;
    

    //授权或撤销权利,对第三方operator,对msg.sender所有资产的操作的权利。
    //触发ApprovalForAll事件。
    //合约必须允许每个owner有多个operator。
    //参数 _operator 添加到authorized operators里面。
    //参数bool值,true表示允许,false表示撤销。

      function setApprovalForAll(address _operator, bool _approved) external;
    

    //获取单个NFT的approved address。
    //抛出异常:_tokenId无效时。
    //_tokenId指代哪个币。
    //返回approved address

       function getApproved(uint256 _tokenId) external view returns (address);
    

    //查询address是否是另一个address的authorized operator 。
    //interfaceID是接口标识符,(ERC-165中规定的)。
    //ERC-165中规定了,对接口的鉴别。
    //返回值为true,代表合约实现了interfaceID这个接口。并且interfaceID 不是 0xffffffff。
    //false代表没实现。

    function isApprovedForAll(address _owner, address _operator) external view returns (bool);
    

    ERC165

      interface ERC165 
    

    //查询一个合约是否实现了这个接口。

    function supportsInterface(bytes4 interfaceID) external view returns (bool);
    

    ================================================================================================
    /// @dev Note: the ERC-165 identifier for this interface is 0x150b7a02.

      interface ERC721TokenReceiver 
    

    //处理NFT的收据。
    //ERC721合约在transfer执行后,对接收者recipient调用这个方法。
    //如果传值不对,函数会抛出异常以回复或拒绝这个transfer。而这将导致整个交易被拒绝。
    //合约地址总是message sender。
    // _operator, 调用函数safeTransferFrom的地址。
    //_from,之前的token拥有者。
    //_tokenId,被转移的NFT。
    //data,无规定格式的additional数据。
    //返回bytes4(keccak256("onERC721Received(address,address,uint256,bytes)")),不然就抛出异常。

    function onERC721Received(address _operator, address _from, uint256 _tokenId, bytes _data) external returns(bytes4);
    

    ERC721Metadata

    //metadata extension是erc721合约的可选项。它允许其他人对智能合约发出有关NFT所代表资产的name和details。
    /// Note: the ERC-165 identifier for this interface is 0x5b5e139f.
    interface ERC721Metadata / is ERC721 / {
    //对NFT的描述性名称。

    function name() external view returns (string _name);
    

    //合约中NFT的简短名称。

    function symbol() external view returns (string _symbol);
    

    //对指定资产的唯一URI。
    //抛出异常:tokenId不正确时,
    //URI可能指向(符合元数据JSON模型的)JSON file。。

    function tokenURI(uint256 _tokenId) external view returns (string);
    

    //这是上面提到的"ERC721 Metadata JSON Schema"。

    {
        "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.",
            }
        }
    

    ERC721Enumerable

    //enumeration extension是erc721合约的可选项。它能使合约提供完整列表和和可发现。
    /// Note: the ERC-165 identifier for this interface is 0x780e9d63.

    interface ERC721Enumerable / _is ERC721_ / { 
    

    //计数合约追踪的NFT。
    //合约追踪的有效NFT,每个NFT都是已分配和可查询的地址(不能是zero address)

    function totalSupply() external view returns (uint256);
    

    //枚举有效NFT。
    //抛出异常: _index >= totalSupply()时。
    //(不指定排列顺序。)

    function tokenByIndex(uint256 _index) external view returns (uint256);
    

    //计算属于某个owner的NFT数量。
    //抛出异常:_index >= balanceOf(_owner) 或zero address。

    function tokenOfOwnerByIndex(address _owner, uint256 _index) external view returns (uint256);
    

    参考连接

    https://segmentfault.com/a/1190000017440787
    https://github.com/OpenZeppelin/openzeppelin-contracts

    展开全文
  • 但是在2017年,一种名为CryptoKitties(加密猫)的以太坊游戏在顷刻间吸引了全球众多虚拟游戏世界里面的玩家,占据了各大媒体以及网站的头条,一只加密猫的价格最高峰竟然达到1亿RMB,究竟是什么东西的存在使得这款...

           ERC20出现之后,我开始去了解什么是ERC20。但是在2017年,一种名为CryptoKitties(加密猫)的以太坊游戏在顷刻间吸引了全球众多虚拟游戏世界里面的玩家,占据了各大媒体以及网站的头条,一只加密猫的价格最高峰竟然达到1亿RMB,究竟是什么东西的存在使得这款游戏变得如此疯狂,使得众多游戏玩家为之而痴迷,接下来就有我来给大家简单的剖析一下CryptoKitties(加密猫)游戏背后的主谋吧。首先CryptoKitties(加密猫)是一款玩家可以在游戏里进行加密猫的买、卖、交易以及培养出新的加密猫的区块链游戏。但是,我们童年时代曾经玩过的数码宝贝也是有这样类似的功能,只不过存在于单机游戏里面,包括现在有很多游戏也有这样的游戏体验功能。能够使得CryptoKitties(加密猫)变得如此有魅力,如此让玩家为之投放RMB是因为其背后的ERC721所起到的作用。如果ERC721换成了ERC20,我相信这款游戏的吸引力应该不会有巅峰时那么高,虽然CryptoKitties(加密猫)是以太坊推出的首款区块链游戏。

     

             由于有ERC721的支撑,CryptoKitties(加密猫)变得更有收藏价值,更有意义,因为每只加密猫都有一个ERC721 Token,而这个token是唯一且不能重复生成,好比与每个人的基因,是独一无二的。而ERC721 Token的id就好比加密码中的DNA,所以每个加密猫都是独一无二的。正是唯一性以及稀有性才促使加密猫收藏价值的形成。

                回溯历史,收藏已经成为个别人的一种爱好,人们喜欢收藏是源自于商品的稀缺性以及唯一性(不可再生性——此处不谈及仿制品),同样地,我们通过采用以太坊的ERC721 Token对某些商品进行标记并使其产生稀缺性。 与ERC20相似,ERC721是一种标准的协议且充当交易Token能够实现智能合约以及外部应用交易。

                可替代性——是商品中的一种性质(金钱和商品),能够让其他等价或等性质的商品来替代。一般而言,可替代性是货币或者Token的一种性质,去确定相同或相似类型的物品或数量在交换或使用过程中是否可以实现互换。举个例子,我们可以用RMB在现实生活中的某一家便利店购买一瓶苏打水。

     

                 但是,当我们用一件科比的秋衣去超市兑换一件商品,也许老板不会卖给你,有人会问为什么呢?虽然科比

     

    的球衣是你用300元买回来的,而且你觉得这球衣对于你来说是有收藏价值的。但是,超市的老板也许连科比都不知道是谁,他更不认为一件球服具有收藏价值。

                就收藏品而言,如果收藏品具有不同的特征,则收藏品中的两件物品不可替代。 对于物理硬币,金币不能与铜币相互替换,因为它们的不同特征赋予了它们与收藏者不同的价值。

                ERCToken 可以用到任何交易,但其价值是由每个Token的唯一性和罕见性所致。这一标准定义了相关函数:name , symbol , totalSupply , balanceOf , ownerOf , approve , takeOwnership , transfer , tokenOfOwnerByIndex 以及定义了两个时间:Transfer and Approval。下面就简单的介绍介绍ERC721:

    contract ERC721 {
       // ERC20 compatible functions
       function name() constant returns (string name);
       function symbol() constant returns (string symbol);
       function totalSupply() constant returns (uint256 totalSupply);
       function balanceOf(address _owner) constant returns (uint balance);
       // Functions that define ownership
       function ownerOf(uint256 _tokenId) constant returns (address owner);
       function approve(address _to, uint256 _tokenId);
       function takeOwnership(uint256 _tokenId);
       function transfer(address _to, uint256 _tokenId);
       function tokenOfOwnerByIndex(address _owner, uint256 _index) constant returns (uint tokenId);
       // Token metadata
       function tokenMetadata(uint256 _tokenId) constant returns (string infoUrl);
       // Events
       event Transfer(address indexed _from, address indexed _to, uint256 _tokenId);
       event Approval(address indexed _owner, address indexed _approved, uint256 _tokenId);
    }

    细分如下:(这些例子仅在发文章时候引用,没有测试过,请不要把这些运用到实际开发中去)

    类ERC20的函数

                    ERC721定义的某些函数也遵循了ERC20的标准,这样使得现有的钱包能够更容易显示token简单的信息,这些功能可以让符合这个标准的智能合约充当像比特币或以太坊这样的通用加密货币,通过定义允许用户执行诸如向他人发送令牌和检查账户余额的功能。

    name:

    这个函数作用于告诉外部智能合约以及应用Token的名字,如下是该函数使用的一个例子:

    contract MyNFT {
      function name() constant returns (string name){
        return "My Non-Fungible Token";
      }
    }

    symbol:

    该功能还有助于提供与ERC20令牌标准的兼容性。 它为外部程序提供令牌的简写名称或符号。

    contract MyNFT {
      function symbol() constant returns (string symbol){
        return "MNFT";
      }
    }

    totalSupply:

    该函数返回区块链上可用的硬币总数。 

    contract MyNFT {
      // This can be an arbitrary number
      uint256 private totalSupply = 1000000000;
      function totalSupply() constant returns (uint256 supply){
        return totalSupply;
      }
    }

    balanceOf:

    该函数是用户提供钱包地址去搜索账户中的Token的数目。

    contract MyNFT {
      mapping(address => uint) private balances;
      function balanceOf(address _owner) constant returns (uint balance)
      {
        return balances[_owner];
      }
    }

    Ownership Functions

    该函数定义了智能合约如何去处理一个token的所有者,而且所有者如何转换。最为显著的函数是:takeOwnership和transfer二者起到的是提款以及账户与账户之间转账的作用。

    ownerOf:

    该函数是返回Token拥有者的地址,由于每个ERC721令牌都是不可替代的,因此它们是唯一的,它通过唯一ID在区块链中引用,我们可以使用其ID来确定Token的所有者。

    contract MyNFT {
      mapping(uint256 => address) private tokenOwners;
      mapping(uint256 => bool) private tokenExists;
      function ownerOf(uint256 _tokenId)
      constant returns (address owner) {
        require(tokenExists[_tokenId]);
        return tokenOwners[_tokenId];
      }
    }

    approve:

    该功能批准或授予另一实体代表所有者转让代币的权限。 例如,如果爱丽丝拥有1个NFT,她可以为她的朋友鲍勃拨打批准功能。 通话成功后,鲍勃可以代表爱丽丝以后对该令牌进行所有权或执行操作。 

    contract MyNFT {
      mapping(address => mapping (address => uint256)) allowed;
      function approve(address _to, uint256 _tokenId){
        require(msg.sender == ownerOf(_tokenId));
        require(msg.sender != _to);
        allowed[msg.sender][_to] = _tokenId;
        Approval(msg.sender, _to, _tokenId);
      }
    }

    takeOwnership:

    这个功能就像一个提款功能,因为外部用户可以调用它来从另一个用户的帐户中取出Token。 因此,当用户被批准拥有一定数量的Token(该Token属于当前用户但存于另一用户)并希望从另一用户的余额中提取所述Token时,可以takeOwnership函数。

    contract MyNFT {
      function takeOwnership(uint256 _tokenId){
        require(tokenExists[_tokenId]);
        address oldOwner = ownerOf(_tokenId);
        address newOwner = msg.sender;
        require(newOwner != oldOwner);
        require(allowed[oldOwner][newOwner] == _tokenId);
        balances[oldOwner] -= 1;
        tokenOwners[_tokenId] = newOwner;
        balances[newOwner] += 1;
        Transfer(oldOwner, newOwner, _tokenId);
      }
    }

    transfer:

    该方法是用于转换Token,transfer让Token的所有者将其发送给其他用户,类似于独立的加密货币。但是,只有当接收账户先前已被发送账户批准拥有该Token时才能启动转账。

    contract MyNFT {
      mapping(address => mapping(uint256 => uint256)) private ownerTokens;
      function removeFromTokenList(address owner, uint256 _tokenId) private {
        for(uint256 i = 0;ownerTokens[owner][i] != _tokenId;i++){
          ownerTokens[owner][i] = 0;
        }
      }
      function transfer(address _to, uint256 _tokenId){
        address currentOwner = msg.sender;
        address newOwner = _to;
        require(tokenExists[_tokenId]);
        require(currentOwner == ownerOf(_tokenId));
        require(currentOwner != newOwner);
        require(newOwner != address(0));
        removeFromTokenList(_tokenId);
        balances[oldOwner] -= 1;
        tokenOwners[_tokenId] = newOwner;
        balances[newOwner] += 1;
        Transfer(oldOwner, newOwner, _tokenId);
      }
    }

    tokenOfOwnerByIndex (优先推荐):

    每个人同时可以拥有一个或多个Token,因为每个Token的ID都是唯一的,所以很难跟踪到每个人所拥有的Token的ID。为此,该智能合约记录了每个人所拥有Token的ID,因此,用户拥有的每个单独的Token都可以通过其索引在用户拥有的Token列表(数组)中检索。tokenOfOwnerByIndex可以帮助我们检索出任意令牌。

    contract MyNFT {
      mapping(address => mapping(uint256 => uint256)) private ownerTokens;
      function tokenOfOwnerByIndex(address _owner, uint256 _index) constant returns (uint tokenId){
        return ownerTokens[_owner][_index];
      }
    }

    MetaData Function

    正如我们之前所说的,一张人民币和一件科比的球服之间是不可替换的,因为它们有着各自不同的属性。在可以告知Token属性的区块链上存储数据是相当的昂贵以及不推荐此方法,为了解决这个问题,我们可以将引用(如IPFS哈希或HTTP(S)链接)存储到链上的每个Token的属性,以便链外的程序可以执行逻辑来查找有关Token的更多信息。

    tokenMetadata(优先推荐):

    这方法可以让我们查看Token的元数据或者数据的链接。

    contract MyNFT {
      mapping(uint256 => string) tokenLinks;
      function tokenMetadata(uint256 _tokenId) constant returns (string infoUrl) {
        return tokenLinks[_tokenId];
      }
    }

    Event

    只要合同调用,事件都会被出发。而且一旦触发事件,将会广播到所有的监听中去。外部程序监听区块链事件,以便在事件触发后使用事件提供的信息执行逻辑。ERC712定义的两个事件如下:

    Transfer:

    只要Token的持有者发生改变,都会触发此事件,同时会被广播。 广播里会详细说明哪个帐户发送Token,哪个帐户收到Token,以及哪个Token(通过ID)被传送。

    contract MyNFT {
      event Transfer(address indexed _from, address indexed _to, uint256 _tokenId);
    }

    Approval:

    只要Token的所有者同意另一用户获得Token的所有权,事件将会被触发。它详细说明哪个帐户当前拥有该Token,哪个帐户将来拥有该Token,以及哪个Token(通过Token的ID)被批准转让其所有权。

    contract MyNFT {
      event Approval(address indexed _owner, address indexed _approved, uint256 _tokenId);
    }

    与ERC20类似,新提出的ERC721标准为新的智能合约开辟了一个通道,作为不可互换的东西。 正如在CryptoKitties(ERC721),Decentraland(ERC20),CryptoPunks(ERC20)和其他应用程序中可以看到的,不可互换的令牌已被证明是非常高需求的产品。 即使维基解密拥有几个高价值的CryptoKitties! 但是,最终这一标准将进一步扩大加密货币经济并有助于推动这一领域的进一步发展。

    本篇文章作者大部分内容引用了Gerald Nash  文章,也加入了自己的一些看法以及理解,本篇文章仅代表个人意见,如有不得之处请在评论区告知。

    展开全文
  • 解析——什么是ERC-1155 - 知乎
  • 最著名的两个以太坊通证标准是代币标准ERC20和数字资产标准ERC721。在本文中,除了 介绍这两个流行的ERC标准,还将介绍其他一些针对特定应用场景的ERC20改进标准:ERC223、 ERC621和ERC827。 如果你希望马上开始...
  • 在部署到以太坊区块链上之后,用户将能够通过DAPP的前端界面与智能合约进行交互来玩游戏。 获取游戏卡:用户可以使用ETH获取游戏卡。 每张游戏卡上都会有一个游戏点,这将用于在游戏后期确定赢家。 的角色 卡收集 ...
  • ERC721-ElfToken 此回购是使用OpenZepplin的ERC721关于不可替代令牌的。 简单的ERC721合同。 如何安装依赖项 首次安装所需的依赖项: 您将需要本地以太坊节点,我建议ganache-cli 。 您可以从npm安装它。 npm ...
  • BringsEthereumtoyourbrowser一个可以浏览器上进行操作的以太坊钱包,推荐Chrome。2.在METAMASK创建钱包3.从以太坊官网复制代币代码模板CreateacryptocurrencycontractinEthereumwww.ethereum.org 4.修改代币参数...
  • 以太坊 ERC EIP是什么

    千次阅读 2021-12-05 22:06:02
    ERC是Ethereum Request for Comments(以太坊征求意见提案)的缩写,代表以太坊已正式化的提案,它是由EIP(Ethereum Improvement Proposals以太坊升级提案)经过以太坊开发团队各种审议和测试后通过的一种提案,即对...
  • 以太坊ERC20代币增发

    2018-09-17 16:52:24
    以太坊ERC20代币增发智能合约!
  • 以太坊智能合约ERC721代码示例

    千次阅读 2018-11-06 20:38:32
     * @dev The ERC721 smart contract calls this function on the recipient  * after a `safeTransfer`. This function MUST return the function selector,  * otherwise the caller will revert the ...
  • 测试网络现在不可使用于发行代币,下图中有图片为测试网络,请忽略。其并不影响发币过程 一、安装环境 1、在chrome浏览器安装MetaMask插件(无法安装的话自行想一下谷歌怎么上) 在此是需要已经安装Chrome插件的 ...
  • 线束 通过链上的真实随机性生成的独特艺术品,并包裹在以太坊ERC-721界面中。
  • 以太坊ERC20代币的标准列表: 在找到npm模块。 在https://ethfaction.github.io/erc20_tokens/<network>/<data>上执行GET请求,以GET以太坊网络上所有ERC20令牌的合并json数据。 发出/拉动请求以添加任何丢失的...
  • 去年11月份的一段时间,Ethereum网络突然变的特别拥堵,原因是兴起了一款以太坊养猫的Dapp游戏,超级可爱的猫形象,再加上配种,繁殖和拍卖等丰富的玩法,风靡了币圈。 一时间币圈大大小小的人都在撸猫,以太坊网络...
  • 发行自己的以太坊ERC20代币---超级详细

    千次阅读 热门讨论 2021-05-16 13:47:41
    点击刚刚发布的智能合约地址,就会调转到Etherscan(以太坊的区块浏览器),耐性等待智能合约的创建。 点击确认,支付成功后,然后他会自动部署合约,等一会,去区块浏览器查你的ETH主账号的事物:地址为:...
  • 以太坊ERC20合约开发首先需要对以太坊,ERC20,智能合约等以太坊开发中的基本概念有了解。根据我们的示例代码就可以发行自己的以太坊 什么是ERC20 可以把ERC20简单理解成以太坊上的一个代币协议,所有基于以太坊开发...
  • 文章目录第七章一、以太坊上的数字资产定义二、发行和流通三、ERC 20代币合约标准1、ERC 20标准接口2、现有的ERC 20标准代币三、ERC 721代币合约标准1、标准定义2、CryptoKitties DAPP 一、以太坊上的数字资产定义 ...
  • 以太坊ERC-721令牌

    2018-08-17 18:35:47
    github的:https://github.com/0xcert/ethereum-erc721 以太坊Eips上面的:https://eips.ethereum.org/EIPS/eip-721 如下demo:https://etherscan.io/address/0xa98ad92a642570b83b369c4eb70efefe638bc895#code 721...
  • 以太坊 ERC20,ERC721

    2018-10-11 15:46:46
     有一阵子,Ethereum网络突然变的特别拥堵,原因是兴起了一款以太坊养猫的Dapp游戏,超级可爱的猫形象,再加上配种,繁殖和拍卖等丰富的玩法,风靡了币圈。 一时间币圈大大小小的人都在撸猫,以太坊网络不堪负荷。...
  • 该库包含以太坊合同代码,该代码允许具有道德身份的身份的所有者更新出现在其did文档中的属性。 它公开了一个API,该API允许开发人员使用Java脚本调用合同功能。 如果您想直接与已部署的注册表合同直接交互,或将...
  • ERC721以太坊通证(token)实战教程

    千次阅读 2019-02-22 11:41:00
    本课程以一个数字艺术品创作与分享DApp的实战开发为主线,深入讲解以太坊非同质化通证的概念、标准与开发方案。课程内容即包含ERC-721标准的自主实现,也讲解如何基于经过良好安全审计的OpenZeppelin合约代码库进行...
  • 课程内容深入浅出,是开发者学习以太坊ERC721通证应用开发的最佳选择。 这里是学习地址: 《ERC721以太坊通证实战》 简介 在这个课程里,我们将通过深入一个类似于加密猫(CryptoKitties)的 去中心化数字艺术...
  • 首先,从以太坊演变的历史源头出发,分析ERC20代币智能合约标准从诞生到定型的全过程,深度解释ERC20关键方法的社区争论和最终考量逻辑。其次,用Solidity实现一个极简的代币智能合约,部署到Kovan测试网络运行,...
  • ERC20最初是一种尝试,其目的是为了为以太坊上的各类token合约提供一个特征与接口的共同标准 ERC-20允许钱包显示数以百计不同token的账户余额;创建一个交易工具,只需要提供token的合约地址就可以将更多的token...
  • -ERC721令牌的HTLC 使用这些合同在跨链原子交换的以太坊侧创建HTLC(例如项目)。 运行测试 安装松露 安装ganache 启动并将网络ID设置为4447 $ npm i $ truffle test Using network 'test'. Compiling ./test/...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 5,858
精华内容 2,343
关键字:

以太坊erc721