সলিডিটি চিটশিট
সলিডিটি (Solidity) হলো একটি উচ্চ-স্তরের প্রোগ্রামিং ভাষা যা ইথেরিয়াম ব্লকচেইনে স্মার্ট কন্ট্রাক্ট তৈরির জন্য ব্যবহৃত হয়। এই চিটশিটে সলিডিটির সব মৌলিক থেকে উন্নত ধারণা, সিনট্যাক্স, এবং ব্যবহার বিস্তারিতভাবে কভার করা হয়েছে।
১. সলিডিটি পরিচিতি
১.১ মৌলিক ধারণা
- স্মার্ট কন্ট্রাক্ট: ব্লকচেইনে স্বয়ংক্রিয়ভাবে চালিত প্রোগ্রাম।
- EVM: Ethereum Virtual Machine-এ সলিডিটি কোড কম্পাইল হয়।
- গ্যাস: কন্ট্রাক্ট এক্সিকিউশনের জন্য খরচ।
১.২ ইনস্টলেশন ও সেটআপ
- Remix IDE: অনলাইন টুল (
remix.ethereum.org
)। - Hardhat/Truffle: লোকাল ডেভেলপমেন্ট।
২. সলিডিটি সিনট্যাক্স
২.১ ফাইল স্ট্রাকচার
SPDX-License
: লাইসেন্স স্পেসিফিকেশন।pragma
: সলিডিটি সংস্করণ (যেমন,^0.8.0
মানে 0.8.x)।
২.২ ডেটা টাইপ
টাইপ | বর্ণনা | উদাহরণ |
---|---|---|
uint | অ-ঋণাত্মক পূর্ণসংখ্যা। | uint256 x = 10; |
int | পূর্ণসংখ্যা। | int256 y = -5; |
address | ইথেরিয়াম ঠিকানা। | address owner; ISTORY |
bool | সত্য/মিথ্যা। | bool isActive = true; |
string | টেক্সট। | string name = "রহিম"; |
bytes | বাইট ডেটা। | bytes32 data; |
array | অ্যারে (নির্দিষ্ট/ডায়নামিক)। | uint[] numbers; |
mapping | কী-ভ্যালু জোড়া। | mapping(address => uint) balances; |
উদাহরণ:
২.৩ ভেরিয়েবল স্কোপ
মডিফায়ার | বর্ণনা | উদাহরণ |
---|---|---|
public | সবাই অ্যাক্সেস করতে পারে। | uint public x; |
private | শুধু কন্ট্রাক্টের মধ্যে। | uint private y; |
internal | কন্ট্রাক্ট এবং উত্তরাধিকারী কন্ট্রাক্ট। | uint internal z; |
external | শুধু বাইরে থেকে কল করা যায়। | function ext() external; |
৩. ফাংশন
৩.১ ফাংশন সিনট্যাক্স
- মডিফায়ার:
public
,private
,internal
,external
। - রিটার্ন:
returns (type)
।
৩.২ বিশেষ ফাংশন
ফাংশন | বর্ণনা | উদাহরণ |
---|---|---|
constructor | কন্ট্রাক্ট ডিপ্লয়মেন্টে একবার চলে। | constructor() { owner = msg.sender; } |
receive | ইথার রিসিভ করার জন্য। | receive() external payable {} |
fallback | অজানা ফাংশন কলের জন্য। | fallback() external payable {} |
উদাহরণ:
৩.৩ মডিফায়ার
৪. ডেটা স্ট্রাকচার
৪.১ অ্যারে
৪.২ ম্যাপিং
৪.৩ স্ট্রাক্ট
৪.৪ এনাম
৫. ইভেন্ট এবং লগিং
indexed
: ফিল্টার করার জন্য (সর্বোচ্চ ৩টি)।
৬. ইথার এবং গ্যাস
৬.১ ইথার হ্যান্ডলিং
- ইউনিট:
wei
,gwei
,ether
।
৬.২ গ্যাস অপটিমাইজেশন
uint256
ব্যবহার করুনuint8
এর পরিবর্তে।- লুপ এড়িয়ে চলুন।
view
/pure
ফাংশন ব্যবহার করুন।
৭. কন্ট্রাক্ট ইন্টারঅ্যাকশন
৭.১ ইনহেরিটেন্স
৭.২ অন্য কন্ট্রাক্ট কল
৮. সিকিউরিটি
৮.১ সাধারণ দুর্বলতা
সমস্যা | সমাধান |
---|---|
Reentrancy | nonReentrant মডিফায়ার বা লক। |
Overflow | SafeMath বা ^0.8.0 (বিল্ট-ইন চেক)। |
Access Control | onlyOwner মডিফায়ার। |
Gas Limit | লুপ এড়ানো। |
Reentrancy প্রতিরোধ:
৮.২ চেক-ইফেক্ট-ইন্টারঅ্যাকশন
৯. গ্লোবাল ভেরিয়েবল
ভেরিয়েবল | বর্ণনা | উদাহরণ |
---|---|---|
msg.sender | কলারের ঠিকানা। | address owner = msg.sender; |
msg.value | পাঠানো ইথার (wei-তে)। | uint amount = msg.value; |
block.number | বর্তমান ব্লক নম্বর। | uint blockNum = block.number; |
block.timestamp | বর্তমান সময় (সেকেন্ডে)। | uint time = block.timestamp; |
address(this) | কন্ট্রাক্টের ঠিকানা। | address self = address(this); |
১০. লাইব্রেরি
১১. টেস্টিং এবং ডিবাগিং
১১.১ Hardhat-এ টেস্ট
test/MyContract.js
:
- চালানো:
npx hardhat test
১১.২ Remix-এ ডিবাগিং
- Remix-এ "Debug" ট্যাব ব্যবহার করুন।
assert
/require
দিয়ে চেক:
১২. উদাহরণ: একটি সম্পূর্ণ কন্ট্রাক্ট
১৩. উন্নত ফিচার
১৩.১ মাল্টি-সিগনেচার ওয়ালেট
১৩.২ ERC-20 টোকেন
১৪. টিপস এবং সেরা অভ্যাস
- গ্যাস অপটিমাইজেশন: অপ্রয়োজনীয় স্টোরেজ এড়ান।
- সিকিউরিটি: OpenZeppelin লাইব্রেরি ব্যবহার করুন।
- ডকুমেন্টেশন: NatSpec কমেন্ট।