E faʻafefea ona galue se avefeau faʻasalalau i luga o le poloka poloka?

I le amataga o le 2017, na amata ai ona matou fatuina se avefeau i luga o le poloka poloka [igoa ma fesoʻotaʻiga o loʻo i totonu o le talaaga] e ala i le talanoaina o le lelei i luga o le P2P avefeʻau masani.

pasi 2.5 tausaga, ma na mafai ona matou faʻamaonia la matou manatu: o loʻo avanoa nei talosaga avefeʻau mo iOS, Web PWA, Windows, GNU/Linux, Mac OS ma le Android.

O le asō o le a matou taʻuina atu ia te oe pe faʻafefea ona galue le avefeʻau poloka ma pe faʻafefea ona faʻaogaina talosaga a tagata faʻatau ma lana API.
E faʻafefea ona galue se avefeau faʻasalalau i luga o le poloka poloka?

Matou te mananaʻo i le poloka poloka e foia ai le saogalemu ma le le faalauaiteleina o mataupu masani a P2P avefeau:

  • Tasi le kiliki e fatu ai se tala - leai ni telefoni po'o ni imeli, leai se avanoa i tusi tuatusi po'o geolocations.
  • E le mafai lava ona fa'atūina feso'ota'iga tu'usa'o tagata fa'afeso'ota'i; o feso'ota'iga uma e faia e ala i se fa'asoa fa'asoa o nodes. O tuatusi IP a tagata fa'aoga e le mafai ona maua e le tasi le isi.
  • O fe'au uma o lo'o fa'aigoaina Fa'ai'u i le fa'ai'uga curve25519xsalsa20poly1305. E foliga mai o le a le faateia ai se tasi, ae o loʻo tatala le matou code source.
  • O osofaʻiga a le MITM e le aofia - o feʻau taʻitasi o se fefaʻatauaiga ma ua sainia e Ed25519 EdDSA.
  • E i'u le fe'au i lana lava poloka. Fa'atasi ma timestamp E le mafai ona e faʻaleleia poloka, ma o le mea lea o le faasologa o feʻau.
  • "Ou te leʻi fai atu lena mea" o le a le aoga i feʻau i luga o le poloka poloka.
  • E leai se fausaga tutotonu e siaki ai le "faʻamaoni" o se feʻau. E faia lenei mea e ala i le tufatufaina atu o nodes e faʻavae i luga o le maliega, ma o loʻo umia e tagata faʻaoga.
  • Le mafai ona fa'asala - e le mafai ona poloka fa'amatalaga ma e le mafai ona tape fe'au.
  • Blockchain 2FA o se isi mea i le 2FA seoli e ala i SMS, faaleagaina le tele o le soifua maloloina.
  • O le mafai ona maua uma au talanoaga mai so'o se masini i soo se taimi o lona uiga e te le tau teuina ni talanoaga i le lotoifale.
  • Fa'amaoniga o le tu'uina atu o fe'au. E le o le masini a le tagata faʻaoga, ae o le fesoʻotaʻiga. O le mea moni, o le fa'amaoniga lea o le mafai e le tagata e mauaina ona faitau lau fe'au. O se vaega aoga lea mo le lafoina o faʻamatalaga taua.

O faʻamanuiaga Blockchain e aofia ai foʻi le vavalalata vavalalata ma le cryptocurrencies Ethereum, Dogecoin, Lisk, Dash, Bitcoin (o loʻo faʻaauau pea lenei mea) ma le mafai ona lafo faʻailoga i talatalanoaga. Na matou faia foʻi se faʻatau crypto faʻapipiʻiina.

Ona sosoo ai lea - pe faapefea ona aoga uma.

O se savali o se fefaʻatauaiga

Ua uma ona masani tagata uma i le mea moni o fefaʻatauaiga i totonu o le poloka poloka faʻafeiloaʻi faʻailoga (tupe) mai le tasi tagata faʻaoga i le isi. E pei o Bitcoin. Na matou faia se ituaiga faʻapitoa o fefaʻatauaiga mo le lafoina o feʻau.

Ina ia auina atu se savali i se avefeau i luga o le poloka poloka, e tatau ona e uia ni laasaga:

  1. Fa'ailoga tusi fe'au
  2. Tu'u sifitusi i totonu o se fefa'atauaiga
  3. Saini le fefaʻatauaiga
  4. Auina atu se fefaʻatauaiga i soʻo se node fesoʻotaʻiga
  5. O se fa'asoa fa'asoa o nodes e iloa ai le "fa'amaoni" o se fe'au
  6. Afai e lelei mea uma, o le fefaʻatauaiga ma le feʻau o loʻo aofia i le isi poloka
  7. E toe maua mai e le tagata e mauaina le fe'au fe'au ma fa'asese

