Cách tạo NFT như NBA TOP SHOT trên Flow và ipfs
FlowTimes福洛时代
2021-03-16 12:28
本文约9781字,阅读全文需要约39分钟
Chúng tôi sẽ xây dựng một ví dụ rất cơ bản và sau đó sao lưu siêu dữ liệu của NFT trên IPFS.

Với thị trường mã thông báo không thể thay thế (NFT)đạt đến cao trào, nhìn lại các NFT tương đối sớm và nhớ lạiCryptoKittiesNhững thử thách thật thú vị. Đây là bởiDapper LabsTrường hợp sử dụng quy mô lớn đầu tiên do nhóm xây dựng cũng lần đầu tiên đặt Ethereum dưới áp lực lưu lượng truy cập.

RaribleOpenSeaFoundationSorareCác nền tảng như thế này bắt đầu xuất hiện. Hàng triệu đô la tiền chảy qua các nền tảng này mỗi tháng, nhưng hầu hết điều này xảy ra trên chuỗi khối Ethereum. Tuy nhiên, khi nhóm tại Dapper Labs có kinh nghiệm phát triển CryptoKitties, họ bắt đầuTạo chuỗi công khai mới, chuỗi công khai sẽ phổ biến, nhưng cũng rất phù hợp cho sự phát triển của NFT. Mục tiêu của việc này là giải quyết nhiều vấn đề gặp phải với NFT trên Ethereum, đồng thời mang lại trải nghiệm tốt hơn cho các nhà phát triển và nhà sưu tập trong không gian. Chuỗi khối mới của họ, Flow, đã chứng tỏ khả năng giành được quan hệ đối tác với một số thương hiệu lớn. Ví dụNBA, UFC và thậm chí cả Tiến sĩ Seuss cũng đang được phát sóng.

Gần đây chúng tôi đã viết vềTạo NFT với hỗ trợ nội dung tích hợp trên IPFSbài báo và chúng tôi thảo luận về vấn đề trách nhiệm pháp lý trong không gian NFT và cách chúng tôi nghĩ rằng IPFS có thể giúp ích. Bây giờ là lúc để thảo luận về cách tạo nfts trên các luồng được cung cấp bởi IPFS. Một trong những ứng dụng ban đầu chính của chuỗi khối Flow làNBA Top Shot. Chúng tôi sẽ xây dựng một ví dụ rất cơ bản và sau đó sao lưu siêu dữ liệu của NFT trên IPFS.

bởi vì chúng tôi thíchpiñatas, chứ không phải là một video nổi bật của NBA, vì vậy, chúng tôi sẽ tạo một video về những con piñata có thể giao dịch được đập vỡ tại một bữa tiệc.

Đây là một hướng dẫn gồm ba phần:
1. Tạo hợp đồng và mã thông báo đúc
2. Tạo một ứng dụng để xem NFT được tạo bởi hợp đồng này
3. Tạo thị trường để chuyển NFT cho người khác, đồng thời chuyển tài sản cơ bản của NFT này trên IPFS

Hãy bắt đầu hướng dẫn đầu tiên.

cấu hình

Chúng ta cần cài đặt Flow CLI. Tài liệu của Flow có một số hướng dẫn cài đặt tốt, nhưng tôi sẽ sao chép chúng ở đây:

hệ thống táo
brew install flow-cli

Linux

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

Windows

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

Chúng tôi sẽ lưu trữ các tệp nội dung trên IPFS. Để đơn giản hóa mọi thứ, chúng ta có thể sử dụngPinata. Bạn có thể đăng ký một cái ở đâyTài khoản miễn phívà lấy khóa API tại đây. Trong phần thứ hai của hướng dẫn này, chúng ta sẽ sử dụngAPI, nhưng trong bài viết này, chúng tôi sẽ sử dụng trang web Pinata.

Chúng ta cũng cần cài đặt NodeJS và trình soạn thảo văn bản để giúp làm nổi bật mã hợp đồng thông minh Flow (bắt đầu bằngCadencengôn ngữ) cú pháp. Bạn có thể cài đặt Node tại đây. Mã Visual Studio cóHỗ trợ tiện ích mở rộng Cadence

Hãy tạo một thư mục để bắt đầu dự án của chúng ta.

mkdir pinata-party

