Uvavanyo loluntu: Isisombululo soBucala kunye ne-Scalability kwi-Ethereum

Ibhlokhi bubugcisa obutsha obuthembisa ukuphucula iinkalo ezininzi zobomi bomntu. Idlulisela iinkqubo zangempela kunye neemveliso kwindawo yedijithali, iqinisekisa ukukhawuleza kunye nokuthembeka kwentengiselwano yezemali, iyanciphisa iindleko zabo, kwaye ikuvumela ukuba wenze izicelo ze-DAPP zanamhlanje usebenzisa izivumelwano ezihlakaniphile kwiinethiwekhi ezinikezelweyo.

Ukunikezelwa kweenzuzo ezininzi kunye nezicelo ezahlukeneyo ze-blockchain, kunokubonakala kumangalisa ukuba le teknoloji ethembisayo ayikangeni kuyo yonke imboni. Ingxaki kukuba i-blockchains yanamhlanje ayinakulinganiswa. Iinkqubo ze-Ethereum malunga neentengiselwano ze-20 ngesekhondi, ezinganelanga ukuhlangabezana neemfuno zamashishini anamandla anamhlanje. Ngelo xesha, iinkampani ezisebenzisa iteknoloji ye-blockchain ziyathandabuza ukushiya i-Ethereum ngenxa yezinga eliphezulu lokukhuselwa kwi-hacking kunye nokungaphumeleli kwenethiwekhi.

Ukuqinisekisa ukunatyiswa, ukhuseleko kunye nokuncipha kwi-blockchain, ngaloo ndlela usombulula i-Scalability Trilemma, iqela lophuhliso. Ithuba yakha i-Plasma Cash, ikhonkco elincedisayo elibandakanya inkontileka ehlakaniphile kunye nenethiwekhi yangasese esekelwe kwi-Node.js, ehlala idlulisela imeko yayo kwi-root chain (Ethereum).

Uvavanyo loluntu: Isisombululo soBucala kunye ne-Scalability kwi-Ethereum

Iinkqubo eziphambili kwi-Plasma Cash

1. Umsebenzisi ubiza umsebenzi wenkontileka ehlakaniphile `idiphozithi`, edlula kuyo isixa se-ETH afuna ukuyifaka kwi-token ye-Plasma Cash. Umsebenzi wekhontrakthi ohlakaniphile udala ithokheni kwaye uvelise isiganeko malunga nalo.

2. I-Plasma Cash nodes ezibhalisele iziganeko zekhontrakthi ezihlakaniphile zifumana isiganeko malunga nokudala idiphozithi kwaye yongeza ukuthengiselana malunga nokudala ithokheni echibini.

3. Ngamaxesha athile, i-Plasma Cash nodes ezikhethekileyo zithatha zonke iintengiselwano ezivela echibini (ukuya kwi-1 yezigidi) kwaye zenze ibhloko kubo, zibale umthi we-Merkle kwaye, ngokufanelekileyo, i-hash. Le block ithunyelwa kwezinye iindawo zokuqinisekisa. Ii-nodes zijonga ukuba i-hash ye-Merkle iyasebenza kwaye ukuba iintengiselwano zivumelekile (umzekelo, ukuba umthumeli wethokheni ungumnini wakhe). Emva kokuqinisekisa ibhloko, i-node ibiza `submitBlock` umsebenzi wekhontrakthi ehlakaniphile, egcina inombolo yebhloko kunye ne-Merkle hash kumphetho wekhonkco. Ikhontrakthi ehlakaniphile ivelisa isiganeko esibonisa ukongezwa ngempumelelo kwebhloko. Iintengiselwano ziyasuswa echibini.

4. IiNodes ezifumana isiganeko sokungeniswa kwebhloko ziqala ukusebenzisa iintengiselwano ezongeziweyo kwibhloko.

