EIP-1271: سمارٹ کنٹریکٹ کے دستخطوں پر دستخط کرنا اور تصدیق کرنا
EIP-1271 (opens in a new tab) کا معیار سمارٹ کنٹریکٹس کو دستخطوں کی تصدیق کرنے کی اجازت دیتا ہے۔
اس ٹیوٹوریل میں، ہم ڈیجیٹل دستخطوں، EIP-1271 کے پس منظر، اور Safe (opens in a new tab) (سابقہ Gnosis Safe) کے ذریعے استعمال ہونے والی EIP-1271 کی مخصوص عمل درآمد کا جائزہ لیتے ہیں۔ مجموعی طور پر، یہ آپ کے اپنے کنٹریکٹس میں EIP-1271 کو نافذ کرنے کے لیے ایک نقطہ آغاز کے طور پر کام کر سکتا ہے۔
دستخط کیا ہے؟
اس تناظر میں، ایک دستخط (زیادہ واضح طور پر، ایک "ڈیجیٹل دستخط") ایک پیغام اور کسی قسم کا ثبوت ہے کہ پیغام کسی مخصوص شخص/بھیجنے والے/پتہ سے آیا ہے۔
مثال کے طور پر، ایک ڈیجیٹل دستخط کچھ اس طرح نظر آ سکتا ہے:
- پیغام: "میں اپنے ایتھیریم والیٹ کے ساتھ اس ویب سائٹ پر لاگ ان کرنا چاہتا ہوں۔"
- دستخط کنندہ: میرا پتہ
0x000…ہے۔ - ثبوت: یہاں کچھ ثبوت ہے کہ میں نے،
0x000…، دراصل یہ پورا پیغام بنایا ہے (یہ عام طور پر علمِ تشفیر سے متعلق کچھ ہوتا ہے)۔
یہ نوٹ کرنا ضروری ہے کہ ڈیجیٹل دستخط میں "پیغام" اور "دستخط" دونوں شامل ہوتے ہیں۔
کیوں؟ مثال کے طور پر، اگر آپ نے مجھے دستخط کرنے کے لیے ایک کنٹریکٹ دیا، اور پھر میں نے دستخط کا صفحہ کاٹ دیا اور آپ کو باقی کنٹریکٹ کے بغیر صرف اپنے دستخط واپس کر دیے، تو کنٹریکٹ درست نہیں ہوگا۔
اسی طرح، ایک ڈیجیٹل دستخط کا کسی متعلقہ پیغام کے بغیر کوئی مطلب نہیں ہوتا!
EIP-1271 کیوں موجود ہے؟
ایتھیریم پر مبنی بلاک چینز پر استعمال کے لیے ڈیجیٹل دستخط بنانے کے لیے، آپ کو عام طور پر ایک خفیہ نجی کلید کی ضرورت ہوتی ہے جسے کوئی اور نہیں جانتا۔ یہی چیز آپ کے دستخط کو آپ کا بناتی ہے (خفیہ کلید کے علم کے بغیر کوئی اور وہی دستخط نہیں بنا سکتا)۔
آپ کے ایتھیریم اکاؤنٹ (یعنی آپ کا بیرونی ملکیت والا اکاؤنٹ/EOA) کے ساتھ ایک نجی کلید وابستہ ہوتی ہے، اور یہ وہ نجی کلید ہے جو عام طور پر اس وقت استعمال ہوتی ہے جب کوئی ویب سائٹ یا غیر مرکزی ایپلی کیشن (dapp) آپ سے دستخط مانگتی ہے (مثلاً، "ایتھیریم کے ساتھ لاگ ان کریں" کے لیے)۔
ایک ایپ کسی دستخط کی تصدیق کر سکتی ہے (opens in a new tab) جو آپ کسی فریق ثالث کی لائبریری جیسے Ethers.js کا استعمال کرتے ہوئے اپنی نجی کلید کو جانے بغیر (opens in a new tab) بناتے ہیں اور اسے یقین ہو سکتا ہے کہ آپ ہی وہ شخص تھے جس نے دستخط بنائے تھے۔
درحقیقت، چونکہ EOA ڈیجیٹل دستخط پبلک-کی علمِ تشفیر کا استعمال کرتے ہیں، اس لیے انہیں آف چین بنایا اور تصدیق کیا جا سکتا ہے! اسی طرح گیس کے بغیر DAO ووٹنگ کام کرتی ہے — آن چین ووٹ جمع کرانے کے بجائے، علمِ تشفیر کی لائبریریوں کا استعمال کرتے ہوئے آف چین ڈیجیٹل دستخط بنائے اور تصدیق کیے جا سکتے ہیں۔
اگرچہ EOA اکاؤنٹس میں ایک نجی کلید ہوتی ہے، سمارٹ کنٹریکٹ اکاؤنٹس میں کسی قسم کی نجی یا خفیہ کلید نہیں ہوتی ہے (لہذا "ایتھیریم کے ساتھ لاگ ان کریں"، وغیرہ مقامی طور پر سمارٹ کنٹریکٹ اکاؤنٹس کے ساتھ کام نہیں کر سکتے)۔
وہ مسئلہ جسے EIP-1271 حل کرنے کا ارادہ رکھتا ہے: ہم کیسے بتا سکتے ہیں کہ سمارٹ کنٹریکٹ کا دستخط درست ہے اگر سمارٹ کنٹریکٹ میں کوئی "خفیہ" چیز نہیں ہے جسے وہ دستخط میں شامل کر سکے؟
EIP-1271 کیسے کام کرتا ہے؟
سمارٹ کنٹریکٹس میں نجی کلیدیں نہیں ہوتیں جنہیں پیغامات پر دستخط کرنے کے لیے استعمال کیا جا سکے۔ تو ہم کیسے بتا سکتے ہیں کہ آیا کوئی دستخط مستند ہے؟
ٹھیک ہے، ایک خیال یہ ہے کہ ہم صرف سمارٹ کنٹریکٹ سے پوچھ سکتے ہیں کہ آیا کوئی دستخط مستند ہے!
EIP-1271 جو کرتا ہے وہ یہ ہے کہ یہ سمارٹ کنٹریکٹ سے "پوچھنے" کے اس خیال کو معیاری بناتا ہے کہ آیا دیا گیا دستخط درست ہے۔
ایک کنٹریکٹ جو EIP-1271 کو نافذ کرتا ہے اس میں isValidSignature نامی ایک فنکشن ہونا چاہیے جو ایک پیغام اور ایک دستخط لیتا ہے۔ اس کے بعد کنٹریکٹ کچھ توثیق کی منطق چلا سکتا ہے (یہاں تفصیلات کسی خاص چیز کو نافذ نہیں کرتی ہیں) اور پھر ایک قدر واپس کر سکتا ہے جو یہ ظاہر کرتی ہے کہ آیا دستخط درست ہے یا نہیں۔
اگر isValidSignature ایک درست نتیجہ واپس کرتا ہے، تو یہ کافی حد تک کنٹریکٹ کا یہ کہنا ہے کہ "ہاں، میں اس دستخط + پیغام کو منظور کرتا ہوں!"
انٹرفیس
یہاں EIP-1271 کی تفصیلات میں بالکل وہی انٹرفیس ہے (ہم ذیل میں _hash پیرامیٹر کے بارے میں بات کریں گے، لیکن ابھی کے لیے، اسے وہ پیغام سمجھیں جس کی تصدیق کی جا رہی ہے):
pragma solidity ^0.5.0;
contract ERC1271 {
// bytes4(keccak256("isValidSignature(bytes32,bytes)")
bytes4 constant internal MAGICVALUE = 0x1626ba7e;
/**
* @dev واپس کرنا چاہیے کہ آیا فراہم کردہ دستخط فراہم کردہ ہیش کے لیے درست ہے
* @param _hash سائن کیے جانے والے ڈیٹا کا ہیش
* @param _signature _hash سے وابستہ دستخط کی بائٹ ایرے
*
* جب فنکشن پاس ہو جائے تو لازمی طور پر bytes4 میجک ویلیو 0x1626ba7e واپس کرے۔
* سٹیٹ کو تبدیل نہیں کرنا چاہیے (solc < 0.5 کے لیے STATICCALL، solc > 0.5 کے لیے view موڈیفائر کا استعمال کرتے ہوئے)
* بیرونی کالز کی اجازت دینی چاہیے
*/
function isValidSignature(
bytes32 _hash,
bytes memory _signature)
public
view
returns (bytes4 magicValue);
}
EIP-1271 کے نفاذ کی مثال: Safe
کنٹریکٹس isValidSignature کو کئی طریقوں سے نافذ کر سکتے ہیں — تفصیلات صرف درست نفاذ کے بارے میں زیادہ کچھ نہیں کہتی ہیں۔
ایک قابل ذکر کنٹریکٹ جو EIP-1271 کو نافذ کرتا ہے وہ Safe (سابقہ Gnosis Safe) ہے۔
Safe کے کوڈ میں، isValidSignature کو نافذ کیا گیا ہے (opens in a new tab) تاکہ دستخطوں کو دو طریقوں (opens in a new tab) سے بنایا اور تصدیق کیا جا سکے:
- آن چین پیغامات
- تخلیق: ایک Safe کا مالک پیغام پر "دستخط" کرنے کے لیے ایک نئی Safe ٹرانزیکشن بناتا ہے، پیغام کو ڈیٹا کے طور پر ٹرانزیکشن میں پاس کرتا ہے۔ ایک بار جب کافی مالکان ملٹی سگ کی حد تک پہنچنے کے لیے ٹرانزیکشن پر دستخط کر دیتے ہیں، تو ٹرانزیکشن نشر اور چلائی جاتی ہے۔ ٹرانزیکشن میں، ایک Safe فنکشن ہوتا ہے جسے (
signMessage(bytes calldata _data)) کہا جاتا ہے جو پیغام کو "منظور شدہ" پیغامات کی فہرست میں شامل کرتا ہے۔ - تصدیق: Safe کنٹریکٹ پر
isValidSignatureکو کال کریں، اور پیغام کے پیرامیٹر کے طور پر تصدیق کرنے کے لیے پیغام کو پاس کریں اور دستخط کے پیرامیٹر کے لیے ایک خالی قدر (opens in a new tab) (یعنی،0x)۔ Safe دیکھے گا کہ دستخط کا پیرامیٹر خالی ہے اور دستخط کی علمِ تشفیر کے ذریعے تصدیق کرنے کے بجائے، یہ جان لے گا کہ بس آگے بڑھیں اور چیک کریں کہ آیا پیغام "منظور شدہ" پیغامات کی فہرست میں ہے۔
- تخلیق: ایک Safe کا مالک پیغام پر "دستخط" کرنے کے لیے ایک نئی Safe ٹرانزیکشن بناتا ہے، پیغام کو ڈیٹا کے طور پر ٹرانزیکشن میں پاس کرتا ہے۔ ایک بار جب کافی مالکان ملٹی سگ کی حد تک پہنچنے کے لیے ٹرانزیکشن پر دستخط کر دیتے ہیں، تو ٹرانزیکشن نشر اور چلائی جاتی ہے۔ ٹرانزیکشن میں، ایک Safe فنکشن ہوتا ہے جسے (
- آف چین پیغامات:
- تخلیق: ایک Safe کا مالک آف چین ایک پیغام بناتا ہے، پھر دوسرے Safe مالکان سے انفرادی طور پر پیغام پر دستخط کرواتا ہے جب تک کہ ملٹی سگ کی منظوری کی حد کو عبور کرنے کے لیے کافی دستخط نہ ہو جائیں۔
- تصدیق:
isValidSignatureکو کال کریں۔ پیغام کے پیرامیٹر میں، تصدیق کیے جانے والے پیغام کو پاس کریں۔ دستخط کے پیرامیٹر میں، ہر Safe مالک کے انفرادی دستخطوں کو ایک ساتھ جوڑ کر، یکے بعد دیگرے پاس کریں۔ Safe چیک کرے گا کہ حد کو پورا کرنے کے لیے کافی دستخط موجود ہیں اور یہ کہ ہر دستخط درست ہے۔ اگر ایسا ہے، تو یہ ایک قدر واپس کرے گا جو کامیاب دستخط کی تصدیق کی نشاندہی کرتی ہے۔
_hash پیرامیٹر بالکل کیا ہے؟ پورا پیغام کیوں پاس نہیں کرتے؟
آپ نے غور کیا ہوگا کہ EIP-1271 انٹرفیس (opens in a new tab) میں isValidSignature فنکشن خود پیغام نہیں لیتا، بلکہ اس کے بجائے ایک _hash پیرامیٹر لیتا ہے۔ اس کا مطلب یہ ہے کہ isValidSignature کو صوابدیدی لمبائی کا پورا پیغام پاس کرنے کے بجائے، ہم اس کے بجائے پیغام کا 32-byte ہیش (عام طور پر keccak256) پاس کرتے ہیں۔
کال ڈیٹا کے ہر بائٹ — یعنی، سمارٹ کنٹریکٹ فنکشن کو پاس کیا گیا فنکشن پیرامیٹر ڈیٹا — کی قیمت 16 gas ہوتی ہے (4 gas اگر صفر بائٹ ہو) (opens in a new tab)، لہذا اگر کوئی پیغام طویل ہو تو اس سے کافی گیس بچائی جا سکتی ہے۔
پچھلی EIP-1271 کی تفصیلات
عملی استعمال میں EIP-1271 کی ایسی تفصیلات موجود ہیں جن میں ایک isValidSignature فنکشن ہوتا ہے جس کا پہلا پیرامیٹر bytes قسم کا ہوتا ہے (طے شدہ لمبائی bytes32 کے بجائے صوابدیدی لمبائی) اور پیرامیٹر کا نام message ہوتا ہے۔ یہ EIP-1271 معیار کا ایک پرانا ورژن (opens in a new tab) ہے۔
میرے اپنے کنٹریکٹس میں EIP-1271 کو کیسے نافذ کیا جانا چاہیے؟
تفصیلات یہاں بہت کھلی ہیں۔ Safe کے نفاذ میں کچھ اچھے خیالات ہیں:
- آپ کنٹریکٹ کے "مالک" کے EOA دستخطوں کو درست مان سکتے ہیں۔
- آپ منظور شدہ پیغامات کی فہرست محفوظ کر سکتے ہیں اور صرف انہی کو درست مان سکتے ہیں۔
آخر میں، یہ کنٹریکٹ ڈیولپر کے طور پر آپ پر منحصر ہے!
نتیجہ
EIP-1271 (opens in a new tab) ایک ورسٹائل معیار ہے جو سمارٹ کنٹریکٹس کو دستخطوں کی تصدیق کرنے کی اجازت دیتا ہے۔ یہ سمارٹ کنٹریکٹس کے لیے EOAs کی طرح زیادہ کام کرنے کا دروازہ کھولتا ہے — مثال کے طور پر "ایتھیریم کے ساتھ لاگ ان کریں" کو سمارٹ کنٹریکٹس کے ساتھ کام کرنے کا طریقہ فراہم کرنا — اور اسے کئی طریقوں سے نافذ کیا جا سکتا ہے (Safe میں غور کرنے کے لیے ایک غیر معمولی، دلچسپ نفاذ موجود ہے)۔