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

اسمارٹ کانٹریکٹ سیکیورٹی گائیڈ لائنز

Solidity
اسمارٹ کانٹریکٹس
سیکیورٹی
درمیانی
ٹریل آف بٹس
۶ ستمبر، ۲۰۲۰
6 منٹ کی پڑھائی

زیادہ محفوظ اسمارٹ کانٹریکٹس بنانے کے لیے ان اعلیٰ سطحی سفارشات پر عمل کریں۔

ڈیزائن گائیڈ لائنز

کوڈ کی کوئی بھی لائن لکھنے سے پہلے، کانٹریکٹ کے ڈیزائن پر پہلے سے تبادلہ خیال کیا جانا چاہیے۔

دستاویزات اور تصریحات

دستاویزات مختلف سطحوں پر لکھی جا سکتی ہیں، اور کانٹریکٹس کو نافذ کرتے وقت انہیں اپ ڈیٹ کیا جانا چاہیے:

  • سسٹم کی سادہ الفاظ میں تفصیل، جس میں یہ بیان کیا گیا ہو کہ کانٹریکٹس کیا کرتے ہیں اور کوڈ بیس کے حوالے سے کیا مفروضات ہیں۔
  • اسکیما اور آرکیٹیکچرل ڈائیگرامز، بشمول کانٹریکٹ کے تعاملات اور سسٹم کی اسٹیٹ مشین۔ Slither printers (opens in a new tab) ان اسکیماز کو بنانے میں مدد کر سکتے ہیں۔
  • کوڈ کی مکمل دستاویزات، Solidity کے لیے Natspec format (opens in a new tab) استعمال کیا جا سکتا ہے۔

آن چین بمقابلہ آف چین کمپیوٹیشن

  • جتنا ممکن ہو سکے کوڈ کو آف چین رکھیں۔ آن چین لیئر کو چھوٹا رکھیں۔ ڈیٹا کو آف چین کوڈ کے ساتھ اس طرح پری پروسیس کریں کہ آن چین تصدیق آسان ہو۔ کیا آپ کو ایک ترتیب وار فہرست کی ضرورت ہے؟ فہرست کو آف چین ترتیب دیں، پھر صرف آن چین اس کی ترتیب چیک کریں۔

اپ گریڈ ایبلٹی

ہم نے اپنی بلاگ پوسٹ (opens in a new tab) میں اپ گریڈ ایبلٹی کے مختلف حلوں پر تبادلہ خیال کیا ہے۔ کوئی بھی کوڈ لکھنے سے پہلے اپ گریڈ ایبلٹی کو سپورٹ کرنے یا نہ کرنے کا شعوری انتخاب کریں۔ یہ فیصلہ اس بات پر اثر انداز ہوگا کہ آپ اپنے کوڈ کا اسٹرکچر کیسے بناتے ہیں۔ عام طور پر، ہم تجویز کرتے ہیں:

  • اپ گریڈ ایبلٹی پر کانٹریکٹ مائیگریشن (opens in a new tab) کو ترجیح دیں۔ مائیگریشن سسٹمز کے بہت سے وہی فوائد ہیں جو اپ گریڈ ایبل سسٹمز کے ہیں، لیکن ان کی خامیوں کے بغیر۔
  • delegatecallproxy پیٹرن پر ڈیٹا سیپریشن پیٹرن کا استعمال کریں۔ اگر آپ کے پروجیکٹ میں واضح ایبسٹریکشن سیپریشن ہے، تو ڈیٹا سیپریشن کا استعمال کرتے ہوئے اپ گریڈ ایبلٹی کے لیے صرف چند ایڈجسٹمنٹس کی ضرورت ہوگی۔ delegatecallproxy کے لیے EVM کی مہارت درکار ہوتی ہے اور اس میں غلطی کا امکان بہت زیادہ ہوتا ہے۔
  • ڈپلائمنٹ سے پہلے مائیگریشن/اپ گریڈ کے طریقہ کار کو دستاویزی شکل دیں۔ اگر آپ کو بغیر کسی گائیڈ لائنز کے دباؤ میں ردعمل ظاہر کرنا پڑا، تو آپ غلطیاں کریں گے۔ عمل کرنے کا طریقہ کار پہلے سے لکھ لیں۔ اس میں شامل ہونا چاہیے:
    • وہ کالز جو نئے کانٹریکٹس شروع کرتی ہیں
    • کیز (keys) کہاں محفوظ ہیں اور ان تک کیسے رسائی حاصل کی جائے
    • ڈپلائمنٹ کو کیسے چیک کریں! پوسٹ ڈپلائمنٹ اسکرپٹ تیار کریں اور ٹیسٹ کریں۔

