αžαžΎαž’αŸ’αž“αž€αž“αžΆαŸ†αžŸαžΆαžšαžœαž·αž˜αž‡αŸ’αžˆαž€αžΆαžšαž’αŸ’αžœαžΎαž€αžΆαžšαž›αžΎ blockchain αž™αŸ‰αžΆαž„αžŠαžΌαž…αž˜αŸ’αžαŸαž…?

αž“αŸ…αžŠαžΎαž˜αž†αŸ’αž“αžΆαŸ† 2017 αž™αžΎαž„αž”αžΆαž“αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αž”αž„αŸ’αž€αžΎαžαž’αŸ’αž“αž€αž“αžΆαŸ†αžŸαžΆαžšαž˜αž½αž™αž“αŸ…αž›αžΎ blockchain [αžˆαŸ’αž˜αŸ„αŸ‡ αž“αž·αž„αžαŸ†αžŽαžŸαŸ’αžαž·αžαž“αŸ…αž€αŸ’αž“αž»αž„αž‘αž˜αŸ’αžšαž„αŸ‹] αžŠαŸ„αž™αž–αž·αž—αžΆαž€αŸ’αžŸαžΆαž’αŸ†αž–αžΈαž‚αž»αžŽαžŸαž˜αŸ’αž”αžαŸ’αžαž·αž‡αžΆαž„αž’αŸ’αž“αž€αž“αžΆαŸ†αžŸαžΆαžš P2P αž”αž»αžšαžΆαžŽαŸ”

αž†αŸ’αž›αž„αž€αžΆαžαŸ‹ 2.5 αž αžΎαž™αž™αžΎαž„αž’αžΆαž…αž”αž‰αŸ’αž‡αžΆαž€αŸ‹αž‚αŸ„αž›αž‚αŸ†αž“αž·αžαžšαž”αžŸαŸ‹αž™αžΎαž„αž”αžΆαž“αŸ– αž₯αž‘αžΌαžœαž“αŸαŸ‡αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž•αŸ’αž‰αžΎαžŸαžΆαžšαž˜αžΆαž“αžŸαž˜αŸ’αžšαžΆαž”αŸ‹ iOS, Web PWA, Windows, GNU/Linux, Mac OS αž“αž·αž„ Android αŸ”

αžαŸ’αž„αŸƒαž“αŸαŸ‡αž™αžΎαž„αž“αžΉαž„αž”αŸ’αžšαžΆαž”αŸ‹αž’αŸ’αž“αž€αž–αžΈαžšαž”αŸ€αž”αžŠαŸ‚αž› blockchain messenger αžŠαŸ†αžŽαžΎαžšαž€αžΆαžš αž“αž·αž„αžšαž”αŸ€αž”αžŠαŸ‚αž›αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž’αžαž·αžαž·αž‡αž“αž’αžΆαž…αž’αŸ’αžœαžΎαž€αžΆαžšαž‡αžΆαž˜αž½αž™ API αžšαž”αžŸαŸ‹αžœαžΆαŸ”
αžαžΎαž’αŸ’αž“αž€αž“αžΆαŸ†αžŸαžΆαžšαžœαž·αž˜αž‡αŸ’αžˆαž€αžΆαžšαž’αŸ’αžœαžΎαž€αžΆαžšαž›αžΎ blockchain αž™αŸ‰αžΆαž„αžŠαžΌαž…αž˜αŸ’αžαŸαž…?

