Kepiye carane utusan desentralisasi ing blockchain bisa digunakake?

Ing awal 2017, kita wiwit nggawe utusan ing blockchain [jeneng lan link ana ing profil] kanthi ngrembug babagan kaluwihan saka utusan P2P klasik.

ical 2.5 taun, lan kita bisa konfirmasi konsep kita: aplikasi utusan saiki kasedhiya kanggo iOS, Web PWA, Windows, GNU/Linux, Mac OS lan Android.

Dina iki kita bakal pitutur marang kowe carane utusan pamblokiran bisa lan carane aplikasi klien bisa karo API sawijining.
Kepiye carane utusan desentralisasi ing blockchain bisa digunakake?

Kita pengin blockchain kanggo ngatasi masalah keamanan lan privasi utusan P2P klasik:

  • Siji klik kanggo nggawe akun - ora ana telpon utawa email, ora ana akses menyang buku alamat utawa geolokasi.
  • Interlocutors ora tau nggawe sambungan langsung; kabeh komunikasi dumadi liwat sistem distribusi node. Alamat IP pangguna ora bisa diakses saben liyane.
  • Kabeh pesen dienkripsi kurva End-to-End25519xsalsa20poly1305. Kayane iki ora bakal kaget sapa wae, nanging kode sumber kita mbukak.
  • Serangan MITM ora kalebu - saben pesen minangka transaksi lan ditandatangani dening Ed25519 EdDSA.
  • Pesen rampung ing blok dhewe. Konsistensi lan timestamp Sampeyan ora bisa ndandani pamblokiran, lan mulane urutan pesen.
  • "Aku ora ngomong sing" ora bakal bisa digunakake karo pesen ing blockchain.
  • Ora ana struktur pusat sing mriksa "keasliane" pesen. Iki ditindakake dening sistem simpul sing disebarake adhedhasar konsensus, lan diduweni dening pangguna.
  • Impossibility of censorship - akun ora bisa diblokir lan pesen ora bisa dibusak.
  • Blockchain 2FA minangka alternatif kanggo 2FA neraka liwat SMS, rusak banget kesehatan.
  • Kemampuan kanggo njupuk kabeh obrolan saka piranti sawayah-wayah tegese sampeyan ora kudu nyimpen obrolan lokal ing kabeh.
  • Konfirmasi pangiriman pesen. Ora menyang piranti pangguna, nanging menyang jaringan. Ateges, iki minangka konfirmasi kemampuan panampa kanggo maca pesen sampeyan. Iki minangka fitur sing migunani kanggo ngirim kabar kritis.

Keuntungan Blockchain uga kalebu integrasi sing cedhak karo cryptocurrencies Ethereum, Dogecoin, Lisk, Dash, Bitcoin (iki isih ditindakake) lan kemampuan kanggo ngirim token ing obrolan. Kita malah nggawe exchanger crypto sing dibangun ing.

Lan banjur - carane kabeh bisa.

Pesen minangka transaksi

Saben uwong wis biasa karo kasunyatan sing transaksi ing pamblokiran transfer token (koin) saka siji pangguna menyang liyane. Kaya Bitcoin. Kita nggawe jinis transaksi khusus kanggo ngirim pesen.

Kanggo ngirim pesen ing utusan ing blockchain, sampeyan kudu ngliwati sawetara langkah:

  1. Enkripsi teks pesen
  2. Sijine ciphertext menyang transaksi
  3. Mlebu transaksi
  4. Kirim transaksi menyang simpul jaringan apa wae
  5. Sistem simpul sing disebarake nemtokake "keasliane" pesen
  6. Yen kabeh OK, transaksi karo pesen kasebut kalebu ing blok sabanjure
  7. Panampa njupuk transaksi pesen lan dekripsi

Langkah 1-3 lan 7 ditindakake sacara lokal ing klien, lan langkah 5-6 ditindakake ing host.

Enkripsi pesen

Pesen kasebut dienkripsi nganggo kunci pribadi pangirim lan kunci publik panampa. Kita bakal njupuk kunci umum saka jaringan, nanging kanggo iki, akun panampa kudu diinisialisasi, yaiku, paling ora ana siji transaksi. Sampeyan bisa nggunakake panjalukan REST GET /api/accounts/getPublicKey?address={ADAMANT address}, lan nalika ngemot obrolan, kunci umum saka interlocutors bakal kasedhiya.

Kepiye carane utusan desentralisasi ing blockchain bisa digunakake?

Pesen enkripsi pesen nggunakake algoritma curve25519xsalsa20poly1305 (NaCl Box). Wiwit akun kasebut ngemot tombol Ed25519, kanggo nggawe kothak, kunci kasebut kudu diowahi dadi Curve25519 Diffie-Hellman.

Punika conto ing 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)
  }
}

Mbentuk transaksi karo pesen

Transaksi nduweni struktur umum ing ngisor iki:

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

Kanggo transaksi pesen, sing paling penting yaiku asset - sampeyan kudu nyeleh pesen ing obyek chat kanthi struktur:

  • message - nyimpen pesen ndhelik
  • own_message - mboh
  • type - jinis pesen

Pesen uga dipérang dadi jinis. Ateges, parameter type ngandhani carane ngerti message. Sampeyan mung bisa ngirim teks, utawa sampeyan bisa ngirim obyek kanthi barang-barang sing menarik ing njero - contone, iki cara utusan nggawe transfer cryptocurrency ing obrolan.

