মূল কন্টেন্টে যান
Change page

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

পেজ সর্বশেষ আপডেট: 26 ফেব্রুয়ারী, 2026

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 // "public" কিওয়ার্ডটি ভেরিয়েবলগুলোকে
6 // অন্যান্য কন্ট্রাক্ট থেকে অ্যাক্সেসযোগ্য করে তোলে
7 address public minter;
8 mapping (address => uint) public balances;
9
10 // ইভেন্টগুলো ক্লায়েন্টদের নির্দিষ্ট
11 // আপনার ঘোষণা করা কন্ট্রাক্ট পরিবর্তনের প্রতি প্রতিক্রিয়া জানাতে দেয়
12 event Sent(address from, address to, uint amount);
13
14 // কনস্ট্রাক্টর কোড শুধুমাত্র তখনই রান হয় যখন কন্ট্রাক্টটি
15 // তৈরি করা হয়
16 constructor() {
17 minter = msg.sender;
18 }
19
20 // একটি ঠিকানায় নতুন তৈরি করা কয়েনের একটি পরিমাণ পাঠায়
21 // শুধুমাত্র কন্ট্রাক্ট ক্রিয়েটর কল করতে পারেন
22 function mint(address receiver, uint amount) public {
23 require(msg.sender == minter);
24 require(amount < 1e60);
25 balances[receiver] += amount;
26 }
27
28 // বিদ্যমান কয়েনের একটি পরিমাণ পাঠায়
29 // যেকোনো কলার থেকে একটি ঠিকানায়
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# উন্মুক্ত নিলাম
2
3# নিলামের প্যারামিটার
4# বেনিফিশিয়ারি সর্বোচ্চ দরদাতার কাছ থেকে টাকা পান
5beneficiary: public(address)
6auctionStart: public(uint256)
7auctionEnd: public(uint256)
8
9# নিলামের বর্তমান অবস্থা
10highestBidder: public(address)
11highestBid: public(uint256)
12
13# শেষে true সেট করা হয়, কোনো পরিবর্তনের অনুমতি দেয় না
14ended: public(bool)
15
16# রিফান্ড করা বিডগুলোর ট্র্যাক রাখুন যাতে আমরা উইথড্র প্যাটার্ন অনুসরণ করতে পারি
17pendingReturns: public(HashMap[address, uint256])
18
19# `_bidding_time` দিয়ে একটি সাধারণ নিলাম তৈরি করুন
20# সেকেন্ড বিডিং সময়, যার পক্ষে
21# বেনিফিশিয়ারি ঠিকানা `_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# পাঠানো ভ্যালু দিয়ে নিলামে বিড করুন
29# এই ট্রানজ্যাকশনের সাথে।
30# ভ্যালু শুধুমাত্র তখনই রিফান্ড করা হবে যদি
31# নিলামে জয়ী না হয়।
32@external
33@payable
34def bid():
35 # বিডিংয়ের সময় শেষ হয়েছে কিনা তা চেক করুন।
36 assert block.timestamp < self.auctionEnd
37 # বিড যথেষ্ট বেশি কিনা তা চেক করুন
38 assert msg.value > self.highestBid
39 # পূর্ববর্তী সর্বোচ্চ দরদাতার রিফান্ড ট্র্যাক করুন
40 self.pendingReturns[self.highestBidder] += self.highestBid
41 # নতুন সর্বোচ্চ বিড ট্র্যাক করুন
42 self.highestBidder = msg.sender
43 self.highestBid = msg.value
44
45# পূর্বে রিফান্ড করা বিড উইথড্র করুন। উইথড্র প্যাটার্নটি
46# এখানে একটি নিরাপত্তা সমস্যা এড়াতে ব্যবহার করা হয়েছে। যদি রিফান্ড সরাসরি
47# bid() এর অংশ হিসেবে পাঠানো হতো, একটি ক্ষতিকারক বিডিং কন্ট্রাক্ট ব্লক করতে পারতো
48# সেই রিফান্ডগুলো এবং এর ফলে নতুন উচ্চতর বিড আসা ব্লক করতে পারতো।
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# নিলাম শেষ করুন এবং সর্বোচ্চ বিড পাঠান
56# বেনিফিশিয়ারির কাছে।
57@external
58def endAuction():
59 # ইন্টারঅ্যাক্ট করে এমন ফাংশনগুলো গঠন করার জন্য এটি একটি ভালো গাইডলাইন
60 # অন্যান্য কন্ট্রাক্টের সাথে (অর্থাৎ, তারা ফাংশন কল করে বা ইথার পাঠায়)
61 # তিনটি ধাপে:
62 # ১. শর্ত চেক করা
63 # ২. কাজ সম্পাদন করা (সম্ভাব্যভাবে শর্ত পরিবর্তন করা)
64 # ৩. অন্যান্য কন্ট্রাক্টের সাথে ইন্টারঅ্যাক্ট করা
65 # যদি এই ধাপগুলো মিশে যায়, অন্য কন্ট্রাক্ট কল করতে পারে
66 # বর্তমান কন্ট্রাক্টে ফিরে এসে স্টেট পরিবর্তন করতে পারে বা
67 # প্রভাবগুলো (ইথার পেআউট) একাধিকবার সম্পাদন করতে পারে।
68 # যদি অভ্যন্তরীণভাবে কল করা ফাংশনগুলোতে বাহ্যিক কন্ট্রাক্টের সাথে ইন্টারঅ্যাকশন অন্তর্ভুক্ত থাকে,
69 # তবে সেগুলোকেও ইন্টারঅ্যাকশন হিসেবে বিবেচনা করতে হবে
70 # বাহ্যিক কন্ট্রাক্টের সাথে।
71
72 # ১. শর্তাবলী
73 # নিলামের শেষ সময় পৌঁছেছে কিনা তা চেক করুন
74 assert block.timestamp >= self.auctionEnd
75 # এই ফাংশনটি ইতিমধ্যে কল করা হয়েছে কিনা তা চেক করুন
76 assert not self.ended
77
78 # ২. প্রভাব
79 self.ended = True
80
81 # ৩. ইন্টারঅ্যাকশন
82 send(self.beneficiary, self.highestBid)

