在 Arweave 中轻松管理文件:借助 4EVERLAND 完成 Web3 前端Path Manifests的终极指南

为什么使用Path Manifests?

当在 IPFS 上发布 NFT 时,图片和元数据会被上传到 IPFS 网络以获得一个根 CID,其形式如下:

ipfs://bafybeic36ik6cngu37xbzmpytuvyo7z3lyeen44clkkxq5d263zj4nkzr4

通过使用这个根 CID,每个 NFT 的图片路径可以按照 root cid/'file name的格式来定义。例如,一个 NFT 的元数据中的图片路径可能如下所示:

ipfs://bafybeie7byrnb3vo2lc2lwaqm5lox6jiow5ntzod3aoquki36gtirdhodm/0.png

同样的,如果我们想在Arweave 上发布NFT,可以使用 Path Manifets 来集合NFT,这样也可以通过路径方式来访问NFT.

例如

https://arweave.net/Bgw5-GwpymUoe5VMeb-No9WWXpjWsq_8g4oeiGP5RnA/0.png

而不是通过每一张图片在 arweave 上的 ID 来访问它:

​​​​​​https://arweave.net/ISvPQyG8qWzJ1Pv5em5xK8Ht38HZ3ub1fPHbFEqDPK0

如何创建NFT

下面讲解如何使用 4EVERLAND Bucket + Path Manifests 将NFT文件存储到Arweave网络中。

创建Bucket并上传NFT 文件

首先,需要在4everland dashboard 创建一个bucket 并开启Sync to AR 按钮

然后,在Bucket中将您的nft文件夹上传,获取所有nft的TxID,除了在dashboard中手动操作外,您也可以使用 S3 Compatible API 上传获取。

Init S3 client

// initS3Client.js
import { S3 } from '@aws-sdk/client-s3'
export const client = new S3({endpoint: 'https://endpoint.4everland.co',credentials:{accessKeyId: '',secretAccessKey: '',sessionToken: '',},forcePathStyle: false,region: 'eu-west-2'
})

 批量上传NFT:
 

import { Upload } from '@aws-sdk/lib-storage'
import { clinet } from './initS3Client.js'
let files = [] //  File Arrary
let Bucket = 'NFT_Bucket'
files.forEach(aysnc(file) => {try{const task = new Upload({client,Bucket,Key: 'YOUR_folder' + '/' + file.name,Body: file,ContentType: file.type})await task.done()}catch(error){console.log(error)}
})// 同步到AR需要时间,可以等待几分钟后,获取 AR Hash(Tx ID) list:let arHashPath = {}
files.forEach(aysnc(file) => {try{const data = await client.headObject({Bucket,Key: 'YOUR_folder' + '/' + file.name,})const meta = data.Metadata;arHashPath[file.name] = {id: meta["arweave-hash"] ?? ''}}catch(error){console.log(error)}
})

生成图片的Manifests ID

获取到每张NFT的TxID后,按照Path Manifests 标准集合成如下json文件,标准详情可以参考官方说明

//manifest-files.json 
{"manifest": "arweave/paths","version": "0.1.0","paths": {"01.jpeg": {"id": "ItVxP8RILEsBjTObeO_piBUME31mj9fa8XJ00v_A94o"},"02.jpeg": {"id": "eiCwWO60Qd8J6wz1ndB82jNgSDotAC8peN38ZAVonl4"},"03.jpeg": {"id": "YUHwbOdf2sSKdGps03qH9LJHX4caYKM5_BOdBpMXOxc"},"04.jpeg": {"id": "kD8Eft7JP82_u9whX710vzsSntn_WP07TgrSB2bGEso"},"05.jpeg": {"id": "KSeYJwZORk3BzelAazsmd6laGAAugHPMqHoXTZ0V4BE"}}
}

然后将此manifest-files.json文件也上传到bucket,需要规定 Content-Type tag 为 application/x.arweave-manifest+json,获取此文件的ArHash 作为图片的 Manifest ID


