рдХрд╕рд░реА рд╡рд┐рдХреЗрдиреНрджреНрд░реАрдХреГрдд рдореЗрд╕реЗрдиреНрдЬрд░рд▓реЗ рдмреНрд▓рдХрдЪреЗрдирдорд╛ рдХрд╛рдо рдЧрд░реНрдЫ?

2017 рдХреЛ рд╕реБрд░реБрдорд╛, рд╣рд╛рдореАрд▓реЗ рдмреНрд▓рдХрдЪреЗрдирдорд╛ рдореЗрд╕реЗрдиреНрдЬрд░ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрди рдерд╛рд▓реНрдпреМрдВ [рдирд╛рдо рд░ рд▓рд┐рдЩреНрдХ рдкреНрд░реЛрдлрд╛рдЗрд▓рдорд╛ рдЫрдиреН] рдХреНрд▓рд╛рд╕рд┐рдХ P2P рдореЗрд╕реЗрдиреНрдЬрд░рд╣рд░реВрдХрд╛ рдлрд╛рдЗрджрд╛рд╣рд░реВ рдЫрд▓рдлрд▓ рдЧрд░реЗрд░ред

рдкрд╛рд╕ рднрдпреЛ 2.5 рд╡рд░реНрд╖, рд░ рд╣рд╛рдореАрд▓реЗ рд╣рд╛рдореНрд░реЛ рдЕрд╡рдзрд╛рд░рдгрд╛ рдкреБрд╖реНрдЯрд┐ рдЧрд░реНрди рд╕рдХреНрд╖рдо рднрдпреМрдВ: рдореЗрд╕реЗрдиреНрдЬрд░ рдЕрдиреБрдкреНрд░рдпреЛрдЧрд╣рд░реВ рдЕрдм iOS, Web PWA, Windows, GNU/Linux, Mac OS рд░ Android рдХреЛ рд▓рд╛рдЧрд┐ рдЙрдкрд▓рдмреНрдз рдЫрдиреНред

рдЖрдЬ рд╣рд╛рдореА рддрдкрд╛рдИрдВрд▓рд╛рдИ рдмреНрд▓рдХрдЪреЗрди рдореЗрд╕реЗрдиреНрдЬрд░рд▓реЗ рдХрд╕рд░реА рдХрд╛рдо рдЧрд░реНрдЫ рд░ рдХрд╕рд░реА рдХреНрд▓рд╛рдЗрдиреНрдЯ рдПрдкреНрд▓рд┐рдХреЗрд╕рдирд╣рд░реВрд▓реЗ рдпрд╕рдХреЛ рдПрдкреАрдЖрдИрд╕рдБрдЧ рдХрд╛рдо рдЧрд░реНрди рд╕рдХреНрдЫрдиреН рднрдиреНрдиреЗ рдХреБрд░рд╛ рдмрддрд╛рдЙрдиреЗрдЫреМрдВред
рдХрд╕рд░реА рд╡рд┐рдХреЗрдиреНрджреНрд░реАрдХреГрдд рдореЗрд╕реЗрдиреНрдЬрд░рд▓реЗ рдмреНрд▓рдХрдЪреЗрдирдорд╛ рдХрд╛рдо рдЧрд░реНрдЫ?

