当前位置:主页 > 区块链 > NFT > 展示NFT收藏品教程

NFT教程:如何展示Flow和IPFS上的NFT收藏品

2021-03-18 12:01:19 | 来源:登链社区 | 作者:佚名
这篇文章主要介绍了NFT教程:如何展示Flow和IPFS上的NFT收藏品,我们将构建一个简单的React应用程序,该应用程序与Flow智能合约交互,以验证和获取用户拥有的NFT。我们将解析NFT的元数据,以获得NFT的底层标的资产(在本例中为视频)的IPFS位置。需要的朋友可以参考下。

本文是NFT教程的的第二部分,本教程主要介绍Flow区块链、NFT和IPFS。请先阅读第一部分用Flow和IPFS创建NFT的合约和铸造代币操作教程

在本文中,我们将构建一个简单的React应用程序,该应用程序与Flow智能合约交互,以验证和获取用户拥有的 NFT。然后,我们将解析 NFT 的元数据,以获得 NFT 的底层标的资产(在本例中为视频)的 IPFS 位置。 提醒一下我们正在打造的 NFT,就像 NBA Top Shot 一样,只不过是不同的视频内容。

NFT教程:如何展示Flow和IPFS上的NFT收藏品

项目设置

本教程中,你需要运行 Flow 模拟器。 如果你不记得如何启动,可以看看之前的文章或者查看 Flow CLI 文档。需要注意的是,Flow 模拟器是 Flow 区块链在内存的模拟。所以,如果关闭了模拟器,你需要继续做以下工作:

启动 Flow 模拟器
部署项目
铸造你的 NFT
在本教程第一部分 NFT 教程 - 用 Flow 和 IPFS 创建 NFT 详细介绍了其中的每一个步骤。

此外,还需要在你的机器上安装 NodeJS。 你可以在这里安装。

和之前一样,你需要一个文本编辑器。

初始化 React 和安装依赖

在第一部分教程中创建的 pinata-party 项目目录下创建 React 应用(你也可以在一个全新的目录中创建你的 React 应用)。

要创建我们的应用程序,运行以下命令:

npx create-react-app pinata-party-frontend

当一切安装完成后,你会有一个新的目录,叫做 pinata-party-frontend, 切换到该目录,安装依赖。

首先,参考 Flow 文档,需要安装 Flow JS SDK。 前端的设置我们只需要按照 Flow 的文档进行即可:

npm i @onflow/fcl @onflow/types

一些值需要作为应用程序的全局变量来存储,这里使用环境变量。 在 react 中,创建一个 .env 文件,并设置键值对,其中键值前缀为 REACT_APP。 在 Flow 的文档里,设置为与 Flow 的测试网连接。 在本教程中,我们将连接到 Flow 模拟器。 所以,需要做一些改变。 在 .env 文件中添加以下内容:

REACT_APP_ACCESS_NODE=http://localhost:8080

REACT_APP_WALLET_DISCOVERY=https://fcl-discovery.onflow.org/testnet/authn

REACT_APP_CONTRACT_PROFILE=0xf8d6e0586b0a20c7

将 REACT_APP_ACCESS_NODE 的值替换为上述的本地模拟器url。用部署项目时获得的地址替换 REACT_APP_CONTRACT_PROFILE 值。

还需要创建一个配置文件,用来与 Flow JS SDK 交互。在 src 目录下创建一个名为 config.js 的文件。增加以下内容:

import {config} from "@onflow/fcl"

config()
.put("accessNode.api", process.env.REACT_APP_ACCESS_NODE) .put("challenge.handshake", process.env.REACT_APP_WALLET_DISCOVERY) .put("0xProfile", process.env.REACT_APP_CONTRACT_PROFILE)

这个配置文件只是帮助 JS SDK 与 Flow 区块链(或本例中的模拟器)一起工作。 要使这个文件在整个应用程序中可用,打开 index.js 文件并添加这一行。

import "./config"

