Avalik test: lahendus privaatsuse ja skaleeritavuse jaoks Ethereumis

Plokiahel — innovatiivne tehnoloogia, mis lubab parandada paljusid inimelu valdkondi. See viib reaalsed protsessid ja tooted digitaalsetesse ruumidesse, tagab finantstehingute kiirus ja usaldusvÀÀrsuse, vĂ€hendab nende maksumust ning vĂ”imaldab luua kaasaegseid DAPP rakendusi, kasutades nutikaid lepinguid detsentraliseeritud vĂ”rkudes.

Arvestades blockchaini arvukate eeliste ja mitmekesiste rakendusvaldkondadega, vĂ”ib tunduda kummaline, et see lubav tehnoloogia pole veel kĂ”igis tööstusharudes juurdunud. Probleemiks on see, et kaasaegsetel detsentraliseeritud blockchainidel puudub skaleeritavus. Ethereum töötleb umbes 20 tehingut sekundis, mis pole piisav, et rahuldada tĂ€napĂ€eva dĂŒnaamilise Ă€ri vajadusi. Samal ajal ei julge blockchaini tehnoloogiat kasutavad ettevĂ”tted loobuda Ethereumi selle kĂ”rge hĂ€kkimise ja vĂ”rgu tĂ”rgete vastu kaitse tĂ”ttu.

Kuna tagada detsentraliseeritust, turvalisust ja skaleeritavust blockchainis, lahendades seega Skaala Trilemmas, on arendajate meeskond Opporty loodud Plasma Cash — alakee, mis koosneb nutilepingust ja Node.js pĂ”hist privaatsest vĂ”rgust, mis perioodiliselt edastab oma oleku pĂ”hikehasse (Ethereum).

Avalik test: lahendus privaatsuse ja skaleeritavuse jaoks Ethereumis

Plasma Cashi peamised protsessid

1. Kasutaja kutsub nutilepingu `deposit` funktsiooni, edastades sellele summa ETHs, mille ta soovib Plasma Cashi tokenisse panna. Nutilepingu funktsioon loob tokeni ja genereerib selle kohta sĂŒndmuse.

2. Plasma Cash nodid, mis on registreeritud nutilepingu sĂŒndmustele, saavad deposiidi loomise sĂŒndmuse ja lisavad tokeni loomise tehingu tehingute punkti.

3. Perioodiliselt vĂ”tavad erilised Plasma Cash nodid kĂ”ik tehingud punktist (kuni 1 miljon) ja loovad neist ploki, arvutavad Merkle puu ja vastavalt hashi. Antud plokk saadetakse teistele nodidele verifitseerimiseks. Nodid kontrollivad, kas Merkle hashi on kehtiv, ja kas tehingud on kehtivad (nĂ€iteks, kas tokeni saatja on selle omanik). PĂ€rast ploki verifitseerimist kutsub node nutilepingu `submitBlock` funktsiooni, mis salvestab pĂ”hikehasse ploki numbri ja Merkle hashi. Nutileping genereerib sĂŒndmuse ploki eduka lisamise kohta. Tehingud eemaldatakse punktist.

4. Node'id, mis said tagasi sĂŒndmuse blokki saatmisest, hakkavad rakendama tehinguid, mis on lisatud blokki.

5. MĂ”nes etapis tahab tokeni omanik (vĂ”i mitteomanik) selle Plasma Cash'ist vĂ€lja vĂ”tta. Selleks kutsub ta ĂŒles funktsiooni `startExit`, edastades sellele kaks viimast tehingut tokeni kohta, mis tĂ”endavad, et just tema on tokeni omanik. Nutikas leping kontrollib, kasutades Merkle'i rippu, tehingute olemasolu blokkides ja saadab tokeni vĂ€ljavĂ”tmiseks, mis toimub kahe nĂ€dala jooksul.

6. Kui tokeni vÀljavÔtmise operatsioon toimus rikkumistega (tokeni kulutamine pÀrast vÀljavÔtmisprotsessi algust vÔi token enne vÀljavÔtmist juba oli kellegi teise kÀes), vÔib tokeni omanik vÀljavÔtmise kahe nÀdala jooksul vaidlustada.

Avalik test: lahendus privaatsuse ja skaleeritavuse jaoks Ethereumis

