自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

如何使用Flow和IPFS創(chuàng)建NFT

開發(fā) 后端
隨著不可替代令牌(NFT)市場達(dá)到高潮,回顧一下相對(duì)較早的NFT并記住CryptoKitties面臨的挑戰(zhàn)是很有趣的。由Dapper Labs團(tuán)隊(duì)構(gòu)建的平臺(tái)是潛在大規(guī)模采用的第一個(gè)真實(shí)示例,也是以太坊區(qū)塊鏈上的第一個(gè)真實(shí)壓力。

[[389053]]

本文轉(zhuǎn)載自微信公眾號(hào)「區(qū)塊鏈研究實(shí)驗(yàn)室」,作者鏈三豐。轉(zhuǎn)載本文請(qǐng)聯(lián)系區(qū)塊鏈研究實(shí)驗(yàn)室公眾號(hào)。

隨著不可替代令牌(NFT)市場達(dá)到高潮,回顧一下相對(duì)較早的NFT并記住CryptoKitties面臨的挑戰(zhàn)是很有趣的。由Dapper Labs團(tuán)隊(duì)構(gòu)建的平臺(tái)是潛在大規(guī)模采用的第一個(gè)真實(shí)示例,也是以太坊區(qū)塊鏈上的第一個(gè)真實(shí)壓力。

從那時(shí)起,NFT開始興起,諸如Rarible,OpenSea,F(xiàn)oundation和Sorare之類的平臺(tái)也開始興起。這些平臺(tái)每月有數(shù)百萬美元的資金流向。盡管有早期的掙扎,但大多數(shù)情況還是在以太坊區(qū)塊鏈上發(fā)生的。但是,Dapper Labs的團(tuán)隊(duì)在使用CryptoKitties的經(jīng)驗(yàn)之后,著手建立一個(gè)新的區(qū)塊鏈,該區(qū)塊鏈將是通用的,但也非常適合NFT用例。這樣做的目的是解決以太坊上的NFT所遇到的許多問題,同時(shí)為該領(lǐng)域的開發(fā)商和收藏家提供更好的體驗(yàn)。

今天我們討論如何在由IPFS支持的Flow上創(chuàng)建NFT。Flow區(qū)塊鏈的主要早期應(yīng)用之一是NBA Top Shot。我們將構(gòu)建NFT鑄造過程的非?;镜母北荆缓笤贗PFS上備份NFT元數(shù)據(jù)和資產(chǎn)。

這是一個(gè)包含以下三部分的教程:

  • 創(chuàng)建合約并鑄造代幣
  • 創(chuàng)建一個(gè)應(yīng)用以查看通過此合同創(chuàng)建的NFT
  • 創(chuàng)建一個(gè)市場以將NFT轉(zhuǎn)讓給其他人,同時(shí)也轉(zhuǎn)讓NFT在IPFS上的基礎(chǔ)資產(chǎn)

今天讓我們開始第一個(gè)教程。

配置

我們需要安裝Flow CLI:

蘋果系統(tǒng):

  1. brew install flow-cli 

