αα ααΎαααααΆα 2017 ααΎαααΆαα αΆααααααΎααααααΎαα’αααααΆαααΆααα½ααα ααΎ blockchain [ααααα αα·αααααααα·ααα αααα»ααααααα] ααααα·ααΆααααΆα’αααΈαα»ααααααααα·ααΆαα’αααααΆαααΆα P2P αα»ααΆαα
ααααααΆαα 2.5
α αΎαααΎαα’αΆα
αααααΆααααααααα·αααααααΎαααΆαα α₯α‘αΌαααααααααα·ααΈααααΎααΆαααΆααααααΆαα iOS, Web PWA, Windows, GNU/Linux, Mac OS αα·α Android α
αααααααααΎαααΉαααααΆααα’αααααΈααααααα blockchain messenger ααααΎαααΆα αα·αααααααααααααα·ααΈα’αα·αα·ααα’αΆα
ααααΎααΆαααΆαα½α API ααααααΆα
ααΎαα
ααα±αα blockchain αααααααΆααααα αΆαα»ααααα·ααΆα αα·αα―αααααΆαααααα’αααααΆαααΆα P2P αα»ααΆαα
- α α»α αα½αααααΎααααΈαααααΎαααααΈ - ααααΆαααΌαααααα α¬α’ααΈααα ααααΆααα·αααα·α αΌαααααΎααααα α’αΆααααααΆα α¬ααΈααΆααααΌαα·ααΆαααααα
- α’αααααααΆαααααααΆααααααααΆαα·αααααααααΎαααΆαααααΆαααααααααΆαααα ααΆαααααΆααααααααΆααα’ααααΎαα‘αΎαααΆααααααααααααα ααα αΆαααααΆααα α’αΆααααααΆα IP ααααα’αααααααΎαα·αα’αΆα α αΌαααααΎααααΆαα αα·ααα ααααΆαααα
- ααΆαααΆααα’ααααααΌαααΆαα’αα·αααααΈα End-to-End curve25519xsalsa20poly1305α ααΆα αΆααααΌα ααΆααΆαααααΉααα·αααααΎα±ααααααΆααααΆααααααΆααααα’αΎααααααααα»ααααααΌααααααααααααΎαααΊααΎαα αα α
- ααΆαααΆααααα αΆα MITM ααααΌαααΆαααα αα - ααΆαααΈαα½ααααΊααΆααααα·ααααα·ααΆααα½α α αΎαααααΌαααΆαα α»αα αααααααΆααα Ed25519 EdDSA α
- ααΆααααα
αααα
αααα»ααααα»αααααααΆα ααΆαααΆααααΆαααα·α
timestamp
α’ααααα·αα’αΆα αα½ααα»ααααα»αααΆααα ααΌα ααααα αΎαααΆαααααΆααααααΆαα - "αααα»ααα·αααΆααα·ααΆαααΌα αααααα" ααΉααα·αααααΎαααΆαααΆαα½αααΆααα ααΎ blockchain ααα
- αα·αααΆααα ααΆαααααααααααααΆαααααααα½ααα·αα·αααααΎ "ααΆαααααΉαααααΌα" ααααΆααααααα αααααααΌαααΆαααααΎαααααααααααα ααα αΆαααααΆαααααααα’ααααΎααΆαααΌαααα·ααααΆ α αΎαααΆααααΌαααΆαααααααααααααα’αααααααΎααααΆααα
- ααΆααα·αα’αΆα αα αα½α ααααΆαα αΆαααα·αα»ααα - ααααΈαα·αα’αΆα ααααΌαααΆαααΆααΆαα α αΎαααΆααα·αα’αΆα αα»αααΆαααα
- Blockchain 2FA ααΊααΆαααααΎααα½ααααααΆαα 2FA αααααΆααααααΆα SMS,
ααααααΆααα»αααΆααααΆαα αααΎαα - αααααααΆααααα»αααΆαααα½αααΆαααααααΆααααα’αααααΆααα’ααααΈα§αααααααΆαα½ααα αααααΆαα½αααΆααααααΆα’ααααα·αα αΆαααΆα ααααααΆαα»αααΆαααααααΆαα αααα»αααΌαααααΆαααΆαααααααα
- ααΆααααααΆααααΈααΆααααααΌαααΆαα αα·αααααα α§αααααααααα’αααααααΎαα ααα»αααααααααΆαααααααΆαα ααΆααΆαααααΆαα αααααΊααΆααΆααααααΆααα’αααΈαααααααΆαααααα’αααααα½ααααα»αααΆαα’αΆαααΆαααααα’αααα αααααΊααΆαα»αααΆαααααΆααααααααααααααΆααααΆαααααΎααΆαααΌαααααΉαααααΆαααα
α’ααααααααααα Blockchain αααα½ααααα αΌαααΆααα½ααααα αΌααααΆααα·ααααα·αααααΆαα½αααΉαααΌαα·ααααααα’αα‘α·α ααααΌαα·α Ethereum, Dogecoin, Lisk, Dash, Bitcoin (αα½αααααααα»αααααΎαααΆααα α‘αΎα) αα·ααααααααΆααααα»αααΆαααααΎαααααΆαααααΆαααααα»αααΆαααααα ααΎααααααΆααααΆααααααΎαα§αααααααααΆααααααΌαααααΈαααΌαααααΆαααααΆααα
α αΎααααααΆαααα - αααααααααΆααααΎαααΆαααΆααα’ααα
ααΆαααΊααΆααααα·ααααα·ααΆααα½αα
ααα»ααααααααααααΆααΆααααααΆααααααΎααΆααααααααΆαααα½α α αΎαα ααααααΆααα·ααααααΆααααα·ααααα·ααΆααα αααα»α blockchain ααααααααααΆαααααΆαα (ααΆαα) ααΈα’αααααααΎααααΆααααααΆαααα αα½αααααααααα ααΌα ααΆ Bitcoin α ααΎαααΆααααααΎααααααααα·αααααααααα·ααααα·ααΆααααααΆααααΆααααααΌαααΆαα
ααΎααααΈααααΎααΆααα αααα»ααααααα·ααΈααααΎααΆααα ααΎ blockchain α’αααααααΌαααααααΆααααα αΆαααΆα αααΎαα
- α’αα·αααααΈαα’αααααααΆα
- ααΆαααααααΌααααααΆαααα αααα»αααααα·ααααα·ααΆα
- α α»αα αααααααΆααΎααααα·ααααα·ααΆα
- ααααΎααααα·ααααα·ααΆααα ααααΆαααααααΆαααΆαα½αα
- ααααααααα ααα αΆαααααΆααααααα "ααΆαααααΉαααααΌα" ααααΆα
- ααααα·αααΎα’αααΈαααΆααα’αααα·αα’αΈαα ααααα·ααααα·ααΆαααΆαα½αααΆαααααΌαααΆααααα αΌααααα»ααααα»ααααααΆαα
- α’αααααα½αααααααα·ααααα·ααΆαααΆα αα·ααα·ααααΈα
ααα αΆαααΈ 1β3 αα·α 7 ααααΌαααΆαα’αα»αααααα αααα»αααΌαααααΆααα ααΎαααΆαααΈαααααα α αΎαααα αΆα 5β6 ααααΌαααΆαα’αα»αααααα ααΎαααΆαααΈαα
ααΆαα’αα·αααααΈαααΆα
ααΆαααααΌαααΆαα’αα·αααααΈααααααααΎααα―αααααααα’αααααααΎ αα·αααααΆααΆαααααααα’αααααα½αα ααΎαααΉαααααααΆααΆαααααΈαααααΆα ααα»αααααααααΆαααααα αΆααα ααααΈααααα’αααααα½αααααΌαααααααΌαααΆαα
αΆααααααΎα αααααΊααΆαααααα·ααααα·ααΆααααΆαα αα
ααΆαααα½αα α’αααα’αΆα
ααααΎααααΎ REST GET /api/accounts/getPublicKey?address={ADAMANT address}
α αΎααα
ααααααα»αααΆααααα ααααΆααΆααααααα interlocutors ααΉαααΆααα½α
α αΎαα
αααααα·ααΈααααΎααΆαα’αα·αααααΈαααΆααααααααΎαααα½ααααααααΆα 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'))
}
ααΆαααααΎααααα·ααααα·ααΆαααΆαα½αααΆααα ααΆααααααΆαααααααΆα
αααααΆααααααΆααααααααΌαααΆαααααΎαα·ααααααΆα αααααααΆααααΆαα½ααααααΆα API ααΎαα
αα ααΉαααααΎα ααααΎααααΎ POST αααα
ααα»α
αααα
αα api/transactions
:
curl 'api/transactions' -X POST
-d 'TX_DATA'
ααΆααΆαααααΎααα ααΎαααΉαααα½αααΆαααααααααΆααααααα·ααααα·ααΆααααααααα
{
"success": true,
"nodeTimestamp": 63228852,
"transactionId": "6146865104403680934"
}
αα»ααααΆαααααα·ααααα·ααΆα
ααααααααα ααα αΆαααααΆαα αααααα’ααααΎααΆαααααααα ααααα "ααΆαααααΉαααααΌα" ααααΆαααααα·ααααα·ααΆαα ααΈα’αααααΆ αα·ααα α’αααααΆ αα αααααΆ ααΆααΎααΆαααααΌαααΆααααα½ααααααΆααααααααα αα·αααΆααΎαααααααΆααααΆαααααΎααααΌαααΆαα ααα’α»ααααα αΆααααΆαααααΉαααααΌαα αααααΊααΆα’αααααααααααααααααΆαααααα»ααα blockchain - αα·αααΆααα ααΆαααααααααααααΆααααααα½ααα»αααααΌααααααΆααααΆααααααααααΆααααα αΎαααααΆααααααΆααα·αααΆαα·ααΆαααααα½ααααα·αα’αΆα ααααααααααααΆαααα
ααΈαα½αααααΆαααα½ααα·αα·αααααΎαααΆαααααΉαααααΌα α αΎααααααΆααααααααΎααΆαα α’ααααααααααα - ααααα·αααΎααΆαα αααΎααα·ααΆαααΆα’αααΈααααααααΆαααΊαααα·ααα αααα»αααααΆαα ααααα·ααααα·ααΆαααΉαααααΌαααΆααα½ααααα αΌααα αααα»ααααα»ααααααΆαααααααααααααΆααααα - αααααΊααΆααΆααααααααα
ααααααααααααΌαααααΆαααααααα½ααα»αααααΌαα
ααααααΆααααα½ααα·αα·αααα’αΆα
ααΎαααΆααα
ααΎ GitHub -
αα½αααΆααααααα·ααααα·ααΆαααΆαα½αααΆααα αααα»ααααα»α
ααααα·αααΎααΆααααααααααααΌαααΆαααΆαααα ααααα·ααααα·ααΆαααΆαα½αααΆαααααααΎαααΉαααααΌαααΆααααα αΌααααα»ααααα»ααααααΆαα αα½αααΆαα½αααΉαααααα·ααααα·ααΆααααααΆααα»ααααΆαααααααααα
αααα»αααΆαααααΆααααΉααααΉα α αΎααααα»ααααααααααΆααααΈαα½ααααααΌαααΆααααααΎαα‘αΎααααααα’ααααΎαααααΆαααααα»ααα»ααα
α
ααα»α
αααααΊααΆααΆαααααααΎαααααααΌαααΆααααα
αΌααααα»αααααΆαααααααααα α αΎααα·αα’αΆα
"αααα
αα‘αΎααα·α" ααΆαααα ααααα·αααΎααΆαααΆα
αααΎαααααΆααα
αΌααα
αααα»ααααα»α ααΆααααααΆαα·ααααααα½αααααΉαααααΌαααΆααααααααα timestamp
ααΆαα
ααΆαα’αΆαααΆα
αααααα·ααΈααααΎααΆααα
ααααααα·ααααα·ααΆαααΈ 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 α αα ααααααααααΆααααα½αααΆαααααα·ααααα·ααΆαααααΈ ααΆαα·αα·ααααα»ααααΆαααααααΆ α αΎααααααΌαααΆαα ααααΆααααααααααα ααααα·ααααα·ααΆααααααΆααααααΆααα’αα·αα·ααααααΎααΆα ααΌααααΈαααα»ααααααΆαα―αααΆαααΎαα‘αΎα αα·αααΆαααΆαααααα αΌααααα»ααααα»ααααααα αα·ααΈααα ααΎαααΉααααααΌαααΆαααααΆαα ααΌα α’αααααααΎααΆααααααΆααααααααΆαααα
ααΎααααΈαααααΆαα»αααααα
α’αΆααααααΆα ααΎαααΆααααααΎα KVS - Key-Value Storage - αααααΊααΆααααααααααα·ααααα·ααΆααα½αααααααααααααα
αααα»ααααα asset
ααΆαα·ααααααΆαααα’αα NaCl αααααααΌαααΆαα’αα·αααααΈααα ααα»αααα
ααΆααααααα―αααΆα/ααΌαααΆα αα·αααΆαααααααΆαααα»ααα ααααααΌαααΆαααΆαααΆαα αααΎαα ααΆβααΆαβαα·αβααΆαα αα βαααα»αβααααααβαααβαα·αβα αααΆααβααΆααβαα·αβααΆαβαα·αβα αααΆααβαααβα’αΆα βααααΌαβααΆα "αα·α" αααΆαβααΆααβαα αα ααα»ααααβααΎαβα ααβαααααΆβααααα·αβα―αααααΆαβααααα
ααΆα / α αΆα ααΆαα ααααΆαααΆαααΆααααααααΌαααααΎ - ααΆαα§ααααααα· α―αααααΆααα·αααααΆααααααααααΆα’αααααααΎααααΆααααΉααα·αααααΆαααα ααααΆαααααααΆαααΆααΆααααα ααα»ααααααΉαααΎαα‘αΎαααααααα½αα―αα ααΎβα’αααβαα·αβααΆβα’αααβααααΎβαααβααΆαβααΆαααβααα»ααααΆα? ααααΉαααααΌαα αΎα 0. ααΎαα’αΆα αααααααΆααααα αΆαααααααααααααΆαα½ααααα Tor ααααα’αααααΆαααΆαα
ααΎαααΆααααα αΆαααΆα’αααααΆαααΆααα
ααΎ blockchain α’αΆα
ααΆαα ααΆαβααΈβαα»αβααΆαβααΆαβααα»ααααβααβαα½αβαααβαααα»αβααααΆα α’α α‘α’ -
α αΎαααΆαααααααααΊαααααΆαααααΆααα·ααααααΆα’αααααΆαααΆααα
ααΎ blockchain ααΊαα»ααααααααΆαααααα½ααα - ααα»ααααα·αααΆααααααααααα½ααα½α
ααΆααααα
ααΎααααΈααα½ααα»αααααΌαα
ααααααααΈαααααα½αααααΆαααΆααααΆααααααααΆαααααΆαααααα½ααα·αααΆααααΆαα·ααααΆααΆαααα αΎααα
αα
αααα·ααααΆαα·αα’αα»ααααΆαα±ααααΆαααααΏαααΏααα
ααΎ blockchain ααα analogues αα
αα
αααα·ααααΆααΆα
αααΎααααααααααααααααααΎαααΉααααα αΆααα
ααααααααα α’αααααΉαααΎαα
ααααα: www.habr.com