Mayeso a Pagulu: Yankho la Zinsinsi ndi Scalability pa Ethereum

Kutchinga ndi luso lamakono limene limalonjeza kusintha mbali zambiri za moyo wa munthu. Imasamutsa njira zenizeni ndi malonda mu malo adijito, zimatsimikizira kuthamanga ndi kudalirika kwa zochitika zachuma, zimachepetsa mtengo wawo, komanso zimakulolani kupanga mapulogalamu amakono a DAPP pogwiritsa ntchito makontrakitala anzeru mumagulu ogawidwa.

Poganizira zopindulitsa zambiri komanso kugwiritsa ntchito kosiyanasiyana kwa blockchain, zitha kuwoneka zodabwitsa kuti ukadaulo wodalirikawu sunafikebe mumakampani aliwonse. Vuto ndilakuti ma blockchains amakono alibe scalability. Ethereum imayendetsa za 20 pa sekondi imodzi, zomwe sizokwanira kukwaniritsa zosowa zamabizinesi amasiku ano. Panthawi imodzimodziyo, makampani omwe amagwiritsa ntchito teknoloji ya blockchain akuzengereza kusiya Ethereum chifukwa chachitetezo chake chachikulu pakubera ndi kulephera kwa maukonde.

Kuonetsetsa kugawikana, chitetezo ndi scalability mu blockchain, motero kuthetsa Scalability Trilemma, gulu lachitukuko. Mwayi adapanga Plasma Cash, unyolo wocheperako womwe uli ndi mgwirizano wanzeru komanso maukonde apadera ozikidwa pa Node.js, omwe nthawi ndi nthawi amasamutsa dziko lake ku unyolo wa mizu (Ethereum).

Mayeso a Pagulu: Yankho la Zinsinsi ndi Scalability pa Ethereum

Njira zazikulu mu Plasma Cash

1. Wogwiritsa amatcha ntchito ya mgwirizano wanzeru `deposit`, ndikudutsamo kuchuluka kwa ETH komwe akufuna kuyika mu chizindikiro cha Plasma Cash. Ntchito ya mgwirizano wanzeru imapanga chizindikiro ndikupanga chochitika chokhudza izo.

2. Ma Node a Plasma Cash omwe amalembetsa ku zochitika zamakontrakitala anzeru amalandira chochitika chokhudza kusungitsa ndalama ndikuwonjezera kugulitsa pakupanga chizindikiro kudziwe.

3. Nthawi ndi nthawi, ma node apadera a Plasma Cash amatenga zochitika zonse kuchokera padziwe (mpaka 1 miliyoni) ndikupanga chipika kuchokera kwa iwo, kuwerengera mtengo wa Merkle ndipo, motero, hashi. Chida ichi chimatumizidwa ku ma node ena kuti chitsimikizidwe. Ma node amayang'ana ngati Merkle hash ndi yovomerezeka komanso ngati zogulitsazo ndizovomerezeka (mwachitsanzo, ngati wotumiza chizindikirocho ndi mwini wake). Pambuyo potsimikizira chipikacho, node imayitana ntchito ya `submitBlock` ya contract yanzeru, yomwe imasunga nambala ya block ndi Merkle hash ku unyolo wam'mphepete. Mgwirizano wanzeru umapanga chochitika chosonyeza kuwonjezera bwino kwa chipika. Zochita zimachotsedwa padziwe.

4. Ma Node omwe amalandira chochitika chotumizira chipika amayamba kugwiritsa ntchito zomwe zidawonjezeredwa ku block.

5. Panthawi ina, mwiniwake (kapena wosakhala mwini) wa chizindikirocho akufuna kuchichotsa ku Plasma Cash. Kuti achite izi, amatcha ntchito ya `startExit`, ndikulowetsamo zambiri zokhudzana ndi zochitika 2 zomaliza pa chizindikirocho, zomwe zimatsimikizira kuti ndiye mwini wake wa chizindikirocho. Mgwirizano wanzeru, pogwiritsa ntchito Merkle hash, umayang'ana kupezeka kwa zochitika muzitsulo ndikutumiza chizindikiro kuti chichotsedwe, chomwe chidzachitika masabata awiri.

