এড়িয়ে গিয়ে মূল কন্টেন্টে যান
Change page

স্মার্ট কন্ট্র্যাক্ট ল্যাঙ্গুয়েজ

পৃষ্ঠাটি সর্বশেষ আপডেট করা হয়েছে: ২৬ ফেব্রুয়ারী, ২০২৬

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++ দ্বারা সবচেয়ে গভীরভাবে প্রভাবিত।
  • স্ট্যাটিক্যালি টাইপড (কম্পাইল করার সময় একটি ভেরিয়েবলের টাইপ জানা যায়)।
  • সাপোর্ট করে:
    • ইনহেরিটেন্স (আপনি অন্যান্য কন্ট্র্যাক্টকে প্রসারিত করতে পারেন)।
    • লাইব্রেরি (আপনি পুনঃব্যবহারযোগ্য কোড তৈরি করতে পারেন যা আপনি বিভিন্ন কন্ট্র্যাক্ট থেকে কল করতে পারেন – যেমন অন্যান্য অবজেক্ট-ওরিয়েন্টেড প্রোগ্রামিং ল্যাঙ্গুয়েজে একটি স্ট্যাটিক ক্লাসের স্ট্যাটিক ফাংশন)।
    • জটিল ব্যবহারকারী-সংজ্ঞায়িত টাইপ।

উদাহরণ কন্ট্র্যাক্ট

1// SPDX-License-Identifier: GPL-3.0
2pragma solidity >= 0.7.0;
3
4contract Coin {
5 // The keyword "public" makes variables
6 // accessible from other contracts
7 address public minter;
8 mapping (address => uint) public balances;
9
10 // Events allow clients to react to specific
11 // contract changes you declare
12 event Sent(address from, address to, uint amount);
13
14 // Constructor code is only run when the contract
15 // is created
16 constructor() {
17 minter = msg.sender;
18 }
19
20 // Sends an amount of newly created coins to an address
21 // Can only be called by the contract creator
22 function mint(address receiver, uint amount) public {
23 require(msg.sender == minter);
24 require(amount < 1e60);
25 balances[receiver] += amount;
26 }
27
28 // Sends an amount of existing coins
29 // from any caller to an address
30 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)

উদাহরণ

1# Open Auction
2
3# Auction params
4# Beneficiary receives money from the highest bidder
5beneficiary: public(address)
6auctionStart: public(uint256)
7auctionEnd: public(uint256)
8
9# Current state of auction
10highestBidder: public(address)
11highestBid: public(uint256)
12
13# Set to true at the end, disallows any change
14ended: public(bool)
15
16# Keep track of refunded bids so we can follow the withdraw pattern
17pendingReturns: public(HashMap[address, uint256])
18
19# Create a simple auction with `_bidding_time`
20# seconds bidding time on behalf of the
21# beneficiary address `_beneficiary`.
22@external
23def __init__(_beneficiary: address, _bidding_time: uint256):
24 self.beneficiary = _beneficiary
25 self.auctionStart = block.timestamp
26 self.auctionEnd = self.auctionStart + _bidding_time
27
28# Bid on the auction with the value sent
29# together with this transaction.
30# The value will only be refunded if the
31# auction is not won.
32@external
33@payable
34def bid():
35 # Check if bidding period is over.
36 assert block.timestamp < self.auctionEnd
37 # Check if bid is high enough
38 assert msg.value > self.highestBid
39 # Track the refund for the previous high bidder
40 self.pendingReturns[self.highestBidder] += self.highestBid
41 # Track new high bid
42 self.highestBidder = msg.sender
43 self.highestBid = msg.value
44
45# Withdraw a previously refunded bid. The withdraw pattern is
46# used here to avoid a security issue. If refunds were directly
47# sent as part of bid(), a malicious bidding contract could block
48# those refunds and thus block new higher bids from coming in.
49@external
50def withdraw():
51 pending_amount: uint256 = self.pendingReturns[msg.sender]
52 self.pendingReturns[msg.sender] = 0
53 send(msg.sender, pending_amount)
54
55# End the auction and send the highest bid
56# to the beneficiary.
57@external
58def endAuction():
59 # It is a good guideline to structure functions that interact
60 # with other contracts (i.e., they call functions or send ether)
61 # into three phases:
62 # 1. checking conditions
63 # 2. performing actions (potentially changing conditions)
64 # 3. interacting with other contracts
65 # If these phases are mixed up, the other contract could call
66 # back into the current contract and modify the state or cause
67 # effects (ether payout) to be performed multiple times.
68 # If functions called internally include interaction with external
69 # contracts, they also have to be considered interaction with
70 # external contracts.
71
72 # 1. Conditions
73 # Check if auction endtime has been reached
74 assert block.timestamp >= self.auctionEnd
75 # Check if this function has already been called
76 assert not self.ended
77
78 # 2. Effects
79 self.ended = True
80
81 # 3. Interaction
82 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-এর একটি পরীক্ষামূলক আপগ্রেড প্রস্তাব হিসাবে দেখা যেতে পারে, যা এতে নতুন বৈশিষ্ট্য যুক্ত করে।

উদাহরণ কন্ট্র্যাক্ট

নিম্নলিখিত সহজ উদাহরণটি একটি পাওয়ার ফাংশন বাস্তবায়ন করে। solc --strict-assembly --bin input.yul ব্যবহার করে এটি কম্পাইল করা যেতে পারে। উদাহরণটি input.yul ফাইলে সংরক্ষণ করা উচিত।

1{
2 function power(base, exponent) -> result
3 {
4 switch exponent
5 case 0 { result := 1 }
6 case 1 { result := base }
7 default
8 {
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-এর ডেভেলপমেন্ট এখনও প্রাথমিক পর্যায়ে রয়েছে, ল্যাঙ্গুয়েজটির আলফা রিলিজ হয়েছিল জানুয়ারী ২০২১-এ।

উদাহরণ কন্ট্র্যাক্ট

নিম্নলিখিতটি Fe-তে বাস্তবায়িত একটি সাধারণ কন্ট্র্যাক্ট।

1type BookMsg = bytes[100]
2
3contract GuestBook:
4 pub guest_book: map<address, BookMsg>
5
6 event Signed:
7 book_msg: BookMsg
8
9 pub def sign(book_msg: BookMsg):
10 self.guest_book[msg.sender] = book_msg
11
12 emit Signed(book_msg=book_msg)
13
14 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) দেখুন

আরও পড়ুন

এই প্রবন্ধটা কি সহায়ক ছিল?