Test Pubbliku: Soluzzjoni għall-Privatezza u l-Iskalabbiltà fuq Ethereum

Blockchain hija teknoloġija innovattiva li twiegħed li ttejjeb ħafna oqsma tal-ħajja umana. Titrasferixxi proċessi u prodotti reali fl-ispazju diġitali, tiżgura l-veloċità u l-affidabbiltà tat-tranżazzjonijiet finanzjarji, tnaqqas l-ispiża tagħhom, u tippermetti wkoll li toħloq applikazzjonijiet DAPP moderni billi tuża kuntratti intelliġenti f'netwerks deċentralizzati.

Minħabba l-ħafna benefiċċji u l-applikazzjonijiet diversi tal-blockchain, jista 'jidher sorprendenti li din it-teknoloġija promettenti għadha ma daħlitx f'kull industrija. Il-problema hija li blockchains deċentralizzati moderni m'għandhomx skalabbiltà. Ethereum jipproċessa madwar 20 tranżazzjoni kull sekonda, li mhuwiex biżżejjed biex jissodisfa l-ħtiġijiet tan-negozji dinamiċi tal-lum. Fl-istess ħin, kumpaniji li jużaw it-teknoloġija blockchain joqogħdu lura milli jabbandunaw Ethereum minħabba l-grad għoli ta 'protezzjoni tiegħu mill-hacking u l-fallimenti tan-netwerk.

Biex tiġi żgurata d-deċentralizzazzjoni, is-sigurtà u l-iskalabbiltà fil-blockchain, u b'hekk issolvi t-Trilemma tal-Iskalabbiltà, it-tim tal-iżvilupp Opportunità ħoloq Plasma Cash, katina sussidjarja li tikkonsisti minn kuntratt intelliġenti u netwerk privat ibbażat fuq Node.js, li perjodikament tittrasferixxi l-istat tagħha lill-katina tal-għeruq (Ethereum).

Test Pubbliku: Soluzzjoni għall-Privatezza u l-Iskalabbiltà fuq Ethereum

Proċessi ewlenin fi Plasma Cash

1. L-utent isejjaħ il-funzjoni tal-kuntratt intelliġenti "depożitu", u jgħaddi fiha l-ammont ta 'ETH li jrid jiddepożita fit-token Plasma Cash. Il-funzjoni tal-kuntratt intelliġenti toħloq token u tiġġenera avveniment dwarha.

2. Plasma Cash nodes sottoskritti għal avvenimenti ta 'kuntratt intelliġenti jirċievu avveniment dwar il-ħolqien ta' depożitu u jżidu tranżazzjoni dwar il-ħolqien ta 'token mal-pool.

3. Perjodikament, nodi speċjali tal-Plasma Cash jieħdu t-tranżazzjonijiet kollha mill-pool (sa 1 ​​miljun) u jiffurmaw blokka minnhom, ikkalkula s-siġra Merkle u, għaldaqstant, il-hash. Din il-blokka tintbagħat lil nodi oħra għall-verifika. In-nodi jivverifikaw jekk il-hash Merkle huwiex validu u jekk it-tranżazzjonijiet humiex validi (pereżempju, jekk min jibgħat it-token huwiex is-sid tiegħu). Wara li jivverifika l-blokk, in-nodu jsejjaħ il-funzjoni `submitBlock` tal-kuntratt intelliġenti, li jiffranka n-numru tal-blokk u l-hash Merkle mal-katina tat-tarf. Il-kuntratt intelliġenti jiġġenera avveniment li jindika ż-żieda b'suċċess ta 'blokk. It-tranżazzjonijiet jitneħħew mill-pool.

4. Nodi li jirċievu l-avveniment ta 'sottomissjoni tal-blokk jibdew japplikaw it-tranżazzjonijiet li ġew miżjuda mal-blokk.

5. F'xi punt, is-sid (jew mhux is-sid) tat-token irid jirtirah minn Plasma Cash. Biex tagħmel dan, huwa jsejjaħ il-funzjoni `startExit`, u jgħaddi fiha informazzjoni dwar l-aħħar 2 tranżazzjonijiet fuq it-token, li jikkonfermaw li huwa s-sid tat-token. Il-kuntratt intelliġenti, bl-użu tal-hash Merkle, jiċċekkja l-preżenza ta 'tranżazzjonijiet fil-blokki u jibgħat it-token għall-irtirar, li se jseħħ f'ġimagħtejn.