αž™αžΎαž„αž…αž„αŸ‹αž±αŸ’αž™ blockchain αžŠαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αž”αž‰αŸ’αž αžΆαžŸαž»αžœαžαŸ’αžαž·αž—αžΆαž– αž“αž·αž„αž―αž€αž‡αž“αž—αžΆαž–αžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αž“αžΆαŸ†αžŸαžΆαžš P2P αž”αž»αžšαžΆαžŽαŸ–

  • αž…αž»αž…αž˜αž½αž™αžŠαž„αžŠαžΎαž˜αŸ’αž”αžΈαž”αž„αŸ’αž€αžΎαžαž‚αžŽαž“αžΈ - αž‚αŸ’αž˜αžΆαž“αž‘αžΌαžšαžŸαŸαž–αŸ’αž‘ αž¬αž’αŸŠαžΈαž˜αŸ‚αž› αž‚αŸ’αž˜αžΆαž“αžŸαž·αž‘αŸ’αž’αž·αž…αžΌαž›αž”αŸ’αžšαžΎαžŸαŸ€αžœαž—αŸ…αž’αžΆαžŸαž™αžŠαŸ’αž‹αžΆαž“ αž¬αž‘αžΈαžαžΆαŸ†αž„αž—αžΌαž˜αž·αžŸαžΆαžŸαŸ’αžαŸ’αžšαŸ”
  • αž’αŸ’αž“αž€αž”αŸ’αžšαžΆαžŸαŸ’αžšαŸαž™αž‘αžΆαž€αŸ‹αž‘αž„αž‚αŸ’αž“αžΆαž˜αž·αž“αžŠαŸ‚αž›αž”αž„αŸ’αž€αžΎαžαž€αžΆαžšαž—αŸ’αž‡αžΆαž”αŸ‹αžŠαŸ„αž™αž•αŸ’αž‘αžΆαž›αŸ‹αž‘αŸ αž€αžΆαžšαž‘αŸ†αž“αžΆαž€αŸ‹αž‘αŸ†αž“αž„αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž€αžΎαžαž‘αžΎαž„αžαžΆαž˜αžšαž™αŸˆαž”αŸ’αžšαž–αŸαž“αŸ’αž’αž…αŸ‚αž€αž…αžΆαž™αžαŸ’αž“αžΆαŸ†αž„αŸ” αž’αžΆαžŸαž™αžŠαŸ’αž‹αžΆαž“ IP αžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž˜αž·αž“αž’αžΆαž…αž…αžΌαž›αž”αŸ’αžšαžΎαž‚αŸ’αž“αžΆαž‘αŸ…αžœαž·αž‰αž‘αŸ…αž˜αž€αž”αžΆαž“αž‘αŸαŸ”
  • αžŸαžΆαžšαž‘αžΆαŸ†αž„αž’αžŸαŸ‹αžαŸ’αžšαžΌαžœαž”αžΆαž“αž’αŸŠαž·αž“αž‚αŸ’αžšαžΈαž” End-to-End curve25519xsalsa20poly1305αŸ” αžœαžΆαž αžΆαž€αŸ‹αžŠαžΌαž…αž‡αžΆαžαžΆαž“αŸαŸ‡αž“αžΉαž„αž˜αž·αž“αž’αŸ’αžœαžΎαž±αŸ’αž™αž“αžšαžŽαžΆαž˜αŸ’αž“αžΆαž€αŸ‹αž—αŸ’αž‰αžΆαž€αŸ‹αž•αŸ’αž’αžΎαž›αž“αŸ„αŸ‡αž‘αŸαž”αŸ‰αž»αž“αŸ’αžαŸ‚αž€αžΌαžŠαž”αŸ’αžšαž—αž–αžšαž”αžŸαŸ‹αž™αžΎαž„αž‚αžΊαž”αžΎαž€αž…αŸ†αž αŸ”
  • αž€αžΆαžšαžœαžΆαž™αž”αŸ’αžšαž αžΆαžš MITM αžαŸ’αžšαžΌαžœαž”αžΆαž“αžŠαž€αž…αŸαž‰ - αžŸαžΆαžšαž“αžΈαž˜αž½αž™αŸ—αž‚αžΊαž‡αžΆαž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαž˜αž½αž™ αž αžΎαž™αžαŸ’αžšαžΌαžœαž”αžΆαž“αž…αž»αŸ‡αž αžαŸ’αžαž›αŸαžαžΆαžŠαŸ„αž™ Ed25519 EdDSA αŸ”
  • αžŸαžΆαžšαž”αž‰αŸ’αž…αž”αŸ‹αž“αŸ…αž€αŸ’αž“αž»αž„αž”αŸ’αž›αž»αž€αžšαž”αžŸαŸ‹αžœαžΆαŸ” αž—αžΆαž–αž‡αžΆαž”αŸ‹αž›αžΆαž”αŸ‹αž“αž·αž„ timestamp αž’αŸ’αž“αž€αž˜αž·αž“αž’αžΆαž…αž‡αž½αžŸαž‡αž»αž›αž”αŸ’αž›αž»αž€αž”αžΆαž“αž‘αŸ αžŠαžΌαž…αŸ’αž“αŸαŸ‡αž αžΎαž™αžαžΆαž˜αž›αŸ†αžŠαžΆαž”αŸ‹αž“αŸƒαžŸαžΆαžšαŸ”
  • "αžαŸ’αž‰αž»αŸ†αž˜αž·αž“αž”αžΆαž“αž“αž·αž™αžΆαž™αžŠαžΌαž…αŸ’αž“αŸαŸ‡αž‘αŸ" αž“αžΉαž„αž˜αž·αž“αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž‡αžΆαž˜αž½αž™αžŸαžΆαžšαž“αŸ…αž›αžΎ blockchain αž‘αŸαŸ”
  • αž˜αž·αž“αž˜αžΆαž“αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž€αžŽαŸ’αžαžΆαž›αžŠαŸ‚αž›αžαŸ’αžšαž½αžαž–αž·αž“αž·αžαŸ’αž™αž›αžΎ "αž—αžΆαž–αžαŸ’αžšαžΉαž˜αžαŸ’αžšαžΌαžœ" αž“αŸƒαžŸαžΆαžšαž“αŸ„αŸ‡αž‘αŸαŸ” αž“αŸαŸ‡αžαŸ’αžšαžΌαžœαž”αžΆαž“αž’αŸ’αžœαžΎαžŠαŸ„αž™αž”αŸ’αžšαž–αŸαž“αŸ’αž’αž…αŸ‚αž€αž…αžΆαž™αžαŸ’αž“αžΆαŸ†αž„αžŠαŸ„αž™αž•αŸ’αž’αŸ‚αž€αž›αžΎαž€αžΆαžšαž˜αžΌαž›αž˜αžαž·αž‚αŸ’αž“αžΆ αž αžΎαž™αžœαžΆαžαŸ’αžšαžΌαžœαž”αžΆαž“αž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„αžŠαŸ„αž™αž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αŸ”
  • αž—αžΆαž–αž˜αž·αž“αž’αžΆαž…αž‘αŸ…αžšαž½αž…αž“αŸƒαž€αžΆαžšαž…αžΆαž”αŸ‹αž–αž·αžšαž»αž‘αŸ’αž’ - αž‚αžŽαž“αžΈαž˜αž·αž“αž’αžΆαž…αžαŸ’αžšαžΌαžœαž”αžΆαž“αžšαžΆαžšαžΆαŸ†αž„ αž αžΎαž™αžŸαžΆαžšαž˜αž·αž“αž’αžΆαž…αž›αž»αž”αž”αžΆαž“αž‘αŸαŸ”
  • Blockchain 2FA αž‚αžΊαž‡αžΆαž‡αž˜αŸ’αžšαžΎαžŸαž˜αž½αž™αžŸαž˜αŸ’αžšαžΆαž”αŸ‹ 2FA αž“αžšαž€αžαžΆαž˜αžšαž™αŸˆαžŸαžΆαžš SMS, αž”αŸ†αž•αŸ’αž›αžΆαž‰αžŸαž»αžαž—αžΆαž–αž™αŸ‰αžΆαž„αž…αŸ’αžšαžΎαž“αŸ”
  • αžŸαž˜αžαŸ’αžαž—αžΆαž–αž€αŸ’αž“αž»αž„αž€αžΆαžšαž‘αž‘αž½αž›αž€αžΆαžšαžŸαž“αŸ’αž‘αž“αžΆαžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž–αžΈαž§αž”αž€αžšαžŽαŸαžŽαžΆαž˜αž½αž™αž“αŸ…αž–αŸαž›αžŽαžΆαž˜αž½αž™αž˜αžΆαž“αž“αŸαž™αžαžΆαž’αŸ’αž“αž€αž˜αž·αž“αž…αžΆαŸ†αž”αžΆαž…αŸ‹αžšαž€αŸ’αžŸαžΆαž‘αž»αž€αž€αžΆαžšαžŸαž“αŸ’αž‘αž“αžΆαž“αŸ…αž€αŸ’αž“αž»αž„αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αžΆαž›αŸ‹αžαŸ‚αžŸαŸ„αŸ‡αŸ”
  • αž€αžΆαžšαž”αž‰αŸ’αž‡αžΆαž€αŸ‹αž–αžΈαž€αžΆαžšαž”αž‰αŸ’αž‡αžΌαž“αžŸαžΆαžšαŸ” αž˜αž·αž“αž˜αŸ‚αž“αž‘αŸ…αž§αž”αž€αžšαžŽαŸαžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž‘αŸ αž”αŸ‰αž»αž“αŸ’αžαŸ‚αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž”αžŽαŸ’αžαžΆαž‰αŸ” αž‡αžΆαž€αžΆαžšαžŸαŸ†αžαžΆαž“αŸ‹ αž“αŸαŸ‡αž‚αžΊαž‡αžΆαž€αžΆαžšαž”αž‰αŸ’αž‡αžΆαž€αŸ‹αž’αŸ†αž–αžΈαžŸαž˜αžαŸ’αžαž—αžΆαž–αžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αž‘αž‘αž½αž›αž€αŸ’αž“αž»αž„αž€αžΆαžšαž’αžΆαž“αžŸαžΆαžšαžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αŸ” αž“αŸαŸ‡αž‚αžΊαž‡αžΆαž˜αž»αžαž„αžΆαžšαžŠαŸαž˜αžΆαž“αž”αŸ’αžšαž™αŸ„αž‡αž“αŸαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž•αŸ’αž‰αžΎαž€αžΆαžšαž‡αžΌαž“αžŠαŸ†αžŽαžΉαž„αžŸαŸ†αžαžΆαž“αŸ‹αŸ—αŸ”

