Veruzhinji Muedzo: Mhinduro Yekuvanzika uye Scalability paEthereum

Blockchain unyanzvi hutsva hunovimbisa kuvandudza nzvimbo dzakawanda dzehupenyu hwevanhu. Inoendesa maitiro chaiwo uye zvigadzirwa munzvimbo yedhijitari, inovimbisa kukurumidza uye kuvimbika kwekutengeserana kwemari, inoderedza mutengo wavo, uye zvakare inobvumidza iwe kugadzira yemazuva ano DAPP maapplication uchishandisa akangwara zvibvumirano mumatanho akasarudzika.

Tichifunga nezvakawanda mabhenefiti uye akasiyana mashandisiro e blockchain, zvingaite senge zvichishamisa kuti iyi tekinoroji inovimbisa haisati yapinda muindasitiri yese. Dambudziko nderekuti mazuva ano decentralized blockchains anoshaya scalability. Ethereum inobata nezve 20 transactions pasekondi imwe neimwe, iyo isina kukwana kuzadzisa zvinodiwa zvemazuva ano ane simba mabhizinesi. Panguva imwecheteyo, makambani anoshandisa teknolojia ye blockchain anozeza kusiya Ethereum nekuda kwehupamhi hwekudzivirira kubva pakubira uye kukanganisa kwetiweki.

Kuve nechokwadi chekudzika, chengetedzo uye scalability mu blockchain, nokudaro kugadzirisa iyo Scalability Trilemma, timu yekusimudzira. Mukana yakagadzira Plasma Cash, ketani inotsigira inosanganisira smart contract uye yakavanzika network yakavakirwa paNode.js, iyo nguva nenguva inotamisa nyika yayo kune midzi chain (Ethereum).

Veruzhinji Muedzo: Mhinduro Yekuvanzika uye Scalability paEthereum

Maitiro akakosha muPlasma Cash

1. Mushandisi anodana smart contract function `deposit`, achipfuura mairi huwandu hweETH hwaanoda kuisa muPlasma Cash token. Iyo smart contract function inogadzira chiratidzo uye inogadzira chiitiko nezvayo.

2. Plasma Cash nodes yakanyoreswa kune smart kontrakiti zviitiko zvinogashira chiitiko nezve kugadzira dhipoziti uye kuwedzera kutengeserana nezve kugadzira chiratidzo padziva.

3. Nguva nenguva, maPlasma Cash node anokosha anotora zvese zvekutengesa kubva padziva (kusvika miriyoni imwe) uye kugadzira bhuroka kubva kwavari, kuverenga muti weMerkle uye, maererano, hashi. Iyi block inotumirwa kune dzimwe node kuti ionekwe. Manodhi anotarisisa kuti Merkle hashi inoshanda here uye kuti kutengeserana kwacho kuriko here (semuenzaniso, kana iye akatumira chiratidzo ndiye muridzi wayo). Mushure mekutarisa block, node inodaidza `submitBlock` basa re smart kontrakiti, iyo inochengetedza iyo block nhamba uye Merkle hash kumucheto cheni. Iyo smart contract inogadzira chiitiko chinoratidza kubudirira kwekuwedzera kweblock. Kutengeserana kunobviswa padziva.

4. Node dzinogashira chiitiko chekutumira block dzinotanga kushandisa kutengeserana kwakawedzerwa kune block.

5. Pane imwe nguva, muridzi (kana asiri muridzi) wechiratidzo anoda kuibvisa kubva kuPlasma Cash. Kuti aite izvi, anodana `startExit` basa, achipfuura mairi ruzivo pamusoro pekupedzisira 2 kutengeserana pachiratidzo, iyo inosimbisa kuti ndiye muridzi wechiratidzo. Chibvumirano chakangwara, uchishandisa Merkle hash, inotarisa kuvapo kwekutengeserana mumatombo uye inotumira chiratidzo chekubvisa, izvo zvichaitika mumavhiki maviri.

