এই টিউটোরিয়ালে, আমরা শিখব কিভাবে ব্লকচেইন ফ্লোতে ডিজিটাল সংগ্রহযোগ্য (বা NFTs) সংগ্রহের জন্য একটি ওয়েবসাইট তৈরি করা যায়। আমরা সবকিছু ঘটানোর জন্য প্রতিক্রিয়া সহ স্মার্ট চুক্তি ভাষা Cadence ব্যবহার করব। আমরা ফ্লো, এর সুবিধা এবং আমরা যে মজার টুল ব্যবহার করতে পারি সে সম্পর্কেও শিখব।
এই নিবন্ধের শেষে, আপনার কাছে ফ্লো ব্লকচেইনে আপনার নিজস্ব বিকেন্দ্রীকৃত অ্যাপ্লিকেশন তৈরি করার জন্য প্রয়োজনীয় সরঞ্জাম এবং জ্ঞান থাকবে।
এর ডান মধ্যে ডুব দেওয়া যাক!
আমরা ডিজিটাল সংগ্রহের জন্য একটি অ্যাপ্লিকেশন তৈরি করছি। প্রতিটি সংগ্রহযোগ্য একটি নন-ফুঞ্জিবল টোকেন (NFT)।
এই সমস্ত কাজ করার জন্য, আমরা Flow-এর NonFungibleToken Standard ব্যবহার করব, যা নিয়মের একটি সেট যা আমাদের এই বিশেষ ডিজিটাল আইটেমগুলি পরিচালনা করতে সাহায্য করে (Ethereum-এ ERC-721 এর মতো)।
আপনি শুরু করার আগে, আপনার সিস্টেমে ফ্লো CLI ইনস্টল করতে ভুলবেন না। আপনি যদি তা না করে থাকেন তবে এই ইনস্টলেশন নির্দেশাবলী অনুসরণ করুন।
আপনি যদি আপনার প্রকল্প কিকস্টার্ট করতে প্রস্তুত হন, প্রথমে কমান্ড ফ্লো সেটআপ টাইপ করুন।
এই কমান্ডটি আপনার প্রকল্পের ভিত্তি স্থাপন করতে পর্দার পিছনে কিছু জাদু করে। এটি একটি ফোল্ডার সিস্টেম তৈরি করে এবং আপনার প্রকল্পটি কনফিগার করতে flow.json নামে একটি ফাইল সেট আপ করে, নিশ্চিত করে যে সবকিছু সংগঠিত এবং যাওয়ার জন্য প্রস্তুত!
প্রকল্পে একটি cadence
ফোল্ডার এবং flow.json
ফাইল থাকবে। (একটি flow.json ফাইল হল আপনার প্রকল্পের জন্য একটি কনফিগারেশন ফাইল, স্বয়ংক্রিয়ভাবে রক্ষণাবেক্ষণ করা হয়।)
ক্যাডেন্স ফোল্ডারে নিম্নলিখিতগুলি রয়েছে:
Flow NFT স্ট্যান্ডার্ড ব্যবহার করতে নিচের ধাপগুলি অনুসরণ করুন।
প্রথমে, flow-collectibles-portal
ফোল্ডারে যান এবং cadence
ফোল্ডারটি খুঁজুন। তারপর, contracts
ফোল্ডার খুলুন। একটি নতুন ফাইল তৈরি করুন এবং এটির নাম দিন NonFungibleToken.cdc
।
এখন, NonFungibleToken নামের লিঙ্কটি খুলুন যাতে NFT স্ট্যান্ডার্ড রয়েছে। সেই ফাইল থেকে সমস্ত বিষয়বস্তু অনুলিপি করুন এবং আপনার তৈরি করা নতুন ফাইলে পেস্ট করুন ("NonFungibleToken.cdc")।
এটাই! আপনি সফলভাবে আপনার প্রকল্পের জন্য মান সেট আপ করেছেন.
এখন, কিছু কোড লিখি!
যাইহোক, আমরা কোডিং-এ ডুব দেওয়ার আগে, ডেভেলপারদের জন্য তাদের কোড কীভাবে গঠন করতে হয় তার একটি মানসিক মডেল স্থাপন করা গুরুত্বপূর্ণ।
শীর্ষ স্তরে, আমাদের কোডবেস তিনটি প্রধান উপাদান নিয়ে গঠিত:
NFT: প্রতিটি সংগ্রহযোগ্য একটি NFT হিসাবে প্রতিনিধিত্ব করা হয়।
সংগ্রহ: একটি সংগ্রহ একটি নির্দিষ্ট ব্যবহারকারীর মালিকানাধীন NFT-এর একটি গ্রুপকে বোঝায়।
গ্লোবাল ফাংশন এবং ভেরিয়েবল: এগুলি হল স্মার্ট কন্ট্রাক্টের জন্য গ্লোবাল লেভেলে সংজ্ঞায়িত ফাংশন এবং ভেরিয়েবল এবং কোন নির্দিষ্ট রিসোর্সের সাথে যুক্ত নয়।
cadence/contracts
ভিতরে Collectibles.cdc
নামে একটি নতুন ফাইল তৈরি করুন। এখানেই আমরা কোড লিখব।
চুক্তির কাঠামো
import NonFungibleToken from "./NonFungibleToken.cdc" pub contract Collectibles: NonFungibleToken{ pub var totalSupply: UInt64 // other code will come here init(){ self.totalSupply = 0 } }
আসুন লাইন দ্বারা কোড লাইন ভাঙ্গুন:
প্রথমত, আমাদেরকে মানসম্মত করতে হবে যে আমরা তথাকথিত "NonFungibleToken" অন্তর্ভুক্ত করে একটি NFT তৈরি করছি। এটি ফ্লো দ্বারা নির্মিত একটি এনএফটি স্ট্যান্ডার্ড যা নিম্নলিখিত কার্যকারিতার সেটকে সংজ্ঞায়িত করে যা প্রতিটি এনএফটি স্মার্ট চুক্তিতে অন্তর্ভুক্ত করা আবশ্যক।
আমদানি করার পরে, আসুন আমাদের চুক্তি তৈরি করি। এটি করতে, আমরা pub contract [contract name]
ব্যবহার করি। প্রতিবার আপনি একটি নতুন চুক্তি তৈরি করার সময় একই সিনট্যাক্স ব্যবহার করুন। আপনি যাকে আপনার চুক্তিতে কল করতে চান তা দিয়ে আপনি contract name
পূরণ করতে পারেন। আমাদের ক্ষেত্রে, আসুন এটিকে Collectibles
বলি।
এর পরে, আমরা নিশ্চিত করতে চাই যে আমাদের চুক্তিটি NonFungibleToken-এর কার্যকারিতা এবং নিয়মগুলির একটি নির্দিষ্ট সেট অনুসরণ করে। এটি করার জন্য, আমরা `:` এর সাহায্যে একটি NonFungibleToken ইন্টারফেস যোগ করি।
এই মত ( `pub contract Collectibles: NonFungibleToken{}`
)
প্রতিটি চুক্তিতে init()
ফাংশন থাকতে হবে । এটি বলা হয় যখন চুক্তিটি প্রাথমিকভাবে স্থাপন করা হয়। এটি সলিডিটি একটি কনস্ট্রাক্টরকে যা বলে তার অনুরূপ।
এখন, UInt64
ডাটা টাইপ দিয়ে totalSupply
নামে একটি গ্লোবাল ভেরিয়েবল তৈরি করা যাক। এই ভেরিয়েবল আপনার মোট সংগ্রহযোগ্য ট্র্যাক রাখবে.
এখন, 0
মান দিয়ে totalSupply
আরম্ভ করুন।
এটাই! আমরা আমাদের Collectibles
চুক্তির ভিত্তি স্থাপন করেছি। এখন, আমরা এটিকে আরও উত্তেজনাপূর্ণ করতে আরও বৈশিষ্ট্য এবং কার্যকারিতা যোগ করা শুরু করতে পারি।
এগিয়ে যাওয়ার আগে, আমরা ক্যাডেন্সে ভেরিয়েবলকে কীভাবে সংজ্ঞায়িত করি তা বোঝার জন্য অনুগ্রহ করে কোড স্নিপেটটি দেখুন:
আপনার স্মার্ট চুক্তিতে নিম্নলিখিত কোড যোগ করুন:
import NonFungibleToken from "./NonFungibleToken.cdc" pub contract Collectibles: NonFungibleToken{ // above code… pub resource NFT: NonFungibleToken.INFT{ pub let id: UInt64 pub var name: String pub var image: String init(_id:UInt64, _name:String, _image:String){ self.id = _id self.name = _name self.image = _image } } // init()... }
যেমন আপনি আগে দেখেছেন, চুক্তিটি NFT স্ট্যান্ডার্ড ইন্টারফেস প্রয়োগ করে, যা pub contract Collectibles: NonFungibleToken
। একইভাবে, সংস্থানগুলিও বিভিন্ন সংস্থান ইন্টারফেস বাস্তবায়ন করতে পারে।
সুতরাং, আসুন NFT রিসোর্সে NonFungibleToken.INFT
ইন্টারফেস যোগ করা যাক, যা রিসোর্সের মধ্যে id নামক একটি পাবলিক সম্পত্তির অস্তিত্বকে বাধ্যতামূলক করে।
এখানে আমরা এনএফটি রিসোর্সে যে ভেরিয়েবলগুলি ব্যবহার করব:
id:
NFT এর ID বজায় রাখেname:
NFT এর নাম।image:
NFT এর ছবির URL।
ভেরিয়েবল সংজ্ঞায়িত করার পরে, init()
ফাংশনে ভেরিয়েবলটি আরম্ভ করতে ভুলবেন না।
চলুন এগিয়ে চলুন এবং Collection Resource
নামে আরেকটি সংস্থান তৈরি করি।
প্রথমত, আপনাকে বুঝতে হবে কিভাবে Collection Resources
কাজ করে।
আপনি যদি আপনার ল্যাপটপে একটি মিউজিক ফাইল এবং বেশ কয়েকটি ফটো সংরক্ষণ করতে চান, তাহলে আপনি কী করবেন?
সাধারণত, আপনি একটি স্থানীয় ড্রাইভে নেভিগেট করবেন (আসুন আপনার ডি-ড্রাইভ বলি) এবং একটি music
ফোল্ডার এবং photos
ফোল্ডার তৈরি করবেন। তারপরে আপনি আপনার গন্তব্য ফোল্ডারে সঙ্গীত এবং ফটো ফাইলগুলি অনুলিপি এবং পেস্ট করবেন।
একইভাবে, ফ্লোতে আপনার ডিজিটাল সংগ্রহযোগ্যগুলি এভাবেই কাজ করে।
আপনার ল্যাপটপটিকে একটি Flow Blockchain Account
, Account Storage
হিসাবে আপনার ডি-ড্রাইভ এবং একটি Collection
হিসাবে ফোল্ডারকে কল্পনা করুন৷
তাই NFT কেনার জন্য যেকোন প্রজেক্টের সাথে ইন্টারঅ্যাক্ট করার সময়, প্রজেক্ট আপনার account storage
তার collection
তৈরি করে, আপনার ডি-ড্রাইভে একটি ফোল্ডার তৈরি করার মতো। আপনি যখন 10টি ভিন্ন NFT প্রকল্পের সাথে ইন্টারঅ্যাক্ট করেন, তখন আপনি আপনার অ্যাকাউন্টে 10টি ভিন্ন সংগ্রহের সাথে শেষ করবেন।
এটি আপনার অনন্য ডিজিটাল ধন সঞ্চয় এবং সংগঠিত করার জন্য একটি ব্যক্তিগত স্থান থাকার মত!
import NonFungibleToken from "./NonFungibleToken.cdc" pub contract Collectibles: NonFungibleToken{ //Above code NFT Resource… // Collection Resource pub resource Collection{ } // Below code… }
NFT Resources
ধরে রাখার জন্য প্রতিটি collection
একটি ownedNFTs
পরিবর্তনশীল রয়েছে৷
pub resource Collection { pub var ownedNFTs: @{UInt64: NonFungibleToken.NFT} init(){ self.ownedNFTs <- {} } }
রিসোর্স ইন্টারফেস
ফ্লোতে একটি resource
ইন্টারফেস অন্যান্য প্রোগ্রামিং ভাষার ইন্টারফেসের মতো। এটি একটি রিসোর্সের উপরে বসে এবং নিশ্চিত করে যে যে রিসোর্সটি এটি প্রয়োগ করে তার প্রয়োজনীয় কার্যকারিতা রয়েছে যা ইন্টারফেসের দ্বারা সংজ্ঞায়িত করা হয়েছে।
এটি সম্পূর্ণ সংস্থানে অ্যাক্সেস সীমাবদ্ধ করতে এবং সম্পদের চেয়ে অ্যাক্সেস মডিফায়ারের ক্ষেত্রে আরও সীমাবদ্ধ হতে ব্যবহার করা যেতে পারে।
NonFungibleToken
স্ট্যান্ডার্ডে, INFT
, Provider
, Receiver
, এবং CollectionPublic
মতো বেশ কিছু রিসোর্স ইন্টারফেস রয়েছে৷
এই ইন্টারফেসের প্রতিটিতে নির্দিষ্ট ফাংশন এবং ক্ষেত্র রয়েছে যা তাদের ব্যবহার করে এমন সংস্থান দ্বারা প্রয়োগ করা প্রয়োজন।
এই চুক্তিতে, আমরা NonFungibleToken: Provider
, Receiver
, এবং CollectionPublic
৷ এই ইন্টারফেসগুলি deposit
, withdraw
, borrowNFT
, এবং getIDs
মতো ফাংশনগুলিকে সংজ্ঞায়িত করে৷ আমরা যেতে যেতে এই প্রতিটি বিস্তারিত ব্যাখ্যা করব.
আমরা কিছু ইভেন্ট যোগ করব যা আমরা এই ফাংশনগুলি থেকে নির্গত করব, পাশাপাশি কিছু ভেরিয়েবল ঘোষণা করব যা আমরা টিউটোরিয়ালের সাথে আরও ব্যবহার করব।
pub contract Collectibles:NonFungibleToken{ // rest of the code… pub event ContractInitialized() pub event Withdraw(id: UInt64, from: Address?) pub event Deposit(id: UInt64, to: Address?) pub let CollectionStoragePath: StoragePath pub let CollectionPublicPath: PublicPath pub resource interface CollectionPublic{ pub fun deposit(token: @NonFungibleToken.NFT) pub fun getIDs(): [UInt64] pub fun borrowNFT(id: UInt64): &NonFungibleToken.NFT } pub resource Collection: CollectionPublic, NonFungibleToken.Provider, NonFungibleToken.Receiver, NonFungibleToken.CollectionPublic{ pub var ownedNFTs: @{UInt64: NonFungibleToken.NFT} init(){ self.ownedNFTs <- {} } } }
প্রত্যাহার করুন
এখন, ইন্টারফেসের জন্য প্রয়োজনীয় withdraw()
ফাংশন তৈরি করা যাক।
pub resource Collection: CollectionPublic, NonFungibleToken.Provider, NonFungibleToken.Receiver, NonFungibleToken.CollectionPublic{ // other code pub fun withdraw(withdrawID: UInt64): @NonFungibleToken.NFT { let token <- self.ownedNFTs.remove(key: withdrawID) ?? panic("missing NFT") emit Withdraw(id: token.id, from: self.owner?.address) return <- token } init()... }
এই ফাংশনের সাহায্যে, আপনি NFT সংস্থানটিকে সংগ্রহের বাইরে নিয়ে যেতে পারেন। যদি এটা:
কলকারী তারপর এই সংস্থানটি ব্যবহার করতে পারে এবং এটি তাদের অ্যাকাউন্ট স্টোরেজের মধ্যে সংরক্ষণ করতে পারে।
জমা
এখন, NonFungibleToken.Receiver
এর জন্য প্রয়োজনীয় deposit()
ফাংশনের সময় এসেছে।
pub resource Collection: CollectionPublic, NonFungibleToken.Provider, NonFungibleToken.Receiver, NonFungibleToken.CollectionPublic{ // other code pub fun withdraw(withdrawID: UInt64): @NonFungibleToken.NFT { let token <- self.ownedNFTs.remove(key: withdrawID) ?? panic("missing NFT") emit Withdraw(id: token.id, from: self.owner?.address) return <- token } pub fun deposit(token: @NonFungibleToken.NFT) { let id = token.id let oldToken <- self.ownedNFTs[id] <-token destroy oldToken emit Deposit(id: id, to: self.owner?.address) } init()... }
ধার এবং GetID
এখন, NonFungibleToken.CollectionPublic: borrowNFT()
এবং getID()
।
pub resource Collection: CollectionPublic, NonFungibleToken.Provider, NonFungibleToken.Receiver, NonFungibleToken.CollectionPublic{ // other code pub fun withdraw(withdrawID: UInt64): @NonFungibleToken.NFT { let token <- self.ownedNFTs.remove(key: withdrawID) ?? panic("missing NFT") emit Withdraw(id: token.id, from: self.owner?.address) return <- token } pub fun deposit(token: @NonFungibleToken.NFT) { let id = token.id let oldToken <- self.ownedNFTs[id] <-token destroy oldToken emit Deposit(id: id, to: self.owner?.address) } pub fun borrowNFT(id: UInt64): &NonFungibleToken.NFT { if self.ownedNFTs[id] != nil { return (&self.ownedNFTs[id] as &NonFungibleToken.NFT?)! } panic("NFT not found in collection.") } pub fun getIDs(): [UInt64]{ return self.ownedNFTs.keys } init()... }
ধ্বংসকারী
কালেকশন রিসোর্সের জন্য আমাদের শেষ জিনিসটি একটি ধ্বংসকারী।
destroy (){ destroy self.ownedNFTs }
যেহেতু সংগ্রহ সংস্থানে অন্যান্য সংস্থান (NFT সংস্থান) রয়েছে, তাই আমাদের একটি ধ্বংসকারী নির্দিষ্ট করতে হবে। বস্তুটি ধ্বংস হয়ে গেলে একটি ধ্বংসকারী চলে। এটি নিশ্চিত করে যে সম্পদগুলি তাদের মূল সম্পদ ধ্বংস হয়ে গেলে "গৃহহীন" থাকবে না। এনএফটি রিসোর্সের জন্য আমাদের ডেস্ট্রাক্টরের প্রয়োজন নেই কারণ এতে অন্য কোনো রিসোর্স নেই।
আসুন সম্পূর্ণ সংগ্রহের সংস্থান উত্স কোডটি দেখি:
import NonFungibleToken from "./NonFungibleToken.cdc" pub contract Collectibles: NonFungibleToken{ pub var totalSupply: UInt64 pub resource NFT: NonFungibleToken.INFT{ pub let id: UInt64 pub var name: String pub var image: String init(_id:UInt64, _name:String, _image:String){ self.id = _id self.name = _name self.image = _image } } pub resource interface CollectionPublic{ pub fun deposit(token: @NonFungibleToken.NFT) pub fun getIDs(): [UInt64] pub fun borrowNFT(id: UInt64): &NonFungibleToken.NFT } pub event ContractInitialized() pub event Withdraw(id: UInt64, from: Address?) pub event Deposit(id: UInt64, to: Address?) pub let CollectionStoragePath: StoragePath pub let CollectionPublicPath: PublicPath pub resource Collection: CollectionPublic, NonFungibleToken.Provider, NonFungibleToken.Receiver, NonFungibleToken.CollectionPublic{ pub var ownedNFTs: @{UInt64: NonFungibleToken.NFT} init(){ self.ownedNFTs <- {} } destroy (){ destroy self.ownedNFTs } pub fun withdraw(withdrawID: UInt64): @NonFungibleToken.NFT { let token <- self.ownedNFTs.remove(key: withdrawID) ?? panic("missing NFT") emit Withdraw(id: token.id, from: self.owner?.address) return <- token } pub fun deposit(token: @NonFungibleToken.NFT) { let id = token.id let oldToken <- self.ownedNFTs[id] <-token destroy oldToken emit Deposit(id: id, to: self.owner?.address) } pub fun borrowNFT(id: UInt64): &NonFungibleToken.NFT { if self.ownedNFTs[id] != nil { return (&self.ownedNFTs[id] as &NonFungibleToken.NFT?)! } panic("NFT not found in collection.") } pub fun getIDs(): [UInt64]{ return self.ownedNFTs.keys } } init(){ self.CollectionPublicPath = /public/NFTCollection self.CollectionStoragePath = /storage/NFTCollection self.totalSupply = 0 emit ContractInitialized() } }
এখন, আমরা সমস্ত সংস্থান শেষ করেছি। এর পরে, আমরা গ্লোবাল ফাংশনটি দেখব।
গ্লোবাল ফাংশনগুলি হ'ল ফাংশনগুলি যেগুলি স্মার্ট চুক্তির বৈশ্বিক স্তরে সংজ্ঞায়িত করা হয়, যার অর্থ তারা কোনও সংস্থানের অংশ নয়৷ এগুলি অ্যাক্সেসযোগ্য এবং জনসাধারণের দ্বারা ডাকা হয় এবং স্মার্ট চুক্তির মূল কার্যকারিতা জনসাধারণের কাছে প্রকাশ করে৷
createEmptyCollection : এই ফাংশনটি একটি খালি Collectibles.Collection
কে কলার অ্যাকাউন্ট স্টোরেজে শুরু করে।
checkCollection : এই সহজ ফাংশনটি আপনাকে আবিষ্কার করতে সাহায্য করে যে আপনার অ্যাকাউন্টে ইতিমধ্যেই collection
সংস্থান আছে কিনা।
মিন্টএনএফটি : এই ফাংশনটি দুর্দান্ত কারণ এটি যে কাউকে একটি এনএফটি তৈরি করতে দেয়।
// pub resource Collection… pub fun createEmptyCollection(): @Collection{ return <- create Collection() } pub fun checkCollection(_addr: Address): Bool{ return getAccount(_addr) .capabilities.get<&{Collectibles.CollectionPublic}> (Collectibles.CollectionPublicPath)! .check() } pub fun mintNFT(name:String, image:String): @NFT{ Collectibles.totalSupply = Collectibles.totalSupply + 1 let nftId = Collectibles.totalSupply var newNFT <- create NFT(_id:nftId, _name:name, _image:image) return <- newNFT } init()...
এবং এখন, অবশেষে, সবকিছু ঠিক রেখে, আমরা আমাদের স্মার্ট চুক্তি লেখা শেষ করেছি। এখানে চূড়ান্ত কোডটি দেখুন।
এখন, আসুন দেখি কিভাবে একজন ব্যবহারকারী ফ্লো ব্লকচেইনে স্থাপন করা স্মার্ট চুক্তির সাথে ইন্টারঅ্যাক্ট করে।
ফ্লো ব্লকচেইনের সাথে ইন্টারঅ্যাক্ট করার দুটি ধাপ রয়েছে:
লেনদেন হল ক্রিপ্টোগ্রাফিকভাবে স্বাক্ষরিত ডেটা যাতে নির্দেশাবলীর একটি সেট থাকে যা ফ্লো অবস্থা আপডেট করার জন্য স্মার্ট চুক্তির সাথে ইন্টারঅ্যাক্ট করে। সহজ কথায়, এটি একটি ফাংশন কলের মতো যা ব্লকচেইনের ডেটা পরিবর্তন করে। লেনদেনে সাধারণত কিছু খরচ থাকে, যা আপনি যে ব্লকচেইনে আছেন তার উপর নির্ভর করে পরিবর্তিত হতে পারে।
একটি লেনদেনে একাধিক ঐচ্ছিক পর্যায় অন্তর্ভুক্ত থাকে: prepare
, pre
, execute
, এবং post
পর্যায়৷
আপনি লেনদেনের উপর Cadence রেফারেন্স নথিতে এই সম্পর্কে আরও পড়তে পারেন । প্রতিটি পর্যায়ে একটি উদ্দেশ্য আছে; দুটি সবচেয়ে গুরুত্বপূর্ণ পর্যায় হল prepare
এবং execute
।
Prepare Phase
: এই ফেজটি স্বাক্ষরকারীর অ্যাকাউন্টের মধ্যে ডেটা এবং তথ্য অ্যাক্সেস করতে ব্যবহার করা হয় (AuthAccount প্রকার দ্বারা অনুমোদিত)।
Execute Phase
: এই ফেজটি অ্যাকশন এক্সিকিউট করতে ব্যবহৃত হয়।
এখন, আমাদের প্রকল্পের জন্য একটি লেনদেন তৈরি করা যাক।
আপনার প্রকল্প ফোল্ডারে একটি লেনদেন তৈরি করতে নীচের পদক্ষেপগুলি অনুসরণ করুন৷
প্রথমে প্রজেক্ট ফোল্ডারে যান এবং cadence
ফোল্ডারটি খুলুন। এর ভিতরে, transaction
ফোল্ডারটি খুলুন এবং Create_Collection.cdc
এবং mint_nft.cdc
নামে একটি নতুন ফাইল তৈরি করুন।
import Collectibles from "../contracts/Collectibles.cdc" transaction { prepare(signer: AuthAccount) { if signer.borrow<&Collectibles.Collection>(from: Collectibles.CollectionStoragePath) == nil { let collection <- Collectibles.createEmptyCollection() signer.save(<-collection, to: Collectibles.CollectionStoragePath) let cap = signer.capabilities.storage.issue<&{Collectibles.CollectionPublic}>(Collectibles.CollectionStoragePath) signer.capabilities.publish( cap, at: Collectibles.CollectionPublicPath) } } }
চলুন লাইন দ্বারা এই কোড লাইন ভাঙ্গুন:
এই লেনদেনটি Collectibles স্মার্ট চুক্তির সাথে যোগাযোগ করে। তারপর, এটি নির্দিষ্ট স্টোরেজ পাথ Collectibles.CollectionStoragePath
থেকে সংগ্রহ সংস্থানের একটি রেফারেন্স ধার করে প্রেরকের (স্বাক্ষরকারী) তাদের অ্যাকাউন্টে একটি সংগ্রহ সংস্থান সঞ্চিত আছে কিনা তা পরীক্ষা করে। যদি রেফারেন্সটি শূন্য হয়, তাহলে এর অর্থ হল স্বাক্ষরকারীর এখনও একটি সংগ্রহ নেই৷
যদি স্বাক্ষরকারীর একটি সংগ্রহ না থাকে, তাহলে এটি createEmptyCollection()
ফাংশন কল করে একটি খালি সংগ্রহ তৈরি করে।
খালি সংগ্রহ তৈরি করার পরে, এটিকে নির্দিষ্ট স্টোরেজ পাথ Collectibles.CollectionStoragePath
এর অধীনে স্বাক্ষরকারীর অ্যাকাউন্টে রাখুন।
এটি স্বাক্ষরকারীর অ্যাকাউন্ট এবং link()
ব্যবহার করে নতুন তৈরি সংগ্রহের মধ্যে একটি লিঙ্ক স্থাপন করে।
import NonFungibleToken from "../contracts/NonFungibleToken.cdc" import Collectibles from "../contracts/Collectibles.cdc" transaction(name:String, image:String){ let receiverCollectionRef: &{NonFungibleToken.CollectionPublic} prepare(signer:AuthAccount){ self.receiverCollectionRef = signer.borrow<&Collectibles.Collection>(from: Collectibles.CollectionStoragePath) ?? panic("could not borrow Collection reference") } execute{ let nft <- Collectibles.mintNFT(name:name, image:image) self.receiverCollectionRef.deposit(token: <-nft) } }
চলুন লাইন দ্বারা এই কোড লাইন ভাঙ্গুন:
আমরা প্রথমে NonFungibleToken
এবং Collectibles contract
আমদানি করি।
transaction(name: String, image: String)
এই লাইনটি একটি নতুন লেনদেন সংজ্ঞায়িত করে। এটি দুটি আর্গুমেন্ট নেয়, নাম এবং চিত্র, উভয় প্রকার স্ট্রিং। এই আর্গুমেন্টগুলি NFT-এর নাম এবং ইমেজ পাস করতে ব্যবহৃত হয়।
let receiverCollectionRef: &{NonFungibleToken.CollectionPublic}
এই লাইনটি একটি নতুন ভেরিয়েবল receiverCollectionRef.
এটি NonFungibleToken.CollectionPublic
টাইপের NFTs-এর সর্বজনীন সংগ্রহের একটি রেফারেন্স। এই রেফারেন্সটি সংগ্রহের সাথে ইন্টারঅ্যাক্ট করতে ব্যবহার করা হবে যেখানে আমরা সদ্য মিন্ট করা NFT জমা করব।
prepare(signer: AuthAccount)
এই লাইনটি প্রস্তুত ব্লক শুরু করে, যা লেনদেনের আগে সম্পাদিত হয়। এটি AuthAccount
টাইপের একটি আর্গুমেন্ট স্বাক্ষরকারী লাগে। AuthAccount
লেনদেনের স্বাক্ষরকারীর অ্যাকাউন্টের প্রতিনিধিত্ব করে।
এটি প্রস্তুত ব্লকের ভিতরে স্বাক্ষরকারীর স্টোরেজ থেকে Collectibles.Collection
একটি রেফারেন্স ধার করে। এটি সংগ্রহের রেফারেন্স অ্যাক্সেস করার জন্য ধার ফাংশন ব্যবহার করে এবং এটি receiverCollectionRef
ভেরিয়েবলে সংরক্ষণ করে।
যদি রেফারেন্স পাওয়া না যায় (যদি সংগ্রহটি স্বাক্ষরকারীর সঞ্চয়স্থানে বিদ্যমান না থাকে, উদাহরণস্বরূপ), এটি ত্রুটি বার্তাটি "সংগ্রহের রেফারেন্স ধার করতে পারেনি।"
execute
ব্লকে লেনদেনের জন্য মূল এক্সিকিউশন লজিক থাকে। prepare
ব্লক সফলভাবে সম্পন্ন হওয়ার পরে এই ব্লকের ভিতরে কোডটি কার্যকর করা হবে।
nft <- Collectibles.mintNFT(_name: name, image: image)
execute
ব্লকের ভিতরে, এই লাইনটি প্রদত্ত নাম এবং ইমেজ আর্গুমেন্টের সাথে Collectibles
চুক্তি থেকে mintNFT
ফাংশনকে কল করে। এই ফাংশনটি প্রদত্ত নাম এবং চিত্র সহ একটি নতুন NFT তৈরি করবে বলে আশা করা হচ্ছে৷ <-
চিহ্নটি নির্দেশ করে যে NFT একটি বস্তু হিসাবে গ্রহণ করা হচ্ছে যা সরানো যেতে পারে (একটি সংস্থান)।
self.receiverCollectionRef.deposit(token: <-nft)
এই লাইনটি নতুন মিন্ট করা NFT নির্দিষ্ট সংগ্রহে জমা করে। এটি লেনদেনের নির্বাহকারী অ্যাকাউন্ট থেকে সংগ্রহে NFT-এর মালিকানা স্থানান্তর করতে receiverCollectionRef
এর ডিপোজিট ফাংশন ব্যবহার করে। এখানে <-
চিহ্নটিও নির্দেশ করে যে deposit
প্রক্রিয়া চলাকালীন NFT একটি সম্পদ হিসাবে স্থানান্তরিত হচ্ছে।
আমরা ব্লকচেইন থেকে ডেটা দেখতে বা পড়ার জন্য একটি স্ক্রিপ্ট ব্যবহার করি। স্ক্রিপ্ট বিনামূল্যে এবং স্বাক্ষর প্রয়োজন নেই.
আপনার প্রকল্প ফোল্ডারে একটি স্ক্রিপ্ট তৈরি করতে নীচের পদক্ষেপগুলি অনুসরণ করুন৷
প্রথমে প্রজেক্ট ফোল্ডারে যান এবং cadence
ফোল্ডারটি খুলুন। এর ভিতরে, script
ফোল্ডারটি খুলুন, এবং view_nft.cdc
নামে একটি নতুন ফাইল তৈরি করুন।
import NonFungibleToken from "../contracts/NonFungibleToken.cdc" import Collectibles from "../contracts/Collectibles.cdc" pub fun main(user: Address, id: UInt64): &NonFungibleToken.NFT? { let collectionCap= getAccount(user).capabilities .get<&{Collectibles.CollectionPublic}>(/public/NFTCollection) ?? panic("This public capability does not exist.") let collectionRef = collectionCap.borrow()! return collectionRef.borrowNFT(id: id) }
চলুন লাইন দ্বারা এই কোড লাইন ভাঙ্গুন:
প্রথমে, আমরা NonFungibleToken
এবং Collectibles
চুক্তি আমদানি করি।
pub fun main(acctAddress: Address, id: UInt64): &NonFungibleToken.NFT?
এই লাইনটি স্ক্রিপ্টের এন্ট্রি পয়েন্টকে সংজ্ঞায়িত করে, যা প্রধান নামে একটি সর্বজনীন ফাংশন। ফাংশন দুটি পরামিতি লাগে:
acctAddress
: ফ্লো ব্লকচেইনে একটি অ্যাকাউন্টের ঠিকানা প্রতিনিধিত্ব করে একটি Address
ধরন পরামিতি।
id
: একটি UInt64
টাইপ প্যারামিটার যা সংগ্রহের মধ্যে NFT-এর অনন্য শনাক্তকারীকে উপস্থাপন করে।
তারপরে আমরা নির্দিষ্ট acctAddress
এর জন্য Collectibles.Collection
ক্ষমতা আনতে getCapability
ব্যবহার করি। একটি ক্ষমতা একটি সম্পদের একটি রেফারেন্স যা তার ফাংশন এবং ডেটা অ্যাক্সেসের অনুমতি দেয়। এই ক্ষেত্রে, এটি Collectibles.Collection
রিসোর্স প্রকারের জন্য সক্ষমতা আনছে।
তারপর, আমরা borrowNFT
ফাংশন ব্যবহার করে collectionRef
থেকে একটি NFT ধার করি। borrowNFT
ফাংশনটি id
প্যারামিটার নেয়, যা সংগ্রহের মধ্যে NFT-এর অনন্য শনাক্তকারী। একটি ক্ষমতার উপর borrow
সম্পদ ডেটা পড়ার অনুমতি দেয়।
অবশেষে, আমরা ফাংশন থেকে NFT ফেরত দিই।
এখন, ফ্লো টেস্টনেটে আমাদের স্মার্ট চুক্তি স্থাপন করার সময়।
1. একটি ফ্লো অ্যাকাউন্ট সেট আপ করুন৷
একটি ফ্লো অ্যাকাউন্ট তৈরি করতে টার্মিনালে নিম্নলিখিত কমান্ডটি চালান:
flow keys generate
আপনার সর্বজনীন কী এবং ব্যক্তিগত কী লিখতে ভুলবেন না।
এর পরে, আমরা যাবো
নির্দিষ্ট ইনপুট ক্ষেত্রে আপনার সর্বজনীন কী আটকান।
স্বাক্ষর এবং হ্যাশ অ্যালগরিদম ডিফল্টে সেট রাখুন।
ক্যাপচা সম্পূর্ণ করুন।
Create Account এ ক্লিক করুন।
একটি অ্যাকাউন্ট সেট আপ করার পরে, আমরা 1,000 টেস্ট ফ্লো টোকেন সমন্বিত আমাদের নতুন ফ্লো ঠিকানার সাথে একটি সংলাপ পাই৷ ঠিকানাটি অনুলিপি করুন যাতে আমরা এটিকে সামনের দিকে ব্যবহার করতে পারি ।
2. প্রকল্পটি কনফিগার করুন।
এখন, আমাদের প্রকল্প কনফিগার করা যাক. প্রাথমিকভাবে, যখন আমরা প্রজেক্ট সেট আপ করি, তখন এটি একটি flow.json
ফাইল তৈরি করে।
এটি ফ্লো সিএলআই-এর কনফিগারেশন ফাইল এবং ফ্লো সিএলআই আপনার জন্য যে কাজগুলি করতে পারে তার জন্য কনফিগারেশন নির্ধারণ করে। এটিকে মোটামুটিভাবে Ethereum-এ hardhat.config.js
এর সমতুল্য মনে করুন।
এখন, আপনার কোড এডিটর খুলুন, এবং নিচের কোডটি কপি করে আপনার flow.json
ফাইলে পেস্ট করুন।
{ "contracts": { "Collectibles": "./cadence/contracts/Collectibles.cdc", "NonFungibleToken": { "source": "./cadence/contracts/NonFungibleToken.cdc", "aliases": { "testnet": "0x631e88ae7f1d7c20" } } }, "networks": { "testnet": "access.devnet.nodes.onflow.org:9000" }, "accounts": { "testnet-account": { "address": "ENTER YOUR ADDRESS FROM FAUCET HERE", "key": "ENTER YOUR GENERATED PRIVATE KEY HERE" } }, "deployments": { "testnet": { "testnet-account": [ "Collectibles" ] } } }
কোডে আপনার জেনারেট করা প্রাইভেট কী (কী: "এখানে আপনার তৈরি করা ব্যক্তিগত কী লিখুন") পেস্ট করুন।
এখন, টেস্টনেটে কোডটি চালান। টার্মিনালে যান এবং নিম্নলিখিত কোডটি চালান:
flow project deploy --network testnet
5. নিশ্চিতকরণের জন্য অপেক্ষা করুন।
লেনদেন জমা দেওয়ার পরে, আপনি একটি লেনদেন আইডি পাবেন। টেস্টনেটে লেনদেন নিশ্চিত হওয়ার জন্য অপেক্ষা করুন, এটি নির্দেশ করে যে স্মার্ট চুক্তি সফলভাবে স্থাপন করা হয়েছে।
এখানে আপনার নিয়োজিত চুক্তি চেক করুন.
GitHub- এ সম্পূর্ণ কোড চেক করুন।
অভিনন্দন! আপনি এখন ফ্লো ব্লকচেইনে একটি সংগ্রহযোগ্য পোর্টাল তৈরি করেছেন এবং এটি টেস্টনেটে স্থাপন করেছেন। এরপর কি? এখন, আপনি ফ্রন্টএন্ড তৈরিতে কাজ করতে পারেন যা আমরা এই সিরিজের পার্ট 2 এ কভার করব।
একটি সত্যিই মহান দিন আছে!
এছাড়াও এখানে প্রকাশিত