2017 แฌแแแก แแแกแแฌแงแแกแจแ แแแแแฌแงแแ แแแกแแแฏแแ แแก แจแแฅแแแ แแแแแฉแแแแแ [แกแแฎแแแ แแ แแแฃแแ แแแชแแแฃแแแ แแ แแคแแแจแ] แแแแกแแแฃแ P2P แแแกแแแฏแแ แแแแแ แจแแแแ แแแแ แฃแแแ แแขแแกแแแแแแก แแแแฎแแแแแ.
แแแแแแ 2.5
แฌแแแก, แแ แฉแแแ แจแแแซแแแแ แฉแแแแ แแแแชแแคแชแแแก แแแแแกแขแฃแ แแแ: แแแกแแแฏแแ แแก แแแแแแแชแแแแ แแฎแแ แฎแแแแแกแแฌแแแแแแ iOS, Web PWA, Windows, GNU/Linux, Mac OS แแ Android-แแกแแแแก.
แแฆแแก แฉแแแ แแแขแงแแแ, แแฃ แ แแแแ แแฃแจแแแแก แแแแแฉแแแแแก แแแกแแแฏแแ แ แแ แ แแแแ แจแแฃแซแแแแ แแแแแแขแแก แแแแแแแชแแแแก แแฃแจแแแแ แแแกแ API-แแ.
แฉแแแ แแแแแแแแ, แ แแ แแแแแฉแแแแแ แแแแแญแ แ แแแแกแแแฃแ แ P2P แแแกแแแฏแแ แแแแก แฃแกแแคแ แแฎแแแแแกแ แแ แแแแคแแแแแชแแแแฃแ แแแแก แกแแแแแฎแแแ:
- แแ แแ แแแฌแแแแฃแแแแแ แแแแแ แแจแแก แจแแกแแฅแแแแแแ - แแ แแ แแก แขแแแแคแแแแแ แแ แแ.แฌแแ แแแแแ, แแ แแ แแก แฌแแแแแ แแแกแแแแ แแแแแก แฌแแแแแแแ แแ แแแแแแแแชแแแแแ.
- แแแแแแแกแแฃแแ แแแแ แแ แแกแแแแก แแแงแแ แแแแ แแแ แแแแแ แแแแจแแ แแแก; แงแแแแ แแแแฃแแแแแชแแ แฎแแแแ แแแแแซแแแแก แแแแแฌแแแแแฃแแ แกแแกแขแแแแก แแแจแแแแแแ. แแแแฎแแแ แแแแแแแก IP แแแกแแแแ แแแแ แแ แแแแแแแแแ แแแฃแฌแแแแแแแแ.
- แงแแแแ แจแแขแงแแแแแแแ แแแจแแคแ แฃแแแ End-to-End curve25519xsalsa20poly1305. แ แแแแ แช แฉแแแก, แแก แแ แแแแก แแแแแแแ แแแแก, แแแแ แแ แฉแแแแ แกแแฌแงแแกแ แแแแ แฆแแแ.
- MITM แจแแขแแแ แแแแแ แแชแฎแฃแแแ - แแแแแแฃแแ แจแแขแงแแแแแแแ แแ แแก แขแ แแแแแฅแชแแ แแ แฎแแแก แแฌแแ แก Ed25519 EdDSA.
- แจแแขแงแแแแแแแ แแแแแ แแแแ แกแแแฃแแแ แแแแแจแ. แแแแแแแแแแ แฃแแแแ แแ
timestamp
แแฅแแแ แแ แจแแแแซแแแแ แจแแแกแฌแแ แแ แแแแแแแ แแ, แจแแกแแแแแแกแแ, แจแแขแงแแแแแแแแแแก แแแแแแแแแแ แแแ. - โแแก แแ แแแแฅแแแแกโ แแ แแแฃแจแแแแแก แแแแแฉแแแแแ แจแแขแงแแแแแแแแแแ.
- แแ แแ แกแแแแแก แชแแแขแ แแแฃแ แ แกแขแ แฃแฅแขแฃแ แ, แ แแแแแแช แแแแฌแแแแก แจแแขแงแแแแแแแแก โแแแแแแแแแแแกโ. แแก แแแแแแแ แแแแกแแแกแฃแกแแก แกแแคแฃแซแแแแแ แแแคแฃแซแแแแฃแแ แแแแแซแแแแก แแแแแฌแแแแแฃแแ แกแแกแขแแแแ แแ แแแก แแแฃแแแแแก แแแแฎแแแ แแแแแแ.
- แชแแแแฃแ แแก แจแแฃแซแแแแแแแ - แแแแแ แแจแแแแก แแแแแแแแ แแ แจแแขแงแแแแแแแแแแก แฌแแจแแ แจแแฃแซแแแแแแแ.
- Blockchain 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
-แแ แแคแแ แ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-แแแฅแกแ, แ แแแแแแช แแแจแแคแ แฃแแแ, แแแแ แแ
แคแแแแแแแก/แกแฃแ แแแแแแก แแแแแขแแแ แแ แฏแแฃแคแฃแ แ แฉแแแแแ แฏแแ แแแแแ แแแ แจแ แแแแก แแแแแฎแแแก. แ แ แแฅแแ แฃแแแ, แแฃแแแแแแแ แแ แแฃแแแแแแแ แคแแ แแแขแจแ แแก แจแแแซแแแแ แกแฌแ แแคแแ โแแแคแฃแญแแแกโ, แแแแ แแ แฉแแแ แแแแแแ แจแแแแแแ แฉแฃแแแ แแแแคแแแแแชแแแแฃแ แแแแก แแแแแ แแแแ.
แแแแฎ, แฏแแ แแแแแ แแ แแก แแแกแแแแแแแแแ - แแแแแแฃแ แจแแแแฎแแแแแจแ, แ แแแแฃแ แ แแแแคแแแแแชแแแแฃแ แแแ แแแ แแฃแแแแก, แ แแ แแแแฎแแแ แแแแแแ แแ แแแฃแแแแจแแ แแแแแแ แกแแฏแแ แ แฅแกแแแแก แแแแแซแแแก, แแ แแแแ แแแแแฆแแแแแ แกแแแฃแแแ แแแแแซแแแก. แ แแแแ แคแแฅแ แแแ, แแแแฎแแแ แแแแแแ แ แแแแแแ แแ แแชแแแขแ แแแแแแแก แแแแก? แแกแแ, 0. แฉแแแ แจแแแซแแแแ แแแฌแแแแแ แแ แแ แแ แแแแแแแก แแแแแแ แแแ แแแกแแแฏแแ แแก Tor แแแ แกแแแ.
แฉแแแ แแแแแแขแแแชแแ, แ แแ แแแกแแแฏแแ แ แแแแแฉแแแแแ แจแแแซแแแแ แแ แกแแแแแแแก. แแแ แ 2012 แฌแแแก แแฎแแแแ แแ แแ แแชแแแแแแ แแงแ -
แแ แกแแแแขแแชแแแแ แแแแแแ แแแแแฃแแแ แแแแ, แ แแ แแแแแฉแแแแแ แแแกแแแฏแแ แแแ แแ แแแ แฃแกแฌแ แแแแ - แแแแแแแแแแ แแ แแ แแแ แแแแ แแแฆแแ แแแกแฃแฎแแกแแแแแแแแ แกแแแฃแแแ แแแแแ แแจแแ, แแแ แกแแแแแฃแ แ แแแคแแ แแแชแแแก แคแแแแ แฏแแ แแ แแ แแก แขแแแแแแชแแ แแ แขแแฅแแแแแแแ แแ แแซแแแแ แแแแแฉแแแแแ แแแฆแแ แกแแฉแฅแแ แแก. แฉแแแแ แแ แแแฅแขแแก แแแขแ แขแแฅแแแแแแแฃแ แ แแแแแแแแแ แแแแแฉแแแแแ แจแแแแแแจแ. แฒแแแแแฎแแแ.
แฌแงแแ แ: www.habr.com