使用Pinata在IPFS上存储NFT图片的实践

news2024/9/24 10:23:29

文章目录

  • 前言
  • 一、什么是IPFS?
  • 二、为什么NFT需要IPFS?
  • 三、 Pinata:IPFS上的存储解决方案
  • 四、 实践:使用Pinata存储NFT图片
    • 1. 注册
    • 2. 获取API密钥与网关
    • 3. 上传图片到IPFS
  • 总结


前言

随着区块链技术的快速发展,NFT(非同质化代币)在数字艺术、游戏和收藏品等领域变得越来越流行。一个关键的问题是如何安全、高效地存储这些NFT的元数据和图片。IPFS(InterPlanetary File System,星际文件系统)提供了一种分布式存储解决方案,能够有效解决这一问题。本文将介绍IPFS及其在NFT存储中的应用,并具体讲解如何使用Pinata平台🚪在IPFS上存储图片。

在这里插入图片描述


一、什么是IPFS?

IPFS是一种分布式文件存储和共享系统,旨在创建一个更快、更安全、更开放的互联网。它通过内容寻址的方式,使文件可以永久存储,并且不依赖于某个特定的服务器。IPFS的关键特点包括:

  1. 分布式存储:IPFS采用P2P网络结构,文件存储在多个节点上,提高了数据的可靠性和抗审查能力。
  2. 内容寻址:文件在上传到IPFS时会生成一个唯一的加密哈希值,通过这个哈希值可以直接找到并访问该文件。
  3. 去中心化:IPFS去除了中心化服务器的需求,文件可以分布在全球各地的不同节点上,避免了单点故障。

二、为什么NFT需要IPFS?

在区块链上存储NFT时,通常只存储一个唯一的标识符和少量数据,而更详细的元数据(如图片、音频、视频等)存储在IPFS上。原因如下:

  1. 成本效益:区块链上的存储成本非常高,而IPFS提供了一种更经济的存储方式。
  2. 数据完整性:IPFS通过内容寻址确保文件的不可变性和完整性,任何对文件内容的修改都会生成一个新的哈希值,保证数据的原始性。
  3. 抗审查和可靠性:IPFS的分布式存储方式避免了中心化服务器的单点故障和审查问题。

三、 Pinata:IPFS上的存储解决方案

Pinata是一个易于使用的IPFS文件管理平台,提供了强大的API接口,使得在IPFS上上传和管理文件变得更加简单和高效。Pinata的主要功能包括:

  1. 文件上传和管理:通过Pinata可以方便地将文件上传到IPFS,并管理这些文件。
  2. API支持:Pinata提供了丰富的API接口,方便开发者在应用中集成IPFS存储功能。
  3. 可靠的网关服务:Pinata提供了稳定的IPFS网关服务,确保文件可以快速、可靠地被访问。

四、 实践:使用Pinata存储NFT图片

下面我们具体讲解如何使用Pinata在IPFS上存储NFT图片。

1. 注册

首先,在Pinata官网🚪注册一个账户,并获取API密钥,红框为注册按钮
在这里插入图片描述

用电脑注册的时候,最好是直接在你的电脑里再开一个页面为你的邮箱页面去接收验证码,用手机接收验证码的话,可能会跳转失败(亲身经历😥)

在这里插入图片描述

2. 获取API密钥与网关

接收完验证码就直接会跳转进入到个人主页了,进入“API Keys”页面,创建一个新的API密钥Generate API Key就可以了
在这里插入图片描述
输入你想给这个API密钥的命名,勾选上admin,其它的选项留待以后去研究,然后直接Generate API Key就可以了
在这里插入图片描述
随后会出先三个信息,注意保管好前面两个,之后要用到的
在这里插入图片描述
再进入到Gateways页面获取网关,网关是用来访问存储ipfs图片要用到的,要访问存储的ipfs就是https://你的网关/ipfs/存储图片得到的cid,例如我的网关是这个aqua-famous-koala-370.mypinata.cloud,那么我访问图片就是通过https://aqua-famous-koala-370.mypinata.cloud/ipfs/xxx
在这里插入图片描述

3. 上传图片到IPFS

通过简单的POST请求即可实现上传IPFS,首先需要刚才获得的API KeyAPI Secret,请求URL路径是https://api.pinata.cloud/pinning/pinFileToIPFS,并且请求头为pinata_api_keypinata_secret_api_key,请求体为要上传的图片或者文档在这里插入图片描述
最后POST请求返回的结果里会包含IpfsHash也就是要获得的cid
在这里插入图片描述
以下为实现简单实现IPFS上传的一个完整核心代码,其中要替换为你自己的API密钥以及网关

<!-- test.html -->
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Upload to Pinata</title>
</head>
<body>
    <h1>Upload File to Pinata</h1>
    <form id="uploadForm">
        <input type="file" id="fileInput" required>
        <button type="submit">Upload</button>
    </form>
    <div id="result"></div>

    <script src="script.js"></script>
