Giunsa ang usa ka desentralisadong mensahero nga nagtrabaho sa blockchain?

Sa sinugdanan sa 2017, nagsugod kami sa paghimo og usa ka messenger sa blockchain [ngalan ug link naa sa profile] pinaagi sa paghisgot sa mga bentaha sa mga klasiko nga P2P messenger.

Nakapasar 2.5 tuig, ug napamatud-an namo ang among konsepto: ang mga aplikasyon sa mensahero anaa na karon alang sa iOS, Web PWA, Windows, GNU/Linux, Mac OS ug Android.

Karon isulti namon kanimo kung giunsa ang paglihok sa blockchain messenger ug kung giunsa ang mga aplikasyon sa kliyente magamit sa API niini.
Giunsa ang usa ka desentralisadong mensahero nga nagtrabaho sa blockchain?

Gusto namon nga masulbad sa blockchain ang mga isyu sa seguridad ug pagkapribado sa klasiko nga mga mensahero sa P2P:

  • Usa ka pag-klik aron makahimo usa ka account - walay mga telepono o email, walay access sa mga libro sa address o geolocation.
  • Ang mga interlocutor wala gayud magtukod og direkta nga mga koneksyon; ang tanan nga komunikasyon mahitabo pinaagi sa usa ka distributed nga sistema sa mga node. Ang mga IP adres sa mga tiggamit dili ma-access sa usag usa.
  • Ang tanan nga mga mensahe gi-encrypt nga End-to-End curve25519xsalsa20poly1305. Morag dili kini makapakurat sa bisan kinsa, apan ang among source code bukas.
  • Ang pag-atake sa MITM wala iapil - ang matag mensahe usa ka transaksyon ug gipirmahan sa Ed25519 EdDSA.
  • Ang mensahe natapos sa kaugalingon nga block. Ang pagkamakanunayon ug timestamp Dili nimo ma-ayo ang mga bloke, ug busa ang han-ay sa mga mensahe.
  • "Wala ko giingon nga" dili molihok sa mga mensahe sa blockchain.
  • Walay sentral nga istruktura nga nagsusi sa "pagkatinuod" sa usa ka mensahe. Gihimo kini sa usa ka gipang-apod-apod nga sistema sa mga node base sa consensus, ug kini gipanag-iya sa mga tiggamit.
  • Imposible sa censorship - ang mga account dili ma-block ug ang mga mensahe dili mapapas.
  • Ang Blockchain 2FA usa ka alternatibo sa impyerno nga 2FA pinaagi sa SMS, nakadaot sa daghang panglawas.
  • Ang abilidad nga makuha ang tanan nimong mga panag-istoryahanay gikan sa bisan unsang aparato sa bisan unsang oras nagpasabut nga dili nimo kinahanglan nga tipigan ang mga panag-istoryahanay sa lokal.
  • Pagkumpirma sa pagpadala sa mensahe. Dili sa device sa user, kondili sa network. Sa esensya, kini ang kumpirmasyon sa abilidad sa nakadawat sa pagbasa sa imong mensahe. Kini usa ka mapuslanon nga bahin sa pagpadala sa mga kritikal nga pahibalo.

Ang mga benepisyo sa Blockchain naglakip usab sa suod nga panagsama sa mga cryptocurrencies Ethereum, Dogecoin, Lisk, Dash, Bitcoin (kini nagpadayon pa) ug ang abilidad sa pagpadala mga token sa mga chat. Naghimo pa gani kami og built-in nga crypto exchanger.

Ug unya - kung giunsa kini tanan molihok.

Ang mensahe usa ka transaksyon

Ang tanan naanad na sa kamatuoran nga ang mga transaksyon sa blockchain nagbalhin sa mga token (mga sensilyo) gikan sa usa ka tiggamit ngadto sa lain. Sama sa Bitcoin. Naghimo kami usa ka espesyal nga tipo sa transaksyon alang sa pagpadala sa mga mensahe.

Aron magpadala usa ka mensahe sa usa ka mensahero sa blockchain, kinahanglan nimo nga moagi sa daghang mga lakang:

  1. I-encrypt ang text sa mensahe
  2. Ibutang ang ciphertext sa usa ka transaksyon
  3. Pirmahan ang transaksyon
  4. Pagpadala usa ka transaksyon sa bisan unsang network node
  5. Ang giapod-apod nga sistema sa mga node nagtino sa "pagkatinuod" sa usa ka mensahe
  6. Kung OK ra ang tanan, ang transaksyon sa mensahe gilakip sa sunod nga bloke
  7. Gikuha sa tigdawat ang transaksyon sa mensahe ug gi-decrypt

Ang mga lakang 1–3 ug 7 gihimo sa lokal sa kliyente, ug ang mga lakang 5–6 gihimo sa mga host.

