ایک وکندریقرت میسنجر بلاکچین پر کیسے کام کرتا ہے؟

2017 کے آغاز میں، ہم نے کلاسک P2P میسنجر کے فوائد کے بارے میں بات کر کے بلاکچین [نام اور لنک پروفائل میں ہیں] پر میسنجر بنانا شروع کیا۔

پاس کیا۔ 2.5 سال، اور ہم اپنے تصور کی تصدیق کرنے میں کامیاب ہو گئے: میسنجر ایپلی کیشنز اب iOS، Web PWA، Windows، GNU/Linux، Mac OS اور Android کے لیے دستیاب ہیں۔

آج ہم آپ کو بتائیں گے کہ بلاکچین میسنجر کیسے کام کرتا ہے اور کلائنٹ ایپلی کیشنز اس کے API کے ساتھ کیسے کام کر سکتی ہیں۔
ایک وکندریقرت میسنجر بلاکچین پر کیسے کام کرتا ہے؟

ہم کلاسک P2P میسنجرز کی سیکیورٹی اور رازداری کے مسائل کو حل کرنے کے لیے بلاکچین چاہتے تھے:

  • اکاؤنٹ بنانے کے لیے ایک کلک - کوئی فون یا ای میل، ایڈریس بک یا جغرافیائی مقامات تک رسائی نہیں۔
  • بات چیت کرنے والے کبھی بھی براہ راست رابطہ قائم نہیں کرتے؛ تمام مواصلات نوڈس کے تقسیم شدہ نظام کے ذریعے ہوتے ہیں۔ صارفین کے IP پتے ایک دوسرے کے لیے قابل رسائی نہیں ہیں۔
  • تمام پیغامات Encrypted ہیں End-to-End curve25519xsalsa20poly1305۔ ایسا لگتا ہے کہ یہ کسی کو حیران نہیں کرے گا، لیکن ہمارا سورس کوڈ کھلا ہے۔
  • MITM حملے کو خارج کر دیا گیا ہے - ہر پیغام ایک لین دین ہے اور اس پر Ed25519 EdDSA کے دستخط ہیں۔
  • پیغام اپنے ہی بلاک میں ختم ہوتا ہے۔ مستقل مزاجی اور timestamp آپ بلاکس کو ٹھیک نہیں کر سکتے، اور اس وجہ سے پیغامات کی ترتیب۔
  • "میں نے یہ نہیں کہا" بلاکچین پر پیغامات کے ساتھ کام نہیں کرے گا۔
  • کوئی مرکزی ڈھانچہ نہیں ہے جو کسی پیغام کی "صداقت" کی جانچ کرتا ہو۔ یہ اتفاق رائے پر مبنی نوڈس کے تقسیم شدہ نظام کے ذریعے کیا جاتا ہے، اور یہ صارفین کی ملکیت ہے۔
  • سنسرشپ کا ناممکن - اکاؤنٹس کو بلاک نہیں کیا جاسکتا اور پیغامات کو حذف نہیں کیا جاسکتا۔
  • بلاکچین 2FA ایس ایم ایس کے ذریعے جہنمی 2FA کا متبادل ہے، بہت صحت کو خراب کیا.
  • کسی بھی وقت کسی بھی ڈیوائس سے اپنی تمام بات چیت حاصل کرنے کی اہلیت کا مطلب ہے کہ آپ کو بات چیت کو مقامی طور پر ذخیرہ کرنے کی ضرورت نہیں ہے۔
  • پیغام کی ترسیل کی تصدیق۔ صارف کے آلے پر نہیں بلکہ نیٹ ورک پر۔ بنیادی طور پر، یہ وصول کنندہ کی آپ کے پیغام کو پڑھنے کی صلاحیت کی تصدیق ہے۔ یہ اہم اطلاعات بھیجنے کے لیے ایک مفید خصوصیت ہے۔

بلاک چین کے فوائد میں کریپٹو کرنسی ایتھریم، ڈوجکوئن، لِسک، ڈیش، بٹ کوائن (یہ ابھی تک جاری ہے) کے ساتھ قریبی انضمام اور چیٹس میں ٹوکن بھیجنے کی صلاحیت بھی شامل ہے۔ یہاں تک کہ ہم نے ایک بلٹ ان کرپٹو ایکسچینجر بنایا۔

اور پھر - یہ سب کیسے کام کرتا ہے۔