Linux:

  1. sh -ci “$(curl -fsSL https://storage.googleapis.com/flow-cli/install.sh)" 

Windows:

  1. iex “& { $(irm ‘https://storage.googleapis.com/flow-cli/install.ps1') }” 

我們將在IPFS上存儲(chǔ)資產(chǎn)文件。為了簡化操作,我們可以使用Pinata。您可以在此處注冊(cè)一個(gè)免費(fèi)帳戶,并在此處獲取API密鑰。在本教程的第二篇文章中,我們將使用API,但在這篇文章中,我們將使用Pinata網(wǎng)站。

我們還需要安裝NodeJS和文本編輯器,以幫助突出顯示Flow智能合約代碼(以Cadence語言編寫)的語法。您可以在此處安裝Node。Visual Studio Code具有支持Cadence的擴(kuò)展。

安裝好之后,讓我們創(chuàng)建一個(gè)目錄來容納我們的項(xiàng)目:

  1. mkdir pinata-party 

轉(zhuǎn)到該目錄并初始化一個(gè)新的流程項(xiàng)目:

  1. cd pinata-party 
  2. flow project init 

現(xiàn)在,在您喜歡的代碼編輯器中打開項(xiàng)目(同樣,如果您使用Visual Studio Code,請(qǐng)抓住Cadence擴(kuò)展),然后開始工作。

您會(huì)看到一個(gè)flow.json文件,我們將很快使用它。首先,創(chuàng)建一個(gè)名為的文件夾cadence。在該文件夾中,添加另一個(gè)名為的文件夾contracts。最后,在contracts名為的文件夾中創(chuàng)建一個(gè)文件PinataPartyContract.cdc。

在繼續(xù)前進(jìn)之前,重要的一點(diǎn)是要指出,從現(xiàn)在開始,我們對(duì)Flow區(qū)塊鏈所做的一切都將在模擬器上完成。但是,將項(xiàng)目部署到testnet或mainnet就像更新flow.json文件中的配置設(shè)置一樣簡單?,F(xiàn)在讓我們?yōu)榉抡嫫鳝h(huán)境設(shè)置該文件,然后就可以開始編寫合同了。

更新合同對(duì)象,flow.json如下所示:

  1. "contracts": { 
  2.      "PinataPartyContract""./cadence/contracts/PinataPartyContract.cdc" 

然后,更新該deployments文件中的對(duì)象,如下所示:

  1. "deployments": { 
  2.      "emulator": { 
  3.           "emulator-account": ["PinataPartyContract"
  4.      } 

這是在告訴Flow CLI使用仿真器來部署我們的合同,它還引用了該帳戶(在仿真器上)和我們即將寫的合同。

合約

Flow提供了有關(guān)創(chuàng)建NFT合約的出色教程。這是一個(gè)很好的參考點(diǎn),但是正如Flow指出的那樣,他們尚未解決NFT元數(shù)據(jù)問題。他們想在鏈上存儲(chǔ)元數(shù)據(jù)。那是個(gè)好主意,他們一定會(huì)提出一個(gè)合乎邏輯的方法。但是,我們現(xiàn)在想用元數(shù)據(jù)創(chuàng)建一些令牌,并且我們希望與NFT相關(guān)聯(lián)的媒體文件。元數(shù)據(jù)只是一個(gè)組成部分。我們還需要指出令牌最終代表的媒體。

如果您熟悉以太坊區(qū)塊鏈上的NFT,您可能會(huì)知道這些令牌返回的許多資產(chǎn)都存儲(chǔ)在傳統(tǒng)數(shù)據(jù)存儲(chǔ)和云托管提供商中??梢?,除非不是。過去我們?cè)鴮戇^關(guān)于內(nèi)容可尋址內(nèi)容的天才之處,以及在傳統(tǒng)云平臺(tái)上存儲(chǔ)與區(qū)塊鏈相鄰的數(shù)據(jù)的弊端。歸結(jié)為兩點(diǎn):

  • 資產(chǎn)應(yīng)該是可驗(yàn)證的
  • 維護(hù)職責(zé)的轉(zhuǎn)移應(yīng)該很容易

IPFS照顧了這兩個(gè)方面。然后,Pinata以一種簡單的方式分層,以將該內(nèi)容長期固定在IPFS上。這正是我們想要支持NFT的媒體所需要的,對(duì)嗎?我們要確??梢宰C明所有權(quán)(NFT),提供有關(guān)NFT(NFT)的數(shù)據(jù),并確保我們對(duì)基礎(chǔ)資產(chǎn)(IPFS)(介質(zhì)或其他)擁有控制權(quán),而不是某些副本的控制權(quán)。

考慮到所有這些,讓我們寫一個(gè)合約,創(chuàng)建NFT,將元數(shù)據(jù)與NFT相關(guān)聯(lián),并確保元數(shù)據(jù)指向存儲(chǔ)在IPFS上的基礎(chǔ)資產(chǎn)。

打開PinataPartyContract.cdc,讓我們開始工作。

  1. pub contract PinataPartyContract { 
  2.   pub resource NFT { 
  3.     pub let id: UInt64 
  4.     init(initID: UInt64) { 
  5.       self.id = initID 
  6.     } 
  7.   } 

第一步是定義我們的合同。我們將為此添加更多的內(nèi)容,但是我們首先定義PinataPartyContract并在其中創(chuàng)建一個(gè)resource。資源是存儲(chǔ)在用戶帳戶中的項(xiàng)目,可以通過訪問控制措施進(jìn)行訪問。在這種情況下,NFT資源最終是因?yàn)閾碛杏糜诒硎綨FT的事物而擁有的。NFT必須是唯一可識(shí)別的。該id屬性使我們能夠識(shí)別令牌。

接下來,我們需要?jiǎng)?chuàng)建一個(gè)資源接口,該接口將用于定義哪些功能可供其他人(即不是合同所有者的人)使用:

  1. pub resource interface NFTReceiver { 
  2.   pub fun deposit(token: @NFT, metadata: {String : String}) 
  3.   pub fun getIDs(): [UInt64] 
  4.   pub fun idExists(id: UInt64): Bool 
  5.   pub fun getMetadata(id: UInt64) : {String : String} 

將其放在NFT資源代碼下方。此NFTReceiver資源接口表示,我們定義為有權(quán)訪問該資源的任何人都可以調(diào)用以下方法:

  • deposit
  • getIDs
  • idExists
  • getMetadata

接下來,我們需要定義我們的令牌收集接口??梢詫⑵湟暈槿菁{所有用戶NFT的錢包。

  1. pub resource Collection: NFTReceiver { 
  2.     pub var ownedNFTs: @{UInt64: NFT} 
  3.     pub var metadataObjs: {UInt64: { String : String }} 
  4.  
  5.     init () { 
  6.         self.ownedNFTs <- {} 
  7.         self.metadataObjs = {} 
  8.     } 
  9.  
  10.     pub fun withdraw(withdrawID: UInt64): @NFT { 
  11.         let token <- self.ownedNFTs.remove(key: withdrawID)! 
  12.  
  13.         return <-token 
  14.     } 
  15.  
  16.     pub fun deposit(token: @NFT, metadata: {String : String}) { 
  17.         self.metadataObjs[token.id] = metadata 
  18.         self.ownedNFTs[token.id] <-! token 
  19.     } 
  20.  
  21.     pub fun idExists(id: UInt64): Bool { 
  22.         return self.ownedNFTs[id] != nil 
  23.     } 
  24.  
  25.     pub fun getIDs(): [UInt64] { 
  26.         return self.ownedNFTs.keys 
  27.     } 
  28.  
  29.     pub fun updateMetadata(id: UInt64, metadata: {String: String}) { 
  30.         self.metadataObjs[id] = metadata 
  31.     } 
  32.  
  33.     pub fun getMetadata(id: UInt64): {String : String} { 
  34.         return self.metadataObjs[id]! 
  35.     } 
  36.  
  37.     destroy() { 
  38.         destroy self.ownedNFTs 
  39.     } 
  40.   } 

此資源中有很多事情要做,但是應(yīng)該很快就有意義。首先,我們有一個(gè)名為的變量ownedNFTs。這很簡單。它跟蹤該合同中用戶擁有的所有NFT。

接下來,我們有一個(gè)名為的變量metadataObjs。這一點(diǎn)有點(diǎn)獨(dú)特,因?yàn)槲覀冋跀U(kuò)展Flow NFT合同功能,以存儲(chǔ)每個(gè)NFT的元數(shù)據(jù)映射。此變量將令牌ID映射到其關(guān)聯(lián)的元數(shù)據(jù),這意味著我們需要先設(shè)置令牌ID,然后才能進(jìn)行設(shè)置。

然后,我們初始化變量。對(duì)于Flow中資源中定義的變量,這是必需的。

最后,我們擁有NFT收集資源的所有可用功能。請(qǐng)注意,并非所有這些功能都可以使用。如果您還記得的話,我們?cè)贜FTReceiver資源界面的前面定義了任何人都可以使用的功能。

我確實(shí)要指出deposit功能。正如我們將默認(rèn)的Flow NFT合同擴(kuò)展為包括metadataObjs映射一樣,我們也在擴(kuò)展默認(rèn)deposit函數(shù)以采用的附加參數(shù)metadata。我們?yōu)槭裁丛谶@里這樣做?我們需要確保只有令牌的鑄造者才能將該元數(shù)據(jù)添加到令牌中。為了保持私密性,我們將最初添加的元數(shù)據(jù)限制在鑄造執(zhí)行中。

我們的合同代碼幾乎完成了。因此,在Collection資源下方,添加以下內(nèi)容:

  1. pub fun createEmptyCollection(): @Collection { 
  2.     return <- create Collection() 
  3.  
  4. pub resource NFTMinter { 
  5.     pub var idCount: UInt64 
  6.  
  7.     init() { 
  8.         self.idCount = 1 
  9.     } 
  10.  
  11.     pub fun mintNFT(): @NFT { 
  12.         var newNFT <- create NFT(initID: self.idCount) 
  13.  
  14.         self.idCount = self.idCount + 1 as UInt64 
  15.  
  16.         return <-newNFT 
  17.     } 

首先,我們有一個(gè)函數(shù),該函數(shù)在調(diào)用時(shí)會(huì)創(chuàng)建一個(gè)空的NFT集合。這樣,首次與我們的合同進(jìn)行交互的用戶將具有一個(gè)創(chuàng)建到Collection我們定義的資源的存儲(chǔ)位置。

之后,我們?cè)賱?chuàng)建一個(gè)資源。這很重要,因?yàn)闆]有它,我們將無法鑄造代幣。該NFTMinter資源包括idCount其遞增,以確保我們從來沒有對(duì)我們的NFT重復(fù)的ID。它還具有實(shí)際創(chuàng)建我們的NFT的功能。

