Bawo ni ojiṣẹ ti a ti sọ di mimọ ṣiṣẹ lori blockchain?

Ni ibẹrẹ ọdun 2017, a bẹrẹ ṣiṣẹda ojiṣẹ lori blockchain [orukọ ati ọna asopọ wa ninu profaili] nipa sisọ awọn anfani lori awọn ojiṣẹ P2P Ayebaye.

Ti kọja 2.5 ọdun, ati pe a ni anfani lati jẹrisi ero wa: awọn ohun elo ojiṣẹ wa bayi fun iOS, PWA wẹẹbu, Windows, GNU/Linux, Mac OS ati Android.

Loni a yoo sọ fun ọ bi ojiṣẹ blockchain ṣe n ṣiṣẹ ati bii awọn ohun elo alabara ṣe le ṣiṣẹ pẹlu API rẹ.
Bawo ni ojiṣẹ ti a ti sọ di mimọ ṣiṣẹ lori blockchain?

A fẹ blockchain lati yanju aabo ati awọn ọran aṣiri ti awọn ojiṣẹ P2P Ayebaye:

  • Ọkan tẹ lati ṣẹda iroyin - ko si awọn foonu tabi imeeli, ko si wiwọle si awọn iwe adirẹsi tabi geolocations.
  • Awọn interlocutors ko fi idi awọn asopọ taara mulẹ; gbogbo ibaraẹnisọrọ waye nipasẹ eto pinpin ti awọn apa. Awọn adirẹsi IP awọn olumulo ko ni iraye si ara wọn.
  • Gbogbo awọn ifiranṣẹ ti wa ni ìpàrokò Ipari-si-opin curve25519xsalsa20poly1305. O dabi pe eyi kii yoo ṣe ohun iyanu fun ẹnikẹni, ṣugbọn koodu orisun wa ṣii.
  • Kolu MITM ko kuro - ifiranṣẹ kọọkan jẹ idunadura kan ati pe Ed25519 EdDSA fowo si.
  • Ifiranṣẹ naa pari ni bulọọki tirẹ. Aitasera ati timestamp O ko le ṣatunṣe awọn bulọọki, ati nitorina aṣẹ ti awọn ifiranṣẹ.
  • "Emi ko sọ bẹ" kii yoo ṣiṣẹ pẹlu awọn ifiranṣẹ lori blockchain.
  • Ko si eto aarin ti o ṣe awọn sọwedowo lori “otitọ” ti ifiranṣẹ kan. Eyi ni a ṣe nipasẹ eto pinpin ti awọn apa ti o da lori ipohunpo, ati pe o jẹ ohun ini nipasẹ awọn olumulo.
  • Ko ṣeeṣe ti ihamon - awọn akọọlẹ ko le dina ati awọn ifiranṣẹ ko le paarẹ.
  • Blockchain 2FA jẹ yiyan si 2FA apaadi nipasẹ SMS, ba ọpọlọpọ ilera jẹ.
  • Agbara lati gba gbogbo awọn ibaraẹnisọrọ rẹ lati ẹrọ eyikeyi nigbakugba tumọ si pe o ko ni lati tọju awọn ibaraẹnisọrọ ni agbegbe rara.
  • Ìmúdájú ti ifijiṣẹ ifiranṣẹ. Ko si ẹrọ olumulo, ṣugbọn si nẹtiwọki. Ni pataki, eyi jẹ ijẹrisi agbara olugba lati ka ifiranṣẹ rẹ. Eyi jẹ ẹya ti o wulo fun fifiranṣẹ awọn iwifunni to ṣe pataki.

Awọn anfani Blockchain tun pẹlu isọpọ isunmọ pẹlu awọn owo-iwo-owo crypto Ethereum, Dogecoin, Lisk, Dash, Bitcoin (eyi tun wa ni ilọsiwaju) ati agbara lati firanṣẹ awọn ami ni awọn ibaraẹnisọrọ. A paapaa ṣe paṣipaarọ crypto ti a ṣe sinu.

