Policy 规则设计

本文主要是讲解一下在fabric中Policy的规则和写法,让大家有一个初步的认识,本文是基于fabric 1.1版本


Policy Type

Policy Type 目前包括两种:SIGNATUREIMPLICIT_META

signature 类型的policy 本质上是由msp principals 构成的 ,可以按照以下的方式去组织policy:5个org中要有4个org admin进行签名。或者”由组织A去签名,或其他两个组织的admin进行签名”。

ImplicitMetaPolicy,此策略类型不如SignaturePolicy灵活,并且仅在配置上下文中有效。 它汇总了在配置层次结构中更深层次评估策略的结果,这些策略最终由SignaturePolicies定义。 它支持良好的默认规则,如“大多数组织管理员策略”。

  1. message Policy {
  2. enum PolicyType {
  3. UNKNOWN = 0; // Reserved to check for proper initialization
  4. SIGNATURE = 1;
  5. MSP = 2;
  6. IMPLICIT_META = 3;
  7. }
  8. int32 type = 1; // For outside implementors, consider the first 1000 types reserved, otherwise one of PolicyType
  9. bytes policy = 2;
  10. }

Configuration and Policies

一个channel中policies是呈一个层次结构的,每一个层次都有一个与之对应的value和policy,下面给出一个示例中,包含两个app组织和一个orderer组织:

  1. Channel:
  2. Policies:
  3. Readers
  4. Writers
  5. Admins
  6. Groups:
  7. Orderer:
  8. Policies:
  9. Readers
  10. Writers
  11. Admins
  12. Groups:
  13. OrdereringOrganization1:
  14. Policies:
  15. Readers
  16. Writers
  17. Admins
  18. Application:
  19. Policies:
  20. Readers
  21. -----------> Writers
  22. Admins
  23. Groups:
  24. ApplicationOrganization1:
  25. Policies:
  26. Readers
  27. Writers
  28. Admins
  29. ApplicationOrganization2:
  30. Policies:
  31. Readers
  32. Writers

箭头指定的策略可以简写为“/Channel/Application/Writers”,最后一个元素说明了Policy的类型,是指定写入策略的。不同的情况会去执行不同的policy,比如说:

  • 一个实例去向orderer投递一个Deliver请求,就需要符合“/Channel/Readers”
  • 普通客户端去执行一个 chaincode Endorsor 类型的交易就需要符合“/Channel/Application/Writers”
  • gossip 协议, 去向peer发送一个gossip某块的请求,就需要符合 “/Channel/Application/Readers”

这些策略在编写的时候都是由多个的Policy嵌套组合在一起的。

构造 Signature Policies

  1. message SignaturePolicyEnvelope {
  2. int32 version = 1;
  3. SignaturePolicy policy = 2;
  4. repeated MSPPrincipal identities = 3;
  5. }
  6. message SignaturePolicy {
  7. message NOutOf {
  8. int32 N = 1;
  9. repeated SignaturePolicy policies = 2;
  10. }
  11. oneof Type {
  12. int32 signed_by = 1;
  13. NOutOf n_out_of = 2;
  14. }
  15. }

先看一下policy的部分,SignaturePolicy有AND, OR, and NoutOf 三种模式。oneof 表示结构体中要在两者中填充一个; identities,指定具体实施签名的对象。下面给出两个signatrue policy的示例:

  1. SignaturePolicyEnvelope{
  2. version: 0,
  3. policy: SignaturePolicy{
  4. n_out_of: NOutOf{
  5. N: 2,
  6. policies: [
  7. SignaturePolicy{ signed_by: 0 },
  8. SignaturePolicy{ signed_by: 1 },
  9. ],
  10. },
  11. },
  12. identities: [mspP1, mspP2],
  13. }

指定两个签名身份:mspP1、mspP2,需要两个签名,则必然mspP2和mspP2必须签名,相当于AND模式。

  1. SignaturePolicyEnvelope{
  2. version: 0,
  3. policy: SignaturePolicy{
  4. n_out_of: NOutOf{
  5. N: 2,
  6. policies: [
  7. SignaturePolicy{ signed_by: 0 },
  8. SignaturePolicy{
  9. n_out_of: NOutOf{
  10. N: 1,
  11. policies: [
  12. SignaturePolicy{ signed_by: 1 },
  13. SignaturePolicy{ signed_by: 2 },
  14. ],
  15. },
  16. },
  17. ],
  18. },
  19. },
  20. identities: [mspP1, mspP2, mspP3],
  21. }

翻译成文字的意思就是:三个签名对象(mspP1、mspP2、mspP3),指定要有两个以上的签名,其中mspP1(identities[0])必须签名,mspP2和mspP3中有一个要签名。

注意 : 签名身份未必指定是Admin,可能是一个Member。而且签名策略设计的时候需要注意,比如我们指定了以下策略:

  1. 2 of [org1.Member, org1.Admin]

我们用org1.Admin和org1.User1签名[Admin, User1]后发送交易去验证,会发现仍证失败了。这时因为Admin的签名在先对应了org1.Member,User1对应了org1.Admin自然会失败,如果把两个签名的顺序颠倒就可以验证通过了。

