在完成Windows 10安裝部署Hyper ledger記錄的基礎(chǔ)上垒拢,我們測(cè)試一下fabric-samples
下chaincode
容器中的示例合約兜喻。
參考:Fabric chaincode測(cè)試 —— 開(kāi)發(fā)者模式和單元測(cè)試
注意:GOPATH一定要放在環(huán)境變量中楔敌。
Step 1: Hyperledger Fabric是如何工作的唆缴?
參考:How does Hyperledger Fabric work?
Hyperledger Fabric是一個(gè)permissioned區(qū)塊鏈網(wǎng)絡(luò)忍坷,由打算建立聯(lián)合體的組織(organizations
)立掌猛。參與建立Hyperledger Fabric網(wǎng)絡(luò)的組織稱為“成員(members)
”。
區(qū)塊鏈網(wǎng)絡(luò)中的每個(gè)成員組織(organization)都有責(zé)任建立其參加網(wǎng)絡(luò)的節(jié)點(diǎn)(peers
)融虽。所有peers都要配置(configured)有適當(dāng)?shù)募用懿牧舷硗辏缯J(rèn)證授權(quán)(Certificate Authority)和其他信息。
member organization中的peers從organization內(nèi)部的客戶端接收事務(wù)調(diào)用請(qǐng)求(transaction invocation requests)有额。一個(gè)client
可以是服務(wù)于特定組織/業(yè)務(wù)活動(dòng)的任何特定應(yīng)用程序(application)/門戶服務(wù)(portal serving)般又。客戶端應(yīng)用程序使用Hyperledger Fabric SDK或REST Web服務(wù)與Hyperledger Fabric網(wǎng)絡(luò)進(jìn)行交互巍佑。在peers中安裝的Chaincode(類似于以太坊智能合約)會(huì)導(dǎo)致發(fā)起交易調(diào)用請(qǐng)求茴迁。
所有peers在訂閱的每個(gè)channel
上維護(hù)一個(gè)ledger
。因此萤衰,分布式分類帳技術(shù)(Distributed Ledger Technology, DLT)堕义。但與Ethereum在超賬本結(jié)構(gòu)中的作用不同,Hyperledger Fabric網(wǎng)絡(luò)節(jié)點(diǎn)具有不同的作用脆栋。
所以并不是所有的節(jié)點(diǎn)都是相同的倦卖。在網(wǎng)絡(luò)中有不同類型的對(duì)等節(jié)點(diǎn)peers洒擦,它們扮演不同的角色:
Endorser peer
peers可以標(biāo)記為背書節(jié)點(diǎn)Endorser peer(即背書的對(duì)等點(diǎn))。一旦從客戶端應(yīng)用程序接收到“事務(wù)調(diào)用請(qǐng)求”時(shí)怕膛,Endorser peer
- 驗(yàn)證交易(Validates the transaction)熟嫩。i.e., 檢查證書細(xì)節(jié)和請(qǐng)求者的角色。
- 執(zhí)行Chaincode(即Smart Contract)并模擬事務(wù)的結(jié)果褐捻。但它不會(huì)更新ledger掸茅。
在上述兩個(gè)任務(wù)結(jié)束時(shí),Endorser peer可以批準(zhǔn)或不批準(zhǔn)事務(wù)柠逞。
由于只有Endorser peer執(zhí)行鏈碼Chaincode (Smart Contract)昧狮,所以沒(méi)有必要在網(wǎng)絡(luò)的每個(gè)節(jié)點(diǎn)上都安裝鏈碼Chaincode,增加了網(wǎng)絡(luò)的可擴(kuò)展性边苹。
Anchor peer
在通道配置(Channel configuration)時(shí)配置錨節(jié)點(diǎn)(Anchor peer)或錨節(jié)點(diǎn)集群(cluster)陵且。需要提醒的是,在Hyperledger Fabric中个束,您可以在peers之間配置秘密通道 (secret channels)慕购,并且該通道的peers之間的事務(wù)(transactions) 僅對(duì)它們可見(jiàn)。
Anchor peer接收更新并將更新廣播給組織中的其他peers茬底。Anchor peer是可發(fā)現(xiàn)的沪悲。因此,任何標(biāo)記為Anchor peer的peer都可以被訂貨Orderer peer或任何其他peer發(fā)現(xiàn)阱表。
Orderer peer
Orderer peer被認(rèn)為是Hyperledger Fabric網(wǎng)絡(luò)的中心通信通道殿如。Orderer peer/node負(fù)責(zé)整個(gè)網(wǎng)絡(luò)的一致賬本狀態(tài)。Orderer peer創(chuàng)建block并將其傳遞給所有peers最爬。
Orderer構(gòu)建在面向消息的體系結(jié)構(gòu)之上涉馁。目前有兩個(gè)選項(xiàng)可用來(lái)實(shí)現(xiàn)Orderer peer:
- Solo: 適合開(kāi)發(fā)。單點(diǎn)故障爱致。Solo不應(yīng)該用于生成就緒(Production-ready)網(wǎng)絡(luò)烤送。
- Kafka: Production-ready Hyperledger Fabric network使用Kafka作為Orderer實(shí)現(xiàn)。Kafka是具有高吞吐量容錯(cuò)功能的消息傳遞軟件糠悯。
Hyperledger Fabric Workflow
- 成員組織(member Organization)中的參與者通過(guò)客戶端應(yīng)用程序(client application)調(diào)用事務(wù)請(qǐng)求(transaction request)帮坚。
- 客戶端應(yīng)用程序?qū)⑹聞?wù)調(diào)用請(qǐng)求廣播給背書節(jié)點(diǎn)(Endorser peer)。
- 背書人peer檢查證書詳細(xì)信息和其他信息來(lái)驗(yàn)證事務(wù)互艾。然后试和,它執(zhí)行Chaincode(即智能合約)并將背書響應(yīng)(Endorsement responses)返回給客戶。Endorser peer發(fā)送交易批準(zhǔn)或拒絕作為背書響應(yīng)的一部分纫普。
- 客戶端現(xiàn)在將已批準(zhǔn)的事務(wù)發(fā)送給Orderer peer阅悍,以便對(duì)其進(jìn)行適當(dāng)?shù)呐判虿⑵浯虬谝粋€(gè)block中。
- Orderer peer將事務(wù)打包到一個(gè)塊中,并將該塊轉(zhuǎn)發(fā)到Hyperledger Fabric網(wǎng)絡(luò)中不同成員組織的錨節(jié)點(diǎn)(Anchor nodes)溉箕。
- 錨節(jié)點(diǎn)(Anchor nodes)然后將塊廣播給它們自己組織內(nèi)的其他節(jié)點(diǎn)晦墙。這些個(gè)人的peer然后用最新的塊更新它們的本地賬本(locak ledger)。這樣肴茄,所有的網(wǎng)絡(luò)都同步了賬本。
Step 2: 開(kāi)發(fā)者模式(chaincode-docker-devmode)
來(lái)自網(wǎng)絡(luò):使用開(kāi)發(fā)者調(diào)試環(huán)境但指,需要先下載
fabric-samples
寡痰,置于$GOPATH/src
下。
我本來(lái)已經(jīng)下載過(guò)了fabric-samples
棋凳,沒(méi)有放在$GOPATH/src
中拦坠,也測(cè)試成功了,可能是因?yàn)槲以O(shè)置了GOPATH
環(huán)境變量剩岳。
進(jìn)入faric-samples/chaincode-docker-devmode
文件夾:
首先分析目錄中的docker-compose-simple.yaml
文件贞滨,該網(wǎng)絡(luò)包含1個(gè)orderer
節(jié)點(diǎn),1個(gè)peer
節(jié)點(diǎn)拍棕,1個(gè)chaincode
容器(負(fù)責(zé)運(yùn)行需要測(cè)試的鏈碼)1個(gè)cli
容器(負(fù)責(zé)發(fā)送請(qǐng)求來(lái)測(cè)試鏈碼)晓铆。
version: '2'
services:
orderer:
container_name: orderer
image: hyperledger/fabric-orderer
environment:
- FABRIC_LOGGING_SPEC=debug
- ORDERER_GENERAL_LISTENADDRESS=orderer
- ORDERER_GENERAL_GENESISMETHOD=file
- ORDERER_GENERAL_GENESISFILE=orderer.block
- ORDERER_GENERAL_LOCALMSPID=DEFAULT
- ORDERER_GENERAL_LOCALMSPDIR=/etc/hyperledger/msp
- GRPC_TRACE=all=true,
- GRPC_VERBOSITY=debug
working_dir: /opt/gopath/src/github.com/hyperledger/fabric
command: orderer
volumes:
- ./msp:/etc/hyperledger/msp
- ./orderer.block:/etc/hyperledger/fabric/orderer.block
ports:
- 7050:7050
peer:
container_name: peer
image: hyperledger/fabric-peer
environment:
- CORE_PEER_ID=peer
- CORE_PEER_ADDRESS=peer:7051
- CORE_PEER_GOSSIP_EXTERNALENDPOINT=peer:7051
- CORE_PEER_LOCALMSPID=DEFAULT
- CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock
- FABRIC_LOGGING_SPEC=DEBUG
- CORE_PEER_MSPCONFIGPATH=/etc/hyperledger/msp
volumes:
- /var/run/:/host/var/run/
- ./msp:/etc/hyperledger/msp
working_dir: /opt/gopath/src/github.com/hyperledger/fabric/peer
command: peer node start --peer-chaincodedev=true
ports:
- 7051:7051
- 7053:7053
depends_on:
- orderer
cli:
container_name: cli
image: hyperledger/fabric-tools
tty: true
environment:
- GOPATH=/opt/gopath
- CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock
- FABRIC_LOGGING_SPEC=DEBUG
- CORE_PEER_ID=cli
- CORE_PEER_ADDRESS=peer:7051
- CORE_PEER_LOCALMSPID=DEFAULT
- CORE_PEER_MSPCONFIGPATH=/etc/hyperledger/msp
working_dir: /opt/gopath/src/chaincodedev
command: /bin/bash -c './script.sh'
volumes:
- /var/run/:/host/var/run/
- ./msp:/etc/hyperledger/msp
- ./../chaincode:/opt/gopath/src/chaincodedev/chaincode
- ./:/opt/gopath/src/chaincodedev/
depends_on:
- orderer
- peer
chaincode:
container_name: chaincode
image: hyperledger/fabric-ccenv
tty: true
environment:
- GOPATH=/opt/gopath
- CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock
- FABRIC_LOGGING_SPEC=DEBUG
- CORE_PEER_ID=example02
- CORE_PEER_ADDRESS=peer:7051
- CORE_PEER_LOCALMSPID=DEFAULT
- CORE_PEER_MSPCONFIGPATH=/etc/hyperledger/msp
working_dir: /opt/gopath/src/chaincode
command: /bin/sh -c 'sleep 6000000'
volumes:
- /var/run/:/host/var/run/
- ./msp:/etc/hyperledger/msp
- ./../chaincode:/opt/gopath/src/chaincode
depends_on:
- orderer
- peer
有兩點(diǎn)需要注意的:
- 在cli容器的
command
項(xiàng)中可以看見(jiàn),啟動(dòng)后會(huì)自動(dòng)執(zhí)行當(dāng)前目錄下的script.sh
腳本绰播,該腳本會(huì)自動(dòng)創(chuàng)建名為myc
的通道骄噪,并且將節(jié)點(diǎn)加入。所以我們只需要安裝和實(shí)例化鏈碼即可蠢箩。 - 在
chaincode
容器的volumes
中可以看見(jiàn)這樣一條映射:
- ./../chaincode:/opt/gopath/src/chaincode
說(shuō)明fabric-samples/chaincode
目錄會(huì)映射到容器內(nèi)部链蕊,這也是我們待測(cè)試鏈碼需要放置的地方。為了方便管理谬泌,我們可以在該目錄下為每個(gè)鏈碼再分配一個(gè)目錄滔韵,然后把要測(cè)試的鏈碼放在其中。(當(dāng)然也可以直接修改映射指向自己chaincode的實(shí)際路徑)掌实。
Step 3: 測(cè)試鏈碼
同時(shí)開(kāi)啟多個(gè)Terminal陪蜻,不要關(guān)閉。
Terminal 1: 在chaincode-docker-devmode
啟動(dòng)網(wǎng)絡(luò)
首先進(jìn)入開(kāi)發(fā)者模式目錄 fabric-samples/chaincode-docker-devmode
潮峦,右鍵打開(kāi)Git Bash
囱皿,輸入命令:
$ docker-compose -f docker-compose-simple.yaml up
網(wǎng)絡(luò)啟動(dòng)成功:
$ docker-compose -f docker-compose-simple.yaml up
Starting orderer ... done
Starting peer ... done
Starting chaincode ... done
Starting cli ... done
Attaching to orderer, peer, chaincode, cli
...
peer | 2019-12-07 06:54:01.935 UTC [msp.identity] Sign -> DEBU 36a15 Sign: digest: 966AAA95422A8FDFB08615DD469029F787E301527CA756DA31C89E14E54EB167
peer | 2019-12-07 06:54:01.936 UTC [msp] GetDefaultSigningIdentity -> DEBU 36a16 Obtaining default signing identity
peer | 2019-12-07 06:54:01.936 UTC [msp.identity] Sign
此時(shí)網(wǎng)絡(luò)中存在四個(gè)容器(1 orderer,1 peer忱嘹, 1 chaincode嘱腥, 1 cli),創(chuàng)建了通道m(xù)yc并將peer成功加入拘悦。
關(guān)閉網(wǎng)絡(luò)齿兔,在Git Bash
中按Ctrl+C
:
abf0f6322f7e4c6b27c3bc597cac47379afa9a77ccb84a227a349f47 : Entering
Stopping cli ... done
Stopping chaincode ... done
Stopping peer ... done
Stopping orderer ... done
Gracefully stopping... (press Ctrl+C again to force)
Terminal 2: 在chaincode中編譯鏈碼
1. 進(jìn)入chaincode
容器
進(jìn)入chaincode
容器(進(jìn)入fabric-samples/chaincode
文件夾),輸入命令docker exec -it chaincode bash
(必須用管理員身份運(yùn)行),我用管理員身份運(yùn)行的Windows自帶的cmd終端分苇,右鍵即可開(kāi)啟(不行的可以自行搜索右鍵打開(kāi)方式):
D:\Fabric\fabric-samples\chaincode>docker exec -it chaincode bash
可以看到運(yùn)行成功:
D:\Fabric\fabric-samples\chaincode>docker exec -it chaincode bash
root@1fc1686b8ffd:/opt/gopath/src/chaincode# cd sacc
root@1fc1686b8ffd:/opt/gopath/src/chaincode/sacc# go build
root@1fc1686b8ffd:/opt/gopath/src/chaincode/sacc# CORE_PEER_ADDRESS=peer:7052 CORE_CHAINCODE_ID_NAME=mycc:0 ./sacc
2019-12-06 16:48:57.644 UTC [shim] setupChaincodeLogging -> INFO 001 Chaincode log level not provided; defaulting to: INFO
2019-12-06 16:48:57.644 UTC [shim] setupChaincodeLogging -> INFO 002 Chaincode (build level: ) starting up ...
2019-12-06 16:48:57.644 UTC [bccsp] initBCCSP -> DEBU 001 Initialize BCCSP [SW]
2019-12-06 16:48:57.645 UTC [grpc] DialContext -> DEBU 002 parsed scheme: ""
2019-12-06 16:48:57.648 UTC [grpc] DialContext -> DEBU 003 scheme "" not registered, fallback to default scheme
2019-12-06 16:48:57.648 UTC [grpc] watcher -> DEBU 004 ccResolverWrapper: sending new addresses to cc: [{peer:7052 0 <nil>}]
2019-12-06 16:48:57.648 UTC [grpc] switchBalancer -> DEBU 005 ClientConn switching balancer to "pick_first"
2019-12-06 16:48:57.648 UTC [grpc] HandleSubConnStateChange -> DEBU 006 pickfirstBalancer: HandleSubConnStateChange: 0xc0002585f0, CONNECTING
2019-12-06 16:48:57.651 UTC [grpc] HandleSubConnStateChange -> DEBU 007 pickfirstBalancer: HandleSubConnStateChange: 0xc0002585f0, READY
補(bǔ)充:常見(jiàn)錯(cuò)誤
右鍵使用Git Bash
添诉,不以管理員身份運(yùn)行可能會(huì)報(bào)錯(cuò):
$ docker exec -it chaincode bash
the input device is not a TTY. If you are using mintty, try prefixing the command with 'winpty'
在網(wǎng)上看到一個(gè)解決辦法,仍然報(bào)錯(cuò):
$ winpty docker run -it chaincode /bin/bash
Unable to find image 'chaincode:latest' locally
C:/Program Files/Docker/Docker/Resources/bin/docker.exe: Error response from daemon: pull access den
ied for chaincode, repository does not exist or may require 'docker login': denied: requested access
to the resource is denied.
See 'C:/Program Files/Docker/Docker/Resources/bin/docker.exe run --help'.
- 嘗試使用管理員身份打開(kāi)
Git Bash
医寿,同樣報(bào)錯(cuò):
$ cd D:/Fabric/fabric-samples/chaincode
$ docker exec -it chaincode bash
the input device is not a TTY. If you are using mintty, try prefixing the command with 'winpty'
$ winpty docker run -it chaincode /bin/bash
Unable to find image 'chaincode:latest' locally
- 嘗試普通用戶方式打開(kāi)
cmd
栏赴,運(yùn)行成功:
D:\Fabric\fabric-samples\chaincode>docker exec -it chaincode bash
root@1fc1686b8ffd:/opt/gopath/src/chaincode#
- 嘗試普通用戶方式打開(kāi)
powershell
,運(yùn)行成功:
D:\Fabric\fabric-samples\chaincode>docker exec -it chaincode bash
root@1fc1686b8ffd:/opt/gopath/src/chaincode#
綜上靖秩,Git Bash
無(wú)法運(yùn)行這個(gè)命令须眷,cnd中可以不用管理員身份也可以。
但是在使用hyperledger fabric的過(guò)程中沟突,有些東西又必須用Git Bash
花颗,所以需要自己在使用時(shí)測(cè)試。
2. 編譯某個(gè)鏈碼(i.e sacc)
在fabric-samples/chaincode
文件夾中有7個(gè)示例鏈碼:
$ ls
abac/ chaincode_example02/ fabcar/ hyperledger/ marbles02/ marbles02_private/ sacc/
緊接著docker exec -it chaincode bash
命令惠拭,編譯想要測(cè)試的chaincode扩劝,這里選擇sacc,進(jìn)入sacc
文件夾:
cd sacc
輸入命令go build
(GOPATH一定要有且正確职辅,因?yàn)槲业拇a不在$GOPATH/src
中):
go build
本來(lái)sacc
文件夾中只有sacc.go
文件棒呛。編譯成功,會(huì)看出多了一個(gè)可執(zhí)行文件sacc
罐农。此時(shí)需要啟動(dòng)這個(gè)可執(zhí)行文件:
CORE_PEER_ADDRESS=peer:7052 CORE_CHAINCODE_ID_NAME=mycc:0 ./sacc
最終編譯成功的結(jié)果:
PS D:\Fabric\fabric-samples\chaincode> docker exec -it chaincode bash
root@1fc1686b8ffd:/opt/gopath/src/chaincode# cd sacc
root@1fc1686b8ffd:/opt/gopath/src/chaincode/sacc# go build
root@1fc1686b8ffd:/opt/gopath/src/chaincode/sacc# CORE_PEER_ADDRESS=peer:7052 CORE_CHAINCODE_ID_NAME=mycc:0 ./sacc
2019-12-07 08:18:44.818 UTC [shim] setupChaincodeLogging -> INFO 001 Chaincode log level not provided; defaulting to: INFO
2019-12-07 08:18:44.818 UTC [shim] setupChaincodeLogging -> INFO 002 Chaincode (build level: ) starting up ...
2019-12-07 08:18:44.818 UTC [bccsp] initBCCSP -> DEBU 001 Initialize BCCSP [SW]
2019-12-07 08:18:44.818 UTC [grpc] DialContext -> DEBU 002 parsed scheme: ""
2019-12-07 08:18:44.821 UTC [grpc] DialContext -> DEBU 003 scheme "" not registered, fallback to default scheme
2019-12-07 08:18:44.821 UTC [grpc] watcher -> DEBU 004 ccResolverWrapper: sending new addresses to cc: [{peer:7052 0 <nil>}]
2019-12-07 08:18:44.821 UTC [grpc] switchBalancer -> DEBU 005 ClientConn switching balancer to "pick_first"
2019-12-07 08:18:44.821 UTC [grpc] HandleSubConnStateChange -> DEBU 006 pickfirstBalancer: HandleSubConnStateChange: 0xc0002d60c0, CONNECTING
2019-12-07 08:18:44.824 UTC [grpc] HandleSubConnStateChange -> DEBU 007 pickfirstBalancer: HandleSubConnStateChange: 0xc0002d60c0, READY
注意:這里有個(gè)不解的小問(wèn)題条霜,官網(wǎng)教程中的端口是peer:7051,并且當(dāng)前peer確實(shí)也在監(jiān)聽(tīng)7051涵亏,但是寫成7051就會(huì)報(bào)錯(cuò):Error starting SimpleAsset chaincode: error sending chaincode REGISTER
宰睡。
在這個(gè)終端二里可以輸出chaincode中的日志(比如通過(guò)fmt.Print()
打印的內(nèi)容)。
Terminal 3: 在cli中測(cè)試鏈碼
1. 進(jìn)入cli
容器(在chaincode文件夾中執(zhí)行)气筋,同樣cmd拆内,輸入命令:
docker exec -it cli bash
運(yùn)行成功:
D:\Fabric\fabric-samples\chaincode\sacc>docker exec -it cli bash
root@16f105fc1d81:/opt/gopath/src/chaincodedev#
補(bǔ)充:常見(jiàn)錯(cuò)誤
可能遇到的錯(cuò)誤:
D:\Fabric\fabric-samples\chaincode\sacc>docker exec -it cli bash
Error response from daemon: Container 16f105fc1d818f519daf23d0ba2b4746f26e7f13be44537a6ef0f202d13b57c5 is not running
應(yīng)該是之前運(yùn)行的網(wǎng)絡(luò)關(guān)閉,但是容器沒(méi)有清理干凈宠默。重新建立網(wǎng)絡(luò)時(shí)麸恍,顯示cli
容器已存在,所以這里運(yùn)行失敗了搀矫。
(1) 查看當(dāng)前運(yùn)行的容器抹沪,沒(méi)有cli
。
D:\Fabric\fabric-samples\chaincode\sacc>docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1fc1686b8ffd hyperledger/fabric-ccenv "/bin/sh -c 'sleep 6…" 16 hours ago Up 36 minutes chaincode
cb6060f3e485 hyperledger/fabric-peer "peer node start --p…" 16 hours ago Up 36 minutes 0.0.0.0:7051->7051/tcp, 0.0.0.0:7053->7053/tcp peer
3d20f81c24ae hyperledger/fabric-orderer "orderer" 16 hours ago Up 36 minutes 0.0.0.0:7050->7050/tcp orderer
查看所有容器(包括未運(yùn)行的)瓤球,可以看到cli
融欧,顯示exited。
D:\Fabric\fabric-samples\chaincode\sacc>docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
16f105fc1d81 hyperledger/fabric-tools "/bin/bash -c ./scri…" 16 hours ago Exited (1) 36 minutes ago cli
1fc1686b8ffd hyperledger/fabric-ccenv "/bin/sh -c 'sleep 6…" 16 hours ago Up 36 minutes chaincode
cb6060f3e485 hyperledger/fabric-peer "peer node start --p…" 16 hours ago Up 36 minutes 0.0.0.0:7051->7051/tcp, 0.0.0.0:7053->7053/tcp peer
3d20f81c24ae hyperledger/fabric-orderer "orderer" 16 hours ago Up 36 minutes 0.0.0.0:7050->7050/tcp orderer
(2) 停止所有已有容器卦羡。
D:\Fabric\fabric-samples\chaincode\sacc>docker ps -qa | xargs docker stop
'xargs' 不是內(nèi)部或外部命令噪馏,也不是可運(yùn)行的程序
或批處理文件麦到。
使用cmd會(huì)報(bào)錯(cuò),我猜測(cè)自帶的cmd終端沒(méi)有xargs
命令欠肾,可能需要安裝吧瓶颠,我們?cè)囋?code>Git Bash,停止成功:
$ docker ps -qa | xargs docker stop
16f105fc1d81
1fc1686b8ffd
cb6060f3e485
3d20f81c24ae
(3) 刪除所有容器刺桃,使用Git Bash
粹淋。
$ docker ps -qa | xargs docker rm
16f105fc1d81
1fc1686b8ffd
cb6060f3e485
3d20f81c24ae
(4) 再次查看現(xiàn)在容器,無(wú)瑟慈,已全部刪除干凈廓啊。
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
(5) 回到Step 3,從頭開(kāi)始重新開(kāi)始鏈碼測(cè)試過(guò)程封豪。
這次可以看到cli successfully submitted而不是exist。而且炒瘟,由于cli的重新創(chuàng)建吹埠,這次編譯sacc.go的時(shí)間也相對(duì)較長(zhǎng)
$ cd fabric-samples/chaincode-docker-devmode
$ docker-compose -f docker-compose-simple.yaml up
....
cli | 2019-12-07 08:46:50.463 UTC [channelCmd] executeJoin -> INFO 040 Successfully submitted proposal to join channel
...
同時(shí),可以看看cli
創(chuàng)建成功后疮装,當(dāng)前所有運(yùn)行的容器缘琅,cli
正在運(yùn)行:
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
67177650c150 hyperledger/fabric-tools "/bin/bash -c ./scri…" 7 minutes ago Up 6 minutes cli
4601cad82add hyperledger/fabric-ccenv "/bin/sh -c 'sleep 6…" 7 minutes ago Up 6 minutes chaincode
4e923f858cf2 hyperledger/fabric-peer "peer node start --p…" 7 minutes ago Up 7 minutes 0.0.0.0:7051->7051/tcp, 0.0.0.0:7053->7053/tcp peer
5b790bc7b207 hyperledger/fabric-orderer "orderer" 7 minutes ago Up 7 minutes 0.0.0.0:7050->7050/tcp orderer
綜上,解決辦法:
$ docker ps -a
$ docker ps -qa | xargs docker stop
$ docker ps -qa | xargs docker rm
$ docker-compose -f docker-compose-simple.yaml up
在網(wǎng)上看到另一種方法關(guān)閉網(wǎng)絡(luò)廓推,確保容器清理干凈:
$ docker-compose -f docker-compose-simple.yaml down
端口或者網(wǎng)絡(luò)沖突刷袍,可以選擇重啟docker軟件(restart...)或者重啟電腦。
2. 安裝鏈碼:
peer chaincode install -p chaincodedev/chaincode/sacc -n mycc -v 0
運(yùn)行成功:
root@16f105fc1d81:/opt/gopath/src/chaincodedev# peer chaincode install -p chaincodedev/chaincode/sacc -n mycc -v 0
2019-12-06 16:54:03.733 UTC [viperutil] getKeysRecursively -> DEBU 001 Found map[string]interface{} value for peer.BCCSP
2019-12-06 16:54:03.733 UTC [viperutil] unmarshalJSON -> DEBU 002 Unmarshal JSON: value cannot be unmarshalled: invalid character 'S' looking for beginning of value
2019-12-06 16:54:03.733 UTC [viperutil] getKeysRecursively -> DEBU 003 Found real value for peer.BCCSP.Default setting to string SW
...
2019-12-06 16:54:03.934 UTC [msp.identity] Sign -> DEBU 04c Sign: digest: CB3C75A2355D183E715FD69A2AFC3770E98C13D03314F8D87C8A726E64712D78
2019-12-06 16:54:03.937 UTC [chaincodeCmd] install -> INFO 04d Installed remotely response:<status:200 payload:"OK" >
3. 實(shí)例化鏈碼(實(shí)例化設(shè)置了a的初始值20):
peer chaincode instantiate -n mycc -v 0 -c '{"Args":["a","20"]}' -C myc
運(yùn)行成功:
root@16f105fc1d81:/opt/gopath/src/chaincodedev# peer chaincode instantiate -n mycc -v 0 -c '{"Args":["a","20"]}' -C myc
2019-12-06 16:54:24.985 UTC [viperutil] getKeysRecursively -> DEBU 001 Found map[string]interface{} value for peer.BCCSP
2019-12-06 16:54:24.985 UTC [viperutil] unmarshalJSON -> DEBU 002 Unmarshal JSON: value cannot be unmarshalled: invalid character 'S' looking for beginning of value
...
2019-12-06 16:54:25.034 UTC [msp.identity] Sign -> DEBU 0a8 Sign: plaintext: 0AC8070A6008031A0B08C18FAAEF0510...982A5C94D00FAC486602B103622AA66E
2019-12-06 16:54:25.034 UTC [msp.identity] Sign -> DEBU 0a9 Sign: digest: 8F134B0F487C8AE1415C70FF09661990109462CE13012DE8C552DBC34FF5740E
調(diào)用get()
接口查詢a的值樊展,發(fā)現(xiàn)a的值已經(jīng)更新為20呻纹,測(cè)試完畢。
peer chaincode query -n mycc -c '{"Args":["get","a"]}' -C myc
運(yùn)行成功:
root@16f105fc1d81:/opt/gopath/src/chaincodedev# peer chaincode query -n mycc -c '{"Args":["get","a"]}' -C myc
2019-12-06 16:55:27.041 UTC [viperutil] getKeysRecursively -> DEBU 001 Found map[string]interface{} value for peer.BCCSP
...
2019-12-06 16:55:27.070 UTC [msp.identity] Sign -> DEBU 044 Sign: digest: 9E0EE6EC0A444B251192B21BB5C8ED643F818731367BAFE81936D2FDC560EBE8
20
4. 運(yùn)行測(cè)試:
調(diào)用set()
接口將a的值設(shè)置為5:
peer chaincode invoke -n mycc -c '{"Args":["set", "a", "5"]}' -C myc
運(yùn)行成功:
root@16f105fc1d81:/opt/gopath/src/chaincodedev# peer chaincode invoke -n mycc -c '{"Args":["set", "a", "5"]}' -C myc
2019-12-06 16:54:54.514 UTC [viperutil] getKeysRecursively -> DEBU 001 Found map[string]interface{} value for peer.BCCSP
2019-12-06 16:54:54.514 UTC [viperutil] unmarshalJSON -> DEBU 002 Unmarshal JSON: value cannot be unmarshalled: invalid character 'S' looking for beginning of value
...
2019-12-06 16:54:54.561 UTC [chaincodeCmd] chaincodeInvokeOrQuery -> INFO 0a9 Chaincode invoke successful. result: status:200 payload:"5"
調(diào)用get()
接口查詢a的值专缠,發(fā)現(xiàn)a的值已經(jīng)更新為5雷酪,測(cè)試完畢。
root@16f105fc1d81:/opt/gopath/src/chaincodedev# peer chaincode query -n mycc -c '{"Args":["get","a"]}' -C myc
2019-12-06 16:55:27.041 UTC [viperutil] getKeysRecursively -> DEBU 001 Found map[string]interface{} value for peer.BCCSP
2019-12-06 16:55:27.041 UTC [viperutil] getKeysRecursively -> DEBU 002 Found map[string]interface{} value for peer.BCCSP.SW
...
2019-12-06 16:55:27.070 UTC [msp.identity] Sign -> DEBU 043 Sign: plaintext: 0AC8070A6008031A0B08FF8FAAEF0510...12046D7963631A080A036765740A0161
2019-12-06 16:55:27.070 UTC [msp.identity] Sign -> DEBU 044 Sign: digest: 9E0EE6EC0A444B251192B21BB5C8ED643F818731367BAFE81936D2FDC560EBE8
5
根據(jù)運(yùn)行結(jié)果涝婉,可以看到打印了a的值哥力,為5。
本文作者:Joyce
文章來(lái)源:http://www.reibang.com/p/b8d9c208e601
版權(quán)聲明:轉(zhuǎn)載請(qǐng)注明出處墩弯!