Ati lẹhinna - bawo ni gbogbo rẹ ṣe n ṣiṣẹ.

Ifiranṣẹ jẹ idunadura kan

Gbogbo eniyan ti mọ tẹlẹ si otitọ pe awọn iṣowo ni awọn ami gbigbe blockchain (awọn owó) lati ọdọ olumulo kan si ekeji. Bi Bitcoin. A ṣẹda pataki iru idunadura fun gbigbe awọn ifiranṣẹ.

Lati fi ifiranṣẹ ranṣẹ si ojiṣẹ lori blockchain, o nilo lati lọ nipasẹ ọpọlọpọ awọn igbesẹ:

  1. Encrypt ọrọ ifiranṣẹ
  2. Fi ciphertext sinu idunadura kan
  3. Wole idunadura naa
  4. Firanṣẹ idunadura kan si eyikeyi ipade nẹtiwọki
  5. Eto ti a pin kaakiri ti npinnu “otitọ” ti ifiranṣẹ kan
  6. Ti ohun gbogbo ba dara, idunadura pẹlu ifiranṣẹ naa wa ninu bulọọki atẹle
  7. Olugba gba idunadura ifiranṣẹ ati decrypts

Awọn igbesẹ 1–3 ati 7 ni a ṣe ni agbegbe lori alabara, ati awọn igbesẹ 5–6 ni a ṣe lori awọn agbalejo.

Ifiranṣẹ ìsekóòdù

Ifiranṣẹ naa jẹ fifipamọ pẹlu bọtini ikọkọ ti olufiranṣẹ ati bọtini gbogbo eniyan ti olugba. A yoo gba bọtini ti gbogbo eniyan lati nẹtiwọọki, ṣugbọn fun eyi, akọọlẹ olugba gbọdọ wa ni ipilẹṣẹ, iyẹn ni, ni o kere ju idunadura kan. O le lo ibeere REST kan GET /api/accounts/getPublicKey?address={ADAMANT address}, ati nigba ikojọpọ awọn iwiregbe, awọn bọtini gbangba ti awọn interlocutors yoo ti wa tẹlẹ.

Bawo ni ojiṣẹ ti a ti sọ di mimọ ṣiṣẹ lori blockchain?

Ojiṣẹ naa ṣe ifipamọ awọn ifiranṣẹ ni lilo curve25519xsalsa20poly1305 algorithm (NaCl apoti). Niwọn bi akọọlẹ naa ṣe ni awọn bọtini Ed25519, lati ṣe apoti kan, awọn bọtini gbọdọ kọkọ yipada si Curve25519 Diffie-Hellman.

Eyi ni apẹẹrẹ ni 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)
  }
}

Ṣiṣẹda idunadura kan pẹlu ifiranṣẹ kan

Iṣowo naa ni eto gbogbogbo atẹle wọnyi:

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

Fun idunadura ifiranṣẹ, ohun pataki julọ ni asset - o nilo lati gbe ifiranṣẹ kan sinu nkan naa chat pẹlu ilana:

  • message - fi awọn ti paroko ifiranṣẹ
  • own_message - rara
  • type - iru ifiranṣẹ

Awọn ifiranṣẹ ti wa ni tun pin si orisi. Ni pataki, paramita naa type sọ fun ọ bi o ṣe le ni oye message. O le fi ọrọ ranṣẹ, tabi o le fi ohun kan ranṣẹ pẹlu awọn nkan ti o nifẹ si inu - fun apẹẹrẹ, eyi ni bi ojiṣẹ ṣe ṣe awọn gbigbe cryptocurrency ni awọn iwiregbe.

Bi abajade, a ṣẹda iṣowo kan:

{
  "transaction": {
    "type": 8,
    "amount": 0,
    "senderId": "U12499126640447739963",
    "senderPublicKey": "e9cafb1e7b403c4cf247c94f73ee4cada367fcc130cb3888219a0ba0633230b6",
    "asset": {
      "chat": {
        "message": "cb682accceef92d7cddaaddb787d1184ab5428",
        "own_message": "e7d8f90ddf7d70efe359c3e4ecfb5ed3802297b248eacbd6",
        "type": 1
      }
    },
    "recipientId": "U15677078342684640219",
    "timestamp": 63228087,
    "signature": "тут будет подпись"
  }
}

Ibuwọlu iṣowo

Lati rii daju pe gbogbo eniyan ni idaniloju ni otitọ ti olufiranṣẹ ati olugba, akoko fifiranṣẹ ati akoonu ti ifiranṣẹ naa, iṣowo naa ti wole. Ibuwọlu oni-nọmba gba ọ laaye lati rii daju otitọ ti idunadura kan nipa lilo bọtini gbogbogbo - bọtini ikọkọ ko nilo fun eyi.

Ṣugbọn ibuwọlu funrararẹ ni a ṣe ni lilo bọtini ikọkọ:

Bawo ni ojiṣẹ ti a ti sọ di mimọ ṣiṣẹ lori blockchain?

Aworan naa fihan pe a kọkọ hash idunadura naa pẹlu SHA-256 ati lẹhinna fowo si Ed25519 EdDSA ati ki o gba a Ibuwọlu signature, ati ID idunadura jẹ apakan ti SHA-256 hash.

Apẹẹrẹ imuse:

1 - Fọọmu bulọọki data, pẹlu ifiranṣẹ kan