Privaatsus saavutatakse kahel viisil.

1. PĂ”hikahel ei tea tehingutest, mis genereeritakse ja edastatakse tĂŒtarkahelas. Avalikuks jÀÀb teave selle kohta, kes on sisse viinud ja vĂ€lja vĂ”tnud ETH Plasma Cash'ist.

2. TĂŒtarkahel vĂ”imaldab korraldada anonĂŒĂŒmsed tehingud, kasutades zk-SNARKs.

Tehnoloogiakogum

  • Far manager
  • Redis
  • Etherium
  • Soild

Testimine

Plasma Cash'i arendamisel testisime sĂŒsteemi töökiirus ja saime jĂ€rgmised tulemused:

  • kuni 35 000 tehingut sekundis lisatakse puuli;
  • kuni 1 000 000 tehingut vĂ”ib hoida blokis.

Testid viidi lÀbi jÀrgmiste kolme serveriga:

1. Intel Core i7-6700 Quad-Core Skylake koos NVMe SSD — 512 GB, 64 GB DDR4 RAM
KĂ€ivitati 3 valideerivat Plasma Cash node'i.

2. AMD Ryzen 7 1700X Octa-Core "Summit Ridge" (Zen), SATA SSD — 500 GB, 64 GB DDR4 RAM
KĂ€ivitati Ropsten testnet ETH node.
KĂ€ivitati 3 valideerivat Plasma Cash node'i.

3. Intel Core i9-9900K Octa-Core koos NVMe SSD — 1 TB, 64 GB DDR4 RAM
KĂ€ivitati 1 Plasma Cash node'i, mis toob kokku.
KĂ€ivitati 3 valideerivat Plasma Cash node'i.
Tehti test tehingute lisamiseks Plasma Cash'i vÔrku.

KokkuvÔtteks: 10 Plasma Cash node'i privaatvÔrgus.

Test 1

Blokis on piirang 1 miljon tehingut. SeetĂ”ttu satuvad 1 miljon tehingut 2 blokkidesse (sest sĂŒsteem suudab osa tehingutest vĂ”tta ja need edastada, kuni need saadetakse).

MĂ€ngi videot

Algne seisund: viimase blokk #7; andmebaasis on salvestatud 1 miljon tehingut ja tokenit.

00:00 — skripti kĂ€ivitamine tehingute genereerimiseks
01:37 — loodud 1 miljon tehingut ja saadetud node'isse
01:46 — submit node vĂ”ttis puul 240k tehingut ja genereerib blokk #8. Samuti nĂ€eme, et puusse lisatakse 320k tehingut 10 sekundi jooksul.
01:58 — blokk #8 allkirjastatakse ja saadetakse valideerimiseks.
02:03 — plokk #8 on valideeritud ja kutsuti esile smartrakenduse `submitBlock` funktsioon, millel on Merkle'i hash ja ploki number
02:10 — lĂ”ppes demo-skripti töö, mis saatis 1 miljon tehingut 32 sekundiga
02:33 — sĂ”lmed hakkasid saama teavet selle kohta, et plokk #8 on lisatud pĂ”hivĂ”rku ja hakkasid tegema 240k tehingut
02:40 — 240k tehingut eemaldati basseinist, mis juba on plokis #8
02:56 — submit sĂ”lm vĂ”ttis basseinist ĂŒlejÀÀnud 760k tehingut ja hakkas arvutama Merkle'i hash'i ja allkirjastama ploki #9
03:20 — kĂ”ik sĂ”lmed sisaldavad 1 miljon 240k tehingut ja tokeneid
03:35 — plokk #9 on allkirjastatud ja saadetud valideerimiseks teistele sĂ”lmedele
03:41 — vĂ”rgus ilmnes viga
04:40 — ajanĂ€itaja lĂ”ppes, ploki #9 valideerimise ootamine lĂ”petati
04:54 — submit sĂ”lm vĂ”ttis basseinist ĂŒlejÀÀnud 760k tehingut ja hakkas arvutama Merkle'i hash'i ja allkirjastama ploki #9
05:32 — plokk #9 on allkirjastatud ja saadetud valideerimiseks teistele sĂ”lmedele
05:53 — plokk #9 on valideeritud ja saadetud pĂ”hivĂ”rku
06:17 — sĂ”lmed hakkasid saama teavet selle kohta, et plokk #9 on lisatud pĂ”hivĂ”rku ja hakkasid tegema 760k tehingut
06:47 — bassein on puhastatud tehingutest, mis on plokis #9
09:06 — kĂ”ik sĂ”lmed sisaldavad 2 miljonit tehingut ja tokeneid

