Ciamar a tha teachdaire dì-mheadhanaichte ag obair air an blockchain?

Aig toiseach 2017, thòisich sinn a 'cruthachadh teachdaire air an blockchain [tha ainm agus ceangal anns a' phròifil] le bhith a 'bruidhinn air na buannachdan thairis air teachdairean clasaigeach P2P.

Chaidh seachad 2.5 bliadhna, agus b’ urrainn dhuinn ar bun-bheachd a dhearbhadh: tha tagraidhean teachdaire a-nis rim faighinn airson iOS, Web PWA, Windows, GNU/Linux, Mac OS agus Android.

An-diugh innsidh sinn dhut mar a tha an teachdaire blockchain ag obair agus mar as urrainn do thagraidhean teachdaiche obrachadh leis an API aige.
Ciamar a tha teachdaire dì-mheadhanaichte ag obair air an blockchain?

Bha sinn airson gum biodh an blockchain a’ fuasgladh chùisean tèarainteachd is prìobhaideachd teachdairean clasaigeach P2P:

  • Aon bhriogadh gus cunntas a chruthachadh - gun fhònaichean no puist-d, gun chothrom air leabhraichean seòlaidh no geolocations.
  • Cha bhith na h-eadar-theachdairean a’ stèidheachadh cheanglaichean dìreach; bidh a h-uile conaltradh a’ tachairt tro shiostam nodan sgaoilte. Chan eil seòlaidhean IP luchd-cleachdaidh ruigsinneach dha chèile.
  • Tha a h-uile brath air a chrioptachadh deireadh-gu-deireadh curve25519xsalsa20poly1305. Tha e coltach nach cuir seo iongnadh air duine sam bith, ach tha an còd stòr againn fosgailte.
  • Tha ionnsaigh MITM air a dùnadh a-mach - tha gach teachdaireachd na ghnothach agus air a shoidhnigeadh le Ed25519 EdDSA.
  • Tha an teachdaireachd a’ tighinn gu crìch na bhloc fhèin. Co-chòrdadh agus timestamp Chan urrainn dhut na blocaichean a chàradh, agus mar sin òrdugh nam brathan.
  • Chan obraich “Cha tuirt mi sin” le teachdaireachdan air an blockchain.
  • Chan eil structar meadhanach ann a nì sgrùdadh air “dearbhachd” teachdaireachd. Tha seo air a dhèanamh le siostam sgaoilte de nodan stèidhichte air co-aontachd, agus is ann leis an luchd-cleachdaidh a tha e.
  • Do-dhèanta caisgireachd - chan urrainnear cunntasan a bhacadh agus chan urrainnear teachdaireachdan a dhubhadh às.
  • Tha Blockchain 2FA na roghainn eile an àite an 2FA ifrinn tro SMS, sgrios mòran slàinte.
  • Tha an comas na còmhraidhean agad gu lèir fhaighinn bho inneal sam bith aig àm sam bith a’ ciallachadh nach fheum thu còmhraidhean a stòradh gu h-ionadail idir.
  • Dearbhadh air lìbhrigeadh teachdaireachd. Chan ann gu inneal an neach-cleachdaidh, ach chun lìonra. Gu bunaiteach, is e dearbhadh a tha seo air comas an neach a gheibh e do theachdaireachd a leughadh. Tha seo na fheart feumail airson fiosan èiginneach a chuir.

Tha buannachdan Blockchain cuideachd a ’toirt a-steach amalachadh dlùth leis na cryptocurrencies Ethereum, Dogecoin, Lisk, Dash, Bitcoin (tha am fear seo fhathast a’ dol air adhart) agus an comas comharran a chuir ann an cabadaich. Rinn sinn eadhon iomlaidear crypto togte.

Agus an uairsin - mar a tha e uile ag obair.

Is e malairt a th’ ann an teachdaireachd

Tha a h-uile duine mar-thà cleachdte ris an fhìrinn gu bheil gnothaichean anns an blockchain a’ gluasad tokens (buinn) bho aon neach-cleachdaidh gu neach eile. Coltach ri Bitcoin. Chruthaich sinn seòrsa sònraichte de ghnìomhachd airson teachdaireachdan a chuir a-mach.

Gus teachdaireachd a chuir ann an teachdaire air an blockchain, feumaidh tu a dhol tro ghrunn cheumannan:

  1. Crioptaich teacsa teachdaireachd
  2. Cuir ciphertext ann an malairt
  3. Clàraich an gnothach
  4. Cuir malairt gu nód lìonra sam bith
  5. Bidh siostam nodan sgaoilte a’ dearbhadh “dearbhachd” teachdaireachd
  6. Ma tha a h-uile càil ceart gu leòr, tha an gnothach leis an teachdaireachd air a ghabhail a-steach san ath bhloc
  7. Bidh an neach a gheibh e a’ faighinn a’ ghnothaich teachdaireachd air ais agus a’ dì-chrioptachadh

