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

স্মার্ট কন্ট্রাক্টের গঠন

পেজ সর্বশেষ আপডেট করা হয়েছে: 15 এপ্রিল, 2026

একটি স্মার্ট কন্ট্রাক্ট হলো এমন একটি প্রোগ্রাম যা ইথেরিয়ামের একটি এডড্রেস-এ রান করে। এগুলো ডেটা এবং ফাংশন দিয়ে তৈরি যা কোনো লেনদেন গ্রহণ করার পর এক্সিকিউট হতে পারে। নিচে একটি স্মার্ট কন্ট্রাক্টের গঠনের সংক্ষিপ্ত বিবরণ দেওয়া হলো।

পূর্বশর্ত

প্রথমে নিশ্চিত করুন যে আপনি স্মার্ট কন্ট্রাক্ট সম্পর্কে পড়েছেন। এই ডকুমেন্টটি ধরে নেয় যে আপনি ইতিমধ্যেই JavaScript বা Python-এর মতো প্রোগ্রামিং ভাষার সাথে পরিচিত।

ডেটা

যেকোনো কন্ট্রাক্ট ডেটাকে অবশ্যই একটি লোকেশনে অ্যাসাইন করতে হবে: হয় storage অথবা memory-তে। একটি স্মার্ট কন্ট্রাক্টে স্টোরেজ পরিবর্তন করা ব্যয়বহুল, তাই আপনার ডেটা কোথায় থাকা উচিত তা বিবেচনা করা প্রয়োজন।

স্টোরেজ

স্থায়ী ডেটাকে স্টোরেজ বলা হয় এবং এটি স্টেট ভেরিয়েবল দ্বারা উপস্থাপন করা হয়। এই মানগুলো ব্লকচেইন-এ স্থায়ীভাবে সংরক্ষিত হয়। আপনাকে এর ধরন (type) ঘোষণা করতে হবে যাতে কম্পাইল করার সময় কন্ট্রাক্টটি ট্র্যাক করতে পারে যে ব্লকচেইন-এ এর কতটুকু স্টোরেজ প্রয়োজন।

// সলিডিটি উদাহরণ
contract SimpleStorage {
    uint storedData; // স্টেট ভেরিয়েবল
    // ...
}
# ভাইপার উদাহরণ
storedData: int128

আপনি যদি ইতিমধ্যেই অবজেক্ট-ওরিয়েন্টেড ভাষায় প্রোগ্রামিং করে থাকেন, তবে আপনি সম্ভবত বেশিরভাগ ধরনের (types) সাথেই পরিচিত হবেন। তবে, আপনি যদি Ethereum ডেভেলপমেন্টে নতুন হয়ে থাকেন, তাহলে address আপনার কাছে নতুন মনে হতে পারে।

একটি address টাইপ একটি ইথেরিয়াম এডড্রেস ধারণ করতে পারে যা 20 বাইট বা 160 বিটের সমান। এটি 0x দিয়ে শুরু হওয়া হেক্সাডেসিমাল নোটেশনে রিটার্ন করে।

অন্যান্য টাইপগুলোর মধ্যে রয়েছে:

  • বুলিয়ান (boolean)
  • ইন্টিজার (integer)
  • ফিক্সড পয়েন্ট নাম্বার (fixed point numbers)
  • ফিক্সড-সাইজ বাইট অ্যারে (fixed-size byte arrays)
  • ডায়নামিকালি সাইজড বাইট অ্যারে (dynamically sized byte arrays)
  • র‍্যাশনাল এবং ইন্টিজার লিটারেল (rational and integer literals)
  • স্ট্রিং লিটারেল (string literals)
  • হেক্সাডেসিমাল লিটারেল (hexadecimal literals)
  • এনাম (enums)

আরও ব্যাখ্যার জন্য, ডক্সগুলো দেখুন:

মেমরি

যেসব মান শুধুমাত্র একটি কন্ট্রাক্ট ফাংশন এক্সিকিউট হওয়ার সময়কালের জন্য সংরক্ষিত থাকে, সেগুলোকে মেমরি ভেরিয়েবল বলা হয়। যেহেতু এগুলো ব্লকচেইন-এ স্থায়ীভাবে সংরক্ষিত হয় না, তাই এগুলো ব্যবহার করা অনেক সস্তা।

