1. 程式人生 > >Hyperledger Fabric 1.0 安裝和使用

Hyperledger Fabric 1.0 安裝和使用

Hyperledger Fabric 1.0 版本整體 重新設計了架構,預計將於今年 3 月份釋出。目前已經進入了 alpha 階段,可以進行功能性驗證。

本文將介紹如何快速啟動一個 Fabric 1.0 的網路,並部署和呼叫 chaincode 進行測試。

安裝 Docker

Docker 支援 Linux 常見的發行版,如 Redhat/Centos/Ubuntu 等,推薦使用 1.12 或者更新的版本。

$ curl -fsSL https://get.docker.com/ | sh

以 Ubuntu 14.04 為例,安裝成功後,修改 Docker 服務配置(/etc/default/docker 檔案)。

DOCKER_OPTS="$DOCKER_OPTS
-H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock --api-cors-header='*'"

重啟 Docker 服務。

$ sudo service docker restart

Ubuntu 16.04 中預設採用了 systemd 管理啟動服務,Docker 配置檔案在/etc/systemd/system/docker.service.d/override.conf

修改後,需要通過如下命令重啟 Docker 服務。

$ sudo systemctl daemon-reload
$ sudo systemctl restart docker.service

安裝 docker-compose

首先,安裝 python-pip 軟體包。

$ sudo aptitude install python-pip

安裝 docker-compose(推薦為 1.8.0 及以上版本)。

$ sudo pip install docker-compose>=1.8.0

獲取 Docker 映象

Docker 映象可以自行從原始碼編譯,或從社群 DockerHub 倉庫下載。這裡也提供了調整(精簡指令,基於 golang:1.7 基礎映象製作)後的映象,與社群版本略有差異,但功能是一致的。

通過如下命令拉去相關映象,並更新映象別名。

$ docker pull yeasy/hyperledger-fabric-base:latest \
&& docker pull yeasy/hyperledger-fabric-peer:latest \
&& docker pull yeasy/hyperledger-fabric-orderer:latest \
&& docker pull yeasy/hyperledger-fabric-ca:latest \
&& docker pull yeasy/blockchain-explorer:latest \
&& docker tag yeasy/hyperledger-fabric-peer hyperledger/fabric-peer \
&& docker tag yeasy/hyperledger-fabric-orderer hyperledger/fabric-orderer \
&& docker tag yeasy/hyperledger-fabric-ca hyperledger/fabric-ca \
&& docker tag yeasy/hyperledger-fabric-base hyperledger/fabric-baseimage \
&& docker tag yeasy/hyperledger-fabric-base hyperledger/fabric-ccenv:x86_64-1.0.0-snapshot-preview

啟動 fabric 1.0 網路

下載 Compose 模板檔案。

$ git clone https://github.com/yeasy/docker-compose-files

進入 hyperledger/1.0 目錄,檢視包括若干模板檔案,功能如下。

  • peers.yml: 包含 peer 節點的服務模板。
  • docker-compose.yml: 啟動 1 個 最小化的環境,包括 1 個 peer 節點、1 個 Orderer 節點、1 個 CA 節點。

通過如下命令快速啟動。

$ docker-compose up

注意輸出日誌中無錯誤資訊。

此時,系統中包括三個容器。

$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
fc55d2334c38 hyperledger/fabric-peer "peer node start" 15 minutes ago Up 15 minutes 7050/tcp, 7052-7059/tcp, 0.0.0.0:7051->7051/tcp fabric-peer0
9c0afbba97ad hyperledger/fabric-orderer "orderer" 15 minutes ago Up 15 minutes 0.0.0.0:7050->7050/tcp fabric-orderer
ef96fa77bf45 hyperledger/fabric-ca "fabric-ca server sta" 15 minutes ago Up 15 minutes 7054/tcp, 0.0.0.0:8888->8888/tcp fabric-ca

測試 chaincode 操作

啟動 fabric 網路後,可以進行 chaincode 操作,驗證網路啟動正常。

部署 chaincode

