草庐IT

使用 Python 创建您自己的NFT集合(二)NFT存储

西京刀客 2025-05-12 原文

文章目录

使用 Python 创建您自己的NFT集合(二)

该系列主要分为4部分:
第一部分: 如何使用 Python 拼接创建月饼图像集。
第二部分:了解如何生成收藏的元数据。
第三部分:了解生成的收藏如何存储。
第四部分:了解链上合约,NFT上链。

本文主要讲解第三部分,了解生成的收藏如何存储。

了解NFT如何存储

每个 NFT 的核心是其元数据(metadata)。这个元数据包括对 NFT 的描述(名称、属性等)和其媒体文件(图像、视频、音频等)的指示器(pointer)。

由于区块链上的高gas费用和拥塞的通信,大多数NFT项目选择仅将NFT所有权数据存储在区块链上(只在其智能合约中保留一个存储链接),以确保所有权是不可篡改、可追溯和不可否认的。代表 NFT 实际形式的媒体数据存储在链下。

什么是NFT元数据?

NFT 智能合约中的元数据(Metadata)
参考URL: https://blog.51cto.com/devpoint/5285110

NFT 合约的元数据(Metadata)文件是存储在区块链之外某处的 JSON 文件。
这些文件可能以它们存储的令牌数据命名 tokenId。像 OpenSea,它们的内容如下:

查看opensea的元数据标准

NFT元数据将NFT定义为一个有关数字资产详细信息的对象。一个NFT 的元数据(Metadata)可能包括有描述、图像链接、名称和一些可选属性。

这是Opensea生物的元数据的一个例子:
{
“description”: “Friendly OpenSea Creature that enjoys long swims in the ocean.”,
“external_url”: “https://openseacreatures.io/3”,
“image”: “https://storage.googleapis.com/opensea-prod.appspot.com/puffs/3.png”,
“name”: “Dave Starbelly”,
“attributes”: [ … ],
}

冻结元数据

冻结元数据
原文链接:http://www.tucaod.com/9558.html

在 Etherscan 中查询 NFT 的元数据

读者可以通过最常用的 Opensea 找到自己希望验证的 NFT 收藏品页面。这里以 Bored Ape Yacht Club 中的一个藏品为例,可以看到左下角详情页中标明了这个 NFT 最关键的三个信息:

  1. 合约地址;
  2. 2.NFT 在合约中的编号,也就是 Token ID;
  3. 所在公链,也就是以太坊;


点击合约地址(Contract Address)右侧的链接,页面会自动跳转到对应合约地址的 Etherscan 浏览器页面。

点击页面中的 Contract 标签,便可以浏览这个合约的底层代码。
直接点击上图中的 Read Contract 标签,便可以浏览这个合约中的可查询函数
找到在页面中排行第 20 位的函数 tokenURI,这便是该 NFT 合约查询元数据的专用函数


点开 tokenURI 函数后,我们可以看到以下界面。在上方的输入框中输入我们想要查询的 NFT 编号,也就是刚刚在 Opensea 看到的 Token ID 编号 6588,然后点击下方的查询按钮 Query。
ipfs://Qmxxxx
这串代码便是在 NFT 的智能合约中保存的元数据。可以看出,这个 NFT 的元数据保存的是一段 ipfs 存储链接,因此可以判断该 NFT 采用的是去中心化的存储方式。

存储方法

[强烈推荐]主流NFT项目的元数据都储存在哪里?
参考URL: https://zhuanlan.zhihu.com/p/462435238
浅析不同NFT数据存储方法的优缺点以及未来展望
参考URL: http://finance.sina.com.cn/blockchain/roll/2022-04-26/doc-imcwiwst4118629.shtml?finpagefr=p_115

  • 中心化存储
    **存储 NFT 数据最糟糕的选择是在中心化的服务器上。**如果一个 NFT 项目的元数据和媒体文件存储在一个服务器上,而创建者停止维护该服务器,那么该数据将永远消失,从而最终使 NFT 成为“空白”。控制服务器的人也可以在任何时候改变 NFT 的描述和内容,而无需得到所有者的许可。这完全违背了 NFT 的目的。

两个最流行的存储 NFT 数据的去中心化方案是 InterPlanetary File System(IPFS)和 Arweave。

  • IPFS
    IPFS 是一个点对点的文件存储网络。一个被称为节点的计算机存储已上传到网络的文件,并使用独特的哈希值来识别这些文件。IPFS 和基于网络的文件存储之间最大的区别是,IPFS 使用了一个基于内容的地址系统。当一个文件请求被提出时,网络会使用文件的哈希值找到一个持有该文件的节点,并将其提供给请求者。