ইভিএম (EVM) কীভাবে ডেটা সংরক্ষণ করে (স্টোরেজ, মেমরি এবং স্ট্যাক) সে সম্পর্কে Solidity ডক্স (opens in a new tab)-এ আরও জানুন।

এনভায়রনমেন্ট ভেরিয়েবল

আপনার কন্ট্রাক্টে সংজ্ঞায়িত ভেরিয়েবলগুলো ছাড়াও, কিছু বিশেষ গ্লোবাল ভেরিয়েবল রয়েছে। এগুলো মূলত ব্লকচেইন বা বর্তমান লেনদেন সম্পর্কে তথ্য প্রদান করতে ব্যবহৃত হয়।

উদাহরণ:

প্রপার্টিস্টেট ভেরিয়েবলবিবরণ
block.timestampuint256বর্তমান ব্লক এপোক টাইমস্ট্যাম্প
msg.senderaddressমেসেজ প্রেরক (বর্তমান কল)

ফাংশন

সহজ কথায়, ফাংশনগুলো আগত লেনদেন-এর প্রতিক্রিয়ায় তথ্য পেতে বা সেট করতে পারে।

দুই ধরনের ফাংশন কল রয়েছে:

  • internal – এগুলো কোনো EVM কল তৈরি করে না
    • ইন্টারনাল ফাংশন এবং স্টেট ভেরিয়েবলগুলো শুধুমাত্র অভ্যন্তরীণভাবে অ্যাক্সেস করা যায় (অর্থাৎ, বর্তমান কন্ট্রাক্ট বা এটি থেকে উদ্ভূত কন্ট্রাক্টগুলোর ভেতর থেকে)
  • external – এগুলো একটি EVM কল তৈরি করে
    • এক্সটার্নাল ফাংশনগুলো কন্ট্রাক্ট ইন্টারফেসের অংশ, যার মানে এগুলো অন্যান্য কন্ট্রাক্ট থেকে এবং লেনদেন-এর মাধ্যমে কল করা যেতে পারে। একটি এক্সটার্নাল ফাংশন f অভ্যন্তরীণভাবে কল করা যায় না (অর্থাৎ, f() কাজ করে না, তবে this.f() কাজ করে)।

এগুলো public বা private ও হতে পারে

  • public ফাংশনগুলো কন্ট্রাক্টের ভেতর থেকে অভ্যন্তরীণভাবে বা মেসেজের মাধ্যমে বাহ্যিকভাবে কল করা যেতে পারে
  • private ফাংশনগুলো শুধুমাত্র সেই কন্ট্রাক্টের জন্যই দৃশ্যমান যেখানে সেগুলো সংজ্ঞায়িত করা হয়েছে এবং উদ্ভূত কন্ট্রাক্টগুলোতে নয়

ফাংশন এবং স্টেট ভেরিয়েবল উভয়কেই পাবলিক বা প্রাইভেট করা যেতে পারে

একটি কন্ট্রাক্টে স্টেট ভেরিয়েবল আপডেট করার জন্য এখানে একটি ফাংশন দেওয়া হলো:

// সলিডিটি উদাহরণ
function update_name(string value) public {
    dapp_name = value;
}
  • string টাইপের প্যারামিটার value ফাংশনে পাস করা হয়েছে: update_name
  • এটি public হিসেবে ঘোষণা করা হয়েছে, যার মানে যে কেউ এটি অ্যাক্সেস করতে পারে
  • এটি view হিসেবে ঘোষণা করা হয়নি, তাই এটি কন্ট্রাক্ট স্টেট পরিবর্তন করতে পারে

ভিউ ফাংশন

এই ফাংশনগুলো কন্ট্রাক্টের ডেটার স্টেট পরিবর্তন না করার প্রতিশ্রুতি দেয়। সাধারণ উদাহরণ হলো "গেটার" (getter) ফাংশন – উদাহরণস্বরূপ, আপনি কোনো ব্যবহারকারীর ব্যালেন্স জানতে এটি ব্যবহার করতে পারেন।

// সলিডিটি উদাহরণ
function balanceOf(address _owner) public view returns (uint256 _balance) {
    return ownerPizzaCount[_owner];
}
dappName: public(string)

