本篇博客主要是向读者介绍 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. 针对Web.config敏感信息加密

    cd C:\Windows\Microsoft.NET\Framework\v4.0.30319 ==在appSettings节点上添加== <configProtectedData> & ...

  2. 2018.11.22-day24 面向对象-继承

    1.归一化设计 2.抽象类 3.钻石继承 4.C3算法 5.新式类中的super

  3. mac10.10 打造Python多版本虚拟环境

    一.简介 1.在操作系统mac10.10(yosemite)中搭建Python多版本虚拟环境: 2.多版本虚拟环境包含三个含义: 在一个操作系统中安装多个版本的Python,不同版本可以随意切换,例如 ...

  4. Redis使用经验之谈

    应用场景 保存用户喜欢的商品信息. 类型: Hash, key: usr:${type_id}:${version_id}:${user_id}:${warehouse_id}, field: ${s ...

  5. 基于深度学习和迁移学习的识花实践——利用 VGG16 的深度网络结构中的五轮卷积网络层和池化层,对每张图片得到一个 4096 维的特征向量,然后我们直接用这个特征向量替代原来的图片,再加若干层全连接的神经网络,对花朵数据集进行训练(属于模型迁移)

    基于深度学习和迁移学习的识花实践(转)   深度学习是人工智能领域近年来最火热的话题之一,但是对于个人来说,以往想要玩转深度学习除了要具备高超的编程技巧,还需要有海量的数据和强劲的硬件.不过 Tens ...

  6. Yii的缓存机制之片段缓存

      一.首先在main.php配置缓存组件 在components里面添加cache项.代码如下: // application components 'components'=>array( ...

  7. typeof详解

    typeof operator 返回了表示对象类型的字符串 下表列出了typeof可能的返回值. Type Result Undefined "undefined" Null &q ...

  8. 「LuoguP2420」 让我们异或吧(树上前缀和

    P2420 让我们异或吧-洛谷 题目描述 异或是一种神奇的运算,大部分人把它总结成不进位加法. 在生活中…xor运算也很常见.比如,对于一个问题的回答,是为1,否为0.那么: (A是否是男生 )xor ...

  9. [HNOI 2010] 弹飞绵羊

    [题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=2002 [算法] LCT动态维护森林连通性 时间复杂度 : O(NlogN ^ 2) ...

  10. vue.js 组件共用函数的方法之一

    如果我现在写一个组件pullMore,想要用到loadMore里面的方法(函数), 那么只需要在当前组件pullMore,script里面先引入组件import loadMore from './lo ...