Санҷиши ҷамъиятӣ: Ҳалли барои махфият ва миқёспазирӣ дар Ethereum

Bloccain технологияи инноватсионӣ мебошад, ки ваъда медиҳад, ки бисёр соҳаҳои ҳаёти инсонро беҳтар мекунад. Он равандҳо ва маҳсулотҳои воқеиро ба фазои рақамӣ интиқол медиҳад, суръат ва эътимоднокии муомилоти молиявиро таъмин мекунад, арзиши онҳоро коҳиш медиҳад ва инчунин ба шумо имкон медиҳад, ки барномаҳои муосири DAPP бо истифода аз шартномаҳои интеллектуалӣ дар шабакаҳои ғайримарказонидашуда эҷод кунед.

Бо назардошти манфиатҳои зиёд ва барномаҳои гуногуни blockchain, шояд тааҷҷубовар ба назар расад, ки ин технологияи ояндадор ҳанӯз дар ҳама соҳаҳо роҳ наёфтааст. Мушкилот дар он аст, ки блокчейнҳои муосири ғайримарказонидашуда миқёспазирӣ надоранд. Ethereum тақрибан 20 транзаксияро дар як сония коркард мекунад, ки барои қонеъ кардани ниёзҳои тиҷорати имрӯзаи динамикӣ кофӣ нест. Ҳамзамон, ширкатҳое, ки технологияи blockchain истифода мебаранд, аз тарки Ethereum бо сабаби дараҷаи баланди муҳофизати он аз ҳакерӣ ва нокомии шабака дудилагӣ мекунанд.

Барои таъмини ғайримарказикунонӣ, амният ва миқёспазирӣ дар blockchain, бо ҳамин ҳал кардани миқёспазирии Trilemma, дастаи таҳиякунанда Имконият Plasma Cash, як занҷири фаръии иборат аз шартномаи оқилона ва шабакаи хусусии бар Node.js, ки давра ба давра ҳолати худро ба занҷири реша (Ethereum) интиқол медиҳад, таъсис дод.

Санҷиши ҷамъиятӣ: Ҳалли барои махфият ва миқёспазирӣ дар Ethereum

Равандҳои асосӣ дар Plasma Cash

1. Истифодабаранда функсияи шартномаи интеллектуалиро "депозит" номида, ба он маблағи ETH-ро, ки мехоҳад ба нишонаи Plasma Cash гузорад, ворид мекунад. Функсияи шартномаи интеллектуалӣ токен эҷод мекунад ва дар бораи он ҳодиса тавлид мекунад.

2. Гиреҳҳои Plasma Cash, ки ба рӯйдодҳои шартномаи интеллектуалӣ обуна шудаанд, воқеаеро дар бораи эҷоди пасандоз мегиранд ва транзаксияро дар бораи эҷоди нишона ба ҳавз илова мекунанд.

3. Давра ба давра гиреҳҳои махсуси Plasma Cash ҳама транзаксияҳоро аз ҳавз мегиранд (то 1 миллион) ва аз онҳо блок ташкил медиҳанд, дарахти Merkle ва мутаносибан хэшро ҳисоб мекунанд. Ин блок барои тафтиш ба гиреҳҳои дигар фиристода мешавад. Гиреҳҳо тафтиш мекунанд, ки ҳеши Merkle дуруст аст ва оё транзаксияҳо дурустанд (масалан, фиристандаи токен соҳиби он аст). Пас аз тасдиқи блок, гиреҳ функсияи "submitBlock" -и шартномаи интеллектуалиро даъват мекунад, ки рақами блок ва хэши Merkleро ба занҷири канор нигоҳ медорад. Шартномаи интеллектуалӣ ҳодисаеро тавлид мекунад, ки иловаи бомуваффақияти блокро нишон медиҳад. Амалиётҳо аз ҳавз хориҷ карда мешаванд.

4. Гиреҳҳое, ки ҳодисаи пешниҳоди блокро мегиранд, ба татбиқи транзаксияҳои ба блок иловашуда шурӯъ мекунанд.

