最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

當(dāng)前位置:主頁 > 區(qū)塊鏈 > NFT > 展示NFT收藏品教程

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

2021-03-18 12:01:19 | 來源:登鏈社區(qū) | 作者:佚名
這篇文章主要介紹了NFT教程:如何展示Flow和IPFS上的NFT收藏品,我們將構(gòu)建一個簡單的React應(yīng)用程序,該應(yīng)用程序與Flow智能合約交互,以驗證和獲取用戶擁有的NFT。我們將解析NFT的元數(shù)據(jù),以獲得NFT的底層標(biāo)的資產(chǎn)(在本例中為視頻)的IPFS位置。需要的朋友可以參考下。

本文是NFT教程的的第二部分,本教程主要介紹Flow區(qū)塊鏈、NFT和IPFS。請先閱讀第一部分用Flow和IPFS創(chuàng)建NFT的合約和鑄造代幣操作教程。

在本文中,我們將構(gòu)建一個簡單的React應(yīng)用程序,該應(yīng)用程序與Flow智能合約交互,以驗證和獲取用戶擁有的 NFT。然后,我們將解析 NFT 的元數(shù)據(jù),以獲得 NFT 的底層標(biāo)的資產(chǎn)(在本例中為視頻)的 IPFS 位置。 提醒一下我們正在打造的 NFT,就像 NBA Top Shot 一樣,只不過是不同的視頻內(nèi)容。

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

項目設(shè)置

本教程中,你需要運(yùn)行 Flow 模擬器。 如果你不記得如何啟動,可以看看之前的文章或者查看 Flow CLI 文檔。需要注意的是,F(xiàn)low 模擬器是 Flow 區(qū)塊鏈在內(nèi)存的模擬。所以,如果關(guān)閉了模擬器,你需要繼續(xù)做以下工作:

啟動 Flow 模擬器
部署項目
鑄造你的 NFT
在本教程第一部分 NFT 教程 - 用 Flow 和 IPFS 創(chuàng)建 NFT 詳細(xì)介紹了其中的每一個步驟。

此外,還需要在你的機(jī)器上安裝 NodeJS。 你可以在這里安裝。

和之前一樣,你需要一個文本編輯器。

初始化 React 和安裝依賴

在第一部分教程中創(chuàng)建的 pinata-party 項目目錄下創(chuàng)建 React 應(yīng)用(你也可以在一個全新的目錄中創(chuàng)建你的 React 應(yīng)用)。

要創(chuàng)建我們的應(yīng)用程序,運(yùn)行以下命令:

npx create-react-app pinata-party-frontend

當(dāng)一切安裝完成后,你會有一個新的目錄,叫做 pinata-party-frontend, 切換到該目錄,安裝依賴。

首先,參考 Flow 文檔,需要安裝 Flow JS SDK。 前端的設(shè)置我們只需要按照 Flow 的文檔進(jìn)行即可:

npm i @onflow/fcl @onflow/types

一些值需要作為應(yīng)用程序的全局變量來存儲,這里使用環(huán)境變量。 在 react 中,創(chuàng)建一個 .env 文件,并設(shè)置鍵值對,其中鍵值前綴為 REACT_APP。 在 Flow 的文檔里,設(shè)置為與 Flow 的測試網(wǎng)連接。 在本教程中,我們將連接到 Flow 模擬器。 所以,需要做一些改變。 在 .env 文件中添加以下內(nèi)容:

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 值。

還需要創(chuàng)建一個配置文件,用來與 Flow JS SDK 交互。在 src 目錄下創(chuàng)建一個名為 config.js 的文件。增加以下內(nèi)容:

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 區(qū)塊鏈(或本例中的模擬器)一起工作。 要使這個文件在整個應(yīng)用程序中可用,打開 index.js 文件并添加這一行。

import "./config"

現(xiàn)在,讓我們連接一些認(rèn)證。如果你不想的話,可以不必強(qiáng)迫人們認(rèn)證后進(jìn)入網(wǎng)站,教程的第三篇文章,在實現(xiàn) NFT 資產(chǎn)的轉(zhuǎn)移時,認(rèn)證將是很重要的。

我們需要創(chuàng)建一個認(rèn)證組件。在你的 src 目錄下,創(chuàng)建一個名為 AuthCluster.js 的文件。在該文件內(nèi),添加以下內(nèi)容:

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 的能力連接到錢包提供者, 你可以注冊一個賬戶或用現(xiàn)有賬戶登錄。