6. Jekk l-operazzjoni tal-irtirar tat-token seħħet bi ksur (it-token intefaq wara li bdiet il-proċedura tal-irtirar jew it-token kien diġà ta 'xi ħadd ieħor qabel l-irtirar), is-sid tat-token jista' jirribatta l-irtirar fi żmien ġimgħatejn.

Test Pubbliku: Soluzzjoni għall-Privatezza u l-Iskalabbiltà fuq Ethereum

Il-privatezza tinkiseb b'żewġ modi

1. Il-katina tal-għeruq ma taf xejn dwar it-tranżazzjonijiet li jiġu ġġenerati u mibgħuta fi ħdan il-katina tat-tfal. L-informazzjoni dwar min iddepożita u rtira ETH minn Plasma Cash tibqa’ pubblika.

2. Il-katina tat-tfal tippermetti tranżazzjonijiet anonimi bl-użu ta' zk-SNARKs.

Munzell tat-teknoloġija

  • NodeJS
  • Ddistribwit mill-
  • Ethereum
  • ħamrija

Ittestjar

Waqt l-iżvilupp tal-Plasma Cash, ittestjajna l-veloċità tas-sistema u ksibna r-riżultati li ġejjin:

  • sa 35 tranżazzjoni kull sekonda huma miżjuda mal-pool;
  • sa 1 tranżazzjoni jistgħu jinħażnu fi blokk.

It-testijiet saru fuq it-3 servers li ġejjin:

1. Intel Core i7-6700 Quad-Core Skylake incl. NVMe SSD - 512 GB, 64 GB DDR4 RAM
Ġew imqajma 3 nodi ta' validazzjoni tal-Plasma Cash.

2. AMD Ryzen 7 1700X Octa-Core "Summit Ridge" (Zen), SATA SSD - 500 GB, 64 GB DDR4 RAM
In-node Ropsten testnet ETH tqajjem.
Ġew imqajma 3 nodi ta' validazzjoni tal-Plasma Cash.

3. Intel Core i9-9900K Octa-Core incl. NVMe SSD - 1 TB, 64 GB DDR4 RAM
1 Tqajjem node ta' sottomissjoni ta' Plasma Cash.
Ġew imqajma 3 nodi ta' validazzjoni tal-Plasma Cash.
Tnieda test biex jiżdiedu tranżazzjonijiet man-netwerk Plasma Cash.

Total: 10 nodi Plasma Cash f'netwerk privat.

Test 1

Hemm limitu ta' miljun tranżazzjoni għal kull blokka. Għalhekk, miljun tranżazzjoni jaqgħu f'1 blokki (peress li s-sistema tirnexxi tieħu parti mit-tranżazzjonijiet u tissottometti waqt li jkunu qed jintbagħtu).


Stat inizjali: l-aħħar blokk #7; 1 miljun transazzjoni u tokens huma maħżuna fid-database.

00:00 — bidu tal-kitba tal-ġenerazzjoni tat-tranżazzjonijiet
01:37 - Inħolqu 1 miljun tranżazzjoni u beda jintbagħat lin-node
01:46 — submit node ħa 240k transazzjonijiet mill-pool u l-formoli blokk #8. Naraw ukoll li 320k transazzjonijiet huma miżjuda mal-pool f'10 sekondi
01:58 — il-blokk #8 jiġi ffirmat u mibgħut għall-validazzjoni
02:03 — il-blokk #8 jiġi vvalidat u l-funzjoni `submitBlock` tal-kuntratt intelliġenti tissejjaħ bin-numru tal-hash u tal-blokk Merkle
02:10 — l-iskript demo spiċċa jaħdem, li bagħat miljun tranżazzjoni fi 1 sekonda
02:33 - in-nodi bdew jirċievu informazzjoni li l-blokka #8 ġiet miżjuda mal-katina tal-għeruq, u bdew iwettqu 240k transazzjonijiet
02:40 - 240k tranżazzjonijiet tneħħew mill-pool, li diġà jinsabu fil-blokk #8
02:56 — submit node ħa s-760k tranżazzjonijiet li kien fadal mill-pool u beda jikkalkula l-hash Merkle u l-blokk tal-iffirmar #9
03:20 - in-nodi kollha fihom 1 miljun 240k transazzjoni u tokens
03:35 — il-blokk #9 jiġi ffirmat u mibgħut għall-validazzjoni lil nodi oħra
03:41 - seħħ żball tan-netwerk
04:40 — l-istennija tal-validazzjoni tal-blokk #9 skada
04:54 — submit node ħa s-760k tranżazzjonijiet li kien fadal mill-pool u beda jikkalkula l-hash Merkle u l-blokk tal-iffirmar #9
05:32 — il-blokk #9 jiġi ffirmat u mibgħut għall-validazzjoni lil nodi oħra
05:53 — il-blokk #9 jiġi vvalidat u mibgħut lill-katina tal-għeruq
06:17 - in-nodi bdew jirċievu informazzjoni li l-blokka #9 ġiet miżjuda mal-katina tal-għeruq u bdiet twettaq 760k transazzjonijiet
06:47 — il-ġabra neħħiet it-tranżazzjonijiet li jinsabu fil-blokk #9
09:06 - in-nodi kollha fihom 2 miljun transazzjoni u tokens

Test 2

Hemm limitu ta '350k għal kull blokka. Bħala riżultat, għandna 3 blokki.


Stat inizjali: l-aħħar blokk #9; 2 miljun tranżazzjoni u tokens huma maħżuna fid-database

00:00 — l-iskrittura tal-ġenerazzjoni tat-tranżazzjonijiet diġà tnediet
00:44 - Inħolqu 1 miljun tranżazzjoni u beda jintbagħat lin-node
00:56 — submit node ħa 320k transazzjonijiet mill-pool u l-formoli blokk #10. Naraw ukoll li 320k transazzjonijiet huma miżjuda mal-pool f'10 sekondi
01:12 — blokk #10 hija ffirmata u mibgħuta lil nodi oħra għall-validazzjoni
01:18 — l-iskript demo spiċċa jaħdem, li bagħat miljun tranżazzjoni fi 1 sekonda
01:20 — il-blokk #10 jiġi vvalidat u mibgħut lill-katina tal-għeruq
01:51 - in-nodi kollha rċevew informazzjoni mill-katina tal-għeruq li l-blokk #10 ġie miżjud u bdew japplikaw 320k transazzjonijiet
02:01 - il-pool ikklerja għal 320k tranżazzjonijiet li ġew miżjuda mal-blokk #10
02:15 — submit node ħa 350k transazzjonijiet mill-pool u l-formoli blokk #11
02:34 — il-blokk #11 jiġi ffirmat u mibgħut lil nodi oħra għall-validazzjoni
02:51 — il-blokk #11 jiġi vvalidat u mibgħut lill-katina tal-għeruq
02:55 — l-aħħar nodu lesta tranżazzjonijiet mill-blokk #10
10:59 — it-tranżazzjoni bis-sottomissjoni tal-blokk #9 ħadet żmien twil ħafna fil-katina ta 'l-għeruq, iżda tlestiet u n-nodi kollha rċevew informazzjoni dwarha u bdew iwettqu tranżazzjonijiet ta' 350k
11:05 - il-pool ikklerja għal 320k tranżazzjonijiet li ġew miżjuda mal-blokk #11
12:10 - in-nodi kollha fihom 1 miljun 670k transazzjoni u tokens
12:17 — submit node ħa 330k tranżazzjonijiet mill-grupp u l-formoli blokk #12
12:32 — il-blokk #12 jiġi ffirmat u mibgħut lil nodi oħra għall-validazzjoni
12:39 — il-blokk #12 jiġi vvalidat u mibgħut lill-katina tal-għeruq
13:44 - in-nodi kollha rċevew informazzjoni mill-katina tal-għeruq li l-blokk #12 ġie miżjud u bdew japplikaw 330k tranżazzjonijiet
14:50 - in-nodi kollha fihom 2 miljun transazzjoni u tokens

Test 3

Fl-ewwel u t-tieni servers, nodu ta' validazzjoni wieħed ġie sostitwit b'nodu ta' sottomissjoni.


Stat inizjali: l-aħħar blokk #84; 0 transazzjonijiet u tokens salvati fid-database

00:00 — Tnedew 3 skripts li jiġġeneraw u jibagħtu miljun tranżazzjoni kull wieħed
01:38 — Inħolqu miljun tranżazzjoni u beda jintbagħat biex jissottometti n-node #1
01:50 — issottometti n-node #3 ħa 330k transazzjonijiet mill-pool u l-formoli blokk #85 (f21). Naraw ukoll li 350k transazzjonijiet huma miżjuda mal-pool f'10 sekondi
01:53 — Inħolqu miljun tranżazzjoni u beda jintbagħat biex jissottometti n-node #1
01:50 — issottometti n-node #3 ħa 330k transazzjonijiet mill-pool u l-formoli blokk #85 (f21). Naraw ukoll li 350k transazzjonijiet huma miżjuda mal-pool f'10 sekondi
02:01 — issottometti n-node #1 ħa 250k tranżazzjonijiet mill-grupp u l-formoli blokk #85 (65e)
02:06 — il-blokk #85 (f21) jiġi ffirmat u mibgħut lil nodi oħra għall-validazzjoni
02:08 — skript demo tas-server #3, li bagħat miljun tranżazzjoni fi 1 sekonda, spiċċa jaħdem
02:14 — il-blokk #85 (f21) jiġi vvalidat u mibgħut lill-katina tal-għeruq
02:19 — il-blokk #85 (65e) jiġi ffirmat u mibgħut lil nodi oħra għall-validazzjoni
02:22 — Inħolqu miljun tranżazzjoni u beda jintbagħat biex jissottometti n-node #1
02:27 — blokk #85 (65e) ivvalidat u mibgħut lill-katina tal-għeruq
02:29 — submit node #2 ħa 111855 tranżazzjonijiet mill-pool u l-formoli blokk #85 (256).
02:36 — il-blokk #85 (256) jiġi ffirmat u mibgħut lil nodi oħra għall-validazzjoni
02:36 — skript demo tas-server #1, li bagħat miljun tranżazzjoni fi 1 sekonda, spiċċa jaħdem
02:38 — il-blokk #85 (256) jiġi vvalidat u mibgħut lill-katina tal-għeruq
03:08 — l-iskript tas-server #2 spiċċa jaħdem, li bagħat miljun tranżazzjoni f'1 sekonda
03:38 - in-nodi kollha rċevew informazzjoni mill-katina tal-għeruq li ġew miżjuda l-blokki #85 (f21), #86(65e), #87(256) u bdew japplikaw 330k, 250k, 111855 tranżazzjonijiet
03:49 - il-pool ġie kklerjat bi 330k, 250k, 111855 tranżazzjonijiet li ġew miżjuda mal-blokki #85 (f21), #86(65e), #87(256)
03:59 — submit node #1 ħa 888145 tranżazzjoni mill-pool u l-formoli blokk #88 (214), issottometti node #2 ħa 750k tranżazzjonijiet mill-pool u l-formoli blokk #88 (50a), issottometti node #3 ħa 670k tranżazzjonijiet minn il-pool u l-formoli blokk #88 (d3b)
04:44 — il-blokk #88 (d3b) jiġi ffirmat u mibgħut lil nodi oħra għall-validazzjoni
04:58 — il-blokk #88 (214) jiġi ffirmat u mibgħut lil nodi oħra għall-validazzjoni
05:11 — il-blokk #88 (50a) jiġi ffirmat u mibgħut lil nodi oħra għall-validazzjoni
05:11 — il-blokk #85 (d3b) jiġi vvalidat u mibgħut lill-katina tal-għeruq
05:36 — il-blokk #85 (214) jiġi vvalidat u mibgħut lill-katina tal-għeruq
05:43 - in-nodi kollha rċevew informazzjoni mill-katina tal-għeruq li l-blokki #88 (d3b), #89(214) ġew miżjuda u qed jibdew japplikaw 670k, 750k transazzjonijiet
06:50 — minħabba nuqqas ta' komunikazzjoni, il-blokk #85 (50a) ma ġiex ivvalidat
06:55 — issottometti n-node #2 ħa 888145 tranżazzjonijiet mill-grupp u l-formoli blokk #90 (50a)
08:14 — il-blokk #90 (50a) jiġi ffirmat u mibgħut lil nodi oħra għall-validazzjoni
09:04 — il-blokk #90 (50a) jiġi vvalidat u mibgħut lill-katina tal-għeruq
11:23 - in-nodi kollha rċevew informazzjoni mill-katina ta 'l-għeruq li ġie miżjud il-blokk #90 (50a), u bdew japplikaw 888145 tranżazzjonijiet. Fl-istess ħin, is-server #3 diġà applika tranżazzjonijiet mill-blokki #88 (d3b), #89(214)
12:11 - il-pixxini kollha huma vojta
13:41 — in-nodi kollha tas-server #3 fihom 3 miljun transazzjoni u tokens
14:35 — in-nodi kollha tas-server #1 fihom 3 miljun transazzjoni u tokens
19:24 — in-nodi kollha tas-server #2 fihom 3 miljun transazzjoni u tokens

Ostakli

Matul l-iżvilupp ta 'Plasma Cash, iltqajna mal-problemi li ġejjin, li gradwalment solvejna u qed insolvu:

1. Kunflitt fl-interazzjoni ta 'diversi funzjonijiet tas-sistema. Pereżempju, il-funzjoni taż-żieda ta 'tranżazzjonijiet mal-pool imblukkat ix-xogħol tas-sottomissjoni u l-validazzjoni tal-blokki, u viċi versa, li wassal għal tnaqqis fil-veloċità.

2. Ma kienx ċar immedjatament kif tibgħat numru kbir ta 'tranżazzjonijiet filwaqt li timminimizza l-ispejjeż tat-trasferiment tad-dejta.

3. Ma kienx ċar kif u fejn tinħażen id-dejta sabiex jinkisbu riżultati għoljin.

4. Ma kienx ċar kif torganizza netwerk bejn in-nodi, peress li d-daqs ta 'blokk b'1 miljun tranżazzjoni jieħu madwar 100 MB.

5. Ix-xogħol fil-modalità b'ħajt wieħed ikisser il-konnessjoni bejn in-nodi meta jseħħu kalkoli twal (per eżempju, il-bini ta 'siġra Merkle u l-kalkolu tal-hash tagħha).

