Tès Piblik: Yon Solisyon pou Konfidansyalite ak Évolutivité sou Ethereum

Blockchain se yon teknoloji inovatè ki pwomèt amelyore anpil domèn nan lavi moun. Li transfere pwosesis reyèl ak pwodwi nan espas dijital la, asire vitès ak fyab nan tranzaksyon finansye, diminye pri yo, epi tou li pèmèt ou kreye aplikasyon DAPP modèn lè l sèvi avèk kontra entelijan nan rezo desantralize.

Etandone anpil benefis ak aplikasyon divès blockchain, li ka sanble etone ke teknoloji pwomèt sa a poko fè wout li nan chak endistri. Pwoblèm lan se ke blockchains modèn desantralize manke évolutivité. Ethereum trete apeprè 20 tranzaksyon pou chak segonn, ki pa ase pou satisfè bezwen biznis dinamik jodi a. An menm tan an, konpayi ki itilize teknoloji blockchain yo ezite abandone Ethereum akòz wo degre li yo nan pwoteksyon kont piratage ak echèk rezo.

Pou asire desantralizasyon, sekirite ak évolutivité nan blockchain a, kidonk rezoud Trilemma Scalability, ekip devlopman an. Opòtinite te kreye Plasma Cash, yon chèn sipòtè ki gen ladann yon kontra entelijan ak yon rezo prive ki baze sou Node.js, ki detanzantan transfere eta li nan chèn rasin lan (Ethereum).

Tès Piblik: Yon Solisyon pou Konfidansyalite ak Évolutivité sou Ethereum

Pwosesis kle nan Plasma Cash

1. Itilizatè a rele fonksyon kontra entelijan 'depo', pase ladan l kantite ETH ke li vle depoze nan siy Plasma Cash la. Fonksyon kontra entelijan kreye yon siy epi jenere yon evènman sou li.

2. Nœuds Plasma Cash ki abònman nan evènman kontra entelijan resevwa yon evènman sou kreye yon depo epi ajoute yon tranzaksyon sou kreye yon siy nan pisin lan.

3. Peryodik, nœuds espesyal Plasma Lajan Kach pran tout tranzaksyon ki soti nan pisin lan (jiska 1 milyon dola) epi fòme yon blòk nan men yo, kalkile pye bwa a Merkle ak, kòmsadwa, hash la. Blòk sa a voye bay lòt nœuds pou verifikasyon. Nœuds yo tcheke si Merkle hash la valab epi si tranzaksyon yo valab (pa egzanp, si moun k ap voye jeton an se pwopriyetè li). Apre verifye blòk la, ne a rele fonksyon `submitBlock` nan kontra entelijan an, ki sove nimewo blòk la ak Merkle hash nan chèn kwen an. Kontra entelijan an jenere yon evènman ki endike adisyon siksè nan yon blòk. Tranzaksyon yo retire nan pisin lan.

4. Nœuds ki resevwa evènman soumèt blòk la kòmanse aplike tranzaksyon yo ki te ajoute nan blòk la.

5. Nan kèk pwen, pwopriyetè a (oswa ki pa pwopriyetè) siy la vle retire li nan Plasma Lajan Kach. Pou fè sa, li rele fonksyon `startExit`, pase ladan l enfòmasyon sou 2 dènye tranzaksyon yo sou jeton an, ki konfime ke li se pwopriyetè jeton an. Kontra a entelijan, lè l sèvi avèk Merkle hash la, tcheke prezans tranzaksyon yo nan blòk yo epi voye siy la pou retrè, ki pral rive nan de semèn.

6. Si operasyon an retrè siy te fèt ak vyolasyon (siy la te depanse apre pwosedi retrè a te kòmanse oswa siy la te deja yon lòt moun anvan retrè a), mèt kay la nan siy la ka refite retrè a nan de semèn.

Tès Piblik: Yon Solisyon pou Konfidansyalite ak Évolutivité sou Ethereum

Konfidansyalite reyalize nan de fason

1. Chèn rasin lan pa konnen anyen sou tranzaksyon yo ki pwodui ak voye nan chèn timoun nan. Enfòmasyon sou ki moun ki depoze ak retire ETH nan Plasma Cash rete piblik.

2. Chèn timoun nan pèmèt tranzaksyon anonim lè l sèvi avèk zk-SNARKs.