5. Ngexesha elithile, umnini (okanye ongeyena umnini) wethokheni ufuna ukuyihoxisa kwi-Plasma Cash. Ukwenza oku, ubiza umsebenzi we `startExit`, edlulisela kuyo ulwazi malunga neentengiselwano ezi-2 zokugqibela kwithokheni, eqinisekisa ukuba ungumnini wophawu. Inkontileka ehlakaniphile, isebenzisa i-hash ye-Merkle, ihlola ubukho bokuthengiselana kwiibhloko kwaye ithumela ithokheni yokuhoxiswa, eya kwenzeka kwiiveki ezimbini.

6. Ukuba umsebenzi wokurhoxisa umqondiso wenzeke ngokuphulwa (ithokheni yachithwa emva kokuba inkqubo yokurhoxiswa iqalile okanye ithokheni yayisele ingomnye umntu ngaphambi kokuhoxiswa), umnini wethokheni unokuchasa ukuhoxiswa kwiiveki ezimbini.

Uvavanyo loluntu: Isisombululo soBucala kunye ne-Scalability kwi-Ethereum

Ubumfihlo bufezekiswa ngeendlela ezimbini

1. Ikhonkco lengcambu alazi nto malunga nentengiselwano eyenziwayo kwaye idluliselwe phakathi kwekhonkco lomntwana. Ulwazi malunga nokuba ngubani ofake kwaye wakhupha i-ETH kwi-Plasma Cash ihlala isesidlangalaleni.

2. Ikhonkco lomntwana livumela ukuthengiselana okungaziwa usebenzisa i-zk-SNARKs.

Isitaki setekhnoloji

  • NodeJS
  • Redis
  • I-Etherium
  • Sild

Ukuvavanywa

Ngelixa siphuhlisa iPlasma Cash, siye savavanya isantya senkqubo kwaye safumana ezi ziphumo zilandelayo:

  • ukuya kuthi ga kwi-35 yentengiselwano ngesekhondi yongezwa kwi-pool;
  • ukuya kuthi ga kwi-1 yentengiselwano inokugcinwa kwibhloko.

Uvavanyo lwenziwe kwezi seva zi-3 zilandelayo:

1. Intel Core i7-6700 Quad-Core Skylake incl. I-NVMe SSD - 512 GB, 64 GB DDR4 RAM
Zi-3 ii-Plasma Cash nodes eziqinisekisayo zaphakanyiswa.

2. AMD Ryzen 7 1700X Octa-Core β€œSummit Ridge” (Zen), SATA SSD – 500 GB, 64 GB DDR4 RAM
I-Ropsten testnet ETH node yaphakanyiswa.
I-3 ye-Plasma Cash nodes eqinisekisayo yaphakanyiswa.

3. Intel Core i9-9900K Octa-Core incl. I-NVMe SSD - 1 TB, 64 GB DDR4 RAM
1 Indawo yokungeniswa kweMali yePlasma iye yaphakanyiswa.
I-3 ye-Plasma Cash nodes eqinisekisayo yaphakanyiswa.
Kwaqaliswa uvavanyo lokongeza iitransekshini kwinethiwekhi yePlasma Cash.

Iyonke: I-10 yePlasma Cash nodes kwinethiwekhi yabucala.

Uvavanyo 1

Kukho umda we-1 yezigidi zentengiselwano kwibhloko nganye. Ngoko ke, i-1 yezigidi zentengiselwano ziwela kwiibhloko ze-2 (ekubeni inkqubo ilawula ukuthatha inxalenye yentengiselwano kwaye ingenise ngelixa ithunyelwa).


Imeko yokuqala: ibhloko yokugqibela #7; I-1 yezigidi zentengiselwano kunye namathokheni zigcinwe kwi-database.