6. Kana chiratidzo chekubvisa chiratidzo chakaitika nekutyorwa (chiratidzo chakapedzwa mushure mekunge nzira yekubvisa yatanga kana chiratidzo chatova cheumwe munhu asati abviswa), muridzi wechiratidzo anogona kuramba kubviswa mukati memavhiki maviri.

Veruzhinji Muedzo: Mhinduro Yekuvanzika uye Scalability paEthereum

Kuvanzika kunowanikwa nenzira mbiri

1. Mudzi wecheni hauzivi chinhu nezvekutengeserana kunogadzirwa uye kutumirwa mukati mecheni yemwana. Ruzivo rwekuti ndiani akaisa uye kubvisa ETH kubva kuPlasma Cash inoramba iri pachena.

2. Cheni yemwana inobvumira kusazivikanwa kwekutengesa uchishandisa zk-SNARKs.

Technology stack

  • NodeJS
  • Redis
  • Etherium
  • Sild

Kuedza

Tichiri kugadzira Plasma Cash, takaedza kumhanya kweiyo system tikawana zvinotevera:

  • kusvika ku35 kutengeserana pasekondi inowedzerwa kune dziva;
  • kusvika ku1 kutengeserana kunogona kuchengetwa mubhuroka.

Miedzo yakaitwa pamaseva matatu anotevera:

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

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

3. Intel Core i9-9900K Octa-Core incl. NVMe SSD - 1 TB, 64 GB DDR4 RAM
1 Plasma Cash kutumira node yakasimudzwa.
3 inosimbisa Plasma Cash node dzakasimudzwa.
Muedzo wakatangwa kuwedzera matransaction kune Plasma Cash network.

Zvose: 10 Plasma Cash node mune yakavanzika network.

Muedzo 1

Pane muganhu we 1 miriyoni yekutengeserana pa block. Naizvozvo, 1 miriyoni yekutengeserana inowira mu 2 zvidhinha (sezvo sisitimu inokwanisa kutora chikamu chekutengeserana uye kuendesa pavanenge vachitumirwa).


Mamiriro ekutanga: yekupedzisira block #7; Mamirioni 1 ekutengeserana uye tokeni anochengetwa mudhatabhesi.

00:00 - kutanga kweshanduro yekugadzira script
01:37 - miriyoni yekutengeserana yakagadzirwa uye kutumira kune node kwakatanga
01:46 - kuendesa node yakatora 240k kutengeserana kubva padziva uye mafomu block #8. Isu tinoona zvakare kuti 320k transaction inowedzerwa padziva mumasekonzi gumi
01:58 - block #8 inosainwa uye inotumirwa kuti isimbiswe
02:03 - block #8 inosimbiswa uye iyo `submitBlock` basa rechibvumirano chakangwara rinodaidzwa neiyo Merkle hashi uye block nhamba.
02:10 - demo script yapera kushanda, iyo yakatumira miriyoni kutengeserana mumasekonzi makumi matatu nemaviri.
02:33 - node dzakatanga kugamuchira ruzivo rwekuti block #8 yakawedzerwa kumudzi wecheni, ndokutanga kuita 240k transactions.
02:40 - 240k kutengeserana kwakabviswa kubva padziva, iyo yatove mu block #8.
02:56 - kuendesa node yakatora yakasara 760k matransaction kubva padziva ndokutanga kuverenga Merkle hashi uye kusaina block #9.
03:20 - node dzese dzine miriyoni imwe 1k zvekutengeserana uye tokeni
03:35 - block #9 inosainwa uye inotumirwa kuti isimbiswe kune dzimwe node
03:41 - network kukanganisa kwakaitika
04:40 - kumirira block #9 kusimbiswa kwapera
04:54 - kuendesa node yakatora yakasara 760k matransaction kubva padziva ndokutanga kuverenga Merkle hashi uye kusaina block #9.
05:32 - block #9 inosainwa uye inotumirwa kuti isimbiswe kune dzimwe node
05:53 - block #9 inosimbiswa uye inotumirwa kumudzi weketani
06:17 - node dzakatanga kugashira ruzivo rwekuti block #9 yakawedzerwa kumudzi wecheni ndokutanga kuita 760k transactions.
06:47 - dziva rabvisa matransaction ari mublock #9
09:06 - node dzese dzine 2 miriyoni kutengeserana uye tokeni