Pag-encrypt sa mensahe

Ang mensahe gi-encrypt gamit ang pribado nga yawe sa nagpadala ug ang publiko nga yawe sa nakadawat. Among kuhaon ang publiko nga yawe gikan sa network, apan alang niini, ang account sa nakadawat kinahanglan nga magsugod, nga mao, adunay labing menos usa ka transaksyon. Mahimo nimong gamiton ang hangyo sa REST GET /api/accounts/getPublicKey?address={ADAMANT address}, ug kung mag-load sa mga chat, ang publiko nga yawe sa mga interlocutors magamit na.

Giunsa ang usa ka desentralisadong mensahero nga nagtrabaho sa blockchain?

Gi-encrypt sa messenger ang mga mensahe gamit ang curve25519xsalsa20poly1305 algorithm (Kahon sa NaCl). Tungod kay ang account adunay Ed25519 nga mga yawe, aron maporma ang usa ka kahon, ang mga yawe kinahanglan una nga mabag-o sa Curve25519 Diffie-Hellman.

Ania ang usa ka pananglitan sa 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)
  }
}

Paghimo sa usa ka transaksyon uban sa usa ka mensahe

Ang transaksyon adunay mosunod nga kinatibuk-ang istruktura:

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

Alang sa usa ka transaksyon sa mensahe, ang labing hinungdanon nga butang mao asset - kinahanglan nimong ibutang ang usa ka mensahe sa butang chat uban sa istruktura:

  • message - i-save ang naka-encrypt nga mensahe
  • own_message - dili
  • type β€” tipo sa mensahe

Ang mga mensahe gibahin usab sa mga tipo. Sa tinuud, ang parameter type nagsulti kanimo unsaon sa pagsabut message. Mahimo ka magpadala usa lang ka text, o mahimo ka magpadala usa ka butang nga adunay makapaikag nga mga butang sa sulod - pananglitan, kini ang paagi nga ang messenger naghimo sa mga pagbalhin sa cryptocurrency sa mga chat.

Ingon usa ka sangputanan, naghimo kami usa ka transaksyon:

{
  "transaction": {
    "type": 8,
    "amount": 0,
    "senderId": "U12499126640447739963",
    "senderPublicKey": "e9cafb1e7b403c4cf247c94f73ee4cada367fcc130cb3888219a0ba0633230b6",
    "asset": {
      "chat": {
        "message": "cb682accceef92d7cddaaddb787d1184ab5428",
        "own_message": "e7d8f90ddf7d70efe359c3e4ecfb5ed3802297b248eacbd6",
        "type": 1
      }
    },
    "recipientId": "U15677078342684640219",
    "timestamp": 63228087,
    "signature": "Ρ‚ΡƒΡ‚ Π±ΡƒΠ΄Π΅Ρ‚ подпись"
  }
}

Pirma sa transaksyon

Aron maseguro nga ang tanan masaligon sa pagkatinuod sa nagpadala ug nakadawat, sa panahon sa pagpadala ug sa sulod sa mensahe, ang transaksyon gipirmahan. Ang usa ka digital nga pirma nagtugot kanimo sa pag-verify sa pagkatinuod sa usa ka transaksyon gamit ang usa ka publiko nga yawe - ang usa ka pribadong yawe dili kinahanglan alang niini.

Apan ang pirma mismo gihimo gamit ang pribadong yawe:

Giunsa ang usa ka desentralisadong mensahero nga nagtrabaho sa blockchain?

Gipakita sa diagram nga una natong gi-hash ang transaksyon sa SHA-256 ug dayon pirmahan kini Ed25519 EdDSA ug kuha ug pirma signature, ug ang transaction ID kabahin sa SHA-256 hash.

Pananglitan sa pagpatuman:

1 β€” Paghimo usa ka bloke sa datos, lakip ang usa ka mensahe