在NFTMinter資源下方,添加主合同初始化程序:

  1. init() { 
  2.       self.account.save(<-self.createEmptyCollection(), to: /storage/NFTCollection) 
  3.       self.account.link<&{NFTReceiver}>(/public/NFTReceiver, target: /storage/NFTCollection) 
  4.       self.account.save(<-create NFTMinter(), to: /storage/NFTMinter) 

僅在部署合同時(shí)才調(diào)用此初始化函數(shù)。它做三件事:

  • 為集合的部署者創(chuàng)建一個(gè)空的集合,以便合同的所有者可以創(chuàng)建該合同的NFT并擁有該NFT。
  • Collection參考NFTReceiver我們?cè)陂_始時(shí)創(chuàng)建的界面,該資源在公共位置發(fā)布。這就是我們告訴合同的方式,NFTReceiver任何人都可以調(diào)用上定義的功能。
  • 該NFTMinter資源被保存在賬戶儲(chǔ)存合同的創(chuàng)造者。這意味著只有合同的創(chuàng)建者才能鑄造代幣。

完整的合同可以在這里找到。

現(xiàn)在我們準(zhǔn)備好了合同,讓我們部署它,對(duì)吧?好吧,我們可能應(yīng)該在Flow Playground上對(duì)其進(jìn)行測試。轉(zhuǎn)到那里,然后單擊左側(cè)邊欄中的第一個(gè)帳戶。用我們的合同代碼替換示例合同中的所有代碼,然后單擊“部署”。如果一切順利,您應(yīng)該在屏幕底部的日志窗口中看到這樣的日志:

  1. flow project start-emulator 

現(xiàn)在,我們準(zhǔn)備將合同部署到本地運(yùn)行的模擬器。在命令行中,運(yùn)行以下命令:

  1. flow project deploy 

現(xiàn)在,在仿真器運(yùn)行且flow.json文件配置正確的情況下,我們可以部署合同。只需運(yùn)行以下命令:

flow project deploy

如果一切順利,您應(yīng)該會(huì)看到類似以下的輸出:

Deploying 1 contracts for accounts: emulator-account

PinataPartyContract -> 0xf8d6e0586b0a20c7

現(xiàn)在,我們?cè)贔low仿真器上有一個(gè)合同,但是我們想要鑄造一個(gè)令牌。

鑄造NFT

在本教程的第二篇文章中,我們將致力于通過應(yīng)用程序和用戶界面使鑄造過程更加用戶友好。為了說明問題,并顯示元數(shù)據(jù)如何與Flow上的NFT一起使用,我們將使用Cadence腳本和命令行。

讓我們?cè)趐inata-party項(xiàng)目的根目錄下創(chuàng)建一個(gè)新目錄,并將其稱為transactions。創(chuàng)建該文件夾后,在其中創(chuàng)建一個(gè)名為的新文件MintPinataParty.cdc。

為了編寫交易,我們需要在提供給NFT的元數(shù)據(jù)中引用一個(gè)文件。為此,我們將通過Pinata將文件上傳到IPFS,您可以上傳任何想要的視頻文件。您可以真正上載任何資產(chǎn)文件并將其與NFT關(guān)聯(lián)。