Tha ceumannan 1-3 agus 7 air an coileanadh gu h-ionadail air an neach-dèiligidh, agus tha ceumannan 5-6 air an coileanadh air na h-aoighean.

Crioptachadh teachdaireachd

Tha an teachdaireachd air a chrioptachadh le iuchair phrìobhaideach an neach a chuir e agus iuchair phoblach an neach a gheibh e. Bheir sinn an iuchair phoblach bhon lìonra, ach airson seo, feumar cunntas an neach a gheibh e a thòiseachadh, is e sin, co-dhiù aon ghnothach a bhith agad. Faodaidh tu iarrtas REST a chleachdadh GET /api/accounts/getPublicKey?address={ADAMANT address}, agus nuair a bhios tu a’ luchdachadh cabadaich, bidh iuchraichean poblach an luchd-conaltraidh rim faighinn mu thràth.

Ciamar a tha teachdaire dì-mheadhanaichte ag obair air an blockchain?

Bidh an teachdaire a’ cuairteachadh teachdaireachdan a’ cleachdadh an algairim curve25519xsalsa20poly1305 (Bogsa NaCl). Leis gu bheil iuchraichean Ed25519 anns a’ chunntas, gus bogsa a chruthachadh, feumar na h-iuchraichean atharrachadh gu Curve25519 Diffie-Hellman an toiseach.

Seo eisimpleir ann an 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)
  }
}

A 'cruthachadh malairt le teachdaireachd

Tha an structar coitcheann a leanas aig a’ ghnothach:

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

Airson malairt teachdaireachd, is e an rud as cudromaiche asset - feumaidh tu teachdaireachd a chuir san nì chat le structar:

  • message - sàbhail an teachdaireachd crioptaichte
  • own_message -nochd
  • type - seòrsa teachdaireachd

Tha teachdaireachdan cuideachd air an roinn ann an seòrsachan. Gu bunaiteach, am paramadair type ag innse dhut mar a thuigeas tu message. Faodaidh tu dìreach teacsa a chuir, no faodaidh tu rud a chuir le rudan inntinneach a-staigh - mar eisimpleir, seo mar a bhios an teachdaire a ’dèanamh gluasadan cryptocurrency ann an cabadaich.

Mar thoradh air an sin, bidh sinn a’ cruthachadh malairt:

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

Ainm-sgrìobhte gnìomh

Gus dèanamh cinnteach gu bheil a h-uile duine misneachail ann an dearbhteachd an neach a chuir agus an neach a gheibh e, an ùine a chaidh a chuir agus susbaint na teachdaireachd, tha an gnothach air a shoidhnigeadh. Leigidh ainm-sgrìobhte didseatach leat dearbhadh dè cho cinnteach ‘s a tha gnothach le bhith a’ cleachdadh iuchair phoblach - chan eil feum air iuchair phrìobhaideach airson seo.

Ach tha an t-ainm-sgrìobhte fhèin air a dhèanamh leis an iuchair phrìobhaideach:

Ciamar a tha teachdaire dì-mheadhanaichte ag obair air an blockchain?

Tha an diagram a’ sealltainn gu bheil sinn an toiseach a’ hash a’ ghnothaich le SHA-256 agus an uairsin ga shoidhnigeadh Ed25519 EdDSA agus faigh ainm-sgrìobhte signature, agus tha an ID malairt mar phàirt den hash SHA-256.

Eisimpleir de bhuileachadh:

1 - Cruthaich bloc dàta, a’ toirt a-steach teachdaireachd