αž’αžαŸ’αžαž”αŸ’αžšαž™αŸ„αž‡αž“αŸ Blockchain αž€αŸαžšαž½αž˜αž”αž‰αŸ’αž…αžΌαž›αž€αžΆαžšαžšαž½αž˜αž”αž‰αŸ’αž…αžΌαž›αž™αŸ‰αžΆαž„αž‡αž·αžαžŸαŸ’αž“αž·αž‘αŸ’αž’αž‡αžΆαž˜αž½αž™αž“αžΉαž„αžšαžΌαž”αž·αž™αž”αŸαžŽαŸ’αžŽαž’αŸαž‘αž·αž…αžαŸ’αžšαžΌαž“αž·αž€ Ethereum, Dogecoin, Lisk, Dash, Bitcoin (αž˜αž½αž™αž“αŸαŸ‡αž€αŸ†αž–αž»αž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž“αŸ…αž‘αžΎαž™) αž“αž·αž„αžŸαž˜αžαŸ’αžαž—αžΆαž–αž€αŸ’αž“αž»αž„αž€αžΆαžšαž•αŸ’αž‰αžΎαžŸαž‰αŸ’αž‰αžΆαžŸαž˜αŸ’αž„αžΆαžαŸ‹αž€αŸ’αž“αž»αž„αž€αžΆαžšαž‡αž‡αŸ‚αž€αŸ” αž™αžΎαž„αžαŸ‚αž˜αž‘αžΆαŸ†αž„αž”αžΆαž“αž”αž„αŸ’αž€αžΎαžαž§αž”αž€αžšαžŽαŸαž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαž‚αŸ’αžšαžΈαž”αžαžΌαžŠαŸ‚αž›αž˜αžΆαž“αžŸαŸ’αžšαžΆαž”αŸ‹αŸ”

αž αžΎαž™αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž˜αž€ - αžšαž”αŸ€αž”αžŠαŸ‚αž›αžœαžΆαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž‘αžΆαŸ†αž„αž’αžŸαŸ‹αŸ”

αžŸαžΆαžšαž‚αžΊαž‡αžΆαž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαž˜αž½αž™αŸ”

αž˜αž“αž»αžŸαŸ’αžŸαž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αž“αžΆαž”αžΆαž“αž‘αž˜αŸ’αž›αžΆαž”αŸ‹αž’αŸ’αžœαžΎαž€αžΆαžšαž€αžαŸ‹αžŸαŸ†αž‚αžΆαž›αŸ‹αžšαž½αž…αž αžΎαž™αž…αŸ†αž–αŸ„αŸ‡αž€αžΆαžšαž–αž·αžαžŠαŸ‚αž›αžαžΆαž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαž“αŸ…αž€αŸ’αž“αž»αž„ blockchain αž•αŸ’αž‘αŸαžšαžŸαž‰αŸ’αž‰αžΆαžŸαž˜αŸ’αž„αžΆαžαŸ‹ (αž€αžΆαž€αŸ‹) αž–αžΈαž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž˜αŸ’αž“αžΆαž€αŸ‹αž‘αŸ…αž˜αž½αž™αž•αŸ’αžŸαŸαž„αž‘αŸ€αžαŸ” αžŠαžΌαž…αž‡αžΆ Bitcoin αŸ” αž™αžΎαž„αž”αžΆαž“αž”αž„αŸ’αž€αžΎαžαž”αŸ’αžšαž—αŸαž‘αž–αž·αžŸαŸαžŸαž“αŸƒαž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž”αž‰αŸ’αž‡αžΌαž“αžŸαžΆαžšαŸ”

αžŠαžΎαž˜αŸ’αž”αžΈαž•αŸ’αž‰αžΎαžŸαžΆαžšαž“αŸ…αž€αŸ’αž“αž»αž„αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž•αŸ’αž‰αžΎαžŸαžΆαžšαž“αŸ…αž›αžΎ blockchain αž’αŸ’αž“αž€αžαŸ’αžšαžΌαžœαž†αŸ’αž›αž„αž€αžΆαžαŸ‹αž‡αŸ†αž αžΆαž“αž‡αžΆαž…αŸ’αžšαžΎαž“αŸ–

  1. αž’αŸŠαž·αž“αž‚αŸ’αžšαžΈαž”αž’αžαŸ’αžαž”αž‘αžŸαžΆαžš
  2. αžŠαžΆαž€αŸ‹αž›αŸαžαž€αžΌαžŠαžŸαž˜αŸ’αž„αžΆαžαŸ‹αž‘αŸ…αž€αŸ’αž“αž»αž„αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžš
  3. αž…αž»αŸ‡αž αžαŸ’αžαž›αŸαžαžΆαž›αžΎαž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžš
  4. αž•αŸ’αž‰αžΎαž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαž‘αŸ…αžαŸ’αž“αžΆαŸ†αž„αž”αžŽαŸ’αžαžΆαž‰αžŽαžΆαž˜αž½αž™αŸ”
  5. αž”αŸ’αžšαž–αŸαž“αŸ’αž’αž…αŸ‚αž€αž…αžΆαž™αžαŸ’αž“αžΆαŸ†αž„αž€αŸ†αžŽαžαŸ‹ "αž—αžΆαž–αžαŸ’αžšαžΉαž˜αžαŸ’αžšαžΌαžœ" αž“αŸƒαžŸαžΆαžš
  6. αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž’αŸ’αžœαžΈαŸ—αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž˜αž·αž“αž’αžΈαž‘αŸ αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαž‡αžΆαž˜αž½αž™αžŸαžΆαžšαžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž‰αŸ’αž…αžΌαž›αž€αŸ’αž“αž»αž„αž”αŸ’αž›αž»αž€αž”αž“αŸ’αž‘αžΆαž”αŸ‹
  7. αž’αŸ’αž“αž€αž‘αž‘αž½αž›αž™αž€αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαžŸαžΆαžš αž“αž·αž„αžŒαž·αž‚αŸ’αžšαžΈαž”

