Idanwo gbogbo eniyan: Solusan fun Aṣiri ati Scalability lori Ethereum

Àkọsílẹ jẹ imọ-ẹrọ imotuntun ti o ṣe ileri lati ni ilọsiwaju ọpọlọpọ awọn agbegbe ti igbesi aye eniyan. O gbe awọn ilana gidi ati awọn ọja sinu aaye oni-nọmba, ṣe idaniloju iyara ati igbẹkẹle ti awọn iṣowo owo, dinku idiyele wọn, ati pe o tun fun ọ laaye lati ṣẹda awọn ohun elo DAPP ode oni nipa lilo awọn adehun smati ni awọn nẹtiwọọki ti a ti sọtọ.

Fun ọpọlọpọ awọn anfani ati awọn ohun elo oniruuru ti blockchain, o le dabi iyalenu pe imọ-ẹrọ ti o ni ileri ko ti ṣe ọna rẹ sinu gbogbo ile-iṣẹ. Iṣoro naa ni pe awọn blockchains isọdọtun ode oni ko ni iwọn. Awọn ilana Ethereum nipa awọn iṣowo 20 fun iṣẹju kan, eyiti ko to lati pade awọn iwulo ti awọn iṣowo ti o ni agbara oni. Ni akoko kanna, awọn ile-iṣẹ ti nlo imọ-ẹrọ blockchain jẹ ṣiyemeji lati kọ Ethereum silẹ nitori iwọn giga ti aabo rẹ lati gige gige ati awọn ikuna nẹtiwọọki.

Lati rii daju decentralization, aabo ati scalability ni blockchain, bayi lohun Scalability Trilemma, awọn idagbasoke egbe. Anfani da Plasma Cash, a oniranlọwọ pq wa ninu ti a smati guide ati ki o kan ikọkọ nẹtiwọki da lori Node.js, eyi ti o lorekore gbigbe awọn oniwe-ipinle to root pq (Ethereum).

Idanwo gbogbo eniyan: Solusan fun Aṣiri ati Scalability lori Ethereum

Awọn ilana bọtini ni Plasma Cash

1. Olumulo naa pe iṣẹ adehun ijafafa ni 'idogo', ti o kọja sinu rẹ ni iye ETH ti o fẹ fi sii sinu ami Plasma Cash. Awọn smati guide iṣẹ ṣẹda a àmi ati gbogbo iṣẹlẹ nipa o.

2. Awọn apa owo Plasma ṣe alabapin si awọn iṣẹlẹ adehun ijafafa gba iṣẹlẹ kan nipa ṣiṣẹda idogo kan ati ṣafikun idunadura kan nipa ṣiṣẹda ami kan si adagun-odo naa.

3. Lorekore, awọn apa owo Plasma pataki gba gbogbo awọn iṣowo lati adagun-odo (to 1 miliọnu) ati ṣe apẹrẹ kan lati ọdọ wọn, ṣe iṣiro igi Merkle ati, ni ibamu, hash naa. Yi Àkọsílẹ ti wa ni rán si miiran apa fun ijerisi. Awọn apa ṣayẹwo boya hash Merkle wulo ati boya awọn iṣowo naa wulo (fun apẹẹrẹ, boya olufiranṣẹ ti ami naa jẹ oniwun rẹ). Lẹhin ti a mọ daju awọn Àkọsílẹ, ipe ipade `submitBlock` iṣẹ ti awọn smati guide, eyi ti o fi awọn Àkọsílẹ nọmba ati Merkle elile si awọn eti pq. Iwe adehun ọlọgbọn n ṣe agbekalẹ iṣẹlẹ kan ti o nfihan afikun aṣeyọri ti bulọọki kan. Awọn idunadura ti wa ni kuro lati awọn pool.

4. Awọn apa ti o gba iṣẹlẹ ifakalẹ Àkọsílẹ bẹrẹ lati lo awọn iṣowo ti a ṣafikun si bulọki naa.

