Channel 配置(configtx)
Hyperledger Fabric区块链网络的共享配置,存储在collection configuration transactions中,每个Channel一个。 每个configuration transaction 通常使用一个较短的名称configtx
。
Channel配置具有以下重要属性:
Versioned(版本化):配置文件中的所有元素,都有一个关联的版本,每次修改都会更新版本号。 此外,每个提交的配置都会收到一个序列号。
Permissioned(权限):配置文件中的每个元素,都有一个关联的策略,用于控制是否允许对该元素进行修改。 任何拥有之前configtx副本(并且没有其他额外的信息)的人,都可以根据这些策略验证新配置的有效性。
Hierarchical(分层):根配置组包含子组,并且每个层次组都有关联的值和策略。 这些政策可以利用层次结构,从较低层次的政策中生成较高层次的政策(These policies can take advantage of the hierarchy to derive policies at one level from policies of lower levels)。
详解一个配置
配置作为HeaderType_CONFIG
类型的transaction,存储在没有其它transaction的block(块)中。 这些块被称为Configuration Blocks(配置块),其中第一块被称为Genesis Block(创世区块)。
配置的原型结构(proto structures)存储在fabric/protos/common /configtx.proto
中。HeaderType_CONFIG
类型的Envelope(信封、包、封装)将ConfigEnvelope
消息编码为Payload
数据字段。 ConfigEnvelope
的原型定义如下:
message ConfigEnvelope {
Config config = 1;
Envelope last_update = 2;
}
last_update
字段在下面的 “Updates to configuration(更新到配置)” 部分中定义,它仅在验证配置时需要。 相反,当前提交的配置,存储在config
字段中,其中包含Config
消息。
message Config {
uint64 sequence = 1;
ConfigGroup channel_group = 2;
}
对于每个已提交的配置,序号(sequence numbe)都加1。 channel_group
字段是包含配置的根group。 ConfigGroup
结构是递归定义的,并构建一个group的树,其中每个group都包含值和策略。 它被定义如下:
message ConfigGroup {
uint64 version = 1;
map<string,ConfigGroup> groups = 2;
map<string,ConfigValue> values = 3;
map<string,ConfigPolicy> policies = 4;
string mod_policy = 5;
}
由于ConfigGroup
是一个递归结构,它具有分层结构。 下面的例子是为了使golang符号更清晰。
// 假设下面的 groups 如下定义
//var root, child1, child2, grandChild1, grandChild2, grandChild3 *ConfigGroup
// 设置下面的 values
root.Groups["child1"] = child1
root.Groups["child2"] = child2
child1.Groups["grandChild1"] = grandChild1
child2.Groups["grandChild2"] = grandChild2
child2.Groups["grandChild3"] = grandChild3
// groups的config structure 结果像下面:
// root:
// child1:
// grandChild1
// child2:
// grandChild2
// grandChild3
每个group都在配置层次结构中定义一个级别,每个group都有一组关联的value(由字符串key索引)和Policies(策略,也由字符串key索引)。
values由以下定义:
message ConfigValue {
uint64 version = 1;
bytes value = 2;
string mod_policy = 3;
}
Policies 由以下定义:
message ConfigPolicy {
uint64 version = 1;
Policy p