Ukuhlolwa Komphakathi: Isixazululo Sobumfihlo Nokuqina ku-Ethereum

I-Bloccain ubuchwepheshe obusha obuthembisa ukuthuthukisa izindawo eziningi zokuphila komuntu. Idlulisela izinqubo zangempela nemikhiqizo endaweni yedijithali, iqinisekisa isivinini nokuthembeka kokuthengiselana kwezezimali, inciphisa izindleko zayo, futhi ikuvumela ukuthi udale izinhlelo zokusebenza zesimanje ze-DAPP usebenzisa izinkontileka ezihlakaniphile kumanethiwekhi ahlukaniswe.

Njengoba kunikezwe izinzuzo eziningi kanye nezinhlelo zokusebenza ezihlukahlukene ze-blockchain, kungase kubonakale kumangalisa ukuthi lobu buchwepheshe obuthembisayo abukangeni kuzo zonke izimboni. Inkinga ukuthi ama-blockchains esimanje angenawo amandla okulinganisa. I-Ethereum icubungula mayelana nokuthengiselana kwe-20 ngomzuzwana, okunganele ukuhlangabezana nezidingo zamabhizinisi anamandla anamuhla. Ngesikhathi esifanayo, izinkampani ezisebenzisa ubuchwepheshe be-blockchain ziyangabaza ukushiya i-Ethereum ngenxa yezinga eliphezulu lokuvikela ekugebheni nasekuhlulekeni kwenethiwekhi.

Ukuqinisekisa ukuhlukaniswa, ukuphepha kanye nokwehla ku-blockchain, ngaleyo ndlela kuxazululwe i-Scalability Trilemma, ithimba lokuthuthukisa. Ithuba idale i-Plasma Cash, iketanga elisizayo elihlanganisa inkontileka ehlakaniphile kanye nenethiwekhi yangasese esekelwe ku-Node.js, edlulisela isimo sayo ku-root chain (Ethereum).

Ukuhlolwa Komphakathi: Isixazululo Sobumfihlo Nokuqina ku-Ethereum

Izinqubo ezibalulekile ku-Plasma Cash

1. Umsebenzisi ubiza umsebenzi wenkontileka ehlakaniphile ngokuthi `idiphozithi`, edlulisela kuyo inani le-ETH afuna ukulifaka kuthokheni ye-Plasma Cash. Umsebenzi wenkontileka ohlakaniphile udala ithokheni futhi ukhiqize umcimbi mayelana nawo.

2. Ama-Plasma Cash nodes abhalisele imicimbi yenkontileka ehlakaniphile athola umcimbi mayelana nokudala idiphozi futhi engeza umsebenzi mayelana nokudala ithokheni echibini.

3. Ngezikhathi ezithile, ama-Plasma Cash node akhethekile athatha konke ukuthengiselana echibini (kufika esigidini esi-1) enze ibhulokhi kuwo, abale isihlahla se-Merkle futhi, ngokufanelekile, i-hashi. Leli bhulokhi lithunyelwa kwamanye ama-node ukuze liqinisekiswe. Amanodi ahlola ukuthi ihashi le-Merkle livumelekile yini nokuthi ukuthengiselana kuvumelekile yini (isibonelo, ukuthi umthumeli wethokheni ungumnikazi walo yini). Ngemva kokuqinisekisa ibhulokhi, i-node ibiza umsebenzi othi `submitBlock` wenkontileka ehlakaniphile, ogcina inombolo yebhulokhi kanye ne-Merkle hash ochungechungeni. Inkontileka ehlakaniphile ikhiqiza umcimbi okhombisa ukungezwa okuyimpumelelo kwebhulokhi. Okwenziwayo kuyasuswa echibini.

4. Amanodi athola umcimbi wokuhanjiswa kwebhulokhi aqala ukusebenzisa ukuthengiselana okwengezwe kubhulokhi.