现在,让我们连接一些认证。如果你不想的话,可以不必强迫人们认证后进入网站,教程的第三篇文章,在实现 NFT 资产的转移时,认证将是很重要的。

我们需要创建一个认证组件。在你的 src 目录下,创建一个名为 AuthCluster.js 的文件。在该文件内,添加以下内容:

import React, {useState, useEffect} from 'react'
import * as fcl from "@onflow/fcl"

const AuthCluster = () => {
  const [user, setUser] = useState({loggedIn: null})
  useEffect(() => fcl.currentUser().subscribe(setUser), [])
  if (user.loggedIn) {
    return (
      <div>
        <span>{user?.addr ?? "No Address"}</span>
        <button className="btn-primary" onClick={fcl.unauthenticate}>Log Out</button>
      </div>
    )
  } else {
    return (
      <div>
        <button className="btn-primary" onClick={fcl.logIn}>Log In</button>
        <button className="btn-secondary" onClick={fcl.signUp}>Sign Up</button>
      </div>
    )
  }
}

export default AuthCluster
//  rawAuthCluster.js 

代码很简单,使用一个登录和注册按钮,利用 Flow JS SDK 的能力连接到钱包提供者, 你可以注册一个账户或用现有账户登录。

现在需要把这个组件放到我们的应用程序中。 我们先简单点吧。 将你的 App.js 文件替换为以下内容。

import './App.css';
import AuthCluster from './AuthCluster';function App() {
  return (
    <div className="App">
      <AuthCluster />
    </div>
  );
}

export default App;

如果你现在启动应用程序(npm start),你应该会看到一个有登录和注册按钮的页面。 事实上,这两个按钮都是有功能的, 试试吧。

好了,现在 React 应用已经基本设置好了,让我们开始构建获取账户的 NFT 并显示它们。

从 Flow 中获取 NFT

为了显示我们在第一篇文章中铸币的 NFT,需要与 Flow 区块链进行通信。 现在是与 Flow 模拟器进行通信。 设置 .env 文件时,已经告诉应用程序,模拟器是在 8080 端口上运行的。 但现在,如何使用 JavaScript 与 Flow 交互?

幸运的是,Flow 在他们的 JS SDK 中内置了这个功能。 如果你还记得,我们之前写了一个脚本,根据一个 NFT 的 token id 来查找它,并返回 token 的元数据。 它看起来像这样:

import PinataPartyContract from 0xf8d6e0586b0a20c7

pub fun main() : {String : String} {
    let nftOwner = getAccount(0xf8d6e0586b0a20c7)
    // log("NFT Owner")    
    let capability = nftOwner.getCapability<&{PinataPartyContract.NFTReceiver}>(/public/NFTReceiver)

    let receiverRef = capability.borrow()
        ?? panic("Could not borrow the receiver reference")

    return receiverRef.getMetadata(id: 1)
}

CheckTokenMetadata.cdc

现在,我们只需要将其转换为 JavaScript 调用即可。 让我们创建一个新的组件,既能获取数据,又能最终显示 NFT 数据。 在你的 src 目录下,创建一个名为 TokenData.js 的文件。 在该文件中,添加以下内容:

import React, { useState } from "react";
import * as fcl from "@onflow/fcl";

const TokenData = () => {
  const [nftInfo, setNftInfo] = useState(null)
  const fetchTokenData = async () => {
    const encoded = await fcl
      .send([
        fcl.script`
        import PinataPartyContract from 0xf8d6e0586b0a20c7
        pub fun main() : {String : String} {
          let nftOwner = getAccount(0xf8d6e0586b0a20c7)  
          let capability = nftOwner.getCapability<&{PinataPartyContract.NFTReceiver}>(/public/NFTReceiver)
      
          let receiverRef = capability.borrow()
              ?? panic("Could not borrow the receiver reference")
      
          return receiverRef.getMetadata(id: 1)
        }
      `
      ])
    
    const decoded = await fcl.decode(encoded)
    setNftInfo(decoded)
  };
  return (
    <div className="token-data">
      <div className="center">
        <button className="btn-primary" onClick={fetchTokenData}>Fetch Token Data</button>        
      </div>
      {
        nftInfo &&
        <div>
          {
            Object.keys(nftInfo).map(k => {
              return (
                <p>{k}: {nftInfo[k]}</p>
              )
            })
          }
          <button onClick={() => setNftInfo(null)} className="btn-secondary">Clear Token Info</button>
        </div>
      }
    </div>
  );
};

