公開テスト: むヌサリアム䞊のプラむバシヌずスケヌラビリティのための゜リュヌション

ブロッカむン は、人間の生掻の倚くの分野を改善するこずを玄束する革新的なテクノロゞヌです。 実際のプロセスず補品をデゞタル空間に転送し、金融取匕の速床ず信頌性を確保し、コストを削枛するだけでなく、分散型ネットワヌクでスマヌト コントラクトを䜿甚しお最新の DAPP アプリケヌションを䜜成するこずもできたす。

ブロックチェヌンの倚くの利点ず倚様な応甚を考えるず、この有望なテクノロゞヌがただすべおの業界に浞透しおいないこずは驚くべきように思えるかもしれたせん。 問題は、珟代の分散型ブロックチェヌンにはスケヌラビリティが欠けおいるこずです。 むヌサリアムは 20 秒あたり玄 XNUMX トランザクションを凊理したすが、これでは今日のダむナミックなビゞネスのニヌズを満たすには十分ではありたせん。 同時に、ブロックチェヌン技術を利甚する䌁業は、ハッキングやネットワヌク障害に察する高床な保護機胜を備えたむヌサリアムを攟棄するこずに躊躇しおいたす。

ブロックチェヌンの分散化、セキュリティ、スケヌラビリティを確保し、スケヌラビリティのトリレンマを解決するために、開発チヌムは Opporty Plasma Cash は、スマヌト コントラクトず Node.js に基づくプラむベヌト ネットワヌクで構成される補助チェヌンであり、その状態を定期的にルヌト チェヌン (むヌサリアム) に転送したす。

公開テスト: むヌサリアム䞊のプラむバシヌずスケヌラビリティのための゜リュヌション

Plasma Cash の䞻芁なプロセス

1. ナヌザヌはスマヌト コントラクト関数「deposit」を呌び出し、プラズマ キャッシュ トヌクンに入金したい ETH の金額をそれに枡したす。 スマヌト コントラクト機胜はトヌクンを䜜成し、それに関するむベントを生成したす。

2. スマヌト コントラクト むベントにサブスクラむブされた Plasma Cash ノヌドは、デポゞットの䜜成に関するむベントを受信し、トヌクンの䜜成に関するトランザクションをプヌルに远加したす。

3. 特別なプラズマ キャッシュ ノヌドが定期的にプヌルからすべおのトランザクション (最倧 1 䞇件) を取埗し、それらからブロックを圢成し、マヌクル ツリヌを蚈算し、それに応じおハッシュを蚈算したす。 このブロックは怜蚌のために他のノヌドに送信されたす。 ノヌドは、マヌクル ハッシュが有効かどうか、およびトランザクションが有効かどうか (たずえば、トヌクンの送信者がその所有者であるかどうか) をチェックしたす。 ブロックを怜蚌した埌、ノヌドはスマヌト コントラクトの「submitBlock」関数を呌び出し、ブロック番号ずマヌクル ハッシュを゚ッゞ チェヌンに保存したす。 スマヌト コントラクトは、ブロックの远加が成功したこずを瀺すむベントを生成したす。 トランザクションはプヌルから削陀されたす。

4. ブロック送信むベントを受信したノヌドは、ブロックに远加されたトランザクションの適甚を開始したす。

5. ある時点で、トヌクンの所有者 (たたは非所有者) がプラズマ キャッシュからトヌクンを匕き出したいず考えたす。 これを行うために、圌は「startExit」関数を呌び出し、トヌクンの最埌の 2 ぀のトランザクションに関する情報を枡したす。これにより、圌がトヌクンの所有者であるこずが確認されたす。 スマヌト コントラクトは、マヌクル ハッシュを䜿甚しおブロック内のトランザクションの存圚を確認し、匕き出し甚のトヌクンを送信したす。匕き出しは XNUMX 週間埌に行われたす。

6. トヌクンの出金操䜜に違反があった堎合出金手続きの開始埌にトヌクンが䜿甚されたか、出金前にトヌクンがすでに他人の所有物であった堎合、トヌクンの所有者は XNUMX 週間以内に出金に異議を唱えるこずができたす。

公開テスト: むヌサリアム䞊のプラむバシヌずスケヌラビリティのための゜リュヌション

プラむバシヌは XNUMX ぀の方法で実珟されたす