Thay đổi thư mục đó và khởi tạo một dự án luồng mới:

cd pinata-party
flow project init

Bây giờ, hãy mở dự án trong trình chỉnh sửa mã yêu thích của bạn (một lần nữa, nếu bạn sử dụng Visual Studio Code, hãy cài đặt tiện ích mở rộng Cadence) và bắt đầu phát triển.

Bạn sẽ thấy tệp flow.json mà chúng tôi sẽ sớm sử dụng. Đầu tiên, tạo một thư mục có tên cadence. Trong thư mục đó, thêm một thư mục khác có tên là hợp đồng. Cuối cùng, tạo một tệp có tên PinataPartyContract.cdc trong thư mục hợp đồng.

Trước khi tiếp tục, điều quan trọng cần chỉ ra là mọi thứ chúng tôi làm với chuỗi khối Flow từ bây giờ sẽ được thực hiện trên trình giả lập. Tuy nhiên, việc triển khai dự án lên testnet hoặc mainnet cũng đơn giản như cập nhật cài đặt cấu hình trong tệp flow.json. Bây giờ, hãy thiết lập tệp này cho môi trường giả lập, sau đó chúng ta có thể bắt đầu viết hợp đồng.

Cập nhật các hợp đồng trong flow.json để trông như thế này:

"contracts": {
    "PinataPartyContract": "./cadence/contracts/PinataPartyContract.cdc"
}

Sau đó, cập nhật các triển khai trong flow.json như sau:

"deployments": {
    "emulator": {
         "emulator-account": ["PinataPartyContract"]
    }
}

Điều này thực sự yêu cầu Flow CLI sử dụng trình giả lập để triển khai hợp đồng của chúng tôi, nó cũng tham chiếu đến tài khoản (trên trình giả lập) và hợp đồng mà chúng tôi sắp viết.

hợp đồng

hợp đồng

Flow cung cấp hướng dẫn tuyệt vời về cách tạo hợp đồng NFT. Đây là một điểm tham chiếu tốt, nhưng với tư cách là FlowNhư đã chỉ ra, họ vẫn chưa giải quyết vấn đề siêu dữ liệu NFT. Họ muốn lưu trữ siêu dữ liệu trên chuỗi. Đó là một ý tưởng hay và chắc chắn họ sẽ đưa ra một cách tiếp cận hợp lý. Tuy nhiên, bây giờ chúng tôi muốn tạo một số mã thông báo có siêu dữ liệu và chúng tôi muốn các tệp phương tiện được liên kết với NFT. Siêu dữ liệu chỉ là một thành phần. Chúng tôi cũng cần chỉ ra mã thông báo cuối cùng đại diện cho tệp phương tiện nào.

Nếu bạn đã quen thuộc với NFT trên chuỗi khối Ethereum, bạn có thể biết rằng nhiều tài sản được trả lại bởi các mã thông báo này được lưu trữ trongCác nhà cung cấp dịch vụ đám mây và lưu trữ dữ liệu truyền thốngở giữa. Điều này là ổn miễn là họ không đi xuống. Trước đây, chúng tôi đã viết về việc tìm và lưu trữ nội dung trên nền tảng đám mây truyền thống so với chuỗi khối. Nó tập trung vào hai điểm:

  • Tài sản phải được kiểm chứng

  • Chuyển lưu trữ phải dễ dàng

IPFSCả hai khía cạnh đều được xem xét. Pinata sau đó được phân lớp theo cách dễ dàng để lưu trữ nội dung lâu dài trên IPFS. Đó chính xác là những gì chúng tôi cần cho phương tiện mà chúng tôi muốn hỗ trợ NFT, phải không? Chúng tôi muốn đảm bảo rằng chúng tôi có thể chứng minh quyền sở hữu (NFT), cung cấp dữ liệu về NFT (NFT) và đảm bảo rằng chúng tôi có quyền kiểm soát nội dung cơ bản (IPFS) - (tệp phương tiện hoặc bất kỳ thứ gì), chứ không phải một số bản sao. Với tất cả những điều này, hãy viết một hợp đồng tạo NFT, liên kết siêu dữ liệu với NFT và đảm bảo rằng siêu dữ liệu trỏ đến nội dung cơ bản được lưu trữ trên IPFS.