5. Дар баъзе лаҳзаҳо, соҳиби (ё соҳиби он нест) токен мехоҳад онро аз Plasma Cash бигирад. Барои ин, вай функсияи `startExit'-ро даъват карда, ба он маълумот дар бораи 2 транзаксияи охирини токен интиқол дода мешавад, ки соҳиби токен будани ӯро тасдиқ мекунанд. Шартномаи интеллектуалӣ бо истифода аз hash Merkle, мавҷудияти транзаксияҳоро дар блокҳо месанҷад ва токенро барои бозхонд мефиристад, ки пас аз ду ҳафта рух медиҳад.

6. Агар амалиёти бозпас гирифтани токен бо вайронкуниҳо рух дода бошад (токен пас аз оғози расмиёти бозхонд сарф шудааст ё токен қабл аз бозхонд токен аз они ягон каси дигар буд), соҳиби токен метавонад дар давоми ду ҳафта бозхонди онро рад кунад.

Санҷиши ҷамъиятӣ: Ҳалли барои махфият ва миқёспазирӣ дар Ethereum

Махфият бо ду роҳ ба даст оварда мешавад

1. Занҷираи реша дар бораи транзаксияҳое, ки дар занҷири кӯдак тавлид ва интиқол мешаванд, чизе намедонад. Маълумот дар бораи кӣ ETH-ро аз Plasma Cash пасандоз карда ва бозпас гирифтааст, оммавӣ боқӣ мемонад.

2. Занҷираи кӯдак имкон медиҳад, ки амалиёти беном бо истифода аз zk-SNARKs.

Дастгоҳи технологӣ

  • NodeJS
  • Redis
  • Этериум
  • Хок

санҷиши

Ҳангоми таҳияи Plasma Cash, мо суръати системаро санҷидем ва натиҷаҳои зеринро ба даст овардем:

  • то 35 000 транзаксия дар як сония ба ҳавз илова карда мешавад;
  • то 1 транзаксияҳоро дар блок нигоҳ доштан мумкин аст.

Санҷишҳо дар 3 серверҳои зерин гузаронида шуданд:

1. Intel Core i7-6700 чоргонаи Skylake аз ҷумла. NVMe SSD – 512 ГБ, 64 ГБ DDR4 RAM
3 гиреҳи тасдиқкунандаи Plasma Cash бардошта шуд.

2. AMD Ryzen 7 1700X окта-аслӣ “Summit Ridge” (Zen), SATA SSD – 500 ГБ, 64 ГБ DDR4 RAM
Гиреҳи Ropsten testnet ETH баланд шуд.
3 гиреҳи тасдиқкунандаи Plasma Cash бардошта шуд.

3. Intel Core i9-9900K Octa-аслӣ аз ҷумла. NVMe SSD – 1 ТБ, 64 ГБ DDR4 RAM
1 гиреҳи пешниҳоди Plasma Cash баланд шуд.
3 гиреҳи тасдиқкунандаи Plasma Cash бардошта шуд.
Санҷиш барои илова кардани транзаксияҳо ба шабакаи Plasma Cash оғоз шуд.

Њамагї: 10 гиреҳи Cash Plasma дар шабакаи хусусӣ.

Санҷиш 1

Дар як блок маҳдудияти 1 миллион транзаксия вуҷуд дорад. Аз ин рӯ, 1 миллион транзаксия ба 2 блок дохил мешаванд (зеро система метавонад як қисми транзаксияҳоро қабул кунад ва ҳангоми фиристодани онҳо пешниҳод кунад).


Ҳолати ибтидоӣ: блоки охирин №7; 1 миллион транзаксия ва токенҳо дар пойгоҳи додаҳо нигоҳ дошта мешаванд.

00:00 — оғози скрипти тавлиди транзаксия
01:37 - 1 миллион транзаксияҳо сохта шуданд ва фиристодан ба гиреҳ оғоз ёфт
01:46 — гиреҳи ирсол 240 ҳазор транзаксияро аз ҳавз гирифта, блоки №8-ро ташкил медиҳад. Мо инчунин мебинем, ки 320 ҳазор транзаксия дар 10 сония ба ҳавз илова карда мешаванд
01:58 — блоки №8 имзо шуда, барои тасдиқ фиристода мешавад
02:03 — блоки №8 тасдиқ карда мешавад ва функсияи `submitBlock`-и шартномаи интеллектуалӣ бо ҳеш ва рақами блоки Merkle даъват карда мешавад.
02:10 — скрипти намоишӣ кор кард, ки дар 1 сония 32 миллион транзаксия фиристодааст
02:33 - гиреҳҳо ба гирифтани маълумоте шурӯъ карданд, ки блоки №8 ба занҷири реша илова карда шудааст ва ба иҷрои 240 ҳазор транзаксия шурӯъ карданд.
02:40 - 240k транзаксияҳо аз ҳавз хориҷ карда шуданд, ки аллакай дар блоки №8 мавҷуданд
02:56 — гиреҳи ирсол 760 ҳазор транзаксияҳои боқимондаро аз ҳавз гирифт ва ба ҳисобкунии хэши Merkle ва имзои блоки №9 оғоз кард
03:20 - ҳама гиреҳҳо дорои 1 миллиону 240к транзаксия ва нишонаҳо мебошанд
03:35 — блоки №9 имзо шуда, барои тасдиқ ба гиреҳҳои дигар фиристода мешавад
03:41 - хатои шабака рух дод
04:40 — интизории тасдиқи блоки №9 ба охир расид
04:54 — гиреҳи ирсол 760 ҳазор транзаксияҳои боқимондаро аз ҳавз гирифт ва ба ҳисобкунии хэши Merkle ва имзои блоки №9 оғоз кард
05:32 — блоки №9 имзо шуда, барои тасдиқ ба гиреҳҳои дигар фиристода мешавад
05:53 — блоки №9 тасдиқ карда шуд ва ба занҷири реша фиристода шуд
06:17 - гиреҳҳо ба гирифтани маълумот шурӯъ карданд, ки блоки №9 ба занҷири реша илова карда шудааст ва ба анҷом додани транзаксияҳои 760к шурӯъ карданд.
06:47 - ҳавз аз транзаксияҳое, ки дар блоки № 9 мавҷуданд, тоза карда шуданд
09:06 - ҳама гиреҳҳо дорои 2 миллион транзаксия ва нишонаҳо мебошанд

Санҷиш 2

Дар як блок маҳдудияти 350k мавҷуд аст. Дар натича мо 3 блок дорем.


Ҳолати ибтидоӣ: блоки охирин №9; Дар базаи маълумот 2 миллион транзаксия ва токенҳо нигоҳ дошта мешаванд

00:00 — скрипти тавлиди транзаксия аллакай оғоз шудааст
00:44 - 1 миллион транзаксияҳо сохта шуданд ва фиристодан ба гиреҳ оғоз ёфт
00:56 — гиреҳи ирсол 320 ҳазор транзаксияро аз ҳавз гирифта, блоки №10-ро ташкил медиҳад. Мо инчунин мебинем, ки 320 ҳазор транзаксия дар 10 сония ба ҳавз илова карда мешаванд
01:12 — блоки №10 имзо шуда, ба дигар гиреҳҳо барои тасдиқ фиристода мешавад
01:18 — скрипти намоишӣ кор кард, ки дар 1 сония 34 миллион транзаксия фиристодааст
01:20 — блоки №10 тасдиқ ва ба занҷири реша фиристода мешавад
01:51 - ҳама гиреҳҳо аз занҷири реша маълумот гирифтанд, ки блоки №10 илова карда шудааст ва ба татбиқи транзаксияҳои 320k шурӯъ мекунанд
02:01 - ҳавз барои 320 ҳазор транзаксия тоза карда шуд, ки ба блоки № 10 илова карда шудаанд
02:15 — гиреҳи ирсол 350 ҳазор транзаксияро аз ҳавз гирифт ва блоки №11-ро ташкил медиҳад
02:34 — блоки №11 имзо шуда, барои тасдиқ ба гиреҳҳои дигар фиристода мешавад
02:51 - блоки №11 тасдиқ карда шуд ва ба занҷири реша фиристода шуд
02:55 — гиреҳи охирин транзаксияҳоро аз блоки №10 анҷом дод
10:59 — транзаксия бо пешниҳоди блоки № 9 дар занҷири реша вақти хеле тӯлонӣ гирифт, аммо он анҷом ёфт ва ҳама гиреҳҳо дар бораи он маълумот гирифтанд ва ба иҷрои 350 ҳазор транзаксия шурӯъ карданд.
11:05 - ҳавз барои 320 ҳазор транзаксия тоза карда шуд, ки ба блоки № 11 илова карда шудаанд
12:10 - ҳама гиреҳҳо дорои 1 миллиону 670к транзаксия ва нишонаҳо мебошанд
12:17 — гиреҳи ирсол 330 ҳазор транзаксияро аз ҳавз гирифт ва блоки №12-ро ташкил медиҳад
12:32 — блоки №12 имзо шуда, барои тасдиқ ба гиреҳҳои дигар фиристода мешавад
12:39 — блоки №12 тасдиқ ва ба занҷири реша фиристода мешавад
13:44 - ҳама гиреҳҳо аз занҷири реша маълумот гирифтанд, ки блоки №12 илова карда шудааст ва ба татбиқи 330 ҳазор транзаксия шурӯъ мекунанд
14:50 - ҳама гиреҳҳо дорои 2 миллион транзаксия ва нишонаҳо мебошанд

Санҷиш 3

Дар серверҳои якум ва дуюм як гиреҳи тасдиқкунанда бо гиреҳи ирсолкунанда иваз карда шуд.


Ҳолати ибтидоӣ: блоки охирин # 84; 0 транзаксия ва нишонаҳо дар пойгоҳи додаҳо захира карда шудаанд

00:00 — 3 скрипт ба кор андохта шуд, ки ҳар кадом 1 миллион транзаксияро тавлид ва ирсол мекунанд
01:38 — 1 миллион транзаксияҳо сохта шуданд ва фиристодани гиреҳи №3 оғоз ёфт
01:50 — ирсоли гиреҳи №3 аз ҳавз 330 ҳазор транзаксия гирифт ва блоки № 85 (f21) шакл медиҳад. Мо инчунин мебинем, ки 350 ҳазор транзаксия дар 10 сония ба ҳавз илова карда мешаванд
01:53 — 1 миллион транзаксияҳо сохта шуданд ва фиристодани гиреҳи №1 оғоз ёфт
01:50 — ирсоли гиреҳи №3 аз ҳавз 330 ҳазор транзаксия гирифт ва блоки № 85 (f21) шакл медиҳад. Мо инчунин мебинем, ки 350 ҳазор транзаксия дар 10 сония ба ҳавз илова карда мешаванд
02:01 — ирсоли гиреҳи №1 аз ҳавз 250 ҳазор транзаксия гирифт ва блоки № 85 (65e)
02:06 - блоки №85 (f21) имзо карда мешавад ва ба дигар гиреҳҳо барои тасдиқ фиристода мешавад
02:08 — скрипти намоишии сервери №3, ки дар 1 сония 30 миллион транзаксия фиристод, кор кард
02:14 - блоки №85 (f21) тасдиқ карда шуд ва ба занҷири реша фиристода шуд
02:19 - блоки №85 (65e) имзо карда мешавад ва ба дигар гиреҳҳо барои тасдиқ фиристода мешавад
02:22 — 1 миллион транзаксияҳо сохта шуданд ва фиристодани гиреҳи №2 оғоз ёфт
02:27 - блоки № 85 (65e) тасдиқ карда шуд ва ба занҷири реша фиристода шуд
02:29 — ирсоли гиреҳи №2 аз ҳавз 111855 транзаксия гирифт ва блоки №85 (256).
02:36 — блоки №85 (256) имзо шуда, ба дигар гиреҳҳо барои тасдиқ фиристода мешавад
02:36 — скрипти намоишии сервери №1, ки дар 1 сония 42.5 миллион транзаксия фиристод, кор кард
02:38 - блоки №85 (256) тасдиқ карда шуд ва ба занҷири реша фиристода шуд
03:08 — скрипти сервери №2 кор кард, ки дар 1 сония 47 миллион транзаксия фиристод
03:38 - ҳама гиреҳҳо аз занҷири реша маълумот гирифтанд, ки блокҳои №85 (f21), #86(65e), #87(256) илова карда шуданд ва ба татбиқи транзаксияҳои 330k, 250k, 111855 шурӯъ карданд.
03:49 - ҳавз дар 330k, 250k, 111855 транзаксияҳо тоза карда шуд, ки ба блокҳои №85 (f21), №86(65e), №87(256) илова карда шуданд.
03:59 — ирсоли гиреҳи №1 аз ҳавз 888145 транзаксия гирифт ва блоки №88 (214), ирсоли гиреҳи №2 аз ҳавз 750 ҳазор транзаксия гирифт ва блоки №88 (50а) пешниҳод кард, ирсоли гиреҳи №3 аз 670 ҳазор транзаксия гирифт ҳавз ва блоки шаклҳои № 88 (d3b)
04:44 - блоки №88 (d3b) имзо карда мешавад ва ба дигар гиреҳҳо барои тасдиқ фиристода мешавад
04:58 — блоки №88 (214) имзо шуда, ба дигар гиреҳҳо барои тасдиқ фиристода мешавад
05:11 - блоки № 88 (50a) имзо карда мешавад ва ба дигар гиреҳҳо барои тасдиқ фиристода мешавад
05:11 - блоки №85 (d3b) тасдиқ карда шуд ва ба занҷири реша фиристода шуд
05:36 - блоки №85 (214) тасдиқ карда шуд ва ба занҷири реша фиристода шуд
05:43 - ҳама гиреҳҳо аз занҷири реша маълумот гирифтанд, ки блокҳои # 88 (d3b), # 89 (214) илова карда шудаанд ва ба татбиқи транзаксияҳои 670k, 750k шурӯъ мекунанд
06:50 — бинобар нокомии алока блоки №85 (50а) тасдик карда нашуд
06:55 — ирсоли гиреҳи №2 аз ҳавз 888145 транзаксия гирифт ва блоки №90 (50a)
08:14 - блоки № 90 (50a) имзо карда мешавад ва ба дигар гиреҳҳо барои тасдиқ фиристода мешавад
09:04 - блоки № 90 (50a) тасдиқ карда шуд ва ба занҷири реша фиристода шуд
11:23 - ҳама гиреҳҳо аз занҷири реша маълумот гирифтанд, ки блоки №90 (50a) илова карда шудааст ва ба татбиқи 888145 транзаксия шурӯъ мекунанд. Дар айни замон, сервери №3 аллакай транзаксияҳоро аз блокҳои № 88 (d3b), № 89 (214) татбиқ кардааст.
12:11 - ҳама ҳавзҳо холӣ ҳастанд
13:41 — ҳама гиреҳҳои сервери №3 дорои 3 миллион транзаксия ва нишонаҳо мебошанд
14:35 — ҳама гиреҳҳои сервери №1 дорои 3 миллион транзаксия ва нишонаҳо мебошанд
19:24 — ҳама гиреҳҳои сервери №2 дорои 3 миллион транзаксия ва нишонаҳо мебошанд

Монеаҳо

Ҳангоми таҳияи Plasma Cash мо бо мушкилоти зерин рӯ ба рӯ шудем, ки мо тадриҷан ҳал кардем ва ҳал карда истодаем:

1. Ихтилоф дар таъсири мутақобилаи вазифаҳои гуногуни система. Масалан, функсияи илова кардани транзаксияҳо ба ҳавз кори пешниҳод ва тасдиқи блокҳоро бозмедорад ва баръакс, ки боиси паст шудани суръат гардид.

2. Ҳанӯз маълум нест, ки чӣ гуна интиқоли миқдори зиёди транзаксияҳо ҳангоми кам кардани хароҷоти интиқоли маълумот.

3. Барои ноил шудан ба натичахои баланд маълумотро чй тавр ва дар кучо нигох доштан маълум набуд.

4. Маълум набуд, ки шабакаро байни гиреҳҳо чӣ гуна ташкил кардан мумкин аст, зеро андозаи блок бо 1 миллион транзаксия тақрибан 100 МБ-ро мегирад.

5. Кор дар реҷаи як ришта алоқаи байни гиреҳҳоро ҳангоми ба амал омадани ҳисобҳои тӯлонӣ мешиканад (масалан, сохтани дарахти Merkle ва ҳисоб кардани hash он).

Мо бо ин ҳама чӣ гуна мубориза бурдем?

Аввалин версияи гиреҳи Plasma Cash як навъ комбайне буд, ки метавонад ҳама чизро дар як вақт иҷро кунад: транзаксияҳоро қабул кунад, блокҳоро пешниҳод ва тасдиқ кунад ва API-ро барои дастрасӣ ба додаҳо таъмин кунад. Азбаски NodeJS аслан як ришта аст, функсияи ҳисобкунии дарахти вазнини Merkle функсияи иловаи транзаксияро бозмедорад. Мо ду вариантро барои ҳалли ин мушкилот дидем:

1. Якчанд равандҳои NodeJS-ро оғоз кунед, ки ҳар яки онҳо вазифаҳои мушаххасро иҷро мекунанд.

2. worker_threads-ро истифода баред ва иҷрои қисми кодро ба риштаҳо интиқол диҳед.

Дар натиҷа, мо ҳарду вариантро дар як вақт истифода бурдем: мо мантиқан як гиреҳро ба 3 қисм тақсим кардем, ки метавонанд алоҳида кор кунанд, аммо дар айни замон синхронӣ

1. Гиреҳи пешниҳод, ки транзаксияҳоро ба ҳавз қабул мекунад ва блокҳоро эҷод мекунад.

2. Гиреҳи тасдиқкунанда, ки дурустии гиреҳҳоро тафтиш мекунад.

3. Гиреҳи API - API-ро барои дастрасӣ ба маълумот таъмин мекунад.

Дар ин ҳолат, шумо метавонед ба ҳар як гиреҳ тавассути васлаки unix бо истифода аз cli пайваст шавед.

Мо амалиёти вазнинро, ба монанди ҳисоб кардани дарахти Меркле, ба риштаи алоҳида гузаронидем.

Ҳамин тариқ, мо ба фаъолияти мӯътадили ҳама функсияҳои Plasma Cash ҳамзамон ва бидуни нокомӣ ноил гардидем.

Пас аз он ки система кор кард, мо ба озмоиши суръат шурӯъ кардем ва мутаассифона, натиҷаҳои ғайриқаноатбахш гирифтем: 5 транзаксия дар як сония ва то 000 транзаксия дар як блок. Ман бояд фаҳмам, ки чӣ нодуруст иҷро шудааст.

Барои оғози кор, мо ба озмоиши механизми иртибот бо Plasma Cash шурӯъ кардем, то қобилияти баландтарини системаро фаҳмем. Мо қаблан навишта будем, ки гиреҳи Plasma Cash интерфейси васлаки unix таъмин мекунад. Дар аввал он ба матн асос ёфтааст. объектҳои json бо истифода аз `JSON.parse()` ва `JSON.stringify()` фиристода шуданд.

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

Мо суръати интиқоли чунин объектҳоро чен кардем ва ~ 130k дар як сонияро ёфтем. Мо кӯшиш кардем, ки функсияҳои стандартиро барои кор бо json иваз кунем, аммо иҷроиш беҳтар нашуд. Муҳаррики V8 бояд барои ин амалиётҳо хуб оптимизатсия карда шавад.

Мо тавассути дарсҳо бо транзаксияҳо, токенҳо ва блокҳо кор мекардем. Ҳангоми сохтани чунин синфҳо, иҷроиш 2 маротиба коҳиш ёфт, ки ин нишон медиҳад, ки OOP барои мо мувофиқ нест. Ман маҷбур будам, ки ҳама чизро ба равиши сирф функсионалӣ нависам.

Сабт дар базаи маълумот

Дар аввал, Redis барои нигаҳдории додаҳо ҳамчун яке аз ҳалли пурмаҳсул, ки ба талаботи моро қонеъ мекунад, интихоб карда шуд: нигаҳдории арзишҳои калидӣ, кор бо ҷадвалҳои хэш, маҷмӯаҳо. Мо редис-бенчмаркро оғоз кардем ва дар як режими қубур дар як сония ~ 80k амалиёт гирифтем.

Барои иҷрои баланд, мо Redis-ро дақиқтар танзим кардем:

  • Пайвасти розеткаи unix таъсис дода шудааст.
  • Мо захира кардани ҳолатро дар диск ғайрифаъол кардем (барои эътимоднокӣ, шумо метавонед нусхабардорӣ насб кунед ва дар Redis алоҳида захира кунед).

Дар Redis, ҳавз як ҷадвали ҳаш аст, зеро мо бояд тавонем ҳама транзаксияҳоро дар як дархост дарёфт кунем ва транзаксияҳоро як ба як нест кунем. Мо кӯшиш кардем, ки рӯйхати муқаррариро истифода барем, аммо ҳангоми холӣ кардани тамоми рӯйхат он сусттар аст.

Ҳангоми истифодаи стандартии NodeJS, китобхонаҳои Redis ба иҷрои 18к транзаксия дар як сония ноил шуданд. Суръат 9 маротиба паст шуд.

Азбаски нишондиҳанда ба мо нишон дод, ки имкониятҳо 5 маротиба зиёдтаранд, мо ба оптимизатсия шурӯъ кардем. Мо китобхонаро ба ioredis иваз кардем ва иҷрои 25k дар як сония гирифтем. Мо бо истифода аз фармони `hset` транзаксияҳоро як ба як илова кардем. Ҳамин тавр, мо дар Redis дархостҳои зиёде тавлид мекардем. Идеяи муттаҳид кардани транзаксияҳо ба гурӯҳҳо ва фиристодани онҳо бо як фармони “hmset” пайдо шуд. Дар натиҷа 32k дар як сония.

Бо якчанд сабаб, ки мо дар зер тавсиф хоҳем кард, мо бо истифода аз `Buffer` маълумот кор мекунем ва тавре маълум мешавад, агар шумо онро пеш аз навиштан ба матн (`buffer.toString('hex')`) табдил диҳед, шумо метавонед иловагӣ гиред. иҷрои. Ҳамин тариқ, суръат дар як сония ба 35 ҳазор расид. Дар айни замон, мо тасмим гирифтем, ки оптимизатсияи минбаъдаро боздорем.

Мо маҷбур шудем ба протоколи бинарӣ гузарем, зеро:

1. Система аксар вақт хэшҳо, имзоҳо ва ғайраро ҳисоб мекунад ва барои ин ба он маълумот дар 'Буфер лозим аст.

2. Ҳангоми фиристодан байни хидматҳо, маълумоти дуӣ нисбат ба матн камтар вазн дорад. Масалан, ҳангоми фиристодани блок бо 1 миллион транзаксия, маълумот дар матн метавонад зиёда аз 300 мегабайтро ишғол кунад.

3. Доимо табдил додани маълумот ба иҷроиш таъсир мерасонад.

Аз ин рӯ, мо протоколи бинарии худро барои нигоҳдорӣ ва интиқоли маълумот, ки дар асоси китобхонаи аҷиби «бинарӣ-маълумот» таҳия шудааст, асос гирифтем.

Дар натиҷа, мо сохторҳои зерини маълумотро гирифтем:

— Амалиёт

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

— Токен

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

— Блок

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

Бо фармонҳои муқаррарии `BD.encode(block, Protocol).slice();` ва `BD.decode(bufer, Protocol)` мо маълумотро барои захира кардан дар Redis ё интиқол ба гиреҳи дигар ва дарёфти маълумот баргашт.

Мо инчунин 2 протоколи дуӣ барои интиқоли маълумот байни хидматҳо дорем:

— Протоколи ҳамкорӣ бо Plasma Node тавассути васлаки 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)
  }
  ```