Kif ittrattajna dan kollu?

L-ewwel verżjoni tan-node Plasma Cash kienet tip ta 'kombinazzjoni li tista' tagħmel kollox fl-istess ħin: taċċetta tranżazzjonijiet, tissottometti u tivvalida blokki, u tipprovdi API għall-aċċess tad-dejta. Peress li NodeJS huwa b'mod nattiv b'ħajt wieħed, il-funzjoni tqila tal-kalkolu tas-siġra Merkle imblukkat il-funzjoni tat-tranżazzjoni żid. Rajna żewġ għażliet biex insolvu din il-problema:

1. Tnedija diversi proċessi NodeJS, li kull wieħed minnhom iwettaq funzjonijiet speċifiċi.

2. Uża worker_threads u ċċaqlaq l-eżekuzzjoni ta 'parti mill-kodiċi f'ħjut.

Bħala riżultat, użajna ż-żewġ għażliet fl-istess ħin: qsamna loġikament nodu wieħed fi 3 partijiet li jistgħu jaħdmu separatament, iżda fl-istess ħin b'mod sinkroniku

1. Submission node, li jaċċetta tranżazzjonijiet fil-pool u joħloq blokki.

2. Nodu ta' validazzjoni li jiċċekkja l-validità tan-nodi.

3. Node API - jipprovdi API għall-aċċess tad-dejta.

