在fabric中,共识过程意味着多个节点对于某一批交易的发生顺序、合法性以及它们对账本状态的更新结构达成一致的观点。满足共识则意味着多个节点可以始终保证相同的状态,对于以同样顺序到达的交易可以进行一致的处理。

具体来看,fabric中的共识包括背书、排序和验证三个环节的保障。

我们先来研究下背书策略。

一.什么是背书策略

chaincode在实例化的时候,需要指定背书策略。这里的背书策略就是需要什么节点背书交易才能生效。

发起交易的时候,发起端(一般是SDK),需要指定交易发给哪些节点进行背书验证(fabric不会自动发送),而是由sdk发送。发送后等待背书节点的返回,收集到足够的背书后将交易发送给orderer(排序节点或称共识节点)进行排序打包分发。最后,当每个Peer接受到block数据后,会对其中的交易进行验证,如果交易不符合背书策略,就不会在本地生效,所以真正验证背书是在这一步。

二.Endorsement policy 设计

背书策略有两个主要组成部分:

主体(principal):P定义了期望的签名来源实体

门槛(thshold gate):T有两个参数:整数t(阈值)和n个主体,表示从这n个主体中获取t个签名

例如:

T(2, 'A', 'B', 'C')表示需要A、B、C中任意2个主体的签名背书

T(1, 'A', T(2, 'B', 'C'))表示需要来自主体A的签名或者来自B和C两者的签名背书

三.在CLI中实行背书策略

3.1CLI endorsement policy语法

在CLI中,使用一种简单的语言来表示相对于Principal的布尔表达式的策略。

principal通过MSP进行描述,MSP的任务是验证签名者的身份和签名者在该MSP内的角色。目前,支持两个角色:成员和管理员。 
principal被描述为 MSP.ROLE 其中 MSP 是所需的MSP ID, 
和 ROLE 是 member 或者 admin 。 
有效principle的示例是 ‘Org0.admin’( MSP Org0的任何管理员)或 
‘Org1.member’ (Org1 MSP的任何成员)。

语言的语法是:

EXPR(E[, E…])

其中 EXPR 是 AND 或 
OR 表示两个布尔表达式,并且 E 是principle( 
具有上述语法)或另一个嵌套调用 EXPR 。

例如: 
- AND(‘Org1.member’, ‘Org2.member’, ‘Org3.member’) ,请求3个principle的签名。 
- OR(‘Org1.member’, ‘Org2.member’) 请求两个中的一个的签名。 
- OR(‘Org1.member’, AND(‘Org2.member’, ‘Org3.member’)) ,请求一个来自MSP=red > 
Org1 的签名,或者来自MSP=red > org2 的成员和来自=red > Org3 的成员的签名。

3.2为chaincode指定Endorsement policy

通过使用这种语言,chaincode的开发者可以为一个chaincode指定特定的endorsement策略。 
注意 - 默认策略需要 DEFAULTMSP 成员的一个签名 )。如果在CLI中未指定策略,则使用此选项。

该策略可以在部署时通过键 -P 来指定。

例如: peer chaincode deploy -C testchainid -n mycc 
-p github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02 
-c ‘{“Args”:[“init”,”a”,”100”,”b”,”200”]}’ -P “AND(‘Org1.member’, ‘Org2.member’)”

该命令使用 AND(‘Org1.member’, ‘Org2.member’) 策略,将chaincode 
mycc 部署到链testchain上。

四.Node SDK中实行背书

官方实例balance-transfer使用fabric node sdk构建了一个完整的客户端,实现了CLI的完整功能(包括注册用户、创建channel、加入channel、安装链码、实例化链码),并且提供了REST API。但是在balance-transfer在实例化时并未指定背书策略。但是我们可以在实例化请求的Request对象中加入背书策略。

我们可以构建一个endorsement对象。先看两个例子:

4.1 example

背书策略: "由其中一个组织的任何成员签名"

{

identities: [

{ role: { name: "member", mspId: "org1" }},

{ role: { name: "member", mspId: "org2" }}

],

policy: {

"1-of": [{ "signed-by": 0 }, { "signed-by": 1 }]

}

}

背书策略: "ordererOrg的管理员和一个peer组织的成员签名"

{

identities: [

{ role: { name: "member", mspId: "peerOrg1" }},

{ role: { name: "member", mspId: "peerOrg2" }},

{ role: { name: "admin", mspId: "ordererOrg" }}

],

policy: {

"2-of": [

{ "signed-by": 2},

{ "1-of": [{ "signed-by": 0 }, { "signed-by": 1 }]}

]

}

}

4.2 endorsement对象分析

它有两个高级属性:indentities和policy。

Indentities:在policy中引用的身份列表。

Policy:使用“signed-by”和“n-f”结构组合的策略规范。policy可以是对于单个indentities签名的“signed-by”或是“n-of”。如果类型属性是“sign-by”,则该值是策略中指定的indentities数组的数字索引。如果类型属性是“n-of”,则该值是policy对象的数组。正如所看到的,这个结构允许复杂策略的递归定义。

policy是可选的。如果不指定,那么就将采用默认的背书策略:被来自MSPs内任何组织的任何成员签名。不推荐使用默认策略投入实际生产,因为这允许应用绕过请求背书将一个手动构建的具有任意输出的交易直接发送给orderer。应用程序自己的签名将会允许交易成功验证并提交到账本。

