غیر متمرکز میسینجر څنګه په بلاکچین کې کار کوي؟

د 2017 په پیل کې، موږ د کلاسیک P2P میسینجرونو ګټو په اړه بحث کولو سره په بلاکچین کې د میسنجر رامینځته کول پیل کړل [نوم او لینک په پروفایل کې دی].

پاس شو 2.5 کال، او موږ وکولای شو خپل مفهوم تایید کړو: د میسینجر غوښتنلیکونه اوس د iOS، Web PWA، وینډوز، GNU/Linux، Mac OS او Android لپاره شتون لري.

نن ورځ موږ به تاسو ته ووایو چې د بلاکچین میسنجر څنګه کار کوي او څنګه د پیرودونکي غوښتنلیکونه د دې API سره کار کولی شي.
غیر متمرکز میسینجر څنګه په بلاکچین کې کار کوي؟

موږ غواړو بلاکچین د کلاسیک P2P میسنجرونو امنیت او محرمیت مسلې حل کړي:

  • د حساب جوړولو لپاره یو کلیک - هیڅ تلیفون یا بریښنالیک نه ، د پتې کتابونو یا جیو ځایونو ته لاسرسی نشته.
  • خبرې کونکي هیڅکله مستقیم ارتباط نه رامینځته کوي؛ ټولې اړیکې د نوډونو ویشل شوي سیسټم له لارې ترسره کیږي. د کاروونکو IP پتې یو بل ته د لاسرسي وړ ندي.
  • ټول پیغامونه د پای څخه تر پای پورې وکر25519xsalsa20poly1305 کوډ شوي دي. داسې ښکاري چې دا به هیڅوک حیران نه کړي، مګر زموږ د سرچینې کوډ خلاص دی.
  • د MITM برید خارج شوی - هر پیغام یو لیږد دی او د Ed25519 EdDSA لخوا لاسلیک شوی.
  • پیغام په خپل بلاک کې پای ته رسیږي. تسلسل او timestamp تاسو نشئ کولی بلاکونه حل کړئ ، او له همدې امله د پیغامونو ترتیب.
  • "ما دا نه دي ویلي" به په بلاکچین کې د پیغامونو سره کار ونکړي.
  • هیڅ مرکزي جوړښت شتون نلري چې د پیغام "ریښتیني" چک کوي. دا د توافق پر بنسټ د نوډونو ویشل شوي سیسټم لخوا ترسره کیږي، او دا د کاروونکو ملکیت دی.
  • د سانسور ناممکنیت - حسابونه نشي بندیدلی او پیغامونه نشي حذف کیدی.
  • بلاکچین 2FA د SMS له لارې د دوزخي 2FA بدیل دی، ډیر روغتیا یې خرابه کړه.
  • په هر وخت کې د هرې وسیلې څخه ستاسو د ټولو خبرو اترو ترلاسه کولو وړتیا پدې معنی ده چې تاسو اړتیا نلرئ په محلي توګه خبرې اترې ذخیره کړئ.
  • د پیغام رسولو تایید. د کارونکي وسیلې ته نه ، مګر شبکې ته. په لازمي ډول، دا ستاسو د پیغام لوستلو لپاره د ترلاسه کونکي وړتیا تاییدوي. دا د انتقادي خبرتیاو لیږلو لپاره ګټور خصوصیت دی.

د بلاکچین ګټو کې د کریپټو کارنسي ایتیریم ، ډوګیکوین ، لیسک ، ډش ، بټکوین سره نږدې ادغام (دا لاهم په پرمختګ کې دی) او په چیټونو کې د توکیو لیږلو وړتیا شامل دي. موږ حتی یو جوړ شوی کریپټو ایکسچینجر جوړ کړ.

او بیا - دا ټول څنګه کار کوي.

پیغام یوه معامله ده

هرڅوک دمخه د دې حقیقت سره عادت شوي دي چې په بلاکچین کې لیږدونه له یو کارونکي څخه بل ته توکیان (سکې) لیږدوي. د Bitcoin په څیر. موږ د پیغامونو لیږدولو لپاره یو ځانګړی ډول لیږد رامینځته کړی.

په بلاکچین کې په میسینجر کې د پیغام لیږلو لپاره ، تاسو اړتیا لرئ څو مرحلو ته لاړشئ:

  1. د پیغام متن کوډ کړئ
  2. سیفر متن په راکړه ورکړه کې واچوئ
  3. معامله لاسلیک کړئ
  4. هرې شبکې نوډ ته معامله واستوئ
  5. د نوډونو ویشل شوی سیسټم د پیغام "حقیقت" ټاکي
  6. که هرڅه سم وي، د پیغام سره معامله په راتلونکي بلاک کې شامله ده
  7. ترلاسه کونکی د پیغام لیږد بیرته ترلاسه کوي او کوډ کوي