00:00 - ukuqala kwescript sokuvelisa intengiselwano
01:37 - Izigidi ezi-1 zentengiselwano zenziwa kwaye zathunyelwa kwi-node yaqala
01:46 - i-node yokungenisa ithathe iintengiselwano ze-240k ukusuka echibini kunye neefom zebhloko #8. Siyabona kwakhona ukuba iintengiselwano ze-320k zongezwa echibini ngemizuzwana eyi-10
01:58 β€” ibhloko #8 isayinwe kwaye ithunyelwe ukuqinisekiswa
02:03 β€” ibhloko #8 iqinisekisiwe kwaye umsebenzi `submitBlock` wekhontrakthi ehlakaniphile ubizwa nge-hash ye-Merkle kunye nenombolo yebhloko.
02:10 - iskripthi sedemo sigqibile ukusebenza, esithumele ukuthengiselana kwesigidi esi-1 kwimizuzwana engama-32
02:33 - ii-nodes zaqala ukufumana ulwazi lokuba ibhloko #8 yongezwa kwikhonkco lengcambu, kwaye yaqala ukwenza iintengiselwano ze-240k.
02:40 - 240k intengiselwano yasuswa echibini, esele ikwibhloko #8
02:56 - i-node yokungenisa ithathe i-760k eseleyo yentengiselwano ukusuka echibini kwaye yaqala ukubala i-hash ye-Merkle kunye nebhloko yokusayina #9
03:20 - zonke iindawo ziqulethe i-1 yezigidi ze-240k zentengiselwano kunye namathokheni
03:35 - ibhloko #9 isayinwe kwaye ithunyelwe ukuqinisekiswa kwezinye iindawo
03:41 - impazamo yenethiwekhi yenzekile
04:40 β€” ukulinda ibhloko #9 ukuqinisekiswa kuphelelwe lixesha
04:54 - i-node yokungenisa ithathe i-760k eseleyo yentengiselwano ukusuka echibini kwaye yaqala ukubala i-hash ye-Merkle kunye nebhloko yokusayina #9
05:32 - ibhloko #9 isayinwe kwaye ithunyelwe ukuqinisekiswa kwezinye iindawo
05:53 β€” ibhloko #9 iqinisekisiwe kwaye ithunyelwe kwikhonkco lengcambu
06:17 - ii-nodes zaqala ukufumana ulwazi lokuba ibhloko #9 yongezwa kwikhonkco leengcambu kwaye yaqala ukwenza ukuthengiselana kwe-760k
06:47 - ichibi licimile iintengiselwano ezikwibhloko #9
09:06 - zonke ii-nodes ziqulethe i-2 yezigidi zentengiselwano kunye namathokheni

Uvavanyo 2

Kukho umda we-350k kwibhloko nganye. Ngenxa yoko, sineebhloko ezi-3.


Imeko yokuqala: ibhloko yokugqibela #9; Izigidi ezi-2 zentengiselwano kunye namathokheni zigcinwe kwisiseko sedatha

00:00 - iskripthi sokuvelisa intengiselwano sele siqalisiwe
00:44 - Izigidi ezi-1 zentengiselwano zenziwa kwaye zathunyelwa kwi-node yaqala
00:56 - i-node yokungenisa ithathe iintengiselwano ze-320k ukusuka echibini kunye neefom zebhloko #10. Siyabona kwakhona ukuba iintengiselwano ze-320k zongezwa echibini ngemizuzwana eyi-10
01:12 - ibhloko #10 isayinwe kwaye ithunyelwe kwezinye iindawo zokuqinisekiswa
01:18 - iskripthi sedemo sigqibile ukusebenza, esithumele ukuthengiselana kwesigidi esi-1 kwimizuzwana engama-34
01:20 - ibhloko #10 iqinisekisiwe kwaye ithunyelwe kwikhonkco lengcambu
01:51 - zonke iindawo ezifunyenweyo zifumene ulwazi kwikhonkco lengcambu ebhlokayo #10 yongezwa kwaye iqalise ukusebenzisa iintengiselwano ze-320k
02:01 - ichibi licinyiwe kwintengiselwano ye-320k eyongezwe kwibhlokhi #10
02:15 - i-node yokungenisa ithathe iintengiselwano ze-350k ukusuka echibini kunye neefom block #11
02:34 - ibhloko #11 isayinwe kwaye ithunyelwe kwezinye iindawo zokuqinisekiswa
02:51 - ibhloko #11 iqinisekisiwe kwaye ithunyelwe kwikhonkco lengcambu
02:55 - i-node yokugqibela igqityiwe ukuthengiselana ukusuka kwibhloko #10
10:59 - ukuthengiselana kunye nokungeniswa kwebhloko #9 kuthathe ixesha elide kakhulu kwikhonkco leengcambu, kodwa kwagqitywa kwaye zonke iindawo zafumana ulwazi malunga nalo kwaye zaqala ukwenza i-350k transactions.
11:05 - ichibi licinyiwe kwintengiselwano ye-320k eyongezwe kwibhlokhi #11
12:10 - zonke iinqununu ziqulethe i-1 yezigidi ze-670k zentengiselwano kunye namathokheni
12:17 - i-node yokungenisa ithathe iintengiselwano ze-330k ukusuka echibini kunye neefom block #12
12:32 - ibhloko #12 isayinwe kwaye ithunyelwe kwezinye iindawo zokuqinisekiswa
12:39 - ibhloko #12 iqinisekisiwe kwaye ithunyelwe kwikhonkco lengcambu
13:44 - zonke iindawo ezifunyenweyo zifumene ulwazi kwikhonkco lengcambu ebhlokhi #12 yongezwa kwaye iqalise ukusebenzisa iintengiselwano ze-330k
14:50 - zonke ii-nodes ziqulethe i-2 yezigidi zentengiselwano kunye namathokheni