IPFS 的弱点是不能保证文件存储的持久性。这意味着上传到 IPFS 的数据不会永久地留在那里。只要网络中的一个节点正在存储内容并使其可用,那么文件就会存在于 IPFS 上,这也被称为“钉(pinning)

为了在 IPFS 上长期存储文件,许多 NFT 项目和市场要么手动钉住他们的数据,要么使用 pining 服务,以确保总是至少有一个 IPFS 节点持有副本。如果维护 NFT 的 IPFS 数据的项目或平台发生故障并停止钉住文件,那么随着持有副本的节点清除其内存缓存或被关闭,所有存储的信息将随着时间的推移而丢失。

IPFS作为去中心化存储的代表,逐渐被NFT行业所接受。以Bored Ape Yacht Club为例——它的元数据和媒体数据都存储在IPFS中。

  • Arweave
    Arweave 是一个去中心化的文件存储网络,它可以保证文件存储的持久性。用户支付一次性费用来支付 200 年的存储成本。200 年的基准是一个极其保守的估计,因为物理数据存储价格的将在未来不断下降。如果成本下降的速度超过估计,Arweave 文件的存储时间将远远超过 200 年。

Arweave 网络中的计算机被称为矿工,矿工被激励使用 AR 代币来复制和存储其他矿工很少存储的数据副本。这确保了文件不会随着时间的推移而丢失,不需要原始上传者的持续维护。

目前以太坊生态存储情况:
在以太坊上,IPFS 是最受欢迎的 NFT 元数据存储媒介。按交易量排名前 100 的 NFT 合约中,48% 的合约的元数据存储在 IPFS 上。 不幸的是,中心化服务器是以太坊上 NFT 元数据存储的第二大选择。

在 IPFS 上存储元数据的顶级项目中,有 20% 在它们的合约中使用了来自 Pinata 的专用网关链接,而不是默认的 IPFS 链接。Pinata 是最受欢迎的 IPFS pining 和数据管理服务之一。

目前利用去中心化存储方式存储 NFT 元数据的主流项目,如 Bored Ape Yacht Club,这也是目前大多数艺术品类 NFT 所采用的存储方式。

当然去中心化存储也存在一些缺点,那就是数据存储的永久性并不能很好的得到保证。对于没有结合 filecoin 激励层的 ipfs 存储,一旦负责存储的节点全部离线,所存的数据依然有可能丢失。

本文我们就采用去中心化存储方式存储,Pinata IPFS的方式!

Pinata

官网: pinata.cloud

Pinata团队在Web3领域确实是一个先锋,在这些年间与IPFS也在长期协作。

Pinata现有的服务中有一个就是云服务,其网址是pinata.cloud
Pinata云服务提供了一套API接口,虽然这套API接口是中心化的,但它们给用户提供了最便捷的方式将希望存储的内容存储在IPFS系统中。

用户在使用这套系统时和通常使用IPFS系统有所不同,其区别就是用户在系统中不需要使用哈希值来搜索文件,而可以用易懂的单词来搜索文件。

Pinata提供的这套API系统并不是免费使用的,但Pinata没有采用传统区块链项目常用的方式发行代币,而是采用了直接的收费方式让用户使用这套服务。

对这套云存储系统的收费,Pinata给出了自己的一套收费标准,并尽量让它简单好操作—用户需要存储多少数据,以及希望这些数据存储多久就付多少费用。

从这个表中,我们可以看出Pinata也提供了免费的服务—可以免费使用的空间是1GB。对于一般的开发者来说,这足够了。

Pinata是IPFS的一个接口,它使在IPFS上托管文件变得更容易。

我们可以上传图像文件和JSON元数据到Pinata。

检查上传效果:
https://dweb.link/ipfs/Qmdpbe43xbEMCyGvkwm6FTtFu6SnqNT2H2SQCBh26Fxgpe

pinata如何使用

官方文档:https://docs.pinata.cloud/

如果您想自动上传,使用PINATA而不是自动进行IPF,则可以通过获得Pinata API键来做到这一点。

当使用IPFS等分布式存储系统将资产进行链下存储时,需要使用Pinning(固定)服务。“固定”文件基本上是告诉IPFS不要删除文件并使其保持可用,相当于将该文件永久存储在IPFS分布式存储网络上。

