Kedu ka onye ozi enweghị isi si arụ ọrụ na blockchain?

Ná mmalite nke 2017, anyị malitere ịmepụta onye ozi na blockchain [aha na njikọ dị na profaịlụ] site n'ịtụle uru karịa ndị ozi P2P.

Gafere 2.5 afọ, anyị wee nwee ike kwado echiche anyị: ngwa ozi dị ugbu a maka iOS, Web PWA, Windows, GNU/Linux, Mac OS na gam akporo.

Taa, anyị ga-agwa gị ka onye ozi blockchain si arụ ọrụ yana otu ngwa ndị ahịa nwere ike isi rụọ ọrụ na API ya.
Kedu ka onye ozi enweghị isi si arụ ọrụ na blockchain?

Anyị chọrọ ka blockchain dozie nsogbu nchekwa na nzuzo nke ndị ozi P2P mara mma:

  • Otu ọpịpị iji mepụta akaụntụ - enweghị ekwentị ma ọ bụ ozi-e, enweghị ohere ịnweta akwụkwọ adreesị ma ọ bụ mpaghara ala.
  • Ndị na-emekọrịta ihe anaghị ewepụta njikọ ozugbo; nzikọrịta ozi niile na-ewere ọnọdụ site na sistemụ ọnụ nke kesara. Adreesị IP ndị ọrụ anaghị enweta onwe ha.
  • Ezochiri ozi niile ezoro ezo akụkụ ngwụcha ruo ngwụcha25519xsalsa20poly1305. Ọ dị ka nke a agaghị eju onye ọ bụla anya, mana koodu isi mmalite anyị mepere emepe.
  • Ewepula mbuso agha MITM - ozi ọ bụla bụ azụmahịa yana Ed25519 EdDSA bịanyere aka na ya.
  • Ozi na-ejedebe na ngọngọ nke ya. Nkwenye na timestamp Ị nweghị ike idozi ngọngọ, ya mere usoro nke ozi.
  • "Ekwughị m nke ahụ" agaghị arụ ọrụ na ozi na blockchain.
  • Enweghị usoro etiti nke na-enyocha "ezigbo" nke ozi. A na-eme nke a site na usoro ọnụ ụzọ ekesa nke dabere na nkwenye, ma ndị ọrụ nwe ya.
  • Enweghị ike ịme nyocha - enweghị ike igbochi akaụntụ yana enweghị ike ihichapụ ozi.
  • Blockchain 2FA bụ ihe ọzọ na hellish 2FA site na SMS, mebiri ọtụtụ ahụ ike.
  • Ikike ịnweta mkparịta ụka gị niile site na ngwaọrụ ọ bụla n'oge ọ bụla pụtara na ịgaghị echekwa mkparịta ụka na mpaghara ma ọlị.
  • Nkwenye nke nnyefe ozi. Ọ bụghị na ngwaọrụ onye ọrụ, kama na netwọk. N'ezie, nke a bụ nkwenye nke ike onye nnata nwere ịgụ ozi gị. Nke a bụ njirimara bara uru maka izipu ọkwa dị oke mkpa.