</body>
</html>
// script.js
    document.getElementById('uploadForm').addEventListener('submit', async (event) => {
        event.preventDefault();
        const fileInput = document.getElementById('fileInput');
        const file = fileInput.files[0];
    
        if (!file) {
            alert('Please select a file.');
            return;
        }
    
        // Create a FormData object and append the file
        const formData = new FormData();
        formData.append('file', file);
    
        // Pinata API credentials (replace with your actual API key and secret)
        const pinataApiKey = '自己的apikey';
        const pinataSecretApiKey = '自己的secret';
    
        try {
            const response = await fetch('https://api.pinata.cloud/pinning/pinFileToIPFS', {
                method: 'POST',
                headers: {
                    'pinata_api_key': pinataApiKey,
                    'pinata_secret_api_key': pinataSecretApiKey
                },
                body: formData
            });
    
            if (!response.ok) {
                throw new Error(`Error: ${response.statusText}`);
            }
    
            const data = await response.json();
            const cid = data.IpfsHash;
    
            // Display the result
            const resultDiv = document.getElementById('result');
            resultDiv.innerHTML = `
                <p>File uploaded successfully!</p>
                <p>CID: ${cid}</p>
                <p><a href="https://自己的网关/ipfs/${cid}" target="_blank">View File</a></p>
                <p><a href="https://自己的网关/ipfs/${cid}" download>Download File</a></p>
            `;
        } catch (error) {
            console.error('Error uploading file:', error);
            alert('Error uploading file. Please try again.');
        }
    });

打开页面可以上传一份图片
在这里插入图片描述
点击View File即可查看上传的文件是什么
在这里插入图片描述

如果想要在区块链中加入这个IPFS,只需要在智能合约中定义一个string类型的字符串,也就是直接将cid给存入到智能合约中,这样访问的时候直接在网关后拼接存储的cid,大大减少了文件上链的费用,同时保持了数据的完整性和可访问性

在这里插入图片描述


总结

通过本文,我们详细介绍了IPFS及其在NFT存储中的重要性,并通过具体示例演示了如何使用Pinata平台在IPFS上存储图片。从注册账户、获取API密钥到实际上传文件,我们逐步讲解了每一个关键步骤。IPFS提供了去中心化、内容寻址和分布式存储的优势,使得NFT元数据和图片存储更加安全和高效。希望这篇文章能帮助你更好地理解和使用IPFS来存储NFT图片。如果你有任何疑问或建议,欢迎在评论区留言讨论🌹

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

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

相关文章

【iOS】OC关键字总结及底层原理(下)

目录 weak实现原理objc_initWeak()objc_storeWeak()weak_register_no_lock()weak_entry_for_referent()dealloc关于弱引用的处理weak相关问题 __autoreleasing关键字自动释放池__autoreleasing修饰变量 weak实现原理 weak弱引用指针会存储在SideTable里的weak弱引用表里面&…

实验室冷冻干燥机的安装与调试步骤

实验室冷冻干燥机是一种重要的科研设备&#xff0c;广泛应用于生物、化学、食品科学等领域。正确安装与调试冷冻干燥机&#xff0c;不仅能确保设备的正常运行&#xff0c;还能延长其使用寿命。本文将详细介绍实验室冷冻干燥机的安装与调试步骤&#xff0c;帮助用户顺利完成设备…

Java中等题-最大子数组和(力扣)

给你一个整数数组 nums &#xff0c;请你找出一个具有最大和的连续子数组&#xff08;子数组最少包含一个元素&#xff09;&#xff0c;返回其最大和。 子数组 是数组中的一个连续部分。 示例 1&#xff1a; 输入&#xff1a;nums [-2,1,-3,4,-1,2,1,-5,4] 输出&#xff1a;…

SSM城市垃圾分类管理系统-计算机毕业设计源码44582

摘 要 在当前全球环境问题日益突出的背景下&#xff0c;城市垃圾分类成为推动可持续发展和环境保护的重要举措之一。然而&#xff0c;传统的垃圾处理方式存在效率低下、资源浪费和环境污染等问题。因此&#xff0c;开发一个基于Java编程语言、MySQL数据库和HTML前端技术的高效…

vue()

目录 首先我们回顾一下之前学的东西 入门&#xff1a; v-bind 绑定属性用法 ​编辑 v-if 用法 v-for v-on v-model&#xff1a;双向绑定 组件&#xff1a; 全局组件&#xff1a; 局部组件&#xff1a; vue生命周期&#xff1a;&#xff08;这里让我研究研究&…

C++ 函数模板和类模板

参考视频&#xff1a;C类模板_哔哩哔哩_bilibili 遗留问题&#xff1a;编译器怎么处理函数模板和类模板 目录 一、为什么会有函数模版&#xff1f;函数模板是为了解决什么问题&#xff1f; 二、函数模板的概念 三、函数模版的使用 四、函数模板的特化 五、类模板的概念 …

24/8/7 算法笔记 支持向量机回归问题天猫双十一

import numpy as np from sklearn.svm import SVR import matplotlib.pyplot as plt X np.linspace(0,2*np.pi,50).reshape(-1,1) y np.sin(X) plt.scatter(X,y) 建模 线性核函数 svr SVR(kernel linear) svr.fit(X,y.ravel())#变成一维y_ svr.predict(X) plt.scatter(…