এই উদাহরণটি আপনাকে Vyper কন্ট্রাক্ট সিনট্যাক্স কেমন তা সম্পর্কে একটি ধারণা দেবে। ফাংশন এবং ভেরিয়েবলগুলোর আরও বিস্তারিত বর্ণনার জন্য, ডকুমেন্টেশন দেখুন (opens in a new tab)

Yul এবং Yul+

আপনি যদি ইথিরিয়ামে নতুন হন এবং এখনও স্মার্ট কন্ট্রাক্ট ল্যাঙ্গুয়েজ দিয়ে কোনো কোডিং না করে থাকেন, তবে আমরা Solidity বা Vyper দিয়ে শুরু করার পরামর্শ দিই। শুধুমাত্র তখনই Yul বা Yul+ দেখুন যখন আপনি স্মার্ট কন্ট্রাক্ট নিরাপত্তার সর্বোত্তম অনুশীলন এবং EVM-এর সাথে কাজ করার সুনির্দিষ্ট বিষয়গুলোর সাথে পরিচিত হবেন।

Yul

  • ইথিরিয়ামের জন্য ইন্টারমিডিয়েট ল্যাঙ্গুয়েজ।
  • EVM এবং Ewasm (opens in a new tab) (একটি ইথিরিয়াম ফ্লেভারড 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 দ্বারা অনুপ্রাণিত।
  • শেখা সহজ হওয়ার লক্ষ্য রাখে -- এমনকি ইথিরিয়াম ইকোসিস্টেমে নতুন ডেভেলপারদের জন্যও।
  • Fe ডেভেলপমেন্ট এখনও প্রাথমিক পর্যায়ে রয়েছে, ল্যাঙ্গুয়েজটির আলফা রিলিজ 2021 সালের জানুয়ারিতে হয়েছিল।

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

নিচে 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+-এর ভালো দিক কী?

  • সহজ এবং কার্যকরী লো-লেভেল ল্যাঙ্গুয়েজ।
  • র (raw) EVM-এর অনেক কাছাকাছি যাওয়ার অনুমতি দেয়, যা আপনার কন্ট্রাক্টগুলোর গ্যাস ব্যবহার অপ্টিমাইজ করতে সাহায্য করতে পারে।

ল্যাঙ্গুয়েজের তুলনা

বেসিক সিনট্যাক্স, কন্ট্রাক্ট লাইফসাইকেল, ইন্টারফেস, অপারেটর, ডেটা স্ট্রাকচার, ফাংশন, কন্ট্রোল ফ্লো এবং আরও অনেক কিছুর তুলনার জন্য Auditless-এর এই চিটশিটটি দেখুন (opens in a new tab)

আরও পড়াশোনা

এই আর্টিকেলটি কি সহায়ক ছিল?