Muedzo 2

Pane muganhu we350k pa block. Nekuda kweizvozvo, isu tine mabhuroki matatu.


Mamiriro ekutanga: yekupedzisira block #9; Mamirioni maviri ekutengeserana uye tokeni anochengetwa mudhatabhesi

00:00 - transaction generation script yakatotangwa
00:44 - miriyoni yekutengeserana yakagadzirwa uye kutumira kune node kwakatanga
00:56 - kuendesa node yakatora 320k kutengeserana kubva padziva uye mafomu block #10. Isu tinoona zvakare kuti 320k transaction inowedzerwa padziva mumasekonzi gumi
01:12 - block #10 inosainwa uye inotumirwa kune dzimwe node kuti isimbiswe
01:18 - demo script yapera kushanda, iyo yakatumira miriyoni kutengeserana mumasekonzi makumi matatu nemaviri.
01:20 - block #10 inosimbiswa uye inotumirwa kumudzi weketani
01:51 - node dzese dzakagamuchira ruzivo kubva kumudzi weti iyo block #10 yakawedzerwa uye inotanga kushandisa 320k transaction.
02:01 - dziva rakabvisirwa 320k kutengeserana kwakawedzerwa kuvharisa #10.
02:15 - kuendesa node yakatora 350k kutengeserana kubva padziva uye mafomu block #11
02:34 - block #11 inosainwa uye inotumirwa kune dzimwe node kuti isimbiswe
02:51 - block #11 inosimbiswa uye inotumirwa kumudzi weketani
02:55 - iyo yekupedzisira node yakapedza kutengeserana kubva pablock #10
10:59 - kutengeserana nekutumirwa kweblock #9 kwakatora nguva yakareba kwazvo mumudziyo weketani, asi yakapedzwa uye node dzese dzakagamuchira ruzivo nezvazvo ndokutanga kuita 350k transactions.
11:05 - dziva rakabvisirwa 320k kutengeserana kwakawedzerwa kuvharisa #11.
12:10 - node dzese dzine miriyoni imwe 1k matranseksheni nematokeni
12:17 - kuendesa node yakatora 330k kutengeserana kubva padziva uye mafomu block #12
12:32 - block #12 inosainwa uye inotumirwa kune dzimwe node kuti isimbiswe
12:39 - block #12 inosimbiswa uye inotumirwa kumudzi weketani
13:44 - node dzese dzakagamuchira ruzivo kubva kumudzi weti iyo block #12 yakawedzerwa uye inotanga kushandisa 330k transactions.
14:50 - node dzese dzine 2 miriyoni kutengeserana uye tokeni

Muedzo 3

Mune sevha yekutanga neyechipiri, imwe yekusimbisa node yakatsiviwa neinoendesa node.


Mamiriro ekutanga: yekupedzisira block #84; 0 kutengeserana uye tokeni zvakachengetwa mudhatabhesi

