如何在opensea批量发布NFT(Goerli测试网)

2023-11-12

一、生成NFT图象

hashlips_art_engine

HashLips Art Engine 是一种用于根据提供的图层创建多个不同的艺术作品实例的工具。

1.安装

npm install
or
yarn install
在这里插入图片描述

2.使用

在“layers”目录中创建不同的图层作为文件夹,并在这些目录中添加所有图层资源。 一旦你有了所有的层,进入 src/config.js 并更新 layerConfigurations 对象的 layersOrder 数组,按照从低层到顶层的顺序,使其成为你的层文件夹名称。

每个图层对象的name代表图像所在文件夹的名称(在 /layers/ 中)。
在这里插入图片描述
growEditionSizeTo:生成图像的个数。
更新format尺寸,即输出的图像尺寸。
shuffleLayerConfigurations默认为false,并将按数字顺序保存所有图像。若设置为为true,将混淆图像的保存顺序。
还可以通过向config.js文件中的extraMetadata对象变量添加额外的项(key: value)对来为每个元数据文件添加额外的元数据。

const extraMetadata = {
  creator: "Tiger",
};

调试脚本 package.json

"scripts": {
    "build": "node index.js",
    "generate": "node index.js",
    "rarity": "node utils/rarity.js",
    "preview": "node utils/preview.js",
    "pixelate": "node utils/pixelate.js",
    "update_info": "node utils/update_info.js",
    "preview_gif": "node utils/preview_gif.js",
    "generate_metadata": "node utils/generate_metadata.js"
  }

2.1 运行命令 node index.js(or npm run build) 输出的艺术品将在build/images目录中,而 json 在build/json目录中。

在这里插入图片描述

2.2 更新 IPFS 的 baseUri 和描述

src/config.js中的baseUri = “ipfs://NewUriToReplace”

// General metadata for Ethereum
const namePrefix = "My Collection";
const description = "Remember to replace this description";
const baseUri = "ipfs://QmZwo1rMdDMErLx6csTjLEzhm6WpYDjJwciNq3KUVdc4GX";

QmZwo1rMdDMErLx6csTjLEzhm6WpYDjJwciNq3KUVdc4GX是ipfs中images文件夹的CID。
执行命令:node utils/update_info.js or npm run update_info
在这里插入图片描述

2.3 生成预览图像

npm run preview

在这里插入图片描述

2.4 从集合中生成像素化图像

npm run pixelate

所有图像都将输出到/build/pixel_images目录中。如果要更改像素化的比率,则可以更新文件中pixelFormat对象的比率属性src/config.js。左边的数字越低,图像的像素化程度就越高。

const pixelFormat = {
  ratio: 5 / 128,
};

2.5 打印稀有数据

npm run rarity
Trait type: Bottom lid
{
  trait: 'High',
  weight: '20',
  occurrence: '26 in 100 editions (26.00 %)'
}
{
  trait: 'Low',
  weight: '40',
  occurrence: '33 in 100 editions (33.00 %)'
}
{
  trait: 'Middle',
  weight: '40',
  occurrence: '41 in 100 editions (41.00 %)'
}

二、图像上传至IPFS

1.安装IPFS后,选择导入,点击文件夹,选中images文件夹并上传。

在这里插入图片描述

2. 更新json信息

  1. 复制images文件夹的CID,粘贴至src/config.js中的baseUri中。
    在这里插入图片描述 3. 执行命令:node utils/update_info.js or npm run update_info

3.选择导入,点击文件夹,选中json文件夹并上传。

三、NFT智能合约

SimpleNft.sol

// SPDX-License-Identifier: MIT

// Amended by HashLips
/**
    !Disclaimer!
    These contracts have been used to create tutorials,
    and was created for the purpose to teach people
    how to create smart contracts on the blockchain.
    please review this code on your own before using any of
    the following code for production.
    HashLips will not be liable in any way if for the use 
    of the code. That being said, the code has been tested 
    to the best of the developers' knowledge to work as intended.
*/

pragma solidity >=0.7.0 <0.9.0;

import "@openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol";
import "@openzeppelin/contracts/access/Ownable.sol";