6. Ngati ntchito yochotsa chizindikirocho inachitika ndi kuphwanya (chizindikirocho chinagwiritsidwa ntchito pambuyo pa ndondomeko yochotseratu kapena chizindikirocho chinali kale cha munthu wina asanachotsedwe), mwiniwake wa chizindikirocho akhoza kutsutsa kuchotsa mkati mwa masabata awiri.

Mayeso a Pagulu: Yankho la Zinsinsi ndi Scalability pa Ethereum

Zinsinsi zimatheka m'njira ziwiri

1. The tcheni sadziwa chilichonse chokhudza malonda omwe amapangidwa ndi kutumizidwa mkati mwa unyolo wa ana. Zambiri za yemwe adasungitsa ndikuchotsa ETH ku Plasma Cash zimakhala zapagulu.

2. Unyolo wa ana umalola zochitika zosadziwika pogwiritsa ntchito zk-SNARKs.

Technology stack

  • NodeJS
  • Redis
  • etherium
  • Nthaka

Kuyesa

Popanga Plasma Cash, tidayesa kuthamanga kwadongosolo ndikupeza zotsatirazi:

  • mpaka 35 zogulitsa pa sekondi zimawonjezeredwa padziwe;
  • mpaka 1 zochitika zitha kusungidwa mu block.

Mayesero adachitidwa pa ma seva atatu awa:

1. Intel Core i7-6700 Quad-Core Skylake incl. NVMe SSD - 512 GB, 64 GB DDR4 RAM
3 zotsimikizira za Plasma Cash node zidakwezedwa.

2. AMD Ryzen 7 1700X Octa-Core β€œSummit Ridge” (Zen), SATA SSD – 500 GB, 64 GB DDR4 RAM
Ropsten testnet ETH node idakwezedwa.
3 zotsimikizira za Plasma Cash node zidakwezedwa.

3. Intel Core i9-9900K Octa-Core incl. NVMe SSD - 1 TB, 64 GB DDR4 RAM
1 Plasma Cash submission node idakwezedwa.
3 zotsimikizira za Plasma Cash node zidakwezedwa.
Mayeso adayambitsidwa kuti awonjezere zochitika pa netiweki ya Plasma Cash.

Chiwerengero: 10 ma Plasma Cash node mu network yachinsinsi.

Mayeso 1

Pali malire ochita 1 miliyoni pa block iliyonse. Choncho, zochitika za 1 miliyoni zimagwera muzitsulo za 2 (popeza dongosololi limatha kutenga gawo la zochitikazo ndikugonjera pamene akutumizidwa).


Dziko loyambirira: chipika chomaliza #7; Zochita ndi ma tokeni 1 miliyoni zimasungidwa m'nkhokwe.

00:00 - kuyamba kwa script yopanga malonda
01:37 - 1 miliyoni zogulitsa zidapangidwa ndikutumiza ku node kudayamba
01:46 - perekani node idatenga 240k kubwereketsa kuchokera padziwe ndi mawonekedwe block #8. Tikuwonanso kuti ma 320k amawonjezedwa padziwe mumasekondi 10
01:58 - chipika #8 chasainidwa ndikutumizidwa kuti chitsimikizidwe
02:03 - chipika #8 chatsimikizika ndipo ntchito ya `submitBlock` ya contract yanzeru imatchedwa ndi Merkle hashi ndi nambala ya block
02:10 - zolemba zachiwonetsero zidatha kugwira ntchito, zomwe zidatumiza 1 miliyoni mumasekondi 32
02:33 - ma node adayamba kulandira zidziwitso zomwe block #8 idawonjezedwa pamizu, ndikuyamba kuchita 240k.
02:40 - 240k zochitika zidachotsedwa padziwe, zomwe zili kale mu block # 8
02:56 - node yopereka idatenga zotsala za 760k kuchokera padziwe ndikuyamba kuwerengera hashi ya Merkle ndikusayina chipika #9
03:20 - ma node onse ali ndi 1 miliyoni 240k zochitika ndi zizindikiro
03:35 - chipika #9 chasainidwa ndikutumizidwa kuti chitsimikizidwe kuzinthu zina
03:41 - zolakwika zapaintaneti zidachitika
04:40 - kudikirira kutsimikizika kwa block #9 kwatha
04:54 - node yopereka idatenga zotsala za 760k kuchokera padziwe ndikuyamba kuwerengera hashi ya Merkle ndikusayina chipika #9
05:32 - chipika #9 chasainidwa ndikutumizidwa kuti chitsimikizidwe kuzinthu zina
05:53 - chipika # 9 chatsimikizika ndikutumizidwa kumizu
06:17 - ma node adayamba kulandira zidziwitso zomwe block #9 idawonjezedwa pamizu ndikuyamba kuchita 760k.
06:47 - dziwe lachotsa zomwe zili mu block #9
09:06 - ma node onse ali ndi zochitika 2 miliyoni ndi zizindikiro