第1步:注册Pinata
注册账号 https://app.pinata.cloud/register
在Pinata上创建一个免费帐户。免费套餐最多可提供1GB的存储空间!

第2步:生成API密钥
我们需要一个与你的帐户关联的API密钥,在Pinata管理后台中,单击右上角的帐户图标,然后从下拉列表中选择API密钥,单击+新密钥,确保选择Admin按钮以访问所有Pinata端点。


将Pinata APIKey和 Secret APIKey 存储起来,稍后我们将使用它。

nft.storage

官网:https://nft.storage/

NFT.Storage,一项由协议实验室和Pinata专为NFT数据存储打造的服务。NFT.Storage让开发者能够利用内容寻址和去中心化存储保护NFT资产及相关元数据——确保所有NFT遵循最佳实践方案并能够长期访问。

nft.storage lets developers, creators, and artists store NFT data on decentralized networks easily, securely, and for free (powered by @IPFS and @Filecoin)

nft.storage允许开发人员,创作者和艺术家轻松,安全地将NFT数据存储在分散的网络上,并免费!

Q:NFT.storage上的数据可以存储多长时间?

A: 数据将无限期地在 IPFS 中可用,并存储在与全球存储提供商社区的长期冗余Filecoin存储协议中。

Q:上传到NFT.storage的文件大小有什么限制?

A: NFT.Storage 接受每次上传最大31GiB的存储请求!每次上传都可以包含单个文件或文件目录。

Q: 存储在NFT.Storage的数据处理自己还有谁可以访问?

A: 只要能提供正确CID请求,任何人都能访问上传到 NFT.Storage 的数据。因此,不要使用NFT.Storage以未加密的形式存储任何私人或敏感信息。

Q: 可以删除存储到NFT.Storage的数据吗?

A: 你可以删除与您的帐户关联的数据,这些数据将不再出现在您帐户的“文件”页面上。但这并不能阻止去中心化存储网络中的节点无限期地保留数据副本。因此,不要将 NFT.Storage 用于将来可能需要永久删除的数据。

Q:为何NFT.Storage可以做到免费存储?

A: NFT.Storage参与Filecoin Plus计划,通过该服务上传的所有数据都有资格获得此10倍奖励乘数。因此,存储提供商愿意提供免费的存储和检索服务,以获得这个块奖励的倍数。

NFT具体存储具体实现思路

关于NFT资产的一个重要的点在于其完整性 —— 包括资产本身和所有相关数据。IPFS使用CID来保护NFT数据的完整性,确保自链接创建以来没有篡改。

开发者应遵守以下建议,让IPFS内置的数据验证功能发挥最大效用。

  • NFT智能合约上对一个NFT对应的资源和元数据应该使用IPFS URI。
    元数据是NFT价值构成的有机部分。因此,为保全资产的价值,在IPFS上存储资产时也应存储元数据,并确保两者都可获取。

例子:
ipfs://bafybeibnsoufr2renqzsh347nrx54wcubt5lgkeivez63xvivplfwhtpym/metadata.json

实现该目标的首选思路如下:

  1. 创建两个新目录(一个用于资产,一个用于元数据)
  2. 将资产添加到其目录中
  3. 将资产的目录添加到IPFS中,记录其CID
  4. 在相应目录创建元数据,使用步骤3中的CID创建IPFS URI。该URI应该包含目录的CID和资产文件名
  5. 将元数据的目录添加到IPFS中,记录其CID
  6. 使用步骤5中的CID为元数据创建IPFS URI,将该URI存储在链上,加入所有权记录

该流程既能让开发者将文件名加入链接中(方便用户交互),又确保元数据和资产可被独立应用。
元数据将在以下位置被访问:ipfs://{元数据目录的CID}/元数据文件名
资产可以通过以下地址访问:ipfs://{资产目录的CID}/资产文件名

  • 对于应用
    在面向用户的应用程序中,开发者应通过以下两种方式链接IPFS内容。
  1. IPFS URI
  2. HTTP gateway URL

直到更多的浏览器原生支持IPFS URI。请注意,这两种链接都是容易从原始CID或IPFS URI生成的。

程序实现

pinata SDKs
官方链接: https://docs.pinata.cloud/sdks

pinata 官方SDK 是js的
python sdk 是非官方的,很简单,就是简单调http接口封装。我们看 https://github.com/Vourhey/pinatapy