αž‡αŸ†αž αžΆαž“αž‘αžΈ 1–3 αž“αž·αž„ 7 αžαŸ’αžšαžΌαžœαž”αžΆαž“αž’αž“αž»αžœαžαŸ’αžαž“αŸ…αž€αŸ’αž“αž»αž„αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž“αŸ…αž›αžΎαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž—αŸ’αž‰αŸ€αžœ αž αžΎαž™αž‡αŸ†αž αžΆαž“ 5–6 αžαŸ’αžšαžΌαžœαž”αžΆαž“αž’αž“αž»αžœαžαŸ’αžαž“αŸ…αž›αžΎαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αŸ”

αž€αžΆαžšαž’αŸŠαž·αž“αž‚αŸ’αžšαžΈαž”αžŸαžΆαžš

αžŸαžΆαžšαžαŸ’αžšαžΌαžœαž”αžΆαž“αž’αŸŠαž·αž“αž‚αŸ’αžšαžΈαž”αžŠαŸ„αž™αž”αŸ’αžšαžΎαžŸαŸ„αž―αž€αž‡αž“αžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αž•αŸ’αž‰αžΎ αž“αž·αž„αžŸαŸ„αžŸαžΆαž’αžΆαžšαžŽαŸˆαžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αž‘αž‘αž½αž›αŸ” αž™αžΎαž„αž“αžΉαž„αž™αž€αžŸαŸ„αžŸαžΆαž’αžΆαžšαžŽαŸˆαž–αžΈαž”αžŽαŸ’αžαžΆαž‰ αž”αŸ‰αž»αž“αŸ’αžαŸ‚αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž”αž‰αŸ’αž αžΆαž“αŸαŸ‡ αž‚αžŽαž“αžΈαžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αž‘αž‘αž½αž›αžαŸ’αžšαžΌαžœαžαŸ‚αžαŸ’αžšαžΌαžœαž”αžΆαž“αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜ αž–αŸ„αž›αž‚αžΊαž˜αžΆαž“αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαž™αŸ‰αžΆαž„αž αŸ„αž…αžŽαžΆαžŸαŸ‹αž˜αž½αž™αŸ” αž’αŸ’αž“αž€αž’αžΆαž…αž”αŸ’αžšαžΎαžŸαŸ†αžŽαžΎ REST GET /api/accounts/getPublicKey?address={ADAMANT address}αž αžΎαž™αž“αŸ…αž–αŸαž›αž•αŸ’αž‘αž»αž€αž€αžΆαžšαž‡αž‡αŸ‚αž€ αžŸαŸ„αžŸαžΆαž’αžΆαžšαžŽαŸˆαžšαž”αžŸαŸ‹ interlocutors αž“αžΉαž„αž˜αžΆαž“αžšαž½αž…αž αžΎαž™αŸ”

αžαžΎαž’αŸ’αž“αž€αž“αžΆαŸ†αžŸαžΆαžšαžœαž·αž˜αž‡αŸ’αžˆαž€αžΆαžšαž’αŸ’αžœαžΎαž€αžΆαžšαž›αžΎ blockchain αž™αŸ‰αžΆαž„αžŠαžΌαž…αž˜αŸ’αžαŸαž…?

αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž•αŸ’αž‰αžΎαžŸαžΆαžšαž’αŸŠαž·αž“αž‚αŸ’αžšαžΈαž”αžŸαžΆαžšαžŠαŸ„αž™αž”αŸ’αžšαžΎαž€αŸ’αž”αž½αž“αžŠαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™ 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": "Ρ‚ΡƒΡ‚ Π±ΡƒΠ΄Π΅Ρ‚ подпись"
  }
}

αž αžαŸ’αžαž›αŸαžαžΆαž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžš

αžŠαžΎαž˜αŸ’αž”αžΈαž’αžΆαž“αžΆαžαžΆαž’αŸ’αž“αž€αž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αž“αžΆαž˜αžΆαž“αž‘αŸ†αž“αž»αž€αž…αž·αžαŸ’αžαž›αžΎαž—αžΆαž–αžαŸ’αžšαžΉαž˜αžαŸ’αžšαžΌαžœαžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αž•αŸ’αž‰αžΎ αž“αž·αž„αž’αŸ’αž“αž€αž‘αž‘αž½αž› αž–αŸαž›αžœαŸαž›αžΆαž“αŸƒαž€αžΆαžšαž•αŸ’αž‰αžΎ αž“αž·αž„αžαŸ’αž›αžΉαž˜αžŸαžΆαžšαž“αŸƒαžŸαžΆαžš αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαžαŸ’αžšαžΌαžœαž”αžΆαž“αž…αž»αŸ‡αž αžαŸ’αžαž›αŸαžαžΆαŸ” αž αžαŸ’αžαž›αŸαžαžΆαžŒαžΈαž‡αžΈαžαž›αž’αž“αž»αž‰αŸ’αž‰αžΆαžαž±αŸ’αž™αž’αŸ’αž“αž€αž•αŸ’αž‘αŸ€αž„αž•αŸ’αž‘αžΆαžαŸ‹αž—αžΆαž–αžαŸ’αžšαžΉαž˜αžαŸ’αžšαžΌαžœαž“αŸƒαž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαžŠαŸ„αž™αž”αŸ’αžšαžΎαžŸαŸ„αžŸαžΆαž’αžΆαžšαžŽαŸˆ - αžŸαŸ„αž―αž€αž‡αž“αž˜αž·αž“αž…αžΆαŸ†αž”αžΆαž…αŸ‹αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžšαžΏαž„αž“αŸαŸ‡αž‘αŸαŸ”

αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž αžαŸ’αžαž›αŸαžαžΆαžαŸ’αž›αž½αž“αž―αž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αž’αž“αž»αžœαžαŸ’αžαžŠαŸ„αž™αž”αŸ’αžšαžΎαžŸαŸ„αž―αž€αž‡αž“αŸ–

αžαžΎαž’αŸ’αž“αž€αž“αžΆαŸ†αžŸαžΆαžšαžœαž·αž˜αž‡αŸ’αžˆαž€αžΆαžšαž’αŸ’αžœαžΎαž€αžΆαžšαž›αžΎ blockchain αž™αŸ‰αžΆαž„αžŠαžΌαž…αž˜αŸ’αžαŸαž…?

αžŠαŸ’αž™αžΆαž€αŸ’αžšαžΆαž˜αž”αž„αŸ’αž αžΆαž‰αžαžΆαžŠαŸ†αž”αžΌαž„αž™αžΎαž„αž”αŸ†αž”αŸ‚αž€αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαž‡αžΆαž˜αž½αž™ SHA-256 αž αžΎαž™αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž˜αž€αž…αž»αŸ‡αž αžαŸ’αžαž›αŸαžαžΆαž›αžΎαžœαžΆαŸ” Ed25519 EdDSA αž“αž·αž„αž‘αž‘αž½αž›αž”αžΆαž“αž αžαŸ’αžαž›αŸαžαžΆ signatureαž αžΎαž™αž›αŸαžαžŸαž˜αŸ’αž‚αžΆαž›αŸ‹αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαž‚αžΊαž‡αžΆαž•αŸ’αž“αŸ‚αž€αž˜αž½αž™αž“αŸƒαžŸαž‰αŸ’αž‰αžΆ 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"
}

αžŸαž»αž–αž›αž—αžΆαž–αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžš

αž”αŸ’αžšαž–αŸαž“αŸ’αž’αž…αŸ‚αž€αž…αžΆαž™αžαŸ’αž“αžΆαŸ†αž„ αžŠαŸ„αž™αž•αŸ’αž’αŸ‚αž€αž›αžΎαž€αžΆαžšαž™αž›αŸ‹αžŸαŸ’αžšαž” αž€αŸ†αžŽαžαŸ‹ "αž—αžΆαž–αžαŸ’αžšαžΉαž˜αžαŸ’αžšαžΌαžœ" αž“αŸƒαžŸαžΆαžšαž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαŸ” αž–αžΈαž’αŸ’αž“αž€αžŽαžΆ αž“αž·αž„αž‘αŸ…αž’αŸ’αž“αž€αžŽαžΆ αž“αŸ…αž–αŸαž›αžŽαžΆ αžαžΆαžαžΎαžŸαžΆαžšαžαŸ’αžšαžΌαžœαž”αžΆαž“αž‡αŸ†αž“αž½αžŸαžŠαŸ„αž™αžŸαžΆαžšαž•αŸ’αžŸαŸαž„αž‘αŸ€αž αž“αž·αž„αžαžΆαžαžΎαž–αŸαž›αžœαŸαž›αžΆαž“αŸƒαž€αžΆαžšαž•αŸ’αž‰αžΎαžαŸ’αžšαžΌαžœαž”αžΆαž“αž…αž„αŸ’αž’αž»αž›αž”αž„αŸ’αž αžΆαž‰αž™αŸ‰αžΆαž„αžαŸ’αžšαžΉαž˜αžαŸ’αžšαžΌαžœαŸ” αž“αŸαŸ‡αž‚αžΊαž‡αžΆαž’αžαŸ’αžαž”αŸ’αžšαž™αŸ„αž‡αž“αŸαžŠαŸαžŸαŸ†αžαžΆαž“αŸ‹αž”αŸ†αž•αž»αžαž“αŸƒ blockchain - αž˜αž·αž“αž˜αžΆαž“αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž€αžŽαŸ’αžαžΆαž›αžŠαŸ‚αž›αž‘αž‘αž½αž›αžαž»αžŸαžαŸ’αžšαžΌαžœαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž•αŸ’αž‘αŸ€αž„αž•αŸ’αž‘αžΆαžαŸ‹αž‘αŸαž αžΎαž™αž›αŸ†αžŠαžΆαž”αŸ‹αž“αŸƒαžŸαžΆαžšαž“αž·αž„αž˜αžΆαžαž·αž€αžΆαžšαž”αžŸαŸ‹αž–αž½αž€αž‚αŸαž˜αž·αž“αž’αžΆαž…αž€αŸ’αž›αŸ‚αž„αž”αž“αŸ’αž›αŸ†αž”αžΆαž“αž‘αŸαŸ”

αž‘αžΈαž˜αž½αž™αžαŸ’αž“αžΆαŸ†αž„αž˜αž½αž™αž–αž·αž“αž·αžαŸ’αž™αž˜αžΎαž›αž—αžΆαž–αžαŸ’αžšαžΉαž˜αžαŸ’αžšαžΌαžœ αž αžΎαž™αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž˜αž€αž•αŸ’αž‰αžΎαžœαžΆαž‘αŸ…αž’αŸ’αž“αž€αž•αŸ’αžŸαŸαž„αž‘αŸ€αž - αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž—αžΆαž‚αž…αŸ’αžšαžΎαž“αž“αž·αž™αžΆαž™αžαžΆαž’αŸ’αžœαžΈαž‚αŸ’αžšαž”αŸ‹αž™αŸ‰αžΆαž„αž‚αžΊαžŸαŸ’αžαž·αžαž“αŸ…αž€αŸ’αž“αž»αž„αž›αŸ†αžŠαžΆαž”αŸ‹ αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαž“αžΉαž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αžšαž½αž˜αž”αž‰αŸ’αž…αžΌαž›αž“αŸ…αž€αŸ’αž“αž»αž„αž”αŸ’αž›αž»αž€αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž“αŸƒαžαŸ’αžŸαŸ‚αžŸαž„αŸ’αžœαžΆαž€αŸ‹αž“αŸαŸ‡ - αž“αŸαŸ‡αž‚αžΊαž‡αžΆαž€αžΆαžšαž™αž›αŸ‹αžŸαŸ’αžšαž”αŸ”

