рд╡рд┐рдХреЗрдВрджреНрд░рд┐рдд рдореЗрд╕реЗрдВрдЬрд░ рдмреНрд▓реЙрдХрдЪреЗрдирд╡рд░ рдХрд╕реЗ рдХрд╛рд░реНрдп рдХрд░рддреЗ?

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, рдЖрдгрд┐ рд╡реНрдпрд╡рд╣рд╛рд░ рдЖрдпрдбреА 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'))
}

рдиреЗрдЯрд╡рд░реНрдХ рдиреЛрдбрд╡рд░ рд╕рдВрджреЗрд╢рд╛рд╕рд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рдкрд╛рдард╡рд┐рдд рдЖрд╣реЗ

рдиреЗрдЯрд╡рд░реНрдХ рд╡рд┐рдХреЗрдВрджреНрд░рд┐рдд рдЕрд╕рд▓реНрдпрд╛рдиреЗ, рдУрдкрди рдПрдкреАрдЖрдп рдЕрд╕рд▓реЗрд▓реЗ рдХреЛрдгрддреЗрд╣реА рдиреЛрдб рд╣реЗ рдХрд░реЗрд▓. рдПрдВрдбрдкреЙрдЗрдВрдЯрд▓рд╛ POST рд╡рд┐рдирдВрддреА рдХрд░рдд рдЖрд╣реЗ api/transactions:

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

рдкреНрд░рддрд┐рд╕рд╛рджрд╛рдд рдЖрдореНрд╣рд╛рд▓рд╛ рддреНрдпрд╛ рдкреНрд░рдХрд╛рд░рд╛рдЪрд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рдЖрдпрдбреА рдорд┐рд│реЗрд▓

