ืื™ืš ืขื•ื‘ื“ ืฉืœื™ื— ืžื‘ื•ื–ืจ ืขืœ ื”ื‘ืœื•ืงืฆ'ื™ื™ืŸ?

ื‘ืชื—ื™ืœืช 2017, ื”ืชื—ืœื ื• ืœื™ืฆื•ืจ ืžืกื ื’'ืจ ื‘ื‘ืœื•ืงืฆ'ื™ื™ืŸ [ืฉื ื•ืงื™ืฉื•ืจ ื ืžืฆืื™ื ื‘ืคืจื•ืคื™ืœ] ืขืœ ื™ื“ื™ ื“ื™ื•ืŸ ื‘ื™ืชืจื•ื ื•ืช ืขืœ ืคื ื™ ืฉืœื™ื—ื™ P2P ืงืœืืกื™ื™ื.

ื ืขืœื 2.5 ืฉื ื”, ื•ื”ืฆืœื—ื ื• ืœืืฉืจ ืืช ื”ืจืขื™ื•ืŸ ืฉืœื ื•: ื™ื™ืฉื•ืžื™ ืžืกื ื’'ืจ ื–ืžื™ื ื™ื ื›ืขืช ืขื‘ื•ืจ iOS, Web PWA, Windows, GNU/Linux, Mac OS ื•ืื ื“ืจื•ืื™ื“.

ื”ื™ื•ื ื ืกืคืจ ืœื›ื ืื™ืš ืขื•ื‘ื“ ืฉืœื™ื— ื”ื‘ืœื•ืงืฆ'ื™ื™ืŸ ื•ื›ื™ืฆื“ ื™ื™ืฉื•ืžื™ ืœืงื•ื— ื™ื›ื•ืœื™ื ืœืขื‘ื•ื“ ืขื ื”-API ืฉืœื•.
ืื™ืš ืขื•ื‘ื“ ืฉืœื™ื— ืžื‘ื•ื–ืจ ืขืœ ื”ื‘ืœื•ืงืฆ'ื™ื™ืŸ?

