您的位置:

ERC721详解

一、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代币的发行、转移等相关操作。