文章目录
composer 搭建过程
- 基本概念与第一个区块链应用 安装文档:https://www.ibm.com/developerworks/cn/cloud/library/cl-lo-hyperledger-fabric-study-notes1/index.html
- 参考网址:https://blog.youkuaiyun.com/qq_27818541/article/details/78727076#一-开启fabric区块链网络
搭建过程中修改的地方
修改一(执行 startFabric.sh 脚本时)
1.fabfir-tools/startFabric.sh 脚本执行时会调用 fabfir-tools/_loader.sh
2.fabfir-tools/_loader.sh 脚本中 会有一段代码 export FABRIC_VERSION="hlfv12",把 hlfv12 修改成 hlfv11
3.hlfv11 对应 fabfir-tools/fabric-scripts/hlfv11 这个文件夹
修改的原因:hlfv12 版本与当前系统的 fabric 版本不相符,执行不了 hlfv12 文件夹中的脚本
修改二(执行 createPeerAdminCard.sh 脚本时)
1.调用 fabfir-tools/createPeerAdminCard.sh 最后执行的是 fabfir-tools/fabric-scripts/hlfv11/createPeerAdminCard.sh 脚本(前提是 执行了修改一)
2."peers": {
"peer0.org1.example.com": {
"url": "grpc://${HOST}:7051",
在这个节点下 加入 "eventUrl": "grpcs://${HOST}:7053", 这个配置,不然执行脚本的时候会报错
修改三(执行 createPeerAdminCard.sh 脚本时)
1.脚本中有一段逻辑是这样的:
"${HL_COMPOSER_CLI}" card import --file ${CARDOUTPUT}
意思是把 生成的card文件 导入到 composer 中,执行的时候会报错,错误信息如下:
Error: Failed to create client from connection profile. Error: PEM encoded certificate is required.
这个没有搜到到具体的答案,我尝试修改的是在该脚本
"peers": {
"peer0.org1.example.com": {
"url": "grpc://${HOST}:7051",
这个节点下,加入内容:
"tlsCACerts": {
"pem": "-----BEGIN CERTIFICATE-----MIICGjCCAcCgAwIBAgIRANuOnVN+yd/BGyoX7ioEklQwCgYIKoZIzj0EAwIwczELMAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBGcmFuY2lzY28xGTAXBgNVBAoTEG9yZzEuZXhhbXBsZS5jb20xHDAaBgNVBAMTE2NhLm9yZzEuZXhhbXBsZS5jb20wHhcNMTcwNjI2MTI0OTI2WhcNMjcwNjI0MTI0OTI2WjBbMQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZyYW5jaXNjbzEfMB0GA1UEAwwWQWRtaW5Ab3JnMS5leGFtcGxlLmNvbTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABGu8KxBQ1GkxSTMVoLv7NXiYKWj5t6DhWRTJBHnLkWV7lRUfYaKAKFadSii5M7Z7ZpwD8NS7IsMdPR6Z4EyGgwKjTTBLMA4GA1UdDwEB/wQEAwIHgDAMBgNVHRMBAf8EAjAAMCsGA1UdIwQkMCKAIBmrZau7BIB9rRLkwKmqpmSecIaOOr0CF6Mi2J5H4aauMAoGCCqGSM49BAMCA0gAMEUCIQC4sKQ6CEgqbTYe48az95W9/hnZ+7DI5eSnWUwV9vCd/gIgS5K6omNJydoFoEpaEIwM97uSXVMHPa0iyC497vdNURA=-----END CERTIFICATE-----"
}
pem 对应的值是 fabfir-tools/fabric-scripts/hlfv11/composer/crypto-config/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp/signcerts/Admin@org1.example.com-cert.pem 该文件的内容,加入该内容后,执行正常
修改四(执行 yo hyperledger-composer:businessnetwork 命令时)
错误信息:
[root@peer0 fabfir-tools]# yo hyperledger-composer:businessnetwork
Welcome to the business network generator
? Business network name: tutorial-network
? Description: kk
? Author name: kk
? Author email: kk@qq.com
? License: Apache-2.0
? Namespace: org.example.biznet
events.js:183
throw er; // Unhandled 'error' event
^
Error: EACCES: permission denied, mkdir '/opt/test/fabfir-tools/tutorial-network'
at Object.fs.mkdirSync (fs.js:885:18)
at Function.sync (/usr/local/lib/node_modules/generator-hyperledger-composer/node_modules/mkdirp/index.js:71:13)
at child.Base.destinationRoot (/usr/local/lib/node_modules/generator-hyperledger-composer/node_modules/yeoman-generator/lib/base.js:701:14)
解决办法:chmod 777 fabfir-tools
启动命名
composer
启动
第一次启动(照着上面的搭建流程):
nohup composer-rest-server -c admin@tutorial-network -n never -p 82 >/dev/null 2>&1 &
停止后重新启动:
部署业务网络
composer network install --card PeerAdmin@hlfv1 --archiveFile tutorial-network@0.0.1.bna
启动业务网络
composer network start --networkName tutorial-network --networkVersion 0.0.1 --networkAdmin admin --networkAdminEnrollSecret adminpw --card PeerAdmin@hlfv1 --file networkadmin.card
启动服务
nohup composer-rest-server -c admin@tutorial-network -n never -p 82 >/dev/null 2>&1 &
停止
cd fabfir-tools
./stopFabric.sh
playgroud
启动
nohup composer-playground -p 81 >/dev/null 2>&1 &
停止
[root@peer0 fabfir-tools]# netstat -tunpl | grep 82
tcp6 0 0 :::82 :::* LISTEN 14878/node
[root@peer0 fabfir-tools]# kill 14878
explorer
启动
cd /opt/test/blockchain-explorer
./start.sh
启动端口的设置在 /opt/test/blockchain-explorer/config.json "prot":83
停止
[root@peer0 fabfir-tools]# netstat -tunpl | grep 83
tcp6 0 0 :::82 :::* LISTEN 14878/node
[root@peer0 fabfir-tools]# kill 14878
fabric 操作
查看 部署成功的网络
在服务已经起起来的前提下:
docker exec -it peer0.org1.example.com /bin/bash
ls /var/hyperledger/production/chaincodes/
查看部署的channel
在服务已经起起来的前提下:
docker exec -it peer0.org1.example.com /bin/bash
peer channel list
问题汇总
在playgroud中升级业务网络时
Error: Error trying to upgrade business network. Error: No valid responses from any peers. Response from attempted peer comms was an error: Error: 8 RESOURCE_EXHAUSTED: received trailing metadata size exceeds limit
硬盘内存不足
在启动 explorer 时
Handshake failed with fatal error SSL_ERROR_SSL: error:1408F10B:SSL routines version number
把 config.json 中的 grpcs 改成 grpc
通过composer写入区块信息,再通过explorer获取写入的信息时
正常返回值:
{"status":200,"rows":[{"id":40,"blocknum":9,"datahash":"3f1b67d9050a3e86cc5367d4eccbee92bf7b4e9f3c98d8ac8e4debcedbc767d0","prehash":"c4c3384877cffae8fa92fd798bca268c08be42e0c7ec3eb51e6cc3e1bba57aa8","channelname":"composerchannel","txcount":1,"createdt":"2018-12-12T02:12:21.000Z","prev_blockhash":null,"blockhash":null,"txhash":["cd656e737c1a76382f888f750318141eb466b1b4b79d1ce3365b3fd9bc82949d"]}]}
返回的txhash数组里只有一个值
遇到的错误返回值:
{"status":200,"rows":[{"id":40,"blocknum":9,"datahash":"3f1b67d9050a3e86cc5367d4eccbee92bf7b4e9f3c98d8ac8e4debcedbc767d0","prehash":"c4c3384877cffae8fa92fd798bca268c08be42e0c7ec3eb51e6cc3e1bba57aa8","channelname":"composerchannel","txcount":1,"createdt":"2018-12-12T02:12:21.000Z","prev_blockhash":null,"blockhash":null,"txhash":["cd656e737c1a76382f888f750318141eb466b1b4b79d1ce3365b3fd9bc82949d","79d304b942e629151433dca8d32b6871882f55e398669eb9d0f89630bb970c85"]}]}
返回的txhash数组里有多个值
原因:
以前添加了一个mychannel通道,现在又新加入了一个composerchannel通道,在查询 postgre 数据库的 transaction 表(里面存放的txhash值)时,没有加入(channelname)条件判断,导致把以前mychannel中的数据也插叙出来了
解决过程:
1.查询explorer区块信息时,访问的接口是/api/blockAndTxList/channelName/blocknum
2.进入到blockchain-explorer项目,查看 main.js(这里写的接口逻辑) 文件,查找上面接口的处理逻辑
3.查询到处理逻辑是调用 blockchain-explorer/app/models/block.js 的 getBlockAndTxList方法
4.该方法中 到 postgre 数据库中执行 查询的sql语句
原语句:
select blocks.*,(
SELECT array_agg(txhash) as txhash FROM transaction where blockid = blocks.blocknum
group by transaction.blockid ) from blocks where
blocks.channelname ='${channelName}' and blocknum >= ${blockNum}
order by blocks.blocknum desc`;
改变后的语句:
select blocks.*,(
SELECT array_agg(txhash) as txhash FROM transaction where blockid = blocks.blocknum
and channelname='${channelName}' group by transaction.blockid ) from blocks where
blocks.channelname ='${channelName}' and blocknum >= ${blockNum}
order by blocks.blocknum desc`;
改变的位置:在查询 transaction 表时加上channelName的条件判断
总结:
遇到无法理解和不好百度搜索的问题时,根据程序逻辑一步步走,然后大胆猜测