ʻO ka ho'āʻo lehulehu: He hopena no ka pilikino a me ka hoʻonui ʻana ma Ethereum

Pahu kaulahao he ʻenehana hou e hoʻohiki e hoʻomaikaʻi i nā wahi he nui o ke ola kanaka. Hoʻololi ia i nā kaʻina hana maoli a me nā huahana i loko o ke kikowaena digital, e hōʻoia i ka wikiwiki a me ka hilinaʻi o nā kālepa kālā, hoʻemi i kā lākou kumukūʻai, a hiki iā ʻoe ke hana i nā noi DAPP hou me ka hoʻohana ʻana i nā ʻaelike akamai i nā pūnaewele decentralized.

Hāʻawi ʻia i nā pono he nui a me nā noi like ʻole o blockchain, he mea kupanaha paha ʻaʻole i komo kēia ʻenehana hoʻohiki i kēlā me kēia ʻoihana. ʻO ka pilikia, ʻo ka decentralized blockchains o kēia wā ʻaʻole i scalability. Hoʻolālā ʻo Ethereum e pili ana i 20 mau hana i kēlā me kēia kekona, ʻaʻole lawa ia e hoʻokō i nā pono o nā ʻoihana ikaika o kēia lā. I ka manawa like, kānalua nā hui e hoʻohana ana i ka ʻenehana blockchain e haʻalele iā Ethereum ma muli o kona kiʻekiʻe kiʻekiʻe o ka pale ʻana mai ka hacking a me nā hemahema o ka pūnaewele.

E hōʻoia i ka decentralization, palekana a me ka scalability i ka blockchain, no laila e hoʻonā i ka Scalability Trilemma, ka hui hoʻomohala. ʻO ka manawa kūpono Ua hana ʻo Plasma Cash, he kaulahao kōkua i loaʻa i kahi ʻaelike akamai a me kahi pūnaewele pilikino e pili ana iā Node.js, ka mea e hoʻololi i kona mokuʻāina i ke kaulahao kumu (Ethereum).

ʻO ka ho'āʻo lehulehu: He hopena no ka pilikino a me ka hoʻonui ʻana ma Ethereum

Nā hana koʻikoʻi ma Plasma Cash

1. Kāhea ka mea hoʻohana i ka hana ʻaelike akamai ʻo 'deposit', e hoʻokomo i ka nui o ETH āna e makemake ai e waiho i loko o ka hōʻailona Plasma Cash. Hoʻokumu ka hana ʻaelike akamai i kahi hōʻailona a hana i kahi hanana e pili ana iā ia.

2. Loaʻa nā nodes Plasma Cash i nā hanana aelike akamai i kahi hanana e pili ana i ka hana ʻana i kahi waihona a hoʻohui i kahi kālepa e pili ana i ka hana ʻana i kahi hōʻailona i ka loko.

3. I kēlā me kēia manawa, lawe nā nodes Plasma Cash kūikawā i nā hana āpau mai ka wai (a hiki i 1 miliona) a hana i kahi poloka mai lākou, e helu i ka lāʻau Merkle a, no laila, ka hash. Hoʻouna ʻia kēia poloka i nā node ʻē aʻe no ka hōʻoia. E nānā nā nodes inā he kūpono ka Merkle hash a inā he kūpono nā hana (no ka laʻana, inā ʻo ia ka mea nāna i hoʻouna i ka hōʻailona). Ma hope o ka hōʻoia ʻana i ka poloka, kāhea ka node i ka hana 'submitBlock' o ka ʻaelike akamai, nāna e mālama i ka helu poloka a me Merkle hash i ke kaulahao lihi. Hoʻokumu ka ʻaelike akamai i kahi hanana e hōʻike ana i ka hoʻohui kūleʻa o kahi poloka. Hoʻopau ʻia nā ʻoihana mai ka loko.

4. Hoʻomaka nā node i loaʻa i ka hanana hoʻouna poloka e hoʻopili i nā hana i hoʻohui ʻia i ka poloka.

5. I kekahi manawa, makemake ka mea nona (a mea ʻole paha) o ka hōʻailona e haʻalele iā ia mai Plasma Cash. No ka hana ʻana i kēia, kāhea ʻo ia i ka hana 'startExit', e hāʻawi ana i ka ʻike e pili ana i nā hana 2 hope loa ma ka hōʻailona, ​​​​e hōʻoia ana ʻo ia ka mea nona ka hōʻailona. ʻO ka ʻaelike akamai, me ka hoʻohana ʻana i ka hash Merkle, e nānā i ka hele ʻana o nā hana i loko o nā poloka a hoʻouna i ka hōʻailona no ka haʻalele ʻana, e hana ʻia i ʻelua pule.