Akibaté, kita nggawe transaksi:

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

Tandha transaksi

Kanggo mesthekake yen saben wong yakin karo keaslian pangirim lan panampa, wektu ngirim lan isi pesen, transaksi kasebut ditandatangani. Tandha digital ngidini sampeyan verifikasi keaslian transaksi nggunakake kunci umum - kunci pribadi ora dibutuhake kanggo iki.

Nanging teken dhewe ditindakake kanthi nggunakake kunci pribadi:

Kepiye carane utusan desentralisasi ing blockchain bisa digunakake?

Diagram kasebut nuduhake yen kita nggawe transaksi pertama karo SHA-256 banjur mlebu Ed25519 EdDSA lan njaluk teken signature, lan ID transaksi minangka bagéan saka hash SHA-256.

Tuladha implementasine:

1 - Nggawe blok data, kalebu 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 - Count SHA-256 saka 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 - Tandhani 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 kanthi pesen menyang simpul jaringan

Wiwit jaringan wis desentralisasi, samubarang simpul karo API mbukak bakal nindakake. Nggawe panjalukan POST menyang titik pungkasan api/transactions:

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

Nanggepi kita bakal nampa ID transaksi saka jinis

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

Validasi Transaksi

Sistem simpul sing disebarake, adhedhasar konsensus, nemtokake "keaslian" pesen transaksi. Saka sapa lan marang sapa, kapan, apa pesen diganti karo liyane, lan apa wektu ngirim dituduhake kanthi bener. Iki minangka kauntungan penting saka pamblokiran - ora ana struktur pusat sing tanggung jawab kanggo verifikasi, lan urutan pesen lan isine ora bisa dipalsukan.

Kaping pisanan, siji simpul mriksa akurasi, banjur dikirim menyang wong liya - yen mayoritas ujar manawa kabeh wis ana, transaksi kasebut bakal kalebu ing blok rantai sabanjure - iki minangka konsensus.

Kepiye carane utusan desentralisasi ing blockchain bisa digunakake?

Bagean kode simpul sing tanggung jawab kanggo mriksa bisa dideleng ing GitHub - validator.js и verifikasi.js. Ya, simpul kasebut mlaku ing Node.js.

Kalebu transaksi kanthi pesen ing blok

Yen konsensus wis tekan, transaksi karo pesen kita bakal kalebu ing blok sabanjure bebarengan karo transaksi sah liyane.

Blok duwe urutan sing ketat, lan saben blok sabanjure dibentuk adhedhasar hash blok sadurunge.

Kepiye carane utusan desentralisasi ing blockchain bisa digunakake?

Intine pesen kita uga kalebu ing urutan iki lan ora bisa "diatur maneh". Yen sawetara pesen tiba ing blok, pesenan bakal ditemtokake dening timestamp pesen.

Maca pesen

Aplikasi utusan njupuk transaksi saka pamblokiran sing dikirim menyang panampa. Kanggo iki, kita nggawe titik pungkasan api/chatrooms.

Kabeh transaksi kasedhiya kanggo kabeh wong - sampeyan bisa nampa pesen sing dienkripsi. Nanging mung panampa sing bisa dekripsi nggunakake kunci pribadi lan kunci 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) : ''
}

opo maneh?

Wiwit pesen dikirim kanthi cara iki kira-kira 5 detik - iki wektu pemblokiran jaringan anyar katon - kita teka karo sambungan soket klien-kanggo-simpul lan simpul-kanggo-simpul. Nalika simpul nampa transaksi anyar, mriksa kesahihan lan nerusake menyang simpul liyane. Transaksi kasedhiya kanggo klien utusan sanajan sadurunge ana konsensus lan kalebu ing blok kasebut. Kanthi cara iki, kita bakal ngirim pesen kanthi cepet, kaya pesen instan biasa.

Kanggo nyimpen buku alamat, kita digawe KVS - Key-Value Storage - iki jinis liyane saka transaksi kang asset iku ora NaCl-kothak sing ndhelik, nanging NaCl-kotak rahasia. Iki carane utusan nyimpen data liyane.

Transfer file/gambar lan obrolan grup isih mbutuhake akeh karya. Mesthi, ing format blunder-lan-blunder iki bisa "ngapusi" kanthi cepet, nanging kita pengin njaga tingkat privasi sing padha.

Ya, isih ana sing kudu ditindakake - saenipun, privasi nyata nganggep manawa pangguna ora bakal nyambung menyang simpul jaringan umum, nanging bakal ngunggahake dhewe. Apa persentasi saka pangguna sampeyan mikir nindakake iki? Sing tengen, 0. Kita padha bisa kanggo sebagian ngatasi masalah iki karo versi Tor saka utusan.

Kita wis mbuktekake manawa utusan ing pamblokiran bisa ana. Sadurunge, mung ana siji nyoba ing 2012 - bitpesen, sing gagal amarga wektu pangiriman pesen sing dawa, beban CPU, lan kekurangan aplikasi seluler.

Lan skeptisisme amarga kasunyatan manawa utusan ing pamblokiran luwih dhisik - wong ora siap tanggung jawab kanggo akun kasebut, ndhuweni informasi pribadhi durung dadi tren, lan teknologi ora ngidini kecepatan dhuwur ing pamblokiran. Analog teknologi liyane saka proyek kita bakal katon sabanjure. Sampeyan bakal weruh.

Source: www.habr.com

Add a comment