Test 2

Ploki limit on 350k. Tulemuseks on 3 plokki.

MĂ€ngi videot

Algne seisund: viimane plokk #9; andmebaasis on salvestatud 2 miljonit tehingut ja tokeneid

00:00 — tehingute genereerimise skript on juba kĂ€ivitatud
00:44 — on loodud 1 miljon tehingut ja alustatud saatmist sĂ”lme
00:56 — submit sĂ”lm vĂ”ttis basseinist 320k tehingut ja koostab ploki #10. Samuti nĂ€eme, et basseini lisandub 320k tehingut 10 sekundiga
01:12 — plokk #10 on allkirjastatud ja saadetud teistele sĂ”lmedele valideerimiseks
01:18 — lĂ”ppes demo-skripti töö, mis saatis 1 miljon tehingut 34 sekundiga
01:20 — plokk #10 on valideeritud ja saadetud pĂ”hivĂ”rku
01:51 — kĂ”ik sĂ”lmed said pĂ”hivĂ”rgust teavet selle kohta, et plokk #10 on lisatud, ja hakkavad rakendama 320k tehingut
02:01 — bassein on puhastatud 320k tehingutest, mis lisati plokki #10
02:15 — submit sĂ”lm vĂ”ttis basseinist 350k tehingut ja koostab ploki #11
02:34 — plokk #11 on allkirjastatud ja saadetud teistele sĂ”lmedele valideerimiseks
02:51 — plokk #11 on valideeritud ja saadetud pĂ”hivĂ”rku
02:55 — viimane sĂ”lm tĂ€itis ploki #10 tehingud
10:59 — juureketis toimus vĂ€ga pikaajaline tehing blokk #9 esitamisega, kuid see viidi lĂ”pule ja kĂ”ik sĂ”lmed said sellest teavet ning alustasid 350k tehingu töötlemist
11:05 — bassein puhastati 320k tehingust, mis lisati blokk #11
12:10 — kĂ”ik sĂ”lmed sisaldavad 1 miljon 670k tehingut ja tokenit
12:17 — esitussĂ”lm vĂ”ttis basseinist 330k tehingut ja vormib blokk #12
12:32 — blokk #12 on allkirjastatud ja saadetud teistele sĂ”lmedele valideerimiseks
12:39 — blokk #12 on valideeritud ja saadetud juureketti
13:44 — kĂ”ik sĂ”lmed said juureketist teavet, et blokk #12 on lisatud, ja alustavad 330k tehingu rakendamist
14:50 — kĂ”ik sĂ”lmed sisaldavad 2 miljonit tehingut ja tokenit

Test 3

Esimeses ja teises serveris asendati ĂŒks valideeriv sĂ”lm esitussĂ”lmiga.

MĂ€ngi videot

Algne seis: viimane blokk #84; andmebaasis on salvestatud 0 tehingut ja tokenit