Mayeso 2

Pali malire a 350k pa block. Zotsatira zake, tili ndi ma block 3.


Dziko loyambirira: chipika chomaliza #9; Zochita ndi ma tokeni 2 miliyoni zimasungidwa m'nkhokwe

00:00 - script yopanga malonda yakhazikitsidwa kale
00:44 - 1 miliyoni zogulitsa zidapangidwa ndikutumiza ku node kudayamba
00:56 - perekani node idatenga 320k kubwereketsa kuchokera padziwe ndi mawonekedwe block #10. Tikuwonanso kuti ma 320k amawonjezedwa padziwe mumasekondi 10
01:12 - chipika #10 chasainidwa ndikutumizidwa kumalo ena kuti chitsimikizidwe
01:18 - zolemba zachiwonetsero zidatha kugwira ntchito, zomwe zidatumiza 1 miliyoni mumasekondi 34
01:20 - chipika # 10 chatsimikizika ndikutumizidwa kumizu
01:51 - ma node onse adalandira zidziwitso kuchokera pamizu yomwe block #10 idawonjezedwa ndikuyamba kugwiritsa ntchito 320k
02:01 - dziwe lathetsa zochitika za 320k zomwe zidawonjezedwa kuti zitseke #10
02:15 - perekani node idatenga 350k kubwereketsa kuchokera padziwe ndi mawonekedwe block #11
02:34 - chipika #11 chasainidwa ndikutumizidwa ku ma node ena kuti chitsimikizidwe
02:51 - chipika # 11 chatsimikizika ndikutumizidwa kumizu
02:55 - malo omaliza adamaliza kuchitapo kanthu kuchokera ku block #10
10:59 - kugulitsako ndikutumiza chipika #9 kudatenga nthawi yayitali kwambiri pamizu, koma idamalizidwa ndipo ma node onse adalandira zambiri za izi ndikuyamba kuchita 350k.
11:05 - dziwe lathetsa zochitika za 320k zomwe zidawonjezedwa kuti zitseke #11
12:10 - ma node onse ali ndi 1 miliyoni 670k zochitika ndi zizindikiro
12:17 - node yotumiza idatenga 330k kubweza kuchokera padziwe ndi mawonekedwe block #12
12:32 - chipika #12 chasainidwa ndikutumizidwa ku ma node ena kuti chitsimikizidwe
12:39 - chipika # 12 chatsimikizika ndikutumizidwa kumizu
13:44 - ma node onse adalandira zidziwitso kuchokera pamizu yomwe block #12 idawonjezedwa ndikuyamba kugwiritsa ntchito 330k.
14:50 - ma node onse ali ndi zochitika 2 miliyoni ndi zizindikiro

Mayeso 3

Mu ma seva oyamba ndi achiwiri, node imodzi yotsimikizira idasinthidwa ndi node yotumiza.


Dziko loyamba: chipika chomaliza #84; 0 zochita ndi zizindikiro zosungidwa mu database