6. Inā loaʻa ka hana hoʻihoʻi ʻana i ka hōʻailona me nā hewa (ua hoʻopau ʻia ka hōʻailona ma hope o ka hoʻomaka ʻana o ke kaʻina hana hoʻihoʻi a i ʻole na kekahi ʻē aʻe ka hōʻailona ma mua o ka haʻalele ʻana), hiki i ka mea nona ka hōʻailona ke hōʻole i ka haʻalele ʻana i loko o ʻelua pule.

ʻO ka ho'āʻo lehulehu: He hopena no ka pilikino a me ka hoʻonui ʻana ma Ethereum

Loaʻa ka pilikino ma nā ala ʻelua

1. ʻAʻole ʻike ke kaulahao kumu e pili ana i nā hana i hana ʻia a hoʻouna ʻia i loko o ke kaulahao keiki. ʻO ka ʻike e pili ana i ka mea nāna i waiho a hoʻihoʻi iā ETH mai Plasma Cash e noho ākea.

2. Hāʻawi ke kaulahao keiki i nā kālepa inoa ʻole me ka hoʻohana ʻana i zk-SNARKs.

Puʻu ʻenehana

  • NodeJS
  • Ho'ōla
  • etherium
  • lepo

Hoʻoponopono

I ka hoʻomohala ʻana i ka Plasma Cash, ua hoʻāʻo mākou i ka wikiwiki o ka ʻōnaehana a loaʻa nā hopena aʻe:

  • a hiki i 35 mau hana i kēlā me kēia kekona i hoʻohui ʻia i ka wai;
  • hiki i ka 1 mau hana ke mālama ʻia i loko o kahi poloka.

Ua hana ʻia nā hoʻāʻo ma nā kikowaena 3 aʻe:

1. Intel Core i7-6700 Quad-Core Skylake incl. NVMe SSD - 512 GB, 64 GB DDR4 RAM
Ua hoʻāla ʻia ʻo 3 hōʻoia ʻana i nā node Plasma Cash.

2. AMD Ryzen 7 1700X Octa-Core "Summit Ridge" (Zen), SATA SSD - 500 GB, 64 GB DDR4 RAM
Ua hookiekieia ka Ropsten testnet ETH node.
Ua hoʻāla ʻia ʻo 3 hōʻoia ʻana i nā node Plasma Cash.

3. ʻO Intel Core i9-9900K Octa-Core me. NVMe SSD - 1 TB, 64 GB DDR4 RAM
1 Ua hoʻāla ʻia ka node hoʻouna Plasma Cash.
Ua hoʻāla ʻia ʻo 3 hōʻoia ʻana i nā node Plasma Cash.
Ua hoʻomaka ʻia kahi hoʻāʻo e hoʻohui i nā kālepa i ka pūnaewele Plasma Cash.

Hōʻuluʻulu: 10 Plasma Cash nodes i kahi pūnaewele pilikino.

Hoao 1

Aia ka palena o 1 miliona mau hana i kēlā me kēia poloka. No laila, hāʻule ka 1 miliona mau hana i loko o 2 mau poloka (no ka mea e hoʻokele ka ʻōnaehana i kahi ʻāpana o nā hana a waiho i ka wā e hoʻouna ʻia ana).


Kūlana mua: poloka hope #7; 1 miliona mau hana a me nā hōʻailona i mālama ʻia i ka waihona.