为了避免这种缺陷,应在策略身份排序中从最大特权到最小特权指定标识,上面的策略应指定为:

  1. 2 of [org1.Admin, org1.Member]

更为合理一些。

下面我们再看看结构中的msp principal.

MSP Principals

  1. message MSPPrincipal {
  2. enum Classification {
  3. ROLE = 0;
  4. ORGANIZATION_UNIT = 1;
  5. IDENTITY = 2;
  6. }
  7. Classification principal_classification = 1;
  8. bytes principal = 2;
  9. }

msp principal必须被指定为 ROLE或INDETITY,在1.1中尚未实现ORGEANIZATION_UNIT。

ROLE就是按照角色划分的集合:

  1. message MSPRole {
  2. string msp_identifier = 1;
  3. enum MSPRoleType {
  4. MEMBER = 0; // Represents an MSP Member
  5. ADMIN = 1; // Represents an MSP Admin
  6. CLIENT = 2; // Represents an MSP Client
  7. PEER = 3; // Represents an MSP Peer
  8. }
  9. MSPRoleType role = 2;
  10. }

MEMBER是指定范围最广的:所有由MSP CA签发的证书都可以;

ADMIN: MSP中指定的ADMIN身份

CLIENT(PEER): 由MSP CA 颁发,且organization unit标注为Client(Peer)的证书。

:如果想要指定Client和Peer,需要在cryptogen 产生证书的时候将organization unit设置为true。

IDENTITY就比较简单了,直接指明某个身份,在fabric中就是直接指定公钥证书,通常用的比较少。

这里多解释两句,msp principal是实现policy管理的基础,看起来满复杂实际上和传统的pki体系在作用上类似。本质上是指定一个identities的集合,指定一部分身份(比如说,高一一班所有男同学),在policy校验无非就是说这个身份符合principal指定的集合。详细的内容戳这个链接

构造ImplicitMeta Policies

  1. message ImplicitMetaPolicy {
  2. enum Rule {
  3. ANY = 0; // Requires any of the sub-policies be satisfied, if no sub-policies exist, always returns true
  4. ALL = 1; // Requires all of the sub-policies be satisfied
  5. MAJORITY = 2; // Requires a strict majority (greater than half) of the sub-policies be satisfied
  6. }
  7. string sub_policy = 1;
  8. Rule rule = 2;
  9. }

如同名字所显示的”模糊匹配”规则,它不会像signature那样指定到底是哪个组织或者成员来签署。而是简单的划分为三类:

  • ANY:任何一条子规则符合
  • ALL:所有的子规则都需要符合
  • MAJORITY: 大多数子规则都要符合

    例如我们在channel/Readers下指定一个implicitMeta规则:
  1. ImplicitMetaPolicy{
  2. rule: ANY,
  3. sub_policy: "foo",
  4. }

指定在子策略组中“orderer”、“application”中一个叫做foo的策略,即/Channel/Application/foo 和/Channel/Oderer/foo,校验请求的时候只要满足其中一条即可。

再举一个示例,在/Channel/Application/Writers中指定一个Majority类型的implicit策略:

  1. ImplicitMetaPolicy{
  2. rule: MAJORITY,
  3. sub_policy: "bar",
  4. }

假定application中包含了三个组织Org1、Org2、Org3,即/Channel/Application/Org1/bar、/Channel/Application/Org2/bar、/Channel/Application/Org3/bar,要满足其中的两条。

默认policies

  1. /Channel/Readers : ImplicitMetaPolicy for ANY of /Channel/*/Readers
  2. /Channel/Writers : ImplicitMetaPolicy for ANY of /Channel/*/Writers
  3. /Channel/Admins : ImplicitMetaPolicy for MAJORITY of /Channel/*/Admins
  4. /Channel/Application/Readers : ImplicitMetaPolicy for ANY of /Channel/Application/*/Readers
  5. /Channel/Application/Writers : ImplicitMetaPolicy for ANY of /Channel/Application/*/Writers
  6. /Channel/Application/Admins : ImplicitMetaPolicy for MAJORITY of /Channel/Application/*/Admins
  7. /Channel/Orderer/Readers : ImplicitMetaPolicy for ANY of /Channel/Orderer/*/Readers
  8. /Channel/Orderer/Writers : ImplicitMetaPolicy for ANY of /Channel/Orderer/*/Writers
  9. /Channel/Orderer/Admins : ImplicitMetaPolicy for MAJORITY of /Channel/Orderer/*/Admins
  10. # Here * represents either Orderer, or Application, and this is repeated for each org
  11. /Channel/*/Org/Readers : SignaturePolicy for 1 of MSP Principal Org Member
  12. /Channel/*/Org/Writers : SignaturePolicy for 1 of MSP Principal Org Member
  13. /Channel/*/Org/Admins : SignaturePolicy for 1 of MSP Principal Org Admin