/**
 * 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 - Pag-ihap sa SHA-256 gikan sa data block

/**
 * 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 β€” Pagpirma sa transaksyon

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

Pagpadala sa usa ka transaksyon nga adunay mensahe sa usa ka network node

Tungod kay ang network desentralisado, ang bisan unsang mga node nga adunay bukas nga API mahimo. Naghimo usa ka hangyo sa POST sa katapusan nga punto api/transactions:

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

Agig tubag makadawat kami ug transaction ID sa tipo

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

Pag-validate sa Transaksyon

Ang usa ka giapod-apod nga sistema sa mga node, base sa consensus, nagtino sa "pagkatinuod" sa mensahe sa transaksyon. Gikan kang kinsa ug kang kinsa, kanus-a, kung ang mensahe gipulihan ba sa lain, ug kung ang oras sa pagpadala gipakita sa husto. Kini usa ka hinungdanon kaayo nga bentaha sa blockchain - wala’y sentral nga istruktura nga responsable sa pag-verify, ug ang pagkasunod-sunod sa mga mensahe ug ang sulud niini dili mahimong peke.

Una, ang usa ka node nagsusi sa katukma, ug dayon ipadala kini sa uban - kung ang kadaghanan nag-ingon nga ang tanan naa sa kahusay, ang transaksyon ilakip sa sunod nga bloke sa kadena - kini ang consensus.

Giunsa ang usa ka desentralisadong mensahero nga nagtrabaho sa blockchain?

Ang bahin sa node code nga responsable sa mga tseke mahimong tan-awon sa GitHub - validator.js ΠΈ verify.js. Oo, ang node midagan sa Node.js.

Naglakip sa usa ka transaksyon nga adunay usa ka mensahe sa usa ka bloke

Kung maabot ang consensus, ang transaksyon sa among mensahe iapil sa sunod nga bloke kauban ang uban pang balido nga mga transaksyon.

Ang mga bloke adunay usa ka higpit nga pagkasunod-sunod, ug ang matag sunod nga bloke naporma base sa mga hash sa miaging mga bloke.

Giunsa ang usa ka desentralisadong mensahero nga nagtrabaho sa blockchain?

Ang punto mao nga ang atong mensahe gilakip usab niini nga han-ay ug dili mahimong "pag-usab". Kung daghang mga mensahe ang mahulog sa usa ka bloke, ang ilang order matino pinaagi sa timestamp mga mensahe.

Pagbasa sa mga mensahe

Ang aplikasyon sa mensahero nagkuha sa mga transaksyon gikan sa blockchain nga gipadala sa nakadawat. Alang niini naghimo kami usa ka katapusan nga punto api/chatrooms.

Ang tanan nga mga transaksyon magamit sa tanan - makadawat ka mga naka-encrypt nga mensahe. Apan ang nakadawat lamang ang maka-decrypt gamit ang iyang pribadong yawe ug ang publikong yawe sa nagpadala:

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

Ug unsa pa?

Tungod kay ang mga mensahe gihatud sa ingon niini nga paagi sa mga 5 segundos - kini ang panahon nga adunay usa ka bag-ong network block nga makita - kami adunay usa ka koneksyon sa client-to-node ug node-to-node socket. Kung ang usa ka node makadawat usa ka bag-ong transaksyon, susihon niini ang kabalido niini ug ipasa kini sa ubang mga node. Ang transaksyon magamit sa mga kliyente sa mensahero bisan sa wala pa mahitabo ang consensus ug ilakip sa block. Niining paagiha makahatud dayon kami og mga mensahe, sama sa mga regular nga instant messenger.

Aron tipigan ang address book, naghimo kami og KVS - Key-Value Storage - kini usa pa ka matang sa transaksyon diin asset dili kini NaCl-box nga gi-encrypt, apan NaCl-secretbox. Ingon niini ang paagi sa pagtago sa mensahero sa ubang mga datos.

Ang mga pagbalhin sa file/larawan ug mga chat sa grupo nanginahanglan gihapon og daghang trabaho. Siyempre, sa blunder-and-blunder nga pormat mahimo kini nga "screwed up" sa madali, apan gusto namon nga ipadayon ang parehas nga lebel sa pagkapribado.

Oo, aduna pa'y trabaho nga pagabuhaton - mas maayo, ang tinuod nga pribasiya nagtuo nga ang mga tiggamit dili magkonektar sa mga pampublikong network node, apan magpataas sa ilang kaugalingon. Unsa nga porsyento sa mga tiggamit sa imong hunahuna ang naghimo niini? Husto kana, 0. Nasulbad namo ang bahin niini nga isyu sa bersyon sa Tor sa messenger.

Among napamatud-an nga ang usa ka mensahero sa blockchain mahimong maglungtad. Kaniadto, adunay usa lamang ka pagsulay sa 2012 - bitmessage, nga napakyas tungod sa taas nga oras sa pagpadala sa mensahe, pagkarga sa CPU, ug kakulang sa mga aplikasyon sa mobile.

Ug ang pagduhaduha tungod sa kamatuoran nga ang mga mensahero sa blockchain nag-una sa ilang panahon - ang mga tawo dili andam sa pagkuha sa responsibilidad alang sa ilang account, ang pagpanag-iya sa personal nga impormasyon dili pa uso, ug ang teknolohiya wala magtugot sa taas nga tulin sa blockchain. Dugang nga mga teknolohikal nga analogue sa among proyekto ang sunod nga makita. Makita nimo.

Source: www.habr.com

Idugang sa usa ka comment