00:00 - ka hoʻomaka ʻana o ka palapala hoʻokumu kālepa
01:37 - 1 miliona mau hana i hana ʻia a hoʻouna ʻia i ka node
01:46 — hoʻouna node i lawe i 240k mau hana mai ka loko wai a hoʻopaʻa i ka poloka #8. ʻIke pū mākou ua hoʻohui ʻia nā kālepa 320k i ka wai i 10 kekona
01:58 — kau inoa ʻia ka poloka #8 a hoʻouna ʻia no ka hōʻoia ʻana
02:03 — hoʻopaʻa ʻia ka poloka #8 a kāhea ʻia ka hana `submitBlock` o ka ʻaelike akamai me ka Merkle hash a me ka helu poloka.
02:10 - ua pau ka hana ʻana o ka demo script, nāna i hoʻouna i 1 miliona mau hana i 32 kekona
02:33 - ua hoʻomaka nā nodes e loaʻa ka ʻike i hoʻohui ʻia ka poloka #8 i ke kaulahao kumu, a hoʻomaka e hana i nā kālepa 240k
02:40 - 240k ua wehe ʻia mai ka loko wai, aia i loko o ka poloka #8
02:56 — hoʻouna node lawe i ke koena 760k kālepa mai ka loko wai a hoʻomaka i ka helu ʻana i ka Merkle hash a me ka pūlima poloka #9
03:20 - loaʻa nā node a pau he 1 miliona 240k mau hana a me nā hōʻailona
03:35 — kau inoa ʻia ka poloka #9 a hoʻouna ʻia no ka hōʻoia ʻana i nā node ʻē aʻe
03:41 - ua hewa ka pūnaewele
04:40 — e kali ana no ka poloka #9 ua pau ka manawa
04:54 — hoʻouna node lawe i ke koena 760k kālepa mai ka loko wai a hoʻomaka i ka helu ʻana i ka Merkle hash a me ka pūlima poloka #9
05:32 — kau inoa ʻia ka poloka #9 a hoʻouna ʻia no ka hōʻoia ʻana i nā node ʻē aʻe
05:53 — hōʻoia ʻia ka poloka #9 a hoʻouna ʻia i ke kaulahao kumu
06:17 - ua hoʻomaka nā nodes e loaʻa ka ʻike i hoʻohui ʻia ka poloka #9 i ke kaulahao kumu a hoʻomaka e hana i nā kālepa 760k
06:47 — ua hoʻomaʻemaʻe ka loko i nā hana ma ka poloka #9
09:06 - loaʻa nā node āpau i 2 miliona mau hana a me nā hōʻailona

Hoao 2

Aia ka palena o 350k no ka poloka. ʻO ka hopena, loaʻa iā mākou 3 poloka.


Kūlana mua: poloka hope #9; 2 miliona mau hana a me nā hōʻailona i mālama ʻia i ka waihona

00:00 - ua hoʻomaka mua ʻia ka palapala hoʻomohala kālepa
00:44 - 1 miliona mau hana i hana ʻia a hoʻouna ʻia i ka node
00:56 — hoʻouna node i lawe i 320k mau hana mai ka loko wai a hoʻopaʻa i ka poloka #10. ʻIke pū mākou ua hoʻohui ʻia nā kālepa 320k i ka wai i 10 kekona
01:12 — kau inoa ʻia ka poloka #10 a hoʻouna ʻia i nā node ʻē aʻe no ka hōʻoia ʻana
01:18 - ua pau ka hana ʻana o ka demo script, nāna i hoʻouna i 1 miliona mau hana i 34 kekona
01:20 — hōʻoia ʻia ka poloka #10 a hoʻouna ʻia i ke kaulahao kumu
01:51 - ua loaʻa nā nodes a pau i ka ʻike mai ke kaulahao kumu i hoʻohui ʻia ka poloka #10 a hoʻomaka e hoʻopili i nā kālepa 320k
02:01 - ua hoʻomaʻemaʻe ʻia ka loko wai no nā kālepa 320k i hoʻohui ʻia i ka poloka #10
02:15 — hoʻouna i ka node i lawe i 350k mau kālepa mai ka loko wai a hoʻopaʻa i ka poloka #11
02:34 — kau inoa ʻia ka poloka #11 a hoʻouna ʻia i nā node ʻē aʻe no ka hōʻoia ʻana
02:51 — hōʻoia ʻia ka poloka #11 a hoʻouna ʻia i ke kaulahao kumu
02:55 — ua hoʻopau ka node hope i nā hana mai ka poloka #10
10:59 — ua lōʻihi loa ka hana me ka hoʻouna ʻana i ka poloka #9 i ke kaulahao kumu, akā ua hoʻopau ʻia a loaʻa nā nodes a pau i ka ʻike e pili ana iā ia a hoʻomaka e hana i nā hana 350k.
11:05 - ua hoʻomaʻemaʻe ʻia ka loko wai no nā kālepa 320k i hoʻohui ʻia i ka poloka #11
12:10 - loaʻa nā node āpau i 1 miliona 670k mau hana a me nā hōʻailona
12:17 — hoʻouna i ka node i lawe i 330k mau kālepa mai ka loko wai a hoʻopaʻa i ka poloka #12
12:32 — kau inoa ʻia ka poloka #12 a hoʻouna ʻia i nā node ʻē aʻe no ka hōʻoia ʻana
12:39 — hōʻoia ʻia ka poloka #12 a hoʻouna ʻia i ke kaulahao kumu
13:44 - ua loaʻa i nā nodes a pau ka ʻike mai ke kaulahao kumu i hoʻohui ʻia ka poloka #12 a hoʻomaka e hoʻopili i nā hana 330k
14:50 - loaʻa nā node āpau i 2 miliona mau hana a me nā hōʻailona

