Gwajin Jama'a: Magani don Sirri da Sirri akan Ethereum

Blockchain sabuwar fasaha ce wacce tayi alkawarin inganta fannoni da dama na rayuwar dan adam. Yana canja wurin ainihin matakai da samfurori a cikin sararin dijital, yana tabbatar da sauri da amincin ma'amaloli na kudi, rage farashin su, kuma yana ba ku damar ƙirƙirar aikace-aikacen DAPP na zamani ta amfani da kwangiloli masu wayo a cikin cibiyoyin sadarwa.

Idan aka ba da fa'idodi da yawa da aikace-aikace iri-iri na blockchain, yana iya zama abin mamaki cewa wannan fasaha mai ban sha'awa ba ta riga ta shiga kowane masana'antu ba. Matsalar ita ce ƙayyadaddun blockchain na zamani ba su da ƙarfin ƙarfi. Ethereum yana aiwatar da kusan ma'amaloli 20 a sakan daya, wanda bai isa ya dace da bukatun kasuwancin yau da kullun ba. A lokaci guda kuma, kamfanoni masu amfani da fasahar blockchain suna shakkar watsi da Ethereum saboda babban matakin kariya daga hacking da gazawar hanyar sadarwa.

Don tabbatar da ƙaddamarwa, tsaro da haɓakawa a cikin blockchain, don haka warware Scalability Trilemma, ƙungiyar ci gaba. Dama ya ƙirƙira Plasma Cash, sarkar reshen da ta ƙunshi kwangila mai wayo da kuma hanyar sadarwa mai zaman kanta bisa Node.js, wacce lokaci-lokaci tana canza yanayin sa zuwa tushen sarkar (Ethereum).

Gwajin Jama'a: Magani don Sirri da Sirri akan Ethereum

Mahimmin matakai a cikin Plasma Cash

1. Mai amfani ya kira aikin kwangila mai wayo 'ajiya', yana shiga cikin sa adadin ETH da yake son sakawa cikin alamar Plasma Cash. Aikin kwangila mai wayo yana haifar da alama kuma yana haifar da wani lamari game da shi.

2. Plasma Cash nodes da aka yi rajista zuwa abubuwan kwangila masu wayo suna karɓar wani taron game da ƙirƙirar ajiya da ƙara ma'amala game da ƙirƙirar alama zuwa tafkin.

3. Lokaci-lokaci, nodes na Plasma Cash na musamman suna ɗaukar duk ma'amaloli daga tafkin (har zuwa miliyan 1) kuma su samar da shinge daga gare su, a lissafta bishiyar Merkle kuma, bisa ga haka, zanta. Ana aika wannan toshe zuwa wasu kuɗaɗe don tabbatarwa. Alamun suna duba ko hash ɗin Merkle yana aiki kuma ko ma'amalolin suna aiki (misali, ko wanda ya aiko da alamar shine mai shi). Bayan tabbatar da toshe, kumburin yana kiran aikin ''submitBlock'' na kwangilar wayo, wanda ke adana lambar toshe da Merkle hash zuwa sarkar gefen. Kwangilar mai wayo tana haifar da wani taron da ke nuna nasarar ƙari na toshe. Ana cire ma'amaloli daga tafkin.

4. Nodes waɗanda suka karɓi taron ƙaddamar da toshe suna fara amfani da ma'amaloli waɗanda aka ƙara zuwa toshe.

5. A wani lokaci, mai (ko wanda ba shi) na alamar yana so ya janye ta daga Plasma Cash. Don yin wannan, ya kira aikin 'startExit', yana shigar da bayanai game da ma'amaloli 2 na ƙarshe akan alamar, wanda ya tabbatar da cewa shi ne ma'abcin alamar. Kwangilar mai wayo, ta amfani da hash na Merkle, yana bincika kasancewar ma'amaloli a cikin tubalan kuma aika alamar don cirewa, wanda zai faru a cikin makonni biyu.

6. Idan aikin janyewar alamar ya faru tare da cin zarafi (alamar da aka kashe bayan an fara tsarin janyewa ko alamar ta riga ta kasance ta wani kafin janyewar), mai alamar zai iya karyata janyewar a cikin makonni biyu.

