Plokiahel â innovatiivne tehnoloogia, mis lubab parandada paljusid inimelu valdkondi. See viib reaalprotsessid ja -tooted digitaalruumi, tagab finantstehingute kiirus ja usaldusvÀÀrsus, vĂ€hendab nende kulusid ning vĂ”imaldab luua kaasaegseid DAPP rakendusi nutikate lepingute abil detsentraliseeritud vĂ”rgustikes.
Arvestades blokeeringu arvukate eeliste ja rakendusvaldkondadega, vĂ”ib tunduda kummaline, et see paljutĂ”otav tehnoloogia pole veel tunginud kĂ”ikidesse tööstusharudesse. Probleem on selles, et kaasaegsetel detsentraliseeritud plokiahelatel puudub skaleeritavus. Ethereum töötleb umbes 20 tehingut sekundis, mis ei ole piisav kaasaegse dĂŒnaamilise Ă€ri vajaduste rahuldamiseks. Samal ajal ei julge plokiahela tehnoloogiat kasutavad ettevĂ”tted loobuda Ethereumi oma kĂ”rge hĂ€kkerite ja vĂ”rgukatkestuste kaitse tĂ”ttu.
Kuna tagada detsentraliseerimine, turvalisus ja skaleeritavus plokiahelas, lahendades niiviisi Skaleeritavuse Trilemma, arendajate meeskond loomis Plasma Cash â tĂŒtaraken, mis koosneb nutikas lepingust ja Node.js pĂ”hisel privaatvĂ”rgust, mis edastab perioodiliselt oma oleku pĂ”hiringile (Ethereum).

Peamised protsessid Plasma Cashis
1. Kasutaja kutsub nutika lepingu funktsiooni `deposit`, edastades sellele ETH koguse, mille ta soovib Plasma Cashi tokenisse paigutada. Nutika lepingu funktsioon loob tokeni ja genereerib selle kohta sĂŒndmuse.
2. Plasma Cashi sĂ”lmed, mis on allkirjastanud nutika lepingu sĂŒndmused, saavad deposiidi loomise sĂŒndmuse ja lisavad tokeni loomise tehingu jĂ€rjekorda.
3. Aeg-ajalt saavad Plasma Cash erisolvurid kĂ”ik tehingud basseinist (kuni 1 miljon) ja koostavad neist ploki, arvutavad Merkle puu ja seega ka rĂ€simise. See plokk saadetakse teistele solvudele kinnitamiseks. Solvud kontrollivad, kas Merkle rĂ€simine on kehtiv ja kas tehingud on kehtivad (nĂ€iteks, kas tokeni saatja on selle omanik). PĂ€rast ploki kinnitamist kutsub solv funktsiooni `submitBlock` nutilepingus, mis salvestab ketisse ploki numbri ja Merkle rĂ€simise. Nutileping genereerib sĂŒndmuse ploki eduka lisamise kohta. Tehingud kustutatakse basseinist.
4. Solvud, kes said teate ploki esitamise kohta, hakkavad rakendama tehinguid, mis olid lisatud plokki.
5. Mingil hetkel soovib tokeni omanik (vÔi mitte-omanik) selle Plasma Cash-ist vÀlja vÔtta. Selleks kutsub ta funktsiooni `startExit`, edastades sellele teabe kahe viimase tehingu kohta tokeni osas, mis kinnitavad, et just tema on tokeni omanik. Nutileping kontrollib Merkle rÀsimise abil tehingute asukohta plokkides ja saadab tokeni vÀljavÔtmiseks, mis toimub kahe nÀdala pÀrast.
6. Kui tokeni vÀljamakse toimus rikkumistega (tokeni kasutamine pÀrast vÀljamakseprotseduuri algust vÔi token oli enne vÀljamaksmist juba kellegi teise oma), saab tokeni omanik kahe nÀdala jooksul vÀljamakset vaidlustada.