Hoao 3

Ma nā kikowaena mua a me ka lua, ua pani ʻia kekahi node hōʻoia e ka node hoʻouna.


Kūlana mua: poloka hope #84; 0 nā hana a me nā hōʻailona i mālama ʻia i ka waihona

00:00 - Ua hoʻokuʻu ʻia nā palapala 3 e hana a hoʻouna i 1 miliona mau kālepa i kēlā me kēia
01:38 — 1 miliona mau hana i hana ʻia a hoʻomaka ka hoʻouna ʻana e waiho i ka node #3
01:50 — hoʻouna i ka node #3 i lawe i 330k mau kālepa mai ka loko wai a hoʻopaʻa i ka poloka #85 (f21). ʻIke pū mākou ua hoʻohui ʻia nā kālepa 350k i ka wai i 10 kekona
01:53 — 1 miliona mau hana i hana ʻia a hoʻomaka ka hoʻouna ʻana e waiho i ka node #1
01:50 — hoʻouna i ka node #3 i lawe i 330k mau kālepa mai ka loko wai a hoʻopaʻa i ka poloka #85 (f21). ʻIke pū mākou ua hoʻohui ʻia nā kālepa 350k i ka wai i 10 kekona
02:01 — hoʻouna i ka node #1 i lawe i 250k mau hana mai ka loko wai a me nā palapala poloka #85 (65e)
02:06 — kau inoa ʻia ka poloka #85 (f21) a hoʻouna ʻia i nā node ʻē aʻe no ka hōʻoia ʻana.
02:08 — hōʻike hōʻikeʻike o ka server #3, nāna i hoʻouna i 1 miliona mau hana i 30 kekona, pau ka hana.
02:14 — hōʻoia ʻia ka poloka #85 (f21) a hoʻouna ʻia i ke kaulahao kumu
02:19 — kau inoa ʻia ka poloka #85 (65e) a hoʻouna ʻia i nā node ʻē aʻe no ka hōʻoia ʻana.
02:22 — 1 miliona mau hana i hana ʻia a hoʻomaka ka hoʻouna ʻana e waiho i ka node #2
02:27 — hoʻopaʻa ʻia ka poloka #85 (65e) a hoʻouna ʻia i ke kaulahao kumu
02:29 — hoʻouna i ka node #2 i lawe i 111855 mau hana mai ka loko wai a me nā palapala poloka #85 (256).
02:36 — kau inoa ʻia ka poloka #85 (256) a hoʻouna ʻia i nā node ʻē aʻe no ka hōʻoia ʻana.
02:36 — hōʻike hōʻikeʻike o ka server #1, nāna i hoʻouna i 1 miliona mau hana i 42.5 kekona, pau ka hana.
02:38 — hōʻoia ʻia ka poloka #85 (256) a hoʻouna ʻia i ke kaulahao kumu
03:08 — ua pau ka hana ʻana o ka server #2 script, nāna i hoʻouna i 1 miliona mau kālepa i 47 kekona
03:38 - ua loaʻa i nā nodes a pau ka ʻike mai ke kaulahao kumu i hoʻopaʻa ʻia i ka #85 (f21), #86(65e), #87(256) i hoʻohui ʻia a hoʻomaka e hoʻohana i nā hana 330k, 250k, 111855.
03:49 - hoʻomaʻemaʻe ʻia ka loko wai ma 330k, 250k, 111855 mau hana i hoʻohui ʻia i nā poloka #85 (f21), #86(65e), #87(256)
03:59 — hoʻouna i ka node #1 i lawe i 888145 mau hana mai ka loko wai a me nā palapala poloka #88 (214), waiho i ka node #2 i lawe i 750k mau hana mai ka loko wai a me nā palapala poloka #88 (50a), waiho i ka node #3 lawe 670k mau hana mai ka loko a me nā ʻano poloka #88 (d3b)
04:44 — kau inoa ʻia ka poloka #88 (d3b) a hoʻouna ʻia i nā node ʻē aʻe no ka hōʻoia ʻana.
04:58 — kau inoa ʻia ka poloka #88 (214) a hoʻouna ʻia i nā node ʻē aʻe no ka hōʻoia ʻana.
05:11 — kau inoa ʻia ka poloka #88 (50a) a hoʻouna ʻia i nā node ʻē aʻe no ka hōʻoia ʻana.
05:11 — hōʻoia ʻia ka poloka #85 (d3b) a hoʻouna ʻia i ke kaulahao kumu
05:36 — hōʻoia ʻia ka poloka #85 (214) a hoʻouna ʻia i ke kaulahao kumu
05:43 - ua loaʻa i nā nodes a pau ka ʻike mai ke kaulahao kumu i hoʻopaʻa ʻia i ka #88 (d3b), #89(214) i hoʻohui ʻia a ke hoʻomaka nei e hoʻohana i 670k, 750k mau kālepa.
06:50 — ma muli o ka hemahema o ke kamaʻilio ʻana, ʻaʻole i hōʻoia ʻia ka poloka #85 (50a).
06:55 — hoʻouna i ka node #2 i lawe i 888145 mau hana mai ka loko wai a me nā palapala poloka #90 (50a)
08:14 — kau inoa ʻia ka poloka #90 (50a) a hoʻouna ʻia i nā node ʻē aʻe no ka hōʻoia ʻana.
09:04 — hōʻoia ʻia ka poloka #90 (50a) a hoʻouna ʻia i ke kaulahao kumu
11:23 - ua loaʻa nā nodes a pau i ka ʻike mai ke kaulahao kumu i hoʻohui ʻia ka poloka #90 (50a), a hoʻomaka e hoʻopili i nā hana 888145. Ma ka manawa like, ua hoʻohana mua ke kikowaena #3 i nā kālepa mai nā poloka #88 (d3b), #89(214)
12:11 - nele nā ​​loko a pau
13:41 — loaʻa nā node āpau o ka server #3 he 3 miliona mau kālepa a me nā hōʻailona
14:35 — loaʻa nā node āpau o ka server #1 he 3 miliona mau kālepa a me nā hōʻailona
19:24 — loaʻa nā node āpau o ka server #2 he 3 miliona mau kālepa a me nā hōʻailona

