Pehea e hana ai ka ʻelele decentralized ma ka blockchain?

I ka hoʻomaka ʻana o 2017, hoʻomaka mākou e hana i kahi ʻelele ma ka blockchain [inoa a me ka loulou ma ka ʻaoʻao] ma ke kūkākūkā ʻana i nā pono ma luna o nā ʻelele P2P maʻamau.

Ua hala 2.5 makahiki, a ua hiki iā mākou ke hōʻoia i ko mākou manaʻo: loaʻa nā noi ʻelele no iOS, PWA Web, Windows, GNU/Linux, Mac OS a me Android.

I kēia lā e haʻi mākou iā ʻoe pehea e hana ai ka ʻelele blockchain a pehea e hana ai nā noi mea kūʻai aku me kāna API.
Pehea e hana ai ka ʻelele decentralized ma ka blockchain?

Makemake mākou i ka blockchain e hoʻoponopono i nā pilikia palekana a me ka pilikino o nā ʻelele P2P maʻamau:

  • Hoʻokahi kaomi no ka hana ʻana i kahi moʻokāki - ʻaʻohe kelepona a i ʻole leka uila, ʻaʻohe komo i ka helu ʻana i nā puke a i ʻole geolocations.
  • ʻAʻole hoʻokumu ka poʻe interlocutors i nā pilina pololei; ke kamaʻilio nei nā mea āpau ma o kahi ʻōnaehana puʻupuʻu o nā nodes. ʻAʻole hiki ke loaʻa nā leka IP o nā mea hoʻohana i kekahi i kekahi.
  • Hoʻopili ʻia nā memo a pau End-to-End curve25519xsalsa20poly1305. Me he mea lā ʻaʻole ia e kāhāhā i kekahi, akā ua wehe ʻia kā mākou kumu kumu.
  • Hoʻokuʻu ʻia ka hoʻouka kaua MITM - ʻo kēlā me kēia memo he kālepa a kau inoa ʻia e Ed25519 EdDSA.
  • Pau ka memo i kona poloka pono'ī. ʻO ke kūlike a me ka timestamp ʻAʻole hiki iā ʻoe ke hoʻoponopono i nā poloka, a no laila ke ʻano o nā memo.
  • "ʻAʻole wau i ʻōlelo" ʻaʻole e hana me nā memo ma ka blockchain.
  • ʻAʻohe hale kikowaena e nānā i ka "ʻoiaʻiʻo" o kahi leka. Hana ʻia kēia e kahi ʻōnaehana māhele o nā nodes e pili ana i ka ʻae ʻana, a nona nā mea hoʻohana.
  • ʻAʻole hiki ke hoʻopaʻa ʻia - ʻaʻole hiki ke hoʻopaʻa ʻia nā moʻokāki a ʻaʻole hiki ke holoi ʻia nā memo.
  • ʻO Blockchain 2FA kahi mea ʻē aʻe i ka 2FA hellish ma o SMS, ua pōʻino nui i ke olakino.
  • ʻO ka hiki ke kiʻi i kāu mau kamaʻilio ʻana mai kekahi mea hana i kēlā me kēia manawa ʻo ia ka hiki ke mālama ʻole i nā kamaʻilio kūloko.
  • ʻO ka hōʻoia o ka hoʻouna ʻana i ka leka. ʻAʻole i ka mea hoʻohana, akā i ka pūnaewele. ʻO ka mea nui, he hōʻoia kēia i ka hiki i ka mea lawe ke heluhelu i kāu leka. He mea pono kēia no ka hoʻouna ʻana i nā leka hoʻomaopopo koʻikoʻi.

Loaʻa nā pōmaikaʻi Blockchain i ka hoʻopili pili ʻana me nā cryptocurrencies Ethereum, Dogecoin, Lisk, Dash, Bitcoin (keia mea e holomua nei) a me ka hiki ke hoʻouna i nā hōʻailona ma nā kamaʻilio. Ua hana mākou i kahi mea hoʻololi crypto i kūkulu ʻia.

A laila - pehea e hana ai.

ʻO kahi leka he kālepa

Ua maʻa nā mea a pau i ka ʻoiaʻiʻo o ka hoʻololi ʻana i nā hōʻailona blockchain (kālā) mai kekahi mea hoʻohana i kekahi. E like me Bitcoin. Ua hana mākou i kahi ʻano kālepa kūikawā no ka hoʻouna ʻana i nā leka.

No ka hoʻouna ʻana i kahi leka ma kahi ʻelele ma ka blockchain, pono ʻoe e hele i kekahi mau ala:

  1. Hoʻopili i ke kikokikona memo
  2. E hoʻokomo i ka ciphertext i kahi kālepa
  3. E hōʻailona i ke kālepa
  4. E hoʻouna i kahi kālepa i kekahi node pūnaewele
  5. ʻO ka ʻōnaehana puʻupuʻu o nā nodes e hoʻoholo i ka "ʻoiaʻiʻo" o kahi leka
  6. Inā maikaʻi nā mea a pau, ua hoʻokomo ʻia ke kālepa me ka memo ma ka poloka aʻe
  7. Hoʻihoʻi ka mea loaʻa i ke kālepa memo a hoʻokaʻawale

