Blockchain මත විමධ්‍යගත පණිවිඩකරුවෙකු ක්‍රියා කරන්නේ කෙසේද?

2017 ආරම්භයේදී, අපි සම්භාව්‍ය P2P පණිවිඩකරුවන්ට වඩා වාසි සාකච්ඡා කරමින් blockchain [නම සහ සබැඳිය පැතිකඩෙහි ඇත] පණිවිඩකරුවෙකු නිර්මාණය කිරීම ආරම්භ කළෙමු.

ගියා 2.5 වසර, සහ අපගේ සංකල්පය තහවුරු කිරීමට අපට හැකි විය: iOS, Web PWA, Windows, GNU/Linux, Mac OS සහ Android සඳහා දැන් messenger යෙදුම් තිබේ.

අද අපි ඔබට බ්ලොක්චේන් මැසෙන්ජර් ක්‍රියා කරන ආකාරය සහ එහි API සමඟ සේවාදායක යෙදුම් ක්‍රියා කළ හැකි ආකාරය ගැන කියන්නෙමු.
Blockchain මත විමධ්‍යගත පණිවිඩකරුවෙකු ක්‍රියා කරන්නේ කෙසේද?

සම්භාව්‍ය P2P පණිවිඩකරුවන්ගේ ආරක්‍ෂාව සහ රහස්‍යතා ගැටලු විසඳීමට අපට බ්ලොක්චේන් අවශ්‍ය විය:

  • ගිණුමක් සෑදීමට එක් ක්ලික් කිරීමක් - දුරකථන හෝ ඊමේල් නැත, ලිපින පොත් හෝ භූ ස්ථාන වෙත ප්‍රවේශයක් නැත.
  • මැදිහත්කරුවන් කිසි විටෙකත් සෘජු සම්බන්ධතා ඇති නොකරයි; සියලුම සන්නිවේදනයන් බෙදා හරින ලද නෝඩ් පද්ධතියක් හරහා සිදු වේ. පරිශීලකයන්ගේ IP ලිපින එකිනෙකාට ප්‍රවේශ විය නොහැක.
  • සියලුම පණිවිඩ End-to-End curve25519xsalsa20poly1305 සංකේතනය කර ඇත. මෙය කිසිවෙකු පුදුමයට පත් නොකරන බව පෙනේ, නමුත් අපගේ මූල කේතය විවෘතයි.
  • MITM ප්‍රහාරය බැහැර කර ඇත - සෑම පණිවිඩයක්ම ගනුදෙනුවක් වන අතර Ed25519 EdDSA විසින් අත්සන් කර ඇත.
  • පණිවිඩය එහිම කොටසකින් අවසන් වේ. අනුකූලතාව සහ timestamp ඔබට අවහිර කිරීම් නිවැරදි කළ නොහැක, එබැවින් පණිවිඩවල අනුපිළිවෙල.
  • බ්ලොක්චේන් හි පණිවිඩ සමඟ "මම එය කීවේ නැත".
  • පණිවිඩයක සත්‍යතාව පරීක්ෂා කරන මධ්‍යම ව්‍යුහයක් නොමැත. මෙය සිදු කරනු ලබන්නේ සම්මුතිය මත බෙදා හරින ලද නෝඩ් පද්ධතියක් මගිනි, එය පරිශීලකයන් සතු වේ.
  • වාරණය කළ නොහැකි වීම - ගිණුම් අවහිර කළ නොහැකි අතර පණිවිඩ මකා දැමිය නොහැක.
  • Blockchain 2FA යනු SMS හරහා අපායගාමී 2FA සඳහා විකල්පයකි. සෞඛ්ය ගොඩක් විනාශ කළා.
  • ඕනෑම වේලාවක ඕනෑම උපාංගයකින් ඔබගේ සියලු සංවාද ලබා ගැනීමේ හැකියාවෙන් අදහස් වන්නේ ඔබට සංවාද දේශීයව ගබඩා කිරීමට අවශ්‍ය නොවන බවයි.
  • පණිවිඩ බෙදා හැරීම තහවුරු කිරීම. පරිශීලකයාගේ උපාංගයට නොව, ජාලයට. මූලික වශයෙන්, මෙය ඔබගේ පණිවිඩය කියවීමට ලබන්නාගේ හැකියාව තහවුරු කිරීමකි. මෙය විවේචනාත්මක දැනුම්දීම් යැවීම සඳහා ප්රයෝජනවත් විශේෂාංගයකි.

Blockchain ප්‍රතිලාභවලට Ethereum, Dogecoin, Lisk, Dash, Bitcoin (මෙය තවමත් ක්‍රියාත්මක වෙමින් පවතී) සහ කතාබස් වල ටෝකන යැවීමේ හැකියාව යන ගුප්තකේතන මුදල් සමඟ සමීපව ඒකාබද්ධ වීමද ඇතුළත් වේ. අපි බිල්ට් ක්‍රිප්ටෝ හුවමාරු යන්ත්‍රයක් පවා සෑදුවෙමු.

ඉන්පසුව - සියල්ල ක්රියා කරන ආකාරය.

පණිවිඩයක් යනු ගනුදෙනුවකි

බ්ලොක්චේන් හි ගනුදෙනු එක් පරිශීලකයෙකුගෙන් තවත් කෙනෙකුට ටෝකන (කාසි) මාරු කරන බවට සෑම දෙනාම දැනටමත් පුරුදු වී සිටිති. Bitcoin වගේ. අපි පණිවිඩ සම්ප්රේෂණය සඳහා විශේෂ ගනුදෙනු වර්ගයක් නිර්මාණය කළා.