5. Ni aaye kan, oniwun (tabi ti kii ṣe oniwun) ti aami fẹ lati yọkuro kuro ni Plasma Cash. Lati ṣe eyi, o pe iṣẹ 'startExit', ti o kọja sinu rẹ alaye nipa awọn iṣowo 2 ti o kẹhin lori ami-ami, eyi ti o jẹrisi pe oun ni eni tokini naa. Iwe adehun ọlọgbọn, ni lilo hash Merkle, ṣayẹwo niwaju awọn iṣowo ninu awọn bulọọki ati firanṣẹ ami-ami fun yiyọ kuro, eyiti yoo waye ni ọsẹ meji.

6. Ti iṣẹ yiyọkuro ami naa ba waye pẹlu awọn irufin (aami naa ti lo lẹhin ilana yiyọ kuro tabi ami naa ti jẹ ti ẹnikan tẹlẹ ṣaaju yiyọ kuro), eni to ni ami naa le tako yiyọ kuro laarin ọsẹ meji.

Idanwo gbogbo eniyan: Solusan fun Aṣiri ati Scalability lori Ethereum

Asiri ti waye ni ọna meji

1. Awọn root pq mọ nkankan nipa awọn lẹkọ ti o ti wa ni ipilẹṣẹ ati ki o dari laarin omo pq. Alaye nipa ẹniti o fi silẹ ati yọkuro ETH lati Plasma Cash wa ni gbangba.

2. Awọn ọmọ pq faye gba Anonymous lẹkọ lilo zk-SNARKs.

Technology akopọ

  • NodeJS
  • Redis
  • Etherium
  • Ile

Igbeyewo

Lakoko ti o ndagbasoke Cash Plasma, a ṣe idanwo iyara ti eto ati gba awọn abajade wọnyi:

  • soke si 35 lẹkọ fun keji wa ni afikun si awọn pool;
  • to awọn iṣowo 1 le wa ni ipamọ ni bulọọki kan.

Awọn idanwo ni a ṣe lori awọn olupin 3 wọnyi:

1. Intel mojuto i7-6700 Quad-mojuto Skylake pẹlu. NVMe SSD - 512 GB, 64 GB DDR4 Ramu
3 ifẹsẹmulẹ Plasma Cash apa dide.

2. AMD Ryzen 7 1700X Octa-Core “Summit Ridge” (Zen), SATA SSD – 500 GB, 64 GB DDR4 Ramu
Ropsten testnet ETH ipade ti dide.
3 ifẹsẹmulẹ Plasma Cash apa dide.

3. Intel mojuto i9-9900K Octa-mojuto pẹlu. NVMe SSD - 1 TB, 64 GB DDR4 Ramu
1 Plasma Cash ifakalẹ ipade ti dide.
3 ifẹsẹmulẹ Plasma Cash apa dide.
A ṣe ifilọlẹ idanwo kan lati ṣafikun awọn iṣowo si nẹtiwọọki Plasma Cash.

Lapapọ: 10 Plasma Cash apa ni a ikọkọ nẹtiwọki.

Idanwo 1

O wa opin ti awọn iṣowo miliọnu 1 fun bulọọki. Nitorinaa, awọn iṣowo miliọnu 1 ṣubu sinu awọn bulọọki 2 (niwon eto naa ṣakoso lati gba apakan ti awọn iṣowo ati fi silẹ lakoko ti wọn n firanṣẹ).


Ni ibẹrẹ ipinle: kẹhin Àkọsílẹ # 7; Awọn iṣowo miliọnu 1 ati awọn ami ti wa ni ipamọ ni ibi ipamọ data.

