Solidity তে ফাংশন এবং মডিফায়ারস দুটি গুরুত্বপূর্ণ উপাদান যা স্মার্ট কন্ট্রাক্টের কার্যকারিতা এবং নিরাপত্তা নিশ্চিত করতে ব্যবহৃত হয়। ফাংশনগুলোর মাধ্যমে স্মার্ট কন্ট্রাক্টে লজিক কার্যকর করা হয়, এবং মডিফায়ারস দ্বারা শর্ত বা অনুমতি নির্ধারণ করা হয়। এই টিউটোরিয়ালে আমরা ফাংশন এবং মডিফায়ারসের ব্যবহার এবং তাদের প্রয়োজনীয়তা সম্পর্কে আলোচনা করব।
১. Functions (ফাংশন)
Solidity তে ফাংশন হল এমন একটি ব্লক যা কিছু ইনপুট গ্রহণ করে এবং তা থেকে আউটপুট প্রদান করে। ফাংশনগুলি স্মার্ট কন্ট্রাক্টের লজিক বাস্তবায়ন করার জন্য ব্যবহৃত হয়। Solidity তে কিছু প্রকারের ফাংশন রয়েছে, যেমন public, internal, external, এবং private।
Types of Functions (ফাংশনের ধরন)
Public Functions: এই ফাংশনটি কন্ট্রাক্টের বাইরের যেকোনো প্রোগ্রাম অথবা অন্য কন্ট্রাক্ট থেকে কল করা যেতে পারে। এটি প্রোগ্রাম বা ব্যবহারকারীর কাছে সহজেই অ্যাক্সেসযোগ্য।
pragma solidity ^0.8.0; contract MyContract { uint256 public number; // Public function to set a number function setNumber(uint256 _number) public { number = _number; } }Private Functions: এই ফাংশনটি কেবলমাত্র কন্ট্রাক্টের ভিতরের ফাংশন থেকেই কল করা যায়। বাইরের অ্যাক্সেস থেকে এটি অ্যাক্সেসযোগ্য নয়।
pragma solidity ^0.8.0; contract MyContract { uint256 private number; // Private function to set a number function setNumber(uint256 _number) private { number = _number; } }Internal Functions: এই ফাংশনটি কন্ট্রাক্টের ভিতরে এবং এর ডেরাইভড কন্ট্রাক্ট থেকে অ্যাক্সেসযোগ্য, কিন্তু বাইরের কেউ এটি ব্যবহার করতে পারে না।
pragma solidity ^0.8.0; contract MyContract { uint256 internal number; // Internal function to set a number function setNumber(uint256 _number) internal { number = _number; } }External Functions: এই ফাংশনটি কেবলমাত্র অন্য কন্ট্রাক্ট থেকে কল করা যেতে পারে এবং এটি অ্যাক্সেস করার জন্য বাইরের প্রোগ্রামগুলোর প্রয়োজন।
pragma solidity ^0.8.0; contract MyContract { uint256 public number; // External function to set a number function setNumber(uint256 _number) external { number = _number; } }
View এবং Pure Functions
view: এই ধরনের ফাংশনগুলি ব্লকচেইনের ডেটা পড়ে কিন্তু কোনো পরিবর্তন করে না। এটি শুধুমাত্র পড়ার জন্য ব্যবহৃত হয়।
function getNumber() public view returns (uint256) { return number; }pure: এই ফাংশনগুলি ব্লকচেইনের ডেটার সাথে কোনো ইন্টারঅ্যাকশন করে না, এটি শুধু ইনপুট ডেটা থেকে আউটপুট দেয়।
function add(uint256 a, uint256 b) public pure returns (uint256) { return a + b; }
২. Modifiers (মডিফায়ারস)
Modifies হল এমন একটি বিশেষ ফাংশন যেগুলি অন্য ফাংশনের আচরণ বা কার্যকারিতা পরিবর্তন করতে ব্যবহৃত হয়। এটি সাধারণত চেক বা শর্তাবলী প্রয়োগ করতে ব্যবহৃত হয়, যা ফাংশন কল হওয়ার পূর্বে কার্যকর হয়। মডিফায়ারস ব্যবহার করে নির্দিষ্ট শর্ত পূর্ণ না হলে ফাংশন কার্যকর করা হয় না এবং একটি ত্রুটি বার্তা প্রদান করা হয়।
Modifier Syntax (মডিফায়ার সিনট্যাক্স)
modifier onlyOwner() {
require(msg.sender == owner, "You are not the owner");
_;
}এখানে, onlyOwner মডিফায়ারটি চেক করবে যে, ফাংশনটি শুধুমাত্র কন্ট্রাক্টের মালিকের কাছ থেকে কল করা হচ্ছে। যদি এই শর্ত পূর্ণ না হয়, তবে require ত্রুটি বার্তা প্রদর্শন করবে এবং ফাংশনটি এক্সিকিউট হবে না।
Modifier Example (মডিফায়ার উদাহরণ)
pragma solidity ^0.8.0;
contract Ownership {
address public owner;
// Modifier to check if the sender is the owner
modifier onlyOwner() {
require(msg.sender == owner, "You are not the owner");
_;
}
constructor() {
owner = msg.sender; // Set the owner when contract is deployed
}
// Function that can only be called by the owner
function restrictedAction() public onlyOwner {
// Perform some restricted action
}
}এখানে, onlyOwner মডিফায়ারটি নিশ্চিত করবে যে restrictedAction ফাংশনটি শুধুমাত্র কন্ট্রাক্টের মালিকই কল করতে পারবে।
Using Modifiers for Access Control (অ্যাক্সেস কন্ট্রোলের জন্য মডিফায়ার ব্যবহার)
মডিফায়ারস সাধারণত অ্যাক্সেস কন্ট্রোলের জন্য ব্যবহৃত হয়, অর্থাৎ কোন ফাংশন কে কল করতে পারবে এবং কে পারবে না তা নির্ধারণ করতে।
pragma solidity ^0.8.0;
contract AccessControl {
address public admin;
address public user;
// Modifier to restrict access to admin
modifier onlyAdmin() {
require(msg.sender == admin, "Not an admin");
_;
}
// Constructor to set initial admins
constructor(address _user) {
admin = msg.sender;
user = _user;
}
// Function only accessible by the admin
function adminAction() public onlyAdmin {
// Admin-specific actions
}
// Function accessible by the user
function userAction() public {
require(msg.sender == user, "Not the user");
// User-specific actions
}
}এখানে, onlyAdmin মডিফায়ারটি কেবলমাত্র adminAction ফাংশনটি কল করার জন্য অ্যাডমিনের অনুমতি দেয়, এবং userAction ফাংশনটি কেবলমাত্র নির্দিষ্ট ব্যবহারকারী দ্বারা কল করা যেতে পারে।
সারাংশ
Solidity তে ফাংশন এবং মডিফায়ারস স্মার্ট কন্ট্রাক্টের কার্যকারিতা এবং নিরাপত্তা নিশ্চিত করার জন্য অপরিহার্য। ফাংশনগুলি কন্ট্রাক্টের লজিক পরিচালনা করে এবং মডিফায়ারস এর মাধ্যমে শর্ত ও অনুমতি নির্ধারণ করা হয়। public, private, internal, এবং external ফাংশনের বিভিন্ন ধরন এবং মডিফায়ার ব্যবহার করে বিভিন্ন ধরনের কন্ট্রাক্ট তৈরি করা সম্ভব হয়, যা স্মার্ট কন্ট্রাক্টের কার্যক্ষমতা এবং নিরাপত্তা নিশ্চিত করে।
Solidity তে functions হল কোডের ব্লক যা নির্দিষ্ট কাজ বা কার্য সম্পাদন করতে ব্যবহৃত হয়। একটি ফাংশন সাধারণত একটি বা একাধিক ইনপুট নিয়ে কাজ করে এবং একটি আউটপুট প্রদান করে। ফাংশনগুলি স্মার্ট কন্ট্রাক্টের মধ্যে পুনরাবৃত্তি এবং লজিকাল কার্য সম্পাদন করার জন্য অত্যন্ত গুরুত্বপূর্ণ।
ফাংশনের declaration এবং definition দুটি আলাদা কনসেপ্ট।
1. Function Declaration
Function declaration একটি ফাংশনের নাম, আর্গুমেন্ট, এবং রিটার্ন টাইপ ঘোষণা করে, কিন্তু এটি কার্যকর হয় না। এটি কেবল ফাংশনটির কন্ট্রাক্টে উপস্থিতি জানায়। সাধারণত, function declaration কন্ট্রাক্টে এমনভাবে ব্যবহৃত হয় যাতে বিভিন্ন ফাংশন পরস্পরের সাথে যোগাযোগ করতে পারে।
Sintaxis:
<return_type> <function_name>(<parameter1>, <parameter2>, ...) <visibility>;<return_type>: ফাংশনের রিটার্ন টাইপ, যেমনuint,address,boolইত্যাদি।<function_name>: ফাংশনের নাম।<parameter1>,<parameter2>: ফাংশনের ইনপুট প্যারামিটার।<visibility>: ফাংশনের দৃশ্যমানতা, যেমনpublic,private,internal,external।
উদাহরণ:
function getBalance(address _user) public view returns (uint256);এখানে:
- ফাংশনের নাম:
getBalance - প্যারামিটার:
_user(একটিaddressটাইপ) - রিটার্ন টাইপ:
uint256 - দৃশ্যমানতা:
public(যা ব্লকচেইনে যেকোনো সত্ত্বা দ্বারা অ্যাক্সেস করা যাবে) viewফাংশনটি কোনও স্টেট পরিবর্তন করে না, এটি শুধুমাত্র ডেটা পড়বে।
2. Function Definition
Function definition একটি ফাংশনের পুরো কোড এবং কার্যকারিতা সংজ্ঞায়িত করে। এটি ফাংশনের দেহ (body) প্রদান করে এবং ফাংশনটি কীভাবে কাজ করবে তা নির্দিষ্ট করে।
Sintaxis:
<return_type> <function_name>(<parameter1>, <parameter2>, ...) {
// ফাংশনের দেহ
// কোড যা ফাংশনটি সম্পাদন করবে
}<return_type>: ফাংশনের রিটার্ন টাইপ।<function_name>: ফাংশনের নাম।<parameter1>,<parameter2>: ফাংশনের ইনপুট প্যারামিটার।- ফাংশনের দেহ: কোড যা ফাংশনের কার্য সম্পাদন করে।
উদাহরণ:
function getBalance(address _user) public view returns (uint256) {
return balances[_user];
}এখানে:
- ফাংশনের নাম:
getBalance - ইনপুট প্যারামিটার:
_user(একটিaddressটাইপ) - রিটার্ন টাইপ:
uint256 - ফাংশনের দেহ: এটি
balancesম্যাপিং থেকে_userঠিকানার জন্য ব্যালান্স রিটার্ন করবে।
3. Function Visibility
ফাংশনের দৃশ্যমানতা (visibility) Solidity তে খুবই গুরুত্বপূর্ণ, কারণ এটি নির্ধারণ করে কে কোন ফাংশন অ্যাক্সেস করতে পারবে। Solidity তে ৪ ধরনের দৃশ্যমানতা রয়েছে:
- public: এই ফাংশনটি চুক্তির বাইরে এবং ভিতরে অ্যাক্সেস করা যেতে পারে।
- private: এই ফাংশনটি কেবলমাত্র চুক্তির ভিতরে অ্যাক্সেস করা যেতে পারে।
- internal: এই ফাংশনটি চুক্তির ভিতরে এবং যেকোনো চুক্তি থেকে হেরিটেড (inherit) চুক্তি দ্বারা অ্যাক্সেস করা যেতে পারে।
- external: এই ফাংশনটি শুধুমাত্র চুক্তির বাইরের অ্যাক্সেসের জন্য ব্যবহৃত হয় এবং চুক্তির ভিতরে সরাসরি কল করা যায় না।
উদাহরণ:
// public function - অ্যাক্সেস করা যাবে বাইরে থেকেও
function setBalance(address _user, uint256 _amount) public {
balances[_user] = _amount;
}
// internal function - শুধুমাত্র চুক্তির ভিতরে অথবা inherited চুক্তির মাধ্যমে অ্যাক্সেস করা যাবে
function internalFunction() internal {
// কাজ
}
// private function - কেবল চুক্তির ভিতরে অ্যাক্সেস করা যাবে
function privateFunction() private {
// কাজ
}4. Function Return Types
Solidity তে একটি ফাংশন একটি বা একাধিক মান রিটার্ন করতে পারে। আপনি ফাংশনে returns কীওয়ার্ড ব্যবহার করে রিটার্ন টাইপ নির্ধারণ করেন।
উদাহরণ:
function add(uint256 a, uint256 b) public pure returns (uint256) {
return a + b;
}এখানে:
- ফাংশন
addদুটিuint256টাইপের প্যারামিটার নেয় এবং তাদের যোগফল রিটার্ন করে।
সারাংশ
Solidity তে function declaration এবং function definition দুটি গুরুত্বপূর্ণ ধারণা। Function declaration একটি ফাংশনের নাম, ইনপুট প্যারামিটার এবং রিটার্ন টাইপ ঘোষণা করে, কিন্তু তার কার্যকারিতা উল্লেখ করা হয় না। Function definition ফাংশনের কার্যকারিতা বা কোডের দেহ প্রদান করে এবং ফাংশনটি কিভাবে কাজ করবে তা নির্দিষ্ট করে। Solidity তে ফাংশনগুলোর দৃশ্যমানতা (public, private, internal, external) এবং রিটার্ন টাইপগুলি গুরুত্বপূর্ণ, কারণ এগুলি ফাংশনের অ্যাক্সেস এবং ব্যবহার কিভাবে হবে তা নির্ধারণ করে।
Solidity তে ফাংশনগুলি বিভিন্ন ধরনের ইনপুট (প্যারামিটার) গ্রহণ করতে এবং আউটপুট (রিটার্ন টাইপ) প্রদান করতে পারে। ফাংশন প্যারামিটার এবং রিটার্ন টাইপ ব্যবহারের মাধ্যমে ফাংশনগুলোকে আরও কার্যকর এবং গতিশীল করা যায়। এখানে ফাংশন প্যারামিটার এবং রিটার্ন টাইপ সম্পর্কে বিস্তারিত আলোচনা করা হলো।
1. Function Parameters (ফাংশন প্যারামিটার)
ফাংশন প্যারামিটার হল ইনপুট যেগুলি একটি ফাংশনকে ডাকা হলে তা সরবরাহ করা হয়। এই প্যারামিটারগুলো ফাংশনের কাজকর্ম নির্ধারণ করে। Solidity তে প্যারামিটারগুলি সরাসরি ফাংশনের ঘোষণায় ডিফাইন করা হয় এবং তা একাধিক টাইপের হতে পারে (যেমন uint, address, string, bool, array ইত্যাদি)।
ফাংশন প্যারামিটার গঠন:
function functionName(type parameter1, type parameter2, ...) public {
// কোড
}উদাহরণ:
pragma solidity ^0.8.0;
contract MyContract {
uint256 public balance;
// প্যারামিটার সহ ফাংশন
function setBalance(uint256 _balance) public {
balance = _balance;
}
}এখানে, setBalance ফাংশনটি _balance নামক একটি প্যারামিটার গ্রহণ করে, যেটি uint256 টাইপের। ফাংশনটি _balance প্যারামিটারটি balance ভেরিয়েবলে সেট করে।
- মেমরি (memory) এবং স্টোরেজ (storage) প্যারামিটার: Solidity তে প্যারামিটার হিসেবে
memoryএবংstorageব্যবহৃত হয়, যা ডেটা কোথায় সঞ্চিত হবে তা নির্ধারণ করে। সাধারণত প্যারামিটারগুলিmemoryতে ডিফাইন করা হয়, তবেstorageপ্যারামিটার ব্যবহার করা হয় যদি অ্যারে বা স্ট্রাকচারকে দীর্ঘস্থায়ীভাবে ব্লকচেইনে সংরক্ষণ করতে হয়।
উদাহরণ:
function updateArray(uint256[] memory _arr) public {
// অ্যারে আপডেট
}এখানে, _arr একটি অ্যারে প্যারামিটার হিসেবে গৃহীত, যেটি memory তে সংরক্ষিত হবে।
2. Return Types (রিটার্ন টাইপ)
ফাংশন রিটার্ন টাইপ হল আউটপুট যা ফাংশনটি কাজ করার পর প্রদান করে। একটি ফাংশন এক বা একাধিক মান ফিরিয়ে দিতে পারে, এবং এর জন্য রিটার্ন টাইপ নির্ধারণ করা হয় ফাংশনের ঘোষণায়।
ফাংশন রিটার্ন টাইপ গঠন:
function functionName() public returns (type) {
// কোড
}ফাংশন একাধিক মান ফিরিয়ে দিতে পারে, এই ক্ষেত্রে একটি tuple (একাধিক মানের গ্রুপ) ব্যবহার করা হয়।
উদাহরণ:
pragma solidity ^0.8.0;
contract MyContract {
uint256 public balance;
// রিটার্ন টাইপ সহ ফাংশন
function getBalance() public view returns (uint256) {
return balance;
}
}এখানে, getBalance ফাংশনটি uint256 টাইপের একটি মান রিটার্ন করে, যা balance ভেরিয়েবলের মান।
- অবস্থানের দৃষ্টিকোণ (view): যদি ফাংশনটি ব্লকচেইনের স্টেট পরিবর্তন না করে, তবে তাকে
viewকিওয়ার্ড দিয়ে চিহ্নিত করা হয়। যেমন,getBalanceএকটিviewফাংশন যেহেতু এটি শুধুমাত্রbalanceএর মান পড়বে এবং কোনো পরিবর্তন করবে না। - Pure Functions: যদি ফাংশনটি ব্লকচেইনের স্টেট বা কন্ট্রাক্টের ভেরিয়েবলগুলোর সাথে কোনো ইন্টারঅ্যাকশন না করে, তবে তা
pureহিসেবে চিহ্নিত করা হয়। এই ধরনের ফাংশন কেবলমাত্র ইনপুট থেকে আউটপুট উৎপন্ন করে, কোন ব্লকচেইন স্টেটের পরিবর্তন না ঘটিয়ে।
উদাহরণ:
function addNumbers(uint256 a, uint256 b) public pure returns (uint256) {
return a + b;
}এখানে, addNumbers একটি pure ফাংশন যা দুটি uint256 প্যারামিটার নিয়ে তাদের যোগফল রিটার্ন করে।
3. Multiple Return Values (একাধিক রিটার্ন মান)
Solidity তে একটি ফাংশন একাধিক মানও রিটার্ন করতে পারে। একাধিক মান রিটার্ন করতে tuple ব্যবহার করা হয়।
উদাহরণ:
pragma solidity ^0.8.0;
contract MyContract {
uint256 public balance;
address public owner;
// একাধিক মান রিটার্ন করা
function getBalanceAndOwner() public view returns (uint256, address) {
return (balance, owner);
}
}এখানে, getBalanceAndOwner ফাংশনটি দুটি মান রিটার্ন করছে: balance (একটি uint256) এবং owner (একটি address)।
সারাংশ
Solidity তে ফাংশন প্যারামিটার এবং রিটার্ন টাইপ গুরুত্বপূর্ণ ভূমিকা পালন করে, কারণ এগুলির মাধ্যমে ফাংশনগুলোকে কার্যকরী এবং নমনীয় করা হয়। ফাংশন প্যারামিটারগুলি ইনপুট হিসেবে গ্রহণ করা হয় এবং রিটার্ন টাইপ দ্বারা আউটপুট প্রদান করা হয়। Solidity তে একাধিক মান রিটার্ন করার জন্য tuple ব্যবহার করা হয় এবং ফাংশনের কার্যকারিতা অনুযায়ী view, pure, অথবা সাধারণ রিটার্ন টাইপ ব্যবহার করা হয়।
Function Modifiers হল Solidity তে একটি শক্তিশালী ফিচার যা একটি ফাংশনকে পরিবর্তন বা নিয়ন্ত্রণ করার জন্য ব্যবহৃত হয়। এটি ফাংশনের আগে বা পরে কিছু নির্দিষ্ট লজিক প্রয়োগ করতে সক্ষম হয় এবং কোডের পুনঃব্যবহারযোগ্যতা নিশ্চিত করে। Function modifiers সাধারণত নিরাপত্তা, অনুমতি যাচাই, পেমেন্ট শর্ত ইত্যাদি লজিক প্রয়োগে ব্যবহৃত হয়।
Function Modifiers এর বৈশিষ্ট্য
- কোড পুনঃব্যবহারযোগ্যতা: Modifier দিয়ে একাধিক ফাংশনে একই লজিক প্রয়োগ করা যেতে পারে, যা কোডের পুনঃব্যবহারযোগ্যতা নিশ্চিত করে।
- ফাংশন চালানোর পূর্বে বা পরে এক্সিকিউশন কন্ট্রোল: Modifier ফাংশনের আগে বা পরে কাজ করতে পারে। এটি ফাংশনের কার্যকলাপের শর্ত নির্ধারণ করে।
- শর্ত যাচাই: Modifier দিয়ে ব্যবহারকারী বা শর্ত যাচাই করা যেতে পারে, যেমন মালিকের অনুমতি, পেমেন্টের পরিমাণ ইত্যাদি।
Modifier এর উদাহরণ
১. Basic Modifier Example
এখানে একটি সাধারণ modifier ব্যবহার করা হয়েছে যা নিশ্চিত করে যে একটি ফাংশন শুধুমাত্র মালিকের দ্বারা এক্সিকিউট করা যাবে।
pragma solidity ^0.8.0;
contract Example {
address public owner;
constructor() {
owner = msg.sender; // মালিক হিসেবে চিহ্নিত করা হচ্ছে
}
// Modifier যা চেক করবে যে ফাংশনটি মালিকের কাছ থেকেই কল হয়েছে কিনা
modifier onlyOwner() {
require(msg.sender == owner, "You are not the owner");
_;
}
// ফাংশন যা শুধুমাত্র মালিক চালাতে পারবেন
function secureAction() public onlyOwner {
// কিছু লজিক
}
}এখানে:
onlyOwnermodifier চেক করে যেmsg.sender(যিনি ফাংশন কল করছেন)ownerএর সমান কিনা।_;এটি modifier এর মধ্যে সন্নিবেশিত হয়, যা ফাংশন এক্সিকিউট করার জায়গা নির্দেশ করে।secureAction()ফাংশনটি শুধুমাত্রownerএর মাধ্যমে এক্সিকিউট হবে।
২. Modifier for Payment Validation
এখানে একটি modifier ব্যবহার করা হয়েছে যা নিশ্চিত করবে যে একটি ফাংশনে পেমেন্টের পরিমাণ শূন্যের চেয়ে বেশি হতে হবে।
pragma solidity ^0.8.0;
contract Payment {
// Modifier যা নিশ্চিত করবে যে পেমেন্টের পরিমাণ শূন্যের চেয়ে বেশি
modifier amountGreaterThanZero(uint _amount) {
require(_amount > 0, "Amount must be greater than zero");
_;
}
// ফাংশন যা পেমেন্ট গ্রহণ করবে
function deposit(uint _amount) public payable amountGreaterThanZero(_amount) {
// পেমেন্ট গ্রহণের লজিক
}
}এখানে:
amountGreaterThanZeromodifier চেক করবে যে_amount০ এর চেয়ে বেশি কিনা। যদি শর্ত পূর্ণ না হয়, ট্রানজেকশন বাতিল হয়ে যাবে।depositফাংশনেamountGreaterThanZeromodifier ব্যবহৃত হয়েছে যাতে পেমেন্টের পরিমাণ সঠিক হয়।
৩. Modifier for Access Control
এখানে একটি modifier ব্যবহার করা হয়েছে যা নিশ্চিত করবে যে, একটি নির্দিষ্ট রোলের অধিকারী ব্যক্তি শুধুমাত্র কিছু ফাংশন এক্সিকিউট করতে পারবেন।
pragma solidity ^0.8.0;
contract AccessControl {
mapping(address => bool) public admins;
constructor() {
admins[msg.sender] = true; // কন্ট্রাক্ট ডিপ্লয়ারের জন্য admin privilege
}
// Modifier যা চেক করবে যে কলকারী admin কিনা
modifier onlyAdmin() {
require(admins[msg.sender], "You are not an admin");
_;
}
// ফাংশন যা শুধুমাত্র admin ব্যবহার করতে পারবেন
function addAdmin(address _admin) public onlyAdmin {
admins[_admin] = true;
}
// ফাংশন যা শুধুমাত্র admin ব্যবহার করতে পারবেন
function removeAdmin(address _admin) public onlyAdmin {
admins[_admin] = false;
}
}এখানে:
onlyAdminmodifier চেক করবে যেmsg.senderএকটিadminকিনা। যদি না হয়, তবে অ্যাক্সেস নিষিদ্ধ হবে।addAdminএবংremoveAdminফাংশনগুলি শুধুমাত্রadminরোলের অধিকারী দ্বারা এক্সিকিউট করা যাবে।
৪. Complex Modifier Example
একটি complex modifier যেখানে একটি ফাংশনের মধ্যে দুটি শর্ত প্রয়োগ করা হয়েছে:
- ব্যবহারকারী
msg.senderএর মাধ্যমে কাজটি করতে হবে, এবং - একটি নির্দিষ্ট পরিমাণ Ether পেমেন্ট করা উচিত।
pragma solidity ^0.8.0;
contract ComplexModifier {
address public owner;
constructor() {
owner = msg.sender; // মালিক ঠিকানা
}
// Modifier যা মালিক চেক করবে এবং Ether এর পরিমাণ যাচাই করবে
modifier onlyOwnerAndPayment() {
require(msg.sender == owner, "Only owner can perform this action");
require(msg.value >= 1 ether, "Minimum 1 ether required");
_;
}
// ফাংশন যা মালিক এবং 1 ether পেমেন্ট নিশ্চিত করে এক্সিকিউট হবে
function performAction() public payable onlyOwnerAndPayment {
// এক্সিকিউট লজিক
}
}এখানে:
onlyOwnerAndPaymentmodifier দুটি শর্ত প্রয়োগ করে। প্রথমত, এটি চেক করে যে কলকারী মালিক কি না, এবং দ্বিতীয়ত, এটি নিশ্চিত করে যে কমপক্ষে ১ ether পেমেন্ট করা হয়েছে।performActionফাংশনটি শুধুমাত্র এই দুটি শর্ত পূর্ণ হলে এক্সিকিউট হবে।
Modifier এর ব্যবহার এবং উপকারিতা
- কোডের পুনঃব্যবহার: Modifier ফাংশনালিটি পুনঃব্যবহার করতে সাহায্য করে, যাতে একই লজিক একাধিক জায়গায় ব্যবহার করা যায়।
- নিরাপত্তা এবং যাচাই: Modifier দিয়ে অনুমতি যাচাই, পেমেন্ট চেক, এবং অন্যান্য নিরাপত্তা ফিচার প্রয়োগ করা যায়।
- লজিক প্রিপেন্ড বা পোস্টপেন্ড: Modifier দিয়ে ফাংশন চলার আগে বা পরে কিছু লজিক প্রয়োগ করা যায়, যা ফাংশনের এক্সিকিউশন নিয়ন্ত্রণ করে।
সারাংশ
Function Modifiers Solidity তে খুবই শক্তিশালী টুল, যা কোডের পুনঃব্যবহারযোগ্যতা বাড়ায় এবং ফাংশন এক্সিকিউশনের আগে বা পরে শর্ত প্রয়োগ করতে সহায়তা করে। এগুলি বিশেষ করে নিরাপত্তা যাচাই, পেমেন্ট শর্ত, এবং ফাংশনের এক্সিকিউশনের শর্ত নির্ধারণে ব্যবহৃত হয়। Function modifiers এর মাধ্যমে কোডের অখণ্ডতা নিশ্চিত করা যায় এবং স্মার্ট কন্ট্রাক্টের কার্যকারিতা বাড়ানো যায়।
Solidity তে constructor এবং destructor দুটি গুরুত্বপূর্ণ কনসেপ্ট যা স্মার্ট কন্ট্রাক্টের জীবনের প্রথম এবং শেষ মুহূর্তে কার্যক্রম নিয়ন্ত্রণ করে। এগুলি স্মার্ট কন্ট্রাক্টের ইনিশিয়ালাইজেশন এবং ডিপ্লয়মেন্টের সময়কার কাজগুলি নির্ধারণ করে এবং সম্পাদন করে। যদিও Solidity তে destructor এর প্রথাগত ব্যবহার নেই, তবুও আমরা এর ধারণা এবং কার্যকারিতা ব্যাখ্যা করব।
1. Constructor
Constructor একটি বিশেষ ধরনের ফাংশন যা কন্ট্রাক্ট ডিপ্লয় করার সময় একবারই রান হয় এবং কন্ট্রাক্টের প্রাথমিক অবস্থান বা মান ইনিশিয়ালাইজ করতে ব্যবহৃত হয়। এটি কন্ট্রাক্টের ভিতরের প্রপার্টি সেট করা, অন্যান্য কন্ট্রাক্টের সাথে সংযোগ স্থাপন বা শর্তাদি প্রাথমিকভাবে নির্ধারণ করার জন্য ব্যবহৃত হয়।
Constructor এর বৈশিষ্ট্য:
- এটি কেবলমাত্র একবার কন্ট্রাক্টের ডিপ্লয়মেন্টের সময় কার্যকর হয়।
- এটি সাধারণত কন্ট্রাক্টের প্রপার্টি বা মান ইনিশিয়ালাইজ করার জন্য ব্যবহৃত হয়।
- Solidity তে কনস্ট্রাক্টরের নাম কন্ট্রাক্টের নামের সাথে মিলে যেতে হবে।
উদাহরণ:
pragma solidity ^0.8.0;
contract MyContract {
uint public value;
address public owner;
// Constructor ফাংশন
constructor(uint _value) {
value = _value; // value ইনিশিয়ালাইজ করা
owner = msg.sender; // কন্ট্রাক্টের মালিকের ঠিকানা সংরক্ষণ করা
}
function getValue() public view returns (uint) {
return value;
}
function getOwner() public view returns (address) {
return owner;
}
}ব্যাখ্যা:
- এই কন্ট্রাক্টে
constructorফাংশনটি ডিপ্লয়মেন্টের সময়valueএবংownerপ্রপার্টি ইনিশিয়ালাইজ করছে। valueকন্ট্রাক্টের সাথে দেয়া একটি আর্গুমেন্ট দিয়ে সেট করা হচ্ছে।ownerকন্ট্রাক্টের ডিপ্লয়ারের ঠিকানা (যাmsg.senderদ্বারা নির্ধারিত হয়) সংরক্ষণ করছে।
2. Destructor
Destructor হল একটি কনসেপ্ট যা অন্যান্য প্রোগ্রামিং ভাষায় ব্যবহৃত হয়, যেমন C++ বা Python, যেখানে এটি অবজেক্টের জীবন শেষ হলে স্বয়ংক্রিয়ভাবে এক্সিকিউট হয় এবং মেমরি বা রিসোর্স ক্লিন আপ করে। কিন্তু Solidity তে destructor এর মতো একটি নির্দিষ্ট ফাংশন নেই। তবে, Solidity তে কন্ট্রাক্টকে self-destruct ফাংশনের মাধ্যমে পুরোপুরি ধ্বংস বা অদৃশ্য করা সম্ভব।
self-destruct ফাংশনটি ব্যবহৃত হলে কন্ট্রাক্টটি ব্লকচেইন থেকে মুছে ফেলা হয় এবং এর সমস্ত অবশিষ্ট টাকা পাঠিয়ে দেয়া হয় একটি নির্দিষ্ট ঠিকানায়।
self-destruct ফাংশন উদাহরণ:
pragma solidity ^0.8.0;
contract SelfDestructExample {
address public owner;
constructor() {
owner = msg.sender; // কন্ট্রাক্টের মালিকের ঠিকানা সংরক্ষণ
}
function destroyContract() public {
require(msg.sender == owner, "Only the owner can destroy the contract.");
selfdestruct(payable(owner)); // কন্ট্রাক্ট ধ্বংস করা এবং মালিকের কাছে সব তহবিল পাঠানো
}
}ব্যাখ্যা:
selfdestructফাংশনটি কন্ট্রাক্টটি ব্লকচেইন থেকে মুছে ফেলবে এবং মালিকের ঠিকানায় সমস্ত তহবিল পাঠিয়ে দেবে।- এই ফাংশনটি কেবলমাত্র কন্ট্রাক্টের মালিক (যার ঠিকানা
ownerদ্বারা সংরক্ষিত) কল করতে পারবে, যেটিrequireদ্বারা নিশ্চিত করা হয়েছে।
self-destruct এর বৈশিষ্ট্য:
- এটি কন্ট্রাক্টের সম্পূর্ণ মুছে ফেলা এবং তার তহবিল প্রেরণের জন্য ব্যবহৃত হয়।
- এটি ব্যবহার করা হলে কন্ট্রাক্ট আর ব্লকচেইনে থাকবে না এবং সম্পূর্ণভাবে ধ্বংস হয়ে যাবে।
- এটি শুধুমাত্র মালিক বা নির্ধারিত ব্যবহারকারী দ্বারা কল করা যেতে পারে।
3. Constructor এবং Destructor এর মধ্যে পার্থক্য
| বিশেষত্ব | Constructor | Destructor (self-destruct) |
|---|---|---|
| ফাংশনের কার্যকারিতা | কন্ট্রাক্টের ইনিশিয়াল মান সেট করা, প্রপার্টি ইনিশিয়ালাইজ করা | কন্ট্রাক্ট মুছে ফেলা, কন্ট্রাক্টের সম্পদ প্রেরণ করা |
| ফাংশন কল করা হয় | কন্ট্রাক্ট ডিপ্লয় করার সময় একবারই কল হয় | কন্ট্রাক্টের ধ্বংসের জন্য ব্যবহৃত, সাধারণত মালিকের দ্বারা |
| ব্যবহার | কন্ট্রাক্টের প্রথম অবস্থান নির্ধারণ করতে ব্যবহৃত | কন্ট্রাক্ট ধ্বংস ও তহবিল প্রেরণের জন্য ব্যবহৃত |
সারাংশ
Constructor এবং Destructor Solidity তে গুরুত্বপূর্ণ ভূমিকা পালন করে। Constructor কন্ট্রাক্টের প্রাথমিক মান এবং শর্ত নির্ধারণ করে, যখন Destructor (প্রকৃতপক্ষে self-destruct) কন্ট্রাক্ট ধ্বংস করে এবং অবশিষ্ট তহবিল অন্য একটি ঠিকানায় পাঠিয়ে দেয়। Solidity তে একটি নির্দিষ্ট Destructor ফাংশন নেই, তবে self-destruct এর মাধ্যমে কন্ট্রাক্টের অবসান ঘটানো যায়। Constructor একবার ডিপ্লয়মেন্টের সময় কার্যকরী হয়, তবে self-destruct কন্ট্রাক্টের অবসান ঘটানোর জন্য ব্যবহৃত হয় যখন তা আর প্রয়োজনীয় থাকে না।
Read more