Privaatsus saavutatakse kaheviisi
1. PÔhiketash ei tea tehingutest, mis genereeritakse ja edastatakse alamketas. Avalikuks jÀÀb info selle kohta, kes sisestas ja vÔttis ETH Plasma Cashist.
2. Alamketas vĂ”imaldab korraldada anonĂŒĂŒmsed tehingud, kasutades zk-SNARK-e.
Tehnoloogiline stack
- NodeJS
- Redis
- Etherium
- Soild
Testimine
Plasma Cashi arendamisel testisime sĂŒsteemi töökiirus ja saime jĂ€rgmised tulemused:
- kuni 35 000 tehingut sekundis lisatakse puuli;
- kuni 1 000 000 tehingut saab salvestada plokki.
Testid viidi lÀbi kolmel jÀrgmistel serveritel:
1. Intel Core i7-6700 Quad-Core Skylake, sealhulgas NVMe SSD â 512 GB, 64 GB DDR4 RAM
KÀivitatud on 3 valideerivat Plasma Cashi sÔlme.
2. AMD Ryzen 7 1700X Octa-Core «Summit Ridge» (Zen), SATA SSD â 500 GB, 64 GB DDR4 RAM
KÀivitatud on Ropsten testnet ETH sÔlm.
KÀivitatud on 3 valideerivat Plasma Cashi sÔlme.
3. Intel Core i9-9900K Octa-Core, sealhulgas NVMe SSD â 1 TB, 64 GB DDR4 RAM
KÀivitatud on 1 submit Plasma Cashi sÔlm.
KÀivitatud on 3 valideerivat Plasma Cashi sÔlme.
Plasma Cash vÔrku lisanduvate tehingute test kÀivitus.
Kokku: 10 Plasma Cash sÔlme privaatvÔrgus.
Test 1
Tehingute piir on 1 miljon plokis. SeetĂ”ttu satuvad 1 miljon tehingut 2 plokki (sest sĂŒsteem suudab osa tehingutest vĂ”tta ja esitada, samal ajal kui need saadetakse).

Algne seisund: viimane plokk #7; andmebaasis on salvestatud 1 miljon tehingut ja tokenit.
00:00 â tehingute genereerimise skripti kĂ€ivitamine
01:37 â loodud 1 miljon tehingut ja kĂ€ivitati edastamine sĂ”lme
01:46 â sĂ”lm vĂ”ttis 240k tehingut jooksvalt ja koostab ploki #8. Samuti nĂ€eme, et 10 sekundi jooksul lisandub 320k tehingut puul.
01:58 â plokk #8 on allkirjastatud ja saadetud valideerimiseks
02:03 â plokk #8 on valideeritud ja kutsutud vĂ€lja `submitBlock` funktsioon nutilepingus koos Merkle'i hash'iga ja ploki numbriga
02:10 â demo-skript lĂ”petas tööd, edastades 1 miljon tehingut 32 sekundi jooksul
02:33 â sĂ”lmed hakkasid saama teavet, et plokk #8 on lisatud juureahelasse, ning hakkasid tĂ€itma 240k tehingut
02:40 â puult eemaldati 240k tehingut, mis juba on plokis #8
02:56 â submit node took the remaining 760k transactions from the pool and began calculating the Merkle hash and signing block #9
03:20 â all nodes contain 1 million 240k transactions and tokens
03:35 â block #9 has been signed and is being sent for validation to other nodes
03:41 â a network error occurred
04:40 â waiting for validation of block #9 timed out
04:54 â submit node took the remaining 760k transactions from the pool and began calculating the Merkle hash and signing block #9
05:32 â block #9 has been signed and is being sent for validation to other nodes
05:53 â block #9 has been validated and sent to the root chain
06:17 â nodes began receiving information that block #9 has been added to the root chain and started processing 760k transactions
06:47 â the pool has been cleared of transactions included in block #9
09:06 â all nodes contain 2 million transactions and tokens
Test 2
There is a limit of 350k per block. As a result, we have 3 blocks.