通過如下命令進入容器 peer0。

$ docker exec -it fabric-peer0 bash

在容器中執行部署命令,注意輸出日誌無錯誤提示,最終返回結果應該為 response:<status:200 message:"OK" payload:"100" >

[email protected]:/go/src/github.com/hyperledger/fabric# peer chaincode deploy -n test_cc -p github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02 -c '{"Args":["init","a","100","b","200"]}'
...
[chaincodeCmd] chaincodeInvokeOrQuery -> INFO 018 Invoke result: version:1 response:<status:200 message:"OK" payload:"100" > payload:"\n \361\031\221\246\213\277\220C\016\370\265\034Vw\350\326\241\020\254\311\306\276gz\335n\"\\`;W\035\0224\n(\002\004lccc\001\007test_cc\004\001\001\001\001\000\000\007test_cc\001\001a\004\001\001\001\001\000\000\032\010\010\310\001\032\003100" endorsement:<endorser:"\n\007DEFAULT\022\232\007-----BEGIN -----\nMIICjDCCAjKgAwIBAgIUBEVwsSx0TmqdbzNwleNBBzoIT0wwCgYIKoZIzj0EAwIw\nfzELMAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNh\nbiBGcmFuY2lzY28xHzAdBgNVBAoTFkludGVybmV0IFdpZGdldHMsIEluYy4xDDAK\nBgNVBAsTA1dXVzEUMBIGA1UEAxMLZXhhbXBsZS5jb20wHhcNMTYxMTExMTcwNzAw\nWhcNMTcxMTExMTcwNzAwWjBjMQswCQYDVQQGEwJVUzEXMBUGA1UECBMOTm9ydGgg\nQ2Fyb2xpbmExEDAOBgNVBAcTB1JhbGVpZ2gxGzAZBgNVBAoTEkh5cGVybGVkZ2Vy\nIEZhYnJpYzEMMAoGA1UECxMDQ09QMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE\nHBuKsAO43hs4JGpFfiGMkB/xsILTsOvmN2WmwpsPHZNL6w8HWe3xCPQtdG/XJJvZ\n+C756KEsUBM3yw5PTfku8qOBpzCBpDAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYw\nFAYIKwYBBQUHAwEGCCsGAQUFBwMCMAwGA1UdEwEB/wQCMAAwHQYDVR0OBBYEFOFC\ndcUZ4es3ltiCgAVDoyLfVpPIMB8GA1UdIwQYMBaAFBdnQj2qnoI/xMUdn1vDmdG1\nnEgQMCUGA1UdEQQeMByCCm15aG9zdC5jb22CDnd3dy5teWhvc3QuY29tMAoGCCqG\nSM49BAMCA0gAMEUCIDf9Hbl4xn3z4EwNKmilM9lX2Fq4jWpAaRVB97OmVEeyAiEA\n25aDPQHGGq2AvhKT0wvt08cX1GTGCIbfmuLpMwKQj38=\n-----END -----\n" signature:"0E\002!\000\275O9UM\334}\356\304D\260\267\315\230\210O\030\342\200\027B\346\347(U\272\224],\275\235:\002 -_-H$\315\332\363*c\325\373\253\320\201j\216\374\363<\037\r5\3257\356\312\354\003\314\266\013" >
[main] main -> INFO 019 Exiting.....

此時,系統中生成類似 dev-peer0-test_cc-0-305216ca522e84d0bf8c2b542b16bd3901dcb1879a970ae7c1eee3a74fbdee583eb8b74ad88edefc3d9647d47663f6b14574734c93a36b3968b077f3870d79cf 的 chaincode Docker 映象,但並沒有啟動新的容器。

查詢 chaincode

對部署成功的 chaincode 執行查詢操作,查詢 a 的餘額。

同樣的,在 peer0 容器中執行如下命令,注意輸出無錯誤資訊,最後的結果為 <status:200 message:"OK" payload:"100" >

