本文详细介绍了如何创建和部署 ERC-1155 代币标准,包括创建 NFT 集合、部署智能合约以及与 OpenSea 兼容的步骤。
重要通知
本指南包含对 Ropsten 测试网的引用,该测试网已不再积极维护。虽然与该链相关的具体步骤可能不再适用,但整体流程可能对其他链仍然有效。我们建议你探索当前的其他替代方案来实现你的项目。如果你希望看到本指南的更新版本,请告诉我们!
ERC1155 已成为创建 NFT 的黄金标准;每个主要市场都将新代币列为 ERC1155 标准。在本指南中,我们将了解 ERC1155 代币标准以及如何创建 ERC1155 代币。
我们将要完成的任务:
创建 3 个 NFT 集合
创建并部署一个 ERC-1155 合约
更新合约以兼容 OpenSea
部署我们的 NFT 集合
你需要准备的内容:
ERC1155 是一种多代币标准,允许在一个合约中创建可替代、不可替代和半可替代代币。在 ERC1155 之前,如果一个用例需要同时使用 ERC20(可替代)和 ERC721(不可替代)代币,则需要单独的合约来实现。ERC1155 还允许在一个智能合约中启动多个 NFT 集合,而不是为每个集合创建不同的合约;这提高了智能合约构建的效率,并减少了交易数量,这在消耗较少的区块链空间方面非常重要。与之前的代币标准相比,ERC1155 还支持批量代币转移,而不是将代币转移到单个地址。
ERC1155 应用的一个常见例子是基于区块链的去中心化游戏,因为游戏需要硬币和收藏品,因此 ERC1155 已成为该领域的标准。ERC1155 也已成为 NFT 领域的标准。
之前的 ERC721 将代币 ID 与地址进行一对一映射。ERC1155 的映射更为复杂,其中代币 ID 组合中的地址映射到代币的余额。
我们将创建 3 个 NFT 集合(石头、剪刀、布),每个集合中包含一个 NFT。为了将我们的文件上传到去中心化存储 IPFS,我们可以通过 CLI 上传或使用这个非常易于使用的工具 NFT Storage。
我们将使用第二个选项,NFT Storage。登录 NFT Storage 并上传你的石头、剪刀和布的图像文件。成功上传后,你应该会看到类似以下内容:
点击“操作”并复制每个图像的 IPFS URL;我们将需要它来为每个集合创建元数据。
我们将创建三个 JSON 元数据文件来存储有关我们的 NFT 集合的信息。
1.json: 石头集合
2.json: 布集合
3.json: 剪刀集合
我们的 1.json 文件将如下所示:
{ //1.
"name": "Rocks",
"description": "This is a collection of Rock NFTs.",
"image": "https://ipfs.io/ipfs/bafkreifvhjdf6ve4jfv6qytqtux5nd4nwnelioeiqx5x2ez5yrgrzk7ypi",
}
name: NFT 的名称。
description: NFT 的描述。
image: 我们之前获取的图像链接(IPFS URL)。
如果集合中有多个图像(通常情况如此),则添加额外的参数 id 以区分集合中的代币。
分别为布和剪刀集合创建剩余的 JSON 文件 2.json 和 3.json。
为了有效地将所有 JSON 文件上传到 IPFS,我们将以内容寻址格式归档它们。https://car.ipfs.io/ 帮助将文件归档为 IPFS 兼容的内容寻址归档 (.car) 格式。
前往 IPFS CAR 并上传所有三个 JSON 文件。上传后,下载 .car 文件并将其上传到 NFT Storage。现在,我们所有的 JSON 文件都以归档方式存储在 IPFS 上。复制上传的 .car 文件的 IPFS URL,你应该能够通过在 URL 末尾输入文件名来访问 JSON 文件,例如:
https://ipfs.io/ipfs/bafybeihjjkwdrxxjnuwevlqtqmh3iegcadc32sio4wmo7bv2gbf34qs34a/1.json
我们将使用 OpenZeppelin 合约库创建我们的 ERC1155 合约,并使用 Ethereum REMIX IDE 在 Ropsten 测试网上部署它。确保你有一些 Ropsten 测试网 ETH,你也可以从 Ropsten Faucet 获取。
在 REMIX 中创建一个新文件 token.sol,并将以下代码粘贴到其中。
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "@openzeppelin/contracts/token/ERC1155/ERC1155.sol";
contract rockPaperScissors is ERC1155 {
uint256 public constant Rock = 1;
uint256 public constant Paper = 2;
uint256 public constant Scissors = 3;
constructor() ERC1155("https://ipfs.io/ipfs/bafybeihjjkwdrxxjnuwevlqtqmh3iegcadc32sio4wmo7bv2gbf34qs34a/{id}.json") {
_mint(msg.sender, Rock, 1, "");
_mint(msg.sender, Paper, 1, "");
_mint(msg.sender, Scissors, 1, "");
}
}
对上述代码的解释:
第 1 行:指定 SPDX 许可证 类型,这是在 Solidity ^0.6.8 之后添加的。每当智能合约的源代码向公众提供时,这些许可证可以帮助解决/避免版权问题。如果你不希望指定任何许可证类型,你可以使用特殊值 UNLICENSED 或直接跳过整个注释(它不会导致错误,只会发出警告)。
第 2 行:声明 Solidity 版本。
第 4 行:导入 OpenZeppelin ERC1155 合约。
第 6-9 行:创建名为 rockPaperScissors 的合约,并创建三个变量 Rock、Paper 和 Scissors;然后为每个变量分配适当的 id。
第 11-15 行:初始化构造函数,并将我们的 car 文件的链接作为参数传递,铸造不同的 NFT 集合,参数包括:
代币将铸造到的地址,msg.sender 在这里表示合约的部署者。
代币 id,我们已经为代币 id 分配了名称,因此在这里使用名称。
每个代币的数量。
最后是数据字段,这里保持为空。
编译合约,转到左侧菜单的第三个选项卡,选择 Injected Web3 作为环境,并通过选择适当的合约名称来部署它:
在 MetaMask 中批准交易。交易完成后,你的合约将被部署。
现在,你可以通过输入地址和代币 ID 来执行诸如获取代币余额之类的功能。我们还可以通过输入代币 ID 来检索代币的 URI。
OpenSea 不支持返回的 URI 格式。因此,我们需要重写 URI 函数以返回文件名作为字符串:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "@openzeppelin/contracts/token/ERC1155/ERC1155.sol";
import "@openzeppelin/contracts/utils/Strings.sol";
contract rockPaperScissors is ERC1155 {
uint256 public constant Rock = 1;
uint256 public constant Paper = 2;
uint256 public constant Scissors = 3;
constructor() ERC1155("https://ipfs.io/ipfs bafybeihjjkwdrxxjnuwevlqtqmh3iegcadc32sio4wmo7bv2gbf34qs34a/{id}.json") {
_mint(msg.sender, Rock, 1, "");
_mint(msg.sender, Paper, 1, "");
_mint(msg.sender, Scissors, 1, "");
}
function uri(uint256 _tokenid) override public pure returns (string memory) {
return string(
abi.encodePacked(
"https://ipfs.io/ipfs/bafybeihjjkwdrxxjnuwevlqtqmh3iegcadc32sio4wmo7bv2gbf34qs34a/",
Strings.toString(_tokenid),".json"
)
);
}
}
新增内容:
第 5 行:导入 OpenZeppelin 合约以将整数转换为字符串。
第 18-25 行:通过创建自定义 URI 函数并转换代币 ID 从整数到字符串,然后返回完整的 URI,来重写 URI 函数。
重新编译合约并部署它。现在,当你查询合约的 URI 时,它将返回 OpenSea 支持的格式。
恭喜你成功部署了 ERC1155 代币。如果你已经做到了这里,那么你现在了解了 ERC1155 多代币标准以及如何创建和部署 ERC1155 NFT。
订阅我们的新闻通讯以获取更多关于以太坊的文章和指南。如果你有任何反馈,请随时通过Twitter与我们联系。你也可以在我们的Discord社区服务器中与我们聊天,那里有一些你会遇到的最酷的开发者 :)
- 原文链接: quicknode.com/guides/eth...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!