ڪيئن هڪ decentralized رسول ڪم ڪندو blockchain تي؟

2017 جي شروعات ۾، اسان بلاڪچين تي هڪ ميسينجر ٺاهڻ شروع ڪيو [نالو ۽ لنڪ پروفائل ۾ آهن] کلاسک P2P ميسينجرز جي فائدن تي بحث ڪندي.

پاس ڪيائين 2.5 سال، ۽ اسان اسان جي تصور جي تصديق ڪرڻ جي قابل ٿي ويا: ميسينجر ايپليڪيشنون هاڻي iOS، ويب PWA، ونڊوز، GNU/Linux، Mac OS ۽ Android لاءِ دستياب آهن.

اڄ اسين توهان کي ٻڌائينداسين ته بلاڪچين ميسينجر ڪيئن ڪم ڪري ٿو ۽ ڪئين ڪلائنٽ ايپليڪيشنون ان جي API سان ڪم ڪري سگهن ٿيون.
ڪيئن هڪ decentralized رسول ڪم ڪندو blockchain تي؟

اسان چاهيون ٿا بلاڪچين کلاسک P2P ميسينجرز جي سيڪيورٽي ۽ رازداري جي مسئلن کي حل ڪرڻ لاءِ:

  • اڪائونٽ ٺاهڻ لاءِ هڪ ڪلڪ ڪريو - نه فون يا اي ميلون، نه ايڊريس ڪتابن تائين رسائي يا جاگرافيائي هنڌ.
  • ڳالهائيندڙ ڪڏهن به سڌو سنئون ڪنيڪشن قائم نٿا ڪن؛ سڀئي ڪميونيڪيشن نوڊس جي ورهايل نظام ذريعي ٿيندي آهي. صارفين جا IP پتا هڪ ٻئي تائين رسائي نٿا سگهن.
  • سڀ نياپا Encrypted آهن Encrypted End-to-End curve25519xsalsa20poly1305. اهو لڳي ٿو ته اهو ڪنهن کي حيران نه ڪندو، پر اسان جو ذريعو ڪوڊ کليل آهي.
  • MITM حملي کي خارج ڪيو ويو آهي - هر پيغام هڪ ٽرانزيڪشن آهي ۽ Ed25519 EdDSA پاران دستخط ٿيل آهي.
  • پيغام پنهنجي بلاڪ ۾ ختم ٿئي ٿو. مطابقت ۽ timestamp توھان بلاڪ کي درست نٿا ڪري سگھو، ۽ تنھنڪري پيغامن جي ترتيب.
  • "مون اهو نه چيو آهي" بلاڪچين تي پيغامن سان ڪم نه ڪندو.
  • ڪو به مرڪزي ڍانچو نه آهي جيڪو چيڪ ڪري ٿو پيغام جي "صداقت" تي. اهو اتفاق جي بنياد تي نوڊس جي ورهايل سسٽم طرفان ڪيو ويندو آهي، ۽ اهو صارفين جي ملڪيت آهي.
  • سينسرشپ جو امڪان - اڪائونٽس بلاڪ نه ٿي ڪري سگھجي ۽ پيغام ختم نه ٿي ڪري سگھجي.
  • Blockchain 2FA ھڪڙو متبادل آھي دوزخي 2FA جو ايس ايم ايس ذريعي، تمام گهڻو صحت خراب ڪيو.
  • ڪنهن به وقت توهان جي سڀني ڳالهين کي ڪنهن به ڊوائيس تان حاصل ڪرڻ جي صلاحيت جو مطلب آهي توهان کي گفتگو کي مقامي طور تي ذخيرو ڪرڻ جي ضرورت ناهي.
  • پيغام پهچائڻ جي تصديق. نه صارف جي ڊوائيس ڏانهن، پر نيٽ ورڪ ڏانهن. لازمي طور تي، هي توهان جي پيغام کي پڙهڻ لاء وصول ڪندڙ جي صلاحيت جي تصديق آهي. هي نازڪ نوٽيفڪيشن موڪلڻ لاءِ هڪ مفيد خصوصيت آهي.

Blockchain فائدن ۾ cryptocurrencies Ethereum، Dogecoin، Lisk، Dash، Bitcoin (اهو اڃا تائين جاري آهي) ۽ چيٽ ۾ ٽوڪن موڪلڻ جي صلاحيت سان ويجهي انضمام شامل آهن. اسان هڪ تعمير ٿيل crypto exchanger پڻ ٺاهيو.

۽ پوء - اهو سڀ ڪيئن ڪم ڪري ٿو.

هڪ پيغام هڪ ٽرانزيڪشن آهي

