Hyperledger Fabricでチェーンコードをディベースする

画像



こんにちは、habrozhitel様、特に何らかの形でブロックチェーンに興味のある方。 ある会社でjava開発者として働くようになったとき、ブロックチェーンを使用してプロジェクトを処理しなければならなかったのは偶然です。







ブロックチェーン自体、その機能、およびインターネット、特にHabréでのさまざまな実装については、大量の情報を見つけることができます。 しかし、質問が深いほど、それらに対する回答は少なくなります。 ファブリックの公式ドキュメントには、デバッグに関する情報はほとんどありませんが、唯一の情報は、すべてのコードを単純にデポジットし、何が問題なのかを確認することです。 ロシア語を話すIBM開発者も同じように答えました。 そのため、この記事では、Hyperledgerプロジェクトの1つであるFabric(v0.6)でのコードコードのデバッグに関連する以前の問題の1つを取り上げます。









ファブリックのチェーンコードは、おなじみのスマートコントラクトにすぎません。 チェーンコードは、Go、Java、および近い将来、JavaScriptで作成できます。 この記事ではGoのコードの実装について説明していますが、このアプローチはJavaの実装にも適していると思います。







ノードによるコードの使用方法に関する簡単な紹介:







  1. 野田は展開のリクエストを受信します→Dockerコンテナを探します→見つからない場合、チェーンコードを含む新しいdockerコンテナを作成し、見つかった場合はそれを使用します
  2. コンテナを作成した後、コードコードの実行可能ファイルを実行します。これは、gRPCを介してノードに接続し、指示のリッスンを開始します
  3. Invoke / Queryリクエストがノードに到着すると、接続された実行可能ファイルにコマンドを送信し、それらを処理して結果を送り返します。


したがって、当初はノードをだましてコンテナを検索しないようにする方法を探していましたが、成功には至りませんでした。 docker-composeファイルを簡単に読んだところ、興味深いパラメーター-CORE_CHAINCODE_MODEが明らかになりました。このパラメーターを使用すると、ノードでコンテナーを作成または検索せず、単に環境を信頼できます。







したがって、環境が使用されるように:









環境を上げる方法については説明しません。デプロイメントに関するドキュメントがたくさんあるため、いくつかの機能のみに注目する価値があります。







1つのVPのみが使用されるため、デフォルトのPBFTコンセンサスアルゴリズムは適切ではありません。 これを行うには、構成にパラメーターを追加します(docker-composeファイル)

CORE_PEER_VALIDATOR_CONSENSUS_PLUGIN = noops







ここで、環境をdevモードで実行する必要があることを示す必要があります。そのためには、パラメーターCORE_CHAINCODE_MODE = devを設定する必要があります。







また、ポート7050 (ノードのREST APIに使用)および7051 (ノードへのgRPC接続に使用)をドロップする必要があります。







これで、必要なパラメータは終了し、残りはあなたの裁量で設定できます。







例として、公式のHyperledgerリポジトリのサンプルコード、つまりmapを使用します。







次に、環境設定に移りましょう。 これを行うには、次の2つのパラメーターを設定する必要があります。







  1. 環境変数の設定-CORE_CHAINCODE_ID_NAME = mapCC
  2. 開始引数-peer.address = ip:gRpcPortを指定します


mapCCの代わりに、チェーンコードに任意の名前を指定できます。 その後、デバッグモードでmainメソッドを介してコードを実行する必要があります。 IDEは次の情報を印刷する必要があります。







13:36:57.675 [shim] DEBU:ピアアドレス:192.168.1.1:7051

13:36:57.676 [shim] DEBU:os.Argsの戻り値:[C:\ Users \ vasya \ AppData \ Local \ Temp \ Build map.go and rungo -peer.address = 192.168.1.1:7051]

13:36:57.701 [shim] DEBU:登録しています...レジスタを送信しています

13:36:57.702 [shim] DEBU:[] shimからメッセージREGISTEREDを受信しました

13:36:57.702 [shim] DEBU:[]タイプのChaincodeMessageの処理:REGISTERED(状態:created)

13:36:57.702 [shim] DEBU:登録済み、呼び出しの準備完了

次に、展開コマンドをノードに送信する必要があります。







curl -X POST --header "Content-Type:application / json" --header "Accept:application / json" -d "{

\ "jsonrpc \":\ "2.0 \"、

\「メソッド\」:\「デプロイ\」、

\ "params \":{

\「タイプ\」:1

\ "chaincodeID \":{

\ "名前\":\ "mapCC \"

}、

\ "ctorMsg \":{

\ "関数\":\ "init \"

}、

\ "secureContext \":\ "test_user0 \"

}、

\ "id \":1

} "ip:RESTPort / chaincode

IDEに情報がすぐに表示されます







13:37:12.038 [shim] DEBU:[mapCCId2]シムからメッセージINITを受信しました

13:37:12.038 [shim] DEBU:[mapCCId2]タイプ:INIT(状態:確立)のChaincodeMessageの処理

13:37:12.038 [shim] DEBU:状態initに入った

13:37:12.038 [shim] DEBU:[mapCCId2] INITを受信し、チェーンコードを初期化

13:37:12.038 [shim] DEBU:[mapCCId2] Initは成功しました。 完了しました

13:37:12.038 [shim] DEBU:[mapCCId2]状態メッセージの移動が完了しました

13:37:12.038 [shim] DEBU:[mapCCId2]タイプ:COMPLETED(状態:init)のChaincodeMessageの処理

13:37:12.038 [shim] DEBU:[mapCCId2]状態メッセージを送信しましたCOMPLETED

その後、Invoke / Queryクエリを送信することで、希望する任意の場所にブレークポイントを配置し、非難できます。 もうそれらについて書くつもりはありません。すべてがInit-requestsとほぼ同じです。







この記事は終わりです。手足で強く叩かないでください。私はただのジュニアです。これはHabréの最初の記事です。どこにも似たような記事が見つからなかったので、誰かの助けになることを願っています。








All Articles