本篇博客主要是向读者介绍 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"]}'

hyperledger fabric 1.0.5 分布式部署 (三)的更多相关文章

  1. hyperledger fabric 1.0.5 分布式部署 (五)

    梳理fabric e2e_cli 测试程序的具体步骤 作者在 hyperledger fabric 1.0.5 分布式部署 (一)中给读者们介绍了如何从零开始部署一个测试的 demo 环境,如果细心的 ...

  2. hyperledger fabric 1.0.5 分布式部署 (四)

    chaincode 的开发 作者在hyperledger fabric 1.0.5 分布式部署 (三)中向读者介绍了如何开发fabric 的chaincode,那么实际上chaincode 还有其他的 ...

  3. hyperledger fabric 1.0.5 分布式部署 (八)

    gdb debug peer 程序 在开始我们从 github 上download 下来的源码包,实际上已经包含了可执行的 peer 程序,但是该程序是使用 release 方式编译的,并不支持gdb ...

  4. hyperledger fabric 1.0.5 分布式部署 (七)

    fabric 使用 fabric-ca 服务 准备部分 首先需要用户从github上download fabric-ca 的工程代码 cd $GOPATH/src/github.com/hyperle ...

  5. hyperledger fabric 1.0.5 分布式部署 (六)

    如何在相同的peer 节点上创建多个 channel 作者在hyperledger fabric 1.0.5 分布式部署 (五)已经向读者们介绍了一个简单的fabric 的部署流程,那么根据上一篇博客 ...

  6. hyperledger fabric 1.0.5 分布式部署 (二)

    环境:2台 ubuntu 16.04 角色列表 角色 IP地址 宿主端口 docker端口  peer0.org1.example.com  47.93.249.250  7051  7051  pe ...

  7. hyperledger fabric 1.0.5 分布式部署 (一)

    环境是个人虚拟机ubuntu 16.04 64 位版本 前期用户需要先安装好:gcc.g++.git 软件 安装 golang 首先给环境安装一个 go 语言环境,版本最好在1.8 以上 golang ...

  8. hyperledger fabric 1.0.5 分布式部署 (九)

    linux 使用vim.ctags 配置fabric 源码阅读环境 首先需要安装 ctags,作者使用apt-get 来安装的,安装的版本是5.9 apt-get install ctags 5.9 ...

  9. Hyperledger Fabric 1.0 学习搭建 (三)--- 运行测试e2e-Fabric

    3.1.运行fabric-samples的问题说明 该问题说明能够解决6.1.平台特定使用的二进制文件配置第一步的问题.可以选择继续阅读该说明,或者等参考到6.1小节时再反向阅读本说明,具体在6.1中 ...

随机推荐

  1. C#实现(递归和非递归)高速排序和简单排序等一系列排序算法

        本人由于近期工作用到了一些排序算法.就把几个简单的排序算法.想冒泡排序,选择排序,插入排序.奇偶排序和高速排序等整理了出来,代码用C#代码实现,而且通过了測试.希望能给大家提供參考.     ...

  2. git (转载)

    文章转载 一:Git是什么? Git是目前世界上最先进的分布式版本控制系统. 二:SVN与Git的最主要的区别? SVN是集中式版本控制系统,版本库是集中放在中央服务器的,而干活的时候,用的都是自己的 ...

  3. Shell脚本学习指南笔记

    Shell脚本学习指南 作者:Danbo 2015-8-3 脚本编程语言与编译型语言的差异 许多中型.大型的程序都是用编译型语言写的,例如:C.C+.Java等.这类程序只要从源代码(Source C ...

  4. 关于mybatis的学习笔记

    配置文件 贴出mybatis的配置文件,这里mybatis还未与spring做整合: <?xml version="1.0" encoding="UTF-8&quo ...

  5. jquery特效(8)—倒计时

    最近公司在做一个答题的小游戏,每道题可以有20秒时间作答,超过时间就要给出相应的提醒,由于20秒时间太长,不适合做GIF动态图,下面来看一下我写的5秒倒计时的测试程序结果: 一.主体程序: <! ...

  6. ES6 新特性之Symbol

    Symbol let s1 = Symbol('foo'); let s2 = Symbol('bar'); s1 // Symbol(foo) s2 // Symbol(bar) s1.toStri ...

  7. java IO流文件的读写具体实例(转载)

    引言: 关于java IO流的操作是非常常见的,基本上每个项目都会用到,每次遇到都是去网上找一找就行了,屡试不爽.上次突然一个同事问了我java文件的读取,我一下子就懵了第一反应就是去网上找,虽然也能 ...

  8. requireJS 加载css、less文件

    -- requireJS 同样可以加载css 文件,有require-css的插件,只需要把插件放入main.js同文件夹,在依赖处 采用 ‘css! test.css’的形式就可以加载css文件 - ...

  9. C#继承与多态

    继承:在程序中,如果一个类A:类B,这种机制就是继承. 子类可以继承父类的所有内容(成员)吗? 解析: 1.私有成员(属性和方法) 2.构造函数 3.final修饰过的方法,子类不能进行重写 //SE ...

  10. bzoj5117

    线段树 先看前三个操作,都是区间修改,我们对于信息维护一个二元组(a,b),表示x=max(x+a,b),那么第一个操作就是(a,-inf),第二个是(-a,0),第三个是(-inf,a) 然后看查询 ...