F'dan il-każ, tista 'tikkonnettja ma' kull node permezz ta 'socket unix billi tuża cli.

Aħna mċaqalqa operazzjonijiet tqal, bħall-kalkolu tas-siġra Merkle, f'ħajt separat.

Għalhekk, ksibna tħaddim normali tal-funzjonijiet kollha tal-Plasma Cash simultanjament u mingħajr fallimenti.

Ladarba s-sistema kienet funzjonali, bdejna nittestjaw il-veloċità u, sfortunatament, irċevejna riżultati mhux sodisfaċenti: 5 tranżazzjoni kull sekonda u sa 000 tranżazzjoni għal kull blokka. Kelli nifhem x'kien implimentat ħażin.

Biex tibda, bdejna nittestjaw il-mekkaniżmu ta 'komunikazzjoni ma' Plasma Cash biex insiru nafu l-ogħla kapaċità tas-sistema. Aħna ktibna qabel li n-node Plasma Cash jipprovdi interface ta 'socket unix. Inizjalment kien ibbażat fuq test. Oġġetti json intbagħtu bl-użu ta' `JSON.parse()` u `JSON.stringify()`.

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

Aħna kejlu l-veloċità tat-trasferiment ta 'oġġetti bħal dawn u sibna ~ 130k kull sekonda. Ippruvajna nissostitwixxu l-funzjonijiet standard biex naħdmu ma 'json, iżda l-prestazzjoni ma tjiebitx. Il-magna V8 trid tkun ottimizzata sew għal dawn l-operazzjonijiet.