上傳文件后,系統(tǒng)會(huì)為您提供IPFS哈希(通常稱為內(nèi)容標(biāo)識(shí)符或CID)。復(fù)制此哈希,因?yàn)槲覀儗⒃阼T造過程中使用它。

現(xiàn)在,在MintPinataParty.cdc文件內(nèi)添加以下內(nèi)容:

  1. import PinataPartyContract from 0xf8d6e0586b0a20c7 
  2.  
  3. transaction { 
  4.   let receiverRef: &{PinataPartyContract.NFTReceiver} 
  5.   let minterRef: &PinataPartyContract.NFTMinter 
  6.  
  7.   prepare(acct: AuthAccount) { 
  8.       self.receiverRef = acct.getCapability<&{PinataPartyContract.NFTReceiver}>(/public/NFTReceiver) 
  9.           .borrow() 
  10.           ?? panic("Could not borrow receiver reference")         
  11.  
  12.       self.minterRef = acct.borrow<&PinataPartyContract.NFTMinter>(from: /storage/NFTMinter) 
  13.           ?? panic("could not borrow minter reference"
  14.   } 
  15.  
  16.   execute { 
  17.       let metadata : {String : String} = { 
  18.           "name""The Big Swing"
  19.           "swing_velocity""29",  
  20.           "swing_angle""45",  
  21.           "rating""5"
  22.           "uri""ipfs://QmRZdc3mAMXpv6Akz9Ekp1y4vDSjazTx2dCQRkxVy1yUj6" 
  23.       } 
  24.       let newNFT <- self.minterRef.mintNFT() 
  25.  
  26.       self.receiverRef.deposit(token: <-newNFT, metadata: metadata) 
  27.  
  28.       log("NFT Minted and deposited to Account 2's Collection"
  29.   } 

這是一個(gè)非常簡單的事務(wù),這在很大程度上要感謝Flow為使事情變得容易而進(jìn)行的工作,但讓我們逐步進(jìn)行一下。首先,您會(huì)在頂部注意到import語句。如果您還記得的話,當(dāng)我們部署合同時(shí),我們會(huì)收到一個(gè)帳戶。這就是我們需要參考的內(nèi)容。因此,請(qǐng)?zhí)鎿Q0xf8d6e0586b0a20c7為您部署中的帳戶地址。

接下來,我們定義交易。這里發(fā)生的一切都與我們計(jì)劃執(zhí)行的交易有關(guān)。

我們?cè)诮灰字幸龅牡谝患率嵌x兩個(gè)參考變量receiverRef和minterRef。在這種情況下,我們既是NFT的接收者又是NFT的鑄造者。這兩個(gè)變量引用了我們?cè)诤贤袆?chuàng)建的資源。如果執(zhí)行事務(wù)的人無權(quán)訪問該資源,則事務(wù)將失敗。

接下來,我們有一個(gè)prepare功能。此功能獲取嘗試執(zhí)行交易的人員的帳戶信息并進(jìn)行一些驗(yàn)證。我們嘗試“借用”我們定義的NFTMinter和兩種資源上的可用功能NFTReceiver。如果執(zhí)行交易的人沒有訪問這些資源的權(quán)限,那么事情將會(huì)失敗。

最后,我們有我們的execute功能。此功能是我們?yōu)镹FT建立元數(shù)據(jù),創(chuàng)建NFT,然后關(guān)聯(lián)元數(shù)據(jù),然后再將NFT存入我們的帳戶的地方。如果您注意到的話,我創(chuàng)建了一個(gè)元數(shù)據(jù)變量。在該變量中,我添加了一些有關(guān)令牌的信息。由于我們的代幣表示在聚會(huì)上砸了一個(gè)披薩的事件,并且由于我們?cè)噲D復(fù)制您在NBA Top Shot中看到的大部分內(nèi)容,因此我在元數(shù)據(jù)中定義了一些統(tǒng)計(jì)信息。孩子揮動(dòng)棍子打皮納塔的速度,揮桿角度和等級(jí)。我只是在玩這些統(tǒng)計(jì)數(shù)據(jù)。但是,您將以類似的方式輸入對(duì)您的令牌有意義的任何信息。