Uvavanyo 3

Kwiiseva zokuqala nezesibini, enye i-node yokuqinisekisa yatshintshwa yindawo yokungenisa.


Imeko yokuqala: ibhloko yokugqibela #84; 0 iintengiselwano kunye namathokheni agcinwe kwisiseko sedatha

00:00 - Kuphehlelelwe imibhalo emi-3 eyenza kwaye ithumele iintengiselwano eziyi-1 yesigidi ngasinye
01:38 - I-1 yezigidi zentengiselwano zenziwe kwaye zithumela ukuhambisa i-node #3 yaqala
01:50 - ngenisa i-node #3 ithathe iintengiselwano ze-330k ukusuka echibini kunye neefom block #85 (f21). Siyabona kwakhona ukuba iintengiselwano ze-350k zongezwa echibini ngemizuzwana eyi-10
01:53 - I-1 yezigidi zentengiselwano zenziwe kwaye zithumela ukuhambisa i-node #1 yaqala
01:50 - ngenisa i-node #3 ithathe iintengiselwano ze-330k ukusuka echibini kunye neefom block #85 (f21). Siyabona kwakhona ukuba iintengiselwano ze-350k zongezwa echibini ngemizuzwana eyi-10
02:01 - ngenisa i-node #1 ithathe iintengiselwano ezingama-250k ukusuka echibini kunye neefom block #85 (65e)
02:06 - ibhloko #85 (f21) isayinwe kwaye ithunyelwe kwezinye iindawo zokuqinisekiswa
02:08 - iskripthi sedemo se-server #3, esithumele i-1 yezigidi zentengiselwano kwimizuzwana engama-30, igqibile ukusebenza
02:14 β€” ibhloko #85 (f21) iqinisekisiwe kwaye ithunyelwe kwikhonkco lengcambu
02:19 - ibhloko #85 (65e) isayinwe kwaye ithunyelwe kwezinye iindawo zokuqinisekisa
02:22 - I-1 yezigidi zentengiselwano zenziwe kwaye zithumela ukuhambisa i-node #2 yaqala
02:27 - ibhloko #85 (65e) iqinisekisiwe kwaye ithunyelwe kwi-root chain
02:29 - ngenisa i-node #2 ithathe iintengiselwano ze-111855 ukusuka echibini kunye neefom block #85 (256).
02:36 - ibhloko #85 (256) isayinwe kwaye ithunyelwe kwezinye iindawo zokuqinisekisa
02:36 - iskripthi sedemo se-server #1, esithumele i-1 yezigidi zentengiselwano kwimizuzwana engama-42.5, igqibile ukusebenza
02:38 - ibhloko #85 (256) iqinisekisiwe kwaye ithunyelwe kwikhonkco lengcambu
03:08 - iseva #2 iskripthi sigqibile ukusebenza, esithumele i-1 yezigidi zentengiselwano kwimizuzwana engama-47
03:38 - zonke iinqununu zifumene ulwazi kwikhonkco leengcambu ezithintela #85 (f21), #86 (65e), #87 (256) zongezwa kwaye zaqala ukusebenzisa i-330k, 250k, 111855 iintengiselwano.
03:49 - ichibi lacinywa kwi 330k, 250k, 111855 transactions ezongezwa kwiibhloko #85 (f21), #86(65e), #87(256)
03:59 - ngenisa i-node #1 ithathe iintengiselwano ezingama-888145 ukusuka echibini kunye neefom block #88 (214), ngenisa i-node #2 ithathe iintengiselwano ze-750k ukusuka echibini kunye neefom block #88 (50a), ngenisa i-node #3 ithathe iintengiselwano ezingama-670k ukusuka idama kunye neefom block #88 (d3b)
04:44 - ibhloko #88 (d3b) isayinwe kwaye ithunyelwe kwezinye iindawo zokuqinisekiswa
04:58 - ibhloko #88 (214) isayinwe kwaye ithunyelwe kwezinye iindawo zokuqinisekisa
05:11 - ibhloko #88 (50a) isayinwe kwaye ithunyelwe kwezinye iindawo zokuqinisekisa
05:11 β€” ibhloko #85 (d3b) iqinisekisiwe kwaye ithunyelwe kwikhonkco lengcambu
05:36 - ibhloko #85 (214) iqinisekisiwe kwaye ithunyelwe kwikhonkco lengcambu
05:43 - zonke iinqununu zifumene ulwazi kwikhonkco lengcambu elivimba #88 (d3b), #89 (214) zongezwe kwaye ziqala ukusebenzisa i-670k, i-750k yentengiselwano
06:50 - ngenxa yokungaphumeleli konxibelelwano, ibhloko #85 (50a) ayizange iqinisekiswe
06:55 - ngenisa i-node #2 ithathe iintengiselwano ze-888145 ukusuka echibini kunye neefom block #90 (50a)
08:14 - ibhloko #90 (50a) isayinwe kwaye ithunyelwe kwezinye iindawo zokuqinisekisa
09:04 - ibhloko #90 (50a) iqinisekisiwe kwaye ithunyelwe kwikhonkco lengcambu
11:23 - zonke ii-nodes zifumene ulwazi kwi-root chain block #90 (50a) yongezwa, kwaye iqala ukusebenzisa ii-888145 zentengiselwano. Kwangaxeshanye, umncedisi #3 sele esebenzise ukuthengiselana kwiibhloko #88 (d3b), #89(214)
12:11 - onke amadama angenanto
13:41 - zonke iindawo zomncedisi #3 ziqulethe i-3 yezigidi zentengiselwano kunye namathokheni
14:35 - zonke iindawo zomncedisi #1 ziqulethe i-3 yezigidi zentengiselwano kunye namathokheni
19:24 - zonke iindawo zomncedisi #2 ziqulethe i-3 yezigidi zentengiselwano kunye namathokheni