/Channel/Orderer/Admins的admin权限是需要多个orderer组织admin signature policies 组合而成。

参考网址

https://hyperledger-fabric.readthedocs.io/en/release-1.1/policies.html

Hyperledger Fabric 1.1 -- Policy 构成的更多相关文章

  1. Centos7 HyperLedger Fabric 1.4 生产环境部署

    Kafka生产环境部署案例采用三个排序(orderer)服务.四个kafka.三个zookeeper和四个节点(peer)组成,共准备八台服务器,每台服务器对应的服务如下所示: kafka案例网络拓扑 ...

  2. Hyperledger Fabric 架构梳理

    区块链的数据结构 State数据结构 由peer维护,key/value store Ledger  记录了所有成功和不成功的状态更新交易.Ledger被ordering service构造,是一个全 ...

  3. 第6章 Hyperledger Fabric模型

    This section outlines the key design features woven into Hyperledger Fabric that fulfill its promise ...

  4. Hyperledger Fabric链码之三

    在<Hyperledger Fabric链码之一>和<Hyperledger Fabric链码之二>中我们介绍了链码的定义,并通过dev网络测试了测试了自己编写的链码程序. 本 ...

  5. Hyperledger fabric 1.3版本的安装部署(原创多机多Orderer部署

    首先,我们在安装前,要考虑一个问题 Hyperledger Fabric,通过指定的节点进行背书授权,才能完成交易的存储 延伸开来,就是为了实现容错.高并发.易扩展,需要zookeeper来选择排序引 ...

  6. Installing Hyperledger Fabric v1.1 on Ubuntu 16.04 — Part II &  Part III

    This entire tutorial is the second part of the installation of Hyperledger Fabric v1.1. In the previ ...

  7. Hyperledger Fabric CA User’s Guide——开始(三)

    Fabric CA User’s Guide——开始 先决条件 安装Go 1.9+ 设置正确的GOPATH环境变量 安装了libtool和libtdhl-dev包 下面是在Ubuntu上安装libto ...

  8. Hyperledger Fabric 1.2 --- Chaincode Operator 解读和测试(二)

    本文接上一节是测试部分 搭建一个模拟测试环境 作者将fabric release1.2工程中的 example-e2e进行了改造来进行本次实验: (1)首先我们将examples/e2e_cli/sc ...

  9. Hyperledger Fabric 1.2 --- Chaincode Operator 解读和测试(一)

    前言 本文主要目的是用于整理Hyperledger  Fabric中关于chaincode 管理和操作的内容,作者以release-1.2为范本进行讲解. 主要参考链接: https://hyperl ...

随机推荐

  1. 生产者-消费者模型-线程安全队列Queue

    #python3 #product new data into the queue #comsume data from the queue from queue import Queue impor ...

  2. ssh框架错误:org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role。

    在做ssh项目练习的时候出现问题: org.hibernate.LazyInitializationException: failed to lazily initialize a collectio ...

  3. 基于oracle数据库存储过程的创建及调用

    1.PLSQL编程 1.1概念和目的 PL/SQL(Procedure Language/SQL) PLSQL是Oracle对sql语言的过程化扩展 指在SQL命令语言中增加了过程处理语句(如分支.循 ...

  4. win10 切换网卡的bat

    @echo off >nul 2>&1 "%SYSTEMROOT%\system32\cacls.exe" "%SYSTEMROOT%\system3 ...

  5. Java接口和抽象类详解

    父类定义了相关子类的共有属性和行为.而接口可以定义类的共同行为(包括非相关的类). 了解接口前,先来说说抽象类.抽象类介乎于普通类和接口之间,提供部分实现方法以及未实现方法,可以看作为一个半成品. 抽 ...

  6. 『C++』Temp_2019_03_14 不同类的循环引用

    #include <iostream> #include <string> #include <regex> using namespace std; //提前声明 ...

  7. Windows环境下写Linux sh脚本的一次挖坑和填坑

    最近在研究Docker集群和安装的时候,需要准备若干台机器.所以我为节约时间,打算批量复制VM机器,然后用sh脚本命令执行机器名称和IP等基础配置信息的修改. 具体操作:我在windows环境下,用N ...

  8. Angular4 自制华容道拼图(可以升级难度、关卡、更换图片)

    前端工程师新手一枚,之前一直做些小设计,以及静态页面的编写工作.刚刚接触 Angular 没有多久,四个月前对于 js 也只是会写 alert 之流,现在进步算是很大,下面是自制的华容道拼图(可以升级 ...

  9. 使同一个server上不同port的django应用可在同一个浏览器上打开

    如果我们有两个django应用site1和site2同时跑在同一个server的不同端口,同时我们在同一个浏览器的不同tab登录.那么这时就出出现这种情况,当我们登录site2时就会将site1上登录 ...

  10. python教程(四)·序列

    距离上次的小项目已经休息了很长一段时间,是时候来继续本系列教程了.这一节开始我们将深入python中的数据结构. 序列的概念 在python中,最基本的数据结构是序列,序列包含一个或多个元素,每个元素 ...