ΠΠ° ΠΏΠΎΡΠ΅ΡΠΎΠΊΠΎΡ Π½Π° 2017 Π³ΠΎΠ΄ΠΈΠ½Π°, ΠΏΠΎΡΠ½Π°Π²ΠΌΠ΅ Π΄Π° ΡΠΎΠ·Π΄Π°Π²Π°ΠΌΠ΅ Π³Π»Π°ΡΠ½ΠΈΠΊ Π½Π° Π±Π»ΠΎΠΊΡΠ΅ΡΠ½ [ΠΈΠΌΠ΅ΡΠΎ ΠΈ Π²ΡΡΠΊΠ°ΡΠ° ΡΠ΅ Π²ΠΎ ΠΏΡΠΎΡΠΈΠ»ΠΎΡ] ΡΠΎ Π΄ΠΈΡΠΊΡΡΠΈΡΠ°ΡΠ΅ Π·Π° ΠΏΡΠ΅Π΄Π½ΠΎΡΡΠΈΡΠ΅ Π²ΠΎ ΠΎΠ΄Π½ΠΎΡ Π½Π° ΠΊΠ»Π°ΡΠΈΡΠ½ΠΈΡΠ΅ P2P Π³Π»Π°ΡΠ½ΠΈΡΠΈ.
ΠΠΎΠΌΠΈΠ½Π° 2.5
Π³ΠΎΠ΄ΠΈΠ½Π°, ΠΈ ΠΌΠΎΠΆΠ΅Π²ΠΌΠ΅ Π΄Π° Π³ΠΎ ΠΏΠΎΡΠ²ΡΠ΄ΠΈΠΌΠ΅ Π½Π°ΡΠΈΠΎΡ ΠΊΠΎΠ½ΡΠ΅ΠΏΡ: Π°ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΠΈΡΠ΅ Π·Π° ΠΌΠ΅ΡΠΈΠ½ΡΠ΅Ρ ΡΠ΅Π³Π° ΡΠ΅ Π΄ΠΎΡΡΠ°ΠΏΠ½ΠΈ Π·Π° iOS, Web PWA, Windows, GNU/Linux, Mac OS ΠΈ Android.
ΠΠ΅Π½Π΅Ρ ΡΠ΅ Π²ΠΈ ΠΊΠ°ΠΆΠ΅ΠΌΠ΅ ΠΊΠ°ΠΊΠΎ ΡΡΠ½ΠΊΡΠΈΠΎΠ½ΠΈΡΠ° Π±Π»ΠΎΠΊΡΠ΅ΡΠ½-ΠΌΠ΅ΡΠΈΠ½ΡΠ΅ΡΠΎΡ ΠΈ ΠΊΠ°ΠΊΠΎ ΠΊΠ»ΠΈΠ΅Π½ΡΡΠΊΠΈΡΠ΅ Π°ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΠΈ ΠΌΠΎΠΆΠ°Ρ Π΄Π° ΡΠ°Π±ΠΎΡΠ°Ρ ΡΠΎ Π½Π΅Π³ΠΎΠ²ΠΈΠΎΡ API.
Π‘Π°ΠΊΠ°Π²ΠΌΠ΅ Π±Π»ΠΎΠΊΡΠ΅ΡΠ½ΠΎΡ Π΄Π° Π³ΠΈ ΡΠ΅ΡΠΈ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΈΡΠ΅ ΡΠΎ Π±Π΅Π·Π±Π΅Π΄Π½ΠΎΡΡΠ° ΠΈ ΠΏΡΠΈΠ²Π°ΡΠ½ΠΎΡΡΠ° Π½Π° ΠΊΠ»Π°ΡΠΈΡΠ½ΠΈΡΠ΅ P2P Π³Π»Π°ΡΠ½ΠΈΡΠΈ:
- ΠΠ΄Π΅Π½ ΠΊΠ»ΠΈΠΊ Π·Π° Π΄Π° ΠΊΡΠ΅ΠΈΡΠ°ΡΠ΅ ΡΠΌΠ΅ΡΠΊΠ° - Π½Π΅ΠΌΠ° ΡΠ΅Π»Π΅ΡΠΎΠ½ΠΈ ΠΈΠ»ΠΈ Π΅-ΠΏΠΎΡΡΠ°, Π½Π΅ΠΌΠ° ΠΏΡΠΈΡΡΠ°ΠΏ Π΄ΠΎ Π°Π΄ΡΠ΅ΡΠ°ΡΠΈ ΠΈΠ»ΠΈ Π³Π΅ΠΎΠ»ΠΎΠΊΠ°ΡΠΈΠΈ.
- Π‘ΠΎΠ³ΠΎΠ²ΠΎΡΠ½ΠΈΡΠΈΡΠ΅ Π½ΠΈΠΊΠΎΠ³Π°Ρ Π½Π΅ Π²ΠΎΡΠΏΠΎΡΡΠ°Π²ΡΠ²Π°Π°Ρ Π΄ΠΈΡΠ΅ΠΊΡΠ½ΠΈ Π²ΡΡΠΊΠΈ, ΡΠ΅Π»Π°ΡΠ° ΠΊΠΎΠΌΡΠ½ΠΈΠΊΠ°ΡΠΈΡΠ° ΡΠ΅ ΠΎΠ΄Π²ΠΈΠ²Π° ΠΏΡΠ΅ΠΊΡ Π΄ΠΈΡΡΡΠΈΠ±ΡΠΈΡΠ°Π½ ΡΠΈΡΡΠ΅ΠΌ Π½Π° ΡΠ°Π·Π»ΠΈ. IP-Π°Π΄ΡΠ΅ΡΠΈΡΠ΅ Π½Π° ΠΊΠΎΡΠΈΡΠ½ΠΈΡΠΈΡΠ΅ Π½Π΅ ΡΠ΅ Π΄ΠΎΡΡΠ°ΠΏΠ½ΠΈ Π΅Π΄Π½ΠΈ Π·Π° Π΄ΡΡΠ³ΠΈ.
- Π‘ΠΈΡΠ΅ ΠΏΠΎΡΠ°ΠΊΠΈ ΡΠ΅ ΡΠΈΡΡΠΈΡΠ°Π½ΠΈ ΠΎΠ΄ ΠΊΡΠ°Ρ Π΄ΠΎ ΠΊΡΠ°Ρ curve25519xsalsa20poly1305. Π‘Π΅ ΡΠΈΠ½ΠΈ Π΄Π΅ΠΊΠ° ΠΎΠ²Π° Π½Π΅ΠΌΠ° Π΄Π° ΠΈΠ·Π½Π΅Π½Π°Π΄ΠΈ Π½ΠΈΠΊΠΎΠ³ΠΎ, Π½ΠΎ Π½Π°ΡΠΈΠΎΡ ΠΈΠ·Π²ΠΎΡΠ΅Π½ ΠΊΠΎΠ΄ Π΅ ΠΎΡΠ²ΠΎΡΠ΅Π½.
- MITM Π½Π°ΠΏΠ°Π΄ΠΎΡ Π΅ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ - ΡΠ΅ΠΊΠΎΡΠ° ΠΏΠΎΡΠ°ΠΊΠ° Π΅ ΡΡΠ°Π½ΡΠ°ΠΊΡΠΈΡΠ° ΠΈ Π΅ ΠΏΠΎΡΠΏΠΈΡΠ°Π½Π° ΠΎΠ΄ Ed25519 EdDSA.
- ΠΠΎΡΠ°ΠΊΠ°ΡΠ° Π·Π°Π²ΡΡΡΠ²Π° Π²ΠΎ ΡΠΎΠΏΡΡΠ²Π΅Π½ Π±Π»ΠΎΠΊ. ΠΠΎΠ½Π·ΠΈΡΡΠ΅Π½ΡΠ½ΠΎΡΡ ΠΈ
timestamp
ΠΠ΅ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π³ΠΈ ΠΏΠΎΠΏΡΠ°Π²ΠΈΡΠ΅ Π±Π»ΠΎΠΊΠΎΠ²ΠΈΡΠ΅, Π° ΡΠΎ ΡΠΎΠ° ΠΈ ΡΠ΅Π΄ΠΎΡΠ»Π΅Π΄ΠΎΡ Π½Π° ΠΏΠΎΡΠ°ΠΊΠΈΡΠ΅. - βΠΠ΅ Π³ΠΎ ΡΠ΅ΠΊΠΎΠ² ΡΠΎΠ°β Π½Π΅ΠΌΠ° Π΄Π° ΡΠ°Π±ΠΎΡΠΈ ΡΠΎ ΠΏΠΎΡΠ°ΠΊΠΈ Π½Π° Π±Π»ΠΎΠΊΡΠ΅ΡΠ½.
- ΠΠ΅ ΠΏΠΎΡΡΠΎΠΈ ΡΠ΅Π½ΡΡΠ°Π»Π½Π° ΡΡΡΡΠΊΡΡΡΠ° ΡΡΠΎ ΡΠ° ΠΏΡΠΎΠ²Π΅ΡΡΠ²Π° βΠ°Π²ΡΠ΅Π½ΡΠΈΡΠ½ΠΎΡΡΠ°β Π½Π° ΠΏΠΎΡΠ°ΠΊΠ°ΡΠ°. ΠΠ²Π° Π³ΠΎ ΠΏΡΠ°Π²ΠΈ Π΄ΠΈΡΡΡΠΈΠ±ΡΠΈΡΠ°Π½ ΡΠΈΡΡΠ΅ΠΌ Π½Π° ΡΠ°Π·Π»ΠΈ Π·Π°ΡΠ½ΠΎΠ²Π°Π½ Π½Π° ΠΊΠΎΠ½ΡΠ΅Π½Π·ΡΡ ΠΈ Π΅ Π²ΠΎ ΡΠΎΠΏΡΡΠ²Π΅Π½ΠΎΡΡ Π½Π° ΠΊΠΎΡΠΈΡΠ½ΠΈΡΠΈΡΠ΅.
- ΠΠ΅ΠΌΠΎΠΆΠ½ΠΎΡΡ Π·Π° ΡΠ΅Π½Π·ΡΡΠ° - ΡΠΌΠ΅ΡΠΊΠΈΡΠ΅ Π½Π΅ ΠΌΠΎΠΆΠ°Ρ Π΄Π° ΡΠ΅ Π±Π»ΠΎΠΊΠΈΡΠ°Π°Ρ ΠΈ ΠΏΠΎΡΠ°ΠΊΠΈΡΠ΅ Π½Π΅ ΠΌΠΎΠΆΠ°Ρ Π΄Π° ΡΠ΅ ΠΈΠ·Π±ΡΠΈΡΠ°Ρ.
- Blockchain 2FA Π΅ Π°Π»ΡΠ΅ΡΠ½Π°ΡΠΈΠ²Π° Π½Π° ΠΏΠ΅ΠΊΠΎΠ»Π½ΠΈΠΎΡ 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
, Π° ID Π½Π° ΡΡΠ°Π½ΡΠ°ΠΊΡΠΈΡΠ°ΡΠ° Π΅ Π΄Π΅Π» ΠΎΠ΄ Ρ
Π°ΡΠΎΡ SHA-256.
ΠΡΠΈΠΌΠ΅Ρ Π·Π° ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½ΡΠ°ΡΠΈΡΠ°:
1 β Π€ΠΎΡΠΌΠΈΡΠ°ΡΡΠ΅ Π±Π»ΠΎΠΊ Π½Π° ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ, Π²ΠΊΠ»ΡΡΠΈΡΠ΅Π»Π½ΠΎ ΠΈ ΠΏΠΎΡΠ°ΠΊΠ°
/**
* Calls `getBytes` based on transaction type
* @see privateTypes
* @implements {ByteBuffer}
* @param {transaction} trs
* @param {boolean} skipSignature
* @param {boolean} skipSecondSignature
* @return {!Array} Contents as an ArrayBuffer.
* @throws {error} If buffer fails.
*/
adamant.getBytes = function (transaction) {
...
switch (transaction.type) {
case constants.Transactions.SEND:
break
case constants.Transactions.CHAT_MESSAGE:
assetBytes = this.chatGetBytes(transaction)
assetSize = assetBytes.length
break
β¦
default:
alert('Not supported yet')
}
var bb = new ByteBuffer(1 + 4 + 32 + 8 + 8 + 64 + 64 + assetSize, true)
bb.writeByte(transaction.type)
bb.writeInt(transaction.timestamp)
...
bb.flip()
var arrayBuffer = new Uint8Array(bb.toArrayBuffer())
var buffer = []
for (var i = 0; i < arrayBuffer.length; i++) {
buffer[i] = arrayBuffer[i]
}
return Buffer.from(buffer)
}
2 - ΠΠ°Π±ΡΠΎΡ SHA-256 ΠΎΠ΄ ΠΏΠΎΠ΄Π°ΡΠΎΡΠ½ΠΈΠΎΡ Π±Π»ΠΎΠΊ
/**
* Creates hash based on transaction bytes.
* @implements {getBytes}
* @implements {crypto.createHash}
* @param {transaction} trs
* @return {hash} sha256 crypto hash
*/
adamant.getHash = function (trs) {
return crypto.createHash('sha256').update(this.getBytes(trs)).digest()
}
3 β ΠΠΎΡΠΏΠΈΡΠ΅ΡΠ΅ ΡΠ° ΡΡΠ°Π½ΡΠ°ΠΊΡΠΈΡΠ°ΡΠ°
adamant.transactionSign = function (trs, keypair) {
var hash = this.getHash(trs)
return this.sign(hash, keypair).toString('hex')
}
/**
* Creates a signature based on a hash and a keypair.
* @implements {sodium}
* @param {hash} hash
* @param {keypair} keypair
* @return {signature} signature
*/
adamant.sign = function (hash, keypair) {
return sodium.crypto_sign_detached(hash, Buffer.from(keypair.privateKey, 'hex'))
}
ΠΡΠΏΡΠ°ΡΠ°ΡΠ΅ ΡΡΠ°Π½ΡΠ°ΠΊΡΠΈΡΠ° ΡΠΎ ΠΏΠΎΡΠ°ΠΊΠ° Π΄ΠΎ ΠΌΡΠ΅ΠΆΠ΅Π½ ΡΠ°Π·ΠΎΠ»
ΠΠΈΠ΄Π΅ΡΡΠΈ ΠΌΡΠ΅ΠΆΠ°ΡΠ° Π΅ Π΄Π΅ΡΠ΅Π½ΡΡΠ°Π»ΠΈΠ·ΠΈΡΠ°Π½Π°, ΡΠ΅ΠΊΠΎΡ ΠΎΠ΄ ΡΠ°Π·Π»ΠΈΡΠ΅ ΡΠΎ ΠΎΡΠ²ΠΎΡΠ΅Π½ API ΡΠ΅ Π³ΠΎ ΡΡΠΎΡΠΈ ΡΠΎΠ°. ΠΡΠ°Π²Π΅ΡΠ΅ POST Π±Π°ΡΠ°ΡΠ΅ Π΄ΠΎ ΠΊΡΠ°ΡΠ½Π°ΡΠ° ΡΠΎΡΠΊΠ° api/transactions
:
curl 'api/transactions' -X POST
-d 'TX_DATA'
ΠΠ°ΠΊΠΎ ΠΎΠ΄Π³ΠΎΠ²ΠΎΡ ΡΠ΅ Π΄ΠΎΠ±ΠΈΠ΅ΠΌΠ΅ 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β ΠΎΠ²Π° ΠΌΠΎΠΆΠ΅ Π±ΡΠ·ΠΎ Π΄Π° ΡΠ΅ βΠ·Π°ΡΡΠ»ΠΈβ, Π½ΠΎ Π½ΠΈΠ΅ ΡΠ°ΠΊΠ°ΠΌΠ΅ Π΄Π° Π³ΠΎ Π·Π°Π΄ΡΠΆΠΈΠΌΠ΅ ΠΈΡΡΠΎΡΠΎ Π½ΠΈΠ²ΠΎ Π½Π° ΠΏΡΠΈΠ²Π°ΡΠ½ΠΎΡΡ.
ΠΠ°, ΠΈΠΌΠ° ΡΡΡΠ΅ ΡΠ°Π±ΠΎΡΠ° ΡΡΠΎ ΡΡΠ΅Π±Π° Π΄Π° ΡΠ΅ Π½Π°ΠΏΡΠ°Π²ΠΈ - ΠΈΠ΄Π΅Π°Π»Π½ΠΎ, Π²ΠΈΡΡΠΈΠ½ΡΠΊΠ°ΡΠ° ΠΏΡΠΈΠ²Π°ΡΠ½ΠΎΡΡ ΠΏΡΠ΅ΡΠΏΠΎΡΡΠ°Π²ΡΠ²Π° Π΄Π΅ΠΊΠ° ΠΊΠΎΡΠΈΡΠ½ΠΈΡΠΈΡΠ΅ Π½Π΅ΠΌΠ° Π΄Π° ΡΠ΅ ΠΏΠΎΠ²ΡΠ·Π°Ρ ΡΠΎ ΡΠ°Π·Π»ΠΈΡΠ΅ Π½Π° ΡΠ°Π²Π½ΠΈΡΠ΅ ΠΌΡΠ΅ΠΆΠΈ, ΡΡΠΊΡ ΡΠ΅ Π³ΠΈ ΠΏΠΎΠ΄ΠΈΠ³Π½Π°Ρ ΡΠ²ΠΎΠΈΡΠ΅. ΠΠΎΠ»ΠΊΠ°Π² ΠΏΡΠΎΡΠ΅Π½Ρ ΠΎΠ΄ ΠΊΠΎΡΠΈΡΠ½ΠΈΡΠΈΡΠ΅ ΠΌΠΈΡΠ»ΠΈΡΠ΅ Π΄Π΅ΠΊΠ° Π³ΠΎ ΠΏΡΠ°Π²Π°Ρ ΠΎΠ²Π°? Π’Π°ΠΊΠ° Π΅, 0. Π£ΡΠΏΠ΅Π°Π²ΠΌΠ΅ Π΄Π΅Π»ΡΠΌΠ½ΠΎ Π΄Π° Π³ΠΎ ΡΠ΅ΡΠΈΠΌΠ΅ ΠΎΠ²ΠΎΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌ ΡΠΎ Tor Π²Π΅ΡΠ·ΠΈΡΠ°ΡΠ° Π½Π° Π³Π»Π°ΡΠ½ΠΈΠΊΠΎΡ.
ΠΠΎΠΊΠ°ΠΆΠ°Π²ΠΌΠ΅ Π΄Π΅ΠΊΠ° Π³Π»Π°ΡΠ½ΠΈΠΊ Π½Π° Π±Π»ΠΎΠΊΡΠ΅ΡΠ½ ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΏΠΎΡΡΠΎΠΈ. ΠΡΠ΅ΡΡ
ΠΎΠ΄Π½ΠΎ ΠΈΠΌΠ°ΡΠ΅ ΡΠ°ΠΌΠΎ Π΅Π΄Π΅Π½ ΠΎΠ±ΠΈΠ΄ Π²ΠΎ 2012 Π³ΠΎΠ΄ΠΈΠ½Π° -
Π ΡΠΊΠ΅ΠΏΡΠΈΡΠΈΠ·ΠΌΠΎΡ ΡΠ΅ Π΄ΠΎΠ»ΠΆΠΈ Π½Π° ΡΠ°ΠΊΡΠΎΡ Π΄Π΅ΠΊΠ° Π³Π»Π°ΡΠ½ΠΈΡΠΈΡΠ΅ Π½Π° Π±Π»ΠΎΠΊΡΠ΅ΡΠ½ΠΎΡ ΡΠ΅ ΠΏΡΠ΅Π΄ ΡΠ²ΠΎΠ΅ΡΠΎ Π²ΡΠ΅ΠΌΠ΅ - Π»ΡΡΠ΅ΡΠΎ Π½Π΅ ΡΠ΅ ΠΏΠΎΠ΄Π³ΠΎΡΠ²Π΅Π½ΠΈ Π΄Π° ΠΏΡΠ΅Π·Π΅ΠΌΠ°Ρ ΠΎΠ΄Π³ΠΎΠ²ΠΎΡΠ½ΠΎΡΡ Π·Π° Π½ΠΈΠ²Π½Π°ΡΠ° ΡΠΌΠ΅ΡΠΊΠ°, ΠΏΠΎΡΠ΅Π΄ΡΠ²Π°ΡΠ΅ΡΠΎ Π»ΠΈΡΠ½ΠΈ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ ΡΓ¨ ΡΡΡΠ΅ Π½Π΅ Π΅ ΡΡΠ΅Π½Π΄, Π° ΡΠ΅Ρ
Π½ΠΎΠ»ΠΎΠ³ΠΈΡΠ°ΡΠ° Π½Π΅ Π΄ΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° Π³ΠΎΠ»Π΅ΠΌΠΈ Π±ΡΠ·ΠΈΠ½ΠΈ Π½Π° Π±Π»ΠΎΠΊΡΠ΅ΡΠ½ΠΎΡ. Π‘Π»Π΅Π΄Π½ΠΎ ΡΠ΅ ΡΠ΅ ΠΏΠΎΡΠ°Π²Π°Ρ ΠΏΠΎΠ²Π΅ΡΠ΅ ΡΠ΅Ρ
Π½ΠΎΠ»ΠΎΡΠΊΠΈ Π°Π½Π°Π»ΠΎΠ·ΠΈ Π½Π° Π½Π°ΡΠΈΠΎΡ ΠΏΡΠΎΠ΅ΠΊΡ. ΠΠ΅ Π²ΠΈΠ΄ΠΈΡΠ΅.
ΠΠ·Π²ΠΎΡ: www.habr.com