00:00 - Zolemba 3 zakhazikitsidwa zomwe zimapanga ndikutumiza 1 miliyoni zogulitsa chilichonse
01:38 - Zogulitsa 1 miliyoni zidapangidwa ndikutumiza kutumiza node #3 idayamba
01:50 - perekani node #3 idatenga 330k kubwereketsa kuchokera padziwe ndi mafomu chipika #85 (f21). Tikuwonanso kuti ma 350k amawonjezedwa padziwe mumasekondi 10
01:53 - Zogulitsa 1 miliyoni zidapangidwa ndikutumiza kutumiza node #1 idayamba
01:50 - perekani node #3 idatenga 330k kubwereketsa kuchokera padziwe ndi mafomu chipika #85 (f21). Tikuwonanso kuti ma 350k amawonjezedwa padziwe mumasekondi 10
02:01 - perekani node # 1 idatenga 250k kubwereketsa kuchokera padziwe ndi mafomu block #85 (65e)
02:06 - chipika #85 (f21) chasainidwa ndikutumizidwa ku ma node ena kuti chitsimikizidwe
02:08 - script ya seva #3, yomwe idatumiza 1 miliyoni mumasekondi 30, idamaliza kugwira ntchito
02:14 - chipika #85 (f21) chatsimikizika ndikutumizidwa kumizu
02:19 - chipika #85 (65e) chasainidwa ndikutumizidwa ku ma node ena kuti chitsimikizidwe
02:22 - Zogulitsa 1 miliyoni zidapangidwa ndikutumiza kutumiza node #2 idayamba
02:27 - chipika # 85 (65e) chovomerezeka ndikutumizidwa kumizu
02:29 - perekani node #2 idatenga 111855 zochitika kuchokera padziwe ndi mafomu block #85 (256).
02:36 - chipika #85 (256) chasainidwa ndikutumizidwa ku ma node ena kuti chitsimikizidwe
02:36 - script ya seva #1, yomwe idatumiza 1 miliyoni mumasekondi 42.5, idamaliza kugwira ntchito
02:38 - chipika #85 (256) chatsimikizika ndikutumizidwa kumizu
03:08 - seva # 2 script yatha kugwira ntchito, yomwe idatumiza 1 miliyoni mumasekondi 47
03:38 - ma node onse adalandira zambiri kuchokera pamizu yomwe imatchinga #85 (f21), #86(65e), #87(256) idawonjezedwa ndikuyamba kugwiritsa ntchito 330k, 250k, 111855.
03:49 - dziwe lidachotsedwa pa 330k, 250k, 111855 zochitika zomwe zidawonjezedwa ku midadada #85 (f21), #86(65e), #87(256)
03:59 - perekani node # 1 idatenga 888145 mayendedwe kuchokera padziwe ndi mafomu chipika #88 (214), perekani node #2 idatenga 750k zotuluka kuchokera padziwe ndipo mafomu block #88 (50a), perekani node #3 idatenga 670k zotuluka kuchokera dziwe ndi mafomu chipika #88 (d3b)
04:44 - chipika #88 (d3b) chasainidwa ndikutumizidwa ku ma node ena kuti chitsimikizidwe
04:58 - chipika #88 (214) chasainidwa ndikutumizidwa ku ma node ena kuti chitsimikizidwe
05:11 - chipika #88 (50a) chasainidwa ndikutumizidwa ku ma node ena kuti chitsimikizidwe
05:11 - chipika #85 (d3b) chatsimikizika ndikutumizidwa kumizu
05:36 - chipika #85 (214) chatsimikizika ndikutumizidwa kumizu
05:43 - ma node onse adalandira zidziwitso kuchokera pamizu yomwe imatchinga #88 (d3b), #89(214) yawonjezedwa ndipo ayamba kugwiritsa ntchito 670k, 750k.
06:50 - chifukwa cha kulephera kwa kulankhulana, chipika #85 (50a) sichinatsimikizidwe
06:55 - perekani node #2 idatenga 888145 zochitika kuchokera padziwe ndipo mafomu block #90 (50a)
08:14 - chipika #90 (50a) chasainidwa ndikutumizidwa ku ma node ena kuti chitsimikizidwe
09:04 - chipika # 90 (50a) chatsimikizika ndikutumizidwa kumizu
11:23 - ma node onse adalandira zambiri kuchokera pamizu yomwe imatchinga #90 (50a) idawonjezedwa, ndikuyamba kugwiritsa ntchito 888145. Nthawi yomweyo, seva #3 idagwiritsa ntchito kale zosintha kuchokera ku midadada #88 (d3b), #89(214)
12:11 - maiwe onse alibe kanthu
13:41 - ma node onse a seva #3 ali ndi zochitika ndi zizindikiro za 3 miliyoni
14:35 - ma node onse a seva #1 ali ndi zochitika ndi zizindikiro za 3 miliyoni
19:24 - ma node onse a seva #2 ali ndi zochitika ndi zizindikiro za 3 miliyoni