αžαžΎαž’αŸ’αž“αž€αž“αžΆαŸ†αžŸαžΆαžšαžœαž·αž˜αž‡αŸ’αžˆαž€αžΆαžšαž’αŸ’αžœαžΎαž€αžΆαžšαž›αžΎ blockchain αž™αŸ‰αžΆαž„αžŠαžΌαž…αž˜αŸ’αžαŸαž…?

αž•αŸ’αž“αŸ‚αž€αž“αŸƒαž›αŸαžαž€αžΌαžŠαžαŸ’αž“αžΆαŸ†αž„αžŠαŸ‚αž›αž‘αž‘αž½αž›αžαž»αžŸαžαŸ’αžšαžΌαžœαž…αŸ†αž–αŸ„αŸ‡αž€αžΆαžšαžαŸ’αžšαž½αžαž–αž·αž“αž·αžαŸ’αž™αž’αžΆαž…αž˜αžΎαž›αž”αžΆαž“αž“αŸ…αž›αžΎ GitHub - αžŸαž»αž–αž›αž—αžΆαž– ΠΈ αž•αŸ’αž‘αŸ€αž„αž•αŸ’αž‘αžΆαžαŸ‹.js. αž”αžΆαž‘ αžαŸ’αž“αžΆαŸ†αž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž›αžΎ Node.js αŸ”

αžšαž½αž˜αž‘αžΆαŸ†αž„αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαž‡αžΆαž˜αž½αž™αžŸαžΆαžšαž“αŸ…αž€αŸ’αž“αž»αž„αž”αŸ’αž›αž»αž€

αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž€αžΆαžšαž™αž›αŸ‹αžŸαŸ’αžšαž”αžαŸ’αžšαžΌαžœαž”αžΆαž“αžˆαžΆαž“αžŠαž›αŸ‹ αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαž‡αžΆαž˜αž½αž™αžŸαžΆαžšαžšαž”αžŸαŸ‹αž™αžΎαž„αž“αžΉαž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž‰αŸ’αž…αžΌαž›αž€αŸ’αž“αž»αž„αž”αŸ’αž›αž»αž€αž”αž“αŸ’αž‘αžΆαž”αŸ‹ αžšαž½αž˜αž‡αžΆαž˜αž½αž™αž“αžΉαž„αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαžŠαŸ‚αž›αž˜αžΆαž“αžŸαž»αž–αž›αž—αžΆαž–αž•αŸ’αžŸαŸαž„αž‘αŸ€αžαŸ”

αž”αŸ’αž›αž»αž€αž˜αžΆαž“αž›αŸ†αžŠαžΆαž”αŸ‹αžαžΉαž„αžšαŸ‰αžΉαž„ αž αžΎαž™αž”αŸ’αž›αž»αž€αž”αž“αŸ’αžαž”αž“αŸ’αž‘αžΆαž”αŸ‹αž“αžΈαž˜αž½αž™αŸ—αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž„αŸ’αž€αžΎαžαž‘αžΎαž„αžŠαŸ„αž™αž•αŸ’αž’αŸ‚αž€αž›αžΎαžŸαž‰αŸ’αž‰αžΆαž“αŸƒαž”αŸ’αž›αž»αž€αž˜αž»αž“αŸ—αŸ”

αžαžΎαž’αŸ’αž“αž€αž“αžΆαŸ†αžŸαžΆαžšαžœαž·αž˜αž‡αŸ’αžˆαž€αžΆαžšαž’αŸ’αžœαžΎαž€αžΆαžšαž›αžΎ blockchain αž™αŸ‰αžΆαž„αžŠαžΌαž…αž˜αŸ’αžαŸαž…?

αž…αŸ†αž“αž»αž…αž“αŸ„αŸ‡αž‚αžΊαžαžΆαžŸαžΆαžšαžšαž”αžŸαŸ‹αž™αžΎαž„αž€αŸαžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž‰αŸ’αž…αžΌαž›αž€αŸ’αž“αž»αž„αž›αŸ†αžŠαžΆαž”αŸ‹αž“αŸαŸ‡αž•αž„αžŠαŸ‚αžš αž αžΎαž™αž˜αž·αž“αž’αžΆαž… "αžšαŸ€αž”αž…αŸ†αž‘αžΎαž„αžœαž·αž‰" αž”αžΆαž“αž‘αŸαŸ” αž”αŸ’αžšαžŸαž·αž“αž”αžΎαžŸαžΆαžšαž‡αžΆαž…αŸ’αžšαžΎαž“αž’αŸ’αž›αžΆαž€αŸ‹αž…αžΌαž›αž‘αŸ…αž€αŸ’αž“αž»αž„αž”αŸ’αž›αž»αž€ αž€αžΆαžšαž”αž‰αŸ’αž‡αžΆαž‘αž·αž‰αžšαž”αžŸαŸ‹αž–αž½αž€αž‚αŸαž“αžΉαž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αž€αŸ†αžŽαžαŸ‹αžŠαŸ„αž™ timestamp αžŸαžΆαžšαŸ”

αž€αžΆαžšαž’αžΆαž“αžŸαžΆαžš

αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž•αŸ’αž‰αžΎαžŸαžΆαžšαž‘αŸ…αž™αž€αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαž–αžΈ blockchain αžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž”αžΆαž“αž•αŸ’αž‰αžΎαž‘αŸ…αž’αŸ’αž“αž€αž‘αž‘αž½αž›αŸ” αž…αŸ†αž–αŸ„αŸ‡αž”αž‰αŸ’αž αžΆαž“αŸαŸ‡αž™αžΎαž„αž”αžΆαž“αž”αž„αŸ’αž€αžΎαžαž…αŸ†αžŽαž»αž…αž”αž‰αŸ’αž…αž”αŸ‹ 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 αžœαž·αž“αžΆαž‘αžΈ - αž“αŸαŸ‡αž‚αžΊαž‡αžΆαž–αŸαž›αžŠαŸ‚αž›αž”αŸ’αž›αž»αž€αž”αžŽαŸ’αžαžΆαž‰αžαŸ’αž˜αžΈαž›αŸαž…αž‘αžΎαž„ - αž™αžΎαž„αž”αžΆαž“αž—αŸ’αž‡αžΆαž”αŸ‹αž˜αž€αž‡αžΆαž˜αž½αž™αž“αžΌαžœαž€αžΆαžšαžαž—αŸ’αž‡αžΆαž”αŸ‹αžšαž“αŸ’αž’ client-to-node αž“αž·αž„ node-to-node αŸ” αž“αŸ…αž–αŸαž›αžŠαŸ‚αž›αžαŸ’αž“αžΆαŸ†αž„αž‘αž‘αž½αž›αž”αžΆαž“αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαžαŸ’αž˜αžΈ αžœαžΆαž–αž·αž“αž·αžαŸ’αž™αžŸαž»αž–αž›αž—αžΆαž–αžšαž”αžŸαŸ‹αžœαžΆ αž αžΎαž™αž”αž‰αŸ’αž‡αžΌαž“αžœαžΆαž‘αŸ…αžαŸ’αž“αžΆαŸ†αž„αž•αŸ’αžŸαŸαž„αž‘αŸ€αžαŸ” αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαž“αŸαŸ‡αž˜αžΆαž“αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž’αžαž·αžαž·αž‡αž“αž•αŸ’αž‰αžΎαžŸαžΆαžš αžŸαžΌαž˜αŸ’αž”αžΈαžαŸ‚αž˜αž»αž“αž–αŸαž›αž€αžΆαžšαž―αž€αž—αžΆαž–αž€αžΎαžαž‘αžΎαž„ αž“αž·αž„αž€αžΆαžšαžŠαžΆαž€αŸ‹αž”αž‰αŸ’αž…αžΌαž›αž€αŸ’αž“αž»αž„αž”αŸ’αž›αž»αž€αž€αŸαžŠαŸ„αž™αŸ” αžœαž·αž’αžΈαž“αŸαŸ‡ αž™αžΎαž„αž“αžΉαž„αž”αž‰αŸ’αž‡αžΌαž“αžŸαžΆαžšαž—αŸ’αž›αžΆαž˜αŸ— αžŠαžΌαž…αž’αŸ’αž“αž€αž•αŸ’αž‰αžΎαžŸαžΆαžšαž”αž“αŸ’αž‘αžΆαž“αŸ‹αž’αž˜αŸ’αž˜αžαžΆαžŠαŸ‚αžšαŸ”

αžŠαžΎαž˜αŸ’αž”αžΈαžšαž€αŸ’αžŸαžΆαž‘αž»αž€αžŸαŸ€αžœαž—αŸ…αž’αžΆαžŸαž™αžŠαŸ’αž‹αžΆαž“ αž™αžΎαž„αž”αžΆαž“αž”αž„αŸ’αž€αžΎαž KVS - Key-Value Storage - αž“αŸαŸ‡αž‚αžΊαž‡αžΆαž”αŸ’αžšαž—αŸαž‘αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαž˜αž½αž™αž•αŸ’αžŸαŸαž„αž‘αŸ€αžαžŠαŸ‚αž›αž“αŸ…αž€αŸ’αž“αž»αž„αž“αŸ„αŸ‡αŸ” asset αžœαžΆαž˜αž·αž“αž˜αŸ‚αž“αž‡αžΆαž”αŸ’αžšαž’αž”αŸ‹ NaCl αžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž”αžΆαž“αž’αŸŠαž·αž“αž‚αŸ’αžšαžΈαž”αž‘αŸ αž”αŸ‰αž»αž“αŸ’αžαŸ‚ NaCl-αž”αŸ’αžšαž’αž”αŸ‹αžŸαž˜αŸ’αž„αžΆαžαŸ‹. αž“αŸαŸ‡αž‡αžΆαžšαž”αŸ€αž”αžŠαŸ‚αž›αž’αŸ’αž“αž€αž“αžΆαŸ†αžŸαžΆαžšαžšαž€αŸ’αžŸαžΆαž‘αž»αž€αž‘αž·αž“αŸ’αž“αž“αŸαž™αž•αŸ’αžŸαŸαž„αž‘αŸ€αžαŸ”

αž€αžΆαžšαž•αŸ’αž‘αŸαžšαž―αž€αžŸαžΆαžš/αžšαžΌαž”αž—αžΆαž– αž“αž·αž„αž€αžΆαžšαž‡αž‡αŸ‚αž€αž‡αžΆαž€αŸ’αžšαž»αž˜αž“αŸ…αžαŸ‚αžαŸ’αžšαžΌαžœαž€αžΆαžšαž€αžΆαžšαž„αžΆαžšαž…αŸ’αžšαžΎαž“αŸ” αž‡αžΆβ€‹αž€αžΆαžšβ€‹αž–αž·αžβ€‹αžŽαžΆαžŸαŸ‹ αž“αŸ…β€‹αž€αŸ’αž“αž»αž„β€‹αž‘αž˜αŸ’αžšαž„αŸ‹β€‹αžŠαŸ‚αž›β€‹αž˜αž·αž“β€‹αž…αŸ’αž”αžΆαžŸαŸ‹β€‹αž›αžΆαžŸαŸ‹β€‹αž“αž·αž„β€‹αž—αžΆαž–β€‹αž˜αž·αž“β€‹αž…αŸ’αž”αžΆαžŸαŸ‹β€‹αž“αŸαŸ‡β€‹αž’αžΆαž…β€‹αžαŸ’αžšαžΌαžœβ€‹αž”αžΆαž“ "αž”αž·αž‘" αž™αŸ‰αžΆαž„β€‹αž†αžΆαž”αŸ‹β€‹αžšαž αŸαžŸ αž”αŸ‰αž»αž“αŸ’αžαŸ‚β€‹αž™αžΎαž„β€‹αž…αž„αŸ‹β€‹αžšαž€αŸ’αžŸαžΆβ€‹αž€αž˜αŸ’αžšαž·αžβ€‹αž―αž€αž‡αž“αž—αžΆαž–β€‹αžŠαžŠαŸ‚αž›αŸ”