00:00 - ibere iwe afọwọkọ iran idunadura
01:37 - Awọn iṣowo miliọnu 1 ti ṣẹda ati fifiranṣẹ si ipade naa bẹrẹ
01:46 - fi ipade mu 240k lẹkọ lati pool ati awọn fọọmu Àkọsílẹ # 8. A tun rii pe awọn iṣowo 320k ni a ṣafikun si adagun-odo ni awọn aaya 10
01:58 - Àkọsílẹ # 8 ti fowo si ati firanṣẹ fun afọwọsi
02:03 - Àkọsílẹ #8 jẹ ifọwọsi ati pe iṣẹ 'submitBlock' ti adehun ijafafa ni a pe pẹlu hash Merkle ati nọmba idina
02:10 - iwe afọwọkọ demo ti pari iṣẹ, eyiti o firanṣẹ awọn iṣowo miliọnu 1 ni iṣẹju-aaya 32
02:33 - awọn apa bẹrẹ lati gba alaye ti a fi idinamọ #8 kun si pq root, o bẹrẹ lati ṣe awọn iṣowo 240k
02:40 - Awọn iṣowo 240k ni a yọkuro lati inu adagun-odo, eyiti o wa tẹlẹ ni bulọki # 8
02:56 - ipade fi silẹ mu awọn iṣowo 760k ti o ku lati adagun-odo naa o bẹrẹ si iṣiro hash Merkle ati buwọlu bulọọki #9
03:20 - gbogbo awọn apa ni 1 milionu 240k awọn iṣowo ati awọn ami
03:35 - Àkọsílẹ #9 ti fowo si ati firanṣẹ fun afọwọsi si awọn apa miiran
03:41 - aṣiṣe nẹtiwọki waye
04:40 - nduro fun idina # 9 afọwọsi ti pẹ
04:54 - ipade fi silẹ mu awọn iṣowo 760k ti o ku lati adagun-odo naa o bẹrẹ si iṣiro hash Merkle ati buwọlu bulọọki #9
05:32 - Àkọsílẹ #9 ti fowo si ati firanṣẹ fun afọwọsi si awọn apa miiran
05:53 - Àkọsílẹ # 9 jẹ ifọwọsi ati firanṣẹ si pq root
06:17 - awọn apa bẹrẹ lati gba alaye ti a fi idinamọ #9 kun si pq root ati bẹrẹ lati ṣe awọn iṣowo 760k
06:47 - adagun-odo naa ti yọkuro ti awọn iṣowo ti o wa ni bulọki #9
09:06 - gbogbo awọn apa ni awọn iṣowo miliọnu 2 ati awọn ami

Idanwo 2

O wa ni opin ti 350k fun bulọọki. Bi abajade, a ni awọn bulọọki 3.


Ni ibẹrẹ ipinle: kẹhin Àkọsílẹ # 9; Awọn iṣowo miliọnu 2 ati awọn ami ti wa ni ipamọ ni ibi ipamọ data

00:00 - iwe afọwọkọ iran idunadura ti ṣe ifilọlẹ tẹlẹ
00:44 - Awọn iṣowo miliọnu 1 ti ṣẹda ati fifiranṣẹ si ipade naa bẹrẹ
00:56 - fi ipade mu 320k lẹkọ lati pool ati awọn fọọmu Àkọsílẹ # 10. A tun rii pe awọn iṣowo 320k ni a ṣafikun si adagun-odo ni awọn aaya 10
01:12 - Àkọsílẹ # 10 ti fowo si ati firanṣẹ si awọn apa miiran fun afọwọsi
01:18 - iwe afọwọkọ demo ti pari iṣẹ, eyiti o firanṣẹ awọn iṣowo miliọnu 1 ni iṣẹju-aaya 34
01:20 - Àkọsílẹ # 10 jẹ ifọwọsi ati firanṣẹ si pq root
01:51 - gbogbo awọn apa gba alaye lati inu pq root ti a fi idinamọ #10 kun ati bẹrẹ lati lo awọn iṣowo 320k
02:01 - adagun-odo naa ti yọ kuro fun awọn iṣowo 320k ti a ṣafikun lati dina #10
02:15 - fi ipade mu 350k lẹkọ lati pool ati awọn fọọmu Àkọsílẹ # 11
02:34 - Àkọsílẹ # 11 ti fowo si ati firanṣẹ si awọn apa miiran fun afọwọsi
02:51 - Àkọsílẹ # 11 jẹ ifọwọsi ati firanṣẹ si pq root
02:55 - ipade ti o kẹhin ti pari awọn iṣowo lati bulọki #10
10:59 - idunadura pẹlu ifakalẹ ti Àkọsílẹ #9 gba igba pipẹ pupọ ninu pq root, ṣugbọn o ti pari ati pe gbogbo awọn apa gba alaye nipa rẹ ati bẹrẹ lati ṣe awọn iṣowo 350k
11:05 - adagun-odo naa ti yọ kuro fun awọn iṣowo 320k ti a ṣafikun lati dina #11
12:10 - gbogbo awọn apa ni 1 milionu 670k awọn iṣowo ati awọn ami
12:17 - fi ipade mu 330k lẹkọ lati pool ati awọn fọọmu Àkọsílẹ # 12
12:32 - Àkọsílẹ # 12 ti fowo si ati firanṣẹ si awọn apa miiran fun afọwọsi
12:39 - Àkọsílẹ # 12 jẹ ifọwọsi ati firanṣẹ si pq root
13:44 - gbogbo awọn apa gba alaye lati inu pq root ti a fi idinamọ #12 kun ati bẹrẹ lati lo awọn iṣowo 330k
14:50 - gbogbo awọn apa ni awọn iṣowo miliọnu 2 ati awọn ami

