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

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

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

পূর্বশর্ত

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

ডেটা

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

স্টোরেজ

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

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

আপনি যদি আগে থেকেই অবজেক্ট-ওরিয়েন্টেড ভাষায় প্রোগ্রামিং করে থাকেন, তবে আপনি সম্ভবত বেশিরভাগ ধরনের (types) সাথেই পরিচিত হবেন। তবে, আপনি যদি ইথেরিয়াম ডেভেলপমেন্টে নতুন হয়ে থাকেন, তবে 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 ফাংশনগুলো শুধুমাত্র সেই কন্ট্রাক্টের জন্যই দৃশ্যমান যেখানে এগুলো সংজ্ঞায়িত করা হয়েছে এবং উদ্ভূত (derived) কন্ট্রাক্টগুলোতে দৃশ্যমান নয়

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

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

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

ভিউ ফাংশন (View functions)

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

// Solidity উদাহরণ
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-এর মতো, এই ফাংশনগুলো প্রায়শই স্টেট ভেরিয়েবলগুলোকে তাদের নির্দিষ্ট মান দিয়ে ইনিশিয়ালাইজ করে।

# Vyper উদাহরণ

@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)-এ এগুলোর সাথে ইন্টারঅ্যাক্ট করতে পারেন।

হ্যালো ওয়ার্ল্ড (Hello world)

টোকেন

অনন্য ডিজিটাল সম্পদ

আরও পড়ুন

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