BlokÄ·Äde ir inovatÄ«va tehnoloÄ£ija, kas sola uzlabot daudzas cilvÄka dzÄ«ves jomas. Tas pÄrnes reÄlus procesus un produktus digitÄlajÄ telpÄ, nodroÅ”ina finanÅ”u darÄ«jumu Ätrumu un uzticamÄ«bu, samazina to izmaksas, kÄ arÄ« ļauj izveidot modernas DAPP lietojumprogrammas, izmantojot viedos lÄ«gumus decentralizÄtos tÄ«klos.
Å emot vÄrÄ blokÄ·Ädes daudzÄs priekÅ”rocÄ«bas un daudzveidÄ«gos pielietojumus, var Ŕķist pÄrsteidzoÅ”i, ka Ŕī daudzsoloÅ”Ä tehnoloÄ£ija vÄl nav nonÄkusi visÄs nozarÄs. ProblÄma ir tÄ, ka mÅ«sdienu decentralizÄtajÄm blokÄ·ÄdÄm trÅ«kst mÄrogojamÄ«bas. Ethereum apstrÄdÄ aptuveni 20 darÄ«jumus sekundÄ, kas nav pietiekami, lai apmierinÄtu mÅ«sdienu dinamisko uzÅÄmumu vajadzÄ«bas. TajÄ paÅ”Ä laikÄ uzÅÄmumi, kas izmanto blokÄ·Ädes tehnoloÄ£iju, vilcinÄs atteikties no Ethereum, jo āātas ir ļoti aizsargÄts pret uzlauÅ”anu un tÄ«kla kļūmÄm.
Lai nodroÅ”inÄtu blokÄ·Ädes decentralizÄciju, droŔību un mÄrogojamÄ«bu, tÄdÄjÄdi atrisinot Scalability Trilemma, izstrÄdes komanda
Galvenie procesi Plasma Cash
1. LietotÄjs izsauc viedÄ lÄ«guma funkciju "depozÄ«ts", nododot tajÄ ETH summu, ko viÅÅ” vÄlas iemaksÄt Plasma Cash marÄ·ierÄ. ViedÄ lÄ«guma funkcija izveido marÄ·ieri un Ä£enerÄ notikumu par to.
2. Plasma Cash mezgli, kas abonÄti viedÄ lÄ«guma notikumiem, saÅem notikumu par depozÄ«ta izveidi un pievieno pÅ«lam darÄ«jumu par marÄ·iera izveidi.
3. Periodiski Ä«paÅ”ie Plasma Cash mezgli Åem visus darÄ«jumus no pÅ«la (lÄ«dz 1 miljonam) un veido no tiem bloku, aprÄÄ·ina Merkle koku un attiecÄ«gi hash. Å is bloks tiek nosÅ«tÄ«ts uz citiem mezgliem pÄrbaudei. Mezgli pÄrbauda, āāvai Merkles hash ir derÄ«gs un vai darÄ«jumi ir derÄ«gi (piemÄram, vai marÄ·iera sÅ«tÄ«tÄjs ir tÄ Ä«paÅ”nieks). PÄc bloka pÄrbaudes mezgls izsauc viedÄ lÄ«guma funkciju "submitBlock", kas malu Ä·ÄdÄ saglabÄ bloka numuru un Merkle jaucÄjkodu. Viedais lÄ«gums Ä£enerÄ notikumu, kas norÄda uz veiksmÄ«gu bloka pievienoÅ”anu. DarÄ«jumi tiek izÅemti no kopas.
4. Mezgli, kas saÅem bloka iesniegÅ”anas notikumu, sÄk lietot blokam pievienotÄs transakcijas.
5. KÄdÄ brÄ«dÄ« marÄ·iera Ä«paÅ”nieks (vai Ä«paÅ”nieks) vÄlas to izÅemt no Plasma Cash. Lai to izdarÄ«tu, viÅÅ” izsauc funkciju `startExit`, nododot tai informÄciju par pÄdÄjiem 2 darÄ«jumiem ar marÄ·ieri, kas apstiprina, ka viÅÅ” ir marÄ·iera Ä«paÅ”nieks. Viedais lÄ«gums, izmantojot Merkles hash, pÄrbauda darÄ«jumu esamÄ«bu blokos un nosÅ«ta tokenu izÅemÅ”anai, kas notiks pÄc divÄm nedÄļÄm.
6. Ja marÄ·iera izÅemÅ”anas darbÄ«ba notikusi ar pÄrkÄpumiem (žetons tika iztÄrÄts pÄc izÅemÅ”anas procedÅ«ras sÄkuma vai marÄ·ieris jau bija kÄdam citam pirms izÅemÅ”anas), marÄ·iera Ä«paÅ”nieks divu nedÄļu laikÄ var atspÄkot izÅemÅ”anu.
PrivÄtums tiek sasniegts divos veidos
1. Saknes Ä·Äde neko nezina par darÄ«jumiem, kas tiek Ä£enerÄti un pÄrsÅ«tÄ«ti pakÄrtotajÄ Ä·ÄdÄ. InformÄcija par to, kurÅ” iemaksÄja un izÅÄma ETH no Plasma Cash, joprojÄm ir publiska.
2. PakÄrtotÄ Ä·Äde ļauj veikt anonÄ«mus darÄ«jumus, izmantojot zk-SNARK.
Tehnoloģiju kaudze
- NodeJS
- Redis
- Etiijs
- Augsne
TestÄÅ”ana
IzstrÄdÄjot Plasma Cash, mÄs pÄrbaudÄ«jÄm sistÄmas Ätrumu un ieguvÄm Å”Ädus rezultÄtus:
- pÅ«lam tiek pievienoti lÄ«dz 35 000 transakciju sekundÄ;
- blokÄ var saglabÄt lÄ«dz 1 000 000 transakciju.
Testi tika veikti uz Å”Ädiem 3 serveriem:
1. Intel Core i7-6700 Quad-Core Skylake iesk. NVMe SSD ā 512 GB, 64 GB DDR4 RAM
Tika pacelti 3 validÄjoÅ”ie Plasma Cash mezgli.
2. AMD Ryzen 7 1700X astoÅkodolu "Summit Ridge" (Zen), SATA SSD - 500 GB, 64 GB DDR4 RAM
Tika paaugstinÄts Ropsten testnet ETH mezgls.
Tika pacelti 3 validÄjoÅ”ie Plasma Cash mezgli.
3. Intel Core i9-9900K Octa-Core iesk. NVMe SSD ā 1 TB, 64 GB DDR4 RAM
Tika paaugstinÄts 1 Plasma Cash iesniegÅ”anas mezgls.
Tika pacelti 3 validÄjoÅ”ie Plasma Cash mezgli.
Tika uzsÄkts tests, lai pievienotu darÄ«jumus Plasma Cash tÄ«klam.
KopÄ: 10 Plasma Cash mezgli privÄtajÄ tÄ«klÄ.
1. pÄrbaudÄ«jums
VienÄ blokÄ ir 1 miljona darÄ«jumu ierobežojums. LÄ«dz ar to 1 miljons transakciju iedalÄs 2 blokos (jo sistÄma paspÄj paÅemt daļu no darÄ«jumiem un iesniegt to nosÅ«tÄ«Å”anas laikÄ).
SÄkotnÄjais stÄvoklis: pÄdÄjais bloks #7; DatubÄzÄ tiek glabÄts 1 miljons darÄ«jumu un marÄ·ieru.
00:00 ā darÄ«juma Ä£enerÄÅ”anas skripta sÄkums
01:37 - tika izveidots 1 miljons transakciju un sÄkÄs nosÅ«tÄ«Å”ana uz mezglu
01:46 ā iesniegÅ”anas mezgls paÅÄma 240 8 darÄ«jumu no pÅ«la un veidoja 320. bloku. MÄs arÄ« redzam, ka 10 XNUMX darÄ«jumu tiek pievienoti pÅ«lam XNUMX sekunžu laikÄ
01:58 ā bloks #8 ir parakstÄ«ts un nosÅ«tÄ«ts apstiprinÄÅ”anai
02:03 ā tiek apstiprinÄts bloks #8 un viedÄ lÄ«guma funkcija "submitBlock" tiek izsaukta ar Merkles jaucÄjkodu un bloka numuru
02:10 ā beidza darbu demonstrÄcijas skripts, kas nosÅ«tÄ«ja 1 miljonu darÄ«jumu 32 sekundÄs
02:33 - mezgli sÄka saÅemt informÄciju, ka bloks #8 ir pievienots saknes Ä·Ädei, un sÄka veikt 240 XNUMX darÄ«jumu
02:40 - no kopas tika izÅemti 240 8 transakciju, kas jau ir blokÄ #XNUMX
02:56 ā iesniegÅ”anas mezgls paÅÄma atlikuÅ”os 760 9 darÄ«jumus no kopas un sÄka aprÄÄ·inÄt Merkle hash un parakstÄ«Å”anas bloku #XNUMX
03:20 ā visos mezglos ir 1 miljons 240 XNUMX darÄ«jumu un marÄ·ieru
03:35 ā bloks #9 tiek parakstÄ«ts un nosÅ«tÄ«ts apstiprinÄÅ”anai citiem mezgliem
03:41 ā radÄs tÄ«kla kļūda
04:40 ā ir beidzies gaidÄ«Å”anas bloka #9 validÄcija
04:54 ā iesniegÅ”anas mezgls paÅÄma atlikuÅ”os 760 9 darÄ«jumus no kopas un sÄka aprÄÄ·inÄt Merkle hash un parakstÄ«Å”anas bloku #XNUMX
05:32 ā bloks #9 tiek parakstÄ«ts un nosÅ«tÄ«ts apstiprinÄÅ”anai citiem mezgliem
05:53 ā bloks #9 ir apstiprinÄts un nosÅ«tÄ«ts uz saknes Ä·Ädi
06:17 - mezgli sÄka saÅemt informÄciju, ka bloks #9 tika pievienots saknes Ä·Ädei un sÄka veikt 760 XNUMX darÄ«jumus
06:47 ā pÅ«ls ir notÄ«rÄ«ts no darÄ«jumiem, kas ir blokÄ #9
09:06 - visos mezglos ir 2 miljoni darījumu un marķieru
2. pÄrbaudÄ«jums
Katram blokam ir 350 k ierobežojums. RezultÄtÄ mums ir 3 bloki.
SÄkotnÄjais stÄvoklis: pÄdÄjais bloks #9; DatubÄzÄ tiek glabÄti 2 miljoni darÄ«jumu un marÄ·ieru
00:00 ā transakciju Ä£enerÄÅ”anas skripts jau ir palaists
00:44 - tika izveidots 1 miljons transakciju un sÄkÄs nosÅ«tÄ«Å”ana uz mezglu
00:56 ā iesniegÅ”anas mezgls paÅÄma 320 10 darÄ«jumu no pÅ«la un veidoja 320. bloku. MÄs arÄ« redzam, ka 10 XNUMX darÄ«jumu tiek pievienoti pÅ«lam XNUMX sekunžu laikÄ
01:12 ā bloks #10 tiek parakstÄ«ts un nosÅ«tÄ«ts uz citiem mezgliem apstiprinÄÅ”anai
01:18 ā beidza darbu demonstrÄcijas skripts, kas nosÅ«tÄ«ja 1 miljonu darÄ«jumu 34 sekundÄs
01:20 ā bloks #10 tiek apstiprinÄts un nosÅ«tÄ«ts uz saknes Ä·Ädi
01:51 - visi mezgli saÅÄma informÄciju no saknes Ä·Ädes, ka tika pievienots bloks #10, un sÄk piemÄrot 320 XNUMX darÄ«jumus
02:01 ā pÅ«ls ir notÄ«rÄ«ts 320 10 darÄ«jumu, kas tika pievienoti blokam #XNUMX
02:15 ā iesniegÅ”anas mezgls paÅÄma 350 11 darÄ«jumu no pÅ«la un veidoja XNUMX. bloku
02:34 ā bloks #11 tiek parakstÄ«ts un nosÅ«tÄ«ts uz citiem mezgliem apstiprinÄÅ”anai
02:51 ā bloks #11 tiek apstiprinÄts un nosÅ«tÄ«ts uz saknes Ä·Ädi
02:55 ā pÄdÄjais mezgls pabeidza darÄ«jumus no bloka #10
10:59 ā darÄ«jums ar bloka #9 iesniegÅ”anu saknes Ä·ÄdÄ aizÅÄma ļoti ilgu laiku, taÄu tas tika pabeigts un visi mezgli saÅÄma informÄciju par to un sÄka veikt 350 XNUMX darÄ«jumu
11:05 ā pÅ«ls ir notÄ«rÄ«ts 320 11 darÄ«jumu, kas tika pievienoti blokam #XNUMX
12:10 ā visos mezglos ir 1 miljons 670 XNUMX darÄ«jumu un marÄ·ieru
12:17 ā iesniegÅ”anas mezgls paÅÄma 330 12 darÄ«jumu no pÅ«la un veidoja XNUMX. bloku
12:32 ā bloks #12 tiek parakstÄ«ts un nosÅ«tÄ«ts uz citiem mezgliem apstiprinÄÅ”anai
12:39 ā bloks #12 tiek apstiprinÄts un nosÅ«tÄ«ts uz saknes Ä·Ädi
13:44 - visi mezgli saÅÄma informÄciju no saknes Ä·Ädes, ka bloks #12 ir pievienots un sÄk piemÄrot 330 XNUMX darÄ«jumus
14:50 - visos mezglos ir 2 miljoni darījumu un marķieru
3. pÄrbaudÄ«jums
PirmajÄ un otrajÄ serverÄ« viens validÄcijas mezgls tika aizstÄts ar iesniegÅ”anas mezglu.
SÄkotnÄjais stÄvoklis: pÄdÄjais bloks #84; 0 transakciju un marÄ·ieru, kas saglabÄti datu bÄzÄ
00:00 ā ir palaisti 3 skripti, kas Ä£enerÄ un nosÅ«ta 1 miljonu transakciju katrs
01:38 ā tika izveidots 1 miljons transakciju un tika sÄkta nosÅ«tÄ«Å”ana iesniegÅ”anas mezglam #3
01:50 ā iesniegÅ”anas mezgls #3 paÅÄma 330 85 darÄ«jumu no pÅ«la un veidoja 21. bloku (f350). MÄs arÄ« redzam, ka 10 XNUMX darÄ«jumu tiek pievienoti pÅ«lam XNUMX sekunžu laikÄ
01:53 ā tika izveidots 1 miljons transakciju un tika sÄkta nosÅ«tÄ«Å”ana iesniegÅ”anas mezglam #1
01:50 ā iesniegÅ”anas mezgls #3 paÅÄma 330 85 darÄ«jumu no pÅ«la un veidoja 21. bloku (f350). MÄs arÄ« redzam, ka 10 XNUMX darÄ«jumu tiek pievienoti pÅ«lam XNUMX sekunžu laikÄ
02:01 ā iesniegÅ”anas mezgls Nr. 1 paÅÄma 250 85 darÄ«jumu no pÅ«la un veidoja bloku Nr. 65 (XNUMXe)
02:06 ā bloks #85 (f21) tiek parakstÄ«ts un nosÅ«tÄ«ts uz citiem mezgliem apstiprinÄÅ”anai
02:08 ā 3. servera demonstrÄcijas skripts, kas 1 sekundÄs nosÅ«tÄ«ja 30 miljonu transakciju, beidza darboties
02:14 ā bloks #85 (f21) tiek apstiprinÄts un nosÅ«tÄ«ts uz saknes Ä·Ädi
02:19 ā bloks #85 (65e) tiek parakstÄ«ts un nosÅ«tÄ«ts uz citiem mezgliem apstiprinÄÅ”anai
02:22 ā tika izveidots 1 miljons transakciju un tika sÄkta nosÅ«tÄ«Å”ana iesniegÅ”anas mezglam #2
02:27 ā bloks #85 (65e) apstiprinÄts un nosÅ«tÄ«ts uz saknes Ä·Ädi
02:29 ā iesniegÅ”anas mezgls #2 paÅÄma 111855 darÄ«jumus no pÅ«la un veidlapu bloku #85 (256).
02:36 ā bloks #85 (256) tiek parakstÄ«ts un nosÅ«tÄ«ts uz citiem mezgliem apstiprinÄÅ”anai
02:36 ā 1. servera demonstrÄcijas skripts, kas 1 sekundÄs nosÅ«tÄ«ja 42.5 miljonu transakciju, beidza darboties
02:38 ā bloks #85 (256) tiek apstiprinÄts un nosÅ«tÄ«ts uz saknes Ä·Ädi
03:08 ā beidza darboties servera #2 skripts, kas nosÅ«tÄ«ja 1 miljonu transakciju 47 sekundÄs
03:38 - visi mezgli saÅÄma informÄciju no saknes Ä·Ädes, ka tika pievienoti bloki #85 (f21), #86(65e), #87(256), un sÄka piemÄrot 330k, 250k, 111855 darÄ«jumus.
03:49 ā pÅ«ls tika notÄ«rÄ«ts pie 330 k, 250 k, 111855 85 darÄ«jumiem, kas tika pievienoti blokiem #21 (f86), #65(87e), #256(XNUMX)
03:59 ā iesniegÅ”anas mezgls #1 paÅÄma 888145 88 darÄ«jumus no pÅ«la un veidlapu bloku #214 (2), iesniegÅ”anas mezgls #750 paÅÄma 88 50 darÄ«jumu no pÅ«la un veidlapu bloku #3 (670a), iesniegÅ”anas mezgls #88 paÅÄma 3 XNUMX darÄ«jumu no baseins un formu bloks #XNUMX (dXNUMXb)
04:44 ā bloks #88 (d3b) ir parakstÄ«ts un nosÅ«tÄ«ts uz citiem mezgliem apstiprinÄÅ”anai
04:58 ā bloks #88 (214) tiek parakstÄ«ts un nosÅ«tÄ«ts uz citiem mezgliem apstiprinÄÅ”anai
05:11 ā bloks #88 (50a) tiek parakstÄ«ts un nosÅ«tÄ«ts uz citiem mezgliem apstiprinÄÅ”anai
05:11 ā bloks #85 (d3b) ir apstiprinÄts un nosÅ«tÄ«ts uz saknes Ä·Ädi
05:36 ā bloks #85 (214) tiek apstiprinÄts un nosÅ«tÄ«ts uz saknes Ä·Ädi
05:43 - visi mezgli saÅÄma informÄciju no saknes Ä·Ädes, ka ir pievienoti bloki #88 (d3b), #89(214) un sÄk piemÄrot 670k, 750k darÄ«jumus
06:50 ā sakaru kļūmes dÄļ bloks #85 (50a) netika apstiprinÄts
06:55 ā iesniegÅ”anas mezgls #2 paÅÄma 888145 darÄ«jumus no pÅ«la un veidlapu bloku #90 (50a)
08:14 ā bloks #90 (50a) tiek parakstÄ«ts un nosÅ«tÄ«ts uz citiem mezgliem apstiprinÄÅ”anai
09:04 ā bloks #90 (50a) tiek apstiprinÄts un nosÅ«tÄ«ts uz saknes Ä·Ädi
11:23 - visi mezgli saÅÄma informÄciju no saknes Ä·Ädes, ka ir pievienots bloks #90 (50a), un sÄk piemÄrot 888145 darÄ«jumus. TajÄ paÅ”Ä laikÄ serveris #3 jau ir piemÄrojis darÄ«jumus no blokiem #88 (d3b), #89(214)
12:11 - visi baseini ir tukŔi
13:41 ā visos servera #3 mezglos ir 3 miljoni transakciju un marÄ·ieru
14:35 ā visos servera #1 mezglos ir 3 miljoni transakciju un marÄ·ieru
19:24 ā visos servera #2 mezglos ir 3 miljoni transakciju un marÄ·ieru
Å Ä·ÄrŔļi
Plasma Cash izstrÄdes gaitÄ saskÄrÄmies ar Å”ÄdÄm problÄmÄm, kuras pakÄpeniski atrisinÄjÄm un risinÄm:
1. Konflikts dažÄdu sistÄmas funkciju mijiedarbÄ«bÄ. PiemÄram, transakciju pievienoÅ”anas pÅ«lam funkcija bloÄ·Äja bloku iesniegÅ”anas un apstiprinÄÅ”anas darbu un otrÄdi, kas izraisÄ«ja Ätruma samazinÄÅ”anos.
2. Uzreiz nebija skaidrs, kÄ nosÅ«tÄ«t milzÄ«gu skaitu darÄ«jumu, vienlaikus samazinot datu pÄrsÅ«tÄ«Å”anas izmaksas.
3. Nebija skaidrs, kÄ un kur uzglabÄt datus, lai sasniegtu augstus rezultÄtus.
4. Nebija skaidrs, kÄ organizÄt tÄ«klu starp mezgliem, jo āābloka lielums ar 1 miljonu transakciju aizÅem apmÄram 100 MB.
5. StrÄdÄjot viena vÄ«tnes režīmÄ, savienojums starp mezgliem tiek pÄrtraukts, kad notiek ilgi aprÄÄ·ini (piemÄram, veidojot Merkle koku un aprÄÄ·inot tÄ jaucÄjfunkciju).
KÄ mÄs ar to visu tikÄm galÄ?
PirmÄ Plasma Cash mezgla versija bija sava veida kombinÄts, kas varÄja darÄ«t visu vienlaikus: pieÅemt darÄ«jumus, iesniegt un apstiprinÄt blokus un nodroÅ”inÄt API piekļuvei datiem. TÄ kÄ NodeJS sÄkotnÄji ir viens pavediens, smagÄ Merkle koka aprÄÄ·ina funkcija bloÄ·Äja pievienoÅ”anas transakcijas funkciju. MÄs redzÄjÄm divas Ŕīs problÄmas risinÄÅ”anas iespÄjas:
1. Palaidiet vairÄkus NodeJS procesus, no kuriem katrs veic noteiktas funkcijas.
2. Izmantojiet worker_threads un pÄrvietojiet koda daļas izpildi pavedienos.
RezultÄtÄ mÄs izmantojÄm abas iespÄjas vienlaikus: loÄ£iski sadalÄ«jÄm vienu mezglu 3 daļÄs, kas var darboties atseviŔķi, bet tajÄ paÅ”Ä laikÄ sinhroni
1. IesniegÅ”anas mezgls, kas pieÅem darÄ«jumus pÅ«lÄ un izveido blokus.
2. ValidÄcijas mezgls, kas pÄrbauda mezglu derÄ«gumu.
3. API mezgls ā nodroÅ”ina API piekļuvei datiem.
Å ajÄ gadÄ«jumÄ jÅ«s varat izveidot savienojumu ar katru mezglu, izmantojot unix ligzdu, izmantojot cli.
MÄs pÄrcÄlÄm smagas darbÄ«bas, piemÄram, Merkles koka aprÄÄ·inÄÅ”anu, atseviÅ”Ä·Ä pavedienÄ.
TÄdÄjÄdi esam panÄkuÅ”i visu Plasma Cash funkciju normÄlu darbÄ«bu vienlaicÄ«gi un bez kļūmÄm.
Kad sistÄma darbojÄs, mÄs sÄkÄm pÄrbaudÄ«t Ätrumu un diemžÄl saÅÄmÄm neapmierinoÅ”us rezultÄtus: 5 transakciju sekundÄ un lÄ«dz 000 50 transakciju blokÄ. Man bija jÄizdomÄ, kas tika ieviests nepareizi.
SÄkumÄ mÄs sÄkÄm pÄrbaudÄ«t saziÅas mehÄnismu ar Plasma Cash, lai noskaidrotu sistÄmas maksimÄlo spÄju. IepriekÅ” rakstÄ«jÄm, ka Plasma Cash mezgls nodroÅ”ina unix ligzdas saskarni. SÄkotnÄji tas bija balstÄ«ts uz tekstu. json objekti tika nosÅ«tÄ«ti, izmantojot "JSON.parse()" un "JSON.stringify()".
```json
{
"action": "sendTransaction",
"payload":{
"prevHash": "0x8a88cc4217745fd0b4eb161f6923235da10593be66b841d47da86b9cd95d93e0",
"prevBlock": 41,
"tokenId": "57570139642005649136210751546585740989890521125187435281313126554130572876445",
"newOwner": "0x200eabe5b26e547446ae5821622892291632d4f4",
"type": "pay",
"data": "",
"signature": "0xd1107d0c6df15e01e168e631a386363c72206cb75b233f8f3cf883134854967e1cd9b3306cc5c0ce58f0a7397ae9b2487501b56695fe3a3c90ec0f61c7ea4a721c"
}
}
```
MÄs izmÄrÄ«jÄm Å”Ädu objektu pÄrraides Ätrumu un atradÄm ~ 130k sekundÄ. MÄs mÄÄ£inÄjÄm aizstÄt standarta funkcijas darbam ar json, taÄu veiktspÄja neuzlabojÄs. V8 dzinÄjam jÄbÅ«t labi optimizÄtam Ŕīm darbÄ«bÄm.
MÄs strÄdÄjÄm ar darÄ«jumiem, marÄ·ieriem un blokiem, izmantojot nodarbÄ«bas. Veidojot Å”Ädas nodarbÄ«bas, veiktspÄja kritÄs 2 reizes, kas liecina, ka OOP mums nav piemÄrots. Man vajadzÄja visu pÄrrakstÄ«t uz tÄ«ri funkcionÄlu pieeju.
IerakstÄ«Å”ana datu bÄzÄ
SÄkotnÄji Redis datu glabÄÅ”anai tika izvÄlÄts kÄ viens no produktÄ«vÄkajiem risinÄjumiem, kas apmierina mÅ«su prasÄ«bas: atslÄgu-vÄrtÄ«bu uzglabÄÅ”ana, darbs ar hash tabulÄm, komplektiem. MÄs palaižÄm etalonuzdevumu redis un saÅÄmÄm ~ 80 1 darbÄ«bu sekundÄ XNUMX konveijera režīmÄ.
Lai nodroÅ”inÄtu augstu veiktspÄju, mÄs Redis precÄ«zÄk noregulÄjÄm:
- Ir izveidots unix ligzdas savienojums.
- MÄs atspÄjojÄm stÄvokļa saglabÄÅ”anu diskÄ (uzticamÄ«bas labad varat iestatÄ«t kopiju un saglabÄt diskÄ atseviÅ”Ä·Ä Redis).
ProgrammÄ Redis pÅ«ls ir hash tabula, jo mums ir jÄspÄj izgÅ«t visas transakcijas vienÄ vaicÄjumÄ un dzÄst darÄ«jumus pa vienam. MÄs mÄÄ£inÄjÄm izmantot parasto sarakstu, taÄu tas ir lÄnÄks, izlÄdÄjot visu sarakstu.
Izmantojot standarta NodeJS, Redis bibliotÄkas sasniedza 18 9 darÄ«jumu sekundÄ. Ätrums kritÄs XNUMX reizes.
TÄ kÄ etalons mums parÄdÄ«ja, ka iespÄjas ir 5 reizes lielÄkas, mÄs sÄkÄm optimizÄt. MÄs mainÄ«jÄm bibliotÄku uz ioredis un saÅÄmÄm veiktspÄju 25 k sekundÄ. MÄs pievienojÄm darÄ«jumus pa vienam, izmantojot komandu hset. TÄpÄc mÄs Ä£enerÄjÄm daudz vaicÄjumu pakalpojumÄ Redis. RadÄs ideja apvienot darÄ«jumus pa partijÄm un nosÅ«tÄ«t tos ar vienu komandu `hmset`. RezultÄts ir 32k sekundÄ.
VairÄku iemeslu dÄļ, kurus mÄs aprakstÄ«sim tÄlÄk, mÄs strÄdÄjam ar datiem, izmantojot `Buferi`, un, kÄ izrÄdÄs, ja pirms rakstÄ«Å”anas konvertÄsit tos par tekstu (`buffer.toString('hex')`), varat iegÅ«t papildu informÄciju. sniegumu. TÄdÄjÄdi Ätrums tika palielinÄts lÄ«dz 35k sekundÄ. Å obrÄ«d mÄs nolÄmÄm apturÄt turpmÄko optimizÄciju.
Mums bija jÄpÄrslÄdzas uz binÄro protokolu, jo:
1. SistÄma bieži aprÄÄ·ina jaucÄjus, parakstus utt., un Å”im nolÅ«kam tai ir nepiecieÅ”ami dati buferÄ«.
2. SÅ«tot starp pakalpojumiem, binÄrie dati sver mazÄk nekÄ teksts. PiemÄram, nosÅ«tot bloku ar 1 miljonu transakciju, tekstÄ esoÅ”ie dati var aizÅemt vairÄk nekÄ 300 megabaitus.
3. PastÄvÄ«ga datu pÄrveidoÅ”ana ietekmÄ veiktspÄju.
TÄpÄc mÄs par pamatu ÅÄmÄm mÅ«su paÅ”u binÄro protokolu datu glabÄÅ”anai un pÄrsÅ«tÄ«Å”anai, kas izstrÄdÄts, pamatojoties uz brÄ«niŔķīgo "binÄro datu" bibliotÄku.
RezultÄtÄ mÄs saÅÄmÄm Å”Ädas datu struktÅ«ras:
ā DarÄ«jums
```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,
}
```
ā Žetons
```json
{
id: BD.types.string(null),
owner: BD.types.buffer(20),
block: BD.types.uint24le,
amount: BD.types.string(null),
}
```
-BloÄ·Ät
```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,
}
```
Ar parastajÄm komandÄm `BD.encode(block, Protocol).slice();` un `BD.decode(buffer, Protocol)` mÄs pÄrvÄrÅ”am datus par buferi, lai tos saglabÄtu programmÄ Redis vai pÄrsÅ«tÄ«tu uz citu mezglu un izgÅ«tu datus atpakaļ.
Mums ir arÄ« 2 binÄrie protokoli datu pÄrsÅ«tÄ«Å”anai starp pakalpojumiem:
ā Protokols mijiedarbÄ«bai ar plazmas mezglu, izmantojot unix ligzdu
```json
{
type: BD.types.uint8,
messageId: BD.types.uint24le,
error: BD.types.uint8,
length: BD.types.uint24le,
payload: BD.types.buffer(({node}) => node.length)
}
```
ja:
- `tips` ā veicamÄ darbÄ«ba, piemÄram, 1 ā sendTransaction, 2 ā getTransaction;
- `krava` ā dati, kas jÄnodod attiecÄ«gajai funkcijai;
- 'messageId' ā ziÅojuma ID, lai atbildi varÄtu identificÄt.
ā Mezglu mijiedarbÄ«bas protokols
```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)
}
```
ja:
- `kods` ā ziÅojuma kods, piemÄram, 6 ā PREPARE_NEW_BLOCK, 7 ā BLOCK_VALID, 8 ā BLOCK_COMMIT;
- 'versionProtocol' ā protokola versija, jo tÄ«klÄ var tikt izvirzÄ«ti mezgli ar dažÄdÄm versijÄm un tie var darboties atŔķirÄ«gi;
- "seq". ā ziÅojuma identifikators;
- `countChunk` Šø `chunkNumber` nepiecieÅ”ams lielu ziÅojumu sadalÄ«Å”anai;
- `garums` Šø `krava` garums un paÅ”i dati.
TÄ kÄ mÄs iepriekÅ” ievadÄ«jÄm datus, galÄ«gÄ sistÄma ir daudz ÄtrÄka nekÄ Ethereum ārlpā bibliotÄka. DiemžÄl vÄl neesam varÄjuÅ”i no tÄ atteikt, jo nepiecieÅ”ams pabeigt viedo lÄ«gumu, ko plÄnojam darÄ«t arÄ« turpmÄk.
Ja mums izdotos sasniegt Ätrumu 35 000 darÄ«jumus sekundÄ, mums arÄ« tie ir jÄapstrÄdÄ optimÄlÄ laikÄ. TÄ kÄ aptuvenais bloka veidoÅ”anas laiks aizÅem 30 sekundes, mums ir jÄiekļauj blokÄ 1 000 000 darÄ«jumiem, kas nozÄ«mÄ vairÄk sÅ«tÄ«Å”anu 100 MB datu.
SÄkotnÄji mÄs izmantojÄm bibliotÄku "ethereumjs-devp2p", lai sazinÄtos starp mezgliem, taÄu tÄ nevarÄja apstrÄdÄt tik daudz datu. RezultÄtÄ mÄs izmantojÄm āwsā bibliotÄku un konfigurÄjÄm binÄro datu sÅ«tÄ«Å”anu, izmantojot tÄ«mekļa ligzdu. Protams, mÄs arÄ« saskÄrÄmies ar problÄmÄm, sÅ«tot lielas datu paketes, taÄu mÄs tÄs sadalÄ«jÄm gabalos, un tagad Ŕīs problÄmas ir pazuduÅ”as.
ArÄ« Merkles koka veidoÅ”ana un hash aprÄÄ·inÄÅ”ana 1 000 000 darÄ«jumiem ir nepiecieÅ”ams apmÄram 10 sekundes nepÄrtraukta aprÄÄ·ina. Å ajÄ laikÄ savienojums ar visiem mezgliem izdodas pÄrraut. Tika nolemts Å”o aprÄÄ·inu pÄrcelt uz atseviŔķu pavedienu.
SecinÄjumi:
PatiesÄ«bÄ mÅ«su atklÄjumi nav jauni, taÄu nez kÄpÄc daudzi eksperti par tiem aizmirst, izstrÄdÄjot.
- FunkcionÄlÄs programmÄÅ”anas izmantoÅ”ana objektorientÄtas programmÄÅ”anas vietÄ uzlabo produktivitÄti.
- MonolÄ«ts ir sliktÄks nekÄ pakalpojumu arhitektÅ«ra produktÄ«vai NodeJS sistÄmai.
- Darbinieka_pavedienu izmantoÅ”ana intensÄ«viem aprÄÄ·iniem uzlabo sistÄmas reaÄ£ÄtspÄju, Ä«paÅ”i, ja tiek veiktas i/o operÄcijas.
- unix ligzda ir stabilÄka un ÄtrÄka nekÄ http pieprasÄ«jumi.
- Ja jums ir nepiecieÅ”ams Ätri pÄrsÅ«tÄ«t lielus datus tÄ«klÄ, labÄk ir izmantot tÄ«mekļa kontaktligzdas un nosÅ«tÄ«t binÄros datus, kas sadalÄ«ti gabalos, kurus var pÄrsÅ«tÄ«t, ja tie nepienÄk, un pÄc tam apvienot vienÄ ziÅojumÄ.
AicinÄm ciemos GitHub projekts:
Raksta lÄ«dzautors Aleksandrs NaÅ”ivans, vecÄkais izstrÄdÄtÄjs
Avots: www.habr.com