【Hyper ledger学习】Hyper ledger 1.4.4 Chaincode 示例运行测试 (Windows 10)(二)

在完成Windows 10安装部署Hyper ledger记录的基础上,我们测试一下fabric-sampleschaincode容器中的示例合约。

参考: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

Hyperledger Fabric Workflow.png
  1. 成员组织(member Organization)中的参与者通过客户端应用程序(client application)调用事务请求(transaction request)。
  2. 客户端应用程序将事务调用请求广播给背书节点(Endorser peer)。
  3. 背书人peer检查证书详细信息和其他信息来验证事务。然后,它执行Chaincode(即智能合约)并将背书响应(Endorsement responses)返回给客户。Endorser peer发送交易批准或拒绝作为背书响应的一部分。
  4. 客户端现在将已批准的事务发送给Orderer peer,以便对其进行适当的排序并将其打包在一个block中。
  5. Orderer peer将事务打包到一个块中,并将该块转发到Hyperledger Fabric网络中不同成员组织的锚节点(Anchor nodes)。
  6. 锚节点(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
版权声明:转载请注明出处!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,937评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,503评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,712评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,668评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,677评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,601评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,975评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,637评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,881评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,621评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,710评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,387评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,971评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,947评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,189评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,805评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,449评论 2 342