[email protected]:/go/src/github.com/hyperledger/fabric# peer chaincode invoke -n test_cc -c '{"Args":["query","a"]}'
[chaincodeCmd] chaincodeInvokeOrQuery -> INFO 018 Invoke result: version:1 response:<status:200 message:"OK" payload:"100" > payload:"\n \235\034J[\217!\334\240\354\376\265\374X\211)a\336q\302\024\274N\004M\271b\006\255#2Q\253\0224\n(\002\004lccc\001\007test_cc\004\001\001\001\001\000\000\007test_cc\001\001a\004\001\001\001\001\000\000\032\010\010\310\001\032\003100" endorsement:<endorser:"\n\007DEFAULT\022\232\007-----BEGIN -----\nMIICjDCCAjKgAwIBAgIUBEVwsSx0TmqdbzNwleNBBzoIT0wwCgYIKoZIzj0EAwIw\nfzELMAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNh\nbiBGcmFuY2lzY28xHzAdBgNVBAoTFkludGVybmV0IFdpZGdldHMsIEluYy4xDDAK\nBgNVBAsTA1dXVzEUMBIGA1UEAxMLZXhhbXBsZS5jb20wHhcNMTYxMTExMTcwNzAw\nWhcNMTcxMTExMTcwNzAwWjBjMQswCQYDVQQGEwJVUzEXMBUGA1UECBMOTm9ydGgg\nQ2Fyb2xpbmExEDAOBgNVBAcTB1JhbGVpZ2gxGzAZBgNVBAoTEkh5cGVybGVkZ2Vy\nIEZhYnJpYzEMMAoGA1UECxMDQ09QMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE\nHBuKsAO43hs4JGpFfiGMkB/xsILTsOvmN2WmwpsPHZNL6w8HWe3xCPQtdG/XJJvZ\n+C756KEsUBM3yw5PTfku8qOBpzCBpDAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYw\nFAYIKwYBBQUHAwEGCCsGAQUFBwMCMAwGA1UdEwEB/wQCMAAwHQYDVR0OBBYEFOFC\ndcUZ4es3ltiCgAVDoyLfVpPIMB8GA1UdIwQYMBaAFBdnQj2qnoI/xMUdn1vDmdG1\nnEgQMCUGA1UdEQQeMByCCm15aG9zdC5jb22CDnd3dy5teWhvc3QuY29tMAoGCCqG\nSM49BAMCA0gAMEUCIDf9Hbl4xn3z4EwNKmilM9lX2Fq4jWpAaRVB97OmVEeyAiEA\n25aDPQHGGq2AvhKT0wvt08cX1GTGCIbfmuLpMwKQj38=\n-----END -----\n" signature:"0D\002 l`\362\365\342\356a\3562\211N\255\253F\200\365]\321\257\013^\303o\266\301}\266M\362\336\256\346\002 D\037.\347\261G\257\274J.\265\206}=\261(\036(\021\370\306_*\3122g\005q\346h>{" >
[main] main -> INFO 019 Exiting.....

類似的,查詢 b 的餘額,注意最終返回結果為 response:<status:200 message:"OK" payload:"200" >