let manifestFile = {manifest: 'arweave/paths',version: '0.1.0',paths: arHashPath
}let blob = new Blob([JSON.stringify(manifestFile)], {type: "application/json",
});
async function upload(){try{const task = new Upload({client,Bucket,Key: 'YOUR_folder' + '/' + 'manifest-files.json',Body: blob,ContentType: 'application/x.arweave-manifest+json'})await task.done()}catch(error){console.log(error)}
}
// 上传
await upload()async function getMainfestArHash(){try{const data = await client.headObject({Bucket,Key: 'YOUR_folder' + '/' + 'manifest-files.json',})const meta = data.Metadata;if (meta) {return meta["arweave-hash"];}return "";}catch(error){console.log(error)}
}
// 同步到AR需要时间,可以等待几分钟后执行
const arHash =  await getMainfestArHash()
console.log(arHash)

获取到TxID 为 udKzWCDO2PFvxHjiTRhNXuDslsE4jiKlu9A2gY1b1WE

小窍门:如果你的图片很多,可以巧用4EVERLAND Hosting 模块来生成manifest ID。

  1. 在bucket中选中您的NFT 文件夹,点击‘Snapshot'并切换到snapshot列表对文件夹进行publish。

  2. 复制snapshot中的ipfs cid,进入hosting页面,在‘IPFS Deploy'中输入CID部署

  3. 部署平台选择'Arweave',部署成功后的AR Hash 便是这些图片的ManifestID

使用Manifests ID 为每张NFT 创建metadata

为每张nft生成metadata.json,以01.jpeg为例,如下

//文件名:0
{"name": "nft-ocean","attributes": [{"trait_type": "tokenID","value": "0"}],"description": "nft-ocean image",//填入图片的ManifestID + '/'+文件名 "image": "ar://QmZ3Y31SwLU77CDfBoL5MphuSmrv414d2ZyunVcbNAJQRQ/01.jpeg"
}

参考上面上传图片的步骤,将每张nft的metadata.json文件以TokenID 命名后,上传到bucket,并将获取到的TxIDs再次集合生成一个Manifest格式的json 文件。

{"manifest":"arweave/paths","version":"0.1.0","paths":{"0":{"id":"JcFZfJEJrDKudQsRfN2JnsBPUQTynk0i5XfUqCBcERw"},"1":{"id":"vEUOeIky5hv2GlD2SP2d9TYAua2pkxYxehOczqTGqfU"},"2":{"id":"hd6bI2-c0gr-9ZZsoO8jn_CTRFqWIRwRj5WckgfbmEY"},"3":{"id":"PVAOd8D2JGCW5oOf4bulbQn2npcaaDAexY8sJKzZiEU"},"4":{"id":"lT4RbJEIGsqwwEZB0gxeT1x0nov40crEtBWDHgKQx80"}}
}

将此 manifest-metadata.json 文件上传bucket,并注明content type 为application/x.arweave-manifest+json,获取此文件的ArHash (TxID),此 ID 便是最终需要设置在合约里面的BaseURI。

本案例获取到的TxID为:2svkHmAC3So_M-LUtDlcDeqPZEwSZsY64AB9L8cA-Uk

将NFT部署到合约

具体步骤请参考 NFT 合约部署教程 ,前面步骤完全一致,到‘准备资源'步骤时跳过,直接到设置BaseURI步骤。

我们需要将上面NFT metadata 生成的Manifest ID 写入到BaseURI 中。

setBaseURI.js

require("dotenv").config()
const hre = require("hardhat");
const PRIVATE_KEY = process.env.PRIVATE_KEY
const NETWORK = process.env.NETWORK
const API_KEY = process.env.API_KEYconst provider = new hre.ethers.providers.InfuraProvider(NETWORK, API_KEY);
//编译完成合约会自动生成
const abi = require("../artifacts/contracts/NFT_WEB3_EXPLORER.sol/NFT_WEB3_EXPLORER.json").abi
const contractAddress = "合约地址"
const contract = new hre.ethers.Contract(contractAddress, abi, provider)
const wallet = new hre.ethers.Wallet(PRIVATE_KEY, provider)
const baseURI = "ar://2svkHmAC3So_M-LUtDlcDeqPZEwSZsY64AB9L8cA-Uk/" //metadata 的Manifest IDasync function main() {const contractWithSigner = contract.connect(wallet);//调用setBaseURI方法const tx = await contractWithSigner.setBaseURI(baseURI)console.log(tx.hash);await tx.wait();console.log("setBaseURL success");
}main().then(() => process.exit(0)).catch((error) => {console.error(error);process.exit(1);});

 后续步骤与教程一致,完成mint后到opensea 查看。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/77165.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