00:00 - 3 zvinyorwa zvakatangwa zvinogadzira uye kutumira miriyoni imwe yekutengeserana imwe neimwe.
01:38 - miriyoni imwe yekutengeserana yakagadzirwa uye kutumira kuendesa node #1 yakatanga
01:50 - endesa node #3 yakatora 330k kutengeserana kubva padziva uye mafomu block #85 (f21). Isu tinoona zvakare kuti 350k transaction inowedzerwa padziva mumasekonzi gumi
01:53 - miriyoni imwe yekutengeserana yakagadzirwa uye kutumira kuendesa node #1 yakatanga
01:50 - endesa node #3 yakatora 330k kutengeserana kubva padziva uye mafomu block #85 (f21). Isu tinoona zvakare kuti 350k transaction inowedzerwa padziva mumasekonzi gumi
02:01 - tumira node #1 yakatora 250k kutengeserana kubva padziva uye mafomu block #85 (65e)
02:06 - block #85 (f21) inosainwa uye inotumirwa kune dzimwe node kuti isimbiswe
02:08 - demo script ye server #3, iyo yakatumira miriyoni kutengeserana mumasekonzi makumi matatu, yakapedza kushanda
02:14 - block #85 (f21) inosimbiswa uye inotumirwa kumudzi weketani
02:19 - block #85 (65e) inosainwa uye inotumirwa kune dzimwe node kuti isimbiswe
02:22 - miriyoni imwe yekutengeserana yakagadzirwa uye kutumira kuendesa node #1 yakatanga
02:27 - block #85 (65e) yakasimbiswa uye yakatumirwa kumudzi weketani
02:29 - endesa node #2 yakatora 111855 kutengeserana kubva padziva uye mafomu block #85 (256).
02:36 - block #85 (256) inosainwa uye inotumirwa kune dzimwe node kuti isimbiswe
02:36 - demo script ye server #1, iyo yakatumira miriyoni kutengeserana mumasekonzi makumi matatu, yakapedza kushanda
02:38 - block #85 (256) inosimbiswa uye inotumirwa kumudzi weketani
03:08 - server #2 script yapera kushanda, iyo yakatumira miriyoni kutengeserana mumasekonzi makumi mana nemanomwe.
03:38 - node dzese dzakagamuchira ruzivo kubva kumudzi wecheni inovhara #85 (f21), #86(65e), #87(256) yakawedzerwa ndokutanga kushandisa 330k, 250k, 111855 kutengeserana.
03:49 - dziva rakacheneswa pa330k, 250k, 111855 kutengeserana kwakawedzerwa kumabhuroko #85 (f21), #86(65e), #87(256)
03:59 - endesa node #1 yakatora 888145 matransaction kubva padziva uye mafomu block #88 (214), tumira node #2 yakatora 750k kutengeserana kubva padziva uye mafomu block #88 (50a), tumira node #3 yakatora 670k kutengeserana kubva dziva uye mafomu block #88 (d3b)
04:44 - block #88 (d3b) inosainwa uye inotumirwa kune dzimwe node kuti isimbiswe
04:58 - block #88 (214) inosainwa uye inotumirwa kune dzimwe node kuti isimbiswe
05:11 - block #88 (50a) inosainwa uye inotumirwa kune dzimwe node kuti isimbiswe
05:11 - block #85 (d3b) inosimbiswa uye inotumirwa kumudzi weketani
05:36 - block #85 (214) inosimbiswa uye inotumirwa kumudzi weketani
05:43 - node dzese dzakagamuchira ruzivo kubva kumudzi wecheni inovhara #88 (d3b), #89(214) yawedzerwa uye yave kutanga kushandisa 670k, 750k kutengeserana.
06:50 - nekuda kwekutadza kutaurirana, block #85 (50a) haina kusimbiswa
06:55 - endesa node #2 yakatora 888145 kutengeserana kubva padziva uye mafomu block #90 (50a)
08:14 - block #90 (50a) inosainwa uye inotumirwa kune dzimwe node kuti isimbiswe
09:04 - block #90 (50a) inosimbiswa uye inotumirwa kumudzi weketani
11:23 - nodes dzose dzakagamuchira ruzivo kubva kumudzi wecheni iyo block #90 (50a) yakawedzerwa, uye inotanga kushandisa 888145 transactions. Panguva imwecheteyo, sevha #3 yakatoshandisa kutengeserana kubva kumabhuroki #88 (d3b), #89(214)
12:11 - madziva ose haana chinhu
13:41 - node dzese dzeserver #3 dzine mamirioni matatu ekutengeserana uye zviratidzo
14:35 - node dzese dzeserver #1 dzine mamirioni matatu ekutengeserana uye zviratidzo
19:24 - node dzese dzeserver #2 dzine mamirioni matatu ekutengeserana uye zviratidzo