[chaincodeCmd] chaincodeInvokeOrQuery -> INFO 018 Invoke result: version:1 response:<status:200 message:"OK" payload:"200" > payload:"\n U\207\330\255\023\344M\014\321\231\013\036\267\353\251DW4d\372j_/\236m<\201\333\221?\243\325\0224\n(\002\004lccc\001\007test_cc\004\001\001\001\001\000\000\007test_cc\001\001b\004\001\001\001\001\000\000\032\010\010\310\001\032\003200" endorsement:<endorser:"\n\007DEFAULT\022\232\007-----BEGIN -----\nMIICjDCCAjKgAwIBAgIUBEVwsSx0TmqdbzNwleNBBzoIT0wwCgYIKoZIzj0EAwIw\nfzELMAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNh\nbiBGcmFuY2lzY28xHzAdBgNVBAoTFkludGVybmV0IFdpZGdldHMsIEluYy4xDDAK\nBgNVBAsTA1dXVzEUMBIGA1UEAxMLZXhhbXBsZS5jb20wHhcNMTYxMTExMTcwNzAw\nWhcNMTcxMTExMTcwNzAwWjBjMQswCQYDVQQGEwJVUzEXMBUGA1UECBMOTm9ydGgg\nQ2Fyb2xpbmExEDAOBgNVBAcTB1JhbGVpZ2gxGzAZBgNVBAoTEkh5cGVybGVkZ2Vy\nIEZhYnJpYzEMMAoGA1UECxMDQ09QMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE\nHBuKsAO43hs4JGpFfiGMkB/xsILTsOvmN2WmwpsPHZNL6w8HWe3xCPQtdG/XJJvZ\n+C756KEsUBM3yw5PTfku8qOBpzCBpDAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYw\nFAYIKwYBBQUHAwEGCCsGAQUFBwMCMAwGA1UdEwEB/wQCMAAwHQYDVR0OBBYEFOFC\ndcUZ4es3ltiCgAVDoyLfVpPIMB8GA1UdIwQYMBaAFBdnQj2qnoI/xMUdn1vDmdG1\nnEgQMCUGA1UdEQQeMByCCm15aG9zdC5jb22CDnd3dy5teWhvc3QuY29tMAoGCCqG\nSM49BAMCA0gAMEUCIDf9Hbl4xn3z4EwNKmilM9lX2Fq4jWpAaRVB97OmVEeyAiEA\n25aDPQHGGq2AvhKT0wvt08cX1GTGCIbfmuLpMwKQj38=\n-----END -----\n" signature:"0E\002!\000\271-\211\017\277!)g\005\005\252h\355\253U\216p\242\351\[email protected]\372\361\241\360\274\351\362\374a\243\010\002 \021\266R\027\373\254\351?\351u\200RWQY1w|\361\217G\353\221\010\013\002\207\222b\324\330\320" >
[main] main -> INFO 019 Exiting.....

對部署後的 chaincode 執行查詢或呼叫操作後,如果系統中沒有對應的 chaincode 容器,則會利用之前生成的映象自動啟動新的容器。

$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c95c6b078116 dev-peer0-test_cc-0-305216ca522e84d0bf8c2b542b16bd3901dcb1879a970ae7c1eee3a74fbdee583eb8b74ad88edefc3d9647d47663f6b14574734c93a36b3968b077f3870d79cf "/opt/gopath/bin/test" 13 minutes ago Up 13 minutes dev-peer0-test_cc-0-305216ca522e84d0bf8c2b542b16bd3901dcb1879a970ae7c1eee3a74fbdee583eb8b74ad88edefc3d9647d47663f6b14574734c93a36b3968b077f3870d79cf
fc55d2334c38 hyperledger/fabric-peer "peer node start" 15 minutes ago Up 15 minutes 7050/tcp, 7052-7059/tcp, 0.0.0.0:7051->7051/tcp fabric-peer0
9c0afbba97ad hyperledger/fabric-orderer "orderer" 15 minutes ago Up 15 minutes 0.0.0.0:7050->7050/tcp fabric-orderer
ef96fa77bf45 hyperledger/fabric-ca "fabric-ca server sta" 15 minutes ago Up 15 minutes 7054/tcp, 0.0.0.0:8888->8888/tcp fabric-ca

呼叫 chaincode

對部署成功的 chaincode 執行呼叫操作,如 a 向 b 轉賬 10 元。

在 peer0 容器中執行如下操作,注意最終結果狀態正常 response:<status:200 message:"OK" >

