مرکزی مواد پر جائیں
Change page

اسمارٹ کانٹریکٹس کی ساخت

اسمارٹ کانٹریکٹ ایک پروگرام ہے جو ایتھیریم پر ایک ایڈریس پر چلتا ہے۔ یہ ڈیٹا اور فنکشنز پر مشتمل ہوتے ہیں جو ٹرانزیکشن موصول ہونے پر عمل میں آ سکتے ہیں۔ یہاں اسمارٹ کانٹریکٹ کے اجزاء کا ایک جائزہ دیا گیا ہے۔

بنیادی شرائط

یقینی بنائیں کہ آپ نے پہلے اسمارٹ کانٹریکٹس کے بارے میں پڑھ لیا ہے۔ یہ دستاویز فرض کرتی ہے کہ آپ پہلے ہی JavaScript یا Python جیسی پروگرامنگ زبانوں سے واقف ہیں۔

ڈیٹا

کسی بھی کانٹریکٹ کے ڈیٹا کو ایک مقام تفویض کیا جانا چاہیے: یا تو storage یا memory۔ اسمارٹ کانٹریکٹ میں اسٹوریج کو تبدیل کرنا مہنگا ہوتا ہے، اس لیے آپ کو غور کرنا چاہیے کہ آپ کا ڈیٹا کہاں رہنا چاہیے۔

اسٹوریج

مستقل ڈیٹا کو اسٹوریج کہا جاتا ہے اور اسے اسٹیٹ ویری ایبلز کے ذریعے ظاہر کیا جاتا ہے۔ یہ قدریں بلاک چین پر مستقل طور پر محفوظ ہو جاتی ہیں۔ آپ کو اس کی قسم (type) کا اعلان کرنے کی ضرورت ہوتی ہے تاکہ کانٹریکٹ مرتب (compile) ہوتے وقت یہ حساب رکھ سکے کہ اسے بلاک چین پر کتنی اسٹوریج درکار ہے۔

// Solidity کی مثال
contract SimpleStorage {
    uint storedData; // اسٹیٹ ویری ایبل
    // ...
}
# Vyper کی مثال
storedData: int128

اگر آپ نے پہلے ہی آبجیکٹ اورینٹڈ زبانوں میں پروگرامنگ کی ہے، تو آپ ممکنہ طور پر زیادہ تر اقسام سے واقف ہوں گے۔ تاہم، اگر آپ Ethereum ڈیولپمنٹ میں نئے ہیں تو address آپ کے لیے نیا ہونا چاہیے۔

ایک address ٹائپ ایتھیریم ایڈریس کو محفوظ کر سکتی ہے جو 20 بائٹس یا 160 بٹس کے برابر ہوتا ہے۔ یہ ہیکسا ڈیسیمل (hexadecimal) شکل میں واپس آتا ہے جس کے شروع میں 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. ایونٹس کا اخراج (Emitting events) (opens in a new tab)۔
  3. دوسرے کانٹریکٹس بنانا (opens in a new tab)۔
  4. selfdestruct کا استعمال۔
  5. کالز کے ذریعے ایتھر (ether) بھیجنا۔
  6. کسی ایسے فنکشن کو کال کرنا جس پر view یا pure کا نشان نہ ہو۔
  7. لو-لیول (low-level) کالز کا استعمال۔
  8. ان لائن اسمبلی (inline assembly) کا استعمال جس میں مخصوص اوپ کوڈز (opcodes) شامل ہوں۔

کنسٹرکٹر فنکشنز (Constructor functions)

constructor فنکشنز صرف ایک بار چلتے ہیں جب کانٹریکٹ پہلی بار ڈیپلائے (deploy) ہوتا ہے۔ بہت سی کلاس پر مبنی پروگرامنگ زبانوں میں constructor کی طرح، یہ فنکشنز اکثر اسٹیٹ ویری ایبلز کو ان کی مخصوص قدروں کے ساتھ شروع (initialize) کرتے ہیں۔

# Vyper کی مثال

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

بلٹ ان فنکشنز (Built-in functions)

آپ کے کانٹریکٹ میں بیان کردہ ویری ایبلز اور فنکشنز کے علاوہ، کچھ خاص بلٹ ان فنکشنز بھی ہوتے ہیں۔ سب سے واضح مثال یہ ہے:

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

یہ کانٹریکٹس کو دوسرے اکاؤنٹس میں ETH بھیجنے کی اجازت دیتے ہیں۔

فنکشنز لکھنا

آپ کے فنکشن کو درج ذیل کی ضرورت ہوتی ہے:

  • پیرامیٹر ویری ایبل اور ٹائپ (اگر یہ پیرامیٹرز قبول کرتا ہے)
  • internal/external کا اعلان
  • pure/view/payable کا اعلان
  • ریٹرنز ٹائپ (اگر یہ کوئی قدر واپس کرتا ہے)

ایک مکمل کانٹریکٹ کچھ اس طرح کا نظر آ سکتا ہے۔ یہاں constructor فنکشن dapp_name ویری ایبل کے لیے ابتدائی قدر فراہم کرتا ہے۔

ایونٹس اور لاگز

ایونٹس آپ کے اسمارٹ کانٹریکٹ کو آپ کے فرنٹ اینڈ یا دیگر سبسکرائب کرنے والی ایپلیکیشنز کے ساتھ بات چیت کرنے کے قابل بناتے ہیں۔ ایک بار جب ٹرانزیکشن کی توثیق ہو جاتی ہے اور اسے بلاک میں شامل کر دیا جاتا ہے، تو اسمارٹ کانٹریکٹس ایونٹس خارج کر سکتے ہیں اور معلومات لاگ کر سکتے ہیں، جنہیں پھر فرنٹ اینڈ پروسیس اور استعمال کر سکتا ہے۔

تشریح شدہ مثالیں

یہ Solidity میں لکھی گئی کچھ مثالیں ہیں۔ اگر آپ کوڈ کے ساتھ تجربہ کرنا چاہتے ہیں، تو آپ Remix (opens in a new tab) میں ان کے ساتھ تعامل کر سکتے ہیں۔

Hello world

Token

Unique digital asset

مزید مطالعہ

اسمارٹ کانٹریکٹس کے مزید مکمل جائزے کے لیے Solidity اور Vyper کی دستاویزات دیکھیں:

صفحہ کی آخری اپ ڈیٹ: ۱۵ اپریل، ۲۰۲۶

کیا یہ مضمون مددگار تھا؟