Initial state: last block #9; 2 million transactions and tokens are saved in the database
00:00 â the transaction generation script has already started
00:44 â 1 million transactions have been created and sending to the node has begun
00:56 â nod tĂ€itis 320k tehingut puul ja vormib ploki #10. Samuti nĂ€eme, et puule lisatakse 320k tehingut 10 sekundi jooksul
01:12 â plokk #10 on allkirjastatud ja saadetud teistele nodadele valideerimiseks
01:18 â demo skript lĂ”petas töö, mis saatis 1 miljon tehingut 34 sekundi jooksul
01:20 â plokk #10 on valideeritud ja saadetud juure ahelasse
01:51 â kĂ”ik nodad said juure ahelast teavet, et plokk #10 on lisatud, ja hakkavad rakendama 320k tehingut
02:01 â puu on puhastatud 320k tehingutest, mis lisati plokki #10
02:15 â nod tĂ€itis 350k tehingut puust ja vormib ploki #11
02:34 â plokk #11 on allkirjastatud ja saadetud teistele nodadele valideerimiseks
02:51 â plokk #11 on valideeritud ja saadetud juure ahelasse
02:55 â viimane nod tĂ€itis tehingud plokist #10
10:59 â juure ahelas kestis vĂ€ga kaua tehing ploki #9 esitamises, kuid see toimus ning kĂ”ik nodad said teavet ja hakkasid tĂ€itma 350k tehingut
11:05 â puu on puhastatud 320k tehingutest, mis lisati plokki #11
12:10 â kĂ”ik nodad sisaldavad 1 miljon 670k tehingut ja tokenit
12:17 â submitt node vĂ”ttis poolist 330k tehingut ja vormib ploki #12
12:32 â plokk #12 on allkirjastatud ja saadetud teistele nodedele valideerimiseks
12:39 â plokk #12 on valideeritud ja saadetud juurekettasse
13:44 â kĂ”ik nodid said juureketta kaudu teavet, et plokk #12 on lisatud, ja alustavad 330k tehingu rakendamist
14:50 â kĂ”ik nodid sisaldavad 2 miljonit tehingut ja tokenit
Test 3
Esimeses ja teises serveris asendati ĂŒks valideeriv node submitt nodiga.