[email protected]:/go/src/github.com/hyperledger/fabric# peer chaincode invoke -n test_cc -c '{"Args":["invoke","a","b","10"]}'
...
[chaincodeCmd] chaincodeInvokeOrQuery -> INFO 018 Invoke result: version:1 response:<status:200 message:"OK" > payload:"\n \356\330\226\263z\315?\[email protected]\327x\307\375V_\277\367vp1)\232!<\230\207\367n*c\271\311\022C\n<\002\004lccc\001\007test_cc\004\001\001\001\001\000\000\007test_cc\002\001a\004\001\001\001\001\001b\004\001\001\001\001\002\001a\000\00290\001b\000\003210\000\032\003\010\310\001" endorsement:<endorser:"\n\007DEFAULT\022\232\007-----BEGIN -----\nMIICjDCCAjKgAwIBAgIUBEVwsSx0TmqdbzNwleNBBzoIT0wwCgYIKoZIzj0EAwIw\nfzELMAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNh\nbiBGcmFuY2lzY28xHzAdBgNVBAoTFkludGVybmV0IFdpZGdldHMsIEluYy4xDDAK\nBgNVBAsTA1dXVzEUMBIGA1UEAxMLZXhhbXBsZS5jb20wHhcNMTYxMTExMTcwNzAw\nWhcNMTcxMTExMTcwNzAwWjBjMQswCQYDVQQGEwJVUzEXMBUGA1UECBMOTm9ydGgg\nQ2Fyb2xpbmExEDAOBgNVBAcTB1JhbGVpZ2gxGzAZBgNVBAoTEkh5cGVybGVkZ2Vy\nIEZhYnJpYzEMMAoGA1UECxMDQ09QMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE\nHBuKsAO43hs4JGpFfiGMkB/xsILTsOvmN2WmwpsPHZNL6w8HWe3xCPQtdG/XJJvZ\n+C756KEsUBM3yw5PTfku8qOBpzCBpDAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYw\nFAYIKwYBBQUHAwEGCCsGAQUFBwMCMAwGA1UdEwEB/wQCMAAwHQYDVR0OBBYEFOFC\ndcUZ4es3ltiCgAVDoyLfVpPIMB8GA1UdIwQYMBaAFBdnQj2qnoI/xMUdn1vDmdG1\nnEgQMCUGA1UdEQQeMByCCm15aG9zdC5jb22CDnd3dy5teWhvc3QuY29tMAoGCCqG\nSM49BAMCA0gAMEUCIDf9Hbl4xn3z4EwNKmilM9lX2Fq4jWpAaRVB97OmVEeyAiEA\n25aDPQHGGq2AvhKT0wvt08cX1GTGCIbfmuLpMwKQj38=\n-----END -----\n" signature:"0E\002!\000\333\240\t\\\275\225{\230\3704D\366p\251\255\211\251\225\367\r1y\211\004\337\311k,\355\276e\273\002 Q\33242u\251s\267\025Q\271\222\367\321i\344\002\331\022\214\243\206\274\206C*\204k2\373\021\001" >
[main] main -> INFO 019 Exiting.....

此時,再次查詢 a 和 b 的餘額,發現發生變化。

