Conas a oibríonn teachtaire díláraithe ar an blockchain?

Ag tús 2017, thosaigh muid ag cruthú teachtaire ar an blockchain [tá ainm agus nasc sa phróifíl] trí na buntáistí a bhaineann le teachtairí clasaiceacha P2P a phlé.

Ritheadh 2.5 bhliain, agus bhíomar in ann ár gcoincheap a dhearbhú: tá feidhmchláir teachtaire ar fáil anois le haghaidh iOS, Web PWA, Windows, GNU/Linux, Mac OS agus Android.

Sa lá atá inniu inseoimid duit conas a oibríonn an teachtaire blockchain agus conas is féidir le feidhmchláir chliaint oibriú lena API.
Conas a oibríonn teachtaire díláraithe ar an blockchain?

Theastaigh uainn go réiteodh an blockchain na saincheisteanna slándála agus príobháideachta a bhaineann le teachtairí clasaiceacha P2P:

  • Cliceáil amháin chun cuntas a chruthú - gan aon ghutháin ná ríomhphoist, gan rochtain ar leabhair seoltaí nó geolocations.
  • Ní bhunaíonn na hidirghabhálaithe naisc dhíreacha riamh; tarlaíonn gach cumarsáid trí chóras dáilte nóid. Níl seoltaí IP na n-úsáideoirí inrochtana dá chéile.
  • Tá gach teachtaireacht criptithe Curve Deireadh le Deireadh25519xsalsa20poly1305. Dealraíonn sé nach gcuirfidh sé seo iontas ar dhuine ar bith, ach tá ár gcód foinse oscailte.
  • Tá ionsaí MITM eisiata - is idirbheart gach teachtaireacht agus sínithe ag Ed25519 EdDSA.
  • Críochnaíonn an teachtaireacht ina bloc féin. Comhsheasmhacht agus timestamp Ní féidir leat na bloic a dheisiú, agus mar sin ord na dteachtaireachtaí.
  • Ní oibreoidh “Ní dúirt mé é sin” le teachtaireachtaí ar an blockchain.
  • Níl aon struchtúr lárnach ann a sheiceálann ar “barántúlacht” teachtaireachta. Déantar é seo trí chóras dáilte nóid bunaithe ar chomhdhearcadh, agus is leis na húsáideoirí é.
  • Cinsireacht dodhéanta - ní féidir bac a chur ar chuntais agus ní féidir teachtaireachtaí a scriosadh.
  • Is rogha eile é Blockchain 2FA seachas an ifreann 2FA trí SMS, millte go leor sláinte.
  • Ní gá duit comhráite a stóráil go háitiúil ar chor ar bith toisc go bhfuil tú in ann do chomhráite go léir a fháil ó ghléas ar bith.
  • Deimhniú ar sheachadadh na teachtaireachta. Ní le gléas an úsáideora, ach leis an líonra. Go bunúsach, is dearbhú é seo ar chumas an fhaighteora do theachtaireacht a léamh. Is gné úsáideach é seo chun fógraí ríthábhachtacha a sheoladh.

Áiríonn buntáistí Blockchain freisin comhtháthú dlúth leis na cryptocurrencies Ethereum, Dogecoin, Lisk, Dash, Bitcoin (tá an ceann seo fós ar siúl) agus an cumas chun comharthaí a sheoladh i gcomhráite. Rinneamar malartóir crypto tógtha fiú.

Agus ansin - conas a oibríonn sé go léir.

Is idirbheart é teachtaireacht

Tá taithí ag gach duine cheana féin ar an bhfíric go n-aistríonn idirbhearta sna blockchain comharthaí (boinn) ó úsáideoir amháin go ceann eile. Cosúil le Bitcoin. Chruthaíomar cineál speisialta idirbhirt chun teachtaireachtaí a tharchur.

Chun teachtaireacht a sheoladh i dteachtaire ar an blockchain, ní mór duit dul trí roinnt céimeanna:

  1. Criptigh téacs na teachtaireachta
  2. Cuir ciphertext in idirbheart
  3. Sínigh an t-idirbheart
  4. Seol idirbheart chuig aon nód líonra
  5. Cinneann córas dáilte nóid “barántúlacht” teachtaireachta
  6. Má tá gach rud ceart go leor, tá an t-idirbheart leis an teachtaireacht san áireamh sa bhloc seo chugainn
  7. Aisghabhann an faighteoir an t-idirbheart teachtaireachta agus díchriptíonn sé