{
    "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 рд╕реЗрдХрдВрджрд╛рдд рд╡рд┐рддрд░рд┐рдд рдХреЗрд▓реЗ рдЬрд╛рдд рдЕрд╕рд▓реНрдпрд╛рдиреЗ - рд╣реАрдЪ рд╡реЗрд│ рдЖрд╣реЗ рдирд╡реАрди рдиреЗрдЯрд╡рд░реНрдХ рдмреНрд▓реЙрдХ рджрд┐рд╕рддреЛ - рдЖрдореНрд╣реА рдХреНрд▓рд╛рдпрдВрдЯ-рдЯреВ-рдиреЛрдб рдЖрдгрд┐ рдиреЛрдб-рдЯреВ-рдиреЛрдб рд╕реЙрдХреЗрдЯ рдХрдиреЗрдХреНрд╢рдирд╕рд╣ рдЖрд▓реЛ рдЖрд╣реЛрдд. рдЬреЗрд╡реНрд╣рд╛ рдиреЛрдбрд▓рд╛ рдирд╡реАрди рд╡реНрдпрд╡рд╣рд╛рд░ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддреЛ, рддреЗрд╡реНрд╣рд╛ рддреЗ рддреНрдпрд╛рдЪреА рд╡реИрдзрддрд╛ рддрдкрд╛рд╕рддреЗ рдЖрдгрд┐ рдЗрддрд░ рдиреЛрдбреНрд╕рдХрдбреЗ рдкрд╛рдард╡рддреЗ. рдПрдХрдордд рд╣реЛрдгреНрдпрд╛рдкреВрд░реНрд╡реА рдЖрдгрд┐ рдмреНрд▓реЙрдХрдордзреНрдпреЗ рд╕рдорд╛рд╡реЗрд╢ рдХрд░рдгреНрдпрд╛рдкреВрд░реНрд╡реАрдЪ рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрд╕реЗрдВрдЬрд░ рдХреНрд▓рд╛рдпрдВрдЯрд╕рд╛рдареА рдЙрдкрд▓рдмреНрдз рдЕрд╕рддреЛ. рдЕрд╢рд╛ рдкреНрд░рдХрд╛рд░реЗ рдЖрдореНрд╣реА рдирд┐рдпрдорд┐рдд рдЗрдиреНрд╕реНрдЯрдВрдЯ рдореЗрд╕реЗрдВрдЬрд░рдкреНрд░рдорд╛рдгреЗрдЪ рддреНрд╡рд░рд┐рдд рд╕рдВрджреЗрд╢ рд╡рд┐рддрд░реАрдд рдХрд░реВ.

рдЕреЕрдбреНрд░реЗрд╕ рдмреБрдХ рд╕рдВрдЧреНрд░рд╣рд┐рдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА, рдЖрдореНрд╣реА рдХреЗрд╡реНрд╣реАрдПрд╕ - рдХреА-рд╡реНрд╣реЕрд▓реНрдпреВ рд╕реНрдЯреЛрд░реЗрдЬ - рд╣рд╛ рдЖрдгрдЦреА рдПрдХ рдкреНрд░рдХрд╛рд░рдЪрд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рдЖрд╣реЗ рдЬреНрдпрд╛рдордзреНрдпреЗ asset рддреЛ рдПрдирдХреНрд░рд┐рдкреНрдЯ рдХреЗрд▓реЗрд▓рд╛ NaCl-рдмреЙрдХреНрд╕ рдирд╛рд╣реА, рдкрд░рдВрддреБ NaCl-рд╕рд┐рдХреНрд░реЗрдЯрдмреЙрдХреНрд╕. рдЕрд╢рд╛ рдкреНрд░рдХрд╛рд░реЗ рдореЗрд╕реЗрдВрдЬрд░ рдЗрддрд░ рдбреЗрдЯрд╛ рд╕рдВрдЧреНрд░рд╣рд┐рдд рдХрд░рддреЛ.

рдлрд╛рдЗрд▓/рдЗрдореЗрдЬ рдЯреНрд░рд╛рдиреНрд╕реНрдлрд░ рдЖрдгрд┐ рдЧреНрд░реБрдк рдЪреЕрдЯреНрд╕рд╕рд╛рдареА рдЕрдЬреВрдирд╣реА рдЦреВрдк рдХрд╛рдо рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ. рдЕрд░реНрдерд╛рдд, рдШреЛрдбрдЪреВрдХ рдЖрдгрд┐ рдШреЛрдбрдЪреВрдХ рд╕реНрд╡рд░реВрдкрд╛рдд рд╣реЗ рддреНрд╡рд░реАрдд "рд╕реНрдХреНрд░реВ рдЕрдк" рдХреЗрд▓реЗ рдЬрд╛рдК рд╢рдХрддреЗ, рдкрд░рдВрддреБ рдЖрдореНрд╣рд╛рд▓рд╛ рдЧреЛрдкрдиреАрдпрддреЗрдЪреА рд╕рдорд╛рди рдкрд╛рддрд│реА рд░рд╛рдЦрд╛рдпрдЪреА рдЖрд╣реЗ.

рд╣реЛрдп, рдЕрдЬреВрдирд╣реА рдХрд╛рдо рдХрд░рд╛рдпрдЪреЗ рдЖрд╣реЗ - рдЖрджрд░реНрд╢рдкрдгреЗ, рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЧреЛрдкрдиреАрдпрддрд╛ рдЕрд╕реЗ рдЧреГрд╣реАрдд рдзрд░рддреЗ рдХреА рд╡рд╛рдкрд░рдХрд░реНрддреЗ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдиреЗрдЯрд╡рд░реНрдХ рдиреЛрдбреНрд╕рд╢реА рдХрдиреЗрдХреНрдЯ рд╣реЛрдгрд╛рд░ рдирд╛рд╣реАрдд, рдкрд░рдВрддреБ рддреНрдпрд╛рдВрдЪреЗ рд╕реНрд╡рддрдГрдЪреЗ рд╡рд╛рдврд╡рддреАрд▓. рддреБрдордЪреНрдпрд╛ рдорддреЗ рдХрд┐рддреА рдЯрдХреНрдХреЗ рд╡рд╛рдкрд░рдХрд░реНрддреЗ рд╣реЗ рдХрд░рддрд╛рдд? рддреЗ рдмрд░реЛрдмрд░ рдЖрд╣реЗ, реж. рдЖрдореНрд╣реА рдореЗрд╕реЗрдВрдЬрд░рдЪреНрдпрд╛ рдЯреЛрд░ рдЖрд╡реГрддреНрддреАрд╕рд╣ рд╣реА рд╕рдорд╕реНрдпрд╛ рдЕрдВрд╢рддрдГ рд╕реЛрдбрд╡реВ рд╢рдХрд▓реЛ.

рдмреНрд▓реЙрдХрдЪреЗрдирд╡рд░ рдореЗрд╕реЗрдВрдЬрд░ рдЕрд╕реНрддрд┐рддреНрд╡рд╛рдд рдЕрд╕реВ рд╢рдХрддреЛ рд╣реЗ рдЖрдореНрд╣реА рд╕рд┐рджреНрдз рдХреЗрд▓реЗ рдЖрд╣реЗ. рдкреВрд░реНрд╡реА, 2012 рдордзреНрдпреЗ рдлрдХреНрдд рдПрдХрдЪ рдкреНрд░рдпрддреНрди рд╣реЛрддрд╛ - рдмрд┐рдЯрдореЗрд╕реЗрдЬ, рдЬреЗ рд▓рд╛рдВрдм рд╕рдВрджреЗрд╢ рд╡рд┐рддрд░рдг рд╡реЗрд│, CPU рд▓реЛрдб рдЖрдгрд┐ рдореЛрдмрд╛рдЗрд▓ рдЕрдиреБрдкреНрд░рдпреЛрдЧрд╛рдВрдЪреНрдпрд╛ рдЕрднрд╛рд╡рд╛рдореБрд│реЗ рдЕрдпрд╢рд╕реНрд╡реА рдЭрд╛рд▓реЗ.

рдЖрдгрд┐ рд╕рд╛рд╢рдВрдХрддрд╛ рдпрд╛ рд╡рд╕реНрддреБрд╕реНрдерд┐рддреАрдореБрд│реЗ рдЖрд╣реЗ рдХреА рдмреНрд▓реЙрдХрдЪреЗрдирд╡рд░реАрд▓ рд╕рдВрджреЗрд╢рд╡рд╛рд╣рдХ рддреНрдпрд╛рдВрдЪреНрдпрд╛ рд╡реЗрд│реЗрдЪреНрдпрд╛ рдкреБрдвреЗ рдЖрд╣реЗрдд - рд▓реЛрдХ рддреНрдпрд╛рдВрдЪреНрдпрд╛ рдЦрд╛рддреНрдпрд╛рдЪреА рдЬрдмрд╛рдмрджрд╛рд░реА рдШреЗрдгреНрдпрд╛рд╕ рддрдпрд╛рд░ рдирд╛рд╣реАрдд, рд╡реИрдпрдХреНрддрд┐рдХ рдорд╛рд╣рд┐рддреАрдЪреА рдорд╛рд▓рдХреА рдЕрджреНрдпрд╛рдк рдПрдХ рдЯреНрд░реЗрдВрдб рдирд╛рд╣реА рдЖрдгрд┐ рддрдВрддреНрд░рдЬреНрдЮрд╛рди рдмреНрд▓реЙрдХрдЪреЗрдирд╡рд░ рдЙрдЪреНрдЪ рдЧрддреАрд▓рд╛ рдкрд░рд╡рд╛рдирдЧреА рджреЗрдд тАЛтАЛтАЛтАЛрдирд╛рд╣реА. рдЖрдордЪреНрдпрд╛ рдкреНрд░рдХрд▓реНрдкрд╛рдЪреЗ рдЕрдзрд┐рдХ рддрд╛рдВрддреНрд░рд┐рдХ analogues рдкреБрдвреЗ рджрд┐рд╕рддреАрд▓. рддреБрдореНрд╣рд╛рд▓рд╛ рджрд┐рд╕реЗрд▓.

рд╕реНрддреНрд░реЛрдд: www.habr.com

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╛