2017 áá¯ááŸá áºá¡á ááœááºá áá»áœááºá¯ááºááá¯á·ááẠclassic P2P messenger áá»á¬ážá á¡á¬ážáá¬áá»ááºáá»á¬ážááᯠááœá±ážááœá±ážááŒááºážááŒáá·áº blockchain [á¡áááºááŸáá·áº ááá·áºááºááẠáááá¯ááá¯ááºááœááºááŸááááº] ááœáẠmessenger áá áºáá¯ááᯠá áááºáááºáá®ážáá²á·áá«áááºá
áá»á±á¬áºááœá¬ážááŒá® 2.5
áá
áºááŸá
áºá áá»áœááºá¯ááºááá¯á·á á¡áá°á¡áááᯠá¡áááºááŒá¯ááá¯ááºáá²á·áááº- messenger á¡ááá®áá±ážááŸááºážáá»á¬ážááᯠiOSá Web PWAá Windowsá GNU/Linuxá Mac OS ááŸáá·áº Android á¡ááœáẠááá¯áááŸáááá¯ááºáá«ááŒá®á
ááá±á·áá»áœááºá¯ááºááá¯á·ááẠblockchain messenger áá¡áá¯ááºáá¯ááºáá¯á¶ááŸáá·áº client application áá»á¬ážáááºáááºážá API ááŸáá·áºáááºááá¯á·á¡áá¯ááºáá¯ááºááá¯ááºáááºááá¯ááŒá±á¬ááŒáá«áááºá
áá»áœááºá¯ááºááá¯á·ááẠááá¹áááẠP2P messenger áá»á¬ážá áá¯á¶ááŒá¯á¶áá±ážááŸáá·áº ááá¯ááºáá±ážááá¯ááºáá¬ááŒá¿áá¬áá»á¬ážááᯠááŒá±ááŸááºážááẠblockchain ááᯠá¡ááá¯ááŸááá«áááº-
- á¡áá±á¬áá·áºáá áºáá¯áááºáá®ážááẠááá áºáá áºáá»ááºááŸáááºáá« - áá¯ááºážáá»á¬áž ááá¯á·ááá¯áẠá¡á®ážáá±ážááºáá»á¬ážáááŸáááŒááºážá ááááºá á¬á á¬á¡á¯ááºáá»á¬áž ááá¯á·ááá¯áẠáááá®áááºáááºáá±áá¬áá»á¬ážááᯠá¡áá¯á¶ážááŒá¯ááœáá·áºáááŸááá«á
- á¡ááŒááºá¡ááŸááºááŒá±á¬ááá¯áá°áá»á¬ážááẠááá¯ááºááá¯ááºáá»áááºáááºááŸá¯áá»á¬ážááᯠáááºáá±á¬á¡áá«á០ááááºáá®ážááŒáá«á áááºááœááºááŸá¯á¡á¬ážáá¯á¶ážááẠááŒáá·áºáá±áá¬ážáá±á¬ node áá»á¬ážááŸáááá·áº ááŒá¯áá¯ááºááŒáááºá á¡áá¯á¶ážááŒá¯áá°áá»á¬ážá IP ááááºá á¬áá»á¬ážááẠá¡áá»ááºážáá»ááºáž áá»áááºáááºááááá«á
- á á¬áá»á¬ážá¡á¬ážáá¯á¶ážááẠEnd-to-End curve25519xsalsa20poly1305 ááᯠáá¯ááºááŸááºáá¬ážáááºá áá«á áááºáá°á·ááá¯á០á¡á¶á·ááŒááŸá¬ ááá¯ááºáá°ážááá¯á· áááºááá±ááá·áº áá»áœááºáá±á¬áºááá¯á·áá²á· á¡áááºážá¡ááŒá áºáá¯ááºááᯠááœáá·áºáá¬ážáá«áááºá
- MITM ááá¯ááºááá¯ááºááŸá¯ááᯠáááºáá¯ááºáá¬ážááẠ- áááºáá±á·áá»áºáá áºáá¯á á®ááẠááœá±áá±ážááœá±áá°áá áºáá¯ááŒá áºááŒá®áž Ed25519 EdDSA á០áááºááŸááºáá±ážááá¯ážáá¬ážáááºá
- áááºáá±á·áá»áºááẠáááºážáááá¯ááºááá¯ááºááá±á¬ááºááœáẠá¡áá¯á¶ážáááºáááºá áá®ááœááºááŸá¯ááŸáá·áº
timestamp
ááááºááá¯á·ááŸá¯áá»á¬ážááᯠáááºáááŒááºááá¯ááºáá«á ááá¯á·ááŒá±á¬áá·áº áááºáá±á·áá»áºáá»á¬ážá á¡á á®á¡á á¥áºááŒá áºáááºá - "áá«ááŒá±á¬áá¬ááá¯ááºáá°áž" blockchain ááŸáá á¬ááá¯áá»á¬ážááŸáá·áºá¡áá¯ááºáá¯ááºáááºááá¯ááºáá«á
- áááºáá±á·áá»áºá âá á áºááŸááºááŸá¯â ááᯠá á áºáá±ážááá·áº áááá¯ááœá²á·á ááºážáá¯á¶ áááŸááá«á áááºážááᯠá¡áá»á¬ážááá¹áá¡áá±á«áºá¡ááŒá±áá¶á ááŒáá·áºáá±áá¬ážáá±á¬ node á áá áºááŒáá·áº áá¯ááºáá±á¬ááºááŒá®áž áááºážááᯠá¡áá¯á¶ážááŒá¯áá°áá»á¬ážá០ááá¯ááºááá¯ááºáá«áááºá
- áááºáá¬ááŒááºááŒááºážáááŒá áºááá¯áẠ- á¡áá±á¬áá·áºáá»á¬ážááᯠááááºááá¯á·áááááá·áºá¡ááŒáẠáááºáá±á·áá»áºáá»á¬ážááᯠáá»ááºááááá«á
- Blockchain 2FA ááẠSMS ááŸáá
áºááá·áº ááá¯ááºáá²áá±á¬ 2FA á á¡á
á¬ážááá¯ážáá
áºáá¯ááŒá
áºáááºá
áá»ááºážáá¬áá±ážááœá± á¡áá»á¬ážááŒá®áž áá»ááºá á®ážááœá¬ážáááºá - ááá·áºá áá¬ážááá¯ááºážáá»á¬ážá¡á¬ážáá¯á¶ážááᯠáááºááá·áºá ááºáá á¹á ááºážá០á¡áá»áááºáááœá±áž ááá°ááá¯ááºááá·áºá áœááºážáááºááá¯ááá¯áááºááŸá¬ á áá¬ážááá¯ááºážáá»á¬ážááᯠá ááºááœááºážá áá¯á¶ážáááááºážáááºážáááºáááá¯á¡ááºáá«á
- áááºáá±á·áá»áºáá±ážááá¯á·ááŒááºáž á¡áááºááŒá¯ááŒááºážá á¡áá¯á¶ážááŒá¯áá°áá ááºáá á¹á ááºážá¡ááœááºááá¯ááºáá² ááœááºáááºá¡ááœááºááŒá áºáááºá á¡ááŒá±áá¶á¡á¬ážááŒáá·áºá á€áááºááŸá¬ áááºáá¶áá°á áááºáá±á·áá»áºááᯠáááºááŸá¯ááá¯ááºááŸá¯á¡á¬áž á¡áááºááŒá¯ááŒááºážááŒá áºáááºá á€áááºááŸá¬ á¡áá±ážááŒá®ážáá±á¬ááááá±ážáá»ááºáá»á¬ážáá±ážááá¯á·ááŒááºážá¡ááœáẠá¡áá¯á¶ážáááºáá±á¬á¡ááºá¹áá«áááºáá áºáá¯ááŒá áºáááºá
Blockchain á¡áá»áá¯ážáá¶á á¬ážááœáá·áºáá»á¬ážááẠcryptocurrencies Ethereumá Dogecoiná Liská Dashá Bitcoin (á€á¡áá¬ááẠáááºáááºáá¯ááºáá±á¬ááºáá²ááŒá áºáááº) ááŸáá·áº áá»ááºáááºáá»á¬ážááœáẠááá¯áááºáá»á¬ážáá±ážááá¯á·ááá¯ááºá áœááºážááá¯á·áááºáž áá«áááºáá«áááºá áá»áœááºá¯ááºááá¯á·ááẠbuilt-in crypto exchanger ááá¯áááºááŒá¯áá¯ááºáá²á·áááºá
ááŒá®ážáá±á¬á· - á¡á¬ážáá¯á¶ážáááºááá¯á¡áá¯ááºáá¯ááºáá²á
áááºáá±á·áá»áºááẠá¡áá±á¬ááºážá¡áááºáá áºáá¯ááŒá áºáááºá
blockchain ááœáẠááœá±áá±ážááœá±áá° ááá¯áááºáá»á¬áž (áááºá¹áá«ážáá»á¬áž) ááᯠáá¯á¶ážá áœá²áá°áá áºáŠážá០á¡ááŒá¬ážáá áºáŠážááá¯á· ááœáŸá²ááŒá±á¬ááºážáá±ážááá·áºá¡áá»ááºááᯠáá°ááá¯ááºážá áá»áá·áºáá¬ážááá±ááŒá®ááŒá áºáááºá Bitcoin ááá¯áá²á áááºáá±á·áá»áºááá¯á·ááŒááºážá¡ááœáẠá¡áá°ážááœá±áá±ážááœá±áá°á¡áá»áá¯ážá¡á á¬ážáá áºáá¯ááᯠáá»áœááºá¯ááºááá¯á· áááºáá®ážáá¬ážáá«áááºá
blockchain ááŸá messenger ááœááºáááºáá±á·ááºá»áá áºá á±á¬ááºáá±ážááá¯á·áááºá áááºáááºá¡ááá·áºáá»á¬ážá áœá¬ááá¯ááŒááºáááºážáááºááá¯á¡ááºáááº-
- áááºáá±á·áá»áºá á¬áá¬ážááᯠáá¯ááºááŸááºáá«á
- ááœá±áá±ážááœá±áá°áá áºáá¯ááœáẠciphertext ááá¯ááá·áºáá«á
- á¡áá±á¬ááºážá¡áááºáááºááŸááºááá¯ážáá«á
- áááºááá·áºááœááºááẠnode ááá¯á·áááᯠááœá±áá±ážááœá±áá°áá áºáᯠáá±ážááá¯á·áá«á
- ááŒáá·áºáá±áá¬ážáá±á¬ áá¯á¶ááŸááºá áá áºááẠáááºáá±á·áá»áºáá áºáá¯á "á á áºááŸááºááŸá¯" ááᯠáá¯á¶ážááŒááºáááºá
- á¡á¬ážáá¯á¶ážá¡áááºááŒá±áá«áá áááºáá±á·áá»áºáá«áá±á¬ ááœá±áá±ážááœá±áá°ááᯠáá±á¬ááºááá±á¬ááºááœáẠááá·áºááœááºážáá«áááºá
- áááºáá¶áá°ááẠáááºáá±á·áá»áºááœá±ááœáŸá²ááŒááºážááᯠáá¯ááºáá°ááŒá®áž áá¯ááºááŸááºáááºá
á¡ááá·áº 1â3 ááŸáá·áº 7 ááᯠclient ááœáẠá ááºááœááºážáá¯ááºáá±á¬ááºááŒá®áž á¡ááá·áº 5â6 ááᯠhost áá»á¬ážáá±á«áºááœááºáá¯ááºáá±á¬ááºáááºá
áááºáá±á·áá»áºááŸááºááŒááºáž
áááºáá±á·áá»áºááᯠáá±ážááá¯á·áá°á áá®ážááá·áºáá±á¬á·ááŸáá·áº áááºáá¶áá°á á¡áá»á¬ážáá°ááŸá¬áá±á¬á·ááŒáá·áº áá¯ááºááŸááºáá¬ážáááºá áá»áœááºá¯ááºááá¯á·ááẠááœááºáááºá០á¡áá»á¬ážáá°ááŸá¬áá±á¬á·ááᯠáá°áá«áááºá ááá¯á·áá±á¬áº áááºážá¡ááœááºá áááºáá¶áá°áá¡áá±á¬áá·áºááᯠáááŠážáá¯ááºáá±á¬ááºááááºááŒá
áºááŒá®áž ááá¯ááá¯áááºááŸá¬ á¡áááºážáá¯á¶áž ááœá±áá±ážááœá±áá°áá
áºáá¯ááŸááááºá REST áá±á¬ááºážááá¯áá»ááºááᯠáááºáá¯á¶ážááá¯ááºáááºá GET /api/accounts/getPublicKey?address={ADAMANT address}
áá»ááºáá»á¬ážááá¯ááœáá·áºááá·áºá¡áá«á á¡ááŒááºá¡ááŸááºááŒá±á¬ááá¯áá°áá»á¬ážá á¡áá»á¬ážáá°ááŸá¬áá±á¬á·áá»á¬ážááᯠáááá¯ááºáá±ááŒá®ááŒá
áºáááºá
messenger ááẠcurve25519xsalsa20poly1305 algorithm ááᯠá¡áá¯á¶ážááŒá¯á áááºáá±á·áá»áºáá»á¬ážááᯠá
á¬ááŸááºáá±ážáá«áááºá
á€áááºááŸá¬ 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
- áááºáá±á·ááºá»á¡áá»áá¯ážá¡á á¬áž
áááºáá±á·áá»áºááœá±ááá¯áááºáž á¡áá»áá¯ážá¡á
á¬áž ááœá²ááŒá¬ážáá¬ážáá«áááºá á¡ááŸááºááá±á¬á· parameter áá«á type
áá¬ážáááºáá¯á¶ááᯠááŒá±á¬ááŒáááºá message
. áááºááẠá
á¬ááá¯áá
áºá
á±á¬ááºáᬠáá±ážááá¯á·ááá¯ááºáááºá ááá¯á·ááá¯áẠá¡ááœááºážááœáẠá
áááºáááºá
á¬ážááœááºá¡áá¬áá»á¬ážááŸáá·áºá¡áá° á¡áá¬ááá¹áá¯áá
áºáá¯ááᯠáá±ážááá¯á·ááá¯ááºááẠ- á¥ááá¬á á€áááºááŸá¬ messenger ááẠchats ááœáẠcryptocurrency ááœáŸá²ááŒá±á¬ááºážááŸá¯áá»á¬ážááᯠááŒá¯áá¯ááºáá¯á¶ááŒá
áºáááºá
ááááºá¡áá±ááŒáá·áºá áá»áœááºá¯ááºááá¯á·ááẠááœá±áá±ážááœá±áá°áá áºáá¯ááᯠáááºáá®ážáááº-
{
"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 hash á áá
áºá
áááºáá
áºááá¯ááºážááŒá
áºáááºá
ááá°áᬠá¡áá±á¬ááºá¡áááºáá±á¬áºááŸá¯-
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'))
}
ááœááºááẠnode ááá¯á· áááºáá±á·ááºá»ááŒáá·áº ááœá±áá±ážááœá±áá° ááá¯á·ááŒááºážá
ááœááºáááºááᯠáááá¯áá»á¯ááºááá¯ááºááŸá¯ áá»áŸá±á¬á·áá»áá¬ážáá±á¬ááŒá±á¬áá·áºá ááœáá·áºáá¬ážáá±á¬ API áá«ááá·áº áááºááá·áºáá±áá¬áááᯠáá¯ááºáá±á¬ááºáááá·áºáááºá á¡áá¯á¶ážááŸááºááá¯á· POST áá±á¬ááºážááá¯ááŸá¯ááŒá¯áá¯ááºááŒááºážá api/transactions
:
curl 'api/transactions' -X POST
-d 'TX_DATA'
áá¯á¶á·ááŒááºááŸá¯á¡áá±ááŒáá·áº á¡áá»áá¯ážá¡á á¬ážá ááœá±áá±ážááœá±áá° ID ááᯠáááºáá¶áááŸááá«áááºá
{
"success": true,
"nodeTimestamp": 63228852,
"transactionId": "6146865104403680934"
}
ááœá±ááœááºážááœá±áá¯ááºá¡áááºááŒá¯ááŒááºážá
á¡áá»á¬ážááá¹áá¡áá±á«áºá¡ááŒá±áá¶á ááŒáá·áºáá±áá¬ážáá±á¬ node á áá áºáá áºáá¯ááẠááœá±áá±ážááœá±áá°áááºáá±á·áá»áºá "á á áºááŸááºááŸá¯" ááᯠáá¯á¶ážááŒááºáááºá áááºáá±á·áá»áºááᯠáá±á¬ááºáá áºáá¯ááŸáá·áº á¡á á¬ážááá¯ážááŒááºážááŸáá áááŸáá áá±ážááá¯á·ááá·áºá¡áá»áááºááᯠááŸááºáááºá áœá¬ ááœáŸááºááŒááŒááºážááŸááááŸáá áááºáá°áá¶ááŸá áááºááá·áºá¡áá»áááºá áááºážááẠblockchain áá¡ááœááºá¡áá±ážááŒá®ážáá±á¬á¡á¬ážáá¬áá»ááºááŒá áºááẠ- á áá á áºááŒááºážá¡ááœááºáá¬áááºáá°áá±á¬áááá¯ááœá²á·á ááºážáá¯á¶ááŸá¬áááŸááá«á ááŸáá·áºáááºáá±á·ááºá»áá»á¬ážáá¡á á®á¡á á¥áºááŸáá·áºáááºážááá¯á·áá¡ááŒá±á¬ááºážá¡áá¬ááá¯á¡áá¯á¡áá±á¬ááºáááŒá¯ááá¯ááºáá«á
áŠážá áœá¬á node áá áºáá¯ááẠáááá»ááŸá¯ááᯠá á áºáá±ážááŒá®áž á¡ááŒá¬ážáá°áá»á¬ážáᶠáá±ážááá¯á·ááẠ- á¡áá»á¬ážá á¯ááẠá¡áá¬á¡á¬ážáá¯á¶áž á¡áááºááŒá±áááºáᯠááá¯áá«áá ááœá±áá±ážááœá±áá°ááẠááœááºážáááºá áá±á¬ááºááá±á¬ááºááœáẠáá«áááºáááá·áºááẠ- á€ááá±á¬áá°áá»ááºááŒá áºáááºá
á
á
áºáá±ážááŸá¯áá»á¬ážá¡ááœáẠáá¬áááºááŸááá±á¬ node áá¯ááºá á¡á
áááºá¡ááá¯ááºážááᯠGitHub ááœáẠááŒáá·áºááŸá¯ááá¯ááºááẠ-
ááá±á¬ááºáá áºáá¯ááŸá áááºáá±á·ááºá»áá áºáá¯ááŸáá·áº ááœá±áá±ážááœá±áá°áá áºáᯠáá«áááºáááºá
ááá±á¬áá°áá®ááŸá¯áááŸááá«áá áá»áœááºá¯ááºááá¯á·ááááºáá±á·áá»áºáá«áá±á¬ ááœá±áá±ážááœá±áá°ááẠá¡ááŒá¬ážááá¬ážáááºááœá±áá±ážáá»á±ááŸá¯áá»á¬ážááŸáá·áºá¡áá° áá±á¬ááºáá¬ááá·áºááá±á¬ááºááœáẠáá«áááºáááºááŒá áºáááºá
ááá±á¬ááºáá»á¬ážááẠáááºážáá»ááºáá±á¬ á¡á á®á¡á á¥áºááŸáááŒá®áž áá±á¬ááºáááºááœá²ááááºááá¯á·áá áºáá¯á á®ááẠááááºáá¯ááºááœááºáá»á¬ážá hashes áá»á¬ážáá±á«áºááœáẠá¡ááŒá±áá¶á ááœá²á·á ááºážáá¬ážáááºá
á¡áááá¡áá»ááºááŸá¬ áá»áœááºá¯ááºááá¯á·áááááºážá
áá¬ážááẠá€á¡á
á®á¡á
á¥áºááœááºáá«áááºááŒá®áž âááŒááºáááºá
á®á
ááºááŒááºážâ ááááá¯ááºáá±á¬ááŒá±á¬áá·áºááŒá
áºáááºá áááºáá±á·áá»áºáá»á¬ážá
áœá¬ááẠááá±á¬ááºáá
áºáá¯áá²ááá¯á· áá»ááœá¬ážáá«á áááºážááá¯á·á ááŸá¬áá°ááŸá¯ááᯠáá¯á¶ážááŒááºáááºááŒá
áºáááºá timestamp
áááºáá±á·ááºá»áá»á¬ážá
áááºáá±á·ááºá»áááºááŒááºážá
messenger á¡ááá®áá±ážááŸááºážááẠáááºáá¶áá°áᶠáá±ážááá¯á·ááá·áº blockchain á០ááœá±áá±ážááœá±áá°áá»á¬ážááᯠáá¯ááºáá°áááºá á¡á²áá«á¡ááœáẠáá»áœááºáá±á¬áºááá¯á·á á¡áá¯á¶ážááŸááºáá
áºáᯠáá¯ááºáá¬ážáááºá 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 á áá¹ááá·áºááá·áºá¡ááœááºáž á€áááºážááŒáá·áº áá±ážááá¯á·ááŒááºážááŒá áºáá±á¬ááŒá±á¬áá·áº - á€áááºááŸá¬ ááœááºáááºááááºááá¯á·ááŒááºážá¡áá áºáá áºáᯠáá±á«áºáá¬áá»áááºááŒá áºááẠ- áá»áœááºá¯ááºááá¯á·ááẠclient-to-node ááŸáá·áº node-to-node socket áá»áááºáááºááŸá¯áá áºáá¯ááŸáá·áº ááœááºáá±á«áºáá¬áá«áááºá node áá áºáá¯ááẠááœá±áá±ážááœá±áá°á¡áá áºáá áºáá¯ááᯠáááºáá¶áááŸááá±á¬á¡áá«á áááºážááẠáááºážáááá¬ážáááºááŸá¯ááᯠá á áºáá±ážááŒá®áž á¡ááŒá¬áž nodeáá»á¬ážááá¯á· áá±ážááá¯á·áááºá á¡áá»á¬ážááá±á¬áá°áááºáá¶ááŸá¯ááŒá áºáá±á«áºááŒá®áž ááááºááá¯á·ááŒááºážááœáẠáá«áááºááŒááºážáááŒá¯áá®ááœááºááẠááœá±áá±ážááœá±áá°ááᯠmessenger áá±á¬ááºáááºáá»á¬ážá¡ááœáẠáááŸáááá¯ááºáá«áááºá á€áááºážááŒáá·áº áá»áœááºá¯ááºááá¯á·ááẠáá¯á¶ááŸáẠinstant messenger áá»á¬ážáá²á·ááá¯á·ááẠáááºáá±á·áá»áºáá»á¬ážááᯠáá»ááºááŒááºážááá¯á·áá±ážáá«áááºá
ááááºá
á¬á
á¬á¡á¯ááºááᯠááááºážáááºážáááºá¡ááœáẠáá»áœááºá¯ááºááá¯á·ááẠKVS - Key-Value Storage ááᯠááŒá¯áá¯ááºáá²á·ááẠ- áááºážááẠá¡ááŒá¬ážááœá±áá±ážááœá±áá°á¡áá»áá¯ážá¡á
á¬ážááŒá
áºáááºá asset
áááºážááẠáá¯ááºááŸááºáá¬ážáá±á¬ NaCl-box ááá¯ááºáá«á
ááá¯ááº/áá¯ááºáá¯á¶ ááœáŸá²ááŒá±á¬ááºážááŒááºážááŸáá·áº á¡ááœá²á·áá»ááºáá»á¬ážááẠá¡áá¯ááºáá»á¬ážá áœá¬ ááá¯á¡ááºáá±áá±ážáááºá áá¯ááºáá«áááºá á¡ááŸá¬ážá¡ááœááºážáá²á· á¡ááŸá¬ážá¡ááœááºážáá¯á¶á á¶áá²á· áá«ááᯠááŒááºááŒááºáááºááẠ"ááŸááºážáá áºááá¯ááºááŒá®"á áá«áá±ááá·áº áá»áœááºá¯ááºááá¯á·áᬠáá°áá®áá²á·ááá¯ááºáá±ážááá¯ááºáá¬á¡ááá·áºááᯠááááºážááááºážáá¬ážááá¯áá«áááºá
áá¯ááºáá²á·á áá¯ááºá áá¬ááœá±ááŸááá«áá±ážááẠ- á¡áá±á¬ááºážáá¯á¶ážááá±á¬á·á áááá·áºááá¯ááºáá±ážááá¯ááºáá¬ááá¯ááºáá±ážááá¯ááºáá¬á á¡áá¯á¶ážááŒá¯áá°ááœá±áᬠá¡áá»á¬ážáá°ááŸá¬ ááœááºááẠnode ááœá±ááᯠáá»áááºáááºááŸá¬ááá¯ááºáá°ážá áá«áá±ááá·áº áá°ááá¯á·ááá¯ááºááá¯áẠááŒáŸáá·áºáááºáááºááá¯á· áá°ááááºá á¡áá¯á¶ážááŒá¯áá° áááºáá¬ááá¯ááºááŸá¯ááºážá áá®ááá¯áá¯ááºáááºááá¯á· áááºáá«ááá²á ááŸááºáá«áááºá 0á á€ááŒá¿áá¬ááᯠmessenger á Tor áá¬ážááŸááºážááŒáá·áº áá áºá áááºáá áºááá¯ááºáž ááŒá±ááŸááºážááá¯ááºáá²á·áááºá
blockchain áá±á«áºááŸá messenger áá
áºáá¯ááŸáááá¯ááºáááºááá¯áá»áœááºá¯ááºááá¯á·áááºáá±ááŒáá²á·áááºá ááááºá ááŒáá¯ážáááºážááŸá¯ áá
áºááŒáááºáᬠááŸááá²á·áá±á¬áºáááºáž áááá áá¯ááŸá
áºá
ááá¯á·á¡ááŒáẠblockchain ááŸá messenger áá»á¬ážááẠáááºážááá¯á·áá¡áá»áááºáááºá
á±á¬áá±ááŒááºážááŒá±á¬áá·áºááŒá
áºááẠ- áá°áá»á¬ážááẠáááºážááá¯á·áá¡áá±á¬áá·áºá¡ááœááºáá¬áááºáá°áááºá¡áááºááá·áºáááŒá
áºáá±ážááŒááºážá ááá¯ááºáá±ážááá¯ááºáá¬á¡áá»ááºá¡áááºáá»á¬ážááá¯ááá¯ááºááá¯ááºááŒááºážááŸá¬ áá±ááºáá±á
á®ážááŒá±á¬ááºážááá¯ááºáá±ážáááᯠáááºážááá¬ááẠblockchain ááœáẠá¡ááŸáááºá¡áá¯ááºááŒáá·áºááŒááºážááᯠááœáá·áºáááŒá¯áá±á¬ááŒá±á¬áá·áºááŒá
áºáááºá áá»áœááºá¯ááºááá¯á·áááá±á¬áá»ááºá áá±á¬ááºáááºáááºážááá¬ááá¯ááºáᬠanalogues áá»á¬áž áá±á¬ááºááœááºáá±á«áºáá¬áá«áááºá ááœá±á·áááá·áºáááºá
source: www.habr.com