Zvipingamupinyi

Munguva yekuvandudzwa kwePlasma Cash, takasangana nematambudziko anotevera, atakagadzirisa zvishoma nezvishoma uye tiri kugadzirisa:

1. Kupokana mukudyidzana kwemaitiro akasiyana siyana. Semuenzaniso, basa rekuwedzera kutengeserana kune dziva rakavhara basa rekutumira uye kusimbisa zvidhinha, uye zvakasiyana, izvo zvakakonzera kudonha kwekukurumidza.

2. Izvo hazvina kujeka nekukurumidza kutumira huwandu hukuru hwekutengeserana uku uchidzikisa mutengo wekufambisa data.

3. Izvo hazvina kujeka kuti sei uye kupi kwekuchengetedza data kuitira kuti uwane mibairo yepamusoro.

4. Izvo hazvina kujeka nzira yekuronga network pakati pemanodhi, sezvo saizi yebhuroka ine 1 miriyoni yekutengeserana inotora anenge 100 MB.

5. Kushanda mu-single-threaded mode kunotyora kubatana pakati pemanodhi kana maverengero akareba aitika (semuenzaniso, kuvaka muti weMerkle uye kuverenga hashi yawo).

Takaita sei nezvose izvi?

Yekutanga vhezheni yePlasma Cash node yaive rudzi rwemusanganiswa waigona kuita zvese panguva imwe chete: gamuchira kutengeserana, tumira uye simbisa zvivharo, uye ipa API yekuwana data. Sezvo NodeJS iri natively-yakaiswa tambo, inorema Merkle muti kuverenga basa yakavhara iyo yekuwedzera transaction basa. Takaona nzira mbiri dzekugadzirisa dambudziko iri:

1. Tangisa maitiro akati wandei eNodeJS, imwe neimwe inoita mabasa chaiwo.

2. Shandisa worker_threads uye fambisa kuurayiwa kwechikamu chekodhi kuita tambo.

Nekuda kweizvozvo, isu takashandisa ese maviri sarudzo panguva imwe chete: isu zvine musoro takakamura imwe node muzvikamu zvitatu zvinogona kushanda zvakasiyana, asi panguva imwe chete synchronously.

1. Kuendesa node, iyo inogamuchira kutengeserana mudziva uye inogadzira zvidhinha.

2. Node inosimbisa inoongorora kutendeseka kwemanodhi.

3. API node - inopa API yekuwana data.

Muchiitiko ichi, unogona kubatana kune imwe neimwe node kuburikidza neunix socket uchishandisa cli.

Takafambisa maoparesheni anorema, akadai sekuverenga muti weMerkle, mune imwe shinda yakasiyana.

Nekudaro, isu takawana yakajairika kushanda kwese Plasma Cash mabasa panguva imwe chete uye pasina kukundikana.

Kamwe hurongwa hwave huchishanda, takatanga kuedza kukurumidza uye, zvinosuruvarisa, takagamuchira migumisiro isingafadzi: 5 kutengeserana kwesekondi uye kusvika ku000 kutengeserana pabhokisi. Ndaifanira kufunga kuti chii chakaitwa zvisiri izvo.

Kutanga, takatanga kuyedza nzira yekutaurirana nePlasma Cash kuti tizive kugona kwepamusoro kweiyo system. Isu takanyora kare kuti iyo Plasma Cash node inopa unix socket interface. Pakutanga yaive yakavakirwa pamavara. json zvinhu zvakatumirwa pachishandiswa `JSON.parse()` uye `JSON.stringify()`.

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

Takayera kumhanya kwekufambisa kwezvinhu zvakadaro uye takawana ~ 130k pasekondi. Takaedza kutsiva mabasa akajairwa ekushanda nejson, asi kuita hakuna kunaka. Injini yeV8 inofanirwa kuve yakagadziridzwa zvakanaka kune aya mashandisirwo.