Idanwo 3

Ni akọkọ ati keji olupin, ọkan afọwọsi ipade ti a rọpo nipasẹ a fohunsile ipade.


Ni ibẹrẹ ipinle: kẹhin Àkọsílẹ # 84; Awọn iṣowo 0 ati awọn ami ti a fipamọ sinu aaye data

00:00 - Awọn iwe afọwọkọ 3 ti ṣe ifilọlẹ ti o ṣe ipilẹṣẹ ati firanṣẹ awọn iṣowo miliọnu 1 ọkọọkan
01:38 - Awọn iṣowo miliọnu 1 ti ṣẹda ati fifiranṣẹ lati fi ipade #3 bẹrẹ
01:50 - fi ipade # 3 mu 330k lẹkọ lati pool ati awọn fọọmu Àkọsílẹ # 85 (f21). A tun rii pe awọn iṣowo 350k ni a ṣafikun si adagun-odo ni awọn aaya 10
01:53 - Awọn iṣowo miliọnu 1 ti ṣẹda ati fifiranṣẹ lati fi ipade #1 bẹrẹ
01:50 - fi ipade # 3 mu 330k lẹkọ lati pool ati awọn fọọmu Àkọsílẹ # 85 (f21). A tun rii pe awọn iṣowo 350k ni a ṣafikun si adagun-odo ni awọn aaya 10
02:01 - fi ipade #1 mu awọn iṣowo 250k lati adagun-odo ati awọn fọọmu Àkọsílẹ #85 (65e)
02:06 - Àkọsílẹ # 85 (f21) ti fowo si ati firanṣẹ si awọn apa miiran fun afọwọsi
02:08 - iwe afọwọkọ demo ti olupin #3, eyiti o firanṣẹ awọn iṣowo miliọnu 1 ni iṣẹju-aaya 30, ti pari iṣẹ
02:14 - Àkọsílẹ # 85 (f21) jẹ ifọwọsi ati firanṣẹ si pq root
02:19 - Àkọsílẹ # 85 (65e) ti fowo si ati firanṣẹ si awọn apa miiran fun afọwọsi
02:22 - Awọn iṣowo miliọnu 1 ti ṣẹda ati fifiranṣẹ lati fi ipade #2 bẹrẹ
02:27 - Àkọsílẹ # 85 (65e) fọwọsi ati firanṣẹ si pq root
02:29 - fi ipade # 2 mu 111855 lẹkọ lati awọn pool ati awọn fọọmu Àkọsílẹ # 85 (256).
02:36 - Àkọsílẹ # 85 (256) ti fowo si ati firanṣẹ si awọn apa miiran fun afọwọsi
02:36 - iwe afọwọkọ demo ti olupin #1, eyiti o firanṣẹ awọn iṣowo miliọnu 1 ni iṣẹju-aaya 42.5, ti pari iṣẹ
02:38 - Àkọsílẹ # 85 (256) jẹ ifọwọsi ati firanṣẹ si pq root
03:08 - olupin #2 iwe afọwọkọ ti pari iṣẹ, eyiti o firanṣẹ awọn iṣowo miliọnu 1 ni iṣẹju-aaya 47
03:38 - gbogbo awọn apa ti gba alaye lati awọn pq root ti awọn bulọọki # 85 (f21), # 86 (65e), # 87 (256) ni a ṣafikun ati bẹrẹ lati lo awọn iṣowo 330k, 250k, 111855
03:49 - adagun-odo naa ti parẹ ni 330k, 250k, awọn iṣowo 111855 ti a ṣafikun si awọn bulọọki #85 (f21), # 86 (65e), # 87 (256)
03:59 - fi ipade # 1 mu 888145 lẹkọ lati pool ati awọn fọọmu Àkọsílẹ # 88 (214), fi ipade #2 mu 750k lẹkọ lati pool ati awọn fọọmu Àkọsílẹ # 88 (50a), fi ipade # 3 mu 670k lẹkọ lati adagun-odo ati awọn fọọmu Àkọsílẹ #88 (d3b)
04:44 - Àkọsílẹ # 88 (d3b) ti fowo si ati firanṣẹ si awọn apa miiran fun afọwọsi
04:58 - Àkọsílẹ # 88 (214) ti fowo si ati firanṣẹ si awọn apa miiran fun afọwọsi
05:11 - Àkọsílẹ # 88 (50a) ti fowo si ati firanṣẹ si awọn apa miiran fun afọwọsi
05:11 - Àkọsílẹ # 85 (d3b) jẹ ifọwọsi ati firanṣẹ si pq root
05:36 - Àkọsílẹ # 85 (214) jẹ ifọwọsi ati firanṣẹ si pq root
05:43 - gbogbo awọn apa ti gba alaye lati pq root ti awọn bulọọki #88 (d3b), #89(214) ti ṣafikun ati bẹrẹ lati lo 670k, awọn iṣowo 750k
06:50 - nitori ikuna ibaraẹnisọrọ, Àkọsílẹ # 85 (50a) ko ni ifọwọsi
06:55 - fi ipade #2 mu awọn iṣowo 888145 lati adagun-odo ati awọn fọọmu Àkọsílẹ # 90 (50a)
08:14 - Àkọsílẹ # 90 (50a) ti fowo si ati firanṣẹ si awọn apa miiran fun afọwọsi
09:04 - Àkọsílẹ # 90 (50a) jẹ ifọwọsi ati firanṣẹ si pq root
11:23 - gbogbo awọn apa gba alaye lati root pq ti o Àkọsílẹ # 90 (50a) ti a fi kun, ati ki o bẹrẹ lati kan 888145 lẹkọ. Ni akoko kanna, olupin #3 ti lo awọn iṣowo tẹlẹ lati awọn bulọọki #88 (d3b), #89(214)
12:11 - gbogbo awọn adagun ti ṣofo
13:41 - gbogbo awọn apa ti olupin #3 ni awọn iṣowo miliọnu 3 ati awọn ami-ami
14:35 - gbogbo awọn apa ti olupin #1 ni awọn iṣowo miliọnu 3 ati awọn ami-ami
19:24 - gbogbo awọn apa ti olupin #2 ni awọn iṣowo miliọnu 3 ati awọn ami-ami