Imiqobo

Ngexesha lophuhliso lwePlasma Cash, siye sadibana nezi ngxaki zilandelayo, esithe sazisombulula ngokuthe ngcembe kwaye sizisombulula:

1. Ungquzulwano ekusebenzisaneni kwemisebenzi eyahlukeneyo yenkqubo. Ngokomzekelo, umsebenzi wokongeza ukuthengiselana kwi-pool uvale umsebenzi wokungenisa kunye nokuqinisekisa iibhloko, kwaye ngokuphambene nalokho, okukhokelela ekunciphiseni isantya.

2. Akuzange kucace ngokukhawuleza ukuba kuthunyelwe njani inani elikhulu leentengiselwano ngelixa kuncitshiswa iindleko zokudlulisa idatha.

3. Akuzange kucace ukuba njani kwaye kuphi ukugcina idatha ukuze kuphunyezwe iziphumo eziphezulu.

4. Akuzange kucace indlela yokuququzelela inethiwekhi phakathi kwee-nodes, ekubeni ubukhulu bebhloko kunye ne-1 million transactions kuthatha malunga ne-100 MB.

5. Ukusebenza kwimo yomsonto omnye kwaphula umdibaniso phakathi kweenodi xa kubalwa ixesha elide (umzekelo, ukwakha umthi weMerkle nokubala ihashi yawo).

