በብሎክቼይን ላይ ያልተማከለ መልእክተኛ እንዴት ይሰራል?

እ.ኤ.አ. በ2017 መጀመሪያ ላይ በብሎክቼይን ላይ መልእክተኛ መፍጠር ጀመርን [ስም እና ማገናኛ በፕሮፋይሉ ውስጥ ናቸው] ከጥንታዊ የP2P መልእክተኞች ይልቅ ያለውን ጥቅም በመወያየት።

አለፈ 2.5 ዓመት, እና የእኛን ጽንሰ-ሐሳብ ማረጋገጥ ችለናል፡ የሜሴንጀር አፕሊኬሽኖች አሁን ለ iOS፣ Web PWA፣ Windows፣ GNU/Linux፣ Mac OS እና Android ይገኛሉ።

ዛሬ የብሎክቼይን መልእክተኛ እንዴት እንደሚሰራ እና የደንበኛ አፕሊኬሽኖች ከኤፒአይ ጋር እንዴት እንደሚሰሩ እንነግርዎታለን።
በብሎክቼይን ላይ ያልተማከለ መልእክተኛ እንዴት ይሰራል?

የታወቁ የP2P መልእክተኞች ደህንነት እና ግላዊነት ጉዳዮችን እንዲፈታ blockchain እንፈልጋለን።

  • መለያ ለመፍጠር አንድ ጊዜ ጠቅ ያድርጉ - ምንም ስልኮች ወይም ኢሜይሎች የሉም ፣ የአድራሻ መጽሐፍት ወይም የጂኦግራፊያዊ አካባቢዎች ።
  • ኢንተርሎኩተሮች በፍፁም ቀጥተኛ ግንኙነቶችን አይመሰረቱም ፣ ሁሉም ግንኙነቶች የሚከናወነው በተከፋፈለ የአንጓዎች ስርዓት ነው። የተጠቃሚዎች አይፒ አድራሻዎች እርስበርስ ተደራሽ አይደሉም።
  • ሁሉም መልዕክቶች የተመሰጠሩት ከመጨረሻ እስከ መጨረሻ ከርቭ25519xsalsa20poly1305 ነው። ይህ ማንንም የማያስደንቅ ይመስላል, ነገር ግን የእኛ ምንጭ ኮድ ክፍት ነው.
  • MITM ጥቃት አይካተትም - እያንዳንዱ መልእክት ግብይት ነው እና በ Ed25519 EdDSA የተፈረመ ነው።
  • መልእክቱ በራሱ እገዳ ውስጥ ያበቃል. ወጥነት እና timestamp ብሎኮችን ማስተካከል አይችሉም, እና ስለዚህ የመልእክቶቹን ቅደም ተከተል.
  • "እኔ አላልኩም" በብሎክቼይን ላይ ካሉ መልዕክቶች ጋር አይሰራም።
  • የመልእክቱን "ትክክለኛነት" የሚያረጋግጥ ማዕከላዊ መዋቅር የለም። ይህ የሚከናወነው በጋራ መግባባት ላይ በተመሰረተ በተሰራጨ የአንጓዎች ስርዓት ነው, እና በተጠቃሚዎች ባለቤትነት የተያዘ ነው.
  • ሳንሱር ማድረግ የማይቻል - መለያዎች ሊታገዱ አይችሉም እና መልዕክቶች ሊሰረዙ አይችሉም።
  • Blockchain 2FA በኤስኤምኤስ በኩል ከገሃነም 2FA አማራጭ ነው፣ ብዙ ጤና አበላሽቷል.
  • ሁሉንም ውይይቶችዎን በማንኛውም ጊዜ ከማንኛውም መሳሪያ የማግኘት ችሎታ ማለት ውይይቶችን በምንም መልኩ ማከማቸት የለብዎትም ማለት ነው።
  • የመልእክት መላኪያ ማረጋገጫ። ለተጠቃሚው መሣሪያ ሳይሆን ለአውታረ መረቡ። በመሰረቱ፣ ይህ የተቀባዩ መልእክትዎን የማንበብ ችሎታ ማረጋገጫ ነው። ይህ ወሳኝ ማሳወቂያዎችን ለመላክ ጠቃሚ ባህሪ ነው።

የብሎክቼይን ጥቅማጥቅሞች ከክሪፕቶ ምንዛሬዎች 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}እና ቻቶችን በሚጭኑበት ጊዜ የኢንተርሎኩተሮች ይፋዊ ቁልፎች ቀድሞውኑ ይገኛሉ።

በብሎክቼይን ላይ ያልተማከለ መልእክተኛ እንዴት ይሰራል?

መልእክተኛው ኩርባ25519xsalsa20poly1305 ስልተቀመር (algorithm) በመጠቀም መልእክቶችን ያመሰጥራቸዋል።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እና የግብይት መታወቂያው የ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'))
}

ወደ አውታረ መረብ መስቀለኛ መንገድ ከመልዕክት ጋር ግብይት በመላክ ላይ

አውታረ መረቡ ያልተማከለ ስለሆነ፣ ክፍት ኤፒአይ ያላቸው ማንኛቸውም አንጓዎች ይሰራሉ። በመጨረሻው ነጥብ ላይ የPOST ጥያቄ ማቅረብ api/transactions:

curl 'api/transactions' -X POST 
  -d 'TX_DATA'

በምላሹም የግብይት መታወቂያ አይነት እንቀበላለን

{
    "success": true,
    "nodeTimestamp": 63228852,
    "transactionId": "6146865104403680934"
}

የግብይት ማረጋገጫ

በስምምነት ላይ የተመሰረተ የተከፋፈለ የአንጓዎች ስርዓት የግብይቱን መልእክት "ትክክለኛነት" ይወስናል. ከማን እና ከማን ፣ መቼ ፣ መልእክቱ በሌላ ተተካ ፣ እና የመላክ ጊዜ በትክክል መገለጹን ። ይህ የ blockchain በጣም ጠቃሚ ጠቀሜታ ነው - ለማረጋገጫ ኃላፊነት ያለው ማዕከላዊ መዋቅር የለም, እና የመልእክቶች ቅደም ተከተል እና ይዘታቸው ሊታለል አይችልም.

በመጀመሪያ አንድ መስቀለኛ መንገድ ትክክለኛነትን ይፈትሻል, ከዚያም ወደ ሌሎች ይልካል - ብዙዎቹ ሁሉም ነገር በሥርዓት እንደሆነ ከተናገሩ, ግብይቱ በሚቀጥለው ሰንሰለት ውስጥ ይካተታል - ይህ ስምምነት ነው.

በብሎክቼይን ላይ ያልተማከለ መልእክተኛ እንዴት ይሰራል?

ለቼኮች ኃላፊነት ያለው የመስቀለኛ ኮድ ክፍል በ GitHub ላይ ሊታይ ይችላል - አረጋጋጭ.js и አረጋግጥ.js. አዎ፣ መስቀለኛ መንገድ በ Node.js ላይ ይሰራል።

በብሎክ ውስጥ ያለ መልእክት ግብይትን ጨምሮ

መግባባት ላይ ከተደረሰ ከመልእክታችን ጋር ያለው ግብይት ከሌሎች ትክክለኛ ግብይቶች ጋር በሚቀጥለው ብሎክ ውስጥ ይካተታል።

እገዳዎች ጥብቅ ቅደም ተከተል አላቸው, እና እያንዳንዱ ተከታይ እገዳዎች በቀደሙት ብሎኮች ላይ ተመስርተው ይመሰረታሉ.

በብሎክቼይን ላይ ያልተማከለ መልእክተኛ እንዴት ይሰራል?

ዋናው ነገር መልእክታችን በዚህ ቅደም ተከተል ውስጥ የተካተተ በመሆኑ "እንደገና ሊስተካከል" አይችልም. ብዙ መልእክቶች በብሎክ ውስጥ ከወደቁ ትዕዛዛቸው የሚወሰነው በ 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-box አይደለም፣ ግን NaCl-ሚስጥራዊ ሳጥን. መልእክተኛው ሌላ መረጃ የሚያከማችበት መንገድ በዚህ መንገድ ነው።

ፋይል/ምስል ማስተላለፎች እና የቡድን ውይይቶች አሁንም ብዙ ስራ ይጠይቃሉ። እርግጥ ነው፣ በብልሽት እና ብዥታ ቅርፀት ይህ በፍጥነት “ሊበላሽ” ይችላል፣ ነገር ግን ተመሳሳይ የግላዊነት ደረጃን መጠበቅ እንፈልጋለን።

አዎ፣ ገና የሚሠራው ሥራ አለ - በሐሳብ ደረጃ፣ እውነተኛ ግላዊነት ተጠቃሚዎች ከሕዝብ አውታረ መረብ ኖዶች ጋር እንደማይገናኙ፣ ግን የራሳቸውን እንደሚያነሱ ይገምታል። ይህን የሚያደርገው ምን ያህል የተጠቃሚዎች መቶኛ ይመስላችኋል? ልክ ነው፣ 0. ይህንን ችግር በከፊል በቶር የመልእክተኛው ቅጂ መፍታት ችለናል።

በብሎክቼይን ላይ መልእክተኛ ሊኖር እንደሚችል አረጋግጠናል። ከዚህ ቀደም በ 2012 አንድ ሙከራ ብቻ ነበር - bitmessageበረዥም የመልእክት ማቅረቢያ ጊዜ፣ የሲፒዩ ጭነት እና የሞባይል አፕሊኬሽኖች እጥረት ምክንያት ያልተሳካለት።

እና ጥርጣሬ በ blockchain ላይ ያሉ መልእክተኞች ጊዜያቸውን ቀድመው በመሆናቸው ነው - ሰዎች ለሂሳባቸው ሃላፊነት ለመውሰድ ዝግጁ አይደሉም ፣ የግል መረጃ ባለቤትነት ገና አዝማሚያ አይደለም ፣ እና ቴክኖሎጂ በብሎክቼይን ላይ ከፍተኛ ፍጥነትን አይፈቅድም። የፕሮጀክታችን ተጨማሪ ቴክኖሎጂያዊ አናሎግ ቀጥሎ ይታያል። ታያለህ።

ምንጭ: hab.com

አስተያየት ያክሉ