Мессенджери ғайримарказӣ дар blockchain чӣ гуна кор мекунад?

Дар ибтидои соли 2017, мо тавассути баррасии бартариятҳо нисбат ба паёмнависони классикии P2P ба сохтани паёмбар дар blockchain оғоз кардем [ном ва истинод дар профил].

Рафт 2.5 сол, ва мо тавонистем консепсияи худро тасдиқ кунем: замимаҳои паёмнависӣ ҳоло барои iOS, Web PWA, Windows, GNU/Linux, Mac OS ва Android дастрасанд.

Имрӯз мо ба шумо мегӯям, ки мессенҷери blockchain чӣ гуна кор мекунад ва чӣ гуна барномаҳои муштарӣ бо API-и он кор карда метавонанд.
Мессенджери ғайримарказӣ дар blockchain чӣ гуна кор мекунад?

Мо мехостем, ки 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. Матни паёмро рамзгузорӣ кунед
  2. Матнро ба транзаксия гузоред
  3. Ба транзаксия имзо гузоред
  4. Ба ягон гиреҳи шабака транзаксия фиристед
  5. Системаи тақсимшудаи гиреҳҳо "аслӣ будани" паёмро муайян мекунад
  6. Агар ҳама чиз хуб бошад, транзаксия бо паём ба блоки навбатӣ дохил карда мешавад
  7. Қабулкунанда муомилоти паёмро мегирад ва рамзкушоӣ мекунад

Қадамҳои 1-3 ва 7 ба таври маҳаллӣ дар мизоҷ ва қадамҳои 5-6 дар мизбон иҷро карда мешаванд.

Рамзгузории паём

Паём бо калиди шахсии ирсолкунанда ва калиди ҷамъиятии қабулкунанда рамзгузорӣ карда мешавад. Мо калиди ҷамъиятиро аз шабака мегирем, аммо барои ин ҳисоби қабулкунанда бояд оғоз карда шавад, яъне ҳадди аққал як транзаксия дошта бошад. Шумо метавонед дархости REST-ро истифода баред GET /api/accounts/getPublicKey?address={ADAMANT address}, ва ҳангоми боркунии чатҳо, калидҳои ҷамъиятии мусоҳибон аллакай дастрас хоҳанд буд.

Мессенджери ғайримарказӣ дар blockchain чӣ гуна кор мекунад?

Мессенджер паёмҳоро бо истифода аз алгоритми curve25519xsalsa20poly1305 рамзгузорӣ мекунад (Қуттии NaCl). Азбаски ҳисоб калидҳои Ed25519 дорад, барои сохтани қуттӣ, калидҳо бояд аввал ба Curve25519 Diffie-Hellman табдил дода шаванд.

Ин як мисол дар 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": "тут будет подпись"
  }
}

Имзои транзаксия

Барои он ки ҳама ба ҳаққонияти ирсолкунанда ва қабулкунанда, вақти ирсол ва мундариҷаи паём боварӣ дошта бошанд, муомилот ба имзо мерасад. Имзои рақамӣ ба шумо имкон медиҳад, ки дурустии транзаксияро бо истифода аз калиди ҷамъиятӣ тафтиш кунед - барои ин калиди хусусӣ лозим нест.

Аммо худи имзо бо истифода аз калиди хусусӣ анҷом дода мешавад:

Мессенджери ғайримарказӣ дар blockchain чӣ гуна кор мекунад?

Диаграмма нишон медиҳад, ки мо аввал транзаксияро бо SHA-256 ҳаш карда, сипас онро имзо мекунем Ed25519 EdDSA ва имзо гиред 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"
}

Тасдиқи транзаксия

Системаи тақсимшудаи гиреҳҳо, ки дар асоси консенсус, "аслӣ будани" паёми транзаксияро муайян мекунад. Аз кй ва ба кй, кай, хабар ба дигараш иваз карда шудааст ва оё вакти фиристодан дуруст нишон дода шудааст. Ин як бартарии хеле муҳими blockchain аст - ягон сохтори марказӣ вуҷуд надорад, ки барои тафтиш масъул бошад ва пайдарпайии паёмҳо ва мундариҷаи онҳоро қалбакӣ кардан мумкин нест.