运算放大器典型应用(二)

文章目录 十、采样保持电路十一、有源滤波电路二阶有源低通滤波器问题二阶截至频率如何算 十、采样保持电路 十一、有源滤波电路 给单片机供电R一般大于4.1Ω小于10Ω,太大会产生功耗 二阶有源低通滤波器问题 二阶截至频率如何算 通频带比较窄可以用这种&#xff0…

揭秘策划行业就业前景怎么样?

策划这个行业总的来说就是:门槛低,上限高!! 咱们一般说的策划也分很多类型,这里选取身边朋友做的最多的4种类型简单说说。 1、前端品牌策划,转型容易出路广 品牌策划以品牌思维为核心去分析公司的经营发…

计算机毕业设计 高校课程评价系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍:✌从事软件开发10年之余,专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ 🍅文末获取源码联系🍅 👇🏻 精…

Revit SDK 介绍:AddSpaceAndZone 添加空间和分区

前言 这个例子介绍添加空间和分区。 内容 从 UI 界面看空间和分区。“分析”选项卡“空间和分区”面板: 创建空间 点击“Create Space”按钮,点“OK”,出现右边所示的6个空间。 核心逻辑: // SpaceManager::CreateSpaces(…

Redis的java客户端

在Redis官网中提供了各种语言的客户端&#xff0c;地址&#xff1a;https://redis.io/resources/clients/ redis的java客户端 https://redis.io/resources/clients/#java 1.jedis使用 引入依赖 <dependency><groupId>redis.clients</groupId><artifac…

类和对象(1)

文章目录 1.面向过程和面向对象初步认识2.类的引入3.类的定义4.类的访问限定符和封装4.1访问限定符4.2封装 5.类的作用域6.类的实例化6.2结构体内存对齐规则 7.this指针7.2this指针的特性 封装&#xff08;补充&#xff09; 1.面向过程和面向对象初步认识 C面向对象但不纯面向…

时间和空间复杂度

目录 一、如何衡量一个算法的好坏 二、算法效率 三、时间复杂度 3.1 时间复杂度概念 3.2 大O的渐进表示法 3.3 推导大O阶方法 3.4 常见时间复杂度计算 3.5 空间复杂度 一、如何衡量一个算法的好坏 以下是求斐波那契数列的算法&#xff0c;这个算法是好还是不好呢&#xff1f…

ARM Linux DIY(八)USB 调试

前言 V3s 带有一个 USB 接口&#xff0c;将其设置为 HOST 或 OTG 模式&#xff0c;这样可以用来接入键盘、鼠标等 USB 外设。 USB 简介 USB 有两种设备&#xff1a;HOST 和 USB 功能设备。 在 USB2.0 中又引入了一个新的概念 OTG&#xff0c;即设备角色可以动态切换。 切换方…

ctfhub ssrf(3关)

文章目录 内网访问伪协议读取文件扫描端口 内网访问 根据该题目&#xff0c;是让我们访问127.0.0.1/falg.php&#xff0c;访问给出的链接后用bp抓包&#xff0c;修改URL&#xff0c;发送后得到flag&#xff1a; 伪协议读取文件 这题的让我们用伪协议&#xff0c;而网站的目录…

Java 基本类型和包装类

Java 是基于对象的&#xff0c;所以我们都需要以对象的想法来进行思维。 但 Java 又提供了 8 个基本类型&#xff0c;这 8 个基本类型基本上都和数字有关&#xff0c;是直接可以使用的类型。 基本类型大小包装器类型boolean/Booleanchar16bitCharacterbyte8bitByteshort16bitS…

C#下使用IronPython来实现热更新

