如何在Hyperledger Fabric 1.0中实现分散成员资格

时间:2017-04-30 08:10:14

标签: hyperledger hyperledger-fabric

目前在Hyperledger Fabric 1.0中有一个中央会员服务。我想要一种方法使其分散,以便地图集50%的成员必须同意新成员加入网络。我怎样才能做到这一点?

这个想法基本上是将成员逻辑放在链代码中,让成员服务在注册时从链代码中获取数据。但是如何强制执行这一点,我的意思是我们如何知道会员服务实际上是从区块链中读取而不是作弊。

2 个答案:

答案 0 :(得分:4)

这实际上是Hyperledger Fabric本身支持的,您描述的行为实际上是渠道成员资格更改的默认行为。

每个通道都以生成块开始。该创世块的内容定义了渠道成员,以及来自这些组织的用户被授权在区块链上执行不同功能的策略。例如,某些用户可能被允许提交交易,但不会读取整个区块链,而其他用户可以同时执行这两项操作。

要更改频道成员资格,请提交频道重新配置事务。此事务指定新成员身份,并且必须包含足够的签名以授权此修改。默认情况下,这是来自大多数组织的管理员的签名。

政策框架实际上非常强大,只需要一点点知识,您就可以定义更强大的规则。例如,您可以要求OrgA和3/10其他组织签署更改成员资格。或者,您可以要求除一个组织外的所有组织都同意进行任何成员资格更改,或者无数其他排列。

您可能会发现一些有用的链接:

http://hyperledger-fabric.readthedocs.io/en/latest/configtxgen.html

http://hyperledger-fabric.readthedocs.io/en/latest/policies.html

http://hyperledger-fabric.readthedocs.io/en/latest/configtx.html

在撰写本文时,有关重新配置的文档和工具有点缺乏。你可能看到的最有用的地方是:

https://github.com/hyperledger/fabric/tree/release/examples/configtxupdate

您必须熟悉两个protobuf结构,common.ConfigUpdatecommon.Config。通过向订购服务提交签名的配置更新来创建渠道,订购服务生成嵌入在创世块中的相应配置。

管理频道成员资格变更的政策被指定为mod_policy群组的Application字段,该Channel群组是Admins群组的子群组。此字段默认为Admins,它指的是Application组中的政策定义MAJORITY。默认情况下,此策略设置为AdminsApplication组下定义的组织组的configtxlator策略的configtxlator

因此,要在创建频道之前修改此政策,您可以使用configtxlator工具将configtx解码为JSON,进行修改,然后再次使用peer channel signconfigtx工具对其进行编码。提交此新交易将创建包含您指定的政策的渠道。

如果您希望在事后修改成员资格,则流程类似。检索当前通道配置,解码并修改它,然后使用configtxlator计算代表您的更改的配置更新结构。通过import {Component, NgModule, VERSION} from '@angular/core' import {BrowserModule} from '@angular/platform-browser' import {ContextMenuHolderService} from './context-menu-holder.service' @Component({ selector: 'child-comp', template: ` <div> <h2>Hello child</h2> <span #mySpan>this bit has a context menu</span> <br> <span #parentSpan>this bit is the target for the parent span.</span> <p-contextMenu [target]="mySpan" [appendTo]="parentContext" [model]="items"></p-contextMenu> <p-contextMenu [target]="parentSpan" [appendTo]="parentContext" [model]="itemsForParent"></p-contextMenu> </div> `, }) export class ChildComponent { private items: MenuItem[]; parentContext: any; constructor(private cmhs : ContextMenuHolderService) { } ngOnInit() { this.items = [{ label: 'mySpans context menu' }]; this.itemsForParent = [{ label: 'parent context menu items' }]; console.log('child init', this.cmhs.getContextMenuParent()) this.parentContext = this.cmhs.getContextMenuParent().nativeElement; } } 收集签名然后提交以修改您的频道配置。

目前这个过程显然都是手动的,但是将来,SDK应该自动执行常见任务,并且工具也应该改进。

注意:parentContext是一项REST服务,因此可以从SDK应用程序内部方便地访问它,而不受语言的影响。

作为快速补遗。你问过如何确定没有人“作弊”而且没有真正获得所需的签名。这也内置在系统中。对通道配置的所有更改不仅由订购网络验证,而且由系统中的所有对等方验证。如果到达的配置无法验证,则网络中的所有节点都会注意到,并且将停止使用该通道,直到采取纠正性管理操作。

答案 1 :(得分:-1)

对于分散的成员资格,不依赖于集中式CA,请查看Blockstack。