Hana ʻia nā ʻanuʻu 1-3 a me 7 ma ka ʻāina ma luna o ka mea kūʻai aku, a hana ʻia nā ʻanuʻu 5-6 ma luna o nā mea hoʻokipa.

Hoʻopili memo

Hoʻopili ʻia ka memo me ke kī pilikino o ka mea hoʻouna a me ke kī lehulehu o ka mea i loaʻa. E lawe mākou i ke kī ākea mai ka pūnaewele, akā no kēia, pono e hoʻomaka mua ʻia ka moʻokāki o ka mea loaʻa, ʻo ia hoʻi, loaʻa ma kahi o hoʻokahi kālepa. Hiki iā ʻoe ke hoʻohana i kahi noi REST GET /api/accounts/getPublicKey?address={ADAMANT address}, a i ka wā e hoʻouka ai i nā kamaʻilio, e loaʻa ana nā kī ākea o ka poʻe interlocutors.

Pehea e hana ai ka ʻelele decentralized ma ka blockchain?

Hoʻopili ka ʻelele i nā memo me ka curve25519xsalsa20poly1305 algorithm (Pahu NaCl). No ka mea aia i loko o ka moʻokāki nā kī Ed25519, e hana i kahi pahu, pono e hoʻololi mua ʻia nā kī i Curve25519 Diffie-Hellman.

Eia kekahi laʻana ma 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)
  }
}

Hoʻokumu i kahi kālepa me kahi leka

Loaʻa i ke kālepa ke ʻano maʻamau penei:

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

No ke kālepa memo, ʻo ka mea nui loa asset - pono ʻoe e kau i kahi memo ma ka mea chat me ka hale:

  • message - mālama i ka memo i hoʻopili ʻia
  • own_message -ʻaʻole
  • type — ʻano memo

Hoʻokaʻawale ʻia nā memo i nā ʻano. ʻO ka mea nui, ka parameter type haʻi iā ʻoe pehea e hoʻomaopopo ai message. Hiki iā ʻoe ke hoʻouna i kahi kikokikona wale nō, a i ʻole hiki iā ʻoe ke hoʻouna i kahi mea me nā mea hoihoi i loko - no ka laʻana, penei ke ʻano o ka ʻelele e hana ai i nā hoʻololi cryptocurrency i nā kamaʻilio.

ʻO ka hopena, hana mākou i kahi kālepa:

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

Pulima hana

No ka hōʻoia i ka hilinaʻi o nā mea a pau i ka ʻoiaʻiʻo o ka mea hoʻouna a me ka mea i loaʻa, ka manawa o ka hoʻouna ʻana a me ka ʻike o ka leka, ua kau inoa ʻia ke kālepa. Hiki iā ʻoe ke hōʻoia i ka ʻoiaʻiʻo o kahi kālepa e hoʻohana ana i kahi kī lehulehu - ʻaʻole pono kahi kī pilikino no kēia.

Akā hana ʻia ka pūlima ponoʻī me ke kī pilikino:

Pehea e hana ai ka ʻelele decentralized ma ka blockchain?

Hōʻike ke kiʻikuhi e hana mua mākou i ke kālepa me SHA-256 a laila kau inoa iā ia Ed25519 EdDSA a loaʻa i kahi pūlima signature, a ʻo ka ID kālepa he ʻāpana o ka SHA-256 hash.

Laʻana hoʻokō:

1 — E hana i kahi poloka ikepili, me kahi memo