Ħdimna ma 'tranżazzjonijiet, tokens, u blokki permezz ta' klassijiet. Meta ħoloq klassijiet bħal dawn, il-prestazzjoni naqset b'2 darbiet, li jindika li OOP mhix adattata għalina. Kelli nikteb kollox għal approċċ purament funzjonali.

Reġistrazzjoni fid-database

Inizjalment, Redis intgħażlet għall-ħażna tad-dejta bħala waħda mill-aktar soluzzjonijiet produttivi li tissodisfa r-rekwiżiti tagħna: ħażna ta 'valur ewlieni, ħidma ma' tabelli hash, settijiet. Nedejna redis-benchmark u ltqajna ~ 80k operazzjonijiet kull sekonda f'modalità pipelining 1.

Għal prestazzjoni għolja, irfinajna Redis b'mod aktar fin:

  • Ġiet stabbilita konnessjoni tas-socket unix.
  • Aħna ddiżattivajna l-iffrankar tal-istat fuq disk (għall-affidabbiltà, tista 'twaqqaf replika u tissejvja fuq disk f'Redis separat).

F'Redis, pool huwa tabella hash għaliex irridu nkunu kapaċi nġibu t-tranżazzjonijiet kollha f'mistoqsija waħda u nħassru t-tranżazzjonijiet wieħed wieħed. Ippruvajna nużaw lista regolari, iżda hija aktar bil-mod meta nħatt il-lista kollha.