Takashanda nekutengeserana, tokens, uye mabhuroko kuburikidza nemakirasi. Paunenge uchigadzira makirasi akadaro, kuita kwakadonha kaviri, izvo zvinoratidza kuti OOP haina kukodzera isu. Ndaifanira kunyorazve zvese kuti zvinyatsoshanda.

Kurekodha mu database

Pakutanga, Redis yakasarudzwa kuti ichengetedze data seimwe yemhinduro dzakanyanya kugadzirwa inogutsa zvatinoda: kiyi-kukosha kuchengetedza, kushanda nematafura ehashi, seti. Takatangisa redis-benchmark uye takawana ~ 80k mashandiro pasekondi mune 1 pipelining mode.

Nekuita kwepamusoro, isu takarongedza Redis zvakanyanya kunaka:

  • A unix socket yekubatanidza yakatangwa.
  • Isu takaremara kuchengetedza nyika ku diski (nekuda kwekuvimbika, unogona kuseta replica uye chengetedza ku diski mune imwe Redis yakasiyana).

MuRedis, dziva itafura yehashi nekuti isu tinofanirwa kukwanisa kudzoreredza zvese zvekutengesa mumubvunzo mumwe uye kudzima kutengeserana chimwe nechimwe. Takaedza kushandisa rondedzero yenguva dzose, asi inononoka pakuburitsa runyorwa rwese.

Kana uchishandisa yakajairwa NodeJS, maraibhurari eRedis akawana kuita kwe18k transaction pasekondi. Speed ​​yakadonha ka9.

Sezvo bhenji rakatiratidza mikana yainyatsojeka kashanu, takatanga kukwenenzvera. Takachinja raibhurari kuita ioredis uye takawana kuita kwe5k pasekondi. Isu takawedzera kutengeserana imwe neimwe tichishandisa iyo `hset` murairo. Saka isu taive tichigadzira yakawanda mibvunzo muRedis. Zano rakamuka rekubatanidza kutengeserana kuita mabhechi uye kuvatumira nemurairo mumwe `hmset`. Mhedzisiro ndeye 25k pasekondi.

Nezvikonzero zvakati wandei, zvatichatsanangura pazasi, tinoshanda nedata tichishandisa `Buffer` uye, sezvazvinozoitika, kana ukaishandura kuita mavara (`buffer.toString('hex')`) usati wanyora, unogona kuwana imwezve. performance. Saka, kumhanya kwakawedzera kusvika 35k pasekondi. Panguva ino, takasarudza kumisa imwe optimization.

Taifanira kuchinjira kune binary protocol nekuti:

1. Iyo sisitimu inowanzoverengera hashes, siginecha, nezvimwe, uye nekuda kweizvi inoda data mu `Buffer.

2. Kana yatumirwa pakati pemasevhisi, data yebhinari inorema zvishoma pane zvinyorwa. Semuenzaniso, pakutumira block ine 1 miriyoni yekutengeserana, iyo data mune zvinyorwa inogona kutora anopfuura 300 megabytes.

3. Kugara uchishandura data kunokanganisa mashandiro.

Naizvozvo, isu takatora sehwaro yedu yebhinari protocol yekuchengetedza uye kutumira data, yakagadziridzwa pahwaro hweinoshamisa `binary-data` raibhurari.

Nekuda kweizvozvo, takawana zvinotevera data zvimiro:

-Kutengeserana

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

β€” Chiratidzo

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

β€”Block

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

Nemirairo yakajairika `BD.encode(block, Protocol).slice();` uye `BD.decode(buffer, Protocol)` tinoshandura iyo data kuita `Buffer` yekuchengetedza muRedis kana kutumira kune imwe node uye kudzoreredza iyo data. data back.

Isu tinewo maviri mabhinari maprotocol ekufambisa data pakati pemasevhisi:

-Protocol yekudyidzana nePlasma Node kuburikidza neunix 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)
  }
  ```