Gwajin Jama'a: Magani don Sirri da Sirri akan Ethereum

Ana samun sirri ta hanyoyi biyu

1. Tushen sarkar bai san komai ba game da ma'amalar da ake samarwa da turawa cikin sarkar yaro. Bayani game da wanda ya ajiye kuma ya cire ETH daga Plasma Cash ya kasance na jama'a.

2. Sarkar yaro yana ba da izinin ma'amaloli marasa amfani ta amfani da zk-SNARKs.

Tarin fasaha

  • NodeJS
  • Redis
  • etherium
  • Sild

Gwaji

Yayin haɓaka Cash Plasma, mun gwada saurin tsarin kuma mun sami sakamako masu zuwa:

  • har zuwa 35 ma'amaloli a cikin dakika ana ƙara zuwa tafkin;
  • har zuwa 1 ma'amaloli za a iya adana a cikin wani toshe.

An gudanar da gwaje-gwaje akan sabobin 3 masu zuwa:

1. Intel Core i7-6700 Quad-Core Skylake incl. NVMe SSD - 512 GB, 64 GB DDR4 RAM
An ɗaga nodes ɗin Cash Plasma guda 3 masu inganci.

2. AMD Ryzen 7 1700X Octa-Core "Summit Ridge" (Zen), SATA SSD - 500 GB, 64 GB DDR4 RAM
An ɗaga kumburin Ropsten testnet ETH.
An ɗaga nodes ɗin Cash Plasma guda 3 masu inganci.

3. Intel Core i9-9900K Octa-Core incl. NVMe SSD - 1 TB, 64 GB DDR4 RAM
1 Plasma Cash an ɗaga kumburin ƙaddamarwa.
An ɗaga nodes ɗin Cash Plasma guda 3 masu inganci.
An ƙaddamar da gwaji don ƙara hada-hadar kasuwanci zuwa cibiyar sadarwar Plasma Cash.

Jimlar: 10 Plasma Cash nodes a cikin hanyar sadarwa mai zaman kansa.

Gwaji 1

