概述
自 Cryptokitties[1] 推出以来,兼容 ERC-721 标准的加密收藏品已经非常流行,并在最近几个月向大规模采用的方向发展。本指南将涵盖使用 0xcert/ethereum-erc721[2] 智能合约库创建和部署我们自己的 ERC-721 (NFT)。
什么是非同质化(Non-Fungible)代币?
同质化是指相同或可互换的意思。例如,以太坊代币、特定代币类的所有币,都具有相同的价值。Cardano 代币也是如此。同质化代币可 1:1 互换。
而 NFT 是独一无二的,每个人都是不同的。每一个代币都有独特的特点和价值。可以成为 NFT 的东西类型有收藏卡、艺术品、飞机票等。它们之间都有明显的区别,不能互换。将非同质化代币(NFT)视为稀有的收藏品;每个代币都有独特的特征,不寻常的属性,大多数时候,它利用元数据表示。
什么是 ERC-721?
ERC 是以太坊建议请求(Ethereum Request for Comment)的缩写,721 是提案编号。ERC 是以太坊生态系统中的应用级标准,它们可以是代币的智能合约标准,如 ERC-20[3],ERC 的作者负责与以太坊社区建立共识,一旦提案被社区审核通过,就会成为标准。你可以跟踪最近的 ERC 提案这里 [4]。ERC-721 的创建是为了提出在智能合约内跟踪和转移 NFT 的功能。
ERC-721[5] 是一个开放的标准,它描述了如何在 EVM(以太坊虚拟机) 兼容的区块链上构建非同质化代币;它是非同质化代币的标准接口;这是一套规则,使其易于与 NFT 交互。NFT 不仅是 ERC-721 代币,还可以是 ERC-1155[6] 代币。
以下是 ERC-721 标准中定义的一组函数和事件:ERC-721 定义了一些符合 ERC-20 的函数。这使得现有钱包更容易显示简单的代币信息:
ERC20 类函数:
-
name: 用于定义代币的名称。
-
symbol: 用于定义标记代币的符号。
-
totalSupply: 这个函数用来定义区块链上的代币总数,供应量不必是恒定的。
-
balanceOf: 返回一个地址拥有的 NFT 数量。
Ownership 函数
本函数返回代币所有者的地址。由于每个 ERC-721 代币都是独一无二的,非同质化的,它们在区块链上由一个 ID 来表示。其他用户、合约、应用可以使用这个 ID 来确定代币的所有者。
-
approve: 此函数批准另一个实体代表所有者转让代币的权限。
-
takeOwnership: 这是一个可选的函数,它的作用就像一个取款函数,因为外界可以调用它从另一个用户的账户中取出代币。当一个用户被批准拥有一定数量的代币,可以使用 takeOwnership。
-
transfer: 这是另一个转移函数;它允许所有者将代币转让给另一个用户,就像加密货币一样。
-
tokenOfOwnerByIndex: 这是一个可选的函数,但建议使用。每个所有者可以同时拥有一个以上的 NFT。其独特的 ID 可以识别每一个 NFT,结果可能会变得难以跟踪 ID。所以合约将这些 ID 存储在一个数组中,tokenOfOwnerByIndex 函数让我们从数组中检索这些信息。
元数据
tokenMetadata: (可选) 一个接口,让我们可以发现代币的元数据或其数据的链接。
事件
-
Transfer :当代币的所有权从一个人变为另一个人时,该事件被触发。发出的信息包括哪个账户转移了代币,哪个账户收到了代币,以及哪个代币(通过 ID)被转移。
-
Approve: 当用户批准另一个用户获得代币的所有权时,该事件就会被触发,也就是说,每当 approve 函数被执行时,该事件就会被触发。它发出的信息包括:当前哪个账户拥有该代币,哪个账户被批准在未来拥有该代币,以及哪个代币(通过 ID)被批准转让其所有权。
非同质化代币的使用场景
数字艺术 (或实物艺术): 艺术作品是 NFT 最受欢迎的使用案例。数字艺术拍卖是 NFT 的第一个应用,并且还在继续发展。 游戏: 提供游戏内购和游戏收藏。 房地产: 将房产和智能合约 Token 化,并进行买卖。 金融: 贷款、期货等金融工具,并承担其他责任。 软件标题: 软件授权,确保反盗版和隐私。 演唱会门票 / 体育比赛门票: 为了保证在卖票过程中不发生欺诈行为,粉丝可以在一个地方查看以往的经历。 KYC 合规性: 为特定用户的 KYC 创建代币。
获得测试 ETH
现在我们知道了什么是 ERC-721 代币以及它们是如何工作的,让我们看看如何构建和部署自己的代币。
我们将在 Ropsten 测试网上部署合约。开始前,你需要安装 Metamask[7] 浏览器扩展来创建一个 ETH 钱包和获取一些测试 ETH,你可以通过进入 Ropsten 水龙头 [8] 来获得。你需要在 Metamask 钱包上选择 Ropsten 测试网络,并将自己的钱包地址复制粘贴到水龙头中的文本字段中,然后点击“Send me test Ether”。
图片
将文件添加到 IPFS
在写 NFT 合约之前,我们需要托管好 NFT 所对应的艺术作品,并创建一个元数据文件;为此,我们将使用 IPFS[9]--一个点对点文件存储和共享的分布式系统。按照 IPFS 文档中的安装指南 [10] 下载并安装基于你的操作系统的 IPFS CLI。
以下是托管图像和元数据文件的步骤:
步骤 1 :创建 IPFS repo。在终端窗口中输入以下内容来初始化 IPFS repo
$ ipfs init
步骤 2 :启动 IPFS 守护进程。打开一个单独的终端窗口,输入以下内容:
$ ipfs daemon
步骤 3 :添加图像到 IPFS , 进入第一个终端窗口,将图像添加到 IPFS 中(这里是 art.png)。
$ ipfs add art.png
艺术
复制从 Qm 开始的哈希值,并添加
https://ipfs.io/ipfs/
前缀,它必须看起来像这样
https://ipfs.io/ipfs/QmdrswwrbcfPeknN2BRLVmyWbWRsKSC3vSNhV9Gkvhk1mL
。
步骤 4 : 向 IPFS 添加 JSON 文件。创建一个 JSON 文件 nft.json,并将其保存在与图像相同的目录中。JSON 文件格式:
{ "name": "NFT Art", "description": "This image shows the true nature of NFT.", "image": "https://ipfs.io/ipfs/QmZzBdKF7sQX1Q49CQGmreuZHxt9sVB3hTc3TTXYcVZ7jC", }
现在添加 JSON 文件:
$ ipfs add nft.json
复制从 Qm 开始的哈希值,并添加
https://ipfs.io/ipfs/
前缀,它必须看起来像这样
https://ipfs.io/ipfs/QmWKqwMJQHSfpfRFGUVGPFFtkBJ5WkFzhjQpruhSLtLWXB
, 保存这个网址。我们需要这个来铸造 NFT。
创建我们自己的代币。
为了方便和安全,我们将使用 0xcert/ethereum-erc721[11] 合约来创建我们的 NFT 合约。有了 0xcert/ethereum-erc721,我们不需要写整个 ERC-721 接口。相反,我们可以导入库合约并使用它的函数。前往以太坊 Remix[12] IDE,制作一个新的 Solidity 文件,例如 nft.sol, 将以下代码粘贴到 Solidity 文件中。
// SPDX-License-Identifier: MIT pragma solidity 0.8.0; import "https://github.com/0xcert/ethereum-erc721/hide/contracts/tokens/nf-token-metadata.sol"; import "https://github.com/0xcert/ethereum-erc721/hide/contracts/ownership/ownable.sol"; contract newNFT is NFTokenMetadata, Ownable { constructor() { nftName = "Synth NFT"; nftSymbol = "SYN"; } function mint(address_to, uint256_tokenId, string calldata_uri) external onlyOwner { super._mint(_to,_tokenId); super._setTokenUri(_tokenId,_uri); } }
以下是代码的解释:
第 1 行:指定 SPDX 许可证 [13] 类型,这是在 Solidity ^0.6.8 之后增加的。每当智能合约的源代码向公众开放时,这些许可证可以帮助解决 / 避免版权问题。如果你不想指定任何许可证类型,你可以使用一个特殊的值 UNLICENSED,或者直接跳过整个注释(它不会导致错误,只是一个警告)。
第 2 行:声明 Solidity 版本。
第 4-5 行:导入 0xcert/ethereum-erc721 合约。
第 7 行:合约命名为 newNFT,它继承了 NFTokenMetadata 和 Ownable 合约。
第 9-12 行:初始化构造函数并设置名称及代币符号。
第 14 行:声明函数 mint 有三个参数,类型为地址的变量_to,存储 NFT 代币接收者的地址,类型为 uint256 的变量_tokenId,将保存代币 id,类型为字符串的变量_uri,将存储 JSON 文件的 URI。将 mint 声明为外部函数,可以从其他智能合约和当前合约之外访问。
第 15 行:使用接收方的地址和代币 ID 来铸造代币。
第 16 行:使用代币 id 和 JSON 文件的 URI 设置代币 URI。
编译智能合约,并使用_Injected Web3_进行部署 (编译合约前一定要在 Metamask 上选择 Ropsten testnet)。批准来 metamask 的交易。
remix
如果你在部署前收到一条错误消息:
此合约可能是抽象的
,请确保在合约选项卡下选择适当的合约。在 Metamask 中确认交易。
metamask
现在进入 Remix 中的
Deployed Contracts (部署的合约)
部分,展开部署的合约。你会看到一堆函数 / 方法。展开 mint 函数并添加以下参数 :
-
在_to 中添加你的 Ropsten 地址。
-
在_tokenid 中输入任何数字值 (建议为 1,因为它是第一个)。
-
在_uri 字段中,添加上一节获得的 JSON 文件的 URI。
img
点击交易,并从 metamask 确认交易。(需要你已经有了 Ropsten 链上的 ETH)
你可以通过输入我们之前提到的 token id 来查看其他细节,如名称、符号、所有者或 tokenuri。
nft 信息
结论
恭喜你创建了自己的 NFT,帮助你的艺术家朋友把他们的艺术作品发布到以太坊区块链上,或者自己也成为一名艺术家。查看 0xcert/ethereum-erc721 的 GitHub[14] 获取更多例子。
原文: https://www.quiknode.io/guides/solidity/how-to-create-and-deploy-an-erc-721-nft
参考资料
[1]
Cryptokitties: https://www.cryptokitties.co/
[2]
0xcert/ethereum-erc721: https://github.com/0xcert/ethereum-erc721
[3]
ERC-20: https://www.quiknode.io/guides/solidity/how-to-create-and-deploy-an-erc20-token
[4]
这里 : https://github.com/ethereum/EIPs/issues
[5]
ERC-721: https://eips.ethereum.org/EIPS/eip-721
[6]
ERC-1155: https://eips.ethereum.org/EIPS/eip-1155
[7]
Metamask: https://metamask.io/
[8]
Ropsten 水龙头 : https://faucet.ropsten.be/
[9]
IPFS: https://learnblockchain.cn/tags/IPFS
[10]
IPFS 文档中的安装指南 : https://ipfs.io/#install
[11]
0xcert/ethereum-erc721: https://github.com/0xcert/ethereum-erc721
[12]
以太坊 Remix: https://remix.ethereum.org/
[13]
SPDX 许可证 : https://spdx.org/licenses/
[14]
0xcert/ethereum-erc721 的 GitHub: https://github.com/0xcert/ethereum-erc721