最新国产好看的视频,伊人天堂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智能合約交互,以驗(yàn)證和獲取用戶擁有的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智能合約交互,以驗(yàn)證和獲取用戶擁有的 NFT。然后,我們將解析 NFT 的元數(shù)據(jù),以獲得 NFT 的底層標(biāo)的資產(chǎn)(在本例中為視頻)的 IPFS 位置。 提醒一下我們正在打造的 NFT,就像 NBA Top Shot 一樣,只不過是不同的視頻內(nèi)容。

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

項(xiàng)目設(shè)置

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

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

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

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

初始化 React 和安裝依賴

在第一部分教程中創(chuàng)建的 pinata-party 項(xiàng)目目錄下創(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。用部署項(xiàng)目時獲得的地址替換 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)站,教程的第三篇文章,在實(shí)現(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)用程序中。 我們先簡單點(diǎn)吧。 將你的 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)該會看到一個有登錄和注冊按鈕的頁面。 事實(shí)上,這兩個按鈕都是有功能的, 試試吧。

好了,現(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ǎn)擊獲取按鈕時,它會調(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ù)的按鈕。

我還加了一點(diǎn) 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)你點(diǎn)擊一個哈希值時,你會被帶到 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)建,是因?yàn)?IPFS 桌面客戶端默認(rèn)允許你點(diǎ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àn)。

最后

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

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

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

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

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

你可能感興趣的文章

幣圈快訊

  • Anthropic澄清立場:從未主張禁止開放權(quán)重AI模型

    2026-07-28 07:02
    7月28日,Anthropic表示,其從未倡導(dǎo)禁止開放權(quán)重AI模型,對近期的相關(guān)說法予以反駁。該公司首席執(zhí)行官達(dá)里奧·阿莫代伊稱,公司并不同意開放權(quán)重模型天然更利于AI安全防護(hù)開發(fā)的觀點(diǎn)。這一聲明凸顯了行業(yè)內(nèi)關(guān)于開放AI發(fā)展與安全之間平衡的持續(xù)爭論。
  • 預(yù)測市場預(yù)計(jì)GPT-69月30日前公開發(fā)布概率升至約78%

    2026-07-28 07:01
    7月28日,預(yù)測市場交易者將OpenAI在9月30日前公開發(fā)布GPT-6的概率定價(jià)在約78%。Polymarket相關(guān)市場交易量約73.1萬美元,較上一索引快照增加約3.2萬美元,9月30日前發(fā)布合約概率升至77%,8月31日前發(fā)布概率處于30%中段,8月21日前發(fā)布概率降至15%。Myriad上9月發(fā)布概率同樣升至77%,高于上周的64%。截至7月27日,OpenAI尚未公開宣布GPT-6、技術(shù)設(shè)計(jì)或發(fā)布日期,其當(dāng)前旗艦通用模型GPT-5.6Sol于7月9日公開發(fā)布。OpenAI此前確認(rèn),GPT-5.6Sol及一個能力更強(qiáng)的預(yù)發(fā)布模型在網(wǎng)絡(luò)安全評估期間攻破HuggingFace。公司還宣布在都柏林新增250個崗位,軟銀通過400億美元過橋貸款為其OpenAI相關(guān)推進(jìn)提供融資。
  • ETH跌破1900美元

    2026-07-28 06:59
    行情顯示,ETH跌破1900美元,現(xiàn)報(bào)1898.09美元,24小時跌幅2.61%,行情波動較大,請做好風(fēng)險(xiǎn)控制。
  • FranklinTempleton支持CLARITYAct貝萊德、富達(dá)等機(jī)構(gòu)此前已表態(tài)支持

    2026-07-28 06:58
    7月28日,資管公司FranklinTempleton于7月27日宣布支持CLARITYAct。FranklinResources此前披露,截至6月30日,旗下管理資產(chǎn)規(guī)模為1.79萬億美元,高于一個月前的1.78萬億美元。FranklinTempleton表示,CLARITYAct將為數(shù)字資產(chǎn)建立更清晰規(guī)則,幫助投資者了解可獲得的保護(hù),并提高企業(yè)對聯(lián)邦監(jiān)管職責(zé)劃分的確定性。Blackrock、FidelityInvestments、高盛和嘉信理財(cái)此前已公開支持該市場結(jié)構(gòu)法案。參議院共和黨人于7月22日公布更新文本,擬將數(shù)字資產(chǎn)監(jiān)管職責(zé)劃分給美國證券交易委員會(SEC)和美國商品期貨交易委員會(CFTC)。
  • 貝萊德支持CLARITYAct稱其為數(shù)字資產(chǎn)監(jiān)管框架的重要一步

    2026-07-28 06:56
    7月28日,全球最大資產(chǎn)管理公司貝萊德支持CLARITYAct。貝萊德高級董事總經(jīng)理、全球市場發(fā)展主管SamaraCohen表示,該法案是建立以投資者為先的數(shù)字資產(chǎn)監(jiān)管框架的重要一步。
  • 查看更多
更多

熱門幣種

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

    BTC

    比特幣

    $ 63846.94¥ 431764.93
    -2.37%
  • ethereum ETH 以太坊

    ETH

    以太坊

    $ 1897.09¥ 12829.07
    -2.71%
  • tether USDT 泰達(dá)幣

    USDT

    泰達(dá)幣

    $ 0.999¥ 6.7557
    -0.01%
  • binance-coin BNB 幣安幣

    BNB

    幣安幣

    $ 566.55¥ 3831.29
    -1.58%
  • usdc USDC USD Coin

    USDC

    USD Coin

    $ 1.0007¥ 6.7672
    -0.01%
  • ripple XRP 瑞波幣

    XRP

    瑞波幣

    $ 1.0673¥ 7.2176
    -4.01%
  • solana SOL Solana

    SOL

    Solana

    $ 74.1441¥ 501.39
    -3.28%
  • tron TRX 波場

    TRX

    波場

    $ 0.3263¥ 2.2066
    -1.78%
  • hyperliquid HYPE Hyperliquid

    HYPE

    Hyperliquid

    $ 56.2644¥ 380.48
    -5.84%
  • dogecoin DOGE 狗狗幣

    DOGE

    狗狗幣

    $ 0.070632¥ 0.4776
    -4.14%
陈巴尔虎旗| 咸宁市| 株洲县| 集贤县| 连江县| 武功县| 抚宁县| 龙陵县| 宁强县| 海伦市| 韩城市| 阳东县| 独山县| 潞西市| 芷江| 绿春县| 长海县| 乌拉特前旗| 邹平县| 邓州市| 恭城| 西乡县| 九江市| 云南省| 漳州市| 安塞县| 深圳市| 惠安县| 苍溪县| 浑源县| 新郑市| 西乌珠穆沁旗| 和田市| 巴彦淖尔市| 郁南县| 南京市| 利川市| 高要市| 乌兰浩特市| 丹江口市| 六盘水市|