【系列】nodeSDK
2022/9/2 14:23:07
本文主要是介绍【系列】nodeSDK,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
目录- runAPP.sh代码分析
- docker-compose.yaml
- testAPIs.sh
- Balance transfer
- Prerequisites and setup:
- Artifacts
- Prerequisites and setup:
- Running the sample program
- Option 1:
- Terminal Window 1
- Terminal Window 2
- Terminal Window 3
- Option 2:
- Terminal Window 1
- Terminal Window 2
- Option 1:
- Sample REST APIs Requests
- Login Request
- Create Channel request
- Join Channel request
- Install chaincode
- Instantiate chaincode
- Invoke request
- Chaincode Query
- Query Block by BlockNumber
- Query Transaction by TransactionID
- Query ChainInfo
- Query Installed chaincodes
- Query Instantiated chaincodes
- Query Channels
- Clean the network
- Network configuration considerations
- IP Address** and PORT information
- Discover IP Address
runAPP.sh代码分析
#重启网络 # 1 解散网络并清理容器和映像 docker-compose -f ./artifacts/docker-compose.yaml down # 2 清理内存 rm -rf ./fabric-client-kv-org* # 3 重启网络 docker-compose -f ./artifacts/docker-compose.yaml up -d #安装NodeModules npm install #启动node服务器 PORT=4000 node app
docker-compose.yaml
# # Copyright IBM Corp. All Rights Reserved. # # SPDX-License-Identifier: Apache-2.0 # version: '2' services: ca.org1.example.com: image: hyperledger/fabric-ca environment: - FABRIC_CA_HOME=/etc/hyperledger/fabric-ca-server - FABRIC_CA_SERVER_CA_NAME=ca-org1 - FABRIC_CA_SERVER_CA_CERTFILE=/etc/hyperledger/fabric-ca-server-config/ca.org1.example.com-cert.pem - FABRIC_CA_SERVER_CA_KEYFILE=/etc/hyperledger/fabric-ca-server-config/0e729224e8b3f31784c8a93c5b8ef6f4c1c91d9e6e577c45c33163609fe40011_sk - FABRIC_CA_SERVER_TLS_ENABLED=true - FABRIC_CA_SERVER_TLS_CERTFILE=/etc/hyperledger/fabric-ca-server-config/ca.org1.example.com-cert.pem - FABRIC_CA_SERVER_TLS_KEYFILE=/etc/hyperledger/fabric-ca-server-config/0e729224e8b3f31784c8a93c5b8ef6f4c1c91d9e6e577c45c33163609fe40011_sk ports: - "7054:7054" command: sh -c 'fabric-ca-server start -b admin:adminpw -d' volumes: - ./channel/crypto-config/peerOrganizations/org1.example.com/ca/:/etc/hyperledger/fabric-ca-server-config container_name: ca_peerOrg1 ca.org2.example.com: image: hyperledger/fabric-ca environment: - FABRIC_CA_HOME=/etc/hyperledger/fabric-ca-server - FABRIC_CA_SERVER_CA_NAME=ca-org2 - FABRIC_CA_SERVER_CA_CERTFILE=/etc/hyperledger/fabric-ca-server-config/ca.org2.example.com-cert.pem - FABRIC_CA_SERVER_CA_KEYFILE=/etc/hyperledger/fabric-ca-server-config/a7d47efa46a6ba07730c850fed2c1375df27360d7227f48cdc2f80e505678005_sk - FABRIC_CA_SERVER_TLS_ENABLED=true - FABRIC_CA_SERVER_TLS_CERTFILE=/etc/hyperledger/fabric-ca-server-config/ca.org2.example.com-cert.pem - FABRIC_CA_SERVER_TLS_KEYFILE=/etc/hyperledger/fabric-ca-server-config/a7d47efa46a6ba07730c850fed2c1375df27360d7227f48cdc2f80e505678005_sk ports: - "8054:7054" command: sh -c 'fabric-ca-server start -b admin:adminpw -d' volumes: - ./channel/crypto-config/peerOrganizations/org2.example.com/ca/:/etc/hyperledger/fabric-ca-server-config container_name: ca_peerOrg2 orderer.example.com: container_name: orderer.example.com image: hyperledger/fabric-orderer environment: - ORDERER_GENERAL_LOGLEVEL=debug - ORDERER_GENERAL_LISTENADDRESS=0.0.0.0 - ORDERER_GENERAL_GENESISMETHOD=file - ORDERER_GENERAL_GENESISFILE=/etc/hyperledger/configtx/genesis.block - ORDERER_GENERAL_LOCALMSPID=OrdererMSP - ORDERER_GENERAL_LOCALMSPDIR=/etc/hyperledger/crypto/orderer/msp - ORDERER_GENERAL_TLS_ENABLED=true - ORDERER_GENERAL_TLS_PRIVATEKEY=/etc/hyperledger/crypto/orderer/tls/server.key - ORDERER_GENERAL_TLS_CERTIFICATE=/etc/hyperledger/crypto/orderer/tls/server.crt - ORDERER_GENERAL_TLS_ROOTCAS=[/etc/hyperledger/crypto/orderer/tls/ca.crt, /etc/hyperledger/crypto/peerOrg1/tls/ca.crt, /etc/hyperledger/crypto/peerOrg2/tls/ca.crt] working_dir: /opt/gopath/src/github.com/hyperledger/fabric/orderers command: orderer ports: - 7050:7050 volumes: - ./channel:/etc/hyperledger/configtx - ./channel/crypto-config/ordererOrganizations/example.com/orderers/orderer.example.com/:/etc/hyperledger/crypto/orderer - ./channel/crypto-config/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/:/etc/hyperledger/crypto/peerOrg1 - ./channel/crypto-config/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/:/etc/hyperledger/crypto/peerOrg2 peer0.org1.example.com: container_name: peer0.org1.example.com extends: file: base.yaml service: peer-base environment: - CORE_PEER_ID=peer0.org1.example.com - CORE_PEER_LOCALMSPID=Org1MSP - CORE_PEER_ADDRESS=peer0.org1.example.com:7051 ports: - 7051:7051 - 7053:7053 volumes: - ./channel/crypto-config/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/:/etc/hyperledger/crypto/peer depends_on: - orderer.example.com peer1.org1.example.com: container_name: peer1.org1.example.com extends: file: base.yaml service: peer-base environment: - CORE_PEER_ID=peer1.org1.example.com - CORE_PEER_LOCALMSPID=Org1MSP - CORE_PEER_ADDRESS=peer1.org1.example.com:7051 ports: - 7056:7051 - 7058:7053 volumes: - ./channel/crypto-config/peerOrganizations/org1.example.com/peers/peer1.org1.example.com/:/etc/hyperledger/crypto/peer depends_on: - orderer.example.com peer0.org2.example.com: container_name: peer0.org2.example.com extends: file: base.yaml service: peer-base environment: - CORE_PEER_ID=peer0.org2.example.com - CORE_PEER_LOCALMSPID=Org2MSP - CORE_PEER_ADDRESS=peer0.org2.example.com:7051 ports: - 8051:7051 - 8053:7053 volumes: - ./channel/crypto-config/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/:/etc/hyperledger/crypto/peer depends_on: - orderer.example.com peer1.org2.example.com: container_name: peer1.org2.example.com extends: file: base.yaml service: peer-base environment: - CORE_PEER_ID=peer1.org2.example.com - CORE_PEER_LOCALMSPID=Org2MSP - CORE_PEER_ADDRESS=peer1.org2.example.com:7051 ports: - 8056:7051 - 8058:7053 volumes: - ./channel/crypto-config/peerOrganizations/org2.example.com/peers/peer1.org2.example.com/:/etc/hyperledger/crypto/peer depends_on: - orderer.example.com
testAPIs.sh
starttime=$(date +%s) LANGUAGE="golang" ## 1 set chaincode path CC_SRC_PATH="github.com/example_cc/go" #golang,node则为CC_SRC_PATH="$PWD/artifacts/src/github.com/example_cc/node" ## 2 POST 请求在 Org1 上注册 ORG1_TOKEN=$(curl -s -X POST \ http://localhost:4000/users \ -H "content-type: application/x-www-form-urlencoded" \ -d 'username=Jim&orgName=Org1') ORG1_TOKEN=$(echo $ORG1_TOKEN | jq ".token" | sed "s/\"//g") # 3 POST 请求在 Org2 上注册 ORG2_TOKEN=$(curl -s -X POST \ http://localhost:4000/users \ -H "content-type: application/x-www-form-urlencoded" \ -d 'username=Barry&orgName=Org2') ORG2_TOKEN=$(echo $ORG2_TOKEN | jq ".token" | sed "s/\"//g") # 4 POST 请求创建通道 curl -s -X POST \ http://localhost:4000/channels \ -H "authorization: Bearer $ORG1_TOKEN" \ -H "content-type: application/json" \ -d '{ "channelName":"mychannel", "channelConfigPath":"../artifacts/channel/mychannel.tx" }' sleep 5 # 5 POST request Join channel on Org1 curl -s -X POST \ http://localhost:4000/channels/mychannel/peers \ -H "authorization: Bearer $ORG1_TOKEN" \ -H "content-type: application/json" \ -d '{ "peers": ["peer0.org1.example.com","peer1.org1.example.com"] }' # 6 POST request Join channel on Org2 curl -s -X POST \ http://localhost:4000/channels/mychannel/peers \ -H "authorization: Bearer $ORG2_TOKEN" \ -H "content-type: application/json" \ -d '{ "peers": ["peer0.org2.example.com","peer1.org2.example.com"] }' # 7 POST Install chaincode on Org1 curl -s -X POST \ http://localhost:4000/chaincodes \ -H "authorization: Bearer $ORG1_TOKEN" \ -H "content-type: application/json" \ -d "{ \"peers\": [\"peer0.org1.example.com\",\"peer1.org1.example.com\"], \"chaincodeName\":\"mycc\", \"chaincodePath\":\"$CC_SRC_PATH\", \"chaincodeType\": \"$LANGUAGE\", \"chaincodeVersion\":\"v0\" }" # 8 POST Install chaincode on Org2 curl -s -X POST \ http://localhost:4000/chaincodes \ -H "authorization: Bearer $ORG2_TOKEN" \ -H "content-type: application/json" \ -d "{ \"peers\": [\"peer0.org2.example.com\",\"peer1.org2.example.com\"], \"chaincodeName\":\"mycc\", \"chaincodePath\":\"$CC_SRC_PATH\", \"chaincodeType\": \"$LANGUAGE\", \"chaincodeVersion\":\"v0\" }" # 9 POST instantiate chaincode on peer1 of Org1" curl -s -X POST \ http://localhost:4000/channels/mychannel/chaincodes \ -H "authorization: Bearer $ORG1_TOKEN" \ -H "content-type: application/json" \ -d "{ \"chaincodeName\":\"mycc\", \"chaincodeVersion\":\"v0\", \"chaincodeType\": \"$LANGUAGE\", \"args\":[\"a\",\"100\",\"b\",\"200\"] }" # 10 "POST invoke chaincode on peers of Org1" TRX_ID=$(curl -s -X POST \ http://localhost:4000/channels/mychannel/chaincodes/mycc \ -H "authorization: Bearer $ORG1_TOKEN" \ -H "content-type: application/json" \ -d '{ "peers": ["peer0.org1.example.com","peer1.org1.example.com"], "fcn":"move", "args":["a","b","10"] }') echo "Transacton ID is $TRX_ID" echo "GET query chaincode on peer1 of Org1" echo curl -s -X GET \ "http://localhost:4000/channels/mychannel/chaincodes/mycc?peer=peer0.org1.example.com&fcn=query&args=%5B%22a%22%5D" \ -H "authorization: Bearer $ORG1_TOKEN" \ -H "content-type: application/json" echo "GET query Block by blockNumber" echo curl -s -X GET \ "http://localhost:4000/channels/mychannel/blocks/1?peer=peer0.org1.example.com" \ -H "authorization: Bearer $ORG1_TOKEN" \ -H "content-type: application/json" echo "GET query Transaction by TransactionID" echo curl -s -X GET http://localhost:4000/channels/mychannel/transactions/$TRX_ID?peer=peer0.org1.example.com \ -H "authorization: Bearer $ORG1_TOKEN" \ -H "content-type: application/json" ############################################################################ ### TODO: What to pass to fetch the Block information ############################################################################ #echo "GET query Block by Hash" #echo #hash=???? #curl -s -X GET \ # "http://localhost:4000/channels/mychannel/blocks?hash=$hash&peer=peer1" \ # -H "authorization: Bearer $ORG1_TOKEN" \ # -H "cache-control: no-cache" \ # -H "content-type: application/json" \ # -H "x-access-token: $ORG1_TOKEN" #echo #echo echo "GET query ChainInfo" echo curl -s -X GET \ "http://localhost:4000/channels/mychannel?peer=peer0.org1.example.com" \ -H "authorization: Bearer $ORG1_TOKEN" \ -H "content-type: application/json" echo echo echo "GET query Installed chaincodes" echo curl -s -X GET \ "http://localhost:4000/chaincodes?peer=peer0.org1.example.com" \ -H "authorization: Bearer $ORG1_TOKEN" \ -H "content-type: application/json" echo echo echo "GET query Instantiated chaincodes" echo curl -s -X GET \ "http://localhost:4000/channels/mychannel/chaincodes?peer=peer0.org1.example.com" \ -H "authorization: Bearer $ORG1_TOKEN" \ -H "content-type: application/json" echo echo echo "GET query Channels" echo curl -s -X GET \ "http://localhost:4000/channels?peer=peer0.org1.example.com" \ -H "authorization: Bearer $ORG1_TOKEN" \ -H "content-type: application/json" echo echo echo "Total execution time : $(($(date +%s)-starttime)) secs ..."
Balance transfer
A sample Node.js app to demonstrate fabric-client & fabric-ca-client Node.js SDK APIs
Prerequisites and setup:
- Docker - v1.12 or higher
- Docker Compose - v1.8 or higher
- Git client - needed for clone commands
- Node.js v8.4.0 or higher
- Download Docker images
cd fabric-samples/balance-transfer/
Once you have completed the above setup, you will have provisioned a local network with the following docker container configuration:
- 2 CAs
- A SOLO orderer
- 4 peers (2 peers per Org)
Artifacts
- Crypto material has been generated using the cryptogen tool from Hyperledger Fabric and mounted to all peers, the orderering node and CA containers. More details regarding the cryptogen tool are available here.
- An Orderer genesis block (genesis.block) and channel configuration transaction (mychannel.tx) has been pre generated using the configtxgen tool from Hyperledger Fabric and placed within the artifacts folder. More details regarding the configtxgen tool are available here.
Running the sample program
There are two options available for running the balance-transfer sample
对于这些选项中的每一个,您可以选择使用用 golang
或 node.js
编写的链代码运行。
Option 1:
Terminal Window 1
- Launch the network using docker-compose
docker-compose -f artifacts/docker-compose.yaml up
Terminal Window 2
- Install the fabric-client and fabric-ca-client node modules
npm install
- Start the node app on PORT 4000
PORT=4000 node app
Terminal Window 3
- Execute the REST APIs from the section Sample REST APIs Requests
Option 2:
Terminal Window 1
cd fabric-samples/balance-transfer ./runApp.sh
- This lauches the required network on your local machine
- Installs the fabric-client and fabric-ca-client node modules
- And, starts the node app on PORT 4000
Terminal Window 2
In order for the following shell script to properly parse the JSON, you must install jq
:
instructions https://stedolan.github.io/jq/
With the application started in terminal 1, next, test the APIs by executing the script - testAPIs.sh:
cd fabric-samples/balance-transfer ## To use golang chaincode execute the following command ./testAPIs.sh -l golang ## OR use node.js chaincode ./testAPIs.sh -l node
Sample REST APIs Requests
Login Request
- Register and enroll new users in Organization - Org1:
curl -s -X POST http://localhost:4000/users -H "content-type: application/x-www-form-urlencoded" -d 'username=Jim&orgName=Org1'
OUTPUT:
{ "success": true, "secret": "RaxhMgevgJcm", "message": "Jim enrolled Successfully", "token": "<put JSON Web Token here>" }
The response contains the success/failure status, an enrollment Secret and a JSON Web Token (JWT) that is a required string in the Request Headers for subsequent requests.
Create Channel request
curl -s -X POST \ http://localhost:4000/channels \ -H "authorization: Bearer <put JSON Web Token here>" \ -H "content-type: application/json" \ -d '{ "channelName":"mychannel", "channelConfigPath":"../artifacts/channel/mychannel.tx" }'
Please note that the Header authorization must contain the JWT returned from the POST /users
call
Join Channel request
curl -s -X POST \ http://localhost:4000/channels/mychannel/peers \ -H "authorization: Bearer <put JSON Web Token here>" \ -H "content-type: application/json" \ -d '{ "peers": ["peer0.org1.example.com","peer1.org1.example.com"] }'
Install chaincode
curl -s -X POST \ http://localhost:4000/chaincodes \ -H "authorization: Bearer <put JSON Web Token here>" \ -H "content-type: application/json" \ -d '{ "peers": ["peer0.org1.example.com","peer1.org1.example.com"], "chaincodeName":"mycc", "chaincodePath":"github.com/example_cc/go", "chaincodeType": "golang", "chaincodeVersion":"v0" }'
NOTE: chaincodeType must be set to node when node.js chaincode is used and chaincodePath must be set to the location of the node.js chaincode. Also put in the $PWD
ex: curl -s -X POST \ http://localhost:4000/chaincodes \ -H "authorization: Bearer <put JSON Web Token here>" \ -H "content-type: application/json" \ -d '{ "peers": ["peer0.org1.example.com","peer1.org1.example.com"], "chaincodeName":"mycc", "chaincodePath":"$PWD/artifacts/src/github.com/example_cc/node", "chaincodeType": "node", "chaincodeVersion":"v0" }'
Instantiate chaincode
curl -s -X POST \ http://localhost:4000/channels/mychannel/chaincodes \ -H "authorization: Bearer <put JSON Web Token here>" \ -H "content-type: application/json" \ -d '{ "peers": ["peer0.org1.example.com","peer1.org1.example.com"], "chaincodeName":"mycc", "chaincodeVersion":"v0", "chaincodeType": "golang", "args":["a","100","b","200"] }'
NOTE: chaincodeType must be set to node when node.js chaincode is used
Invoke request
curl -s -X POST \ http://localhost:4000/channels/mychannel/chaincodes/mycc \ -H "authorization: Bearer <put JSON Web Token here>" \ -H "content-type: application/json" \ -d '{ "peers": ["peer0.org1.example.com","peer1.org1.example.com"], "fcn":"move", "args":["a","b","10"] }'
NOTE: Ensure that you save the Transaction ID from the response in order to pass this string in the subsequent query transactions.
Chaincode Query
curl -s -X GET \ "http://localhost:4000/channels/mychannel/chaincodes/mycc?peer=peer0.org1.example.com&fcn=query&args=%5B%22a%22%5D" \ -H "authorization: Bearer <put JSON Web Token here>" \ -H "content-type: application/json"
Query Block by BlockNumber
curl -s -X GET \ "http://localhost:4000/channels/mychannel/blocks/1?peer=peer0.org1.example.com" \ -H "authorization: Bearer <put JSON Web Token here>" \ -H "content-type: application/json"
Query Transaction by TransactionID
curl -s -X GET http://localhost:4000/channels/mychannel/transactions/<put transaction id here>?peer=peer0.org1.example.com \ -H "authorization: Bearer <put JSON Web Token here>" \ -H "content-type: application/json"
NOTE: The transaction id can be from any previous invoke transaction, see results of the invoke request, will look something like 8a95b1794cb17e7772164c3f1292f8410fcfdc1943955a35c9764a21fcd1d1b3
.
Query ChainInfo
curl -s -X GET \ "http://localhost:4000/channels/mychannel?peer=peer0.org1.example.com" \ -H "authorization: Bearer <put JSON Web Token here>" \ -H "content-type: application/json"
Query Installed chaincodes
curl -s -X GET \ "http://localhost:4000/chaincodes?peer=peer0.org1.example.com&type=installed" \ -H "authorization: Bearer <put JSON Web Token here>" \ -H "content-type: application/json"
Query Instantiated chaincodes
curl -s -X GET \ "http://localhost:4000/chaincodes?peer=peer0.org1.example.com&type=instantiated" \ -H "authorization: Bearer <put JSON Web Token here>" \ -H "content-type: application/json"
Query Channels
curl -s -X GET \ "http://localhost:4000/channels?peer=peer0.org1.example.com" \ -H "authorization: Bearer <put JSON Web Token here>" \ -H "content-type: application/json"
Clean the network
The network will still be running at this point. Before starting the network manually again, here are the commands which cleans the containers and artifacts.
docker rm -f $(docker ps -aq) docker rmi -f $(docker images | grep dev | awk '{print $3}') rm -rf fabric-client-kv-org[1-2]
Network configuration considerations
You have the ability to change configuration parameters by either directly editing the network-config.yaml file or provide an additional file for an alternative target network. The app uses an optional environment variable "TARGET_NETWORK" to control the configuration files to use. For example, if you deployed the target network on Amazon Web Services EC2, you can add a file "network-config-aws.yaml", and set the "TARGET_NETWORK" environment to 'aws'. The app will pick up the settings inside the "network-config-aws.yaml" file.
IP Address** and PORT information
If you choose to customize your docker-compose yaml file by hardcoding IP Addresses and PORT information for your peers and orderer, then you MUST also add the identical values into the network-config.yaml file. The url and eventUrl settings will need to be adjusted to match your docker-compose yaml file.
peer1.org1.example.com: url: grpcs://x.x.x.x:7056 eventUrl: grpcs://x.x.x.x:7058
Discover IP Address
To retrieve the IP Address for one of your network entities, issue the following command:
# this will return the IP Address for peer0 docker inspect peer0 | grep IPAddress
这篇关于【系列】nodeSDK的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-05-15鸿蒙生态设备数量超8亿台
- 2024-05-13TiDB + ES:转转业财系统亿级数据存储优化实践
- 2024-05-09“2024鸿蒙零基础快速实战-仿抖音App开发(ArkTS版)”实战课程已上线
- 2024-05-09聊聊如何通过arthas-tunnel-server来远程管理所有需要arthas监控的应用
- 2024-05-09log4j2这么配就对了
- 2024-05-09nginx修改Content-Type
- 2024-05-09Redis多数据源,看这篇就够了
- 2024-05-09Google Chrome驱动程序 124.0.6367.62(正式版本)去哪下载?
- 2024-05-09有没有大佬知道这种数据应该怎么抓取呀?
- 2024-05-09这种运行结果里的10.100000001,怎么能最快改成10.1?