Solidity তে modifiers এবং access control ব্লকচেইন স্মার্ট কন্ট্রাক্টে নিরাপত্তা এবং কার্যকারিতা নিশ্চিত করতে গুরুত্বপূর্ণ ভূমিকা পালন করে। মডিফায়ারস ব্যবহৃত হয় ফাংশনের আচরণ পরিবর্তন করতে, এবং অ্যাক্সেস কন্ট্রোল ব্যবহৃত হয় কোনো ফাংশনে কাদের অ্যাক্সেস থাকবে তা নিয়ন্ত্রণ করতে। এই টিউটোরিয়ালে আমরা মডিফায়ারস এবং অ্যাক্সেস কন্ট্রোল সম্পর্কে বিস্তারিতভাবে আলোচনা করব।
১. Modifiers (মডিফায়ারস)
Modifiers হল একটি বিশেষ ধরনের ফাংশন যা অন্য ফাংশনের কার্যকারিতা পরিবর্তন করতে ব্যবহৃত হয়। এটি সাধারণত শর্ত চেক বা অনুমতি প্রদান করার জন্য ব্যবহৃত হয়। মডিফায়ারগুলি ফাংশনের কার্যকরী হওয়া আগে কিছু যাচাই করতে বা ফাংশনটির প্রবাহ নিয়ন্ত্রণ করতে সাহায্য করে।
Modifier Declaration (মডিফায়ার ঘোষণা)
Solidity তে মডিফায়ার ঘোষণা করার জন্য modifier কিওয়ার্ড ব্যবহার করা হয়। নিচে একটি উদাহরণ দেওয়া হলো:
pragma solidity ^0.8.0;
contract ModifierExample {
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 {
// Only the owner can call this function
}
}এখানে, onlyOwner মডিফায়ারটি নিশ্চিত করবে যে restrictedAction ফাংশনটি কেবলমাত্র কন্ট্রাক্টের মালিকই কল করতে পারবে। require শর্তটি চেক করবে এবং যদি শর্ত পূর্ণ না হয়, তাহলে ট্রানজেকশন বাতিল হবে।
Modifier Syntax (মডিফায়ার সিনট্যাক্স)
modifier modifierName() {
// conditions
_;
}_;এখানে_হল স্ট্যানডার্ড প্লেসহোল্ডার, যার মাধ্যমে মডিফায়ারের পরে আসা মূল ফাংশনটি কার্যকর হয়। এটি ফাংশন কলের স্থানে বসবে।
Modifier Example (মডিফায়ার উদাহরণ)
pragma solidity ^0.8.0;
contract AccessControl {
address public admin;
// Modifier to check if the sender is the admin
modifier onlyAdmin() {
require(msg.sender == admin, "Not an admin");
_;
}
constructor() {
admin = msg.sender; // Set the admin as the contract deployer
}
// Function that can only be called by the admin
function performAdminAction() public onlyAdmin {
// Perform actions that only the admin can do
}
}এখানে, onlyAdmin মডিফায়ারটি কেবলমাত্র অ্যাডমিনকেই performAdminAction ফাংশনটি কল করার অনুমতি দেয়।
২. Access Control (অ্যাক্সেস নিয়ন্ত্রণ)
Access Control হল এমন একটি প্রক্রিয়া যার মাধ্যমে ফাংশনগুলোতে বিভিন্ন ব্যবহারকারীর অনুমতি নির্ধারণ করা হয়। এটি স্মার্ট কন্ট্রাক্টে শর্ত বা অনুমতি প্রদান করে, এবং কীভাবে এবং কখন ব্যবহারকারীরা কন্ট্রাক্টের ফাংশনগুলো কল করতে পারবে তা নিয়ন্ত্রণ করে।
Access Control using Modifiers (মডিফায়ার ব্যবহার করে অ্যাক্সেস নিয়ন্ত্রণ)
Access control সাধারণত modifiers এর মাধ্যমে নিয়ন্ত্রণ করা হয়। বিভিন্ন ধরনের অ্যাক্সেস কন্ট্রোল রয়েছে যেমন:
- Owner-based Access Control: কন্ট্রাক্টের মালিকের জন্য অ্যাক্সেস সীমিত করা।
- Role-based Access Control: একাধিক রোলের জন্য আলাদা আলাদা অ্যাক্সেস প্রদান করা।
Owner-based Access Control Example
pragma solidity ^0.8.0;
contract OwnerControl {
address public owner;
// Modifier to check if the sender is the owner
modifier onlyOwner() {
require(msg.sender == owner, "Not the owner");
_;
}
constructor() {
owner = msg.sender; // Set the owner when contract is deployed
}
// Function only the owner can call
function ownerAction() public onlyOwner {
// Owner can perform certain actions
}
}এখানে, onlyOwner মডিফায়ারটি ব্যবহার করে শুধুমাত্র কন্ট্রাক্টের মালিককে নির্দিষ্ট ফাংশনে অ্যাক্সেস প্রদান করা হয়েছে।
Role-based Access Control Example
pragma solidity ^0.8.0;
contract RoleBasedAccessControl {
address public admin;
address public user;
// Modifier to check if the sender is the admin
modifier onlyAdmin() {
require(msg.sender == admin, "Not an admin");
_;
}
// Modifier to check if the sender is the user
modifier onlyUser() {
require(msg.sender == user, "Not the user");
_;
}
constructor(address _user) {
admin = msg.sender;
user = _user;
}
// Function only the admin can call
function adminAction() public onlyAdmin {
// Admin-specific actions
}
// Function only the user can call
function userAction() public onlyUser {
// User-specific actions
}
}এখানে, onlyAdmin এবং onlyUser মডিফায়ারস ব্যবহার করে অ্যাডমিন এবং নির্দিষ্ট ব্যবহারকারীকে আলাদা আলাদা ফাংশনে অ্যাক্সেস প্রদান করা হয়েছে।
Access Control for Multiple Roles
Solidity তে Role-based Access Control আরও জটিল হতে পারে যেখানে একাধিক রোলের জন্য আলাদা আলাদা অ্যাক্সেস নির্ধারণ করা যায়। আপনি mapping ব্যবহার করে বিভিন্ন রোলের জন্য অ্যাক্সেস নিয়ন্ত্রণ করতে পারেন।
pragma solidity ^0.8.0;
contract RoleBasedAccessControl {
mapping(address => string) public roles;
modifier onlyRole(string memory role) {
require(keccak256(bytes(roles[msg.sender])) == keccak256(bytes(role)), "You don't have the required role");
_;
}
constructor() {
roles[msg.sender] = "admin"; // Set the contract deployer as admin
}
function assignRole(address _account, string memory _role) public onlyRole("admin") {
roles[_account] = _role; // Assign role to an account
}
function performAdminAction() public onlyRole("admin") {
// Perform action accessible only by admin
}
function performUserAction() public onlyRole("user") {
// Perform action accessible only by user
}
}এখানে, onlyRole মডিফায়ারটি ব্যবহার করে বিভিন্ন রোলের জন্য নির্দিষ্ট অ্যাক্সেস নিয়ন্ত্রণ করা হচ্ছে।
সারাংশ
Solidity তে modifiers এবং access control স্মার্ট কন্ট্রাক্টে নিরাপত্তা এবং কার্যকরীতা নিশ্চিত করতে গুরুত্বপূর্ণ ভূমিকা পালন করে। মডিফায়ারস ব্যবহৃত হয় ফাংশনের আচরণ পরিবর্তন করতে এবং শর্ত বা অনুমতি পরীক্ষা করার জন্য। অ্যাক্সেস কন্ট্রোলের মাধ্যমে ফাংশনগুলোতে কাদের অ্যাক্সেস থাকবে তা নির্ধারণ করা হয়, যা স্মার্ট কন্ট্রাক্টে নির্ভরযোগ্যতা ও নিরাপত্তা প্রদান করে। মডিফায়ারস ব্যবহার করে একাধিক রোলের জন্য আলাদা আলাদা অ্যাক্সেস প্রদান করা সম্ভব, যা স্মার্ট কন্ট্রাক্টের কার্যকারিতা এবং নিরাপত্তা আরও উন্নত করে।
Function Modifiers Solidity তে একটি শক্তিশালী ফিচার যা ফাংশনের আচরণ পরিবর্তন বা নিয়ন্ত্রণ করতে ব্যবহৃত হয়। এই modifiers ফাংশনের কার্যকারিতা, প্রবাহ এবং শর্তাবলীকে কাস্টমাইজ করতে সহায়ক। এগুলি সাধারণত ফাংশনের আগে বা পরে ব্যবহৃত হয় এবং ফাংশনের মধ্যে কিছু নির্দিষ্ট শর্ত বা নিরাপত্তা চেক যোগ করতে ব্যবহৃত হয়।
Function Modifier কী?
একটি modifier হলো একটি কাস্টম ফাংশন যা অন্য একটি ফাংশনকে পরিবর্তন বা নিয়ন্ত্রণ করার জন্য ব্যবহৃত হয়। এটি একটি বিশেষ ধরনের ফাংশন যা অন্যান্য ফাংশনের শর্তাবলী বা আচরণ নিয়ন্ত্রণ করে। মডিফায়ার একটি ফাংশনে ব্যবহৃত হলে, তা নির্দিষ্ট শর্ত পূর্ণ হলে বা নির্দিষ্ট কাজ সম্পাদন করলে ফাংশনটির আচরণ বা কার্যকারিতা পরিবর্তন করতে পারে।
Function Modifier Syntax
Solidity তে modifier ব্যবহার করার সিনট্যাক্স:
modifier <modifier_name> {
// শর্তাবলী বা নিরাপত্তা চেক
_;
}
function <function_name>() public <modifier_name> {
// ফাংশন কোড
}এখানে:
<modifier_name>: মডিফায়ারের নাম।_: এটি একটি বিশেষ কীওয়ার্ড যা নির্দেশ করে যে মডিফায়ার ফাংশনের মূল কোডে চলতে দেওয়ার আগে নির্দিষ্ট শর্ত পূর্ণ হলে সেখানে একটি এক্সিকিউশন পয়েন্ট হবে।
Modifier এর ব্যবহার
1. Access Control (অ্যাক্সেস কন্ট্রোল)
একটি সাধারণ ফাংশন মডিফায়ার হল access control, যা ফাংশনে নির্দিষ্ট অধিকার বা অ্যাক্সেস চেক করতে ব্যবহৃত হয়। উদাহরণস্বরূপ, একটি স্মার্ট কন্ট্রাক্টের মালিক (owner) ছাড়া কেউ ফাংশনটি এক্সিকিউট করতে পারবে না।
উদাহরণ:
address public owner;
modifier onlyOwner() {
require(msg.sender == owner, "You are not the owner!");
_; // ফাংশন কার্যকর করার আগে এই চেকটি পাস করতে হবে
}
constructor() {
owner = msg.sender;
}
function changeOwner(address newOwner) public onlyOwner {
owner = newOwner;
}এখানে:
onlyOwnerমডিফায়ারটি চেক করবে যেmsg.sender(অথবা কলকারী) হলownerঠিকানা, যদি না হয়, তাহলে ফাংশন এক্সিকিউট হবে না।changeOwnerফাংশনটি কেবলমাত্রonlyOwnerমডিফায়ার পাস হলে এক্সিকিউট হবে।
2. Input Validation (ইনপুট যাচাইকরণ)
মডিফায়ারগুলি ফাংশনের ইনপুট যাচাই করার জন্যও ব্যবহার করা যেতে পারে। উদাহরণস্বরূপ, যদি একটি টোকেন ট্রান্সফার ফাংশন থাকে, তবে আপনি যাচাই করতে পারেন যে ট্রান্সফারের পরিমাণ শূন্যের বেশি।
উদাহরণ:
modifier validAmount(uint256 amount) {
require(amount > 0, "Amount must be greater than zero");
_; // ফাংশনের কার্যকারিতা এক্সিকিউট করতে হবে
}
function transfer(address to, uint256 amount) public validAmount(amount) {
// ট্রান্সফার লজিক
}এখানে:
validAmountমডিফায়ারটি চেক করে যেamountশূন্যের বেশি কিনা। যদি না হয়, তাহলে এটি ফাংশনটি এক্সিকিউট হতে দেয় না।
3. Reentrancy Guard (রিইন্টারেন্সি গার্ড)
Reentrancy Attack Ethereum এবং অন্যান্য ব্লকচেইন প্ল্যাটফর্মে একটি সাধারণ নিরাপত্তা সমস্যা, যেখানে একটি অ্যাকাউন্ট একাধিকবার একটি ফাংশন কল করতে পারে। এটি প্রতিরোধ করার জন্য মডিফায়ার ব্যবহার করা হয়।
উদাহরণ:
bool private locked;
modifier noReentrancy() {
require(!locked, "No reentrancy allowed!");
locked = true;
_;
locked = false;
}
function withdraw(uint256 amount) public noReentrancy {
// উইথড্র করার লজিক
}এখানে:
noReentrancyমডিফায়ারটি নিশ্চিত করে যে কোনো একক সময়ে একাধিক বার ফাংশন কল করা সম্ভব না হয়, এটিlockedফ্ল্যাগ ব্যবহার করে রিইন্টারেন্সি আক্রমণ প্রতিরোধ করে।
4. Gas Optimization (গ্যাস অপটিমাইজেশন)
মডিফায়ারগুলিও গ্যাস ব্যবহারের অপটিমাইজেশনের জন্য ব্যবহার করা যেতে পারে, বিশেষ করে স্মার্ট কন্ট্রাক্টের কার্যকরীতা এবং গ্যাস খরচ কমানোর জন্য। কিছু কম্পিউটেশনাল কাজ যেমন রিডিং বা স্মার্ট কন্ট্রাক্টের স্টেট পরিবর্তন ইত্যাদি মডিফায়ারের মাধ্যমে আরও দক্ষভাবে সম্পাদন করা যায়।
Modifier এর ব্যবহার এবং গুরুত্বপূর্ণ সুবিধাসমূহ
- কোড পুনঃব্যবহারযোগ্যতা: মডিফায়ারগুলি সাধারণত একাধিক ফাংশনে ব্যবহার করা যেতে পারে, ফলে কোড পুনঃব্যবহারযোগ্যতা বৃদ্ধি পায়।
- নিরাপত্তা: ফাংশনের এক্সিকিউশনের আগে কিছু শর্ত যাচাই করতে মডিফায়ার ব্যবহার করা হয়, যা ফাংশনের নিরাপত্তা নিশ্চিত করে।
- অ্যাক্সেস কন্ট্রোল: নির্দিষ্ট ফাংশন কেবল অনুমোদিত ব্যবহারকারী বা অ্যাডমিন দ্বারা এক্সিকিউট হতে পারে, এটি নিয়ন্ত্রণ করা যায়।
- ক্লিন কোড: মডিফায়ার ব্যবহার করলে কোডটি পরিষ্কার এবং রিডেবল হয়, কারণ শর্তগুলো আলাদা ফাংশনে রাখা যায়, এতে ফাংশনগুলোর ভিতরে শর্তাবলীর কোড কম হয়।
সারাংশ
Solidity তে Function Modifiers হল এমন একটি কাস্টম ফাংশন যা অন্য একটি ফাংশনের আচরণ বা কার্যক্রম নিয়ন্ত্রণ করতে ব্যবহৃত হয়। মডিফায়ারগুলি অ্যাক্সেস কন্ট্রোল, ইনপুট ভ্যালিডেশন, রিইন্টারেন্সি গার্ড এবং গ্যাস অপটিমাইজেশনের জন্য ব্যবহৃত হয়। এটি স্মার্ট কন্ট্রাক্টের নিরাপত্তা এবং কার্যকারিতা উন্নত করতে সহায়ক, এবং কোডের পুনঃব্যবহারযোগ্যতা এবং রিডেবিলিটি নিশ্চিত করে।
Solidity তে Access Control এবং Authorization হল দুটি গুরুত্বপূর্ণ ধারণা যা স্মার্ট কন্ট্রাক্টের সুরক্ষা নিশ্চিত করতে ব্যবহৃত হয়। এই ধারণাগুলি স্মার্ট কন্ট্রাক্টের ফাংশনগুলির অ্যাক্সেস নিয়ন্ত্রণ এবং কন্ট্রাক্টের মধ্যে নিরাপত্তা বজায় রাখতে সাহায্য করে। Access Control এর মাধ্যমে আমরা সিদ্ধান্ত নিতে পারি যে কন্ট্রাক্টের কোন ফাংশন বা ভেরিয়েবল কাদের জন্য উপলব্ধ থাকবে এবং Authorization নিশ্চিত করে যে শুধুমাত্র অনুমোদিত ব্যক্তিরাই ফাংশনগুলো এক্সিকিউট করতে পারবে।
1. Access Control (অ্যাক্সেস কন্ট্রোল)
Access Control হল একটি নিরাপত্তা প্রক্রিয়া যার মাধ্যমে কন্ট্রাক্টের ভেরিয়েবল এবং ফাংশনগুলোর উপর নিয়ন্ত্রণ রাখা হয়। Solidity তে access modifiers (অ্যাক্সেস মডিফায়ার) ব্যবহৃত হয়, যা নির্ধারণ করে কোন ফাংশন বা ভেরিয়েবল কাদের জন্য অ্যাক্সেসযোগ্য। Solidity তে কয়েকটি অ্যাক্সেস কন্ট্রোল মডিফায়ার রয়েছে, যেমন public, private, internal, এবং external।
Access Modifiers:
- public: এই ফাংশন বা ভেরিয়েবল বাইরের সিস্টেম বা অন্য কন্ট্রাক্ট থেকে অ্যাক্সেস করা যেতে পারে।
- private: এই ফাংশন বা ভেরিয়েবল কেবল কন্ট্রাক্টের ভিতরে অ্যাক্সেসযোগ্য।
- internal: এই ফাংশন বা ভেরিয়েবল কেবল কন্ট্রাক্ট এবং তার সাব-কন্ট্রাক্ট (inherited contracts) থেকে অ্যাক্সেস করা যেতে পারে।
- external: এই ফাংশন বা ভেরিয়েবল কেবল বাইরের কন্ট্রাক্ট বা ব্যবহারকারীদের দ্বারা অ্যাক্সেসযোগ্য।
উদাহরণ:
pragma solidity ^0.8.0;
contract MyContract {
uint256 public balance; // public variable
address private owner; // private variable
constructor() {
owner = msg.sender; // কনস্ট্রাক্টরের মাধ্যমে owner সেট করা
}
// public function
function setBalance(uint256 _balance) public {
balance = _balance;
}
// private function
function getOwner() private view returns (address) {
return owner;
}
}এখানে, balance একটি public ভেরিয়েবল যা বাইরের সিস্টেম বা ব্যবহারকারীরা অ্যাক্সেস করতে পারে, এবং owner একটি private ভেরিয়েবল যা কেবল কন্ট্রাক্টের ভিতরে অ্যাক্সেসযোগ্য।
2. Authorization (অথরাইজেশন)
Authorization হল একটি প্রক্রিয়া যা নিশ্চিত করে যে শুধুমাত্র অনুমোদিত ব্যক্তি বা অ্যাকাউন্টই কিছু নির্দিষ্ট কার্যক্রম সম্পাদন করতে পারে। Solidity তে authorization বাস্তবায়নের জন্য সাধারণত modifier ব্যবহার করা হয়, যা ফাংশনগুলি চালানোর আগে শর্ত যাচাই করে। এটি প্রমাণ করে যে একটি নির্দিষ্ট ফাংশন কেবলমাত্র নির্দিষ্ট ব্যবহারকারী বা অ্যাড্রেস দ্বারা এক্সিকিউট করা যাবে।
Authorization Modifier:
একটি সাধারণ authorization modifier হল একটি onlyOwner মডিফায়ার, যা শুধুমাত্র কন্ট্রাক্টের মালিককে নির্দিষ্ট ফাংশনগুলি এক্সিকিউট করার অনুমতি দেয়।
উদাহরণ:
pragma solidity ^0.8.0;
contract MyContract {
address public owner;
constructor() {
owner = msg.sender; // কনস্ট্রাক্টরের মাধ্যমে মালিক নির্ধারণ
}
// onlyOwner modifier
modifier onlyOwner() {
require(msg.sender == owner, "You are not the owner!");
_;
}
// onlyOwner modifier ব্যবহার করা ফাংশন
function changeOwner(address newOwner) public onlyOwner {
owner = newOwner;
}
}এখানে, onlyOwner মডিফায়ার ব্যবহার করা হয়েছে যাতে changeOwner ফাংশনটি কেবলমাত্র কন্ট্রাক্টের মালিকই এক্সিকিউট করতে পারে। যদি অন্য কেউ এই ফাংশনটি কল করার চেষ্টা করে, তবে require শর্তটি মিথ্যা হবে এবং এক্সিকিউশন থেমে যাবে।
3. Role-based Access Control (RBAC)
Solidity তে Role-based Access Control (RBAC) ব্যবহৃত হয় যেখানে বিভিন্ন ব্যবহারকারী বা অ্যাড্রেসকে বিভিন্ন ভূমিকা (roles) প্রদান করা হয় এবং তার ভিত্তিতে তাদের অ্যাক্সেস নিয়ন্ত্রণ করা হয়। এটি সাধারণত mapping এবং modifier এর মাধ্যমে বাস্তবায়িত হয়।
উদাহরণ:
pragma solidity ^0.8.0;
contract MyContract {
address public admin;
mapping(address => bool) public managers;
constructor() {
admin = msg.sender; // কনস্ট্রাক্টরের মাধ্যমে অ্যাডমিন নির্ধারণ
}
modifier onlyAdmin() {
require(msg.sender == admin, "You are not the admin!");
_;
}
modifier onlyManager() {
require(managers[msg.sender], "You are not a manager!");
_;
}
function addManager(address _manager) public onlyAdmin {
managers[_manager] = true;
}
function removeManager(address _manager) public onlyAdmin {
managers[_manager] = false;
}
function performAction() public onlyManager {
// managers এর জন্য নির্ধারিত অ্যাকশন
}
}এখানে, কন্ট্রাক্টের admin একটি নির্দিষ্ট অ্যাড্রেস (যেমন, কন্ট্রাক্টের মালিক) হিসাবে নির্ধারণ করা হয়েছে, এবং managers একটি মাপিং (mapping) যা বিভিন্ন ব্যবহারকারীকে ম্যানেজার হিসেবে নির্ধারণ করে। onlyAdmin মডিফায়ার নিশ্চিত করে যে শুধুমাত্র অ্যাডমিনই ম্যানেজার অ্যাড বা রিমুভ করতে পারে, এবং onlyManager মডিফায়ার নিশ্চিত করে যে শুধুমাত্র ম্যানেজাররা performAction ফাংশনটি এক্সিকিউট করতে পারে।
4. Multi-sig (Multiple Signatures) Authorization
কিছু ক্ষেত্রে, একাধিক অনুমোদন (multi-signatures) প্রয়োজন হতে পারে, যেখানে একটি নির্দিষ্ট ফাংশন কার্যকর করার জন্য একাধিক ব্যক্তির অনুমোদন নেওয়া হয়। এটি সাধারণত নিরাপত্তার জন্য ব্যবহৃত হয় এবং multi-sig কন্ট্রাক্টে দেখা যায়।
উদাহরণ:
pragma solidity ^0.8.0;
contract MultiSig {
address[] public signers;
mapping(address => bool) public isSigner;
uint256 public requiredSignatures;
constructor(address[] memory _signers, uint256 _requiredSignatures) {
signers = _signers;
requiredSignatures = _requiredSignatures;
for (uint256 i = 0; i < signers.length; i++) {
isSigner[signers[i]] = true;
}
}
modifier onlySigner() {
require(isSigner[msg.sender], "You are not a signer");
_;
}
function executeAction() public onlySigner {
uint256 signatures = 0;
for (uint256 i = 0; i < signers.length; i++) {
if (isSigner[signers[i]]) {
signatures++;
}
}
require(signatures >= requiredSignatures, "Not enough signatures");
// কিছু কার্যক্রম সম্পাদন
}
}এখানে, executeAction ফাংশনটি একাধিক স্বাক্ষরের (signatures) প্রয়োজন, যাতে কয়েকজন স্বাক্ষরকারী অনুমোদন দিলে এটি কার্যকর হবে।
সারাংশ
Solidity তে Access Control এবং Authorization স্মার্ট কন্ট্রাক্টের নিরাপত্তা নিশ্চিত করার জন্য গুরুত্বপূর্ণ ধারণা। Access Control ফাংশন এবং ভেরিয়েবলের অ্যাক্সেস নিয়ন্ত্রণ করতে ব্যবহৃত হয়, যেখানে Authorization নিশ্চিত করে যে শুধু অনুমোদিত ব্যক্তিরাই ফাংশনগুলো এক্সিকিউট করতে পারে। modifier এবং require কিওয়ার্ড ব্যবহার করে বিভিন্ন ধরনের অ্যাক্সেস কন্ট্রোল এবং অথরাইজেশন বাস্তবায়ন করা হয়।
Solidity তে onlyOwner modifier, require, এবং assert দুটি গুরুত্বপূর্ণ ফাংশন এবং কৌশল যা স্মার্ট কন্ট্রাক্টের কার্যক্রম নিরাপদ এবং কার্যকরী করতে ব্যবহৃত হয়। এগুলি নিরাপত্তা যাচাই, শর্ত পূর্ণ হলে কার্যক্রম সম্পাদন, এবং ভুল সনাক্তকরণে সহায়ক হয়। নিচে আমরা প্রতিটি কৌশলটি এবং তার ব্যবহার দেখবো।
১. onlyOwner Modifier
onlyOwner হল একটি কাস্টম modifier যা কেবলমাত্র মালিক (owner) কে ফাংশন এক্সিকিউট করার অনুমতি দেয়। এটি সাধারণত ব্লকচেইনে মালিকানা চেক করার জন্য ব্যবহৃত হয়, যাতে কেবলমাত্র মালিক কিছু নির্দিষ্ট ফাংশন চালাতে পারে। এর মাধ্যমে কন্ট্রাক্টে অ্যাক্সেস কন্ট্রোল স্থাপন করা হয়।
উদাহরণ:
pragma solidity ^0.8.0;
contract OwnerControl {
address public owner;
constructor() {
owner = msg.sender; // কন্ট্রাক্ট ডিপ্লয় করার সময় মালিক হিসেবে কলকারী ঠিকানা অ্যাসাইন করা হয়
}
// Modifier যা শুধু মালিকের জন্য ফাংশন এক্সিকিউট করার অনুমতি দেয়
modifier onlyOwner() {
require(msg.sender == owner, "You are not the owner");
_;
}
// মালিকের জন্য নির্দিষ্ট ফাংশন
function restrictedAction() public onlyOwner {
// শুধুমাত্র মালিক এই ফাংশনটি এক্সিকিউট করতে পারবেন
}
}এখানে:
onlyOwnermodifier চেক করে যে,msg.sender(যিনি ফাংশনটি কল করছেন)ownerএর সমান কিনা।restrictedActionফাংশনটি কেবলমাত্র মালিক (যিনি কন্ট্রাক্ট ডিপ্লয় করেছেন) এক্সিকিউট করতে পারবেন।
২. require এর প্রয়োগ
require হল একটি শর্ত যাচাই করার জন্য ব্যবহৃত ফাংশন। যখন কোনো শর্ত পূর্ণ না হয়, তখন এটি একটি ত্রুটি উৎপন্ন করে এবং ট্রানজেকশন বাতিল করে দেয়। require সাধারণত পেমেন্ট বা অন্য শর্ত যাচাই করতে ব্যবহৃত হয়।
উদাহরণ:
pragma solidity ^0.8.0;
contract Payment {
uint public balance;
// Deposit ফাংশন যা শর্ত চেক করবে
function deposit(uint _amount) public {
require(_amount > 0, "Amount must be greater than 0"); // Amount 0 এর চেয়ে বেশি হতে হবে
balance += _amount;
}
// Withdrawal ফাংশন যা শর্ত চেক করবে
function withdraw(uint _amount) public {
require(balance >= _amount, "Insufficient balance"); // পর্যাপ্ত ব্যালেন্স থাকতে হবে
balance -= _amount;
}
}এখানে:
require(_amount > 0, "Amount must be greater than 0");এই শর্তটি নিশ্চিত করে যে পেমেন্টের পরিমাণ ০ এর বেশি।require(balance >= _amount, "Insufficient balance");এটি নিশ্চিত করে যে, ব্যবহৃত পরিমাণের জন্য পর্যাপ্ত ব্যালেন্স আছে কিনা।
যদি কোনো শর্ত পূর্ণ না হয়, তাহলে ট্রানজেকশন রিভার্স হয়ে যাবে এবং সংশ্লিষ্ট ত্রুটির বার্তা দেখানো হবে।
৩. assert এর প্রয়োগ
assert ব্যবহার করা হয় স্মার্ট কন্ট্রাক্টের অবস্থা যাচাই করার জন্য। এটি সাধারণত কন্ট্রাক্টের অভ্যন্তরীণ ভুল শনাক্ত করতে ব্যবহৃত হয়, যেমন অপ্রত্যাশিত অবস্থায় ডেটা পরিবর্তন। assert ভুল হলে, এটি ট্রানজেকশন বাতিল করে এবং কোনো ত্রুটি বার্তা দেখায় না।
উদাহরণ:
pragma solidity ^0.8.0;
contract Example {
uint public balance;
// Withdraw ফাংশন যা ব্যালেন্স যাচাই করবে
function withdraw(uint _amount) public {
assert(balance >= _amount); // চেক করবে যে ব্যালেন্স পর্যাপ্ত আছে কিনা
balance -= _amount;
}
}এখানে:
assert(balance >= _amount);এটি নিশ্চিত করে যেbalanceপর্যাপ্ত আছে এবং এটি একটি অবস্থা যাচাই হিসেবে কাজ করে।- যদি
balanceযথেষ্ট না থাকে, তবেassertএকটি ত্রুটি সৃষ্টি করবে এবং ট্রানজেকশন বাতিল হয়ে যাবে।
assert সাধারণত তখন ব্যবহার করা হয় যখন আপনি নিশ্চিত হন যে শর্তটি কখনই ভুল হওয়ার কথা নয়, এবং এটি বিশেষভাবে কোডের কোনো ধরনের ভুল (যেমন, অযাচিত ভ্যালু) সনাক্ত করতে ব্যবহৃত হয়।
onlyOwner, require, এবং assert এর মধ্যে পার্থক্য
| ফাংশন | ব্যবহার | উদ্দেশ্য |
|---|---|---|
onlyOwner | কাস্টম modifier হিসেবে মালিকানা যাচাই করা | শুধুমাত্র মালিককেই কিছু ফাংশন এক্সিকিউট করতে দেয়া |
require | শর্ত পূর্ণ হলে ফাংশন চালানোর জন্য | ফাংশন বা শর্ত যাচাই, যদি শর্ত পূর্ণ না হয়, ট্রানজেকশন বাতিল করা |
assert | অবস্থার সঠিকতা যাচাই করা | ভুল সনাক্তকরণ, বিশেষত অবস্থা যাচাই করা, অপ্রত্যাশিত ফলাফল প্রতিরোধ করা |
সারাংশ
onlyOwner, require, এবং assert Solidity তে স্মার্ট কন্ট্রাক্টের নিরাপত্তা এবং কার্যকারিতা নিশ্চিত করতে ব্যবহৃত হয়। onlyOwner modifier মালিকের অনুমতি যাচাই করতে ব্যবহৃত হয়, require শর্ত যাচাই করার জন্য ব্যবহার করা হয় যাতে ফাংশন এক্সিকিউট হওয়া আগে শর্ত নিশ্চিত করা যায়, এবং assert ব্যবহৃত হয় কোনো অভ্যন্তরীণ ভুল বা অবস্থা যাচাই করার জন্য, যেটি শুধুমাত্র কোডের ভুল চিহ্নিত করতে ব্যবহার করা উচিত। এগুলোর সঠিক ব্যবহার স্মার্ট কন্ট্রাক্টের নিরাপত্তা এবং কার্যকারিতা বাড়ায়।
Role-Based Access Control (RBAC) একটি নিরাপত্তা কৌশল যেখানে ব্যবহারকারীদের নির্দিষ্ট রোলের ভিত্তিতে কন্ট্রাক্টের বিভিন্ন ফাংশনে অ্যাক্সেস প্রদান করা হয়। এই কৌশলের মাধ্যমে, আপনি স্মার্ট কন্ট্রাক্টে বিভিন্ন রোলের জন্য অনুমতিগুলি নির্ধারণ করতে পারেন, যেমন অ্যাডমিন, ম্যানেজার, ইউজার ইত্যাদি।
Solidity তে RBAC ব্যবহার করে আপনি কন্ট্রাক্টের ভিতরে বিভিন্ন রোল নির্ধারণ করতে পারেন এবং কেবলমাত্র নির্দিষ্ট রোলধারী ব্যবহারকারীরা কিছু ফাংশন এক্সিকিউট করতে পারবেন।
উদাহরণ:
ধরা যাক, একটি কন্ট্রাক্টে তিনটি ভিন্ন রোল রয়েছে:
- Admin: যাদের কন্ট্রাক্টে সম্পূর্ণ নিয়ন্ত্রণ রয়েছে, তারা সমস্ত ফাংশন এক্সিকিউট করতে পারবে।
- Manager: যারা কিছু নির্দিষ্ট ফাংশন এক্সিকিউট করতে পারবে, তবে অ্যাডমিন কন্ট্রাক্টের কিছু কার্যক্রমের উপর পূর্ণ নিয়ন্ত্রণ রাখবে।
- User: সাধারণ ব্যবহারকারী যারা কেবল নির্দিষ্ট কার্যক্রম করতে পারবে।
এটি কিভাবে করা যেতে পারে তা নিচে দেখানো হলো:
pragma solidity ^0.8.0;
contract RBAC {
// রোলসমূহ
enum Role { Admin, Manager, User }
// ব্যবহারকারীদের রোল সংরক্ষণ
mapping(address => Role) public roles;
// কন্ট্রাক্টের মালিক (Admin)
address public owner;
// কন্ট্রাক্ট ডিপ্লয় করার সময় মালিককে অ্যাডমিন রোল দেওয়া হবে
constructor() {
owner = msg.sender;
roles[owner] = Role.Admin; // ডিপ্লয়মেন্টের সময় অ্যাডমিন রোল দেওয়া হয়েছে
}
// Modifier যেটি কেবল অ্যাডমিনদের জন্য
modifier onlyAdmin() {
require(roles[msg.sender] == Role.Admin, "You are not an Admin!");
_;
}
// Modifier যেটি কেবল ম্যানেজারদের জন্য
modifier onlyManager() {
require(roles[msg.sender] == Role.Manager, "You are not a Manager!");
_;
}
// Modifier যেটি কেবল ইউজারদের জন্য
modifier onlyUser() {
require(roles[msg.sender] == Role.User, "You are not a User!");
_;
}
// অ্যাডমিন রোল সেট করা
function setAdmin(address _account) public onlyAdmin {
roles[_account] = Role.Admin;
}
// ম্যানেজার রোল সেট করা
function setManager(address _account) public onlyAdmin {
roles[_account] = Role.Manager;
}
// ইউজার রোল সেট করা
function setUser(address _account) public onlyAdmin {
roles[_account] = Role.User;
}
// শুধুমাত্র অ্যাডমিনদের জন্য কিছু ফাংশন
function adminFunction() public onlyAdmin {
// অ্যাডমিনের জন্য এক্সিকিউটেবল ফাংশন
}
// শুধুমাত্র ম্যানেজারদের জন্য কিছু ফাংশন
function managerFunction() public onlyManager {
// ম্যানেজারের জন্য এক্সিকিউটেবল ফাংশন
}
// ইউজারের জন্য কিছু ফাংশন
function userFunction() public onlyUser {
// ইউজারের জন্য এক্সিকিউটেবল ফাংশন
}
}ব্যাখ্যা:
- Role Enum:
Roleনামক একটি enum ডিফাইন করা হয়েছে, যা Admin, Manager, এবং User রোলগুলোকে প্রতিনিধিত্ব করে।
- Mapping:
rolesনামক একটি mapping ব্যবহার করা হয়েছে, যা ব্যবহারকারীর ঠিকানা অনুযায়ী তাদের রোল সংরক্ষণ করে।
- Modifiers:
onlyAdmin: এই modifier নিশ্চিত করে যে শুধুমাত্র Admin রোলধারী ব্যবহারকারীরা নির্দিষ্ট ফাংশনগুলি কল করতে পারবেন।onlyManager: এই modifier নিশ্চিত করে যে শুধুমাত্র Manager রোলধারী ব্যবহারকারীরা নির্দিষ্ট ফাংশনগুলি কল করতে পারবেন।onlyUser: এই modifier নিশ্চিত করে যে শুধুমাত্র User রোলধারী ব্যবহারকারীরা নির্দিষ্ট ফাংশনগুলি কল করতে পারবেন।
- Access Control:
- কন্ট্রাক্টে
setAdmin,setManager,setUserফাংশন ব্যবহার করে বিভিন্ন ঠিকানাকে নির্দিষ্ট রোল প্রদান করা হয়। এই ফাংশনগুলো কেবলমাত্র Admin রোলধারী ব্যবহারকারী দ্বারা এক্সিকিউট করা যাবে। adminFunction,managerFunction, এবংuserFunctionযথাক্রমে Admin, Manager, এবং User রোলধারী ব্যবহারকারীদের জন্য এক্সিকিউটেবল ফাংশন।
- কন্ট্রাক্টে
RBAC এর সুবিধা:
- নিরাপত্তা: শুধুমাত্র নির্দিষ্ট রোলধারী ব্যবহারকারীরা নির্দিষ্ট ফাংশন এক্সিকিউট করতে সক্ষম হয়, যা নিরাপত্তা বৃদ্ধি করে।
- কন্ট্রোল: কন্ট্রাক্টে কে কী কাজ করতে পারবে, তা কন্ট্রোল করা সহজ হয়।
- এনফোর্সমেন্ট: কন্ট্রাক্টের মাধ্যমে রোলসমূহ এবং অ্যাক্সেস কন্ট্রোল এক্সিকিউট করার ফলে এটি একটি স্বয়ংক্রিয় নিরাপত্তা ব্যবস্থা তৈরি করে।
সারাংশ
Role-Based Access Control (RBAC) এর মাধ্যমে Solidity তে ব্যবহারকারীদের বিভিন্ন রোল ভিত্তিক এক্সেস প্রদান করা সম্ভব হয়। এই কৌশলটির মাধ্যমে কন্ট্রাক্টের কার্যক্রম এবং ফাংশনগুলোর নিরাপত্তা এবং নিয়ন্ত্রণ বৃদ্ধি করা যায়। ব্যবহারকারীদের নির্দিষ্ট রোল অনুযায়ী ফাংশন এক্সিকিউট করার অনুমতি প্রদান করা হয়, যা কন্ট্রাক্টের সুরক্ষা এবং কার্যকারিতা নিশ্চিত করে।
Read more