Sahlangabezana njani nayo yonke le nto?

Inguqulo yokuqala ye-Plasma Cash node yayiluhlobo lokudibanisa olunokwenza yonke into ngexesha elifanayo: yamkela ukuthengiselana, ungenise kwaye uqinisekise iibhloko, kwaye unikeze i-API yokufikelela kwidatha. Kuba i-NodeJS inomsonto omnye ngokwemveli, umsebenzi wokubala womthi we-Merkle uthintele umsebenzi wokongezwa. Sibone iindlela ezimbini zokusombulula le ngxaki:

1. Qalisa iinkqubo ezininzi ze-NodeJS, nganye eyenza imisebenzi ethile.

2. Sebenzisa worker_threads kwaye uhambise ukuphunyezwa kwenxalenye yekhowudi kwimisonto.

Ngenxa yoko, sasebenzisa zombini iinketho ngexesha elinye: ngokusengqiqweni sahlulahlula i-node enye ibe ngamacandelo ama-3 anokusebenza ngokwahlukeneyo, kodwa ngaxeshanye

1. I-node yokungeniswa, eyamkela ukuthengiselana kwi-pool kwaye idala iibhloko.

2. Indawo yokuqinisekisa ejonga ubunyani beendawo.

3. I-API node - inikeza i-API yokufikelela kwidatha.

Kulo mzekelo, ungaqhagamshela kwindawo nganye ngokusebenzisa i socket unix usebenzisa cli.

Sahambisa imisebenzi enzima, enje ngokubala umthi weMerkle, kumsonto owahlukileyo.

Ke, sifezekise ukusebenza okuqhelekileyo kwayo yonke imisebenzi yePlasma Cash ngaxeshanye kwaye ngaphandle kokusilela.

Emva kokuba inkqubo isebenze, saqala ukuvavanya isantya kwaye, ngelishwa, safumana iziphumo ezingonelisekanga: ukuthengiselana kwe-5 ngesibini kunye nokuya kwi-000 yokuthengiselana ngebhloko nganye. Kwafuneka ndifumanise ukuba yintoni eyaphunyezwa gwenxa.

Ukuqala, siqale ukuvavanya indlela yonxibelelwano kunye nePlasma Cash ukufumana amandla aphezulu enkqubo. Sibhale ngaphambili ukuba iPlasma Cash node ibonelela nge-unix socket interface. Ekuqaleni yayisekwe kwisicatshulwa. izinto ze-json zithunyelwe kusetyenziswa `JSON.parse()` kunye `JSON.stringify()`.

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

Silinganise isantya sokudluliselwa kwezinto ezinjalo kwaye safumana ~ 130k ngesekhondi. Sizamile ukutshintsha imisebenzi eqhelekileyo yokusebenza nejson, kodwa ukusebenza akuzange kuphucuke. I-injini ye-V8 kufuneka ilungiselelwe kakuhle le misebenzi.

Sasebenza ngeentengiselwano, iithokheni, kunye neebhloko kwiiklasi. Xa udala iiklasi ezinjalo, ukusebenza kwehla ngamaxesha angama-2, okubonisa ukuba i-OOP ayifanelekanga kuthi. Kwafuneka ndiphinde ndibhale yonke into ngendlela esebenzayo.

Ukurekhoda kwisiseko sedatha

Ekuqaleni, i-Redis yakhethwa ukugcinwa kwedatha njengenye yezisombululo ezivelisa kakhulu eziyanelisayo iimfuno zethu: ukugcinwa kwexabiso elingundoqo, ukusebenza ngeetafile ze-hash, iisethi. Siphehlelele iredis-benchmark kwaye safumana ~ 80k imisebenzi ngesekhondi kwimowudi yombhobho o-1.

