一、準備工作
我所用的liunx系統是centos7
在開始之前我們要做相應的準備,golang docker docker-compose git 的安裝
golang安裝參考:https://blog.csdn.net/qq_36956154/article/details/82225429
docker安裝參考:https://blog.csdn.net/qq_36956154/article/details/81095465
docker-compost參考:https://blog.csdn.net/qq_36956154/article/details/82223950
git安裝可直接安裝使用指令:yum install -y git即可
在這些都安裝完以後進行下一步
下一篇:運作frist_network項目實踐
二、下載下傳Fabric源碼
在go的工作路徑下建立src/github.com/hyperledger檔案夾
mkdir -p src/github.com/hyperledger
cd /opt/golang/src/github.com/hyperledger
git clone https://github.com/hyperledger/fabric.git
//在這裡下載下傳的是最新版本的,網上大多數資料是fabric-1.0.0版本的資料
//網上的做法是下載下傳最新的版本以後運作 git checkout -b v1.0.0 指令切換到1.0.0分支下
//但是我這麼做以後在後面運作e2e_cli項目的時候出現錯誤,應該是版本不相容的錯誤
//fabric 和 鏡像的版本 和 cryptogen的版本要一緻才能運作起來
//是以我的解決辦法是直接下載下傳1.0.0版本的fabric項目
git clone https://gerrit.hyperledger.org/r/fabric -b v1.0.0
//這樣可以確定項目的版本是1.0.0版本的
下載下傳完以後在hyperledger下會有一個fabric檔案夾(這個fabric已經是1.0.0版本的了)
[[email protected] hyperledger]# ll
total 4
drwxr-xr-x. 27 root root 4096 Sep 1 07:46 fabric
2.1下載下傳fabric鏡像
在fabric中的e2e_cli項目有一個download-dockerimages.sh,運作以後會幫我把所需要的鏡像都下載下傳好
[[email protected] hyperledger]# cd fabric/examples/e2e_cli/
[[email protected] e2e_cli]# ll
total 84
drwxr-xr-x. 2 root root 60 Sep 1 08:04 base
drwxr-xr-x. 2 root root 111 Sep 1 08:05 channel-artifacts
-rw-r--r--. 1 root root 5013 Sep 1 07:46 configtx.yaml
drwxr-xr-x. 4 root root 59 Sep 1 08:05 crypto-config
-rw-r--r--. 1 root root 3858 Sep 1 07:46 crypto-config.yaml
-rw-r--r--. 1 root root 2677 Sep 1 07:46 docker-compose-cli.yaml
-rw-r--r--. 1 root root 2005 Sep 1 07:46 docker-compose-couch.yaml
-rw-r--r--. 1 root root 2517 Sep 1 07:46 docker-compose-e2e-template.yaml
-rw-r--r--. 1 root root 2725 Sep 1 08:05 docker-compose-e2e.yaml
-rw-r--r--. 1 root root 2119 Sep 1 07:46 download-dockerimages.sh
-rw-r--r--. 1 root root 41711 Sep 1 07:46 end-to-end.rst
drwxr-xr-x. 3 root root 23 Sep 1 07:46 examples
-rwxr-xr-x. 1 root root 3588 Sep 1 07:46 generateArtifacts.sh
-rwxr-xr-x. 1 root root 2617 Sep 1 07:46 network_setup.sh
drwxr-xr-x. 2 root root 23 Sep 1 07:46 scripts
[[email protected] e2e_cli]# bash download-dockerimages.sh -c x86_64-1.0.0 -f x86_64-1.0.0
//運作此指令以後會下載下傳所需鏡像,在設定阿裡雲國内鏡像加速以後下載下傳會很快,但也會根據網絡情況而定
下載下傳以後運作docker images,會看到以下鏡像
[[email protected] e2e_cli]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hyperledger/fabric-tools latest 0403fd1c72c7 13 months ago 1.32GB
hyperledger/fabric-tools x86_64-1.0.0 0403fd1c72c7 13 months ago 1.32GB
hyperledger/fabric-couchdb latest 2fbdbf3ab945 13 months ago 1.48GB
hyperledger/fabric-couchdb x86_64-1.0.0 2fbdbf3ab945 13 months ago 1.48GB
hyperledger/fabric-kafka latest dbd3f94de4b5 13 months ago 1.3GB
hyperledger/fabric-kafka x86_64-1.0.0 dbd3f94de4b5 13 months ago 1.3GB
hyperledger/fabric-zookeeper latest e545dbf1c6af 13 months ago 1.31GB
hyperledger/fabric-zookeeper x86_64-1.0.0 e545dbf1c6af 13 months ago 1.31GB
hyperledger/fabric-orderer latest e317ca5638ba 13 months ago 179MB
hyperledger/fabric-orderer x86_64-1.0.0 e317ca5638ba 13 months ago 179MB
hyperledger/fabric-peer latest 6830dcd7b9b5 13 months ago 182MB
hyperledger/fabric-peer x86_64-1.0.0 6830dcd7b9b5 13 months ago 182MB
hyperledger/fabric-javaenv latest 8948126f0935 13 months ago 1.42GB
hyperledger/fabric-javaenv x86_64-1.0.0 8948126f0935 13 months ago 1.42GB
hyperledger/fabric-ccenv latest 7182c260a5ca 13 months ago 1.29GB
hyperledger/fabric-ccenv x86_64-1.0.0 7182c260a5ca 13 months ago 1.29GB
hyperledger/fabric-ca latest a15c59ecda5b 13 months ago 238MB
hyperledger/fabric-ca x86_64-1.0.0 a15c59ecda5b 13 months ago 238MB
三、遇到的錯誤:
1.這個時候運作 bash network_setup.sh up指令