有关使用 Python 创建您自己的NFT集合(二)NFT存储的更多相关文章

  1. ruby - 如何使用 Nokogiri 的 xpath 和 at_xpath 方法 - 2

    我正在学习如何使用Nokogiri,根据这段代码我遇到了一些问题:require'rubygems'require'mechanize'post_agent=WWW::Mechanize.newpost_page=post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')puts"\nabsolutepathwithtbodygivesnil"putspost_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div

  2. ruby - 使用 RubyZip 生成 ZIP 文件时设置压缩级别 - 2

    我有一个Ruby程序,它使用rubyzip压缩XML文件的目录树。gem。我的问题是文件开始变得很重,我想提高压缩级别,因为压缩时间不是问题。我在rubyzipdocumentation中找不到一种为创建的ZIP文件指定压缩级别的方法。有人知道如何更改此设置吗?是否有另一个允许指定压缩级别的Ruby库? 最佳答案 这是我通过查看ruby​​zip内部创建的代码。level=Zlib::BEST_COMPRESSIONZip::ZipOutputStream.open(zip_file)do|zip|Dir.glob("**/*")d

  3. ruby - 为什么我可以在 Ruby 中使用 Object#send 访问私有(private)/ protected 方法? - 2

    类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc

  4. ruby-on-rails - 使用 Ruby on Rails 进行自动化测试 - 最佳实践 - 2

    很好奇,就使用ruby​​onrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提

  5. ruby - 在 Ruby 中使用匿名模块 - 2

    假设我做了一个模块如下:m=Module.newdoclassCendend三个问题:除了对m的引用之外,还有什么方法可以访问C和m中的其他内容?我可以在创建匿名模块后为其命名吗(就像我输入“module...”一样)?如何在使用完匿名模块后将其删除,使其定义的常量不再存在? 最佳答案 三个答案:是的,使用ObjectSpace.此代码使c引用你的类(class)C不引用m:c=nilObjectSpace.each_object{|obj|c=objif(Class===objandobj.name=~/::C$/)}当然这取决于

  6. ruby - 如何在 Ruby 中顺序创建 PI - 2

    出于纯粹的兴趣,我很好奇如何按顺序创建PI,而不是在过程结果之后生成数字,而是让数字在过程本身生成时显示。如果是这种情况,那么数字可以自行产生,我可以对以前看到的数字实现垃圾收集,从而创建一个无限系列。结果只是在Pi系列之后每秒生成一个数字。这是我通过互联网筛选的结果:这是流行的计算机友好算法,类机器算法:defarccot(x,unity)xpow=unity/xn=1sign=1sum=0loopdoterm=xpow/nbreakifterm==0sum+=sign*(xpow/n)xpow/=x*xn+=2sign=-signendsumenddefcalc_pi(digits

  7. ruby - 使用 ruby​​ 和 savon 的 SOAP 服务 - 2

    我正在尝试使用ruby​​和Savon来使用网络服务。测试服务为http://www.webservicex.net/WS/WSDetails.aspx?WSID=9&CATID=2require'rubygems'require'savon'client=Savon::Client.new"http://www.webservicex.net/stockquote.asmx?WSDL"client.get_quotedo|soap|soap.body={:symbol=>"AAPL"}end返回SOAP异常。检查soap信封,在我看来soap请求没有正确的命名空间。任何人都可以建议我

  8. python - 如何使用 Ruby 或 Python 创建一系列高音调和低音调的蜂鸣声? - 2

    关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。

  9. ruby-on-rails - 'compass watch' 是如何工作的/它是如何与 rails 一起使用的 - 2

    我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t

  10. ruby - 使用 ruby​​ 将 HTML 转换为纯文本并维护结构/格式 - 2

    我想将html转换为纯文本。不过,我不想只删除标签,我想智能地保留尽可能多的格式。为插入换行符标签,检测段落并格式化它们等。输入非常简单,通常是格式良好的html(不是整个文档,只是一堆内容,通常没有anchor或图像)。我可以将几个正则表达式放在一起,让我达到80%,但我认为可能有一些现有的解决方案更智能。 最佳答案 首先,不要尝试为此使用正则表达式。很有可能你会想出一个脆弱/脆弱的解决方案,它会随着HTML的变化而崩溃,或者很难管理和维护。您可以使用Nokogiri快速解析HTML并提取文本:require'nokogiri'h

随机推荐