Déantar céimeanna 1-3 agus 7 go háitiúil ar an gcliant, agus déantar céimeanna 5-6 ar na hóstach.

Criptiú teachtaireachta

Tá an teachtaireacht criptithe le heochair phríobháideach an tseoltóra agus le heochair phoiblí an fhaighteora. Tógfaimid an eochair phoiblí ón líonra, ach chuige seo, ní mór cuntas an fhaighteora a thúsú, is é sin, idirbheart amháin ar a laghad a bheith agat. Is féidir leat iarratas REST a úsáid GET /api/accounts/getPublicKey?address={ADAMANT address}, agus nuair a bheidh comhráite á luchtú, beidh eochracha poiblí an idirghabhálaithe ar fáil cheana féin.

Conas a oibríonn teachtaire díláraithe ar an blockchain?

Criptíonn an teachtaire teachtaireachtaí ag úsáid an algartam curve25519xsalsa20poly1305 (Bosca NaCl). Ós rud é go bhfuil eochracha Ed25519 sa chuntas, chun bosca a dhéanamh, ní mór na heochracha a thiontú go Curve25519 Diffie-Hellman ar dtús.

Seo sampla i 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)
  }
}

Idirbheart a fhoirmiú le teachtaireacht

Tá an struchtúr ginearálta seo a leanas ag an idirbheart:

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

Maidir le hidirbheart teachtaireachta, is é an rud is tábhachtaí asset - ní mór duit teachtaireacht a chur sa réad chat le struchtúr:

  • message - sábháil an teachtaireacht criptithe
  • own_message - nonce
  • type — cineál teachtaireachta

Roinntear teachtaireachtaí i gcineálacha freisin. Go bunúsach, an paraiméadar type insíonn tú conas a thuiscint message. Is féidir leat a sheoladh ach téacs, nó is féidir leat a sheoladh réad le rudaí suimiúla taobh istigh - mar shampla, is é seo conas a dhéanann an teachtaire aistrithe cryptocurrency i comhráite.

Mar thoradh air sin, cruthaímid idirbheart:

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

Síniú idirbhirt

Chun a chinntiú go bhfuil gach duine muiníneach as barántúlacht an tseoltóra agus an fhaighteora, an t-am seolta agus ábhar na teachtaireachta, sínítear an t-idirbheart. Ligeann síniú digiteach duit barántúlacht idirbhirt a fhíorú ag baint úsáide as eochair phoiblí - níl eochair phríobháideach ag teastáil chuige seo.

Ach déantar an síniú féin leis an eochair phríobháideach:

Conas a oibríonn teachtaire díláraithe ar an blockchain?

Léiríonn an léaráid go ndéanaimid hash an t-idirbheart le SHA-256 ar dtús agus ansin é a shíniú Ed25519 EdDSA agus síniú a fháil signature, agus tá an ID idirbhirt mar chuid den hash SHA-256.

Sampla de chur i bhfeidhm:

1 - Foirm bloc sonraí, lena n-áirítear teachtaireacht