نفاذ کی گائیڈ لائنز

سادگی کی کوشش کریں۔ ہمیشہ وہ آسان ترین حل استعمال کریں جو آپ کے مقصد کے مطابق ہو۔ آپ کی ٹیم کا کوئی بھی رکن آپ کے حل کو سمجھنے کے قابل ہونا چاہیے۔

فنکشن کمپوزیشن

آپ کے کوڈ بیس کا آرکیٹیکچر ایسا ہونا چاہیے کہ آپ کے کوڈ کا جائزہ لینا آسان ہو۔ ایسے آرکیٹیکچرل انتخاب سے گریز کریں جو اس کی درستگی کے بارے میں استدلال کرنے کی صلاحیت کو کم کرتے ہوں۔

  • اپنے سسٹم کی لاجک کو تقسیم کریں، یا تو متعدد کانٹریکٹس کے ذریعے یا ملتے جلتے فنکشنز کو ایک ساتھ گروپ کر کے (مثال کے طور پر، تصدیق، ریاضی، ...)۔
  • واضح مقصد کے ساتھ چھوٹے فنکشنز لکھیں۔ اس سے جائزے میں آسانی ہوگی اور انفرادی اجزاء کی ٹیسٹنگ کی اجازت ملے گی۔

وراثت (Inheritance)

  • وراثت کو قابل انتظام رکھیں۔ وراثت کا استعمال لاجک کو تقسیم کرنے کے لیے کیا جانا چاہیے، تاہم، آپ کے پروجیکٹ کا مقصد وراثت کے ٹری (tree) کی گہرائی اور چوڑائی کو کم سے کم کرنا ہونا چاہیے۔
  • کانٹریکٹس کی درجہ بندی چیک کرنے کے لیے Slither کا inheritance printer (opens in a new tab) استعمال کریں۔ inheritance printer آپ کو درجہ بندی کے سائز کا جائزہ لینے میں مدد کرے گا۔

ایونٹس

  • تمام اہم آپریشنز کو لاگ کریں۔ ایونٹس ڈیولپمنٹ کے دوران کانٹریکٹ کو ڈیبگ کرنے اور ڈپلائمنٹ کے بعد اس کی نگرانی کرنے میں مدد کریں گے۔

معلوم خامیوں سے بچیں

انحصار (Dependencies)

  • اچھی طرح سے ٹیسٹ کی گئی لائبریریاں استعمال کریں۔ اچھی طرح سے ٹیسٹ کی گئی لائبریریوں سے کوڈ امپورٹ کرنے سے آپ کے بگی (buggy) کوڈ لکھنے کا امکان کم ہو جائے گا۔ اگر آپ ERC20 کانٹریکٹ لکھنا چاہتے ہیں، تو OpenZeppelin (opens in a new tab) استعمال کریں۔
  • ڈیپینڈینسی مینیجر استعمال کریں؛ کوڈ کاپی پیسٹ کرنے سے گریز کریں۔ اگر آپ کسی بیرونی ذریعہ پر انحصار کرتے ہیں، تو آپ کو اسے اصل ذریعہ کے ساتھ اپ ٹو ڈیٹ رکھنا چاہیے۔