Uru Blockchain gụnyekwara njikọ chiri anya na cryptocurrencies Ethereum, Dogecoin, Lisk, Dash, Bitcoin (nke a ka na-aga n'ihu) yana ikike izipu token na nkata. Ọbụna anyị mere ihe mgbanwe crypto arụnyere n'ime ya.

Na mgbe ahụ - otú ọ niile na-arụ ọrụ.

Ozi bụ azụmahịa

Onye ọ bụla amaralarị eziokwu ahụ na azụmahịa na blockchain transfer tokens (mkpụrụ ego) site n'otu onye ọrụ gaa na nke ọzọ. Dị ka Bitcoin. Anyị mepụtara ụdị azụmahịa pụrụ iche maka izisa ozi.

Iji zipu ozi na onye ozi na blockchain, ịkwesịrị ịgafe ọtụtụ usoro:

  1. Ezoro ederede ozi
  2. Tinye ciphertext n'ime azụmahịa
  3. Banye aka na azụmahịa ahụ
  4. Zipu azụmahịa na ọnụ netwọk ọ bụla
  5. Usoro ọnụ nke ekesa na-ekpebi “ezigbo” ozi
  6. Ọ bụrụ na ihe niile dị mma, azụmahịa na ozi ahụ gụnyere na ngọngọ na-esote
  7. Onye nnata ahụ na-eweghachite azụmahịa ozi wee mebie ya

A na-eme usoro 1-3 na 7 na mpaghara na onye ahịa, a na-emekwa usoro 5-6 na ndị ọbịa.

Izo ya ezo ozi

Eji igodo nzuzo onye zitere ya na igodo ọha nke nnata ezoro ezo a. Anyị ga-ewepụ igodo ọha na netwọkụ, mana maka nke a, a ga-ebuli akaụntụ onye nnata, ya bụ, nwee opekata mpe otu azụmahịa. Ị nwere ike iji arịrịọ REST GET /api/accounts/getPublicKey?address={ADAMANT address}, na mgbe ị na-ebunye nkata, igodo ọha nke ndị interlocutors ga-adị adị.

Kedu ka onye ozi enweghị isi si arụ ọrụ na blockchain?

Onye ozi ahụ na-ezochi ozi site na iji curve25519xsalsa20poly1305 algọridimIgbe NaCl). Ebe akaụntụ ahụ nwere igodo Ed25519, iji mepụta igbe, igodo ga-ebu ụzọ gbanwee gaa na Curve25519 Diffie-Hellman.

Nke a bụ ọmụmaatụ na 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)
  }
}

Iji ozi na-eme azụmahịa

Azụmahịa ahụ nwere usoro izugbe ndị a:

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

Maka azụmahịa ozi, ihe kacha mkpa bụ asset - ịkwesịrị itinye ozi na ihe ahụ chat nwere usoro:

  • message - Chekwaa ozi ezoro ezo
  • own_message -enweghị
  • type - ụdị ozi

A na-ekewakwa ozi n'ụdị. N'ezie, parameter type na-agwa gị otu esi aghọta message. Ị nwere ike izipu naanị ederede, ma ọ bụ ị nwere ike izipu ihe nwere ihe na-adọrọ mmasị n'ime - dịka ọmụmaatụ, otu a ka onye ozi na-ebufe cryptocurrency na nkata.

N'ihi ya, anyị na-emepụta azụmahịa:

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

mbinye aka azụmahịa

Iji hụ na onye ọ bụla nwere obi ike na eziokwu nke onye na-ezipụ na onye nnata, oge izipu na ọdịnaya nke ozi ahụ, a bịanyere aka na azụmahịa ahụ. mbinye aka dijitalụ na-enye gị ohere iji igodo ọha gosi na izi ezi nke azụmahịa - igodo nzuzo adịghị mkpa maka nke a.

Mana a na-eme mbinye aka n'onwe ya site na iji igodo nzuzo:

Kedu ka onye ozi enweghị isi si arụ ọrụ na blockchain?

Eserese a na-egosi na anyị bu ụzọ tinye SHA-256 azụmahịa wee bịanye aka na ya Ed25519 EdDSA ma nweta mbinye aka signature, na ID azụmahịa bụ akụkụ nke SHA-256 hash.

Ihe atụ mmejuputa iwu:

1 - Mepụta ngọngọ data, gụnyere ozi

