---
title: "⁦EIP-1271⁩: سمارٹ کنٹریکٹ کے دستخطوں پر دستخط کرنا اور تصدیق کرنا"
description: "⁦EIP-1271⁩ کے ساتھ سمارٹ کنٹریکٹ کے دستخط بنانے اور تصدیق کرنے کا ایک جائزہ۔ ہم Safe (سابقہ ⁦Gnosis Safe⁩) میں استعمال ہونے والی ⁦EIP-1271⁩ کی عمل درآمد کا بھی جائزہ لیتے ہیں تاکہ سمارٹ کنٹریکٹ ڈیولپرز کے لیے ایک ٹھوس مثال فراہم کی جا سکے۔"
author: "نیتھن ایچ لیونگ"
lang: ur
tags: ["eip-1271", "سمارٹ کنٹریکٹس", "تصدیق کرنا", "دستخط کرنا"]
skill: intermediate
breadcrumb: "⁦EIP-1271⁩ دستخط"
published: 2023-01-12
---

[<span dir="ltr">EIP-1271</span>](https://eips.ethereum.org/EIPS/eip-1271) کا معیار سمارٹ کنٹریکٹس کو دستخطوں کی تصدیق کرنے کی اجازت دیتا ہے۔

اس ٹیوٹوریل میں، ہم ڈیجیٹل دستخطوں، <span dir="ltr">EIP-1271</span> کے پس منظر، اور [Safe](https://safe.global/) (سابقہ Gnosis Safe) کے ذریعے استعمال ہونے والی <span dir="ltr">EIP-1271</span> کی مخصوص عمل درآمد کا جائزہ لیتے ہیں۔ مجموعی طور پر، یہ آپ کے اپنے کنٹریکٹس میں <span dir="ltr">EIP-1271</span> کو نافذ کرنے کے لیے ایک نقطہ آغاز کے طور پر کام کر سکتا ہے۔

## دستخط کیا ہے؟ {#what-is-a-signature}

اس تناظر میں، ایک دستخط (زیادہ واضح طور پر، ایک "ڈیجیٹل دستخط") ایک پیغام اور کسی قسم کا ثبوت ہے کہ پیغام کسی مخصوص شخص/بھیجنے والے/پتہ سے آیا ہے۔

مثال کے طور پر، ایک ڈیجیٹل دستخط کچھ اس طرح نظر آ سکتا ہے:

1. پیغام: "میں اپنے ایتھیریم والیٹ کے ساتھ اس ویب سائٹ پر لاگ ان کرنا چاہتا ہوں۔"
2. دستخط کنندہ: میرا پتہ `0x000…` ہے۔
3. ثبوت: یہاں کچھ ثبوت ہے کہ میں نے، `0x000…`، دراصل یہ پورا پیغام بنایا ہے (یہ عام طور پر علمِ تشفیر سے متعلق کچھ ہوتا ہے)۔

یہ نوٹ کرنا ضروری ہے کہ ڈیجیٹل دستخط میں "پیغام" اور "دستخط" دونوں شامل ہوتے ہیں۔

کیوں؟ مثال کے طور پر، اگر آپ نے مجھے دستخط کرنے کے لیے ایک کنٹریکٹ دیا، اور پھر میں نے دستخط کا صفحہ کاٹ دیا اور آپ کو باقی کنٹریکٹ کے بغیر صرف اپنے دستخط واپس کر دیے، تو کنٹریکٹ درست نہیں ہوگا۔

اسی طرح، ایک ڈیجیٹل دستخط کا کسی متعلقہ پیغام کے بغیر کوئی مطلب نہیں ہوتا!

## <span dir="ltr">EIP-1271</span> کیوں موجود ہے؟ {#why-does-eip-1271-exist}

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

آپ کے ایتھیریم اکاؤنٹ (یعنی آپ کا بیرونی ملکیت والا اکاؤنٹ/<span dir="ltr">EOA</span>) کے ساتھ ایک نجی کلید وابستہ ہوتی ہے، اور یہ وہ نجی کلید ہے جو عام طور پر اس وقت استعمال ہوتی ہے جب کوئی ویب سائٹ یا غیر مرکزی ایپلی کیشن (dapp) آپ سے دستخط مانگتی ہے (مثلاً، "ایتھیریم کے ساتھ لاگ ان کریں" کے لیے)۔

ایک ایپ [کسی دستخط کی تصدیق کر سکتی ہے](https://www.alchemy.com/docs/how-to-verify-a-message-signature-on-ethereum) جو آپ کسی فریق ثالث کی لائبریری جیسے Ethers.js کا استعمال کرتے ہوئے [اپنی نجی کلید کو جانے بغیر](https://en.wikipedia.org/wiki/Public-key_cryptography) بناتے ہیں اور اسے یقین ہو سکتا ہے کہ _آپ_ ہی وہ شخص تھے جس نے دستخط بنائے تھے۔

> درحقیقت، چونکہ <span dir="ltr">EOA</span> ڈیجیٹل دستخط پبلک-کی علمِ تشفیر کا استعمال کرتے ہیں، اس لیے انہیں **آف چین** بنایا اور تصدیق کیا جا سکتا ہے! اسی طرح گیس کے بغیر <span dir="ltr">DAO</span> ووٹنگ کام کرتی ہے — آن چین ووٹ جمع کرانے کے بجائے، علمِ تشفیر کی لائبریریوں کا استعمال کرتے ہوئے آف چین ڈیجیٹل دستخط بنائے اور تصدیق کیے جا سکتے ہیں۔

اگرچہ <span dir="ltr">EOA</span> اکاؤنٹس میں ایک نجی کلید ہوتی ہے، سمارٹ کنٹریکٹ اکاؤنٹس میں کسی قسم کی نجی یا خفیہ کلید نہیں ہوتی ہے (لہذا "ایتھیریم کے ساتھ لاگ ان کریں"، وغیرہ مقامی طور پر سمارٹ کنٹریکٹ اکاؤنٹس کے ساتھ کام نہیں کر سکتے)۔

وہ مسئلہ جسے <span dir="ltr">EIP-1271</span> حل کرنے کا ارادہ رکھتا ہے: ہم کیسے بتا سکتے ہیں کہ سمارٹ کنٹریکٹ کا دستخط درست ہے اگر سمارٹ کنٹریکٹ میں کوئی "خفیہ" چیز نہیں ہے جسے وہ دستخط میں شامل کر سکے؟

## <span dir="ltr">EIP-1271</span> کیسے کام کرتا ہے؟ {#how-does-eip-1271-work}

سمارٹ کنٹریکٹس میں نجی کلیدیں نہیں ہوتیں جنہیں پیغامات پر دستخط کرنے کے لیے استعمال کیا جا سکے۔ تو ہم کیسے بتا سکتے ہیں کہ آیا کوئی دستخط مستند ہے؟

ٹھیک ہے، ایک خیال یہ ہے کہ ہم صرف سمارٹ کنٹریکٹ سے _پوچھ_ سکتے ہیں کہ آیا کوئی دستخط مستند ہے!

<span dir="ltr">EIP-1271</span> جو کرتا ہے وہ یہ ہے کہ یہ سمارٹ کنٹریکٹ سے "پوچھنے" کے اس خیال کو معیاری بناتا ہے کہ آیا دیا گیا دستخط درست ہے۔

ایک کنٹریکٹ جو <span dir="ltr">EIP-1271</span> کو نافذ کرتا ہے اس میں `isValidSignature` نامی ایک فنکشن ہونا چاہیے جو ایک پیغام اور ایک دستخط لیتا ہے۔ اس کے بعد کنٹریکٹ کچھ توثیق کی منطق چلا سکتا ہے (یہاں تفصیلات کسی خاص چیز کو نافذ نہیں کرتی ہیں) اور پھر ایک قدر واپس کر سکتا ہے جو یہ ظاہر کرتی ہے کہ آیا دستخط درست ہے یا نہیں۔

اگر `isValidSignature` ایک درست نتیجہ واپس کرتا ہے، تو یہ کافی حد تک کنٹریکٹ کا یہ کہنا ہے کہ "ہاں، میں اس دستخط + پیغام کو منظور کرتا ہوں!"

### انٹرفیس {#interface}

یہاں <span dir="ltr">EIP-1271</span> کی تفصیلات میں بالکل وہی انٹرفیس ہے (ہم ذیل میں `_hash` پیرامیٹر کے بارے میں بات کریں گے، لیکن ابھی کے لیے، اسے وہ پیغام سمجھیں جس کی تصدیق کی جا رہی ہے):

```jsx
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);
}
```

## <span dir="ltr">EIP-1271</span> کے نفاذ کی مثال: Safe {#example-eip-1271-implementation-safe}

کنٹریکٹس `isValidSignature` کو کئی طریقوں سے نافذ کر سکتے ہیں — تفصیلات صرف درست نفاذ کے بارے میں زیادہ کچھ نہیں کہتی ہیں۔

ایک قابل ذکر کنٹریکٹ جو <span dir="ltr">EIP-1271</span> کو نافذ کرتا ہے وہ Safe (سابقہ Gnosis Safe) ہے۔

Safe کے کوڈ میں، `isValidSignature` کو [نافذ کیا گیا ہے](https://github.com/safe-global/safe-contracts/blob/main/contracts/handler/CompatibilityFallbackHandler.sol) تاکہ دستخطوں کو [دو طریقوں](https://ethereum.stackexchange.com/questions/122635/signing-messages-as-a-gnosis-safe-eip1271-support) سے بنایا اور تصدیق کیا جا سکے:

1. آن چین پیغامات
   1. تخلیق: ایک Safe کا مالک پیغام پر "دستخط" کرنے کے لیے ایک نئی Safe ٹرانزیکشن بناتا ہے، پیغام کو ڈیٹا کے طور پر ٹرانزیکشن میں پاس کرتا ہے۔ ایک بار جب کافی مالکان ملٹی سگ کی حد تک پہنچنے کے لیے ٹرانزیکشن پر دستخط کر دیتے ہیں، تو ٹرانزیکشن نشر اور چلائی جاتی ہے۔ ٹرانزیکشن میں، ایک Safe فنکشن ہوتا ہے جسے (`signMessage(bytes calldata _data)`) کہا جاتا ہے جو پیغام کو "منظور شدہ" پیغامات کی فہرست میں شامل کرتا ہے۔
   2. تصدیق: Safe کنٹریکٹ پر `isValidSignature` کو کال کریں، اور پیغام کے پیرامیٹر کے طور پر تصدیق کرنے کے لیے پیغام کو پاس کریں اور [دستخط کے پیرامیٹر کے لیے ایک خالی قدر](https://github.com/safe-global/safe-contracts/blob/main/contracts/handler/CompatibilityFallbackHandler.sol#L32) (یعنی، `0x`)۔ Safe دیکھے گا کہ دستخط کا پیرامیٹر خالی ہے اور دستخط کی علمِ تشفیر کے ذریعے تصدیق کرنے کے بجائے، یہ جان لے گا کہ بس آگے بڑھیں اور چیک کریں کہ آیا پیغام "منظور شدہ" پیغامات کی فہرست میں ہے۔
2. آف چین پیغامات:
   1. تخلیق: ایک Safe کا مالک آف چین ایک پیغام بناتا ہے، پھر دوسرے Safe مالکان سے انفرادی طور پر پیغام پر دستخط کرواتا ہے جب تک کہ ملٹی سگ کی منظوری کی حد کو عبور کرنے کے لیے کافی دستخط نہ ہو جائیں۔
   2. تصدیق: `isValidSignature` کو کال کریں۔ پیغام کے پیرامیٹر میں، تصدیق کیے جانے والے پیغام کو پاس کریں۔ دستخط کے پیرامیٹر میں، ہر Safe مالک کے انفرادی دستخطوں کو ایک ساتھ جوڑ کر، یکے بعد دیگرے پاس کریں۔ Safe چیک کرے گا کہ حد کو پورا کرنے کے لیے کافی دستخط موجود ہیں **اور** یہ کہ ہر دستخط درست ہے۔ اگر ایسا ہے، تو یہ ایک قدر واپس کرے گا جو کامیاب دستخط کی تصدیق کی نشاندہی کرتی ہے۔

## `_hash` پیرامیٹر بالکل کیا ہے؟ پورا پیغام کیوں پاس نہیں کرتے؟ {#what-exactly-is-the-hash-parameter-why-not-pass-the-whole-message}

آپ نے غور کیا ہوگا کہ [<span dir="ltr">EIP-1271</span> انٹرفیس](https://eips.ethereum.org/EIPS/eip-1271) میں `isValidSignature` فنکشن خود پیغام نہیں لیتا، بلکہ اس کے بجائے ایک `_hash` پیرامیٹر لیتا ہے۔ اس کا مطلب یہ ہے کہ `isValidSignature` کو صوابدیدی لمبائی کا پورا پیغام پاس کرنے کے بجائے، ہم اس کے بجائے پیغام کا <span dir="ltr">32-byte</span> ہیش (عام طور پر keccak256) پاس کرتے ہیں۔

کال ڈیٹا کے ہر بائٹ — یعنی، سمارٹ کنٹریکٹ فنکشن کو پاس کیا گیا فنکشن پیرامیٹر ڈیٹا — [کی قیمت <span dir="ltr">16 gas</span> ہوتی ہے (<span dir="ltr">4 gas</span> اگر صفر بائٹ ہو)](https://eips.ethereum.org/EIPS/eip-2028)، لہذا اگر کوئی پیغام طویل ہو تو اس سے کافی گیس بچائی جا سکتی ہے۔

### پچھلی <span dir="ltr">EIP-1271</span> کی تفصیلات {#previous-eip-1271-specifications}

عملی استعمال میں <span dir="ltr">EIP-1271</span> کی ایسی تفصیلات موجود ہیں جن میں ایک `isValidSignature` فنکشن ہوتا ہے جس کا پہلا پیرامیٹر `bytes` قسم کا ہوتا ہے (طے شدہ لمبائی `bytes32` کے بجائے صوابدیدی لمبائی) اور پیرامیٹر کا نام `message` ہوتا ہے۔ یہ <span dir="ltr">EIP-1271</span> معیار کا ایک [پرانا ورژن](https://github.com/safe-global/safe-contracts/issues/391#issuecomment-1075427206) ہے۔

## میرے اپنے کنٹریکٹس میں <span dir="ltr">EIP-1271</span> کو کیسے نافذ کیا جانا چاہیے؟ {#how-should-eip-1271-be-implemented-in-my-own-contracts}

تفصیلات یہاں بہت کھلی ہیں۔ Safe کے نفاذ میں کچھ اچھے خیالات ہیں:

- آپ کنٹریکٹ کے "مالک" کے <span dir="ltr">EOA</span> دستخطوں کو درست مان سکتے ہیں۔
- آپ منظور شدہ پیغامات کی فہرست محفوظ کر سکتے ہیں اور صرف انہی کو درست مان سکتے ہیں۔

آخر میں، یہ کنٹریکٹ ڈیولپر کے طور پر آپ پر منحصر ہے!

## نتیجہ {#conclusion}

[<span dir="ltr">EIP-1271</span>](https://eips.ethereum.org/EIPS/eip-1271) ایک ورسٹائل معیار ہے جو سمارٹ کنٹریکٹس کو دستخطوں کی تصدیق کرنے کی اجازت دیتا ہے۔ یہ سمارٹ کنٹریکٹس کے لیے <span dir="ltr">EOAs</span> کی طرح زیادہ کام کرنے کا دروازہ کھولتا ہے — مثال کے طور پر "ایتھیریم کے ساتھ لاگ ان کریں" کو سمارٹ کنٹریکٹس کے ساتھ کام کرنے کا طریقہ فراہم کرنا — اور اسے کئی طریقوں سے نافذ کیا جا سکتا ہے (Safe میں غور کرنے کے لیے ایک غیر معمولی، دلچسپ نفاذ موجود ہے)۔