Π Π½Π°ΡΠ°Π»Π΅ 2017 ΠΌΡ Π½Π°ΡΠ°Π»ΠΈ ΡΠΎΠ·Π΄Π°Π²Π°ΡΡ ΠΌΠ΅ΡΡΠ΅Π½Π΄ΠΆΠ΅Ρ Π½Π° Π±Π»ΠΎΠΊΡΠ΅ΠΉΠ½Π΅ [Π½Π°Π·Π²Π°Π½ΠΈΠ΅ ΠΈ ΡΡΡΠ»ΠΊΠ° Π΅ΡΡΡ Π² ΠΏΡΠΎΡΠΈΠ»Π΅] Ρ ΠΎΠ±ΡΡΠΆΠ΄Π΅Π½ΠΈΡ ΠΏΡΠ΅ΠΈΠΌΡΡΠ΅ΡΡΠ² ΠΏΠ΅ΡΠ΅Π΄ ΠΊΠ»Π°ΡΡΠΈΡΠ΅ΡΠΊΠΈΠΌΠΈ P2P-ΠΌΠ΅ΡΡΠ΅Π½Π΄ΠΆΠ΅ΡΠ°ΠΌΠΈ.
ΠΡΠΎΡΠ»ΠΎ 2.5
Π³ΠΎΠ΄Π°, ΠΈ Π½Π°ΠΌ ΡΠ΄Π°Π»ΠΎΡΡ ΠΏΠΎΠ΄ΡΠ²Π΅ΡΠ΄ΠΈΡΡ ΡΠ²ΠΎΠΉ ΠΊΠΎΠ½ΡΠ΅ΠΏΡ: ΡΠ΅ΠΉΡΠ°Ρ Π΄ΠΎΡΡΡΠΏΠ½Ρ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΠΌΠ΅ΡΡΠ΅Π½Π΄ΠΆΠ΅ΡΠ° Π΄Π»Ρ iOS, Web PWA, Windows, GNU/Linux, Mac OS ΠΈ Android.
Π‘Π΅Π³ΠΎΠ΄Π½Ρ ΠΌΡ ΡΠ°ΡΡΠΊΠ°ΠΆΠ΅ΠΌ, ΠΊΠ°ΠΊ ΡΡΡΡΠΎΠ΅Π½ ΠΌΠ΅ΡΡΠ΅Π½Π΄ΠΆΠ΅Ρ Π½Π° Π±Π»ΠΎΠΊΡΠ΅ΠΉΠ½Π΅ ΠΈ ΠΊΠ°ΠΊ ΠΊΠ»ΠΈΠ΅Π½ΡΡΠΊΠΈΠΌ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡΠΌ ΡΠ°Π±ΠΎΡΠ°ΡΡ Ρ Π΅Π³ΠΎ API.
ΠΡ Ρ
ΠΎΡΠ΅Π»ΠΈ, ΡΡΠΎΠ±Ρ Π±Π»ΠΎΠΊΡΠ΅ΠΉΠ½ ΡΠ΅ΡΠΈΠ» Π²ΠΎΠΏΡΠΎΡΡ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΠΈ ΠΈ ΠΏΡΠΈΠ²Π°ΡΠ½ΠΎΡΡΠΈ ΠΊΠ»Π°ΡΡΠΈΡΠ΅ΡΠΊΠΈΡ
P2P-ΠΌΠ΅ΡΡΠ΅Π½Π΄ΠΆΠ΅ΡΠΎΠ²:
- ΠΠ΄ΠΈΠ½ ΠΊΠ»ΠΈΠΊ Π΄Π»Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ Π°ΠΊΠΊΠ°ΡΠ½ΡΠ° β Π½ΠΈΠΊΠ°ΠΊΠΈΡ ΡΠ΅Π»Π΅ΡΠΎΠ½ΠΎΠ² ΠΈ ΡΠ»Π΅ΠΊΡΡΠΎΠ½Π½ΡΡ ΠΏΠΎΡΡ, Π½Π΅Ρ Π΄ΠΎΡΡΡΠΏΠ° ΠΊ Π°Π΄ΡΠ΅ΡΠ½ΡΠΌ ΠΊΠ½ΠΈΠ³Π°ΠΌ ΠΈ Π³Π΅ΠΎΠ»ΠΎΠΊΠ°ΡΠΈΡΠΌ.
- Π‘ΠΎΠ±Π΅ΡΠ΅Π΄Π½ΠΈΠΊΠΈ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°ΡΡ ΠΏΡΡΠΌΡΡ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠΉ, Π²ΡΠ΅ ΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΈΠ΄Π΅Ρ ΡΠ΅ΡΠ΅Π· ΡΠ°ΡΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΡΡ ΡΠΈΡΡΠ΅ΠΌΡ ΡΠ·Π»ΠΎΠ². IP-Π°Π΄ΡΠ΅ΡΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΉ Π½Π΅Π΄ΠΎΡΡΡΠΏΠ½Ρ Π΄ΡΡΠ³ Π΄ΡΡΠ³Ρ.
- ΠΡΠ΅ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ ΡΠΈΡΡΡΡΡΡΡ End-to-End curve25519xsalsa20poly1305. ΠΡΠΎΠ΄Π΅ Π±Ρ ΡΡΠΈΠΌ Π½ΠΈΠΊΠΎΠ³ΠΎ Π½Π΅ ΡΠ΄ΠΈΠ²ΠΈΡΡ, Π½ΠΎ Ρ Π½Π°Ρ-ΡΠΎ ΠΈΡΡ ΠΎΠ΄Π½ΡΠΉ ΠΊΠΎΠ΄ ΠΎΡΠΊΡΡΡ.
- MITM-Π°ΡΠ°ΠΊΠ° ΠΈΡΠΊΠ»ΡΡΠ΅Π½Π° β ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠ΅ΠΉ ΠΈ ΠΏΠΎΠ΄ΠΏΠΈΡΡΠ²Π°Π΅ΡΡΡ Ed25519 EdDSA.
- Π‘ΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΏΠΎΠΏΠ°Π΄Π°Π΅Ρ Π² ΡΠ²ΠΎΠΉ Π±Π»ΠΎΠΊ. ΠΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΡΡΡ ΠΈ
timestamp
Π±Π»ΠΎΠΊΠΎΠ² Π½Π΅ ΠΈΡΠΏΡΠ°Π²ΠΈΡΡ, Π° ΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎ ΠΈ ΠΏΠΎΡΡΠ΄ΠΎΠΊ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ. - βΠ― ΡΡΠΎΠ³ΠΎ Π½Π΅ Π³ΠΎΠ²ΠΎΡΠΈΠ»β Π½Π΅ ΠΏΡΠΎΠΊΠ°ΡΠΈΡ Ρ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡΠΌΠΈ Π² Π±Π»ΠΎΠΊΡΠ΅ΠΉΠ½Π΅.
- ΠΠ΅Ρ ΡΠ΅Π½ΡΡΠ°Π»ΡΠ½ΠΎΠΉ ΡΡΡΡΠΊΡΡΡΡ, ΠΊΠΎΡΠΎΡΠ°Ρ Π΄Π΅Π»Π°Π΅Ρ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ Π½Π° βΠ΄ΠΎΡΡΠΎΠ²Π΅ΡΠ½ΠΎΡΡΡβ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ. ΠΡΠΎ Π΄Π΅Π»Π°Π΅Ρ ΡΠ°ΡΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½Π°Ρ ΡΠΈΡΡΠ΅ΠΌΠ° ΡΠ·Π»ΠΎΠ² Π½Π° ΠΎΡΠ½ΠΎΠ²Π΅ ΠΊΠΎΠ½ΡΠ΅Π½ΡΡΡΠ°, Π° ΠΎΠ½Π° ΠΏΡΠΈΠ½Π°Π΄Π»Π΅ΠΆΠΈΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΠΌ.
- ΠΠ΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΡΠ΅Π½Π·ΡΡΡ β Π°ΠΊΠΊΠ°ΡΠ½ΡΡ Π½Π΅Π»ΡΠ·Ρ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°ΡΡ, Π° ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ ΡΠ΄Π°Π»ΡΡΡ.
- ΠΠ»ΠΎΠΊΡΠ΅ΠΉΠ½ 2FA β Π°Π»ΡΡΠ΅ΡΠ½Π°ΡΠΈΠ²Π° Π°Π΄ΡΠΊΠΎΠΉ 2FA ΠΏΠΎ SMS,
ΠΏΠΎΠ»ΠΎΠΌΠ°Π²ΡΠ΅ΠΉ Π½Π΅ΠΌΠ°Π»ΠΎ Π·Π΄ΠΎΡΠΎΠ²ΡΡ. - ΠΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΠΏΠΎΠ»ΡΡΠΈΡΡ Π²ΡΠ΅ ΡΠ²ΠΎΠΈ Π΄ΠΈΠ°Π»ΠΎΠ³ΠΈ Ρ Π»ΡΠ±ΠΎΠ³ΠΎ ΡΡΡΡΠΎΠΉΡΡΠ²Π° Π² Π»ΡΠ±ΠΎΠ΅ Π²ΡΠ΅ΠΌΡ β ΡΡΠΎ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ Π½Π΅ Ρ ΡΠ°Π½ΠΈΡΡ Π΄ΠΈΠ°Π»ΠΎΠ³ΠΈ Π»ΠΎΠΊΠ°Π»ΡΠ½ΠΎ Π²ΠΎΠΎΠ±ΡΠ΅.
- ΠΠΎΠ΄ΡΠ²Π΅ΡΠΆΠ΄Π΅Π½ΠΈΠ΅ Π΄ΠΎΡΡΠ°Π²ΠΊΠΈ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ. ΠΠ΅ Π½Π° ΡΡΡΡΠΎΠΉΡΡΠ²ΠΎ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ, Π° Π² ΡΠ΅ΡΡ. ΠΠΎ ΡΡΡΠΈ, ΡΡΠΎ ΠΏΠΎΠ΄ΡΠ²Π΅ΡΠΆΠ΄Π΅Π½ΠΈΠ΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ ΠΏΠΎΠ»ΡΡΠ°ΡΠ΅Π»Ρ ΠΏΡΠΎΡΠΈΡΠ°ΡΡ Π²Π°ΡΠ΅ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅. ΠΡΠΎ ΠΏΠΎΠ»Π΅Π·Π½Π°Ρ ΡΠΈΡΠ° Π΄Π»Ρ ΠΎΡΠΏΡΠ°Π²ΠΊΠΈ ΠΊΡΠΈΡΠΈΡΠ΅ΡΠΊΠΈΡ ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠΉ.
ΠΠ· ΠΏΠ»ΡΡΠ΅ΠΊ Π±Π»ΠΎΠΊΡΠ΅ΠΉΠ½Π° ΡΠ°ΠΊΠΆΠ΅ ΡΠ΅ΡΠ½Π°Ρ ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΡ Ρ ΠΊΡΠΈΠΏΡΠΎΠ²Π°Π»ΡΡΠ°ΠΌΠΈ 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
β noncetype
β ΡΠΈΠΏ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ
Π‘ΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ ΡΠΎΠΆΠ΅ Π΄Π΅Π»ΡΡΡΡ Π½Π° ΡΠΈΠΏΡ. ΠΠΎ ΡΡΡΠΈ, ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ 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'))
}
ΠΡΠΏΡΠ°Π²ΠΊΠ° ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΈ Ρ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ΠΌ Π½Π° ΡΠ·Π΅Π» ΡΠ΅ΡΠΈ
ΠΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΡΠ΅ΡΡ Π΄Π΅ΡΠ΅Π½ΡΡΠ°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½Π°Ρ, ΠΏΠΎΠ΄ΠΎΠΉΠ΄Π΅Ρ Π»ΡΠ±ΠΎΠΉ ΠΈΠ· ΡΠ·Π»ΠΎΠ² Ρ ΠΎΡΠΊΡΡΡΡΠΌ 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-box, Π°
ΠΠ΅ΡΠ΅Π΄Π°ΡΠ° ΡΠ°ΠΉΠ»ΠΎΠ²/ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠΉ ΠΈ Π³ΡΡΠΏΠΏΠΎΠ²ΡΠ΅ ΡΠ°ΡΡ ΡΡΠ΅Π±ΡΡΡ Π΅ΡΠ΅ ΠΌΠ½ΠΎΠ³ΠΎ ΡΠ°Π±ΠΎΡΡ. ΠΠΎΠ½Π΅ΡΠ½ΠΎ, Π² ΡΠΎΡΠΌΠ°ΡΠ΅ ΡΡΠΏ-Π»ΡΠΏ ΡΡΠΎ ΠΌΠΎΠΆΠ½ΠΎ βΠΏΡΠΈΠΊΡΡΡΠΈΡΡβ Π±ΡΡΡΡΠΎ, Π½ΠΎ ΠΌΡ Ρ ΠΎΡΠΈΠΌ ΡΠΎΡ ΡΠ°Π½ΠΈΡΡ ΡΠΎΡ ΠΆΠ΅ ΡΡΠΎΠ²Π΅Π½Ρ ΠΏΡΠΈΠ²Π°ΡΠ½ΠΎΡΡΠΈ.
ΠΠ°, Π΅ΡΡΡ Π΅ΡΠ΅ Π½Π°Π΄ ΡΠ΅ΠΌ ΡΠ°Π±ΠΎΡΠ°ΡΡ β Π² ΠΈΠ΄Π΅Π°Π»Π΅ ΡΠ΅Π°Π»ΡΠ½Π°Ρ ΠΏΡΠΈΠ²Π°ΡΠ½ΠΎΡΡΡ ΠΏΡΠ΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅Ρ, ΡΡΠΎ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΠΈ Π½Π΅ Π±ΡΠ΄ΡΡ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ°ΡΡΡΡ ΠΊ ΠΏΡΠ±Π»ΠΈΡΠ½ΡΠΌ ΡΠ·Π»Π°ΠΌ ΡΠ΅ΡΠΈ, Π° ΠΏΠΎΠ΄Π½ΠΈΠΌΡΡ ΡΠ²ΠΎΠΈ. ΠΠ°ΠΊ Π²Ρ Π΄ΡΠΌΠ°Π΅ΡΠ΅, ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΏΡΠΎΡΠ΅Π½ΡΠΎΠ² ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΉ ΡΠ°ΠΊ Π΄Π΅Π»Π°Π΅Ρ? ΠΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎ, 0. Π§Π°ΡΡΠΈΡΠ½ΠΎ ΡΡΠΎΡ Π²ΠΎΠΏΡΠΎΡ Π½Π°ΠΌ ΡΠ΄Π°Π»ΠΎΡΡ ΡΠ΅ΡΠΈΡΡ Tor-Π²Π΅ΡΡΠΈΠ΅ΠΉ ΠΌΠ΅ΡΡΠ΅Π½Π΄ΠΆΠ΅ΡΠ°.
ΠΡ Π΄ΠΎΠΊΠ°Π·Π°Π»ΠΈ, ΡΡΠΎ ΠΌΠ΅ΡΡΠ΅Π½Π΄ΠΆΠ΅Ρ Π½Π° Π±Π»ΠΎΠΊΡΠ΅ΠΉΠ½Π΅ ΠΌΠΎΠΆΠ΅Ρ ΡΡΡΠ΅ΡΡΠ²ΠΎΠ²Π°ΡΡ. Π Π°Π½Π΅Π΅ Π±ΡΠ»Π° ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ΄Π½Π° ΠΏΠΎΠΏΡΡΠΊΠ° Π² 2012 Π³ΠΎΠ΄Ρ β
Π ΡΠΊΠ΅ΠΏΡΠΈΡΠΈΠ·ΠΌ ΡΠ²ΡΠ·Π°Π½ Ρ ΡΠ΅ΠΌ, ΡΡΠΎ ΠΌΠ΅ΡΡΠ΅Π½Π΄ΠΆΠ΅ΡΡ Π½Π° Π±Π»ΠΎΠΊΡΠ΅ΠΉΠ½Π΅ ΠΎΠΏΠ΅ΡΠ΅ΠΆΠ°ΡΡ Π²ΡΠ΅ΠΌΡ β Π»ΡΠ΄ΠΈ Π½Π΅ Π³ΠΎΡΠΎΠ²Ρ Π±ΡΠ°ΡΡ ΠΎΡΠ²Π΅ΡΡΡΠ²Π΅Π½Π½ΠΎΡΡΡ Π·Π° ΡΠ²ΠΎΠΉ Π°ΠΊΠΊΠ°ΡΠ½Ρ Π½Π° ΡΠ΅Π±Ρ, Π²Π»Π°Π΄Π΅Π½ΠΈΠ΅ Π»ΠΈΡΠ½ΠΎΠΉ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠ΅ΠΉ ΠΏΠΎΠΊΠ° Π½Π΅ Π² ΡΡΠ΅Π½Π΄Π΅, Π° ΡΠ΅Ρ
Π½ΠΎΠ»ΠΎΠ³ΠΈΠΈ Π½Π΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡΡ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΡΡ Π²ΡΡΠΎΠΊΠΈΠ΅ ΡΠΊΠΎΡΠΎΡΡΠΈ Π½Π° Π±Π»ΠΎΠΊΡΠ΅ΠΉΠ½Π΅. Π‘Π»Π΅Π΄ΠΎΠΌ Π±ΡΠ΄ΡΡ ΠΏΠΎΡΠ²Π»ΡΡΡΡΡ Π±ΠΎΠ»Π΅Π΅ ΡΠ΅Ρ
Π½ΠΎΠ»ΠΎΠ³ΠΈΡΠ½ΡΠ΅ Π°Π½Π°Π»ΠΎΠ³ΠΈ Π½Π°ΡΠ΅Π³ΠΎ ΠΏΡΠΎΠ΅ΠΊΡΠ°. ΠΠΎΡ ΡΠ²ΠΈΠ΄ΠΈΡΠ΅.
ΠΡΡΠΎΡΠ½ΠΈΠΊ: habr.com