Laasaga 1–3 ma le 7 e faia i le lotoifale i luga o le kalani, ma Laasaga 5-6 e faia i luga o le au talimalo.

Fa'ailoga fe'au

O le fe'au o lo'o fa'ailogaina i le ki fa'apitoa a le tagata e auina atu ma le ki fa'alaua'itele a le tagata e mauaina. O le a matou ave le ki a le lautele mai le fesoʻotaʻiga, ae mo lenei mea, e tatau ona amataina le tala a le tagata e mauaina, o lona uiga, ia le itiiti ifo ma le tasi le fefaʻatauaiga. E mafai ona e fa'aogaina se talosaga REST GET /api/accounts/getPublicKey?address={ADAMANT address}, ma pe a faʻapipiʻi talatalanoaga, o ki faʻalauaʻitele a tagata faʻafesoʻotaʻi o le a maua uma.

E faʻafefea ona galue se avefeau faʻasalalau i luga o le poloka poloka?

E fa'ailogaina e le avefe'au fe'au e fa'aaoga ai le curve25519xsalsa20poly1305 algorithm (Pusa NaCl). Talu ai o le tala o loʻo i ai ki Ed25519, e fai ai se atigipusa, e tatau ona liliu muamua ki i Curve25519 Diffie-Hellman.

Ole fa'ata'ita'iga lea ile 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)
  }
}

Fausia se fefaʻatauaiga ma se feʻau

O le fefaʻatauaiga o loʻo i ai le faʻatulagaga lautele:

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

Mo se fefaʻatauaʻiga feʻau, o le mea sili ona taua asset - e tatau ona e tuʻuina se feʻau i totonu o le mea chat ma fausaga:

  • message - fa'asaoina le fe'au fa'ailoga
  • own_message - leai
  • type — ituaiga savali

Ua vaevaeina foi savali i ituaiga. O le mea moni, o le parakalafa type ta'u atu ia te oe le ala e te malamalama ai message. E mafai ona e lafoina naʻo se tusitusiga, pe mafai foʻi ona e lafoina se mea ma mea manaia i totonu - mo se faʻataʻitaʻiga, o le auala lea e faia ai e le avefeau le faʻaliliuina o le cryptocurrency i talatalanoaga.

O se taunuuga, matou te faia se fefaʻatauaiga:

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

Saini fefa'ataua'iga

Ina ia mautinoa o loʻo talitonu tagata uma i le moni aʻiaʻi o le tagata na auina atu ma le tagata e mauaina, o le taimi o le lafoina ma le anotusi o le feʻau, ua sainia le fefaʻatauaiga. O se saini numera e mafai ai ona e faʻamaonia le moni o se fefaʻatauaiga e faʻaaoga ai se ki faʻapitoa - e le manaʻomia se ki faʻapitoa mo lenei mea.

Ae o le saini lava ia e faia e faʻaaoga ai le ki faʻapitoa:

E faʻafefea ona galue se avefeau faʻasalalau i luga o le poloka poloka?

O le ata o loʻo faʻaalia ai e muamua ona tatou faʻaogaina le fefaʻatauaiga ma SHA-256 ona sainia lea Ed25519 EdDSA ma maua se saini signature, ma o le ID fefaʻatauaiga o se vaega o le SHA-256 hash.

Fa'ata'ita'iga fa'atinoga:

1 - Fausia se poloka faʻamatalaga, e aofia ai se feʻau