5. Ngesinye isikhathi, umnikazi (noma ongeyena umnikazi) wethokheni ufuna ukuyihoxisa ku-Plasma Cash. Ukwenza lokhu, ubiza umsebenzi othi `startExit`, edlulisela kuwo ulwazi mayelana nokuthengiselana kokugcina okungu-2 kuthokheni, okuqinisekisa ukuthi ungumnikazi wethokheni. Inkontileka ehlakaniphile, esebenzisa i-hash ye-Merkle, ihlola ukutholakala kokuthengiselana emabhuloki futhi ithumele ithokheni yokuhoxiswa, okuzokwenzeka emavikini amabili.

6. Uma ukusebenza kokuhoxiswa kwethokheni kwenzeka ngokuphulwa (ithokheni isetshenziswe ngemuva kokuba inqubo yokuhoxiswa iqale noma ithokheni isivele ingomunye umuntu ngaphambi kokuhoxiswa), umnikazi wethokheni angaphika ukuhoxiswa kungakapheli amasonto amabili.

Ukuhlolwa Komphakathi: Isixazululo Sobumfihlo Nokuqina ku-Ethereum

Ubumfihlo bufezwa ngezindlela ezimbili

1. I-root chain ayazi lutho mayelana nokuthengiselana okukhiqizwa futhi okudluliselwa ngaphakathi kweketango lezingane. Ulwazi mayelana nokuthi ubani ofake futhi wahoxisa i-ETH ku-Plasma Cash luhlala lusesidlangalaleni.

2. Iketango lezingane livumela ukuthengiselana okungaziwa kusetshenziswa i-zk-SNARKs.

Isitaki sobuchwepheshe

  • I-NodeJS
  • Redis
  • I-Etherium
  • Sild

Ukuhlola

Ngenkathi sithuthukisa i-Plasma Cash, sihlole isivinini sohlelo futhi sathola imiphumela elandelayo:

  • kufika ku-35 ukuthengiselana ngomzuzwana kwengezwa echibini;
  • kufika ku-1 ukuthengiselana kungagcinwa kubhlokhi.

Ukuhlolwa kwenziwa kumaseva angu-3 alandelayo:

1. Intel Core i7-6700 Quad-Core Skylake incl. I-NVMe SSD – 512 GB, 64 GB DDR4 RAM
3 ama-Plasma Cash node aqinisekisiwe aphakanyisiwe.

2. AMD Ryzen 7 1700X Octa-Core “Summit Ridge” (Zen), SATA SSD – 500 GB, 64 GB DDR4 RAM
I-Ropsten testnet ETH node iphakanyisiwe.
3 ama-Plasma Cash node aqinisekisiwe aphakanyisiwe.

3. Intel Core i9-9900K Octa-Core incl. I-NVMe SSD – 1 TB, 64 GB DDR4 RAM
1 Indawo yokuthunyelwa kwe-Plasma Cash yaphakanyiswa.
3 ama-Plasma Cash node aqinisekisiwe aphakanyisiwe.
Kwaqalwa ukuhlolwa kokwengeza ukuthenga kunethiwekhi ye-Plasma Cash.

Inani: 10 Plasma Cash nodes kunethiwekhi yangasese.

Isivivinyo 1

Kunomkhawulo wokuthengiselana kwesigidi esingu-1 ibhulokhi ngayinye. Ngakho-ke, ukuthengiswa kwesigidi esingu-1 kuwela kumabhulokhi angu-2 (njengoba isistimu ikwazi ukuthatha ingxenye yemisebenzi futhi ithumele ngenkathi ithunyelwa).


Isimo sokuqala: ibhulokhi yokugcina #7; 1 million okwenziwayo namathokheni agcinwe kusizindalwazi.

