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 ব্যবহার করা হয় অবস্থা যাচাই করে ত্রুটি চিহ্নিত করতে।
Read more