ืจืฆื™ื ื• ืฉื”-blockchain ื™ืคืชื•ืจ ืืช ื‘ืขื™ื•ืช ื”ืื‘ื˜ื—ื” ื•ื”ืคืจื˜ื™ื•ืช ืฉืœ ืฉืœื™ื—ื™ P2P ืงืœืืกื™ื™ื:

  • ืœื—ื™ืฆื” ืื—ืช ืœื™ืฆื™ืจืช ื—ืฉื‘ื•ืŸ - ืœืœื ื˜ืœืคื•ื ื™ื ืื• ืžื™ื™ืœื™ื, ืœืœื ื’ื™ืฉื” ืœืกืคืจื™ ื›ืชื•ื‘ื•ืช ืื• ืžื™ืงื•ืžื™ื ื’ื™ืื•ื’ืจืคื™ื™ื.
  • ื‘ื ื™ ื”ืฉื™ื— ืœืขื•ืœื ืื™ื ื ื™ื•ืฆืจื™ื ืงืฉืจื™ื ื™ืฉื™ืจื™ื; ื›ืœ ื”ืชืงืฉื•ืจืช ืžืชืจื—ืฉืช ื‘ืืžืฆืขื•ืช ืžืขืจื›ืช ืžื‘ื•ื–ืจืช ืฉืœ ืฆืžืชื™ื. ื›ืชื•ื‘ื•ืช ื”-IP ืฉืœ ื”ืžืฉืชืžืฉื™ื ืื™ื ืŸ ื ื’ื™ืฉื•ืช ื–ื• ืœื–ื•.
  • ื›ืœ ื”ื”ื•ื“ืขื•ืช ืžื•ืฆืคื ื•ืช ืžืงืฆื” ืœืงืฆื” curve25519xsalsa20poly1305. ื ืจืื” ืฉื–ื” ืœื ื™ืคืชื™ืข ืืฃ ืื—ื“, ืื‘ืœ ืงื•ื“ ื”ืžืงื•ืจ ืฉืœื ื• ืคืชื•ื—.
  • ืžืชืงืคืช MITM ืื™ื ื” ื ื›ืœืœืช - ื›ืœ ื”ื•ื“ืขื” ื”ื™ื ืขืกืงื” ื•ื—ืชื•ืžื” ืขืœ ื™ื“ื™ Ed25519 EdDSA.
  • ื”ื”ื•ื“ืขื” ืžืกืชื™ื™ืžืช ื‘ื‘ืœื•ืง ืžืฉืœื”. ืขืงื‘ื™ื•ืช ื• timestamp ืืชื” ืœื ื™ื›ื•ืœ ืœืชืงืŸ ืืช ื”ื—ืกื™ืžื•ืช, ื•ืœื›ืŸ ืืช ืกื“ืจ ื”ื”ื•ื“ืขื•ืช.
  • "ืœื ืืžืจืชื™ ืืช ื–ื”" ืœื ื™ืขื‘ื•ื“ ืขื ื”ื•ื“ืขื•ืช ื‘ื‘ืœื•ืงืฆ'ื™ื™ืŸ.
  • ืื™ืŸ ืžื‘ื ื” ืžืจื›ื–ื™ ืฉืขื•ืฉื” ื‘ื“ื™ืงื•ืช ืขืœ "ืื•ืชื ื˜ื™ื•ืช" ืฉืœ ื”ื•ื“ืขื”. ื–ื” ื ืขืฉื” ืขืœ ื™ื“ื™ ืžืขืจื›ืช ืžื‘ื•ื–ืจืช ืฉืœ ืฆืžืชื™ื ื”ืžื‘ื•ืกืกืช ืขืœ ืงื•ื ืฆื ื–ื•ืก, ื•ื”ื™ื ื‘ื‘ืขืœื•ืช ื”ืžืฉืชืžืฉื™ื.
  • ื—ื•ืกืจ ืืคืฉืจื•ืช ืœืฆื ื–ื•ืจื” - ืœื ื ื™ืชืŸ ืœื—ืกื•ื ื—ืฉื‘ื•ื ื•ืช ื•ืœื ื ื™ืชืŸ ืœืžื—ื•ืง ื”ื•ื“ืขื•ืช.
  • Blockchain 2FA ื”ื•ื ื—ืœื•ืคื” ืœ-2FA ื”ื’ื™ื”ื ื•ื ื‘ืืžืฆืขื•ืช SMS, ื”ืจืก ื”ืจื‘ื” ื‘ืจื™ืื•ืช.
  • ื”ื™ื›ื•ืœืช ืœืงื‘ืœ ืืช ื›ืœ ื”ืฉื™ื—ื•ืช ืฉืœืš ืžื›ืœ ืžื›ืฉื™ืจ ื‘ื›ืœ ืขืช ืคื™ืจื•ืฉื” ืฉืื™ื ืš ืฆืจื™ืš ืœืื—ืกืŸ ืฉื™ื—ื•ืช ื‘ืื•ืคืŸ ืžืงื•ืžื™ ื›ืœืœ.
  • ืื™ืฉื•ืจ ืžืกื™ืจืช ื”ื•ื“ืขื”. ืœื ืœืžื›ืฉื™ืจ ืฉืœ ื”ืžืฉืชืžืฉ, ืืœื ืœืจืฉืช. ื‘ืขื™ืงืจื• ืฉืœ ื“ื‘ืจ, ื–ื”ื• ืื™ืฉื•ืจ ืœื™ื›ื•ืœืชื• ืฉืœ ื”ื ืžืขืŸ ืœืงืจื•ื ืืช ื”ื”ื•ื“ืขื” ืฉืœืš. ื–ื•ื”ื™ ืชื›ื•ื ื” ืฉื™ืžื•ืฉื™ืช ืœืฉืœื™ื—ืช ื”ืชืจืื•ืช ืงืจื™ื˜ื™ื•ืช.

ื™ืชืจื•ื ื•ืช ื”ื‘ืœื•ืงืฆ'ื™ื™ืŸ ื›ื•ืœืœื™ื ื’ื ืื™ื ื˜ื’ืจืฆื™ื” ื”ื“ื•ืงื” ืขื ืžื˜ื‘ืขื•ืช ื”ืงืจื™ืคื˜ื• Ethereum, Dogecoin, Lisk, Dash, Bitcoin (ื–ื” ืขื“ื™ื™ืŸ ื‘ืชื”ืœื™ืš) ื•ื™ื›ื•ืœืช ืฉืœื™ื—ืช ืืกื™ืžื•ื ื™ื ื‘ืฆ'ืื˜ื™ื. ืืคื™ืœื• ื™ืฆืจื ื• ืžื—ืœื™ืฃ ืงืจื™ืคื˜ื• ืžื•ื‘ื ื”.

ื•ืื– - ืื™ืš ื”ื›ืœ ืขื•ื‘ื“.

ื”ื•ื“ืขื” ื”ื™ื ืขืกืงื”

ื›ื•ืœื ื›ื‘ืจ ืจื’ื™ืœื™ื ืœื›ืš ืฉืขืกืงืื•ืช ื‘ื‘ืœื•ืงืฆ'ื™ื™ืŸ ืžืขื‘ื™ืจื•ืช ืืกื™ืžื•ื ื™ื (ืžื˜ื‘ืขื•ืช) ืžืžืฉืชืžืฉ ืื—ื“ ืœืื—ืจ. ื›ืžื• ื‘ื™ื˜ืงื•ื™ืŸ. ื™ืฆืจื ื• ืกื•ื’ ืžื™ื•ื—ื“ ืฉืœ ืขืกืงื” ืœื”ืขื‘ืจืช ื”ื•ื“ืขื•ืช.

ื›ื“ื™ ืœืฉืœื•ื— ื”ื•ื“ืขื” ื‘ืžืกื ื’'ืจ ื‘ื‘ืœื•ืงืฆ'ื™ื™ืŸ, ืขืœื™ืš ืœืขื‘ื•ืจ ืžืกืคืจ ืฉืœื‘ื™ื:

  1. ื”ืฆืคื ืช ื˜ืงืกื˜ ื”ื•ื“ืขื”
  2. ื”ื›ื ืก ื˜ืงืกื˜ ืฆื•ืคืŸ ืœืขืกืงื”
  3. ื—ืชื•ื ืขืœ ื”ืขืกืงื”
  4. ืฉืœื— ืขืกืงื” ืœื›ืœ ืฆื•ืžืช ืจืฉืช
  5. ืžืขืจื›ืช ืžื‘ื•ื–ืจืช ืฉืœ ืฆืžืชื™ื ืงื•ื‘ืขืช ืืช ื”"ืื•ืชื ื˜ื™ื•ืช" ืฉืœ ื”ื•ื“ืขื”
  6. ืื ื”ื›ืœ ืชืงื™ืŸ, ื”ืขืกืงื” ืขื ื”ื”ื•ื“ืขื” ื ื›ืœืœืช ื‘ื‘ืœื•ืง ื”ื‘ื
  7. ื”ื ืžืขืŸ ืžืื—ื–ืจ ืืช ืขืกืงืช ื”ื”ื•ื“ืขื” ื•ืžืคืขื ื—

ืฉืœื‘ื™ื 1-3 ื•-7 ืžื‘ื•ืฆืขื™ื ื‘ืื•ืคืŸ ืžืงื•ืžื™ ืขืœ ื”ืœืงื•ื—, ื•ืฉืœื‘ื™ื 5-6 ืžื‘ื•ืฆืขื™ื ืขืœ ื”ืžืืจื—ื™ื.

ื”ืฆืคื ืช ื”ื•ื“ืขื•ืช

ื”ื”ื•ื“ืขื” ืžื•ืฆืคื ืช ื‘ืžืคืชื— ื”ืคืจื˜ื™ ืฉืœ ื”ืฉื•ืœื— ื•ื‘ืžืคืชื— ื”ืฆื™ื‘ื•ืจื™ ืฉืœ ื”ื ืžืขืŸ. ื ื™ืงื— ืืช ื”ืžืคืชื— ื”ืฆื™ื‘ื•ืจื™ ืžื”ืจืฉืช, ืืš ืœืฉื ื›ืš ื™ืฉ ืœืืชื—ืœ ืืช ื”ื—ืฉื‘ื•ืŸ ืฉืœ ื”ื ืžืขืŸ, ื›ืœื•ืžืจ ืœื‘ืฆืข ืขืกืงื” ืื—ืช ืœืคื—ื•ืช. ืืชื” ื™ื›ื•ืœ ืœื”ืฉืชืžืฉ ื‘ื‘ืงืฉืช REST GET /api/accounts/getPublicKey?address={ADAMANT address}, ื•ื‘ืขืช ื˜ืขื™ื ืช ืฆ'ืื˜ื™ื, ื”ืžืคืชื—ื•ืช ื”ืฆื™ื‘ื•ืจื™ื™ื ืฉืœ ื‘ื ื™ ื”ืฉื™ื— ื›ื‘ืจ ื™ื”ื™ื• ื–ืžื™ื ื™ื.

ืื™ืš ืขื•ื‘ื“ ืฉืœื™ื— ืžื‘ื•ื–ืจ ืขืœ ื”ื‘ืœื•ืงืฆ'ื™ื™ืŸ?

ื”ืžืกื ื’'ืจ ืžืฆืคื™ืŸ ื”ื•ื“ืขื•ืช ื‘ืืžืฆืขื•ืช ื”ืืœื’ื•ืจื™ืชื curve25519xsalsa20poly1305 (ืชื™ื‘ืช NaCl). ืžื›ื™ื•ื•ืŸ ืฉื”ื—ืฉื‘ื•ืŸ ืžื›ื™ืœ ืžืคืชื—ื•ืช Ed25519, ื›ื“ื™ ืœื™ืฆื•ืจ ืชื™ื‘ื”, ื™ืฉ ืœื”ืžื™ืจ ืชื—ื™ืœื” ืืช ื”ืžืคืชื—ื•ืช ืœ-Curve25519 Diffie-Hellman.

ื”ื ื” ื“ื•ื’ืžื” ื‘-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)
  }
}

ื™ืฆื™ืจืช ืขืกืงื” ืขื ื”ื•ื“ืขื”

ืœืขืกืงื” ื™ืฉ ืืช ื”ืžื‘ื ื” ื”ื›ืœืœื™ ื”ื‘ื:

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

ืขื‘ื•ืจ ืขืกืงืช ื”ื•ื“ืขื”, ื”ื“ื‘ืจ ื”ื—ืฉื•ื‘ ื‘ื™ื•ืชืจ ื”ื•ื asset - ืขืœื™ืš ืœืžืงื ื”ื•ื“ืขื” ื‘ืื•ื‘ื™ื™ืงื˜ chat ืขื ืžื‘ื ื”:

  • message - ืฉืžื•ืจ ืืช ื”ื”ื•ื“ืขื” ื”ืžื•ืฆืคื ืช
  • own_message - ืœื
  • type - ืกื•ื’ ื”ื•ื“ืขื”

ื’ื ื”ื”ื•ื“ืขื•ืช ืžื—ื•ืœืงื•ืช ืœืกื•ื’ื™ื. ื‘ืขื™ืงืจื• ืฉืœ ื“ื‘ืจ, ื”ืคืจืžื˜ืจ type ืื•ืžืจ ืœืš ืื™ืš ืœื”ื‘ื™ืŸ message. ืืชื” ื™ื›ื•ืœ ืœืฉืœื•ื— ืจืง ื”ื•ื“ืขืช ื˜ืงืกื˜, ืื• ืฉืืชื” ื™ื›ื•ืœ ืœืฉืœื•ื— ืื•ื‘ื™ื™ืงื˜ ืขื ื“ื‘ืจื™ื ืžืขื ื™ื™ื ื™ื ื‘ืคื ื™ื - ืœืžืฉืœ, ื›ืš ื”ืฉืœื™ื— ืžื‘ืฆืข ื”ืขื‘ืจื•ืช ืฉืœ ืžื˜ื‘ืขื•ืช ืงืจื™ืคื˜ื•ื’ืจืคื™ื™ื ื‘ืฆ'ืื˜ื™ื.

ื›ืชื•ืฆืื” ืžื›ืš, ืื ื• ื™ื•ืฆืจื™ื ืขืกืงื”:

{
  "transaction": {
    "type": 8,
    "amount": 0,
    "senderId": "U12499126640447739963",
    "senderPublicKey": "e9cafb1e7b403c4cf247c94f73ee4cada367fcc130cb3888219a0ba0633230b6",
    "asset": {
      "chat": {
        "message": "cb682accceef92d7cddaaddb787d1184ab5428",
        "own_message": "e7d8f90ddf7d70efe359c3e4ecfb5ed3802297b248eacbd6",
        "type": 1
      }
    },
    "recipientId": "U15677078342684640219",
    "timestamp": 63228087,
    "signature": "ั‚ัƒั‚ ะฑัƒะดะตั‚ ะฟะพะดะฟะธััŒ"
  }
}

ื—ืชื™ืžืช ืขืกืงื”

ื›ื“ื™ ืœื”ื‘ื˜ื™ื— ืฉื›ื•ืœื ื‘ื˜ื•ื—ื™ื ื‘ืื•ืชื ื˜ื™ื•ืช ืฉืœ ื”ืฉื•ืœื— ื•ื”ื ืžืขืŸ, ื‘ื–ืžืŸ ื”ืฉืœื™ื—ื” ื•ืชื•ื›ืŸ ื”ื”ื•ื“ืขื”, ื”ืขืกืงื” ื ื—ืชืžืช. ื—ืชื™ืžื” ื“ื™ื’ื™ื˜ืœื™ืช ืžืืคืฉืจืช ืœืืžืช ืืช ื”ืื•ืชื ื˜ื™ื•ืช ืฉืœ ืขืกืงื” ื‘ืืžืฆืขื•ืช ืžืคืชื— ืฆื™ื‘ื•ืจื™ - ืื™ืŸ ืฆื•ืจืš ื‘ืžืคืชื— ืคืจื˜ื™ ืœืฉื ื›ืš.

ืื‘ืœ ื”ื—ืชื™ืžื” ืขืฆืžื” ืžืชื‘ืฆืขืช ื‘ืืžืฆืขื•ืช ื”ืžืคืชื— ื”ืคืจื˜ื™:

ืื™ืš ืขื•ื‘ื“ ืฉืœื™ื— ืžื‘ื•ื–ืจ ืขืœ ื”ื‘ืœื•ืงืฆ'ื™ื™ืŸ?

ื”ื“ื™ืื’ืจืžื” ืžืจืื” ืฉืชื—ื™ืœื” ืื ื• ืžืฉื™ื™ื›ื™ื ืืช ื”ืขืกืงื” ืขื SHA-256 ื•ืœืื—ืจ ืžื›ืŸ ื—ื•ืชืžื™ื ืขืœื™ื” Ed25519 EdDSA ื•ืœืงื‘ืœ ื—ืชื™ืžื” signature, ื•ืžื–ื”ื” ื”ืขืกืงื” ื”ื•ื ื—ืœืง ืžื”-hash SHA-256.

ื™ื™ืฉื•ื ืœื“ื•ื’ืžื”:

1 - ืฆื•ืจ ื‘ืœื•ืง ื ืชื•ื ื™ื, ื›ื•ืœืœ ื”ื•ื“ืขื”

