EIP-1271: اسمارٹ کانٹریکٹ سگنیچرز پر دستخط کرنا اور ان کی تصدیق کرنا
EIP-1271 (opens in a new tab) اسٹینڈرڈ اسمارٹ کانٹریکٹس کو سگنیچرز کی تصدیق کرنے کی اجازت دیتا ہے۔
اس ٹیوٹوریل میں، ہم ڈیجیٹل سگنیچرز، EIP-1271 کے پس منظر، اور Safe (opens in a new tab) (پہلے Gnosis Safe) کے ذریعے استعمال ہونے والی EIP-1271 کی مخصوص عمل آوری (implementation) کا جائزہ لیتے ہیں۔ مجموعی طور پر، یہ آپ کے اپنے کانٹریکٹس میں EIP-1271 کو نافذ کرنے کے لیے ایک نقطہ آغاز کے طور پر کام کر سکتا ہے۔
سگنیچر کیا ہے؟
اس تناظر میں، ایک سگنیچر (زیادہ واضح طور پر، ایک "ڈیجیٹل سگنیچر") ایک پیغام اور اس بات کا کسی قسم کا ثبوت ہے کہ پیغام کسی مخصوص شخص/بھیجنے والے/ایڈریس کی طرف سے آیا ہے۔
مثال کے طور پر، ایک ڈیجیٹل سگنیچر کچھ اس طرح کا ہو سکتا ہے:
- پیغام: "میں اپنے ایتھیریم (Ethereum) والیٹ کے ساتھ اس ویب سائٹ پر لاگ ان کرنا چاہتا ہوں۔"
- دستخط کنندہ: میرا ایڈریس
0x000…ہے - ثبوت: یہاں کچھ ثبوت ہے کہ میں نے،
0x000…، دراصل یہ پورا پیغام بنایا ہے (یہ عام طور پر کچھ کرپٹوگرافک ہوتا ہے)۔
یہ نوٹ کرنا ضروری ہے کہ ڈیجیٹل سگنیچر میں "پیغام" اور "سگنیچر" دونوں شامل ہوتے ہیں۔
کیوں؟ مثال کے طور پر، اگر آپ نے مجھے دستخط کرنے کے لیے کوئی کانٹریکٹ دیا، اور پھر میں نے سگنیچر والا صفحہ کاٹ دیا اور باقی کانٹریکٹ کے بغیر صرف اپنے سگنیچرز آپ کو واپس کر دیے، تو کانٹریکٹ درست نہیں ہوگا۔
اسی طرح، ایک منسلک پیغام کے بغیر ڈیجیٹل سگنیچر کا کوئی مطلب نہیں ہے!
EIP-1271 کیوں موجود ہے؟
Ethereum پر مبنی بلاک چینز پر استعمال کے لیے ڈیجیٹل سگنیچر بنانے کے لیے، آپ کو عام طور پر ایک خفیہ پرائیویٹ کی (private key) کی ضرورت ہوتی ہے جسے کوئی اور نہیں جانتا۔ یہی چیز آپ کے سگنیچر کو آپ کا بناتی ہے (خفیہ کی کے علم کے بغیر کوئی اور ایسا سگنیچر نہیں بنا سکتا)۔
آپ کے Ethereum اکاؤنٹ (یعنی آپ کا externally-owned account/EOA) کے ساتھ ایک پرائیویٹ کی منسلک ہوتی ہے، اور یہ وہ پرائیویٹ کی ہے جو عام طور پر اس وقت استعمال ہوتی ہے جب کوئی ویب سائٹ یا ڈیپ (dapp) آپ سے سگنیچر مانگتی ہے (مثلاً، "Log in with Ethereum" کے لیے)۔
ایک ایپ آپ کے بنائے ہوئے سگنیچر کی تصدیق کر سکتی ہے (opens in a new tab) جو آپ ethers.js جیسی تھرڈ پارٹی لائبریری کا استعمال کرتے ہوئے بناتے ہیں آپ کی پرائیویٹ کی جانے بغیر (opens in a new tab) اور اسے یقین ہو سکتا ہے کہ آپ ہی وہ شخص تھے جس نے سگنیچر بنایا تھا۔
درحقیقت، چونکہ EOA ڈیجیٹل سگنیچرز پبلک-کی (public-key) کرپٹوگرافی کا استعمال کرتے ہیں، اس لیے انہیں آف چین (offchain) بنایا اور تصدیق کیا جا سکتا ہے! گیس لیس (gasless) DAO ووٹنگ اسی طرح کام کرتی ہے — آن چین (onchain) ووٹ جمع کرانے کے بجائے، کرپٹوگرافک لائبریریوں کا استعمال کرتے ہوئے آف چین ڈیجیٹل سگنیچرز بنائے اور تصدیق کیے جا سکتے ہیں۔
اگرچہ EOA اکاؤنٹس میں پرائیویٹ کی ہوتی ہے، لیکن اسمارٹ کانٹریکٹ اکاؤنٹس میں کسی قسم کی پرائیویٹ یا خفیہ کی نہیں ہوتی ہے (لہذا "Log in with Ethereum" وغیرہ اسمارٹ کانٹریکٹ اکاؤنٹس کے ساتھ مقامی طور پر کام نہیں کر سکتے)۔
وہ مسئلہ جسے EIP-1271 حل کرنے کا ارادہ رکھتا ہے: ہم کیسے بتا سکتے ہیں کہ اسمارٹ کانٹریکٹ کا سگنیچر درست ہے اگر اسمارٹ کانٹریکٹ میں کوئی "خفیہ" چیز نہیں ہے جسے وہ سگنیچر میں شامل کر سکے؟
EIP-1271 کیسے کام کرتا ہے؟
اسمارٹ کانٹریکٹس میں پرائیویٹ کیز نہیں ہوتیں جنہیں پیغامات پر دستخط کرنے کے لیے استعمال کیا جا سکے۔ تو ہم کیسے بتا سکتے ہیں کہ آیا کوئی سگنیچر مستند ہے؟
ٹھیک ہے، ایک خیال یہ ہے کہ ہم صرف اسمارٹ کانٹریکٹ سے پوچھ سکتے ہیں کہ آیا کوئی سگنیچر مستند ہے!
EIP-1271 جو کرتا ہے وہ اسمارٹ کانٹریکٹ سے "پوچھنے" کے اس خیال کو معیاری بناتا ہے کہ آیا دیا گیا سگنیچر درست ہے۔
ایک کانٹریکٹ جو EIP-1271 کو نافذ کرتا ہے اس میں isValidSignature نامی ایک فنکشن ہونا چاہیے جو ایک پیغام اور ایک سگنیچر لیتا ہے۔ اس کے بعد کانٹریکٹ کچھ توثیقی منطق (validation logic) چلا سکتا ہے (اسپیک یہاں کسی خاص چیز کو نافذ نہیں کرتا ہے) اور پھر ایک ویلیو واپس کر سکتا ہے جو یہ ظاہر کرتی ہے کہ آیا سگنیچر درست ہے یا نہیں۔
اگر isValidSignature ایک درست نتیجہ واپس کرتا ہے، تو اس کا مطلب یہ ہے کہ کانٹریکٹ کہہ رہا ہے "ہاں، میں اس سگنیچر + پیغام کو منظور کرتا ہوں!"
انٹرفیس (Interface)
یہاں EIP-1271 اسپیک میں بالکل وہی انٹرفیس ہے (ہم ذیل میں _hash پیرامیٹر کے بارے میں بات کریں گے، لیکن ابھی کے لیے، اسے وہ پیغام سمجھیں جس کی تصدیق کی جا رہی ہے):
1pragma solidity ^0.5.0;2
3contract ERC1271 {4
5 // bytes4(keccak256("isValidSignature(bytes32,bytes)")6 bytes4 constant internal MAGICVALUE = 0x1626ba7e;7
8 /* *9 * @dev اسے واپس کرنا چاہیے کہ آیا فراہم کردہ دستخط فراہم کردہ ہیش کے لیے درست ہے یا نہیں10 * @param _hash سائن کیے جانے والے ڈیٹا کا ہیش11 * @param _signature دستخط کا بائٹ ایرے جو _hash سے منسلک ہے12 *13 * فنکشن پاس ہونے پر اسے لازمی طور پر bytes4 میجک ویلیو 0x1626ba7e واپس کرنی چاہیے۔14 * اسے اسٹیٹ (state) کو تبدیل نہیں کرنا چاہیے (solc < 0.5 کے لیے STATICCALL کا استعمال، solc > 0.5 کے لیے view موڈیفائر)15 * اسے بیرونی کالز (external calls) کی اجازت لازمی دینی چاہیے */16 function isValidSignature(17 bytes32 _hash,18 bytes memory _signature)19 public20 view21 returns (bytes4 magicValue);22}EIP-1271 عمل آوری کی مثال: Safe
کانٹریکٹس isValidSignature کو کئی طریقوں سے نافذ کر سکتے ہیں — اسپیک قطعی عمل آوری کے بارے میں زیادہ کچھ نہیں کہتا ہے۔
ایک قابل ذکر کانٹریکٹ جو EIP-1271 کو نافذ کرتا ہے وہ Safe (پہلے Gnosis Safe) ہے۔
Safe کے کوڈ میں، isValidSignature کو اس طرح نافذ کیا گیا ہے (opens in a new tab) کہ سگنیچرز کو دو طریقوں (opens in a new tab) سے بنایا اور تصدیق کیا جا سکتا ہے:
- آن چین (Onchain) پیغامات
- تخلیق: ایک safe کا مالک پیغام پر "دستخط" کرنے کے لیے ایک نیا safe ٹرانزیکشن بناتا ہے، اور پیغام کو ڈیٹا کے طور پر ٹرانزیکشن میں پاس کرتا ہے۔ ایک بار جب کافی مالکان ملٹی سگ (multisig) کی حد تک پہنچنے کے لیے ٹرانزیکشن پر دستخط کر دیتے ہیں، تو ٹرانزیکشن کو براڈکاسٹ کیا جاتا ہے اور چلایا جاتا ہے۔ ٹرانزیکشن میں، ایک safe فنکشن ہوتا ہے جسے (
signMessage(bytes calldata _data)) کہا جاتا ہے جو پیغام کو "منظور شدہ" پیغامات کی فہرست میں شامل کرتا ہے۔ - تصدیق: Safe کانٹریکٹ پر
isValidSignatureکو کال کریں، اور تصدیق کرنے کے لیے پیغام کو میسج پیرامیٹر کے طور پر اور سگنیچر پیرامیٹر کے لیے ایک خالی ویلیو (opens in a new tab) (یعنی0x) پاس کریں۔ Safe دیکھے گا کہ سگنیچر پیرامیٹر خالی ہے اور سگنیچر کی کرپٹوگرافک طور پر تصدیق کرنے کے بجائے، یہ جان لے گا کہ آگے بڑھ کر یہ چیک کرنا ہے کہ آیا پیغام "منظور شدہ" پیغامات کی فہرست میں ہے یا نہیں۔
- تخلیق: ایک safe کا مالک پیغام پر "دستخط" کرنے کے لیے ایک نیا safe ٹرانزیکشن بناتا ہے، اور پیغام کو ڈیٹا کے طور پر ٹرانزیکشن میں پاس کرتا ہے۔ ایک بار جب کافی مالکان ملٹی سگ (multisig) کی حد تک پہنچنے کے لیے ٹرانزیکشن پر دستخط کر دیتے ہیں، تو ٹرانزیکشن کو براڈکاسٹ کیا جاتا ہے اور چلایا جاتا ہے۔ ٹرانزیکشن میں، ایک safe فنکشن ہوتا ہے جسے (
- آف چین (Offchain) پیغامات:
- تخلیق: ایک safe کا مالک آف چین ایک پیغام بناتا ہے، پھر دوسرے safe مالکان سے انفرادی طور پر پیغام پر دستخط کرواتا ہے جب تک کہ ملٹی سگ منظوری کی حد کو عبور کرنے کے لیے کافی سگنیچرز نہ ہو جائیں۔
- تصدیق:
isValidSignatureکو کال کریں۔ میسج پیرامیٹر میں، تصدیق کیے جانے والے پیغام کو پاس کریں۔ سگنیچر پیرامیٹر میں، ہر safe مالک کے انفرادی سگنیچرز کو ایک ساتھ جوڑ کر (concatenated)، یکے بعد دیگرے پاس کریں۔ Safe چیک کرے گا کہ حد کو پورا کرنے کے لیے کافی سگنیچرز موجود ہیں اور یہ کہ ہر سگنیچر درست ہے۔ اگر ایسا ہے، تو یہ ایک ویلیو واپس کرے گا جو کامیاب سگنیچر کی تصدیق کی نشاندہی کرتی ہے۔
_hash پیرامیٹر دراصل کیا ہے؟ پورا پیغام کیوں پاس نہیں کیا جاتا؟
آپ نے غور کیا ہوگا کہ EIP-1271 انٹرفیس (opens in a new tab) میں isValidSignature فنکشن خود پیغام نہیں لیتا، بلکہ اس کے بجائے ایک _hash پیرامیٹر لیتا ہے۔ اس کا مطلب یہ ہے کہ isValidSignature کو مکمل صوابدیدی لمبائی (arbitrary-length) کا پیغام پاس کرنے کے بجائے، ہم پیغام کا 32-بائٹ ہیش (عام طور پر keccak256) پاس کرتے ہیں۔
کال ڈیٹا (calldata) کے ہر بائٹ — یعنی، اسمارٹ کانٹریکٹ فنکشن کو پاس کیا گیا فنکشن پیرامیٹر ڈیٹا — کی قیمت 16 گیس (اگر صفر بائٹ ہو تو 4 گیس) ہوتی ہے (opens in a new tab)، لہذا اگر کوئی پیغام طویل ہو تو اس سے کافی گیس بچائی جا سکتی ہے۔
پچھلی EIP-1271 کی تفصیلات (Specifications)
ایسی EIP-1271 تفصیلات موجود ہیں جن میں isValidSignature فنکشن ہوتا ہے جس کا پہلا پیرامیٹر bytes ٹائپ کا ہوتا ہے (طے شدہ لمبائی bytes32 کے بجائے صوابدیدی لمبائی) اور پیرامیٹر کا نام message ہوتا ہے۔ یہ EIP-1271 اسٹینڈرڈ کا ایک پرانا ورژن (opens in a new tab) ہے۔
میرے اپنے کانٹریکٹس میں EIP-1271 کو کیسے نافذ کیا جانا چاہیے؟
اسپیک یہاں بہت اوپن اینڈڈ (open-ended) ہے۔ Safe کی عمل آوری میں کچھ اچھے خیالات ہیں:
- آپ کانٹریکٹ کے "مالک" کے EOA سگنیچرز کو درست مان سکتے ہیں۔
- آپ منظور شدہ پیغامات کی فہرست محفوظ کر سکتے ہیں اور صرف انہی کو درست مان سکتے ہیں۔
آخر میں، یہ کانٹریکٹ ڈیولپر کے طور پر آپ پر منحصر ہے!
نتیجہ
EIP-1271 (opens in a new tab) ایک ورسٹائل اسٹینڈرڈ ہے جو اسمارٹ کانٹریکٹس کو سگنیچرز کی تصدیق کرنے کی اجازت دیتا ہے۔ یہ اسمارٹ کانٹریکٹس کے لیے EOAs کی طرح کام کرنے کے دروازے کھولتا ہے — مثال کے طور پر "Log in with Ethereum" کو اسمارٹ کانٹریکٹس کے ساتھ کام کرنے کا طریقہ فراہم کرنا — اور اسے کئی طریقوں سے نافذ کیا جا سکتا ہے (Safe کے پاس غور کرنے کے لیے ایک غیر معمولی، دلچسپ عمل آوری ہے)۔
صفحہ کی آخری اپ ڈیٹ: ۳ مارچ، ۲۰۲۶