原文来自这里。
用户从v1.4.x升级到v2.x后,必须编辑通道配置来启用新的lifecycle功能。这个过程涉及到相关用户必须执行的一系列通道配置更新。
要启用新的chaincode lifecycle,应用程序通道的Channel
和Application
capabilities必须更新到V2_0,详见Considerations for getting to 2.0。
总体来看,通道配置更新分三步(每个通道):
- 获取最新的通道配置
- 创建修改后的通道配置
- 创建配置更新交易
接下来我们使用enable_lifecycle.json
文件(包含我们所需要的所有通道配置更新)来更新通道配置。需要留意的是,在生成环境中,可能有多个用户发起通道更新请求。为了方便起见,我们将所有的更新都放在单个文件中呈现。
创建enable_lifecycle.json
文件
除了使用enable_lifecycle.json
文件外,本教程还将使用jq
将编辑后的内容应用到文件中。修改的文件也可以手动编辑,详见sample channel configuration。
本文展示的操作(使用JSON文件和jq
工具)在脚本化方面更具优势,更适合大量的通道配置更新。也是编辑通道配置的推荐操作。
enable_lifecycle.json
使用的示例,例如org1Policies
和Org1ExampleCom
,在部署时需要替换成实际值:
{
"org1Policies": {
"Endorsement": {
"mod_policy": "Admins",
"policy": {
"type": 1,
"value": {
"identities": [
{
"principal": {
"msp_identifier": "Org1ExampleCom",
"role": "PEER"
},
"principal_classification": "ROLE"
}
],
"rule": {
"n_out_of": {
"n": 1,
"rules": [
{
"signed_by": 0
}
]
}
},
"version": 0
}
},
"version": "0"
}
},
"org2Policies": {
"Endorsement": {
"mod_policy": "Admins",
"policy": {
"type": 1,
"value": {
"identities": [
{
"principal": {
"msp_identifier": "Org2ExampleCom",
"role": "PEER"
},
"principal_classification": "ROLE"
}
],
"rule": {
"n_out_of": {
"n": 1,
"rules": [
{
"signed_by": 0
}
]
}
},
"version": 0
}
},
"version": "0"
}
},
"appPolicies": {
"Endorsement": {
"mod_policy": "Admins",
"policy": {
"type": 3,
"value": {
"rule": "MAJORITY",
"sub_policy": "Endorsement"
}
},
"version": "0"
},
"LifecycleEndorsement": {
"mod_policy": "Admins",
"policy": {
"type": 3,
"value": {
"rule": "MAJORITY",
"sub_policy": "Endorsement"
}
},
"version": "0"
}
},
"acls": {
"_lifecycle/CheckCommitReadiness": {
"policy_ref": "/Channel/Application/Writers"
},
"_lifecycle/CommitChaincodeDefinition": {
"policy_ref": "/Channel/Application/Writers"
},
"_lifecycle/QueryChaincodeDefinition": {
"policy_ref": "/Channel/Application/Readers"
},
"_lifecycle/QueryChaincodeDefinitions": {
"policy_ref": "/Channel/Application/Readers"
}
}
}
在新的策略中,如果NodeOUs
启用了,"role"字段应该设置为PEER
,否则设置为MEMBER
。
编辑通道配置
系统通道更新
因为修改系统通道配置以启用新的lifecycle只涉及到peer组织配置中的通道配置参数,所以被编辑的peer组织都必须掉相关的通道配置更新进行签名。
默认情况下,系统通道只能被系统通道的管理员编辑(排序服务组织的管理员,而非peer组织的),这意味着对联盟中peer组织的配置更新必须有系统通道管理提出,并发送给相应的peer组织进行签名。
需要导入以下环境变量:
- CH_NAME:待更新的系统通道名称。
- CORE_PEER_LOCALMSPID:执行通道更新操作的MSP ID,排序服务组织中的MSP。
- TLS_ROOT_CA:发起系统通道更新组织的TLS证书的绝对路径。
- CORE_PEER_MSPCONFIGPATH:标识你的组织的MSP存放的绝对路径。
- ORDERER_CONTAINER:排序节点的容器名称。访问排序服务时,你可以访问排序服务中的任意节点。你的请求会自动提交给leader节点。
- ORGNAME:正在更新的组织名称。
- CONSORTIUM_NAME:正在更新的联盟名称。
设置好环境变量之后,Step 1: Pull and translate the config。
之后,使用下面的命令将lifecycle组织策略(enable_lifecycle.json
中列出的)添加到名为modified_config.json
文件中:
jq -s ".[0] * {\"channel_group\":{\"groups\":{\"Consortiums\":{\"groups\": {\"$CONSORTIUM_NAME\": {\"groups\": {\"$ORGNAME\": {\"policies\": .[1].${ORGNAME}Policies}}}}}}}}" config.json ./enable_lifecycle.json > modified_config.json
最后,Step 3: Re-encode and submit the config。
如上所述,这些更新都必须由系统通道管理员提出,并发送给相应的peer组织进行签名。
应用程序通道更新
编辑peer组织
我们需要对所有应用程序通道上的组织执行一组类似的编辑。
跟系统通道不同,peer组织可以发起对应用程序通道的配置更新请求。如果你只是对自己的组织进行配置更新,那你不需要其它组织的签名;但如果你要更新另一个组织的配置,那你就需要这个组织的签名。
需要导入以下环境变量:
- CH_NAME:待更新的应用程序通道名称。
- CORE_PEER_LOCALMSPID:执行通道更新操作的MSP ID,peer组织中的MSP。
- TLS_ROOT_CA:排序节点的TLS证书的绝对路径。
- CORE_PEER_MSPCONFIGPATH:标识你的组织的MSP存放的绝对路径。
- ORDERER_CONTAINER:排序节点的容器名称。访问排序服务时,你可以访问排序服务中的任意节点。你的请求会自动提交给leader节点。
- ORGNAME:正在更新的组织名称。
设置好环境变量之后,Step 1: Pull and translate the config。
之后,使用下面的命令将lifecycle组织策略(enable_lifecycle.json
中列出的)添加到名为modified_config.json
文件中:
jq -s ".[0] * {\"channel_group\":{\"groups\":{\"Application\": {\"groups\": {\"$ORGNAME\": {\"policies\": .[1].${ORGNAME}Policies}}}}}}" config.json ./enable_lifecycle.json > modified_config.json
最后,Step 3: Re-encode and submit the config。
编辑应用程序通道
在所有的应用程序通道都已经更新到包含V2_0capabilities后,新的chaincode lifecycle背书策略必须添加到所有的通道中。
所需的环境变量与更新peer组织时一样。不同之处在于不需要更新配置文件中的组织配置,所以不需要设置ORGNAME
。
设置好环境变量之后,Step 1: Pull and translate the config。
之后,使用下面的命令将lifecycle组织策略(enable_lifecycle.json
中列出的)添加到名为modified_config.json
文件中:
jq -s '.[0] * {"channel_group":{"groups":{"Application": {"policies": .[1].appPolicies}}}}' config.json ./enable_lifecycle.json > modified_config.json
最后,Step 3: Re-encode and submit the config。
要通过通过更新请求,则必须满足配置文件中Channel/Application
章节配置的修改策略。默认情况下,需要该通道中的大多数peer组织同意。
编辑通道ACLs(可选)
下面的访问控制列表(ACL)是enable_lifecycle.json
文件中的默认值,可根据你的使用场景进行选择:
"acls": {
"_lifecycle/CheckCommitReadiness": {
"policy_ref": "/Channel/Application/Writers"
},
"_lifecycle/CommitChaincodeDefinition": {
"policy_ref": "/Channel/Application/Writers"
},
"_lifecycle/QueryChaincodeDefinition": {
"policy_ref": "/Channel/Application/Readers"
},
"_lifecycle/QueryChaincodeDefinitions": {
"policy_ref": "/Channel/Application/Readers"
可以使用前面编辑应用程序通道时使用的环境变量。
设置好环境变量之后,Step 1: Pull and translate the config。
之后,使用下面的命令将lifecycle组织策略(enable_lifecycle.json
中列出的)添加到名为modified_config.json
文件中:
jq -s '.[0] * {"channel_group":{"groups":{"Application": {"values": {"ACLs": {"value": {"acls": .[1].acls}}}}}}}' config.json ./enable_lifecycle.json > modified_config.json
最后,Step 3: Re-encode and submit the config。
要通过通过更新请求,则必须满足配置文件中Channel/Application
章节配置的修改策略。默认情况下,需要该通道中的大多数peer组织同意。
在core.yaml
中启用新的lifecycle
如果你是按照推荐操作,使用diff
之类的工具比较新旧core.yaml
,那你就不必添加_lifecycle: enable
来启用系统chaincode,因为它在新版core.yaml
的chaincode/system
下。
如果你是直接更新原有的YAML文件,那就必须添加_lifecycle: enable
来启用系统chaincode。
关于节点升级的信息,详见Upgrading your components。
声明:本作品采用署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)进行许可,使用时请注明出处。
Author: MonsterMeng92