рд╣рд╛рдореА рдмреНрд▓рдХрдЪреЗрдирд▓реЗ рдХреНрд▓рд╛рд╕рд┐рдХ P2P рдореЗрд╕реЗрдиреНрдЬрд░рд╣рд░реВрдХреЛ рд╕реБрд░рдХреНрд╖рд╛ рд░ рдЧреЛрдкрдиреАрдпрддрд╛ рд╕рдорд╕реНрдпрд╛рд╣рд░реВ рд╕рдорд╛рдзрд╛рди рдЧрд░реНрди рдЪрд╛рд╣рдиреНрдЫреМрдВ:

  • рдЦрд╛рддрд╛ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрди рдПрдХ рдХреНрд▓рд┐рдХ - рдХреБрдиреИ рдлреЛрди рд╡рд╛ рдЗрдореЗрд▓ рдЫреИрди, рдареЗрдЧрд╛рдирд╛ рдкреБрд╕реНрддрд┐рдХрд╛ рд╡рд╛ рднреМрдЧреЛрд▓рд┐рдХ рд╕реНрдерд╛рдирд╣рд░реВрдорд╛ рдкрд╣реБрдБрдЪ рдЫреИрдиред
  • рд╡рд╛рд░реНрддрд╛рдХрд╛рд░рд╣рд░реВрд▓реЗ рдХрд╣рд┐рд▓реНрдпреИ рдкреНрд░рддреНрдпрдХреНрд╖ рдЬрдбрд╛рдирд╣рд░реВ рд╕реНрдерд╛рдкрдирд╛ рдЧрд░реНрджреИрдирдиреН; рд╕рдмреИ рд╕рдЮреНрдЪрд╛рд░ рдиреЛрдбрд╣рд░реВрдХреЛ рд╡рд┐рддрд░рд┐рдд рдкреНрд░рдгрд╛рд▓реА рдорд╛рд░реНрдлрдд рд╣реБрдиреНрдЫред рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛рд╣рд░реВрдХреЛ IP рдареЗрдЧрд╛рдирд╛рд╣рд░реВ рдПрдХрдЕрд░реНрдХрд╛рдорд╛ рдкрд╣реБрдБрдЪрдпреЛрдЧреНрдп рдЫреИрдирдиреНред
  • рд╕рдмреИ рд╕рдиреНрджреЗрд╢рд╣рд░реВ Encrypted End-to-End curve25519xsalsa20poly1305 рдЫрдиреНред рдпрд╕реНрддреЛ рджреЗрдЦрд┐рдиреНрдЫ рдХрд┐ рдпрд╕рд▓реЗ рдХрд╕реИрд▓рд╛рдИ рдЖрд╢реНрдЪрд░реНрдпрдЪрдХрд┐рдд рдЧрд░реНрджреИрди, рддрд░ рд╣рд╛рдореНрд░реЛ рд╕реНрд░реЛрдд рдХреЛрдб рдЦреБрд▓рд╛ рдЫред
  • MITM рдЖрдХреНрд░рдордгрд▓рд╛рдИ рдмрд╣рд┐рд╖реНрдХреГрдд рдЧрд░рд┐рдПрдХреЛ рдЫ - рдкреНрд░рддреНрдпреЗрдХ рд╕рдиреНрджреЗрд╢ рдПрдХ рд▓реЗрдирджреЗрди рд╣реЛ рд░ Ed25519 EdDSA рджреНрд╡рд╛рд░рд╛ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдЧрд░рд┐рдПрдХреЛ рдЫред
  • рд╕рдиреНрджреЗрд╢ рдЖрдлреНрдиреИ рдмреНрд▓рдХрдорд╛ рд╕рдорд╛рдкреНрдд рд╣реБрдиреНрдЫред рдПрдХрд░реВрдкрддрд╛ рд░ timestamp рддрдкрд╛рдИрдВрд▓реЗ рдмреНрд▓рдХрд╣рд░реВ рдареАрдХ рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрди, рд░ рддреНрдпрд╕реИрд▓реЗ рд╕рдиреНрджреЗрд╢рд╣рд░реВрдХреЛ рдХреНрд░рдоред
  • "рдореИрд▓реЗ рддреНрдпреЛ рднрдиреЗрдХреЛ рд╣реЛрдЗрди" рдмреНрд▓рдХрдЪреЗрдирдорд╛ рд╕рдиреНрджреЗрд╢рд╣рд░реВрд╕рдБрдЧ рдХрд╛рдо рдЧрд░реНрджреИрдиред
  • рддреНрдпрд╣рд╛рдБ рдХреБрдиреИ рдХреЗрдиреНрджреНрд░реАрдп рд╕рдВрд░рдЪрдирд╛ рдЫреИрди рдЬрд╕рд▓реЗ рд╕рдиреНрджреЗрд╢рдХреЛ "рдкреНрд░рд╛рдорд╛рдгрд┐рдХрддрд╛" рдЬрд╛рдБрдЪ рдЧрд░реНрдЫред рдпреЛ рд╕рд╣рдорддрд┐рдорд╛ рдЖрдзрд╛рд░рд┐рдд рдиреЛрдбрд╣рд░реВрдХреЛ рд╡рд┐рддрд░рдг рдкреНрд░рдгрд╛рд▓реАрджреНрд╡рд╛рд░рд╛ рдЧрд░рд┐рдиреНрдЫ, рд░ рдпреЛ рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛рд╣рд░реВрдХреЛ рд╕реНрд╡рд╛рдорд┐рддреНрд╡рдорд╛ рд╣реБрдиреНрдЫред
  • рд╕реЗрдиреНрд╕рд░рд╢рд┐рдкрдХреЛ рдЕрд╕рдореНрднрд╡рддрд╛ - рдЦрд╛рддрд╛рд╣рд░реВ рдмреНрд▓рдХ рдЧрд░реНрди рд╕рдХрд┐рдБрджреИрди рд░ рд╕рдиреНрджреЗрд╢рд╣рд░реВ рдореЗрдЯрд╛рдЙрди рд╕рдХрд┐рдБрджреИрдиред
  • Blockchain 2FA рдПрд╕рдПрдордПрд╕ рдорд╛рд░реНрдлрдд рдирд░рдХ 2FA рдХреЛ рдПрдХ рд╡рд┐рдХрд▓реНрдк рд╣реЛ, рдзреЗрд░реИ рд╕реНрд╡рд╛рд╕реНрдереНрдп рдмрд┐рдЧрд╛рд░реНрдпреЛред
  • рдХреБрдиреИ рдкрдирд┐ рд╕рдордпрдорд╛ рдХреБрдиреИ рдкрдирд┐ рдЙрдкрдХрд░рдгрдмрд╛рдЯ рддрдкрд╛рдЗрдБрдХрд╛ рд╕рдмреИ рдХреБрд░рд╛рдХрд╛рдиреАрд╣рд░реВ рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрдиреЗ рдХреНрд╖рдорддрд╛рдХреЛ рдорддрд▓рдм рддрдкрд╛рдЗрдБрд▓реЗ рд╕реНрдерд╛рдиреАрдп рд░реВрдкрдорд╛ рдХреБрд░рд╛рдХрд╛рдиреАрд╣рд░реВ рднрдгреНрдбрд╛рд░рдг рдЧрд░реНрдиреБрдкрд░реНрджреИрдиред
  • рд╕рдиреНрджреЗрд╢ рд╡рд┐рддрд░рдгрдХреЛ рдкреБрд╖реНрдЯрд┐ред рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛рдХреЛ рдЙрдкрдХрд░рдгрдорд╛ рд╣реЛрдЗрди, рддрд░ рдиреЗрдЯрд╡рд░реНрдХрдорд╛ред рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдкрдорд╛, рдпреЛ рддрдкрд╛рдИрдВрдХреЛ рд╕рдиреНрджреЗрд╢ рдкрдвреНрди рдкреНрд░рд╛рдкреНрддрдХрд░реНрддрд╛рдХреЛ рдХреНрд╖рдорддрд╛рдХреЛ рдкреБрд╖реНрдЯрд┐ рд╣реЛред рдпреЛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╕реВрдЪрдирд╛рд╣рд░реВ рдкрдард╛рдЙрдирдХреЛ рд▓рд╛рдЧрд┐ рдЙрдкрдпреЛрдЧреА рд╕реБрд╡рд┐рдзрд╛ рд╣реЛред

