一、ERC721标准
ERC721是以太坊上的智能合约标准之一,定义了一个基于以太坊的代币接口。它是非同质化代币(Non-Fungible Token, NFT)的标准之一。
ERC721定义了代币的标准接口,包括代币发行、转移、查询等功能。它能够实现数字资产的唯一性和独特性,例如游戏中的角色、道具、艺术品等。
pragma solidity ^0.8.0; interface IERC721 { event Transfer(address indexed _from, address indexed _to, uint256 indexed _tokenId); function balanceOf(address _owner) external view returns (uint256); function ownerOf(uint256 _tokenId) external view returns (address); function safeTransferFrom(address _from, address _to, uint256 _tokenId, bytes calldata _data) external payable; function safeTransferFrom(address _from, address _to, uint256 _tokenId) external payable; function transferFrom(address _from, address _to, uint256 _tokenId) external payable; function approve(address _approved, uint256 _tokenId) external payable; function setApprovalForAll(address _operator, bool _approved) external; function getApproved(uint256 _tokenId) external view returns (address); function isApprovedForAll(address _owner, address _operator) external view returns (bool); }
ERC721接口的具体实现需要继承这个接口,并进行相应的实现。
二、ERC721Enumerable
ERC721Enumerable是对ERC721标准的扩展,增加了更多的查询功能,使得代币集合可以像数组一样进行操作。
pragma solidity ^0.8.0; interface IERC721Enumerable is IERC721 { function totalSupply() external view returns (uint256); function tokenOfOwnerByIndex(address _owner, uint256 _index) external view returns (uint256); function tokenByIndex(uint256 _index) external view returns (uint256); }
ERC721Enumerable接口定义了查询代币集合情况的功能,包括总量、所有者持有的代币的索引、根据索引获取代币等。
三、ERC20
ERC20是另一个以太坊的智能合约标准,定义了一个基于以太坊的可替代代币接口。
ERC20代币是同质化的,即每个代币都是可以互相替换的。它们可以用于交易、支付、存储等各种场景。
pragma solidity ^0.8.0; interface IERC20 { event Transfer(address indexed from, address indexed to, uint256 value); event Approval(address indexed owner, address indexed spender, uint256 value); function totalSupply() external view returns (uint256); function balanceOf(address account) external view returns (uint256); function transfer(address recipient, uint256 amount) external returns (bool); function allowance(address owner, address spender) external view returns (uint256); function approve(address spender, uint256 amount) external returns (bool); function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); }
ERC20代币接口包括代币的发行、转移、查询余额、授权等功能。
四、如何查看ERC721代币
通过以太坊的链上浏览器可以查看ERC721代币。例如,使用Etherscan,输入指定的ERC721代币合约地址可以查询该地址下所有的代币信息。其中包括代币ID、持有地址、转移记录等。
使用Solidity编写一个简单的ERC721合约:
pragma solidity ^0.8.0; import "https://github.com/OpenZeppelin/openzeppelin-contracts/blob/release-v4.0/contracts/token/ERC721/ERC721.sol"; contract MyToken is ERC721 { constructor() ERC721("MyToken", "MTK") {} }
这个合约的名字是“MyToken”,代币符号是“MTK”。
可通过以下代码创建一个代币,然后将其发送给另一个地址:
MyToken public myToken = new MyToken(); function mintToken(address to, uint256 tokenId) public { myToken.mint(to, tokenId); } function sendToken(address to, uint256 tokenId) public { myToken.safeTransferFrom(msg.sender, to, tokenId); }
这些函数可以在合约内部、外部直接调用,完成ERC721代币的发行、转移等相关操作。