Fitsapana ho an'ny daholobe: Vahaolana ho an'ny fiainana manokana sy ny fampitomboana ny Ethereum

Blockchain dia teknôlôjia manavao izay mampanantena ny hanatsara ny lafiny maro amin'ny fiainan'ny olombelona. Mamindra ny dingana sy ny vokatra tena izy ao amin'ny habaka nomerika, miantoka ny hafainganam-pandeha sy ny fahatokisana ny fifampiraharahana ara-bola, mampihena ny vidiny, ary mamela anao hamorona fampiharana DAPP maoderina amin'ny alàlan'ny fifanarahana marani-tsaina amin'ny tambajotra tsy miankina.

Raha jerena ny tombontsoa maro sy ny fampiharana isan-karazany amin'ny blockchain, dia toa mahagaga fa tsy mbola niditra tao amin'ny indostria rehetra io teknolojia mampanantena io. Ny olana dia ny tsy fisian'ny scalability ny blockchains decentralisé moderna. Ny Ethereum dia miompana amin'ny fifanakalozana 20 isan-tsegondra, izay tsy ampy hanomezana ny filan'ny orinasa mavitrika ankehitriny. Mandritra izany fotoana izany, ireo orinasa mampiasa ny teknolojia blockchain dia misalasala ny handao ny Ethereum noho ny fiarovana avo lenta amin'ny hacking sy ny tsy fahombiazan'ny tambajotra.

Mba hiantohana ny fitsinjaram-pahefana, ny fiarovana ary ny scalability ao amin'ny blockchain, ka mamaha ny Scalability Trilemma, ny ekipa fampandrosoana Fahafahana namorona ny Plasma Cash, rojo sampana misy fifanarahana marani-tsaina sy tambajotra tsy miankina mifototra amin'ny Node.js, izay mamindra tsindraindray ny fanjakany amin'ny rojo faka (Ethereum).

Fitsapana ho an'ny daholobe: Vahaolana ho an'ny fiainana manokana sy ny fampitomboana ny Ethereum

Ny dingana lehibe amin'ny Plasma Cash

1. Antsoin'ny mpampiasa ny asa fifanarahana marani-tsaina hoe 'deposito', ampidiriny ao ny habetsaky ny ETH izay tiany hapetraka ao amin'ny token'ny Plasma Cash. Ny fiasan'ny fifanarahana marani-tsaina dia mamorona famantarana ary miteraka hetsika momba izany.

2. Ny node Plasma Cash nisoratra anarana tamin'ny hetsika fifanarahana marani-tsaina dia mahazo hetsika momba ny famoronana petra-bola ary ampio fifampiraharahana amin'ny famoronana famantarana ho an'ny dobo.

3. Tsindraindray, ny nodes Plasma Cash manokana dia maka ny fifanakalozana rehetra amin'ny dobo (hatramin'ny 1 tapitrisa) ary mamorona sakana avy amin'izy ireo, kajy ny hazo Merkle ary, araka izany, ny hash. Ity sakana ity dia alefa any amin'ny nodes hafa ho fanamarinana. Ny nodes dia manamarina raha manan-kery ny hash Merkle ary manan-kery ny fifampiraharahana (ohatra, raha tompony ny mpandefa ny token). Aorian'ny fanamarinana ny sakana, ny node dia miantso ny `submitBlock` asa amin'ny fifanarahana marani-tsaina, izay mitahiry ny laharan'ny sakana sy ny hash Merkle amin'ny rojo vy. Ny fifanarahana marani-tsaina dia miteraka hetsika iray manondro ny fanampiana mahomby amin'ny sakana iray. Esorina amin'ny dobo ny fifampiraharahana.

4. Ireo nodes izay mandray ny hetsika fandefasana sakana dia manomboka mampihatra ny fifampiraharahana izay nampidirina tamin'ny sakana.