00:00 — KĂ€ivitatud 3 skripti, mis genereerivad ja saadavad 1 miljon tehingut
01:38 — loodud 1 miljon tehingut ja saadeti esitussĂ”lmele #3
01:50 — esitussĂ”lm #3 vĂ”ttis basseinist 330k tehingut ja vormib blokk #85 (f21). Samuti nĂ€eme, et basseinile lisatakse 350k tehingut 10 sekundi jooksul
01:53 — loodud 1 miljon tehingut ja saadeti esitussĂ”lmele #1
01:50 — esitussĂ”lm #3 vĂ”ttis basseinist 330k tehingut ja vormib blokk #85 (f21). Samuti nĂ€eme, et basseinile lisatakse 350k tehingut 10 sekundi jooksul
02:01 — esitussĂ”lm #1 vĂ”ttis basseinist 250k tehingut ja vormib blokk #85 (65e)
02:06 — blokk #85 (f21) on allkirjastatud ja saadetud teistele sĂ”lmedele valideerimiseks
02:08 — lĂ”petas töö demo-skript serveris #3, mis saatis 1 miljon tehingut 30 sekundi jooksul
02:14 — blokk #85 (f21) on valideeritud ja saadetud juureketti
02:19 — blokk #85 (65e) on allkirjastatud ja saadetud teistele sĂ”lmedele valideerimiseks
02:22 — loodud 1 miljon tehingut ja saadeti esitussĂ”lmele #2
02:27 — blokk #85 (65e) on valideeritud ja saadetud juureketti
02:29 — esitussĂ”lm #2 vĂ”ttis basseinist 111855 tehingut ja vormib blokk #85 (256).
02:36 — blokk #85 (256) on allkirjastatud ja saadetud teistele sĂ”lmedele valideerimiseks
02:36 — lĂ”petas töö demo-skript serveris #1, mis saatis 1 miljon tehingut 42,5 sekundi jooksul
02:38 — blokk #85 (256) on valideeritud ja saadetud juureketti
03:08 — lĂ”petas töö demo-skript serveris #2, mis saatis 1 miljon tehingut 47 sekundi jooksul
03:38 — kĂ”ik sĂ”lmed said juureketist teavet, et blokid #85 (f21), #86 (65e), #87 (256) on lisatud ja alustavad 330k, 250k, 111855 tehingu rakendamist
03:49 — bassein puhastati 330k, 250k, 111855 tehinguga, mis lisati blokki #85 (f21), #86(65e), #87(256)
03:59 — submit node #1 vĂ”ttis basseinist 888145 tehingut ja loob bloki #88 (214), submit node #2 vĂ”ttis basseinist 750k tehingut ja loob bloki #88 (50a), submit node #3 vĂ”ttis basseinist 670k tehingut ja loob bloki #88 (d3b)
04:44 — blokk #88 (d3b) on allkirjastatud ja saadetud teistele node'idele valideerimiseks
04:58 — blokk #88 (214) on allkirjastatud ja saadetud teistele node'idele valideerimiseks
05:11 — blokk #88 (50a) on allkirjastatud ja saadetud teistele node'idele valideerimiseks
05:11 — blokk #85 (d3b) on valideeritud ja saadetud juureketti
05:36 — blokk #85 (214) on valideeritud ja saadetud juureketti
05:43 — kĂ”ik node'id said juureketist teavet, et blokk #88 (d3b), #89(214) on lisatud ja hakkavad rakendama 670k, 750k tehingut
06:50 — seoses ĂŒhenduse katkeemisega blokk #85 (50a) ei olnud valideeritud
06:55 — submit node #2 vĂ”ttis basseinist 888145 tehingut ja loob bloki #90 (50a)
08:14 — blokk #90 (50a) on allkirjastatud ja saadetud teistele node'idele valideerimiseks
09:04 — blokk #90 (50a) on valideeritud ja saadetud juureketti
11:23 — kĂ”ik node'id said juureketist teavet, et blokk #90 (50a) on lisatud ja hakkavad rakendama 888145 tehingut. Samal ajal on server #3 juba ammu rakendanud tehingud blokidest #88 (d3b), #89(214)
12:11 — kĂ”ik basseinid on tĂŒhjad
13:41 — kĂ”ik serveri #3 node'id sisaldavad 3 miljonit tehingut ja tokenit
14:35 — kĂ”ik serveri #1 node'id sisaldavad 3 miljonit tehingut ja tokenit
19:24 — kĂ”ik serveri #2 node'id sisaldavad 3 miljonit tehingut ja tokenit

Takistused

Plasma Cash arendamise ajal kohtusime jÀrgmiste probleemidega, mida oleme jÀrk-jÀrgult lahendanud ja lahendame:

1. SĂŒsteemi erinevate funktsioonide vastastikuse mĂ”ju konflikt. NĂ€iteks tehingute lisamise funktsioon basseinidesse takistas submit'i ja bloki valideerimise tööd ja vastupidi, mis pĂ”hjustas kiiruslanguse.

2. Polnud kohe selge, kuidas saata tohutul hulgal tehinguid ja samal ajal andmeedastuskulusid minimaalsetena hoida.

3. Polnud selge, kuidas ja kus andmeid hoida, et saavutada kÔrgeid tulemusi.

4. Polnud selge, kuidas korraldada vÔrku node'ide vahel, kuna 1 miljoni tehinguga blokk vÔtab umbes 100 MB.