現(xiàn)在需要把這個組件放到我們的應(yīng)用程序中。 我們先簡單點吧。 將你的 App.js 文件替換為以下內(nèi)容。

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

export default App;

如果你現(xiàn)在啟動應(yīng)用程序(npm start),你應(yīng)該會看到一個有登錄和注冊按鈕的頁面。 事實上,這兩個按鈕都是有功能的, 試試吧。

好了,現(xiàn)在 React 應(yīng)用已經(jīng)基本設(shè)置好了,讓我們開始構(gòu)建獲取賬戶的 NFT 并顯示它們。

從 Flow 中獲取 NFT

為了顯示我們在第一篇文章中鑄幣的 NFT,需要與 Flow 區(qū)塊鏈進(jìn)行通信。 現(xiàn)在是與 Flow 模擬器進(jìn)行通信。 設(shè)置 .env 文件時,已經(jīng)告訴應(yīng)用程序,模擬器是在 8080 端口上運(yùn)行的。 但現(xiàn)在,如何使用 JavaScript 與 Flow 交互?

幸運(yùn)的是,F(xiàn)low 在他們的 JS SDK 中內(nèi)置了這個功能。 如果你還記得,我們之前寫了一個腳本,根據(jù)一個 NFT 的 token id 來查找它,并返回 token 的元數(shù)據(jù)。 它看起來像這樣:

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

現(xiàn)在,我們只需要將其轉(zhuǎn)換為 JavaScript 調(diào)用即可。 讓我們創(chuàng)建一個新的組件,既能獲取數(shù)據(jù),又能最終顯示 NFT 數(shù)據(jù)。 在你的 src 目錄下,創(chuàng)建一個名為 TokenData.js 的文件。 在該文件中,添加以下內(nèi)容:

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  

在這個文件中,創(chuàng)建了一個組件,有一個按鈕來獲取代幣數(shù)據(jù)。 當(dāng)點擊獲取按鈕時,它會調(diào)用我們創(chuàng)建的一個名為 fetchTokenData 的函數(shù)。 該函數(shù)使用 Flow JS SDK 來執(zhí)行與在本教程第一部分中從命令行執(zhí)行的腳本完全相同的腳本,但在 React 中。 我們把執(zhí)行的結(jié)果,設(shè)置到一個名為 nftInfo 的狀態(tài)變量中。React 會根據(jù) nftInfo 顯示 NFT 元數(shù)據(jù)中的鍵值對。另外還有一個讓清除數(shù)據(jù)的按鈕。

我還加了一點 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;
}

現(xiàn)在,只要將新組件添加到 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;

運(yùn)行應(yīng)用程序并嘗試獲取代幣數(shù)據(jù),它應(yīng)該是這樣:

這真是太酷了! 我們正在查找指定的賬戶所擁有的 NFT,然后從該代幣中獲取元數(shù)據(jù)。 并顯示該元數(shù)據(jù),我們知道該元數(shù)據(jù)中的一個值解析為一個視頻文件。 讓我們把它顯示出來。

從IPFS獲取媒體文件

你已經(jīng)注冊了一個 Pinata 賬戶,并通過 Pinata 上傳界面將你的視頻文件添加到 IPFS。 這意味著你已經(jīng)可以從 IPFS 中獲取內(nèi)容了。 在 Pin Explorer 中,當(dāng)你點擊一個哈希值時,你會被帶到 Pinata IPFS 網(wǎng)關(guān),在那里你的 IPFS 內(nèi)容被解析并顯示。 為了教程更通用,我們還是從 Protocol Labs 網(wǎng)關(guān)中獲取它。

回到 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 

我們已經(jīng)添加了一個 video 標(biāo)簽,它指向 IPFS 上的文件。 你會注意到,這里拆分了 uri 值,以獲得 IPFS 哈希值,這樣就可以從 IPFS 網(wǎng)關(guān)獲取對應(yīng)內(nèi)容。 先介紹下那個 URI。

我們用 NFT 創(chuàng)建的 uri 看起來像 ipfs://Qm...。 我們之所以這樣創(chuàng)建,是因為 IPFS 桌面客戶端默認(rèn)允許你點擊并打開這樣的鏈接。 另外,Brave 瀏覽器也支持粘貼這樣的鏈接。 并且我們認(rèn)為這種鏈接形式會隨著 IPFS 的發(fā)展得到越來越多的支持。

然而,在這里下,我們需要在利用哈希來從 IPFS 公共網(wǎng)關(guān)獲取內(nèi)容,并在頁面上顯示。因此鏈接會是這樣:

https://ipfs.io/ipfs/QmRZdc3mAMXpv6Akz9Ekp1y4vDSjazTx2dCQRkxVy1yUj6

現(xiàn)在,如果你訪問我們的應(yīng)用程序中獲取代幣數(shù)據(jù),會看到如下界面:

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

這是一個真正的活的數(shù)字資產(chǎn)! 你的視頻可能會有所不同,但希望你在應(yīng)用中感受到相同的體驗。

最后

這是一個非常簡單的應(yīng)用,你可以做很多事情讓它變得更漂亮,讓它的交互性更強(qiáng),甚至可以為它添加更多的 Flow 元素。 Flow JS SDK 的功能很強(qiáng)大,所以我推薦大家閱讀一下文檔。

在第二部分成功地使用 Flow 為應(yīng)用添加了身份驗證,創(chuàng)建了一個接口來獲取 NFT 的信息,創(chuàng)建了一種方法來顯示了原始元數(shù)據(jù)以及對應(yīng)的底層標(biāo)的資產(chǎn)。 這一切都由 Flow 區(qū)塊鏈和 IPFS 來保障。 我們知道 NFT 是由誰擁有,也知道顯示的內(nèi)容是有效性,因為哈希值被編碼到 NFT 中。

在本教程的最后一篇,我們將專注于創(chuàng)建一個迷你交易市場,讓我們轉(zhuǎn)移 NFT。

以上就是NFT教程:如何展示Flow和IPFS上的NFT收藏品的詳細(xì)內(nèi)容,更多關(guān)于展示NFT收藏品教程的資料請關(guān)注腳本之家其它相關(guān)文章!

免責(zé)聲明:本文只為提供市場訊息,所有內(nèi)容及觀點僅供參考,不構(gòu)成投資建議,不代表本站觀點和立場。投資者應(yīng)自行決策與交易,對投資者交易形成的直接或間接損失,作者及本站將不承擔(dān)任何責(zé)任。!

你可能感興趣的文章

幣圈快訊

  • Forma:將關(guān)停FormaChainNFT將遷移至以太坊L1

    2026-07-26 10:56
    Forma在X平臺宣布,經(jīng)過慎重考慮,決定關(guān)停FormaChain,原因是運(yùn)營該鏈已不可持續(xù)。 作為過渡方案,Modularium和FormaNFT將遷移至以太坊L1,確保藝術(shù)品和市場永久存續(xù)。遷移后,NFT仍可訪問,并可在OpenSea或其他以太坊市場進(jìn)行交易,Modularium將繼續(xù)作為這些收藏品的展示平臺。 團(tuán)隊強(qiáng)烈建議用戶通過Forma橋提取資金。任何未及時提取的資金將被手動遷移至一個待后續(xù)公布的EVM兼容鏈。 團(tuán)隊強(qiáng)調(diào),用戶資金和NFT均安全,后續(xù)將公布具體的時間線和遷移步驟。
  • 某巨鯨過去一周增持158萬枚LINK約合1320萬美元

    2026-07-26 10:36
    7月26日,據(jù)OnchainLens監(jiān)測,過去一周,某巨鯨通過多筆交易從Binance累計買入158萬枚LINK,價值約1320萬美元。
  • 8款含惡意軟件游戲感染約8000臺設(shè)備80個加密錢包至少22萬美元資產(chǎn)被轉(zhuǎn)移

    2026-07-26 10:34
    美國聯(lián)邦調(diào)查人員指控,8款被植入惡意軟件的可下載游戲感染約8000臺設(shè)備,攻擊者據(jù)此訪問約80個加密貨幣錢包,并轉(zhuǎn)移至少22萬美元數(shù)字資產(chǎn)。FBI正在繼續(xù)調(diào)查并尋找潛在受害者。刑事起訴書顯示,該行動自2024年5月持續(xù)至2026年2月。21歲的佛羅里達(dá)州NorthLauderdale居民ZyaireDontaeviousZamarionWilkins被指為惡意軟件行動提供資金支持,并協(xié)助推廣相關(guān)活動。法院文件顯示,相關(guān)軟件在用戶安裝游戲后收集密碼、錢包憑證、瀏覽器數(shù)據(jù)及其他敏感信息。調(diào)查人員稱,Discord、Telegram、X和LinkedIn被用于推廣這些游戲,自動化機(jī)器人還在在線社區(qū)尋找持有大量加密貨幣的用戶。FBI正在收集下載BlockBlasters、Chemia、Dashverse/DashFPS、Lampy、Lunara、PirateFi、Tokenova或其他相關(guān)游戲人員的信息。Wilkins目前面臨一項共謀為私人經(jīng)濟(jì)利益獲取計算機(jī)信息的指控,最高可判10年監(jiān)禁。
  • 持有1330萬美元LINK某巨鯨過去一周從幣安累計增持158萬枚

    2026-07-26 10:26
    據(jù)OnchainLens監(jiān)測,某巨鯨過去一周通過多筆來自幣安的轉(zhuǎn)賬累計增持158萬枚LINK,價值約1,320萬美元。目前該巨鯨持有158萬枚LINK,價值約1,330萬美元。
  • BitMart宣布有序停止運(yùn)營8月26日起關(guān)閉全部交易服務(wù)

    2026-07-26 10:19
    據(jù)官方公告,BitMart宣布經(jīng)評估經(jīng)營狀況、市場環(huán)境及未來戰(zhàn)略方向,平臺決定有序停止交易業(yè)務(wù)。自7月26日01:30(UTC)起,BitMart將逐步停止新用戶注冊及加密貨幣、法幣充值,合約賬戶進(jìn)入僅減倉模式,現(xiàn)貨停止接受新訂單,跟單、網(wǎng)格及API交易等自動化服務(wù)也將逐步關(guān)閉。 自8月26日01:00(UTC)起,BitMart將停止全部現(xiàn)貨、合約及其他交易服務(wù),屆時仍未關(guān)閉的合約倉位可能按照標(biāo)記價格、指數(shù)價格或適用結(jié)算規(guī)則處理。理財、質(zhì)押、借貸及Launchpad等產(chǎn)品將分階段終止,具體贖回與結(jié)算安排另行通知。 平臺計劃于2027年1月31日15:59(UTC)正式停止交易平臺運(yùn)營。停運(yùn)后,用戶仍可在指定期限內(nèi)登錄賬戶、查看歷史記錄并提交提現(xiàn)申請。BitMart建議用戶在8月26日01:00前完成身份驗證并關(guān)閉所有倉位,并在當(dāng)日05:00前提交提現(xiàn)申請。 提現(xiàn)服務(wù)目前仍可使用,但部分申請可能因KYC、設(shè)備與賬戶安全、資金來源、提現(xiàn)地址、TravelRule、制裁篩查等要求接受人工審查。BitMart提醒用戶提前下載并保存賬戶余額、充提幣及交易記錄,同時警惕冒充平臺人員收取「加急費(fèi)」「解凍費(fèi)」或索要密碼、驗證碼、私鑰及助記詞的詐騙行為。
  • 查看更多