ٹیسٹنگ اور تصدیق

  • مکمل یونٹ ٹیسٹ لکھیں۔ اعلیٰ معیار کا سافٹ ویئر بنانے کے لیے ایک وسیع ٹیسٹ سویٹ بہت ضروری ہے۔
  • Slither (opens in a new tab)، Echidna (opens in a new tab) اور Manticore (opens in a new tab) کسٹم چیکس اور پراپرٹیز لکھیں۔ خودکار ٹولز یہ یقینی بنانے میں مدد کریں گے کہ آپ کا کانٹریکٹ محفوظ ہے۔ موثر چیکس اور پراپرٹیز لکھنے کا طریقہ سیکھنے کے لیے اس گائیڈ کے باقی حصے کا جائزہ لیں۔
  • crytic.io (opens in a new tab) استعمال کریں۔ Crytic گٹ ہب (GitHub) کے ساتھ مربوط ہوتا ہے، نجی Slither ڈیٹیکٹرز تک رسائی فراہم کرتا ہے، اور Echidna سے کسٹم پراپرٹی چیکس چلاتا ہے۔

Solidity

  • 0.4 اور 0.6 کے مقابلے میں Solidity 0.5 کو ترجیح دیں۔ ہماری رائے میں، Solidity 0.5 زیادہ محفوظ ہے اور اس میں 0.4 سے بہتر بلٹ ان پریکٹسز ہیں۔ Solidity 0.6 پروڈکشن کے لیے بہت غیر مستحکم ثابت ہوئی ہے اور اسے پختہ ہونے کے لیے وقت درکار ہے۔
  • کمپائل کرنے کے لیے ایک مستحکم ریلیز استعمال کریں؛ وارننگز چیک کرنے کے لیے تازہ ترین ریلیز استعمال کریں۔ چیک کریں کہ آپ کے کوڈ میں تازہ ترین کمپائلر ورژن کے ساتھ کوئی رپورٹ شدہ مسائل نہیں ہیں۔ تاہم، Solidity کا ریلیز سائیکل تیز ہے اور اس میں کمپائلر بگز کی تاریخ ہے، اس لیے ہم ڈپلائمنٹ کے لیے تازہ ترین ورژن کی سفارش نہیں کرتے ہیں (دیکھیں Slither کی solc version recommendation (opens in a new tab)
  • ان لائن اسمبلی (inline assembly) استعمال نہ کریں۔ اسمبلی کے لیے EVM کی مہارت درکار ہوتی ہے۔ اگر آپ نے یلو پیپر (yellow paper) میں مہارت حاصل نہیں کی ہے تو EVM کوڈ نہ لکھیں۔

ڈپلائمنٹ گائیڈ لائنز

ایک بار جب کانٹریکٹ تیار اور ڈپلائے ہو جائے:

  • اپنے کانٹریکٹس کی نگرانی کریں۔ لاگز دیکھیں، اور کانٹریکٹ یا والیٹ کے سمجھوتے (کمپرومائز) کی صورت میں ردعمل ظاہر کرنے کے لیے تیار رہیں۔
  • اپنی رابطہ کی معلومات blockchain-security-contacts (opens in a new tab) میں شامل کریں۔ اگر کوئی سیکیورٹی خامی دریافت ہوتی ہے تو یہ فہرست فریق ثالث کو آپ سے رابطہ کرنے میں مدد کرتی ہے۔
  • مراعات یافتہ صارفین کے والیٹس کو محفوظ بنائیں۔ اگر آپ ہارڈویئر والیٹس میں کیز (keys) محفوظ کرتے ہیں تو ہماری بہترین پریکٹسز (opens in a new tab) پر عمل کریں۔
  • واقعے پر ردعمل کا منصوبہ (response to incident plan) رکھیں۔ اس بات پر غور کریں کہ آپ کے اسمارٹ کانٹریکٹس کمپرومائز ہو سکتے ہیں۔ یہاں تک کہ اگر آپ کے کانٹریکٹس بگز سے پاک ہیں، تب بھی ایک حملہ آور کانٹریکٹ کے مالک کی کیز (keys) کا کنٹرول سنبھال سکتا ہے۔

صفحہ کی آخری اپ ڈیٹ: ۳ مارچ، ۲۰۲۶

کیا یہ ٹیوٹوریل مددگار تھا؟