Mở PinataPartyContract.cdc và bắt đầu làm việc.

pub contract PinataPartyContract {
 pub resource NFT {
   pub let id: UInt64
   init(initID: UInt64) {
     self.id = initID
   }
 }
}

Bước đầu tiên là xác định hợp đồng của chúng tôi. Chúng tôi sẽ bổ sung thêm vào phần này, nhưng trước tiên, chúng tôi xác định PinataPartyContract và tạo một tài nguyên bên trong nó. Tài nguyên là các mục được lưu trữ trong tài khoản người dùng và có thể được truy cập thông qua các điều khiển truy cập. Trong trường hợp này, tài nguyên NFT cuối cùng được sở hữu bằng cách sở hữu thứ được sử dụng để đại diện cho NFT. NFT phải được nhận dạng duy nhất. Thuộc tính id cho phép chúng tôi xác định mã thông báo.

Tiếp theo, chúng ta cần tạo một giao diện tài nguyên sẽ được sử dụng để xác định chức năng nào có sẵn cho những người khác (tức là những người không phải là chủ sở hữu của hợp đồng):

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}
}

Đặt nó bên dưới mã nguồn NFT. Giao diện NFTReceiver có nghĩa là bất kỳ ai chúng tôi xác định là có quyền truy cập vào tài nguyên sẽ có thể gọi các phương thức sau:

  • deposit

  • getIDs

  • idExists

  • getMetadata

Tiếp theo, chúng ta cần xác định giao diện bộ sưu tập mã thông báo của mình. Hãy nghĩ về nó như một chiếc ví chứa tất cả NFT của người dùng.

pub resource Collection: NFTReceiver {
   pub var ownedNFTs: UInt64: NFT}
   pub var metadataObjs: {UInt64: { String : String }}

   init () {
       self.ownedNFTs <- {}
       self.metadataObjs = {}
   }

   pub fun withdraw(withdrawID: UInt64): @NFT {
       let token <- self.ownedNFTs.remove(key: withdrawID)!

       return <-token    }

   pub fun deposit(token: @NFT, metadata: {String : String}) {
       self.ownedNFTs[token.id] <-! token    }

   pub fun idExists(id: UInt64): Bool {
       return self.ownedNFTs[id] != nil    }

   pub fun getIDs(): [UInt64] {
       return self.ownedNFTs.keys    }

   pub fun updateMetadata(id: UInt64, metadata: {String: String}) {
       self.metadataObjs[id] = metadata    }

   pub fun getMetadata(id: UInt64): {String : String} {
       return self.metadataObjs[id]!
   }

   destroy() {
       destroy self.ownedNFTs    }}

Có rất nhiều thứ đang diễn ra trong tài nguyên này. Đầu tiên, chúng ta có một biến gọi là ownNFTs. điều này rất đơn giản. Nó theo dõi tất cả các NFT thuộc sở hữu của người dùng trong hợp đồng đó.

Tiếp theo, chúng ta có một biến gọi là metadataObjs. Điều này hơi độc đáo ở chỗ chúng tôi đang mở rộng chức năng hợp đồng Flow NFT để lưu trữ ánh xạ siêu dữ liệu cho từng NFT. Biến này ánh xạ ID mã thông báo tới siêu dữ liệu được liên kết của nó, có nghĩa là chúng tôi cần đặt ID mã thông báo trước khi có thể đặt.

Sau đó, chúng tôi khởi tạo các biến. Điều này là bắt buộc đối với các biến được xác định trong tài nguyên trong Flow.

Cuối cùng, chúng tôi có tất cả các tính năng có sẵn cho tài nguyên bộ sưu tập NFT. Lưu ý rằng không phải tất cả các tính năng này đều khả dụng. Nếu bạn còn nhớ, chúng tôi đã xác định chức năng có sẵn cho bất kỳ ai trước đó trong giao diện tài nguyên NFTReceiver.

Tôi muốn chỉ ra chức năng gửi tiền. Giống như chúng tôi đã mở rộng hợp đồng Flow NFT mặc định để bao gồm bản đồ siêu dữ liệuObjs, chúng tôi cũng đang mở rộng chức năng gửi tiền mặc định để lấy siêu dữ liệu tham số bổ sung. Tại sao chúng ta làm điều này ở đây? Chúng tôi cần đảm bảo rằng chỉ người khai thác mã thông báo mới có thể thêm siêu dữ liệu đó vào mã thông báo. Để duy trì quyền riêng tư, chúng tôi hạn chế việc bổ sung siêu dữ liệu ban đầu vào quá trình thực thi đúc.