contract NFT is ERC721Enumerable, Ownable {
    using Strings for uint256;

    string baseURI;
    string public baseExtension = ".json";
    uint256 public cost = 0.00001 ether;
    uint256 public maxSupply = 10000;
    uint256 public maxMintAmount = 20;
    bool public paused = false;
    bool public revealed = false;
    string public notRevealedUri;

    constructor(
        string memory _name,
        string memory _symbol,
        string memory _initBaseURI,
        string memory _initNotRevealedUri
    ) ERC721(_name, _symbol) {
        setBaseURI(_initBaseURI);
        setNotRevealedURI(_initNotRevealedUri);
    }

    // internal
    function _baseURI() internal view virtual override returns (string memory) {
        return baseURI;
    }

    // public
    function mint(uint256 _mintAmount) public payable {
        uint256 supply = totalSupply();
        require(!paused);
        require(_mintAmount > 0);
        require(_mintAmount <= maxMintAmount);
        require(supply + _mintAmount <= maxSupply);

        if (msg.sender != owner()) {
            require(msg.value >= cost * _mintAmount);
        }

        for (uint256 i = 1; i <= _mintAmount; i++) {
            _safeMint(msg.sender, supply + i);
        }
    }

    function walletOfOwner(address _owner)
        public
        view
        returns (uint256[] memory)
    {
        uint256 ownerTokenCount = balanceOf(_owner);
        uint256[] memory tokenIds = new uint256[](ownerTokenCount);
        for (uint256 i; i < ownerTokenCount; i++) {
            tokenIds[i] = tokenOfOwnerByIndex(_owner, i);
        }
        return tokenIds;
    }

    function tokenURI(uint256 tokenId)
        public
        view
        virtual
        override
        returns (string memory)
    {
        require(
            _exists(tokenId),
            "ERC721Metadata: URI query for nonexistent token"
        );

        if (revealed == false) {
            return notRevealedUri;
        }

        string memory currentBaseURI = _baseURI();
        return
            bytes(currentBaseURI).length > 0
                ? string(
                    abi.encodePacked(
                        currentBaseURI,
                        tokenId.toString(),
                        baseExtension
                    )
                )
                : "";
    }

    //only owner
    function reveal() public onlyOwner {
        revealed = true;
    }

    function setCost(uint256 _newCost) public onlyOwner {
        cost = _newCost;
    }

    function setmaxMintAmount(uint256 _newmaxMintAmount) public onlyOwner {
        maxMintAmount = _newmaxMintAmount;
    }

    function setNotRevealedURI(string memory _notRevealedURI) public onlyOwner {
        notRevealedUri = _notRevealedURI;
    }

    function setBaseURI(string memory _newBaseURI) public onlyOwner {
        baseURI = _newBaseURI;
    }

    function setBaseExtension(string memory _newBaseExtension)
        public
        onlyOwner
    {
        baseExtension = _newBaseExtension;
    }

    function pause(bool _state) public onlyOwner {
        paused = _state;
    }

    function withdraw() public payable onlyOwner {
        // This will pay HashLips 5% of the initial sale.
        // You can remove this if you want, or keep it in to support HashLips and his channel.
        // =============================================================================
        (bool hs, ) = payable(0x7F4acD90047b121Ef8479ADC56F2379C0d359f70).call{
            value: (address(this).balance * 5) / 100
        }("");
        require(hs);
        // =============================================================================

        // This will payout the owner 95% of the contract balance.
        // Do not remove this otherwise you will not be able to withdraw the funds.
        // =============================================================================
        (bool os, ) = payable(owner()).call{value: address(this).balance}("");
        require(os);
        // =============================================================================
    }
}


构造函数

constructor(
    string memory _name,
    string memory _symbol,
    string memory _initBaseURI,
    string memory _initNotRevealedUri
  ) ERC721(_name, _symbol) {
    setBaseURI(_initBaseURI);
    setNotRevealedURI(_initNotRevealedUri);
  }

_name:NFT名字
_symbol:NFT符号
_initBaseURI:设置BaseURI
_initNotRevealedUri:设置不揭露URI的显示字段

在Remix上合约部署

1.打开Metamask

切换Goerli网络
在这里插入图片描述

2. remix选着执行环境

在这里插入图片描述

3. 部署合约传参

在这里插入图片描述
_initBaseURI:“ipfs://QmVAQetWCZcX187qGu7heW3uEmdgPeGQhbdsv3YQc6PTTW/”
QmVAQetWCZcX187qGu7heW3uEmdgPeGQhbdsv3YQc6PTTW 为json文件夹的CID。
_initNotRevealedUri: “Now, not reveraled”