Ukusebenza okuphezulu, silungelelanise iRedis ngokucokisekileyo ngakumbi:

  • Uqhagamshelo lwesokethi ye-unix lusekiwe.
  • Sikhubaze ukugcina imo kwidiski (ngokuthembeka, unokuseta i-replica kwaye uyigcine kwidiski kwiRedis eyahlukileyo).

Kwi-Redis, i-pool yitafile ye-hash kuba kufuneka sikwazi ukubuyisela zonke iintengiselwano kumbuzo omnye kunye nokucima ukuthengiselana nganye nganye. Sizamile ukusebenzisa uluhlu oluqhelekileyo, kodwa luyacotha xa usothula lonke uluhlu.

Xa usebenzisa i-NodeJS eqhelekileyo, iilayibrari zeRedis ziphumelele ukusebenza kwe-18k yentengiselwano ngomzuzwana. Isantya sehla ngamaxesha angama-9.

Kuba ibhentshi isibonisile ukuba amathuba aphindwe ka-5, saqala ukwenza ngcono. Sitshintshe ithala leencwadi kwi-ioredis kwaye safumana ukusebenza kwe-25k ngesekhondi. Songeze iitransekshini nganye nganye kusetyenziswa `hset` umyalelo. Ke besisenza imibuzo emininzi eRedis. Kwavela uluvo lokudibanisa utshintshiselwano kwiibhetshi kwaye uzithumele ngomyalelo omnye `hmset`. Isiphumo yi 32k ngesekhondi.

Ngezizathu ezininzi, esiya kuzichaza ngezantsi, sisebenza ngedatha sisebenzisa `Buffer` kwaye, njengoko kuvela, ukuba uyiguqulela kumbhalo (`buffer.toString('hex')`) phambi kokubhala, ungafumana ukongeza. ukusebenza. Ngaloo ndlela, isantya sanyuswa ukuya kwi-35k ngesekhondi. Okwangoku, sigqibe kwelokuba sirhoxise ukwenziwa ngcono.

Kuye kwafuneka sitshintshele kwiprothokholi yokubini kuba:

1. Isixokelelwano sihlala sibala ii-hashes, imisayino, njalo njalo, kwaye kule nto ifuna idatha kwi `Buffer.

2. Xa ithunyelwe phakathi kweenkonzo, idata yokubini inobunzima obungaphantsi kombhalo. Ngokomzekelo, xa uthumela ibhloko kunye ne-1 yezigidi zeentengiselwano, idatha kwisicatshulwa inokuthatha ngaphezu kwe-300 megabytes.

3. Ukutshintsha rhoqo idatha kuchaphazela ukusebenza.

Ke ngoko, sithathe njengesiseko eyethu iprothokholi yokubini yokugcina nokuhambisa idatha, ephuhliswe ngokwesiseko sethala leencwadi elimangalisayo `ledatha yokubini'.

Ngenxa yoko, sifumene olu lwazi lulandelayo lwezakhiwo:

β€”Intengiselwano

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

β€” Umqondiso

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

β€”Ibhlokhi

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

Ngemiyalelo yesiqhelo `BD.encode(block, Protocol).isilayi ();` kunye `BD.decode(buffer, Protocol)` siguqulela idatha ibe `Buffer` ukuze igcinwe kwiRedis okanye igqithiselwe kwenye indawo kwaye ifumane kwakhona data emva.

Sikwanayo neeprothokholi ezi-2 zokudlulisa idatha phakathi kweenkonzo:

-Iprothokholi yokunxibelelana nePlasma Node nge-unix socket

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

apho:

  • `uhlobo` - isenzo esiza kwenziwa, umzekelo, 1 - sendTransaction, 2 - getTransaction;
  • `umthwalo wokuhlawula` - idatha ekufuneka idluliselwe kumsebenzi ofanelekileyo;
  • `Id yomyalezo` β€” id yomyalezo ukuze impendulo ibonwe.

