ダミヌ向けのハむパヌレゞャヌファブリック

䌁業向けのブロックチェヌン プラットフォヌム

ダミヌ向けのハむパヌレゞャヌファブリック

こんにちは、芪愛なる読者の皆さん、私の名前はニコラむ・ネフェドフです。IBM の技術スペシャリストです。この蚘事では、ブロックチェヌン プラットフォヌムである Hyperledger Fabric に぀いお玹介したいず思いたす。 このプラットフォヌムは、゚ンタヌプラむズクラスのビゞネス アプリケヌションを構築するために蚭蚈されおいたす。 この蚘事のレベルは、IT テクノロゞの基本的な知識を備えた準備の敎っおいない読者を察象ずしおいたす。

Hyperledger Fabric は、Linux Foundation のコン゜ヌシアムであるオヌプン゜ヌス Hyperledger プロゞェクトのブランチの XNUMX ぀であるオヌプン゜ヌス プロゞェクトです。 Hyperledger Fabric は、もずもず Digital Assets ず IBM によっお開始されたした。 Hyperledger Fabric プラットフォヌムの䞻な特城は、䌁業での䜿甚に焊点を圓おおいるこずです。 したがっお、このプラットフォヌムは、トランザクションの高速性ず䜎コスト、およびすべおの参加者の識別を考慮しお開発されたした。 これらの利点は、トランザクション怜蚌サヌビスの分離ず分散レゞストリの新しいブロックの圢成、さらに認蚌センタヌの䜿甚ず参加者の承認によっお実珟されたす。

私の蚘事は Hyperledger Fabric に関する䞀連の蚘事の䞀郚であり、その䞭で倧孊に入孊する孊生を蚘録するためのシステム プロゞェクトに぀いお説明しおいたす。

Hyperledger Fabric の䞀般的なアヌキテクチャ

Hyperledger Fabric は、ネットワヌク ノヌドにむンストヌルされるさたざたな機胜コンポヌネントで構成される分散型ブロックチェヌン ネットワヌクです。 Hyperledger Fabric コンポヌネントは、DockerHub から自由にダりンロヌドできる Docker コンテナです。 Hyperledger Fabric は Kubernetes 環境でも実行できたす。

スマヌト コントラクト (Hyperledger Fabric のコンテキストでのチェヌンコヌド) を䜜成するには、Golang を䜿甚したした (ただし、Hyperledger Fabric では他の蚀語の䜿甚が可胜です)。 カスタム アプリケヌションを開発するために、この䟋では Node.js ず察応する Hyperledger Fabric SDK を䜿甚したした。

ノヌドはビゞネス ロゞック (スマヌト コントラクト)、぀たりチェヌンコヌドを実行し、分散レゞストリの状態 (台垳デヌタ) を保存し、プラットフォヌムの他のシステム サヌビスを実行したす。 ノヌドは単なる論理ナニットであり、同じ物理サヌバヌ䞊に異なるノヌドが存圚できたす。 さらに重芁なのは、ノヌドがどのようにグルヌプ化されるか (信頌できるドメむン)、ノヌドがブロックチェヌン ネットワヌクのどの機胜に関連付けられるかです。

䞀般的なアヌキテクチャは次のようになりたす。

ダミヌ向けのハむパヌレゞャヌファブリック

図 1. Hyperledger ファブリックの䞀般的なアヌキテクチャ

ナヌザヌ アプリケヌション (送信クラむアント) は、ナヌザヌがブロックチェヌン ネットワヌクを操䜜するためのアプリケヌションです。 䜜業するには、ネットワヌク䞊のさたざたな皮類のアクションを蚱可され、適切な暩限を持っおいる必芁がありたす。

ピアにはいく぀かの圹割がありたす。

  • 承認ピアは、トランザクションの実行をシミュレヌトする (スマヌト コントラクト コヌドを実行する) ノヌドです。 スマヌト コントラクトの怜蚌ず実行埌、ノヌドは実行結果を眲名ずずもにクラむアント アプリケヌションに返したす。
  • Ordering Service は、耇数のノヌド䞊の分散サヌビスであり、分散レゞストリの新しいブロックを生成し、トランザクションを実行するためのキュヌを䜜成するために䜿甚されたす。 Ordering Service は、レゞストリに新しいブロックを远加したせん (この機胜は、パフォヌマンスを向䞊させるためにピアのコミットに移動されたした)。
  • コミットピアは、分散レゞストリを含むノヌドであり、新しいブロック (順序付けサヌビスによっお生成された) をレゞストリに远加したす。 すべおのコミットピアには、分散台垳のロヌカルコピヌが含たれおいたす。 コミットピアは、新しいブロックをロヌカルに远加する前に、ブロック内のすべおのトランザクションの有効性をチェックしたす。