heapq.heapify构建小顶堆的流程

代码示例 import heapqlst [2, 3, 4, 6, 9, 1, 5] heapq.heapify(lst) print(lst)流程解释 初始列表: 列表 lst 在开始时是 [2, 3, 4, 6, 9, 1, 5]。 调用 heapq.heapify(lst): heapify 函数将 lst 转换为一个小顶堆&#xff08;min-heap&#xff09;。在小顶堆中&#xff0…

Spring框架漏洞(附修复方法)

Spring是Java EE编程领域的一个轻量级开源框架&#xff0c;该框架由一个叫Rod Johnson的程序员在2002年最早提出并随后创建&#xff0c;是为了解决企业级编程开发中的复杂性&#xff0c;业务逻辑层和其他各层的松耦合问题&#xff0c;因此它将面向接口的编程思想贯穿整个系统应…

《UniverSeg: Universal Medical Image Segmentation》ICCV2023

摘要 这篇论文提出了一种名为 UniverSeg 的方法&#xff0c;它能够解决未见过的医学图像分割任务&#xff0c;而无需额外的训练。现有的深度学习模型通常无法泛化到新的解剖结构、图像模式或标签上。UniverSeg 利用一种新的 CrossBlock 机制&#xff0c;通过查询图像和定义新分…

利用tkinter制作简易计算器,页面美观,计算保留4位小数

import tkinter as tk import time window tk.Tk() window.title("简易计算器") window.geometry(300x400) content def btn_onclick(data):global contentif data"AC" or data "MC":expression.set()result.set()content elif data :result…

无人机长生不老秘籍

机身保养 外观检查 1.检查机器表面整洁无划痕无针孔凹陷擦伤、畸变等损坏情况 2.晃动机身&#xff0c;仔细听机身内部有无松动零件或者螺丝在机身内部 桨叶检查 1.有无裂痕、磨损、变形等缺陷&#xff0c;如有明显缺陷建议更换 2.卡扣、紧固件有无松脱或失效&#xff0c;…

嵌入式学习之路 14(C语言基础学习——指针操作一维整型数组)

一、指针基础 指针的概念 地址表示内存单元的编号&#xff0c;也被称为指针。指针既是地址&#xff0c;也是一种专门用于处理地址数据的数据类型。 例如&#xff0c;变量a的地址或者十六进制表示的0x1000都可以视作指针。 指针变量的定义 语法&#xff1a;基类型 * 指针变…

探索灵办AI:智能办公的好帮手

引言 随着AI工具的增多&#xff0c;选择合适的AI助手变得尤为重要。ChatGPT的订阅费用高且功能单一&#xff0c;很多小伙伴开始寻找更具性价比和多功能的替代品。灵办AI以其便捷、高效、多功能的特点&#xff0c;成为许多朋友的新宠。 灵办AI助手是一款多功能的全能AI助手&am…

智能名片信息交流系统应用场景解决方案

智能名片作为传统名片在数字化时代的进化产物&#xff0c;集成了移动互联网、大数据和人工智能等先进技术&#xff0c;为商务交流和客户关系管理带来了全新的体验。 系统主要功能 01内容聚合与展示 企业信息展示&#xff1a;智能名片不仅包含个人基本信息&#xff0c;还能展示…

MDIO C22协议访问MMD寄存器

以太网PHY芯片中SMI(Serial Management Interface)串行管理接口,也称MDIO(Management Data Input/Output),通常作为MII管理接口(MII Management Interface)。有两根线,分别为双向的MDIO和单向的MDC,用于以太网设备中上层对物理层(PHY)的管理。 MDIO接口有两种协议…

LVX+keepalived群集

Keepalived 双 机 热 备 基 础 知 识 Keepalived 起初是专门针对LVS 设计的一款强大的辅助工具&#xff0c;主要用来提供故障切换(Failover) 和健康检查(Health Checking) 功能——判断 LVS负载调度器、节点服务器的可用性&#xff0c;当master 主机出现故障及时切换到b…

MacOS Anaconda 安装教程及虚拟环境创建

一、下载 Anaconda 1、Anaconda 官网 2、清华大学开源软件镜像站 点 Date 按时间排序&#xff0c;根据自己 Mac 芯片类型下载对应最新版本的。 Intel 芯片的下载 x86_64 版本的Apple m1 芯片的下载 arm64 版本的 二、安装 Anaconda 将安装包下载到本地后&#xff0c;双击安…

人工智能|人工智能教育的发展现状及趋势

智能的热潮正席卷全球。国家在人工智能领域展开战略布局&#xff0c;人工智能人才成为国家急需的高层次技术人才。据领英发布的《全球 Al 领域人才报告》显示&#xff0c;国内人工智能人才缺口达到 500 多万。 毫无疑问&#xff0c;人工智能将不可阻挡地影响所有产业。给自己一…

随手记1.0

easyexcel多级表头导出各级设置样式&#xff08;继承HorizontalCellStyleStrategy实现&#xff09; package com.example.wxmessage.entity;import com.alibaba.excel.metadata.data.WriteCellData; import com.alibaba.excel.write.handler.context.CellWriteHandlerContext;…