什么是erc721?ERC-721代币的基本概念、应用场景和实现原理

2023-03-02分类:以太币(ETH) 阅读(


ERC-721是以太坊上的一种代币标准,它与以太坊的另一种代币标准ERC-20不同,ERC-721代币是唯一的,不可分割的非同质化代币(Non-Fungible Token,NFT),用于代表一种独特的数字资产。本文将介绍ERC-721代币的基本概念、应用场景和实现原理。

一、基本概念

ERC-721代币是一种非同质化代币,它与ERC-20代币不同,每个ERC-721代币都是独特的,不能互换或分割。例如,一张数字艺术品、一块土地、一只宠物等都可以被表示为一个ERC-721代币。ERC-721代币具有以下特点:

1.独特性:每个ERC-721代币都是唯一的,有独特的标识符。

2.不可分割性:ERC-721代币不能被分割或互换,它们代表的是一个完整的、独特的数字资产。

3.可交易性:ERC-721代币可以在区块链上进行交易,所有交易记录都被记录在区块链上,实现了完全透明和不可篡改的交易记录。

二、应用场景

ERC-721代币的应用场景很广泛,例如:

1.数字艺术品:数字艺术品可以被表示为一个ERC-721代币,每个代币都是唯一的、不可分割的。

2.游戏道具:游戏道具可以被表示为一个ERC-721代币,每个代币都有独特的属性和价值。

3.虚拟土地:虚拟土地可以被表示为一个ERC-721代币,每块土地都有独特的位置和属性。

4.实物代币化:实物可以被代币化为一个ERC-721代币,例如房屋、汽车、艺术品等。

三、实现原理

ERC-721代币是基于以太坊智能合约实现的,代币的标识符、所有者和交易记录都被记录在智能合约中。ERC-721代币的实现需要包括以下几个部分:

1.代币合约:代币合约定义了代币的标识符、所有者和交易记录等信息。

2.代币所有权:代币所有权可以通过智能合约中的函数实现,包括转移所有权、查询所有者等。

3.代币交易:代币交易可以通过智能合约中的函数实现,包括出售、购买、拍卖等等。

ERC-721代币的合约结构如下所示:


solidity
contract ERC721 { // 代币名称 string public name; // 代币符号 string public symbol; // 代币总量 uint256 public totalSupply; // 代币标识符到所有者的映射 mapping (uint256 => address) internal tokenOwner; // 所有者拥有的代币数量 mapping (address => uint256) internal ownedTokensCount; // 所有者到代币标识符的映射 mapping (uint256 => address) internal tokenApprovals; // 授权操作的映射 mapping (address => mapping (address => bool)) internal operatorApprovals; // 转移所有权 function transfer(address to, uint256 tokenId) public; // 查询所有者 function ownerOf(uint256 tokenId) public view returns (address); // 授权操作 function approve(address to, uint256 tokenId) public; // 获取被授权者 function getApproved(uint256 tokenId) public view returns (address); // 设置操作员 function setApprovalForAll(address to, bool approved) public; // 查询操作员 function isApprovedForAll(address owner, address operator) public view returns (bool); // 代币交易 function safeTransferFrom(address from, address to, uint256 tokenId, bytes data) public; function safeTransferFrom(address from, address to, uint256 tokenId) public; function transferFrom(address from, address to, uint256 tokenId) public; }

ERC-721代币合约中定义了代币名称、符号、总量等信息,以及代币标识符到所有者的映射、所有者拥有的代币数量、代币标识符到被授权者的映射、授权操作的映射等信息。合约中包含了转移所有权、查询所有者、授权操作、设置操作员、代币交易等函数。

转移所有权函数transfer用于将代币的所有权从一个地址转移到另一个地址,函数实现如下:


solidity
function transfer(address to, uint256 tokenId) public { // 判断代币的所有者是否为当前调用者 require(_isApprovedOrOwner(msg.sender, tokenId)); // 清除当前所有者的所有权 _clearApproval(tokenId); _removeTokenFromOwnerEnumeration(tokenOwner[tokenId], tokenId); // 将代币所有权转移给目标地址 tokenOwner[tokenId] = to; _addTokenToOwnerEnumeration(to, tokenId); // 触发Transfer事件 emit Transfer(msg.sender, to, tokenId); }

查询所有者函数ownerOf用于查询代币的所有者,函数实现如下:


solidity
function ownerOf(uint256 tokenId) public view returns (address) { address owner = tokenOwner[tokenId]; require(owner != address(0)); return owner; }

函数safeTransferFrom和transferFrom分别实现了代币的安全转移和普通转移,函数实现如下:


solidity
function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data) public { // 调用_checkOnERC721Received函数,检查代币接收者是否实现了onERC721Received函数 require(_checkOnERC721Received(from, to, tokenId, data)); transferFrom(from, to, tokenId); } function safeTransferFrom(address from, address to, uint256 tokenId) public { safeTransferFrom(from, to, tokenId, ""); } function transferFrom(address from, address to, uint256 tokenId) public { // 判断操作者是否有转移代币的权限 require(_isApprovedOrOwner(msg.sender, tokenId)); // 清除当前代币的授权操作 _clearApproval(tokenId); _removeTokenFromOwnerEnumeration(from, tokenId); // 将代币所有权转移给目标地址 tokenOwner[tokenId] = to; _addTokenToOwnerEnumeration(to, tokenId); // 增加目标地址的代币数量 ownedTokensCount[to]++; // 减少当前地址的代币数量 ownedTokensCount[from]--; // 触发Transfer事件 emit Transfer(from, to, tokenId); }

除了以上函数之外,ERC-721代币合约中还定义了其他辅助函数,例如判断地址是否为代币的所有者或被授权者的函数_isApprovedOrOwner、清除代币的授权操作函数_clearApproval、移除代币从地址拥有的代币列表中函数_removeTokenFromOwnerEnumeration、添加代币到地址拥有的代币列表中函数_addTokenToOwnerEnumeration等。

总之,ERC-721代币是一种具有唯一性、不可分割性和可交换性的代币标准,广泛应用于数字资产的领域,例如游戏、艺术品、房地产等。ERC-721代币合约通过定义代币的结构、转移所有权、查询所有者、授权操作、设置操作员、代币交易等函数,实现了代币的基本功能。

Tags: ERC721 

相关文章