Awọn idiwọ

Lakoko idagbasoke ti Plasma Cash, a pade awọn iṣoro wọnyi, eyiti a yanju ni kutukutu ati pe a n yanju:

1. Rogbodiyan ni ibaraenisepo ti awọn orisirisi eto awọn iṣẹ. Fun apẹẹrẹ, iṣẹ ti fifi awọn iṣowo kun si adagun naa dina iṣẹ ti ifakalẹ ati awọn bulọọki afọwọsi, ati ni idakeji, eyiti o yori si idinku ninu iyara.

2. Ko ṣe kedere lẹsẹkẹsẹ bi o ṣe le fi nọmba nla ti awọn iṣowo ranṣẹ lakoko ti o dinku awọn idiyele gbigbe data.

3. Ko ṣe afihan bii ati ibiti o ti fipamọ data lati le ṣaṣeyọri awọn abajade giga.

4. Ko ṣe afihan bi o ṣe le ṣeto nẹtiwọọki laarin awọn apa, nitori iwọn bulọọki pẹlu awọn iṣowo miliọnu kan gba to 1 MB.

5. Ṣiṣẹ ni nikan-asapo mode fi opin si asopọ laarin awọn apa nigba ti gun isiro waye (Fun apẹẹrẹ, a Kọ a Merkle igi ati iṣiro awọn oniwe-elile).