/**
 * 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 - Faitau SHA-256 mai le poloka faʻamaumauga

/**
 * 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 - Saini le fefaʻatauaiga

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

Tuuina atu o se fefaʻatauaiga ma se feʻau i se node fesoʻotaʻiga

Talu ai ona o le fesoʻotaʻiga e faʻasalalau, o soʻo se nodes e iai se API tatala o le a faia. Faia se talosaga POST i le mea e gata ai api/transactions:

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

I le tali atu o le a matou mauaina se ID fefaʻatauaiga o le ituaiga

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

Fa'amaoniga o Fefa'atauaiga

O se faʻasalalauga faʻapipiʻi o nodes, e faʻavae i luga o le maliega, e fuafua ai le "faʻamaoni" o le feʻau fefaʻatauaiga. Mai ai ma o ai, o anafea, pe na suia le feʻau i se isi, ma pe na faʻaalia saʻo le taimi na auina atu ai. O se tulaga taua tele lea o le poloka poloka - e leai se fausaga tutotonu e nafa ma le faʻamaonia, ma o le faasologa o feʻau ma a latou mea e le mafai ona faʻamaonia.

Muamua, o le tasi node e siaki le saʻo, ona tuʻuina atu lea i isi - afai e fai mai le toʻatele o loʻo faʻatonu mea uma, o le fefaʻatauaiga o le a aofia i le isi poloka o le filifili - o le maliega lea.

E faʻafefea ona galue se avefeau faʻasalalau i luga o le poloka poloka?

O le vaega o le node code e nafa ma siaki e mafai ona vaʻaia i GitHub - validator.js и verify.js. Ioe, o le node e tamo'e ile Node.js.

E aofia ai se fefaʻatauaiga ma se feʻau i totonu o se poloka

Afai e maua le maliega, o le fefaʻatauaiga ma la matou savali o le a aofia ai i le isi poloka faʻatasi ai ma isi fefaʻatauaiga aoga.

O poloka o loʻo i ai se faʻasologa saʻo, ma o poloka taʻitasi mulimuli ane e faʻavae i luga o faʻamau o poloka muamua.

E faʻafefea ona galue se avefeau faʻasalalau i luga o le poloka poloka?

O le manatu o la tatou savali o loʻo aofia ai foi i lenei faasologa ma e le mafai ona "toe faʻatulagaina". Afai e tele fe'au e pa'u i totonu o se poloka, o la latou fa'atonuga o le a fuafuaina e timestamp feau

Faitau savali

O le talosaga a le avefeau e toe maua mai fefaʻatauaiga mai le poloka poloka e auina atu i le tagata e mauaina. Mo lenei mea na matou faia ai se fa'ai'uga api/chatrooms.

O fefa'atauaiga uma e avanoa mo tagata uma - e mafai ona e mauaina fe'au fa'ailoga. Ae na'o le tagata na te mauaina e mafai ona fa'amama le fa'aogaina o lana ki fa'apitoa ma le ki fa'alaua'itele a le tagata e auina atu:

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

Ae o le a se isi mea?

Talu ai ona o fe'au e momoli atu i lenei auala pe a ma le 5 sekone - o le taimi lea e aliali mai ai se poloka feso'ota'iga fou - na matou o mai ai ma se socket socket client-to-node ma node-to-node. A maua e se node se fefaʻatauaiga fou, e siaki lona aoga ma tuʻuina atu i isi nodes. O lo'o avanoa le fefa'ataua'iga i tagata fa'atau avefe'au a'o le'i faia se maliega ma fa'aaofia i totonu ole poloka. O le auala lea o le a matou momoli vave atu ai feʻau, e pei lava o avefeʻau masani masani.

Ina ia teuina le tusi tuatusi, na matou faia KVS - Key-Value Storage - o le isi lea ituaiga o fefaʻatauaiga lea asset e le o le NaCl-pusa e fa'ailoga, ae NaCl-pusa faalilolilo. O le auala lea e teu ai e le avefeau isi faʻamatalaga.

Fa'aliliuga faila/ata ma talatalanoaga fa'avae e mana'omia pea le tele o galuega. O le mea moni, i le faiga fa'asese-ma-fa'aseseina e mafai ona vave "fa'aleaga", ae matou te manana'o e fa'atumauina le tulaga tutusa o le le faalauaiteleina.

Ioe, o loʻo i ai pea galuega e tatau ona fai - o le mea sili, o le tagata faalilolilo e manatu e le faʻafesoʻotaʻi tagata faʻaoga i nodes fesoʻotaʻiga lautele, ae o le a latou faʻatupuina a latou lava. O le a le pasene o tagata fa'aoga e te manatu e faia lenei mea? E sa'o, 0. Na mafai ona matou foia se vaega o lenei mataupu i le Tor version a le avefeau.

Ua matou faʻamaonia e mafai ona i ai se avefeau i luga o le poloka poloka. I le taimi muamua, na o le tasi le taumafaiga i le 2012 - bitmessage, lea na le manuia ona o le umi o taimi e tuʻuina atu ai feʻau, uta CPU, ma le leai o ni talosaga feaveaʻi.

Ma o le masalosalo e mafua mai i le mea moni e faapea o avefeau i luga o le poloka poloka e muamua atu i lo latou taimi - e le o sauni tagata e ave le matafaioi mo a latou tala, o le umiaina o faamatalaga patino e le o se tulaga masani, ma e le faatagaina e tekinolosi le saoasaoa maualuga i luga o le poloka poloka. O isi fa'atekonolosi fa'atusa o la matou poloketi o le a fa'aalia i le isi. O le ae vaai.

puna: www.habr.com

Faaopoopo i ai se faamatalaga