使用Hyperledgerファブリックは、あなたの最初のアプリケーションブロックチェーンを開発します
使用Hyperledgerファブリックは、あなたの最初のアプリケーションブロックチェーンを開発します
本明細書に例示https://github.com/hyperledger/fabric-samples
fabric-samples
fabcar
この例では、ファブリックのアプリケーションが実行されているかを確認するための簡単なプログラム例を持っています。この例では、アプリケーションとまとめインテリジェント契約(チェーン・コード)を使用しますFabCar
。この例では、理解するための良いスタートを提供しますHyperledger Fabric
。ここでは、あなたが本をクエリに適用し、インテリジェンスの契約を開発し、更新する方法を学びます、使用方法CA
X.509証明書をブロック鎖相互作用のためのアプリケーションを生成する必要があります。
我々は契約の本を更新する操作SDKインテリジェントなクエリを実行するためのアプリケーションを使用し、これらの操作は、スマート契約インターフェイスの低レベルによって達成されています。
我々は3つの手順を説明します:
- セットアップの開発環境。私たちのアプリケーションのニーズとネットワークの相互作用が、私たちは、インテリジェントな契約や基盤となるネットワークのアプリケーションを必要としています。
-
インテリジェントなシンプルな契約、FabCarを学びます。私たちは、使用JavaScriptをインテリジェントな契約を開発します。私たちは、どのようにクエリおよび更新ブックにスマート契約を使用する方法、スマート契約を使用して契約トランザクションを送信するインテリジェントなアプリケーションを表示することによって学びます。
-
使用FabCarは、簡単なアプリケーションを開発します。私たちのアプリケーションが使用する
FabCar
帳簿上のクエリと更新の資産へのスマートな車の契約を。私たちは、車の情報照会を含め、トランザクションを作成し、自動車情報の数を見つけ、車を作成する方法を学習するためのアプリケーションのためのコードを入力します。
設定ブロック・チェーン・ネットワーク
注:以下のセクションでは、ローカルのクローンに入力する必要が
fabric-samples
リポジトリのfirst-network
サブディレクトリ。
あなたが学んできた場合Building Your First Network
、あなたはダウンロードしている必要がありますfabric-samples
し、ネットワークから実行されて。このチュートリアルを実行する前に、あなたは、このネットワークを停止する必要があります。
1 |
ダウン./byfn.sh |
あなたはこの前にチュートリアルを実行した場合、実行中のすべてのコンテナを停止またはオフにするには、次のコマンドを使用します。これはオフにすることに注意してくださいすべての関連およびファブリックのコンテナを、かどうか。
1 2 |
ドッキングウィンドウのrm -f $(ドッカPS -aq) ドッキングウィンドウRMI -f $(ドッカ画像| grepをfabcar | awkは '{$ 3印刷}') |
あなたは、このネットワークとアプリケーションの開発環境および関連するコンポーネントを持っていない場合は、下記をご覧ください 前提条件ページを、あなたのマシンにインストールしてください必要な依存関係を作ります。
次に、あなたはまだ行っていない場合は、下記をご覧ください インストールしたサンプルを、バイナリとドッカー画像のページには、上記の操作を行っ従ってください。あなたはクローン化された場合にはfabric-samples
、倉庫の後、戻ってチュートリアルにファブリックミラーおよび関連ツールの最新の安定版をダウンロードしてください。
あなたは、Mac OSとMojavaを使用している場合は、インストールする必要がありXcodeのを。
スタートネットワーク
次のセクションでは、入力する必要が
fabric-samples
倉庫fabcar
サブディレクトリを。
使用しstartFabric.sh
てネットワークを開始します。ブロックチェーンネットワークを開始するこのコマンドは、ネットワークは、ピア・ノード、ソートノード、認証局サービス及び他の構成要素から構成されています。同時に、また、インストールしてのJavaScriptのバージョン初期化されますFabCar
インテリジェンス契約を、我々のアプリケーションは、そのブックを介して動作します。私たちは、学ぶために、このチュートリアルのコンポーネントの詳細を持っていました。
1 |
./startFabric.shジャバスクリプト |
今、私たちはサンプルネットワーク、またインストールして初期化まで実行してきたFabCar
諜報契約を。私たちのアプリケーションを実行するために、我々はいくつかの依存関係をインストールする必要がありますが、の彼らがどのように動作するかを見てみましょう。
アプリケーションをインストールします
注:ローカルにクローン化し、次の章で入力する必要が
fabric-samples
リポジトリfabcar/javascript
サブディレクトリを。
所望の用途にファブリック依存をインストールするには、以下のコマンドを実行します。法案はおそらく約1分:
1 NPMインストール
このコマンドは、これらの依存関係が定義され、依存アプリケーションをインストールするために必要とされますpackage.json
。最も重要なの一つは、あるfabric-network
クラス、それは、利用IDにアプリケーションを可能に財布やチャネルゲートウェイに接続され、通知のためのトランザクションや待機を提出します。また、このチュートリアルでは、使用するfabric-ca-client
生成し、ユーザーとその認証証明書を登録するには、クラスをfabric-network
使用する法的地位を。
いったんnpm install
正常に実行され、アプリケーションを実行するために必要なすべての準備ができています。このチュートリアルでは、主に使用するfabcar/javascript
ディレクトリのアプリケーションでファイルを操作するためにJavaScriptを。のは、どのファイルの内部を見てみましょう。
1 |
LS |
あなたは、次のファイルが表示されます。
1 2 |
enrollAdmin.js node_modules package.json registerUser.js パッケージlock.json query.js財布invoke.js |
以下のようないくつかのファイルの他のプログラミング言語もありますfabcar/typescript
ディレクトリが。あなたがJavaScriptの例を使用したら-彼らは実際には似ています。
あなたは、Mac OSを使用してMojavaを実行している場合、あなたは必要です[安装Xcode](https://hyperledger-fabric.readthedocs.io/en/latest/tutorial/installxcode.html)
。
管理者ユーザ登録
以下の部分は、CAの実装とサーバ通信プロセスを扱います。あなたは、次の手順を実行し、ターミナル実行を開き、
docker logs -f ca.example.com
CAログを見るために、非常に参考にすることができます。
私たちが呼ばれるのネットワーク作成する場合はadmin
、ユーザーをするために作成したサーバー(CA)認可されているレジストラを。私たちの最初のステップは、使用することですenroll.js
し、プログラムをadmin
秘密鍵、公開鍵とX.509証明書を生成します。このプログラムは、証明書署名要求(CSR)を使用しています-ローカル秘密鍵と公開鍵を生成し、その後、CAの公開鍵を送信し、CAは、アプリケーションで使用される証明書を発行します。これらの3つの文書は、当社のCAで管理者として使用することにあなたの財布に格納されます
私たちは、新しいアプリケーションのユーザーを登録し、登録します次に、我々は、アプリケーションとブロックチェーンを介してユーザと対話するために使用します。
登録してみましょうadmin
ユーザーを:
1 |
ノードenrollAdmin.js |
このコマンドは、中にCA証明書の管理者が保存されますwallet
ディレクトリ。
登録および登録user1
今、私たちはあなたの財布には、管理者の証明書を入れて、私たちは、新しいユーザがクエリと更新の本に、このユーザーを使用-user1-登録することができます。
1 |
ノードregisterUser.js |
そして、同様の登録管理者は、このプログラムは登録にCSRを使用user1
してに証明書を保存するadmin
位置財布。今、私たちは、2人の独立したユーザーを持っている- admin
そしてuser1
、彼らは我々のアプリケーションで使用されています- 。
次は、ブックと対話する時間です...
クエリの本
ネットワークブロックチェーンブック内の各ノードのアプリケーションのコピーを持っているが、最新のインテリジェンス契約クエリ帳簿上のクエリの本徐庶を実行することによって達成することができる、結果がアプリケーションに戻されます。
これは、クエリのどのように簡単なセットです。
アプリケーションは、台帳からデータを読み取るためにクエリを使用しています。世界の状態 - 最も一般的なのは、ブックの最新の現在の値をチェックすることです。世界の状態は、アプリケーションがキーまたは複数のキーに合わせてデータを照会することができ、キーと値のペアのコレクションです。キーと値のペアは、JSONの形で存在する場合また、世界の状態がリッチクエリをサポートするために(例えばCouchDBのような)データベースを使用して構成することができます。この機能は、キーの特定の値は、すべての車の男を照会として、有用であるクエリ照合のためです。
まずは使ってみましょうquery.js
帳簿上のすべての車を照会するプログラムを。このプログラムは、私たちの第二のアイデンティティを使用しています- user1
-アカウントを操作します。
1 |
ノードquery.js |
出力:
1 2 3 4 5 6 7 8 9 10 11 12 |
財布・パス:...ファブリックサンプル/ fabcar / javascriptの/財布 評価されたトランザクション、結果は次のとおりです。 [{ "キー": "CAR0"、 "レコード":{ "色": "青"、 "メーク": "トヨタ"、 "モデル"、 "プリウス"、 "所有者": "智子"}}、 { "キー": "CAR1"、 "レコード":{ "色": "赤"、 "メイク": "フォード"、 "モデル": "ムスタング"、 "所有者": "ブラッド"}}、 { "キー": "CAR2"、 "レコード":{ "色": "緑"、 "メーク": "現代"、 "モデル": "ツーソン"、 "所有者": "ジン秀"}}、 { "キー": "CAR3"、 "レコード":{ "色": "黄"、 "メーク": "フォルクスワーゲン"、 "モデル"、 "パサート"、 "所有者": "最大"}}、 { "キー": "CAR4"、 "レコード":{ "色": "黒"、 "メイク": "テスラ"、 "モデル": "S"、 "所有者": "アドリアーナ"}}、 { "キー": "CAR5"、 "レコード":{ "色": "紫"、 "メーク": "プジョー"、 "モデル"、 "205"、 "所有者": "ミッシェル"}}、 { "キー": "CAR6"、 "レコード":{ "色": "白"、 "メーク": "チェリー"、 "モデル": "S22L"、 "所有者": "Aarav"}}、 { "キー": "CAR7"、 "レコード":{ "色": "紫"、 "メーク": "フィアット"、 "モデル": "プント"、 "所有者": "巴里"}}、 { "キー": "CAR8"、 "レコード":{ "色": "藍"、 "メーク": "TATA"、 "モデル"、 "ナノ"、 "所有者": "ヴァレリア"}}、 { "キー": "CAR9"、 "レコード":{ "色": "褐色"、 "メイク": "ホールデン"、 "モデル": "Barina"、 "所有者": "正太郎"}}] |
のは、このプログラムを詳しく見てみましょう。テキストエディタを使用して(例えば、原子またはVisual Studio)が開きますquery.js
。
アプリケーションは、上で起動するとfabric-network
、クラスの二つの主要モジュールの導入FileSystemWallet
とGateway
。これらの2つのクラスは、財布の検索に使用されるuser1
アイデンティティを、このIDを使用してネットワークに接続します。
1 |
CONST {FileSystemWallet、ゲートウェイ} =( 'ファブリックネットワーク')を必要とします。 |
アプリケーションは、ゲートウェイを使用してネットワークに接続します。
1 2 |
CONSTゲートウェイ=新しいゲートウェイ()。 await gateway.connect(CCP、{財布、同一 'USER1'})。 |
このコードは、新しいゲートウェイ、アプリケーションをネットワークに接続するためにそれを使用するを作成します。cpp
これは、ゲートウェイについて説明wallet
にuser1
ネットワークが接続されています。オープン ../../basic-network/connection.json
参照するには、cpp
JSONファイルを解析する方法です。
1 2 3 |
constのccpPath = path.resolve(__ dirnameは、 '.. '' ..'、 '基本的なネットワーク'、 'connection.json'); CONST ccpJSON = fs.readFileSync(ccpPath、 'UTF8')。 CONST CCP = JSON.parse(ccpJSON)。 |
あなたが構造接続プロファイルについての詳細学びたいとどのようにそれがネットワークに定義されている場合は、を参照してください。 接続プロファイルのトピック
ネットワークは、チャネルの数に分割することができる、次のコードは、特定のチャンネルにアプリケーションを接続するための非常に重要な場所であるmychannel
場合:
この一節では、我々はできるfabcar
スマート契約をやり取りや書籍:
1 |
constの契約= network.getContract( 'fabcar'); |
でfabcar
、中央多くの異なった取引がありますが、私たちのアプリケーションが使用するqueryAllCars
本の世界の状態を照会するトランザクションを:
1 |
CONST結果=のawait contract.evaluateTransaction( 'queryAllCars')。 |
evaluateTransaction
メソッドのプレゼントスマート契約とブロックチェーン・ネットワークと対話する最も簡単な方法。これは、ノードは、ノードが要求を送信する設定ファイルの定義に応じてのみ接続されて、リクエストがノードで実行されます。その後、スマート車の契約書上のすべてのノードのクエリ、およびアプリケーションに結果を返します。この相互作用は、本を更新されていません。
FabCarスマート契約
私たちは見てみましょうFabCar
契約のお得な情報でスマート。入力fabric-samples
サブディレクトリをchaincode/fabcar/javascript/lib
、その後、オープンに、あなたのエディタを使用fabcar.js
。
私たちは、契約がどのようにスマートを見てContract
クラスを定義するには:
1 |
クラスFabCarは{契約を延長します... |
このクラスの構造では、次のトランザクションの定義を参照されます: initLedger
、queryCar
、queryAllCars
、createCar
とchangeCarOwner
。例えば:
1 2 |
非同期queryCar(CTX、carNumber){...} 非同期queryAllCars(CTX){...} |
のは、それを見てはどのように書籍やインタラクティブで、queryAllCars詳しく見てみましょう。
1 2 3 4 5 6 |
非同期queryAllCars(CTX){ constのstartKey =「CAR0。 constのendKey = 'CAR999'; CONST反復子=のawait ctx.stub.getStateByRange(startKey、endKey)。 |
这段代码定义了 queryAllCars 将要从账本获取的汽车的范围。从 CAR0 到 CAR999 的每一辆车 – 一共 1000 辆车,假定每个键都被合适地锚定了 – 将会作为查询结果被返回。 代码中剩下的部分,通过迭代将查询结果打包成 JSON 并返回给应用。
下边将展示应用程序如何调用智能合约中的不同交易。每一个交易都使用一组 API 比如 getStateByRange 来和账本进行交互。了解更多API请阅读detail。
你可以看到我们的queryAllCars
交易,还有另一个叫做createCar
。我们稍后将在教程中使用他们来更新账本,和添加新的区块。
但是在那之前,返回到query
程序,更改evaluateTransaction
的请求来查询为CAR4
。query
程序现在如下:
1 |
const result = await contract.evaluateTransaction('queryCar', 'CAR4'); |
保存程序,然后返回到fabcar/javascript
目录。现在,再次运行query
程序:
1 |
node query.js |
你应该会看到如下所示:
1 2 3 |
Wallet path: ...fabric-samples/fabcar/javascript/wallet Transaction has been evaluated, result is: {"colour":"black","make":"Tesla","model":"S","owner":"Adriana"} |
如果你查看一下之前queryAllCars
的交易结果,你会看到CAR4
是Adriana
的黑色 Tesla model S
,也就是这里返回的结果,是一样的。
我们可以使用queryCar
交易来查询任意汽车,使用它的键(比如CAR0
)得到车辆的制造商、型号、颜色和车主等相关信息。
非常好。现在你应该已经了解了智能合约中基础的查询交易,也手动修改了查询程序中的参数。
是时候进行更新账本了。
更新账本
现在我们已经完成一些账本的查询操作,添加了一些代码,我们已经准备好更新账本了。有很 的更新操作我们可以做,但是我们从创建一辆新车开始。
从一个应用程序的角度来说,更新一个账本很简单。应用程序向区块链网络提交一个交易, 当交易被验证和提交后,应用程序会收到一个交易成功的提醒。但是在底层,区块链网络中各组件中不同的共识程序协同工作,来保证账本的每一个更新提案都是合法的,而且有一个大家一致认可的顺序。
上图中,我们可以看到完成这项工作的主要组件。同时,多个节点中每一个节点都拥有一份账本的副本,并可选的拥有一份智能合约的副本,网络中也有一个排序服务。排序服务保证网络中交易的一致性;它也将连接到网络中不同的应用程序的交易以定义好的顺序生成区块。
我们对账本的的第一个更新是创建一辆新车。我们有一个单独的程序叫做invoke.js
,用来更新账本。和查询一样,使用一个编辑器打开程序定位到我们构建和提交交易到网络的代码段:
1 |
await contract.submitTransaction('createCar', 'CAR12', 'Honda', 'Accord', 'Black', 'Tom'); |
看一下应用程序如何调用智能合约的交易createCar
来创建一辆车主为Tom的黑色Honda Accord汽车。我们使用CAR12
作为这里的键,这也说明了我们不必使用连续的键。
保存并运行程序:
1 |
node invoke.js |
如果执行成功,你将看到类似输出:
1 2 3 |
Wallet path: ...fabric-samples/fabcar/javascript/wallet 2018-12-11T14:11:40.935Z - info: [TransactionEventHandler]: _strategySuccess: strategy success for transaction "9076cd4279a71ecf99665aed0ed3590a25bba040fa6b4dd6d010f42bb26ff5d1" Transaction has been submitted |
注意inovke
程序使用的是submitTransaction
API和区块链网络交互的,而不是evaluateTransaction
。
1 |
await contract.submitTransaction('createCar', 'CAR12', 'Honda', 'Accord', 'Black', 'Tom'); |
submitTransaction
比evaluateTransaction
要复杂的多。不只是和单个节点交互,SDK将把submitTransaction
提案发送到区块链网络中每一个必要的组织的节点。每一个节点都将根据这个提案执行请求的智能合约,并生成一个该节点签名的交易响应并返回给SDK 。SDK将所有经过签名的交易响应收集到一个交易中,这个交易将会被发送到排序节点。排序节点搜集并排序每个应用的交易,并把这些交易放入到一个交易区块。然后排序节点将这些区块分发到网络中的节点,每一笔交易都会在节点中进行验证和提交。最后,SDK会后到提醒,并把控制权返回给应用程序。
submitTransaction
也会包括一个监听器用于确保交易已经被校验和提交到账本里了。应用程序需要利用监听器或者使用submitTransaction
接口,它内部已经实现了监听器。如果没有监听器,你可能无法确定交易是否被排序校验以及提交。
应用程序中的这些工作由submitTransaction
完成!应用程序、智能合约、节点和排序服务一起工作来保证网络中账本一致性的程序被称为共识。
为了查看这个被写入账本的交易,返回到query.js
并将参数CAR4
更改为CAR12
。
换句话说就是将:
1 |
const result = await contract.evaluateTransaction('queryCar', 'CAR4'); |
改为:
1 |
const result = await contract.evaluateTransaction('queryCar', 'CAR12'); |
再次保存,然后查询:
1 |
node query.js |
将返回:
1 2 3 |
Wallet path: ...fabric-samples/fabcar/javascript/wallet Transaction has been evaluated, result is: {"colour":"Black","make":"Honda","model":"Accord","owner":"Tom"} |
恭喜。你创建了一辆汽车并验证了它记录在账本上!
现在我们已经完成了,我们假设Tom很大方,想把他的Honda Accord送给一个叫Dave的人。
为了完成这个,返回到invoke.js
然后利用输入的参数,将智能合约的交易从createCar
改为changeCarOwner
:
1 |
await contract.submitTransaction('changeCarOwner', 'CAR12', 'Dave'); |
第一个参数 —CAR12
— 表示将要易主的车。第二个参数 —Dave
— 表示车的新主人。
再次保存并执行程序:
1 |
node invoke.js |
现在我们来再次查询账本,以确定Dave和CAR12
键已经关联起来了:
1 |
node query.js |
将返回如下结果:
1 2 3 |
Wallet path: ...fabric-samples/fabcar/javascript/wallet Transaction has been evaluated, result is: {"colour":"Black","make":"Honda","model":"Accord","owner":"Dave"} |
CAR12
的主人已经从Tom变成了Dave。
在实际的应用中,智能合约有权限控制逻辑。举个例子,只有有权限的用户可以创建新车,只有车子的拥有者可以转移车辆所属权。
总结
现在我们已经完成了账本的查询和更新,你也应该比较了解如何通过智能合约和区块链进行交互来查询账本和更新账本了。在教程中已经讲解了查询和更新的智能合约,API和SDK,想必你对其他商业场景也有了一定的了解和认识。
通过FabCar
这个例子,我们可以快速学习如何基于Node SDK
开发应用程序。