5. Üksike töö reĆŸiim katkestab ĂŒhenduse node'ide vahel, kui toimuvad pikaajalised arvutused (nt Merkle puu ehitamine ja selle rĂŒhma hash'i arvutamine).

Kuidas me kÔigi nende vÀljakutsetega hakkama saime?

Esimene versioon Plasma Cash node'ist oli mingi kombo, mis suutis teha kĂ”ike korraga: vastu vĂ”tta tehinguid, esitada ja valideerida plokke, pakkuda API-d andmetele juurdepÀÀsuks. Kuna NodeJS on algselt ĂŒhetasandiline, siis koormav Merkle puu arvutamise funktsioon takistas tehingute lisamise funktsiooni. Me nĂ€gime kahte varianti selle probleemi lahendamiseks:

1. KĂ€ivitada mitu NodeJS protsessi, kus igaĂŒhel on oma kindlad funktsioonid.

2. Kasutada worker_threads, et viia osa koodist eraldi niitidesse.

LĂ”puks kasutasime mĂ”lemaid variante korraga: loogiliselt jagasime ĂŒhe node kolmeks osaks, mis vĂ”ivad töötada eraldi, kuid samas ka sĂŒnkroonselt.

1. Tehingute vastuvÔtmise node, mis haldab tehingute puulis ja nÔustab plokkide loomist.

2. Valideerimise node, mis kontrollib node'ide kehtivust.

3. API node — pakub API-d andmete juurdepÀÀsuks.

Samuti saab igale node'ile ĂŒhenduda lĂ€bi unix socketi CLI kaudu.

Koormavad operatsioonid, nagu Merkle puu arvutamine, viidi eraldi niiti.

Nii saavutasime Plasma Cash kÔikide funktsioonide sujuva toimimise samal ajal ja ilma tÔrgeteta.

Kuna sĂŒsteem hakkas funktsionaalselt tööle, alustasime kiiruseteste ja, kahjuks, saime rahuldavaid tulemusi: 5000 tehingut sekundis ja kuni 50 000 tehingut plokis. Pidin vĂ€lja selgitama, mis oli valesti rakendatud.

Esiteks alustasime Plasma Cashiga suhtlemise mehhanismi testimist, et teada saada sĂŒsteemi tipvĂ”imekust. Varem kirjutasime, et Plasma Cash node pakub unix socketi liidest. See oli algselt tekstipĂ”hine. JSON objektid edastati, kasutades `JSON.parse()` ja `JSON.stringify()`.

{
  "action": "sendTransaction",
  "payload":{
    "prevHash": "0x8a88cc4217745fd0b4eb161f6923235da10593be66b841d47da86b9cd95d93e0",
    "prevBlock": 41,
    "tokenId": "57570139642005649136210751546585740989890521125187435281313126554130572876445",
    "newOwner": "0x200eabe5b26e547446ae5821622892291632d4f4",
    "type": "pay",
    "data": "",
    "signature": "0xd1107d0c6df15e01e168e631a386363c72206cb75b233f8f3cf883134854967e1cd9b3306cc5c0ce58f0a7397ae9b2487501b56695fe3a3c90ec0f61c7ea4a721c"
  }
}

MÔÔtsime selliste objektide edastamise kiirust ja saime ~ 130k sekundis. Proovisime asendada standardseid JSON töötlemisfunktsioone, kuid jÔudlust see ei parandanud. TÔenÀoliselt on V8 mootor selliste operatsioonide jaoks hÀsti optimeeritud.

Tehingute, tokenite ja plokkidega töötamine toimus meil lĂ€bi klasside. Selliste klasside loomisel langes jĂ”udlus kahekordselt, mis nĂ€itab, et OOP ei sobi meile. Pidi kirjutama kĂ”ik ĂŒmber puhtale funktsionaalsele lĂ€henemisele.

Kirjutamine andmebaasi

Alguses valiti andmete salvestamiseks Redis kui ĂŒks kĂ”ige jĂ”udlusest pakkuv lahendus, mis vastas meie nĂ”udmistele: key-value salvestus, töötamine hash-tabelitega, hulgad. KĂ€ivitasime redis-benchmarki ja saime ~80k operatsiooni sekundis 1 pipelining reĆŸiimis.