已成功部署:https://goerli.etherscan.io/address/0x8140d4589633db201e7f007f186fe51f3c6e649e

3. 铸造nft

执行mint函数
在这里插入图片描述

获取tokenURI

1. 执行tokenURI()函数。

在这里插入图片描述
因为revealed默认为false,不显示tokenURI。

2. 执行reveal()函数,revealed更为true。

3. 再次执行tokenURI()函数。

在这里插入图片描述
此时tokenURI为揭露状态。

四、在opensea网站上导入智能合约

opensea已更新,自动识别并导入你部署的合约

1、若你部署的主网,打开链接,查看nft具体信息

2、若你部署的测试网,打开链接,查看nft具体信息

3、刚刚部署的合约在opensea 上的具体信息 eyes-nfts

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在opensea批量发布NFT(Goerli测试网) 的相关文章

  • 在 BSV 上构建机器学习竞赛市场

    我们提出了一种在 BSV 上实现去中心化机器学习 ML 市场的新方法 任何人都可以通过发布附带奖励的智能合约来外包机器学习任务 任何提交表现最佳模型的人都将通过区块链交易获得奖励 而无需通过中心化机构 如何在 BSV 上进行机器学习竞赛 K
  • 以太坊(ethereum)技术开发相关资料

    收集所有以太坊 ethereum 技术开发相关资料 INTRO 介绍 Started 入门 区块链技术指南 区块链领域比较系统的入门资料 什么是以太坊 什么是智能合约 以太坊智能合约入门概念 理解区块链 区块链关键要点讲解 一 简单易懂地介
  • ERC20智能合约-带销毁功能

    SPDX License Identifier MIT pragma solidity 0 8 0 dev Interface of the ERC20 standard as defined in the EIP interface IE
  • 区块链学习5:智能合约Smart contract原理及发展历程科普知识

    前往老猿Python博文目录 一 智能合约的定义 通俗来说 智能合约就是一种在计算机系统上 当一定条件满足的情况下可被自动执行的合约 智能合约体现为一段代码及其运行环境 例如银行信用卡的自动还款就是一种典型的智能合约 我们来看看智能合约概念
  • EOS智能合约安全开发终极指南

    EOS智能合约安全终极指南 当世界上最大的ICO EOS于2018年6月推出时 加密社区变得持怀疑态度 并且由于软件错误而被冻结了2天 但快进4个月 EOS今天占了以太网今天所做交易的两倍以上 通过免费和更快速交易的承诺 EOS最顶级的Da
  • Go语言实现区块链与加密货币-Part3(交易优化,单机模拟多节点通信)

    交易 二 在这个系列文章的一开始 我们就提到了 区块链是一个分布式数据库 不过在之前的文章中 我们选择性地跳过了 分布式 这个部分 而是将注意力都放到了 数据库 部分 到目前为止 我们几乎已经实现了一个区块链数据库的所有元素 今天 我们将会
  • 基础的定义必须先于派生合约的定义

    我有两个不同的文件 即 Project1 sol 和 Project2 sol Project2 sol 就像 import Project1 sol contract Project2 address newProject1Address
  • 调试发送程序指令时“事务模拟失败”(Solana Solidity)

    当尝试调用编译的程序时 solana solidity 我收到以下错误 Transaction simulation failed Error processing Instruction 0 Program failed to compl
  • Solidity 中的动态数组

    我想声明一个简单的数组 动态列表 一个set函数推入一个字符串和一个get函数返回动态数组中保存的所有字符串 我搜索了很多但找不到这个简单的东西 这是我的解决方案 你需要experimental ABIEncoderV2返回字符串数组 pr
  • 指定的输入源无效

    使用 remix IDE 构建智能合约时 通过以下导入收到无效的输入源指定错误 import https github com aave flashloan box blob Remix contracts aave FlashLoanRe
  • Hedera 上几乎相同的交易中“gasUsed”值存在巨大差异 - 为什么?

    我注意到所使用的气体量之间存在差异 通过交易几乎是相同的 我正在调用智能合约 连续两次使用相同的参数 两者之间的唯一区别 是我正在设置gasLimit到精确值 由返回eth estimateGas在第一个中 我正在设置gasLimit to
  • 恢复发送至自部署合约的BNB

    我正在尝试创建 BOT 因此在 BSC 中从 eatamask 创建并部署了一个合约 我向该合约发送了一些 BNB 来检查 但没有成功 我怎样才能拿回BNB 感谢帮助 因为我对此很陌生 除非您在合约中具有允许您提取资金的自定义功能 否则它们
  • 如何删除solidity中的数组项

    我正在尝试删除 Solidity 数组中的某个项目 我正在探索一些文章 https ethereum stackexchange com questions 1527 how to delete an element at a certai
  • 如何使用 Solidity 和 Web.js 在以太坊区块链上保存和检索数据

    下面的代码仅返回收据 但我希望它返回一个数据元组 如下面的合同所示 我如何让它返回数据 我找不到关于如何保存和检索数据的好教程 我知道这是一个昂贵的用例 我只是想做一个基本的概念证明并同时学习 我在用着 电子邮件受保护 cdn cgi l
  • Solidity有HTTP请求功能吗?

    我正在使用以太坊制作一个项目 在这个项目中 我正在签订一份名为 A 的合同 当我向 A 发送消息时 我希望 A 发出网络请求 Solidity 是否可以使用 http 请求 方法 GET POST 以太坊区块链无法与外界交互 否则它将不再是
  • ERC20:津贴不足

    我创建了两个代币 YAY e sYAY 和一个 StakeRewards 智能合约 代码如下 SPDX License Identifier MIT pragma solidity 0 8 0 import openzeppelin con
  • Solidity 中的地址(0)是什么

    谁能向我解释一下什么address 0 是在 Solidity 中吗 我在文档中找到了以下内容 但对我来说并没有真正意义 如果目标账户是零账户 地址为0的账户 则交易创建一个新合约 如前所述 该合约的地址不是零地址 而是从发送方及其发送的交
  • 如何导入 AggregatorV3Interface

    我正在尝试导入 AggregatorV3 但找不到该文件 这是我的代码 提前抱歉 我仍然是一名初学者程序员 SPDX License Identifier MIT pragma solidity 0 8 9 import chainlink
  • 断言和要求之间的区别

    您好 我最近刚刚开始从 Udemy 学习 Solidity 尽管在几乎完成课程后我还没有理解 assert 和 require 之间的区别 当不满足要求时 它们不是都会破坏功能吗 在合约内的 Gas 优化方面 两者相比是否有优势 来自文档
  • 以太坊 Remix:所需 Gas 超出限额(30000000)问题

    我正在尝试在 BSC 测试网上部署智能合约 但 Remix IDE 向我抛出以下错误 我的 Metamask BinanceSmartChain 测试网钱包中有超过 3 个 BMB 创建 ContractName 时出错 内部 JSON R