αž”αžΆαž‘ / αž…αžΆαžŸ αžœαžΆαž“αŸ…αžαŸ‚αž˜αžΆαž“αž€αžΆαžšαž„αžΆαžšαžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž’αŸ’αžœαžΎ - αžαžΆαž˜αž§αžαŸ’αžŠαž˜αž‚αžαž· αž―αž€αž‡αž“αž—αžΆαž–αž–αž·αžαž”αŸ’αžšαžΆαž€αžŠαžŸαž“αŸ’αž˜αžαŸ‹αžαžΆαž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž“αžΉαž„αž˜αž·αž“αž—αŸ’αž‡αžΆαž”αŸ‹αž‘αŸ…αžαŸ’αž“αžΆαŸ†αž„αž”αžŽαŸ’αžαžΆαž‰αžŸαžΆαž’αžΆαžšαžŽαŸˆαž‘αŸ αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž“αžΉαž„αž›αžΎαž€αž‘αžΎαž„αžŠαŸ„αž™αžαŸ’αž›αž½αž“αž―αž„αŸ” αžαžΎβ€‹αž’αŸ’αž“αž€β€‹αž‚αž·αžβ€‹αžαžΆβ€‹αž’αŸ’αž“αž€β€‹αž”αŸ’αžšαžΎβ€‹αž“αŸαŸ‡β€‹αž˜αžΆαž“β€‹αž—αžΆαž‚αžšαž™β€‹αž”αŸ‰αž»αž“αŸ’αž˜αžΆαž“? αžαŸ’αžšαžΉαž˜αžαŸ’αžšαžΌαžœαž αžΎαž™ 0. αž™αžΎαž„αž’αžΆαž…αžŠαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αž”αž‰αŸ’αž αžΆαž“αŸαŸ‡αžŠαŸ„αž™αž•αŸ’αž“αŸ‚αž€αž‡αžΆαž˜αž½αž™αž€αŸ†αžŽαŸ‚ Tor αžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αž“αžΆαŸ†αžŸαžΆαžšαŸ”

αž™αžΎαž„αž”αžΆαž“αž”αž„αŸ’αž αžΆαž‰αžαžΆαž’αŸ’αž“αž€αž“αžΆαŸ†αžŸαžΆαžšαž“αŸ…αž›αžΎ blockchain αž’αžΆαž…αž˜αžΆαž“αŸ” αž€αžΆαž›β€‹αž–αžΈβ€‹αž˜αž»αž“β€‹αž˜αžΆαž“β€‹αž€αžΆαžšβ€‹αž”αŸ‰αž»αž“αž”αŸ‰αž„β€‹αžαŸ‚β€‹αž˜αž½αž™β€‹αž‚αžαŸ‹β€‹αž€αŸ’αž“αž»αž„β€‹αž†αŸ’αž“αžΆαŸ† ្០៑្ - αžŸαžΆαžšαž”αŸŠαžΈαžαžŠαŸ‚αž›αž”αžšαžΆαž‡αŸαž™αžŠαŸ„αž™αžŸαžΆαžšαžαŸ‚αž–αŸαž›αžœαŸαž›αžΆαž”αž‰αŸ’αž‡αžΌαž“αžŸαžΆαžšαž™αžΌαžš αž€αžΆαžšαž•αŸ’αž‘αž»αž€αžŸαŸŠαžΈαž—αžΈαž™αžΌ αž“αž·αž„αž€αž„αŸ’αžœαŸ‡αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž‘αžΌαžšαžŸαŸαž–αŸ’αž‘αŸ”

αž αžΎαž™αž€αžΆαžšαžŸαž„αŸ’αžŸαŸαž™αž‚αžΊαžŠαŸ„αž™αžŸαžΆαžšαžαŸ‚αž€αžΆαžšαž–αž·αžαžŠαŸ‚αž›αžαžΆαž’αŸ’αž“αž€αž“αžΆαŸ†αžŸαžΆαžšαž“αŸ…αž›αžΎ blockchain αž‚αžΊαž˜αž»αž“αž–αŸαž›αžœαŸαž›αžΆαžšαž”αžŸαŸ‹αž–αž½αž€αž‚αŸ - αž˜αž“αž»αžŸαŸ’αžŸαž˜αž·αž“αž‘αžΆαž“αŸ‹αžαŸ’αžšαŸ€αž˜αžαŸ’αž›αž½αž“αžšαž½αž…αž‡αžΆαžŸαŸ’αžšαŸαž…αžŠαžΎαž˜αŸ’αž”αžΈαž‘αž‘αž½αž›αžαž»αžŸαžαŸ’αžšαžΌαžœαž…αŸ†αž–αŸ„αŸ‡αž‚αžŽαž“αžΈαžšαž”αžŸαŸ‹αž–αž½αž€αž‚αŸαž€αžΆαžšαž€αžΆαž“αŸ‹αž€αžΆαž”αŸ‹αž–αŸαžαŸŒαž˜αžΆαž“αž•αŸ’αž‘αžΆαž›αŸ‹αžαŸ’αž›αž½αž“αž˜αž·αž“αž‘αžΆαž“αŸ‹αž‡αžΆαž“αž·αž“αŸ’αž“αžΆαž€αžΆαžšαž‘αŸαž αžΎαž™αž”αž…αŸ’αž…αŸαž€αžœαž·αž‘αŸ’αž™αžΆαž˜αž·αž“αž’αž“αž»αž‰αŸ’αž‰αžΆαžαž±αŸ’αž™αž˜αžΆαž“αž›αŸ’αž”αžΏαž“αž›αžΏαž“αž“αŸ…αž›αžΎ blockchain αž‘αŸαŸ” analogues αž”αž…αŸ’αž…αŸαž€αžœαž·αž‘αŸ’αž™αžΆαž‡αžΆαž…αŸ’αžšαžΎαž“αž‘αŸ€αžαž“αŸƒαž‚αž˜αŸ’αžšαŸ„αž„αžšαž”αžŸαŸ‹αž™αžΎαž„αž“αžΉαž„αž”αž„αŸ’αž αžΆαž‰αž“αŸ…αž–αŸαž›αž€αŸ’αžšαŸ„αž™αŸ” αž’αŸ’αž“αž€αž“αžΉαž„αžƒαžΎαž‰αŸ”

αž”αŸ’αžšαž—αž–: www.habr.com

αž”αž“αŸ’αžαŸ‚αž˜αž˜αžαž·αž™αŸ„αž”αž›αŸ‹