kupi:

  • `type` - chiito chinofanira kuitwa, semuenzaniso, 1 - sendTransaction, 2 - getTransaction;
  • `payload` - data inoda kupfuudzwa kune yakakodzera basa;
  • `messageId` - meseji id kuitira kuti mhinduro izivikanwe.

- Protocol yekudyidzana pakati pemanodhi

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

kupi:

  • `code` - meseji kodhi, semuenzaniso 6 - PREPARE_NEW_BLOCK, 7 - BLOCK_VALID, 8 - BLOCK_COMMIT;
  • `versionProtocol` - protocol vhezheni, sezvo node dzine shanduro dzakasiyana dzinogona kusimudzwa pane network uye dzinogona kushanda zvakasiyana;
  • `seq` - chiziviso chemeseji;
  • `countChunk` ΠΈ `chunkNumber` zvinodiwa pakutsemura mameseji makuru;
  • `kureba` ΠΈ `payload` kureba uye data pachayo.

Sezvo isu takafanotaipa iyo data, yekupedzisira sisitimu inokurumidza kupfuura raibhurari yaEthereum `rlp`. Nehurombo, isu hatisati takwanisa kuiramba, sezvo zvichidikanwa kupedzisa chibvumirano chakangwara, chatinoronga kuita mune ramangwana.

Kana takakwanisa kusvika paspeed 35 000 matransaction pasekondi, isu tinodawo kuzvigadzirisa munguva yakakwana. Sezvo nguva yenguva yekugadzira block inotora masekondi makumi matatu, isu tinofanirwa kuisa mu block 1 000 000 kutengeserana, zvinoreva kutumira zvimwe 100 MB yedata.

Pakutanga, takashandisa raibhurari ye `ethereumjs-devp2p` kutaurirana pakati pemanodhi, asi yaisakwanisa kubata data rakawanda kudaro. Nekuda kweizvozvo, takashandisa iyo `ws` raibhurari uye nekugadzirisa kutumira binary data kuburikidza newebhusocket. Zvechokwadi, takasanganawo nematambudziko pakutumira mapepa makuru e data, asi takaaparadzanisa kuva chunks uye ikozvino matambudziko aya aenda.

Zvakare kugadzira muti weMerkle uye kuverenga iyo hashi 1 000 000 kutengeserana kunoda nezve 10 masekonzi ekuverengera kunoenderera. Munguva iyi, kubatana nemanode ese kunokwanisa kutyora. Zvakasarudzwa kufambisa iyi kuverenga kune imwe tambo yakasiyana.

Mhedziso:

Muchokwadi, zvatinowana hazvisi zvitsva, asi nekuda kwechimwe chikonzero nyanzvi dzakawanda dzinokanganwa nezvazvo padzinogadzira.

  • Kushandisa Functional Programming pachinzvimbo cheObject-Oriented Programming inovandudza chibereko.
  • Iyo monolith yakashata kupfuura yekuvaka sevhisi kune inobereka NodeJS system.
  • Kushandisa `worker_threads` pakuremedza computation kunonatsiridza kuita kwesystem, kunyanya kana uchibata ne/o mashandiro.
  • unix socket yakanyanya kugadzikana uye nekukurumidza kupfuura http zvikumbiro.
  • Kana iwe uchida kukurumidza kuendesa data hombe pamusoro petiweki, zviri nani kushandisa websockets uye kutumira bhinari data, yakakamurwa kuita chunks, iyo inogona kuendeswa mberi kana isingasviki, uye yozobatanidzwa mune imwe meseji.

Tinokukoka kuti ushanyire GitHub chirongwa: https://github.com/opporty-com/Plasma-Cash/tree/new-version

Nyaya yakanyorwa pamwe chete na Alexander Nashivan, mugadziri mukuru Nhoroondo ye Clever Solution Inc.

Source: www.habr.com

Voeg