බ්ලොක්චේන් හි පණිවිඩකරුවෙකුට පණිවිඩයක් යැවීමට, ඔබ පියවර කිහිපයක් හරහා යා යුතුය:

  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, සහ ගනුදෙනු හැඳුනුම්පත 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 මත නැරඹිය හැකිය - Validator.js и verify.js. ඔව්, නෝඩය Node.js මත ධාවනය වේ.

බ්ලොක් එකක පණිවිඩයක් සමඟ ගනුදෙනුවක් ඇතුළුව

එකඟතාවයකට පැමිණියහොත්, අපගේ පණිවිඩය සමඟ ගනුදෙනුව වෙනත් වලංගු ගනුදෙනු සමඟ ඊළඟ කොටසට ඇතුළත් වේ.

බ්ලොක් වලට දැඩි අනුපිළිවෙලක් ඇති අතර, පසුව ඇති සෑම බ්ලොක් එකක්ම පෙර බ්ලොක් වල හෑෂ් මත පදනම්ව සෑදී ඇත.

Blockchain මත විමධ්‍යගත පණිවිඩකරුවෙකු ක්‍රියා කරන්නේ කෙසේද?

කාරණය වන්නේ අපගේ පණිවිඩය ද මෙම අනුපිළිවෙලට ඇතුළත් කර ඇති අතර එය "ප්රතිසංවිධානය" කළ නොහැක. පණිවිඩ කිහිපයක් බ්ලොක් එකකට වැටුණහොත්, ඒවායේ අනුපිළිවෙල තීරණය කරනු ලැබේ 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 කින් පමණ පණිවිඩ මේ ආකාරයෙන් ලබා දෙන බැවින් - නව ජාල වාරණයක් දිස්වන අවස්ථාව මෙයයි - අපි සේවාදායකයා-ට-නෝඩ් සහ නෝඩ්-ටු-නෝඩ් සොකට් සම්බන්ධතාවයක් ඉදිරිපත් කළෙමු. නෝඩයකට නව ගනුදෙනුවක් ලැබුණු විට, එය එහි වලංගුභාවය පරීක්ෂා කර වෙනත් නෝඩ් වෙත යොමු කරයි. සම්මුතිය ඇති වීමට සහ අවහිර කිරීමට පෙර පවා ගනුදෙනුව පණිවිඩකරු සේවාදායකයින්ට ලබා ගත හැකිය. මේ ආකාරයෙන් අපි සාමාන්‍ය ක්ෂණික පණිවිඩකරුවන් මෙන් ක්ෂණිකව පණිවිඩ ලබා දෙන්නෙමු.

ලිපින පොත ගබඩා කිරීම සඳහා, අපි KVS - Key-Value Storage - මෙය තවත් ආකාරයක ගනුදෙනුවකි. asset එය සංකේතනය කර ඇත්තේ NaCl-box නොවේ, නමුත් NaCl-රහස් පෙට්ටිය. පණිවිඩකරු වෙනත් දත්ත ගබඩා කරන්නේ එලෙසයි.

ගොනු/රූප මාරු කිරීම් සහ සමූහ කතාබස් සඳහා තවමත් විශාල වැඩ කොටසක් අවශ්‍ය වේ. ඇත්ත වශයෙන්ම, blunder-and-blunder ආකෘතියේ මෙය ඉක්මනින් "ඉස්කුරුප්පු" කළ හැක, නමුත් අපට එකම මට්ටමේ පෞද්ගලිකත්වය පවත්වා ගැනීමට අවශ්ය වේ.

ඔව්, තවමත් කළ යුතු කාර්යයක් තිබේ - ඉතා මැනවින්, සැබෑ පෞද්ගලිකත්වය උපකල්පනය කරන්නේ පරිශීලකයින් පොදු ජාල නෝඩ් වෙත සම්බන්ධ නොවන නමුත් ඔවුන්ගේම ඒවා ඉහළ නංවනු ඇති බවයි. ඔබ සිතන්නේ පරිශීලකයින්ගෙන් කොපමණ ප්‍රතිශතයක් මෙය කරයිද? ඒක හරි, 0. අපිට මේ ප්‍රශ්නය messenger එකේ Tor අනුවාදයෙන් අර්ධ වශයෙන් විසඳන්න පුළුවන් වුණා.

blockchain මත පණිවිඩකරුවෙකු පැවතිය හැකි බව අපි ඔප්පු කර ඇත. මීට පෙර, 2012 දී තිබුණේ එක් උත්සාහයක් පමණි - bitmessage, දිගු පණිවිඩ බෙදා හැරීමේ වේලාවන්, CPU පැටවීම සහ ජංගම යෙදුම් නොමැතිකම හේතුවෙන් අසාර්ථක විය.

බ්ලොක්චේන් හි පණිවිඩකරුවන් ඔවුන්ගේ කාලයට වඩා ඉදිරියෙන් සිටීම නිසා සංශයවාදය ඇති වේ - මිනිසුන් ඔවුන්ගේ ගිණුමේ වගකීම භාර ගැනීමට සූදානම් නැත, පුද්ගලික තොරතුරු හිමිකර ගැනීම තවමත් ප්‍රවණතාවක් නොවේ, සහ තාක්‍ෂණය බ්ලොක්චේන් හි අධික වේගයට ඉඩ නොදේ. අපගේ ව්‍යාපෘතියේ තවත් තාක්ෂණික ප්‍රතිසමයන් ඊළඟට දිස්වනු ඇත. ඔබ දකිවී.

මූලාශ්රය: www.habr.com

අදහස් එක් කරන්න