ERC-721

ERC-721是以太坊上的一种标准协议,用于非同质化Token(Non-Fungible Tokens,NFT)的创建和交易。这篇文章将介绍ERC-721的概念、特点以及实现方式。

什么是ERC-721?

ERC-721是以太坊上的一个标准协议,用于创建和交易非同质化Token(NFT)。NFT是一种数字资产,与其他Token不同,每一个NFT都是独特的,具有不可替代性。比如,一张画作或者一件珍品就是NFT的例子。通过ERC-721协议,开发者可以创建自己的NFT,并将其在以太坊上进行交易。

ERC-721的特点

与ERC-20协议不同,ERC-721协议的每一个Token都是唯一的,没有可替代性。这意味着每一个NFT都有其独特的标识符,称为tokenId。因此,ERC-721协议的实现需要支持这种不可替代性,确保每一个tokenId只能被拥有者所拥有。

另外,ERC-721还支持多样化的交易方式。与ERC-20协议只支持简单的Token交易不同,ERC-721可以支持更多复杂的交易,比如拍卖和租赁等。

ERC-721是以太坊上的一个标准协议,用于创建和交易非同质化Token(NFT)。本文将介绍ERC-721协议中的接口和函数。

接口
ERC-721协议中定义了以下接口:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
interface ERC721 /* is ERC165 */ {
event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);
event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);
event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

//该函数用于查询指定地址拥有的NFT数量。
function balanceOf(address owner) external view returns (uint256 balance);
//该函数用于查询指定tokenId的拥有者地址。
function ownerOf(uint256 tokenId) external view returns (address owner);

//该函数用于将一个NFT从一个地址转移到另一个地址。如果接收地址是一个合约地址,并且合约实现了onERC721Received函数,那么该函数会调用onERC721Received函数。
function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;
function safeTransferFrom(address from, address to, uint256 tokenId) external;

//该函数用于将一个NFT从一个地址转移到另一个地址。
function transferFrom(address from, address to, uint256 tokenId) external;

//该函数用于将NFT的控制权授予另一个地址。
function approve(address to, uint256 tokenId) external;

//该函数用于查询被授予NFT控制权的地址。
function getApproved(uint256 tokenId) external view returns (address operator);

//该函数用于将NFT的控制权授予一个操作者地址,并指定该操作者是否有权代表NFT所有者执行操作。
function setApprovalForAll(address operator, bool approved) external;

//该函数用于查询一个操作者地址是否被授权代表某个NFT所有者执行操作。
function isApprovedForAll(address owner, address operator) external view returns (bool);
}

ERC165

ERC165是以太坊上的一个标准接口,用于判断合约是否实现了某些特定的接口。本文将介绍ERC165的原理和实现方式。

原理

ERC165接口定义了一个名为supportsInterface的函数,该函数接收一个bytes4类型的参数,表示要查询的接口ID。如果合约实现了指定的接口,则返回一个非零值,否则返回0。

例如,对于ERC721接口,其接口ID为0x80ac58cd。因此,要检查合约是否实现了ERC721接口,只需要调用supportsInterface(0x80ac58cd)函数。如果返回值非零,则表示合约实现了ERC721接口。

实现

要实现ERC165接口,需要在合约中定义一个函数supportsInterface,该函数接收一个bytes4类型的参数,返回一个bool类型的值。

1
2
3
interface ERC165 {
function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

合约实现该接口时,需要在supportsInterface函数中检查传入的interfaceId是否为合约实现的某个接口ID,如果是,则返回true,否则返回false。

ERC165是以太坊上的一个标准接口,用于判断合约是否实现了某些特定的接口。要实现ERC165接口,只需要在合约中定义一个supportsInterface函数,并在其中检查传入的接口ID是否为合约实现的某个接口ID。