рдмреНрд▓рдХрдЪреЗрди рд▓рд╛рднрд╣рд░реВрдорд╛ рдХреНрд░рд┐рдкреНрдЯреЛрдХрд░рдиреНрд╕реАрд╣рд░реВ Ethereum, Dogecoin, Lisk, Dash, Bitcoin (рдпреЛ рдЕрдЭреИ рдкреНрд░рдЧрддрд┐рдорд╛ рдЫ) рд░ рдЪреНрдпрд╛рдЯрд╣рд░реВрдорд╛ рдЯреЛрдХрдирд╣рд░реВ рдкрдард╛рдЙрдиреЗ рдХреНрд╖рдорддрд╛рд╕рдБрдЧ рдирдЬрд┐рдХрдХреЛ рдПрдХреАрдХрд░рдг рдкрдирд┐ рд╕рдорд╛рд╡реЗрд╢ рдЫред рд╣рд╛рдореАрд▓реЗ рдмрд┐рд▓реНрдЯ-рдЗрди рдХреНрд░рд┐рдкреНрдЯреЛ рдПрдХреНрд╕рдЪреЗрдиреНрдЬрд░ рдкрдирд┐ рдмрдирд╛рдпреМрдВред

рд░ рддреНрдпрд╕рдкрдЫрд┐ - рдпреЛ рд╕рдмреИ рдХрд╕рд░реА рдХрд╛рдо рдЧрд░реНрджрдЫред

рд╕рдиреНрджреЗрд╢ рднрдиреЗрдХреЛ рд▓реЗрдирджреЗрди рд╣реЛ

рд╕рдмреИрдЬрдирд╛ рдкрд╣рд┐рд▓реЗ рдиреИ рдпрд╕ рддрдереНрдпрдорд╛ рдЕрднреНрдпрд╕реНрдд рдЫрдиреН рдХрд┐ рдмреНрд▓рдХрдЪреЗрдирдорд╛ рд▓реЗрдирджреЗрди рдЯреЛрдХрдирд╣рд░реВ (рд╕рд┐рдХреНрдХрд╛) рдПрдХ рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛рдмрд╛рдЯ рдЕрд░реНрдХреЛрдорд╛ред 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 рд╣реНрдпрд╛рд╕рдХреЛ рдЕрдВрд╢ рд╣реЛред

