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-3 рд░ 7 рдЧреНрд░рд╛рд╣рдХрдорд╛ рд╕реНрдерд╛рдиреАрдп рд░реВрдкрдорд╛ рдкреНрд░рджрд░реНрд╢рди рдЧрд░рд┐рдиреНрдЫ, рд░ рдЪрд░рдг 5-6 рд╣реЛрд╕реНрдЯрд╣рд░реВрдорд╛ рдкреНрд░рджрд░реНрд╢рди рдЧрд░рд┐рдиреНрдЫред
рд╕рдиреНрджреЗрд╢ рдЗрдиреНрдХреНрд░рд┐рдкреНрд╕рди
рд╕рдиреНрджреЗрд╢ рдкреНрд░реЗрд╖рдХрдХреЛ рдирд┐рдЬреА рдХреБрдЮреНрдЬреА рд░ рдкреНрд░рд╛рдкреНрддрдХрд░реНрддрд╛рдХреЛ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдХреБрдЮреНрдЬреАрд╕рдБрдЧ рдЗрдиреНрдХреНрд░рд┐рдкреНрдЯ рдЧрд░рд┐рдПрдХреЛ рдЫред рд╣рд╛рдореА рдиреЗрдЯрд╡рд░реНрдХрдмрд╛рдЯ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдХреБрдЮреНрдЬреА рд▓рд┐рдиреЗрдЫреМрдВ, рддрд░ рдпрд╕рдХреЛ рд▓рд╛рдЧрд┐, рдкреНрд░рд╛рдкрдХрдХреЛ рдЦрд╛рддрд╛ рдкреНрд░рд╛рд░рдореНрднрд┐рдХ рд╣реБрдиреБрдкрд░реНрдЫ, рддреНрдпреЛ рд╣реЛ, рдХрдореНрддрд┐рдорд╛ рдПрдЙрдЯрд╛ рд▓реЗрдирджреЗрди рдЫред рддрдкрд╛рдИрдВрд▓реЗ REST рдЕрдиреБрд░реЛрдз рдкреНрд░рдпреЛрдЧ рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ GET /api/accounts/getPublicKey?address={ADAMANT address}
, рд░ рдХреБрд░рд╛рдХрд╛рдиреАрд╣рд░реВ рд▓реЛрдб рдЧрд░реНрджрд╛, рдЕрдиреНрддрд░реНрд╡рд╛рд░реНрддрд╛рдХрд░реНрддрд╛рд╣рд░реВрдХреЛ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдХреБрдЮреНрдЬреАрд╣рд░реВ рдкрд╣рд┐рд▓реЗ рдиреИ рдЙрдкрд▓рдмреНрдз рд╣реБрдиреЗрдЫрдиреНред
рдореЗрд╕реЗрдиреНрдЬрд░рд▓реЗ curve25519xsalsa20poly1305 рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рд╕рдиреНрджреЗрд╢рд╣рд░реВ рдЗрдиреНрдХреНрд░рд┐рдкреНрдЯ рдЧрд░реНрджрдЫ
рдпрд╣рд╛рдБ 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 рд╕рдБрдЧ рдХрд╛рд░реЛрдмрд╛рд░ рд╣реНрдпрд╛рд╕ рдЧрд░реНрдЫреМрдВ рд░ рддреНрдпрд╕рдкрдЫрд┐ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдЧрд░реНрдЫреМрдВ 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 рдорд╛ рд╣реЗрд░реНрди рд╕рдХрд┐рдиреНрдЫ -
рдмреНрд▓рдХрдорд╛ рд╕рдиреНрджреЗрд╢ рд╕рд╣рд┐рддрдХреЛ рд▓реЗрдирджреЗрди рд╕рд╣рд┐рдд
рдпрджрд┐ рд╕рд╣рдорддрд┐ рдкреБрдЧреНрдпреЛ рднрдиреЗ, рд╣рд╛рдореНрд░реЛ рд╕рдиреНрджреЗрд╢рдХреЛ рд╕рд╛рде рд▓реЗрдирджреЗрди рдЕрдиреНрдп рд╡реИрдз рд▓реЗрдирджреЗрдирдХреЛ рд╕рд╛рде рдЕрд░реНрдХреЛ рдмреНрд▓рдХрдорд╛ рд╕рдорд╛рд╡реЗрд╢ рдЧрд░рд┐рдиреЗрдЫред
рдмреНрд▓рдХрд╣рд░реВрдХреЛ рдХрдбрд╛ рдЕрдиреБрдХреНрд░рдо рдЫ, рд░ рдкреНрд░рддреНрдпреЗрдХ рдкрдЫрд┐рдХреЛ рдмреНрд▓рдХрд╣рд░реВ рдЕрдШрд┐рд▓реНрд▓реЛ рдмреНрд▓рдХрд╣рд░реВрдХреЛ рд╣реНрдпрд╛рд╕рд╣рд░реВрдорд╛ рдЖрдзрд╛рд░рд┐рдд рдмрдирд╛рдЗрдиреНрдЫред
рдмрд┐рдиреНрджреБ рдпреЛ рд╣реЛ рдХрд┐ рд╣рд╛рдореНрд░реЛ рд╕рдиреНрджреЗрд╢ рдкрдирд┐ рдпрд╕ рдХреНрд░рдо рдорд╛ рд╕рдорд╛рд╡реЗрд╢ рдЫ рд░ "рдкреБрдирд░реНрд╡реНрдпрд╡рд╕реНрдерд┐рдд" рдЧрд░реНрди рд╕рдХрд┐рджреИрдиред рдпрджрд┐ рдзреЗрд░реИ рд╕рдиреНрджреЗрд╢рд╣рд░реВ рдмреНрд▓рдХрдорд╛ рдкрд░реНрдЫрдиреН рднрдиреЗ, рддрд┐рдиреАрд╣рд░реВрдХреЛ рдЕрд░реНрдбрд░ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдзрд╛рд░рдг рдЧрд░рд┐рдиреЗрдЫ 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-рдмрдХреНрд╕ рд╣реЛрдЗрди, рддрд░
рдлрд╛рдЗрд▓/рдЫрд╡рд┐ рд╕реНрдерд╛рдирд╛рдиреНрддрд░рдг рд░ рд╕рдореВрд╣ рдЪреНрдпрд╛рдЯ рдЕрдЭреИ рдзреЗрд░реИ рдХрд╛рдо рдЖрд╡рд╢реНрдпрдХ рдЫред рдирд┐рд╕реНрд╕рдиреНрджреЗрд╣, blunder-and-blunder рдврд╛рдБрдЪрд╛рдорд╛ рдпреЛ рдЪрд╛рдБрдбреИ "рд╕реНрдХреНрд░реВ рдЕрдк" рд╣реБрди рд╕рдХреНрдЫ, рддрд░ рд╣рд╛рдореА рд╕рдорд╛рди рд╕реНрддрд░рдХреЛ рдЧреЛрдкрдиреАрдпрддрд╛ рдХрд╛рдпрдо рд░рд╛рдЦреНрди рдЪрд╛рд╣рдиреНрдЫреМрдВред
рд╣реЛ, рддреНрдпрд╣рд╛рдБ рдЕрдЭреИ рдХрд╛рдо рдЧрд░реНрди рдмрд╛рдБрдХреА рдЫ - рдЖрджрд░реНрд╢ рд░реВрдкрдорд╛, рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЧреЛрдкрдиреАрдпрддрд╛рд▓реЗ рдорд╛рдиреНрдЫ рдХрд┐ рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛рд╣рд░реВ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдиреЗрдЯрд╡рд░реНрдХ рдиреЛрдбрд╣рд░реВрдорд╛ рдЬрдбрд╛рди рд╣реБрдиреЗрдЫреИрдирдиреН, рддрд░ рдЖрдлреНрдиреИ рдЙрдард╛рдЙрдиреЗрдЫрдиреНред рддрдкрд╛рдЗрдБрдХреЛ рд╡рд┐рдЪрд╛рд░рдорд╛ рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛рд╣рд░реВрдХреЛ рдХрддрд┐ рдкреНрд░рддрд┐рд╢рдд рдпреЛ рдЧрд░реНрдЫ? рддреНрдпреЛ рд╕рд╣рд┐ рд╣реЛ, реж. рд╣рд╛рдореАрд▓реЗ рдореЗрд╕реЗрдиреНрдЬрд░рдХреЛ рдЯреЛрд░ рд╕рдВрд╕реНрдХрд░рдгрдХреЛ рд╕рд╛рде рдЖрдВрд╢рд┐рдХ рд░реВрдкрдорд╛ рдпреЛ рд╕рдорд╕реНрдпрд╛ рд╕рдорд╛рдзрд╛рди рдЧрд░реНрди рд╕рдХреНрд╖рдо рднрдпреМрдВред
рд╣рд╛рдореАрд▓реЗ рдкреНрд░рдорд╛рдгрд┐рдд рдЧрд░реЗрдХрд╛ рдЫреМрдВ рдХрд┐ рдмреНрд▓рдХрдЪреЗрдирдорд╛ рдореЗрд╕реЗрдиреНрдЬрд░ рдЕрд╡рд╕реНрдерд┐рдд рд╣реБрди рд╕рдХреНрдЫред рдкрд╣рд┐рд▓реЗ, 2012 рдорд╛ рдПрдХ рдорд╛рддреНрд░ рдкреНрд░рдпрд╛рд╕ рдерд┐рдпреЛ -
рд░ рд╢рдВрдХрд╛рдХреЛ рдХрд╛рд░рдгрд▓реЗ рдЧрд░реНрджрд╛ рдмреНрд▓рдХрдЪреЗрдирдорд╛ рдореЗрд╕реЗрдиреНрдЬрд░рд╣рд░реВ рдЖрдлреНрдиреЛ рд╕рдордп рднрдиреНрджрд╛ рдЕрдЧрд╛рдбрд┐ рдЫрдиреН - рдорд╛рдирд┐рд╕рд╣рд░реВ рдЖрдлреНрдиреЛ рдЦрд╛рддрд╛рдХреЛ рд▓рд╛рдЧрд┐ рдЬрд┐рдореНрдореЗрд╡рд╛рд░реА рд▓рд┐рди рддрдпрд╛рд░ рдЫреИрдирдиреН, рд╡реНрдпрдХреНрддрд┐рдЧрдд рдЬрд╛рдирдХрд╛рд░реАрдХреЛ рд╕реНрд╡рд╛рдорд┐рддреНрд╡ рдЕрдЭреИ рдкреНрд░рд╡реГрддрд┐ рд╣реЛрдЗрди, рд░ рдкреНрд░рд╡рд┐рдзрд┐рд▓реЗ рдмреНрд▓рдХрдЪреЗрдирдорд╛ рдЙрдЪреНрдЪ рдЧрддрд┐рд▓рд╛рдИ рдЕрдиреБрдорддрд┐ рджрд┐рдБрджреИрдиред рд╣рд╛рдореНрд░реЛ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЛ рдЕрдзрд┐рдХ рдкреНрд░рд╛рд╡рд┐рдзрд┐рдХ analogues рдЕрд░реНрдХреЛ рджреЗрдЦрд╛ рдкрд░реНрдиреЗрдЫред рддрд┐рдорд┐рд▓реЗ рджреЗрдЦреНрдиреЗ рдЫреМред
рд╕реНрд░реЛрдд: www.habr.com