2017-05-04 16 views
0

チェーンコードファブリック/ example/chaincode/go/chaincode_example02を登録してインスタンス化した後、次の手順を実行します。Hyperledger Fabric 1.0のチェーンコードを同時に呼び出すことができないのはなぜですか?

peer chaincode instantiate --orderer orderer0:7050 --tls true --path example02 --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/orderer/localMspConfig/cacerts/ordererOrg0.pem --chainID mychannel --name example02cc --version 1.0 --ctor '{"Args":["init","A","1000","B","2000"]}' 

peer chaincode query --chainID mychannel --name example02cc --ctor '{"Args":["query","A"]}' 

peer chaincode query --chainID mychannel --name example02cc --ctor '{"Args":["query","B"]}' 

これまでのところ、私は、Aが1000に等しく、Bはその後2000に等しく、Iは異なるタイミングで、次のステップを呼び出す場合、結果は可変であろうことを確認します。

peer chaincode invoke --orderer orderer0:7050 --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/orderer/localMspConfig/cacerts/ordererOrg0.pem --chainID mychannel --name example02cc --ctor '{"Args":["invoke","A","B","1"]}' 

具体的には、前のステップを10秒間の休止で2回実行すると、Aは998に等しくなり、Bは2002に等しくなります。前のステップを10回実行した場合、Aは990に等しく、Bは2010に等しくなります。ただし、前のステップを2回実行すると、一時停止なしでAは999になり、Bは2001に等しくなります。前のステップを各ステップ間で一時停止せずに10回実行すると、Aは999になり、Bは2001に等しくなります。

私はいくつかの異なる引数で数回テストしました。さらに、私は他のチェーンコードをテストしました。チェインコードは最初の呼び出し要求のみを受け入れ、その後の呼び出し要求は破棄したようです。だから、質問は次のとおりです:

  1. これは二重支出を防ぐメカニズムですか?または単に弱点?
  2. トランザクションレートを制限するこの問題を解決する方法。
  3. 私はチェーンコードが同時呼び出しをサポートすべきだと思います。チェーンコードは、同時呼び出しを実際にサポートできますか?
  4. 1つのチェーンコードは、1ブロック期間内に複数の要求を呼び出すことはできますか?

答えて

2

チェーンコードは、承認を行い、次の呼び出しの前に元帳状態をコミットする必要があります。

peer chaincode invoke ...に電話すると、承認後すぐにファブリックレスポンスが返されます。しかしコミットにはまだ時間がかかるでしょう。最初の呼び出しの直後に2番目の呼び出しを実行すると、2番目の呼び出しは正しく承認されますが、コミットは発生しません。

だから、あなたの質問のために:

  1. あなたは、java-SDKまたはノード-SDKによってchaincodeを起動しようとすることができます。例えば、javasdkを利用すると、まず進行状況がtransactionProposalRequestをchaincodeに送信します。これは、ファブリック内の承認プロセスです。そして、裏書が終了し、あなたの裏書ポリシーが正しく渡された後。トランザクションがsdk-clientによってfabircに送信されると、このAPIはCompletableFuture<BlockEvent.TransactionEvent>を返します。これはPromise in jsに似ています。トランザクションが完了すると、CompletableFuture.thenApply()がトリガーされます。たとえば、src/test/java/org.hyperledger.fabric.sdkintergration/End2endIT.javaをチェックすることができます。

  2. チェーンコードにバッチを書くことができます。これは、一度に複数の呼び出しとクエリをサポートすることができ、あなたの質問をある程度解決します。このバッチは、mにキー/ valのペアを入れ、最初にmからkey/valを取得した場合は見つからない場合、スタブからのクエリー、および削除要件の場合には、ccにm map[string]stringtoDelete []stringという新しいものがありますmから削除し、キーをtoDeleteに設定します。すべての要件が完了したら、すべてのデータをmtoDeleteにまとめてコミットします。私は私のプロジェクトでこの仕組みを試しました。それはうまくいきます。

  3. ブロックチェーンは、高い並列性を考慮して設計されていません。機密性、スケーラビリティ、セキュリティのために設計されています。

  4. は、これが実際に正常な動作であるファブリックの観点から2

1

参照 - 最初のビット直観に反するように見えるかもしれません。

documented transaction flow(論理的には、バッチタイムアウトを使用して発注者に対して一部のバッチ処理が実行されていることがわかります)シミュレーション中(裏書)に、変数Aが読み取られ、チェーンコードシミュレーションによって再設定用にマークされているとします。読み込まれた値と、提案されたトランザクションの一部となる変数の値(+エンドユーザがトランザクション+暗号化を受け入れるかどうか)次に、提案者の元の「読み込み値の仮定」がまだ成立しているかどうかをチェックするチャネルピア+チャネルピアへの発注者への配布を行います。 Aの値が「シミュレーション後」に変更された場合、トランザクションは有効ではありません。

これにタイミングが与える影響は次のとおりです。 2呼び出すの間に十分な「余裕」がある場合は次のことが起こり、:

  • Call1 - 提案元の値を使用して作成
  • Call1の提案が発注者に送信され、推薦を取得し、いくつかの時間後
  • をバッチ処理されますピアが要求さ
  • Call2として、それは罰金、Aの値が(元帳にコミット)に変更されて見つけ、それをチェックし、発注者からの発注承認の送信を取得する - などを提案新しい値を使用して作成を読ん

重要なことは、の前にの2つ目の提案を作成して提出すると、最初の効果が元帳にコミットされたとします。 (なしだから「十分に待っている」。)

  • Call2シミュレーションは、まだ元の値を見て、裏書は、トランザクションの「値を読み取る」プロパティにバンドルされていること
  • これに基づいて計算されている
  • ことでそれがコミットするためのチャネルピアに到達した時には、Aの値は、すでにこのようCall1
  • によって変更された、この取引は無効であることと

このような効果はありません台帳には影響しませんちょうど新しい、我々はファブリック0.6と同様のもので噛まれた。幸いにも、これからいくつかの「きれいな」方法があります。私はBlockchainの文脈で "tokenization"を読むことをお勧めします。 example02のコンテキストでは、すべての「ユニット」にGUIDがあり、本質的に所有権ベクトルを追跡することができます。または完全なUTXO、Bitcoinスタイルにすることができます。オプションb)は、Tx要求自体を元帳に書き込むことができます(Tx1:+20、Tx2:-40、Tx3:+65、...)。元帳に保存されたTxログに「現在の請求額」これはちょっと混乱するかもしれませんが。

また、Tx要求の「ワーキングセット」があまり重複しない限り、大量の(そして無痛の)並行処理が可能であることに注意してください。多くのドメインではこれが可能です。例えばcryptocurrencyのために、それはホットジャガイモのように回っているのと同じ通貨単位ではありませんが、多くのトランザクションを持つ通貨単位の大きなセットが、それらを横切って水平になっています。あなたの特定の質問に

  1. がはるか上記
  2. 上記の二つの提案を参照してくださいを参照すると、同時呼び出しで何を意味するかに依存しますが、ファブリック1.0アーキテクチャの心臓部であることです承認されたすべての要求に対してフルオーダーが設定され、このオーダーは検証中および元帳の更新中に適用されます。同時に物事を要求している大量の同僚。 "リエントラントチェーンコード" - no-no-no。
  3. チェーンコードは「要求を呼び出す」ことはありません。 1つのチェーンコードで複数のトランザクションを1つのブロックにまとめることができるかどうかは、確かです。 「sell_cars」チェーンコードを使用して100台の異なる車を販売しています。
関連する問題