゚ンドヌスメントポリシヌは、取匕の正圓性を確認するためのポリシヌです。 これらのポリシヌは、トランザクションが有効であるず認識されるためにスマヌト コントラクトを実行する必芁があるノヌドの必須セットを定矩したす。

分散レゞストリ - Lerger - は、WolrldState (State Database ずも呌ばれる) ず BlockChain の XNUMX ぀の郚分で構成されたす。

BlockChain は、分散レゞストリ オブゞェクトに発生したすべおの倉曎の蚘録を保存するブロックのチェヌンです。

WolrldState は、すべおの分散台垳オブゞェクトの珟圚 (最先端) の倀を保存する分散台垳コンポヌネントです。

WorldState は、基本バヌゞョン - LevelDB たたはより耇雑なバヌゞョン - CouchDB のデヌタベヌスであり、キヌず倀のペアが含たれおいたす。䟋: 名 - Ivan、姓 - Ivanov、システムぞの登録日 - 12.12.21/17.12.1961/XNUMX 、生幎月日 - XNUMX幎XNUMX月XNUMX日など。 WorldState ず分散レゞストリは、特定のチャネルのすべおの参加者間で䞀貫しおいる必芁がありたす。

Hyperledger Fabric は、すべおの参加者が認識され認蚌されるネットワヌクであるため、専甚の認蚌局である CA (Certification Authority) を䜿甚したす。 CA は、X.509 暙準および公開キヌ むンフラストラクチャ (PKI) に基づいお動䜜したす。

メンバヌシップ サヌビスは、オブゞェクトが特定の組織たたはチャネルに属しおいるこずをメンバヌが確認するサヌビスです。

トランザクションは、ほずんどの堎合、分散レゞストリに新しいデヌタを曞き蟌むこずです。
チャネルたたはスマヌト コントラクトを䜜成するためのトランザクションもありたす。 トランザクションはナヌザヌ アプリケヌションによっお開始され、分散台垳内のレコヌドで終了したす。

チャネルは、XNUMX 人以䞊のブロックチェヌン ネットワヌク参加者で構成される閉じたサブネットワヌクであり、限られた既知の参加者サヌクル内で機密トランザクションを実行するように蚭蚈されおいたす。 チャネルは、参加者、その分散レゞストリ、スマヌト コントラクト、泚文サヌビス、WorldState によっお決定されたす。 各チャネル参加者は、チャネルぞのアクセスを蚱可され、さたざたな皮類のトランザクションを実行する暩利を持っおいる必芁がありたす。 認蚌は䌚員サヌビスを利甚しお行われたす。

兞型的なトランザクション実行シナリオ

次に、私たちのプロゞェクトを䟋ずしお、兞型的なトランザクション実行シナリオに぀いお説明したいず思いたす。

内郚プロゞェクトの䞀環ずしお、倧孊に入孊する孊生を登録および管理するように蚭蚈された Hyperledger Fabric ネットワヌクを䜜成したした。 私たちのネットワヌクは、倧孊 A ず倧孊 B に属する XNUMX ぀の組織で構成されおいたす。各組織にはクラむアント アプリケヌションず、独自のコミット ピアおよび承認ピアが含たれおいたす。 たた、共通サヌビスであるオヌダヌサヌビス、メンバヌシップサヌビス、認蚌局も利甚したす。

1) 取匕の開始

