Solidity তে নিয়ন্ত্রণ কাঠামো (Control Structures) ব্যবহৃত হয় কোডের প্রবাহ নিয়ন্ত্রণ করতে, যা প্রোগ্রামের আচরণ নির্ধারণ করে। যেমন অন্যান্য প্রোগ্রামিং ভাষায় নিয়ন্ত্রণ কাঠামো থাকে, Solidity তেও কিছু গুরুত্বপূর্ণ নিয়ন্ত্রণ কাঠামো রয়েছে যা কোডের বিভিন্ন অংশে শর্ত অনুসারে বিভিন্ন অপারেশন সম্পাদন করতে সহায়ক।
Solidity তে নিয়ন্ত্রণ কাঠামো প্রধানত তিন ধরনের হয়:
- If-Else Statements (যদি-অন্যথায় শর্ত)
- Loops (লুপ)
- Switch Statements (সুইচ স্টেটমেন্ট) - Solidity তে বর্তমানে সুইচ স্টেটমেন্টের কোনো সমর্থন নেই, তবে অন্যান্য কাঠামো ব্যবহার করে একই ধরনের কাজ করা যেতে পারে।
১. If-Else Statements (যদি-অন্যথায় শর্ত)
If-Else শর্ত নির্ধারণের জন্য ব্যবহৃত হয়, যেখানে নির্দিষ্ট শর্ত পূর্ণ হলে একটি নির্দিষ্ট কোড এক্সিকিউট হয় এবং অন্যথায় অন্য কোড এক্সিকিউট হয়। এটি প্রোগ্রামে শর্তাধীন সিদ্ধান্ত নেওয়ার জন্য ব্যবহৃত হয়।
pragma solidity ^0.8.0;
contract ControlExample {
uint256 public number;
function checkNumber(uint256 _number) public {
if (_number > 10) {
number = _number; // If _number is greater than 10
} else {
number = 0; // If _number is less than or equal to 10
}
}
}এই উদাহরণে, if-else স্টেটমেন্টে _number এর মান যাচাই করা হয়, যদি তা ১০ এর চেয়ে বড় হয় তবে সেটি number ভেরিয়েবলে সংরক্ষণ হবে, অন্যথায় সেটি ০ হয়ে যাবে।
২. Loops (লুপ)
লুপের মাধ্যমে একাধিক বার কোডের একটি অংশ চালানো যায়, এটি বেশ কার্যকর যখন কোনো কাজকে বারবার করতে হয়। Solidity তে দুটি ধরনের লুপ ব্যবহৃত হয়:
- For Loop: একটি নির্দিষ্ট সংখ্যক বার কোড এক্সিকিউট করা।
- While Loop: একটি শর্ত পূর্ণ না হওয়া পর্যন্ত কোড চালানো।
For Loop Example:
pragma solidity ^0.8.0;
contract LoopExample {
uint256[] public numbers;
function addNumbers(uint256 _count) public {
for (uint256 i = 0; i < _count; i++) {
numbers.push(i); // Add i to the numbers array
}
}
}এই উদাহরণে, for লুপের মাধ্যমে _count সংখ্যক বার i ভেরিয়েবলের মানকে numbers অ্যারে তে যোগ করা হয়।
While Loop Example:
pragma solidity ^0.8.0;
contract LoopExample {
uint256 public number = 0;
function incrementWhile(uint256 _max) public {
while (number < _max) {
number++; // Increment number until it reaches _max
}
}
}এখানে, while লুপটি number এর মান _max পর্যন্ত বাড়াতে থাকে।
৩. Require Statements (অবশ্যক শর্ত)
Solidity তে require স্টেটমেন্ট ব্যবহার করা হয় শর্ত পূর্ণ না হলে ট্রানজেকশন বাতিল করতে এবং একটি ত্রুটি বার্তা প্রেরণ করতে। এটি সাধারণত শর্ত যাচাই করার জন্য ব্যবহৃত হয়, যেমন পেমেন্ট বা শর্তগুলি পূর্ণ হলে তবেই কিছু কাজ করা হবে।
pragma solidity ^0.8.0;
contract RequireExample {
uint256 public balance;
function deposit(uint256 _amount) public {
require(_amount > 0, "Amount must be greater than zero");
balance += _amount; // Deposit amount
}
}এখানে, require শর্তটি পরীক্ষা করে যে _amount শূন্যের চেয়ে বড় কিনা। যদি শর্তটি পূর্ণ না হয়, তবে ট্রানজেকশন বাতিল হয়ে যাবে এবং একটি ত্রুটি বার্তা প্রদর্শিত হবে।
৪. Revert (ফিরে যাওয়া)
revert ব্যবহার করা হয় একটি স্টেটমেন্টের জন্য এবং সাধারণত কোনো কাজ সঠিকভাবে না হলে, বা কোনো ত্রুটি ঘটলে সম্পূর্ণ ট্রানজেকশনকে বাতিল করার জন্য। এটি require এর মতো কাজ করে তবে বেশি কাস্টমাইজেশন প্রদান করে।
pragma solidity ^0.8.0;
contract RevertExample {
uint256 public balance;
function withdraw(uint256 _amount) public {
if (_amount > balance) {
revert("Insufficient funds"); // Revert the transaction if not enough balance
}
balance -= _amount;
}
}এখানে, revert স্টেটমেন্টটি নিশ্চিত করে যে _amount এর চেয়ে বেশি তোলার চেষ্টা করলে ট্রানজেকশন বাতিল হবে এবং একটি কাস্টম ত্রুটি বার্তা প্রদান করবে।
সারাংশ
Solidity তে নিয়ন্ত্রণ কাঠামো (Control Structures) ব্যবহার করে শর্ত ও লুপের মাধ্যমে প্রোগ্রামের আচরণ নিয়ন্ত্রণ করা যায়। এটি কোডের প্রবাহ সহজভাবে নিয়ন্ত্রণ করতে এবং নির্দিষ্ট শর্ত অনুযায়ী কার্যক্রম সম্পাদন করতে সহায়ক। if-else, for ও while লুপ, require, এবং revert ইত্যাদি কাঠামো Solidity প্রোগ্রামিং ভাষার গুরুত্বপূর্ণ উপাদান, যা স্মার্ট কন্ট্রাক্ট এবং ডিস্ট্রিবিউটেড অ্যাপ্লিকেশনগুলির কার্যকরী পরিচালনার জন্য অপরিহার্য।
Solidity তে if, else, এবং else if স্টেটমেন্ট ব্যবহার করে বিভিন্ন শর্তাবলী পরীক্ষা করা হয় এবং সেই অনুযায়ী প্রোগ্রামের বিভিন্ন অংশ কার্যকর করা হয়। এই শর্তাবলী বুলিয়ান মান (যেমন true বা false) এর উপর ভিত্তি করে সিদ্ধান্ত নেয়। এগুলি প্রোগ্রামে শর্তযুক্ত লজিক তৈরি করতে ব্যবহৃত হয়, যেখানে নির্দিষ্ট শর্তের উপর ভিত্তি করে কোডের কিছু অংশ কার্যকর করা হয়।
1. if স্টেটমেন্ট
if স্টেটমেন্টটি একটি শর্ত পরীক্ষা করে। যদি সেই শর্ত সত্য হয়, তবে নির্দিষ্ট কোড ব্লকটি কার্যকর হয়।
সিনট্যাক্স:
if (condition) {
// কোড যা condition সত্য হলে এক্সিকিউট হবে
}উদাহরণ:
uint256 balance = 100;
if (balance > 50) {
// যদি balance 50 এর বেশি হয়, তাহলে এটি এক্সিকিউট হবে
console.log("ব্যালান্স যথেষ্ট");
}এই উদাহরণে, যদি balance 50 এর বেশি হয়, তবে "ব্যালান্স যথেষ্ট" মেসেজটি প্রদর্শিত হবে।
2. else স্টেটমেন্ট
else স্টেটমেন্টটি তখন কার্যকর হয়, যখন পূর্বের if শর্ত মিথ্যা হয়। else ব্লকটি if শর্তটি মিথ্যা হলে কোড চালায়।
সিনট্যাক্স:
if (condition) {
// কোড যা condition সত্য হলে এক্সিকিউট হবে
} else {
// কোড যা condition মিথ্যা হলে এক্সিকিউট হবে
}উদাহরণ:
uint256 balance = 30;
if (balance > 50) {
console.log("ব্যালান্স যথেষ্ট");
} else {
console.log("ব্যালান্স অপর্যাপ্ত");
}এখানে, যেহেতু balance 50 এর কম, else ব্লকটি কার্যকর হবে এবং "ব্যালান্স অপর্যাপ্ত" মেসেজটি প্রদর্শিত হবে।
3. else if স্টেটমেন্ট
else if স্টেটমেন্টটি একাধিক শর্ত পরীক্ষা করতে ব্যবহৃত হয়। যদি প্রথম if শর্তটি মিথ্যা হয়, তবে এটি পরবর্তী শর্তটি পরীক্ষা করে, এবং সেই শর্তটি সত্য হলে নির্দিষ্ট কোড কার্যকর হয়।
সিনট্যাক্স:
if (condition1) {
// কোড যা condition1 সত্য হলে এক্সিকিউট হবে
} else if (condition2) {
// কোড যা condition2 সত্য হলে এক্সিকিউট হবে
} else {
// কোড যা condition1 এবং condition2 উভয়ই মিথ্যা হলে এক্সিকিউট হবে
}উদাহরণ:
uint256 balance = 40;
if (balance > 50) {
console.log("ব্যালান্স যথেষ্ট");
} else if (balance == 40) {
console.log("ব্যালান্স গড়পড়তা");
} else {
console.log("ব্যালান্স অপর্যাপ্ত");
}এখানে:
- প্রথমে if চেক করবে যদি
balance50 এর বেশি হয়। - যদি প্রথম শর্ত মিথ্যা হয়, তবে else if চেক করবে যদি
balance40 এর সমান হয়। - যদি সব শর্ত মিথ্যা হয়, তবে else ব্লকটি কার্যকর হবে।
এ উদাহরণে, "ব্যালান্স গড়পড়তা" মেসেজটি প্রদর্শিত হবে কারণ balance 40 এর সমান।
সারাংশ
Solidity তে if, else, এবং else if স্টেটমেন্টগুলি শর্তাবলী নির্ধারণ করতে ব্যবহৃত হয়। if শর্তটি প্রথমে পরীক্ষা করে, এবং যদি তা সত্য হয়, তখন তার সংশ্লিষ্ট কোড ব্লকটি কার্যকর হয়। যদি শর্ত মিথ্যা হয়, তবে else ব্লকটি কার্যকর হয়, এবং যদি একাধিক শর্ত থাকে তবে else if ব্যবহার করে অন্য শর্ত পরীক্ষা করা যায়। এই তিনটি স্টেটমেন্টই প্রোগ্রামিংয়ে লজিক্যাল সিদ্ধান্ত নিতে সহায়ক।
Solidity তে loops ব্যবহার করা হয় কিছু নির্দিষ্ট সংখ্যক বার কোডের ব্লক কার্যকর করার জন্য। এটি সাধারণত যখন আমরা চাই একই কোড বারবার চালাতে, তখন ব্যবহার হয়। Solidity তে তিনটি প্রধান ধরনের লুপ ব্যবহৃত হয়: for, while, এবং do-while। প্রতিটি লুপের গঠন এবং ব্যবহারের ক্ষেত্রে কিছু পার্থক্য রয়েছে, যা এখানে আলোচনা করা হচ্ছে।
1. for লুপ
for লুপ হল সবচেয়ে সাধারণ লুপ, যা নির্দিষ্ট সংখ্যক বার কোড ব্লকটি কার্যকর করার জন্য ব্যবহৃত হয়। এটি তিনটি অংশে বিভক্ত:
- শুরুতে ভেরিয়েবল ইনিশিয়ালাইজেশন
- শর্ত যাচাই করা
- প্রতিটি চক্রের পর ভেরিয়েবল আপডেট করা
গঠন:
for (initialization; condition; increment/decrement) {
// কোড ব্লক যা বারবার কার্যকর হবে
}উদাহরণ:
pragma solidity ^0.8.0;
contract MyContract {
uint256[] public numbers;
function addNumbers() public {
for (uint i = 0; i < 5; i++) {
numbers.push(i);
}
}
}এখানে, for লুপটি ৫ বার চলবে এবং প্রতিবার i এর মান ০ থেকে ৪ পর্যন্ত বৃদ্ধি পাবে এবং numbers অ্যারেতে মানগুলো সংযুক্ত হবে।
2. while লুপ
while লুপটি একটি শর্তের উপর ভিত্তি করে কোডের ব্লকটি চালায় যতক্ষণ না শর্ত মিথ্যা হয়। এখানে শর্ত প্রথমে যাচাই করা হয় এবং যদি শর্ত সত্য হয়, তাহলে কোডটি চলতে থাকে। এটি কোনো ভেরিয়েবল পরিবর্তন না করলে অদূর ভবিষ্যতে চিরকাল চলতে থাকে।
গঠন:
while (condition) {
// কোড ব্লক যা শর্ত সত্য থাকলে চলবে
}উদাহরণ:
pragma solidity ^0.8.0;
contract MyContract {
uint256 public counter = 0;
function incrementCounter() public {
while (counter < 5) {
counter++;
}
}
}এখানে, while লুপটি counter এর মান ৫ এর চেয়ে কম হওয়া পর্যন্ত চলবে এবং প্রতিবারে counter এর মান বৃদ্ধি পাবে।
3. do-while লুপ
do-while লুপটি while লুপের মতোই কাজ করে, কিন্তু একেবারে প্রথমে কোডের ব্লকটি কমপক্ষে একবার চালানো হয়, তারপর শর্ত যাচাই করা হয়। এর মানে, কোডটি একবার চলবে এবং তারপর শর্ত সত্য হলে আবার চলতে থাকবে।
গঠন:
do {
// কোড ব্লক যা অন্তত একবার চলবে
} while (condition);উদাহরণ:
pragma solidity ^0.8.0;
contract MyContract {
uint256 public counter = 0;
function incrementCounter() public {
do {
counter++;
} while (counter < 5);
}
}এখানে, do-while লুপটি প্রথমে কোডের ব্লকটি একবার চালাবে, তারপর counter এর মান ৫ এর চেয়ে কম হলে আবার চলবে।
সারাংশ
Solidity তে for, while, এবং do-while লুপ তিনটি ভিন্ন ধরণের লুপ, যা কোডের ব্লককে একাধিক বার কার্যকর করতে ব্যবহৃত হয়।
- for লুপ নির্দিষ্ট সংখ্যক বার কোড চালানোর জন্য ব্যবহৃত হয়, এবং এটি তিনটি অংশে বিভক্ত।
- while লুপ একটি শর্তের উপর ভিত্তি করে চলতে থাকে যতক্ষণ না শর্ত মিথ্যা হয়।
- do-while লুপ কমপক্ষে একবার কোড চালানোর পর শর্ত যাচাই করে, এবং যদি শর্ত সত্য থাকে তবে আবার চলতে থাকে।
এই লুপগুলো স্মার্ট কন্ট্রাক্টের কার্যকারিতা এবং কম্পিউটেশনাল দক্ষতা নিশ্চিত করতে সাহায্য করে।
Solidity তে function modifiers এবং require/assert এর মতো ফাংশনালিটি গুলি অত্যন্ত গুরুত্বপূর্ণ। এগুলি স্মার্ট কন্ট্রাক্টে নিরাপত্তা এবং কার্যকারিতা নিশ্চিত করার জন্য ব্যবহৃত হয়। নিচে আমরা তাদের ব্যাখ্যা করব এবং কিভাবে সেগুলি ব্যবহার করা হয়, তা দেখব।
Function Modifiers
Function Modifiers হল বিশেষ ধরনের ফাংশন যা অন্য একটি ফাংশনকে মোডিফাই করে (পরিবর্তন বা নিয়ন্ত্রণ করে)। এগুলি সাধারণত লজিকের পুনঃব্যবহারযোগ্যতা নিশ্চিত করতে ব্যবহৃত হয় এবং ফাংশনের প্রবাহের উপর শর্ত প্রয়োগ করতে পারে। Modifier একটি ফাংশন এর ভিতরে কিছু এক্সিকিউট করার আগে বা পরে কিছু কাজ সম্পাদন করতে পারে।
Function Modifiers এর কিছু প্রধান ব্যবহারের ক্ষেত্র:
- পেমেন্ট চেক করা: যে ফাংশনটি পেমেন্ট গ্রহণ করে, সে ফাংশনে পেমেন্ট শর্ত চেক করা।
- স্বত্তাধিকারী যাচাই: স্মার্ট কন্ট্রাক্টের মালিক বা নির্দিষ্ট ব্যক্তি ছাড়া কোনো ফাংশন কার্যকর না হওয়া।
- শর্ত পূর্ণ হলে ফাংশন চালানো: কিছু নির্দিষ্ট শর্ত পূর্ণ হলে ফাংশনটি চালানো।
Modifier এর উদাহরণ:
pragma solidity ^0.8.0;
contract Example {
address public owner;
// Constructor যা মালিক ঠিকানা সেট করে
constructor() {
owner = msg.sender;
}
// Modifier যা শুধু মালিকই চালাতে পারবে
modifier onlyOwner() {
require(msg.sender == owner, "You are not the owner");
_;
}
// ফাংশন যা শুধুমাত্র মালিক চালাতে পারবে
function secureAction() public onlyOwner {
// ফাংশন লজিক
}
}এখানে:
onlyOwnermodifier ফাংশনের এক্সিকিউশন শুরু হওয়ার আগে চেক করে যেmsg.sender(যিনি ফাংশনটি কল করছেন) মালিক কিনা।_;এটি মূল ফাংশনের এক্সিকিউশন পয়েন্ট, যেখানে modifier এর লজিক ফাংশনটি চালানোর আগে বা পরে কার্যকর হয়।
Require/Assert এর ব্যবহার
Require এবং Assert দুটি গুরুত্বপূর্ণ ফাংশন, যা শর্তাবলী যাচাই করার জন্য ব্যবহৃত হয়। যদিও উভয়ের কাজ একই রকম হলেও তাদের মধ্যে কিছু পার্থক্য আছে।
১. Require
require হল একটি প্রি-কন্ডিশন চেক যা ফাংশন বা ট্রানজেকশন চলাকালীন শর্ত সঠিক না হলে তা রিভার্স করে দেয় এবং এটির জন্য একটি মেসেজ প্রদান করে। এটি ব্যবহার করা হয় সেই ক্ষেত্রে, যেখানে কন্ট্রাক্টের কার্যকারিতা শর্ত সাপেক্ষ এবং শর্ত না পূর্ণ হলে কার্যক্রম বাতিল করা প্রয়োজন।
Require এর ব্যবহার:
pragma solidity ^0.8.0;
contract Example {
uint public balance;
// পেমেন্ট গ্রহণ করার ফাংশন
function deposit(uint _amount) public {
require(_amount > 0, "Amount must be greater than 0");
balance += _amount;
}
}এখানে:
require(_amount > 0, "Amount must be greater than 0");এই লাইনটি চেক করে যে পেমেন্টের পরিমাণ ০ এর বেশি কিনা। যদি শর্ত পূর্ণ না হয়, তাহলে পুরো ট্রানজেকশন রিভার্স হয়ে যাবে এবং মেসেজ দেখানো হবে।
২. Assert
assert মূলত ব্যবহার করা হয় কন্ট্রাক্টের অবস্থা যাচাই করতে, যেখানে কোনো ভুল হওয়ার সম্ভাবনা অত্যন্ত কম। এটি কন্ট্রাক্টের ভুল বা অপ্রত্যাশিত আচরণ চিহ্নিত করতে ব্যবহৃত হয়। এটি মূলত কোডের কোনো ভুল বা ত্রুটি শনাক্ত করতে ব্যবহৃত হয়, এবং যদি শর্ত ভুল হয়, তবে পুরো ট্রানজেকশন বাতিল হয়ে যাবে।
Assert এর ব্যবহার:
pragma solidity ^0.8.0;
contract Example {
uint public balance;
function withdraw(uint _amount) public {
assert(balance >= _amount); // চেক করছে যে পর্যাপ্ত ব্যালেন্স আছে কিনা
balance -= _amount;
}
}এখানে:
assert(balance >= _amount);এই শর্তটি নিশ্চিত করছে যে ব্যালেন্স পর্যাপ্ত আছে। যদি ব্যালেন্স কম হয়, তবে ট্রানজেকশনটি বাতিল হয়ে যাবে এবং একটি ত্রুটি সৃষ্ট হবে।
Require এবং Assert এর মধ্যে পার্থক্য
| পার্থক্য | require | assert |
|---|---|---|
| কাজ | শর্ত পূর্ণ না হলে ট্রানজেকশন রিভার্স করে এবং একটি মেসেজ দেখায়। | শর্ত পূর্ণ না হলে কন্ট্রাক্টের ত্রুটি চিহ্নিত করে এবং ট্রানজেকশন বাতিল করে। |
| ব্যবহার | ফাংশন বা পেমেন্টের শর্ত যাচাই করার জন্য। | কন্ট্রাক্টের অবস্থা বা ভুল যাচাই করার জন্য। |
| গ্যাস খরচ | বেশি গ্যাস খরচ হয়। | কম গ্যাস খরচ হয়। |
| ব্যাখ্যা (Error message) | ব্যবহারকারীর জন্য বোধগম্য মেসেজ দেখায়। | কোনো ব্যাখ্যা মেসেজ প্রদর্শিত হয় না, শুধুমাত্র ত্রুটি। |
সারাংশ
Function Modifiers এবং require/assert এর মতো ফাংশনালিটি স্মার্ট কন্ট্রাক্টে কার্যকরী, নিরাপদ এবং দক্ষ প্রোগ্রামিং নিশ্চিত করে। Function modifiers বিভিন্ন ফাংশনে শর্ত বা লজিক প্রয়োগ করতে সহায়তা করে, যখন require এবং assert ত্রুটি শনাক্ত করতে এবং শর্ত যাচাই করতে ব্যবহৃত হয়। require ব্যবহার করা হয় শর্ত পূর্ণ না হলে ট্রানজেকশন রিভার্স করার জন্য, এবং assert ব্যবহার করা হয় অবস্থা যাচাই করে ত্রুটি চিহ্নিত করতে।
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