Pile teknoloji

  • NodeJS
  • Redis
  • eteryòm
  • Sild

Tès

Pandan n ap devlope Plasma Cash, nou te teste vitès sistèm nan epi nou te jwenn rezilta sa yo:

  • jiska 35 tranzaksyon pou chak segonn ajoute nan pisin lan;
  • jiska 1 tranzaksyon yo ka estoke nan yon blòk.

Tès yo te fèt sou 3 sèvè sa yo:

1. Intel Core i7-6700 Quad-Core Skylake incl. NVMe SSD - 512 GB, 64 GB DDR4 RAM
3 validation nœuds Plasma Cash yo te ogmante.

2. AMD Ryzen 7 1700X Octa-Core "Summit Ridge" (Zen), SATA SSD - 500 GB, 64 GB DDR4 RAM
Ropsten testnet ETH ne te ogmante.
3 validation nœuds Plasma Cash yo te ogmante.

3. Intel Nwayo i9-9900K Octa-Core incl. NVMe SSD - 1 TB, 64 GB DDR4 RAM
1 Plasma Cash soumèt ne te ogmante.
3 validation nœuds Plasma Cash yo te ogmante.
Yo te lanse yon tès pou ajoute tranzaksyon nan rezo Plasma Cash.

Total: 10 nœuds Plasma Cash nan yon rezo prive.

Tès 1

Gen yon limit nan 1 milyon tranzaksyon pou chak blòk. Kidonk, 1 milyon tranzaksyon tonbe nan 2 blòk (piske sistèm nan jere pran yon pati nan tranzaksyon yo epi soumèt pandan y ap voye yo).


Eta inisyal: dènye blòk #7; 1 milyon tranzaksyon ak marqueur yo estoke nan baz done a.

00:00 — kòmansman script jenerasyon tranzaksyon an
01:37 - 1 milyon tranzaksyon yo te kreye ak voye nan ne la te kòmanse
01:46 — soumèt ne te pran 240k tranzaksyon nan pisin lan ak fòm blòk #8. Nou wè tou ke 320k tranzaksyon yo ajoute nan pisin lan nan 10 segonn
01:58 — blòk #8 siyen epi voye pou validation
02:03 — Blòk #8 valide epi yo rele fonksyon `submitBlock` nan kontra entelijan ak nimewo blòk Merkle a.
02:10 — script demo fini travay, ki voye 1 milyon tranzaksyon nan 32 segonn
02:33 - nœuds yo te kòmanse resevwa enfòmasyon ke blòk #8 te ajoute nan chèn rasin lan, epi yo te kòmanse fè tranzaksyon 240k.
02:40 - 240k tranzaksyon yo te retire nan pisin lan, ki deja nan blòk #8
02:56 — soumèt ne te pran tranzaksyon 760k ki rete yo nan pisin lan e li te kòmanse kalkile Merkle hash la ak blòk siyen #9.
03:20 - tout nœuds genyen 1 milyon tranzaksyon 240k ak marqueur
03:35 — Blòk #9 siyen epi voye pou validation nan lòt nœuds
03:41 - erè rezo ki te fèt
04:40 — tan ap tann validasyon blòk #9 la fini
04:54 — soumèt ne te pran tranzaksyon 760k ki rete yo nan pisin lan e li te kòmanse kalkile Merkle hash la ak blòk siyen #9.
05:32 — Blòk #9 siyen epi voye pou validation nan lòt nœuds
05:53 — Blòk #9 valide epi voye l nan chèn rasin lan
06:17 - nœuds yo te kòmanse resevwa enfòmasyon ke blòk #9 te ajoute nan chèn rasin lan epi yo te kòmanse fè tranzaksyon 760k.
06:47 — pisin lan netwaye tranzaksyon ki nan blòk #9
09:06 - tout nœuds genyen 2 milyon tranzaksyon ak marqueur

Tès 2

Gen yon limit nan 350k pou chak blòk. Kòm yon rezilta, nou gen 3 blòk.


Eta inisyal: dènye blòk #9; 2 milyon tranzaksyon ak marqueur yo estoke nan baz done a