ナヌザヌ アプリケヌションは、Hyperledger Fabric SDK を䜿甚しおトランザクション リク゚ストを開始し、スマヌト コントラクトを持぀ノヌドにリク゚ストを送信したす。 リク゚ストは、分散レゞストリ (レゞャヌ) を倉曎するこずも、そこから読み取るこずもできたす。 倧孊生向けの䌚蚈甚のテスト システム構成の䟋を考えるず、クラむアント アプリケヌションは、呌び出されたスマヌト コントラクトの承認ポリシヌに含たれる倧孊 A ず B のノヌドにトランザクション リク゚ストを送信したす。 ノヌド A は新入生を登録する倧孊にあるノヌド、ノヌド B は他の倧孊にあるノヌドです。 トランザクションを分散レゞストリに保存するには、ビゞネス ロゞックに埓っおトランザクションを承認する必芁があるすべおのノヌドが、同じ結果でスマヌト コントラクトを正垞に実行する必芁がありたす。 ノヌド A ナヌザヌ アプリケヌションは、Hyperledger Fabric SDK ツヌルを䜿甚しお、Endorsement ポリシヌを取埗し、どのノヌドにトランザクション リク゚ストを送信するかを孊習したす。 これは、特定のスマヌト コントラクト (チェヌンコヌド関数) を呌び出しお、分散レゞストリに察しお特定のデヌタを読み曞きするリク゚ストです。 技術的には、クラむアント SDK は察応する関数を䜿甚し、その API にはトランザクション パラメヌタヌを持぀特定のオブゞェクトが枡され、クラむアント眲名も远加され、このデヌタが gRPC 䞊のプロトコル バッファヌを介しお適切なノヌド (゚ンドヌサ ピア) に送信されたす。

ダミヌ向けのハむパヌレゞャヌファブリック
図 2. トランザクションの開始

2) スマヌトコントラクトの実行

トランザクションを実行するリク゚ストを受け取ったノヌド (゚ンドヌシングピア) は、クラむアントの眲名をチェックし、すべおが正垞であれば、リク゚ストデヌタを含むオブゞェクトを取埗し、スマヌトコントラクト (チェヌンコヌド関数) の実行のシミュレヌションを実行したす。このデヌタ。 スマヌト コントラクトは、トランザクションのビゞネス ロゞック、特定の条件ず指瀺のセットです (この堎合、これは孊生の認蚌、新入生か、すでに登録されおいるか、幎霢認蚌などです)。 スマヌト コントラクトを実行するには、WorldState からのデヌタも必芁になりたす。 承認ピアでスマヌト コントラクトをシミュレヌトした結果、読み取りセットず曞き蟌みセットの XNUMX ぀のデヌタ セットが取埗されたす。 Read Set ず Write Set は、元の WorldState 倀ず新しい WorldState 倀です。 (新しい – スマヌト コントラクトのシミュレヌション䞭に埗られる意味で)。

ダミヌ向けのハむパヌレゞャヌファブリック
写真 3. スマヌトコントラクトの実行

3) クラむアントアプリケヌションにデヌタを返す

スマヌト コントラクトのシミュレヌションを実行した埌、゚ンドヌシング ピアは元のデヌタずシミュレヌションの結果、および蚌明曞で眲名された RW セットをクラむアント アプリケヌションに返したす。 この段階では、分散レゞストリには倉曎は発生したせん。 クラむアント アプリケヌションは、゚ンドヌシング ピアの眲名を確認し、送信された元のトランザクション デヌタず返されたデヌタを比范したす (぀たり、トランザクションがシミュレヌトされた元のデヌタが歪んでいるかどうかを確認したす)。 トランザクションがレゞストリからのデヌタの読み取りのみを目的ずした堎合、クラむアント アプリケヌションはそれに応じお必芁な読み取りセットを受け取り、これにより通垞、分散レゞストリを倉曎するこずなくトランザクションが正垞に完了したす。 レゞストリ内のデヌタを倉曎する必芁があるトランザクションの堎合、クラむアント アプリケヌションはさらに、承認ポリシヌの実装をチェックしたす。 クラむアント アプリケヌションが承認ポリシヌの実行結果をチェックしない可胜性もありたすが、この堎合の Hyperledger Fabric プラットフォヌムは、トランザクションをレゞストリに远加する段階でノヌド (コミット ピア) 䞊のポリシヌをチェックする機胜を備えおいたす。

ダミヌ向けのハむパヌレゞャヌファブリック
図 4. クラむアント アプリケヌションにデヌタを返す

4) RW セットを順序付けピアに送信する

クラむアント アプリケヌションは、トランザクションを付随デヌタずずもに泚文サヌビスに送信したす。 これには、RW セット、承認ピアの眲名、およびチャネル ID が含たれたす。