Akwai iyaka na 1 miliyan ma'amaloli a kowace toshe. Saboda haka, ma'amaloli miliyan 1 sun fada cikin tubalan 2 (tun da tsarin yana kula da ɗaukar wani ɓangare na ma'amaloli da ƙaddamarwa yayin da ake aikawa).


Jiha ta farko: toshe na ƙarshe #7; Ana adana ma'amaloli miliyan 1 da alamu a cikin bayanan.

00:00 - farkon rubutun tsara ma'amala
01:37 - 1 miliyan ma'amaloli da aka halitta da kuma aika zuwa ga kumburi fara
01:46 - ƙaddamar da kumburi ya ɗauki ma'amaloli 240k daga tafkin da kuma toshe #8. Mun kuma ga cewa ana ƙara ma'amaloli 320k zuwa tafkin a cikin daƙiƙa 10
01:58 - toshe #8 an sanya hannu kuma an aika don ingantawa
02:03 - An inganta toshe #8 kuma ana kiran aikin 'submitBlock' na kwangilar wayo tare da hash na Merkle da lambar toshe
02:10 - rubutun demo ya gama aiki, wanda ya aika ma'amaloli miliyan 1 a cikin daƙiƙa 32
02:33 - nodes sun fara karɓar bayanin cewa an ƙara toshe #8 a cikin tushen sarkar, kuma ya fara aiwatar da ma'amaloli 240k.
02:40 - An cire ma'amaloli 240k daga tafkin, waɗanda tuni ke cikin toshe #8
02:56 - ƙaddamar da kumburi ya ɗauki ragowar ma'amaloli 760k daga tafkin kuma ya fara ƙididdige hash na Merkle da sa hannu kan toshe #9
03:20 - duk nodes sun ƙunshi ma'amaloli miliyan 1 240k da alamu
03:35 - An sanya hannu kan toshe #9 kuma an aika don ingantawa zuwa wasu nodes
03:41 - Kuskuren cibiyar sadarwa ya faru
04:40 - jiran toshe #9 tabbatarwa ya ƙare
04:54 - ƙaddamar da kumburi ya ɗauki ragowar ma'amaloli 760k daga tafkin kuma ya fara ƙididdige hash na Merkle da sa hannu kan toshe #9
05:32 - An sanya hannu kan toshe #9 kuma an aika don ingantawa zuwa wasu nodes
05:53 - toshe #9 an inganta shi kuma an aika shi zuwa tushen sarkar
06:17 - nodes sun fara karɓar bayanin cewa an ƙara toshe #9 zuwa tushen sarkar kuma ya fara aiwatar da ma'amaloli 760k
06:47 - tafkin ya share ma'amaloli da ke cikin toshe #9
09:06 - duk nodes sun ƙunshi ma'amaloli miliyan 2 da alamu

Gwaji 2

Akwai iyaka na 350k kowace toshe. A sakamakon haka, muna da 3 tubalan.


Jiha ta farko: toshe na ƙarshe #9; Ana adana ma'amaloli miliyan 2 da alamu a cikin bayanan

00:00 - An riga an ƙaddamar da rubutun samar da ciniki
00:44 - 1 miliyan ma'amaloli da aka halitta da kuma aika zuwa ga kumburi fara
00:56 - ƙaddamar da kumburi ya ɗauki ma'amaloli 320k daga tafkin da kuma toshe #10. Mun kuma ga cewa ana ƙara ma'amaloli 320k zuwa tafkin a cikin daƙiƙa 10
01:12 - toshe #10 an sanya hannu kuma an aika zuwa wasu nodes don ingantawa
01:18 - rubutun demo ya gama aiki, wanda ya aika ma'amaloli miliyan 1 a cikin daƙiƙa 34
01:20 - toshe #10 an inganta shi kuma an aika shi zuwa tushen sarkar
01:51 - duk nodes sun sami bayanai daga tushen sarkar da aka ƙara toshe #10 kuma sun fara amfani da ma'amaloli 320k
02:01 - tafkin ya share don ma'amaloli 320k waɗanda aka ƙara don toshe #10
02:15 - ƙaddamar da kumburi ya ɗauki ma'amaloli 350k daga tafkin kuma ya samar da toshe #11
02:34 - An sanya hannu kan toshe #11 kuma an aika zuwa wasu nodes don ingantawa
02:51 - toshe #11 an inganta shi kuma an aika shi zuwa tushen sarkar
02:55 - kundi na ƙarshe da aka kammala ma'amaloli daga toshe #10
10:59 - ma'amala tare da ƙaddamar da toshe #9 ya ɗauki lokaci mai tsawo a cikin tushen sarkar, amma an kammala shi kuma duk nodes sun karɓi bayanai game da shi kuma sun fara aiwatar da ma'amaloli 350k.
11:05 - tafkin ya share don ma'amaloli 320k waɗanda aka ƙara don toshe #11
12:10 - duk nodes sun ƙunshi ma'amaloli 1k miliyan 670 da alamu
12:17 - ƙaddamar da kumburi ya ɗauki ma'amaloli 330k daga tafkin da kuma toshe #12
12:32 - An sanya hannu kan toshe #12 kuma an aika zuwa wasu nodes don ingantawa
12:39 - toshe #12 an inganta shi kuma an aika shi zuwa tushen sarkar
13:44 - duk nodes sun sami bayanai daga tushen sarkar da aka ƙara toshe #12 kuma sun fara amfani da ma'amaloli 330k
14:50 - duk nodes sun ƙunshi ma'amaloli miliyan 2 da alamu

Gwaji 3

A cikin sabar na farko da na biyu, an maye gurbin kundi mai inganci guda ɗaya da kumburin ƙaddamarwa.


Jiha ta farko: toshe na ƙarshe #84; 0 ma'amaloli da alamun da aka adana a cikin bayanan bayanai

00:00 - An ƙaddamar da rubutun 3 waɗanda ke haifar da aika ma'amala miliyan 1 kowace
01:38 - An ƙirƙira ma'amaloli miliyan 1 kuma an fara aikawa don ƙaddamar da kumburi #3
01:50 - ƙaddamar da kumburi # 3 ya ɗauki ma'amaloli 330k daga tafkin kuma ya samar da toshe #85 (f21). Mun kuma ga cewa ana ƙara ma'amaloli 350k zuwa tafkin a cikin daƙiƙa 10
01:53 - An ƙirƙira ma'amaloli miliyan 1 kuma an fara aikawa don ƙaddamar da kumburi #1
01:50 - ƙaddamar da kumburi # 3 ya ɗauki ma'amaloli 330k daga tafkin kuma ya samar da toshe #85 (f21). Mun kuma ga cewa ana ƙara ma'amaloli 350k zuwa tafkin a cikin daƙiƙa 10
02:01 - ƙaddamar da node #1 ya ɗauki ma'amaloli 250k daga tafkin kuma ya samar da toshe #85 (65e)
02:06 - toshe #85 (f21) an sanya hannu kuma an aika zuwa wasu nodes don ingantawa
02:08 - rubutun demo na uwar garken #3, wanda ya aika ma'amala miliyan 1 a cikin daƙiƙa 30, ya gama aiki
02:14 - toshe #85 (f21) an inganta shi kuma an aika zuwa tushen sarkar
02:19 - toshe #85 (65e) an sanya hannu kuma an aika zuwa wasu nodes don ingantawa
02:22 - An ƙirƙira ma'amaloli miliyan 1 kuma an fara aikawa don ƙaddamar da kumburi #2
02:27 - toshe #85 (65e) ingantacce kuma aika zuwa tushen sarkar
02:29 - ƙaddamar da node #2 ya ɗauki 111855 ma'amaloli daga tafkin da kuma siffofin toshe #85 (256).
02:36 - toshe #85 (256) an sanya hannu kuma an aika zuwa wasu nodes don ingantawa
02:36 - rubutun demo na uwar garken #1, wanda ya aika ma'amala miliyan 1 a cikin daƙiƙa 42.5, ya gama aiki
02:38 - toshe #85 (256) an inganta shi kuma a aika zuwa tushen sarkar
03:08 - Sabar #2 rubutun ya gama aiki, wanda ya aika ma'amala miliyan 1 a cikin daƙiƙa 47
03:38 - duk nodes sun sami bayanai daga tushen sarkar da ke toshe #85 (f21), #86(65e), #87(256) an ƙara kuma sun fara amfani da 330k, 250k, 111855 ma'amaloli
03:49 - An share tafkin a 330k, 250k, 111855 ma'amaloli waɗanda aka ƙara zuwa tubalan #85 (f21), #86(65e), #87(256)
03:59 - ƙaddamar da kumburi #1 ya ɗauki 888145 ma'amaloli daga tafkin da siffofin block #88 (214), ƙaddamar da kumburi # 2 ya ɗauki ma'amaloli 750k daga tafkin da siffofin toshe #88 (50a), ƙaddamar da kumburi #3 ya ɗauki ma'amaloli 670k daga Pool da Forms block #88 (d3b)
04:44 - toshe #88 (d3b) an sanya hannu kuma an aika zuwa wasu nodes don ingantawa
04:58 - toshe #88 (214) an sanya hannu kuma an aika zuwa wasu nodes don ingantawa
05:11 - toshe #88 (50a) an sanya hannu kuma an aika zuwa wasu nodes don ingantawa
05:11 - toshe #85 (d3b) an inganta shi kuma an aika shi zuwa tushen sarkar
05:36 - toshe #85 (214) an inganta shi kuma a aika zuwa tushen sarkar
05:43 - duk nodes sun sami bayanai daga tushen sarkar da ke toshe #88 (d3b), #89(214) an ƙara kuma suna fara amfani da 670k, 750k ma'amaloli
06:50 - saboda gazawar sadarwa, toshe #85 (50a) bai inganta ba
06:55 - ƙaddamar da node #2 ya ɗauki ma'amaloli 888145 daga tafkin kuma ya samar da toshe #90 (50a)
08:14 - toshe #90 (50a) an sanya hannu kuma an aika zuwa wasu nodes don ingantawa
09:04 - toshe # 90 (50a) an inganta shi kuma a aika zuwa tushen sarkar
11:23 - duk nodes sun sami bayanai daga tushen sarkar da aka ƙara toshe #90 (50a), kuma fara aiwatar da ma'amaloli 888145. A lokaci guda, uwar garken #3 ya riga ya yi amfani da ma'amaloli daga tubalan #88 (d3b), #89(214)
12:11 - duk wuraren tafki babu kowa
13:41 - duk nodes na uwar garken #3 sun ƙunshi ma'amaloli miliyan 3 da alamu
14:35 - duk nodes na uwar garken #1 sun ƙunshi ma'amaloli miliyan 3 da alamu
19:24 - duk nodes na uwar garken #2 sun ƙunshi ma'amaloli miliyan 3 da alamu

cikas

A lokacin ci gaban Plasma Cash, mun ci karo da matsaloli masu zuwa, waɗanda a hankali muke warwarewa kuma muke warwarewa:

1. Rikici a cikin hulɗar ayyukan tsarin daban-daban. Alal misali, aikin ƙara ma'amaloli a cikin tafkin ya toshe aikin ƙaddamarwa da tabbatar da tubalan, da kuma akasin haka, wanda ya haifar da raguwa a cikin sauri.

2. Ba a fayyace kai tsaye yadda ake aika ma'amala mai yawa ba yayin da ake rage farashin canja wurin bayanai.

3. Ba a bayyana yadda za a adana bayanai da kuma inda za a adana bayanai ba don cimma babban sakamako.

4. Ba a bayyana yadda ake tsara hanyar sadarwa tsakanin nodes ba, tunda girman toshe tare da ma'amala miliyan 1 yana ɗaukar kusan 100 MB.

5. Yin aiki a yanayin zaren guda ɗaya yana karya haɗin gwiwa tsakanin nodes lokacin da dogon lissafin ya faru (misali, gina bishiyar Merkle da ƙididdige zanta).

Ta yaya muka yi da wannan duka?

Sigar farko ta kumburin Plasma Cash wani nau'in haɗaka ne wanda zai iya yin komai a lokaci guda: karɓar ma'amaloli, ƙaddamarwa da tabbatar da tubalan, da samar da API don samun damar bayanai. Tun da NodeJS na asali ne mai zare ɗaya, aikin lissafin bishiyar Merkle mai nauyi ya toshe aikin ƙara ma'amala. Mun ga zaɓuɓɓuka biyu don magance wannan matsala:

1. Kaddamar da matakai da yawa na NodeJS, kowannensu yana yin takamaiman ayyuka.

2. Yi amfani da worker_threads kuma matsar da aiwatar da wani ɓangare na lambar zuwa zaren.

A sakamakon haka, mun yi amfani da duka zaɓuɓɓukan biyu a lokaci guda: a hankali mun raba kumburi ɗaya zuwa sassa 3 waɗanda zasu iya aiki daban, amma a lokaci guda tare.

1. Ƙididdigar ƙaddamarwa, wanda ke karɓar ma'amaloli a cikin tafkin kuma ya haifar da tubalan.

2. Kumburi mai inganci wanda ke bincika ingancin nodes.

3. API node - yana ba da API don samun damar bayanai.

A wannan yanayin, zaku iya haɗawa zuwa kowane kumburi ta hanyar soket na unix ta amfani da cli.

Mun matsar da ayyuka masu nauyi, kamar ƙididdige bishiyar Merkle, zuwa wani zaren daban.

Don haka, mun sami nasarar aiki na yau da kullun na duk ayyukan Plasma Cash lokaci guda kuma ba tare da gazawa ba.

Da zarar tsarin ya yi aiki, mun fara gwada saurin sauri kuma, da rashin alheri, mun sami sakamako mara kyau: 5 ma'amaloli a sakan daya kuma har zuwa 000 ma'amaloli a kowace toshe. Dole ne in gano abin da aka aiwatar ba daidai ba.

Da farko, mun fara gwada tsarin sadarwa tare da Plasma Cash don gano mafi girman ƙarfin tsarin. Mun rubuta a baya cewa kumburin Plasma Cash yana ba da madaidaicin soket na unix. Da farko an yi shi bisa rubutu. json abubuwa an aika ta amfani da `JSON.parse()` da `JSON.stringify()`.

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

Mun auna saurin canja wurin irin waɗannan abubuwa kuma mun sami ~ 130k a sakan daya. Mun yi ƙoƙarin maye gurbin daidaitattun ayyuka don aiki tare da json, amma aikin bai inganta ba. Dole ne a inganta injin V8 da kyau don waɗannan ayyukan.

Mun yi aiki tare da ma'amaloli, alamu, da tubalan ta hanyar azuzuwan. Lokacin ƙirƙirar irin waɗannan azuzuwan, wasan kwaikwayon ya ragu da sau 2, wanda ke nuna cewa OOP bai dace da mu ba. Dole ne in sake rubuta komai zuwa tsarin aiki kawai.

Rikodi a cikin database

Da farko, an zaɓi Redis don adana bayanai azaman ɗayan mafi kyawun mafita waɗanda ke biyan bukatunmu: maɓalli mai ƙima, aiki tare da tebur na zanta, saiti. Mun ƙaddamar da redis-benchmark kuma mun sami ~ 80k ayyuka a cikin dakika 1 a yanayin bututun mai.

Don babban aiki, mun kunna Redis da kyau:

  • An kafa haɗin soket na unix.
  • Mun kashe adana jihar zuwa faifai (don amintacce, zaku iya saita kwafi da adanawa zuwa diski a cikin wani Redis daban).

A cikin Redis, wurin tafki tebur ne na zanta saboda muna buƙatar samun damar dawo da duk ma'amaloli a cikin tambaya ɗaya kuma mu share ma'amaloli ɗaya bayan ɗaya. Mun gwada yin amfani da jeri na yau da kullun, amma yana da hankali lokacin sauke jerin duka.

Lokacin amfani da daidaitaccen NodeJS, ɗakunan karatu na Redis sun sami aikin ma'amaloli 18k a sakan daya. Gudun ya ragu sau 9.

Tun da ma'auni ya nuna mana yiwuwar sun fi girma sau 5 a fili, mun fara ingantawa. Mun canza ɗakin karatu zuwa ioredis kuma mun sami aikin 25k a sakan daya. Mun ƙara ma'amaloli ɗaya bayan ɗaya ta amfani da umarnin `hset'. Don haka muna samar da tambayoyi da yawa a cikin Redis. Tunanin ya taso don haɗa ma'amaloli zuwa batches da aika su tare da umarni ɗaya 'hmset'. Sakamakon shine 32k a sakan daya.

Don dalilai da yawa, waɗanda za mu bayyana a ƙasa, muna aiki tare da bayanai ta amfani da 'Buffer' kuma, kamar yadda ya fito, idan kun canza shi zuwa rubutu (`buffer.toString('hex')`) kafin rubutawa, zaku iya samun ƙarin bayani. yi. Don haka, an ƙara saurin zuwa 35k a sakan daya. A halin yanzu, mun yanke shawarar dakatar da ƙarin ingantawa.

Dole ne mu canza zuwa ka'idar binary saboda:

1. Tsarin sau da yawa yana ƙididdige hashes, sa hannu, da sauransu, kuma saboda wannan yana buƙatar bayanai a cikin 'Buffer.

2. Lokacin da aka aika tsakanin sabis, bayanan binary bai kai rubutu ba. Misali, lokacin aika block tare da ma'amaloli miliyan 1, bayanan da ke cikin rubutun na iya ɗaukar fiye da megabyte 300.

3. Canza bayanai akai-akai yana shafar aiki.

Saboda haka, mun ɗauki matsayin tushen ƙa'idar binary ɗin mu don adanawa da watsa bayanai, waɗanda aka haɓaka akan babban ɗakin karatu na 'binary-data'.

Sakamakon haka, mun sami tsarin bayanai masu zuwa:

-Ma'amala

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

— Katange

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

Tare da umarni na yau da kullun `BD.encode(block, Protocol).slice();` da `BD.decode(buffer, Protocol)` muna maida bayanan zuwa 'Buffer' don adanawa a cikin Redis ko tura zuwa wani kumburi da dawo da data dawo.

Hakanan muna da ka'idojin binary guda biyu don canja wurin bayanai tsakanin ayyuka:

- Yarjejeniya don hulɗa tare da Node Plasma ta hanyar soket na 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)
  }
  ```

inda:

  • 'nau'i' - aikin da za a yi, misali, 1 - sendTransaction, 2 - getTransaction;
  • 'bayarwa' - bayanan da ke buƙatar wucewa zuwa aikin da ya dace;
  • 'messageId' - saƙon id domin a iya gane amsar.

- yarjejeniya don hulɗa tsakanin 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)
  }
  ```

inda:

  • 'kodi' - lambar saƙo, misali 6 - PREPARE_NEW_BLOCK, 7 - BLOCK_VALID, 8 - BLOCK_COMMIT;
  • 'versionProtocol' - sigar yarjejeniya, tun da nodes tare da nau'ikan nau'ikan nau'ikan za a iya ɗaga su akan hanyar sadarwa kuma suna iya aiki daban;
  • 'seq' - mai gano saƙo;
  • 'countChunk' и 'lambar chunk' wajibi ne don rarraba manyan saƙonni;
  • 'tsawon' и 'bayarwa' tsawo da kuma bayanan kanta.

Tun da mun riga mun buga bayanan, tsarin ƙarshe yana da sauri fiye da ɗakin karatu na 'rlp' na Ethereum. Abin takaici, har yanzu ba mu sami damar ƙin yarda da shi ba, tun da yake wajibi ne don kammala kwangilar wayo, wanda muke shirin yi a nan gaba.

Idan muka yi nasarar isa gudun 35 000 ma'amaloli a sakan daya, muna kuma buƙatar aiwatar da su a cikin mafi kyawun lokaci. Tun da kusan lokacin ƙirƙirar toshe yana ɗaukar daƙiƙa 30, muna buƙatar haɗawa a cikin toshe 1 000 000 ma'amaloli, wanda ke nufin aika ƙarin 100 MB data.

Da farko, mun yi amfani da ɗakin karatu na `ehereumjs-devp2p` don sadarwa tsakanin nodes, amma ba zai iya ɗaukar bayanai da yawa ba. Sakamakon haka, mun yi amfani da ɗakin karatu na `ws` kuma mun tsara aika bayanan binary ta hanyar yanar gizo. Tabbas, mun fuskanci matsaloli yayin aika manyan fakitin bayanai, amma mun raba su kashi-kashi kuma yanzu waɗannan matsalolin sun ƙare.

Hakanan kafa bishiyar Merkle da lissafin zanta 1 000 000 ma'amaloli na bukatar game da 10 seconds na ci gaba da lissafi. A wannan lokacin, haɗin gwiwa tare da duk nodes yana sarrafa karya. An yanke shawarar matsar da wannan lissafin zuwa wani zare daban.

Ƙarshe:

A gaskiya ma, bincikenmu ba sabon abu bane, amma saboda wasu dalilai da yawa masana sun manta game da su lokacin tasowa.

  • Amfani da Shirye-shiryen Ayyuka maimakon Shirye-shiryen Madaidaitan Abu yana inganta haɓaka aiki.
  • monolith ya fi tsarin gine-ginen sabis don ingantaccen tsarin NodeJS.
  • Yin amfani da ''zaren_ma'aikaci'' don ƙididdige nauyi yana inganta karɓar tsarin, musamman lokacin da ake hulɗa da ayyukan i/o.
  • unix soket ya fi karko da sauri fiye da buƙatun http.
  • Idan kana buƙatar canja wurin manyan bayanai da sauri a kan hanyar sadarwar, yana da kyau a yi amfani da shafukan yanar gizo da aika bayanan binary, rarraba zuwa chunks, wanda za'a iya turawa idan basu isa ba, sannan a haɗa su cikin saƙo guda ɗaya.

Muna gayyatar ku ku ziyarta GitHub aikin: https://github.com/opporty-com/Plasma-Cash/tree/new-version

An rubuta labarin tare Alexander Nashivan, babban mai haɓakawa Clever Solution, Inc. girma.

source: www.habr.com

Add a comment