- Umgaqo wonxibelelwano phakathi kweendawo zokuhlala

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

apho:

  • `ikhowudi` - ikhowudi yomyalezo, umzekelo 6 - PREPARE_NEW_BLOCK, 7 - BLOCK_VALID, 8 - BLOCK_COMMIT;
  • `uversionProtocol` - iprotocol version, ekubeni iindawo ezineenguqulelo ezahlukeneyo zinokuphakanyiswa kwinethiwekhi kwaye zinokusebenza ngokwahlukileyo;
  • `seq` - isichongi somyalezo;
  • `countChunk` ΠΈ `Inombolo yechunk` iyimfuneko yokwahlula imiyalezo emikhulu;
  • `ubude` ΠΈ `umthwalo wokuhlawula` ubude kunye nedatha ngokwayo.

Ekubeni sichwetheze kwangaphambili idatha, inkqubo yokugqibela ikhawuleza kakhulu kunethala leencwadi lika-Ethereum `rlp`. Ngelishwa, asikakwazi ukuyinqaba, kuba kuyimfuneko ukugqiba isivumelwano esihlakaniphile, esiceba ukuyenza kwixesha elizayo.

Ukuba sikwazile ukufikelela kwisantya 35 000 iintengiselwano ngesekhondi nganye, kufuneka siziqhube ngexesha elilelona lifanelekileyo. Ekubeni ixesha eliqikelelweyo lokubunjwa kwebhloko lithatha imizuzwana engama-30, kufuneka sibandakanye kwibhloko 1 000 000 transactions, nto leyo ethetha ukuthumela ngaphezulu 100 MB yedatha.

Ekuqaleni, sasebenzisa ithala leencwadi elithi `ethereumjs-devp2p` ukunxibelelana phakathi kweenodi, kodwa ayikwazanga ukuphatha idatha eninzi. Ngenxa yoko, sisebenzise ithala leencwadi `ws` kwaye siqwalasele ukuthumela idata yokubini nge-websocket. Ewe kunjalo, siphinde sadibana neengxaki xa sithumela iipakethe ezinkulu zedatha, kodwa sahlulahlula ngokwee-chunks kwaye ngoku ezi ngxaki ziphelile.

Kwakhona ukwenza umthi we-Merkle kunye nokubala i-hash 1 000 000 iintengiselwano zifuna malunga 10 imizuzwana yokubala okuqhubekayo. Ngeli xesha, uxhulumaniso kunye nazo zonke ii-nodes zilawula ukuphuka. Kwagqitywa ekubeni kuhanjiswe esi sibalo kumsonto owahlukileyo.

Izigqibo:

Enyanisweni, iziphumo zethu azintsha, kodwa ngenxa yesizathu esithile iingcali ezininzi ziyalibala ngazo xa ziphuhlisa.

  • Ukusebenzisa i-Functional Programming endaweni ye-Object-Oriented Programming kuphucula imveliso.
  • I-monolith imbi ngakumbi kunokwakhiwa kwenkonzo yenkqubo yeNodeJS enemveliso.
  • Ukusebenzisa `imisonto_yabasebenzi` xa ubalo olunzima kuphucula ukuphendula kwesixokelelwano, ngakumbi xa ujongene nemisebenzi ye-i/o.
  • i-unix isokethi izinzile kwaye ikhawuleza ngakumbi kunezicelo ze-http.
  • Ukuba ufuna ukudlulisa ngokukhawuleza idatha enkulu kwinethiwekhi, kungcono ukusebenzisa i-websockets kwaye uthumele i-binary data, ihlulwe ibe yi-chunks, enokuthi idluliselwe ukuba ayifiki, kwaye idibaniswe ibe ngumyalezo omnye.

Siyakumema ukuba undwendwele GitHub Iprojekthi: https://github.com/opporty-com/Plasma-Cash/tree/new-version

Eli nqaku libhalwe ngu Alexander Nashivan, umphuhlisi ophezulu I-Clever Solution Inc.

umthombo: www.habr.com

Yongeza izimvo