Ko mutumwa ane decentralized anoshanda sei pa blockchain?

Pakutanga kwa2017, takatanga kugadzira mutumwa pane blockchain [zita uye chinongedzo zviri muprofile] nekukurukura zvakanakira pamusoro pekare P2P vatumwa.

Akapasa 2.5 gore, uye isu takakwanisa kusimbisa pfungwa yedu: messenger application dzave kuwanikwa iOS, Web PWA, Windows, GNU/Linux, Mac OS uye Android.

Nhasi tichakuudza kuti blockchain messenger inoshanda sei uye mashandisirwo evatengi vanogona kushanda neAPI yayo.
Ko mutumwa ane decentralized anoshanda sei pa blockchain?

Isu taida iyo blockchain kugadzirisa nyaya dzekuchengetedza uye kuvanzika kwevatumwa veP2P vekare:

  • Kudzvanya kamwe chete kugadzira account - hapana mafoni kana maemail, hapana kuwana kero mabhuku kana geolocation.
  • Vanopindirana havambogadziri hukama hwakananga; kutaurirana kwese kunoitika kuburikidza neyakagoverwa system yemanodhi. Makero eIP evashandisi haasvikiki kune mumwe nemumwe.
  • Mameseji ese akavharidzirwa Kupera-ku-Kupera curve25519xsalsa20poly1305. Zvinoita sekuti izvi hazvishamisi chero munhu, asi yedu sosi kodhi yakavhurika.
  • Kurwiswa kweMITM hakuna kubatanidzwa - meseji yega yega kutengeserana uye inosainwa naEd25519 EdDSA.
  • Iyo meseji inopera mublock yayo. Consistency uye timestamp Iwe haugone kugadzirisa zvivharo, uye saka kurongeka kwemameseji.
  • "Handina kutaura izvozvo" hazvishande nemameseji pa blockchain.
  • Iko hakuna chepakati chimiro chinotarisa pa "uchokwadi" hweshoko. Izvi zvinoitwa nehurongwa hwekugoverwa kwemanodhi zvichibva pakubvumirana, uye ndedzevashandisi.
  • Kusagoneka kwecensorship - maakaundi haagone kuvharwa uye mameseji haagone kudzimwa.
  • Blockchain 2FA ndiyo imwe nzira kune gehena 2FA kuburikidza neSMS, yakaparadza hutano hwakawanda.
  • Iko kugona kuwana hurukuro dzako dzese kubva kune chero mudziyo chero nguva zvinoreva kuti haufanirwe kuchengeta hurukuro munharaunda zvachose.
  • Simbiso yekutumira meseji. Kwete kune mudziyo wemushandisi, asi kune network. Chaizvoizvo, ichi chiratidzo chekugona kwemugamuchiri kuverenga meseji yako. Ichi chinhu chinobatsira pakutumira zviziviso zvakakosha.

Mabhenefiti eBlockchain anosanganisirawo kubatanidzwa kwepedyo neiyo cryptocurrencies Ethereum, Dogecoin, Lisk, Dash, Bitcoin (iyi ichiri kuenderera mberi) uye kugona kutumira tokeni mukutaura. Isu takatogadzira yakavakirwa-mukati crypto exchanger.

Uye zvino - kuti zvese zvinoshanda sei.

Mharidzo kutengeserana

Wese munhu anenge atojaira kuti kutengeserana mu blockchain kutamisa tokens (mari) kubva kune mumwe mushandisi kuenda kune mumwe. Kufanana neBitcoin. Isu takagadzira yakasarudzika mhando yekutengeserana yekutumira mameseji.

Kuti utumire meseji mune mutumwa pane blockchain, unofanirwa kupfuura nematanho akati wandei:

  1. Encrypt message text
  2. Isa ciphertext mukutengeserana
  3. Saina kutengeserana
  4. Tumira kutengeserana kune chero network node
  5. A distributed system of nodes inosarudza "uchokwadi" hweshoko
  6. Kana zvese zvakanaka, kutengeserana neshoko kunosanganisirwa mubhokisi rinotevera
  7. Iye anogamuchira anotora meseji transaction uye decrypts