Mã hợp đồng của chúng tôi gần như hoàn tất. Vì vậy, bên dưới tài nguyên Bộ sưu tập, hãy thêm phần sau:

pub fun createEmptyCollection(): @Collection {
   return <- create Collection()}pub resource NFTMinter {
   pub var idCount: UInt64

   init() {
       self.idCount = 1
   }

   pub fun mintNFT(): @NFT {
       var newNFT <- create NFT(initID: self.idCount)

       self.idCount = self.idCount + 1 as UInt64        return <-newNFT    }}

Đầu tiên, chúng ta có một hàm, khi được gọi, sẽ tạo ra một bộ sưu tập NFT trống. Bằng cách này, người dùng tương tác với hợp đồng của chúng tôi lần đầu tiên sẽ có một vị trí lưu trữ được tạo trong Bộ sưu tập tài nguyên mà chúng tôi xác định.

Sau đó, chúng tôi tạo một tài nguyên khác. Điều này rất quan trọng vì nếu không có nó, chúng tôi sẽ không thể đúc mã thông báo. Tài nguyên NFTMinter bao gồm idCount được tăng dần để đảm bảo chúng tôi không bao giờ có id trùng lặp trên NFT của mình. Nó cũng có chức năng thực sự tạo NFT của chúng tôi.

Bên dưới tài nguyên NFTMinter, hãy thêm trình khởi tạo hợp đồng chính:

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

Chức năng khởi tạo này chỉ được gọi khi hợp đồng được triển khai. Nó làm ba điều:
1. Tạo một bộ sưu tập trống cho người triển khai bộ sưu tập để chủ sở hữu hợp đồng có thể tạo NFT của hợp đồng và sở hữu NFT.
2.Bộ sưu tập tham khảo NFTReceiver Giao diện chúng tôi đã tạo lúc đầu, tài nguyên này được xuất bản ở một vị trí công cộng. Đây là cách chúng tôi nói với hợp đồng rằng bất kỳ ai cũng có thể gọi các chức năng được xác định trên NFTReceiver .
3. Tài nguyên NFTMinter được lưu trong trình tạo hợp đồng lưu trữ tài khoản. Điều này có nghĩa là chỉ người tạo hợp đồng mới có thể đúc mã thông báo.

hoàn thành hợp đồngcó thể được tìm thấy ở đây.

Bây giờ chúng ta đã có hợp đồng sẵn sàng, chúng ta hãy triển khai nó, phải không? Vâng, chúng ta có lẽ nên ởFlow PlaygroundKiểm tra nó trên . Đến đó và nhấp vào tài khoản đầu tiên ở thanh bên trái. Thay thế tất cả mã trong hợp đồng mẫu bằng mã hợp đồng của chúng tôi và nhấp vào triển khai. Nếu mọi việc suôn sẻ, bạn sẽ thấy nhật ký như thế này trong cửa sổ nhật ký ở cuối màn hình:

16:48:55 Deployment Deployed Contract To: 0x01

Bây giờ, chúng tôi đã sẵn sàng triển khai hợp đồng cho trình giả lập chạy cục bộ. Tại dòng lệnh, hãy chạy lệnh sau:
flow project start\-emulator

Bây giờ, với trình giả lập đang chạy và tệp flow.json được định cấu hình đúng cách, chúng ta có thể triển khai hợp đồng. Chỉ cần chạy lệnh sau:
flow project deploy

Nếu mọi việc suôn sẻ, bạn sẽ thấy đầu ra tương tự như sau:
Triển khai 1 hợp đồng cho tài khoản: tài khoản giả lập
Deploying 1 contracts for accounts: emulator-account
PinataPartyContract -> 0xf8d6e0586b0a20c7
đúc NFT

đúc NFT

