اسمارٹ کانٹریکٹ کی زبانیں
صفحہ کی آخری اپ ڈیٹ: 26 فروری، 2026
Ethereum کے بارے میں ایک بہترین پہلو یہ ہے کہ اسمارٹ کانٹریکٹس کو نسبتاً ڈیولپر دوست زبانوں کا استعمال کرتے ہوئے پروگرام کیا جا سکتا ہے۔ اگر آپ Python یا کسی بھی curly-bracket language (opens in a new tab) کا تجربہ رکھتے ہیں، تو آپ مانوس سنٹیکس والی زبان تلاش کر سکتے ہیں۔
دو سب سے زیادہ فعال اور زیرِ انتظام (maintained) زبانیں یہ ہیں:
- Solidity
- Vyper
Remix IDE، Solidity اور Vyper دونوں میں کانٹریکٹس بنانے اور ٹیسٹ کرنے کے لیے ایک جامع ڈیولپمنٹ ماحول فراہم کرتا ہے۔ کوڈنگ شروع کرنے کے لیے براؤزر میں موجود Remix IDE آزمائیں (opens in a new tab)۔
زیادہ تجربہ کار ڈیولپرز Yul کا استعمال بھی کر سکتے ہیں، جو Ethereum Virtual Machine کے لیے ایک درمیانی (intermediate) زبان ہے، یا Yul+، جو Yul کی ایک ایکسٹینشن ہے۔
اگر آپ متجسس ہیں اور نئی زبانوں کو ٹیسٹ کرنے میں مدد کرنا چاہتے ہیں جو ابھی تک ڈیولپمنٹ کے مراحل میں ہیں، تو آپ Fe کے ساتھ تجربہ کر سکتے ہیں، جو ایک ابھرتی ہوئی اسمارٹ کانٹریکٹ زبان ہے اور فی الحال اپنے ابتدائی مراحل میں ہے۔
پیشگی شرائط
پروگرامنگ زبانوں، خاص طور پر JavaScript یا Python کا پچھلا علم، آپ کو اسمارٹ کانٹریکٹ زبانوں میں فرق کو سمجھنے میں مدد دے سکتا ہے۔ ہم یہ بھی تجویز کرتے ہیں کہ زبانوں کے موازنے میں گہرائی تک جانے سے پہلے آپ اسمارٹ کانٹریکٹس کو بطور تصور سمجھیں۔ اسمارٹ کانٹریکٹس کا تعارف۔
Solidity
- اسمارٹ کانٹریکٹس کو نافذ کرنے کے لیے آبجیکٹ اورینٹڈ، ہائی لیول زبان۔
- کرلی بریکٹ (Curly-bracket) زبان جو C++ سے سب سے زیادہ متاثر ہے۔
- اسٹیٹیکلی ٹائپڈ (Statically typed) (ویری ایبل کی ٹائپ کمپائل ٹائم پر معلوم ہوتی ہے)۔
- سپورٹ کرتی ہے:
- انہیریٹنس (Inheritance) (آپ دوسرے کانٹریکٹس کو ایکسٹینڈ کر سکتے ہیں)۔
- لائبریریز (آپ دوبارہ استعمال کے قابل کوڈ بنا سکتے ہیں جسے آپ مختلف کانٹریکٹس سے کال کر سکتے ہیں – جیسے دیگر آبجیکٹ اورینٹڈ پروگرامنگ زبانوں میں اسٹیٹک کلاس میں اسٹیٹک فنکشنز)۔
- پیچیدہ یوزر ڈیفائنڈ ٹائپس (Complex user-defined types)۔
اہم لنکس
- ڈاکیومنٹیشن (opens in a new tab)
- Solidity لینگویج پورٹل (opens in a new tab)
- Solidity بذریعہ مثال (Solidity by Example) (opens in a new tab)
- GitHub (opens in a new tab)
- Solidity Gitter چیٹ روم (opens in a new tab) جو Solidity Matrix چیٹ روم (opens in a new tab) سے منسلک ہے
- چیٹ شیٹ (Cheat Sheet) (opens in a new tab)
- Solidity بلاگ (opens in a new tab)
- Solidity ٹوئٹر (opens in a new tab)
مثال کا کانٹریکٹ
1// SPDX-License-Identifier: GPL-3.02pragma solidity >= 0.7.0;34contract Coin {5 // لفظ "public" ویری ایبلز کو6 // دوسرے کنٹریکٹس سے قابل رسائی بناتا ہے7 address public minter;8 mapping (address => uint) public balances;910 // ایونٹس کلائنٹس کو مخصوص11 // آپ کی بیان کردہ کنٹریکٹ کی تبدیلیوں پر ردعمل ظاہر کرنے کی اجازت دیتے ہیں12 event Sent(address from, address to, uint amount);1314 // کنسٹرکٹر کوڈ صرف اسی وقت چلتا ہے جب کنٹریکٹ15 // بنایا جاتا ہے16 constructor() {17 minter = msg.sender;18 }1920 // نئے بنائے گئے کوائنز کی ایک مقدار کسی ایڈریس پر بھیجتا ہے21 // اسے صرف کنٹریکٹ بنانے والا ہی کال کر سکتا ہے22 function mint(address receiver, uint amount) public {23 require(msg.sender == minter);24 require(amount < 1e60);25 balances[receiver] += amount;26 }2728 // موجودہ کوائنز کی ایک مقدار بھیجتا ہے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
- پائتھونک (Pythonic) پروگرامنگ زبان
- اسٹرانگ ٹائپنگ (Strong typing)
- چھوٹا اور قابل فہم کمپائلر کوڈ
- موثر بائٹ کوڈ (bytecode) جنریشن
- جان بوجھ کر Solidity سے کم فیچرز رکھتی ہے تاکہ کانٹریکٹس کو زیادہ محفوظ اور آڈٹ کرنے میں آسان بنایا جا سکے۔ Vyper درج ذیل کو سپورٹ نہیں کرتی:
- موڈیفائرز (Modifiers)
- انہیریٹنس (Inheritance)
- ان لائن اسمبلی (Inline assembly)
- فنکشن اوورلوڈنگ (Function overloading)
- آپریٹر اوورلوڈنگ (Operator overloading)
- ریکرسیو کالنگ (Recursive calling)
- لامحدود لمبائی والے لوپس (Infinite-length loops)
- بائنری فکسڈ پوائنٹس (Binary fixed points)
مزید معلومات کے لیے، Vyper کا استدلال (rationale) پڑھیں (opens in a new tab)۔
اہم لنکس
- ڈاکیومنٹیشن (opens in a new tab)
- Vyper بذریعہ مثال (Vyper by Example) (opens in a new tab)
- مزید Vyper بذریعہ مثال (opens in a new tab)
- GitHub (opens in a new tab)
- Vyper کمیونٹی Discord چیٹ (opens in a new tab)
- چیٹ شیٹ (Cheat Sheet) (opens in a new tab)
- Vyper کے لیے اسمارٹ کانٹریکٹ ڈیولپمنٹ فریم ورکس اور ٹولز
- VyperPunk - Vyper اسمارٹ کانٹریکٹس کو محفوظ بنانا اور ہیک کرنا سیکھیں (opens in a new tab)
- ڈیولپمنٹ کے لیے Vyper Hub (opens in a new tab)
- Vyper کی بہترین اسمارٹ کانٹریکٹ مثالیں (opens in a new tab)
- Awesome Vyper کے منتخب کردہ وسائل (opens in a new tab)
مثال
1# کھلی نیلامی23# نیلامی کے پیرامیٹرز4# فائدہ اٹھانے والے کو سب سے بڑی بولی لگانے والے سے رقم ملتی ہے5beneficiary: public(address)6auctionStart: public(uint256)7auctionEnd: public(uint256)89# نیلامی کی موجودہ حالت10highestBidder: public(address)11highestBid: public(uint256)1213# آخر میں true پر سیٹ کیا جاتا ہے، کسی بھی تبدیلی کی اجازت نہیں دیتا14ended: public(bool)1516# واپس کی گئی بولیوں کا ریکارڈ رکھیں تاکہ ہم ودڈرا (withdraw) پیٹرن کی پیروی کر سکیں17pendingReturns: public(HashMap[address, uint256])1819# `_bidding_time` کے ساتھ ایک سادہ نیلامی بنائیں20# سیکنڈز کی بولی کا وقت، جس کی طرف سے21# فائدہ اٹھانے والے کا ایڈریس `_beneficiary` ہے۔22@external23def __init__(_beneficiary: address, _bidding_time: uint256):24 self.beneficiary = _beneficiary25 self.auctionStart = block.timestamp26 self.auctionEnd = self.auctionStart + _bidding_time2728# بھیجی گئی ویلیو کے ساتھ نیلامی میں بولی لگائیں29# جو اس ٹرانزیکشن کے ساتھ ہے۔30# ویلیو صرف اسی صورت میں واپس کی جائے گی اگر31# نیلامی نہیں جیتی جاتی۔32@external33@payable34def bid():35 # چیک کریں کہ کیا بولی کا وقت ختم ہو گیا ہے۔36 assert block.timestamp < self.auctionEnd37 # چیک کریں کہ کیا بولی کافی زیادہ ہے38 assert msg.value > self.highestBid39 # پچھلے سب سے بڑے بولی دہندہ کے ریفنڈ کا ریکارڈ رکھیں40 self.pendingReturns[self.highestBidder] += self.highestBid41 # نئی سب سے بڑی بولی کا ریکارڈ رکھیں42 self.highestBidder = msg.sender43 self.highestBid = msg.value4445# پہلے سے ریفنڈ کی گئی بولی نکلوائیں۔ یہاں ودڈرا (withdraw) پیٹرن46# سیکیورٹی کے مسئلے سے بچنے کے لیے استعمال کیا گیا ہے۔ اگر ریفنڈز براہ راست47# bid() کے حصے کے طور پر بھیجے جاتے، تو ایک نقصان دہ بڈنگ کنٹریکٹ ان ریفنڈز کو روک سکتا تھا48# اور اس طرح نئی بڑی بولیوں کو آنے سے روک سکتا تھا۔49@external50def withdraw():51 pending_amount: uint256 = self.pendingReturns[msg.sender]52 self.pendingReturns[msg.sender] = 053 send(msg.sender, pending_amount)5455# نیلامی ختم کریں اور سب سے بڑی بولی56# فائدہ اٹھانے والے کو بھیجیں۔57@external58def endAuction():59 # یہ ایک اچھی گائیڈ لائن ہے کہ ان فنکشنز کو اسٹرکچر کیا جائے جو60 # دوسرے کنٹریکٹس کے ساتھ تعامل کرتے ہیں (یعنی وہ فنکشنز کال کرتے ہیں یا ایتھر بھیجتے ہیں)61 # تین مراحل میں:62 # 1. شرائط چیک کرنا63 # 2. ایکشنز پرفارم کرنا (ممکنہ طور پر شرائط کو تبدیل کرنا)64 # 3. دوسرے کنٹریکٹس کے ساتھ تعامل کرنا65 # اگر ان مراحل کو ملا دیا جائے، تو دوسرا کنٹریکٹ واپس66 # موجودہ کنٹریکٹ کو کال کر سکتا ہے اور اسٹیٹ کو تبدیل کر سکتا ہے یا67 # اثرات (ایتھر کی ادائیگی) کو کئی بار پرفارم کرنے کا سبب بن سکتا ہے۔68 # اگر اندرونی طور پر کال کیے گئے فنکشنز میں بیرونی کنٹریکٹس کے ساتھ69 # تعامل شامل ہے، تو انہیں بھی بیرونی کنٹریکٹس کے ساتھ70 # تعامل سمجھا جانا چاہیے۔7172 # 1. شرائط73 # چیک کریں کہ کیا نیلامی کے ختم ہونے کا وقت آ گیا ہے74 assert block.timestamp >= self.auctionEnd75 # چیک کریں کہ کیا یہ فنکشن پہلے ہی کال کیا جا چکا ہے76 assert not self.ended7778 # 2. اثرات79 self.ended = True8081 # 3. تعامل82 send(self.beneficiary, self.highestBid)سب دکھائیںیہ مثال آپ کو اندازہ دے گی کہ Vyper کانٹریکٹ کا سنٹیکس کیسا ہوتا ہے۔ فنکشنز اور ویری ایبلز کی مزید تفصیلی وضاحت کے لیے، ڈاکیومنٹیشن دیکھیں (opens in a new tab)۔
Yul اور Yul+
اگر آپ Ethereum میں نئے ہیں اور ابھی تک اسمارٹ کانٹریکٹ زبانوں کے ساتھ کوئی کوڈنگ نہیں کی ہے، تو ہم تجویز کرتے ہیں کہ Solidity یا Vyper سے شروعات کریں۔ Yul یا Yul+ کو تب ہی دیکھیں جب آپ اسمارٹ کانٹریکٹ سیکیورٹی کی بہترین پریکٹسز اور EVM کے ساتھ کام کرنے کی خصوصیات سے واقف ہو جائیں۔
Yul
- Ethereum کے لیے درمیانی (Intermediate) زبان۔
- EVM اور Ewasm (opens in a new tab) (جو کہ Ethereum فلیورڈ WebAssembly ہے) کو سپورٹ کرتی ہے، اور اسے دونوں پلیٹ فارمز کے قابل استعمال مشترکہ ڈینومینیٹر (common denominator) کے طور پر ڈیزائن کیا گیا ہے۔
- ہائی لیول آپٹیمائزیشن کے مراحل کے لیے ایک اچھا ہدف ہے جو EVM اور Ewasm دونوں پلیٹ فارمز کو یکساں فائدہ پہنچا سکتا ہے۔
Yul+
- Yul کی ایک لو لیول (low-level)، انتہائی موثر ایکسٹینشن۔
- ابتدائی طور پر ایک optimistic rollup کانٹریکٹ کے لیے ڈیزائن کی گئی تھی۔
- Yul+ کو Yul کے لیے ایک تجرباتی اپ گریڈ تجویز کے طور پر دیکھا جا سکتا ہے، جو اس میں نئے فیچرز کا اضافہ کرتی ہے۔
اہم لنکس
- Yul ڈاکیومنٹیشن (opens in a new tab)
- Yul+ ڈاکیومنٹیشن (opens in a new tab)
- Yul+ تعارفی پوسٹ (opens in a new tab)
مثال کا کانٹریکٹ
درج ذیل سادہ مثال ایک پاور فنکشن کو نافذ کرتی ہے۔ اسے solc --strict-assembly --bin input.yul کا استعمال کرتے ہوئے کمپائل کیا جا سکتا ہے۔ اس مثال کو input.yul فائل میں اسٹور کیا جانا چاہیے۔
1{2 function power(base, exponent) -> result3 {4 switch exponent5 case 0 { result := 1 }6 case 1 { result := base }7 default8 {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
- Ethereum Virtual Machine (EVM) کے لیے اسٹیٹیکلی ٹائپڈ (Statically typed) زبان۔
- Python اور Rust سے متاثر۔
- اس کا مقصد سیکھنے میں آسان ہونا ہے -- یہاں تک کہ ان ڈیولپرز کے لیے بھی جو Ethereum ایکو سسٹم میں نئے ہیں۔
- Fe کی ڈیولپمنٹ ابھی اپنے ابتدائی مراحل میں ہے، اس زبان کا الفا (alpha) ریلیز جنوری 2021 میں ہوا تھا۔
اہم لنکس
- GitHub (opens in a new tab)
- Fe کا اعلان (opens in a new tab)
- Fe کا 2021 روڈ میپ (opens in a new tab)
- Fe Discord چیٹ (opens in a new tab)
- Fe ٹوئٹر (opens in a new tab)
مثال کا کانٹریکٹ
ذیل میں Fe میں نافذ کیا گیا ایک سادہ کانٹریکٹ ہے۔
1type BookMsg = bytes[100]23contract GuestBook:4 pub guest_book: map<address, BookMsg>56 event Signed:7 book_msg: BookMsg89 pub def sign(book_msg: BookMsg):10 self.guest_book[msg.sender] = book_msg1112 emit Signed(book_msg=book_msg)1314 pub def get_msg(addr: address) -> BookMsg:15 return self.guest_book[addr].to_mem()16سب دکھائیںانتخاب کیسے کریں
کسی بھی دوسری پروگرامنگ زبان کی طرح، یہ زیادہ تر صحیح کام کے لیے صحیح ٹول کے انتخاب کے ساتھ ساتھ ذاتی ترجیحات کے بارے میں ہے۔
اگر آپ نے ابھی تک کسی بھی زبان کو نہیں آزمایا ہے تو یہاں چند چیزوں پر غور کرنا چاہیے:
Solidity کے بارے میں کیا بہترین ہے؟
- اگر آپ ابتدائی (beginner) ہیں، تو وہاں بہت سے ٹیوٹوریلز اور سیکھنے کے ٹولز موجود ہیں۔ اس کے بارے میں مزید کوڈنگ کے ذریعے سیکھیں سیکشن میں دیکھیں۔
- اچھے ڈیولپر ٹولز دستیاب ہیں۔
- Solidity کی ایک بڑی ڈیولپر کمیونٹی ہے، جس کا مطلب ہے کہ آپ کو اپنے سوالات کے جوابات بہت جلد ملنے کا امکان ہے۔
Vyper کے بارے میں کیا بہترین ہے؟
- Python ڈیولپرز کے لیے شروعات کرنے کا بہترین طریقہ جو اسمارٹ کانٹریکٹس لکھنا چاہتے ہیں۔
- Vyper میں فیچرز کی تعداد کم ہے جو اسے آئیڈیاز کی فوری پروٹو ٹائپنگ (prototyping) کے لیے بہترین بناتی ہے۔
- Vyper کا مقصد آڈٹ کرنے میں آسان اور زیادہ سے زیادہ انسانوں کے پڑھنے کے قابل (human-readable) ہونا ہے۔
Yul اور Yul+ کے بارے میں کیا بہترین ہے؟
- سادہ اور فنکشنل لو لیول (low-level) زبان۔
- خام EVM کے بہت قریب جانے کی اجازت دیتی ہے، جو آپ کے کانٹریکٹس کے گیس کے استعمال کو بہتر (optimize) بنانے میں مدد کر سکتی ہے۔
زبانوں کا موازنہ
بنیادی سنٹیکس، کانٹریکٹ لائف سائیکل، انٹرفیسز، آپریٹرز، ڈیٹا اسٹرکچرز، فنکشنز، کنٹرول فلو، اور مزید کے موازنے کے لیے Auditless کی یہ چیٹ شیٹ (cheatsheet) (opens in a new tab) دیکھیں۔