Kodi messenger yokhazikika imagwira ntchito bwanji pa blockchain?

Kumayambiriro kwa chaka cha 2017, tidayamba kupanga messenger pa blockchain [dzina ndi ulalo zili mumbiri] pokambirana zaubwino kuposa amithenga akale a P2P.

Zapita 2.5 chaka, ndipo tinatha kutsimikizira lingaliro lathu: mapulogalamu a messenger tsopano akupezeka pa iOS, Web PWA, Windows, GNU/Linux, Mac OS ndi Android.

Lero tikuwuzani momwe messenger blockchain imagwirira ntchito komanso momwe mapulogalamu a kasitomala angagwirire ntchito ndi API yake.
Kodi messenger yokhazikika imagwira ntchito bwanji pa blockchain?

Tinkafuna kuti blockchain ithetse nkhani zachitetezo ndi zinsinsi za amithenga apamwamba a P2P:

  • Dinani kamodzi kuti mupange akaunti - palibe mafoni kapena maimelo, palibe mwayi wopeza mabuku adilesi kapena malo.
  • Ma interlocutors samakhazikitsa kulumikizana kwachindunji; kulumikizana konse kumachitika kudzera munjira yogawidwa ya node. Ma adilesi a IP a ogwiritsa ntchito sapezeka kwa wina ndi mnzake.
  • Mauthenga onse amabisidwa End-to-End curve25519xsalsa20poly1305. Zikuwoneka kuti izi sizingadabwitse aliyense, koma gwero lathu lili lotseguka.
  • Kuwukira kwa MITM sikuphatikizidwa - uthenga uliwonse ndizochitika ndipo wasainidwa ndi Ed25519 EdDSA.
  • Uthengawo umathera mu mdadada wake womwe. Kusasinthasintha ndi timestamp Simungathe kukonza midadada, choncho dongosolo la mauthenga.
  • "Sindinanene kuti" sizigwira ntchito ndi mauthenga pa blockchain.
  • Palibe dongosolo lapakati lomwe limayang'ana "zowona" za uthenga. Izi zimachitidwa ndi dongosolo logawidwa la node malinga ndi mgwirizano, ndipo ndi la ogwiritsa ntchito.
  • Kusatheka kuwunika - maakaunti sangathe kutsekedwa ndipo mauthenga sangathe kuchotsedwa.
  • Blockchain 2FA ndi njira ina ku gehena 2FA kudzera SMS, inawononga thanzi lambiri.
  • Kutha kupeza zokambirana zanu zonse pazida zilizonse nthawi iliyonse kumatanthauza kuti simuyenera kusunga zokambirana kwanuko konse.
  • Kutsimikizira kutumiza uthenga. Osati ku chipangizo cha wosuta, koma pa intaneti. Kwenikweni, uku ndikutsimikizira kuti wolandirayo amatha kuwerenga uthenga wanu. Izi ndi zothandiza potumiza zidziwitso zovuta.

Ubwino wa blockchain umaphatikizanso kuphatikizika kwapafupi ndi ma cryptocurrencies Ethereum, Dogecoin, Lisk, Dash, Bitcoin (ichi chikuchitikabe) komanso kuthekera kotumiza zizindikiro pamacheza. Tidapanganso makina osinthira a crypto.

Ndiyeno - momwe zonse zimagwirira ntchito.

Uthenga ndi malonda

Aliyense adazolowera kale kuti zochitika mu blockchain kusamutsa tokeni (ndalama) kuchokera kwa wogwiritsa ntchito wina kupita kwa wina. Monga Bitcoin. Tinapanga mtundu wapadera wotumizirana mauthenga.

Kuti mutumize uthenga mwa messenger pa blockchain, muyenera kudutsa njira zingapo:

  1. Lembani mawu a meseji
  2. Ikani ciphertext muzochitika
  3. Saina zomwe zachitika
  4. Tumizani zochita ku node iliyonse ya netiweki
  5. Dongosolo logawidwa la node limatsimikizira "zowona" za uthenga
  6. Ngati zonse zili bwino, kugulitsa ndi uthenga kumaphatikizidwa mu block yotsatira
  7. Wolandira amatenga uthengawo ndikuchotsa