ки:

  • `навъ` — амали иҷрошаванда, масалан, 1 — sendTransaction, 2 — getTransaction;
  • `борбор` — маълумоте, ки бояд ба вазифаи дахлдор интиқол дода шавад;
  • `messageId` — ID-и паём, то ки посух муайян карда шавад.

— Протоколи ҳамкорӣ байни гиреҳҳо

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

ки:

  • 'код' — рамзи паём, масалан 6 — ТАЙЁР КАРДАН_НАВИ_БЛОК, 7 — БЛОК_ЭЪТИБОР, 8 — BLOCK_COMMIT;
  • `versionProtocol` — версияи протокол, зеро гиреҳҳои дорои версияҳои гуногун метавонанд дар шабака баланд шаванд ва онҳо метавонанд ба таври гуногун кор кунанд;
  • `пайда` — идентификатори паём;
  • 'шумурдан' и 'Рақами бахш' барои тақсим кардани паёмҳои калон зарур аст;
  • 'дарозӣ' и `борбор` дарозӣ ва худи маълумот.

Азбаски мо маълумотро пешакӣ чоп кардем, системаи ниҳоӣ нисбат ба китобхонаи `rlp' Ethereum хеле тезтар аст. Мутаассифона, мо то хол онро рад карда натавонистем, зеро шартномаи интеллектуалиро, ки дар оянда ба нақша гирифтаем, анҷом додан лозим аст.

Агар мо ба суръат расида тавонистем 35 000 транзаксияҳо дар як сония, мо инчунин бояд онҳоро дар вақти муносиб коркард кунем. Азбаски вақти тахминии ташаккули блок 30 сонияро мегирад, мо бояд ба блок дохил шавем 1 000 000 муомилот, ки маънои фиристодани бештар 100 МБ маълумот.

Дар аввал, мо китобхонаи `ethereumjs-devp2p`-ро барои муошират байни гиреҳҳо истифода мебурдем, аммо он ин қадар маълумотро коркард карда наметавонист. Дар натиҷа, мо китобхонаи `ws'-ро истифода бурдем ва фиристодани маълумоти дуӣ тавассути вебсокет танзим кардем. Албатта, мо инчунин ҳангоми фиристодани бастаҳои бузурги додаҳо ба мушкилот дучор шудем, аммо мо онҳоро ба қисмҳо тақсим кардем ва ҳоло ин мушкилот бартараф карда шуданд.

