బ్లాక్‌చెయిన్‌లో వికేంద్రీకృత మెసెంజర్ ఎలా పని చేస్తుంది?

2017 ప్రారంభంలో, మేము క్లాసిక్ P2P మెసెంజర్‌ల కంటే ప్రయోజనాలను చర్చించడం ద్వారా బ్లాక్‌చెయిన్‌లో [పేరు మరియు లింక్ ప్రొఫైల్‌లో ఉన్నాయి] మెసెంజర్‌ని సృష్టించడం ప్రారంభించాము.

ఉత్తీర్ణులయ్యారు 2.5 సంవత్సరం, మరియు మేము మా భావనను నిర్ధారించగలిగాము: iOS, Web PWA, Windows, GNU/Linux, Mac OS మరియు Android కోసం ఇప్పుడు మెసెంజర్ అప్లికేషన్‌లు అందుబాటులో ఉన్నాయి.

బ్లాక్‌చెయిన్ మెసెంజర్ ఎలా పని చేస్తుందో మరియు క్లయింట్ అప్లికేషన్‌లు దాని APIతో ఎలా పని చేస్తాయో ఈరోజు మేము మీకు తెలియజేస్తాము.
బ్లాక్‌చెయిన్‌లో వికేంద్రీకృత మెసెంజర్ ఎలా పని చేస్తుంది?

క్లాసిక్ P2P మెసెంజర్‌ల భద్రత మరియు గోప్యతా సమస్యలను బ్లాక్‌చెయిన్ పరిష్కరించాలని మేము కోరుకుంటున్నాము:

  • ఖాతాను సృష్టించడానికి ఒక క్లిక్ - ఫోన్‌లు లేదా ఇమెయిల్‌లు లేవు, చిరునామా పుస్తకాలు లేదా జియోలొకేషన్‌లకు యాక్సెస్ లేదు.
  • సంభాషణకర్తలు ఎప్పుడూ ప్రత్యక్ష కనెక్షన్‌లను ఏర్పాటు చేయరు; అన్ని కమ్యూనికేషన్ నోడ్‌ల పంపిణీ వ్యవస్థ ద్వారా జరుగుతుంది. వినియోగదారుల IP చిరునామాలు ఒకదానికొకటి ప్రాప్యత చేయబడవు.
  • అన్ని సందేశాలు ఎండ్-టు-ఎండ్ కర్వ్25519xsalsa20poly1305 ఎన్‌క్రిప్ట్ చేయబడ్డాయి. ఇది ఎవరినీ ఆశ్చర్యపరచదు, కానీ మా సోర్స్ కోడ్ తెరిచి ఉంది.
  • MITM దాడి మినహాయించబడింది - ప్రతి సందేశం ఒక లావాదేవీ మరియు Ed25519 EdDSA ద్వారా సంతకం చేయబడింది.
  • సందేశం దాని స్వంత బ్లాక్‌లో ముగుస్తుంది. స్థిరత్వం మరియు timestamp మీరు బ్లాక్‌లను పరిష్కరించలేరు మరియు సందేశాల క్రమాన్ని సరిచేయలేరు.
  • బ్లాక్‌చెయిన్‌లోని సందేశాలతో "నేను చెప్పలేదు" పని చేయదు.
  • సందేశం యొక్క "ప్రామాణికత"పై తనిఖీలు చేసే కేంద్ర నిర్మాణం లేదు. ఇది ఏకాభిప్రాయం ఆధారంగా పంపిణీ చేయబడిన నోడ్‌ల వ్యవస్థ ద్వారా చేయబడుతుంది మరియు ఇది వినియోగదారుల స్వంతం.
  • సెన్సార్‌షిప్ అసాధ్యం - ఖాతాలను బ్లాక్ చేయడం సాధ్యం కాదు మరియు సందేశాలను తొలగించడం సాధ్యం కాదు.
  • బ్లాక్‌చెయిన్ 2FA అనేది SMS ద్వారా నరకం 2FAకి ప్రత్యామ్నాయం, చాలా ఆరోగ్యాన్ని నాశనం చేసింది.
  • ఏ సమయంలోనైనా మీ అన్ని సంభాషణలను ఏ పరికరం నుండి అయినా పొందగల సామర్థ్యం అనేది సంభాషణలను స్థానికంగా నిల్వ చేయకపోవడం.
  • సందేశ డెలివరీ యొక్క నిర్ధారణ. వినియోగదారు పరికరానికి కాదు, నెట్‌వర్క్‌కు. ముఖ్యంగా, ఇది మీ సందేశాన్ని చదవగల గ్రహీత సామర్థ్యాన్ని నిర్ధారించడం. క్లిష్టమైన నోటిఫికేషన్‌లను పంపడానికి ఇది ఉపయోగకరమైన ఫీచర్.

బ్లాక్‌చెయిన్ ప్రయోజనాలలో క్రిప్టోకరెన్సీలు Ethereum, Dogecoin, Lisk, Dash, 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()
}

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"
}

లావాదేవీ ధ్రువీకరణ

ఏకాభిప్రాయం ఆధారంగా నోడ్‌ల పంపిణీ వ్యవస్థ, లావాదేవీ సందేశం యొక్క "ప్రామాణికతను" నిర్ణయిస్తుంది. ఎవరి నుండి మరియు ఎవరికి, ఎప్పుడు, సందేశం మరొకదానితో భర్తీ చేయబడిందా మరియు పంపే సమయం సరిగ్గా సూచించబడిందా. ఇది బ్లాక్‌చెయిన్ యొక్క చాలా ముఖ్యమైన ప్రయోజనం - ధృవీకరణకు బాధ్యత వహించే కేంద్ర నిర్మాణం లేదు మరియు సందేశాల క్రమం మరియు వాటి కంటెంట్ నకిలీ చేయబడవు.

మొదట, ఒక నోడ్ ఖచ్చితత్వాన్ని తనిఖీ చేస్తుంది, ఆపై దానిని ఇతరులకు పంపుతుంది - మెజారిటీ ప్రతిదీ క్రమంలో ఉందని చెబితే, లావాదేవీ గొలుసు యొక్క తదుపరి బ్లాక్‌లో చేర్చబడుతుంది - ఇది ఏకాభిప్రాయం.

బ్లాక్‌చెయిన్‌లో వికేంద్రీకృత మెసెంజర్ ఎలా పని చేస్తుంది?

తనిఖీలకు బాధ్యత వహించే నోడ్ కోడ్ యొక్క భాగాన్ని GitHubలో చూడవచ్చు - Validator.js и వెరిఫై.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

ఒక వ్యాఖ్యను జోడించండి