Meta użaw NodeJS standard, il-libreriji Redis kisbu prestazzjoni ta 'transazzjonijiet 18k kull sekonda. Il-veloċità niżlet 9 darbiet.

Peress li l-benchmark wera li l-possibbiltajiet kienu b'mod ċar 5 darbiet akbar, bdejna ottimizzaw. Bdilna l-librerija għal ioredis u ksibna prestazzjoni ta '25k kull sekonda. Żidna t-tranżazzjonijiet waħda waħda bl-użu tal-kmand `hset`. Allura konna niġġeneraw ħafna mistoqsijiet f'Redis. L-idea ħarġet li tgħaqqad it-tranżazzjonijiet f'lottijiet u tibgħathom b'kmand wieħed "hmset". Ir-riżultat huwa 32k kull sekonda.

Għal diversi raġunijiet, li se niddeskrivu hawn taħt, naħdmu bid-dejta bl-użu ta' `Buffer` u, kif jirriżulta, jekk tikkonvertiha f'test (`buffer.toString('hex')`) qabel tikteb, tista' tikseb addizzjonali prestazzjoni. Għalhekk, il-veloċità żdiedet għal 35k kull sekonda. Bħalissa, iddeċidejna li nissospendi aktar ottimizzazzjoni.

Kellna naqilbu għal protokoll binarju għaliex:

1. Is-sistema ta 'spiss tikkalkula hashes, firem, eċċ., u għal dan teħtieġ data fil-'Buffer.

2. Meta tintbagħat bejn is-servizzi, id-dejta binarja tiżen inqas mit-test. Pereżempju, meta tibgħat blokka b'1 miljun tranżazzjoni, id-dejta fit-test tista 'tieħu aktar minn 300 megabytes.

3. It-trasformazzjoni kostanti tad-dejta taffettwa l-prestazzjoni.

Għalhekk, ħadna bħala bażi l-protokoll binarju tagħna stess għall-ħażna u t-trażmissjoni tad-dejta, żviluppata fuq il-bażi tal-librerija meraviljuża `binary-data`.

Bħala riżultat, aħna ksibna l-istrutturi tad-dejta li ġejjin:

—Transazzjoni

  ```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),
  }
  ```

—Blokk

  ```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,
  }
  ```

Bil-kmandi tas-soltu `BD.encode(block, Protocol).slice();` u `BD.decode(buffer, Protocol)` aħna nikkonvertiw id-data f'`Buffer` biex nissejvjaw f'Redis jew nibgħatu lil node ieħor u nġibu l- data lura.