/**
 * 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 - Comhair SHA-256 ón mbloc sonraí

/**
 * 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 - Sínigh an t-idirbheart

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

Idirbheart le teachtaireacht a sheoladh chuig nód líonra

Ós rud é go bhfuil an líonra díláraithe, déanfaidh aon cheann de na nóid le API oscailte é. Iarratas POST a dhéanamh chuig an gcríochphointe api/transactions:

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

Mar fhreagra air sin gheobhaidh muid ID idirbhirt den chineál

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

Bailíochtú Idirbheart

Cinneann córas dáilte nóid, bunaithe ar chomhdhearcadh, “barántúlacht” na teachtaireachta idirbhirt. Cé hé agus cé chuige, cathain, cé acu ar cuireadh teachtaireacht eile in ionad na teachtaireachta, agus cé acu ar cuireadh in iúl i gceart an t-am seolta. Is buntáiste an-tábhachtach é seo den blockchain - níl aon struchtúr lárnach ann atá freagrach as fíorú, agus ní féidir seicheamh na dteachtaireachtaí agus a n-ábhar a bhréagnú.

Ar dtús, seiceann nód amháin an cruinneas, agus ansin cuireann sé chuig daoine eile é - má deir an tromlach go bhfuil gach rud in ord, cuirfear an t-idirbheart san áireamh sa chéad bhloc eile den slabhra - is comhdhearcadh é seo.

Conas a oibríonn teachtaire díláraithe ar an blockchain?

Is féidir an chuid den chód nód atá freagrach as seiceálacha a fheiceáil ar GitHub - bailíochtóir.js и fhíorú.js. Sea, ritheann an nód ar Node.js.

Lena n-áirítear idirbheart le teachtaireacht i mbloc

Má thángthas ar chomhdhearcadh, cuirfear an t-idirbheart lenár dteachtaireacht san áireamh sa chéad bhloc eile mar aon le hidirbhearta bailí eile.

Tá seicheamh dian ag bloic, agus cruthaítear gach bloc ina dhiaidh sin bunaithe ar hashes na mbloic roimhe seo.

Conas a oibríonn teachtaire díláraithe ar an blockchain?

Is é an pointe ná go bhfuil ár dteachtaireacht san áireamh sa seicheamh seo freisin agus nach féidir í a “atheagrú”. Má thiteann roinnt teachtaireachtaí isteach i mbloc, déanfar a n-ord a chinneadh le timestamp teachtaireachtaí.

Teachtaireachtaí a léamh

Aisghabhann an feidhmchlár teachtaire idirbhearta ón blockchain a sheoltar chuig an bhfaighteoir. Chuige seo rinneamar críochphointe api/chatrooms.

Tá gach idirbheart ar fáil do gach duine - is féidir leat teachtaireachtaí criptithe a fháil. Ach ní féidir ach leis an bhfaighteoir a eochair phríobháideach agus eochair phoiblí an tseoltóra a dhíchriptiú:

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

Agus cad eile?

Ós rud é go seachadtar teachtaireachtaí ar an mbealach seo i thart ar 5 soicind - is é seo an t-am le feiceáil bloc líonra nua - tháinig muid suas le nasc soicéad cliant-go-nód agus nód-go-nód. Nuair a fhaigheann nód idirbheart nua, seiceálann sé a bhailíocht agus cuireann sé ar aghaidh chuig nóid eile é. Tá an t-idirbheart ar fáil do chliaint teachtaire fiú sula dtarlaíonn comhdhearcadh agus cuimsiú sa bhloc. Ar an mbealach seo tabharfaimid teachtaireachtaí láithreach, díreach cosúil le teachtairí meandracha rialta.

Chun an leabhar seoltaí a stóráil, rinneamar KVS - Stóráil Eochair-Luach - is cineál eile idirbheart é seo ina asset ní hé NaCl-box atá criptithe, ach NaCl-bosca rúnda. Seo mar a stórálann an teachtaire sonraí eile.

Tá go leor oibre fós ag teastáil le haghaidh aistrithe comhad/íomhá agus comhráite grúpa. Ar ndóigh, is féidir é seo a “scagadh suas” go tapa san fhormáid botún-agus-blunder, ach ba mhaith linn an leibhéal céanna príobháideachta a choinneáil.

Sea, tá obair fós le déanamh - go hidéalach, glacann fíorphríobháideacht leis nach nascfaidh úsáideoirí le nóid líonra poiblí, ach go n-ardóidh siad a gcuid féin. Cén céatadán úsáideoirí a dhéanann é seo, dar leat? Sin ceart, 0. Bhíomar in ann an cheist seo a réiteach go páirteach leis an leagan Tor den teachtaire.

Tá sé cruthaithe againn gur féidir teachtaire ar an blockchain a bheith ann. Roimhe seo, ní raibh ach iarracht amháin i 2012 - teachtaireacht ghiotán, a theip mar gheall ar amanna seachadta teachtaireachta fada, ualach LAP, agus easpa feidhmchlár soghluaiste.

Agus tá amhras mar gheall ar an bhfíric go bhfuil teachtairí ar an blockchain chun tosaigh ar a gcuid ama - nach bhfuil daoine réidh chun freagracht a ghlacadh as a gcuntas, nach bhfuil ina húinéir ar fhaisnéis phearsanta fós treocht, agus ní cheadaíonn an teicneolaíocht luasanna arda ar an blockchain. Beidh níos mó analógacha teicneolaíochta dár dtionscadal le feiceáil an chéad uair eile. Feicfidh tú.

Foinse: will.com

Add a comment