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-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
, рдЖрдгрд┐ рд╡реНрдпрд╡рд╣рд╛рд░ рдЖрдпрдбреА 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 рд╡рд░ рдкрд╛рд╣рд┐рд▓рд╛ рдЬрд╛рдК рд╢рдХрддреЛ -
рдмреНрд▓реЙрдХрдордзреАрд▓ рд╕рдВрджреЗрд╢рд╛рд╕рд╣ рд╡реНрдпрд╡рд╣рд╛рд░рд╛рд╕рд╣
рдПрдХрдордд рдЭрд╛рд▓реНрдпрд╛рд╕, рдЖрдордЪреНрдпрд╛ рд╕рдВрджреЗрд╢рд╛рд╕рд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рдЗрддрд░ рд╡реИрдз рд╡реНрдпрд╡рд╣рд╛рд░рд╛рдВрд╕рд╣ рдкреБрдвреАрд▓ рдмреНрд▓реЙрдХрдордзреНрдпреЗ рд╕рдорд╛рд╡рд┐рд╖реНрдЯ рдХреЗрд▓рд╛ рдЬрд╛рдИрд▓.
рдмреНрд▓реЙрдХреНрд╕рдЪрд╛ рдХрдареЛрд░ рдХреНрд░рдо рдЕрд╕рддреЛ рдЖрдгрд┐ рдкреНрд░рддреНрдпреЗрдХ рдкреБрдвреАрд▓ рдмреНрд▓реЙрдХ рдорд╛рдЧреАрд▓ рдмреНрд▓реЙрдХреНрд╕рдЪреНрдпрд╛ рд╣реЕрд╢рдЪреНрдпрд╛ рдЖрдзрд╛рд░реЗ рддрдпрд╛рд░ рдХреЗрд▓рд╛ рдЬрд╛рддреЛ.
рдореБрджреНрджрд╛ рдЕрд╕рд╛ рдЖрд╣реЗ рдХреА рдЖрдордЪрд╛ рд╕рдВрджреЗрд╢ рджреЗрдЦреАрд▓ рдпрд╛ рдХреНрд░рдорд╛рдордзреНрдпреЗ рд╕рдорд╛рд╡рд┐рд╖реНрдЯ рдЖрд╣реЗ рдЖрдгрд┐ "рдкреБрдирд░реНрд░рдЪрдирд╛" рдХреЗрд▓рд╛ рдЬрд╛рдК рд╢рдХрдд рдирд╛рд╣реА. рдЬрд░ рдЕрдиреЗрдХ рд╕рдВрджреЗрд╢ рдмреНрд▓реЙрдХрдордзреНрдпреЗ рдЖрд▓реЗ рддрд░ рддреНрдпрд╛рдВрдЪрд╛ рдХреНрд░рдо рдирд┐рд╢реНрдЪрд┐рдд рдХреЗрд▓рд╛ рдЬрд╛рдИрд▓ 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-рдмреЙрдХреНрд╕ рдирд╛рд╣реА, рдкрд░рдВрддреБ
рдлрд╛рдЗрд▓/рдЗрдореЗрдЬ рдЯреНрд░рд╛рдиреНрд╕реНрдлрд░ рдЖрдгрд┐ рдЧреНрд░реБрдк рдЪреЕрдЯреНрд╕рд╕рд╛рдареА рдЕрдЬреВрдирд╣реА рдЦреВрдк рдХрд╛рдо рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ. рдЕрд░реНрдерд╛рдд, рдШреЛрдбрдЪреВрдХ рдЖрдгрд┐ рдШреЛрдбрдЪреВрдХ рд╕реНрд╡рд░реВрдкрд╛рдд рд╣реЗ рддреНрд╡рд░реАрдд "рд╕реНрдХреНрд░реВ рдЕрдк" рдХреЗрд▓реЗ рдЬрд╛рдК рд╢рдХрддреЗ, рдкрд░рдВрддреБ рдЖрдореНрд╣рд╛рд▓рд╛ рдЧреЛрдкрдиреАрдпрддреЗрдЪреА рд╕рдорд╛рди рдкрд╛рддрд│реА рд░рд╛рдЦрд╛рдпрдЪреА рдЖрд╣реЗ.
рд╣реЛрдп, рдЕрдЬреВрдирд╣реА рдХрд╛рдо рдХрд░рд╛рдпрдЪреЗ рдЖрд╣реЗ - рдЖрджрд░реНрд╢рдкрдгреЗ, рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЧреЛрдкрдиреАрдпрддрд╛ рдЕрд╕реЗ рдЧреГрд╣реАрдд рдзрд░рддреЗ рдХреА рд╡рд╛рдкрд░рдХрд░реНрддреЗ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдиреЗрдЯрд╡рд░реНрдХ рдиреЛрдбреНрд╕рд╢реА рдХрдиреЗрдХреНрдЯ рд╣реЛрдгрд╛рд░ рдирд╛рд╣реАрдд, рдкрд░рдВрддреБ рддреНрдпрд╛рдВрдЪреЗ рд╕реНрд╡рддрдГрдЪреЗ рд╡рд╛рдврд╡рддреАрд▓. рддреБрдордЪреНрдпрд╛ рдорддреЗ рдХрд┐рддреА рдЯрдХреНрдХреЗ рд╡рд╛рдкрд░рдХрд░реНрддреЗ рд╣реЗ рдХрд░рддрд╛рдд? рддреЗ рдмрд░реЛрдмрд░ рдЖрд╣реЗ, реж. рдЖрдореНрд╣реА рдореЗрд╕реЗрдВрдЬрд░рдЪреНрдпрд╛ рдЯреЛрд░ рдЖрд╡реГрддреНрддреАрд╕рд╣ рд╣реА рд╕рдорд╕реНрдпрд╛ рдЕрдВрд╢рддрдГ рд╕реЛрдбрд╡реВ рд╢рдХрд▓реЛ.
рдмреНрд▓реЙрдХрдЪреЗрдирд╡рд░ рдореЗрд╕реЗрдВрдЬрд░ рдЕрд╕реНрддрд┐рддреНрд╡рд╛рдд рдЕрд╕реВ рд╢рдХрддреЛ рд╣реЗ рдЖрдореНрд╣реА рд╕рд┐рджреНрдз рдХреЗрд▓реЗ рдЖрд╣реЗ. рдкреВрд░реНрд╡реА, 2012 рдордзреНрдпреЗ рдлрдХреНрдд рдПрдХрдЪ рдкреНрд░рдпрддреНрди рд╣реЛрддрд╛ -
рдЖрдгрд┐ рд╕рд╛рд╢рдВрдХрддрд╛ рдпрд╛ рд╡рд╕реНрддреБрд╕реНрдерд┐рддреАрдореБрд│реЗ рдЖрд╣реЗ рдХреА рдмреНрд▓реЙрдХрдЪреЗрдирд╡рд░реАрд▓ рд╕рдВрджреЗрд╢рд╡рд╛рд╣рдХ рддреНрдпрд╛рдВрдЪреНрдпрд╛ рд╡реЗрд│реЗрдЪреНрдпрд╛ рдкреБрдвреЗ рдЖрд╣реЗрдд - рд▓реЛрдХ рддреНрдпрд╛рдВрдЪреНрдпрд╛ рдЦрд╛рддреНрдпрд╛рдЪреА рдЬрдмрд╛рдмрджрд╛рд░реА рдШреЗрдгреНрдпрд╛рд╕ рддрдпрд╛рд░ рдирд╛рд╣реАрдд, рд╡реИрдпрдХреНрддрд┐рдХ рдорд╛рд╣рд┐рддреАрдЪреА рдорд╛рд▓рдХреА рдЕрджреНрдпрд╛рдк рдПрдХ рдЯреНрд░реЗрдВрдб рдирд╛рд╣реА рдЖрдгрд┐ рддрдВрддреНрд░рдЬреНрдЮрд╛рди рдмреНрд▓реЙрдХрдЪреЗрдирд╡рд░ рдЙрдЪреНрдЪ рдЧрддреАрд▓рд╛ рдкрд░рд╡рд╛рдирдЧреА рджреЗрдд тАЛтАЛтАЛтАЛрдирд╛рд╣реА. рдЖрдордЪреНрдпрд╛ рдкреНрд░рдХрд▓реНрдкрд╛рдЪреЗ рдЕрдзрд┐рдХ рддрд╛рдВрддреНрд░рд┐рдХ analogues рдкреБрдвреЗ рджрд┐рд╕рддреАрд▓. рддреБрдореНрд╣рд╛рд▓рд╛ рджрд┐рд╕реЗрд▓.
рд╕реНрддреНрд░реЛрдд: www.habr.com