1-3 او 7 مرحلې په محلي توګه په پیرودونکي کې ترسره کیږي، او 5-6 مرحلې په کوربه کې ترسره کیږي.

د پیغام کوډ کول

پیغام د لیږونکي شخصي کیلي او د ترلاسه کونکي عامه کیلي سره کوډ شوی. موږ به عامه کیلي له شبکې څخه واخلو، مګر د دې لپاره، د ترلاسه کونکي حساب باید پیل شي، دا دی، لږترلږه یو لیږد ولرئ. تاسو کولی شئ د REST غوښتنه وکاروئ GET /api/accounts/getPublicKey?address={ADAMANT address}، او کله چې د خبرو اترو بار کول ، د خبرو کونکو عامه کیلي به دمخه شتون ولري.

غیر متمرکز میسینجر څنګه په بلاکچین کې کار کوي؟

میسنجر د curve25519xsalsa20poly1305 الګوریتم په کارولو سره پیغامونه کوډ کوي (د NaCl بکس). څرنګه چې حساب د Ed25519 کیلي لري، د بکس جوړولو لپاره، کیلي باید لومړی په Curve25519 Diffie-Hellman کې بدل شي.

دلته په جاواسکریپټ کې یوه بیلګه ده:

/**
 * 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 سره معامله هش کوو او بیا یې لاسلیک کوو 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()
}

۳ – معامله لاسلیک کړئ

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 کې لیدل کیدی شي - validator.js и verify.js. هو، نوډ په Node.js پرمخ ځي.

په یو بلاک کې د پیغام سره د لیږد په شمول

که موافقت ته ورسیږي، زموږ د پیغام سره معامله به په راتلونکي بلاک کې د نورو معتبر معاملو سره یوځای شي.

بلاکونه یو سخت ترتیب لري، او هر راتلونکی بلاک د پخوانیو بلاکونو د هشونو پر بنسټ جوړ شوی.

غیر متمرکز میسینجر څنګه په بلاکچین کې کار کوي؟

خبره دا ده چې زموږ پیغام هم په دې ترتیب کې شامل دی او نشي کولی "بیا تنظیم شي". که څو پیغامونه په بلاک کې راښکته شي، د دوی ترتیب به د دې لخوا ټاکل کیږي 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 جوړ کړی - د کلیدي ارزښت ذخیره - دا د لیږد یو بل ډول دی چې په کې asset دا د NaCl-box نه دی چې کوډ شوی وي، مګر NaCl - پټ بکس. دا څنګه میسینجر نور معلومات ذخیره کوي.

د فایل/عکس لیږد او ګروپ چیټونه لاهم ډیر کار ته اړتیا لري. البته، د غلطۍ او غلطۍ بڼه کې دا په چټکۍ سره "پیچ" کیدی شي، مګر موږ غواړو د محرمیت ورته کچه وساتو.

هو، لاهم کار شتون لري چې باید ترسره شي - په مثالي توګه، ریښتینې محرمیت داسې انګیرل کیږي چې کاروونکي به د عامه شبکې نوډونو سره وصل نشي، مګر خپل ځان به لوړ کړي. ستاسو په اند د کاروونکو څومره سلنه دا کار کوي؟ دا سمه ده، 0. موږ وکولای شو چې دا مسله د میسینجر د تور نسخې سره په جزوي توګه حل کړو.

موږ ثابته کړې چې په بلاکچین کې میسینجر شتون لري. پخوا، په 2012 کې یوازې یوه هڅه وه - بټ پیغام، کوم چې د اوږد پیغام رسولو وختونو، CPU بار، او د ګرځنده غوښتنلیکونو نشتوالي له امله ناکام شو.

او شک د دې حقیقت له امله دی چې په بلاکچین کې میسنجرونه له خپل وخت څخه مخکې دي - خلک چمتو ندي چې د دوی حساب مسؤلیت په غاړه واخلي ، د شخصي معلوماتو مالکیت لاهم یو رجحان نه دی ، او ټیکنالوژي په بلاکچین کې لوړ سرعت ته اجازه نه ورکوي. زموږ د پروژې نور تخنیکي انلاګونه به په راتلونکي کې څرګند شي. تاسو به وګورئ.

سرچینه: www.habr.com

Add a comment