時間:2023-06-21|瀏覽:308
我們創建合約、鑄造代幣、構建應用程序以查看通過該合約生成的NFT以及創建市場以將NFT轉移給其他用戶的示例。讓我們從合約的創建和代幣鑄造開始。
設置工具
在您的系統上安裝FlowCLI。根據不同的操作系統,有不同的命令用于安裝CLI。
例如,要在macOS上安裝FlowCLI,請使用以下命令: ``` brew install flow-cli ```
在Windows上: ``` iex "$(irm 'https://storage.googleapis.com/flow-cli/install.ps1')" ```
在Linux上: ``` sh -ci "$(curl -fsSL https://storage.googleapis.com/flow-cli/install.sh)" ```
資產文件將存儲在IPFS上。在這個例子中,我們將使用Pinata來存儲文件。您可以在此處注冊免費帳戶并獲取API密鑰。安裝NodeJS和文本編輯器以突出顯示Flow智能合約代碼也很重要。
第二步是使用命令為項目創建目錄: ``` mkdir pinata-party ``` 初始化一個新的Flow項目并將其更改為該目錄: ``` cd pinata-party ```
現在,在代碼編輯器中打開項目,讓我們開始工作。首先,創建一個名為cadence的文件夾。在該文件夾中添加另一個名為contracts的文件夾。最后,在名為PinataPartyContract.cdc的合同文件夾中創建一個文件。
在繼續之前,有必要指出我們對Flow區塊鏈平臺所做的一切。為模擬器環境設置文件,然后我們就可以開始編寫合約了。我們需要使用以下代碼更新flow.json中的合約對象: ``` "contracts": { "PinataPartyContract": "./cadence/contracts/PinataPartyContract.cdc" } ``` 使用以下代碼更新該文件中的部署對象: ``` "deployments": { "emulator": { "emulator-account": [ "PinataPartyContract" ] } } ``` 它將使FlowCLI能夠使用模擬器來部署我們的合約。該代碼還引用了我們即將編寫的帳戶和合約。
合約
我們需要創建用于鑄造NFT的合約,將元數據與NFT相關聯,并確保元數據指向存儲在IPFS上的基礎資產。
打開PinataPartyContract.cdc并執行以下代碼: ``` contract PinataPartyContract { pub resource NFT { pub let id: UInt64
init(initID: UInt64) { self.id = initID } } } ``` 第一步是定義合同。讓我們從定義PinataPartyContract開始并在其中創建一個資源。資源是保存在用戶帳戶中的項目,可通過訪問控制措施訪問。NFT需要可識別,并且id屬性允許您識別令牌。
然后,創建一個資源接口來定義哪些功能可供其他人使用。 ``` pub resource interface NFTReceiver { pub fun deposit(token: @NFT, metadata: {String: String}) pub fun getIDs: [UInt64] pub fun idExists(id: UInt64): Bool pub fun getMetadata(id: UInt64): {String: String} } ``` 將上述代碼放在NFT資源代碼下方。NFTReceiver資源接口表示資源可以調用以下方法: - 獲取ID - 身份存在 - 存款 - 獲取元數據
然后,我們必須定義令牌收集接口。將其視為存儲所有用戶的NFT的錢包。 ``` pub resource collection: NFTReceiver { pub var ownedNFTs: @{UInt64: NFT} pub var metadataObjs: {UInt64: {String: String}}
init { self.ownedNFTs = {} self.metadataObjs = {} }
pub fun deposit(token: @NFT, metadata: {String: String}) { self.metadataObjs[token.id] = metadata self.ownedNFTs[token.id] <- token }
pub fun idExists(id: UInt64): Bool { return self.ownedNFTs[id] != nil }
// ... } ``` 變量ownedNFTs跟蹤用戶可以從接觸者擁有的所有NFT。一個名為metadataObjs的變量是獨一無二的,因為我們正在擴展FlowNFT合約功能以存儲每個NFT的元數據映射。它將令牌id映射到其相關的元數據,這意味著在我們設置之前需要令牌id。變量被初始化以在Flow中的資源中定義它們。
最后,我們將擁有NFT集合資源所需的所有可用功能。默認NFT合約被擴展為包含metadataObjs映射的方式,我們將擴展默認存款函數以采用額外的元數據參數。這樣做是為了確保只有令牌鑄幣者才能將元數據添加到令牌中。我們將最初添加的元數據限制在鑄幣執行中,以保持其私密性。在Collection資源下添加以下代碼: ``` pub resource NFTMinter { pub var idCount: UInt64
init { self.idCount = 1 }
pub fun mintNFT(): @NFT { let newNFT <- create NFT(initID: self.idCount) self.idCount = self.idCount + 1 as UInt64 return <-newNFT } } ``` 首先,我們將有一個函數在調用時創建一個空的NFT集合。與合約交互的用戶將擁有一個映射定義的Collection資源的存儲位置。之后我們將再創建一個資源。沒有它,我們就無法鑄造代幣。NFTMinter包含一個每次都會增加的idCount,以確保我們沒有NFT的重復id。它還包含創建NFT的功能。在NFTMinter資源下方添加主合約初始化程序: ``` init { self.account.save(<-self.createEmptyCollection, to: /storage/NFTCollection) self.account.link<&NFTReceiver>(/public/NFTReceiver, target: /storage/NFTCollection) self.account.save(<-self.createNFTMinter, to: /storage/NFTMinter) } ``` 初始化函數僅在部署合約時調用。它執行三件事: - 為集合部署者創建一個空集合,以便所有者合約可以從合約中創建和擁有NFT。 - NFTMinter資源存儲在合約創建者的