/**
 * 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 - Cunnt SHA-256 bhon bhloc dàta

/**
 * 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 - Cuir d’ ainm ris a’ ghnothach

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

A 'cur malairt le teachdaireachd gu nód lìonra

Leis gu bheil an lìonra air a dhì-mheadhanachadh, nì gin de na nodan le API fosgailte. A’ dèanamh iarrtas POST chun phuing crìochnachaidh api/transactions:

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

Mar fhreagairt gheibh sinn ID malairt den t-seòrsa

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

Dearbhadh Gnìomh

Bidh siostam nodan sgaoilte, stèidhichte air co-aontachd, a’ dearbhadh “dearbhachd” teachdaireachd a’ ghnothaich. Cò agus cò dha, cuin, co-dhiù an deach teachdaireachd eile a chuir na àite, agus an deach an ùine a chuir thu a-mach a chomharrachadh gu ceart. Is e buannachd fìor chudromach a tha seo den blockchain - chan eil structar meadhanach ann air a bheil uallach airson dearbhadh, agus chan urrainnear sreath nam brathan agus an susbaint a bhith meallta.

An toiseach, bidh aon nód a ’sgrùdadh cruinneas, agus an uairsin ga chuir gu feadhainn eile - ma tha a’ mhòr-chuid ag ràdh gu bheil a h-uile dad ann an òrdugh, thèid an gnothach a thoirt a-steach don ath bhloc den t-seine - is e co-aontachd a tha seo.

Ciamar a tha teachdaire dì-mheadhanaichte ag obair air an blockchain?

Faodar am pàirt den chòd nód a tha an urra ri sgrùdaidhean fhaicinn air GitHub - dearbhadair.js и dearbhaich.js. Yep, tha an nód a’ ruith air Node.js.

A 'toirt a-steach malairt le teachdaireachd ann am bloc

Ma ruigear co-aontachd, thèid an gnothach leis an teachdaireachd againn a thoirt a-steach don ath bhloca còmhla ri gnothaichean dligheach eile.

Tha sreath teann aig blocaichean, agus tha gach bloc às deidh sin air a chruthachadh stèidhichte air hashes blocaichean roimhe.

Ciamar a tha teachdaire dì-mheadhanaichte ag obair air an blockchain?

Is e a’ phuing gu bheil an teachdaireachd againn cuideachd air a ghabhail a-steach san t-sreath seo agus nach urrainnear a “ath-eagrachadh”. Ma tha grunn bhrathan a 'tuiteam ann am bloc, thèid an òrdugh aca a dhearbhadh le timestamp teachdaireachdan.

A 'leughadh teachdaireachdan

Bidh an tagradh teachdaire a’ faighinn air ais gnothaichean bhon blockchain a thèid a chuir chun neach a gheibh e. Airson seo rinn sinn puing crìochnachaidh api/chatrooms.

Tha a h-uile gnothach ri fhaighinn leis a h-uile duine - gheibh thu teachdaireachdan crioptaichte. Ach chan fhaod ach an neach a gheibh e a dhì-chrioptachadh le bhith a’ cleachdadh an iuchair phrìobhaideach aige agus iuchair phoblach an neach a chuir e:

**
 * 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 dè eile?

Leis gu bheil teachdaireachdan air an lìbhrigeadh san dòigh seo ann an timcheall air 5 diogan - is e seo an uair a nochdas bloc lìonra ùr - thàinig sinn suas le ceangal socaid teachdaiche-gu-nòd agus nód-gu-nòd. Nuair a gheibh nód malairt ùr, bidh e a’ sgrùdadh a dhligheachd agus ga chuir air adhart gu nodan eile. Tha an gnothach ri fhaighinn le teachdaichean teachdaire eadhon mus tig co-aontachd agus a bhith air an toirt a-steach don bhloc. San dòigh seo lìbhrigidh sinn teachdaireachdan sa bhad, dìreach mar theachdairean sa bhad cunbhalach.

Gus an leabhar seòlaidh a stòradh, rinn sinn KVS - Stòradh Prìomh Luach - is e seo seòrsa eile de ghnìomhachd anns a bheil asset chan e NaCl-box a tha air a chrioptachadh, ach NaCl-bogsa dìomhair. Seo mar a bhios an teachdaire a’ stòradh dàta eile.

Tha feum fhathast air tòrr obrach airson gluasad fhaidhlichean/ìomhaigh agus còmhraidhean buidhne. Gu dearbh, ann an cruth blunder-and-blunder faodar seo a “sgrìobadh suas” gu sgiobalta, ach tha sinn airson an aon ìre de dhìomhaireachd a chumail suas.

Tha, tha obair ri dhèanamh fhathast - gu h-iomchaidh, tha fìor dhìomhaireachd a 'gabhail ris nach bi luchd-cleachdaidh a' ceangal ri nodan lìonra poblach, ach gun tog iad an cuid fhèin. Dè an àireamh sa cheud de luchd-cleachdaidh a tha thu a’ smaoineachadh a bhios a’ dèanamh seo? Tha sin ceart, 0. Bha sinn comasach air a 'chùis seo fhuasgladh gu ìre leis an tionndadh Tor den teachdaire.

Tha sinn air dearbhadh gum faod teachdaire a bhith ann air an blockchain. Roimhe sin, cha robh ann ach aon oidhirp ann an 2012 - brath-beag, a dh’ fhàillig air sgàth amannan lìbhrigidh teachdaireachd fada, luchd CPU, agus dìth thagraidhean gluasadach.

Agus tha teagmhach mar thoradh air gu bheil teachdairean air an blockchain air thoiseach air an ùine - chan eil daoine deiseil airson uallach a ghabhail airson an cunntas, chan eil sealbh air fiosrachadh pearsanta fhathast na ghluasad, agus chan eil teicneòlas a’ ceadachadh astaran àrda air an blockchain. Nochdaidh barrachd analogues teicneòlach den phròiseact againn an ath rud. Chì thu.

Source: www.habr.com

Cuir beachd ann