
বেশিরভাগ সময়, যখন মানুষ স্মার্ট চুক্তি লিখতে শেখা শুরু করে, তখন তারা প্রথমেই সলিডিটি এবং ইথেরিয়াম সম্পর্কে শুনতে পায়। আমিও প্রথম এই বিষয়টিই শুনেছিলাম। বেশিরভাগ টিউটোরিয়াল এই বিষয়টির উপরই জোর দেয়, এবং সঙ্গত কারণেই। সলিডিটির মাধ্যমে ব্লকচেইনে থাকা প্রোগ্রাম লেখা সম্ভব হয়, এবং ইথেরিয়াম এমন একটি জায়গা হয়ে ওঠে যেখানে অনেক মানুষ শুরু করে।
কিন্তু সলিডিটিই একমাত্র স্মার্ট চুক্তির ভাষা নয়। এবং ইথেরিয়ামই একমাত্র ব্লকচেইন নয় যা বিকেন্দ্রীভূত অ্যাপ্লিকেশনগুলিকে সমর্থন করে।
"দ্য ওপেন নেটওয়ার্ক" এর সংক্ষিপ্ত রূপ "TON" ও আছে। এটি টেলিগ্রাম দ্বারা তৈরি করা হয়েছিল, কিন্তু এটি এখন একটি সর্বজনীন, সম্প্রদায়-চালিত চেইন। এটি দ্রুত, হালকা এবং ইথেরিয়ামে আপনি যা ব্যবহার করতেন তার থেকে কিছুটা ভিন্নভাবে কাজ করে। এর মধ্যে স্মার্ট চুক্তি কীভাবে লেখা হয় তাও অন্তর্ভুক্ত। যখন আমি TON ডকুমেন্টেশন অন্বেষণ শুরু করি, তখন আমি স্মার্ট চুক্তি লেখার জন্য চারটি ভিন্ন ভাষা খুঁজে পাই: Tact, Tolk, FunC এবং Fift । আমি এখানে চারটির গভীরে যাব না।
এই নির্দেশিকাটি ট্যাক্ট ভাষার উপর আলোকপাত করে, এবং আমরা দেখব কিভাবে এটি ব্যবহার করে একটি মৌলিক ভোটিং চুক্তি তৈরি করা যায় যা ব্যবহারকারীদের ভোট দিতে এবং অন-চেইনে ফলাফল পরীক্ষা করতে দেয়।
TON ইকোসিস্টেম আসলে একাধিক ভাষা সমর্থন করে, প্রতিটি ভাষা বিভিন্ন ব্যবহারের ক্ষেত্রে, বিমূর্ততার স্তর এবং বিকাশকারীর অভিজ্ঞতা প্রদান করে। এখানে প্রতিটি ভাষা সম্পর্কে একটি সংক্ষিপ্ত বিবরণ দেওয়া হল:
Tact TON ব্লকচেইনে চুক্তি তৈরি এবং স্থাপনের জন্য একটি দ্রুততর পথ প্রদান করে।
কোড লেখা শুরু করার আগে, ট্যাক্ট স্মার্ট চুক্তিগুলি কীভাবে গঠন করা হয় তা বোঝা গুরুত্বপূর্ণ। একটি সাধারণ ট্যাক্ট চুক্তিতে কয়েকটি মূল উপাদান থাকে:
contract
ব্লক - এখানে আপনি আপনার কন্ট্রাক্টের নাম সংজ্ঞায়িত করেন এবং যেকোনো স্টেট ভেরিয়েবল ঘোষণা করেন।
init
ব্লক – এটি আপনার চুক্তির স্টেট ভেরিয়েবলগুলিকে ইনিশিয়ালাইজ করে এবং চুক্তির শুরুর শর্তগুলি সেট করে। এই ব্লকটি স্থাপনের সময় একবারই চলে।
receive
ব্লক - এগুলি ইভেন্ট লিসেনারের মতো। এগুলি ইনকামিং মেসেজ পরিচালনা করে এবং আপনার চুক্তি কীভাবে তাদের প্রতি প্রতিক্রিয়া দেখায় তা নির্ধারণ করে।
গেটার ফাংশন ( get fun
) – এগুলি ঐচ্ছিক পঠনযোগ্য ফাংশন যা ব্যবহারকারী বা অন্যান্য চুক্তিগুলিকে চুক্তির অবস্থা পরিবর্তন না করেই জিজ্ঞাসা করতে দেয়।
Tact বার্তা-ভিত্তিক যোগাযোগ ব্যবহার করে, যা TON-এর সমস্ত মিথস্ক্রিয়াকে এভাবেই কাজ করে। প্রতিটি চুক্তি একটি বার্তা গ্রহণ করে এবং তার নিজস্ব receive
ব্লকে এটি প্রক্রিয়া করে। এই বার্তা-ভিত্তিক কাঠামোটি আপনার চুক্তির যুক্তিকে একটি মডুলার, রক্ষণাবেক্ষণযোগ্য উপায়ে সংগঠিত করতে সহায়তা করে।
এবার একটি সহজ ভোটিং চুক্তি তৈরি করে এটিকে বাস্তব উদাহরণে প্রয়োগ করা যাক।
এই বিভাগে, আমরা Tact ব্যবহার করে একটি মৌলিক ভোটদান ব্যবস্থা কীভাবে বাস্তবায়ন করতে হয় তা নিয়ে আলোচনা করব। এই ভোটদান চুক্তি ব্যবহারকারীদের পূর্বনির্ধারিত প্রার্থীদের ভোট দেওয়ার অনুমতি দেবে এবং প্রতিটি প্রার্থী মোট কত ভোট পেয়েছেন তা ট্র্যাক করবে।
আমরা TON Web IDE-এর ভিতরে সবকিছু করব, যা একটি ইন-ব্রাউজার টুল যেখানে আপনি স্থানীয়ভাবে কিছু ইনস্টল না করেই আপনার চুক্তিগুলি লিখতে, তৈরি করতে এবং পরীক্ষা করতে পারবেন।
VotingContract
এর মতো।
আপনার প্রকল্প তৈরি করার পরে, main.tact
ফাইলটি খুলুন। আপনি একটি বয়লারপ্লেট সেটআপ দেখতে পাবেন:
// Import the Deployable trait so the contract can be deployed easily import "@stdlib/deploy"; contract BlankContract with Deployable { init() { } }
import "@stdlib/deploy";
প্রয়োজন এবং কোড থেকে এটি সরানো উচিত নয়।BlankContract
হল স্থানধারকের নাম।init()
ব্লকটি শুধুমাত্র একবারই চলে এবং স্টেট ভেরিয়েবল শুরু করতে ব্যবহৃত হয়।
এবার, আমাদের নিজস্ব কোড ম্যাপ করা যাক।
প্রথমে, আমরা ভোটদানের জন্য বার্তা কাঠামো সংজ্ঞায়িত করব:
// Import the Deployable trait so the contract can be deployed easily import "@stdlib/deploy"; // Define a message structure for voting message Vote { candidate: Int as uint32; // 1 = Alice, 2 = Bob }
এটি হল ভোট বার্তা। যখন কেউ ভোট দিতে চান, তখন তারা চুক্তিতে একটি বার্তা পাঠাবেন যাতে একটি নম্বর থাকবে:
ট্যাক্ট এই কাঠামো ব্যবহার করে আগত ভোট প্রক্রিয়া করে এবং কোন প্রার্থী পয়েন্ট পাবে তা নির্ধারণ করে।
এরপর, আমরা আমাদের চুক্তি সেট আপ করব এবং প্রতিটি প্রার্থীর ভোটের হিসাব রাখার জন্য দুটি স্টেট ভেরিয়েবল যোগ করব:
... contract VotingContract with Deployable { // State variables to track votes votesAlice: Int as uint32; votesBob: Int as uint32;
চুক্তির ভেতরে, আমরা দুটি ভেরিয়েবল সংজ্ঞায়িত করেছি:
votesAlice
: অ্যালিস কত ভোট পেয়েছে তা সংরক্ষণ করে।votesBob
: বব কত ভোট পেয়েছেন তা সংরক্ষণ করে।
আমরা এখন init
ব্লকের ভেতরে ভোট গণনা শূন্যে শুরু করব যাতে চুক্তিটি প্রথমবার স্থাপনের সময় এর শুরুর অবস্থা নির্ধারণ করা যায়।
init() { self.votesAlice = 0; self.votesBob = 0; }
init
ব্লকটি শুধুমাত্র একবারই চলে, ঠিক যখন চুক্তিটি স্থাপন করা হয় এবং এটি উভয় ভোট গণনাকে শূন্যে সেট করে।
এবার যুক্তির কথা। যখন ভোট পাঠানো হয়, আমরা চাই চুক্তিটি কার পক্ষে ভোট তা পরীক্ষা করুক এবং সঠিক ভোটের সংখ্যা বৃদ্ধি করুক।
// Handle vote messages receive(msg: Vote) { if (msg.candidate == 1) { self.votesAlice += 1; } else if (msg.candidate == 2) { self.votesBob += 1; } }
সুতরাং যখন একটি ভোট গৃহীত হয়:
msg.candidate
১ হয়, তাহলে আমরা ভোটে +১ যোগ করব votesAlice
msg.candidate
2 হয়, তাহলে আমরা votesBob
এ +1 যোগ করব।
অবশেষে, আমরা গেটার ফাংশন তৈরি করব যাতে চুক্তির অবস্থা পরিবর্তন না করেই যে কেউ প্রতিটি প্রার্থীর ভোট গণনা সম্পর্কে জিজ্ঞাসা করতে পারে।
// Getter for Alice's votes get fun getVotesForAlice(): Int { return self.votesAlice; } // Getter for Bob's votes get fun getVotesForBob(): Int { return self.votesBob; } }
এই দুটি গেটার ফাংশনের মাধ্যমে আমরা চুক্তিতে কোনও পরিবর্তন না করেই প্রতিটি প্রার্থী কত ভোট পেয়েছেন তা পরীক্ষা করতে পারি। এটি একটি পঠনযোগ্য অপারেশন।
নীচে সম্পূর্ণ ভোটিং চুক্তির কোডটি দেওয়া হল:
import "@stdlib/deploy"; // Define a message structure for voting message Vote { candidate: Int as uint32; // 1 = Alice, 2 = Bob } contract VotingContract with Deployable { // State variables to track votes votesAlice: Int as uint32; votesBob: Int as uint32; init() { self.votesAlice = 0; self.votesBob = 0; } // Handle vote messages receive(msg: Vote) { if (msg.candidate == 1) { self.votesAlice += 1; } else if (msg.candidate == 2) { self.votesBob += 1; } } // Getter for Alice's votes get fun getVotesForAlice(): Int { return self.votesAlice; } // Getter for Bob's votes get fun getVotesForBob(): Int { return self.votesBob; } }
একবার স্থাপন করা হলে, নিচে স্ক্রোল করুন এবং আপনি দুটি বিভাগ দেখতে পাবেন:
getVotesForAlice
, getVotesForBob
Vote
ভোট দিতে: ভোট বিভাগে, candidate
ইনপুট ক্ষেত্রে 1
লিখুন এবং পাঠান ক্লিক করুন। আপনি সবেমাত্র অ্যালিসকে ভোট দিয়েছেন! আরও ভোট দেওয়ার জন্য আপনি এটি পুনরাবৃত্তি করতে পারেন।
ভোট গণনা পরীক্ষা করতে : getVotesForAlice
অধীনে Call এ ক্লিক করুন এবং ভোট গণনা দেখতে লগ প্যানেলটি দেখুন।
candidate
ফিল্ডে 2
পাঠিয়ে, তারপর getVotesForBob
চেক করুন। আমার পরীক্ষামূলক অভিযানে, আমি Alice-কে ৯ বার এবং Bob-কে ৬ বার ভোট দিয়েছি, এবং getter ফাংশনগুলি ঠিক তাই দেখিয়েছে।
🙌 পুরোটা পড়ে ফেলেছেন, তাহলে অভিনন্দন!
এখন আপনি যখন দেখেছেন যে Tact-এ একটি সাধারণ ভোটিং চুক্তি কীভাবে কাজ করে, আপনি TON-তে স্মার্ট চুক্তি উন্নয়নের দিকে আপনার প্রথম পদক্ষেপ নিয়েছেন। এই চুক্তিটি মৌলিক হতে পারে, তবে কাঠামো এবং ধারণাগুলি আরও জটিল যুক্তির ক্ষেত্রেও প্রযোজ্য।
যদি আপনি পরীক্ষা-নিরীক্ষা চালিয়ে যেতে চান, তাহলে এই চুক্তিটি সম্প্রসারণ করার চেষ্টা করুন অথবা https://tact-by-example.org/all থেকে অন্যান্য পূর্বনির্মিত টেমপ্লেটগুলি অন্বেষণ করার চেষ্টা করুন। TON ওয়েব IDE বিভিন্ন ব্যবহারের ক্ষেত্রে চেষ্টা করা সহজ করে তোলে এবং এটি আপনাকে দ্রুত তৈরি এবং শিখতে সাহায্য করার জন্য টেমপ্লেটগুলির সাথেও আসে।
তাই এগিয়ে যান, পরিবর্তন করুন, পরীক্ষা করুন, আরও ভালো কিছু তৈরি করুন।