Għandna wkoll 2 protokolli binarji għat-trasferiment tad-dejta bejn is-servizzi:

— Protokoll għall-interazzjoni ma' Plasma Node permezz ta' socket unix

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

fejn:

  • "tip" — l-azzjoni li trid titwettaq, pereżempju, 1 — sendTransaction, 2 — getTransaction;
  • `tagħbija` — data li teħtieġ li tiġi mgħoddija lill-funzjoni xierqa;
  • `MessageId` — id-messaġġ sabiex ir-rispons ikun jista' jiġi identifikat.

— Protokoll għall-interazzjoni bejn in-nodi

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

fejn:

  • "kodiċi". — kodiċi tal-messaġġ, pereżempju 6 — PREPARE_NEW_BLOCK, 7 — BLOCK_VALID, 8 — BLOCK_COMMIT;
  • `versionProtocol` — verżjoni tal-protokoll, peress li n-nodi b'verżjonijiet differenti jistgħu jitqajmu fuq in-netwerk u jistgħu jaħdmu b'mod differenti;
  • `seq` — identifikatur tal-messaġġ;
  • `countChunk` и `chunkNumber` meħtieġa għall-qsim ta' messaġġi kbar;
  • `tul` и `tagħbija` tul u d-data nnifisha.

Peress li ttajpjana d-dejta minn qabel, is-sistema finali hija ħafna aktar mgħaġġla mil-librerija `rlp` ta 'Ethereum. Sfortunatament, għadna ma stajniex nirrifjutawha, peress li huwa meħtieġ li tiffinalizza l-kuntratt intelliġenti, li qed nippjanaw li nagħmlu fil-futur.

Kieku rnexxielna nilħqu l-veloċità 35 000 tranżazzjonijiet kull sekonda, irridu wkoll nipproċessawhom fl-aħjar ħin. Peress li l-ħin approssimattiv tal-formazzjoni tal-blokk jieħu 30 sekonda, jeħtieġ li ninkludu fil-blokk 1 000 000 transazzjonijiet, li jfisser li tibgħat aktar 100 MB ta' data.

Inizjalment, użajna l-librerija `ethereumjs-devp2p` biex nikkomunikaw bejn in-nodi, iżda ma setgħetx timmaniġġja daqshekk dejta. Bħala riżultat, użajna l-librerija `ws` u kkonfigurajna nibgħat dejta binarja permezz tal-websocket. Naturalment, iltqajna wkoll ma 'problemi meta nibagħtu pakketti ta' dejta kbar, iżda qsimnihom f'biċċiet u issa dawn il-problemi spiċċaw.

Li tifforma wkoll siġra Merkle u tikkalkula l-hash 1 000 000 transazzjonijiet teħtieġ madwar 10 sekondi ta’ kalkolu kontinwu. Matul dan iż-żmien, il-konnessjoni man-nodi kollha jirnexxielha tinkiser. Ġie deċiż li dan il-kalkolu jitmexxa għal ħajt separat.

Konklużjonijiet:

Fil-fatt, is-sejbiet tagħna mhumiex ġodda, iżda għal xi raġuni ħafna esperti jinsew dwarhom meta jiżviluppaw.

  • L-użu tal-Programmazzjoni Funzjonali minflok il-Programmazzjoni Orjentata lejn l-Oġġetti ttejjeb il-produttività.
  • Il-monolith huwa agħar minn arkitettura tas-servizz għal sistema NodeJS produttiva.
  • L-użu ta ''worker_threads' għal komputazzjoni qawwija jtejjeb ir-rispons tas-sistema, speċjalment meta tittratta operazzjonijiet i/o.
  • socket unix huwa aktar stabbli u aktar mgħaġġel minn talbiet http.
  • Jekk għandek bżonn tittrasferixxi malajr data kbira fuq in-netwerk, huwa aħjar li tuża websockets u tibgħat data binarja, maqsuma f'biċċiet, li jistgħu jintbagħtu jekk ma jaslux, u mbagħad magħquda f'messaġġ wieħed.

Nistednuk iżżur GitHub proġett: https://github.com/opporty-com/Plasma-Cash/tree/new-version

L-artiklu kien ko-miktub minn Alexander Nashivan, żviluppatur anzjan Soluzzjoni Clever Inc.

Sors: www.habr.com

Żid kumment