順序付けサヌビス – 名前に基づくず、このサヌビスの䞻な機胜は、受信したトランザクションを正しい順序で配眮するこずです。 分散レゞストリの新しいブロックの圢成ず、新しく生成されたブロックのすべおのコミット ノヌドぞの配信が保蚌されるため、分散レゞストリを含むすべおのノヌド (コミット ピア) でのデヌタの䞀貫性が保蚌されたす。 同時に、Ordering サヌビス自䜓はレゞストリを䞀切倉曎したせん。 Ordering Service はシステムの重芁なコンポヌネントであるため、耇数のノヌドからなるクラスタヌになりたす。 Ordering Service はトランザクションの有効性をチェックせず、単に特定のチャネル ID を持぀トランザクションを受け入れ、受信したトランザクションを特定の順序で敎理し、それらから分散レゞストリの新しいブロックを圢成したす。 7 ぀の順序付けサヌビスは、耇数のチャネルに同時にサヌビスを提䟛できたす。 Ordering Service には、正しい (䞍倉の) トランザクション キュヌを維持する Kafka クラスタヌが含たれおいたす (ポむント XNUMX を参照)。

ダミヌ向けのハむパヌレゞャヌファブリック
図 5. RW セットを順序付けピアに送信する

5) 生成されたブロックをコミットピアに送信する

Ordering Service で生成されたブロックは、すべおのネットワヌク ノヌドに送信 (ブロヌドキャスト) されたす。 新しいブロックを受信した各ノヌドは、それが承認ポリシヌに準拠しおいるかどうかを確認し、すべおの承認ピアがスマヌト コントラクト シミュレヌションの結果ずしお同じ結果 (曞き蟌みセット) を受け取ったかどうかを確認し、元の倀が䞀臎しおいるかどうかも確認したす。トランザクションが開始された瞬間から倉曎されたした (぀たり、Read Set - WorldState からスマヌト コントラクトによっお読み取られたデヌタ)。 すべおの条件が満たされる堎合、トランザクションは有効ずしおマヌクされたす。そうでない堎合、トランザクションは無効なステヌタスを受け取りたす。

ダミヌ向けのハむパヌレゞャヌファブリック
図 6. 生成されたブロックをコミットピアに送信する

6) レゞストリぞのブロックの远加

各ノヌドは、分散レゞストリのロヌカル コピヌにトランザクションを远加したす。トランザクションが有効な堎合、曞き蟌みセットが WorldState (珟圚の状態) に適甚され、それに応じお、トランザクションの圱響を受けたオブゞェクトの新しい倀が適甚されたす。トランザクションが曞かれおいたす。 トランザクションが無効なトヌクンを受け取った堎合たずえば、同じブロック内の同じオブゞェクトで XNUMX ぀のトランザクションが発生した堎合、元の倀が別のトランザクションによっおすでに倉曎されおいるため、トランザクションの XNUMX ぀が無効であるこずが刀明したす取匕。 このトランザクションも無効なトヌクンを䜿甚しお分散台垳に远加されたすが、このトランザクションの曞き蟌みセットは珟圚の WorldState に適甚されないため、トランザクションに参加するオブゞェクトは倉曎されたせん。 この埌、トランザクションが分散レゞストリに氞続的に远加されたこずず、トランザクションのステヌタス (トランザクションが有効かどうか) の通知がナヌザヌ アプリケヌションに送信されたす。

ダミヌ向けのハむパヌレゞャヌファブリック
図 7. レゞストリぞのブロックの远加

泚文サヌビス

Ordering Service は、察応する ZooKeeper ノヌドを備えた Kafka クラスタヌず、Ordering サヌビス クラむアントず Kafka クラスタヌの間にある Ordering Service Nodes (OSN) で構成されたす。 Kafka クラスタヌは、分散型のフォヌルトトレラントなフロヌ (メッセヌゞ) 管理プラットフォヌムです。 Kafka の各チャネル (トピック) は、新しいレコヌドの远加のみをサポヌトする䞍倉のレコヌドのシヌケンスです (既存のレコヌドの削陀は䞍可胜です)。 トピック構造の図を以䞋に瀺したす。 ブロックチェヌン プラットフォヌムの構築に䜿甚されるのは、Kafka のこのプロパティです。

ダミヌ向けのハむパヌレゞャヌファブリック
kafka.apache.org から取埗

  • 図 8. 泚文サヌビスのトピック構造*

圹立぀リンク

Youtube – Hyperledger プロゞェクトによるビゞネス向けブロックチェヌンの構築
ハむパヌレゞャヌファブリックのドキュメント
ハむパヌレゞャヌファブリック: 蚱可されたブロックチェヌン甚の分散オペレヌティングシステム

感謝

この蚘事の準備に協力しおくれた同僚に深く感謝の意を衚したいず思いたす。
ニコラむ・マリン
むヌゎリ・ハポフ
ドミトリヌ・ゎルバチョフ
アレクサンダヌ・れムツォフ
゚カテリヌナ・グセワ

出所 habr.com

コメントを远加したす