KĂ”rge jĂ”udluse saavutamiseks hÀÀlestasime Redis’e peenemalt:

  • Seadsime unix socket ĂŒhenduse.
  • LĂŒlitasime vĂ€lja oleku salvestamise kettale (usaldusvÀÀrsuse tagamiseks vĂ”ib seadistada replikatsiooni ja juba eraldi Redis’is teha salvestamise kettale).

Redis'es on bassein — see on hash-tabel, kuna meil on vaja saada kĂ”ik tehingud ĂŒhe pĂ€ringuga ja eemaldada tehingud ĂŒkshaaval. Proovisime kasutada tavalist nimekirja, kuid see toimis nimekirja laadimisel aeglasemalt.

Kasutades standardset NodeJS Redis teeki, saime jÔudluse 18k tehingut sekundis. Kiirus langes 9 korda.

Kuna benchmark nĂ€itas meile selgelt 5 korda suuremaid vĂ”imalusi, alustasime optimeerimist. Muutsime teeki iorediseks ja saime jĂ”udluse juba 25k sekundis. Tehingud lisasime ĂŒkshaaval, kasutades kĂ€sku `hset`. Sel viisil genereerisime palju pĂ€ringuid Redis’ile. Tekkinud idee oli koguda tehingud partiidena ja saata need ĂŒhe kĂ€suga `hmset`. Tulemuseks oli 32k sekundis.

Mitmel pĂ”hjusel, millest rÀÀgime allpool, töötame andmetega kasutades `Buffer`it ja, nagu selgus, kui see tĂ”lkida tekstiks (`buffer.toString(‘hex’)`) enne salvestamist, saame lisajĂ”udlust. Nii Ă”nnestus kiirus tĂ”sta 35k sekundini. Hetkel otsustasime edasise optimeerimise peatada.

Pidime minema ĂŒle binaarsesse protokolli, kuna:

1. SĂŒsteem arvutab sageli hĂ€sse, allkirju jne, ja selleks on tal vaja andmeid `Buffer’ina.

2. Teenuste vahel edastades kaaluvad binaarsed andmed vÀhem kui tekst. NÀiteks, kui saata blokk 1 miljoni tehinguga, vÔivad andmed tekstina vÔtta rohkem kui 300 megabaidi.

3. Andmete pidev konverteerimine mÔjutab jÔudlust.

SeetÔttu pÔhinesime omaenda binaarsel protokollil andmete salvestamiseks ja edastamiseks, mis on vÀlja töötatud suurepÀrase `binary-data` teegi baasil.

Tulemuseks on jÀrgmised andmestruktuurid:

— Tehing

  ```json
  {
    prevHash: BD.types.buffer(20),
    prevBlock: BD.types.uint24le,
    tokenId: BD.types.string(null),
    type: BD.types.uint8,
    newOwner: BD.types.buffer(20),
    dataLength: BD.types.uint24le,
    data: BD.types.buffer(({current}) => current.dataLength),
    signature: BD.types.buffer(65),
    hash: BD.types.buffer(32),
    blockNumber: BD.types.uint24le,
    timestamp: BD.types.uint48le,
  }
  ```

— Token

  ```json
  {
    id: BD.types.string(null),
    owner: BD.types.buffer(20),
    block: BD.types.uint24le,
    amount: BD.types.string(null),
  }
  ```

— Plokk

  ```json
  {
    number: BD.types.uint24le,
    merkleRootHash: BD.types.buffer(32),
    signature: BD.types.buffer(65),
    countTx: BD.types.uint24le,
    transactions: BD.types.array(Transaction.Protocol, ({current}) => current.countTx),
    timestamp: BD.types.uint48le,
  }
  ```

Tavaliste kÀskudega `BD.encode(block, Protocol).slice();` ja ` BD.decode(buffer, Protocol)` muundame andmed `Buffer` formaati, et salvestada need Redis-sse vÔi edastada teisele sÔlmele ja andmed uuesti vÀlja vÔtta.

Meil on ka 2 binaarset protokolli andmete edastamiseks teenuste vahel:

— Protokoll Plasma Noode suhtlemiseks unix-soketiga

  ```json
  {
    type: BD.types.uint8,
    messageId: BD.types.uint24le,
    error: BD.types.uint8,
    length: BD.types.uint24le,
    payload: BD.types.buffer(({node}) => node.length)
  }
  ```

kus:

  • `type` — tegu, mida tuleb sooritada, nĂ€iteks 1 — sendTransaction, 2 — getTransaction;
  • `payload` — andmed, mis tuleb edastada vastavale funktsioonile;
  • `messageId` — sĂ”numi ID, et saaks tuvastada vastuse.

— Protokoll sĂ”lmede vahel

  ```json
  {
    code: BD.types.uint8,
    versionProtocol: BD.types.uint24le,
    seq: BD.types.uint8,
    countChunk: BD.types.uint24le,
    chunkNumber: BD.types.uint24le,
    length: BD.types.uint24le,
    payload: BD.types.buffer(({node}) => node.length)
  }
  ```

kus:

  • `code` — sĂ”numi kood, nĂ€iteks 6 — PREPARE_NEW_BLOCK, 7 — BLOCK_VALID, 8 — BLOCK_COMMIT;
  • `versionProtocol` — protokolli versioon, kuna vĂ”rgus vĂ”ivad olla erinevate versioonidega sĂ”lmed, mis vĂ”ivad töötada erinevalt;
  • `seq` — sĂ”numi identifikaator;
  • `countChunk` ja `chunkNumber` on vajalikud suurte sĂ”numite osadeks jagamiseks;
  • `length` ja `payload` pikkus ja andmed.

Kuna oleme andmed eelnevalt tĂŒĂŒbinud, töötab lĂ”pp-sĂŒsteem palju kiiremini kui Ethereumi `rlp` teek. Kahjuks ei ole me veel suutnud sellest loobuda, kuna smart-leping vajab tĂ€iendavat arendust, mida plaanime tulevikus teha.

Kui suutsime saavutada kiirus 35 000 tehingut sekundis, peame neid ka töötlema optimaalse aja jooksul. Kuna ploki moodustamise ligikaudne aeg on 30 sekundit, peame plokki lisama 1 000 000 tehingut, mis tÀhendab enam kui 100 mb andmeid.

Alguses kasutasime `ethereumjs-devp2p` teeki sĂ”lmede ĂŒhendamiseks, kuid see ei suutnud nii palju andmeid hallata. Selle tulemusel kasutasime `ws` teeki ja seadistasime binaarsete andmete edastamise websocketi kaudu. Loomulikult kohtasime ka probleeme suurte andmepakettide edastamisel, kuid jagasime need chunkideks ja nĂŒĂŒd pole meil enam neid probleeme.

Samuti kulub Merkle puu koostamiseks ja rĂ€simise arvutamiseks umbes 1 000 000 sekundit pidevat arvutust. Selle aja jooksul katkeb ĂŒhendus kĂ”igi sĂ”lmedega. Otsustati kanda see arvutus eraldi tÔÔle. 10 Tegelikult ei ole meie jĂ€reldused uudsed, kuid mingil pĂ”hjusel unustavad paljud spetsialistid need arendamisel.

KokkuvÔtted:

Funktsionaalse programmeerimise kasutamine objektorienteeritud programmeerimise asemel tÔstab jÔudlust.

  • Monoliitne arhitektuur on halvem kui teenuse arhitektuur produktiivses NodeJS sĂŒsteemis.
  • Töötajate lĂ”ime (`worker_threads`) kasutamine raskete arvutuste jaoks parandab sĂŒsteemi reageerimisvĂ”imet, eriti i/o operatsioonide teostamisel.
  • Unix socket on stabiilsem ja kiirem kui http pĂ€ringud.
  • Kui on vaja kiiresti edastada suuri andmeid ĂŒle vĂ”rgu, on parem kasutada websocket'e ja saata binaarsete andmete choke'id, mida saab edastada, kui need ei jĂ”u, ja seejĂ€rel ĂŒhendada ĂŒheks sĂ”numiks.
  • Plokiahel on innovaatiline tehnoloogia, mis lubab parandada paljusid inimelu valdkondi.

Kutsume teid kĂŒlastama GitHub projekti: https://github.com/opporty-com/Plasma-Cash/tree/new-version

Artikkel on kirjutatud koostöös Aleksandr Naƥivaniga, vanem arendaja Clever Solution Inc.

Allikas: habr.com

Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid | ProHoster