Masitepe 1-3 ndi 7 amachitidwa kwanuko kwa kasitomala, ndipo masitepe 5-6 amachitidwa pa osunga.

Kubisa kwa uthenga

Uthengawu umabisidwa ndi kiyi yachinsinsi ya wotumiza komanso kiyi yapoyera ya wolandira. Tidzatenga makiyi a anthu pa intaneti, koma pa izi, akaunti ya wolandirayo iyenera kukhazikitsidwa, ndiko kuti, kuchitapo kanthu kamodzi. Mutha kugwiritsa ntchito pempho la REST GET /api/accounts/getPublicKey?address={ADAMANT address}, ndipo potsegula macheza, makiyi a anthu onse a interlocutors adzakhalapo kale.

Kodi messenger yokhazikika imagwira ntchito bwanji pa blockchain?

Messenger amasunga mauthenga pogwiritsa ntchito algorithm ya curve25519xsalsa20poly1305 (Bokosi la NaCl). Popeza akauntiyo ili ndi makiyi a Ed25519, kuti mupange bokosi, makiyi ayenera kusinthidwa kukhala Curve25519 Diffie-Hellman.

Nachi chitsanzo mu 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)
  }
}

Kupanga malonda ndi uthenga

Ntchitoyi ili ndi mawonekedwe awa:

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

Kwa kutumiza uthenga, chinthu chofunikira kwambiri ndi asset - muyenera kuyika uthenga mu chinthucho chat ndi kapangidwe:

  • message - sungani uthenga wobisika
  • own_message - ayi
  • type - mtundu wa uthenga

Mauthenga amagawidwanso mitundu. Kwenikweni, parameter type imakuuzani momwe mungamvetsetse message. Mutha kutumiza mameseji, kapena mutha kutumiza chinthu chokhala ndi zinthu zosangalatsa mkati - mwachitsanzo, umu ndi momwe mesenjala amapangira kusamutsidwa kwa cryptocurrency pamacheza.

Zotsatira zake, timapanga transaction:

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

Siginecha yamalonda

Kuonetsetsa kuti aliyense ali ndi chidaliro mu zowona za wotumiza ndi wolandira, nthawi yotumiza ndi zomwe zili mu uthengawo, ntchitoyo imasainidwa. Siginecha ya digito imakupatsani mwayi wotsimikizira kutsimikizika kwa zomwe mwachita pogwiritsa ntchito kiyi yapagulu - kiyi yachinsinsi sikufunika pa izi.

Koma siginecha yokha imachitidwa pogwiritsa ntchito kiyi yachinsinsi:

Kodi messenger yokhazikika imagwira ntchito bwanji pa blockchain?

Chithunzichi chikuwonetsa kuti timakhala tikuchita ndi SHA-256 ndikusayina Ed25519 EdDSA ndi kupeza signature signature, ndipo ID yogulitsira ndi gawo la SHA-256 hash.

Chitsanzo chokonzekera:

1 - Pangani chotchinga cha data, kuphatikiza uthenga