[email protected]:/go/src/github.com/hyperledger/fabric# peer chaincode invoke -n test_cc -c '{"Args":["query","a"]}'
[chaincodeCmd] chaincodeInvokeOrQuery -> INFO 018 Invoke result: version:1 response:<status:200 message:"OK" payload:"90" > payload:"\n \306\264k\315\327\262\345\207\[email protected]*8\373\376\345B\222r\177\254\375\304\354c\3478(qT\267n\005\0223\n(\002\004lccc\001\007test_cc\004\001\001\001\001\000\000\007test_cc\001\001a\004\001\005\001\001\000\000\032\007\010\310\001\032\00290" endorsement:<endorser:"\n\007DEFAULT\022\232\007-----BEGIN -----\nMIICjDCCAjKgAwIBAgIUBEVwsSx0TmqdbzNwleNBBzoIT0wwCgYIKoZIzj0EAwIw\nfzELMAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNh\nbiBGcmFuY2lzY28xHzAdBgNVBAoTFkludGVybmV0IFdpZGdldHMsIEluYy4xDDAK\nBgNVBAsTA1dXVzEUMBIGA1UEAxMLZXhhbXBsZS5jb20wHhcNMTYxMTExMTcwNzAw\nWhcNMTcxMTExMTcwNzAwWjBjMQswCQYDVQQGEwJVUzEXMBUGA1UECBMOTm9ydGgg\nQ2Fyb2xpbmExEDAOBgNVBAcTB1JhbGVpZ2gxGzAZBgNVBAoTEkh5cGVybGVkZ2Vy\nIEZhYnJpYzEMMAoGA1UECxMDQ09QMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE\nHBuKsAO43hs4JGpFfiGMkB/xsILTsOvmN2WmwpsPHZNL6w8HWe3xCPQtdG/XJJvZ\n+C756KEsUBM3yw5PTfku8qOBpzCBpDAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYw\nFAYIKwYBBQUHAwEGCCsGAQUFBwMCMAwGA1UdEwEB/wQCMAAwHQYDVR0OBBYEFOFC\ndcUZ4es3ltiCgAVDoyLfVpPIMB8GA1UdIwQYMBaAFBdnQj2qnoI/xMUdn1vDmdG1\nnEgQMCUGA1UdEQQeMByCCm15aG9zdC5jb22CDnd3dy5teWhvc3QuY29tMAoGCCqG\nSM49BAMCA0gAMEUCIDf9Hbl4xn3z4EwNKmilM9lX2Fq4jWpAaRVB97OmVEeyAiEA\n25aDPQHGGq2AvhKT0wvt08cX1GTGCIbfmuLpMwKQj38=\n-----END -----\n" signature:"0E\002!\000\273\014\323\264\003\252\275\341\n\304\021\237\331\267\253\325\250jS\262$~\251z\227\304\022\0179X\024\267\002 v\364h\265\301w\366\274\272\2723/F{u\037v1\372\031\331I\255]\000f\324\237\235t\341\212" >
[main] main -> INFO 019 Exiting.....

a 的新餘額為 90。

[email protected]:/go/src/github.com/hyperledger/fabric# peer chaincode invoke -n test_cc -c '{"Args":["query","b"]}'
[chaincodeCmd] chaincodeInvokeOrQuery -> INFO 018 Invoke result: version:1 response:<status:200 message:"OK" payload:"210" > payload:"\n \004=\242\355\266\262\202V\332fA\256\227\001a\007\363G\226\277\032B6kN\317\010\332\331\251\212\227\0224\n(\002\004lccc\001\007test_cc\004\001\001\001\001\000\000\007test_cc\001\001b\004\001\005\001\001\000\000\032\010\010\310\001\032\003210" endorsement:<endorser:"\n\007DEFAULT\022\232\007-----BEGIN -----\nMIICjDCCAjKgAwIBAgIUBEVwsSx0TmqdbzNwleNBBzoIT0wwCgYIKoZIzj0EAwIw\nfzELMAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNh\nbiBGcmFuY2lzY28xHzAdBgNVBAoTFkludGVybmV0IFdpZGdldHMsIEluYy4xDDAK\nBgNVBAsTA1dXVzEUMBIGA1UEAxMLZXhhbXBsZS5jb20wHhcNMTYxMTExMTcwNzAw\nWhcNMTcxMTExMTcwNzAwWjBjMQswCQYDVQQGEwJVUzEXMBUGA1UECBMOTm9ydGgg\nQ2Fyb2xpbmExEDAOBgNVBAcTB1JhbGVpZ2gxGzAZBgNVBAoTEkh5cGVybGVkZ2Vy\nIEZhYnJpYzEMMAoGA1UECxMDQ09QMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE\nHBuKsAO43hs4JGpFfiGMkB/xsILTsOvmN2WmwpsPHZNL6w8HWe3xCPQtdG/XJJvZ\n+C756KEsUBM3yw5PTfku8qOBpzCBpDAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYw\nFAYIKwYBBQUHAwEGCCsGAQUFBwMCMAwGA1UdEwEB/wQCMAAwHQYDVR0OBBYEFOFC\ndcUZ4es3ltiCgAVDoyLfVpPIMB8GA1UdIwQYMBaAFBdnQj2qnoI/xMUdn1vDmdG1\nnEgQMCUGA1UdEQQeMByCCm15aG9zdC5jb22CDnd3dy5teWhvc3QuY29tMAoGCCqG\nSM49BAMCA0gAMEUCIDf9Hbl4xn3z4EwNKmilM9lX2Fq4jWpAaRVB97OmVEeyAiEA\n25aDPQHGGq2AvhKT0wvt08cX1GTGCIbfmuLpMwKQj38=\n-----END -----\n" signature:"0D\002 6H\037>\321Er\232&\205\245\274;\201\225\333\371|8\035\235\3354u\003\371\310\245\347\261nk\002 gF\362\304!0E\236\320\0148\203\236\330WdU\004C\007\010bC\234\026\351\264\335ZoC\316" >
[main] main -> INFO 019 Exiting.....

