Fabric网络升级(一)
原文来自这里。
本章节主要介绍如何从之前的版本或其他长期支持版本升级至最新版。
从2.1升级到2.2
Fabric v2.1和v2.2都是稳定版,以bug修复和其它形式的代码加固位置。因此,升级不需要特别考虑,也不需要更新特定的镜像版本或通道配置更新。
从v1.4.x长期支持版本升级到v2.2
从v1.4.x升级到v2.2,你需要考虑一下内容:
chaincode lifecycle
在chaincode被应用到通道前,允许多个组织表决该合约应该如何使用,这是v2.0新增的功能。要了解更多关于chaincode lifecycle的信息,可以参阅这里。
最佳操作是在启用使用了新的chaincode lifecycle的通道和应用程序之前,先升级通道中的所有peers节点(尽管通道 capabilities不是必须的,但此时更新它更有意义)。未更新至v2.x的peers节点都将会在启用任一capability后崩溃,未更新至v2的orderer节点会在启用通道 capability后崩溃。这种崩溃行为是有意义的,因为如果peers节点或orderer节点不支持必要的capabilities,那它将不能安全地参与到通道中。
在通道更新应用程序的capabilities到v2.0之后,你必须使用v2.x lifecycle程序来打包、安装、审核和提交新的chaincode。因此,在更新功能之前,请确保为新的 lifecycle做好准备。
新的lifecycle默认使用的背书策略是在配置在通道中的(例如 org中的MAJORITY
),因此通道启用capabilities时应将背书策略添加到通道的配置中。
有关如何编辑相关通道配置以通过为每个组织添加背书策略的方式来启用行的lifecycle的信息,请查阅Enabling the new chaincode lifecycle。
chaincode shim包(仅Golang版)
在升级peers和通道之前,推荐使用vendor来管理v1.4版本的Go chaincode使用的shim包。这样的话,你就无需更改的你的chaincode。
Fabric网络升级后,如果你不使用vendor来管理你的shim包,尽管之前的chaincode镜像仍能正常工作,但这是有风险的。如果你的chaincode镜像从你的环境中删除了,那么v2.x的peer的invoke会重建chaincode镜像,但此时会报错,因为找不到shim包。
此时,你有两个选择:
- 如果整个通道都已经准备好升级chaincode,那你可以在所有的peers和通道上升级chaincode(至于使用旧的还是新的lifecycle,这取决于你启用的capability版本)。此时最好的方式是使用go mod来管理新的chaincode使用的shim包。
- 如果整个通道都没有准备好升级chaincode,那你可以使用环境变量来指定的重建chaincode镜像时使用v1.4的
ccenv
。v1.4的ccenv
仍可以在v2.x的peers上使用。
chaincode日志(仅Golang版)
chaincode shim包中的日志服务shim.ChaincodeLogger已被删除,所以需要用户自己选择日志服务。详见Logging control。
Peer数据库升级
关于如何升级peers节点的详细信息,可以参考upgrading components。在升级的你的peers节点之前,你还需要额外进行一步操作,那就是升级peer数据库。所有peers节点的数据库(不仅包括状态数据库,还包括历史数据库和peer节点的其它内部数据库)都必须使用v2.x的数据格式进行重建,这是升级到v2.x版本的一部分。要出发重建操作,在peers节点启动前需要删除数据库。接下来介绍如何使用peer node upgrade-dbs
命令来删除本地数据库并为升级做好准备,这样在启动v2.xpeers节点的第一时间,所有的数据库都会被重建。如果你使用CouchDB作为状态数据库,v2.2的peers已经支持自动删除CouchDB了。要启用该支持,需要你配置peer使用CouchDB,且在执行upgrade-dbs
命令前启动CouchDB。在v2.0和v2.1中,peer并不支持自动删除CouchDB数据库,你需要自己手动删除。
在使用docker run
命令启动新的peer容器之后,再使用下面的命令来升级peer节点(你可以跳过设置IMAGE_TAG
的步骤,因为upgrade-dbs
只对v2.x Fabric有效。如果跳过的话,你需要设置PEER_CONTAINER
和LEDGERS_BACKUP
环境变量)。使用下面的命令来代替docker run
命令启动peer的话,peer节点会删除本地的数据库,并为管理本地数据库做好准备(如果你是从v1.4.x版本升级的话,请使用v2.1代替v2.0):
docker run --rm -v /opt/backup/$PEER_CONTAINER/:/var/hyperledger/production/ \
-v /opt/msp/:/etc/hyperledger/fabric/msp/ \
--env-file ./env<name of node>.list \
--name $PEER_CONTAINER \
hyperledger/fabric-peer:2.0 peer node upgrade-dbs
在v2.0和v2.1中,如果你使用的是CouchDB作为状态数据库,那么也需要删除CouchDB数据库。删除CouchDB的/data
目录即可。
然后使用下面的命令来启动2.0
标签的peer:
docker run -d -v /opt/backup/$PEER_CONTAINER/:/var/hyperledger/production/ \
-v /opt/msp/:/etc/hyperledger/fabric/msp/ \
--env-file ./env<name of node>.list \
--name $PEER_CONTAINER \
hyperledger/fabric-peer:2.0 peer node start
peer节点会在启动之后立即使用v2.x数据格式重建数据库。由于重建数据库可能是一个漫长的过程(这取决于你的数据库大小,可能长达数小时),所以需要实时检查peer节点的日志来确认重建的进度。每隔1000个区块,你会看到如下信息:
[lockbasedtxmgr] CommitLostBlock -> INFO 041 Recommitting block [1000] to state database
表示数据库还在重建中。
如果升级过程中没有删除数据库,在peer节点启动时会返回错误信息:peer节点使用的是老旧的数据格式,必须使用peer node upgrade-dbs
命令删除上述数据库(如果使用CouchDB作为状态数据库,则需要手动删除)。处理完成后重启节点即可。
Capability
v2.0新增了下面三个Capabilities:
- Application
V2_0
: 如Fabric chaincode lifecycle章节所述,启用了新的chaincode lifecycle。 - 通道
V2_0
:无更新,但与application和orderer版本保持一致。 - Orderer
V2_0
:控制Use通道CreationPolicyAsAdmins
,可修改通道创建交易的验证方式。当configtxgen与-bashProfile
选项联用时,可重置从orderer系统通道继承的值。
与Capability版本更新一样,更新Application
和通道
之前,确保已经升级的了你的peer可执行文件,更新Orderer
和通道
之前,确保已经升级的了你的orderer可执行文件。
关于如何设置新的Capabilities,详见Updating the capability level of a 通道。
为每个组织配置orderer终端(推荐配置)
从v1.4.2开始,推荐在组织版本为所有的系统通道和应用程序通道定义orderer终端,可以在组织的通道配置中新增OrdererEndpoints
来替代全局的OrdererAddresses
。如果有一个组织设置了组织版本的的orderer服务终端,那么在连接orderer节点时,所有的orderers和peers都会忽略通道版本的终端。
当服务发现与多个组织提供的orderer节点一起使用时,那就必须使用组织版本的orderer终端。这需要客户端配置正确的TLS证书。
如果你的通道配置中每个组织都未包含OrdererEndpoints
,那你需要升级你的通道配置来给它们添加这一配置。首先需要创建一个包含新配置章节的JSON文件。
在这个例子中,我们将为名为OrdererOrg
的组织添加配置。如果你有多个提供orderer服务的组织,那么每个组织都需要添加配置。JSON文件orglevelEndpoints.json
内容如下:
{
"OrdererOrgEndpoint": {
"Endpoints": {
"mod_policy": "Admins",
"value": {
"addresses": [
"127.0.0.1:30000"
]
}
}
}
}
之后,导入如下配置:
- CH_NAME:待更新的通道名称。所有的系统通道和应用程序通道都应该包含排序节点的组织终端。
- CORE_PEER_LOCALMSPID:提出通道更新的组织的MSPID。排序组织的MSP之一。
- CORE_PEER_MSPCONFIGPATH:标识你的组织的MSP的绝对路径。
- TLS_ROOT_CA:提出系统通道更新的组织根证书的绝对路径。
- ORDERER_CONTAINER:排序节点的容器名称。访问排序服务时,你可以访问提供排序服务的任何排序节点。你的请求会自动提交给leader节点。
- ORGNAME:当前你要更新的组织名称,例如
OrdererOrg
。
当你设置好环境变量后,就可以按照Step 1: Pull and translate the config。
之后使用下面的命令将组织的lifecycle策略(orglevelEndpoints.json
文件中配置的)添加到名为modified_config
的文件中:
jq -s ".[0] * {\"通道_group\":{\"groups\":{\"Orderer\": {\"groups\": {\"$ORGNAME\": {\"values\": .[1].${ORGNAME}Endpoint}}}}}}" config.json ./orglevelEndpoints.json > modified_config.json
之后的操作,详见Step 3: Re-encode and submit the config。
如果排序服务组织执行它们自己的通道编辑操作,那么它们可以在没有进一步签名(默认情况下,编辑组织内部参数只需要该组织管理员的签名)的情况下编辑配置。如果不同组织执行更新,那就需要被编辑的组织对更新请求进行签名。
声明:本作品采用署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)进行许可,使用时请注明出处。
Author: MonsterMeng92
Fabric网络升级(一)的更多相关文章
- 基于ubuntu16.04快速构建Hyperledger Fabric网络
前言 最近在参加一个比赛,使用到了区块链的开源软件hyperledger,由于之前从未接触过区块链,以及和区块链开发相关的内容,所有在网上查阅了大量的资料,并且通过学习yeasy(杨宝华)开源的入门书 ...
- hyperledger中文文档学习-4-构建第一个fabric网络
接下来的操作都将在hyperledge环境安装构建的虚拟机的环境下进行 参考https://hyperledgercn.github.io/hyperledgerDocs/build_network_ ...
- fabric网络环境启动过程详解
这篇文章对fabric的网络环境启动过程进行讲解,也就是我们上节讲到的启动测试fabric网络环境时运行network_setup.sh这个文件的执行流程 fabric网络环境启动过程详解 上一节我们 ...
- 搭建Fabric网络(二)下载bin和images
上一篇已经把运行和开发Fabric需要的程序都安装好了,这一篇主要讲怎么运行一个简单的Fabric网络. 1. 下载官方Sample代码 git clone -b master https://gi ...
- Windows下fabric sdk连接Linux上fabric网络的调试过程
上个月刚入职一家公司从事区块链研发工作,选型采用Hyperledger Fabric作为开发平台.团队的小组成员全部采用的是在VirtualBox上面安装桌面版的Ubuntu 16.04虚拟机,开发工 ...
- STM32+IAP方案 实现网络升级应用固件
关注了这个概念有些日子了,这段时间总算有机会实战==网络升级应用固件,这里记录下遇到的问题,及解决方案. 原理与网上流传的串口作为传输手段 一致:不同之处,无非我这里使用了网络设备传输.==(lwip ...
- 搭建基于hyperledger fabric的联盟社区(五) --启动Fabric网络
现在所有的文件都已经准备完毕,我们可以启动fabric网络了. 一.启动orderer节点 在orderer服务器上运行: cd ~/go/src/github.com/hyperledger/fab ...
- Hyperledger Fabric手动生成CA证书搭建Fabric网络
之前介绍了使用官方脚本自动化启动一个Fabric网络,并且所有的证书都是通过官方的命令行工具cryptogen直接生成网络中的所有节点的证书.在开发环境可以这么简单进行,但是生成环境下还是需要我们自定 ...
- 菜鸟系列Fabric——Fabric 网络架构介绍(4)
Fabric 网络架构介绍 1. 网络架构介绍 如图所示,fabric网络架构主要包含客户端节点.CA节点.Peer节点.Orderer节点这几个部分.并且fabric架构是安装组织来进行划分当,每个 ...
- Fabric网络节点发现及成员管理
一个新节点通过已知的节点加入到网络中,此时,它所知的网络节点信息是非常有限的,需要通过节点发现获知更多的节点,建立起足够的连接.另外,当一个新节点加入到网络时,原有网络节点也需要通过节点发现感知到新节 ...
随机推荐
- 比文件操作os库更优异的标准库pathlib
pathlib 库从 python3.4 开始作为内置库,到 python3.6 已经比较成熟.相比于老式的 os.path 有几个优势: 老的路径操作函数管理比较混乱,有的是导入 os, 有的又是在 ...
- Go--发起HTTP请求
一.HTTP请求 根据 HTTP 标准,HTTP 请求可以使用多种请求方法.在日常开发中大多数会用到 5 种请求方法: GET.POST.PUT.PATCH 和 DELETE 方法 描述 GET 请求 ...
- .NET 6 整合 Autofac 依赖注入容器
前言 一行业务代码还没写,框架代码一大堆,不利于学习. 常看到java的学习资料或博客,标题一般为<SpringBoot 整合 XXX>,所以仿照着写了<.NET 6 整合 Auto ...
- AtCoder Beginner Contest 189 Personal Editorial
第一次参加 AtCoder 的比赛,感觉还挺简单. 比赛链接:https://atcoder.jp/contests/abc189 A - Slot // Author : RioTian // Ti ...
- 【驱动】SPI驱动分析(四)-关键API解析
关键API 设备树 设备树解析 我们以Firefly 的SPI demo 分析下dts中对spi的描述: /* Firefly SPI demo */ &spi1 { spi_demo: sp ...
- S3C2440移植uboot之启动过程概述
上节烧写了uboot到开发板,不能运行.这节我们分析uboot重新编译uboot,由最后一条链接命令开始分析uboot 目录 1.分析start.S 2._start会跳转到start_code处 ...
- C#设计模式03——简单工厂的写法
什么是C#简单工厂? C#简单工厂是一种创建对象的设计模式,它定义一个工厂类来创建指定类型的对象,而不是在客户端代码中直接创建对象.简单工厂模式通常使用静态方法来生成对象,并且这些静态方法通常被称为工 ...
- plsqll连接Oracle的两种方式
第一种方式:配置tnsnames.ora 找到plsql软件根目录 下的配置文件
- 使用python的os.walk()对目标路径进行遍历
需求背景 在使用python处理和扫描系统文件的过程中,经常要使用到目录或者文件遍历的功能,这里通过引入os.walk()的功能直接来实现这个需求. 使用示例 由于功能模块本身比较简单,这里直接提供一 ...
- 搞了个Blazor工具站,域名一次性买了10年!
大家好,我是沙漠尽头的狼. 在 Dotnet9 上线在线小工具和小游戏后,服务器的压力感觉挺大的,打开25个页面,内存占用170MB左右,CPU保持在60~70%,看来Server真不适合搞这类交互较 ...