Kif jaħdem messaġġier deċentralizzat fuq il-blockchain?

Fil-bidu tal-2017, bdejna noħolqu messaġġier fuq il-blockchain [l-isem u l-link huma fil-profil] billi ddiskutejna l-vantaġġi fuq il-messaġġiera P2P klassika.

Għadda 2.5 sena, u stajna nikkonfermaw il-kunċett tagħna: l-applikazzjonijiet tal-messaġġier issa huma disponibbli għal iOS, Web PWA, Windows, GNU/Linux, Mac OS u Android.

Illum se ngħidulek kif jaħdem il-messaġġier blockchain u kif l-applikazzjonijiet tal-klijenti jistgħu jaħdmu bl-API tiegħu.
Kif jaħdem messaġġier deċentralizzat fuq il-blockchain?

Ridna li l-blockchain issolvi l-kwistjonijiet ta’ sigurtà u privatezza ta’ messaġġiera P2P klassika:

  • Klikk waħda biex toħloq kont - l-ebda telefons jew emails, l-ebda aċċess għal kotba tal-indirizzi jew ġeolokalizzazzjonijiet.
  • L-interlokuturi qatt ma jistabbilixxu konnessjonijiet diretti il-komunikazzjoni kollha sseħħ permezz ta 'sistema distribwita ta' nodi. L-indirizzi IP tal-utenti mhumiex aċċessibbli għal xulxin.
  • Il-messaġġi kollha huma encrypted End-to-End curve25519xsalsa20poly1305. Jidher li dan mhu se jissorprendi lil ħadd, iżda l-kodiċi tas-sors tagħna huwa miftuħ.
  • L-attakk MITM huwa eskluż - kull messaġġ huwa tranżazzjoni u huwa ffirmat minn Ed25519 EdDSA.
  • Il-messaġġ jispiċċa fil-blokk tiegħu stess. Konsistenza u timestamp Ma tistax tiffissa l-blokki, u għalhekk l-ordni tal-messaġġi.
  • "Ma għidtx li" mhux se taħdem b'messaġġi fuq il-blockchain.
  • M'hemm l-ebda struttura ċentrali li tagħmel kontrolli fuq "l-awtentiċità" ta 'messaġġ. Dan isir minn sistema distribwita ta 'nodi bbażata fuq kunsens, u hija proprjetà tal-utenti.
  • Impossibilità ta' ċensura - il-kontijiet ma jistgħux jiġu mblukkati u l-messaġġi ma jistgħux jitħassru.
  • Blockchain 2FA hija alternattiva għall-infernali 2FA permezz ta 'SMS, rovina ħafna saħħa.
  • Il-ħila li tikseb il-konversazzjonijiet kollha tiegħek minn kwalunkwe apparat fi kwalunkwe ħin tfisser li m'għandekx għalfejn taħżen konversazzjonijiet lokalment xejn.
  • Konferma tat-twassil tal-messaġġ. Mhux għall-apparat tal-utent, iżda għan-netwerk. Essenzjalment, din hija konferma tal-kapaċità tar-riċevitur li jaqra l-messaġġ tiegħek. Din hija karatteristika utli biex jintbagħtu notifiki kritiċi.

Il-benefiċċji tal-Blockchain jinkludu wkoll integrazzjoni mill-qrib mal-kripto-muniti Ethereum, Dogecoin, Lisk, Dash, Bitcoin (dan għadu għaddej) u l-abbiltà li tibgħat tokens fiċ-chats. Aħna anke għamilna kripto exchanger integrat.

U mbagħad - kif jaħdem kollox.

Messaġġ huwa tranżazzjoni

Kulħadd huwa diġà mdorri għall-fatt li t-tranżazzjonijiet fil-blockchain jittrasferixxu tokens (muniti) minn utent għal ieħor. Bħal Bitcoin. Ħloqna tip speċjali ta 'tranżazzjoni għat-trażmissjoni ta' messaġġi.

Biex tibgħat messaġġ f'messaġġier fuq il-blockchain, trid tgħaddi minn diversi passi:

  1. Encrypt test tal-messaġġ
  2. Poġġi ċiphertext fi tranżazzjoni
  3. Iffirma t-tranżazzjoni
  4. Ibgħat transazzjoni lil kwalunkwe nodu tan-netwerk
  5. Sistema distribwita ta 'nodi tiddetermina l-"awtentiċità" ta' messaġġ
  6. Jekk kollox huwa OK, it-tranżazzjoni bil-messaġġ hija inkluża fil-blokk li jmiss
  7. Ir-riċevitur jirkupra t-tranżazzjoni tal-messaġġ u jiddeċifra