Keakea

I ka wā o ka hoʻomohala ʻana o Plasma Cash, ua loaʻa iā mākou nā pilikia e hiki mai ana, a mākou i hoʻoponopono mālie a hoʻoholo:

1. Ka paio i loko o ka pilina o nā ʻano hana ʻōnaehana. ʻO kahi laʻana, ʻo ka hana o ka hoʻohui ʻana i nā kālepa i ka loko i hoʻopaʻa ʻia i ka hana o ka hoʻouna ʻana a me ka hōʻoia ʻana i nā poloka, a me ka hope, i alakaʻi i ka hāʻule o ka wikiwiki.

2. ʻAʻole i maopopo koke ke ʻano o ka hoʻouna ʻana i kahi helu nui o nā kālepa ʻoiai e hōʻemi ana i nā kumukūʻai hoʻoili data.

3. ʻAʻole maopopo pehea a me kahi e mālama ai i ka ʻikepili i mea e loaʻa ai nā hopena kiʻekiʻe.

4. ʻAʻole maopopo i ke ʻano o ka hoʻonohonoho ʻana i kahi pūnaewele ma waena o nā nodes, no ka mea, ʻo ka nui o kahi poloka me 1 miliona mau kālepa e lawe ma kahi o 100 MB.

5. ʻO ka hana ʻana ma ke ʻano hilo hoʻokahi e wāwahi i ka pilina ma waena o nā nodes ke hiki mai nā helu lōʻihi (e laʻa, ke kūkulu ʻana i kahi lāʻau Merkle a me ka helu ʻana i kāna hash).

Pehea mākou i hana ai i kēia mau mea a pau?