00:00 - ukuqala kombhalo wokukhiqiza ukuthengiselana
01:37 - 1 million okwenziwayo kwadalwa futhi ukuthunyelwa ku-node kwaqala
01:46 - i-node yokuthumela ithathe ukuthengiswa okungu-240k kusuka echibini kanye namafomu ebhulokhi #8. Siphinde sibone ukuthi okwenziwayo okungu-320k kwengezwa echibini ngemizuzwana eyi-10
01:58 — ibhulokhi #8 isayiniwe futhi ithunyelwe ukuze iqinisekiswe
02:03 — ibhulokhi #8 liqinisekisiwe futhi umsebenzi `we-submitBlock` wenkontileka ehlakaniphile ubizwa nge-hashi ye-Merkle kanye nenombolo yebhulokhi.
02:10 - iskripthi sedemo siqedile ukusebenza, esithumele ukuthengiselana okuyisigidi ngemizuzwana engama-1
02:33 - ama-node aqala ukuthola ulwazi lokuthi i-block #8 yengezwe kuchungechunge lwezimpande, futhi yaqala ukwenza ukuthengiselana okungu-240k.
02:40 - 240k okwenziwayo kususiwe echibini, osekuvele kubhulokhi #8
02:56 - i-node yokuthumela yathatha ukuthengiswa okungu-760k okusele echibini futhi yaqala ukubala i-hashi ye-Merkle kanye nebhulokhi yokusayina #9
03:20 - wonke ama-node aqukethe 1 million 240k ukuthengiselana namathokheni
03:35 — ibhulokhi #9 isayiniwe futhi ithunyelwe ukuze iqinisekiswe kwamanye ama-node
03:41 - kwenzeke iphutha lenethiwekhi
04:40 — ukulinda ukuqinisekiswa kwebhulokhi #9 kuphelelwe yisikhathi
04:54 - i-node yokuthumela yathatha ukuthengiswa okungu-760k okusele echibini futhi yaqala ukubala i-hashi ye-Merkle kanye nebhulokhi yokusayina #9
05:32 — ibhulokhi #9 isayiniwe futhi ithunyelwe ukuze iqinisekiswe kwamanye ama-node
05:53 - ibhulokhi #9 iqinisekisiwe futhi ithunyelwe kuchungechunge lwezimpande
06:17 - ama-node aqala ukuthola ulwazi lokuthi i-block #9 yengezwe kuchungechunge lwezimpande futhi yaqala ukwenza ukuthengiselana okungu-760k
06:47 — i-pool isuse ukuthengiselana okukubhlokhi #9
09:06 - wonke ama-node aqukethe ukuthengiselana okuyizigidi ezingu-2 namathokheni

Isivivinyo 2

Kunomkhawulo ongu-350k ibhulokhi ngayinye. Ngenxa yalokho, sinamabhulokhi angu-3.


Isimo sokuqala: ibhulokhi yokugcina #9; 2 million okwenziwayo namathokheni agcinwe kusizindalwazi

00:00 - Iskripthi sokukhiqiza ukuthengiselana sesivele sethuliwe
00:44 - 1 million okwenziwayo kwadalwa futhi ukuthunyelwa ku-node kwaqala
00:56 - i-node yokuthumela ithathe ukuthengiswa okungu-320k kusuka echibini kanye namafomu ebhulokhi #10. Siphinde sibone ukuthi okwenziwayo okungu-320k kwengezwa echibini ngemizuzwana eyi-10
01:12 — ibhulokhi engu-#10 isayiniwe futhi ithunyelwe kwamanye ama-node ukuze iqinisekiswe
01:18 - iskripthi sedemo siqedile ukusebenza, esithumele ukuthengiselana okuyisigidi ngemizuzwana engama-1
01:20 - ibhulokhi #10 iqinisekisiwe futhi ithunyelwe kuchungechunge lwezimpande
01:51 - wonke ama-node athole ulwazi oluvela kuchungechunge lwezimpande oluthi ibhulokhi engu-#10 yanezelwa futhi yaqala ukusebenzisa ukuthengiselana okungu-320k
02:01 - ichibi lisuliwe ku-320k ukuthenga okungezwe ku-block #10
02:15 - i-node yokuthumela ithathe ama-350k transactions ukusuka echibini kanye namafomu block #11
02:34 — ibhulokhi #11 isayiniwe futhi ithunyelwe kwamanye ama-node ukuze iqinisekiswe
02:51 - ibhulokhi #11 iqinisekisiwe futhi ithunyelwe kuchungechunge lwezimpande
02:55 - indawo yokugcina iqedele ukuthengiselana kusuka kubhlokhi #10
10:59 - ukuthengiselana ngokuthunyelwa kwebhulokhi #9 kuthathe isikhathi eside kakhulu kuchungechunge lwezimpande, kepha kwaqedwa futhi wonke ama-node athola imininingwane ngakho futhi aqala ukwenza ukuthengiselana okungu-350k.
11:05 - ichibi lisuliwe ku-320k ukuthenga okungezwe ku-block #11
12:10 - wonke ama-node aqukethe 1 million 670k ukuthengiselana namathokheni
12:17 - i-node yokuthumela ithathe ama-330k transactions ukusuka echibini kanye nebhulokhi yamafomu #12
12:32 — ibhulokhi #12 isayiniwe futhi ithunyelwe kwamanye ama-node ukuze iqinisekiswe
12:39 - ibhulokhi #12 iqinisekisiwe futhi ithunyelwe kuchungechunge lwezimpande
13:44 - wonke ama-node athole ulwazi oluvela kuchungechunge lwezimpande oluthi ibhulokhi #12 yanezelwa futhi yaqala ukusebenzisa ukuthengiswa okungu-330k
14:50 - wonke ama-node aqukethe ukuthengiselana okuyizigidi ezingu-2 namathokheni

