本篇博客主要是向读者介绍 fabric 在部署时的一些细节,还有作者自己学习过程中的心得。

  • 初始化相关密钥的程序,实际上是一个shell脚本,并且结构特别简单

generateArtifacts.sh 脚本里面主要执行了三个函数

generateCerts                       # 这个是初始化组织证书和密钥的操作
replacePrivateKey # 这个函数是生成一个docker-compose 脚本,没有啥用
generateChannelArtifacts # 这个是定义组织机构和初始化创世块的操作
  • docker-compose 启动相关容器后,执行的script.sh 脚本
  1. 首先该script.sh 脚本是通过挂载的方式传入cli 容器中的,不需要用户在宿主机器上修改后上传。
  2. script.sh 脚本实际上是创建 channel 和将 peers 加入到 channel 中,并且给 peer 安装 chaincode (智能合约),然后就是给集群初始化账户和数值,还有校验测试
  3. 虽然使用 docker-compose 启动了 4个 peers, 实际上只有三个 peer 安装了 chaincode
  4. 安装的 chaincode 源码在/opt/gopath/src/github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02/chaincode_example02.go,使用go 语言编写,用户可以随意修改,但是之后要再给peer安装,在安装时,fabric 会自动编译该go 脚本

给chaincode_example02.go chaincode 增加一个test 的功能,打开对应的文件,将Invoke 函数进行修改,修改后的内容

func (t *SimpleChaincode) Invoke(stub shim.ChaincodeStubInterface) pb.Response {
fmt.Println("ex02 Invoke")
function, args := stub.GetFunctionAndParameters()
if function == "invoke" {
// Make payment of X units from A to B
return t.invoke(stub, args)
} else if function == "delete" {
// Deletes an entity from its state
return t.delete(stub, args)
} else if function == "query" {
// the old "Query" is now implemtned in invoke
return t.query(stub, args)
} else if function == "test" {
return t.test (stub, args)
} return shim.Error("Invalid invoke function name. Expecting \"invoke\" \"delete\" \"query\"")
}

增加了一个test 的方法,test 函数代码

func (t *SimpleChaincode) test (stub shim.ChaincodeStubInterface, args []string) pb.Response {
var V string
var Vval, Rval int
var err error if len(args) != {
return shim.Error("Incorrect number of arguments. Expecting 2")
} V = args[] Rval, err = strconv.Atoi(args[]) if err != nil {
return shim.Error("Expecting integer value for asset holding")
} if Rval == {
Vvalbytes, err := stub.GetState(V)
if err != nil {
return shim.Error("Failed to get state")
}
if Vvalbytes == nil {
return shim.Error("Entity not found")
} Vval, _ = strconv.Atoi(string(Vvalbytes))
Vval = Vval + // Write the state back to the ledger
err = stub.PutState(V, []byte(strconv.Itoa(Vval)))
if err != nil {
return shim.Error(err.Error())
}
}
return shim.Success(nil)
}

读者给peer 重新安装chaincode 后,可以在cli 中执行以下命令,实现给对应的用户增加10 块钱

peer chaincode invoke -o orderer.example.com:  --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":["test","a","123"]}'
  • 直接在宿主机器上执行 cli 的命令

例如:在cli 容器上查询a 账户的余额

docker exec -it cli peer chaincode query -C mychannel -n mycc -c '{"Args":["query","a"]}'

用户也可以利用 docker-compose 来执行该方法,但是需要先准备docker-compose 的cli配置文件,用户可以模仿 docker-compose-cli.yaml 文件进行编写,例如作者编写了一个名字叫“docker-compose-test.yaml”的配置文件。

这种方式有一个好处,就是执行的宿主机器,不需要知道之前是否已经启动了相关的docker 服务,因为执行docker-compose 命令时 ,会临时启动相应的docker 服务,执行完对应的shell 命令后,又会自动将其删除,真正的做到即用即起的效果。

# Copyright IBM Corp. All Rights Reserved.
#
# SPDX-License-Identifier: Apache-2.0
# version: '' services: cli:
container_name: cli
image: hyperledger/fabric-tools
tty: true
environment:
- GOPATH=/opt/gopath
- CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock
- CORE_LOGGING_LEVEL=DEBUG
- CORE_PEER_ID=cli
- CORE_PEER_ADDRESS=peer0.org1.example.com:
- CORE_PEER_LOCALMSPID=Org1MSP
- CORE_PEER_TLS_ENABLED=true
- CORE_PEER_TLS_CERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/server.crt
- CORE_PEER_TLS_KEY_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/server.key
- CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt
- CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp
working_dir: /opt/gopath/src/github.com/hyperledger/fabric/peer
# command: /bin/bash -c './scripts/script.sh ${CHANNEL_NAME}; sleep $TIMEOUT'
volumes:
- /var/run/:/host/var/run/
- ../chaincode/go/:/opt/gopath/src/github.com/hyperledger/fabric/examples/chaincode/go
- ./crypto-config:/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/
- ./scripts:/opt/gopath/src/github.com/hyperledger/fabric/peer/scripts/
- ./channel-artifacts:/opt/gopath/src/github.com/hyperledger/fabric/peer/channel-artifacts

还是以查询a账号余额为例

docker-compose -f docker-compose-test.yaml run --rm --no-deps cli peer chaincode query -C mychannel -n mycc -c '{"Args":["query","a"]}'

最新文章

  1. input为disabled提交后得不到该值的解决方法
  2. The equation - SGU 106(扩展欧几里得)
  3. iOS搜索指定字符在字符串中的位置
  4. Axure滚动效果实现
  5. 开源OSS.Social微信项目解析
  6. oracle_decode、case
  7. 机器学习:Python中如何使用支持向量机(SVM)算法
  8. [LeetCode] Subarray Product Less Than K 子数组乘积小于K
  9. 2019年3月10日 装饰器进阶-模拟session
  10. HTML学习笔记Day6
  11. linux df查看硬盘使用量 du查看文件所占大小
  12. fzu2204 dp
  13. Linux 修改最大连接数脚本
  14. 48.纯 CSS 创作一盘传统蚊香
  15. Linux常用基本命令(软链接与硬链接 )
  16. [转]python中@classmethod @staticmethod区别
  17. Qt5_各种路径
  18. eclipse项目setting文件
  19. SGU 405 Totalizator
  20. leancloud 云引擎

热门文章

  1. poj 2154 Color < 组合数学+数论>
  2. tomcat部署web应用的4种方法以及部署多个应用
  3. 九度OJ 1111:单词替换 (查找)
  4. 整形范围 运行Java代码的机器
  5. Xcode使用的一些小技巧,值得一看。
  6. 从ffmpeg filter里出来的数据直接送给avcodec_encode_audio2编码,写文件有错。
  7. Android图片加载神器之Fresco, 基于各种使用场景的讲解
  8. 理解 Android Fragment
  9. JavaScript实现Select选择本周、上周、本季、上季、本年的时间选取
  10. 解决warning: LF will be replaced by CRLF in **(filename)