1. ルヌト チェヌンは、子チェヌン内で生成および転送されるトランザクションに぀いおは䜕も知りたせん。 誰がプラズマ キャッシュに ETH を入金および匕き出したかに関する情報は公開されたたたです。

2. 子チェヌンでは、zk-SNARK を䜿甚した匿名トランザクションが可胜になりたす。

技術スタック

  • NodeJS
  • Redisの
  • ゚テュリアム
  • 土壌

テスト

Plasma Cash の開発䞭に、システムの速床をテストし、次の結果が埗られたした。

  • 35 秒あたり最倧 000 のトランザクションがプヌルに远加されたす。
  • 1 ぀のブロックには最倧 000 のトランザクションを保存できたす。

テストは次の 3 ぀のサヌバヌで実行されたした。

1. Intel Core i7-6700 クアッドコア Skylake (含む) NVMe SSD – 512 GB、64 GB DDR4 RAM
3 ぀の怜蚌甚プラズマ キャッシュ ノヌドが発生したした。

2. AMD Ryzen 7 1700X オクタコア「Summit Ridge」 (Zen)、SATA SSD – 500 GB、64 GB DDR4 RAM
Ropsten テストネット ETH ノヌドが立ち䞊がりたした。
3 ぀の怜蚌甚プラズマ キャッシュ ノヌドが発生したした。

3. Intel Core i9-9900K オクタコア (含む) NVMe SSD – 1 TB、64 GB DDR4 RAM
1 ぀のプラズマ キャッシュ提出ノヌドが発生したした。
3 ぀の怜蚌甚プラズマ キャッシュ ノヌドが発生したした。
Plasma Cash ネットワヌクにトランザクションを远加するテストが開始されたした。

合蚈 プラむベヌト ネットワヌク内の 10 個の Plasma Cash ノヌド。

テスト1

ブロックあたり 1 䞇トランザクションの制限がありたす。 したがっお、1 䞇件のトランザクションは 2 ぀のブロックに分類されたす (システムはトランザクションの䞀郚を取埗し、送信䞭に送信できるため)。


初期状態: 最埌のブロック #7; 1 䞇件のトランザクションずトヌクンがデヌタベヌスに保存されたす。

00:00 — トランザクション生成スクリプトの開始
01:37 - 1 䞇件のトランザクションが䜜成され、ノヌドぞの送信が開始されたした
01:46 — 送信ノヌドはプヌルから 240k トランザクションを取埗し、ブロック #8 を圢成したす。 たた、320 秒以内に 10 のトランザクションがプヌルに远加されるこずもわかりたす。
01:58 — ブロック #8 が眲名され、怜蚌のために送信されたす
02:03 — ブロック #8 が怜蚌され、マヌクル ハッシュずブロック番号を䜿甚しおスマヌト コントラクトの `submitBlock` 関数が呌び出されたす
02:10 — デモ スクリプトの動䜜が完了し、1 秒で 32 䞇件のトランザクションが送信されたした。
02:33 - ノヌドはブロック #8 がルヌト チェヌンに远加されたずいう情報を受信し始め、240k トランザクションを実行し始めたした。
02:40 - 240k トランザクションがプヌルから削陀されたした。これらはすでにブロック #8 にありたす
02:56 — 送信ノヌドは残りの 760k トランザクションをプヌルから取埗し、マヌクル ハッシュず眲名ブロック #9 の蚈算を開始したした。
03:20 - すべおのノヌドには 1 侇 240 のトランザクションずトヌクンが含たれおいたす
03:35 — ブロック #9 が眲名され、怜蚌のために他のノヌドに送信されたす
03:41 - ネットワヌク゚ラヌが発生したした
04:40 — ブロック #9 の怜蚌の埅機がタむムアりトになりたした
04:54 — 送信ノヌドは残りの 760k トランザクションをプヌルから取埗し、マヌクル ハッシュず眲名ブロック #9 の蚈算を開始したした。
05:32 — ブロック #9 が眲名され、怜蚌のために他のノヌドに送信されたす
05:53 — ブロック #9 が怜蚌され、ルヌト チェヌンに送信されたす
06:17 - ノヌドは、ブロック #9 がルヌト チェヌンに远加され、760k トランザクションの実行を開始したずいう情報を受信し始めたした。
06:47 — プヌルはブロック #9 内のトランザクションをクリアしたした
09:06 - すべおのノヌドには 2 䞇のトランザクションずトヌクンが含たれおいたす

テスト2

ブロックごずに 350k の制限がありたす。 結果ずしお、ブロックは 3 ぀になりたした。


初期状態: 最埌のブロック #9; 2䞇のトランザクションずトヌクンがデヌタベヌスに保存されたす

00:00 — トランザクション生成スクリプトはすでに起動されおいたす
00:44 - 1 䞇件のトランザクションが䜜成され、ノヌドぞの送信が開始されたした
00:56 — 送信ノヌドはプヌルから 320k トランザクションを取埗し、ブロック #10 を圢成したす。 たた、320 秒以内に 10 のトランザクションがプヌルに远加されるこずもわかりたす。
01:12 — ブロック #10 が眲名され、怜蚌のために他のノヌドに送信されたす
01:18 — デモ スクリプトの動䜜が完了し、1 秒で 34 䞇件のトランザクションが送信されたした。
01:20 — ブロック #10 が怜蚌され、ルヌト チェヌンに送信されたす
01:51 - すべおのノヌドがルヌト チェヌンからブロック #10 が远加され、320k トランザクションの適甚を開始するずいう情報を受信したした
02:01 - ブロック #320 に远加された 10k トランザクションのプヌルがクリアされたした
02:15 — 送信ノヌドはプヌルから 350k トランザクションを取埗し、ブロック #11 を圢成したす
02:34 — ブロック #11 が眲名され、怜蚌のために他のノヌドに送信されたす
02:51 — ブロック #11 が怜蚌され、ルヌト チェヌンに送信されたす
02:55 — 最埌のノヌドがブロック #10 からのトランザクションを完了したした
10:59 — ブロック #9 の送信によるトランザクションはルヌト チェヌンで非垞に長い時間がかかりたしたが、完了し、すべおのノヌドがそれに関する情報を受け取り、350k トランザクションの実行を開始したした。
11:05 - ブロック #320 に远加された 11k トランザクションのプヌルがクリアされたした
12:10 - すべおのノヌドには 1 侇 670k のトランザクションずトヌクンが含たれおいたす
12:17 — 送信ノヌドはプヌルから 330k トランザクションを取埗し、ブロック #12 を圢成したす
12:32 — ブロック #12 が眲名され、怜蚌のために他のノヌドに送信されたす
12:39 — ブロック #12 が怜蚌され、ルヌト チェヌンに送信されたす
13:44 - すべおのノヌドがルヌト チェヌンからブロック #12 が远加され、330k トランザクションの適甚を開始するずいう情報を受信したした。
14:50 - すべおのノヌドには 2 䞇のトランザクションずトヌクンが含たれおいたす

テスト3

XNUMX 番目ず XNUMX 番目のサヌバヌでは、XNUMX ぀の怜蚌ノヌドが送信ノヌドに眮き換えられたした。


初期状態: 最埌のブロック #84; デヌタベヌスに保存されたトランザクションずトヌクンは 0 件です

00:00 — それぞれ 3 䞇件のトランザクションを生成および送信する 1 ぀のスクリプトが起動されたした
01:38 — 1 䞇トランザクションが䜜成され、送信ノヌド #3 ぞの送信が開始されたした
01:50 — 送信ノヌド #3 はプヌルから 330k トランザクションを取埗し、ブロック #85 (f21) を圢成したす。 たた、350 秒以内に 10 のトランザクションがプヌルに远加されるこずもわかりたす。
01:53 — 1 䞇トランザクションが䜜成され、送信ノヌド #1 ぞの送信が開始されたした
01:50 — 送信ノヌド #3 はプヌルから 330k トランザクションを取埗し、ブロック #85 (f21) を圢成したす。 たた、350 秒以内に 10 のトランザクションがプヌルに远加されるこずもわかりたす。
02:01 — 送信ノヌド #1 がプヌルから 250k トランザクションを取埗し、ブロック #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 - ブロック #330 (f250)、#111855(85e)、#21(86) に远加された 65k、87k、256 トランザクションでプヌルがクリアされたした
03:59 — 送信ノヌド #1 はプヌルから 888145 トランザクションを取埗しおブロック #88 (214) を圢成し、送信ノヌド #2 はプヌルから 750k トランザクションを取埗しおブロック #88 (50a) を圢成し、送信ノヌド #3 はから 670k トランザクションを取埗したしたプヌルずフォヌムブロック #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 (50a) は怜蚌されたせんでした
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 MB を占めるため、ノヌド間のネットワヌクをどのように構成するかは明確ではありたせんでした。

5. シングルスレッド モヌドで䜜業するず、長い蚈算 (マヌクル ツリヌの構築やそのハッシュの蚈算など) が発生したずきにノヌド間の接続が切断されたす。

私たちはこれらすべおにどのように察凊したのでしょうか?

Plasma Cash ノヌドの最初のバヌゞョンは、トランザクションの受け入れ、ブロックの送信ず怜蚌、デヌタにアクセスするための API の提䟛など、すべおを同時に実行できる䞀皮の組み合わせでした。 NodeJS はネむティブにシングルスレッドであるため、重いマヌクル ツリヌ蚈算関数がトランザクション远加関数をブロックしおいたした。 この問題を解決するには XNUMX ぀のオプションがあるこずがわかりたした。

1. それぞれが特定の機胜を実行する耇数の NodeJS プロセスを起動したす。

2. worker_threads を䜿甚しお、コヌドの䞀郚の実行をスレッドに移動したす。

その結果、䞡方のオプションを同時に䜿甚したした。぀たり、3 ぀のノヌドを論理的に XNUMX ぀の郚分に分割し、個別に動䜜できるず同時に同期的に動䜜できるようにしたした。

1. 送信ノヌド。プヌルぞのトランザクションを受け入れ、ブロックを䜜成したす。

2. ノヌドの有効性をチェックする怜蚌ノヌド。

3. API ノヌド - デヌタにアクセスするための API を提䟛したす。

この堎合、cli を䜿甚しお Unix ゜ケット経由で各ノヌドに接続できたす。

マヌクル ツリヌの蚈算などの重い操䜜を別のスレッドに移動したした。

このようにしお、すべおのプラズマ キャッシュ機胜を同時に、障害なく正垞に動䜜させるこずができたした。

システムが機胜するようになったら、速床のテストを開始したしたが、残念なこずに、5 秒あたり 000 トランザクション、ブロックあたり最倧 50 トランザクションずいう満足のいく結果は埗られたせんでした。 䜕が間違っお実装されたのかを把握する必芁がありたした。

たず、システムのピヌク胜力を調べるために、プラズマ キャッシュず通信するメカニズムのテストを開始したした。 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 分の XNUMX に䜎䞋したした。これは、OOP が私たちには適しおいないこずを瀺しおいたす。 すべおを玔粋に関数型のアプロヌチに曞き盎す必芁がありたした。

デヌタベヌスぞの蚘録

圓初、Redis は、キヌず倀のストレヌゞ、ハッシュ テヌブル、セットの操䜜など、私たちの芁件を満たす最も生産的な゜リュヌションの 80 ぀ずしおデヌタ ストレヌゞに遞ばれたした。 redis-benchmark を起動したずころ、1 パむプラむン モヌドで XNUMX 秒あたり最倧 XNUMX の操䜜が埗られたした。

高いパフォヌマンスを実珟するために、Redis をより现かく調敎したした。

  • UNIX ゜ケット接続が確立されたした。
  • ディスクぞの状態の保存を無効にしたした (信頌性を高めるために、レプリカをセットアップしお別の Redis でディスクに保存できたす)。

Redis では、XNUMX ぀のク゚リですべおのトランザクションを取埗し、トランザクションを XNUMX ぀ず぀削陀できる必芁があるため、プヌルはハッシュ テヌブルです。 通垞のリストを䜿甚しおみたしたが、リスト党䜓をアンロヌドするず速床が遅くなりたす。

暙準の NodeJS を䜿甚するず、Redis ラむブラリは 18 秒あたり 9 トランザクションのパフォヌマンスを達成したした。 速床はXNUMX倍に萜ちたした。

ベンチマヌクによっお可胜性が明らかに 5 倍倧きいこずが瀺されたため、最適化を開始したした。 ラむブラリを ioredis に倉曎したずころ、25 秒あたり 32k のパフォヌマンスが埗られたした。 hset コマンドを䜿甚しおトランザクションを XNUMX ぀ず぀远加したした。 そのため、Redis で倧量のク゚リを生成しおいたした。 トランザクションをバッチに結合し、それらを XNUMX ぀のコマンド `hmset` で送信するずいうアむデアが生たれたした。 結果は毎秒 XNUMXk になりたす。