您會(huì)注意到,我也在uri元數(shù)據(jù)中定義了一個(gè)屬性。這將指向承載與NFT關(guān)聯(lián)的資產(chǎn)文件的IPFS哈希。在這種情況下,這是被擊中的Pi?ata的實(shí)際視頻。您可以使用之前上傳文件后收到的哈希值替換哈希值。

ipfs://出于幾個(gè)原因,我們?yōu)楣L砑忧熬Y。這是IPFS上文件的正確參考,可以與IPFS的桌面客戶端和瀏覽器擴(kuò)展一起使用?,F(xiàn)在,我們?yōu)镮PFS內(nèi)容提供了本機(jī)支持,我們也可以將其直接粘貼到Brave瀏覽器中。

我們調(diào)用mintNFT創(chuàng)建令牌的函數(shù)。然后,我們必須調(diào)用該deposit函數(shù)以將其放入我們的帳戶。這也是我們傳遞元數(shù)據(jù)的地方。請(qǐng)記住,我們?cè)赿eposit函數(shù)中定義了一個(gè)變量關(guān)聯(lián),該關(guān)聯(lián)將元數(shù)據(jù)添加到關(guān)聯(lián)的令牌ID。

最后,我們簡單地注銷令牌已鑄造和存放的事實(shí)。

現(xiàn)在,我們幾乎準(zhǔn)備發(fā)送交易并創(chuàng)建NFT。但是首先,我們需要準(zhǔn)備我們的賬戶。從項(xiàng)目的根文件夾中的命令行,讓我們創(chuàng)建一個(gè)用于簽名的新私鑰。

運(yùn)行以下命令:

  1. flow keys generate 

這將為您提供一個(gè)公鑰和一個(gè)私鑰。**始終保護(hù)您的私鑰**

我們將需要私鑰來簽署交易,因此我們可以將其粘貼到我們的flow.json文件中。我們還需要指定簽名算法。這是文件中的accounts對(duì)象flow.json現(xiàn)在應(yīng)如下所示:

  1. "accounts": { 
  2.   "emulator-account": { 
  3.      "address""YOUR ACCOUNT ADDRESS"
  4.      "privateKey""YOUR PRIVATE KEY"
  5.      "chain""flow-emulator"
  6.      "sigAlgorithm""ECDSA_P256"
  7.      "hashAlgorithm""SHA3_256" 
  8.   } 
  9. }, 

如果您打算將此項(xiàng)目中的任何一個(gè)存儲(chǔ)在github或任何遠(yuǎn)程git存儲(chǔ)庫上,請(qǐng)確保不包括私鑰。您可能想要.gitignore全部flow.json。即使我們僅使用本地仿真器,還是保護(hù)您的密鑰的一種很好的做法。

現(xiàn)在我們已經(jīng)更新了,我們可以發(fā)送交易了。這樣做就像運(yùn)行以下命令一樣簡單:

  1. flow transactions send --code ./transactions/MintPinataParty.cdc --signer emulator-account 

我們從中引用了我們編寫的交易文件和簽名人帳戶flow.json。如果一切順利,您應(yīng)該會(huì)看到類似以下的輸出:

Getting information for account with address 0xf8d6e0586b0a20c7 ...

Submitting transaction with ID 4a79102747a450f65b6aab06a77161af196c3f7151b2400b3b3d09ade3b69823 ...

Successfully submitted transaction with ID 4a79102747a450f65b6aab06a77161af196c3f7151b2400b3b3d09ade3b69823

現(xiàn)在,我們要做的最后一件事是驗(yàn)證令牌是否在我們的帳戶中并獲取元數(shù)據(jù)。這樣做,我們將編寫一個(gè)非常簡單的腳本并從命令行調(diào)用它。

在項(xiàng)目的根目錄中,創(chuàng)建一個(gè)名為的新文件夾scripts。在其中創(chuàng)建一個(gè)名為的文件CheckTokenMetadata.cdc。在該文件中,添加以下內(nèi)容:

  1. import PinataPartyContract from 0xf8d6e0586b0a20c7 
  2.  
  3. pub fun main() : {String : String} { 
  4.     let nftOwner = getAccount(0xf8d6e0586b0a20c7) 
  5.     // log("NFT Owner")     
  6.     let capability = nftOwner.getCapability<&{PinataPartyContract.NFTReceiver}>(/public/NFTReceiver) 
  7.  
  8.     let receiverRef = capability.borrow() 
  9.         ?? panic("Could not borrow the receiver reference"
  10.  
  11.     return receiverRef.getMetadata(id: 1) 

可以以類似于以太坊智能合約上的只讀方法的方式來考慮該腳本。他們是免費(fèi)的,只需從合同中返回?cái)?shù)據(jù)。