/**
 * 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 - ืกืคื™ืจืช SHA-256 ืžื‘ืœื•ืง ื”ื ืชื•ื ื™ื

/**
 * 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 - ื—ืชื•ื ืขืœ ื”ืขืกืงื”

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

ืฉืœื™ื—ืช ืขืกืงื” ืขื ื”ื•ื“ืขื” ืœืฆื•ืžืช ืจืฉืช

ืžื›ื™ื•ื•ืŸ ืฉื”ืจืฉืช ืžื‘ื•ื–ืจืช, ื›ืœ ืื—ื“ ืžื”ืฆืžืชื™ื ืขื API ืคืชื•ื— ื™ืชืื™ื. ื‘ื™ืฆื•ืข ื‘ืงืฉืช POST ืœื ืงื•ื“ืช ื”ืงืฆื” api/transactions:

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

ื‘ืชื’ื•ื‘ื” ื ืงื‘ืœ ืžื–ื”ื” ืขืกืงื” ืžื”ืกื•ื’

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

ืื™ืžื•ืช ืขืกืงื”

ืžืขืจื›ืช ืžื‘ื•ื–ืจืช ืฉืœ ืฆืžืชื™ื, ื”ืžื‘ื•ืกืกืช ืขืœ ืงื•ื ืฆื ื–ื•ืก, ืงื•ื‘ืขืช ืืช ื”"ืื•ืชื ื˜ื™ื•ืช" ืฉืœ ื”ื•ื“ืขืช ื”ืขืกืงื”. ืžืžื™ ื•ืœืžื™, ืžืชื™, ื”ืื ื”ื•ื—ืœืคื” ื”ื”ื•ื“ืขื” ื‘ืื—ืจืช, ื•ื”ืื ืฆื•ื™ื ื” ื ื›ื•ืŸ ืฉืขืช ื”ืฉืœื™ื—ื”. ื–ื”ื• ื™ืชืจื•ืŸ ื—ืฉื•ื‘ ืžืื•ื“ ืฉืœ ื”ื‘ืœื•ืงืฆ'ื™ื™ืŸ โ€“ ืื™ืŸ ืžื‘ื ื” ืžืจื›ื–ื™ ืฉืื—ืจืื™ ืขืœ ื”ืื™ืžื•ืช, ื•ืœื ื ื™ืชืŸ ืœื–ื™ื™ืฃ ืืช ืจืฆืฃ ื”ื”ื•ื“ืขื•ืช ื•ืชื›ื•ืœืชืŸ.

ืจืืฉื™ืช, ืฆื•ืžืช ืื—ื“ ื‘ื•ื“ืง ืืช ื”ื“ื™ื•ืง, ื•ืœืื—ืจ ืžื›ืŸ ืฉื•ืœื— ืื•ืชื• ืœืื—ืจื™ื - ืื ื”ืจื•ื‘ ืื•ืžืจ ืฉื”ื›ืœ ืชืงื™ืŸ, ื”ืขืกืงื” ืชื™ื›ืœืœ ื‘ื‘ืœื•ืง ื”ื‘ื ืฉืœ ื”ืฉืจืฉืจืช - ื–ื” ืงื•ื ืฆื ื–ื•ืก.

ืื™ืš ืขื•ื‘ื“ ืฉืœื™ื— ืžื‘ื•ื–ืจ ืขืœ ื”ื‘ืœื•ืงืฆ'ื™ื™ืŸ?

ื ื™ืชืŸ ืœืจืื•ืช ืืช ื”ื—ืœืง ื‘ืงื•ื“ ื”ืฆื•ืžืช ืฉืื—ืจืื™ ืœื‘ื“ื™ืงื•ืช ื‘-GitHub - validator.js ะธ verify.js. ื›ืŸ, ื”ืฆื•ืžืช ืคื•ืขืœ ืขืœ Node.js.

ื›ื•ืœืœ ืขืกืงื” ืขื ื”ื•ื“ืขื” ื‘ื‘ืœื•ืง

ืื ื”ื•ืฉื’ ื”ืกื›ืžื”, ื”ืขืกืงื” ืขื ื”ื”ื•ื“ืขื” ืฉืœื ื• ืชื™ื›ืœืœ ื‘ื‘ืœื•ืง ื”ื‘ื ื™ื—ื“ ืขื ืขืกืงืื•ืช ืชืงืคื•ืช ืื—ืจื•ืช.

ืœื‘ืœื•ืงื™ื ื™ืฉ ืจืฆืฃ ืงืคื“ื ื™, ื•ื›ืœ ื‘ืœื•ืง ืขื•ืงื‘ ื ื•ืฆืจ ืขืœ ืกืžืš ื”-hash ืฉืœ ื‘ืœื•ืงื™ื ืงื•ื“ืžื™ื.

ืื™ืš ืขื•ื‘ื“ ืฉืœื™ื— ืžื‘ื•ื–ืจ ืขืœ ื”ื‘ืœื•ืงืฆ'ื™ื™ืŸ?

ื”ื ืงื•ื“ื” ื”ื™ื ืฉื’ื ื”ืžืกืจ ืฉืœื ื• ื ื›ืœืœ ื‘ืจืฆืฃ ื”ื–ื” ื•ืœื ื ื™ืชืŸ "ืœืกื“ืจ ืื•ืชื• ืžื—ื“ืฉ". ืื ืžืกืคืจ ื”ื•ื“ืขื•ืช ื ื›ื ืกื•ืช ืœื—ืกื™ืžื”, ื”ืกื“ืจ ืฉืœื”ืŸ ื™ื™ืงื‘ืข ืœืคื™ timestamp ื”ื•ื“ืขื•ืช.

ืงืจื™ืืช ื”ื•ื“ืขื•ืช

ืืคืœื™ืงืฆื™ื™ืช ื”ืžืกื ื’'ืจ ืžืื—ื–ืจืช ืžื”ื‘ืœื•ืงืฆ'ื™ื™ืŸ ืขืกืงืื•ืช ืฉื ืฉืœื—ื•ืช ืœื ืžืขืŸ. ื‘ืฉื‘ื™ืœ ื–ื” ืขืฉื™ื ื• ื ืงื•ื“ืช ืงืฆื” api/chatrooms.

ื›ืœ ื”ืขืกืงืื•ืช ื–ืžื™ื ื•ืช ืœื›ื•ืœื - ื ื™ืชืŸ ืœืงื‘ืœ ื”ื•ื“ืขื•ืช ืžื•ืฆืคื ื•ืช. ืื‘ืœ ืจืง ื”ื ืžืขืŸ ื™ื›ื•ืœ ืœืคืขื ื— ื‘ืืžืฆืขื•ืช ื”ืžืคืชื— ื”ืคืจื˜ื™ ืฉืœื• ื•ื”ืžืคืชื— ื”ืฆื™ื‘ื•ืจื™ ืฉืœ ื”ืฉื•ืœื—:

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

ืžื” ืขื•ื“?

ืžื›ื™ื•ื•ืŸ ืฉื”ื•ื“ืขื•ืช ืžื•ืขื‘ืจื•ืช ื‘ืฆื•ืจื” ื–ื• ืชื•ืš ื›-5 ืฉื ื™ื•ืช - ื–ื” ื”ื–ืžืŸ ืฉื‘ื• ืžื•ืคื™ืขื” ื‘ืœื•ืง ืจืฉืช ื—ื“ืฉ - ื”ื’ืขื ื• ืœื—ื™ื‘ื•ืจ ืฉืงืข ืœืงื•ื— ืœืฆื•ืžืช ื•ืฆื•ืžืช ืœืฆื•ืžืช. ื›ืืฉืจ ืฆื•ืžืช ืžืงื‘ืœ ืขืกืงื” ื—ื“ืฉื”, ื”ื•ื ื‘ื•ื“ืง ืืช ืชืงืคื•ืชื” ื•ืžืขื‘ื™ืจ ืื•ืชื” ืœืฆืžืชื™ื ืื—ืจื™ื. ื”ืขืกืงื” ื–ืžื™ื ื” ืœืœืงื•ื—ื•ืช ืžืกื ื’'ืจ ืขื•ื“ ืœืคื ื™ ืฉืžืชืจื—ืฉ ืงื•ื ืฆื ื–ื•ืก ื•ื”ื›ืœืœื” ื‘ื—ืกื™ืžื”. ื›ืš ื ืขื‘ื™ืจ ื”ื•ื“ืขื•ืช ื‘ืื•ืคืŸ ืžื™ื™ื“ื™, ื‘ื“ื™ื•ืง ื›ืžื• ืฉืœื™ื—ื™ื ืžื™ื™ื“ื™ื™ื ืจื’ื™ืœื™ื.

ื›ื“ื™ ืœืื—ืกืŸ ืืช ืคื ืงืก ื”ื›ืชื•ื‘ื•ืช, ืขืฉื™ื ื• KVS - Key-Value Storage - ื–ื” ืกื•ื’ ืื—ืจ ืฉืœ ืขืกืงื” ืฉื‘ื” asset ื–ื• ืœื NaCl-box ืฉืžื•ืฆืคื ืช, ืืœื NaCl-Secretbox. ื›ืš ื”ืžืื—ืกืŸ ื”ืฉืœื™ื— ื ืชื•ื ื™ื ืื—ืจื™ื.

ื”ืขื‘ืจืช ืงื‘ืฆื™ื/ืชืžื•ื ื•ืช ื•ืฆ'ืื˜ื™ื ืงื‘ื•ืฆืชื™ื™ื ืขื“ื™ื™ืŸ ื“ื•ืจืฉื™ื ืขื‘ื•ื“ื” ืจื‘ื”. ื›ืžื•ื‘ืŸ, ื‘ืคื•ืจืžื˜ ื”ื˜ืขื•ื™ื•ืช ื•ื”ื˜ืขื•ืช ืืคืฉืจ "ืœื“ืคื•ืง" ืืช ื–ื” ื‘ืžื”ื™ืจื•ืช, ืื‘ืœ ืื ื—ื ื• ืจื•ืฆื™ื ืœืฉืžื•ืจ ืขืœ ืื•ืชื” ืจืžืช ืคืจื˜ื™ื•ืช.

ื›ืŸ, ื™ืฉ ืขื•ื“ ืขื‘ื•ื“ื” ืœืขืฉื•ืช - ื‘ืื•ืคืŸ ืื™ื“ื™ืืœื™, ืคืจื˜ื™ื•ืช ืืžื™ืชื™ืช ืžื ื™ื—ื” ืฉืžืฉืชืžืฉื™ื ืœื ื™ืชื—ื‘ืจื• ืœืฆืžืชื™ ืจืฉืช ืฆื™ื‘ื•ืจื™ื™ื, ืืœื ื™ื’ื“ืœื• ืืช ืฉืœื”ื. ืื™ื–ื” ืื—ื•ื– ืžื”ืžืฉืชืžืฉื™ื ืืชื” ื—ื•ืฉื‘ ืฉืขื•ืฉื” ืืช ื–ื”? ื–ื” ื ื›ื•ืŸ, 0. ื”ืฆืœื—ื ื• ืœืคืชื•ืจ ืืช ื”ื‘ืขื™ื” ื”ื–ื• ื‘ืื•ืคืŸ ื—ืœืงื™ ืขื ื’ืจืกืช Tor ืฉืœ ื”ืžืกื ื’'ืจ.

ื”ื•ื›ื—ื ื• ืฉืฉืœื™ื— ื‘ื‘ืœื•ืงืฆ'ื™ื™ืŸ ื™ื›ื•ืœ ืœื”ืชืงื™ื™ื. ื‘ืขื‘ืจ, ื”ื™ื” ืจืง โ€‹โ€‹ื ื™ืกื™ื•ืŸ ืื—ื“ ื‘-2012 - bitmessage, ืฉื ื›ืฉืœ ืขืงื‘ ื–ืžื ื™ ืžืกื™ืจืช ื”ื•ื“ืขื•ืช ืืจื•ื›ื™ื, ืขื•ืžืก ืžืขื‘ื“ ื•ื”ืขื“ืจ ื™ื™ืฉื•ืžื™ื ื ื™ื™ื“ื™ื.

ื•ื”ืกืคืงื ื•ืช ื ื•ื‘ืขืช ืžื›ืš ืฉืฉืœื™ื—ื™ื ื‘ื‘ืœื•ืงืฆ'ื™ื™ืŸ ืžืงื“ื™ืžื™ื ืืช ื–ืžื ื - ืื ืฉื™ื ืœื ืžื•ื›ื ื™ื ืœืงื—ืช ืื—ืจื™ื•ืช ืขืœ ื”ื—ืฉื‘ื•ืŸ ืฉืœื”ื, ื‘ืขืœื•ืช ืขืœ ืžื™ื“ืข ืื™ืฉื™ ื”ื™ื ืขื“ื™ื™ืŸ ืœื ื˜ืจื ื“, ื•ื”ื˜ื›ื ื•ืœื•ื’ื™ื” ืœื ืžืืคืฉืจืช ืžื”ื™ืจื•ื™ื•ืช ื’ื‘ื•ื”ื•ืช ื‘ื‘ืœื•ืงืฆ'ื™ื™ืŸ. ืื ืœื•ื’ื™ื ื˜ื›ื ื•ืœื•ื’ื™ื™ื ื ื•ืกืคื™ื ืฉืœ ื”ืคืจื•ื™ืงื˜ ืฉืœื ื• ื™ื•ืคื™ืขื• ื‘ื”ืžืฉืš. ืชืจืื”.

ืžืงื•ืจ: www.habr.com

ื”ื•ืกืคืช ืชื’ื•ื‘ื”