export default TokenData;

//rawTokenData.js  

在这个文件中,创建了一个组件,有一个按钮来获取代币数据。 当点击获取按钮时,它会调用我们创建的一个名为 fetchTokenData 的函数。 该函数使用 Flow JS SDK 来执行与在本教程第一部分中从命令行执行的脚本完全相同的脚本,但在 React 中。 我们把执行的结果,设置到一个名为 nftInfo 的状态变量中。React 会根据 nftInfo 显示 NFT 元数据中的键值对。另外还有一个让清除数据的按钮。

我还加了一点 CSS,让他漂亮一些,App.css 定义如下:

.App {
  display: flex;
  flex-direction: column;
  min-height: 500px;
  justify-content: center;
  align-items: center;
}

button {
  padding: 10;
  height: 30px;
  min-width: 100px;
  cursor: pointer;
}

.btn-primary {
  border: none;
  background: rgb(255, 224, 0);
  color: #282828;
}

.btn-secondary {
  border: none;
  background: rgb(0, 190, 221);
  color: #282828;
}

.center {
  text-align: center;
}

.token-data {
  margin-top: 100px;
}

现在,只要将新组件添加到 App.js 中,放在 AuthCluster 组件下面:

import './App.css';
import AuthCluster from './AuthCluster';
import TokenData from './TokenData';function App() {
  return (
    <div className="App">
      <AuthCluster />
      <TokenData />
    </div>
  );
}export default App;

运行应用程序并尝试获取代币数据,它应该是这样:

这真是太酷了! 我们正在查找指定的账户所拥有的 NFT,然后从该代币中获取元数据。 并显示该元数据,我们知道该元数据中的一个值解析为一个视频文件。 让我们把它显示出来。

从IPFS获取媒体文件

你已经注册了一个 Pinata 账户,并通过 Pinata 上传界面将你的视频文件添加到 IPFS。 这意味着你已经可以从 IPFS 中获取内容了。 在 Pin Explorer 中,当你点击一个哈希值时,你会被带到 Pinata IPFS 网关,在那里你的 IPFS 内容被解析并显示。 为了教程更通用,我们还是从 Protocol Labs 网关中获取它。

回到 TokenData.js 文件中,让我们添加一个方法来显示从 IPFS 中检索到的视频文件,修改代码:

import React, { useState } from "react";
import * as fcl from "@onflow/fcl";

const TokenData = () => {
  const [nftInfo, setNftInfo] = useState(null)
  const fetchTokenData = async () => {
    const encoded = await fcl
      .send([
        fcl.script`
        import PinataPartyContract from 0xf8d6e0586b0a20c7
        pub fun main() : {String : String} {
          let nftOwner = getAccount(0xf8d6e0586b0a20c7)  
          let capability = nftOwner.getCapability<&{PinataPartyContract.NFTReceiver}>(/public/NFTReceiver)
      
          let receiverRef = capability.borrow()
              ?? panic("Could not borrow the receiver reference")
      
          return receiverRef.getMetadata(id: 1)
        }
      `
      ])
    
    const decoded = await fcl.decode(encoded)
    setNftInfo(decoded)
  };
  return (
    <div className="token-data">
      <div className="center">
        <button className="btn-primary" onClick={fetchTokenData}>Fetch Token Data</button>        
      </div>
      {
        nftInfo &&
        <div>
          {
            Object.keys(nftInfo).map(k => {
              return (
                <p>{k}: {nftInfo[k]}</p>
              )
            })
          }
          <div className="center video">
            <video id="nft-video" canplaythrough controls width="85%">
              <source src={`https://ipfs.io/ipfs/${nftInfo["uri"].split("://")[1]}`}
                    type="video/mp4" />
            </video>
            <div>
              <button onClick={() => setNftInfo(null)} className="btn-secondary">Clear Token Info</button>
            </div>
          </div>          
        </div>
      }
    </div>
  );
};