Bawo ni a ṣe ṣe pẹlu gbogbo eyi?

Ẹya akọkọ ti Plasma Cash node jẹ iru apapọ ti o le ṣe ohun gbogbo ni akoko kanna: gba awọn iṣowo, fi silẹ ati fọwọsi awọn bulọọki, ati pese API fun iraye si data. Niwọn igba ti NodeJS jẹ asapo ẹyọkan ni abinibi, iṣẹ iṣiro igi Merkle ti o wuwo dina iṣẹ iṣowo ṣafikun. A rii awọn aṣayan meji lati yanju iṣoro yii:

1. Ṣe ifilọlẹ ọpọlọpọ awọn ilana NodeJS, ọkọọkan eyiti o ṣe awọn iṣẹ kan pato.

2. Lo worker_threads ki o gbe ipaniyan apakan ti koodu sinu awọn okun.

Bi abajade, a lo awọn aṣayan mejeeji ni akoko kanna: a fi ọgbọn pin ipin kan si awọn ẹya 3 ti o le ṣiṣẹ lọtọ, ṣugbọn ni akoko kanna ni amuṣiṣẹpọ.

1. Ipade ifakalẹ, eyiti o gba awọn iṣowo sinu adagun-odo ati ṣẹda awọn bulọọki.

2. A validating ipade ti o sọwedowo awọn Wiwulo ti apa.

3. Ipade API - pese API kan fun iwọle si data.

Ni idi eyi, o le sopọ si ipade kọọkan nipasẹ iho unix nipa lilo cli.

A gbe awọn iṣẹ ṣiṣe ti o wuwo, gẹgẹbi iṣiro igi Merkle, sinu okun lọtọ.

Nitorinaa, a ti ṣaṣeyọri iṣẹ deede ti gbogbo awọn iṣẹ Plasma Cash nigbakanna ati laisi awọn ikuna.

Ni kete ti eto naa ba ṣiṣẹ, a bẹrẹ idanwo iyara ati, laanu, gba awọn abajade ti ko ni itẹlọrun: awọn iṣowo 5 fun iṣẹju kan ati to awọn iṣowo 000 fun bulọọki. Mo ni lati ro ero ohun ti a muse ti ko tọ.

Lati bẹrẹ pẹlu, a bẹrẹ idanwo ẹrọ ibaraẹnisọrọ pẹlu Plasma Cash lati wa agbara ti o ga julọ ti eto naa. A kowe tẹlẹ pe Plasma Cash node n pese wiwo iho iho unix kan. Ni ibẹrẹ o jẹ orisun ọrọ. json ohun ti a fi ranse nipa lilo `JSON.parse()` ati `JSON.stringify()`.

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

A ṣe iwọn iyara gbigbe ti iru awọn nkan ati rii ~ 130k fun iṣẹju kan. A gbiyanju lati ropo awọn iṣẹ boṣewa fun ṣiṣẹ pẹlu json, ṣugbọn išẹ ko ni ilọsiwaju. Ẹrọ V8 gbọdọ wa ni iṣapeye daradara fun awọn iṣẹ wọnyi.

A ṣiṣẹ pẹlu awọn iṣowo, awọn ami-ami, ati awọn bulọọki nipasẹ awọn kilasi. Nigbati o ba ṣẹda iru awọn kilasi, iṣẹ naa lọ silẹ nipasẹ awọn akoko 2, eyiti o tọka pe OOP ko dara fun wa. Mo ni lati tun ohun gbogbo kọ si ọna iṣẹ ṣiṣe lasan.

Gbigbasilẹ ni database

Ni ibẹrẹ, a yan Redis fun ibi ipamọ data bi ọkan ninu awọn solusan ti o ni iṣelọpọ julọ ti o ni itẹlọrun awọn ibeere wa: ibi ipamọ iye bọtini, ṣiṣẹ pẹlu awọn tabili hash, awọn ṣeto. A ṣe ifilọlẹ redis-benchmark ati pe a ni awọn iṣẹ ~80k fun iṣẹju kan ni ipo pipelining 1.