随机推荐

  • Linux防火墙

    安全防御 常见的攻击手段 拒绝服务 已知漏洞 口令破解 欺骗用户 常见的安全防御设备 基础类防火墙 IDS类 入侵检测系统 提供报告 事后分析 IPS类 入侵防御系统 针对数据包分析 根据模式匹配 阻断非法访问 主动安全类 什么是防火墙 工
  • 这篇文章带你读懂IP地址

    这篇文章带你读懂IP地址 一 IP地址介绍 二 IP地址分类及表示 三 IP地址的主要特点 四 特殊IP地址及私有IP地址 一 IP地址介绍 IP地址 全世界唯一的32位 4字节标识符 标识路由器主机的接口 IP地址 lt 网络号 gt l
  • 【Git CMD】Git上传本地代码到远程仓库(6步到位)

    步骤 1 创建指定名称的分支并切换至该分支 2 添加文件到暂存区 3 查看本地仓库和暂存区的状态 4 提交文件到本地仓库 5 查看本地仓库提交的历史 6 将本地当前分支推送到与本地当前分支同名的远程分支 1 创建指定名称的分支并切换至该分支
  • 学习PGL课程:图卷积网络GCN、图注意力网络GAT

    一 GCN 什么是图卷积 不同的地方在于 图像像素点周围的像素个数通常是固定的 而图结构上某个节点周围的节点数是不固定的 图卷积网络计算公式 1 邻接矩阵解释 2 度矩阵 表示节点与之相连节点的个数 包括自环 3 H l 表示第l次迭代的节
  • 具体项目下解决Echarts多端同步开发和维护的问题

    具体问题场景 PC端和移动端需要同时上线图表功能 没有多余工时 之后的版本迭代 功能 样式 配置等 默认双端同步 开发人员只希望维护一套代码 Echarts在移动端有部分功能不兼容不支持 Echarts在移动端的坑 移动端页面使用echar
  • Raspberry Pi使用TinyML运动识别

    我们将使用机器学习来构建在微型微控制器RP2040上运行的手势识别系统 探索Raspberry Pi Pico及其SDK Raspberry Pi Pico是具有灵活数字接口的低成本 高性能微控制器板 主要功能包括 Raspberry Pi
  • C11 : 函数模板 std::function

    目录 std function 定义 实现原理 应用 注意事项 std function 定义 类模板 std function 是一种通用的 多态的函数封装 std function 的实例可以对任何可以调用的目标实体进行存储 复制和调用
  • react hooks无法获取到最新值问题

    无法获取最新值的写法 在state中定义初始值 import React useState useEffect from react const type setType useState 0 通过setType方法修改type div s
  • 字符替换 英文字符串单词个数统计 python123题解

    字符替换 描述 假设有段英文 其中有单独字母 P 被误写为 p 请编写程序进行纠正 输入格式 用户输入一个字符串 不要使用提示词语 输出格式 程序输出字符串 其中原本包含的英文字母 p 全部被替换为 P 输入输出示例 输入 输出 示例 py
  • MYSQL常用字段属性

    MYSQL常用字段属性 1 DECIMAL M D 2 INT 3 VARCHAR 4 CHAR 5 TEXT 6 DATA 1 DECIMAL M D M是总位数 1 65 包含精度 D是小数位 0 30 当表示定点小数时使用类型 比fl
  • PostgreSQL配置优化

    转载请注明原文出处 http blog csdn net roddick621 PostgreSQL配置优化 PostgreSQL配置优化 硬件和系统配置 测试工具 配置文件 主要选项 测试数据 总结 硬件和系统配置 操作系统 Ubuntu
  • GVIM编辑器实现自定义配对关键字之间的跳转

    由于刚开始接触GVIM编辑器 在使用GVIM写Verilog代码的时候发现使用 命令可以实现配对括号之间的跳转 但其它的一些关键字之间却不能实现配对跳转 从而导致在代码量较大的时候常常会出现配对关键字多写或漏写的情况 很不方便 网上查阅了相
  • MMDetection新手安装使用教程(无限踩坑)

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 前言 一 MMDetection安装过程 1 torch torchvision的安装 2 mmdetection的安装 二 MMDetection的使用步骤 1
  • c++中的新成员——new,命名空间

    c 中的动态内存分配 优点 使用更加的方便 解决了c中有很时候没有库文件时不能申请堆内存的情况 使用 c 中是通过new关键字来进行内存空间的申请的 c 中动态内存是基于类型进行的 delete关键字用于释放 new在申请的时候可以进行初始
  • opentsdb+grafana监控环境搭建

    opentsdb是在hbase的基础上设计的时间序列数据库 安装opentsdb必须先有hbase hadoop和hbase是以集群的方式安装 如果在单台服务器上安装 下面的配置文件也是适合的 只要把相应的服务器名移除掉就可以 grafan
  • MAC地址会耗尽吗?

    有可能会耗尽 虽然目前离耗尽的日子还很远 先基本解释一下MAC地址的特点 虽然MAC地址有48位 但并非48位都是可以随便用的 就像IPv4虽然有32位 但也不是所有组合都可以使用一样 MAC地址第一字节的最低2位 bit 是标示地址类型的
  • 11.神经网络与机器学习(十)—卷积神经网络(CNN)

    1 引言 我们之前的神经网络结构都是全连接的 也就是说 每一个输入神经元的都和相邻层的每一个神经元连接 但是这种连接带来的数据量太大了 以我们之前的一个三层神经元举例 784 30 10 从输入层到隐藏层有 784 1 30 23550个参
  • 从零开始学HTML+CSS

    本文是基于b站黑马程序员的视频教程 然后总结自己的心得写的 只是自己的个人总结 如有错误 敬请指正 基于此链接最新前端开发入门教程 web前端零基础html5 css3 前端项目视频教程 哔哩哔哩 bilibili最新的web前端html5
  • python面向对象编程高级篇之枚举类Enum

    我们可以定义月份 比如 from enum import Enum Month Enum Month Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec for name member in Mo
  • 如何在opensea批量发布NFT(Goerli测试网)

    一 生成NFT图象 hashlips art engine HashLips Art Engine 是一种用于根据提供的图层创建多个不同的艺术作品实例的工具 1 安装 npm install or yarn install 2 使用 在 l