Zopinga

Pakukula kwa Plasma Cash, tidakumana ndi zovuta zotsatirazi, zomwe tidazithetsa pang'onopang'ono ndikuzithetsa:

1. Kusamvana pakulumikizana kwa machitidwe osiyanasiyana. Mwachitsanzo, ntchito yowonjezeretsa zochitika padziwe inatseka ntchito yotumizira ndi kutsimikizira midadada, ndi mosemphanitsa, zomwe zinayambitsa kutsika kwa liwiro.

2. Sizinadziwike nthawi yomweyo momwe mungatumizire kuchuluka kwa zochitika ndikuchepetsa ndalama zotumizira deta.

3. Sizinadziwike momwe ndi momwe mungasungire deta kuti mukwaniritse zotsatira zapamwamba.

4. Sizinadziwike momwe mungapangire maukonde pakati pa node, popeza kukula kwa chipika chokhala ndi 1 miliyoni kumatenga pafupifupi 100 MB.

5. Kugwira ntchito yokhala ndi ulusi umodzi kumaswa kulumikizana pakati pa ma node akamawerengera nthawi yayitali (mwachitsanzo, kupanga mtengo wa Merkle ndikuwerengera hashi yake).

Tinathana nazo bwanji zonsezi?

Mtundu woyamba wa node ya Plasma Cash inali mtundu wophatikizana womwe ungathe kuchita zonse nthawi imodzi: kuvomereza zochitika, kutumiza ndi kutsimikizira midadada, ndikupereka API kuti mupeze deta. Popeza NodeJS ili ndi ulusi umodzi, ntchito yowerengera mtengo wa Merkle inaletsa ntchito yowonjezera. Tawona njira ziwiri zothetsera vutoli:

1. Yambitsani njira zingapo za NodeJS, iliyonse yomwe imagwira ntchito zina.

2. Gwiritsani ntchito worker_threads ndikusuntha kuchitidwa kwa gawo la code kukhala ulusi.

Zotsatira zake, tidagwiritsa ntchito zonse ziwiri nthawi imodzi: tidagawa mfundo imodzi kukhala magawo atatu omwe amatha kugwira ntchito padera, koma nthawi yomweyo molumikizana.

1. Node yotumizira, yomwe imavomereza zochitika mu dziwe ndikupanga midadada.

2. Node yotsimikizira yomwe imayang'ana kutsimikizika kwa node.

3. API node - imapereka API yofikira deta.

Pankhaniyi, mutha kulumikizana ndi mfundo iliyonse kudzera pa socket ya unix pogwiritsa ntchito cli.

Tinasuntha maopaleshoni olemetsa, monga kuwerengera mtengo wa Merkle, mu ulusi wina.

Chifukwa chake, tapeza magwiridwe antchito onse a Plasma Cash nthawi imodzi komanso popanda zolephera.

Dongosololi litagwira ntchito, tinayamba kuyesa liwiro ndipo, mwatsoka, tidalandira zotsatira zosasangalatsa: 5 transactions pamphindi imodzi mpaka 000 pa block. Ndinayenera kudziwa zomwe zidakhazikitsidwa molakwika.

Poyamba, tidayamba kuyesa njira yolumikizirana ndi Plasma Cash kuti tidziwe kuthekera kwadongosolo. Tidalemba kale kuti Plasma Cash node imapereka mawonekedwe a unix socket. Poyamba zinali zochokera palemba. zinthu za json zidatumizidwa pogwiritsa ntchito `JSON.parse()` ndi `JSON.stringify()`.

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