/**
 * 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 - Werengani SHA-256 kuchokera pa block 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 - Saina malonda

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

Kutumiza ntchito ndi uthenga ku node ya netiweki

Popeza maukonde ndi decentralized, aliyense wa mfundo ndi lotseguka API adzachita. Kupanga pempho la POST mpaka kumapeto api/transactions:

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

Poyankha tidzalandira ID yamalonda yamtunduwu

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

Kutsimikizika kwa Transaction

Dongosolo logawidwa la node, malinga ndi mgwirizano, limatsimikizira "zowona" za uthenga wamalonda. Kuchokera kwa ndani ndi kwa ndani, liti, ngati uthengawo unasinthidwa ndi wina, komanso ngati nthawi yotumiza inasonyezedwa molondola. Uwu ndi mwayi wofunikira kwambiri wa blockchain - palibe dongosolo lapakati lomwe limayang'anira kutsimikizira, ndipo kutsatizana kwa mauthenga ndi zomwe zili mkati mwake sizingakhale zabodza.

Choyamba, mfundo imodzi imayang'ana kulondola, ndiyeno imatumiza kwa ena - ngati ambiri akunena kuti zonse zili bwino, ntchitoyo idzaphatikizidwa mu chipika chotsatira cha unyolo - izi ndizogwirizana.

Kodi messenger yokhazikika imagwira ntchito bwanji pa blockchain?

Gawo la nambala ya node lomwe limayang'anira macheke litha kuwonedwa pa GitHub - validator.js ΠΈ verify.js. Inde, node imayenda pa Node.js.

Kuphatikizirapo malonda ndi uthenga mu block

Ngati mgwirizano ufikiridwa, kugulitsa ndi uthenga wathu kudzaphatikizidwa mu block yotsatira pamodzi ndi zochitika zina zovomerezeka.

Mipikisano imakhala yotsatizana, ndipo chipika chilichonse chotsatira chimapangidwa potengera ma hashes a midadada yapita.

Kodi messenger yokhazikika imagwira ntchito bwanji pa blockchain?

Mfundo ndi yakuti uthenga wathu ukuphatikizidwanso mu ndondomekoyi ndipo sungathe "kukonzedwanso". Ngati mauthenga angapo agwera mu chipika, dongosolo lawo lidzatsimikiziridwa ndi timestamp mauthenga.

Kuwerenga mauthenga

Ntchito ya messenger imatenganso zochitika kuchokera ku blockchain zomwe zimatumizidwa kwa wolandira. Kwa ichi tinapanga mapeto api/chatrooms.

Zochita zonse zimapezeka kwa aliyense - mutha kulandira mauthenga obisika. Koma wolandira yekha ndi amene angathe kumasulira pogwiritsa ntchito kiyi yake yachinsinsi ndi kiyi yapagulu ya wotumiza:

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

Ndi chiyani chinanso?

Popeza mauthenga amaperekedwa motere pafupifupi masekondi a 5 - ino ndi nthawi yomwe chipika chatsopano cha netiweki chikuwonekera - tabwera ndi kasitomala-to-node ndi node-to-node socket kulumikizana. Node ikalandira kugulitsa kwatsopano, imayang'ana kutsimikizika kwake ndikuitumiza kumalo ena. Kugulitsako kulipo kwa makasitomala a messenger ngakhale kusagwirizana kusanachitike ndikuphatikizidwa mu block. Mwanjira iyi tidzatumiza mauthenga nthawi yomweyo, monga ma meseji anthawi yomweyo.

Kuti tisunge buku la maadiresi, tidapanga KVS - Key-Value Storage - uwu ndi mtundu wina wamalonda omwe asset si bokosi la NaCl lomwe lalembedwa, koma NaCl-secretbox. Umu ndi momwe mesenjalayo amasungira deta ina.

Kusamutsa mafayilo/zithunzi ndi macheza amagulu amafunikirabe ntchito yambiri. Zachidziwikire, mumtundu wa blunder-and-blunder izi zitha "kufufuzidwa" mwachangu, koma tikufuna kusunga zinsinsi zomwezo.

Inde, pali ntchito yoti ichitidwe - kwenikweni, zinsinsi zenizeni zimaganiza kuti ogwiritsa ntchito sangalumikizane ndi ma node apagulu, koma azikweza okha. Kodi mukuganiza kuti ndi anthu otani omwe amachita izi? Ndiko kulondola, 0. Tinatha kuthetsa nkhaniyi pang'ono ndi mtundu wa Tor wa messenger.

Tatsimikizira kuti messenger pa blockchain akhoza kukhalapo. M'mbuyomu, panali kuyesa kumodzi kokha mu 2012 - bitmessage, zomwe zidalephera chifukwa cha nthawi yayitali yotumizira mauthenga, kuchuluka kwa CPU, komanso kusowa kwa mapulogalamu am'manja.

Ndipo kukayikira kuli chifukwa chakuti amithenga pa blockchain ali patsogolo pa nthawi yawo - anthu sali okonzeka kutenga udindo pa akaunti yawo, kukhala ndi chidziwitso chaumwini sikunali chizolowezi, ndipo teknoloji salola kuthamanga kwapamwamba pa blockchain. Zofananira zambiri zaukadaulo za polojekiti yathu ziwoneka pambuyo pake. Mudzawona.

Source: www.habr.com

Kuwonjezera ndemanga