Trong bài viết thứ hai của hướng dẫn này, chúng tôi sẽ làm việc để làm cho quy trình truyền thân thiện hơn với người dùng thông qua ứng dụng và giao diện người dùng. Để minh họa và chỉ ra cách siêu dữ liệu sẽ hoạt động với NFT trên Flow, chúng tôi sẽ sử dụng tập lệnh Cadence và dòng lệnh.
Hãy tạo một thư mục mới ở thư mục gốc của dự án pinata-party và gọi nó là giao dịch. Sau khi tạo thư mục, hãy tạo một tệp mới có tên MintPinataParty.cdc bên trong nó.

Để viết một giao dịch, chúng tôi cần tham chiếu một tệp trong siêu dữ liệu được cung cấp cho NFT. Để thực hiện việc này, chúng tôi sẽ tải tệp lên IPFS qua Pinata. Trong hướng dẫn này, vì NFT của chúng tôi tập trung vào các video có thể giao dịch về đập vỡ piñata tại các bữa tiệc, nên chúng tôi sẽ tải lên video quay cảnh một đứa trẻ đập piñata tại một bữa tiệc sinh nhật. Bạn có thể tải lên bất kỳ tệp video nào bạn muốn. Bạn thực sự có thể tải lên bất kỳ tệp nội dung nào và liên kết nó với NFT, nhưng bài viết thứ hai trong loạt bài hướng dẫn này sẽ hướng đến nội dung video. Khi tệp video đã sẵn sàng để phát,Vui lòng tải lên ở đây. Sau khi tải tệp lên, bạn sẽ được cung cấp hàm băm IPFS (thường được gọi là Mã định danh nội dung hoặc CID). Sao chép hàm băm này vì chúng tôi sẽ sử dụng nó trong quá trình đúc.

Bây giờ, hãy thêm phần sau vào tệp MintPinataParty.cdc:

import PinataPartyContract from 0xf8d6e0586b0a20c7transaction {
 let receiverRef: &{PinataPartyContract.NFTReceiver}
 let minterRef: &PinataPartyContract.NFTMinter

 prepare(acct: AuthAccount) {
     self.receiverRef = acct.getCapability<&{PinataPartyContract.NFTReceiver}>(/public/NFTReceiver)
         .borrow()
         ?? panic("Could not borrow receiver reference")

     self.minterRef = acct.borrow<&PinataPartyContract.NFTMinter>(from: /storage/NFTMinter)
         ?? panic("could not borrow minter reference")
 }

 execute {
     let metadata : {String : String} = {
         "name": "The Big Swing",
         "swing_velocity": "29",
         "swing_angle": "45",
         "rating": "5",
         "uri": "ipfs://QmRZdc3mAMXpv6Akz9Ekp1y4vDSjazTx2dCQRkxVy1yUj6"
     }
     let newNFT <- self.minterRef.mintNFT()

     self.receiverRef.deposit(token: <-newNFT, metadata: metadata)

     log("NFT Minted and deposited to Account 2's Collection")
 }}

Đây là một vấn đề khá đơn giản, nhờ một phần không nhỏ vào công việc mà Flow đã thực hiện để khiến mọi thứ trở nên dễ dàng, nhưng chúng ta hãy xem qua vấn đề này. Trước tiên, bạn sẽ nhận thấy câu lệnh nhập ở trên cùng. Nếu bạn nhớ lại, khi chúng tôi triển khai một hợp đồng, chúng tôi sẽ nhận được một tài khoản. Đó là điều chúng ta cần tham khảo. Do đó, hãy thay thế 0xf8d6e0586b0a20c7 bằng địa chỉ tài khoản trong quá trình triển khai của bạn.

Tiếp theo, chúng tôi xác định các giao dịch. Mọi thứ xảy ra ở đây đều liên quan đến các giao dịch mà chúng tôi dự định thực hiện.

Điều đầu tiên chúng tôi làm trong giao dịch của mình là xác định hai biến tham chiếu receiverRef và minterRef. Trong trường hợp này, chúng tôi vừa là người nhận NFT vừa là người đào NFT. Hai biến này đề cập đến các tài nguyên chúng tôi đã tạo trong hợp đồng. Nếu người thực hiện giao dịch không có quyền truy cập vào tài nguyên, giao dịch sẽ thất bại.