b 的新餘額為 210。

更多 Hyperledger Fabric 相關的應用和技術話題,可以參考 社群文件 和 《區塊鏈技術指南》


相關推薦

Hyperledger Fabric 1.0 安裝使用

Hyperledger Fabric 1.0 版本整體 重新設計了架構,預計將於今年 3 月份釋出。目前已經進入了 alpha 階段,可以進行功能性驗證。本文將介紹如何快速啟動一個 Fabric 1.0 的網路,並部署和呼叫 chaincode 進行測試。安裝 DockerD

Hyperledger Fabric 1.0 公有云安裝6--叢集部署之坑

使用了三臺VPC,都是Ubuntu 16.04 LTS版名稱   ip節點hostnameorgnazations1172.21.0.5ordererorderer.example.comorderers2s3172.21.0.13172.21.0.15sp0,clisp1p

HyperLedger Fabric 1.0的Transaction處理流程

toa 足夠 余額 無法 -1 ber pla client ack 如果把區塊鏈比作一個只能讀寫,不能刪改的分布式數據庫的話,那麽事務和查詢就是對這個數據庫進行的最重要的操作。以比特幣來說,我們通過錢包或者Blockchain.info進行區塊鏈的查詢操作,而轉賬行為就是

Hyperledger Fabric 1.0 從零開始(二)——公網環境構建

1.3 項目 htm move 自己 lvm2 fast 情況 tor 1:環境構建 在本文中用到的宿主機環境是Centos ,版本為Centos.x86_647.2,通過Docker 容器來運行Fabric的節點,版本為v1.0。因此,啟動Fabric網絡中的節點需要先安

Hyperledger Fabric 1.0 從零開始(六)——創建Fabric多節點集群

_id 測試 es2017 xtra 去掉 compose 多個 服務 執行命令 4:創建Fabric多節點集群 4.1、配置說明 首先可以根據官方Fabric自帶的e2e_cli列子中的集群方案來生成我們自己的集群,與案例不同的是我們需要把容器都分配到不同的服務器上,彼此

Hyperledger Fabric 1.0 快速搭建 -------- 多機部署 核心共識節點Orderer

前言 在這裡我推薦兩位大神的部落格,可以參考或者直接跟著這兩位大神學習,我是閱讀這兩位大神的部落格和《深度探索區塊鏈Hyperledger技術與應用》一書部署的 《深度探索區塊鏈Hyperledger技術與應用》作者:張增駿、董寧、朱軒彤、陳劍雄  著。 上一篇

hyperledger fabric 1.0 原始碼分析之peer chaincode upgrade

