เชฌเซเชฒเซ‹เช•เชšเซ‡เชจ เชชเชฐ เชตเชฟเช•เซ‡เชจเซเชฆเซเชฐเชฟเชค เชฎเซ‡เชธเซ‡เชจเซเชœเชฐ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เช•เชพเชฐเซเชฏ เช•เชฐเซ‡ เช›เซ‡?

2017 เชจเซ€ เชถเชฐเซ‚เช†เชคเชฎเชพเช‚, เช…เชฎเซ‡ เช•เซเชฒเชพเชธเชฟเช• P2P เชฎเซ‡เชธเซ‡เชจเซเชœเชฐเซเชธ เชชเชฐเชจเชพ เชซเชพเชฏเชฆเชพเช“เชจเซ€ เชšเชฐเซเชšเชพ เช•เชฐเซ€เชจเซ‡ เชฌเซเชฒเซ‹เช•เชšเซ‡เชจ [เชจเชพเชฎ เช…เชจเซ‡ เชฒเชฟเช‚เช• เชชเซเชฐเซ‹เชซเชพเช‡เชฒเชฎเชพเช‚ เช›เซ‡] เชชเชฐ เชฎเซ‡เชธเซ‡เชจเซเชœเชฐ เชฌเชจเชพเชตเชตเชพเชจเซเช‚ เชถเชฐเซ‚ เช•เชฐเซเชฏเซเช‚.

เชชเชพเชธ เชฅเชฏเชพ 2.5 เชตเชฐเซเชท, เช…เชจเซ‡ เช…เชฎเซ‡ เช…เชฎเชพเชฐเชพ เช–เซเชฏเชพเชฒเชจเซ€ เชชเซเชทเซเชŸเชฟ เช•เชฐเชตเชพเชฎเชพเช‚ เชธเช•เซเชทเชฎ เชนเชคเชพ: เชฎเซ‡เชธเซ‡เชจเซเชœเชฐ เชเชชเซเชฒเชฟเช•เซ‡เชถเชจ เชนเชตเซ‡ iOS, Web PWA, Windows, GNU/Linux, Mac OS เช…เชจเซ‡ Android เชฎเชพเชŸเซ‡ เช‰เชชเชฒเชฌเซเชง เช›เซ‡.

เช†เชœเซ‡ เช…เชฎเซ‡ เชคเชฎเชจเซ‡ เชœเชฃเชพเชตเซ€เชถเซเช‚ เช•เซ‡ เชฌเซเชฒเซ‹เช•เชšเซ‡เชจ เชฎเซ‡เชธเซ‡เชจเซเชœเชฐ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เช•เชพเชฎ เช•เชฐเซ‡ เช›เซ‡ เช…เชจเซ‡ เช•เซเชฒเชพเชฏเช‚เชŸ เชเชชเซเชฒเซ€เช•เซ‡เชถเชจ เชคเซ‡เชจเชพ API เชธเชพเชฅเซ‡ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เช•เชพเชฎ เช•เชฐเซ€ เชถเช•เซ‡ เช›เซ‡.
เชฌเซเชฒเซ‹เช•เชšเซ‡เชจ เชชเชฐ เชตเชฟเช•เซ‡เชจเซเชฆเซเชฐเชฟเชค เชฎเซ‡เชธเซ‡เชจเซเชœเชฐ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เช•เชพเชฐเซเชฏ เช•เชฐเซ‡ เช›เซ‡?