在我們的腳本中,我們正在從部署的地址導(dǎo)入我們的合同。然后,我們定義一個(gè)main函數(shù)(這是運(yùn)行腳本所需的函數(shù)名稱)。在此函數(shù)內(nèi)部,我們定義了三個(gè)變量:

  • nftOwner:這只是擁有NFT的帳戶。我們從也部署了合同的帳戶中鑄造了NFT,因此在我們的示例中,這兩個(gè)地址是相同的。取決于將來的合同設(shè)計(jì),這可能并不總是正確的。
  • 功能:我們需要從已部署的合同中“借用”可用的功能(或功能)。請(qǐng)記住,這些功能是受訪問控制的,因此,如果某功能對(duì)于嘗試借用它的地址不可用,則腳本將失敗。我們正在從NFTReceiver資源中借用能力。
  • receiverRef:該變量只是利用我們的能力,并告訴腳本從已部署的合同中借用。

現(xiàn)在,我們可以調(diào)用函數(shù)(可用的函數(shù))了。在這種情況下,我們要確保所討論的地址實(shí)際上已收到我們鑄造的NFT,然后我們要查看與令牌關(guān)聯(lián)的元數(shù)據(jù)。

讓我們運(yùn)行我們的腳本,看看我們得到了什么。在命令行上運(yùn)行以下命令:

  1. flow scripts execute ./scripts/CheckTokenMetadata.cdc 

對(duì)于元數(shù)據(jù)輸出,您應(yīng)該看到類似以下的輸出:

  1. {"name""The Big Swing""swing_velocity""29""swing_angle""45""rating""5""uri""ipfs://QmRZdc3mAMXpv6Akz9Ekp1y4vDSjazTx2dCQRkxVy1yUj6"

恭喜你!您已成功創(chuàng)建Flow智能合約,鑄造了令牌以及與該令牌相關(guān)的元數(shù)據(jù),并將該令牌的基礎(chǔ)數(shù)字資產(chǎn)存儲(chǔ)在IPFS上。接下來第二個(gè)部分的教程將構(gòu)建一個(gè)簡單的React應(yīng)用程序,該應(yīng)用程序與Flow智能合約對(duì)接,以進(jìn)行身份驗(yàn)證并獲取用戶擁有的NFT,敬請(qǐng)期待。

 

責(zé)任編輯:武曉燕 來源: 區(qū)塊鏈研究實(shí)驗(yàn)室
相關(guān)推薦

2022-10-11 09:05:58

IPFS區(qū)塊鏈存儲(chǔ)

2021-09-23 11:53:06

網(wǎng)絡(luò)安全數(shù)據(jù)技術(shù)

2022-04-08 08:00:00

NFT數(shù)字資產(chǎn)騙局

2021-06-01 09:27:52

視頻動(dòng)畫Remotion

2021-03-11 19:13:04

NFT合約智能

2021-04-08 18:39:57

JavaScriptExpress區(qū)塊鏈

2023-04-01 10:32:36

2023-06-29 14:34:49

2022-09-23 15:38:19

NFT電影業(yè)代幣

2021-04-27 14:49:14

IPFS分布式協(xié)議

2021-05-13 16:13:21

區(qū)塊鏈以太坊NFT

2022-05-30 15:27:48

數(shù)字資產(chǎn)NFT區(qū)塊鏈

2023-06-28 15:53:25

虛擬機(jī)Linux

2018-09-30 14:45:15

IPFSHTTP互聯(lián)網(wǎng)協(xié)議

2022-08-04 14:36:55

NFT加密錢包黑客

2021-05-14 14:33:07

Python加密貨幣

2023-11-27 08:24:57

FormikReact

2011-05-24 10:24:29

創(chuàng)建與使用VMware

2009-08-06 16:44:03

C#創(chuàng)建WebServ

2014-05-12 16:40:13

Linux命令快照
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)