Isivivinyo 3

Kuseva yokuqala neyesibili, inodi eyodwa yokuqinisekisa yathathelwa indawo inodi yokuthumela.


Isimo sokuqala: ibhulokhi yokugcina #84; 0 okwenziwayo namathokheni alondolozwe kusizindalwazi

00:00 - Kwethulwe imibhalo emi-3 ekhiqiza futhi ethumela ukuthengiselana okuyisigidi ngasinye
01:38 — 1 million okwenziwayo kwadalwa futhi kwathunyelwa ukuthumela inodi #3 yaqala
01:50 — hambisa inodi #3 uthathe 330k ukuthengiselana kusuka pool futhi amafomu block #85 (f21). Siphinde sibone ukuthi okwenziwayo okungu-350k kwengezwa echibini ngemizuzwana eyi-10
01:53 — 1 million okwenziwayo kwadalwa futhi kwathunyelwa ukuthumela inodi #1 yaqala
01:50 — hambisa inodi #3 uthathe 330k ukuthengiselana kusuka pool futhi amafomu block #85 (f21). Siphinde sibone ukuthi okwenziwayo okungu-350k kwengezwa echibini ngemizuzwana eyi-10
02:01 — hambisa inodi #1 uthathe 250k ukuthengiselana kusuka pool futhi amafomu block #85 (65e)
02:06 — ibhulokhi #85 (f21) isayiniwe futhi ithunyelwe kwamanye ama-node ukuze iqinisekiswe
02:08 - iskripthi sedemo seseva #3, esithumele ukuthengiswa kwesigidi esingu-1 ngemizuzwana engama-30, siqedile ukusebenza
02:14 - ibhulokhi #85 (f21) iqinisekisiwe futhi ithunyelwe kuchungechunge lwezimpande
02:19 — block #85 (65e) isayiniwe futhi ithunyelwe kwamanye ama-node ukuze iqinisekiswe
02:22 — 1 million okwenziwayo kwadalwa futhi kwathunyelwa ukuthumela inodi #2 yaqala
02:27 - ibhulokhi #85 (65e) iqinisekisiwe futhi yathunyelwa kuchungechunge lwezimpande
02:29 - thumela inodi #2 ithathe 111855 ukuthengiselana kusuka echibini futhi amafomu block #85 (256).
02:36 — block #85 (256) isayiniwe futhi ithunyelwe kwamanye ama-node ukuze iqinisekiswe
02:36 - iskripthi sedemo seseva #1, esithumele ukuthengiswa kwesigidi esingu-1 ngemizuzwana engama-42.5, siqedile ukusebenza
02:38 - ibhulokhi #85 (256) iqinisekisiwe futhi ithunyelwe kuchungechunge lwezimpande
03:08 - iseva #2 iskripthi siqedile ukusebenza, esithumele ukuthengiswa kwesigidi ngemizuzwana engama-1
03:38 - wonke ama-node athole ulwazi kusuka kuchungechunge lwempande oluvimba #85 (f21), #86(65e), #87(256) angeziwe futhi aqala ukusebenzisa 330k, 250k, 111855 okwenziwayo
03:49 - ichibi lisuliwe ku-330k, 250k, 111855 imisebenzi eyengezwe kumabhulokhi #85 (f21), #86(65e), #87(256)
03:59 - thumela inodi #1 ithathe 888145 transactions kusukela pool futhi amafomu block #88 (214), hambisa inodi #2 uthathe 750k transactions kusukela pool futhi amafomu block #88 (50a), hambisa inodi #3 uthathe 670k ukuthengiselana kusukela ichibi kanye namafomu block #88 (d3b)
04:44 — ibhulokhi #88 (d3b) isayiniwe futhi ithunyelwe kwamanye ama-node ukuze iqinisekiswe
04:58 — block #88 (214) isayiniwe futhi ithunyelwe kwamanye ama-node ukuze iqinisekiswe
05:11 — block #88 (50a) isayiniwe futhi ithunyelwe kwamanye ama-node ukuze iqinisekiswe
05:11 - ibhulokhi #85 (d3b) iqinisekisiwe futhi ithunyelwe kuchungechunge lwezimpande
05:36 - ibhulokhi #85 (214) iqinisekisiwe futhi ithunyelwe kuchungechunge lwezimpande
05:43 - wonke ama-node athole ulwazi oluvela kuchungechunge lwempande oluvimba #88 (d3b), #89(214) lwengeziwe futhi seluqala ukusebenzisa u-670k, 750k ukuthenga
06:50 - ngenxa yokwehluleka kokuxhumana, ibhulokhi #85 (50a) ayizange iqinisekiswe
06:55 - hambisa inodi #2 uthathe 888145 transactions kusukela pool futhi amafomu block #90 (50a)
08:14 — block #90 (50a) isayiniwe futhi ithunyelwe kwamanye ama-node ukuze iqinisekiswe
09:04 - ibhulokhi #90 (50a) iqinisekisiwe futhi ithunyelwe kuchungechunge lwezimpande
11:23 - wonke ama-node athole ulwazi oluvela kuchungechunge lwezimpande oluthi ibhulokhi engu-#90 (50a) yengezwe, futhi iqala ukusebenzisa imisebenzi engu-888145. Ngesikhathi esifanayo, iseva #3 isivele ikusebenzisile ukuthengiselana kusuka kumabhulokhi #88 (d3b), #89(214)
12:11 - wonke amachibi awanalutho
13:41 - wonke ama-node weseva #3 aqukethe ukuthengiselana okuyizigidi ezi-3 namathokheni
14:35 - wonke ama-node weseva #1 aqukethe ukuthengiselana okuyizigidi ezi-3 namathokheni
19:24 - wonke ama-node weseva #2 aqukethe ukuthengiselana okuyizigidi ezi-3 namathokheni