پیغام ایک لین دین ہے۔

ہر کوئی پہلے سے ہی اس حقیقت کا عادی ہے کہ بلاک چین میں لین دین ایک صارف سے دوسرے صارف کو ٹوکن (سکے) منتقل کرتا ہے۔ بٹ کوائن کی طرح۔ ہم نے پیغامات کی ترسیل کے لیے ایک خاص قسم کا لین دین بنایا ہے۔

بلاکچین پر میسنجر میں پیغام بھیجنے کے لیے، آپ کو کئی مراحل سے گزرنا ہوگا:

  1. پیغام کے متن کو خفیہ کریں۔
  2. لین دین میں سائفر ٹیکسٹ ڈالیں۔
  3. لین دین پر دستخط کریں۔
  4. کسی بھی نیٹ ورک نوڈ پر لین دین بھیجیں۔
  5. نوڈس کا تقسیم شدہ نظام کسی پیغام کی "صداقت" کا تعین کرتا ہے۔
  6. اگر سب کچھ ٹھیک ہے تو، پیغام کے ساتھ لین دین اگلے بلاک میں شامل ہے۔
  7. وصول کنندہ پیغام کے لین دین کو بازیافت کرتا ہے اور ڈیکرپٹ کرتا ہے۔

مرحلہ 1–3 اور 7 مقامی طور پر کلائنٹ پر انجام دیا جاتا ہے، اور مرحلہ 5–6 میزبانوں پر انجام دیا جاتا ہے۔

پیغام کی خفیہ کاری

پیغام بھیجنے والے کی نجی کلید اور وصول کنندہ کی عوامی کلید کے ساتھ خفیہ کردہ ہے۔ ہم نیٹ ورک سے عوامی کلید لیں گے، لیکن اس کے لیے، وصول کنندہ کا اکاؤنٹ شروع ہونا چاہیے، یعنی کم از کم ایک ٹرانزیکشن ہونا چاہیے۔ آپ REST کی درخواست استعمال کر سکتے ہیں۔ GET /api/accounts/getPublicKey?address={ADAMANT address}، اور چیٹس لوڈ کرتے وقت، بات چیت کرنے والوں کی عوامی چابیاں پہلے ہی دستیاب ہوں گی۔

ایک وکندریقرت میسنجر بلاکچین پر کیسے کام کرتا ہے؟

میسنجر curve25519xsalsa20poly1305 الگورتھم کا استعمال کرتے ہوئے پیغامات کو خفیہ کرتا ہے (NaCl باکس)۔ چونکہ اکاؤنٹ میں Ed25519 کیز ہیں، ایک باکس بنانے کے لیے، چابیاں کو پہلے Curve25519 Diffie-Hellman میں تبدیل کیا جانا چاہیے۔

جاوا اسکرپٹ میں ایک مثال یہ ہے:

/**
 * Encodes a text message for sending to ADM
 * @param {string} msg message to encode
 * @param {*} recipientPublicKey recipient's public key
 * @param {*} privateKey our private key
 * @returns {{message: string, nonce: string}}
 */
adamant.encodeMessage = function (msg, recipientPublicKey, privateKey) {
  const nonce = Buffer.allocUnsafe(24)
  sodium.randombytes(nonce)

  if (typeof recipientPublicKey === 'string') {
    recipientPublicKey = hexToBytes(recipientPublicKey)
  }

  const plainText = Buffer.from(msg)
  const DHPublicKey = ed2curve.convertPublicKey(recipientPublicKey)
  const DHSecretKey = ed2curve.convertSecretKey(privateKey)

  const encrypted = nacl.box(plainText, nonce, DHPublicKey, DHSecretKey)

  return {
    message: bytesToHex(encrypted),
    nonce: bytesToHex(nonce)
  }
}

ایک پیغام کے ساتھ ایک لین دین کی تشکیل

لین دین میں درج ذیل عمومی ڈھانچہ ہے:

{
  "id": "15161295239237781653",
  "height": 7585271,
  "blockId": "16391508373936326027",
  "type": 8,
  "block_timestamp": 45182260,
  "timestamp": 45182254,
  "senderPublicKey": "bd39cc708499ae91b937083463fce5e0668c2b37e78df28f69d132fce51d49ed",
  "senderId": "U16023712506749300952",
  "recipientId": "U17653312780572073341",
  "recipientPublicKey": "23d27f616e304ef2046a60b762683b8dabebe0d8fc26e5ecdb1d5f3d291dbe21",
  "amount": 204921300000000,
  "fee": 50000000,
  "signature": "3c8e551f60fedb81e52835c69e8b158eb1b8b3c89a04d3df5adc0d99017ffbcb06a7b16ad76d519f80df019c930960317a67e8d18ab1e85e575c9470000cf607",
  "signatures": [],
  "confirmations": 3660548,
  "asset": {}
}

پیغام کے لین دین کے لیے، سب سے اہم چیز ہے۔ asset - آپ کو آبجیکٹ میں ایک پیغام رکھنے کی ضرورت ہے۔ chat ساخت کے ساتھ:

  • message - خفیہ کردہ پیغام کو محفوظ کریں۔
  • own_message --.nonce
  • type - پیغام کی قسم

پیغامات کو بھی اقسام میں تقسیم کیا گیا ہے۔ بنیادی طور پر، پیرامیٹر type آپ کو سمجھنے کا طریقہ بتاتا ہے۔ message. آپ صرف ایک متن بھیج سکتے ہیں، یا آپ اندر کی دلچسپ چیزوں کے ساتھ کوئی چیز بھیج سکتے ہیں - مثال کے طور پر، میسنجر اس طرح چیٹس میں کریپٹو کرنسی کی منتقلی کرتا ہے۔

نتیجے کے طور پر، ہم ایک لین دین بناتے ہیں:

{
  "transaction": {
    "type": 8,
    "amount": 0,
    "senderId": "U12499126640447739963",
    "senderPublicKey": "e9cafb1e7b403c4cf247c94f73ee4cada367fcc130cb3888219a0ba0633230b6",
    "asset": {
      "chat": {
        "message": "cb682accceef92d7cddaaddb787d1184ab5428",
        "own_message": "e7d8f90ddf7d70efe359c3e4ecfb5ed3802297b248eacbd6",
        "type": 1
      }
    },
    "recipientId": "U15677078342684640219",
    "timestamp": 63228087,
    "signature": "тут будет подпись"
  }
}

لین دین کے دستخط

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

لیکن دستخط خود نجی کلید کا استعمال کرتے ہوئے کیا جاتا ہے:

ایک وکندریقرت میسنجر بلاکچین پر کیسے کام کرتا ہے؟

خاکہ ظاہر کرتا ہے کہ ہم پہلے SHA-256 کے ساتھ لین دین کو ہیش کرتے ہیں اور پھر اس پر دستخط کرتے ہیں۔ Ed25519 EdDSA اور ایک دستخط حاصل کریں signature، اور ٹرانزیکشن ID SHA-256 ہیش کا حصہ ہے۔

مثال کے نفاذ:

1 - ایک ڈیٹا بلاک بنائیں، بشمول ایک پیغام

/**
 * Calls `getBytes` based on transaction type
 * @see privateTypes
 * @implements {ByteBuffer}
 * @param {transaction} trs
 * @param {boolean} skipSignature
 * @param {boolean} skipSecondSignature
 * @return {!Array} Contents as an ArrayBuffer.
 * @throws {error} If buffer fails.
 */

adamant.getBytes = function (transaction) {

  ...

  switch (transaction.type) {
    case constants.Transactions.SEND:
      break
    case constants.Transactions.CHAT_MESSAGE:
      assetBytes = this.chatGetBytes(transaction)
      assetSize = assetBytes.length
      break

…

    default:
      alert('Not supported yet')
  }

  var bb = new ByteBuffer(1 + 4 + 32 + 8 + 8 + 64 + 64 + assetSize, true)

  bb.writeByte(transaction.type)
  bb.writeInt(transaction.timestamp)

  ...

  bb.flip()
  var arrayBuffer = new Uint8Array(bb.toArrayBuffer())
  var buffer = []

  for (var i = 0; i < arrayBuffer.length; i++) {
    buffer[i] = arrayBuffer[i]
  }

  return Buffer.from(buffer)
}

2 - ڈیٹا بلاک سے SHA-256 شمار کریں۔

/**
 * Creates hash based on transaction bytes.
 * @implements {getBytes}
 * @implements {crypto.createHash}
 * @param {transaction} trs
 * @return {hash} sha256 crypto hash
 */
adamant.getHash = function (trs) {
  return crypto.createHash('sha256').update(this.getBytes(trs)).digest()
}