Fun iṣẹ ṣiṣe giga, a tunse Redis diẹ sii daradara:

  • Asopọ iho unix kan ti fi idi mulẹ.
  • A ṣe alaabo fifipamọ ipinle si disk (fun igbẹkẹle, o le ṣeto ẹda kan ki o fipamọ si disk ni Redis lọtọ).

Ni Redis, adagun-odo kan jẹ tabili hash nitori a nilo lati ni anfani lati gba gbogbo awọn iṣowo pada ninu ibeere kan ati paarẹ awọn iṣowo ni ọkọọkan. A gbiyanju a lilo deede akojọ, sugbon o jẹ losokepupo nigba ti unloading gbogbo akojọ.

Nigbati o ba nlo NodeJS boṣewa, awọn ile-ikawe Redis ṣaṣeyọri iṣẹ ṣiṣe ti awọn iṣowo 18k fun iṣẹju kan. Iyara naa lọ silẹ ni igba 9.

Niwọn igba ti ala ti fihan wa awọn iṣeeṣe jẹ kedere ni awọn akoko 5 ti o tobi ju, a bẹrẹ lati mu dara si. A yipada ile-ikawe si ioredis ati pe a ni iṣẹ 25k fun iṣẹju kan. A ṣafikun awọn iṣowo ni ọkọọkan nipa lilo pipaṣẹ `hset'. Nitorinaa a n ṣe ipilẹṣẹ ọpọlọpọ awọn ibeere ni Redis. Ero naa dide lati ṣajọpọ awọn iṣowo sinu awọn ipele ati firanṣẹ wọn pẹlu aṣẹ kan `hmset`. Abajade jẹ 32k fun iṣẹju kan.

Fun awọn idi pupọ, eyiti a yoo ṣe apejuwe ni isalẹ, a ṣiṣẹ pẹlu data nipa lilo `Buffer` ati, bi o ti wa ni jade, ti o ba yi pada si ọrọ (`buffer.toString('hex')`) ṣaaju kikọ, o le gba afikun išẹ. Nitorinaa, iyara naa pọ si 35k fun iṣẹju kan. Ni akoko yii, a pinnu lati da idaduro ilọsiwaju siwaju sii.

A ni lati yipada si ilana alakomeji nitori:

1. Eto naa nigbagbogbo ṣe iṣiro awọn hashes, awọn ibuwọlu, ati bẹbẹ lọ, ati fun eyi o nilo data ninu ‘Buffer.

2. Nigbati a ba firanṣẹ laarin awọn iṣẹ, data alakomeji wọn kere ju ọrọ lọ. Fun apẹẹrẹ, nigbati o ba nfi bulọọki ranṣẹ pẹlu awọn iṣowo miliọnu kan, data ti o wa ninu ọrọ le gba diẹ sii ju 1 megabyte.

3. Iyipada data nigbagbogbo ni ipa lori iṣẹ ṣiṣe.

Nitorinaa, a mu bi ipilẹ ilana ilana alakomeji tiwa fun titoju ati gbigbe data, ti dagbasoke lori ipilẹ ile ikawe 'alakomeji-data` iyanu.

Bi abajade, a ni awọn ẹya data wọnyi:

- Iṣowo

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

- Àmi

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

— Dina

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

Pẹlu awọn aṣẹ deede `BD.encode(block, Protocol).bibẹ ();` ati `BD.decode(buffer, Protocol)` a yi data pada sinu `Buffer` fun fifipamọ ni Redis tabi firanšẹ siwaju si ipade miiran ati gbigba pada data pada.

A tun ni awọn ilana alakomeji meji fun gbigbe data laarin awọn iṣẹ:

- Ilana fun ibaraenisepo pẹlu Plasma Node nipasẹ iho 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)
  }
  ```

nibo ni:

  • 'iru' - igbese lati ṣe, fun apẹẹrẹ, 1 — sendTransaction, 2 — getTransaction;
  • `ẹrù owo` - data ti o nilo lati kọja si iṣẹ ti o yẹ;
  • `ifiranṣẹId' - id ifiranṣẹ ki idahun le jẹ idanimọ.