如果紅箭頭所指的不是1.0.0那你就有可能版本不對,可以先檢視以下項目的版本是不是1.0.0的版本
2.運作到一半的時候還會遇到以下錯誤
Error: Error endorsing chaincode: rpc error: code = Unknown desc = Error starting container: API error (404): {"message":"network e2ecli_default not found"}
解決辦法:
[[email protected] e2e_cli]# cd base/
[[email protected] base]# ll
total 12
-rw-r--r--. 1 root root 4566 Sep 1 07:46 docker-compose-base.yaml
-rw-r--r--. 1 root root 991 Sep 1 08:04 peer-base.yaml
[[email protected] base]# vi peer-base.yaml
//e2e_cli目錄是固定的,啟動後會建立一個docker network以此為名字,這裡是e2e_cli。如果修改該目錄,要修改/opt/gopath/src/github.com/hyperledger/fabric/examples/e2e_cli/base目錄下的peer-base.yaml
将網絡名改成如下名稱即可
- CORE_VM_DOCKER_HOSTCONFIG_NETWORKMODE=e2e_cli_default

3.還有一種錯誤就是會報沒有這個檔案的錯誤No such file 這個是你沒有生成密鑰檔案
解決辦法:cryptogen這個工具跟你項目版本有可能不對是以還是去保證你 frbric項目和 鏡像 和 cryptogen這三個版本一緻才能生成正确的密鑰檔案。
四、編譯
把這些修改以後再運作bash network_setup.sh up 會自動進行以下操作:
編譯生成Fabric公私鑰、證書的程式,程式在目錄:fabric/release/linux-amd64/bin
基于configtx.yaml生成創世區塊和通道相關資訊,并儲存在channel-artifacts檔案夾。
基于crypto-config.yaml生成公私鑰和證書資訊,并儲存在crypto-config檔案夾中。
基于docker-compose-cli.yaml啟動1Orderer+4Peer+1CLI的Fabric容器。
在CLI啟動的時候,會運作scripts/script.sh檔案,這個腳本檔案包含了建立Channel,加入Channel,安裝Example02,運作Example02等功能。
當出現以下界面時代表你運作成功,建構的fabric網絡正常,可以繼續學習了
2018-09-01 12:06:22.810 UTC [msp] GetLocalMSP -> DEBU 001 Returning existing local MSP
2018-09-01 12:06:22.810 UTC [msp] GetDefaultSigningIdentity -> DEBU 002 Obtaining default signing identity
2018-09-01 12:06:22.810 UTC [chaincodeCmd] checkChaincodeCmdParams -> INFO 003 Using default escc
2018-09-01 12:06:22.810 UTC [chaincodeCmd] checkChaincodeCmdParams -> INFO 004 Using default vscc
2018-09-01 12:06:22.811 UTC [msp/identity] Sign -> DEBU 005 Sign: plaintext: 0A95070A6708031A0C08BE81AADC0510...6D7963631A0A0A0571756572790A0161
2018-09-01 12:06:22.811 UTC [msp/identity] Sign -> DEBU 006 Sign: digest: C3FE35C92F1F40D85B35A3165A3ED9D6485EA439D888A257D4ED7125942B936C
Query Result: 90
2018-09-01 12:06:30.439 UTC [main] main -> INFO 007 Exiting.....
===================== Query on PEER3 on channel 'mychannel' is successful =====================
===================== All GOOD, End-2-End execution completed =====================
_____ _ _ ____ _____ ____ _____
| ____| | \ | | | _ \ | ____| |___ \ | ____|
| _| | \| | | | | | _____ | _| __) | | _|
| |___ | |\ | | |_| | |_____| | |___ / __/ | |___
|_____| |_| \_| |____/ |_____| |_____| |_____|
五、手動測試e2e_cli項目
我們可以直接在上面fabric網絡啟動起來,并跑完測試例子的基礎上進行手動測試:
我實在虛拟機中把e2e_cli項目跑起來以後用xshell連接配接虛拟機(相當于再開一個指令行界面)
運作docker ps 檢視啟動的容器
[[email protected] e2e_cli]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2b36d108e91f dev-peer1.org2.example.com-mycc-1.0 "chaincode -peer.add…" 13 minutes ago Up 13 minutes dev-peer1.org2.example.com-mycc-1.0
d06f9004a5a5 dev-peer0.org1.example.com-mycc-1.0 "chaincode -peer.add…" 13 minutes ago Up 13 minutes dev-peer0.org1.example.com-mycc-1.0
1670d2a72e19 dev-peer0.org2.example.com-mycc-1.0 "chaincode -peer.add…" 13 minutes ago Up 13 minutes dev-peer0.org2.example.com-mycc-1.0
4506e3c2130d hyperledger/fabric-tools "/bin/bash -c './scr…" 14 minutes ago Up 14 minutes cli
a5bd5036153a hyperledger/fabric-peer "peer node start" 14 minutes ago Up 14 minutes 0.0.0.0:8051->7051/tcp, 0.0.0.0:8052->7052/tcp, 0.0.0.0:8053->7053/tcp peer1.org1.example.com
8380e3c27dd6 hyperledger/fabric-peer "peer node start" 14 minutes ago Up 14 minutes 0.0.0.0:9051->7051/tcp, 0.0.0.0:9052->7052/tcp, 0.0.0.0:9053->7053/tcp peer0.org2.example.com
6fb04bac1569 hyperledger/fabric-peer "peer node start" 14 minutes ago Up 14 minutes 0.0.0.0:7051-7053->7051-7053/tcp peer0.org1.example.com
746e275a1e6f hyperledger/fabric-peer "peer node start" 14 minutes ago Up 14 minutes 0.0.0.0:10051->7051/tcp, 0.0.0.0:10052->7052/tcp, 0.0.0.0:10053->7053/tcp peer1.org2.example.com
5c271be54a47 hyperledger/fabric-orderer "orderer" 14 minutes ago Up 14 minutes 0.0.0.0:7050->7050/tcp orderer.example.com
上面三個dev開頭的容器是三個鍊碼容器,一個fabric-tools充當用戶端cli, 4個fabric-peer, 一個fabric-order提供節點共識服務。
接下裡我們執行:docker exec -it cli bash 進入cli容器,進行操作測試:
在example02上面已經對a進行了初始化,是以我們不用再初始化了,直接進行查詢:
peer chaincode query -C mychannel -n mycc -c '{"Args":["query","a"]}'
[email protected]:/opt/gopath/src/github.com/hyperledger/fabric/peer# peer chaincode query -C mychannel -n mycc -c '{"Args":["query","a"]}'
2018-09-01 12:59:58.605 UTC [msp] GetLocalMSP -> DEBU 001 Returning existing local MSP
2018-09-01 12:59:58.605 UTC [msp] GetDefaultSigningIdentity -> DEBU 002 Obtaining default signing identity
2018-09-01 12:59:58.605 UTC [chaincodeCmd] checkChaincodeCmdParams -> INFO 003 Using default escc
2018-09-01 12:59:58.605 UTC [chaincodeCmd] checkChaincodeCmdParams -> INFO 004 Using default vscc
2018-09-01 12:59:58.605 UTC [msp/identity] Sign -> DEBU 005 Sign: plaintext: 0A95070A6708031A0C08CE9AAADC0510...6D7963631A0A0A0571756572790A0161
2018-09-01 12:59:58.605 UTC [msp/identity] Sign -> DEBU 006 Sign: digest: 0E152D959839872E72E69C36F0EDD7C821874F7540A6770D78468EC01B4E6B28
Query Result: 90
2018-09-01 12:59:58.614 UTC [main] main -> INFO 007 Exiting.....
查詢的結果是:Query Result: 90 說明a現在有90元
下面我們做一個交易,a向b轉賬20元。
[email protected]:/opt/gopath/src/github.com/hyperledger/fabric/peer# peer chaincode invoke -o orderer.example.com:7050 --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C mychannel -n mycc -c '{"Args":["invoke","a","b","20"]}'
2018-09-01 13:02:04.777 UTC [msp] GetLocalMSP -> DEBU 001 Returning existing local MSP
2018-09-01 13:02:04.778 UTC [msp] GetDefaultSigningIdentity -> DEBU 002 Obtaining default signing identity
2018-09-01 13:02:04.783 UTC [chaincodeCmd] checkChaincodeCmdParams -> INFO 003 Using default escc
2018-09-01 13:02:04.783 UTC [chaincodeCmd] checkChaincodeCmdParams -> INFO 004 Using default vscc
2018-09-01 13:02:04.784 UTC [msp/identity] Sign -> DEBU 005 Sign: plaintext: 0A95070A6708031A0C08CC9BAADC0510...696E766F6B650A01610A01620A023230
2018-09-01 13:02:04.784 UTC [msp/identity] Sign -> DEBU 006 Sign: digest: 220E8B34AD256599F6FEE61F6CF12062116EB72F08565D0F024F94FAD36E4BAF
2018-09-01 13:02:04.799 UTC [msp/identity] Sign -> DEBU 007 Sign: plaintext: 0A95070A6708031A0C08CC9BAADC0510...EBC518E367DA8D647824B03CCC78737C
2018-09-01 13:02:04.799 UTC [msp/identity] Sign -> DEBU 008 Sign: digest: D822109D40C483201696DD75B38638B9E48B0D412EAB76CC43FAF0DD7CCE72FD
2018-09-01 13:02:04.802 UTC [chaincodeCmd] chaincodeInvokeOrQuery -> DEBU 009 ESCC invoke result: version:1 response:<status:200 message:"OK" > payload:"\n \016Yg?/\374\326\342{'\300\274\023\252\326\302d\212\013\231\355A\033\240\376\276\2470K\277\204\327\022Y\nE\022\024\n\004lscc\022\014\n\n\n\004mycc\022\002\010\003\022-\n\004mycc\022%\n\007\n\001a\022\002\010\004\n\007\n\001b\022\002\010\004\032\007\n\001a\032\00270\032\010\n\001b\032\003230\032\003\010\310\001\"\013\022\004mycc\032\0031.0" endorsement:<endorser:"\n\007Org1MSP\022\200\006-----BEGIN -----\nMIICGTCCAb+gAwIBAgIQXY5Nh/+T/6zngZ3L+vJCmDAKBggqhkjOPQQDAjBzMQsw\nCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZy\nYW5jaXNjbzEZMBcGA1UEChMQb3JnMS5leGFtcGxlLmNvbTEcMBoGA1UEAxMTY2Eu\nb3JnMS5leGFtcGxlLmNvbTAeFw0xODA5MDExMjQyNDdaFw0yODA4MjkxMjQyNDda\nMFsxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1T\nYW4gRnJhbmNpc2NvMR8wHQYDVQQDExZwZWVyMC5vcmcxLmV4YW1wbGUuY29tMFkw\nEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE/wxgP8uPz1M2GL+MOtRjj5guGVZfKx8w\ntkJIG4syQ5cwGITf/9QuKm3NCtcPOHhKPdZPUDgrNbqk4P7QEzwY/KNNMEswDgYD\nVR0PAQH/BAQDAgeAMAwGA1UdEwEB/wQCMAAwKwYDVR0jBCQwIoAg973lj17wp0Qz\nOi2uCQqSkvQj7WNPM5cqPDcJ3ADnhfUwCgYIKoZIzj0EAwIDSAAwRQIhAPpn54dr\nDwQxW6O06ko4VVQzAYnRFt9oMluKpU9cAZ8LAiBqZDh6Qm0GMXITfS5IDUAOmDgp\neUfJ8cLbJvFwyCmveg==\n-----END -----\n" signature:"0E\002!\000\346\3746\272\262\345l\0054\3212`\336\212\002\271[(Ns\035\353\315\025\031\270\235!\246\273\024}\002 >\371\351\262\\\266\352Yjy\223\022\247\251(\341\353\305\030\343g\332\215dx$\260<\314xs|" >
2018-09-01 13:02:04.802 UTC [chaincodeCmd] chaincodeInvokeOrQuery -> INFO 00a Chaincode invoke successful. result: status:200
2018-09-01 13:02:04.803 UTC [main] main -> INFO 00b Exiting.....
然後再查詢a賬戶的餘額
peer chaincode query -C mychannel -n mycc -c '{"Args":["query","a"]}'
[email protected]:/opt/gopath/src/github.com/hyperledger/fabric/peer# peer chaincode query -C mychannel -n mycc -c '{"Args":["query","a"]}'
2018-09-01 13:03:29.804 UTC [msp] GetLocalMSP -> DEBU 001 Returning existing local MSP
2018-09-01 13:03:29.804 UTC [msp] GetDefaultSigningIdentity -> DEBU 002 Obtaining default signing identity
2018-09-01 13:03:29.804 UTC [chaincodeCmd] checkChaincodeCmdParams -> INFO 003 Using default escc
2018-09-01 13:03:29.804 UTC [chaincodeCmd] checkChaincodeCmdParams -> INFO 004 Using default vscc
2018-09-01 13:03:29.805 UTC [msp/identity] Sign -> DEBU 005 Sign: plaintext: 0A95070A6708031A0C08A19CAADC0510...6D7963631A0A0A0571756572790A0161
2018-09-01 13:03:29.805 UTC [msp/identity] Sign -> DEBU 006 Sign: digest: AB2C610D2D0D2525E24FCBEAE91ECEC317AA4B6A226D9C56F370705FC1F89BB4
Query Result: 70
2018-09-01 13:03:29.814 UTC [main] main -> INFO 007 Exiting.....
可以看到a的餘額現在是70 a已經像b賬戶轉了20元,通過exit來退出該容器。
至此,例子和環境都成功了。最後執行bash network_setup.sh down, 進行網絡的關閉和清理。
我寫這個的時候剛剛學習fabric,寫的也許很亂,等我再深入的了解以後也許會再梳理一遍,感謝網上大神的資料。