00:00 — script jenerasyon tranzaksyon deja te lanse
00:44 - 1 milyon tranzaksyon yo te kreye ak voye nan ne la te kòmanse
00:56 — soumèt ne te pran 320k tranzaksyon nan pisin lan ak fòm blòk #10. Nou wè tou ke 320k tranzaksyon yo ajoute nan pisin lan nan 10 segonn
01:12 — Blòk #10 siyen epi voye l bay lòt nœuds pou validation
01:18 — script demo fini travay, ki voye 1 milyon tranzaksyon nan 34 segonn
01:20 — Blòk #10 valide epi voye l nan chèn rasin lan
01:51 - tout nœuds te resevwa enfòmasyon ki soti nan chèn rasin ki te ajoute blòk #10 epi yo kòmanse aplike tranzaksyon 320k.
02:01 - pisin lan te otorize pou 320k tranzaksyon ki te ajoute nan blòk #10
02:15 — soumèt ne te pran 350k tranzaksyon nan pisin lan ak fòm blòk #11
02:34 — Blòk #11 siyen epi voye l bay lòt nœuds pou validation
02:51 — Blòk #11 valide epi voye l nan chèn rasin lan
02:55 - dènye ne te konplete tranzaksyon ki soti nan blòk #10
10:59 — tranzaksyon an ak soumèt blòk #9 la te pran yon tan trè long nan chèn rasin lan, men li te fini ak tout nœuds te resevwa enfòmasyon sou li epi yo te kòmanse fè tranzaksyon 350k.
11:05 - pisin lan te otorize pou 320k tranzaksyon ki te ajoute nan blòk #11
12:10 - tout nœuds genyen 1 milyon tranzaksyon 670k ak marqueur
12:17 — soumèt ne te pran 330k tranzaksyon nan pisin lan ak fòm blòk #12
12:32 — Blòk #12 siyen epi voye l bay lòt nœuds pou validation
12:39 — Blòk #12 valide epi voye l nan chèn rasin lan
13:44 - tout nœuds yo te resevwa enfòmasyon ki soti nan chèn rasin ki te ajoute blòk #12 epi yo kòmanse aplike tranzaksyon 330k.
14:50 - tout nœuds genyen 2 milyon tranzaksyon ak marqueur

Tès 3

Nan premye ak dezyèm sèvè yo, yon ne validation te ranplase pa yon ne soumèt.


Eta inisyal: dènye blòk #84; 0 tranzaksyon ak marqueur ki te sove nan baz done a