Izithiyo

Ngesikhathi sokuthuthukiswa kwe-Plasma Cash, sihlangabezane nezinkinga ezilandelayo, esizixazulule kancane kancane futhi sizixazulula:

1. Ukungqubuzana ekusebenzisaneni kwemisebenzi ehlukahlukene yesistimu. Isibonelo, umsebenzi wokwengeza ukuthengiselana echibini uvimbe umsebenzi wokuhambisa nokuqinisekisa amabhlogo, futhi okuphambene nalokho, okuholele ekwehleni kwejubane.

2. Akuzange kucace ngokushesha ukuthi ukuthumela inani elikhulu lemisebenzi ngenkathi kunciphisa izindleko zokudluliswa kwedatha.

3. Bekungacaci ukuthi izogcinwa kanjani futhi kuphi idatha ukuze kuzuzwe imiphumela ephezulu.

4. Kwakungacaci ukuthi ungayihlela kanjani inethiwekhi phakathi kwama-node, ngoba ubukhulu be-block ene-1 million transactions kuthatha cishe i-100 MB.

5. Ukusebenza ngemodi yochungechunge olulodwa kwephula ukuxhumana phakathi kwamanodi lapho kubalwa okude (isibonelo, ukwakha isihlahla se-Merkle nokubala i-hashi yaso).