问题 之前我们学习过Roslyn&#xff0c;他可以动态编译代码并运行&#xff0c;然后通过ALC加载即插即用&#xff0c;但是遇到一些问题感觉无法解决&#xff0c;我编写一个类A在ALC中&#xff0c;另外一个类B要实例化这个A&#xff0c;我想让他们都能灵活卸载&#xff0c;但是如…

wireshark通常无法抓取交换机所有端口报文

Wireshark 是一种网络分析工具&#xff0c;它通常在计算机的网络接口上进行数据包捕获和分析。然而&#xff0c;Wireshark 默认情况下无法直接捕获交换机所有端口的报文。 交换机是一种网络设备&#xff0c;它在局域网内转发数据包&#xff0c;根据目的MAC地址将数据包仅发送到…

使用mybatis批量插入数据

最近在做项目的时候&#xff0c;有些明细数据&#xff0c;一条一条的插入太费资源和时间&#xff0c;所以得需要批量插入&#xff0c;今晚闲来无事写个小demo。 新建工程 <dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis…

基于腾讯文档进行应届生个人求职记录

1. 新建一个腾讯文档 电脑登录QQ&#xff0c;点击“腾讯文档”功能键。 2. 可以选择下载客户端&#xff0c;也可以直接进入网页版。&#xff08;本人使用网页版&#xff09; 3. 点击新建&#xff0c;选择在线表格。 4. 编辑表名&#xff0c;表内容。 5. 设置文档权限&#xf…

性能测试工具LoadRunner —— 性能测试流程及结果分析

性能测试目的 1 什么是性能测试? 性能测试是通过性能的测试工具模拟多种正常、峰值以及异常负载条件来对系统的各项性能指标进行测试。 负载测试和压力测试都属于性能测试&#xff0c;两者可以结合进行。通过负载测试&#xff0c;确定在各种工作负载下系统的性能&#xff0…

机器学习笔记之最优化理论与方法(七)无约束优化问题——常用求解方法(上)

机器学习笔记之最优化理论与方法——基于无约束优化问题的常用求解方法[上] 引言总体介绍回顾&#xff1a;线搜索下降算法收敛速度的衡量方式线性收敛范围高阶收敛范围 二次终止性朴素算法&#xff1a;坐标轴交替下降法最速下降法(梯度下降法)梯度下降法的特点 针对最速下降法缺…

不关闭Tamper Protection(篡改保护)下强制卸载Windows Defender和安全中心所有组件

个人博客: xzajyjs.cn 背景介绍 由于微软不再更新arm版本的win10系统&#xff0c;因此只能通过安装insider preview的镜像来使用。而能找到的win10 on arm最新版镜像在安装之后由于内核版本过期&#xff0c;无法打开Windows安全中心面板了&#xff0c;提示如下&#xff1a; 尝…

mysql技术文档--之与redo log(重做日志)庖丁解析-超级探索!!!

阿丹&#xff1a; 在刚开始写本文章的是还不太清楚要如何去细啃下这两个体系&#xff0c;在查阅资料的过程中。发现大厂阿里的庖丁解InnoDB系列&#xff0c;详细了的写了很多底层知识&#xff0c;于是基于这个这两个文章才有了阿丹的这篇文章。 整体认知&#xff1a; 在 MySQ…

分享一个python基于数据可视化的智慧社区服务平台源码

&#x1f495;&#x1f495;作者&#xff1a;计算机源码社 &#x1f495;&#x1f495;个人简介&#xff1a;本人七年开发经验&#xff0c;擅长Java、Python、PHP、.NET、Node.js、微信小程序、爬虫、大数据等&#xff0c;大家有这一块的问题可以一起交流&#xff01; &#x1…

AI项目六:WEB端部署YOLOv5

若该文为原创文章&#xff0c;转载请注明原文出处。 一、介绍 最近接触网页大屏&#xff0c;所以就想把YOLOV5部署到WEB端&#xff0c;通过了解&#xff0c;知道了两个方法&#xff1a; 1、基于Flask部署YOLOv5目标检测模型。 2、基于Streamlit部署YOLOv5目标检测。 代码在…