Tiếp theo, chúng ta có một chức năng chuẩn bị. Chức năng này lấy thông tin tài khoản của người đang cố gắng thực hiện giao dịch và thực hiện một số xác minh. Chúng tôi cố gắng "mượn" NFTMinter mà chúng tôi đã xác định và chức năng NFTReceiver khả dụng trên cả hai tài nguyên. Nếu người thực hiện giao dịch không có quyền truy cập vào các tài nguyên đó, thì mọi thứ sẽ thất bại.

Cuối cùng, chúng ta có hàm thực thi. Chức năng này là nơi chúng tôi xây dựng siêu dữ liệu cho NFT, tạo NFT, sau đó liên kết siêu dữ liệu trước khi gửi NFT vào tài khoản của chúng tôi. Nếu bạn để ý, tôi đã tạo một biến siêu dữ liệu. Trong biến đó, tôi đã thêm một số thông tin về mã thông báo. Vì mã thông báo của chúng tôi đại diện cho sự kiện đập vỡ bánh pizza tại một bữa tiệc và vì chúng tôi đang cố gắng sao chép hầu hết những gì bạn thấy trong NBA Top Shot, nên tôi đã xác định một số thống kê trong siêu dữ liệu. Đứa trẻ vung gậy để đạt tốc độ piñata, góc vung và điểm. Tôi chỉ chơi xung quanh với những số liệu thống kê này. Tuy nhiên, bạn sẽ nhập bất kỳ thông tin nào có ý nghĩa đối với mã thông báo của mình theo cách tương tự.

Bạn sẽ nhận thấy rằng tôi cũng đã xác định một thuộc tính trong siêu dữ liệu uri. Điều này sẽ trỏ đến hàm băm IPFS lưu trữ tệp nội dung được liên kết với NFT. Trong trường hợp này, đó là video thực tế về cảnh Piñata bị tấn công. Bạn có thể thay thế hàm băm bằng hàm băm mà bạn nhận được sau khi tải tệp lên trước đó.

Chúng tôi đặt tiền tố cho hàm băm bằng ipfs:// . Đây là tài liệu tham khảo thích hợp cho các tệp trên IPFS và có thể được sử dụng với cả máy khách để bàn và tiện ích mở rộng trình duyệt cho IPFS. dũng cảm cũng cung cấp hỗ trợ cho nó, chúng tôi cũng có thể dán trực tiếp vàoTrong trình duyệt Brave

Chúng tôi gọi hàm mintNFT tạo mã thông báo. Sau đó, chúng tôi phải gọi chức năng gửi tiền để gửi tiền vào tài khoản của mình. Đây cũng là nơi chúng tôi chuyển siêu dữ liệu. Hãy nhớ rằng, chúng tôi đã xác định một liên kết biến trong hàm gửi tiền để thêm siêu dữ liệu vào ID mã thông báo được liên kết.

Bây giờ, chúng tôi gần như đã sẵn sàng để gửi giao dịch và tạo NFT. Nhưng trước tiên, chúng ta cần chuẩn bị tài khoản của mình. Từ dòng lệnh trong thư mục gốc của dự án, hãy tạo một khóa riêng mới để ký. Chạy lệnh sau:

flow keys generate

Điều này sẽ cung cấp cho bạn một khóa chung và một khóa riêng. Luôn bảo vệ khóa riêng của bạn

Chúng tôi sẽ cần khóa riêng để ký giao dịch, vì vậy chúng tôi có thể dán khóa đó vào tệp flow.json của mình. Chúng ta cũng cần chỉ định thuật toán chữ ký. Đây là đối tượng tài khoản trong tệp flow.json bây giờ trông như thế này:

“ accounts”:{
 “ emulator-account”:{
"địa chỉ": "địa chỉ tài khoản của bạn",
"privateKey": "khóa riêng của bạn",
"chain": "Trình giả lập luồng",
    “ sigAlgorithm”:“ ECDSA_P256”,
    “ hashAlgorithm”:“ SHA3_256”
 }
},

Nếu bạn dự định lưu trữ bất kỳ dự án nào trong dự án này trên github hoặc bất kỳ kho lưu trữ git từ xa nào, hãy đảm bảo không bao gồm khóa riêng tư. Bạn có thể thêm flow.json vào .gitignore. Mặc dù chúng tôi chỉ sử dụng trình giả lập cục bộ, nhưng bạn nên bảo vệ các khóa của mình.