export default TokenData;

//  rawTokenData.js 

我们已经添加了一个 video 标签,它指向 IPFS 上的文件。 你会注意到,这里拆分了 uri 值,以获得 IPFS 哈希值,这样就可以从 IPFS 网关获取对应内容。 先介绍下那个 URI。

我们用 NFT 创建的 uri 看起来像 ipfs://Qm...。 我们之所以这样创建,是因为 IPFS 桌面客户端默认允许你点击并打开这样的链接。 另外,Brave 浏览器也支持粘贴这样的链接。 并且我们认为这种链接形式会随着 IPFS 的发展得到越来越多的支持。

然而,在这里下,我们需要在利用哈希来从 IPFS 公共网关获取内容,并在页面上显示。因此链接会是这样:

https://ipfs.io/ipfs/QmRZdc3mAMXpv6Akz9Ekp1y4vDSjazTx2dCQRkxVy1yUj6

现在,如果你访问我们的应用程序中获取代币数据,会看到如下界面:

NFT教程:如何展示Flow和IPFS上的NFT收藏品

这是一个真正的活的数字资产! 你的视频可能会有所不同,但希望你在应用中感受到相同的体验。

最后

这是一个非常简单的应用,你可以做很多事情让它变得更漂亮,让它的交互性更强,甚至可以为它添加更多的 Flow 元素。 Flow JS SDK 的功能很强大,所以我推荐大家阅读一下文档。

在第二部分成功地使用 Flow 为应用添加了身份验证,创建了一个接口来获取 NFT 的信息,创建了一种方法来显示了原始元数据以及对应的底层标的资产。 这一切都由 Flow 区块链和 IPFS 来保障。 我们知道 NFT 是由谁拥有,也知道显示的内容是有效性,因为哈希值被编码到 NFT 中。

在本教程的最后一篇,我们将专注于创建一个迷你交易市场,让我们转移 NFT。

以上就是NFT教程:如何展示Flow和IPFS上的NFT收藏品的详细内容,更多关于展示NFT收藏品教程的资料请关注脚本之家其它相关文章!

免责声明:本文只为提供市场讯息,所有内容及观点仅供参考,不构成投资建议,不代表本站观点和立场。投资者应自行决策与交易,对投资者交易形成的直接或间接损失,作者及本站将不承担任何责任。!
Tag:NFT   Flow   IPFS   收藏品   区块链技术  

你可能感兴趣的文章

更多

热门币种

  • 币名
    最新价格
    24H涨幅
  • bitcoin BTC 比特币

    BTC

    比特币

    $ 76503.67¥ 522642.47
    +0.9%
  • ethereum ETH 以太坊

    ETH

    以太坊

    $ 2329.62¥ 15915.03
    +0.64%
  • tether USDT 泰达币

    USDT

    泰达币

    $ 1¥ 6.8315
    -0.01%
  • ripple XRP 瑞波币

    XRP

    瑞波币

    $ 1.4333¥ 9.7917
    +0.5%
  • binance-coin BNB 币安币

    BNB

    币安币

    $ 632.69¥ 4322.28
    +0.42%
  • usdc USDC USD Coin

    USDC

    USD Coin

    $ 0.9995¥ 6.8281
    +0.01%
  • solana SOL Solana

    SOL

    Solana

    $ 86.1578¥ 588.59
    +0.96%
  • tron TRX 波场

    TRX

    波场

    $ 0.3343¥ 2.2838
    +1.77%
  • dogecoin DOGE 狗狗币

    DOGE

    狗狗币

    $ 0.095233¥ 0.6505
    +0.11%
  • hyperliquid HYPE Hyperliquid

    HYPE

    Hyperliquid

    $ 39.9658¥ 273.03
    -1.63%

