NFT鏈上鑄造合成交易系統開發丨openseaNFT平臺搭建技術

Lyr96246466發表於2023-04-07

 nft指的是數字作品。NFT一般指數字作品。開發+18I鏈上合約-259l開發系統3365-/就是將圖片、文字、影片、音訊等數字化的

內容上傳到區塊鏈上,生成一串獨一無二,不可互換,不能篡改的程式碼。NFT全稱為Non-FungibleToken,翻譯過來是非同質

化通證。NFT就是一種在區塊鏈中註冊的獨特數字證書,可以用來記錄你的藝術品或者收藏品等資產的所有權。


NFT名詞解釋


NFT的評價有主觀和客觀兩個維度。NFT為非同質化代幣,與非同質化代幣NFT相對應的就是同質化代幣FT,NFT是區塊鏈的

一個條目,而區塊鏈是類似於比特幣等加密貨幣的去中心化數字賬本技術。現在,藝術家、音樂家、影響者和體育特許經營公

司都在使用NFT將以前廉價或免費的數字商品貨幣化。


該技術還響應了藝術界在日益數字化的世界中對認證和出處的需求,將一個數字檔案與其創作者永*地聯絡起來。NFT完全在

鏈上鑄造,如Avastars、Aavegotchis和ArtBlocksdrop,僅依賴於各自的以太坊智慧合約而存在。另一方面,一些NFT專案通

過使其NFT依賴於外部的鏈外提供商來選擇簡單性和靈活性。


Dapp是一種應用程式。18I鏈上合約-259l開發系統3365,DApp就是D+App。Dapp(去中心化應用程式)是一種在網路上公開

執行的軟體應用程式,他們與普通的應用程式沒有什麼區別,都擁有一樣的功能,但不同的是Dapp是在P2P網路上執行。


  App我們都知道是客戶端應用,是application的簡稱。DApp就是D+App,D是英文單詞

理解 tokenURI()

讓我們解釋一下 ERC721 tokenURI()函式的實現:


tokenURI()是 ERC721 標準的一個後設資料函式,在 OpenZeppelin 文件中 :


tokenURI(uint256 tokenId) → string 返回 tokenId 代幣的統一資源識別符號(URI)。


通常 tokenURI 會返回一個 URI。我們可以透過連線 baseURI 和 tokenId 來獲得每個 token 的 URI 結果。


在我們的tokenURI()中,將 URI 作為一個 base64 編碼的物件返回。


首先,構建物件。物件中的 svg 圖片也是 base64 編碼的:


{

"name":"Badge #1",

"description":"Badge NFT with on-chain SVG image."

"image":"data:image/svg+xml;base64,[svg base64 encoded]"

}

複製

然後我們返回 base64 編碼的物件:


data:application/json;base64,(object base64 encoded)

複製

Webapp 可以透過呼叫tokenURI(tokenId)獲得 URI,並解碼以獲得名稱、描述和 SVG 圖片。


這裡的 SVG 圖片由 LOOT 專案改編的。非常簡單,就是在圖片中顯示 tokenId:


<svg xmlns=' preserveAspectRatio='xMinYMin meet' viewBox='0 0 350 350'>

<style>.base { fill: white; font-family: serif; font-size: 300px; }</style>

<rect width='100%' height='100%' fill='brown' />

    <text x='100' y='260' class='base'>

    1

    </text>

</svg>

// test/BadgeToken.test.ts

import { expect } from "chai"

import { Signer } from "ethers"

import { ethers } from "hardhat"

import { BadgeToken } from  "../typechain"


const base64 = require( "base-64")


const _name='BadgeToken'

const _symbol='BADGE'


describe("BadgeToken", function () {

  let badge:BadgeToken

  let account0:Signer,account1:Signer


  beforeEach(async function () {

    [account0, account1] = await ethers.getSigners()

    const BadgeToken = await ethers.getContractFactory("BadgeToken")

    badge = await BadgeToken.deploy(_name,_symbol)

  })


  it("Should has the correct name and symbol ", async function () {

    expect(await badge.name()).to.equal(_name)

    expect(await badge.symbol()).to.equal(_symbol)

  })


  it("Should tokenId start from 1 and auto increment", async function () {

    const address1=await account1.getAddress()

    await badge.mintTo(address1)

    expect(await badge.ownerOf(1)).to.equal(address1)


    await badge.mintTo(address1)

    expect(await badge.ownerOf(2)).to.equal(address1)

    expect(await badge.balanceOf(address1)).to.equal(2)

  })


  it("Should mint a token with event", async function () {

    const address1=await account1.getAddress()

    await expect(badge.mintTo(address1))

      .to.emit(badge, 'Transfer')

      .withArgs(ethers.constants.AddressZero,address1, 1)

  })


  it("Should mint a token with desired tokenURI (log result for inspection)", async function () {

    const address1=await account1.getAddress()

    await badge.mintTo(address1)


    const tokenUri = await badge.tokenURI(1)

    // console.log("tokenURI:")

    // console.log(tokenUri)


    const tokenId = 1

    const data = base64.decode(tokenUri.slice(29))

    const itemInfo = JSON.parse(data)

    expect(itemInfo.name).to.be.equal('Badge #'+String(tokenId))

    expect(itemInfo.description).to.be.equal('Badge NFT with on-chain SVG image.')


    const svg = base64.decode(itemInfo.image.slice(26))

    const idInSVG = svg.slice(256,-13)

    expect(idInSVG).to.be.equal(String(tokenId))

    // console.log("SVG image:")

    // console.log(svg)

  })


  it("Should mint 10 token with desired tokenURI", async function () {

    const address1=await account1.getAddress()


    for(let i=1;i<=10;i++){

      await badge.mintTo(address1)

      const tokenUri = await badge.tokenURI(i)


      const data = base64.decode(tokenUri.slice(29))

      const itemInfo = JSON.parse(data)

      expect(itemInfo.name).to.be.equal('Badge #'+String(i))

      expect(itemInfo.description).to.be.equal('Badge NFT with on-chain SVG image.')


      const svg = base64.decode(itemInfo.image.slice(26))

      const idInSVG = svg.slice(256,-13)

      expect(idInSVG).to.be.equal(String(i))

    }


    expect(await badge.balanceOf(address1)).to.equal(10)

  })

})


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70012429/viewspace-2944376/,如需轉載,請註明出處,否則將追究法律責任。

相關文章