বেশিরভাগ সময়, যখন মানুষ স্মার্ট চুক্তি লিখতে শেখা শুরু করে, তখন তারা প্রথমেই সলিডিটি এবং ইথেরিয়াম সম্পর্কে শুনতে পায়। আমিও প্রথম এই বিষয়টিই শুনেছিলাম। বেশিরভাগ টিউটোরিয়াল এই বিষয়টির উপরই জোর দেয়, এবং সঙ্গত কারণেই। সলিডিটির মাধ্যমে ব্লকচেইনে থাকা প্রোগ্রাম লেখা সম্ভব হয়, এবং ইথেরিয়াম এমন একটি জায়গা হয়ে ওঠে যেখানে অনেক মানুষ শুরু করে। কিন্তু সলিডিটিই একমাত্র স্মার্ট চুক্তির ভাষা নয়। এবং ইথেরিয়ামই একমাত্র ব্লকচেইন নয় যা বিকেন্দ্রীভূত অ্যাপ্লিকেশনগুলিকে সমর্থন করে। এর সংক্ষিপ্ত রূপ ও আছে। এটি টেলিগ্রাম দ্বারা তৈরি করা হয়েছিল, কিন্তু এটি এখন একটি সর্বজনীন, সম্প্রদায়-চালিত চেইন। এটি দ্রুত, হালকা এবং ইথেরিয়ামে আপনি যা ব্যবহার করতেন তার থেকে কিছুটা ভিন্নভাবে কাজ করে। এর মধ্যে স্মার্ট চুক্তি কীভাবে লেখা হয় তাও অন্তর্ভুক্ত। যখন আমি TON ডকুমেন্টেশন অন্বেষণ শুরু করি, তখন আমি স্মার্ট চুক্তি লেখার জন্য চারটি ভিন্ন ভাষা খুঁজে পাই: । আমি এখানে চারটির গভীরে যাব না। "দ্য ওপেন নেটওয়ার্ক" "TON" Tact, Tolk, FunC এবং Fift এই নির্দেশিকাটি ট্যাক্ট ভাষার উপর আলোকপাত করে, এবং আমরা দেখব কিভাবে এটি ব্যবহার করে একটি মৌলিক ভোটিং চুক্তি তৈরি করা যায় যা ব্যবহারকারীদের ভোট দিতে এবং অন-চেইনে ফলাফল পরীক্ষা করতে দেয়। কেন আমি প্রথমে ট্যাকট শেখার সিদ্ধান্ত নিলাম TON ইকোসিস্টেম আসলে একাধিক ভাষা সমর্থন করে, প্রতিটি ভাষা বিভিন্ন ব্যবহারের ক্ষেত্রে, বিমূর্ততার স্তর এবং বিকাশকারীর অভিজ্ঞতা প্রদান করে। এখানে প্রতিটি ভাষা সম্পর্কে একটি সংক্ষিপ্ত বিবরণ দেওয়া হল: হল TON স্মার্ট চুক্তি লেখার জন্য ঐতিহ্যবাহী ভাষা। এটি নিম্ন-স্তরের এবং আপনার চুক্তিটি কীভাবে কাজ করে তার উপর আপনাকে সুনির্দিষ্ট নিয়ন্ত্রণ দেয়। এটি শক্তিশালী, তবে এর অর্থ হল আপনাকে TON ভার্চুয়াল মেশিন (TVM) কীভাবে কাজ করে তা বুঝতে হবে, যার মধ্যে স্ট্যাক ম্যানিপুলেশন, মেমরি লেআউট এবং ডিটারমিনিস্টিক এক্সিকিউশনের মতো ধারণাগুলি অন্তর্ভুক্ত রয়েছে। সিনট্যাক্সটি কিছুটা C এর মতো, যা আপনি যদি আগে সেই ধরণের ভাষার সাথে কাজ না করে থাকেন তবে অপরিচিত মনে হতে পারে। FunC সাধারণত FunC এর সাথে ব্যবহার করা হয়। এটি একটি স্ট্যাক-ভিত্তিক ভাষা যা মূলত TVM এর সাথে সরাসরি ইন্টারঅ্যাক্ট করার জন্য ব্যবহৃত হয় এবং অন-চেইন গণনা স্থাপন, ডিবাগিং এবং সম্পাদনের জন্য ব্যবহৃত হয়। এটি সাধারণত সম্পূর্ণ স্মার্ট চুক্তি লেখার জন্য আপনি যে ভাষা দিয়ে শুরু করেন তা নয়, তবে TON-তে সামগ্রিক উন্নয়ন কর্মপ্রবাহে এটি গুরুত্বপূর্ণ। Fift একটি নতুন সংযোজন যা এখনও বিকশিত হচ্ছে। আমি যা সংগ্রহ করেছি তা থেকে, এটির লক্ষ্য উচ্চ-স্তরের ভাষার সাথে টুলিং এবং সামঞ্জস্য উন্নত করা। এটি আশাব্যঞ্জক, কিন্তু এখনও ব্যাপকভাবে গৃহীত বা নথিভুক্ত হয়নি। টলক হল একটি উচ্চ-স্তরের ভাষা যা বিশেষভাবে TON স্মার্ট কন্ট্রাক্ট ডেভেলপমেন্টকে আরও সহজলভ্য এবং ডেভেলপার-বান্ধব করার জন্য ডিজাইন করা হয়েছে। Tact নিম্ন-স্তরের জটিলতাকে অনেক সহজ করে তোলে এবং আপনাকে আপনার যুক্তিকে পরিষ্কার, পঠনযোগ্য উপায়ে লেখার উপর মনোনিবেশ করতে দেয়। সিনট্যাক্সটি টাইপস্ক্রিপ্ট বা সলিডিটিতে আপনি যা দেখতে পাবেন তার কাছাকাছি, যা TVM ইন্টার্নালগুলিতে গভীরভাবে ডুব না দিয়ে শুরু করা অনেক সহজ করে তোলে। Tact Tact TON ব্লকচেইনে চুক্তি তৈরি এবং স্থাপনের জন্য একটি দ্রুততর পথ প্রদান করে। ট্যাক্ট কীভাবে কাজ করে তা বোঝা কোড লেখা শুরু করার আগে, ট্যাক্ট স্মার্ট চুক্তিগুলি কীভাবে গঠন করা হয় তা বোঝা গুরুত্বপূর্ণ। একটি সাধারণ ট্যাক্ট চুক্তিতে কয়েকটি মূল উপাদান থাকে: ব্লক - এখানে আপনি আপনার কন্ট্রাক্টের নাম সংজ্ঞায়িত করেন এবং যেকোনো স্টেট ভেরিয়েবল ঘোষণা করেন। contract ব্লক – এটি আপনার চুক্তির স্টেট ভেরিয়েবলগুলিকে ইনিশিয়ালাইজ করে এবং চুক্তির শুরুর শর্তগুলি সেট করে। এই ব্লকটি স্থাপনের সময় একবারই চলে। init ব্লক - এগুলি ইভেন্ট লিসেনারের মতো। এগুলি ইনকামিং মেসেজ পরিচালনা করে এবং আপনার চুক্তি কীভাবে তাদের প্রতি প্রতিক্রিয়া দেখায় তা নির্ধারণ করে। receive গেটার ফাংশন ( ) – এগুলি ঐচ্ছিক পঠনযোগ্য ফাংশন যা ব্যবহারকারী বা অন্যান্য চুক্তিগুলিকে চুক্তির অবস্থা পরিবর্তন না করেই জিজ্ঞাসা করতে দেয়। get fun Tact বার্তা-ভিত্তিক যোগাযোগ ব্যবহার করে, যা TON-এর সমস্ত মিথস্ক্রিয়াকে এভাবেই কাজ করে। প্রতিটি চুক্তি একটি বার্তা গ্রহণ করে এবং তার নিজস্ব ব্লকে এটি প্রক্রিয়া করে। এই বার্তা-ভিত্তিক কাঠামোটি আপনার চুক্তির যুক্তিকে একটি মডুলার, রক্ষণাবেক্ষণযোগ্য উপায়ে সংগঠিত করতে সহায়তা করে। receive এবার একটি সহজ ভোটিং চুক্তি তৈরি করে এটিকে বাস্তব উদাহরণে প্রয়োগ করা যাক। ট্যাক্টের মাধ্যমে আপনার প্রথম ভোটদান চুক্তি তৈরি করা (TON ওয়েব IDE ব্যবহার করে) এই বিভাগে, আমরা Tact ব্যবহার করে একটি মৌলিক ভোটদান ব্যবস্থা কীভাবে বাস্তবায়ন করতে হয় তা নিয়ে আলোচনা করব। এই ভোটদান চুক্তি ব্যবহারকারীদের পূর্বনির্ধারিত প্রার্থীদের ভোট দেওয়ার অনুমতি দেবে এবং প্রতিটি প্রার্থী মোট কত ভোট পেয়েছেন তা ট্র্যাক করবে। আমরা TON Web IDE-এর ভিতরে সবকিছু করব, যা একটি ইন-ব্রাউজার টুল যেখানে আপনি স্থানীয়ভাবে কিছু ইনস্টল না করেই আপনার চুক্তিগুলি লিখতে, তৈরি করতে এবং পরীক্ষা করতে পারবেন। ধাপ ১ – TON ওয়েব IDE খুলুন এ যান। https://ide.ton.org পপআপে, এ ক্লিক করুন: "একটি নতুন প্রকল্প তৈরি করুন" ভাষাটি এ আছে কিনা তা নিশ্চিত করুন। Tact আপনার টেমপ্লেট হিসেবে বেছে নিন। "Blank Contract" তোমার প্রোজেক্টের নাম দাও এর মতো। 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 যদি 2 হয়, তাহলে আমরা এ +1 যোগ করব। msg.candidate votesBob অবশেষে, আমরা গেটার ফাংশন তৈরি করব যাতে চুক্তির অবস্থা পরিবর্তন না করেই যে কেউ প্রতিটি প্রার্থীর ভোট গণনা সম্পর্কে জিজ্ঞাসা করতে পারে। // 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; } } ধাপ ৪ – চুক্তি তৈরি এবং বাস্তবায়ন করুন বাম সাইডবারে, এ ক্লিক করুন। Build & Deploy এর অধীনে, নিশ্চিত করুন যে নির্বাচন করা আছে। Environment স্যান্ডবক্স নিশ্চিত করুন যে নির্বাচন করা হয়েছে এবং ক্লিক করুন। এটি আপনার চুক্তিটি কম্পাইল করবে এবং আপনার কোডে কোনও সিনট্যাক্স ত্রুটি বা সমস্যা আছে কিনা তা পরীক্ষা করবে। main.tact Build এ এরপর, নিশ্চিত করুন যে ড্রপডাউনে নির্বাচিত আছে কারণ এটি আপনার আসল চুক্তি, ডিফল্ট স্থানধারক নয়। যদি আপনি এটি দেখতে না পান, তাহলে আপনার ফাইলটি সংরক্ষণ করতে টিপুন যাতে IDE আপডেট করা চুক্তিটি সনাক্ত করতে পারে। VotingContract Ctrl + S তারপর ক্লিক করুন। সবকিছু ঠিকঠাক কাজ করলে, লগে একটি নিশ্চিতকরণ বার্তা দেখতে পাবেন যা দেখায় যে আপনার চুক্তিটি স্যান্ডবক্সে সফলভাবে স্থাপন করা হয়েছে। ReDeploy এ ধাপ ৫ – চুক্তির সাথে ইন্টারঅ্যাক্ট করুন একবার স্থাপন করা হলে, নিচে স্ক্রোল করুন এবং আপনি দুটি বিভাগ দেখতে পাবেন: , প্রাপ্তকারীরা: getVotesForAlice getVotesForBob রিসিভার: Vote বিভাগে, ইনপুট ক্ষেত্রে লিখুন এবং আপনি সবেমাত্র অ্যালিসকে ভোট দিয়েছেন! আরও ভোট দেওয়ার জন্য আপনি এটি পুনরাবৃত্তি করতে পারেন। ভোট দিতে: ভোট candidate 1 পাঠান ক্লিক করুন। : অধীনে ক্লিক করুন এবং ভোট গণনা দেখতে প্যানেলটি দেখুন। ভোট গণনা পরীক্ষা করতে getVotesForAlice Call এ লগ ববের ক্ষেত্রেও একই কাজ করুন, ফিল্ডে পাঠিয়ে, তারপর চেক করুন। candidate 2 getVotesForBob আমার পরীক্ষামূলক অভিযানে, আমি Alice-কে এবং Bob-কে ভোট দিয়েছি, এবং getter ফাংশনগুলি ঠিক তাই দেখিয়েছে। ৯ বার ৬ বার 💭 শেষ ভাবনা: গড়ে তুলতে থাকুন, অন্বেষণ করতে থাকুন 🙌 পুরোটা পড়ে ফেলেছেন, তাহলে অভিনন্দন! এখন আপনি যখন দেখেছেন যে Tact-এ একটি সাধারণ ভোটিং চুক্তি কীভাবে কাজ করে, আপনি TON-তে স্মার্ট চুক্তি উন্নয়নের দিকে আপনার প্রথম পদক্ষেপ নিয়েছেন। এই চুক্তিটি মৌলিক হতে পারে, তবে কাঠামো এবং ধারণাগুলি আরও জটিল যুক্তির ক্ষেত্রেও প্রযোজ্য। যদি আপনি পরীক্ষা-নিরীক্ষা চালিয়ে যেতে চান, তাহলে এই চুক্তিটি সম্প্রসারণ করার চেষ্টা করুন অথবা থেকে অন্যান্য পূর্বনির্মিত টেমপ্লেটগুলি অন্বেষণ করার চেষ্টা করুন। TON ওয়েব IDE বিভিন্ন ব্যবহারের ক্ষেত্রে চেষ্টা করা সহজ করে তোলে এবং এটি আপনাকে দ্রুত তৈরি এবং শিখতে সাহায্য করার জন্য টেমপ্লেটগুলির সাথেও আসে। https://tact-by-example.org/all তাই এগিয়ে যান, পরিবর্তন করুন, পরীক্ষা করুন, আরও ভালো কিছু তৈরি করুন।