Matanho 1-3 uye 7 anoitwa munharaunda pane mutengi, uye matanho 5-6 anoitwa kune vanogamuchira.

Message encryption

Mharidzo yacho yakavharidzirwa nekiyi yemunhu anotumira uye kiyi yeruzhinji yeanotambira. Isu tichatora kiyi yeruzhinji kubva kunetiweki, asi nekuda kweizvi, account yemugamuchiri inofanira kutangwa, ndiko kuti, kuve nekutengesa kumwe chete. Unogona kushandisa REST chikumbiro GET /api/accounts/getPublicKey?address={ADAMANT address}, uye pakurodha chats, makiyi eruzhinji evanopindirana anenge atovepo.

Ko mutumwa ane decentralized anoshanda sei pa blockchain?

Mutumwa anonyora mameseji achishandisa iyo curve25519xsalsa20poly1305 algorithm (NaCl Bhokisi) Sezvo iyo account ine Ed25519 makiyi, kugadzira bhokisi, makiyi anofanira kutanga ashandurwa kuita Curve25519 Diffie-Hellman.

Heino muenzaniso muJavaScript:

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

Kugadzira kutengeserana neshoko

Mutengesi une zvinotevera zvakajairika chimiro:

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

Kune meseji yekutengeserana, chinhu chakakosha ndechekuti asset - iwe unofanirwa kuisa meseji muchinhu chat ine chimiro:

  • message - chengetedza iyo encrypted meseji
  • own_message -nonce
  • type - rudzi rwemeseji

Mharidzo dzakakamurwawo kuita mhando. Chaizvoizvo, iyo parameter type inokuudza kuti unganzwisisa sei message. Iwe unogona kutumira mameseji chete, kana iwe unogona kutumira chinhu chine zvinhu zvinonakidza mukati - semuenzaniso, iyi ndiyo nzira iyo mutumwa anoita kuti cryptocurrency ifambiswe muchats.

Nekuda kweizvozvo, isu tinogadzira transaction:

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

Transaction siginicha

Kuve nechokwadi chekuti munhu wese ane chivimbo muchokwadi cheanotumira uye anogamuchira, nguva yekutumira uye zviri mukati memeseji, kutengeserana kunosainwa. Siginecha yedhijitari inokutendera kuti uone chokwadi chekutengeserana uchishandisa kiyi yeruzhinji - kiyi yakavanzika haidiwe pane izvi.

Asi siginicha pachayo inoitwa uchishandisa kiyi yakavanzika:

Ko mutumwa ane decentralized anoshanda sei pa blockchain?

Dhiagiramu inoratidza kuti isu tinotanga hashi kutengeserana neSHA-256 tozoisaina Ed25519 EdDSA uye kuwana siginecha signature, uye ID yekutengeserana chikamu cheSHA-256 hash.

Muenzaniso kushandisa:

1 - Gadzira data block, kusanganisira meseji