5. Amin'ny fotoana iray, te-hanaisotra azy amin'ny Plasma Cash ny tompony (na tsy tompon'ny) ny famantarana. Mba hanaovana izany, dia miantso ny `startExit` asa, mampita ao aminy ny vaovao momba ny 2 farany ny varotra amin'ny famantarana, izay manamafy fa izy no tompon'ny famantarana. Ny fifanarahana marani-tsaina, amin'ny fampiasana ny hash Merkle, dia manamarina ny fisian'ny fifampiraharahana amin'ny sakana ary mandefa ny mari-pamantarana ho an'ny fisintonana, izay hitranga ao anatin'ny tapa-bolana.

6. Raha toa ka nisy fandikan-dalàna ny hetsika fanalana mari-pamantarana (lany taorian'ny nanombohan'ny fomba fisintonana ilay mari-pamantarana na efa an'olon-kafa ilay mari-pamantarana talohan'ny fisintahana), ny tompon'ilay mari-pamantarana dia afaka mandà ny fisintonana ao anatin'ny tapa-bolana.

Fitsapana ho an'ny daholobe: Vahaolana ho an'ny fiainana manokana sy ny fampitomboana ny Ethereum

Ny fiainana manokana dia vita amin'ny fomba roa

1. Ny rojo fakany dia tsy mahalala na inona na inona momba ny fifampiraharahana izay vokarina sy ampitaina ao anatin'ny rojo zaza. Mijanona ho an'ny besinimaro ny fampahalalana momba izay nametraka sy nanaisotra ny ETH tao amin'ny Plasma Cash.

2. Ny rojo zaza dia mamela ny fifampiraharahana tsy mitonona anarana mampiasa zk-SNARKs.

Teknolojia stack

  • NodeJS
  • Redis
  • Etherium
  • Sild

fitiliana

Nandritra ny fampivoarana ny Plasma Cash dia nanandrana ny hafainganam-pandehan'ny rafitra izahay ary nahazo ireto valiny manaraka ireto:

  • hatramin'ny 35 isan-tsegondra no ampiana ao anaty dobo;
  • hatramin'ny 1 ny fifampiraharahana azo tehirizina anaty sakana iray.

Ny fitsapana dia natao tamin'ireto mpizara 3 manaraka ireto:

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

2. AMD Ryzen 7 1700X Octa-Core “Summit Ridge” (Zen), SATA SSD – 500 GB, 64 GB DDR4 RAM
Natsangana ny node Ropsten testnet ETH.
3 manamarina ny Plasma Cash node natsangana.

3. Intel Core i9-9900K Octa-Core incl. NVMe SSD - 1 TB, 64 GB DDR4 RAM
Natsangana ny node fandefasana Plasma Cash 1.
3 manamarina ny Plasma Cash node natsangana.
Nisy andrana natomboka mba hanampiana ny fifanakalozana amin'ny tambajotra Plasma Cash.

Total: 10 Plasma Cash nodes ao anaty tambajotra tsy miankina.

Fitsapana 1

Misy fetra 1 tapitrisa ny varotra isaky ny sakana. Noho izany, ny varotra 1 tapitrisa dia latsaka ao anaty blocs 2 (satria ny rafitra dia mahavita mandray anjara amin'ny fifampiraharahana ary mandefa azy ireo rehefa alefa).


Toetra voalohany: bloc farany #7; 1 tapitrisa ny fifanakalozana sy ny mari-pamantarana dia voatahiry ao anaty angon-drakitra.

00:00 - fanombohana ny script famokarana varotra
01:37 - Nisy fifampiraharahana 1 tapitrisa ary nanomboka ny fandefasana ny node
01:46 - nandefa ny node dia naka ny fifanakalozana 240k tao amin'ny dobo sy ny sakana #8. Hitantsika ihany koa fa ny fifanakalozana 320k dia ampiana ao anaty dobo ao anatin'ny 10 segondra
01:58 — voasonia ny sakana #8 ary alefa ho fanamarinana
02:03 - ny sakana #8 dia voamarina ary ny fiasan'ny `submitBlock` amin'ny fifanarahana marani-tsaina dia antsoina miaraka amin'ny hash Merkle sy ny laharan'ny sakana
02:10 - vita ny script demo, izay nandefa fifampiraharahana 1 tapitrisa tao anatin'ny 32 segondra
02:33 - nanomboka nahazo vaovao ny nodes fa nampidirina tamin'ny rojo fakany ny sakana #8, ary nanomboka nanao fifampiraharahana 240k
02:40 - 240k ny fifanakalozana dia nesorina tao amin'ny dobo, izay efa ao amin'ny bloc #8
02:56 - ny node mandefa dia naka ny fifampiraharahana 760k sisa tao amin'ny dobo ary nanomboka nikajy ny hash Merkle sy ny fanakanana sonia #9
03:20 - ny node rehetra dia misy fifanakalozana sy famantarana 1 tapitrisa 240k
03:35 — nosoniavina ny sakana #9 ary alefa ho fanamarinana amin'ny node hafa
03:41 - nisy hadisoana tamin'ny tambajotra
04:40 — tapitra ny fotoana fiandrasana ny fanamarinana sakana #9
04:54 - ny node mandefa dia naka ny fifampiraharahana 760k sisa tao amin'ny dobo ary nanomboka nikajy ny hash Merkle sy ny fanakanana sonia #9
05:32 — nosoniavina ny sakana #9 ary alefa ho fanamarinana amin'ny node hafa
05:53 — ny sakana #9 dia voamarina ary alefa any amin'ny rojo faka
06:17 - nanomboka nahazo vaovao ny nodes fa nampidirina tamin'ny rojo fakany ny sakana #9 ary nanomboka nanao fifampiraharahana 760k
06:47 - nesorin'ny dobo ny fifampiraharahana ao amin'ny sakana #9
09:06 - ny node rehetra dia misy fifanakalozana sy famantarana 2 tapitrisa

Fitsapana 2

Misy fetra 350k isaky ny sakana. Vokatr'izany dia manana blocs 3 izahay.


Toetra voalohany: bloc farany #9; 2 tapitrisa ny varotra sy ny mari-pamantarana dia voatahiry ao anaty angon-drakitra

00:00 — efa natomboka ny script generation transaction
00:44 - Nisy fifampiraharahana 1 tapitrisa ary nanomboka ny fandefasana ny node
00:56 - nandefa ny node dia naka ny fifanakalozana 320k tao amin'ny dobo sy ny sakana #10. Hitantsika ihany koa fa ny fifanakalozana 320k dia ampiana ao anaty dobo ao anatin'ny 10 segondra
01:12 — voasonia ny sakana #10 ary alefa any amin'ny node hafa ho fanamarinana
01:18 - vita ny script demo, izay nandefa fifampiraharahana 1 tapitrisa tao anatin'ny 34 segondra
01:20 — ny sakana #10 dia voamarina ary alefa any amin'ny rojo faka
01:51 - Ny node rehetra dia nahazo fampahalalana avy amin'ny rojo fakany izay nampiana fanakanana #10 ary nanomboka nampihatra ny fifampiraharahana 320k
02:01 - Ny dobo dia voadio ho an'ny fifanakalozana 320k izay nampiana ho fanakanana ny #10
02:15 - nandefa ny node dia naka ny fifanakalozana 350k tao amin'ny dobo sy ny sakana #11
02:34 — nosoniavina ny sakana #11 ary alefa any amin'ny node hafa ho fanamarinana
02:51 — ny sakana #11 dia voamarina ary alefa any amin'ny rojo faka
02:55 - ny node farany nahavita ny fifampiraharahana tamin'ny sakana #10
10:59 — naharitra ela ny fifampiraharahana tamin'ny fandefasana ny sakana #9 tao amin'ny rojo fakany, saingy vita izany ary nahazo vaovao momba izany ny node rehetra ary nanomboka nanao fifampiraharahana 350k
11:05 - Ny dobo dia voadio ho an'ny fifanakalozana 320k izay nampiana ho fanakanana ny #11
12:10 - ny node rehetra dia misy fifanakalozana sy famantarana 1 tapitrisa 670k
12:17 - ny node mandefa dia naka ny fifampiraharahana 330k tao amin'ny dobo ary ny sakana #12
12:32 — nosoniavina ny sakana #12 ary alefa any amin'ny node hafa ho fanamarinana
12:39 — ny sakana #12 dia voamarina ary alefa any amin'ny rojo faka
13:44 - Ny node rehetra dia nahazo vaovao avy amin'ny rojo fakany izay nampiana ny sakana #12 ary nanomboka nampihatra fifanakalozana 330k
14:50 - ny node rehetra dia misy fifanakalozana sy famantarana 2 tapitrisa

Fitsapana 3

Ao amin'ny lohamilina voalohany sy faharoa, node iray manamarina no nosoloina node mandefa.


Fanjakana voalohany: sakana farany #84; 0 transactions sy tokens voatahiry ao amin'ny tahiry

00:00 - scripts 3 no natomboka izay miteraka sy mandefa fifampiraharahana 1 tapitrisa tsirairay avy
01:38 - 1 tapitrisa ny fifampiraharahana ary nanomboka ny fandefasana ny node #3
01:50 — nandefa ny node #3 naka 330k ny fifampiraharahana tao amin'ny dobo ary ny bloc #85 (f21). Hitantsika ihany koa fa ny fifampiraharahana 350k dia ampiana ao anaty dobo ao anatin'ny 10 segondra
01:53 - 1 tapitrisa ny fifampiraharahana ary nanomboka ny fandefasana ny node #1
01:50 — nandefa ny node #3 naka 330k ny fifampiraharahana tao amin'ny dobo ary ny bloc #85 (f21). Hitantsika ihany koa fa ny fifampiraharahana 350k dia ampiana ao anaty dobo ao anatin'ny 10 segondra
02:01 - mandefa ny node #1 dia naka 250k ny fifampiraharahana tao amin'ny dobo ary ny sakana #85 (65e)
02:06 — nosoniavina ny sakana #85 (f21) ary alefa any amin'ny node hafa ho fanamarinana
02:08 — script demo an'ny server #3, izay nandefa fifampiraharahana 1 tapitrisa tao anatin'ny 30 segondra, nahavita niasa
02:14 — bloc #85 (f21) dia voamarina ary alefa any amin'ny rojo faka
02:19 — nosoniavina ny sakana #85 (65e) ary alefa any amin'ny node hafa ho fanamarinana
02:22 - 1 tapitrisa ny fifampiraharahana ary nanomboka ny fandefasana ny node #2
02:27 — bloc #85 (65e) voamarina ary nalefa tany amin'ny rojo faka
02:29 — nandefa node #2 naka 111855 transactions from the pool and forms block #85 (256).
02:36 — nosoniavina ny sakana #85 (256) ary alefa any amin'ny node hafa ho fanamarinana
02:36 — script demo an'ny server #1, izay nandefa fifampiraharahana 1 tapitrisa tao anatin'ny 42.5 segondra, nahavita niasa
02:38 — ny sakana #85 (256) dia voamarina ary alefa any amin'ny rojo faka
03:08 - ny script server #2 dia vita, izay nandefa fifampiraharahana 1 tapitrisa tao anatin'ny 47 segondra
03:38 - Ny nodes rehetra dia nahazo fampahalalana avy amin'ny rojo fakany izay manakana ny #85 (f21), #86(65e), #87(256) dia nampiana ary nanomboka nampihatra ny fifanakalozana 330k, 250k, 111855
03:49 - nesorina tamin'ny 330k, 250k, 111855 ny dobo izay nampidirina tamin'ny sakana #85 (f21), #86(65e), #87(256)
03:59 — nandefa ny node #1 naka 888145 transactions avy amin'ny dobo sy ny forms block #88 (214), submit node #2 dia naka 750k transactions avy amin'ny dobo ary ny forms block #88 (50a), ny submit node #3 dia naka 670k transactions avy amin'ny ny dobo sy ny endrika sakana #88 (d3b)
04:44 — voasonia ny sakana #88 (d3b) ary alefa any amin'ny node hafa ho fanamarinana
04:58 — nosoniavina ny sakana #88 (214) ary alefa any amin'ny node hafa ho fanamarinana
05:11 — nosoniavina ny sakana #88 (50a) ary alefa any amin'ny node hafa ho fanamarinana
05:11 — bloc #85 (d3b) dia voamarina ary alefa any amin'ny rojo faka
05:36 — ny sakana #85 (214) dia voamarina ary alefa any amin'ny rojo faka
05:43 - Ny node rehetra dia nahazo fampahalalana avy amin'ny rojo fakany izay manakana ny #88 (d3b), #89(214) dia nampiana ary manomboka mampihatra ny 670k, 750k ny fifanakalozana
06:50 — noho ny tsy fahombiazan'ny fifandraisana dia tsy voamarina ny sakana #85 (50a).
06:55 — nandefa node #2 naka 888145 fifampiraharahana avy amin'ny dobo sy ny endrika sakana #90 (50a)
08:14 — nosoniavina ny sakana #90 (50a) ary alefa any amin'ny node hafa ho fanamarinana
09:04 — ny sakana #90 (50a) dia voamarina ary alefa any amin'ny rojo faka
11:23 - Ny node rehetra dia nahazo fampahalalana avy amin'ny rojo fakany izay nanakana ny #90 (50a) ary nanomboka nampihatra ny fifanakalozana 888145. Nandritra izany fotoana izany, ny mpizara #3 dia efa nampihatra ny fifampiraharahana avy amin'ny sakana #88 (d3b), #89(214)
12:11 - foana ny dobo rehetra
13:41 - ny node rehetra amin'ny server #3 dia misy fifanakalozana sy marika 3 tapitrisa
14:35 - ny node rehetra amin'ny server #1 dia misy fifanakalozana sy marika 3 tapitrisa
19:24 - ny node rehetra amin'ny server #2 dia misy fifanakalozana sy marika 3 tapitrisa

vato misakana

Nandritra ny fampivoarana ny Plasma Cash dia nisedra ireto olana manaraka ireto izahay, izay novahanay tsikelikely sy novahanay:

1. Fifandirana eo amin'ny fifandraisan'ny fiasan'ny rafitra isan-karazany. Ohatra, ny asan'ny fampidirana ny fifampiraharahana amin'ny dobo dia nanakana ny asa fandefasana sy fanamarinana ny sakana, ary ny mifamadika amin'izany, izay nitarika ny fihenan'ny hafainganam-pandeha.

2. Tsy fantatra mazava avy hatrany ny fomba handefasana fifampiraharahana marobe nefa manamaivana ny vidin'ny famindrana angon-drakitra.

3. Tsy fantatra mazava ny fomba sy ny toerana hitahirizana angon-drakitra mba hahazoana vokatra avo lenta.

4. Tsy mazava ny fomba fandaminana tambajotra eo anelanelan'ny nodes, satria ny haben'ny sakana iray misy fifanakalozana 1 tapitrisa dia mahatratra 100 MB.

5. Ny fiasana amin'ny fomba tokana misy kofehy dia manapaka ny fifandraisana eo amin'ny nodes rehefa misy kajikajy lava (ohatra, ny fananganana hazo Merkle sy ny kajy ny hash).

Ahoana no niatrehantsika izany rehetra izany?

Ny dikan-teny voalohany amin'ny Plasma Cash node dia karazana fitambarana izay afaka manao ny zava-drehetra amin'ny fotoana iray ihany: manaiky ny fifampiraharahana, mametraka ary manamarina sakana, ary manome API hidirana amin'ny angona. Satria ny NodeJS dia manana kofehy tokana, ny asa kajy hazo Merkle mavesatra dia nanakana ny fiasa add transaction. Nahita safidy roa izahay hamahana ity olana ity:

1. Mandrosoa dingana NodeJS maromaro, izay samy manao asa manokana.

2. Mampiasà worker_threads ary afindrao amin'ny kofehy ny fanatanterahana ny ampahany amin'ny code.

Vokatr'izany dia nampiasa ny safidy roa izahay tamin'ny fotoana iray: nozarainay ara-dalàna ny node iray ho faritra 3 izay afaka miasa misaraka, fa miaraka amin'ny fotoana iray ihany.

1. Node fandefasana, izay manaiky ny fifampiraharahana ao anaty dobo ary mamorona sakana.

2. Node manamarina izay manamarina ny fahamarinan'ny node.

3. API node - manome API hidirana angona.

Amin'ity tranga ity, azonao atao ny mifandray amin'ny node tsirairay amin'ny alàlan'ny socket unix mampiasa cli.

Nafindranay tao anaty kofehy mitokana ny asa mavesatra, toy ny kajy ny hazo Merkle.

Noho izany, nahavita niasa ara-dalàna ny fiasan'ny Plasma Cash rehetra miaraka ary tsy misy tsy fahombiazana.

Raha vao niasa ny rafitra dia nanomboka nanandrana ny hafainganam-pandeha izahay ary, indrisy, nahazo valiny tsy mahafa-po: 5 transactions isan-tsegondra ary hatramin'ny 000 transactions isaky ny sakana. Tsy maintsy nieritreritra aho hoe inona no tsy nampiharina.

Hanombohana dia nanomboka nanandrana ny fomba fifandraisana tamin'ny Plasma Cash izahay mba hahitana ny fahaiza-manaon'ny rafitra. Nanoratra izahay teo aloha fa ny Plasma Cash node dia manome interface tsara socket unix. Tamin'ny voalohany dia mifototra amin'ny lahatsoratra. Ny zavatra json dia nalefa tamin'ny fampiasana `JSON.parse()` sy `JSON.stringify()`.

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

Norefesinay ny hafainganam-pandehan'ny zavatra toy izany ary hitanay ~ 130k isan-tsegondra. Niezaka ny hanolo ny fiasa mahazatra amin'ny fiasana amin'ny json izahay, saingy tsy nihatsara ny fampisehoana. Ny motera V8 dia tsy maintsy amboarina tsara amin'ireo asa ireo.

Niasa tamin'ny fifampiraharahana, famantarana ary sakana tamin'ny kilasy izahay. Rehefa mamorona kilasy toy izany dia nihena in-2 ny fampisehoana, izay manondro fa tsy mety amintsika ny OOP. Tsy maintsy namerina nanoratra ny zava-drehetra aho tamin'ny fomba fiasa tsotra.

Hiverina any amin'ny database

Tany am-boalohany, i Redis dia nofidina ho an'ny fitahirizana angon-drakitra ho iray amin'ireo vahaolana mamokatra indrindra izay mahafeno ny fepetra takianay: fitahirizana sanda manan-danja, miasa amin'ny latabatra hash, sets. Nanokatra redis-benchmark izahay ary nahazo ~ 80k asa isan-tsegondra tamin'ny fomba 1 pipelining.

Ho an'ny fampisehoana avo lenta, dia nanitsy tsara kokoa an'i Redis izahay:

  • Nisy fifandraisana socket unix napetraka.
  • Nofoanana ny fitehirizana ny fanjakana amin'ny kapila (mba azo itokisana dia azonao atao ny manangana kopia ary mitahiry ao anaty kapila amin'ny Redis misaraka).

Ao amin'ny Redis, ny dobo dia latabatra tenifototra satria mila maka ny fifanakalozana rehetra amin'ny fangatahana iray isika ary mamafa ny fifampiraharahana tsirairay. Nanandrana nampiasa lisitra mahazatra izahay, saingy miadana kokoa izany rehefa mamoaka ny lisitra manontolo.

Rehefa mampiasa NodeJS mahazatra, ny tranombokin'i Redis dia nahatratra 18k isan-tsegondra. Nidina in-9 ny hafainganam-pandeha.

Satria nasehon'ilay benchmark taminay fa avo 5 heny ny fahafaha-manao, dia nanomboka nanatsara izahay. Nanova ny tranomboky ho ioredis izahay ary nahazo fahombiazana 25k isan-tsegondra. Nampianay fifampiraharahana tsirairay tamin'ny alalan'ny baiko `hset`. Noho izany dia niteraka fanontaniana be dia be tao Redis izahay. Nipoitra ny hevitra hanambatra ny fifampiraharahana ho andiany ary handefa azy ireo amin'ny baiko iray `hmset`. Ny vokatra dia 32k isan-tsegondra.

Noho ny antony maro, izay hofaritanay etsy ambany, dia miara-miasa amin'ny angona mampiasa `Buffer` izahay ary raha ny hita, raha mamadika azy ho lahatsoratra (`buffer.toString('hex')`) alohan'ny hanoratana dia afaka mahazo fanampiny ianao fampisehoana. Araka izany, niakatra ho 35k isan-tsegondra ny hafainganam-pandehany. Amin'izao fotoana izao, nanapa-kevitra ny hampiato ny fanatsarana bebe kokoa izahay.

Tsy maintsy nivadika tamin'ny protocol binary izahay satria:

1. Matetika ny rafitra no manao kajy ny hash, sonia, sns., ary noho izany dia mila angona ao amin'ny `Buffer.

2. Rehefa alefa eo anelanelan'ny serivisy, ny angona binary dia mavesatra noho ny lahatsoratra. Ohatra, rehefa mandefa sakana misy fifampiraharahana 1 tapitrisa, ny angon-drakitra ao amin'ny lahatsoratra dia afaka maka mihoatra ny 300 megabytes.

3. Misy fiantraikany amin'ny fahombiazana ny fanovana tsy tapaka angona.

Noho izany, noraisinay ho fototry ny protocol binary manokana izahay amin'ny fitehirizana sy fandefasana angon-drakitra, novolavolaina tamin'ny fototry ny tranomboky `binary-data` mahafinaritra.

Vokatr'izany dia nahazo ireto rafitra data manaraka ireto izahay:

— Transaction

  ```json
  {
    prevHash: BD.types.buffer(20),
    prevBlock: BD.types.uint24le,
    tokenId: BD.types.string(null),
    type: BD.types.uint8,
    newOwner: BD.types.buffer(20),
    dataLength: BD.types.uint24le,
    data: BD.types.buffer(({current}) => current.dataLength),
    signature: BD.types.buffer(65),
    hash: BD.types.buffer(32),
    blockNumber: BD.types.uint24le,
    timestamp: BD.types.uint48le,
  }
  ```

— Token

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

—Boka

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

Miaraka amin'ny baiko mahazatra `BD.encode(block, Protocol).slice();` ary `BD.decode(buffer, Protocol)` dia mamadika ny angona ho `Buffer` ho tehirizina ao amin'ny Redis na alefa any amin'ny node hafa ary maka ny data miverina.

Manana protocole binary 2 ihany koa izahay amin'ny famindrana angona eo amin'ny serivisy:

- Protocol hifaneraserana amin'ny Plasma Node amin'ny alàlan'ny socket unix

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

izay:

  • `karazana` — ny hetsika hatao, ohatra, 1 — sendTransaction, 2 — getTransaction;
  • `payload` - angon-drakitra mila ampitaina amin'ny asa sahaza azy;
  • `messageId` - ID hafatra mba ho fantatra ny valiny.

- Protocol ho an'ny fifandraisana eo amin'ny nodes

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

izay:

  • `kaody` — kaody hafatra, ohatra 6 — PREPARE_NEW_BLOCK, 7 — BLOCK_VALID, 8 — BLOCK_COMMIT;
  • `versionProtocol` - dikan-teny protocole, satria ny nodes misy dikan-teny samihafa dia azo atsangana amin'ny tambajotra ary afaka miasa amin'ny fomba hafa izy ireo;
  • `seq` - famantarana hafatra;
  • `countChunk` и `chunkNumber` ilaina amin'ny fizarana hafatra lehibe;
  • `lavany` и `payload` halavany sy ny angon-drakitra mihitsy.

Satria nosoratanay mialoha ny angon-drakitra, ny rafitra farany dia haingana lavitra noho ny tranomboky `rlp` Ethereum. Indrisy anefa fa tsy mbola afaka nandà izany izahay, satria ilaina ny mamarana ny fifanarahana marani-tsaina, izay kasainay hatao amin'ny ho avy.

Raha nahavita nahatratra ny hafainganam-pandeha izahay 35 000 ny fifanakalozana isan-tsegondra, mila manodina azy ireo amin'ny fotoana tsara indrindra ihany koa isika. Satria maharitra 30 segondra ny fotoana fananganana sakana eo ho eo, mila ampidirintsika ao amin'ny sakana 1 000 000 fifampiraharahana, izay midika hoe fandefasana bebe kokoa 100 Takelaka data MB.

Tamin'ny voalohany dia nampiasa ny tranomboky `ethereumjs-devp2p` izahay mba hifandraisana eo amin'ny nodes, saingy tsy nahazaka angona be loatra. Vokatr'izany dia nampiasa ny tranomboky `ws` izahay ary nanamboatra ny fandefasana angona binary amin'ny alàlan'ny websocket. Mazava ho azy fa nisedra olana ihany koa izahay tamin'ny fandefasana fonosana angon-drakitra lehibe, saingy nozarainay ho tapatapaka izy ireo ary tsy misy intsony ireo olana ireo.

Manangana hazo Merkle koa ary manao kajy ny hash 1 000 000 Transakta mitaky momba 10 segondra kajy mitohy. Mandritra izany fotoana izany, ny fifandraisana amin'ny nodes rehetra dia afaka tapaka. Tapa-kevitra ny hamindra ity kajy ity amina kofehy misaraka.

fehin-kevitra:

Raha ny marina, tsy vaovao ny zavatra hitanay, fa noho ny antony maro dia manadino azy ireo ny manam-pahaizana maro rehefa mivoatra.

  • Ny fampiasana ny Functional Programming fa tsy ny Object-Oriented Programming dia manatsara ny vokatra.
  • Ny monolith dia ratsy noho ny maritrano serivisy ho an'ny rafitra NodeJS mamokatra.
  • Ny fampiasana `worker_threads` ho an'ny kajy mavesatra dia manatsara ny fandraisan'anjaran'ny rafitra, indrindra rehefa miatrika asa i/o.
  • Ny socket unix dia miorina sy haingana kokoa noho ny fangatahana http.
  • Raha mila mamindra haingana ny angona lehibe amin'ny tambajotra ianao, dia tsara kokoa ny mampiasa websockets ary mandefa angon-drakitra mimari-droa, mizara ho sombiny, izay azo ampitaina raha tsy tonga izy ireo, ary avy eo mitambatra ho hafatra iray.

Manasa anao hitsidika GitHub tetikasa: https://github.com/opporty-com/Plasma-Cash/tree/new-version

Ny lahatsoratra dia niara-nanoratra ny Alexander Nashivan, mpamorona zokiolona Ny orinasa Clever Solution Inc.

Source: www.habr.com

Add a comment