рдЙрджрд╛рд╣рд░рдг рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди:

рез - рд╕рдиреНрджреЗрд╢ рд╕рд╣рд┐рдд рдбрд╛рдЯрд╛ рдмреНрд▓рдХ рдмрдирд╛рдЙрдиреБрд╣реЛрд╕реН

/**
 * 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)
}

реи - рдбрд╛рдЯрд╛ рдмреНрд▓рдХрдмрд╛рдЯ SHA-2 рдЧрдгрдирд╛ рдЧрд░реНрдиреБрд╣реЛрд╕реН

/**
 * 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'

рдЬрд╡рд╛рдлрдорд╛ рд╣рд╛рдореАрд▓реЗ рдкреНрд░рдХрд╛рд░рдХреЛ рд▓реЗрдирджреЗрди 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 - Key-Value Storage - рдпреЛ рдЕрд░реНрдХреЛ рдкреНрд░рдХрд╛рд░рдХреЛ рд▓реЗрдирджреЗрди рд╣реЛ рдЬрд╕рдорд╛ asset рдпреЛ рдПрдиреНрдХреНрд░рд┐рдкреНрдЯреЗрдб NaCl-рдмрдХреНрд╕ рд╣реЛрдЗрди, рддрд░ NaCl-рд╕реЗрдХреНрд░реЗрдЯрдмрдХреНрд╕ред рдпрд╕рд░реА рдореЗрд╕реЗрдиреНрдЬрд░рд▓реЗ рдЕрдиреНрдп рдбрд╛рдЯрд╛ рднрдгреНрдбрд╛рд░рдг рдЧрд░реНрдЫред

рдлрд╛рдЗрд▓/рдЫрд╡рд┐ рд╕реНрдерд╛рдирд╛рдиреНрддрд░рдг рд░ рд╕рдореВрд╣ рдЪреНрдпрд╛рдЯ рдЕрдЭреИ рдзреЗрд░реИ рдХрд╛рдо рдЖрд╡рд╢реНрдпрдХ рдЫред рдирд┐рд╕реНрд╕рдиреНрджреЗрд╣, blunder-and-blunder рдврд╛рдБрдЪрд╛рдорд╛ рдпреЛ рдЪрд╛рдБрдбреИ "рд╕реНрдХреНрд░реВ рдЕрдк" рд╣реБрди рд╕рдХреНрдЫ, рддрд░ рд╣рд╛рдореА рд╕рдорд╛рди рд╕реНрддрд░рдХреЛ рдЧреЛрдкрдиреАрдпрддрд╛ рдХрд╛рдпрдо рд░рд╛рдЦреНрди рдЪрд╛рд╣рдиреНрдЫреМрдВред

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

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

рд░ рд╢рдВрдХрд╛рдХреЛ рдХрд╛рд░рдгрд▓реЗ рдЧрд░реНрджрд╛ рдмреНрд▓рдХрдЪреЗрдирдорд╛ рдореЗрд╕реЗрдиреНрдЬрд░рд╣рд░реВ рдЖрдлреНрдиреЛ рд╕рдордп рднрдиреНрджрд╛ рдЕрдЧрд╛рдбрд┐ рдЫрдиреН - рдорд╛рдирд┐рд╕рд╣рд░реВ рдЖрдлреНрдиреЛ рдЦрд╛рддрд╛рдХреЛ рд▓рд╛рдЧрд┐ рдЬрд┐рдореНрдореЗрд╡рд╛рд░реА рд▓рд┐рди рддрдпрд╛рд░ рдЫреИрдирдиреН, рд╡реНрдпрдХреНрддрд┐рдЧрдд рдЬрд╛рдирдХрд╛рд░реАрдХреЛ рд╕реНрд╡рд╛рдорд┐рддреНрд╡ рдЕрдЭреИ рдкреНрд░рд╡реГрддрд┐ рд╣реЛрдЗрди, рд░ рдкреНрд░рд╡рд┐рдзрд┐рд▓реЗ рдмреНрд▓рдХрдЪреЗрдирдорд╛ рдЙрдЪреНрдЪ рдЧрддрд┐рд▓рд╛рдИ рдЕрдиреБрдорддрд┐ рджрд┐рдБрджреИрдиред рд╣рд╛рдореНрд░реЛ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЛ рдЕрдзрд┐рдХ рдкреНрд░рд╛рд╡рд┐рдзрд┐рдХ analogues рдЕрд░реНрдХреЛ рджреЗрдЦрд╛ рдкрд░реНрдиреЗрдЫред рддрд┐рдорд┐рд▓реЗ рджреЗрдЦреНрдиреЗ рдЫреМред

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

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдердкреНрди