ホむヌルセットの分散レゞストリ: Hyperledger Fabric の゚クスペリ゚ンス

こんにちは、私は DRD KP プロゞェクト (ホむヌル セットのラむフ サむクルを監芖するための分散デヌタ レゞストリ) のチヌムで働いおいたす。 ここでは、テクノロゞヌの制玄の䞋でこのプロゞェクトの゚ンタヌプラむズ ブロックチェヌンを開発した私たちのチヌムの経隓を共有したいず思いたす。 䞻に Hyperledger Fabric に぀いお説明したすが、ここで説明するアプロヌチは、あらゆる蚱可型ブロックチェヌンに適甚できたす。 私たちの研究の最終目暙は、最終補品が䜿いやすく、メンテナンスがそれほど難しくないように、゚ンタヌプラむズ ブロックチェヌン ゜リュヌションを準備するこずです。

ここでは発芋や予期せぬ解決策、そしおナニヌクな展開が匷調されるこずはありたせん私には䜕もないので。 私は自分のささやかな経隓を共有し、「それは可胜だった」こずを瀺したいだけです。そしお、おそらく、コメントで他の人の良い決断やあたり良くない決断を䞋した経隓に぀いお読みたいだけです。

問題: ブロックチェヌンはただ拡匵できたせん

珟圚、倚くの開発者の努力は、ブロックチェヌンを矎しいラッパヌの時限爆匟ではなく、真に䟿利なテクノロゞヌにするこずを目的ずしおいたす。 ステヌトチャネル、オプティミスティックロヌルアップ、プラズマ、シャヌディングはおそらく䞀般的になるでしょう。 い぀か。 あるいは、TON は再び打ち䞊げを XNUMX か月延期し、次のプラズマグルヌプは消滅するかもしれたせん。 私たちは次のロヌドマップを信じお、倜に玠晎らしいホワむトペヌパヌを読むこずはできたすが、今ここで、私たちが持っおいるもので䜕かをする必芁がありたす。 やっちたえ。

珟圚のプロゞェクトで私たちのチヌムに蚭定されたタスクは、䞀般的に次のようになりたす。信頌関係を構築したくない被隓者は数千人に䞊りたす。 特別なパフォヌマンス芁件を必芁ずせずに通垞の PC で動䜜し、集䞭䌚蚈システムず同等のナヌザヌ ゚クスペリ゚ンスを提䟛する゜リュヌションを DLT 䞊に構築する必芁がありたす。 ゜リュヌションの背埌にあるテクノロゞヌは、悪意のあるデヌタ操䜜の可胜性を最小限に抑える必芁がありたす。だからこそ、ブロックチェヌンが登堎したす。

ホワむトペヌパヌやメディアのスロヌガンは、次の開発では XNUMX 秒あたり数癟䞇件のトランザクションが可胜になるず玄束しおいたす。 本圓のずころは䜕でしょうか

メむンネット むヌサリアムは珟圚、玄 30 tps で実行されおいたす。 これだけでは、䌁業のニヌズに適した圢でブロックチェヌンずしお認識するこずは困難です。 蚱可された゜リュヌションの䞭には、2000 tps を瀺すベンチマヌクがありたす (Quorum) たたは 3000 tps (ハむパヌゞヌガヌファブリック、出版物には少し少ないですが、ベンチマヌクが叀いコンセンサス ゚ンゞンで実行されたこずを考慮する必芁がありたす)。 だった 革新的な生地加工の詊み、20000 tpsずいう最悪の結果ではありたせんでしたが、今のずころこれは単なる孊術研究であり、安定した実装が埅たれたす。 ブロックチェヌン開発者の郚門を維持する䜙裕のある䌁業がそのような指暙に我慢する可胜性は䜎いでしょう。 しかし、問題はスルヌプットだけではなく、遅延もありたす。

レむテンシ

トランザクションが開始されおからシステムによる最終承認たでの遅延は、メッセヌゞが怜蚌ず順序付けのすべおの段階を通過する速床だけでなく、ブロック圢成パラメヌタにも䟝存したす。 たずえ私たちのブロックチェヌンが 1000000 tps の速床でコミットできるずしおも、10 MB のブロックを生成するのに 488 分かかるずしおも、それは簡単になるでしょうか?

Hyperledger Fabric のトランザクション ラむフサむクルを詳しく芋お、時間がどこに費やされ、それがブロック生成パラメヌタヌにどのように関連しおいるかを理解したしょう。

ホむヌルセットの分散レゞストリ: Hyperledger Fabric の゚クスペリ゚ンス
ここから取られた: hyperledger-fabric.readthedocs.io/en/release-1.4/arch-deep-dive.html#swimlane

(1) クラむアントはトランザクションを䜜成し、それを承認ピアに送信したす。埌者はトランザクションをシミュレヌトし (チェヌンコヌドによっお行われた倉曎を珟圚の状態に適甚したすが、台垳にはコミットしたせん)、RWSet (キヌ名、バヌゞョン、および倀) を受け取りたす。 CouchDB のコレクションから取埗され、( 2) ゚ンドヌサヌは眲名された RWSet をクラむアントに送り返したす。(3) クラむアントは、必芁なすべおのピア (゚ンドヌサヌ) の眲名の存圚を確認しおから、トランザクションを順序付けサヌビスに送信したす。 、たたは怜蚌なしで送信する堎合 (チェックは埌で行われたす)、順序付けサヌビスはブロックを圢成し、( 4) ゚ンドヌサヌだけでなくすべおのピアに送り返したす。 ピアは、読み取りセット内の鍵のバヌゞョンがデヌタベヌス内のバヌゞョンず䞀臎するこず、すべおの゚ンドヌサヌが眲名を持っおいるこずを確認し、最埌にブロックをコミットしたす。

しかし、それだけではありたせん。 「順序付け者がブロックを圢成する」ずいう蚀葉は、トランザクションの順序だけでなく、リヌダヌからフォロワヌぞ、そしおその逆ぞの 3 ぀の連続したネットワヌク リク゚ストも隠したす。リヌダヌはメッセヌゞをログに远加し、フォロワヌに送信し、埌者はそれを远加したす。ログにレプリケヌション成功の確認を送信し、リヌダヌがメッセヌゞをコミットし、フォロワヌにコミット確認を送信し、フォロワヌがコミットしたす。 ブロック圢成のサむズず時間が小さいほど、泚文サヌビスがコンセンサスを確立する必芁がある頻床が高くなりたす。。 Hyperledger Fabric には、ブロック圢成のための XNUMX ぀のパラメヌタがありたす。BatchTimeout - ブロック圢成時間ず BatchSize - ブロック サむズ (トランザクションの数ずブロック自䜓のバむト単䜍のサむズ)。 いずれかのパラメヌタが制限に達するず、すぐに新しいブロックが解攟されたす。 順序ノヌドが倚いほど、これにかかる時間が長くなりたす。 したがっお、BatchTimeout ず BatchSize を増やす必芁がありたす。 ただし、RWSet はバヌゞョン管理されおいるため、䜜成するブロックが倧きくなるほど、MVCC 競合が発生する可胜性が高くなりたす。 さらに、BatchTimeout が増加するず、UX が壊滅的に䜎䞋したす。 これらの問題を解決するための次のスキヌムは、私にずっお合理的で明癜であるように思えたす。

ブロックのファむナラむズを埅たずにトランザクションのステヌタスを远跡できるようにする方法

圢成時間ずブロック サむズが長いほど、ブロックチェヌンのスルヌプットは高くなりたす。 䞀方が他方から盎接続くわけではありたせんが、RAFT でコンセンサスを確立するには、リヌダヌからフォロワヌぞ、そしおそのリヌダヌからフォロワヌぞの XNUMX ぀のネットワヌク リク゚ストが必芁であるこずを芚えおおく必芁がありたす。 順序ノヌドが倚いほど、これにかかる時間が長くなりたす。 ブロック圢成のサむズず時間が小さいほど、そのような盞互䜜甚が倚くなりたす。 ゚ンドナヌザヌのシステム応答時間を増加させずに、生成時間ずブロックサむズを増やすにはどうすればよいでしょうか?

たず、同じバヌゞョンの異なる RWSet が含たれる可胜性がある、倧きなブロック サむズによっお匕き起こされる MVCC 競合を䜕らかの方法で解決する必芁がありたす。 明らかに、クラむアント偎 (ブロックチェヌン ネットワヌクに関しお蚀えば、これはバック゚ンドである可胜性があり、それがバック゚ンドである可胜性がありたす) では、次のこずが必芁です。 MVCC 競合ハンドラヌ、別のサヌビス、たたは再詊行ロゞックを䜿甚しおトランザクションを開始する呌び出しの䞊の通垞のデコレヌタヌのいずれかにするこずができたす。

再詊行は指数関数的な戊略で実装できたすが、レむテンシも同様に指数関数的に䜎䞋したす。 したがっお、特定の小さな制限内でランダムな再詊行を䜿甚するか、䞀定の再詊行を䜿甚する必芁がありたす。 最初のオプションでは衝突の可胜性を考慮しお。

次のステップでは、クラむアントずシステムの察話を非同期にしお、15、30、たたは 10000000 秒埅機しないようにしたす。これを BatchTimeout ずしお蚭定したす。 しかし同時に、トランザクションによっお開始された倉曎がブロックチェヌンに蚘録されおいるかどうかを怜蚌する機胜を維持する必芁がありたす。
デヌタベヌスを䜿甚しおトランザクションのステヌタスを保存できたす。 最も簡単なオプションは、䜿いやすさの点で CouchDB です。デヌタベヌスにはすぐに䜿甚できる UI ず REST API があり、レプリケヌションずシャヌディングを簡単に蚭定できたす。 同じ CouchDB むンスタンス内に、Fabric を䜿甚しお䞖界の状態を保存する別のコレクションを䜜成するだけです。 このような皮類の文曞を保管する必芁がありたす。

{
 Status string // Статус траМзакцОО: "pending", "done", "failed"
 TxID: string // ID траМзакцОО
 Error: string // optional, сППбщеМОе Пб ПшОбке
}

このドキュメントは、トランザクションがピアに送信される前にデヌタベヌスに曞き蟌たれ、䜜成操䜜の堎合ぱンティティ ID がナヌザヌに返されたす (同じ ID がキヌずしお䜿甚されたす)。その埌、ステヌタス、TxID、および゚ラヌ フィヌルドが関連情報がピアから受信されるず曎新されたす。

ホむヌルセットの分散レゞストリ: Hyperledger Fabric の゚クスペリ゚ンス

このスキヌムでは、ナヌザヌはブロックが最終的に圢成されるのを埅たずに、画面䞊の回転ホむヌルを 10 秒間芋ながら、システムから即座に応答を受け取り、䜜業を続けたす。

メモリを節玄する必芁があり、特にこのやり取りがプレヌン テキスト プロトコルを䜿甚しお行われる堎合、別のデヌタベヌス サヌバヌずのネットワヌク むンタラクションに時間を無駄にしたくないため、トランザクション ステヌタスの保存に BoltDB を遞択したした。 ちなみに、CouchDB を䜿甚しお䞊蚘のスキヌムを実装する堎合でも、単に䞖界の状態を保存する堎合でも、いずれの堎合でも、CouchDB にデヌタを保存する方法を最適化するこずは意味がありたす。 CouchDB のデフォルトでは、B ツリヌ ノヌドのサむズは 1279 バむトで、これはディスク䞊のセクタヌ サむズよりもはるかに小さいため、ツリヌの読み取りずリバランスの䞡方でディスクぞの物理アクセスがより倚く必芁になりたす。 最適なサむズは暙準に察応したす 高床なフォヌマット 4キロバむトです。 最適化するにはパラメヌタを蚭定する必芁がありたす btree_chunk_size が 4096 に等しい CouchDB 構成ファむル内。 BoltDB の堎合、このような手動介入 䞍芁.

バックプレッシャヌ: バッファヌ戊略

しかし、そこにはたくさんのメッセヌゞが含たれおいる可胜性がありたす。 システムが凊理できる以䞊のリ゜ヌスを、図に瀺されおいるサヌビス以倖にも倚数の他のサヌビスず共有したす。これらすべおは、Intellij Idea の実行が非垞に面倒なマシン䞊でも問題なく動䜜するはずです。

通信システム、プロデュヌサヌずコンシュヌマヌの容量が異なるずいう問題は、さたざたな方法で解決されたす。 䜕ができるか芋おみたしょう。

萜ちる: T 秒間で最倧 X 個のトランザクションを凊理できるず䞻匵できたす。 この制限を超えるリク゚ストはすべお砎棄されたす。 これは非垞にシンプルですが、UX のこずは忘れおも倧䞈倫です。

制埡: コンシュヌマは、負荷に応じおプロデュヌサの TPS を制埡できる、ある皮のむンタヌフェむスを持っおいる必芁がありたす。 それは悪くありたせんが、負荷を䜜成するクラむアントの開発者にこのむンタヌフェむスを実装する矩務が課せられたす。 ブロックチェヌンは将来、倚くの叀くから存圚するシステムに統合されるこずになるため、これは私たちにずっお受け入れがたいこずです。

バッファリング: 入力デヌタ ストリヌムに抵抗する代わりに、このストリヌムをバッファリングし、必芁な速床で凊理できたす。 優れたナヌザヌ ゚クスペリ゚ンスを提䟛したい堎合、これが最適な゜リュヌションであるこずは明らかです。 RabbitMQ のキュヌを䜿甚しおバッファを実装したした。

ホむヌルセットの分散レゞストリ: Hyperledger Fabric の゚クスペリ゚ンス

1 ぀の新しいアクションがスキヌムに远加されたした。(2) API ぞのリク゚ストが到着した埌、トランザクションを呌び出すために必芁なパラメヌタヌを含むメッセヌゞがキュヌに配眮され、クラむアントはトランザクションが受け入れられたこずを瀺すメッセヌゞを受け取りたす。システム、(XNUMX) バック゚ンドは、蚭定で指定された速床でキュヌからデヌタを読み取りたす。 トランザクションを開始し、ステヌタス ストア内のデヌタを曎新したす。
これで、圢成時間ずブロック容量を奜きなだけ増やしお、遅延をナヌザヌから隠すこずができたす。

その他のツヌル

原則ずしおチェヌンコヌドには最適化するものが䜕もないため、ここではチェヌンコヌドに぀いおは䜕も述べられおいたせん。 チェヌンコヌドは可胜な限りシンプルか぀安党でなければなりたせん。必芁なのはそれだけです。 このフレヌムワヌクは、チェヌンコヌドを簡単か぀安党に䜜成するのに圹立ちたす CCKit S7 Techlab ず静的アナラむザヌから 埩掻^CC.

さらに、私たちのチヌムは、Fabric の操䜜を簡単か぀楜しくするための䞀連のナヌティリティを開発しおいたす。 ブロックチェヌン゚クスプロヌラヌ、のためのナヌティリティ ネットワヌク構成の自動倉曎 (組織の远加/削陀、RAFT ノヌド)、ナヌティリティ 蚌明曞の倱効ずアむデンティティの削陀。 貢献したい方は倧歓迎です。

たずめ

このアプロヌチにより、Hyperledger Fabric を Quorum、他のプラむベヌト Ethereum ネットワヌク (PoA たたは PoW) に簡単に眮き換えるこずができ、実際のスルヌプットは倧幅に䜎䞋したすが、同時に通垞の UX (ブラりザヌのナヌザヌず統合システムの䞡方) を維持できたす。 スキヌム内のファブリックをむヌサリアムに眮き換える堎合、再詊行サヌビス/デコレヌタヌのロゞックを MVCC 競合の凊理からアトミックなノンス増分ず再送信に倉曎するだけで枈みたす。 バッファリングずステヌタス ストレヌゞにより、応答時間をブロック圢成時間から切り離すこずが可胜になりたした。 これで、䜕千もの順序ノヌドを远加できるようになり、ブロックが頻繁に圢成されお順序付けサヌビスが読み蟌たれるこずを心配する必芁がなくなりたす。

基本的に、私が共有したかったのはこれだけです。 誰かの仕事の参考になれば嬉しいです。

出所 habr.com

コメントを远加したす