在完成Windows 10安装部署Hyper ledger记录的基础上,我们测试一下fabric-samples
下chaincode
容器中的示例合约。
参考:Fabric chaincode测试 —— 开发者模式和单元测试
注意:GOPATH一定要放在环境变量中。
Step 1: Hyperledger Fabric是如何工作的?
参考:How does Hyperledger Fabric work?
Hyperledger Fabric是一个permissioned区块链网络,由打算建立联合体的组织(organizations
)立。参与建立Hyperledger Fabric网络的组织称为“成员(members)
”。
区块链网络中的每个成员组织(organization)都有责任建立其参加网络的节点(peers
)。所有peers都要配置(configured)有适当的加密材料,例如认证授权(Certificate Authority)和其他信息。
member organization中的peers从organization内部的客户端接收事务调用请求(transaction invocation requests)。一个client
可以是服务于特定组织/业务活动的任何特定应用程序(application)/门户服务(portal serving)。客户端应用程序使用Hyperledger Fabric SDK或REST Web服务与Hyperledger Fabric网络进行交互。在peers中安装的Chaincode(类似于以太坊智能合约)会导致发起交易调用请求。
所有peers在订阅的每个channel
上维护一个ledger
。因此,分布式分类帐技术(Distributed Ledger Technology, DLT)。但与Ethereum在超账本结构中的作用不同,Hyperledger Fabric网络节点具有不同的作用。
所以并不是所有的节点都是相同的。在网络中有不同类型的对等节点peers,它们扮演不同的角色:
Endorser peer
peers可以标记为背书节点Endorser peer(即背书的对等点)。一旦从客户端应用程序接收到“事务调用请求”时,Endorser peer
- 验证交易(Validates the transaction)。i.e., 检查证书细节和请求者的角色。
- 执行Chaincode(即Smart Contract)并模拟事务的结果。但它不会更新ledger。
在上述两个任务结束时,Endorser peer可以批准或不批准事务。
由于只有Endorser peer执行链码Chaincode (Smart Contract),所以没有必要在网络的每个节点上都安装链码Chaincode,增加了网络的可扩展性。
Anchor peer
在通道配置(Channel configuration)时配置锚节点(Anchor peer)或锚节点集群(cluster)。需要提醒的是,在Hyperledger Fabric中,您可以在peers之间配置秘密通道 (secret channels),并且该通道的peers之间的事务(transactions) 仅对它们可见。
Anchor peer接收更新并将更新广播给组织中的其他peers。Anchor peer是可发现的。因此,任何标记为Anchor peer的peer都可以被订货Orderer peer或任何其他peer发现。
Orderer peer
Orderer peer被认为是Hyperledger Fabric网络的中心通信通道。Orderer peer/node负责整个网络的一致账本状态。Orderer peer创建block并将其传递给所有peers。
Orderer构建在面向消息的体系结构之上。目前有两个选项可用来实现Orderer peer:
- Solo: 适合开发。单点故障。Solo不应该用于生成就绪(Production-ready)网络。
- Kafka: Production-ready Hyperledger Fabric network使用Kafka作为Orderer实现。Kafka是具有高吞吐量容错功能的消息传递软件。
Hyperledger Fabric Workflow
- 成员组织(member Organization)中的参与者通过客户端应用程序(client application)调用事务请求(transaction request)。
- 客户端应用程序将事务调用请求广播给背书节点(Endorser peer)。
- 背书人peer检查证书详细信息和其他信息来验证事务。然后,它执行Chaincode(即智能合约)并将背书响应(Endorsement responses)返回给客户。Endorser peer发送交易批准或拒绝作为背书响应的一部分。
- 客户端现在将已批准的事务发送给Orderer peer,以便对其进行适当的排序并将其打包在一个block中。
- Orderer peer将事务打包到一个块中,并将该块转发到Hyperledger Fabric网络中不同成员组织的锚节点(Anchor nodes)。
- 锚节点(Anchor nodes)然后将块广播给它们自己组织内的其他节点。这些个人的peer然后用最新的块更新它们的本地账本(locak ledger)。这样,所有的网络都同步了账本。
Step 2: 开发者模式(chaincode-docker-devmode)
来自网络:使用开发者调试环境,需要先下载
fabric-samples
,置于$GOPATH/src
下。
我本来已经下载过了fabric-samples
,没有放在$GOPATH/src
中,也测试成功了,可能是因为我设置了GOPATH
环境变量。
进入faric-samples/chaincode-docker-devmode
文件夹:
首先分析目录中的docker-compose-simple.yaml
文件,该网络包含1个orderer
节点,1个peer
节点,1个chaincode
容器(负责运行需要测试的链码)1个cli
容器(负责发送请求来测试链码)。
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
有两点需要注意的:
- 在cli容器的
command
项中可以看见,启动后会自动执行当前目录下的script.sh
脚本,该脚本会自动创建名为myc
的通道,并且将节点加入。所以我们只需要安装和实例化链码即可。 - 在
chaincode
容器的volumes
中可以看见这样一条映射:
- ./../chaincode:/opt/gopath/src/chaincode
说明fabric-samples/chaincode
目录会映射到容器内部,这也是我们待测试链码需要放置的地方。为了方便管理,我们可以在该目录下为每个链码再分配一个目录,然后把要测试的链码放在其中。(当然也可以直接修改映射指向自己chaincode的实际路径)。
Step 3: 测试链码
同时开启多个Terminal,不要关闭。
Terminal 1: 在chaincode-docker-devmode
启动网络
首先进入开发者模式目录 fabric-samples/chaincode-docker-devmode
,右键打开Git Bash
,输入命令:
$ docker-compose -f docker-compose-simple.yaml up
网络启动成功:
$ 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
此时网络中存在四个容器(1 orderer,1 peer, 1 chaincode, 1 cli),创建了通道myc并将peer成功加入。
关闭网络,在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. 进入chaincode
容器
进入chaincode
容器(进入fabric-samples/chaincode
文件夹),输入命令docker exec -it chaincode bash
(必须用管理员身份运行),我用管理员身份运行的Windows自带的cmd终端,右键即可开启(不行的可以自行搜索右键打开方式):
D:\Fabric\fabric-samples\chaincode>docker exec -it chaincode bash
可以看到运行成功:
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
补充:常见错误
右键使用Git Bash
,不以管理员身份运行可能会报错:
$ 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
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'.
- 尝试使用管理员身份打开
Git Bash
,同样报错:
$ 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
- 尝试普通用户方式打开
cmd
,运行成功:
D:\Fabric\fabric-samples\chaincode>docker exec -it chaincode bash
root@1fc1686b8ffd:/opt/gopath/src/chaincode#
- 尝试普通用户方式打开
powershell
,运行成功:
D:\Fabric\fabric-samples\chaincode>docker exec -it chaincode bash
root@1fc1686b8ffd:/opt/gopath/src/chaincode#
综上,Git Bash
无法运行这个命令,cnd中可以不用管理员身份也可以。
但是在使用hyperledger fabric的过程中,有些东西又必须用Git Bash
,所以需要自己在使用时测试。
2. 编译某个链码(i.e sacc)
在fabric-samples/chaincode
文件夹中有7个示例链码:
$ ls
abac/ chaincode_example02/ fabcar/ hyperledger/ marbles02/ marbles02_private/ sacc/
紧接着docker exec -it chaincode bash
命令,编译想要测试的chaincode,这里选择sacc,进入sacc
文件夹:
cd sacc
输入命令go build
(GOPATH一定要有且正确,因为我的代码不在$GOPATH/src
中):
go build
本来sacc
文件夹中只有sacc.go
文件。编译成功,会看出多了一个可执行文件sacc
。此时需要启动这个可执行文件:
CORE_PEER_ADDRESS=peer:7052 CORE_CHAINCODE_ID_NAME=mycc:0 ./sacc
最终编译成功的结果:
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
注意:这里有个不解的小问题,官网教程中的端口是peer:7051,并且当前peer确实也在监听7051,但是写成7051就会报错:Error starting SimpleAsset chaincode: error sending chaincode REGISTER
。
在这个终端二里可以输出chaincode中的日志(比如通过fmt.Print()
打印的内容)。
Terminal 3: 在cli中测试链码
1. 进入cli
容器(在chaincode文件夹中执行),同样cmd,输入命令:
docker exec -it cli bash
运行成功:
D:\Fabric\fabric-samples\chaincode\sacc>docker exec -it cli bash
root@16f105fc1d81:/opt/gopath/src/chaincodedev#
补充:常见错误
可能遇到的错误:
D:\Fabric\fabric-samples\chaincode\sacc>docker exec -it cli bash
Error response from daemon: Container 16f105fc1d818f519daf23d0ba2b4746f26e7f13be44537a6ef0f202d13b57c5 is not running
应该是之前运行的网络关闭,但是容器没有清理干净。重新建立网络时,显示cli
容器已存在,所以这里运行失败了。
(1) 查看当前运行的容器,没有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
查看所有容器(包括未运行的),可以看到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' 不是内部或外部命令,也不是可运行的程序
或批处理文件。
使用cmd会报错,我猜测自带的cmd终端没有xargs
命令,可能需要安装吧,我们试试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) 再次查看现在容器,无,已全部删除干净。
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
(5) 回到Step 3,从头开始重新开始链码测试过程。
这次可以看到cli successfully submitted而不是exist。而且,由于cli的重新创建,这次编译sacc.go的时间也相对较长
$ 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
...
同时,可以看看cli
创建成功后,当前所有运行的容器,cli
正在运行:
$ 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
在网上看到另一种方法关闭网络,确保容器清理干净:
$ docker-compose -f docker-compose-simple.yaml down
端口或者网络冲突,可以选择重启docker软件(restart...)或者重启电脑。
2. 安装链码:
peer chaincode install -p chaincodedev/chaincode/sacc -n mycc -v 0
运行成功:
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. 实例化链码(实例化设置了a的初始值20):
peer chaincode instantiate -n mycc -v 0 -c '{"Args":["a","20"]}' -C myc
运行成功:
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
调用get()
接口查询a的值,发现a的值已经更新为20,测试完毕。
peer chaincode query -n mycc -c '{"Args":["get","a"]}' -C myc
运行成功:
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. 运行测试:
调用set()
接口将a的值设置为5:
peer chaincode invoke -n mycc -c '{"Args":["set", "a", "5"]}' -C myc
运行成功:
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"
调用get()
接口查询a的值,发现a的值已经更新为5,测试完毕。
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
根据运行结果,可以看到打印了a的值,为5。
本文作者:Joyce
文章来源:https://www.jianshu.com/p/b8d9c208e601
版权声明:转载请注明出处!