3 - لین دین پر دستخط کریں۔

adamant.transactionSign = function (trs, keypair) {
  var hash = this.getHash(trs)
  return this.sign(hash, keypair).toString('hex')
}

/**
 * Creates a signature based on a hash and a keypair.
 * @implements {sodium}
 * @param {hash} hash
 * @param {keypair} keypair
 * @return {signature} signature
 */
adamant.sign = function (hash, keypair) {
  return sodium.crypto_sign_detached(hash, Buffer.from(keypair.privateKey, 'hex'))
}

نیٹ ورک نوڈ پر پیغام کے ساتھ لین دین بھیجنا

چونکہ نیٹ ورک وکندریقرت ہے، کھلے API والے نوڈس میں سے کوئی بھی کام کرے گا۔ اختتامی نقطہ پر POST کی درخواست کرنا api/transactions:

curl 'api/transactions' -X POST 
  -d 'TX_DATA'

جواب میں ہمیں اس قسم کی ٹرانزیکشن ID موصول ہوگی۔

{
    "success": true,
    "nodeTimestamp": 63228852,
    "transactionId": "6146865104403680934"
}

لین دین کی توثیق

نوڈس کا تقسیم شدہ نظام، اتفاق رائے پر مبنی، لین دین کے پیغام کی "صداقت" کا تعین کرتا ہے۔ کس کی طرف سے اور کس کو، کب، کیا پیغام کو دوسرے سے تبدیل کیا گیا تھا، اور کیا بھیجنے کا وقت صحیح طور پر بتایا گیا تھا۔ یہ بلاکچین کا ایک بہت اہم فائدہ ہے - وہاں کوئی مرکزی ڈھانچہ نہیں ہے جو تصدیق کے لیے ذمہ دار ہو، اور پیغامات کی ترتیب اور ان کے مواد کو جعلی نہیں بنایا جا سکتا۔

سب سے پہلے، ایک نوڈ درستگی کی جانچ کرتا ہے، اور پھر اسے دوسروں کو بھیجتا ہے - اگر اکثریت کہتی ہے کہ سب کچھ ترتیب میں ہے، تو لین دین کو سلسلہ کے اگلے بلاک میں شامل کیا جائے گا - یہ اتفاق رائے ہے۔

ایک وکندریقرت میسنجر بلاکچین پر کیسے کام کرتا ہے؟

نوڈ کوڈ کا وہ حصہ جو چیک کے لیے ذمہ دار ہے GitHub پر دیکھا جا سکتا ہے۔ validator.js и verify.js. جی ہاں، نوڈ Node.js پر چلتا ہے۔

ایک بلاک میں ایک پیغام کے ساتھ ایک ٹرانزیکشن بھی شامل ہے

اگر اتفاق رائے ہو جاتا ہے تو، ہمارے پیغام کے ساتھ لین دین کو دیگر درست لین دین کے ساتھ اگلے بلاک میں شامل کیا جائے گا۔

بلاکس کی ایک سخت ترتیب ہے، اور ہر بعد میں آنے والا بلاک پچھلے بلاکس کی ہیش کی بنیاد پر بنتا ہے۔

ایک وکندریقرت میسنجر بلاکچین پر کیسے کام کرتا ہے؟

بات یہ ہے کہ ہمارا پیغام بھی اس ترتیب میں شامل ہے اور اسے "دوبارہ ترتیب" نہیں دیا جا سکتا۔ اگر کئی پیغامات بلاک میں آتے ہیں، تو ان کے آرڈر کا تعین کیا جائے گا۔ timestamp پیغامات

پیغامات پڑھنا

میسنجر ایپلیکیشن بلاک چین سے لین دین کو بازیافت کرتی ہے جو وصول کنندہ کو بھیجی جاتی ہیں۔ اس کے لیے ہم نے ایک اختتامی نقطہ بنایا api/chatrooms.

تمام لین دین ہر ایک کے لیے دستیاب ہیں - آپ کو خفیہ کردہ پیغامات موصول ہو سکتے ہیں۔ لیکن صرف وصول کنندہ ہی اپنی نجی کلید اور بھیجنے والے کی عوامی کلید کا استعمال کرکے ڈکرپٹ کرسکتا ہے:

**
 * Decodes the incoming message
 * @param {any} msg encoded message
 * @param {string} senderPublicKey sender public key
 * @param {string} privateKey our private key
 * @param {any} nonce nonce
 * @returns {string}
 */
adamant.decodeMessage = function (msg, senderPublicKey, privateKey, nonce) {
  if (typeof msg === 'string') {
    msg = hexToBytes(msg)
  }

  if (typeof nonce === 'string') {
    nonce = hexToBytes(nonce)
  }

  if (typeof senderPublicKey === 'string') {
    senderPublicKey = hexToBytes(senderPublicKey)
  }

  if (typeof privateKey === 'string') {
    privateKey = hexToBytes(privateKey)
  }

  const DHPublicKey = ed2curve.convertPublicKey(senderPublicKey)
  const DHSecretKey = ed2curve.convertSecretKey(privateKey)
  const decrypted = nacl.box.open(msg, nonce, DHPublicKey, DHSecretKey)

  return decrypted ? decode(decrypted) : ''
}

اور کیا؟

چونکہ پیغامات اس طریقے سے تقریباً 5 سیکنڈ میں ڈیلیور کیے جاتے ہیں - یہ وہ وقت ہے جب ایک نیا نیٹ ورک بلاک ظاہر ہوتا ہے - ہم کلائنٹ سے نوڈ اور نوڈ سے نوڈ ساکٹ کنکشن لے کر آئے ہیں۔ جب کوئی نوڈ ایک نیا لین دین حاصل کرتا ہے، تو وہ اس کی درستگی کی جانچ کرتا ہے اور اسے دوسرے نوڈس کو بھیج دیتا ہے۔ اتفاق رائے ہونے اور بلاک میں شمولیت سے پہلے ہی یہ لین دین میسنجر کلائنٹس کے لیے دستیاب ہے۔ اس طرح ہم باقاعدہ انسٹنٹ میسنجر کی طرح فوری طور پر پیغامات پہنچائیں گے۔

ایڈریس بک کو ذخیرہ کرنے کے لیے، ہم نے KVS - Key-value Storage - یہ ایک اور قسم کا لین دین ہے جس میں asset یہ NaCl-box نہیں ہے جو انکرپٹڈ ہے، لیکن NaCl سیکریٹ باکس. اس طرح میسنجر دوسرے ڈیٹا کو اسٹور کرتا ہے۔

فائل/تصویر کی منتقلی اور گروپ چیٹس میں ابھی بھی بہت زیادہ کام کی ضرورت ہے۔ بلاشبہ، غلطی اور غلطی کی شکل میں اسے جلدی سے "خراب" کیا جا سکتا ہے، لیکن ہم رازداری کی اسی سطح کو برقرار رکھنا چاہتے ہیں۔

جی ہاں، ابھی بھی کام کرنا باقی ہے - مثالی طور پر، حقیقی رازداری یہ مانتی ہے کہ صارف عوامی نیٹ ورک نوڈس سے منسلک نہیں ہوں گے، لیکن خود کو اٹھائیں گے۔ آپ کے خیال میں کتنے فیصد صارفین ایسا کرتے ہیں؟ یہ ٹھیک ہے، 0۔ ہم میسنجر کے ٹور ورژن کے ساتھ اس مسئلے کو جزوی طور پر حل کرنے کے قابل تھے۔

ہم نے ثابت کیا ہے کہ بلاکچین پر میسنجر موجود ہو سکتا ہے۔ اس سے پہلے، 2012 میں صرف ایک کوشش تھی - بٹ میسیج، جو پیغام کی ترسیل کے طویل وقت، CPU لوڈ، اور موبائل ایپلیکیشنز کی کمی کی وجہ سے ناکام ہو گیا۔

اور شکوک و شبہات اس حقیقت کی وجہ سے ہیں کہ بلاکچین پر میسنجر اپنے وقت سے پہلے ہیں - لوگ اپنے اکاؤنٹ کی ذمہ داری لینے کے لیے تیار نہیں ہیں، ذاتی معلومات کا مالک ہونا ابھی ایک رجحان نہیں ہے، اور ٹیکنالوجی بلاک چین پر تیز رفتاری کی اجازت نہیں دیتی ہے۔ ہمارے پراجیکٹ کے مزید تکنیکی اینالاگ اگلا ظاہر ہوں گے۔ آپ دیکھیں گے۔

ماخذ: www.habr.com

نیا تبصرہ شامل کریں