Fabric--node测试
node測試
關閉網絡
$ sudo ./byfn.sh -m down
進入到fabric-samples/fabcar目錄中
$ cd ../fabcar/ $ ls如果是完整的環境,目錄中應該包含如下文件:
enrollAdmin.js invoke.js package.json query.js registerUser.js startFabric.sh
移除所有處于活動中的Docker容器
$ sudo docker rm -f $(docker ps -aq)docker rm : 刪除當前指定的Docker容器
? docker rm -f $(docker ps -aq)
? -f: 強制刪除
查看Docker
$ sudo docker ps清除所有的網絡緩存:
$ sudo docker network prune刪除鏈碼圖像(鏈碼鏡像)
刪除fabcar智能合約的底層鏈碼圖像。如果您是第一次運行此項目可以不執行(系統上不會有此鏈接代碼圖像)
$ sudo docker rmi dev-peer0.org1.example.com-fabcar-1.0-5c906e402ed29f20260ae42283216aa75549c571e2e380f3615826365d8269ba刪除指定的Docker鏡像文件
? docker rmi image_id
安裝客戶端
安裝應用程序的Fabric依賴關系
$ npm install下載最好使用穩定的VPN
npm install: 根據 package.json 讀取依賴的信息并安裝
如果未安裝Node則先按如下步驟安裝Node及npm
安裝nvm
$ sudo apt update $ curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.10/install.sh | bash$ export NVM_DIR="$HOME/.nvm" $ [ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"安裝Node
$ nvm install v8.11.1檢查Node版本
$ node -v輸出: v8.11.1
檢查npm版本
$ npm -v輸出: 5.6.0
啟動網絡
$ sudo ./startFabric.sh該命令將啟動各種Fabric實體,并啟動用Golang編寫的鏈式代碼的智能合約容器
如出現以下錯誤
ERROR: manifest for hyperledger/fabric-ca:latest not found則說明環境中缺少 fabric-ca 鏡像
下載鏡像 $ sudo docker pull hyperledger/fabric-ca:x86_64-1.1.0-preview將其標記為最新 $ sudo docker tag hyperledger/fabric-ca:x86_64-1.1.0-preview hyperledger/fabric-ca:latest檢查 $ sudo docker images重新啟動 $ sudo ./startFabric.sh可選執行(流式處理CA日志, 打開新的終端并執行如下命令)
$ sudo docker logs -f ca.example.com注冊管理員用戶
$ node enrollAdmin.js命令執行后輸出如下內容:
Successfully enrolled admin user "admin" Assigned the admin user to the fabric client ::{"name":"admin","mspid":"Org1MSP","roles":null,"affiliation":"","enrollmentSecret":"","enrollment":{"signingIdentity":"dc412dcc161b5732737e98e77fda03433b55408d79b10195f0ff150fc995924a","identity":{"certificate":"-----BEGIN CERTIFICATE-----\nMIICATCCAaigAwIBAgIUMjxyVKytJHiYigb+usxuVlmeI8kwCgYIKoZIzj0EAwIw\nczELMAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNh\nbiBGcmFuY2lzY28xGTAXBgNVBAoTEG9yZzEuZXhhbXBsZS5jb20xHDAaBgNVBAMT\nE2NhLm9yZzEuZXhhbXBsZS5jb20wHhcNMTgwNDI2MDcyNzAwWhcNMTkwNDI2MDcz\nMjAwWjAhMQ8wDQYDVQQLEwZjbGllbnQxDjAMBgNVBAMTBWFkbWluMFkwEwYHKoZI\nzj0CAQYIKoZIzj0DAQcDQgAEszinoLQrvnKVYl9FUT8ebxT2jIz5lKCk5olL1cox\n/JchmLPG8Ew1roM2TgG64rvT1nrl1EvMwmD8oEOMgmGqwKNsMGowDgYDVR0PAQH/\nBAQDAgeAMAwGA1UdEwEB/wQCMAAwHQYDVR0OBBYEFNG9kJBZBDSOwFxVHTDByNOl\nMvDSMCsGA1UdIwQkMCKAIEI5qg3NdtruuLoM2nAYUdFFBNMarRst3dusalc2Xkl8\nMAoGCCqGSM49BAMCA0cAMEQCIA1Ugh8NW3tS0GkuUrURdwQrSnFkdWTQhJ1/GvRd\nJbeTAiBGdDpHu/6mZG8dpguA0EaqSHrWJBQra4Vj1Fm9F1+zNg==\n-----END CERTIFICATE-----\n"}}}成功執行后會調用證書簽名請求(CSR),并最終將eCert和密鑰材料輸出到此文件夾中./hfc-key-store, 應用程序將在創建用戶或加載身份對象時查找此位置
注冊 user1用戶
$ node registerUser.jsuser1
該命令執行后調用CSR并將密鑰和eCert輸出到./hfc-key-store子目錄中
執行命令后輸出如下:
Successfully loaded admin from persistence Successfully registered user1 - secret:mrOjTeyeUmWY Successfully enrolled member user "user1" User1 was successfully registered and enrolled and is ready to intreact with the fabric network查詢分類帳
$ node query.js命令執行后輸出如下
Successfully loaded user1 from persistence Query has completed, checking results Response 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"}}]由Adriana擁有的黑色特斯拉Model S,由Brad擁有的紅色Ford Mustang,由Pari擁有的紫色Fiat Punto等等。
分類賬是基于K-V的,在上面的信息中,Key為CAR0至CAR9
打開query.js
$ cat query.js發現應用程序的初始部分定義了某些變量,例如通道名稱,證書存儲位置和網絡端點
var channel = fabric_client.newChannel('mychannel'); var peer = fabric_client.newPeer('grpc://localhost:7051'); channel.addPeer(peer);var member_user = null; var store_path = path.join(__dirname, 'hfc-key-store'); console.log('Store path:'+store_path); var tx_id = null;query.js文件有如下代碼使用第二個身份user1作為此應用程序的簽署實體。指定user1為簽名者
fabric_client.getUserContext('user1', true);
這是實現查詢功能的語句塊:
// queryCar chaincode function - requires 1 argument, ex: args: ['CAR4'], // queryAllCars chaincode function - requires no arguments , ex: args: [''], const request = {//targets : --- letting this default to the peers assigned to the channelchaincodeId: 'fabcar',fcn: 'queryAllCars',args: [''] };調用鏈碼命令:chaincode query -n 鏈碼名稱 -C 通道名稱 -c 調用鏈碼時所需要傳遞的參數-c '{"Args":["FunctionName", "查詢Key"]}'當應用程序運行時,它會調用對等fabcar體上的鏈式代碼,運行其中的queryAllCars函數,且不傳遞任何參數.
使用編輯器打開query.js
$ vim query.js修改其查詢塊內容,更改queryAllCars為queryCar并將CAR4作為特定Key為參數傳遞來執行此操作
const request = {//targets : --- letting this default to the peers assigned to the channelchaincodeId: 'fabcar',fcn: 'queryCar',args: ['CAR4'] };保存退出后運行:
$ node query.js執行后返回如下
Successfully loaded user1 from persistence Query has completed, checking results Response is {"colour":"black","make":"Tesla","model":"S","owner":"Adriana"}使用該queryCar功能,我們可以查詢任何關鍵字(例如CAR0)并獲取與該車相對應的任何品牌,型號,顏色和所有者
更新分類帳
修改 invoke.js, 找到var request中的fcn與args, 添加一條新的數據
$ vim invoke.js var request = {//targets: let default to the peer assigned to the clientchaincodeId: 'fabcar',fcn: 'createCar',args: ['CAR10','Chevy','Volt','Red','Nick'],chainId: 'mychannel',txId: tx_id};保存退出后執行
$ node invoke.js執行成功,輸出如下
Successfully loaded user1 from persistence Assigning transaction_id: 801d0636b9aa94cc7782af21ec2a10ebb12f929bd722afcee1f2b7b923485c82 Transaction proposal was good Successfully sent Proposal and received ProposalResponse: Status - 200, message - "OK" The transaction has been committed on peer localhost:7053 Send transaction promise and event listener promise have completed Successfully sent transaction to the orderer. Successfully committed the change to the ledger by the peer返回query.js并將參數由CAR4更改為CAR10
$ vim query.js const request = {//targets : --- letting this default to the peers assigned to the channelchaincodeId: 'fabcar',fcn: 'queryCar',args: ['CAR10'] };查詢:
node query.js輸出內容如下:
Successfully loaded user1 from persistence Query has completed, checking results Response is {"colour":"Red","make":"Chevy","model":"Volt","owner":"Nick"}修改 invoke.js, 修改CAR10的擁有者為 Dave
$ vim invoke.js var request = {//targets: let default to the peer assigned to the clientchaincodeId: 'fabcar',fcn: 'changeCarOwner',args: ['CAR10','Dave'],chainId: 'mychannel',txId: tx_id };保存退出并執行
$ node invoke.js $ node query.js運行輸出結果:
Successfully loaded user1 from persistence Query has completed, checking results Response is {"colour":"Red","make":"Chevy","model":"Volt","owner":"Dave"}問題:
在執行 node invoke.js 命令后出現如下錯誤
Store path:$HOME/hyfa/fabric-samples/fabcar/hfc-key-store Successfully loaded user1 from persistence Assigning transaction_id: f80947242014765a46a17d797b45c8ed9a5db5cc936a57c731219d9e25646051 Transaction proposal was good Successfully sent Proposal and received ProposalResponse: Status - 200, message - "OK" Failed to invoke successfully :: TypeError: Cannot read property 'getConnectivityState' of undefined $HOME/hyfa/fabric-samples/fabcar/node_modules/fabric-client/lib/EventHub.js:308if(self._stream) state = self._stream.call.channel_.getConnectivityState();^TypeError: Cannot read property 'getConnectivityState' of undefinedat ClientDuplexStream.<anonymous> ($HOME/hyfa/fabric-samples/fabcar/node_modules/fabric-client/lib/EventHub.js:308:56)at emitOne (events.js:116:13)at ClientDuplexStream.emit (events.js:211:7)at addChunk (_stream_readable.js:263:12)at readableAddChunk (_stream_readable.js:250:11)at ClientDuplexStream.Readable.push (_stream_readable.js:208:10)at Object.onReceiveMessage ($HOME/hyfa/fabric-samples/fabcar/node_modules/grpc/src/client_interceptors.js:1302:19)at InterceptingListener.recvMessageWithContext ($HOME/hyfa/fabric-samples/fabcar/node_modules/grpc/src/client_interceptors.js:629:19)at $HOME/hyfa/fabric-samples/fabcar/node_modules/grpc/src/client_interceptors.js:728:14此問題可以無視, 不會影響到后繼查詢命令 node query.js 的執行
總結
以上是生活随笔為你收集整理的Fabric--node测试的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Fabric--CA 应用与配置
- 下一篇: Fabric--区块链应用开发