/**
 * 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 - Gụọ SHA-256 site na ngọngọ 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 - Banye aka azụmahịa

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

Iji ozi ziga azụmahịa na ọnụ netwọkụ

Ebe ọ bụ na netwọk ahụ agbasaghị, ọnụ ụzọ ọ bụla nwere API mepere emepe ga-eme. Na-eme arịrịọ POST na njedebe njedebe api/transactions:

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

Na nzaghachi anyị ga-enweta ID azụmahịa nke ụdị

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

Nkwado azụmahịa

Usoro nkesa nke ọnụ, dabere na nkwenye, na-ekpebi "ezigbo" nke ozi azụmahịa. Site n'aka onye na onye, ​​​​n'oge, ma e ji onye ọzọ dochie ozi ahụ, na ma oge izipu e gosiri nke ọma. Nke a bụ uru dị oke mkpa nke blockchain - ọ nweghị usoro etiti na-ahụ maka nkwenye, na usoro ozi na ọdịnaya ha enweghị ike ịbụ faked.

Nke mbụ, otu ọnụ na-enyocha izi ezi, wee zigara ya ndị ọzọ - ọ bụrụ na ọtụtụ na-ekwu na ihe niile dị n'usoro, a ga-etinye azụmahịa ahụ na ngọngọ na-esote nke agbụ - nke a bụ nkwenye.

Kedu ka onye ozi enweghị isi si arụ ọrụ na blockchain?

Enwere ike ịlele akụkụ nke koodu node nke na-ahụ maka nlele na GitHub - onye nkwado.js и gosi.js. Ee, ọnụ na-agba na Node.js.

Gụnyere azụmahịa nwere ozi na ngọngọ

Ọ bụrụ na a kwadoro nkwekọrịta, azụmahịa na ozi anyị ga-etinye na ngọngọ na-esote yana azụmahịa ndị ọzọ dị irè.

Ihe mgbochi nwere usoro siri ike, a na-etolite ngọngọ ọ bụla na-esote dabere na hashes nke ngọngọ gara aga.

Kedu ka onye ozi enweghị isi si arụ ọrụ na blockchain?

Isi ihe bụ na a gụnyekwara ozi anyị n'usoro a, enweghị ike ịhazigharị ya. Ọ bụrụ na ọtụtụ ozi dabara na ngọngọ, a ga-ekpebi usoro ha site na timestamp ozi.

Ozi na-agụ

Ngwa ozi na-eweghachite azụmahịa na blockchain ezigara onye nnata. Maka nke a anyị mere njedebe njedebe api/chatrooms.

Azụmahịa niile dị maka onye ọ bụla - ị nwere ike ịnweta ozi ezoro ezo. Mana naanị onye nnata nwere ike decrypt site na iji igodo nzuzo ya na igodo ọha nke onye zitere ya:

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

Ma gịnị ọzọ?

Ebe ọ bụ na a na-ebuga ozi n'ụzọ dị otú a n'ihe dị ka sekọn 5 - nke a bụ oge mgbochi netwọk ọhụrụ pụtara - anyị ji njikọ oghere ndị ahịa-na-ọnụ na ọnụ-na-node. Mgbe ọnụ na-enweta azụmahịa ọhụrụ, ọ na-enyocha ịdị irè ya wee zipu ya na ọnụ ụzọ ndị ọzọ. Azụmahịa dị maka ndị ahịa ozi ọbụna tupu nkwenye emee na nsonye na ngọngọ. N'ụzọ dị otú a, anyị ga-ezipụ ozi ozugbo, dị ka ndị ozi ozugbo.

Iji chekwaa akwụkwọ adreesị ahụ, anyị mere KVS - Nchekwa Key-Uru - nke a bụ ụdị azụmahịa ọzọ nke. asset Ọ bụghị igbe NaCl ka ezoro ezo, mana NaCl-igbe nzuzo. Otu a ka onye ozi na-echekwa data ndị ọzọ.

Nyefe faịlụ/oyiyi na nkata otu ka na-achọ nnukwu ọrụ. N'ezie, na blunder-na-blunder usoro nke a nwere ike "na-agbaji" ngwa ngwa, ma anyị chọrọ ịnọgide na-enwe otu ọkwa nke nzuzo.

Ee, a ka nwere ọrụ a ga-arụ - n'ezie, ezigbo nzuzo na-eche na ndị ọrụ agaghị ejikọta na ọnụ netwọk ọha, kama ha ga-ebuli nke ha. Kedu pasentị ndị ọrụ ị chere na-eme nke a? Nke ahụ ziri ezi, 0. Anyị nwere ike iji ụdị Tor nke onye ozi ahụ dozie esemokwu a n'ụzọ ụfọdụ.

Anyị egosila na onye ozi na blockchain nwere ike ịdị. Na mbụ, e nwere naanị otu mgbalị na 2012 - ozi bitmes, nke dara n'ihi ogologo oge nnyefe ozi, ibu CPU, na enweghị ngwa mkpanaka.

Na obi abụọ bụ n'ihi na ndị ozi na blockchain na-abịa n'ihu oge ha - ndị mmadụ adịghị njikere ibu ọrụ maka akaụntụ ha, ịnweta ozi nkeonwe abụghị ihe na-emekarị, na nkà na ụzụ anaghị ekwe ka nnukwu ọsọ na blockchain. More teknụzụ analogues nke ọrụ anyị ga-apụta na-esote. Ị ga-ahụ.

isi: www.habr.com

Tinye a comment