ʻO ka mana mua o ka Plasma Cash node he ʻano hui e hiki ke hana i nā mea āpau i ka manawa like: ʻae i nā kālepa, hoʻouna a hōʻoia i nā poloka, a hāʻawi i kahi API no ke komo ʻana i ka ʻikepili. No ka mea, ʻo ka NodeJS he kaula hoʻokahi wale nō, ua kāohi ka hana helu kumu lāʻau Merkle kaumaha i ka hana hoʻohui. Ua ʻike mākou i ʻelua mau koho no ka hoʻoponopono ʻana i kēia pilikia:

1. E hoʻolele i nā kaʻina hana NodeJS, e hana ana kēlā me kēia i nā hana kikoʻī.

2. E hoʻohana i ka worker_threads a hoʻoneʻe i ka hoʻokō ʻana i kahi hapa o ke code i loko o nā kaula.

ʻO ka hopena, ua hoʻohana mākou i nā koho ʻelua i ka manawa like: ua hoʻokaʻawale mākou i hoʻokahi node i 3 mau ʻāpana hiki ke hana kaʻawale, akā i ka manawa like synchronously

1. Node hoʻouna, e ʻae ana i nā kālepa i loko o ka loko wai a hana i nā poloka.

2. He node hōʻoia e nānā i ka pono o nā node.

3. API node - hāʻawi i kahi API no ke komo ʻana i ka ʻikepili.

I kēia hihia, hiki iā ʻoe ke hoʻohui i kēlā me kēia node ma o kahi socket unix me ka cli.

Ua hoʻoneʻe mākou i nā hana koʻikoʻi, e like me ka helu ʻana i ka lāʻau Merkle, i loko o kahi kaula kaʻawale.

No laila, ua hoʻokō mākou i ka hana maʻamau o nā hana Plasma Cash i ka manawa like a me ka ʻole o ka hāʻule.

I ka manawa i hana ai ka ʻōnaehana, hoʻomaka mākou e hoʻāʻo i ka wikiwiki a, ʻaʻole naʻe, loaʻa nā hopena maikaʻi ʻole: 5 mau hana i kēlā me kēia kekona a hiki i ka 000 mau hana i kēlā me kēia poloka. Pono wau e noʻonoʻo i ka mea i hoʻokō hewa ʻia.

I ka hoʻomaka ʻana, hoʻomaka mākou e hoʻāʻo i ke ʻano o ke kamaʻilio ʻana me Plasma Cash e ʻike i ka hiki ke kiʻekiʻe o ka ʻōnaehana. Ua kākau mākou ma mua e hāʻawi ka Plasma Cash node i kahi unix socket interface. I ka hoʻomaka ʻana ma ka kikokikona. Ua hoʻouna ʻia nā mea json me ka hoʻohana ʻana iā `JSON.parse()` a me `JSON.stringify()`.

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

Ua ana mākou i ka māmā hoʻoili o ia mau mea a loaʻa iā ~ 130k no kekona. Ua ho'āʻo mākou e pani i nā hana maʻamau no ka hana ʻana me json, akā ʻaʻole maikaʻi ka hana. Pono ka ʻenekini V8 e hoʻoponopono maikaʻi ʻia no kēia mau hana.

Ua hana mākou me nā kālepa, nā hōʻailona, ​​a me nā poloka ma o nā papa. I ka hana ʻana i ia mau papa, hāʻule ka hana i 2 mau manawa, e hōʻike ana ʻaʻole kūpono ʻo OOP iā mākou. Pono wau e kākau hou i nā mea a pau i kahi hana maʻemaʻe.

Ka hoʻopaʻa ʻana ma ka waihona

I ka hoʻomaka, ua koho ʻia ʻo Redis no ka mālama ʻana i ka ʻikepili ma ke ʻano he hoʻokahi o nā hopena ʻoi loa e hoʻokō i kā mākou mau koi: mālama waiwai kī, hana me nā papa hash, sets. Hoʻokuʻu mākou i ka redis-benchmark a loaʻa iā ~ 80k mau hana i kēlā me kēia kekona ma 1 pipelining mode.

No ka hana kiʻekiʻe, hoʻokani maikaʻi mākou iā Redis:

  • Ua hoʻokumu ʻia kahi pilina unix socket.
  • Ua hoʻopau mākou i ka mālama ʻana i ka mokuʻāina i ka disk (no ka hilinaʻi, hiki iā ʻoe ke hoʻonohonoho i kahi kope a mālama i ka disk ma kahi Redis ʻokoʻa).