/**
 * 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 - Ka SHA-256 lati bulọọki data

/**
 * 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 - Wole idunadura naa

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'))
}

Fifiranṣẹ idunadura kan pẹlu ifiranṣẹ si ipade nẹtiwọki kan

Niwọn igba ti nẹtiwọọki naa ti jẹ ipinpinpin, eyikeyi awọn apa pẹlu API ṣiṣi yoo ṣe. Ṣiṣe ibeere POST si aaye ipari api/transactions:

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

Ni idahun a yoo gba ID idunadura ti iru naa

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

Ifọwọsi Iṣowo

Eto pinpin ti awọn apa, ti o da lori ipohunpo, pinnu “otitọ” ti ifiranṣẹ idunadura naa. Lati ọdọ tani ati si tani, nigbawo, boya ifiranṣẹ ti rọpo pẹlu omiiran, ati boya akoko fifiranṣẹ ni itọkasi ni deede. Eyi jẹ anfani pataki pupọ ti blockchain - ko si eto aarin ti o ni iduro fun ijẹrisi, ati pe ọna ti awọn ifiranṣẹ ati akoonu wọn ko le ṣe iro.

Ni akọkọ, oju ipade kan ṣayẹwo deede, lẹhinna firanṣẹ si awọn miiran - ti ọpọlọpọ ba sọ pe ohun gbogbo wa ni ibere, idunadura naa yoo wa ninu bulọọki atẹle ti pq - eyi jẹ isokan.

Bawo ni ojiṣẹ ti a ti sọ di mimọ ṣiṣẹ lori blockchain?

Apa ti koodu ipade ti o jẹ iduro fun awọn sọwedowo ni a le wo lori GitHub - afọwọsi.js и daju.js. Bẹẹni, ipade naa nṣiṣẹ lori Node.js.

Pẹlu idunadura kan pẹlu ifiranṣẹ kan ninu bulọki

Ti o ba ti gba ipohunpo, idunadura pẹlu ifiranṣẹ wa yoo wa ninu bulọki atẹle pẹlu awọn iṣowo to wulo miiran.

Awọn bulọọki ni ọna ti o muna, ati pe bulọọki kọọkan ti o tẹle ni a ṣẹda da lori awọn hashes ti awọn bulọọki iṣaaju.

Bawo ni ojiṣẹ ti a ti sọ di mimọ ṣiṣẹ lori blockchain?

Koko ni pe ifiranṣẹ wa tun wa ninu ọkọọkan yii ati pe ko le ṣe “tunto”. Ti ọpọlọpọ awọn ifiranṣẹ ba ṣubu sinu bulọki, aṣẹ wọn yoo pinnu nipasẹ timestamp awọn ifiranṣẹ.

Awọn ifiranṣẹ kika

Ohun elo ojiṣẹ n gba awọn iṣowo pada lati blockchain ti o firanṣẹ si olugba. Fun eyi a ṣe aaye ipari kan api/chatrooms.

Gbogbo awọn iṣowo wa fun gbogbo eniyan - o le gba awọn ifiranṣẹ ti paroko. Ṣugbọn olugba nikan ni o le dinku nipa lilo bọtini ikọkọ rẹ ati bọtini gbangba ti olufiranṣẹ:

**
 * 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) : ''
}

Ati kini ohun miiran?

Niwọn igba ti a ti firanṣẹ awọn ifiranṣẹ ni ọna yii ni bii iṣẹju-aaya 5 - eyi ni akoko ti bulọọki nẹtiwọọki tuntun yoo han - a wa pẹlu asopọ-si-node kan ti alabara ati ipade iho-si-node. Nigbati ipade kan ba gba idunadura tuntun kan, o ṣayẹwo iwulo rẹ ati firanṣẹ siwaju si awọn apa miiran. Idunadura naa wa fun awọn alabara ojiṣẹ paapaa ṣaaju ki ifọkanbalẹ waye ati ifisi ninu bulọki naa. Ni ọna yii a yoo fi awọn ifiranṣẹ ranṣẹ lesekese, gẹgẹ bi awọn ojiṣẹ lojukanna deede.

Lati tọju iwe adirẹsi, a ṣe KVS - Ibi ipamọ-Iye-iye - eyi jẹ iru iṣowo miiran ninu eyiti asset o jẹ ko NaCl-apoti ti wa ni ìpàrokò, ṣugbọn NaCl-apoti asiri. Eyi ni bii ojiṣẹ naa ṣe tọju data miiran.

Gbigbe faili/aworan ati awọn ibaraẹnisọrọ ẹgbẹ ṣi nilo iṣẹ pupọ. Nitoribẹẹ, ni ọna kika blunder-ati-blunder eyi le jẹ “ti bajẹ” ni kiakia, ṣugbọn a fẹ lati ṣetọju ipele ikọkọ kanna.

Bẹẹni, iṣẹ ṣi wa lati ṣee ṣe - ni pipe, aṣiri gidi dawọle pe awọn olumulo kii yoo sopọ si awọn apa nẹtiwọọki gbogbogbo, ṣugbọn yoo gbe tiwọn ga. Iwọn ogorun awọn olumulo wo ni o ro pe o ṣe eyi? Iyẹn tọ, 0. A ni anfani lati yanju ọran yii ni apakan pẹlu ẹya Tor ti ojiṣẹ naa.

A ti fihan pe ojiṣẹ lori blockchain le wa. Ni iṣaaju, igbiyanju kan nikan wa ni ọdun 2012 - bitmessage, eyiti o kuna nitori awọn akoko ifijiṣẹ ifiranṣẹ gigun, fifuye Sipiyu, ati aini awọn ohun elo alagbeka.

Ati ṣiyemeji jẹ nitori otitọ pe awọn ojiṣẹ lori blockchain wa niwaju akoko wọn - awọn eniyan ko ṣetan lati gba ojuse fun akọọlẹ wọn, nini alaye ti ara ẹni ko tun jẹ aṣa, ati imọ-ẹrọ ko gba laaye awọn iyara to gaju lori blockchain. Awọn analogues imọ-ẹrọ diẹ sii ti iṣẹ akanṣe wa yoo han ni atẹle. Iwọ yoo rii.

orisun: www.habr.com

Fi ọrọìwòye kun