Tidayeza kuthamanga kwa zinthu zotere ndikupeza ~ 130k pamphindikati. Tidayesa kusintha magwiridwe antchito a json, koma magwiridwe antchito sanayende bwino. Injini ya V8 iyenera kukonzedwa bwino pazochita izi.

Tinagwira ntchito ndi ma transaction, tokeni, ndi midadada kudzera m'makalasi. Popanga makalasi oterowo, magwiridwe antchito adatsika kawiri, zomwe zikuwonetsa kuti OOP siyoyenera kwa ife. Ndinayenera kulembanso chilichonse kuti chikhale chogwira ntchito.

Kujambula mu database

Poyambirira, Redis adasankhidwa kuti asungidwe deta ngati imodzi mwamayankho opindulitsa kwambiri omwe amakwaniritsa zofunikira zathu: kusungidwa kwamtengo wapatali, kugwira ntchito ndi matebulo a hashi, seti. Tidayambitsa redis-benchmark ndipo tidakhala ndi ~ 80k opareshoni pamphindikati munjira imodzi yopangira mapaipi.

Kuti tichite bwino kwambiri, tidasinthira Redis bwino kwambiri:

  • Kulumikizana kwa socket kwakhazikitsidwa.
  • Tidaletsa kupulumutsa boma ku diski (chifukwa chodalirika, mutha kukhazikitsa choyimira ndikusunga ku diski mu Redis yosiyana).

Ku Redis, dziwe ndi tebulo la hashi chifukwa tikuyenera kubweza zonse zomwe zachitika mufunso limodzi ndikuchotsa zomwe zachitika m'modzim'modzi. Tinayesa kugwiritsa ntchito mndandanda wanthawi zonse, koma imachedwa potsitsa mndandanda wonse.

Mukamagwiritsa ntchito NodeJS yokhazikika, malaibulale a Redis adapeza magwiridwe antchito a 18k pamphindikati. Liwiro linatsika ka 9.

Popeza benchmark idatiwonetsa kuti kuthekera kunali kokulirapo ka 5, tidayamba kukhathamiritsa. Tinasintha laibulale kukhala ioredis ndikuchita 25k pamphindikati. Tidawonjezera zochitika chimodzi ndi chimodzi pogwiritsa ntchito lamulo la `hset`. Chifukwa chake tinali kupanga mafunso ambiri ku Redis. Lingaliro lidawuka kuti aphatikizire zochitika kukhala magulu ndikuwatumiza ndi lamulo limodzi `hmset`. Zotsatira zake ndi 32k pa sekondi iliyonse.

Pazifukwa zingapo, zomwe tifotokoza pansipa, timagwira ntchito ndi deta pogwiritsa ntchito `Buffer` ndipo, monga momwe zimakhalira, ngati mutasintha kukhala mawu (`buffer.toString('hex')`) musanalembe, mutha kuwonjezera zina. ntchito. Choncho, liwiro linawonjezeka kufika 35k pamphindi. Pakadali pano, tinaganiza zosiya kukhathamiritsa kwina.

Tinayenera kusinthira ku protocol ya binary chifukwa:

1. Dongosololi nthawi zambiri limawerengera ma hashes, siginecha, ndi zina zambiri, ndipo izi zimafunikira deta mu `Buffer.

2. Mukatumizidwa pakati pa mautumiki, deta ya binary imalemera mocheperapo kusiyana ndi malemba. Mwachitsanzo, potumiza chipika chokhala ndi 1 miliyoni, zomwe zili m'mawuwo zimatha kutenga ma megabytes opitilira 300.

3. Kusintha kwanthawi zonse kumakhudza magwiridwe antchito.

Choncho, tinatenga ngati maziko athu a binary protocol yosungira ndi kutumiza deta, yopangidwa pamaziko a laibulale yodabwitsa ya `binary-data`.

Zotsatira zake, tapeza ma data amtundu awa:

-Kugulitsa

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

- Chizindikiro

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

β€”Blokani

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

Ndi malamulo anthawi zonse `BD.encode(block, Protocol).slice();` ndi `BD.decode(buffer, Protocol)` timatembenuza detayo kukhala `Buffer` posunga mu Redis kapena kutumiza ku node ina ndikubweza deta kubwerera.

Tilinso ndi ma protocol awiri a binary posamutsa deta pakati pa mautumiki:

- Protocol yolumikizana ndi Plasma Node kudzera pa 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)
  }
  ```

