memoscan
← all memos

Memo 0x0a93f3fa…85a05b on Ethereum

ERC721非同质代币(NFT)介绍ERC721<h1 style="text-align: center;">ERC721非同质代币(NFT)介绍</h1><p style="text-align: left;"><br /><strong>一、什么是ERC721</strong><br />ERC721是一个开放的、用来描述以太坊上建立非同质或者唯一代币的标准。NFT就是non-fungible tokens的缩写。<br />当前色大多数代币(ERC20代币)都是同质的,这意味着这种代币的每一个token都是相同的,而ERC721每一个代币都是唯一的。</p><p style="text-align: left;"><br /><strong>二、标准的定义</strong><br />ERC-721标准定义了一个智能合约必须实现的最小接口。它包括代币管理、拥有和交易。然而它并不包括代币元素据的标准,也未限制增加一些附加支持。<br />请记住,这里提到的是最小接口,这就意味着在实际运用中,你不能仅依赖于这些接口,你必须增加一些额外的功能来支持代币应用。<br />官方网址: <a href=http://erc721.org/>http://erc721.org/ </a> <br /></p><p style="text-align: left;"><br /><strong>三、标准详情</strong><br />ERC-721标准其实有三个接口,ERC721接口、ERC165接口、ERC721TokenReceiver接口<br />3.1 IERC721<br />IERC721接口定义了三个事件,分别是交易事件、授权事件和全部授权事件。事件是用来使轻客户端更方便的追踪以太坊状态的改变。<br />IERC721接口定义了9个函数。分别应用于用户余额、代币所有者、安全交易、普通交易、授权、全部授权、查询授权、查询全部授权,<br />这里详细解释一下安全交易,安全交易是基于接收到代币后必须给出一个响应(执行某些代码)的思想,如果没有响应,则认为代币交易未成功。当然,因为只有合约才有执行代码,所以安全交易只对接收者是合约有效。安全交易函数提供了一个参数data,代表合约接收后应该执行的代码。<br />它有两个同名函数,显然另一个是重载函数,重载函数和原函数的区别在于它并不提供参数data,这也就意味着ERC-721并不强制要求全部采用安全交易进行检查。<br />3.2 IERC165<br />IERC165接口定义了合约支持哪些接口,比如支持ERC721,每个支持的接口都有一个对应的bytes4值与之相对应,这个是固定的,是常量。<br />3.3 IERC721TokenReceiver<br />它定义了合约接收代币后执行的函数,其中一个参数就是IERC721安全交易中的data</p><p style="text-align: left;"><br /><strong>四、附加标准</strong><br />前面提到过,ERC721标准只是最小接口,直接拿来实际运用还存在很多问题,比如没有增发功能(用户从哪获取代币)。需求不同,有时可能还需要燃烧功能。为了能在应用端正确显示用户所拥有的代币,还需要可列举功能。因此这里存在许多附加标准,可以根据自己需求增加并组合。<br />4.1 燃烧 IERC721Burnable<br />IERC721Burnable 燃烧其实就是代币从用户账户中减去,并将代币的owner设置为空地址<br />4.2 可列举 IERC721Enumerable<br />IERC721Enumerable 可列举增加了三个函数分别为:代币发行总量、按索引获取用户代币 按总索引获取代币。但是具体实现时有一些细节点:<br />1. 构造器在构造器中增加可列举接口支持<br />2. 每个地址都对应一个uint256数组来存储它的token,这一点使用Vyper实现不了,因为Vyper没有动态数组<br />3. 因为上述第2点,所以需要改写增发、交易和燃烧方法来修改那个动态数组的内容。<br />4.3 元数据 IERC721Metadata<br />IERC721Metadata增加了名称、符号和代币uri函数。但是具体实现时有一些细节点:<br />1. 构造器中增加元数据接口支持<br />2. 在燃烧时要清除对应的元数据<br />4.4 其它接口 mintable 和 pausable<br />其它还有增发和暂停功能。增发就是增加一个角色控制和外部增发接口,暂停也是一样,只是增加一个外部暂停接口</p><p style="text-align: left;"><br /><strong>五、常用组合</strong><br />一般常用的组合为ERC721标准+ IERC721Enumerable + IERC721Metadata<br />然后再加上自定义的&nbsp;&nbsp;mintable</p><p style="text-align: left;"><br /><strong>六 、github 模板</strong><br />所有的这一切你都不用自己写,github上已经写好了,只需要导入就行了。例如:<br />import 'openzeppelin-solidity/contracts/token/ERC721/ERC721Full.sol';<br />实用技巧,你需要再导入一个 MinterRole 就可以自定义增发实现了,如果你想增发的代币序号从1开始排列的话,直接使用 ERC721Enumerable 中的代币数组长度计数就好,不需要重新做一个变量计数,如果想有其它的实现方式,自己实现。</p><p style="text-align: left;"><br /><strong>七、npm 安装库</strong><br />导入github上的模板需要提前安装对应的库,比如在truffle工程中使用上面的库,需要执行:<br />npm install @openzeppelin/contracts</p>
unknown sendersent to0x7944a0c3…ebfe·#8,912,709·view on Etherscan
ERC721非同质代币(NFT)介绍