Solidity একটি স্ট্যাটিক টাইপ প্রোগ্রামিং ভাষা, যা ব্লকচেইন ভিত্তিক স্মার্ট কন্ট্রাক্ট তৈরি করতে ব্যবহৃত হয়। Solidity এর সঠিক ব্যবহার এবং কোড লেখার জন্য কিছু মৌলিক ধারণা এবং সিনট্যাক্সের প্রতি সচেতন হওয়া জরুরি। এই টিউটোরিয়ালে আমরা Solidity এর কিছু গুরুত্বপূর্ণ সিনট্যাক্স এবং ধারণা সম্পর্কে জানব।
Solidity এর মৌলিক সিনট্যাক্স
Solidity এর সিনট্যাক্স অন্যান্য সাধারণ প্রোগ্রামিং ভাষার সাথে অনেকটা মিল আছে (যেমন: JavaScript, C++, Python)। তবে, কিছু বিশেষ বৈশিষ্ট্যও রয়েছে যেগুলি ব্লকচেইন এবং স্মার্ট কন্ট্রাক্টের জন্য উপযোগী।
১. প্রোগ্রামিং কাঠামো (Program Structure)
Solidity প্রোগ্রামের মৌলিক কাঠামো হয় একটি contract। একটি contract হল স্মার্ট কন্ট্রাক্টের অন্তর্গত কোড এবং ডেটার একটি ব্লক। contract সারা পৃথিবীজুড়ে Ethereum ব্লকচেইনে ডিপ্লয় করা হয়। এখানে একটি সহজ contract এর উদাহরণ দেওয়া হলো:
pragma solidity ^0.8.0;
contract SimpleContract {
uint256 public number;
// Set the number
function setNumber(uint256 _number) public {
number = _number;
}
// Get the number
function getNumber() public view returns (uint256) {
return number;
}
}- pragma solidity: এই লাইনটি Solidity কম্পাইলারকে জানায় যে কোডটি কোন ভার্সনের সাথে সামঞ্জস্যপূর্ণ।
- contract: Solidity এ স্মার্ট কন্ট্রাক্ট শুরু করার জন্য
contractকীওয়ার্ড ব্যবহার করা হয়। - function: এটি স্মার্ট কন্ট্রাক্টে কোন ফাংশন বা কার্যাবলী সংজ্ঞায়িত করার জন্য ব্যবহৃত হয়।
২. ভেরিয়েবল এবং ডেটা টাইপ (Variables and Data Types)
Solidity বিভিন্ন ধরনের ডেটা টাইপ সাপোর্ট করে, যা পরিবর্তনশীল (variables) হিসেবে ব্যবহার করা হয়। এখানে কিছু সাধারণ ডেটা টাইপের উদাহরণ দেওয়া হলো:
- uint256: এক ধরনের পূর্ণসংখ্যা (unsigned integer) যা ২৫৬-বিটের।
- int256: সাইনযুক্ত পূর্ণসংখ্যা।
- address: Ethereum অ্যাকাউন্টের ঠিকানা সংরক্ষণ করার জন্য ব্যবহৃত হয়।
- bool: সত্য বা মিথ্যা (true/false) মানের জন্য ব্যবহৃত হয়।
- string: টেক্সট বা স্ট্রিং ডেটার জন্য ব্যবহৃত হয়।
- bytes: ফিক্সড-সাইজ বাইনারি ডেটা।
uint256 public age;
address public owner;
string public name;
bool public isActive;৩. ফাংশন (Functions)
Solidity তে ফাংশন হল ব্লকচেইনে লেনদেন বা কার্যক্রম সম্পাদন করার জন্য ব্যবহৃত কোডের ব্লক। একটি ফাংশন সাধারণত কিছু ইনপুট গ্রহণ করে এবং একটি আউটপুট প্রদান করে। Solidity তে কিছু গুরুত্বপূর্ণ ফাংশন হিসেবে দেখা যায়:
- public: এটি এমন একটি ফাংশন যা অন্য কন্ট্রাক্ট এবং বাইরের ব্যবহারকারীর কাছে অ্যাক্সেসযোগ্য।
- view: এটি একটি ফাংশন যা ব্লকচেইন ডেটা পড়ে কিন্তু কোনো পরিবর্তন করে না।
- pure: এটি এমন একটি ফাংশন যা ব্লকচেইনের ডেটার সাথে কোনো ইন্টারঅ্যাকশন করে না, শুধু ইনপুট ডেটা থেকে আউটপুট প্রদান করে।
- payable: এটি একটি ফাংশন যা Ethereum নেটওয়ার্কে Ether (ETH) গ্রহণ করতে পারে।
// Example of a public function
function setNumber(uint256 _number) public {
number = _number;
}
// Example of a pure function
function add(uint256 a, uint256 b) public pure returns (uint256) {
return a + b;
}৪. মডিফায়ার (Modifiers)
Solidity তে মডিফায়ার একটি ফাংশনের আচরণ পরিবর্তন করতে ব্যবহৃত হয়। এটি প্রোগ্রামে শর্ত বা অনুমতি সংক্রান্ত নিয়ম সেট করার জন্য সহায়ক। উদাহরণস্বরূপ, একটি মডিফায়ার ব্যবহার করা যেতে পারে, যা শুধুমাত্র কন্ট্রাক্টের মালিককে কিছু ফাংশন এক্সিকিউট করার অনুমতি দেয়।
address public owner;
modifier onlyOwner() {
require(msg.sender == owner, "You are not the owner!");
_;
}
function setNumber(uint256 _number) public onlyOwner {
number = _number;
}এই উদাহরণে, onlyOwner মডিফায়ার শুধুমাত্র কন্ট্রাক্টের মালিককেই ফাংশনটি চালানোর অনুমতি দেয়।
৫. Events
Solidity তে Events ব্যবহার করে আপনি ব্লকচেইন নেটওয়ার্কে কার্যক্রমের লগ রাখতে পারেন। এটি বিশেষভাবে ব্লকচেইনে ট্রানজেকশনের অডিটিং এবং ডেটা পর্যবেক্ষণের জন্য ব্যবহৃত হয়।
event NumberSet(uint256 indexed number);
function setNumber(uint256 _number) public {
number = _number;
emit NumberSet(_number); // Emit event
}এখানে, NumberSet ইভেন্টটি তখন ট্রিগার হবে যখন setNumber ফাংশনটি কল করা হবে এবং এটি ব্লকচেইনে number মানের পরিবর্তন লগ করবে।
৬. স্টোরেজ এবং মেমরি (Storage and Memory)
Solidity তে দুটি ধরনের ডেটা সংরক্ষণ করার জায়গা রয়েছে: storage এবং memory।
- Storage: এটি ব্লকচেইনে ডেটা সংরক্ষণ করে, যার মানে হল যে ডেটা স্থায়ী এবং ট্রানজেকশন পরেও উপলব্ধ থাকবে।
- Memory: এটি সাময়িক ডেটা সংরক্ষণ করে যা শুধুমাত্র ফাংশন এক্সিকিউশনের সময় ব্যবহৃত হয় এবং এক্সিকিউশন শেষ হলে তা মুছে যায়।
uint256[] public numbers; // Storage
function addToMemory(uint256[] memory _numbers) public pure returns (uint256) {
return _numbers[0] + _numbers[1]; // Memory
}সারাংশ
Solidity একটি স্ট্যাটিক টাইপ প্রোগ্রামিং ভাষা যা ব্লকচেইনে স্মার্ট কন্ট্রাক্ট তৈরি করতে ব্যবহৃত হয়। এর মৌলিক সিনট্যাক্স, যেমন ডেটা টাইপ, ফাংশন, মডিফায়ার, ইভেন্ট এবং স্টোরেজ/মেমরি ব্যবহার করে Solidity স্মার্ট কন্ট্রাক্ট লেখার জন্য উপযোগী একটি শক্তিশালী টুল। Solidity ব্যবহার করে ডিস্ট্রিবিউটেড অ্যাপ্লিকেশন (dApp), স্মার্ট কন্ট্রাক্ট এবং ক্রিপ্টোকারেন্সি সম্পর্কিত অন্যান্য ফাংশনালিটি নির্মাণ করা সম্ভব।
Solidity তে ভেরিয়েবল ডিক্লারেশন এবং ডেটা টাইপ ব্যবহারের মাধ্যমে বিভিন্ন ধরনের ডেটা সংরক্ষণ এবং প্রক্রিয়া করা হয়। Solidity, ব্লকচেইন প্ল্যাটফর্মে স্মার্ট কন্ট্রাক্টের জন্য একটি শক্তিশালী ভাষা হওয়ায়, এর ডেটা টাইপ এবং ভেরিয়েবল ব্যবস্থাপনা খুবই গুরুত্বপূর্ণ।
ভেরিয়েবল ডিক্লারেশন
Solidity তে ভেরিয়েবল ডিক্লারেশন মানে হচ্ছে ভেরিয়েবলের নাম এবং তার ডেটা টাইপ নির্ধারণ করা। Solidity তে সাধারণত স্ট্যাটিক টাইপিং ব্যবহৃত হয়, অর্থাৎ প্রতিটি ভেরিয়েবলের ডেটা টাইপ অবশ্যই নির্দিষ্ট করতে হয়।
ভেরিয়েবল ডিক্লারেশন সিনট্যাক্স:
<data_type> <variable_name>;এখানে:
<data_type>হচ্ছে ভেরিয়েবলের টাইপ।<variable_name>হচ্ছে ভেরিয়েবলের নাম।
উদাহরণ:
uint256 public balance;
address public owner;
string public name;এখানে:
uint256হলো অখণ্ড ধন (unsigned integer) যা 256-বিটে থাকে।addressএকটি বিশেষ ডেটা টাইপ যা Ethereum ঠিকানাকে প্রতিনিধিত্ব করে।stringহলো একটি টেক্সট স্ট্রিং।
Solidity ডেটা টাইপ
Solidity তে বেশ কয়েক ধরনের ডেটা টাইপ ব্যবহৃত হয়, যেগুলি মূলত ভেরিয়েবল সংরক্ষণের জন্য ব্যবহৃত হয়। এগুলি দুই ধরনের — মূল ডেটা টাইপ (Value Types) এবং **রেফারেন্স টাইপ (Reference Types)**।
1. মূল ডেটা টাইপ (Value Types)
এটি এমন ডেটা টাইপ যা সরাসরি ভেরিয়েবলের মধ্যে মান সংরক্ষণ করে।
- Integer (ইন্টিজার):
uint(unsigned integer) — ধনাত্মক পূর্ণসংখ্যাint(signed integer) — ধনাত্মক বা ঋণাত্মক পূর্ণসংখ্যাuint8,uint16,uint256ইত্যাদি — নির্দিষ্ট আকারের অখণ্ড ধনint8,int16,int256ইত্যাদি — নির্দিষ্ট আকারের পূর্ণসংখ্যা
উদাহরণ:
uint256 public amount;
int8 public balance;- Boolean (বুলিয়ান):
- এটি দুটি মান গ্রহণ করতে পারে:
trueবাfalse।
- এটি দুটি মান গ্রহণ করতে পারে:
উদাহরণ:
bool public isActive;- Address (এড্রেস):
- এটি Ethereum ঠিকানা সংরক্ষণ করতে ব্যবহৃত হয়, যেমন একজন ব্যবহারকারীর ঠিকানা বা কন্ট্রাক্টের ঠিকানা।
উদাহরণ:
address public recipient;- Fixed Size Bytes (ফিক্সড সাইজ বাইট):
bytes1,bytes2, ...,bytes32— নির্দিষ্ট সাইজের বাইট।
উদাহরণ:
bytes32 public data;2. রেফারেন্স টাইপ (Reference Types)
এগুলি এমন ডেটা টাইপ যা ভেরিয়েবলের মধ্যে সরাসরি মান সংরক্ষণ না করে, বরং তার জন্য একটি রেফারেন্স (অথবা পয়েন্টার) সংরক্ষণ করে।
- Array (অ্যারে):
- এটি এক বা একাধিক উপাদান সংরক্ষণ করতে ব্যবহৃত হয়। অ্যারে একক ডেটা টাইপের (যেমন
uint[]) হতে পারে এবং এর আকার স্থির বা পরিবর্তনশীল হতে পারে।
- এটি এক বা একাধিক উপাদান সংরক্ষণ করতে ব্যবহৃত হয়। অ্যারে একক ডেটা টাইপের (যেমন
উদাহরণ:
uint[] public balances; // Dynamic Array
uint[5] public fixedArray; // Fixed Size Array- Struct (স্ট্রাক্ট):
- স্ট্রাক্ট একটি ব্যবহারকারীর সংজ্ঞায়িত ডেটা টাইপ যা একাধিক ভিন্ন ধরনের ডেটা একত্রিত করতে পারে। এটি ব্যবহারকারীর প্রয়োজনীয় ডেটা গঠন করতে সাহায্য করে।
উদাহরণ:
struct Person {
string name;
uint256 age;
}
Person public person;- Mapping (ম্যাপিং):
- এটি একটি অ্যাসোসিয়েটিভ অ্যারে যা কী-ভ্যালু পেয়ার সংরক্ষণ করে। এই ডেটা টাইপের মাধ্যমে কোনও কী এর সাথে একটি মান সংরক্ষণ করা হয়।
উদাহরণ:
mapping(address => uint256) public balances;এখানে, balances হল একটি ম্যাপিং যা address কে একটি uint256 মানের সাথে সংযুক্ত করে।
Solidity তে ভেরিয়েবল শ্রেণী
Solidity তে ভেরিয়েবল দুটি শ্রেণীতে বিভক্ত করা হয়:
- State Variables (স্টেট ভেরিয়েবল):
- স্টেট ভেরিয়েবলগুলি চুক্তির স্টেটের অংশ হিসেবে ব্লকচেইনে সংরক্ষিত থাকে। এগুলি চুক্তির স্মৃতি এবং স্টোরেজে সঞ্চিত থাকে।
উদাহরণ:
uint256 public totalSupply;- Local Variables (লোকাল ভেরিয়েবল):
- লোকাল ভেরিয়েবলগুলি শুধুমাত্র ফাংশনের মধ্যে ব্যবহৃত হয় এবং ফাংশনের এক্সিকিউশন শেষে মুছে যায়। এগুলি স্টোরেজে সংরক্ষিত হয় না।
উদাহরণ:
function setAmount() public {
uint256 amount = 100; // Local Variable
}সারাংশ
Solidity তে ভেরিয়েবল ডিক্লারেশন এবং ডেটা টাইপ ব্যবহৃত হয় বিভিন্ন ধরনের ডেটা সংরক্ষণের জন্য। Solidity একটি স্ট্যাটিক টাইপ ভাষা, যেখানে প্রতিটি ভেরিয়েবলের ডেটা টাইপ নির্ধারণ করতে হয়। এটি বিভিন্ন ডেটা টাইপ ব্যবহার করে স্মার্ট কন্ট্রাক্টে মান সংরক্ষণ, প্রক্রিয়া এবং লেনদেন সম্পাদন করতে সহায়ক।
Solidity তে ফাংশন এবং ভিজিবিলিটি (visibility) হল গুরুত্বপূর্ণ ধারণা যা স্মার্ট কন্ট্রাক্টের আচরণ এবং সুরক্ষা নির্ধারণ করে। ফাংশন ব্যবহার করা হয় কন্ট্রাক্টের মধ্যে লজিক প্রয়োগ করার জন্য এবং ভিজিবিলিটি ব্যবহার করা হয় সেই ফাংশনের অ্যাক্সেস কিভাবে হবে তা নির্ধারণ করতে। এখানে ফাংশন এবং ভিজিবিলিটি নিয়ে বিস্তারিত আলোচনা করা হলো।
1. ফাংশন (Functions)
Solidity তে ফাংশন হল কোডের একক ব্লক যা কিছু নির্দিষ্ট কাজ সম্পাদন করে। ফাংশনগুলি সাধারণত একটি বা একাধিক ইনপুট নেয় এবং একটি আউটপুট প্রদান করে। ফাংশন ডিফাইন করা হয় নির্দিষ্ট টাইপের মাধ্যমে এবং বিভিন্ন কাজ সম্পাদন করতে পারে, যেমন স্টেট পরিবর্তন করা, চুক্তি থেকে ডেটা পড়া ইত্যাদি।
একটি সাধারণ ফাংশন কিভাবে ডিফাইন করা হয়:
pragma solidity ^0.8.0;
contract MyContract {
uint256 public balance;
function setBalance(uint256 _balance) public {
balance = _balance;
}
}এখানে, setBalance একটি পাবলিক ফাংশন যা _balance ইনপুট নেয় এবং balance ভেরিয়েবল সেট করে।
2. Visibility (ভিজিবিলিটি)
Solidity তে ফাংশনের ভিজিবিলিটি নির্ধারণ করা হয়, যাতে জানানো যায় ফাংশনটি কোথা থেকে অ্যাক্সেসযোগ্য হবে। ভিজিবিলিটি ফাংশন বা ভেরিয়েবল-এর অ্যাক্সেস কন্ট্রোল নির্ধারণ করতে ব্যবহৃত হয়। Solidity তে চারটি ভিজিবিলিটি রয়েছে:
- Public
- Private
- Internal
- External
এখানে, প্রতিটি ভিজিবিলিটি সম্পর্কে বিস্তারিত আলোচনা করা হলো।
3. Public Visibility
public ভিজিবিলিটি ব্যবহৃত হয় এমন ফাংশন বা ভেরিয়েবলগুলোর জন্য যা স্মার্ট কন্ট্রাক্টের বাইরের ব্যবহারকারীদের থেকেও অ্যাক্সেসযোগ্য। public ফাংশনকে স্মার্ট কন্ট্রাক্টের বাইরে থেকে এবং অন্যান্য কন্ট্রাক্ট থেকে কল করা যেতে পারে।
- Public ফাংশন: সাধারণত অন্যান্য কন্ট্রাক্ট বা অ্যাপ্লিকেশন থেকে এক্সেস করার জন্য ব্যবহৃত হয়।
- Public ভেরিয়েবল: এসব ভেরিয়েবল ব্লকচেইনের যে কেউ দেখতে এবং পড়তে পারে।
pragma solidity ^0.8.0;
contract MyContract {
uint256 public balance; // public variable
function setBalance(uint256 _balance) public { // public function
balance = _balance;
}
}এখানে, balance ভেরিয়েবল এবং setBalance ফাংশনটি পাবলিক, তাই অন্য কন্ট্রাক্ট বা ব্যবহারকারীও এগুলিকে এক্সেস করতে পারবে।
4. Private Visibility
private ভিজিবিলিটি ব্যবহার করা হয় এমন ফাংশন বা ভেরিয়েবলগুলোর জন্য যা কেবলমাত্র সেই কন্ট্রাক্টের ভিতরে অ্যাক্সেসযোগ্য। অন্য কন্ট্রাক্ট বা বাইরের ব্যবহারকারীরা private ফাংশন বা ভেরিয়েবল অ্যাক্সেস করতে পারে না।
- Private ফাংশন: কেবলমাত্র একই কন্ট্রাক্টের ভিতর থেকে কল করা যেতে পারে।
- Private ভেরিয়েবল: কেবলমাত্র ঐ কন্ট্রাক্টে ব্যবহার করা যেতে পারে এবং ব্লকচেইনে প্রকাশিত হয় না।
pragma solidity ^0.8.0;
contract MyContract {
uint256 private balance; // private variable
function setBalance(uint256 _balance) private { // private function
balance = _balance;
}
}এখানে, balance ভেরিয়েবল এবং setBalance ফাংশনটি প্রাইভেট, তাই বাইরের ব্যবহারকারী বা অন্য কন্ট্রাক্ট থেকে এগুলো অ্যাক্সেস করা যাবে না।
5. Internal Visibility
internal ভিজিবিলিটি ব্যবহৃত হয় এমন ফাংশন বা ভেরিয়েবলগুলোর জন্য যা সেই কন্ট্রাক্ট এবং তার বংশগত কন্ট্রাক্ট (inheritance) থেকে অ্যাক্সেসযোগ্য। অর্থাৎ, এই ফাংশনগুলি বা ভেরিয়েবলগুলি কেবলমাত্র কন্ট্রাক্টের ভিতরে এবং তার সাব-কন্ট্রাক্ট (derived contract) থেকে অ্যাক্সেস করা যেতে পারে।
- Internal ফাংশন: কন্ট্রাক্টের ভিতরে এবং সাব-কন্ট্রাক্ট থেকে এক্সেসযোগ্য।
- Internal ভেরিয়েবল: কন্ট্রাক্ট এবং তার সাব-কন্ট্রাক্ট থেকে অ্যাক্সেস করা যায়, কিন্তু বাইরের সিস্টেম থেকে নয়।
pragma solidity ^0.8.0;
contract MyContract {
uint256 internal balance; // internal variable
function setBalance(uint256 _balance) internal { // internal function
balance = _balance;
}
}
contract DerivedContract is MyContract {
function getBalance() public view returns (uint256) {
return balance; // Accessing internal variable
}
}এখানে, setBalance ফাংশন এবং balance ভেরিয়েবল internal ভিজিবিলিটির, যা মূল কন্ট্রাক্ট এবং তার সাব-কন্ট্রাক্ট থেকে অ্যাক্সেস করা যেতে পারে।
6. External Visibility
external ভিজিবিলিটি ব্যবহৃত হয় এমন ফাংশন বা ভেরিয়েবলগুলোর জন্য যা কেবলমাত্র বাইরের কন্ট্রাক্ট বা ব্যবহারকারীদের জন্য অ্যাক্সেসযোগ্য। external ফাংশনটি বাইরের কন্ট্রাক্ট থেকে কল করা যায়, কিন্তু কন্ট্রাক্টের ভিতরে থেকে এটি সরাসরি কল করা সম্ভব নয়।
- External ফাংশন: বাইরের কন্ট্রাক্ট বা ব্যবহারকারীদের দ্বারা এক্সেসযোগ্য।
- External ভেরিয়েবল: বাইরের কন্ট্রাক্ট বা ব্যবহারকারী থেকে এক্সেস করা যেতে পারে।
pragma solidity ^0.8.0;
contract MyContract {
uint256 public balance;
function setBalance(uint256 _balance) external { // external function
balance = _balance;
}
}এখানে, setBalance ফাংশনটি external, যা বাইরের কন্ট্রাক্ট বা ব্যবহারকারীদের জন্য এক্সেসযোগ্য।
সারাংশ
Solidity তে ফাংশনের ভিজিবিলিটি অত্যন্ত গুরুত্বপূর্ণ, কারণ এটি কন্ট্রাক্টের নিরাপত্তা এবং ফাংশনগুলোর অ্যাক্সেস নিয়ন্ত্রণ করে। Public, Private, Internal, এবং External এই চারটি ভিজিবিলিটি ব্যবহৃত হয় ফাংশন এবং ভেরিয়েবলগুলোর অ্যাক্সেস কন্ট্রোল করতে। এর মাধ্যমে স্মার্ট কন্ট্রাক্টের নিরাপত্তা ও কার্যকারিতা উন্নত হয়, এবং কন্ট্রাক্টের আচরণ সঠিকভাবে পরিচালিত হয়।
Solidity তে, state variables এবং local variables দুটি গুরুত্বপূর্ণ ধরনের ভেরিয়েবল ব্যবহৃত হয়, যা স্মার্ট কন্ট্রাক্টে ডেটা সংরক্ষণ এবং পরিচালনার জন্য বিভিন্নভাবে কাজ করে। এই দুটি ভেরিয়েবলের মধ্যে পার্থক্য বুঝতে হলে, প্রথমে তাদের গঠন এবং কার্যকারিতা সম্পর্কে জানাটা প্রয়োজন।
State Variables
State variables হল সেই ভেরিয়েবলগুলো যেগুলি ব্লকচেইনে স্থায়ীভাবে সংরক্ষিত থাকে। এগুলি স্মার্ট কন্ট্রাক্টের মূল স্টেট বা ডেটার অংশ হিসেবে কাজ করে। যখনই একটি ফাংশন state variable এর মান পরিবর্তন করে, তখন সেটি ব্লকচেইনে সংরক্ষিত হয় এবং চিরকালীন থাকে যতক্ষণ না স্মার্ট কন্ট্রাক্টটি ডিপ্লয় করা থাকে।
State variables এর কিছু বৈশিষ্ট্য:
- ব্লকচেইনে সংরক্ষিত: যখনই একটি state variable এর মান পরিবর্তন হয়, এটি ব্লকচেইনে স্থায়ীভাবে সংরক্ষিত হয়।
- স্টোরেজে রাখা হয়: এগুলি স্টোরেজে সংরক্ষিত থাকে, যা কিছুটা ব্যয়বহুল হতে পারে (গ্যাস খরচ বেশি হয়)।
- public: যখন একটি state variable
publicহিসেবে ডিফাইন করা হয়, তখন Solidity স্বয়ংক্রিয়ভাবে getter ফাংশন তৈরি করে, যা ব্যবহারকারীদের মাধ্যমে ভেরিয়েবলটির মান অ্যাক্সেস করা যায়।
উদাহরণ:
pragma solidity ^0.8.0;
contract Example {
uint public number; // state variable
function setNumber(uint _number) public {
number = _number; // state variable update
}
function getNumber() public view returns (uint) {
return number; // state variable access
}
}এখানে number একটি state variable, যা setNumber ফাংশন দিয়ে পরিবর্তন করা হয় এবং getNumber ফাংশন দিয়ে অ্যাক্সেস করা হয়।
Local Variables
Local variables হল সেই ভেরিয়েবলগুলো যেগুলি শুধুমাত্র ফাংশনের ভিতরে ব্যবহার করা হয় এবং ফাংশন শেষ হলে সেগুলি মুছে যায়। এগুলি কেবলমাত্র ফাংশনের execution context এ বিদ্যমান থাকে এবং স্মার্ট কন্ট্রাক্টের ব্লকচেইন স্টোরেজে সংরক্ষিত হয় না।
Local variables এর কিছু বৈশিষ্ট্য:
- ফাংশনের মধ্যে সংরক্ষিত: এগুলি শুধুমাত্র ফাংশনের execution সময়কালীন উপলব্ধ থাকে এবং ফাংশন শেষ হলে সেগুলি ডিলিট হয়ে যায়।
- স্টোরেজে রাখা হয় না: এগুলি স্টোরেজে সংরক্ষিত হয় না, ফলে গ্যাস খরচও কম হয়।
- আরেকটি ফাংশনে অ্যাক্সেস করা যায় না: একটি ফাংশনের local variable অন্য কোনো ফাংশন থেকে অ্যাক্সেস করা যায় না।
উদাহরণ:
pragma solidity ^0.8.0;
contract Example {
uint public number; // state variable
function setNumber(uint _number) public {
uint temp = _number; // local variable
number = temp; // state variable update
}
function getNumber() public view returns (uint) {
return number; // state variable access
}
}এখানে temp একটি local variable, যা setNumber ফাংশনের ভিতরে ব্যবহার করা হয় এবং number state variable এর মান পরিবর্তন করা হয়।
State Variables এবং Local Variables এর মধ্যে পার্থক্য
| পার্থক্য | State Variables | Local Variables |
|---|---|---|
| সংরক্ষণ | ব্লকচেইনে স্থায়ীভাবে সংরক্ষিত | শুধুমাত্র ফাংশনের execution সময়কালে থাকে |
| স্টোরেজ | স্টোরেজে রাখা হয় | স্ট্যাক (stack) এ রাখা হয় |
| গ্যাস খরচ | বেশি গ্যাস খরচ (ব্লকচেইনে সংরক্ষিত থাকে) | কম গ্যাস খরচ (স্টোরেজে সংরক্ষিত হয় না) |
| অ্যাক্সেস | ফাংশনের বাইরে থেকেও অ্যাক্সেস করা যায় | ফাংশনের বাইরে অ্যাক্সেস করা যায় না |
| পাবলিক | পাবলিক হলে স্বয়ংক্রিয়ভাবে getter ফাংশন তৈরি হয় | পাবলিক নয় |
সারাংশ
State variables হল স্মার্ট কন্ট্রাক্টের ব্লকচেইনে স্থায়ীভাবে সংরক্ষিত ভেরিয়েবল, যেগুলি স্টোরেজে রাখা হয় এবং ফাংশনগুলো এগুলির মান পরিবর্তন করতে পারে। অন্যদিকে, local variables হল শুধুমাত্র ফাংশনের ভিতরে ব্যবহার করা হয় এবং ফাংশন সম্পন্ন হওয়ার পর মুছে যায়। State variables এর গ্যাস খরচ বেশি হলেও এগুলি ব্লকচেইনে দীর্ঘ সময়ের জন্য সংরক্ষিত থাকে, তবে local variables দ্রুত এবং কম গ্যাস খরচে কাজ করে।
Solidity তে ইনহেরিটেন্স (inheritance) এবং প্রোপার্টিজ (properties) অতি গুরুত্বপূর্ণ কনসেপ্ট যা স্মার্ট কন্ট্রাক্টে কোড পুনঃব্যবহার এবং কার্যকারিতা বৃদ্ধি করতে সহায়ক। Solidity তে ইনহেরিটেন্স ব্যবহার করে একটি কন্ট্রাক্ট থেকে অন্য কন্ট্রাক্টে বৈশিষ্ট্য বা ফাংশন ধার করা যায়। এটি অ্যাবস্ট্রাক্ট কন্ট্রাক্ট তৈরি করতে, লজিক ভাগ করতে এবং কোড পুনঃব্যবহারযোগ্য করতে সাহায্য করে।
ইনহেরিটেন্স (Inheritance)
Solidity তে ইনহেরিটেন্স ব্যবহার করে আপনি একটি কন্ট্রাক্টের বৈশিষ্ট্য এবং ফাংশন অন্য কন্ট্রাক্টে উত্তরাধিকার সূত্রে গ্রহণ করতে পারেন। এটি আপনাকে একটি কন্ট্রাক্টের কোড পুনরায় না লিখে, পূর্বের কন্ট্রাক্টের ফাংশন এবং প্রোপার্টিজ ব্যবহার করতে সহায়তা করে।
Solidity তে ইনহেরিটেন্স ব্যবহার করার জন্য syntax:
// প্যারেন্ট কন্ট্রাক্ট
pragma solidity ^0.8.0;
contract Parent {
uint public value;
constructor(uint _value) {
value = _value;
}
function setValue(uint _value) public {
value = _value;
}
}
// চাইল্ড কন্ট্রাক্ট (Parent কন্ট্রাক্ট ইনহেরিট করে)
contract Child is Parent {
string public name;
constructor(uint _value, string memory _name) Parent(_value) {
name = _name;
}
function getName() public view returns (string memory) {
return name;
}
}ব্যাখ্যা:
Parentকন্ট্রাক্ট একটি পাবলিক ভেরিয়েবলvalueএবং একটি ফাংশনsetValueধারণ করে।Childকন্ট্রাক্টParentকন্ট্রাক্ট থেকে ইনহেরিট করা হয়েছে। এর মানে হলো,Childকন্ট্রাক্টParentকন্ট্রাক্টের সমস্ত প্রোপার্টি এবং ফাংশন পেয়েছে।Childকন্ট্রাক্টের কনস্ট্রাক্টরParentকন্ট্রাক্টের কনস্ট্রাক্টরকেও কল করেছে।
ইনহেরিটেন্সের ধরণ
Solidity তে ইনহেরিটেন্সের বিভিন্ন ধরণ থাকতে পারে:
- সিঙ্গেল ইনহেরিটেন্স: একটি কন্ট্রাক্ট এককভাবে অন্য একটি কন্ট্রাক্ট থেকে ইনহেরিট করে।
- মাল্টিপল ইনহেরিটেন্স: একাধিক কন্ট্রাক্ট থেকে ইনহেরিট করা যায়। Solidity তে মাল্টিপল ইনহেরিটেন্সের মাধ্যমে একাধিক কন্ট্রাক্টের প্রোপার্টি এবং ফাংশন একসাথে ব্যবহার করা সম্ভব হয়।
মাল্টিপল ইনহেরিটেন্স উদাহরণ:
pragma solidity ^0.8.0;
contract A {
function funcA() public pure returns (string memory) {
return "Function A";
}
}
contract B {
function funcB() public pure returns (string memory) {
return "Function B";
}
}
contract C is A, B {
function funcC() public pure returns (string memory) {
return "Function C";
}
}এখানে C কন্ট্রাক্ট A এবং B কন্ট্রাক্ট থেকে ইনহেরিট করছে এবং C কন্ট্রাক্টে funcA, funcB এবং funcC ফাংশনগুলো ব্যবহার করা হচ্ছে।
প্রোপার্টিজ (Properties)
Solidity তে প্রোপার্টিজ হল ভেরিয়েবল বা ডেটা যা একটি কন্ট্রাক্টের অংশ হিসেবে থাকে। এই প্রোপার্টিগুলি প্যারেন্ট কন্ট্রাক্ট থেকে ইনহেরিট করা যেতে পারে। একটি কন্ট্রাক্টের প্রোপার্টি হচ্ছে সেই সমস্ত ভেরিয়েবল যা সিস্টেমে সংরক্ষিত থাকে এবং স্মার্ট কন্ট্রাক্টের কার্যকারিতা নিয়ন্ত্রণ করে।
Solidity তে প্রোপার্টিজ সাধারণত ৩ ধরনের visibility রাখে:
- public: এটি এমন প্রোপার্টি যা অন্য সব কন্ট্রাক্ট এবং ব্যবহারকারীদের জন্য দৃশ্যমান থাকে। Solidity এর জন্য এই visibility অ্যাক্সেসর ফাংশন তৈরি করে।
- internal: এটি এমন প্রোপার্টি যা কেবল বর্তমান কন্ট্রাক্ট এবং এর ইনহেরিটেড কন্ট্রাক্ট থেকে অ্যাক্সেস করা যায়।
- private: এটি এমন প্রোপার্টি যা কেবলমাত্র বর্তমান কন্ট্রাক্টের মধ্যে অ্যাক্সেস করা যায়, ইনহেরিটেড কন্ট্রাক্টের মধ্যে নয়।
প্রোপার্টি ব্যবহার উদাহরণ:
pragma solidity ^0.8.0;
contract MyContract {
uint public value; // public প্রোপার্টি
constructor(uint _value) {
value = _value;
}
function setValue(uint _value) public {
value = _value;
}
}এখানে value একটি public প্রোপার্টি যা কন্ট্রাক্টের বাইরে থেকে এক্সেস করা যেতে পারে।
প্রোপার্টির সাথে ইনহেরিটেন্স ব্যবহার:
pragma solidity ^0.8.0;
contract Parent {
uint public value;
constructor(uint _value) {
value = _value;
}
}
contract Child is Parent {
constructor(uint _value) Parent(_value) {}
function getValue() public view returns (uint) {
return value;
}
}এখানে Child কন্ট্রাক্ট Parent কন্ট্রাক্টের value প্রোপার্টি ইনহেরিট করেছে এবং getValue() ফাংশনের মাধ্যমে এটি অ্যাক্সেস করছে।
সারাংশ
Solidity তে ইনহেরিটেন্স এবং প্রোপার্টিজের ব্যবহার স্মার্ট কন্ট্রাক্টের কার্যকারিতা উন্নত করতে এবং কোড পুনঃব্যবহারযোগ্যতা নিশ্চিত করতে সহায়ক। ইনহেরিটেন্স কন্ট্রাক্টের মধ্যে কোড শেয়ারিং এবং লজিক ভাগ করে, যখন প্রোপার্টিজ কন্ট্রাক্টের ডেটা এবং কার্যকারিতা সংরক্ষণ করে। Solidity তে মাল্টিপল ইনহেরিটেন্স এবং ভিন্ন ভিন্ন প্রোপার্টি visibility ব্যবহার করে স্মার্ট কন্ট্রাক্টের কার্যকারিতা আরো শক্তিশালী করা যায়।
Read more