เช…เชฎเซ‡ เช‡เชšเซเช›เซ€เช เช›เซ€เช เช•เซ‡ เชฌเซเชฒเซ‹เช•เชšเซ‡เชจ เช•เซเชฒเชพเชธเชฟเช• P2P เชฎเซ‡เชธเซ‡เชจเซเชœเชฐเซเชธเชจเซ€ เชธเซเชฐเช•เซเชทเชพ เช…เชจเซ‡ เช—เซ‹เชชเชจเซ€เชฏเชคเชพเชจเชพ เชฎเซเชฆเซเชฆเชพเช“เชจเซ‡ เชนเชฒ เช•เชฐเซ‡:

  • เชเช•เชพเช‰เชจเซเชŸ เชฌเชจเชพเชตเชตเชพ เชฎเชพเชŸเซ‡ เชเช• เช•เซเชฒเชฟเช• - เช•เซ‹เชˆ เชซเซ‹เชจ เช…เชฅเชตเชพ เชˆเชฎเซ‡เชฒ เชจเชนเซ€เช‚, เชธเชฐเชจเชพเชฎเชพเช‚ เชชเซเชธเซเชคเช•เซ‹ เช…เชฅเชตเชพ เชญเซŒเช—เซ‹เชฒเชฟเช• เชธเซเชฅเชพเชจเซ‹เชจเซ€ เชเช•เซเชธเซ‡เชธ เชจเชนเซ€เช‚.
  • เช‡เชจเซเชŸเชฐเชฒเซ‹เช•เซเชฏเซเชŸเชฐเซเชธ เช•เซเชฏเชพเชฐเซ‡เชฏ เชธเซ€เชงเชพ เชœเซ‹เชกเชพเชฃเซ‹ เชธเซเชฅเชพเชชเชฟเชค เช•เชฐเชคเชพ เชจเชฅเซ€; เชคเชฎเชพเชฎ เชธเช‚เชšเชพเชฐ เช—เชพเช‚เช เซ‹เชจเซ€ เชตเชฟเชคเชฐเชฟเชค เชธเชฟเชธเซเชŸเชฎ เชฆเซเชตเชพเชฐเชพ เชฅเชพเชฏ เช›เซ‡. เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพเช“เชจเชพ IP เชธเชฐเชจเชพเชฎเชพเช‚ เชเช•เชฌเซ€เชœเชพเชจเซ‡ เชเช•เซเชธเซ‡เชธเชฟเชฌเชฒ เชจเชฅเซ€.
  • เชฌเชงเชพ เชธเช‚เชฆเซ‡เชถเชพเช“ Encrypted End-to-End curve25519xsalsa20poly1305 เช›เซ‡. เชเชตเซเช‚ เชฒเชพเช—เซ‡ เช›เซ‡ เช•เซ‡ เช†เชจเชพเชฅเซ€ เช•เซ‹เชˆเชจเซ‡ เช†เชถเซเชšเชฐเซเชฏ เชฅเชถเซ‡ เชจเชนเซ€เช‚, เชชเชฐเช‚เชคเซ เช…เชฎเชพเชฐเซ‹ เชธเซเชฐเซ‹เชค เช•เซ‹เชก เช–เซเชฒเซเชฒเซ‹ เช›เซ‡.
  • MITM เชนเซเชฎเชฒเชพเชจเซ‡ เชฌเชพเช•เชพเชค เชฐเชพเช–เชตเชพเชฎเชพเช‚ เช†เชตเซเชฏเซ‹ เช›เซ‡ - เชฆเชฐเซ‡เช• เชธเช‚เชฆเซ‡เชถ เชเช• เชตเซเชฏเชตเชนเชพเชฐ เช›เซ‡ เช…เชจเซ‡ เชคเซ‡ Ed25519 EdDSA เชฆเซเชตเชพเชฐเชพ เชธเชนเซ€ เชฅเชฏเซ‡เชฒ เช›เซ‡.
  • เชธเช‚เชฆเซ‡เชถ เชคเซ‡เชจเชพ เชชเซ‹เชคเชพเชจเชพ เชฌเซเชฒเซ‹เช•เชฎเชพเช‚ เชธเชฎเชพเชชเซเชค เชฅเชพเชฏ เช›เซ‡. เชธเซเชธเช‚เช—เชคเชคเชพ เช…เชจเซ‡ timestamp เชคเชฎเซ‡ เชฌเซเชฒเซ‹เช•เซเชธเชจเซ‡ เช เซ€เช• เช•เชฐเซ€ เชถเช•เชคเชพ เชจเชฅเซ€, เช…เชจเซ‡ เชคเซ‡เชฅเซ€ เชธเช‚เชฆเซ‡เชถเชพเช“เชจเซ‹ เช•เซเชฐเชฎ.
  • "เชฎเซ‡เช‚ เช•เชนเซเชฏเซเช‚ เชจเชฅเซ€ เช•เซ‡" เชฌเซเชฒเซ‹เช•เชšเซ‡เชจ เชชเชฐเชจเชพ เชธเช‚เชฆเซ‡เชถเชพเช“ เชธเชพเชฅเซ‡ เช•เชพเชฎ เช•เชฐเชถเซ‡ เชจเชนเซ€เช‚.
  • เชคเซเชฏเชพเช‚ เช•เซ‹เชˆ เช•เซ‡เชจเซเชฆเซเชฐเซ€เชฏ เชฎเชพเชณเช–เซเช‚ เชจเชฅเซ€ เช•เซ‡ เชœเซ‡ เชธเช‚เชฆเซ‡เชถเชจเซ€ "เชชเซเชฐเชฎเชพเชฃเชฟเช•เชคเชพ" เชคเชชเชพเชธเซ‡. เช† เชธเชฐเซเชตเชธเช‚เชฎเชคเชฟ เชชเชฐ เช†เชงเชพเชฐเชฟเชค เชจเซ‹เชกเซเชธเชจเซ€ เชตเชฟเชคเชฐเชฟเชค เชธเชฟเชธเซเชŸเชฎ เชฆเซเชตเชพเชฐเชพ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡, เช…เชจเซ‡ เชคเซ‡ เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพเช“เชจเซ€ เชฎเชพเชฒเชฟเช•เซ€เชจเซ€ เช›เซ‡.
  • เชธเซ‡เชจเซเชธเชฐเชถเซ€เชชเชจเซ€ เช…เชถเช•เซเชฏเชคเชพ - เชเช•เชพเช‰เชจเซเชŸเซเชธ เช…เชตเชฐเซ‹เชงเชฟเชค เช•เชฐเซ€ เชถเช•เชพเชคเชพ เชจเชฅเซ€ เช…เชจเซ‡ เชธเช‚เชฆเซ‡เชถเชพ เช•เชพเชขเซ€ เชถเช•เชพเชคเชพ เชจเชฅเซ€.
  • เชฌเซเชฒเซ‹เช•เชšเซ‡เชจ 2FA เช SMS เชฆเซเชตเชพเชฐเชพ เชจเชฐเช• 2FA เชจเซ‹ เชตเชฟเช•เชฒเซเชช เช›เซ‡, เช˜เชฃเซเช‚ เชธเซเชตเชพเชธเซเชฅเซเชฏ เชฌเช—เชพเชกเซเชฏเซเช‚.
  • เช•เซ‹เชˆเชชเชฃ เชธเชฎเชฏเซ‡ เช•เซ‹เชˆเชชเชฃ เช‰เชชเช•เชฐเชฃเชฎเชพเช‚เชฅเซ€ เชคเชฎเชพเชฐเซ€ เชฌเชงเซ€ เชตเชพเชคเชšเซ€เชคเซ‹ เชฎเซ‡เชณเชตเชตเชพเชจเซ€ เช•เซเชทเชฎเชคเชพเชจเซ‹ เช…เชฐเซเชฅ เช›เซ‡ เช•เซ‡ เชคเชฎเชพเชฐเซ‡ เชตเชพเชฐเซเชคเชพเชฒเชพเชชเชจเซ‡ เชธเซเชฅเชพเชจเชฟเช• เชฐเซ‚เชชเซ‡ เชธเช‚เช—เซเชฐเชนเชฟเชค เช•เชฐเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เชจเชฅเซ€.
  • เชธเช‚เชฆเซ‡เชถ เชตเชฟเชคเชฐเชฃเชจเซ€ เชชเซเชทเซเชŸเชฟ. เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพเชจเชพ เช‰เชชเช•เชฐเชฃ เชชเชฐ เชจเชนเซ€เช‚, เชชเชฐเช‚เชคเซ เชจเซ‡เชŸเชตเชฐเซเช• เชชเชฐ. เช†เชตเชถเซเชฏเช•เชชเชฃเซ‡, เช† เชคเชฎเชพเชฐเซ‹ เชธเช‚เชฆเซ‡เชถ เชตเชพเช‚เชšเชตเชพเชจเซ€ เชชเซเชฐเชพเชชเซเชคเช•เชฐเซเชคเชพเชจเซ€ เช•เซเชทเชฎเชคเชพเชจเซ€ เชชเซเชทเซเชŸเชฟ เช›เซ‡. เชจเชฟเชฐเซเชฃเชพเชฏเช• เชธเซ‚เชšเชจเชพเช“ เชฎเซ‹เช•เชฒเชตเชพ เชฎเชพเชŸเซ‡ เช† เชเช• เช‰เชชเชฏเซ‹เช—เซ€ เชธเซเชตเชฟเชงเชพ เช›เซ‡.