هرڪو اڳ ۾ ئي هن حقيقت جي عادي آهي ته بلاڪچين منتقلي ٽوڪن ۾ ٽرانزيڪشن (سڪين) هڪ صارف کان ٻئي ڏانهن. Bitcoin وانگر. اسان پيغامن جي منتقلي لاءِ هڪ خاص قسم جو ٽرانزيڪشن ٺاهيو.

بلاڪچين تي ميسينجر ۾ پيغام موڪلڻ لاءِ، توهان کي ڪيترن ئي مرحلن مان گذرڻو پوندو:

  1. پيغام جي متن کي انڪرپٽ ڪريو
  2. ciphertext کي ٽرانزيڪشن ۾ داخل ڪريو
  3. ٽرانزيڪشن تي دستخط ڪريو
  4. ڪنهن به نيٽ ورڪ نوڊ ڏانهن ٽرانزيڪشن موڪليو
  5. نوڊس جو ورهايل نظام هڪ پيغام جي "صداقت" کي طئي ڪري ٿو
  6. جيڪڏهن سڀ ڪجهه ٺيڪ آهي، پيغام سان ٽرانزيڪشن ايندڙ بلاڪ ۾ شامل آهي
  7. وصول ڪندڙ پيغام جي ٽرانزيڪشن کي ٻيهر حاصل ڪري ٿو ۽ ڊيڪرپٽس

مرحلا 1-3 ۽ 7 ڪلائنٽ تي مقامي طور تي ڪيا ويا آهن، ۽ مرحلا 5-6 ميزبان تي ڪيا ويا آهن.

پيغام جي انڪوشن

پيغام موڪليندڙ جي خانگي چيڪ ۽ وصول ڪندڙ جي عوامي ڪيئي سان گڏ انڪوڊ ٿيل آهي. اسان نيٽ ورڪ مان عوامي ڪنجي وٺنداسين، پر ان لاءِ، وصول ڪندڙ جو اڪائونٽ ضرور شروع ڪيو وڃي، يعني گهٽ ۾ گهٽ هڪ ٽرانزيڪشن هجي. توھان استعمال ڪري سگھو ٿا REST درخواست GET /api/accounts/getPublicKey?address={ADAMANT address}، ۽ جڏهن چيٽ لوڊ ڪندي، ڳالهائيندڙن جون عوامي چابيون اڳ ۾ ئي موجود هونديون.

ڪيئن هڪ decentralized رسول ڪم ڪندو blockchain تي؟