描述 peer chaincode upgrade命令用於對chaincode升級。 定義 func upgradeCmd(cf *ChaincodeCmdFactory) *cobra.Command { chaincodeUpgradeCmd = &cob

【鏈塊技術55期】超級賬本Fabric教程(三):Hyperledger Fabric 1.0架構及原理

原文連結:超級賬本Fabric教程(三):Hyperledger Fabric 1.0架構及原理   如果說以比特幣為代表的貨幣區塊鏈技術為 1.0,以以太坊為代表的合同區塊鏈技術為 2.0,那麼實現了完備的許可權控制和安全保障的 Hyperledger 專案毫無疑問代表著區塊鏈技

Hyperledger Fabric 1.0網路搭建

自己組建一個Fabric網路, 網路結構如下: 排序節點 1 個 組織個數 2 個, 分別為go和cpp, 每個組織分別有兩個peer節點, 使用者個數為3 機構名稱 組織識別符號 組織ID Go學科 org_go OrgGoMSP CP

Hyperledger Fabric 1.0 Peer操作命令

1.建立通道 $ peer channel create [flags], 常用引數為: `-o, --orderer: orderer節點的地址 `-c, --channelID: 要建立的通道的ID, 必須小寫, 在250個字元以內 `-f, --fi

Hyperledger fabric 1.3安裝記錄

一、環境 主機:阿里雲輕量應用伺服器 系統:Ubuntu 16.04(基於4.4核心) 二、先決條件 2.1 go 用此時最新的1.11.2版本 下載: wget https://dl.google.com/go/go1.11.2.linux-amd64.ta

Hyperledger Fabric 1.0 從零開始(五)——執行測試e2e

3:執行測試e2e 3.1、執行fabric-samples的問題說明 該問題說明能夠解決6.1、平臺特定使用的二進位制檔案配置第一步的問題。可以選擇繼續閱讀該說明,或者等參考到6.1小節時再反向閱讀本說明,具體在6.1中會重新指向本步驟。 一般情況下,我們會參照官網來完成第一個網路測試,在該線上文件中會讓我

Hyperledger Fabric 1.0 從零開始(八)——Fabric多節點叢集生產部署

6.1、平臺特定使用的二進位制檔案配置 該方案與Hyperledger Fabric 1.0 從零開始(五)——執行測試e2e類似,根據企業需要,可以控制各節點的域名,及聯盟鏈的統一域名。可以指定單獨節點的訪問,生成指定的公私鑰、證書等檔案。具體的引數配置可以參考generateArtifacts.sh檔案,

區塊鏈基礎知識系列 第四課Hyperledger fabric 1.0網路組成及構建流程

一、fabric網路結構(暫時不包括CA) 如上圖所示,在fabric網路中,O表示Orderer,P代表Peer,EP代表Endorsing Peer(endorser),CC代表Cha

Hyperledger Fabric 1.0 實戰開發系列 第二課 Fabric環境搭建

一.安裝GO語言 下載最新版的go 開啟Terminal,輸入命令(以下命令都是以root管理員的角色進行的) su 輸入密碼:***** wget https://storage.googleapi

Hyperledger Fabric 1.0 例項簡析 第一課 network_setup.sh分析

以fabric-samples/balance-transfer例子:1. 具體流程fabric/examples/e2e_cli目錄下存有檔案network_setup.sh用於一鍵部署環境並測試chaincode示例程式碼。其中包括兩個部分,一個是利用generateAr

node.js學習1.0-安裝配置

 1、開啟NodeJS的官網,下載和自己系統相配的NodeJS的安裝程式,包括32位還是64位一定要選擇好,否則會出現安裝問題。          我選擇的是Window版本64位的安裝程式,也有MAC平臺的安裝程式。     下載完成,如圖:     2、接下來就是安裝了,

hyperledger fabric 1.0環境搭建出錯記錄

cp: cannot stat 'build/docker/gotools/bin/protoc-gen-go': No such file or directory(找不到protoc-gen-go檔案) 編譯生成 protoc-gen-go #編譯生成 protoc-g

超級記賬本:快速搭建一個Hyperledger Fabric 1.0的環境 (親測有效)

下面開始我們的環境搭建工作: 1. 使用VirtualBox並在其中安裝好Ubuntu 這一步其實沒啥好說的,下載好最新版的VirtualBox,下載Ubuntu Server,我用的是Ubuntu16.04.2 X64 Server。在安裝完Ubuntu後,需要保證apt source是國內的,不然如

超級記賬本學習筆記:Hyperledger Fabric 1.0環境搭建,及執行e2e的問題

Cannot run peer because cannot init crypto, missing /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/users/[ema