Sabhekana kanjani nakho konke lokhu?

Inguqulo yokuqala ye-Plasma Cash node yayiwuhlobo lokuhlanganisa olungenza yonke into ngesikhathi esifanayo: yamukela ukuthengiselana, uhambise futhi uqinisekise amabhlogo, futhi unikeze i-API yokufinyelela idatha. Njengoba i-NodeJS iwuchungechunge olulodwa ngokomdabu, umsebenzi wokubala wesihlahla se-Merkle esindayo uvimbe umsebenzi we-add transaction. Sibone izinketho ezimbili zokuxazulula le nkinga:

1. Yethula izinqubo ezimbalwa ze-NodeJS, ngayinye eyenza imisebenzi ethile.

2. Sebenzisa ama-worker_threads bese uhambisa ukusetshenziswa kwengxenye yekhodi emicu.

Ngenxa yalokho, sasebenzisa kokubili okukhethwa kukho ngesikhathi esifanayo: ngokunengqondo sahlukanisa i-node eyodwa zibe izingxenye ezi-3 ezingasebenza ngokuhlukana, kodwa ngesikhathi esifanayo ngokuvumelana.

1. I-Node yokuthumela, eyamukela ukuthengiselana ku-pool futhi idale amabhulokhi.

2. I-node yokuqinisekisa ehlola ukufaneleka kwamanodi.

3. I-API node - inikeza i-API yokufinyelela idatha.

Kulokhu, ungakwazi ukuxhuma endaweni ngayinye usebenzisa isokhethi unix usebenzisa cli.

Sahambisa imisebenzi esindayo, njengokubala isihlahla se-Merkle, sayenza umucu ohlukile.

Ngakho-ke, sizuze ukusebenza okuvamile kwayo yonke imisebenzi ye-Plasma Cash kanyekanye futhi ngaphandle kokwehluleka.

Lapho uhlelo selusebenza, saqala ukuhlola isivinini futhi, ngeshwa, sathola imiphumela engagculisi: ukuthengiselana kwe-5 ngomzuzwana futhi kuze kufike ku-000 ukuthengiselana ngebhulokhi ngayinye. Kwadingeka ngithole ukuthi yini esetshenziswe ngokungalungile.

Okokuqala, siqale ukuhlola indlela yokuxhumana nePlasma Cash ukuthola amandla aphezulu ohlelo. Sibhale phambilini ukuthi i-Plasma Cash node inikeza isikhombimsebenzisi sesokhethi se-unix. Ekuqaleni yayisekelwe emibhalweni. izinto ze-json zithunyelwe kusetshenziswa `JSON.parse()` kanye nokuthi `JSON.stringify()`.

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

Silinganise ijubane lokudlulisa lezinto ezinjalo futhi sathola ~ 130k ngomzuzwana. Sizamile ukushintsha imisebenzi ejwayelekile yokusebenza ne-json, kodwa ukusebenza akuzange kuthuthuke. Injini ye-V8 kumele ilungiselelwe kahle le misebenzi.

Sasebenza ngokuthengiselana, amathokheni, namabhulokhi ngamakilasi. Lapho udala amakilasi anjalo, ukusebenza kwehle izikhathi ezi-2, okubonisa ukuthi i-OOP ayifanele thina. Kwadingeka ngibhale kabusha yonke into ngendlela esebenza kahle.

Ukurekhoda kusizindalwazi

