非同质化代币(NFT)已成为数字资产领域的重要组成部分,广泛应用于艺术、游戏和收藏品等多个场景。ERC-721 作为以太坊上最流行的 NFT 标准,为开发者提供了一套完整的接口规范。本文将详细介绍如何创建和部署符合 ERC-721 标准的非同质化代币。
理解 ERC-721 标准
ERC(Ethereum Request for Comment)是以太坊社区提出的应用级标准,721 是提案编号。ERC-721 是一个开放标准,描述了如何在 EVM(以太坊虚拟机)兼容的区块链上构建非同质化代币。该标准定义了一组规则,使得 NFT 的创建、交易和管理变得简单高效。
核心功能与事件
ERC-721 标准包含以下几类关键功能:
类 ERC-20 功能:
- name: 定义代币名称,供其他合约和应用识别
- symbol: 定义代币的简称或符号
- totalSupply: 返回区块链上代币的总数量
- balanceOf: 返回地址拥有的 NFT 数量
所有权管理功能:
- ownerOf: 返回代币所有者的地址
- approve: 批准其他实体代表所有者转移代币
- transfer: 允许所有者将代币转移给其他用户
- tokenOfOwnerByIndex: 检索所有者拥有的代币 ID 信息
元数据功能:
- tokenMetadata: 用于发现代币元数据或数据链接的接口
事件:
- Transfer: 当代币所有权变更时触发
- Approve: 当用户批准其他用户获取代币所有权时触发
NFT 的应用场景
非同质化代币在多个领域都有广泛应用:
- 数字艺术: 艺术品拍卖是 NFT 最早的应用场景,持续增长
- 游戏行业: 提供游戏内购买和收藏品功能
- 房地产: 资产代币化和智能合约交易
- 金融服务: 贷款、期货等金融工具
- 软件授权: 确保软件许可证的反盗版和隐私保护
- 票务系统: 演唱会、体育比赛门票防欺诈
- 身份验证: 创建特定用户的 KYC 代币
准备开发环境
获取测试网络 ETH
我们将在 Ropsten 测试网络上部署合约。首先需要安装 Metamask 浏览器扩展创建 ETH 钱包,然后通过 Ropsten 水龙头获取测试 ETH。
选择 Metamask 钱包中的 Ropsten 测试网络,将钱包地址复制到水龙头的文本字段中,点击获取测试以太币。
Ropsten 以太坊(也称为"以太坊测试网")是一个允许在主网部署前进行区块链开发测试的网络。Ropsten 是第一个以太坊测试网 Morden 的继任者。
将文件添加到 IPFS
在编写 NFT 合约之前,需要托管 NFT 艺术资产并创建元数据文件。我们将使用 IPFS——一个点对点的文件存储和共享分布式系统。
步骤 1: 创建 IPFS 存储库
在终端/命令窗口中启动 IPFS 存储库。存储库是 IPFS 节点实际存储数据的子系统。
步骤 2: 启动 IPFS 守护进程
打开单独的终端/命令窗口,启动 IPFS 守护进程。该命令用于启动网络连接的 IPFS 节点。
步骤 3: 添加图像到 IPFS
在第一个终端窗口中,将图像添加到 IPFS。复制以 Qm 开头的哈希值,并添加 "https://ipfs.io/ipfs/" 前缀。
注意:IPFS 网络中存储的每个文件都有唯一的哈希地址(即内容地址,也称为 CID)。该地址是通过算法形成的哈希值,具有唯一性。只要访问相应的哈希值,用户就可以定位文件并访问数据。文件更改时,哈希地址也会变化。
步骤 4: 添加 JSON 文件到 IPFS
创建 JSON 文件 nft.json 并将其保存在与图像相同的目录中。文件格式应包含名称、描述和图像链接等信息。
添加 JSON 文件后,复制以 Qm 开头的哈希值,并添加 "https://ipfs.io/ipfs/" 前缀。保存此 URL,我们将在铸造 NFT 时使用。
创建自定义代币
为了简便和安全,我们将使用 0xcert/ethereum-erc721 合约创建 NFT。通过该库合约,我们不需要编写整个 ERC-721 接口,而是可以导入库合约并使用其函数。
使用 Remix IDE 开发
访问 Ethereum Remix IDE 并创建新的 Solidity 文件,例如 nft.sol。Remix IDE 是一个在线智能合约编译、测试和部署工具,可以轻松与智能合约交互。
粘贴以下代码到新的 Solidity 脚本中:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "https://github.com/0xcert/ethereum-erc721/src/contracts/tokens/NFTokenMetadata.sol";
import "https://github.com/0xcert/ethereum-erc721/src/contracts/ownership/Ownable.sol";
contract newNFT is NFTokenMetadata, Ownable {
constructor() {
nftName = "My NFT";
nftSymbol = "MNFT";
}
function mint(address _to, uint256 _tokenId, string calldata _uri) external {
super._mint(_to, _tokenId);
super._setTokenUri(_tokenId, _uri);
}
}代码说明:
- SPDX 许可证标识: 解决版权问题的标准方法
- Solidity 版本声明: 指定编译器版本
- 合约导入: 引入 ERC-721 实现和所有权管理
- 构造函数: 初始化代币名称和符号
- 铸造函数: 创建新代币并设置元数据链接
编译与部署
编译智能合约并使用 Injected Web3 进行部署(在编译合约前确保在 Metamask 中选择 Ropsten 测试网络)。批准来自 Metamask 的交易。
如果部署前收到"此合约可能是抽象的"错误消息,请确保在合约选项卡下选择适当的合约。
在 Remix 的"已部署合约"部分展开部署的合约,可以看到一系列函数/方法。展开铸造函数并添加以下详细信息:
- 在 _to 字段中添加您的 Ropsten 地址
- 在 _tokenid 字段中输入任意大数值(建议使用 1,因为这是第一个)
- 在 _uri 字段中添加从前一节获得的 JSON 文件 URI
点击交易并从 Metamask 确认交易。现在您的代币已在 Ropsten 链上。
您可以通过输入我们之前提到的代币 ID 来检查其他详细信息,如名称、符号、所有者或 tokenuri。在 Metamask 中确认交易。
常见问题
ERC-721 与 ERC-1155 有什么区别?
ERC-721 是单一代币标准,每个代币都是独一无二的。而 ERC-1155 是多代币标准,允许在单个合约中创建可替代和不可替代代币。ERC-1155 更高效,特别适合游戏和需要批量操作的应用场景。
为什么需要 IPFS 存储 NFT 资源?
IPFS 提供了去中心化的存储解决方案,确保数字资产的永久性和不可篡改性。与中心化存储不同,IPFS 存储的内容通过哈希地址访问,即使原始服务器宕机,只要网络中有节点存储了该内容,就仍然可以访问。
部署 NFT 合约的主要成本是什么?
部署成本主要包括智能合约部署的 Gas 费和存储费用。在以太坊主网上,这些费用可能相当高,因此建议先在测试网上进行充分测试。Gas 费用根据网络拥堵情况和合约复杂性而变化。
如何确保 NFT 的稀缺性和唯一性?
通过智能合约逻辑确保稀缺性,可以限制特定代币的发行数量。唯一性则通过每个代币的唯一标识符和元数据来保证。开发者需要在合约中实现适当的访问控制和铸造限制机制。
NFT 元数据应该包含哪些信息?
典型元数据包括名称、描述、图像或媒体文件链接、属性特征、创建者信息和版权声明。良好的元数据设计能增强 NFT 的价值和用户体验。
测试网与主网部署有何区别?
测试网使用模拟以太币,无需真实资金,适合开发和测试。主网部署需要真实以太币支付 Gas 费,一旦部署就无法修改。建议在测试网完成全面测试后再部署到主网。
总结
通过本文的指导,您已经学会了如何创建和部署符合 ERC-721 标准的非同质化代币。从理解标准规范到实际部署,整个过程涵盖了 NFT 开发的关键步骤。记住始终在测试网充分测试后再部署到主网,以确保合约的安全性和功能性。
随着区块链技术的不断发展,NFT 的应用场景将会更加丰富。保持学习和技术更新,将帮助您在这个快速发展的领域中保持竞争力。