- Ilana fun ibaraenisepo laarin awọn apa

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

nibo ni:

  • 'koodu' - koodu ifiranṣẹ, fun apẹẹrẹ 6 - PREPARE_NEW_BLOCK, 7 - BLOCK_VALID, 8 - BLOCK_COMMIT;
  • `Protocol version` - Ẹya ilana, nitori awọn apa pẹlu awọn ẹya oriṣiriṣi le dide lori nẹtiwọọki ati pe wọn le ṣiṣẹ ni oriṣiriṣi;
  • `seq` - idanimọ ifiranṣẹ;
  • 'countChunk' и `Nọmba chunk` pataki fun pipin awọn ifiranṣẹ nla;
  • 'ipari' и `ẹrù owo` ipari ati data funrararẹ.

Niwọn igba ti a ti tẹ data tẹlẹ, eto ikẹhin yiyara pupọ ju ile-ikawe Ethereum`rlp`. Laanu, a ko ti ni anfani lati kọ, niwon o jẹ dandan lati pari adehun ti o ni imọran, eyiti a gbero lati ṣe ni ojo iwaju.

Ti a ba ṣakoso lati de iyara naa 35 000 awọn iṣowo fun iṣẹju keji, a tun nilo lati ṣe ilana wọn ni akoko to dara julọ. Niwọn igba ti akoko idasile idina isunmọ gba to iṣẹju-aaya 30, a nilo lati ni ninu bulọki naa 1 000 000 awọn iṣowo, eyi ti o tumọ si fifiranṣẹ diẹ sii 100 MB ti data.

Ni ibẹrẹ, a lo ile-ikawe `ehereumjs-devp2p` lati baraẹnisọrọ laarin awọn apa, ṣugbọn ko le mu data lọpọlọpọ. Bi abajade, a lo ile-ikawe `ws` ati tunto fifiranṣẹ data alakomeji nipasẹ websocket. Nitoribẹẹ, a tun pade awọn iṣoro nigba fifiranṣẹ awọn apo-iwe data nla, ṣugbọn a pin wọn si awọn chunks ati bayi awọn iṣoro wọnyi ti lọ.

Tun lara kan Merkle igi ati iṣiro elile 1 000 000 lẹkọ nbeere nipa 10 aaya ti lemọlemọfún isiro. Lakoko yii, asopọ pẹlu gbogbo awọn apa ṣakoso lati fọ. O ti pinnu lati gbe iṣiro yii si okun ti o yatọ.

Awọn ipinnu:

Ni otitọ, awọn awari wa kii ṣe tuntun, ṣugbọn fun idi kan ọpọlọpọ awọn amoye gbagbe nipa wọn nigbati o ndagbasoke.

  • Lilo siseto Iṣẹ-ṣiṣe dipo siseto-Oorun Nkan ṣe ilọsiwaju iṣelọpọ.
  • Ẹyọ monolith buru ju faaji iṣẹ kan fun eto NodeJS ti iṣelọpọ.
  • Lilo `Osise_threads` fun iṣiro wuwo ṣe ilọsiwaju idahun eto, paapaa nigbati o ba n ba awọn iṣẹ i/o ṣe.
  • iho unix jẹ iduroṣinṣin diẹ sii ati yiyara ju awọn ibeere http lọ.
  • Ti o ba nilo lati gbe data nla ni kiakia lori nẹtiwọọki, o dara lati lo awọn oju opo wẹẹbu ati firanṣẹ data alakomeji, pin si awọn chunks, eyiti o le firanṣẹ siwaju ti wọn ko ba de, lẹhinna ni idapo sinu ifiranṣẹ kan.

A pe o lati be GitHub ise agbese: https://github.com/opporty-com/Plasma-Cash/tree/new-version

Awọn article ti a àjọ-kọ nipa Alexander Nashivan, oga Olùgbéejáde Clever Solusan Inc.

orisun: www.habr.com

Fi ọrọìwòye kun