Ekuqaleni, i-Redis yakhethelwa ukugcinwa kwedatha njengesinye sezixazululo ezikhiqiza kakhulu ezenelisa izidingo zethu: isitoreji senani elingukhiye, ukusebenza ngamatafula e-hashi, amasethi. Sethule i-redis-benchmark futhi sathola ukusebenza okungu-~80k ngomzuzwana ngemodi yokufaka amapayipi engu-1.

Ngokusebenza okuphezulu, sishune i-Redis kahle kakhulu:

  • Uxhumo lwesokhethi le-unix selusunguliwe.
  • Sikhubaze ukulondoloza isimo kudiski (ngokwethenjelwa, ungasetha i-replica futhi uyigcine kudiski ku-Redis ehlukile).

E-Redis, i-pool iyithebula le-hash ngoba sidinga ukwazi ukubuyisa yonke imisebenzi embuzweni owodwa futhi sisuse okwenziwayo ngamunye ngamunye. Sizamile ukusebenzisa uhlu olujwayelekile, kodwa luhamba kancane uma sikhipha lonke uhlu.

Lapho usebenzisa i-NodeJS evamile, imitapo yolwazi ye-Redis izuze ukusebenza kwe-18k yemisebenzi ngomzuzwana. Ijubane lehle izikhathi eziyisi-9.

Njengoba ibhentshimakhi isikhombisile ukuthi amathuba abemakhulu ngokuphindwe ka-5, saqala ukwenza ngokugcwele. Sishintshe ilabhulali yaba yi-ioredis futhi sathola ukusebenza okungu-25k ngomzuzwana. Sengeze okwenziwayo ngamunye ngamunye sisebenzisa umyalo othi `hset`. Ngakho-ke besidala imibuzo eminingi e-Redis. Kwavela umqondo wokuhlanganisa okwenziwayo kube amaqoqo futhi uwathumele ngomyalo owodwa `hmset`. Umphumela uba ngu-32k ngesekhondi.

Ngenxa yezizathu ezimbalwa, esizozichaza ngezansi, sisebenza nedatha sisebenzisa `Buffer` futhi, njengoba kuvela, uma uyiguqulela kumbhalo (`buffer.toString('hex')`) ngaphambi kokubhala, ungathola okwengeziwe. ukusebenza. Ngakho-ke, isivinini senyuke safinyelela ku-35k ngomzuzwana. Okwamanje, sinqume ukumisa ukuqhubeka nokwenza kahle.

Bekumele sishintshele kumthetho olandelwayo onambambili ngoba:

1. Isistimu ivamise ukubala ama-hashi, amasiginesha, njll., futhi kulokhu idinga idatha kokuthi `Ibhafa.

2. Uma ithunyelwa phakathi kwamasevisi, idatha kanambambili inesisindo esingaphansi kombhalo. Isibonelo, uma uthumela ibhulokhi enokwenziwe okuyisigidi esingu-1, idatha embhalweni ingathatha ngaphezu kwamamegabhayithi angu-300.

3. Ukushintsha njalo idatha kuthinta ukusebenza.

Ngakho-ke, sithathe njengesisekelo iphrothokholi yethu kanambambili yokugcina nokudlulisa idatha, ethuthukiswe ngesisekelo somtapo ``idatha kanambambili` emangalisayo.

Ngenxa yalokho, sithole izakhiwo zedatha ezilandelayo:

- Ukuthengiselana

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

- Uphawu

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

—Vimba

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

Ngemiyalo evamile `BD.encode(block, Protocol).slice();` kanye `BD.decode(buffer, Protocol)` siguqula idatha ibe `Buffer` ukuze igcinwe ku-Redis noma idluliselwe kwenye i-node futhi sithole idatha emuva.

Siphinde sibe nama-protocol angu-2 kanambambili okudlulisa idatha phakathi kwamasevisi:

- Iphrothokholi yokuxhumana nePlasma Node ngesokhethi ye-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)
  }
  ```

lapho:

  • `uhlobo` - isenzo okufanele senziwa, isibonelo, 1 - sendTransaction, 2 - getTransaction;
  • `umthwalo wokukhokha` - idatha okudingeka idluliselwe emsebenzini ofanele;
  • `umlayezoId` — umazisi womlayezo ukuze impendulo ibonakale.

- Iphrothokholi yokuxhumana phakathi kwama-node

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

lapho:

  • `ikhodi` — ikhodi yomlayezo, isibonelo 6 — PREPARE_NEW_BLOCK, 7 — BLOCK_VALID, 8 — BLOCK_COMMIT;
  • `versionProtocol` - Inguqulo yephrothokholi, njengoba ama-node anezinguqulo ezahlukene angaphakanyiswa kunethiwekhi futhi angasebenza ngendlela ehlukile;
  • `seq` - isihlonzi somlayezo;
  • `countChunk` и `i-chunkNumber` kudingekile ukuhlukanisa imiyalezo emikhulu;
  • `ubude` и `umthwalo wokukhokha` ubude kanye nedatha ngokwayo.

Njengoba sibhale kusengaphambili idatha, isistimu yokugcina ishesha kakhulu kunomtapo wezincwadi wakwa-Ethereum `rlp`. Ngeshwa, asikakwazi ukuyenqaba, njengoba kudingekile ukuphothula inkontileka ehlakaniphile, esihlele ukuyenza esikhathini esizayo.

Uma sikwazile ukufika ejubaneni 35 000 okwenziwayo ngomzuzwana, sidinga futhi ukukucubungula ngesikhathi esifanele. Njengoba isikhathi sokubunjwa kwebhulokhi esilinganiselwe sithatha imizuzwana engu-30, sidinga ukufaka ku-block 1 000 000 ukuthengiselana, okusho ukuthumela okwengeziwe 100 I-MB yedatha.

Ekuqaleni, sasebenzisa umtapo `ethereumjs-devp2p` ukuze sixhumane phakathi kwamanodi, kodwa ayikwazanga ukuphatha idatha engaka. Njengomphumela, sisebenzise umtapo `ws` futhi salungiselela ukuthumela idatha kanambambili nge-websocket. Yebo, siphinde sabhekana nezinkinga lapho sithumela amaphakethe edatha amakhulu, kodwa sawahlukanisa abe yizingxenyana futhi manje lezi zinkinga azisekho.

Futhi ukwakha isihlahla se-Merkle nokubala i-hashi 1 000 000 ukuthengiselana kudinga mayelana 10 imizuzwana yokubala okuqhubekayo. Ngalesi sikhathi, ukuxhumana nawo wonke ama-node kukwazi ukuphuka. Kunqunywe ukuhambisa lesi sibalo emculweni ohlukile.

Iziphetho:

Eqinisweni, lokho esikutholile akukusha, kodwa ngesizathu esithile ochwepheshe abaningi bayakhohlwa ngabo ngesikhathi sokuthuthukiswa.

  • Ukusebenzisa i-Functional Programming esikhundleni se-Object-Oriented Programming kuthuthukisa ukukhiqiza.
  • I-monolith yimbi kakhulu kunesakhiwo sesevisi sohlelo olukhiqizayo lwe-NodeJS.
  • Ukusebenzisa `imicu_yesisebenzi` ekubaleni esindayo kuthuthukisa ukuphendula kwesistimu, ikakhulukazi uma usebenzisana nemisebenzi ye-i/o.
  • I-unix isokhethi izinzile futhi ishesha kunezicelo ze-http.
  • Uma udinga ukudlulisa ngokushesha idatha enkulu phezu kwenethiwekhi, kungcono ukusebenzisa ama-websockets futhi uthumele idatha kanambambili, ihlukaniswe ibe yizicucu, ezingathunyelwa uma zingafiki, bese zihlanganiswa zibe umlayezo owodwa.

Sikumema ukuthi uvakashele GitHub iphrojekthi: https://github.com/opporty-com/Plasma-Cash/tree/new-version

I-athikhili ibhalwe ngokuhlanganyela ngu Alexander Nashivan, unjiniyela omkhulu Inkampani Clever Solution Inc.

Source: www.habr.com

Engeza amazwana