Ҳамчунин ташаккул додани дарахти Merkle ва ҳисоб кардани hash 1 000 000 муомилот дар бораи талаб мекунад 10 сонияҳои ҳисобкунии доимӣ. Дар ин муддат пайвастагӣ бо ҳама гиреҳҳо канда мешавад. Қарор дода шуд, ки ин ҳисоб ба риштаи алоҳида гузаронида шавад.

Натиҷаҳо:

Дарвоқеъ, бозёфтҳои мо нав нестанд, аммо бо баъзе сабабҳо бисёре аз коршиносон ҳангоми таҳияи онҳо онҳоро фаромӯш мекунанд.

  • Истифодаи барномасозии функсионалӣ ба ҷои барномасозии ба объект нигаронидашуда маҳсулнокии корро беҳтар мекунад.
  • Монолит аз меъмории хидматрасонӣ барои системаи самараноки NodeJS бадтар аст.
  • Истифодаи 'worker_threads' барои ҳисобҳои вазнин ҷавобгарии системаро беҳтар мекунад, махсусан ҳангоми кор бо амалиёти воридотӣ.
  • васлаки unix нисбат ба дархостҳои http устувортар ва тезтар аст.
  • Агар ба шумо лозим ояд, ки маълумоти калонро тавассути шабака зуд интиқол диҳед, беҳтар аст, ки вебсокетҳоро истифода баред ва додаҳои бинариро ба қисмҳо тақсим кунед, ки онҳоро дар сурати наомадани онҳо интиқол додан мумкин аст ва сипас дар як паём муттаҳид карда мешавад.

Мо шуморо ба боздид даъват мекунем GitHub лоиҳа: https://github.com/opporty-com/Plasma-Cash/tree/new-version

Мақоларо дар якҷоягӣ навиштааст Александр Нашиван, таҳиягари калон Clever Solution Inc.

Манбаъ: will.com

Илова Эзоҳ