Kumaha carana utusan desentralisasi dianggo dina blockchain nu?

Dina awal 2017, urang mimiti nyieun utusan dina blockchain [ngaran jeung link aya dina profil] ku nyawalakeun kaunggulan leuwih utusan P2P Palasik.

Isro 2.5 taun, sarta kami bisa mastikeun konsep urang: aplikasi utusan ayeuna sadia pikeun ios, Web PWA, Windows, GNU / Linux, Mac OS jeung Android.

Dinten ieu kami bakal nyarioskeun ka anjeun kumaha utusan blockchain tiasa dianggo sareng kumaha aplikasi klien tiasa dianggo sareng API na.
Kumaha carana utusan desentralisasi dianggo dina blockchain nu?

Kami hoyong blockchain pikeun ngabéréskeun masalah kaamanan sareng privasi para utusan P2P klasik:

  • Hiji klik pikeun nyieun rekening - euweuh telepon atawa surelek, euweuh aksés ka buku alamat atawa geolocations.
  • Interlocutors pernah nyieun sambungan langsung; sadaya komunikasi lumangsung ngaliwatan sistem disebarkeun titik. Alamat IP pangguna henteu tiasa diaksés ku anu sanés.
  • Sadaya seratan énkripsi Kurva End-to-End25519xsalsa20poly1305. Sigana mah ieu moal kaget saha, tapi kode sumber urang kabuka.
  • serangan MITM teu kaasup - unggal pesen téh transaksi sarta ditandatanganan ku Ed25519 EdDSA.
  • Suratna ends nepi di blok sorangan. Konsistensi jeung timestamp Anjeun teu bisa ngalereskeun blok, sarta ku kituna urutan pesen.
  • "Kuring henteu nyarios éta" moal tiasa dianggo sareng pesen dina blockchain.
  • Henteu aya struktur sentral anu mariksa "kaaslian" pesen. Hal ieu dilakukeun ku sistem distribusi titik dumasar kana konsensus, sareng dipiboga ku pangguna.
  • Kamungkinan sénsor - akun teu tiasa diblokir sareng pesen teu tiasa dihapus.
  • Blockchain 2FA mangrupikeun alternatif pikeun 2FA naraka via SMS, ruksak pisan kaséhatan.
  • Kamampuhan pikeun nyandak sadaya paguneman anjeun tina alat naon waé iraha waé hartosna anjeun henteu kedah nyimpen paguneman sacara lokal pisan.
  • Konfirmasi pangiriman pesen. Teu ka alat pamaké, tapi ka jaringan. Intina, ieu mangrupikeun konfirmasi kamampuan panampi pikeun maca pesen anjeun. Ieu fitur mangpaat pikeun ngirim bewara kritis.

Mangpaat Blockchain ogé ngawengku integrasi deukeut jeung cryptocurrencies Ethereum, Dogecoin, Lisk, Dash, Bitcoin (hiji ieu masih lumangsung) jeung kamampuhan pikeun ngirim tokens dina obrolan. Kami malah ngadamel exchanger crypto anu diwangun.

Lajeng - kumaha eta sadayana jalan.

Pesen mangrupikeun transaksi

Sarerea geus biasa kanyataan yén transaksi dina blockchain mindahkeun tokens (koin) ti hiji pamaké ka nu sejen. Kawas Bitcoin. Kami nyiptakeun jinis transaksi khusus pikeun ngirim pesen.

Pikeun ngirim pesen dina utusan dina blockchain, anjeun kedah ngalangkungan sababaraha léngkah:

  1. Énkripsi téks pesen
  2. Pasang ciphertext kana transaksi
  3. Asup urus
  4. Kirimkeun transaksi ka titik jaringan mana waé
  5. Sistem titik anu disebarkeun nangtukeun "kaaslian" pesen
  6. Lamun sagalana geus OK, urus jeung talatah kaasup dina blok salajengna
  7. Panarima retrieves transaksi pesen na decrypts

Hambalan 1–3 jeung 7 dipigawé sacara lokal dina klien, jeung léngkah 5–6 dipigawé dina host.

énkripsi pesen

Suratna énkripsi nganggo konci pribadi pangirim sareng konci umum panarima. Kami bakal nyandak konci umum tina jaringan, tapi pikeun ieu, akun panarima kedah diinisialisasi, nyaéta, sahenteuna sahenteuna hiji transaksi. Anjeun tiasa nganggo pamundut REST GET /api/accounts/getPublicKey?address={ADAMANT address}, sareng nalika ngamuat obrolan, konci umum interlocutors parantos sayogi.

Kumaha carana utusan desentralisasi dianggo dina blockchain nu?

Utusan énkripsi pesen nganggo algoritma curve25519xsalsa20poly1305 (Kotak NaCl). Kusabab akunna ngandung konci Ed25519, pikeun ngabentuk kotak, koncina kedah dirobih heula kana Curve25519 Diffie-Hellman.

Ieu conto dina 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)
  }
}

Ngabentuk transaksi kalayan pesen

Transaksi ngagaduhan struktur umum di handap ieu:

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

Pikeun transaksi pesen, hal anu paling penting nyaéta asset - anjeun kedah nempatkeun pesen dina obyék chat kalawan struktur:

  • message - simpen pesen énkripsi
  • own_message -teu acan
  • type - tipe pesen

Pesen ogé dibagi kana jenis. Intina, parameter type ngabejaan Anjeun kumaha ngarti message. Anjeun ngan ukur tiasa ngirim téks, atanapi anjeun tiasa ngirim obyék kalayan hal-hal anu pikaresepeun di jero - contona, ieu kumaha utusan ngajantenkeun transfer cryptocurrency dina obrolan.