hyperledger fabric共识组件分析 --背书策略的更多相关文章

  1. 浅析Hyperledger Fabric共识算法 摘自http://www.cocoachina.com/blockchain/20180829/24728.html

    Hyperledger Fabric共识算法 区块链系统是一个分布式架构,交易账本信息由各个节点管理,组成一个庞大的分布式账本.在分布式系统中,各个节点收到的交易信息的顺序可能存在差异(例如,网络延迟 ...

  2. Hyperledger Fabric源码分析之Gossip

    Gossip算法正如它的名字,小道消息只需要有人传播一次,那么过一段时间,所有人都会知道,就像新冠病毒一样,所以Gossip算法也有其它的别名"传染病扩散算法"."谣言传 ...

  3. Hyperledger Fabric基础知识

    文章目录 什么是Hyperledger Fabric? Hyperledger架构是怎么工作的? Hyperledger交易如何执行 总结 Hyperledger Fabric基础知识 本文我们会介绍 ...

  4. HyperLedger Fabric Introduction——区块链超级账本介绍

    介绍 HyperLedger Fabric是一个基于模块化架构的分布式账本解决方案平台,它拥有深度加密.便捷扩展.部署灵活及可插拔等特性.它设计之初的目的是支持不同组件的可插拔实现,并适应整个经济生态 ...

  5. Hyperledger Fabric Endorsement policies——背书策略

    背书策略 背书策略用于指导peer如何确定交易是否得到了的认可.当一个peer接收到一个事务时,它会调用与事务的Chaincode相关联的VSCC(验证系统链代码),作为事务验证流程的一部分,以确定交 ...

  6. hyperledger fabric超级账本java sdk样例e2e代码流程分析

     一  checkConfig  Before     1.1  private static final TestConfig testConfig = TestConfig.getConfig() ...

  7. Hyperledger Fabric(2)共识与交易

    Fabric 的网络节点本质上是互相复制的状态机,节点之间需要保持相同的账本状态.为了实现这个目的,各个节点需要通过共识( consensus )过程,对账本状态的变化达成一致性的认同. Fabric ...

  8. 区块链学习7:超级账本项目Fabric中的背书、背书节点、背书策略、背书签名

    ☞ ░ 前往老猿Python博文目录 ░ 在Hyperledger Fabric区块链中,有背书节点进行背书,Hyperledger Fabric 使用背书策略来定义哪些节点需要执行交易. Hyper ...

  9. Hyperledger Fabric(v1.2.0)代码分析1——channel创建

    Hyperledger Fabric(v1.2.0)代码分析1--channel创建 0. e2e_cli Hyperledger Fabric提供了一个e2e的例子,该例中创建了一个基础的区块链网络 ...

随机推荐

  1. 021——VUE中变异方法 push/unshift pop/shift

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  2. [C#]委托实例分析(附源码)

    一直都听说C#中的委托与事件非常重要,都没有什么切身的体会,而这次通过做一个WinForm二次开发的项目才真正感觉到了委托与事件的犀利之处. 1.C#中的事件和委托的作用? 事件代表一个组件能够被关注 ...

  3. 【WebGL】2.基础概念

    引入Three.js <!DOCTYPE html> <html> <head> <title></title> </head> ...

  4. iOS笔记之内存泄露

    非ARC中,对于被autorelease的对象,Leak工具也会视其为泄露,自己知道没问题就行. 今天遇到一个bug,App在XCode调试时没有问题,但在真机安装,退出,再进入时,会出现闪退. 用X ...

  5. Javascript-- jQuery动画篇(2)

    动画效果 前面的 hide/show,slide in/out 其实也具有动画效果,本篇介绍使用 animate()实现自定义动画效果. 基本语法如下: $(selector).animate({pa ...

  6. Linux之sshd服务

    ---恢复内容开始--- ---恢复内容结束--- 一.linux中对服务管理与控制(以sshd为例) 1.什么是服务 可以用来给客户提供相关操作,对自己没有什么好处 2.用什么控制服务 系统初始化进 ...

  7. NorFlash、NandFlash、eMMC比较区别

    快闪存储器(英语:Flash Memory),是一种电子式可清除程序化只读存储器的形式,允许在操作中被多次擦或写的存储器.这种科技主要用于一般性数据存储,以及在电脑与其他数字产品间交换传输数据,如储存 ...

  8. 浅谈js异步

    大家都知道,js是一个单线程的语言(只有一个线程来执行js函数),所以如果某一个函数执行任务耗时比较长的话,就会造成阻塞,使得后续任务一直处于等待状态. 一.阻塞示例 function f1(){ ; ...

  9. 《Drools7.0.0.Final规则引擎教程》第4章 4.6 结果条件

    结果条件 在Java中,如果有重复的代码我们会考虑进行重构,抽取公共方法或继承父类,以减少相同的代码在多处出现,达到代码的最优管理和不必要的麻烦.Drools同样提供了类似的功能.下面我们以实例来逐步 ...

  10. Nginx 作为反向代理优化要点proxy_buffering

    当nginx用于反向代理时,每个客户端将使用两个连接:一个用于响应客户端的请求,另一个用于到后端的访问: 那么,可以从如下配置起步: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 ...