00:00 — Yo te lanse 3 scripts ki jenere epi voye 1 milyon tranzaksyon chak
01:38 — Yo te kreye 1 milyon tranzaksyon epi yo te kòmanse voye soumèt nœud #3
01:50 — soumèt ne #3 te pran 330k tranzaksyon nan pisin lan ak fòm blòk #85 (f21). Nou wè tou ke 350k tranzaksyon yo ajoute nan pisin lan nan 10 segonn
01:53 — Yo te kreye 1 milyon tranzaksyon epi yo te kòmanse voye soumèt nœud #1
01:50 — soumèt ne #3 te pran 330k tranzaksyon nan pisin lan ak fòm blòk #85 (f21). Nou wè tou ke 350k tranzaksyon yo ajoute nan pisin lan nan 10 segonn
02:01 — soumèt ne #1 te pran 250k tranzaksyon nan pisin lan ak fòm blòk #85 (65e)
02:06 — blòk #85 (f21) siyen epi voye bay lòt nœuds pou validation.
02:08 — script demo nan sèvè #3, ki te voye 1 milyon tranzaksyon nan 30 segonn, fini travay
02:14 — Blòk #85 (f21) valide epi voye nan chèn rasin lan
02:19 — blòk #85 (65e) siyen epi voye l bay lòt nœuds pou validation.
02:22 — Yo te kreye 1 milyon tranzaksyon epi yo te kòmanse voye soumèt nœud #2
02:27 — blòk #85 (65e) valide epi voye nan chèn rasin lan
02:29 — soumèt ne #2 te pran 111855 tranzaksyon nan pisin lan ak fòm blòk #85 (256).
02:36 — blòk #85 (256) siyen epi voye bay lòt nœuds pou validation.
02:36 — script demo nan sèvè #1, ki te voye 1 milyon tranzaksyon nan 42.5 segonn, fini travay
02:38 — Blòk #85 (256) valide epi voye nan chèn rasin lan
03:08 — script sèvè #2 fini travay, ki voye 1 milyon tranzaksyon nan 47 segonn
03:38 - tout nœuds te resevwa enfòmasyon ki soti nan chèn rasin ki te ajoute blòk #85 (f21), #86(65e), #87(256) epi yo te kòmanse aplike tranzaksyon 330k, 250k, 111855.
03:49 - yo te netwaye pisin lan nan 330k, 250k, 111855 tranzaksyon ki te ajoute nan blòk #85 (f21), #86(65e), #87(256)
03:59 — soumèt ned #1 te pran 888145 tranzaksyon nan pisin lan ak fòm blòk #88 (214), soumèt ned #2 te pran 750k tranzaksyon nan pisin lan ak fòm blòk #88 (50a), soumèt ned #3 te pran 670k tranzaksyon nan pisin lan ak fòm blòk #88 (d3b)
04:44 — blòk #88 (d3b) siyen epi voye bay lòt nœuds pou validation.
04:58 — blòk #88 (214) siyen epi voye bay lòt nœuds pou validation.
05:11 — blòk #88 (50a) siyen epi voye bay lòt nœuds pou validation.
05:11 — Blòk #85 (d3b) valide epi voye nan chèn rasin lan
05:36 — Blòk #85 (214) valide epi voye nan chèn rasin lan
05:43 - tout nœuds yo te resevwa enfòmasyon ki soti nan chèn rasin ki bloke #88 (d3b), #89(214) yo te ajoute epi yo kòmanse aplike tranzaksyon 670k, 750k.
06:50 — akòz yon echèk kominikasyon, blòk #85 (50a) pa te valide
06:55 — soumèt ne #2 te pran 888145 tranzaksyon nan pisin lan ak fòm blòk #90 (50a)
08:14 — blòk #90 (50a) siyen epi voye bay lòt nœuds pou validation.
09:04 — Blòk #90 (50a) valide epi voye nan chèn rasin lan
11:23 - tout nœuds te resevwa enfòmasyon ki soti nan chèn rasin ki te ajoute blòk #90 (50a), epi yo kòmanse aplike 888145 tranzaksyon yo. An menm tan an, sèvè #3 te deja aplike tranzaksyon ki soti nan blòk #88 (d3b), #89(214)
12:11 - tout pisin yo vid
13:41 — tout nœuds sèvè #3 genyen 3 milyon tranzaksyon ak marqueur
14:35 — tout nœuds sèvè #1 genyen 3 milyon tranzaksyon ak marqueur
19:24 — tout nœuds sèvè #2 genyen 3 milyon tranzaksyon ak marqueur

Obstak

Pandan devlopman Plasma Cash, nou te rankontre pwoblèm sa yo, ke nou te rezoud piti piti epi yo rezoud:

1. Konfli nan entèraksyon an nan fonksyon sistèm divès kalite. Pou egzanp, fonksyon an nan ajoute tranzaksyon nan pisin lan bloke travay la nan soumèt ak validation blòk, ak vis vèrsa, ki te mennen nan yon gout nan vitès.

2. Li pa t 'imedyatman klè ki jan yo voye yon gwo kantite tranzaksyon pandan y ap minimize depans transfè done yo.

3. Li pa t klè ki jan ak ki kote yo estoke done yo nan lòd yo reyalize rezilta segondè.

4. Li pa t klè ki jan yo òganize yon rezo ant nœuds, depi gwosè a nan yon blòk ak 1 milyon tranzaksyon pran apeprè 100 MB.

5. Travay nan mòd sèl-threaded kraze koneksyon ki genyen ant nœuds lè kalkil long rive (pa egzanp, bati yon pye bwa Merkle ak kalkile hash li).

Ki jan nou te fè fas ak tout bagay sa yo?

Premye vèsyon an nan ne Plasma Lajan Kach la se te yon kalite konbine ki te kapab fè tout bagay an menm tan an: aksepte tranzaksyon, soumèt ak valide blòk, epi bay yon API pou jwenn aksè nan done yo. Depi NodeJS se yon sèl-threaded natif natal, fonksyon an gwo Merkle kalkil pye bwa bloke fonksyon an ajoute tranzaksyon. Nou te wè de opsyon pou rezoud pwoblèm sa a:

1. Lanse plizyè pwosesis NodeJS, chak nan yo fè fonksyon espesifik.

2. Sèvi ak worker_threads epi deplase egzekisyon yon pati nan kòd la nan fil.

Kòm yon rezilta, nou itilize tou de opsyon an menm tan an: nou lojikman divize yon ne nan 3 pati ki ka travay separeman, men an menm tan an synchrone.

