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

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

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

پیشگی شرائط

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

ڈیٹا

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

سٹوریج

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

// Solidity کی مثال
contract SimpleStorage {
    uint storedData; // حالت کا متغیر
    // ...
}
# Vyper کی مثال
storedData: int128

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

ایک address قسم ایک ایتھیریم پتہ رکھ سکتی ہے جو 20 bytes یا 160 bits کے برابر ہوتا ہے۔ یہ ہیکسا ڈیسیمل (hexadecimal) شکل میں واپس آتا ہے جس کے شروع میں 0x ہوتا ہے۔

دیگر اقسام میں شامل ہیں:

  • بولین (boolean)
  • انٹیجر (integer)
  • فکسڈ پوائنٹ نمبرز (fixed point numbers)
  • فکسڈ سائز بائٹ ایریز (fixed-size byte arrays)
  • ڈائنیمکلی سائزڈ بائٹ ایریز (dynamically sized byte arrays)
  • ریشنل اور انٹیجر لٹرلز (rational and integer literals)
  • سٹرنگ لٹرلز (string literals)
  • ہیکسا ڈیسیمل لٹرلز (hexadecimal literals)
  • اینمز (enums)

مزید وضاحت کے لیے، دستاویزات پر ایک نظر ڈالیں:

میموری

وہ اقدار جو صرف کنٹریکٹ فنکشن کے عمل درآمد کی مدت کے لیے محفوظ کی جاتی ہیں، میموری متغیرات (memory variables) کہلاتی ہیں۔ چونکہ یہ بلاک چین پر مستقل طور پر محفوظ نہیں ہوتیں، اس لیے ان کا استعمال بہت سستا ہوتا ہے۔

اس بارے میں مزید جانیں کہ EVM ڈیٹا کیسے محفوظ کرتا ہے (سٹوریج، میموری، اور سٹیک) Solidity کی دستاویزات (opens in a new tab) میں۔

ماحولیاتی متغیرات (Environment variables)

آپ کے کنٹریکٹ پر بیان کردہ متغیرات کے علاوہ، کچھ خاص عالمی متغیرات (global variables) بھی ہوتے ہیں۔ یہ بنیادی طور پر بلاک چین یا موجودہ ٹرانزیکشن کے بارے میں معلومات فراہم کرنے کے لیے استعمال ہوتے ہیں۔

مثالیں:

خصوصیت (Prop)حالت کا متغیر (State variable)تفصیل
block.timestampuint256موجودہ بلاک کے دور (epoch) کا ٹائم سٹیمپ
msg.senderپتہپیغام بھیجنے والا (موجودہ کال)

فنکشنز

انتہائی سادہ الفاظ میں، فنکشنز آنے والی ٹرانزیکشنز کے جواب میں معلومات حاصل کر سکتے ہیں یا معلومات سیٹ کر سکتے ہیں۔

فنکشن کالز کی دو اقسام ہیں:

  • internal – یہ EVM کال نہیں بناتے
    • اندرونی فنکشنز اور حالت کے متغیرات تک صرف اندرونی طور پر رسائی حاصل کی جا سکتی ہے (یعنی موجودہ کنٹریکٹ یا اس سے اخذ کردہ کنٹریکٹس کے اندر سے)
  • external – یہ EVM کال بناتے ہیں
    • بیرونی فنکشنز کنٹریکٹ انٹرفیس کا حصہ ہوتے ہیں، جس کا مطلب ہے کہ انہیں دوسرے کنٹریکٹس سے اور ٹرانزیکشنز کے ذریعے کال کیا جا سکتا ہے۔ ایک بیرونی فنکشن f کو اندرونی طور پر کال نہیں کیا جا سکتا (یعنی f() کام نہیں کرتا، لیکن this.f() کام کرتا ہے)۔

یہ public یا private بھی ہو سکتے ہیں

  • public فنکشنز کو کنٹریکٹ کے اندر سے اندرونی طور پر یا پیغامات کے ذریعے بیرونی طور پر کال کیا جا سکتا ہے
  • private فنکشنز صرف اسی کنٹریکٹ کے لیے نظر آتے ہیں جس میں ان کی تعریف کی گئی ہو اور اخذ کردہ کنٹریکٹس میں نہیں

فنکشنز اور حالت کے متغیرات دونوں کو پبلک یا پرائیویٹ بنایا جا سکتا ہے

یہاں ایک کنٹریکٹ پر حالت کے متغیر کو اپ ڈیٹ کرنے کے لیے ایک فنکشن ہے:

// 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. لو لیول (low-level) کالز کا استعمال۔
  8. ان لائن اسمبلی (inline assembly) کا استعمال جس میں مخصوص اوپ کوڈز (opcodes) شامل ہوں۔

کنسٹرکٹر فنکشنز

constructor فنکشنز صرف ایک بار عمل میں آتے ہیں جب کنٹریکٹ پہلی بار تعینات کیا جاتا ہے۔ بہت سی کلاس پر مبنی پروگرامنگ زبانوں میں 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)

ٹوکن

منفرد ڈیجیٹل اثاثہ

مزید مطالعہ

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