স্মার্ট কন্ট্র্যাক্ট ল্যাঙ্গুয়েজ
পৃষ্ঠাটি সর্বশেষ আপডেট করা হয়েছে: ২৬ ফেব্রুয়ারী, ২০২৬
Ethereum-এর একটি চমৎকার দিক হলো, স্মার্ট কন্ট্র্যাক্টগুলোকে তুলনামূলকভাবে ডেভেলপার-বান্ধব ল্যাঙ্গুয়েজ ব্যবহার করে প্রোগ্রাম করা যায়। আপনি যদি Python বা যেকোনো কার্লি-ব্র্যাকেট ল্যাঙ্গুয়েজ (opens in a new tab)-এ অভিজ্ঞ হন, তাহলে আপনি পরিচিত সিনট্যাক্সসহ একটি ল্যাঙ্গুয়েজ খুঁজে পেতে পারেন।
দুটি সর্বাধিক সক্রিয় এবং রক্ষণাবেক্ষণ করা ল্যাঙ্গুয়েজ হলো:
- Solidity
- Vyper
Remix IDE, Solidity এবং Vyper উভয় ক্ষেত্রেই কন্ট্র্যাক্ট তৈরি এবং পরীক্ষা করার জন্য একটি ব্যাপক ডেভেলপমেন্ট এনভায়রনমেন্ট সরবরাহ করে। কোডিং শুরু করতে ইন-ব্রাউজার Remix IDE ব্যবহার করে দেখুন (opens in a new tab)।
আরও অভিজ্ঞ ডেভেলপাররাও Yul, ইথিরিয়াম ভার্চুয়াল মেশিন-এর জন্য একটি মধ্যবর্তী ল্যাঙ্গুয়েজ, অথবা Yul+, যা Yul-এর একটি এক্সটেনশন, ব্যবহার করতে চাইতে পারেন।
আপনি যদি কৌতূহলী হন এবং এমন নতুন ল্যাঙ্গুয়েজ পরীক্ষা করতে সাহায্য করতে চান যা এখনও ব্যাপকভাবে ডেভলপ করা হচ্ছে, তাহলে আপনি Fe নিয়ে পরীক্ষা করতে পারেন, এটি একটি উদীয়মান স্মার্ট কন্ট্র্যাক্ট ল্যাঙ্গুয়েজ যা বর্তমানে এখনও শৈশবাবস্থায় রয়েছে।
পূর্বশর্ত
প্রোগ্রামিং ল্যাঙ্গুয়েজের, বিশেষ করে JavaScript বা Python-এর পূর্ববর্তী জ্ঞান, আপনাকে স্মার্ট কন্ট্র্যাক্ট ল্যাঙ্গুয়েজগুলোর পার্থক্য বুঝতে সাহায্য করতে পারে। ল্যাঙ্গুয়েজগুলোর তুলনার গভীরে যাওয়ার আগে আমরা আপনাকে একটি ধারণা হিসেবে স্মার্ট কন্ট্র্যাক্টগুলো বোঝারও পরামর্শ দিই। স্মার্ট কন্ট্র্যাক্টের ভূমিকা।
Solidity
- স্মার্ট কন্ট্র্যাক্ট বাস্তবায়নের জন্য অবজেক্ট-ওরিয়েন্টেড, হাই-লেভেল ল্যাঙ্গুয়েজ।
- কার্লি-ব্র্যাকেট ল্যাঙ্গুয়েজ যা C++ দ্বারা সবচেয়ে গভীরভাবে প্রভাবিত।
- স্ট্যাটিক্যালি টাইপড (কম্পাইল করার সময় একটি ভেরিয়েবলের টাইপ জানা যায়)।
- সাপোর্ট করে:
- ইনহেরিটেন্স (আপনি অন্যান্য কন্ট্র্যাক্টকে প্রসারিত করতে পারেন)।
- লাইব্রেরি (আপনি পুনঃব্যবহারযোগ্য কোড তৈরি করতে পারেন যা আপনি বিভিন্ন কন্ট্র্যাক্ট থেকে কল করতে পারেন – যেমন অন্যান্য অবজেক্ট-ওরিয়েন্টেড প্রোগ্রামিং ল্যাঙ্গুয়েজে একটি স্ট্যাটিক ক্লাসের স্ট্যাটিক ফাংশন)।
- জটিল ব্যবহারকারী-সংজ্ঞায়িত টাইপ।
গুরুত্বপূর্ণ লিঙ্ক
- নথিপত্র (opens in a new tab)
- Solidity ল্যাঙ্গুয়েজ পোর্টাল (opens in a new tab)
- Solidity by Example (opens in a new tab)
- GitHub (opens in a new tab)
- Solidity Matrix চ্যাটরুম (opens in a new tab) Solidity Matrix চ্যাটরুম (opens in a new tab)-এর সাথে ব্রিজ করা
- চিট শিট (opens in a new tab)
- Solidity ব্লগ (opens in a new tab)
- Solidity টুইটার (opens in a new tab)
উদাহরণ কন্ট্র্যাক্ট
1// SPDX-License-Identifier: GPL-3.02pragma solidity >= 0.7.0;34contract Coin {5 // The keyword "public" makes variables6 // accessible from other contracts7 address public minter;8 mapping (address => uint) public balances;910 // Events allow clients to react to specific11 // contract changes you declare12 event Sent(address from, address to, uint amount);1314 // Constructor code is only run when the contract15 // is created16 constructor() {17 minter = msg.sender;18 }1920 // Sends an amount of newly created coins to an address21 // Can only be called by the contract creator22 function mint(address receiver, uint amount) public {23 require(msg.sender == minter);24 require(amount < 1e60);25 balances[receiver] += amount;26 }2728 // Sends an amount of existing coins29 // from any caller to an address30 function send(address receiver, uint amount) public {31 require(amount <= balances[msg.sender], "Insufficient balance.");32 balances[msg.sender] -= amount;33 balances[receiver] += amount;34 emit Sent(msg.sender, receiver, amount);35 }36}সবকটি দেখুনএই উদাহরণটি আপনাকে Solidity কন্ট্র্যাক্টের সিনট্যাক্স কেমন সে সম্পর্কে একটি ধারণা দেবে। ফাংশন এবং ভেরিয়েবলগুলোর আরও বিস্তারিত বিবরণের জন্য, ডকুমেন্টেশন দেখুন (opens in a new tab)।
Vyper
- পাইথনিক প্রোগ্রামিং ল্যাঙ্গুয়েজ
- স্ট্রং টাইপিং
- ছোট এবং বোধগম্য কম্পাইলার কোড
- দক্ষ বাইটকোড জেনারেশন
- কন্ট্র্যাক্টগুলোকে আরও সুরক্ষিত এবং অডিট করা সহজ করার লক্ষ্যে এতে ইচ্ছাকৃতভাবে Solidity-এর চেয়ে কম বৈশিষ্ট্য রয়েছে। Vyper সাপোর্ট করে না:
- মডিফায়ার
- ইনহেরিটেন্স
- ইনলাইন অ্যাসেম্বলি
- ফাংশন ওভারলোডিং
- অপারেটর ওভারলোডিং
- রিকার্সিভ কলিং
- অসীম দৈর্ঘ্যের লুপ
- বাইনারি ফিক্সড পয়েন্ট
আরও তথ্যের জন্য, Vyper-এর মূলনীতি পড়ুন (opens in a new tab)।
গুরুত্বপূর্ণ লিঙ্ক
- নথিপত্র (opens in a new tab)
- Vyper by Example (opens in a new tab)
- More Vyper by Example (opens in a new tab)
- GitHub (opens in a new tab)
- Vyper কমিউনিটি ডিসকর্ড চ্যাট (opens in a new tab)
- চিট শিট (opens in a new tab)
- Vyper-এর জন্য স্মার্ট কন্ট্র্যাক্ট ডেভেলপমেন্ট ফ্রেমওয়ার্ক এবং টুলস
- VyperPunk - Vyper স্মার্ট কন্ট্র্যাক্ট সুরক্ষিত করতে এবং হ্যাক করতে শিখুন (opens in a new tab)
- ডেভেলপমেন্টের জন্য Vyper হাব (opens in a new tab)
- Vyper গ্রেটেস্ট হিটস স্মার্ট কন্ট্র্যাক্টের উদাহরণ (opens in a new tab)
- অসাধারণ Vyper কিউরেটেড রিসোর্স (opens in a new tab)
উদাহরণ
1# Open Auction23# Auction params4# Beneficiary receives money from the highest bidder5beneficiary: public(address)6auctionStart: public(uint256)7auctionEnd: public(uint256)89# Current state of auction10highestBidder: public(address)11highestBid: public(uint256)1213# Set to true at the end, disallows any change14ended: public(bool)1516# Keep track of refunded bids so we can follow the withdraw pattern17pendingReturns: public(HashMap[address, uint256])1819# Create a simple auction with `_bidding_time`20# seconds bidding time on behalf of the21# beneficiary address `_beneficiary`.22@external23def __init__(_beneficiary: address, _bidding_time: uint256):24 self.beneficiary = _beneficiary25 self.auctionStart = block.timestamp26 self.auctionEnd = self.auctionStart + _bidding_time2728# Bid on the auction with the value sent29# together with this transaction.30# The value will only be refunded if the31# auction is not won.32@external33@payable34def bid():35 # Check if bidding period is over.36 assert block.timestamp < self.auctionEnd37 # Check if bid is high enough38 assert msg.value > self.highestBid39 # Track the refund for the previous high bidder40 self.pendingReturns[self.highestBidder] += self.highestBid41 # Track new high bid42 self.highestBidder = msg.sender43 self.highestBid = msg.value4445# Withdraw a previously refunded bid. The withdraw pattern is46# used here to avoid a security issue. If refunds were directly47# sent as part of bid(), a malicious bidding contract could block48# those refunds and thus block new higher bids from coming in.49@external50def withdraw():51 pending_amount: uint256 = self.pendingReturns[msg.sender]52 self.pendingReturns[msg.sender] = 053 send(msg.sender, pending_amount)5455# End the auction and send the highest bid56# to the beneficiary.57@external58def endAuction():59 # It is a good guideline to structure functions that interact60 # with other contracts (i.e., they call functions or send ether)61 # into three phases:62 # 1. checking conditions63 # 2. performing actions (potentially changing conditions)64 # 3. interacting with other contracts65 # If these phases are mixed up, the other contract could call66 # back into the current contract and modify the state or cause67 # effects (ether payout) to be performed multiple times.68 # If functions called internally include interaction with external69 # contracts, they also have to be considered interaction with70 # external contracts.7172 # 1. Conditions73 # Check if auction endtime has been reached74 assert block.timestamp >= self.auctionEnd75 # Check if this function has already been called76 assert not self.ended7778 # 2. Effects79 self.ended = True8081 # 3. Interaction82 send(self.beneficiary, self.highestBid)সবকটি দেখুনএই উদাহরণটি আপনাকে Vyper কন্ট্র্যাক্টের সিনট্যাক্স কেমন সে সম্পর্কে একটি ধারণা দেবে। ফাংশন এবং ভেরিয়েবলগুলোর আরও বিস্তারিত বিবরণের জন্য, ডকুমেন্টেশন দেখুন (opens in a new tab)।
Yul and Yul+
আপনি যদি Ethereum-এ নতুন হন এবং এখনও স্মার্ট কন্ট্র্যাক্ট ল্যাঙ্গুয়েজ দিয়ে কোনো কোডিং না করে থাকেন, তবে আমরা Solidity বা Vyper দিয়ে শুরু করার পরামর্শ দিই। আপনি স্মার্ট কন্ট্র্যাক্টের নিরাপত্তার সেরা অনুশীলন এবং EVM-এর সাথে কাজ করার নির্দিষ্ট বিষয়গুলোর সাথে পরিচিত হওয়ার পরেই কেবল Yul বা Yul+ নিয়ে দেখুন।
Yul
- Ethereum-এর জন্য মধ্যবর্তী ল্যাঙ্গুয়েজ।
- EVM এবং Ewasm (opens in a new tab), যা একটি Ethereum ফ্লেভারযুক্ত WebAssembly, সাপোর্ট করে এবং এটি উভয় প্ল্যাটফর্মের একটি ব্যবহারযোগ্য সাধারণ ডিনোমিনেটর হিসাবে ডিজাইন করা হয়েছে।
- উচ্চ-স্তরের অপ্টিমাইজেশন পর্যায়ের জন্য ভালো টার্গেট যা EVM এবং Ewasm উভয় প্ল্যাটফর্মকে সমানভাবে উপকৃত করতে পারে।
Yul+
- Yul-এর একটি নিম্ন-স্তরের, অত্যন্ত দক্ষ এক্সটেনশন।
- প্রাথমিকভাবে একটি অপ্টিমেস্টিক রোলআপ কন্ট্র্যাক্টের জন্য ডিজাইন করা হয়েছে।
- Yul+-কে Yul-এর একটি পরীক্ষামূলক আপগ্রেড প্রস্তাব হিসাবে দেখা যেতে পারে, যা এতে নতুন বৈশিষ্ট্য যুক্ত করে।
গুরুত্বপূর্ণ লিঙ্ক
- Yul নথিপত্র (opens in a new tab)
- Yul+ নথিপত্র (opens in a new tab)
- Yul+ পরিচিতি পোস্ট (opens in a new tab)
উদাহরণ কন্ট্র্যাক্ট
নিম্নলিখিত সহজ উদাহরণটি একটি পাওয়ার ফাংশন বাস্তবায়ন করে। solc --strict-assembly --bin input.yul ব্যবহার করে এটি কম্পাইল করা যেতে পারে। উদাহরণটি
input.yul ফাইলে সংরক্ষণ করা উচিত।
1{2 function power(base, exponent) -> result3 {4 switch exponent5 case 0 { result := 1 }6 case 1 { result := base }7 default8 {9 result := power(mul(base, base), div(exponent, 2))10 if mod(exponent, 2) { result := mul(base, result) }11 }12 }13 let res := power(calldataload(0), calldataload(32))14 mstore(0, res)15 return(0, 32)16}সবকটি দেখুনআপনি যদি ইতিমধ্যেই স্মার্ট কন্ট্র্যাক্টে বেশ অভিজ্ঞ হন, তাহলে Yul-এ একটি সম্পূর্ণ ERC20 ইমপ্লিমেন্টেশন এখানে (opens in a new tab) পাওয়া যাবে।
Fe
- ইথিরিয়াম ভার্চুয়াল মেশিন (EVM)-এর জন্য স্ট্যাটিক্যালি টাইপড ল্যাঙ্গুয়েজ।
- Python এবং Rust দ্বারা অনুপ্রাণিত।
- শেখা সহজ করার লক্ষ্য রাখে -- এমনকি Ethereum ইকোসিস্টেমে নতুন ডেভেলপারদের জন্যও।
- Fe-এর ডেভেলপমেন্ট এখনও প্রাথমিক পর্যায়ে রয়েছে, ল্যাঙ্গুয়েজটির আলফা রিলিজ হয়েছিল জানুয়ারী ২০২১-এ।
গুরুত্বপূর্ণ লিঙ্ক
- GitHub (opens in a new tab)
- Fe ঘোষণা (opens in a new tab)
- Fe 2021 রোডম্যাপ (opens in a new tab)
- Fe ডিসকর্ড চ্যাট (opens in a new tab)
- Fe টুইটার (opens in a new tab)
উদাহরণ কন্ট্র্যাক্ট
নিম্নলিখিতটি Fe-তে বাস্তবায়িত একটি সাধারণ কন্ট্র্যাক্ট।
1type BookMsg = bytes[100]23contract GuestBook:4 pub guest_book: map<address, BookMsg>56 event Signed:7 book_msg: BookMsg89 pub def sign(book_msg: BookMsg):10 self.guest_book[msg.sender] = book_msg1112 emit Signed(book_msg=book_msg)1314 pub def get_msg(addr: address) -> BookMsg:15 return self.guest_book[addr].to_mem()16সবকটি দেখুনকীভাবে বেছে নেবেন
অন্যান্য যেকোনো প্রোগ্রামিং ল্যাঙ্গুয়েজের মতোই, এটি মূলত সঠিক কাজের জন্য সঠিক টুল বেছে নেওয়ার এবং সেইসাথে ব্যক্তিগত পছন্দের বিষয়।
আপনি যদি এখনও কোনো ল্যাঙ্গুয়েজ চেষ্টা না করে থাকেন, তবে এখানে কয়েকটি বিষয় বিবেচনা করার জন্য দেওয়া হল:
Solidity-র চমৎকার দিকগুলো কী?
- আপনি যদি একজন শিক্ষানবিস হন, তাহলে অনেক টিউটোরিয়াল এবং শেখার টুলস রয়েছে। এ সম্পর্কে আরও দেখুন কোডিং করে শিখুন বিভাগে।
- ভালো ডেভেলপার টুলিং উপলব্ধ।
- Solidity-র একটি বড় ডেভেলপার কমিউনিটি রয়েছে, যার মানে হল আপনি খুব সম্ভবত আপনার প্রশ্নের উত্তর বেশ দ্রুত খুঁজে পাবেন।
Vyper-এর চমৎকার দিকগুলো কী?
- Python ডেভেলপারদের জন্য শুরু করার দারুণ উপায়, যারা স্মার্ট কন্ট্র্যাক্ট লিখতে চান।
- Vyper-এ কম সংখ্যক বৈশিষ্ট্য রয়েছে যা এটিকে দ্রুত আইডিয়া প্রোটোটাইপ করার জন্য চমৎকার করে তোলে।
- Vyper-এর লক্ষ্য হল অডিট করা সহজ এবং সর্বাধিক মানব-পাঠযোগ্য হওয়া।
Yul এবং Yul+-এর চমৎকার দিকগুলো কী?
- সরল এবং কার্যকরী নিম্ন-স্তরের ল্যাঙ্গুয়েজ।
- এটি র' EVM-এর অনেক কাছাকাছি যাওয়ার সুযোগ দেয়, যা আপনার কন্ট্র্যাক্টগুলোর গ্যাস ব্যবহার অপ্টিমাইজ করতে সাহায্য করতে পারে।
ল্যাঙ্গুয়েজগুলোর তুলনা
বেসিক সিনট্যাক্স, কন্ট্র্যাক্ট লাইফসাইকেল, ইন্টারফেস, অপারেটর, ডেটা স্ট্রাকচার, ফাংশন, কন্ট্রোল ফ্লো এবং আরও অনেক কিছুর তুলনার জন্য Auditless-এর এই চিটশিটটি (opens in a new tab) দেখুন