Ma Redis, he papaʻaina hash ka loko wai no ka mea pono e hiki iā mākou ke kiʻi i nā hana āpau i hoʻokahi nīnau a holoi i nā hana hoʻokahi. Ua ho'āʻo mākou e hoʻohana i ka papa inoa maʻamau, akā ʻoi aku ka lohi i ka wā e wehe ana i ka papa inoa holoʻokoʻa.

Ke hoʻohana nei i ka NodeJS maʻamau, ua loaʻa i nā hale waihona puke Redis kahi hana o 18k mau hana i kēlā me kēia kekona. Ua hāʻule ka māmā he 9 manawa.

Ma muli o ka hōʻike ʻana o ka benchmark iā mākou he 5 mau manawa ʻoi aku ka nui o nā mea hiki, ua hoʻomaka mākou e loiloi. Ua hoʻololi mākou i ka waihona i ioredis a loaʻa ka hana o 25k i kekona. Hoʻohui mākou i nā hana hoʻokahi me ka hoʻohana ʻana i ke kauoha `hset`. No laila ua hana mākou i nā nīnau he nui ma Redis. Ua ulu ka manaʻo e hoʻohui i nā hana i loko o nā pūʻulu a hoʻouna iā lākou me hoʻokahi kauoha `hmset`. ʻO ka hopena he 32k i kekona.

No kekahi mau kumu, a mākou e wehewehe ai ma lalo nei, hana mākou me ka ʻikepili me ka hoʻohana ʻana i ka 'Buffer' a, e like me ka mea i ʻike ʻia, inā ʻoe e hoʻololi iā ia i kikokikona (`buffer.toString('hex')`) ma mua o ke kākau ʻana, hiki iā ʻoe ke loaʻa hou. hoʻokō. No laila, ua hoʻonui ʻia ka wikiwiki i 35k no kekona. I kēia manawa, ua hoʻoholo mākou e hoʻokuʻu i ka loiloi hou aʻe.

Pono mākou e hoʻololi i kahi protocol binary no ka mea:

1. Hoʻopili pinepine ka ʻōnaehana i nā hashes, nā pūlima, a me nā mea ʻē aʻe, a no kēia mea pono ia i ka ʻikepili i ka ʻBuffer.

2. Ke hoʻouna ʻia ma waena o nā lawelawe, ʻoi aku ke kaumaha o ka ʻikepili binary ma mua o ka kikokikona. No ka laʻana, i ka hoʻouna ʻana i kahi poloka me 1 miliona mau kālepa, hiki i ka ʻikepili i loko o ka kikokikona ke piʻi ma mua o 300 megabytes.

3. Hoʻololi mau ʻia ka ʻikepili i ka hana.

No laila, ua lawe mākou i kā mākou protocol binary ponoʻī no ka mālama ʻana a me ka hoʻouna ʻana i ka ʻikepili, i hoʻomohala ʻia ma ke kumu o ka waihona `binary-data` kupanaha.

ʻO ka hopena, ua loaʻa iā mākou nā ʻōnaehana data penei:

—Ka hana

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

— Hoailona

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

—Paka

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

Me nā kauoha maʻamau `BD.encode(block, Protocol).slice();` a me `BD.decode(buffer, Protocol)` hoʻololi mākou i ka ʻikepili i 'Buffer` no ka mālama ʻana ma Redis a i ʻole ka hoʻouna ʻana i kekahi node a kiʻi i ka ʻikepili hope.

Loaʻa iā mākou nā protocol binary 2 no ka hoʻoili ʻana i ka ʻikepili ma waena o nā lawelawe:

— Kūkākūkā no ka launa pū ʻana me Plasma Node ma ke kumu 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)
  }
  ```

kahi:

  • ʻano ʻano — ka hana e hana ʻia, no ka laʻana, 1 — sendTransaction, 2 — getTransaction;
  • ʻuku uku - ʻikepili pono e hāʻawi ʻia i ka hana kūpono;
  • `messageId` - memo id i hiki ke ʻike ʻia ka pane.

— Kaʻina no ka launa pū ʻana ma waena o nā 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)
  }
  ```

