hyperledger fabric 1.0.5 分布式部署 (三)
本篇博客主要是向读者介绍 fabric 在部署时的一些细节,还有作者自己学习过程中的心得。
- 初始化相关密钥的程序,实际上是一个shell脚本,并且结构特别简单
generateArtifacts.sh 脚本里面主要执行了三个函数
generateCerts # 这个是初始化组织证书和密钥的操作
replacePrivateKey # 这个函数是生成一个docker-compose 脚本,没有啥用
generateChannelArtifacts # 这个是定义组织机构和初始化创世块的操作
- docker-compose 启动相关容器后,执行的script.sh 脚本
- 首先该script.sh 脚本是通过挂载的方式传入cli 容器中的,不需要用户在宿主机器上修改后上传。
- script.sh 脚本实际上是创建 channel 和将 peers 加入到 channel 中,并且给 peer 安装 chaincode (智能合约),然后就是给集群初始化账户和数值,还有校验测试
- 虽然使用 docker-compose 启动了 4个 peers, 实际上只有三个 peer 安装了 chaincode
- 安装的 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"]}'
hyperledger fabric 1.0.5 分布式部署 (三)的更多相关文章
- hyperledger fabric 1.0.5 分布式部署 (五)
梳理fabric e2e_cli 测试程序的具体步骤 作者在 hyperledger fabric 1.0.5 分布式部署 (一)中给读者们介绍了如何从零开始部署一个测试的 demo 环境,如果细心的 ...
- hyperledger fabric 1.0.5 分布式部署 (四)
chaincode 的开发 作者在hyperledger fabric 1.0.5 分布式部署 (三)中向读者介绍了如何开发fabric 的chaincode,那么实际上chaincode 还有其他的 ...
- hyperledger fabric 1.0.5 分布式部署 (八)
gdb debug peer 程序 在开始我们从 github 上download 下来的源码包,实际上已经包含了可执行的 peer 程序,但是该程序是使用 release 方式编译的,并不支持gdb ...
- hyperledger fabric 1.0.5 分布式部署 (七)
fabric 使用 fabric-ca 服务 准备部分 首先需要用户从github上download fabric-ca 的工程代码 cd $GOPATH/src/github.com/hyperle ...
- hyperledger fabric 1.0.5 分布式部署 (六)
如何在相同的peer 节点上创建多个 channel 作者在hyperledger fabric 1.0.5 分布式部署 (五)已经向读者们介绍了一个简单的fabric 的部署流程,那么根据上一篇博客 ...
- hyperledger fabric 1.0.5 分布式部署 (二)
环境:2台 ubuntu 16.04 角色列表 角色 IP地址 宿主端口 docker端口 peer0.org1.example.com 47.93.249.250 7051 7051 pe ...
- hyperledger fabric 1.0.5 分布式部署 (一)
环境是个人虚拟机ubuntu 16.04 64 位版本 前期用户需要先安装好:gcc.g++.git 软件 安装 golang 首先给环境安装一个 go 语言环境,版本最好在1.8 以上 golang ...
- hyperledger fabric 1.0.5 分布式部署 (九)
linux 使用vim.ctags 配置fabric 源码阅读环境 首先需要安装 ctags,作者使用apt-get 来安装的,安装的版本是5.9 apt-get install ctags 5.9 ...
- Hyperledger Fabric 1.0 学习搭建 (三)--- 运行测试e2e-Fabric
3.1.运行fabric-samples的问题说明 该问题说明能够解决6.1.平台特定使用的二进制文件配置第一步的问题.可以选择继续阅读该说明,或者等参考到6.1小节时再反向阅读本说明,具体在6.1中 ...
随机推荐
- docker: Dockerfile命令介绍
前一章介绍了Dockerfile创建镜像的方法,Dockerfile文件都是一些指令,因此要掌握Dockerfile就必须了解这些指令.这一章就介绍下Dockerfile的指令. From: 功能为指 ...
- Uninstall Tool3.5.3
2.卸载所有和MySQL相关的程序,有好几个,注意,一定要删除与MySQL相关的所有的数据,不能用MySQL自带的卸载,我是用Uninstall Tool3.5.3,在卸载程序界面,右键选择与MySQ ...
- 关于JavaScript的事件触发
突然知道JavaScript底层是怎么实现事件触发的,找到一个博客,功力不够,看的很迷糊,记载这里吧,后面再研究. [探讨]javascript事件机制底层实现原理
- POJ 2506 Tiling (递推 + 大数加法模拟 )
Tiling Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 7965 Accepted: 3866 Descriptio ...
- SpringMVC与Struts2区别与比较
1.Struts2是类级别的拦截, 一个类对应一个request上下文,SpringMVC是方法级别的拦截,一个方法对应一个request上下文,而方法同时又跟一个url对应,所以说从架构本身上Spr ...
- codeforces 466A. Cheap Travel 解题报告
题目链接:http://codeforces.com/problemset/problem/466/A 题目意思:一个 ride 需要 a 卢布,m 个 ride 需要 b 卢布,这两种方案都可以无限 ...
- cookie(点心的意思)服务器给客户端的点心
他是用户访问web服务器时,服务器在用户硬盘上存放的信息,好像是服务器给客户端的“点心”.比如:是否记录用户名密码.其中,A服务器不允许访问B服务器存在客户端的cookie 一个cookie包含一对k ...
- 如何修改Windows的默认安装路径
运行中输入regedit打开注册表编辑器 展开注册表“HKEY_LOCAL_MACHINE\Software\Microsoft\ Windows\ CurrentVersion”分支, 在窗口的右侧 ...
- centos 安装配置kettle
安装JDK1.8: step1 下载JDK1.8 http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133 ...
- 深度学习网络结构中超参数momentum了解
训练网络时,通常先对网络的初始权值按照某种分布进行初始化,如:高斯分布.初始化权值操作对最终网络的性能影响比较大,合适的网络初始权值能够使得损失函数在训练过程中的收敛速度更快,从而获得更好的优化结果. ...