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 কিওয়ার্ড ব্যবহার করে বিভিন্ন ধরনের অ্যাক্সেস কন্ট্রোল এবং অথরাইজেশন বাস্তবায়ন করা হয়।
Read more