Аввалан, як гиреҳ дурустии онро тафтиш мекунад ва сипас онро ба дигарон мефиристад - агар аксарият гӯянд, ки ҳама чиз дуруст аст, транзаксия ба блоки навбатии занҷир дохил карда мешавад - ин консенсус аст.

Мессенджери ғайримарказӣ дар blockchain чӣ гуна кор мекунад?

Қисми рамзи гиреҳро, ки барои чек масъул аст, дар GitHub дидан мумкин аст - validator.js и verify.js. Бале, гиреҳ дар Node.js кор мекунад.

Аз ҷумла транзаксия бо паём дар блок

Агар консенсус ҳосил шавад, транзаксия бо паёми мо дар якҷоягӣ бо дигар транзаксияҳои дуруст ба блоки навбатӣ дохил карда мешавад.

Блокҳо пайдарпайии қатъӣ доранд ва ҳар як блоки минбаъда дар асоси hashes блокҳои қаблӣ ташкил карда мешавад.

Мессенджери ғайримарказӣ дар blockchain чӣ гуна кор мекунад?

Гап дар сари он аст, ки паёми мо низ дар ин пайдарпай шомил аст ва онро "аз нав тартиб додан" мумкин нест. Агар якчанд паём ба блок афтад, тартиби онҳо аз ҷониби муайян карда мешавад 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 сония интиқол дода мешаванд - ин вақт блоки нави шабака пайдо мешавад - мо пайвасти муштарӣ ба гиреҳ ва гиреҳ ба гиреҳро пайдо кардем. Вақте ки гиреҳ амалиёти нав мегирад, он эътибори онро месанҷад ва онро ба гиреҳҳои дигар интиқол медиҳад. Муомилот барои муштариёни мессенҷер ҳатто пеш аз пайдо шудани консенсус ва ворид шудан ба блок дастрас аст. Бо ин роҳ мо паёмҳоро ба мисли паёмнависони фаврии муқаррарӣ фавран интиқол медиҳем.

Барои нигоҳ доштани китоби суроғаҳо, мо KVS - нигаҳдории калидҳоро сохтем - ин як намуди дигари транзаксия аст, ки дар он asset он аст, NaCl-қуттии, ки рамзкунонидашуда нест,, балки NaCl - қуттии махфӣ. Ин аст, ки паёмбар маълумоти дигарро нигоҳ медорад.

Интиқоли файл/тасвир ва чатҳои гурӯҳӣ ҳоло ҳам кори зиёдеро талаб мекунанд. Албатта, дар формати хато ва хато ин метавонад ба зудӣ "вайрон карда шавад", аммо мо мехоҳем ҳамон сатҳи махфиятро нигоҳ дорем.

Бале, ҳанӯз коре бояд анҷом дода шавад - идеалӣ, махфияти воқеӣ тахмин мекунад, ки корбарон ба гиреҳҳои шабакаи ҷамъиятӣ пайваст намешаванд, балки гиреҳҳои худро баланд мекунанд. Ба назари шумо чанд фоизи корбарон ин корро мекунад? Дуруст, 0. Мо тавонистем бо версияи Tor мессенҷер ин масъаларо қисман ҳал кунем.

Мо исбот кардем, ки паёмбар дар blockchain метавонад вуҷуд дошта бошад. Пештар, танҳо як кӯшиш дар соли 2012 буд - паёми bit, ки аз сабаби муддати тӯлонии интиқоли паём, сарбории CPU ва набудани барномаҳои мобилӣ ноком шуд.

Ва шубҳа ба он вобаста аст, ки мессенҷерҳо дар блокчейн аз замони худ пеш гузаштаанд - одамон омода нестанд, ки барои ҳисоби худ масъулият ба дӯш гиранд, соҳиби маълумоти шахсӣ ҳанӯз тамоюл нест ва технология суръати баландро дар blockchain иҷозат намедиҳад. Дар оянда аналогҳои бештари технологии лоиҳаи мо пайдо мешаванд. Шумо хоҳед дид.

Манбаъ: will.com

Илова Эзоҳ