1. Ne soumèt, ki aksepte tranzaksyon nan pisin lan ak kreye blòk.

2. Yon ne validation ki tcheke validite nœuds yo.

3. API ne - bay yon API pou jwenn aksè nan done yo.

Nan ka sa a, ou ka konekte nan chak ne atravè yon priz Unix lè l sèvi avèk cli.

Nou te deplase operasyon lou, tankou kalkile pye bwa Merkle a, nan yon fil separe.

Se konsa, nou te reyalize operasyon nòmal nan tout fonksyon Plasma Lajan Kach ansanm ak san echèk.

Yon fwa ke sistèm nan te fonksyonèl, nou te kòmanse teste vitès la epi, malerezman, nou te resevwa rezilta ki pa satisfezan: 5 tranzaksyon pou chak segonn ak jiska 000 tranzaksyon pou chak blòk. Mwen te oblije konnen sa ki te aplike mal.

Pou kòmanse, nou te kòmanse teste mekanis kominikasyon ak Plasma Cash pou chèche konnen kapasite pik sistèm nan. Nou te ekri pi bonè ke ne Plasma Cash la bay yon koòdone priz Unix. Okòmansman li te baze sou tèks. Objè json yo te voye lè l sèvi avèk `JSON.parse()` ak `JSON.stringify()`.

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

Nou mezire vitès transfè objè sa yo epi nou jwenn ~ 130k pou chak segonn. Nou te eseye ranplase fonksyon estanda yo pou travay ak json, men pèfòmans pa t amelyore. Motè V8 la dwe byen optimize pou operasyon sa yo.

Nou te travay ak tranzaksyon, siy, ak blòk atravè klas yo. Lè w ap kreye klas sa yo, pèfòmans lan te desann 2 fwa, sa ki endike ke OOP pa apwopriye pou nou. Mwen te oblije reekri tout bagay nan yon apwòch piman fonksyonèl.

Anrejistreman nan baz done a

Okòmansman, Redis te chwazi pou depo done kòm youn nan solisyon ki pi pwodiktif ki satisfè kondisyon nou yo: depo kle-valè, travay ak tab hash, ansanm. Nou te lanse redis-benchmark epi nou te resevwa ~ 80k operasyon pou chak segonn nan 1 mòd pipelining.

Pou pèfòmans segondè, nou branche Redis pi byen:

  • Yo te etabli yon koneksyon priz Unix.
  • Nou enfim sove eta a sou disk (pou fyab, ou ka mete kanpe yon kopi epi sove sou disk nan yon Redis separe).

Nan Redis, yon pisin se yon tab hash paske nou bezwen kapab rekipere tout tranzaksyon yo nan yon sèl rechèch ak efase tranzaksyon youn pa youn. Nou te eseye itilize yon lis regilye, men li pi dousman lè w ap dechaje tout lis la.

Lè w ap itilize NodeJS estanda, bibliyotèk Redis yo te reyalize yon pèfòmans 18k tranzaksyon pou chak segonn. Vitès la tonbe 9 fwa.

Depi referans a te montre nou posiblite yo te klèman 5 fwa pi gwo, nou te kòmanse optimize. Nou chanje bibliyotèk la nan ioredis epi nou te resevwa pèfòmans 25k pou chak segonn. Nou te ajoute tranzaksyon youn pa youn lè l sèvi avèk lòd `hset`. Se konsa, nou te jenere yon anpil nan demann nan Redis. Lide a te parèt pou konbine tranzaksyon yo an pakèt epi voye yo ak yon sèl kòmand `hmset`. Rezilta a se 32k pou chak segonn.

Pou plizyè rezon, ke nou pral dekri pi ba a, nou travay ak done lè l sèvi avèk `Buffer` epi, jan li sanble, si ou konvèti li nan tèks (`buffer.toString('hex')`) anvan ou ekri, ou ka jwenn plis. pèfòmans. Se konsa, vitès la te ogmante a 35k pou chak segonn. Nan moman sa a, nou deside sispann optimize plis.

Nou te oblije chanje nan yon pwotokòl binè paske:

1. Sistèm nan souvan kalkile hashes, siyati, elatriye, ak pou sa li bezwen done nan `tanpon an.

2. Lè yo voye ant sèvis yo, done binè peze mwens pase tèks. Pou egzanp, lè w ap voye yon blòk ak 1 milyon tranzaksyon, done ki nan tèks la ka pran plis pase 300 megabyte.

3. Konstamman transfòme done afekte pèfòmans.

Se poutèt sa, nou te pran kòm yon baz pwòp pwotokòl binè nou an pou estoke ak transmèt done, devlope sou baz bèl bibliyotèk la 'binè-done'.

Kòm yon rezilta, nou te resevwa estrikti done sa yo:

— Tranzaksyon

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

— Jeton

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

—Bloke

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

Avèk kòmandman abityèl yo `BD.encode(block, Protocol).slice();` ak `BD.decode(tapon, Pwotokòl)` nou konvèti done yo nan `Tampon` pou konsève pou nan Redis oswa voye nan yon lòt ne ak rekipere a. done tounen.

Nou gen tou 2 pwotokòl binè pou transfere done ant sèvis yo:

— Pwotokòl pou entèraksyon ak Plasma Node atravè priz 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)
  }
  ```

kote:

  • `kalite` — aksyon an dwe fèt, pou egzanp, 1 — sendTransaction, 2 — getTransaction;
  • `chaj` — done ki bezwen pase nan fonksyon ki apwopriye a;
  • `messageId` — id mesaj pou yo ka idantifye repons lan.

— Pwotokòl pou entèraksyon ant nœuds

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

kote:

  • `kod` — kòd mesaj, pou egzanp 6 — PREPARE_NEW_BLOCK, 7 — BLOCK_VALID, 8 — BLOCK_COMMIT;
  • `versionProtocol` — vèsyon pwotokòl, depi nœuds ak vèsyon diferan yo ka leve soti vivan sou rezo a epi yo ka travay yon fason diferan;
  • `seq` - idantifyan mesaj;
  • `countChunk` и `chunkNumber` nesesè pou divize gwo mesaj;
  • 'longè' и `chaj` longè ak done nan tèt li.

Depi nou te pre-tape done yo, sistèm final la pi vit pase bibliyotèk `rlp` Ethereum la. Malerezman, nou poko te kapab refize li, depi li nesesè finalize kontra entelijan an, ki nou planifye fè nan lavni an.

Si nou te rive jwenn vitès la 35 000 tranzaksyon pa segonn, nou bezwen tou trete yo nan tan ki pi bon an. Depi lè fòmasyon apwoksimatif blòk la pran 30 segonn, nou bezwen mete nan blòk la 1 000 000 tranzaksyon, ki vle di voye plis 100 MB done.

Okòmansman, nou te itilize bibliyotèk `ethereumjs-devp2p` pou kominike ant nœuds, men li pa t kapab okipe anpil done. Kòm yon rezilta, nou te itilize bibliyotèk `ws` ak konfigirasyon voye done binè atravè websocket. Natirèlman, nou te rankontre pwoblèm tou lè nou te voye gwo pake done, men nou divize yo an fragman e kounye a, pwoblèm sa yo disparèt.

Epitou fòme yon pye bwa Merkle ak kalkile hash la 1 000 000 tranzaksyon mande sou 10 segonn nan kalkil kontinyèl. Pandan tan sa a, koneksyon an ak tout nœuds jere kraze. Li te deside deplase kalkil sa a nan yon fil separe.

Konklizyon:

An reyalite, rezilta nou yo pa nouvo, men pou kèk rezon anpil ekspè bliye sou yo lè yo devlope.

  • Sèvi ak Programmation Fonksyonèl olye de Programmation Oryante Objè amelyore pwodiktivite.
  • Monolit la pi mal pase yon achitekti sèvis pou yon sistèm NodeJS pwodiktif.
  • Sèvi ak `worker_threads` pou kalkil lou amelyore repons sistèm, espesyalman lè w ap fè fas ak operasyon i/o.
  • priz unix pi estab ak pi vit pase demann http.
  • Si ou bezwen byen vit transfere gwo done sou rezo a, li pi bon yo sèvi ak websockets epi voye done binè, divize an fragman, ki ka voye si yo pa rive, ak Lè sa a, konbine nan yon sèl mesaj.

Nou envite w vizite GitHub pwojè: https://github.com/opporty-com/Plasma-Cash/tree/new-version

Atik la te ko-ekri pa Alexander Nashivan, pwomotè granmoun aje Clever Solution Inc.

Sous: www.habr.com

Add nouvo kòmantè