kumene:

  • `mtundu` - zomwe ziyenera kuchitika, mwachitsanzo, 1 - sendTransaction, 2 - getTransaction;
  • `malipiro` - deta yomwe iyenera kuperekedwa ku ntchito yoyenera;
  • `messageId` - ID ya uthenga kuti yankho lidziwike.

- Protocol yolumikizana pakati pa 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)
  }
  ```

kumene:

  • `kodi` - uthenga code, mwachitsanzo 6 - PREPARE_NEW_BLOCK, 7 - BLOCK_VALID, 8 - BLOCK_COMMIT;
  • `versionProtocol` - mtundu wa protocol, popeza ma node okhala ndi mitundu yosiyanasiyana amatha kukwezedwa pamaneti ndipo amatha kugwira ntchito mosiyana;
  • `seq` - chizindikiritso cha uthenga;
  • 'countChunk' ΠΈ `chunkNumber` zofunikira pakugawa mauthenga akuluakulu;
  • 'utali' ΠΈ `malipiro` kutalika ndi deta yokha.

Popeza tidalemberatu detayo, dongosolo lomaliza ndilothamanga kwambiri kuposa laibulale ya `rlp` ya Ethereum. Tsoka ilo, sitinathe kukana, chifukwa ndikofunikira kumaliza mgwirizano wanzeru, womwe tikukonzekera mtsogolo.

Ngati tinakwanitsa kufika pa liwiro 35 000 zochita pa sekondi iliyonse, tiyeneranso kuzikonza mu nthawi yoyenera. Popeza pafupifupi nthawi yopanga chipika imatenga masekondi 30, tiyenera kuphatikiza mu block 1 000 000 zochita, kutanthauza kutumiza zambiri 100 MB ya data.

Poyambirira, tidagwiritsa ntchito laibulale ya `ethereumjs-devp2p` kuti tilankhule pakati pa ma node, koma sinathe kugwiritsa ntchito zambiri. Zotsatira zake, tidagwiritsa ntchito laibulale ya `ws` ndikusintha kutumiza deta ya binary kudzera pa websocket. Inde, tinakumananso ndi mavuto potumiza mapepala akuluakulu a deta, koma tinawagawa m'magulu ndipo tsopano mavutowa atha.

Komanso kupanga mtengo wa Merkle ndikuwerengera hashi 1 000 000 zotuluka amafuna za 10 masekondi a kuwerengera mosalekeza. Panthawi imeneyi, kugwirizana ndi mfundo zonse amatha kusweka. Anaganiza zosunthira kuwerengera uku ku ulusi wina.

Zotsatira:

M'malo mwake, zomwe tapeza sizatsopano, koma pazifukwa zina akatswiri ambiri amaiwala za iwo akamakulitsa.

  • Kugwiritsa Ntchito Mapulogalamu Ogwira Ntchito m'malo mwa Object-Oriented Programming kumakulitsa zokolola.
  • Monolith ndiyoyipa kwambiri kuposa kamangidwe kantchito kachitidwe ka NodeJS.
  • Kugwiritsa ntchito `worker_threads` pakuwerengera kolemera kumathandizira kuyankha kwadongosolo, makamaka pochita ndi ma i/o.
  • socket ya unix ndiyokhazikika komanso yachangu kuposa zopempha za http.
  • Ngati mukufuna kusamutsa deta yayikulu mwachangu pamaneti, ndikwabwino kugwiritsa ntchito ma websockets ndikutumiza deta ya binary, yogawidwa m'magulu, yomwe imatha kutumizidwa ngati safika, ndikuphatikiza uthenga umodzi.

Tikukupemphani kuti mudzacheze GitHub polojekiti: https://github.com/opporty-com/Plasma-Cash/tree/new-version

Nkhaniyi inalembedwanso ndi Alexander Nashivan, wopanga wamkulu Malingaliro a kampani Clever Solution Inc.

Source: www.habr.com

Kuwonjezera ndemanga