Il-passi 1–3 u 7 jitwettqu lokalment fuq il-klijent, u l-passi 5–6 jitwettqu fuq l-ospiti.

Encryption tal-messaġġ

Il-messaġġ huwa encrypted biċ-ċavetta privata ta' min jibgħat u ċ-ċavetta pubblika tar-riċevitur. Se nieħdu ċ-ċavetta pubblika min-netwerk, iżda għal dan, il-kont tar-riċevitur għandu jkun inizjalizzat, jiġifieri, ikollu mill-inqas transazzjoni waħda. Tista' tuża talba REST GET /api/accounts/getPublicKey?address={ADAMANT address}, u meta jitgħabbew iċ-chats, iċ-ċwievet pubbliċi tal-interlokuturi jkunu diġà disponibbli.

Kif jaħdem messaġġier deċentralizzat fuq il-blockchain?

Il-messaġġier jikkodifika l-messaġġi billi juża l-algoritmu curve25519xsalsa20poly1305 (Kaxxa NaCl). Peress li l-kont fih ċwievet Ed25519, biex jiffurmaw kaxxa, iċ-ċwievet l-ewwel iridu jiġu kkonvertiti għal Curve25519 Diffie-Hellman.

Hawn eżempju fil-JavaScript:

/**
 * 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)
  }
}

Li tifforma tranżazzjoni b'messaġġ

It-tranżazzjoni għandha l-istruttura ġenerali li ġejja:

{
  "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": {}
}

Għal transazzjoni ta 'messaġġ, l-iktar ħaġa importanti hija asset - għandek bżonn tpoġġi messaġġ fl-oġġett chat bi struttura:

  • message - ħlief il-messaġġ kriptat
  • own_message - nonce
  • type — tip ta' messaġġ

Il-messaġġi huma wkoll maqsuma f'tipi. Essenzjalment, il-parametru type jgħidlek kif tifhem message. Tista 'tibgħat biss test, jew tista' tibgħat oġġett b'affarijiet interessanti ġewwa - per eżempju, dan huwa kif il-messaġġier jagħmel trasferimenti ta 'kripto-munita fiċ-chats.

Bħala riżultat, noħolqu tranżazzjoni:

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

Firma tat-tranżazzjoni

Biex jiġi żgurat li kulħadd ikun kunfidenti fl-awtentiċità tal-mittent u r-riċevitur, il-ħin li jintbagħat u l-kontenut tal-messaġġ, it-tranżazzjoni tiġi ffirmata. Firma diġitali tippermettilek tivverifika l-awtentiċità ta 'tranżazzjoni billi tuża ċavetta pubblika - għal dan mhix meħtieġa ċavetta privata.

Iżda l-firma nnifisha titwettaq bl-użu taċ-ċavetta privata:

Kif jaħdem messaġġier deċentralizzat fuq il-blockchain?

Id-dijagramma turi li l-ewwel nixxefqu t-tranżazzjoni ma SHA-256 u mbagħad niffirmawha Ed25519 EdDSA u ġib firma signature, u l-ID tat-tranżazzjoni hija parti mill-hash SHA-256.

Eżempju ta' implimentazzjoni:

1 — Ifforma blokk tad-dejta, inkluż messaġġ

/**
 * 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 - Għadd SHA-256 mill-blokk tad-dejta

/**
 * 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 — Iffirma t-tranżazzjoni

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'))
}

Tibgħat transazzjoni b'messaġġ lil nodu tan-netwerk

Peress li n-netwerk huwa deċentralizzat, kwalunkwe nodi b'API miftuħa se jagħmel. Tagħmel talba POST lill-endpoint api/transactions:

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

Bi tweġiba aħna nirċievu ID tat-tranżazzjoni tat-tip

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

Validazzjoni tat-Tranżazzjoni

Sistema distribwita ta 'nodi, ibbażata fuq kunsens, tiddetermina l-"awtentiċità" tal-messaġġ tat-tranżazzjoni. Minn min u lil min, meta, jekk il-messaġġ kienx sostitwit b'ieħor, u jekk il-ħin ta' meta jintbagħat kienx indikat b'mod korrett. Dan huwa vantaġġ importanti ħafna tal-blockchain - m'hemm l-ebda struttura ċentrali li hija responsabbli għall-verifika, u s-sekwenza tal-messaġġi u l-kontenut tagħhom ma jistgħux jiġu ffalsifikati.

L-ewwel, nodu wieħed jiċċekkja l-eżattezza, u mbagħad jibgħatha lill-oħrajn - jekk il-maġġoranza tgħid li kollox huwa fl-ordni, it-tranżazzjoni se tkun inkluża fil-blokk li jmiss tal-katina - dan huwa kunsens.

Kif jaħdem messaġġier deċentralizzat fuq il-blockchain?

Il-parti tal-kodiċi tan-node li hija responsabbli għall-kontrolli tista 'tara fuq GitHub - validator.js и verify.js. Iva, in-node jimxi fuq Node.js.

Inkluż transazzjoni b'messaġġ fi blokk

Jekk jintlaħaq kunsens, it-tranżazzjoni bil-messaġġ tagħna tiġi inkluża fil-blokk li jmiss flimkien ma 'tranżazzjonijiet validi oħra.

Il-blokki għandhom sekwenza stretta, u kull blokk sussegwenti huwa ffurmat ibbażat fuq il-hashes ta 'blokki preċedenti.

Kif jaħdem messaġġier deċentralizzat fuq il-blockchain?

Il-punt hu li l-messaġġ tagħna huwa inkluż ukoll f'din is-sekwenza u ma jistax jiġi "rranġat mill-ġdid". Jekk diversi messaġġi jaqgħu fi blokk, l-ordni tagħhom tkun determinata minn timestamp messaġġi.

Qari messaġġi

L-applikazzjoni tal-messaġġier tirkupra tranżazzjonijiet mill-blockchain li jintbagħtu lir-riċevitur. Għal dan għamilna endpoint api/chatrooms.

It-tranżazzjonijiet kollha huma disponibbli għal kulħadd - tista 'tirċievi messaġġi kriptati. Iżda r-riċevitur biss jista' jiddekofra billi juża ċ-ċavetta privata tiegħu u ċ-ċavetta pubblika ta' min jibgħat:

**
 * 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) : ''
}

U x'iktar?

Peress li l-messaġġi jitwasslu b'dan il-mod f'madwar 5 sekondi - dan huwa l-ħin li jidher blokka ġdida tan-netwerk - ħriġna b'konnessjoni ta 'socket klijent għal node u node għal node. Meta nodu jirċievi tranżazzjoni ġdida, jiċċekkja l-validità tiegħu u jgħaddiha lil nodi oħra. It-tranżazzjoni hija disponibbli għall-klijenti tal-messaġġiera anki qabel ma jseħħ il-kunsens u l-inklużjoni fil-blokk. B'dan il-mod aħna se nwasslu messaġġi istantanjament, bħal messaġġiera instantanja regolari.

Biex taħżen il-ktieb tal-indirizzi, għamilna KVS - Key-Value Storage - dan huwa tip ieħor ta 'tranżazzjoni li fiha asset mhuwiex NaCl-box li huwa encrypted, iżda NaCl-secretbox. Dan huwa kif il-messaġġier jaħżen data oħra.

It-trasferimenti tal-fajls/immaġini u ċ-chats tal-grupp għadhom jeħtieġu ħafna xogħol. Naturalment, fil-format blunder-and-blunder dan jista 'jiġi "ivitat" malajr, iżda rridu nżommu l-istess livell ta' privatezza.

Iva, għad hemm xogħol xi jsir - idealment, il-privatezza reali tassumi li l-utenti mhux se jgħaqqdu man-nodi tan-netwerk pubbliku, iżda se jgħollu tagħhom stess. X'perċentwal ta' utenti taħseb li jagħmel dan? Dak id-dritt, 0. Konna kapaċi nsolvu parzjalment din il-kwistjoni bil-verżjoni Tor tal-messaġġier.

Aħna ppruvajna li jista’ jeżisti messaġġier fuq il-blockchain. Preċedentement, kien hemm tentattiv wieħed biss fl-2012 - bitmessage, li fallew minħabba ħinijiet twal ta 'kunsinna ta' messaġġi, tagħbija tas-CPU, u nuqqas ta 'applikazzjonijiet mobbli.

U x-xettiċiżmu huwa dovut għall-fatt li l-messaġġiera fuq il-blockchain huma qabel iż-żmien tagħhom - in-nies mhumiex lesti li jieħdu r-responsabbiltà għall-kont tagħhom, il-pussess ta 'informazzjoni personali għadha mhix tendenza, u t-teknoloġija ma tippermettix veloċitajiet għoljin fuq il-blockchain. Aktar analogi teknoloġiċi tal-proġett tagħna se jidhru jmiss. Int ser tara.

Sors: www.habr.com

Żid kumment