เชฌเซเชฒเซ‹เช•เชšเซ‡เชจ เชฒเชพเชญเซ‹เชฎเชพเช‚ เช•เซเชฐเชฟเชชเซเชŸเซ‹เช•เชฐเชจเซเชธเซ€ 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, เช…เชจเซ‡ เชตเซเชฏเชตเชนเชพเชฐ ID 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'

เชœเชตเชพเชฌเชฎเชพเช‚ เช…เชฎเชจเซ‡ เชชเซเชฐเช•เชพเชฐเชจเซเช‚ เชŸเซเชฐเชพเชจเซเชเซ‡เช•เซเชถเชจ ID เชชเซเชฐเชพเชชเซเชค เชฅเชถเซ‡

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

เชตเซเชฏเชตเชนเชพเชฐ เชฎเชพเชจเซเชฏเชคเชพ

เชจเซ‹เชกเซเชธเชจเซ€ เชตเชฟเชคเชฐเชฟเชค เชธเชฟเชธเซเชŸเชฎ, เชธเชฐเซเชตเชธเช‚เชฎเชคเชฟเชจเชพ เช†เชงเชพเชฐเซ‡, เชตเซเชฏเชตเชนเชพเชฐ เชธเช‚เชฆเซ‡เชถเชจเซ€ "เช…เชงเชฟเช•เซƒเชคเชคเชพ" เชจเช•เซเช•เซ€ เช•เชฐเซ‡ เช›เซ‡. เช•เซ‹เชจเซ€ เชชเชพเชธเซ‡เชฅเซ€ เช…เชจเซ‡ เช•เซ‹เชจเซ‡, เช•เซเชฏเชพเชฐเซ‡, เชธเช‚เชฆเซ‡เชถ เชฌเซ€เชœเชพ เชธเชพเชฅเซ‡ เชฌเชฆเชฒเชตเชพเชฎเชพเช‚ เช†เชตเซเชฏเซ‹ เชนเชคเซ‹ เช•เซ‡ เช•เซ‡เชฎ เช…เชจเซ‡ เชฎเซ‹เช•เชฒเชตเชพเชจเซ‹ เชธเชฎเชฏ เชฏเซ‹เช—เซเชฏ เชฐเซ€เชคเซ‡ เชธเซ‚เชšเชตเชตเชพเชฎเชพเช‚ เช†เชตเซเชฏเซ‹ เชนเชคเซ‹ เช•เซ‡ เช•เซ‡เชฎ. เชฌเซเชฒเซ‹เช•เชšเซ‡เชจเชจเซ‹ เช† เชเช• เช–เซ‚เชฌ เชœ เชฎเชนเชคเซเชตเชชเซ‚เชฐเซเชฃ เชซเชพเชฏเชฆเซ‹ เช›เซ‡ - เชคเซเชฏเชพเช‚ เช•เซ‹เชˆ เช•เซ‡เชจเซเชฆเซเชฐเซ€เชฏ เชฎเชพเชณเช–เซเช‚ เชจเชฅเซ€ เชœเซ‡ เชšเช•เชพเชธเชฃเซ€ เชฎเชพเชŸเซ‡ เชœเชตเชพเชฌเชฆเชพเชฐ เชนเซ‹เชฏ, เช…เชจเซ‡ เชธเช‚เชฆเซ‡เชถเชพเช“เชจเซ‹ เช•เซเชฐเชฎ เช…เชจเซ‡ เชคเซ‡เชฎเชจเซ€ เชธเชพเชฎเช—เซเชฐเซ€ เชฌเชจเชพเชตเชŸเซ€ เช•เชฐเซ€ เชถเช•เชพเชคเซ€ เชจเชฅเซ€.