Hasilna, urang nyieun transaksi:

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

Tanda tangan transaksi

Pikeun mastikeun yén sadayana yakin kana kaaslian pangirim sareng panarima, waktos ngirim sareng eusi pesen, transaksi ditandatanganan. Tanda tangan digital ngamungkinkeun anjeun pikeun pariksa kaaslian transaksi nganggo konci umum - konci pribadi henteu diperyogikeun pikeun ieu.

Tapi tanda tangan sorangan dilakukeun nganggo konci pribadi:

Kumaha carana utusan desentralisasi dianggo dina blockchain nu?

Diagram nunjukeun yen urang mimiti Hash urus kalawan SHA-256 lajeng asup Ed25519 EdDSA jeung meunang tanda tangan signature, sareng ID urus mangrupikeun bagian tina hash SHA-256.

conto palaksanaan:

1 - Bentuk blok data, kalebet pesen

/**
 * 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 - Cacah SHA-256 tina blok data

/**
 * 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 - Asupkeun transaksi

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

Ngirim transaksi kalayan pesen ka titik jaringan

Kusabab jaringan desentralisasi, salah sahiji titik anu nganggo API kabuka bakal dilakukeun. Nyieun pamundut POST ka titik tungtung api/transactions:

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

Dina respon kami bakal nampa hiji ID urus tina jenis

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

Validasi Transaksi

Sistem simpul anu disebarkeun, dumasar kana konsensus, nangtukeun "kaaslian" pesen urus. Ti saha sareng ka saha, iraha, naha pesenna diganti ku anu sanés, sareng naha waktos ngirimna leres-leres dituduhkeun. Ieu mangrupikeun kauntungan anu penting pikeun blockchain - teu aya struktur sentral anu tanggung jawab pikeun verifikasi, sareng urutan pesen sareng eusina henteu tiasa dipalsukan.

Kahiji, hiji titik pariksa akurasi, lajeng dikirim ka batur - lamun mayoritas nyebutkeun yen sagalana aya dina urutan, urus bakal kaasup dina blok hareup ranté - ieu konsensus.

Kumaha carana utusan desentralisasi dianggo dina blockchain nu?

Bagian tina kode titik anu tanggung jawab cék tiasa ditingali dina GitHub - validator.js и pariksa.js. Yep, titik dijalankeun dina Node.js.

Kaasup transaksi kalayan pesen dina blok

Upami konsensus ngahontal, transaksi sareng pesen kami bakal dilebetkeun kana blok salajengna sareng transaksi valid anu sanés.

Blok gaduh sekuen anu ketat, sareng unggal blok salajengna dibentuk dumasar kana hashes blok sateuacana.

Kumaha carana utusan desentralisasi dianggo dina blockchain nu?

Intina nyaéta pesen urang ogé kalebet dina sekuen ieu sareng teu tiasa "disusun deui". Lamun sababaraha pesen digolongkeun kana blok, urutan maranéhna bakal ditangtukeun ku timestamp talatah.

Maca talatah

Aplikasi utusan retrieves transaksi ti blockchain nu dikirim ka panarima. Pikeun ieu kami ngadamel titik tungtung api/chatrooms.

Sadaya transaksi sayogi pikeun sadayana - anjeun tiasa nampi pesen énkripsi. Tapi ngan ukur panarima anu tiasa ngadekrip nganggo konci pribadi sareng konci umum pangirim:

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

Jeung naon deui?

Kusabab seratan dikirimkeun ku cara ieu sakitar 5 detik - ieu mangrupikeun waktos blok jaringan énggal muncul - kami sumping sareng sambungan stop kontak klien-to-node sareng node-to-node. Nalika titik nampi transaksi anyar, éta pariksa validitasna sareng teraskeun ka titik anu sanés. urus geus sadia pikeun klien utusan malah saméméh konsensus lumangsung sarta citakan dina blok. Ku cara ieu kami bakal ngirim pesen sacara instan, sapertos utusan instan biasa.

Pikeun nyimpen buku alamat, urang dijieun KVS - Panyimpenan Key-Nilai - ieu téh tipe séjén tina urus nu asset teu NaCl-kotak anu énkripsi, tapi NaCl-kotak rahasia. Ieu kumaha utusan nyimpen data anu sanés.

Transfer file/gambar sareng obrolan grup masih peryogi seueur padamelan. Tangtu, dina format blunder-na-blunder ieu bisa "screwed up" gancang, tapi urang hayang ngajaga tingkat sarua privasi.

Leres, masih aya padamelan anu kedah dilakukeun - idéal, privasi nyata nganggap yén pangguna moal nyambung ka titik jaringan umum, tapi bakal ngangkat sorangan. Sabaraha perséntase pamaké anjeun pikir ngalakukeun ieu? Éta katuhu, 0. Kami bisa sawaréh ngajawab masalah ieu kalawan versi Tor utusan.

Kami parantos ngabuktikeun yén utusan dina blockchain tiasa aya. Saméméhna, ngan aya hiji usaha dina 2012 - bitmessage, anu gagal kusabab waktos pangiriman pesen anu panjang, beban CPU, sareng kurangna aplikasi sélulér.

Sareng skepticism disababkeun ku kanyataan yén utusan dina blockchain aya payuneun waktosna - jalma henteu siap nanggung tanggung jawab pikeun akunna, gaduh inpormasi pribadi henteu acan trend, sareng téknologi henteu ngijinkeun kecepatan tinggi dina blockchain. Langkung seueur analogi téknologi proyék kami bakal muncul salajengna. Anjeun bakal ningali.

sumber: www.habr.com

Tambahkeun komentar