如何创建和部署 ERC-1155 NFT

  • QuickNode
  • 发布于 2024-03-06 14:48
  • 阅读 62

本文详细介绍了如何创建和部署 ERC-1155 代币标准,包括创建 NFT 集合、部署智能合约以及与 OpenSea 兼容的步骤。

重要通知

本指南包含对 Ropsten 测试网的引用,该测试网已不再积极维护。虽然与该链相关的具体步骤可能不再适用,但整体流程可能对其他链仍然有效。我们建议你探索当前的其他替代方案来实现你的项目。如果你希望看到本指南的更新版本,请告诉我们

概述

ERC1155 已成为创建 NFT 的黄金标准;每个主要市场都将新代币列为 ERC1155 标准。在本指南中,我们将了解 ERC1155 代币标准以及如何创建 ERC1155 代币。

我们将要完成的任务:

  1. 创建 3 个 NFT 集合

  2. 创建并部署一个 ERC-1155 合约

  3. 更新合约以兼容 OpenSea

  4. 部署我们的 NFT 集合

你需要准备的内容:

  • 用于创建 NFT 的图像素材
  • MetaMask 和一些 Ropsten 测试网 ETH。
  • ERC20ERC721 (NFT) 代币标准的了解。

什么是 ERC1155?

ERC1155 是一种多代币标准,允许在一个合约中创建可替代、不可替代和半可替代代币。在 ERC1155 之前,如果一个用例需要同时使用 ERC20(可替代)和 ERC721(不可替代)代币,则需要单独的合约来实现。ERC1155 还允许在一个智能合约中启动多个 NFT 集合,而不是为每个集合创建不同的合约;这提高了智能合约构建的效率,并减少了交易数量,这在消耗较少的区块链空间方面非常重要。与之前的代币标准相比,ERC1155 还支持批量代币转移,而不是将代币转移到单个地址。

ERC1155 应用的一个常见例子是基于区块链的去中心化游戏,因为游戏需要硬币和收藏品,因此 ERC1155 已成为该领域的标准。ERC1155 也已成为 NFT 领域的标准。

之前的 ERC721 将代币 ID 与地址进行一对一映射。ERC1155 的映射更为复杂,其中代币 ID 组合中的地址映射到代币的余额。

创建元数据 URI

我们将创建 3 个 NFT 集合(石头、剪刀、布),每个集合中包含一个 NFT。为了将我们的文件上传到去中心化存储 IPFS,我们可以通过 CLI 上传或使用这个非常易于使用的工具 NFT Storage

我们将使用第二个选项,NFT Storage。登录 NFT Storage 并上传你的石头、剪刀和布的图像文件。成功上传后,你应该会看到类似以下内容:

NFT Storage UI 显示已上传文件的表格。

点击“操作”并复制每个图像的 IPFS URL;我们将需要它来为每个集合创建元数据。

从 NFT Storage UI 复制 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

显示在网页上的石头集合的 JSON。

创建和部署 ERC1155 合约

我们将使用 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 的合约,并创建三个变量 RockPaperScissors;然后为每个变量分配适当的 id。

第 11-15 行:初始化构造函数,并将我们的 car 文件的链接作为参数传递,铸造不同的 NFT 集合,参数包括:

  • 代币将铸造到的地址,msg.sender 在这里表示合约的部署者。

  • 代币 id,我们已经为代币 id 分配了名称,因此在这里使用名称。

  • 每个代币的数量。

  • 最后是数据字段,这里保持为空。

编译合约,转到左侧菜单的第三个选项卡,选择 Injected Web3 作为环境,并通过选择适当的合约名称来部署它:

REMIX 窗口中的部署选项。

在 MetaMask 中批准交易。交易完成后,你的合约将被部署。

现在,你可以通过输入地址和代币 ID 来执行诸如获取代币余额之类的功能。我们还可以通过输入代币 ID 来检索代币的 URI。

REMIX 窗口中显示已部署的合约。

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 支持的格式。

REMIX 窗口中显示 OpenSea 兼容的 URI 输出。

结论

恭喜你成功部署了 ERC1155 代币。如果你已经做到了这里,那么你现在了解了 ERC1155 多代币标准以及如何创建和部署 ERC1155 NFT。

订阅我们的新闻通讯以获取更多关于以太坊的文章和指南。如果你有任何反馈,请随时通过Twitter与我们联系。你也可以在我们的Discord社区服务器中与我们聊天,那里有一些你会遇到的最酷的开发者 :)

  • 原文链接: quicknode.com/guides/eth...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
QuickNode
QuickNode
江湖只有他的大名,没有他的介绍。