Solidity তে time-based control structures বা সময় ভিত্তিক নিয়ন্ত্রণ কাঠামো ব্যবহার করে আপনি স্মার্ট কন্ট্রাক্টে নির্দিষ্ট সময়ের উপর ভিত্তি করে কিছু কার্যক্রম বা শর্ত নির্ধারণ করতে পারেন। এই ধরনের কাঠামো ব্যবহার করে আপনি কন্ট্রাক্টে সময় নির্ধারণ করে ট্রানজেকশন, ফাংশন এক্সিকিউশন, এবং অন্যান্য কার্যকলাপ পরিচালনা করতে পারবেন।
Solidity তে সময় নির্ধারণ করার জন্য block.timestamp এবং block.number নামক কিছু বিল্ট-ইন গ্লোবাল ভেরিয়েবল রয়েছে, যা স্মার্ট কন্ট্রাক্টের সময় এবং ব্লক সংক্রান্ত তথ্য প্রদান করে।
1. block.timestamp
block.timestamp Solidity তে একটি বিল্ট-ইন গ্লোবাল ভেরিয়েবল যা একটি ব্লক এক্সিকিউট করার সময়ের UNIX টাইমস্ট্যাম্প প্রদান করে। এটি ব্লকচেইন নেটওয়ার্কের বর্তমান সময়কে প্রতিনিধিত্ব করে এবং সাধারণত স্মার্ট কন্ট্রাক্টে সময় ভিত্তিক শর্তের জন্য ব্যবহৃত হয়।
উদাহরণ:
pragma solidity ^0.8.0;
contract TimeBasedControl {
uint public startTime;
uint public duration;
constructor(uint _duration) {
startTime = block.timestamp; // কন্ট্রাক্ট ডিপ্লয় করার সময়
duration = _duration; // duration সেট করা
}
function hasTimeElapsed() public view returns (bool) {
// যদি নির্ধারিত সময় পার হয়ে যায় তবে true ফেরত দিবে
if (block.timestamp >= startTime + duration) {
return true;
}
return false;
}
}ব্যাখ্যা:
startTimeহল সেই সময় যখন কন্ট্রাক্টটি ডিপ্লয় হয়, যাblock.timestampদ্বারা নেওয়া হয়।durationহল সেই সময়কাল (সেকেন্ডে) যা আপনি কন্ট্রাক্টে সময় ভিত্তিক কার্যক্রমের জন্য নির্ধারণ করেছেন।hasTimeElapsedফাংশনটি চেক করবে যে নির্ধারিত সময়কাল পার হয়েছে কিনা। যদি সময় পার হয়ে যায়, তবে এটিtrueফেরত দিবে, অন্যথায়falseফেরত দিবে।
2. block.number
block.number হলো বিল্ট-ইন ভেরিয়েবল যা বর্তমান ব্লকের সংখ্যাটি প্রদান করে। এটি ব্লকচেইনে লেনদেনের সংখ্যা বা ব্লকের মোট গড় প্রতিনিধিত্ব করে এবং সময় নির্ধারণের জন্যও ব্যবহার করা যেতে পারে।
উদাহরণ:
pragma solidity ^0.8.0;
contract BlockNumberBasedControl {
uint public startBlock;
uint public blockCount;
constructor(uint _blockCount) {
startBlock = block.number; // কন্ট্রাক্ট ডিপ্লয় করার সময়
blockCount = _blockCount; // নির্ধারিত ব্লক সংখ্যা
}
function hasBlocksPassed() public view returns (bool) {
// যদি নির্ধারিত ব্লক সংখ্যা পার হয়ে যায় তবে true ফেরত দিবে
if (block.number >= startBlock + blockCount) {
return true;
}
return false;
}
}ব্যাখ্যা:
startBlockহল সেই ব্লকের সংখ্যা যখন কন্ট্রাক্টটি ডিপ্লয় হয়, যাblock.numberদ্বারা নেওয়া হয়।blockCountহল ব্লক সংখ্যা, যা আপনি সময় ভিত্তিক কার্যক্রমের জন্য নির্ধারণ করেছেন।hasBlocksPassedফাংশনটি চেক করবে যে নির্ধারিত ব্লক সংখ্যা পার হয়েছে কিনা। যদি ব্লক সংখ্যা পার হয়ে যায়, তবে এটিtrueফেরত দিবে, অন্যথায়falseফেরত দিবে।
3. Time-based Access Control
Solidity তে সময় ভিত্তিক অ্যাক্সেস কন্ট্রোল তৈরি করার জন্য আপনি সময় নির্ধারণ করে বিশেষ কিছু ফাংশন এক্সিকিউট করতে পারেন। উদাহরণস্বরূপ, আপনি একটি কন্ট্রাক্টে এমন ফাংশন তৈরি করতে পারেন যা নির্দিষ্ট সময় পরে কার্যকর হবে, বা নির্দিষ্ট সময়ের মধ্যে লক থাকবে।
উদাহরণ:
pragma solidity ^0.8.0;
contract TimeLocked {
uint public unlockTime;
constructor(uint _unlockTime) {
unlockTime = _unlockTime; // নির্ধারিত সময়কাল
}
function withdraw() public {
require(block.timestamp >= unlockTime, "Time has not passed yet.");
// যদি নির্ধারিত সময় পার হয়ে যায় তবে অর্থ উত্তোলন করতে পারবে
payable(msg.sender).transfer(address(this).balance);
}
// ফান্ড ডিপোজিট করার ফাংশন
function deposit() public payable {}
}ব্যাখ্যা:
unlockTimeহল নির্ধারিত সময়কাল (UNIX টাইমস্ট্যাম্প) যা কন্ট্রাক্টে লক বা অনুমোদন সময় হিসেবে ব্যবহৃত হয়।withdrawফাংশনেrequireব্যবহার করা হয়েছে, যা সময় চেক করবে এবং যদি নির্ধারিত সময় না আসে তবে অর্থ উত্তোলন করা যাবে না।
4. Time-based Modifier
একটি ফাংশনের উপর সময় ভিত্তিক নিয়ন্ত্রণ আরোপ করতে আপনি modifier ব্যবহার করতে পারেন। এই modifier দিয়ে আপনি নিশ্চিত করতে পারেন যে কেবলমাত্র নির্দিষ্ট সময়ের পরে ফাংশনটি চালু হবে।
উদাহরণ:
pragma solidity ^0.8.0;
contract TimeBasedModifier {
uint public startTime;
modifier onlyAfter(uint _time) {
require(block.timestamp >= _time, "Function not allowed yet");
_;
}
constructor() {
startTime = block.timestamp + 1 days; // এক দিন পর ফাংশন চালু হবে
}
function restrictedFunction() public onlyAfter(startTime) {
// একদিন পর ফাংশনটি এক্সিকিউট হবে
}
}ব্যাখ্যা:
onlyAfterএকটি modifier যা নির্ধারিত সময় (_time) এর পরে ফাংশনটি এক্সিকিউট করতে অনুমতি দেয়।restrictedFunctionফাংশনটি কেবলমাত্র এক দিন পর চালু হবে, কারণstartTimeকনস্ট্রাক্টর থেকে এক দিন পর নির্ধারিত হয়েছে।
সারাংশ
Solidity তে সময় ভিত্তিক নিয়ন্ত্রণ কাঠামো (Time-based Control Structures) স্মার্ট কন্ট্রাক্টে সময় নির্ধারণ করে কার্যক্রমের জন্য শর্ত নির্ধারণের জন্য ব্যবহৃত হয়। block.timestamp এবং block.number এর মাধ্যমে আপনি কন্ট্রাক্টের কার্যকারিতা নিয়ন্ত্রণ করতে পারেন, যেমন নির্দিষ্ট সময় পর ফাংশন চালু করা, ব্লক সংখ্যা নির্ধারণ করা, এবং সময় ভিত্তিক অ্যাক্সেস কন্ট্রোল বাস্তবায়ন করা। এই ধরনের সময় ভিত্তিক নিয়ন্ত্রণ স্মার্ট কন্ট্রাক্টের কার্যকারিতা এবং নিরাপত্তা বৃদ্ধি করতে সাহায্য করে।
Read more