币圈快讯

  • BELIEF市值突破2000万美元日内涨超30%

    2026-04-22 09:45
    据GMGN数据,Sol生态代币BELIEF市值上涨突破2,000万美元,续创历史新高,现报1,780万美元,日内涨幅超30%。该代币叙事基于PrintrV2提出的ProofofBelief(POB)模式,Printr为BybitVentureStudio孵化项目。
  • Revolut计划上市时估值达到2000亿美元

    2026-04-22 09:39
    4月22日消息,据《金融时报》报道,Revolut在股票市场上市时目标估值高达2000亿美元,据其向投资者透露的重磅上市计划,这一估值将使其创始人跻身全球最富有的人之列。这家总部位于伦敦的金融科技集团上月在等待四年后获得英国全面银行牌照,并表示不会在2028年之前寻求上市。投资者及该行内部人士告诉《金融时报》,公司高管已在内部及与部分支持者讨论1500亿至2000亿美元的目标估值。一位接近公司的人士表示,目前尚未确立正式估值目标。Revolut拒绝置评。Revolut创始人NikStoronsky本周表示,公司最早将于2028年IPO。根据长期协议,若Revolut达到1500亿美元估值,Storonsky在公司的持股比例将增加数个百分点;他在去年12月的俄语采访中解释称,若公司估值达到2000亿美元,其激励方案将使他持有约40%股份,价值约800亿美元。Revolut去年11月最新一轮融资估值为750亿美元,较2024年的450亿美元上升,新投资方包括芯片制造商英伟达。短期内,Revolut正筹备新一轮二级市场股份出售,让BaldertonCapital、IndexVentures等支持者套现部分股权,预计今年下半年进行,届时公司估值预计将超过1000亿美元。Revolut去年税前利润增长57%至17亿英镑,营收45亿英镑。公司上月已申请美国银行牌照。
  • FLORK市值突破900万美元日内涨超21倍

    2026-04-22 09:37
    据GMGN数据,ETH链Meme币FLORK市值上涨突破900万美元,现报600万美元,日内涨幅超21倍。Meme币价格波动较大,投资者请注意风险。
  • 新加坡将优化加密资本监管公链资产或不再一刀切归入高风险分类

    2026-04-22 09:33
    新加坡金管局已发布咨询文件拟在落实巴塞尔加密资产资本金新规之前为无许可区块链(permissionlessblockchain,也就是通常所说的公链)上加密资产的处理方式设立一个更友好的监管资本金指引。据悉,巴塞尔加密资产资本金新规将加密资产分为两组,第一组涉及代币化传统资产、稳定币,适用较低资本要求,第二组涉及不符合上述条件的加密资产,而新加坡金管局拟放弃对无许可区块链加密资产一刀切归类为第二组加密资产的作法,允许在满足一系列原则性要求的条件下,将其归类为风险权重更低、审慎要求更宽松的第一组加密资产,实现监管技术中立,具体规定是:新加坡本地注册成立的银行,其被归类为第一组加密资产的无许可区块链加密资产风险敞口不得超过银行一级资本的2%,而相关发行若在银行层面形成负债,其发行规模不得超过一级资本的5%。
  • 乌兹别克斯坦设立Besqala矿谷2035年前免税力推绿色加密货币挖矿

    2026-04-22 09:32
    乌兹别克斯坦总统ShavkatMirziyoyev签署法令设立“BesqalaMiningValley”加密货币挖矿特区,旨在发展绿色能源挖矿并吸引国际投资。矿工可在本地及海外交易所出售加密资产,收益可直接进入本国银行账户。政策方面,矿区参与者至2035年免征所得税,仅需按收入的1%缴纳管理费;电价设定为每千瓦时1800索姆,对超1亿美元投资项目提供例外优惠。准入方面,仅限在当地注册的企业申请,且需具备电力设施并通过审批,相关负责人不得有经济犯罪记录。
  • 查看更多