更多

熱門幣種

  • 幣種
    最新價格
    24H漲跌幅
  • bitcoin BTC 比特幣

    BTC

    比特幣

    $ 64527.15¥ 436861.71
    +0.78%
  • ethereum ETH 以太坊

    ETH

    以太坊

    $ 1881.04¥ 12735.01
    +1.16%
  • tether USDT 泰達(dá)幣

    USDT

    泰達(dá)幣

    $ 0.999¥ 6.7634
    +0%
  • binance-coin BNB 幣安幣

    BNB

    幣安幣

    $ 570.27¥ 3860.84
    +0.76%
  • usdc USDC USD Coin

    USDC

    USD Coin

    $ 1.0008¥ 6.7756
    +0%
  • ripple XRP 瑞波幣

    XRP

    瑞波幣

    $ 1.1007¥ 7.4519
    +0.7%
  • solana SOL Solana

    SOL

    Solana

    $ 74.9113¥ 507.16
    +1.1%
  • tron TRX 波場

    TRX

    波場

    $ 0.3312¥ 2.2422
    +0%
  • hyperliquid HYPE Hyperliquid

    HYPE

    Hyperliquid

    $ 58.5717¥ 396.54
    +2.31%
  • dogecoin DOGE 狗狗幣

    DOGE

    狗狗幣

    $ 0.072511¥ 0.4909
    +4.08%
合肥市| 探索| 兴隆县| 田阳县| 沛县| 郓城县| 岐山县| 招远市| 锡林浩特市| 台南县| 南靖县| 榆树市| 广州市| 沅陵县| 通山县| 东海县| 马公市| 理塘县| 钟祥市| 铁岭县| 新龙县| 张家港市| 宁夏| 揭西县| 江陵县| 承德县| 辰溪县| 北辰区| 六安市| 瑞丽市| 连江县| 通渭县| 墨玉县| 黄梅县| 满城县| 吴旗县| 磐安县| 天门市| 师宗县| 辽中县| 磐安县|