kahi:

  • `code` — code memo, no ka laʻana 6 — PREPARE_NEW_BLOCK, 7 — BLOCK_VALID, 8 — BLOCK_COMMIT;
  • `versionProtocol` - ka mana protocol, no ka mea, hiki ke hoʻokiʻekiʻe ʻia nā nodes me nā ʻano like ʻole ma ka pūnaewele a hiki iā lākou ke hana ʻokoʻa;
  • `seq` - mea hōʻike memo;
  • `countChunk` и `chunkNumber` pono no ka mahele ana i na memo nui;
  • `lōʻihi` и ʻuku uku ka lōʻihi a me ka ʻikepili ponoʻī.

Ma muli o kā mākou paʻi mua ʻana i ka ʻikepili, ʻoi aku ka wikiwiki o ka ʻōnaehana hope ma mua o ka waihona 'rlp' o Ethereum. ʻO ka mea pōʻino, ʻaʻole hiki iā mākou ke hōʻole, no ka mea he mea pono e hoʻopau i ka ʻaelike akamai, a mākou e manaʻo nei e hana i ka wā e hiki mai ana.

Inā hiki iā mākou ke hiki i ka wikiwiki 35 000 nā hana i kēlā me kēia kekona, pono mākou e hoʻoponopono iā lākou i ka manawa kūpono. No ka mea, he 30 kekona ka lōʻihi o ka hoʻokumu ʻana o ka poloka, pono mākou e hoʻokomo i loko o ka poloka 1 000 000 nā kālepa, ʻo ia hoʻi ka hoʻouna ʻana aku 100 MB o ka ʻikepili.

I ka wā mua, ua hoʻohana mākou i ka waihona 'ethereumjs-devp2p' e kamaʻilio ma waena o nā nodes, akā ʻaʻole hiki iā ia ke mālama i ka ʻikepili he nui. ʻO ka hopena, ua hoʻohana mākou i ka waihona `ws` a ua hoʻonohonoho mākou i ka hoʻouna ʻana i ka ʻikepili binary ma o ka websocket. ʻOiaʻiʻo, ua loaʻa pū mākou i nā pilikia i ka hoʻouna ʻana i nā ʻeke ʻikepili nui, akā ua hoʻokaʻawale mākou iā lākou i mau ʻāpana a i kēia manawa ua pau kēia mau pilikia.

Hoʻokumu pū i kahi lāʻau Merkle a me ka helu ʻana i ka hash 1 000 000 pono nā kālepa e pili ana 10 kekona o ka helu mau. I kēia manawa, hiki i ka pilina me nā nodes a pau ke haki. Ua hoʻoholo ʻia e hoʻoneʻe i kēia helu ʻana i kahi pae ʻokoʻa.

Nā hopena:

ʻO ka ʻoiaʻiʻo, ʻaʻole he mea hou kā mākou ʻike, akā no kekahi kumu e poina ai ka poʻe loea i ka wā e ulu ana.

  • Ke hoʻohana nei i ka Functional Programming ma kahi o ka Object-Oriented Programming e hoʻomaikaʻi i ka huahana.
  • ʻOi aku ka hewa o ka monolith ma mua o kahi hoʻolālā lawelawe no kahi ʻōnaehana NodeJS huahua.
  • ʻO ka hoʻohana ʻana i nā 'worker_threads' no ka helu kaumaha e hoʻomaikaʻi i ka pane ʻana o ka ʻōnaehana, ʻoi aku ka maikaʻi i ka wā e pili ana i nā hana i/o.
  • ʻOi aku ka paʻa a ʻoi aku ka wikiwiki o ke kumu unix ma mua o nā noi http.
  • Inā ponoʻoe e hoʻololi wikiwiki i nāʻikepili nui ma luna o ka pūnaewele,ʻoi aku ka maikaʻi o ka hoʻohanaʻana i nā websockets a hoʻouna i nāʻikepili binary, i māheleʻia i nā'āpana, hiki ke hoʻounaʻia ināʻaʻole lākou e hiki mai, a laila e hui pūʻia i hoʻokahi memo.

Ke kono aku nei makou ia oe e kipa mai GitHub papahana: https://github.com/opporty-com/Plasma-Cash/tree/new-version

Ua kākau pū ʻia ka ʻatikala e Alexander Nashivan, haku haku Hoʻoponopono akamai Inc.

Source: www.habr.com

Pākuʻi i ka manaʻo hoʻopuka