摘要:使用開發一個簡單的應用程序。而且,當鍵值對是以形式存在的時候,世界狀態可以通過配置使用數據庫例如來支持富查詢。每一個交易都使用一組比如來和賬本進行交互。
原文地址:https://www.xuanzhangjiong.to...利用Hyperledger Fabric開發你的第一個區塊鏈應用作者:TopJohn
本文示例源于fabric-samples中的fabcar
https://github.com/hyperledge...
在這個例子中,我們通過一個簡單的示例程序來了解Fabric應用是如何運行的。在這個例子中使用的應用程序和智能合約(鏈碼)統稱為FabCar。這個例子很好地提供了一個開始用于理解Hyperledger Fabric。在這里,你將學會如何開發一個應用程序和智能合約來查詢和更新賬本,如何利用CA來生成一個應用程序需要的用于和區塊鏈交互的X.509證書。
我們使用應用程序SDk來執行智能合約中的查詢更新賬本的操作,這些操作在智能合約中借助底層接口實現。
我們將通過3個步驟來進行講解:
搭建開發環境。我們的應用程序需要和網絡交互,因此我們需要一個智能合約和應用程序使用的基礎網絡。
學習一個簡單的智能合約,FabCar。我們使用JavaScript開發智能合約。我們通過查看智能合約來學習應用程序如何使用智能合約發送交易,如何使用智能合約來查詢和更新賬本。
使用FabCar開發一個簡單的應用程序。我們的應用程序會使用FabCar智能合約來查詢及更新賬本上的汽車資產。我們將進入應用程序的代碼中去了解如何創建交易,包括查詢一輛汽車的信息,查詢一批汽車的信息以及創建一輛汽車。
設置區塊鏈網絡注意:下面的部分需要進入你克隆到本地的fabric-samples倉庫的first-network子目錄。
如果你已經學習了 Building Your First Network,你應該已經下載了fabric-samples而且已經運行起了一個網絡。在你進行本教程之前,你需要停止這個網絡:
./byfn.sh down
如果你之前運行過這個教程,使用下面的命令關掉所有停止或者運行的容器。注意,這將關掉所有的容器,不論是否和Fabric有關。
docker rm -f $(docker ps -aq) docker rmi -f $(docker images | grep fabcar | awk "{print $3}")
如果你沒有這個網絡和應用相關的開發環境和構件,請訪問 Prerequisites頁面,確保你的機器安裝了必要的依賴。
接下來,如果你還沒有這樣做的話,請瀏覽 Install Samples, Binaries and Docker Images頁面,跟著上面的操作進行。當你克隆了fabric-samples倉庫,下載了最新的穩定版Fabric鏡像和相關工具之后回到教程。
如果你使用的是Mac OS和Mojava,你需要安裝Xcode。
啟動網絡下面的部分需要進入fabric-samples倉庫的fabcar子目錄。
使用startFabric.sh來啟動你的網絡。這個命令將啟動一個區塊鏈網絡,這個網絡由peer節點、排序節點、證書授權服務等組成。同時也將安裝和初始化javascript版本的FabCar智能合約,我們的應用程序將通過它來操作賬本。我們將通過本教程學習更過關于這些組件的內容。
./startFabric.sh javascript
現在,我們已經運行起來了一個示例網絡,還安裝和初始化了FabCar智能合約。為了運行我們的應用程序,我們需要安裝一些依賴,同時讓我們看一下它們是如何工作的。
安裝應用程序注意:下邊的章節需要進入你克隆到本地的fabric-samples倉庫的fabcar/javascript子目錄。
下面的命令來安裝應用程序所需的Fabric有關的依賴。大概將話費1分鐘左右的時間:
npm install
這個指令用于安裝應用程序所需的依賴,這些依賴被定義在package.json中。其中最重要的是fabric-network類;它使得應用程序可以使用身份、錢包和連接到通道的網關,以及提交交易和等待通知。本教程也將使用fabric-ca-client類來注冊用戶以及他們的授權證書,生成一個fabric-network使用的合法的身份。
一旦npm install執行成功,運行應用程序所需的一切就準備好了。在這個教程中,你將主要使用fabcar/javascript目錄下的JavaScript文件來操作應用程序。讓我們來了解一下里面有哪些文件:
ls
你將看到下列文件:
enrollAdmin.js node_modules package.json registerUser.js invoke.js package-lock.json query.js wallet
里面也有一些其他編程語言的文件,比如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會發布一個應用程序使用的證書。這三個憑證會保存在錢包中,以便于我們以管理員的身份使用CA。
接下來我們會注冊和登記一個新的應用程序用戶,我們將使用這個用戶來通過應用程序和區塊鏈進行交互。
讓我們登記一個admin用戶:
node enrollAdmin.js
這個命令將CA管理員證書保存在wallet目錄。
注冊和登記user1現在我們在錢包里放了管理員的證書,我們可以登記一個新用戶--user1--用這個用戶來查詢和更新賬本:
node registerUser.js
和登記管理員類似,這個程序使用了CSR來登記user1并把它的證書保存到admin所在的錢包中?,F在我們有了2個獨立的用戶--admin和user1--它們都將用于我們的應用程序。
接下來是賬本交互時間...
查詢賬本區塊鏈網絡中的每個節點都擁有一個賬本的副本,應用程序可以通過執行智能合約查詢賬本上的最新舒徐來實現查詢賬本操作,將結果返回給應用程序。
這是一個如何查詢的簡單闡述:
應用程序使用查詢從ledger讀取數據。最常見的就是查詢當前賬本中的最新值--世界狀態。世界狀態是一個鍵值對的集合,應用程序可以根據一個鍵或者多個鍵來查詢數據。而且,當鍵值對是以JSON形式存在的時候,世界狀態可以通過配置使用數據庫(例如CouchDB)來支持富查詢。這個特性對于查詢匹配特定的鍵的值是很有幫助的,比如查詢一個人的所有汽車。
首先,讓我們使用query.js程序來查詢賬本上的所有汽車。這個程序使用我們的第二個身份--user1--來操作賬本。
node query.js
輸出結果如下:
Wallet path: ...fabric-samples/fabcar/javascript/wallet Transaction has been evaluated, result is: [{"Key":"CAR0", "Record":{"colour":"blue","make":"Toyota","model":"Prius","owner":"Tomoko"}}, {"Key":"CAR1", "Record":{"colour":"red","make":"Ford","model":"Mustang","owner":"Brad"}}, {"Key":"CAR2", "Record":{"colour":"green","make":"Hyundai","model":"Tucson","owner":"Jin Soo"}}, {"Key":"CAR3", "Record":{"colour":"yellow","make":"Volkswagen","model":"Passat","owner":"Max"}}, {"Key":"CAR4", "Record":{"colour":"black","make":"Tesla","model":"S","owner":"Adriana"}}, {"Key":"CAR5", "Record":{"colour":"purple","make":"Peugeot","model":"205","owner":"Michel"}}, {"Key":"CAR6", "Record":{"colour":"white","make":"Chery","model":"S22L","owner":"Aarav"}}, {"Key":"CAR7", "Record":{"colour":"violet","make":"Fiat","model":"Punto","owner":"Pari"}}, {"Key":"CAR8", "Record":{"colour":"indigo","make":"Tata","model":"Nano","owner":"Valeria"}}, {"Key":"CAR9", "Record":{"colour":"brown","make":"Holden","model":"Barina","owner":"Shotaro"}}]
讓我們近距離看一下這個程序。使用文本編輯器(如atom或者visual studio)打開query.js。
應用程序開始的時候就從fabric-network模塊引入了兩個關鍵的類FileSystemWallet和Gateway。這兩個類將用于定位錢包中user1的身份,并且使用這個身份連接網絡:
const { FileSystemWallet, Gateway } = require("fabric-network");
應用程序使用網關連接網絡:
const gateway = new Gateway(); await gateway.connect(ccp, { wallet, identity: "user1" });
這段代碼創建了一個新的網關,然后通過它來讓應用程序連接網絡。cpp描述了網關通過wallet中的user1來連接網絡。打開 ../../basic-network/connection.json來查看cpp是如何解析一個JSON文件的:
const ccpPath = path.resolve(__dirname, "..", "..", "basic-network", "connection.json"); const ccpJSON = fs.readFileSync(ccpPath, "utf8"); const ccp = JSON.parse(ccpJSON);
如果你想了解更多關于連接配置文件的結構以及它是怎么定義網絡的,請查閱 the connection profile topic
一個網絡可以被拆分成很多個通道,代碼中下一個很重要的地方是將應用程序連接到特定的通道mychannel上:
在這個通道中,我們可以通過fabcar智能合約來和賬本進行交互:
const contract = network.getContract("fabcar");
在fabcar中有許多不同的交易,我們的應用程序先使用queryAllCars交易來查詢賬本的世界狀態:
const result = await contract.evaluateTransaction("queryAllCars");
evaluateTransaction方法呈現了一種和區塊鏈網絡中的智能合約交互的最簡單的方法。它只是根據配置文件中的定義連接一個節點,然后向節點發送請求,在節點內執行該請求。智能合約查詢了節點賬本上的所有汽車,然后把結果返回給應用程序。這次交互并沒有更新賬本。
FabCar智能合約讓我們看一看FabCar智能合約里的交易。進入fabric-samples下的子目錄chaincode/fabcar/javascript/lib,然后用你的編輯器打開fabcar.js。
看一下我們的智能合約是如何通過Contract類來定義的:
class FabCar extends Contract {...
在這個類結構中,你將看到定義了以下交易: initLedger,queryCar,queryAllCars,createCar和changeCarOwner。例如:
async queryCar(ctx, carNumber) {...} async queryAllCars(ctx) {...}
讓我們更進一步看一下 queryAllCars ,看一下它是怎么和賬本交互的。
async queryAllCars(ctx) { const startKey = "CAR0"; const endKey = "CAR999"; const iterator = await ctx.stub.getStateByRange(startKey, endKey);
這段代碼定義了 queryAllCars 將要從賬本獲取的汽車的范圍。從 CAR0 到 CAR999 的每一輛車 -- 一共 1000 輛車,假定每個鍵都被合適地錨定了 -- 將會作為查詢結果被返回。 代碼中剩下的部分,通過迭代將查詢結果打包成 JSON 并返回給應用。
下邊將展示應用程序如何調用智能合約中的不同交易。每一個交易都使用一組 API 比如 getStateByRange 來和賬本進行交互。了解更多API請閱讀detail。
你可以看到我們的queryAllCars交易,還有另一個叫做createCar。我們稍后將在教程中使用他們來更新賬本,和添加新的區塊。
但是在那之前,返回到query程序,更改evaluateTransaction的請求來查詢為CAR4。query程序現在如下:
const result = await contract.evaluateTransaction("queryCar", "CAR4");
保存程序,然后返回到fabcar/javascript目錄?,F在,再次運行query程序:
node query.js
你應該會看到如下所示:
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)得到車輛的制造商、型號、顏色和車主等相關信息。
非常好?,F在你應該已經了解了智能合約中基礎的查詢交易,也手動修改了查詢程序中的參數。
是時候進行更新賬本了。
更新賬本現在我們已經完成一些賬本的查詢操作,添加了一些代碼,我們已經準備好更新賬本了。有很 的更新操作我們可以做,但是我們從創建一輛新車開始。
從一個應用程序的角度來說,更新一個賬本很簡單。應用程序向區塊鏈網絡提交一個交易, 當交易被驗證和提交后,應用程序會收到一個交易成功的提醒。但是在底層,區塊鏈網絡中各組件中不同的共識程序協同工作,來保證賬本的每一個更新提案都是合法的,而且有一個大家一致認可的順序。
上圖中,我們可以看到完成這項工作的主要組件。同時,多個節點中每一個節點都擁有一份賬本的副本,并可選的擁有一份智能合約的副本,網絡中也有一個排序服務。排序服務保證網絡中交易的一致性;它也將連接到網絡中不同的應用程序的交易以定義好的順序生成區塊。
我們對賬本的的第一個更新是創建一輛新車。我們有一個多帶帶的程序叫做invoke.js,用來更新賬本。和查詢一樣,使用一個編輯器打開程序定位到我們構建和提交交易到網絡的代碼段:
await contract.submitTransaction("createCar", "CAR12", "Honda", "Accord", "Black", "Tom");
看一下應用程序如何調用智能合約的交易createCar來創建一輛車主為Tom的黑色Honda Accord汽車。我們使用CAR12作為這里的鍵,這也說明了我們不必使用連續的鍵。
保存并運行程序:
node invoke.js
如果執行成功,你將看到類似輸出:
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程序使用的是submitTransactionAPI和區塊鏈網絡交互的,而不是evaluateTransaction。
await contract.submitTransaction("createCar", "CAR12", "Honda", "Accord", "Black", "Tom");
submitTransaction比evaluateTransaction要復雜的多。不只是和單個節點交互,SDK將把submitTransaction提案發送到區塊鏈網絡中每一個必要的組織的節點。每一個節點都將根據這個提案執行請求的智能合約,并生成一個該節點簽名的交易響應并返回給SDK 。SDK將所有經過簽名的交易響應收集到一個交易中,這個交易將會被發送到排序節點。排序節點搜集并排序每個應用的交易,并把這些交易放入到一個交易區塊。然后排序節點將這些區塊分發到網絡中的節點,每一筆交易都會在節點中進行驗證和提交。最后,SDK會后到提醒,并把控制權返回給應用程序。
submitTransaction也會包括一個監聽器用于確保交易已經被校驗和提交到賬本里了。應用程序需要利用監聽器或者使用submitTransaction接口,它內部已經實現了監聽器。如果沒有監聽器,你可能無法確定交易是否被排序校驗以及提交。
應用程序中的這些工作由submitTransaction完成!應用程序、智能合約、節點和排序服務一起工作來保證網絡中賬本一致性的程序被稱為共識。
為了查看這個被寫入賬本的交易,返回到query.js并將參數CAR4更改為CAR12。
換句話說就是將:
const result = await contract.evaluateTransaction("queryCar", "CAR4");
改為:
const result = await contract.evaluateTransaction("queryCar", "CAR12");
再次保存,然后查詢:
node query.js
將返回:
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:
await contract.submitTransaction("changeCarOwner", "CAR12", "Dave");
第一個參數 ---CAR12--- 表示將要易主的車。第二個參數 ---Dave--- 表示車的新主人。
再次保存并執行程序:
node invoke.js
現在我們來再次查詢賬本,以確定Dave和CAR12鍵已經關聯起來了:
node query.js
將返回如下結果:
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開發應用程序。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/24628.html
摘要:企業區塊鏈平臺企業級許可的分布式分類賬平臺,為廣泛的行業用例提供模塊化和多功能性。這些節點通過應用已經由共識協議驗證的交易來維護分類帳的副本,該交易被分組為包括將每個塊綁定到前一個塊的散列的塊中。 企業區塊鏈平臺 企業級許可的分布式分類賬平臺,為廣泛的行業用例提供模塊化和多功能性。 介紹 一般而言,區塊鏈是一個不可變的交易分類賬,維護在一個分布式對等節點網絡中。這些節點通過應用已經由共...
摘要:還提供創建通道的功能,允許一組參與者創建單獨的交易分類賬。共識交易必須按照發生的順序寫入分類賬,即使它們可能位于網絡中不同的參與者組之間。 介紹 Hyperledger Fabric是分布式分類賬解決方案的平臺,采用模塊化架構,提供高度機密性,彈性,靈活性和可擴展性,它旨在支持不同組件的可插拔實現,并適應整個經濟生態系統中存在的錯綜復雜的事物和復雜性。 我們建議首次使用的用戶首先閱讀下...
摘要:是企業與區塊鏈相遇的地方。的框架旨在成為開發區塊鏈解決方案的支柱。以太坊,主要是針對工程師使用進行區塊鏈以太坊開發的詳解。 如果你想將區塊鏈合并到一個Java項目中,現在我們來看看就是這個細分領域中三個最大的OSS玩家。 好的伙計們,我們都聽說過比特幣,以太坊或其他加密貨幣,其中有一些時髦的名字圍繞著我們常見的新聞,但我們作為Java開發人員知道如何輕松地與這些區塊鏈技術進行交互嗎?以...
摘要:比特幣和以太幣屬于一類區塊鏈,我們將其歸類為公共無許可的區塊鏈技術。例如,在單個企業中部署時,或由受信任的權威機構運作,完全拜占庭容錯的共識可能被認為是不必要的,并且對性能和吞吐量造成過度的拖累。 介紹 一般而言,區塊鏈是一個不可變的交易分類賬,維護在一個分布式對等節點網絡中。這些節點通過應用已經由共識協議驗證的交易來維護分類帳的副本,該交易被分組為包括將每個塊綁定到前一個塊的散列的塊...
摘要:在她的幫助下,原型發布順利完成。節點收到一個交易后,會根據判斷標準對該交易進行有效性校驗,無效的交易會被廢棄。負責權限管理,成員身份相關證書管理和維護交易相關證書管理等等。 今天的文章來自Wen Aviva, 坐Jerry面對面的程序媛。 Jerry在之前的公眾號文章《在SAP UI中使用純JavaScript顯示產品主數據的3D模型視圖》已經介紹過Aviva了,SAP成都C4C開發團...
閱讀 1179·2021-11-22 13:54
閱讀 2427·2021-09-22 15:36
閱讀 2734·2019-08-30 15:54
閱讀 801·2019-08-30 15:53
閱讀 3167·2019-08-30 15:53
閱讀 513·2019-08-29 15:21
閱讀 2861·2019-08-28 18:28
閱讀 3003·2019-08-26 13:37