เชชเซเชฐเชฅเชฎ, เชเช• เชจเซ‹เชก เชšเซ‹เช•เชธเชพเชˆ เชคเชชเชพเชธเซ‡ เช›เซ‡, เช…เชจเซ‡ เชชเช›เซ€ เชคเซ‡เชจเซ‡ เช…เชจเซเชฏเชจเซ‡ เชฎเซ‹เช•เชฒเซ‡ เช›เซ‡ - เชœเซ‹ เชฌเชนเซเชฎเชคเซ€ เช•เชนเซ‡ เช›เซ‡ เช•เซ‡ เชฌเชงเซเช‚ เช•เซเชฐเชฎเชฎเชพเช‚ เช›เซ‡, เชคเซ‹ เชตเซเชฏเชตเชนเชพเชฐ เชธเชพเช‚เช•เชณเชจเชพ เช†เช—เชฒเชพ เชฌเซเชฒเซ‹เช•เชฎเชพเช‚ เชถเชพเชฎเซ‡เชฒ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเชถเซ‡ - เช† เชธเชฐเซเชตเชธเช‚เชฎเชคเชฟ เช›เซ‡.

เชฌเซเชฒเซ‹เช•เชšเซ‡เชจ เชชเชฐ เชตเชฟเช•เซ‡เชจเซเชฆเซเชฐเชฟเชค เชฎเซ‡เชธเซ‡เชจเซเชœเชฐ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เช•เชพเชฐเซเชฏ เช•เชฐเซ‡ เช›เซ‡?