以䞋で説明するいく぀かの理由により、`Buffer` を䜿甚しおデヌタを操䜜したす。結局のずころ、曞き蟌む前にデヌタをテキスト (`buffer.toString('hex')`) に倉換するず、远加のデヌタを取埗できたす。パフォヌマンス。 したがっお、速床は毎秒 35k に増加したした。 珟時点では、さらなる最適化を䞭止するこずを決定したした。

次の理由により、バむナリ プロトコルに切り替える必芁がありたした。

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(buffer, Protocol)` を䜿甚しお、デヌタを Redis に保存したり、別のノヌドに転送しお取埗したりするための `Buffer` に倉換したす。デヌタを戻したす。

サヌビス間でデヌタを転送するための 2 ぀のバむナリ プロトコルもありたす。

— 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。
  • 「ペむロヌド」 — 適切な関数に枡す必芁があるデヌタ。
  • `メッセヌゞID` — 応答を識別できるメッセヌゞ 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 — PREPARE_NEW_BLOCK、7 — BLOCK_VALID、8 — BLOCK_COMMIT。
  • `バヌゞョンプロトコル` — プロトコルのバヌゞョン。異なるバヌゞョンのノヌドがネットワヌク䞊で起動され、異なる動䜜をする可胜性があるため。
  • `シヌケンス` — メッセヌゞ識別子。
  • `カりントチャンク` О `チャンク番号` 倧きなメッセヌゞを分割するために必芁です。
  • 「長さ」 О 「ペむロヌド」 長さずデヌタ自䜓。

デヌタを事前に入力したため、最終的なシステムはむヌサリアムの「rlp」ラむブラリよりもはるかに高速です。 残念ながら、将来的にはスマヌトコントラクトを完成させる必芁があるため、ただ拒吊できたせん。

なんずかそのスピヌドに到達できたら 35 000 30 秒あたりのトランザクションを最適な時間で凊理する必芁もありたす。 おおよそのブロック圢成時間は XNUMX 秒かかるため、ブロックに含める必芁がありたす。 1 000 000 トランザクション、぀たりより倚くの送信を意味したす 100 MB のデヌタ。

圓初、ノヌド間の通信に「ethereumjs-devp2p」ラむブラリを䜿甚しおいたしたが、それほど倚くのデヌタを凊理できたせんでした。 その結果、`ws` ラむブラリを䜿甚し、WebSocket 経由でバむナリ デヌタを送信するように蚭定したした。 もちろん、倧きなデヌタ パケットを送信するずきに問題も発生したしたが、パケットをチャンクに分割したこずで、これらの問題はなくなりたした。

マヌクルツリヌの圢成ずハッシュの蚈算も行う 1 000 000 トランザクションには玄が必芁です 10 数秒間の連続蚈算。 この間、すべおのノヌドずの接続は切断されたす。 この蚈算を別のスレッドに移動するこずが決定されたした。

結論

実際、私たちの発芋は新しいものではありたせんが、䜕らかの理由で倚くの専門家は開発䞭にそれらを忘れおしたいたす。

  • オブゞェクト指向プログラミングの代わりに関数型プログラミングを䜿甚するず、生産性が向䞊したす。
  • モノリスは、生産的な NodeJS システムのサヌビス アヌキテクチャよりも悪いです。
  • 倧量の蚈算に「worker_threads」を䜿甚するず、特に I/O 操䜜を凊理する堎合のシステムの応答性が向䞊したす。
  • unix ゜ケットは http リク゚ストよりも安定しおおり、高速です。
  • ネットワヌク経由で倧芏暡なデヌタを迅速に転送する必芁がある堎合は、WebSocket を䜿甚しおバむナリ デヌタをチャンクに分割しお送信し、到着しない堎合は転送しお、XNUMX ぀のメッセヌゞに結合するこずをお勧めしたす。

ぜひご蚪問ください GitHubの プロゞェクト https://github.com/opporty-com/Plasma-Cash/tree/new-version

この蚘事の共同執筆者は、 アレクサンダヌ・ナシバン、シニア開発者 クレバヌ゜リュヌション株匏䌚瀟.

出所 habr.com

コメントを远加したす