/**
 * 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 - E helu iā SHA-256 mai ka poloka ʻikepili

/**
 * 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 — E kakau inoa i ka hana

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

Ka hoʻouna ʻana i kahi kālepa me kahi leka i kahi node pūnaewele

No ka hoʻokaʻawale ʻana o ka pūnaewele, e hana kekahi o nā nodes me kahi API hāmama. Ke hana nei i kahi noi POST i ka hopena api/transactions:

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

Ma ka pane e loaʻa iā mākou kahi ID kālepa o ke ʻano

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

Hōʻoiaʻiʻo Kūʻai

ʻO kahi ʻōnaehana māhele o nā nodes, e pili ana i ka ʻae ʻana, e hoʻoholo i ka "ʻoiaʻiʻo" o ka leka kālepa. Mai ia wai a iā wai, i ka wā hea, inā paha i hoʻololi ʻia ka leka me kahi ʻē aʻe, a inā paha i hōʻike pololei ʻia ka manawa o ka hoʻouna ʻana. He mea koʻikoʻi koʻikoʻi kēia o ka blockchain - ʻaʻohe hale kikowaena i kuleana no ka hōʻoia, a ʻaʻole hiki ke hoʻopunipuni ʻia ke ʻano o nā memo a me kā lākou ʻike.

ʻO ka mea mua, e nānā ka node i ka pololei, a laila e hoʻouna aku i nā poʻe ʻē aʻe - inā ʻōlelo ka hapa nui ua pololei nā mea a pau, e hoʻokomo ʻia ke kālepa i ka poloka aʻe o ke kaulahao - ʻo ia ka ʻae.

Pehea e hana ai ka ʻelele decentralized ma ka blockchain?

Hiki ke ʻike ʻia ka ʻāpana o ke code node i kuleana no nā loiloi ma GitHub - validator.js и hōʻoia.js. ʻAe, holo ka node ma Node.js.

Hoʻokomo ʻia kahi kālepa me kahi memo ma kahi poloka

Inā loaʻa ka ʻae ʻana, e hoʻokomo ʻia ke kālepa me kā mākou leka i ka poloka aʻe me nā hana kūpono ʻē aʻe.

He kaʻina koʻikoʻi nā poloka, a ua hoʻokumu ʻia kēlā me kēia poloka ma muli o nā hashes o nā poloka mua.

Pehea e hana ai ka ʻelele decentralized ma ka blockchain?

ʻO ke kumu, ua hoʻokomo pū ʻia kā mākou leka i kēia kaʻina a ʻaʻole hiki ke "hoʻonohonoho hou ʻia". Inā hāʻule kekahi mau memo i loko o kahi poloka, e hoʻoholo ʻia kā lākou kauoha e timestamp nā memo.

Heluhelu i nā memo

Hoʻihoʻi ka noi ʻelele i nā kālepa mai ka blockchain i hoʻouna ʻia i ka mea loaʻa. No kēia hana mākou i kahi hopena api/chatrooms.

Loaʻa nā hana a pau i nā mea a pau - hiki iā ʻoe ke loaʻa nā memo i hoʻopili ʻia. Akā ʻo ka mea loaʻa wale nō e hiki ke hoʻokaʻawale me ka hoʻohana ʻana i kāna kī pilikino a me ke kī lehulehu o ka mea hoʻouna:

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

A he aha hou aʻe?

Ma muli o ka hoʻouna ʻia ʻana o nā memo ma kēia ʻano ma kahi o 5 kekona - ʻo ia ka manawa e ʻike ʻia ai kahi poloka pūnaewele hou - ua hele mai mākou me kahi pilina o ka client-to-node a me ka node-to-node socket. Ke loaʻa i kahi node kahi kālepa hou, nānā ʻo ia i kona kūpono a hoʻouna ʻia i nā node ʻē aʻe. Loaʻa ke kālepa i nā mea kūʻai aku ʻelele ma mua o ka hiki ʻana o ka ʻae a hoʻokomo ʻia i loko o ka poloka. Ma kēia ala mākou e hoʻouna koke aku ai i nā memo, e like me nā ʻelele koke.

No ka mālama ʻana i ka puke helu wahi, ua hana mākou i ka KVS - Key-Value Storage - ʻo ia kekahi ʻano kālepa ʻē aʻe asset ʻaʻole ʻo NaCl-pahu i hoʻopili ʻia, akā NaCl-pahu huna. Pēlā e mālama ai ka ʻelele i nā ʻikepili ʻē aʻe.

ʻO ka hoʻololi ʻana i nā faila/kiʻi a me nā kamaʻilio pūʻulu e koi nui i ka hana. ʻOiaʻiʻo, ma ke ʻano blunder-and-blunder e hiki ke "hoʻopaʻa ʻia" wikiwiki, akā makemake mākou e mālama i ka pae o ka pilikino.

ʻAe, aia nō nā hana e hana ʻia - ʻo ke kūpono, manaʻo ka pilikino maoli ʻaʻole e hoʻopili nā mea hoʻohana i nā node pūnaewele lehulehu, akā e hoʻāla i kā lākou iho. He aha ka pakeneka o nā mea hoʻohana i kou manaʻo e hana i kēia? Pololei, 0. Ua hiki iā mākou ke hoʻoponopono hapa i kēia pilikia me ka mana Tor o ka ʻelele.

Ua hōʻoia mākou e hiki ke noho kahi ʻelele ma ka blockchain. Ma mua, hoʻokahi wale nō ho'āʻo ma 2012 - bitmessage, i hāʻule ʻole ma muli o ka lōʻihi o ka lawe ʻana i nā memo, ka hoʻouka CPU, a me ka nele o nā polokalamu kelepona.

A ʻo ka skepticism ma muli o ka ʻike ʻana o nā ʻelele ma ka blockchain i mua o ko lākou manawa - ʻaʻole mākaukau nā kānaka e lawe i ke kuleana no kā lākou moʻokāki, ʻaʻole ia he ʻike pilikino i kēia manawa, ʻaʻole ʻae ka ʻenehana i nā wikiwiki kiʻekiʻe ma ka blockchain. E ʻike hou ʻia nā analogues ʻenehana hou o kā mākou papahana. E ʻike ʻoe.

Source: www.habr.com

Pākuʻi i ka manaʻo hoʻopuka