เชจเซ‹เชก เช•เซ‹เชกเชจเซ‹ เชญเชพเช— เชœเซ‡ เชคเชชเชพเชธ เชฎเชพเชŸเซ‡ เชœเชตเชพเชฌเชฆเชพเชฐ เช›เซ‡ เชคเซ‡ GitHub เชชเชฐ เชœเซ‹เชˆ เชถเช•เชพเชฏ เช›เซ‡ - validator.js ะธ verify.js. เชนเชพ, เชจเซ‹เชก Node.js เชชเชฐ เชšเชพเชฒเซ‡ เช›เซ‡.

เชฌเซเชฒเซ‹เช•เชฎเชพเช‚ เชธเช‚เชฆเซ‡เชถ เชธเชพเชฅเซ‡เชจเชพ เชตเซเชฏเชตเชนเชพเชฐ เชธเชนเชฟเชค

เชœเซ‹ เชธเชฐเซเชตเชธเช‚เชฎเชคเชฟ เชชเชนเซ‹เช‚เชšเซ€ เชœเชพเชฏ, เชคเซ‹ เช…เชฎเชพเชฐเชพ เชธเช‚เชฆเซ‡เชถ เชธเชพเชฅเซ‡เชจเซ‹ เชตเซเชฏเชตเชนเชพเชฐ เช…เชจเซเชฏ เชฎเชพเชจเซเชฏ เชตเซเชฏเชตเชนเชพเชฐเซ‹ เชธเชพเชฅเซ‡ เช†เช—เชพเชฎเซ€ เชฌเซเชฒเซ‹เช•เชฎเชพเช‚ เชธเชพเชฎเซ‡เชฒ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเชถเซ‡.

เชฌเซเชฒเซ‹เช•เซเชธเชฎเชพเช‚ เช•เชกเช• เช•เซเชฐเชฎ เชนเซ‹เชฏ เช›เซ‡, เช…เชจเซ‡ เชฆเชฐเซ‡เช• เช…เชจเซเช—เชพเชฎเซ€ เชฌเซเชฒเซ‹เช• เช…เช—เชพเช‰เชจเชพ เชฌเซเชฒเซ‹เช•เชจเชพ เชนเซ‡เชถเชจเชพ เช†เชงเชพเชฐเซ‡ เชฐเชšเชพเชฏ เช›เซ‡.

เชฌเซเชฒเซ‹เช•เชšเซ‡เชจ เชชเชฐ เชตเชฟเช•เซ‡เชจเซเชฆเซเชฐเชฟเชค เชฎเซ‡เชธเซ‡เชจเซเชœเชฐ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เช•เชพเชฐเซเชฏ เช•เชฐเซ‡ เช›เซ‡?

เชฎเซเชฆเซเชฆเซ‹ เช เช›เซ‡ เช•เซ‡ เช…เชฎเชพเชฐเซ‹ เชธเช‚เชฆเซ‡เชถ เชชเชฃ เช† เช•เซเชฐเชฎเชฎเชพเช‚ เชธเชฎเชพเชตเชฟเชทเซเชŸ เช›เซ‡ เช…เชจเซ‡ เชคเซ‡เชจเซ‡ "เชชเซเชจเชƒเชตเซเชฏเชตเชธเซเชฅเชฟเชค" เช•เชฐเซ€ เชถเช•เชพเชคเซ‹ เชจเชฅเซ€. เชœเซ‹ เช˜เชฃเชพ เชธเช‚เชฆเซ‡เชถเชพเช“ เชฌเซเชฒเซ‹เช•เชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡, เชคเซ‹ เชคเซ‡เชฎเชจเซ‹ เช“เชฐเซเชกเชฐ เชฆเซเชตเชพเชฐเชพ เชจเช•เซเช•เซ€ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเชถเซ‡ 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 เชฌเชจเชพเชตเซเชฏเซเช‚ - เช•เซ€-เชตเซ‡เชฒเซเชฏเซ เชธเซเชŸเซ‹เชฐเซ‡เชœ - เช† เช…เชจเซเชฏ เชชเซเชฐเช•เชพเชฐเชจเซ‹ เชตเซเชฏเชตเชนเชพเชฐ เช›เซ‡ เชœเซ‡เชฎเชพเช‚ asset เชคเซ‡ เชเชจเช•เซเชฐเชฟเชชเซเชŸเซ‡เชก NaCl-เชฌเซ‹เช•เซเชธ เชจเชฅเซ€, เชชเชฐเช‚เชคเซ NaCl-เชธเชฟเช•เซเชฐเซ‡เชŸเชฌเซ‹เช•เซเชธ. เช† เชฐเซ€เชคเซ‡ เชฎเซ‡เชธเซ‡เชจเซเชœเชฐ เช…เชจเซเชฏ เชกเซ‡เชŸเชพเชจเซ‡ เชธเซเชŸเซ‹เชฐ เช•เชฐเซ‡ เช›เซ‡.

เชซเชพเช‡เชฒ/เช‡เชฎเซ‡เชœ เชŸเซเชฐเชพเชจเซเชธเชซเชฐ เช…เชจเซ‡ เช—เซเชฐเซ‚เชช เชšเซ‡เชŸเซเชธ เชฎเชพเชŸเซ‡ เชนเชœเซ เชชเชฃ เช˜เชฃเซเช‚ เช•เชพเชฎ เชœเชฐเซ‚เชฐเซ€ เช›เซ‡. เช…เชฒเชฌเชคเซเชค, เชญเซ‚เชฒ-เช…เชจเซ‡-เชญเซ‚เชฒเชจเชพ เชซเซ‹เชฐเซเชฎเซ‡เชŸเชฎเชพเช‚ เช†เชจเซ‡ เชเชกเชชเชฅเซ€ "เชธเซเช•เซเชฐเซ‚ เช…เชช" เช•เชฐเซ€ เชถเช•เชพเชฏ เช›เซ‡, เชชเชฐเช‚เชคเซ เช…เชฎเซ‡ เช—เซ‹เชชเชจเซ€เชฏเชคเชพเชจเชพ เชธเชฎเชพเชจ เชธเซเชคเชฐเชจเซ‡ เชœเชพเชณเชตเซ€ เชฐเชพเช–เชตเชพ เชฎเชพเช‚เช—เซ€เช เช›เซ€เช.

เชนเชพ, เชนเชœเซ€ เช•เชพเชฎ เช•เชฐเชตเชพเชจเซเช‚ เชฌเชพเช•เซ€ เช›เซ‡ - เช†เชฆเชฐเซเชถ เชฐเซ€เชคเซ‡, เชตเชพเชธเซเชคเชตเชฟเช• เช—เซ‹เชชเชจเซ€เชฏเชคเชพ เชงเชพเชฐเซ‡ เช›เซ‡ เช•เซ‡ เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพเช“ เชธเชพเชฐเซเชตเชœเชจเชฟเช• เชจเซ‡เชŸเชตเชฐเซเช• เชจเซ‹เชกเซเชธ เชธเชพเชฅเซ‡ เช•เชจเซ‡เช•เซเชŸ เชฅเชถเซ‡ เชจเชนเซ€เช‚, เชชเชฐเช‚เชคเซ เชคเซ‡เชฎเชจเชพ เชชเซ‹เชคเชพเชจเชพ เช‰เชญเชพ เช•เชฐเชถเซ‡. เชคเชฎเชพเชฐเชพ เชฎเชคเซ‡ เช•เซ‡เชŸเชฒเชพ เชŸเช•เชพ เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพเช“ เช† เช•เชฐเซ‡ เช›เซ‡? เชคเซ‡ เชธเชพเชšเซเช‚ เช›เซ‡, 0. เช…เชฎเซ‡ เชฎเซ‡เชธเซ‡เชจเซเชœเชฐเชจเชพ เชŸเซ‹เชฐ เชธเช‚เชธเซเช•เชฐเชฃ เชธเชพเชฅเซ‡ เช† เชธเชฎเชธเซเชฏเชพเชจเซ‡ เช†เช‚เชถเชฟเช• เชฐเซ€เชคเซ‡ เชนเชฒ เช•เชฐเชตเชพเชฎเชพเช‚ เชธเช•เซเชทเชฎ เชนเชคเชพ.

เช…เชฎเซ‡ เชธเชพเชฌเชฟเชค เช•เชฐเซเชฏเซเช‚ เช›เซ‡ เช•เซ‡ เชฌเซเชฒเซ‹เช•เชšเซ‡เชจ เชชเชฐ เชฎเซ‡เชธเซ‡เชจเซเชœเชฐ เช…เชธเซเชคเชฟเชคเซเชตเชฎเชพเช‚ เชนเซ‹เชˆ เชถเช•เซ‡ เช›เซ‡. เช…เช—เชพเช‰, 2012 เชฎเชพเช‚ เชฎเชพเชคเซเชฐ เชเช• เชœ เชชเซเชฐเชฏเชพเชธ เชนเชคเซ‹ - เชฌเซ€เชŸเชฎเซ‡เชธเซ‡เชœ, เชœเซ‡ เชฒเชพเช‚เชฌเชพ เชฎเซ‡เชธเซ‡เชœ เชกเชฟเชฒเชฟเชตเชฐเซ€ เชธเชฎเชฏ, CPU เชฒเซ‹เชก เช…เชจเซ‡ เชฎเซ‹เชฌเชพเช‡เชฒ เชเชชเซเชฒเชฟเช•เซ‡เชถเชจเชจเชพ เช…เชญเชพเชตเชจเซ‡ เช•เชพเชฐเชฃเซ‡ เชจเชฟเชทเซเชซเชณ เช—เชฏเซเช‚.

เช…เชจเซ‡ เชธเช‚เชถเชฏ เช เชนเช•เซ€เช•เชคเชจเซ‡ เช•เชพเชฐเชฃเซ‡ เช›เซ‡ เช•เซ‡ เชฌเซเชฒเซ‹เช•เชšเซ‡เชจ เชชเชฐเชจเชพ เชธเช‚เชฆเซ‡เชถเชตเชพเชนเช•เซ‹ เชคเซ‡เชฎเชจเชพ เชธเชฎเชฏ เช•เชฐเชคเชพเช‚ เช†เช—เชณ เช›เซ‡ - เชฒเซ‹เช•เซ‹ เชคเซ‡เชฎเชจเชพ เชเช•เชพเช‰เชจเซเชŸเชจเซ€ เชœเชตเชพเชฌเชฆเชพเชฐเซ€ เชฒเซ‡เชตเชพ เชคเซˆเชฏเชพเชฐ เชจเชฅเซ€, เชตเซเชฏเช•เซเชคเชฟเช—เชค เชฎเชพเชนเชฟเชคเซ€เชจเซ€ เชฎเชพเชฒเชฟเช•เซ€ เชนเชœเซ เชธเซเชงเซ€ เชเช• เชตเชฒเชฃ เชจเชฅเซ€, เช…เชจเซ‡ เชŸเซ‡เช•เชจเซ‹เชฒเซ‹เชœเซ€ เชฌเซเชฒเซ‹เช•เชšเซ‡เชจ เชชเชฐ เชŠเช‚เชšเซ€ เชเชกเชชเชจเซ‡ เชฎเช‚เชœเซ‚เชฐเซ€ เช†เชชเชคเซ€ เชจเชฅเซ€. เช…เชฎเชพเชฐเชพ เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸเชจเชพ เชตเชงเซ เชคเช•เชจเซ€เช•เซ€ เชเชจเชพเชฒเซ‹เช— เช†เช—เชณ เชฆเซ‡เช–เชพเชถเซ‡. เชคเชฎเซ‡ เชœเซ‹เชถเซ‹.

เชธเซ‹เชฐเซเชธ: www.habr.com

เชเช• เชŸเชฟเชชเซเชชเชฃเซ€ เช‰เชฎเซ‡เชฐเซ‹