Algne seis: viimane plokk #84; andmebaasis on salvestatud 0 tehingut ja tokenit
00:00 â KĂ€ivitatud on 3 skripti, mis genereerivad ja saadavad 1 miljoni tehingu
01:38 â loodud 1 miljon tehingut ja saadeti submitt node #3
01:50 â submitt node #3 vĂ”ttis poolist 330k tehingut ja vormib ploki #85 (f21). Samuti nĂ€eme, et 10 sekundi jooksul lisatakse puule veel 350k tehingut
01:53 â loodud 1 miljon tehingut ja saadeti submitt node #1
01:50 â submitt node #3 vĂ”ttis poolist 330k tehingut ja vormib ploki #85 (f21). Samuti nĂ€eme, et 10 sekundi jooksul lisatakse puule veel 350k tehingut
02:01 â submitt node #1 vĂ”ttis poolist 250k tehingut ja vormib ploki #85 (65e)
02:06 â plokk #85 (f21) on allkirjastatud ja saadetud teistele nodedele valideerimiseks
02:08 â serveri #3 demo skript on lĂ”petanud töö, saates 1 miljon tehingut 30 sekundi jooksul
02:14 â plokk #85 (f21) on valideeritud ja saadetud juureketti
02:19 â plokk #85 (65e) allkirjastatud ja saadetakse teistele sĂ”lmedele valideerimiseks
02:22 â loodud 1 miljon tehingut ja alustatud saatmine esitamisse sĂ”lmele #2
02:27 â plokk #85 (65e) on valideeritud ja saadetud juureketti
02:29 â esitussĂ”lm #2 vĂ”ttis 111855 tehingut basseinist ja vormib plokki #85 (256).
02:36 â plokk #85 (256) allkirjastatud ja saadetakse teistele sĂ”lmedele valideerimiseks
02:36 â serveri #1 demo-skripti töö lĂ”ppes, mis saatis 1 miljon tehingut 42,5 sekundi jooksul
02:38 â plokk #85 (256) on valideeritud ja saadetud juureketti
03:08 â serveri #2 skripti töö lĂ”ppes, mis saatis 1 miljon tehingut 47 sekundi jooksul
03:38 â kĂ”ik sĂ”lmed said juureketist teabe, et plokid #85 (f21), #86 (65e), #87 (256) on lisatud ja hakkavad rakendama 330k, 250k, 111855 tehingut
03:49 â bassein puhastati 330k, 250k, 111855 tehingust, mis lisati plokkidesse #85 (f21), #86 (65e), #87 (256)
03:59 â esitussĂ”lm #1 vĂ”ttis basseinist 888145 tehingut ja vormib plokki #88 (214), esitussĂ”lm #2 vĂ”ttis basseinist 750k tehingut ja vormib plokki #88 (50a), esitussĂ”lm #3 vĂ”ttis basseinist 670k tehingut ja vormib plokki #88 (d3b)
04:44 â plokk #88 (d3b) on allkirjastatud ja saadetud teistele sĂ”lmedele valideerimiseks
04:58 â plokk #88 (214) on allkirjastatud ja saadetud teistele sĂ”lmedele valideerimiseks
05:11 â plokk #88 (50a) on allkirjastatud ja saadetud teistele sĂ”lmedele valideerimiseks
05:11 â plokk #85 (d3b) on valideeritud ja saadetud juureahelasse
05:36 â plokk #85 (214) on valideeritud ja saadetud juureahelasse
05:43 â kĂ”ik sĂ”lmed said juureahelast teavet, et plokid #88 (d3b), #89 (214) on lisatud ja hakkavad rakendama 670k, 750k tehinguid
06:50 â ĂŒhenduse katkestamise tĂ”ttu ei ole plokk #85 (50a) saanud valideeritud
06:55 â sĂ”lm #2 vĂ”ttis punasest 888145 tehingut ja loob ploki #90 (50a)
08:14 â plokk #90 (50a) on allkirjastatud ja saadetud teistele sĂ”lmedele valideerimiseks
09:04 â plokk #90 (50a) on valideeritud ja saadetud juureahelasse
11:23 â kĂ”ik sĂ”lmed said juureahelast teavet, et plokk #90 (50a) on lisatud ning hakkavad rakendama 888145 tehingut. Samal ajal oli server #3 juba ammu rakendanud tehingud plokkidest #88 (d3b), #89 (214)
12:11 â kĂ”ik basseinid on tĂŒhjad
13:41 â kĂ”ik serveri #3 sĂ”lmed sisaldavad 3 miljonit tehingut ja tokenit
14:35 â kĂ”ik serveri #1 sĂ”lmed sisaldavad 3 miljonit tehingut ja tokenit
19:24 â kĂ”ik serveri #2 sĂ”lmed sisaldavad 3 miljonit tehingut ja tokenit
TÔkked
Plasma Cash'i arendamise kÀigus kohtasime jÀrgmisi probleeme, mida lahendasime jÀrk-jÀrgult:
1. SĂŒsteemi erinevate funktsioonide omavaheline konflikt. NĂ€iteks blokeeris tehingute lisamise funktsioon submittimise ja plokkide valideerimise toimimise ning vastupidi, mis viis kiiruslanguseni.
2. Ei olnud kohe selge, kuidas saata tohutult tehinguid ja samal ajal andmeedastuskulusid minimeerida.
3. Ei olnud selge, kuidas ja kus andmeid salvestada, et saavutada kÔrgeid tulemusi.
4. Ei olnud selge, kuidas korraldada suhtlust sÔlmede vahel, sest miljoni tehingu kogumahu plokk vÔtab umbes 100 MB.
5. Ăhe toimesĂŒsteemi töö katkestab sĂ”lmede vaheline ĂŒhendus, kui toimuvad pikad arvutused (nt Merkle puu ehitamine ja selle rĂ€simise arvutamine).
Kuidas me kÔigega hakkama saime?
Plasma Cash node'i esimene versioon oli kombinatsioon, mis suutis kĂ”ike korraga teha: vastu vĂ”tta tehinguid, esitama ja valideerima plokke ning pakkuma API-d andmetele juurdepÀÀsuks. Kuna NodeJS on algselt ĂŒhetahuline, siis keeruline Merkle puu arvutus takistas tehingu lisamise funktsiooni. Me nĂ€gime kahte vĂ”imalust selle probleemi lahendamiseks:
1. KĂ€ivitada mitu NodeJS protsessi, millest igaĂŒks tĂ€idab kindlaid funktsioone.
2. Kasutada worker_threads ja viia osa koodist silmustesse.
KokkuvĂ”ttes kasutasime mĂ”lemat varianti ĂŒheaegselt: loogiliselt jagasime ĂŒhe nodi kolme osaks, mis saavad töötada iseseisvalt, kuid samas ka sĂŒnkroonselt.
1. Esitamisnod, mis vÔtab tehingud jÀrjekorda ja loob plokke.
2. Valideerimisnode, mis kontrollib nodide kehtivust.
3. API node â pakub API-d andmetele juurdepÀÀsuks.
Iga nodiga saab ĂŒhenduda unix socketi kaudu cli kaudu.
Raskete operatsioonide, nagu Merkle puu arvutamine, viime eraldi silmusesse.
Nii saavutasime, et kÔik Plasma Cash funktsioonid töötavad korraga ja probleemideta.
Kui sĂŒsteem oli funktsionaalselt töökorras, alustasime kiiruseteste ja kahjuks saime rahuldavad tulemused: 5000 tehingut sekundis ja kuni 50 000 tehingut plokis. Pidi vĂ€lja selgitama, mis oli valesti teostatud.
Alguses hakkasime katsetama suhtlemismehhanismi Plasma Cashiga, et teada saada sĂŒsteemi tippvĂ”imekust. Oleme varem kirjutanud, et Plasma Cash'i sĂ”lm pakub unix socketi liidese. Esialgu oli see tekstiline, json objektid edastati, kasutades `JSON.parse()` ja `JSON.stringify()`.
```json
{
"action": "sendTransaction",
"payload":{
"prevHash": "0x8a88cc4217745fd0b4eb161f6923235da10593be66b841d47da86b9cd95d93e0",
"prevBlock": 41,
"tokenId": "57570139642005649136210751546585740989890521125187435281313126554130572876445",
"newOwner": "0x200eabe5b26e547446ae5821622892291632d4f4",
"type": "pay",
"data": "",
"signature": "0xd1107d0c6df15e01e168e631a386363c72206cb75b233f8f3cf883134854967e1cd9b3306cc5c0ce58f0a7397ae9b2487501b56695fe3a3c90ec0f61c7ea4a721c"
}
}
```
Me mÔÔtsime selliste objektide edastamise kiirus ja saime ~ 130k sekundis. Proovisime asendada standardseid json-funktsioone, aga jÔudlus ei paranenud. Tundub, et V8 mootor on nende operatsioonide jaoks hÀsti optimeeritud.
Meie sĂŒsteemis toimusid tehingute, tokenite ja plokkide töötlemine klasside kaudu. Selliste klasside loomisel vĂ€henes jĂ”udlus kahekordselt, mis tĂ”endab, et OOP ei sobi meile. Pidi kogu asja ĂŒmber kirjutama puhta funktsionaalse lĂ€henemisega.
Salvestamine andmebaasi
Alguses valisime andmete salvestamiseks Redis, kuna see on ĂŒks kĂ”ige efektiivsemaid lahendusi, mis vastab meie nĂ”uetele: key-value salvestus, töötamine hash-tabelitega, kogud. KĂ€ivitasime redis-benchmarki ja saime ~80k operatsiooni sekundis 1 pipelining reĆŸiimis.
KÔrge tÀpsuse saavutamiseks sÀttisime Redisit veel tÀiendavalt:
- Seadsime unix socket'i ĂŒhenduse.
- Keelasime oleku salvestamise kettale (usaldusvÀÀrsuse tagamiseks saab seadistada replika ja salvestada kettale eraldi Redis's).
Redis'is on bassein - see on hash-tabel, kuna meil on vaja vĂ”imalust saada kĂ”ik tehingud ĂŒhe pĂ€ringuga ja eemaldada tehingud ĂŒkshaaval. Proovisime kasutada tavalist loendit, kuid see töötab tervete loendite vĂ€ljavĂ”tmisel aeglasemalt.
Standardse NodeJS Redis'i teegi kasutamisel saime jÔudluse 18k tehingut sekundis. Kiirus langes 9 korda.
Kuna benchmark nĂ€itas meile selgelt viielist suuremat vĂ”imekust, alustasime optimeerimisega. Vahetasime raamatukogu ioredise vastu ja saime tootlikkuse 25 000 sekundis. Transaktsioone lisasime ĂŒkshaaval, kasutades kĂ€sku `hset`. Nii genereerisime palju pĂ€ringuid Redisese. Tekkis idee ĂŒhendada transaktsioonid paketiks ja saata need ĂŒhes kĂ€sus `hmset`. Tulemuseks oli 32 000 sekundis.
MÔnel pÔhjusel, mida we allpool selgitame, töötame andmetega kasutades `Buffer`it ning nagu selgus, kui see kirjutamise eel teksti viia (`buffer.toString('hex')`), saab saavutada tÀiendavat tootlikkust. Nii Ônnestus kiirus tÔsta 35 000 sekundisse. Praegu otsustasime edasise optimeerimise peatada.
Pidime minema ĂŒle binaarprotokollile, kuna:
1. SĂŒsteem arvutab sageli rĂ€simĂ€rke, allkirju jne, ja selleks on tal vaja andmeid `Buffer`is.
2. Teenuste vahel edastamisel on binaarsed andmed kergemad kui tekst. NÀiteks, kui saata plokk 1 miljoni transaktsiooniga, vÔivad tekstina andmed hÔivata rohkem kui 300 megabaiti.
3. Pidev andmete konverteerimine mÔjutab tootlikkust.
SeetÔttu pÔhinesime oma andmete salvestamise ja edastamise protokolli loomisel suurepÀrasel `binary-data` teegil.
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`-iks, et salvestada neid Redis-sse vÔi edastada teisele noodile ning andmeid tagasi hankida.
Kasutame ka kahte binaarset protokolli andmete edastamiseks teenuste vahel:
â Protokoll Plasma Node'iga suhtlemiseks unix socketi kaudu
{
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` â tegevus, mida on vaja teha, nĂ€iteks 1 â sendTransaction, 2 â getTransaction;
- `payload` â andmed, mida on vaja vastavasse funktsiooni edastada;
- `messageId` â sĂ”numi ID, et saaks tuvastada vastuse.
â Protokoll, mille kaudu sĂ”lmed omavahel suhtlevad
{
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 erineva versiooni sĂ”lmed ja need vĂ”ivad toimida erinevalt;
- `seq` â sĂ”numi identifikaator;
- `countChunk` ja `chunkNumber` vajalikud suurte sÔnumite jagamiseks;
- `length` ja `payload` pikkus ja andmed.
Kuna me tĂŒĂŒbisime andmed eelnevalt, töötab lĂ”pp-sĂŒsteem palju kiiremini kui Ethereumist pĂ€rinev `rlp` teek. Kahjuks ei ole me veel suutnud sellest loobuda, kuna on vajalik tĂ€iustada nutilepingut, mida me plaanime tulevikus teha.
Kui suudame saavutada kiirus 35 000 tehingute sekundis, peame neid ka töötlema optimaalse aja jooksul. Kuna ploki loomise eeldatav aeg on 30 sekundit, peame plokki lisama 1 000 000 tehingut, mis tÀhendab enam kui 100 mb andmete edastamist.
Alguses kasutasime `ethereumjs-devp2p` teeki nodede omavaheliseks suhtlemiseks, kuid see ei suutnud nii palju andmeid töödelda. SeetĂ”ttu kasutasime `ws` teeki ja seadistasime binaarsete andmete edastamise websocketide kaudu. Loomulikult kohtasime ka probleeme suurte andmepakettide edastamisel, kuid jagasime need osadeks ning nĂŒĂŒd neid probleeme enam ei esine.
Samuti nĂ”uab Merkle puu loomine ja tehingute hashi arvutamine umbes 1 000 000 sekundit pidevat arvutamist. Selle aja jooksul katkeb ĂŒhendus kĂ”igi nodede kĂŒlge. Otsustasime selle arvutamise viia eraldi lĂ”ime. 10 sekundit pidea arvutust. Selle aja jooksul katkeb ĂŒhendus kĂ”igi nodidega. Otsustati viia see arvutus eraldi lĂ”ime.
JĂ€reldused:
Tegelikult pole meie jÀreldused uudsed, aga mingil pÔhjusel unustavad paljud spetsialistid neid arendamisel.
- Funktsionaalse programmeerimise kasutamine objekti-orienteeritud programmeerimise asemel suurendab töötlustÔhusust.
- Monoliit on halvem kui teenusaarhitektuur tootlikule NodeJS sĂŒsteemile.
- Töötajate lĂ”ime (`worker_threads`) kasutamine raskete arvutuste jaoks parandab sĂŒsteemi vastupidavust, eriti i/o operatsioonide kĂ€itamisel.
- Unix socket on stabiilsem ja kiirem kui http pÀringud.
- Kui peate kiiresti edastama suuri andmeid ĂŒle vĂ”rgu, on parem kasutada websocket'e ja saata binaarseid andmeid, jagatuna tĂŒkkideks, mida saab vajadusel edastada ja hiljem ĂŒhte sĂ”numisse taastada.
Kutsume teid kĂŒlastama GitHub projekti:
Artikkel kirjutati koostöös Aleksandr Naƥivaniga, vanem arendaja .
Allikas: habr.com