/**
 * 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 - Verenga SHA-256 kubva kune 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 - Saina kutengeserana

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

Kutumira kutengeserana neshoko kune network node

Sezvo network yakadzimirwa, chero yeadhi ine yakavhurika API ichaita. Kuita chikumbiro chePOST kune yekupedzisira api/transactions:

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

Mukupindura tichagamuchira transaction ID yemhando

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

Transaction Validation

Nzira yakagoverwa yemanodhi, zvichienderana nekubvumirana, inosarudza "chokwadi" chemashoko ekutengeserana. Kubva kunaani uye kunaani, rini, kana meseji yakatsiviwa neimwe, uye kana nguva yekutumira yakaratidzwa nenzira kwayo. Iyi ndiyo yakakosha mukana weiyo blockchain - hapana chepakati chimiro chine basa rekuona, uye kutevedzana kwemameseji uye zvirimo hazvigone kunyengedzwa.

Kutanga, imwe node inotarisa kurongeka, uye yozoitumira kune vamwe - kana vazhinji vachiti zvinhu zvose zvakarongeka, kutengeserana kuchabatanidzwa mubhokisi rinotevera reketani - uku kubvumirana.

Ko mutumwa ane decentralized anoshanda sei pa blockchain?

Icho chikamu cheiyo node kodhi ine basa rekutarisa inogona kutariswa paGitHub - validator.js ΠΈ verify.js. Hongu, node inomhanya paNode.js.

Kusanganisira kutengeserana nemeseji mubhuroka

Kana kubvumirana kwasvikwa, kutengeserana neshoko redu kuchaverengerwa mubhuroko rinotevera pamwe nemamwe mabatirwo akakodzera.

Mabhuroki ane kutevedzana kwakasimba, uye imwe neimwe inotevera bhuroka inoumbwa zvichibva pane hashes emabhuroki apfuura.

Ko mutumwa ane decentralized anoshanda sei pa blockchain?

Icho chiripo ndechekuti meseji yedu inosanganisirwa mune ino kutevedzana uye haigone "kurongwazve". Kana mameseji akati wandei akawira mubhuroka, kurongeka kwavo kunotemwa ne timestamp mameseji.

Kuverenga mameseji

Iyo messenger application inotora kutengeserana kubva ku blockchain inotumirwa kune anogamuchira. Nokuda kweizvi takaita mhedziso api/chatrooms.

Zvese zvekutengesa zvinowanikwa kune wese munhu - unogona kugamuchira mameseji akavharidzirwa. Asi iye chete anogamuchira anogona kutsikisa achishandisa kiyi yake yakavanzika uye kiyi yeruzhinji yeanotumira:

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

Uye chii chimwe?

Sezvo mameseji achiunzwa nenzira iyi mumasekonzi mashanu - ino ndiyo nguva nyowani yetiweki block - isu takauya neclient-to-node uye node-to-node socket yekubatanidza. Kana node ikagamuchira kutengeserana kutsva, inotarisa kutendeseka kwayo uye inoendesa kune dzimwe node. Iko kutengeserana kunowanikwa kune vatumwa vatengi kunyangwe kubvumirana kusati kwaitika uye kuiswa mubhuroko. Nenzira iyi isu tichaendesa mameseji ipapo ipapo, sezvakangoita mameseji enguva dzose.

Kuchengeta bhuku rekero, takagadzira KVS - Key-Value Storage - iyi imwe mhando yekutengeserana umo. asset haisi NaCl-bhokisi rakavharidzirwa, asi NaCl-secretbox. Aya ndiwo machengetero anoita mutumwa mamwe data.

Kufambiswa kwefaira/mufananidzo uye hurukuro dzeboka dzichiri kuda basa rakawanda. Ehe, mublunder-and-blunder fomati izvi zvinogona "kucheneswa" nekukurumidza, asi isu tinoda kuchengetedza nhanho imwechete yekuvanzika.

Ehe, pachine basa rinofanira kuitwa - zvine hungwaru, kuvanzika chaiko kunofungidzira kuti vashandisi havazobatana neruzhinji network node, asi vanosimudza yavo. Ndeipi muzana yevashandisi yaunofunga kuti inoita izvi? Ndizvozvo, 0. Takakwanisa kugadzirisa nyaya iyi zvishoma neTor version yemutumwa.

Isu takaratidza kuti mutumwa ari pa blockchain anogona kuvapo. Pakutanga, kwaingova nekuedza kumwe chete muna 2012 - bitmessage, iyo yakundikana nekuda kwenguva refu yekutumira meseji, CPU mutoro, uye kushaikwa kwemafoni ekushandisa.

Uye kusava nechokwadi kunokonzerwa nekuti vatumwa vari pa blockchain vari pamberi penguva yavo - vanhu havana kugadzirira kutora mutoro weakaunti yavo, kuve neruzivo rwemunhu hausati kwave kuita, uye tekinoroji haibvumiri kumhanya kwakanyanya pa blockchain. Mamwe tekinoroji analogues epurojekiti yedu achaonekwa anotevera. Uchaona.

Source: www.habr.com

Voeg