Bây giờ chúng tôi đã cập nhật, chúng tôi có thể gửi giao dịch. Làm như vậy dễ dàng như chạy lệnh sau:
flow transactions send --code ./transactions/MintPinataParty.cdc --signer emulator-account

Chúng tôi tham khảo tệp giao dịch và tài khoản người ký mà chúng tôi đã viết từ flow.json. Nếu mọi việc suôn sẻ, bạn sẽ thấy đầu ra tương tự như sau:

Getting information for account with address 0xf8d6e0586b0a20c7 ...
Submitting transaction with ID
4a79102747a450f65b6aab06a77161af196c3f7151b2400b3b3d09ade3b69823 ...
Successfully submitted transaction with ID
4a79102747a450f65b6aab06a77161af196c3f7151b2400b3b3d09ade3b69823

Bây giờ, điều cuối cùng chúng ta cần làm là xác minh rằng mã thông báo có trong tài khoản của chúng ta và lấy siêu dữ liệu. Để làm như vậy, chúng tôi sẽ viết một tập lệnh rất đơn giản và gọi nó từ dòng lệnh.

Trong thư mục gốc của dự án, tạo một thư mục mới có tên scripts. Tạo một tệp có tên CheckTokenMetadata.cdc bên trong nó. Trong tệp đó, thêm vào như sau:

import PinataPartyContract from 0xf8d6e0586b0a20c7pub 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)}

Tập lệnh này có thể được nghĩ theo cách tương tự như phương thức chỉ đọc trên hợp đồng thông minh Ethereum. Chúng miễn phí, chỉ cần trả lại dữ liệu từ hợp đồng.

Trong tập lệnh, chúng tôi nhập hợp đồng từ địa chỉ đã triển khai. Sau đó, chúng tôi xác định một chức năng chính (đây là tên của chức năng cần thiết để chạy tập lệnh). Bên trong chức năng này, chúng tôi xác định ba biến:

  • nftOwner: Đây chỉ là tài khoản sở hữu NFT. Chúng tôi đã đúc NFT từ một tài khoản cũng đã triển khai hợp đồng, vì vậy trong ví dụ của chúng tôi, hai địa chỉ giống nhau. Tùy thuộc vào thiết kế hợp đồng tương lai, điều này có thể không phải lúc nào cũng đúng.

  • khả năng: Chúng ta cần "mượn" từ hợp đồng đã triển khai. Hãy nhớ rằng các chức năng này được kiểm soát truy cập, vì vậy nếu một chức năng không khả dụng cho địa chỉ đang cố mượn nó, tập lệnh sẽ không thành công. Chúng tôi đang mượn từ tài nguyên NFTReceiver.

  • receiverRef: Biến này chỉ tận dụng khả năng của chúng tôi và yêu cầu tập lệnh mượn từ hợp đồng đã triển khai.

Bây giờ, chúng ta có thể gọi các chức năng (các chức năng có sẵn). Trong trường hợp này, chúng tôi muốn đảm bảo rằng địa chỉ được đề cập đã thực sự nhận được NFT mà chúng tôi đã tạo và sau đó chúng tôi muốn xem xét siêu dữ liệu được liên kết với mã thông báo.

Hãy chạy tập lệnh của chúng tôi và xem những gì chúng tôi nhận được. Chạy các lệnh sau trên dòng lệnh:
flow scripts execute --code ./scripts/CheckTokenMetadata.cdc

Đối với đầu ra siêu dữ liệu, bạn sẽ thấy đầu ra tương tự như sau:
{"name": "The Big Swing", "swing_velocity": "29", "swing_angle": "45", "rating": "5", "uri": "ipfs://QmRZdc3mAMXpv6Akz9Ekp1y4vDSjazTx2dCQRkxVy1yUj6"}

Chúc mừng! Bạn đã tạo thành công hợp đồng thông minh Flow, đúc mã thông báo và siêu dữ liệu được liên kết với mã thông báo đó, đồng thời lưu trữ tài sản kỹ thuật số cơ bản của mã thông báo trên IPFS. Không tệ cho phần đầu tiên của hướng dẫn.

Tiếp theo, chúng tôi có một hướng dẫn về xây dựng ứng dụng React mặt trước, bằng cách lấy siêu dữ liệu và phân tích siêu dữ liệu đó, bạn có thể hiển thị NFT

FlowTimes福洛时代
作者文库