ميسينجر وکر25519xsalsa20poly1305 الگورتھم استعمال ڪندي پيغامن کي انڪرپٽ ڪري ٿو (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 - نه
  • type - پيغام جو قسم

پيغام پڻ قسمن ۾ ورهايل آهن. بنيادي طور تي، پيٽرولر type توهان کي ٻڌائي ٿو ته ڪيئن سمجهڻ message. توهان صرف هڪ ٽيڪسٽ موڪلي سگهو ٿا، يا توهان اندر اندر دلچسپ شين سان هڪ اعتراض موڪلي سگهو ٿا - مثال طور، هي ڪيئن ميسينجر چيٽس ۾ cryptocurrency منتقلي ڪندو آهي.

نتيجي طور، اسان هڪ ٽرانزيڪشن ٺاهي:

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

ٽرانزيڪشن جي دستخط

انهي ڳالهه کي يقيني بڻائڻ ته هرڪو موڪليندڙ ۽ وصول ڪندڙ جي صداقت، موڪلڻ جو وقت ۽ پيغام جو مواد، ٽرانزيڪشن تي دستخط ٿيل آهي. هڪ ڊجيٽل دستخط توهان کي اجازت ڏئي ٿو ته ٽرانزيڪشن جي صداقت جي تصديق ڪرڻ لاءِ عوامي چيڪ استعمال ڪندي - ان لاءِ هڪ خانگي چيڪ جي ضرورت ناهي.

پر دستخط پاڻ پرائيويٽ ڪنجي استعمال ڪندي ڪيو ويندو آهي:

ڪيئن هڪ decentralized رسول ڪم ڪندو blockchain تي؟

ڊراگرام ڏيکاري ٿو ته اسان پهريان 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 سان ڪندا. آخري پوائنٽ تائين پوسٽ جي درخواست ڪرڻ api/transactions:

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

جواب ۾ اسان کي قسم جي ٽرانزيڪشن ID ملي ويندي

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

ٽرانزيڪشن جي تصديق

نوڊس جو هڪ ورهايل نظام، اتفاق راءِ جي بنياد تي، ٽرانزيڪشن جي پيغام جي "صداقت" کي طئي ڪري ٿو. ڪنهن کان ۽ ڪنهن ڏانهن، ڪڏهن، ڇا پيغام کي ڪنهن ٻئي سان تبديل ڪيو ويو، ۽ ڇا موڪلڻ جو وقت صحيح طور تي اشارو ڪيو ويو. هي بلاڪچين جو هڪ تمام اهم فائدو آهي - اتي ڪو مرڪزي ڍانچو ناهي جيڪو تصديق لاءِ ذميوار هجي، ۽ پيغامن جي ترتيب ۽ انهن جي مواد کي جعلي نٿو ڪري سگهجي.

پهرين، هڪ نوڊ جي درستگي کي چيڪ ڪري ٿو، ۽ پوء ان کي ٻين ڏانهن موڪلي ٿو - جيڪڏهن اڪثريت چوي ٿو ته هر شيء ترتيب ۾ آهي، ٽرانزيڪشن کي زنجير جي ايندڙ بلاڪ ۾ شامل ڪيو ويندو - اهو اتفاق آهي.

ڪيئن هڪ decentralized رسول ڪم ڪندو blockchain تي؟

نوڊ ڪوڊ جو حصو جيڪو چيڪن لاءِ ذميوار آهي GitHub تي ڏسي سگھجي ٿو - validator.js и verify.js. ها، نوڊ Node.js تي هلندو آهي.

هڪ بلاڪ ۾ هڪ پيغام سان ٽرانزيڪشن سميت

جيڪڏهن اتفاق ڪيو وڃي ته، اسان جي پيغام سان ٽرانزيڪشن کي ايندڙ بلاڪ ۾ ٻين صحيح ٽرانزيڪشن سان گڏ شامل ڪيو ويندو.

بلاڪ جو هڪ سخت سلسلو آهي، ۽ هر ايندڙ بلاڪ اڳوڻي بلاڪ جي هيش جي بنياد تي ٺهيل آهي.

ڪيئن هڪ decentralized رسول ڪم ڪندو blockchain تي؟

نقطو اهو آهي ته اسان جو پيغام پڻ هن ترتيب ۾ شامل آهي ۽ "ٻيهر ترتيب" نه ٿو ڪري سگهجي. جيڪڏهن ڪيترائي نياپا هڪ بلاڪ ۾ اچي وڃن ٿا، انهن جي ترتيب طرفان طئي ڪيو ويندو 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-secretbox. اهڙي طرح ميسينجر ٻين ڊيٽا کي محفوظ ڪري ٿو.

فائل / تصويرن جي منتقلي ۽ گروپ چيٽ اڃا تائين تمام گهڻو ڪم جي ضرورت آهي. يقينن، غلطي ۽ غلطي جي شڪل ۾ اهو ٿي سگهي ٿو "خراب" جلدي، پر اسان رازداري جي ساڳئي سطح کي برقرار رکڻ چاهيون ٿا.

ها، اڃا تائين ڪم ڪرڻو آهي - مثالي طور تي، حقيقي رازداري فرض ڪري ٿو ته صارف عوامي نيٽ ورڪ نوڊس سان ڳنڍي نه سگهندا، پر پنهنجو پاڻ کي وڌائيندو. توهان جي خيال ۾ صارفين جو ڪيترو سيڪڙو اهو آهي؟ اھو صحيح آھي، 0. اسان جزوي طور تي ھي مسئلو حل ڪرڻ جي قابل ھئاسين ميسينجر جي Tor ورجن سان.

اسان ثابت ڪيو آهي ته blockchain تي هڪ رسول موجود ٿي سگهي ٿو. اڳي، 2012 ۾ صرف هڪ ڪوشش هئي - بٽ ميسيج، جيڪو ڊگهي پيغام پهچائڻ جي وقت، سي پي يو لوڊ، ۽ موبائل ايپليڪيشنن جي کوٽ سبب ناڪام ٿيو.

۽ شڪ جو سبب اهو آهي ته بلاڪچين تي ميسينجر پنهنجي وقت کان اڳ آهن - ماڻهو پنهنجي اڪائونٽ جي ذميواري کڻڻ لاءِ تيار نه آهن، ذاتي معلومات حاصل ڪرڻ اڃا تائين رجحان نه آهي، ۽ ٽيڪنالاجي بلاڪچين تي تيز رفتار جي اجازت نٿو ڏئي. اسان جي پروجيڪٽ جا وڌيڪ ٽيڪنالاجي اينالاگ اڳيان ظاهر ٿيندا. تون ڏسندين.

جو ذريعو: www.habr.com

تبصرو شامل ڪريو