@view
@public
def readName() -> string:
  return dappName

স্টেট পরিবর্তন হিসেবে যা বিবেচনা করা হয়:

  1. স্টেট ভেরিয়েবলে লেখা।
  2. ইভেন্ট এমিট করা (opens in a new tab)
  3. অন্যান্য কন্ট্রাক্ট তৈরি করা (opens in a new tab)
  4. selfdestruct ব্যবহার করা।
  5. কলের মাধ্যমে ইথার পাঠানো।
  6. view বা pure হিসেবে চিহ্নিত নয় এমন কোনো ফাংশন কল করা।
  7. লো-লেভেল কল ব্যবহার করা।
  8. নির্দিষ্ট অপকোড (opcodes) ধারণকারী ইনলাইন অ্যাসেম্বলি ব্যবহার করা।

কনস্ট্রাক্টর ফাংশন

constructor ফাংশনগুলো শুধুমাত্র একবার এক্সিকিউট হয় যখন কন্ট্রাক্টটি প্রথমবার ডিপ্লয় করা হয়। অনেক ক্লাস-ভিত্তিক প্রোগ্রামিং ভাষার constructor-এর মতো, এই ফাংশনগুলো প্রায়শই স্টেট ভেরিয়েবলগুলোকে তাদের নির্দিষ্ট মান দিয়ে ইনিশিয়ালাইজ করে।

# ভাইপার উদাহরণ

@external
def __init__(_beneficiary: address, _bidding_time: uint256):
    self.beneficiary = _beneficiary
    self.auctionStart = block.timestamp
    self.auctionEnd = self.auctionStart + _bidding_time

বিল্ট-ইন ফাংশন

আপনার কন্ট্রাক্টে সংজ্ঞায়িত ভেরিয়েবল এবং ফাংশনগুলো ছাড়াও, কিছু বিশেষ বিল্ট-ইন ফাংশন রয়েছে। সবচেয়ে সুস্পষ্ট উদাহরণ হলো:

  • address.send() – Solidity
  • send(address) – Vyper

এগুলো কন্ট্রাক্টগুলোকে অন্যান্য একাউন্ট-এ ETH পাঠানোর অনুমতি দেয়।

ফাংশন লেখা

আপনার ফাংশনের জন্য প্রয়োজন:

  • প্যারামিটার ভেরিয়েবল এবং টাইপ (যদি এটি প্যারামিটার গ্রহণ করে)
  • internal/external এর ঘোষণা
  • pure/view/payable এর ঘোষণা
  • রিটার্ন টাইপ (যদি এটি কোনো মান রিটার্ন করে)

একটি সম্পূর্ণ কন্ট্রাক্ট দেখতে অনেকটা এরকম হতে পারে। এখানে constructor ফাংশনটি dapp_name ভেরিয়েবলের জন্য একটি প্রাথমিক মান প্রদান করে।

ইভেন্ট এবং লগ

ইভেন্টগুলো আপনার স্মার্ট কন্ট্রাক্টকে আপনার ফ্রন্টএন্ড বা অন্যান্য সাবস্ক্রাইবিং অ্যাপ্লিকেশনের সাথে যোগাযোগ করতে সক্ষম করে। একবার একটি লেনদেন যাচাই হয়ে একটি ব্লক-এ যুক্ত হলে, স্মার্ট কন্ট্রাক্টগুলো ইভেন্ট এমিট করতে এবং তথ্য লগ করতে পারে, যা ফ্রন্টএন্ড পরবর্তীতে প্রসেস এবং ব্যবহার করতে পারে।

টীকাযুক্ত উদাহরণ

এগুলো Solidity-তে লেখা কিছু উদাহরণ। আপনি যদি কোড নিয়ে কাজ করতে চান, তবে আপনি Remix (opens in a new tab)-এ সেগুলোর সাথে ইন্টারঅ্যাক্ট করতে পারেন।

হ্যালো ওয়ার্ল্ড

টোকেন

ইউনিক ডিজিটাল অ্যাসেট

আরও পড়ুন

স্মার্ট কন্ট্রাক্ট সম্পর্কে আরও সম্পূর্ণ ধারণা পেতে Solidity এবং Vyper-এর ডকুমেন্টেশন দেখুন:

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