Fabric1.3新功能详细介绍

功能1. 使用Identity Mixer实现MSP

       一种通过使用零知识证明来保持身份匿名和不可链接的方法。工具idexmigen可以在测试环境中生成Identity Mixer凭证。

1.1零知识证明(科普中国)

         零知识证明(Zero—Knowledge Proof),是由S.Goldwasser、S.Micali及C.Rackoff在20世纪80年代初提出的。它指的是证明者能够在不向验证者提供任何有用的信息的情况下,使验证者相信某个论断是正确的。零知识证明实质上是一种涉及两方或更多方的协议,即两方或更多方完成一项任务所需采取的一系列步骤。证明者向验证者证明并使其相信自己知道或拥有某一消息,但证明过程不能向验证者泄漏任何关于被证明消息的信息。大量事实证明,零知识证明在密码学中非常有用。如果能够将零知识证明用于验证,将可以有效解决许多问题

1.2 什么是Idemix

       Idemix是一个加密协议套件,它提供强大的身份验证以及隐私保护功能,如匿名,无需揭示交易者身份即可进行交易,以及不可链接性,即单个身份发送多个交易的能力,而不会泄露交易是通过相同的身份发送的。

Idemix流中涉及三个参与者:用户,发行者和 验证者。

发行者证明一组用户的属性以数字证书的形式发布,以下称为“凭证”。

用户稍后生成拥有凭证的“ 零知识证明 ”,并且还选择性地仅公开用户选择显示的属性。证明,因为它是零知识,不会向验证者,发行者或任何其他人显示其他信息。

1.3 如何将Idemix与Hyperledger Fabric一起使用

要在Hyperledger Fabric中使用Idemix,需要以下三个基本步骤:

发行者:Fabric CA 或者 idemixgen

验证者:Idemix MSP 

用户  :java SDK类org.hyperledger.fabric_ca.sdk.HFCAClient
(例如:IdemixEnrollment idemixEnrollment = hfcaClient.idemixEnroll(x509enrollment, "idemixMSPID1"))

1.3.1 Fabric-ca的安装过程

Fabric-ca在Ubuntu和Centos上面的安装

第一步:安装系统组件包

         sudo apt install libtool libltdl-dev

如果在Centos上面安装,则需要执行命令 yum install libtool libltdl-dev,其他的步骤是一样的。

第二步:下载源代码并编译

         cd $GOPATH/src/github.com/hyperledger

 

         git clone http://gerrit.hyperledger.org/r/fabric-ca

 

         cd $GOPATH/src/github.com/hyperledger/fabric-ca

               查看版本:

               cd fabric-ca/

               git branch -a (切换如:git checkout release-1.3)

         make fabric-ca-server

                   报错:

                   [root@localhost fabric-ca]# make fabric-ca-server

                   Building fabric-ca-server in bin directory ...

                   # github.com/hyperledger/fabric-ca/vendor/github.com/miekg/pkcs11

                   vendor/github.com/miekg/pkcs11/pkcs11.go:26:18: fatal error: ltdl.h: No such file or                 directory

                 #include <ltdl.h>

                  ^

                  compilation terminated.

                   make: *** [bin/fabric-ca-server] 错误 2

解决:

         如果在ubunt操作系统中,只需安装:apt install libltdl3-dev

         如果在centos操作系统中,只需安装:yum install libtool-ltdl-devel

         make fabric-ca-server

         make fabric-ca-client

 

第三步:安装编译好的可执行文件

         cd  $GOPATH/src/github.com/hyperledger/fabric-ca/bin

 

         cp $GOPATH/src/github.com/hyperledger/fabric-ca/bin/* /usr/local/bin

 

         chmod -R 775  /usr/local/bin/fabric-ca-server

         chmod -R 775  /usr/local/bin/fabric-ca-client

 

第四步骤:检查

         fabric-ca-server version

 

         fabric-ca-server version

 

显示版本信息为安装正确。

2.fabric-ca-server的初始化

1.3.2 Fabric-ca-server的初始化

第一步:创建文件夹

mkdir -p /opt/hyperledger/fabric-ca-server

cd $GOPATH/src/github.com/hyperledger/fabric-ca

第二步:服务器初始化

fabric-ca-server服务器初始化的命令如下:

fabric-ca-server init -b admin:adminpw

-b 参数后面的是fabric-ca-server服务器管理账号的用户名和密码

启动fabric-ca-server:

fabric-ca-server start -H /opt/hyperledger/fabric-ca --boot admin:adminpw

1.3.3  Identity Mixer MSP配置生成器(idemixgen)

Fabric CA (version 1.3 or later)Fabric-ca-sever初始化的目录下会生成IssuerPublicKeyIssuerRevocationPublicKey,会在下一步使用。

1.3.4 CA密钥生成

cd $GOPATH/src/github.com/hyperledger/fabric-ca

idemixgen ca-keygen

会在fabric-ca下生成msp目录等

1.3.5 添加默认签名者

生成camsp目录后 ,可以将目录中指定的默认签名者添加到配置

命令例如:idemixgen signerconfig -u OrgUnit1 --admin -e "johndoe" -r 1234
(签名者是组织单元“OrgUnit1”的成员,注册标识为“johndoe”,撤销句柄为“1234”,这是一个管理员)
$ idemixgen signerconfig -h
usage: idemixgen signerconfig [<flags>]
 
Generate a default signer for this Idemix MSP
 
Flags:
    -h, --help               Show context-sensitive help (also try --help-long and --help-man).
    -u, --org-unit=ORG-UNIT  The Organizational Unit of the default signer
    -a, --admin              Make the default signer admin
    -e, --enrollment-id=ENROLLMENT-ID
                             The enrollment id of the default signer
    -r, --revocation-handle=REVOCATION-HANDLE
                             The handle used to revoke this signer

 

功能2. 设置密钥级背书策略

允许每个密钥级的背书策略覆盖默认的链码级背书策略。

 

Fabric1.3版本之前常见的背书策略是:

实例化或者升级chaincode代码时设置的,例如:

peer chaincode instantiate -C <channelid> -n mycc -P "AND('Org1.peer', 'Org2.peer')"
 

peer chaincode instantiate -o  orderer.qklszzn.com:7050 -C roberttestchannel -n r_test_cc6 -v 1.0 -c '{"Args":["init","a","100","b","200"]}' -P "OR      ('Org1MSP.member','Org2MSP.member')"

如果未指定,默认背书策略:
 “OR('Org1.member','Org2.member')”。意思是组织1或组织2的任何成员
  • 'Org0.admin'Org0的任何管理员
  • 'Org1.member'Org1的任何成员
  • 'Org1.client'Org1的任何客户端
  • 'Org1.peer'Org1的任何peer节点

Fabric1.3版本中 shim API 提供了设置和获取背书策略的方法

SetStateValidationParameter(key string, ep []byte) error
GetStateValidationParameter(key string) ([]byte, error)

对于私有数据有如下方法:

SetPrivateDataValidationParameter(collection, key string, ep []byte) error
GetPrivateDataValidationParameter(collection, key string) ([]byte, error)

 

为了帮助设置背书策略并将其编组为验证参数字节数组,shim提供了便利功能,允许智能合约开发人员根据组织的MSP标识符处理背书策略:

type KeyEndorsementPolicy interface {
    // Policy returns the endorsement policy as bytes
    Policy() ([]byte, error)
 
    // AddOrgs adds the specified orgs to the list of orgs that are required
    // to endorse
    AddOrgs(roleType RoleType, organizations ...string) error
 
    // DelOrgs delete the specified channel orgs from the existing key-level endorsement
    // policy for this KVS key. If any org is not present, an error will be returned.
    DelOrgs([]string) error
 
    // DelAllOrgs removes any key-level endorsement policy from this KVS key.
    DelAllOrgs() error
 
    // ListOrgs returns an array of channel orgs that are required to endorse changes
    ListOrgs() ([]string, error)
}

用法:

要为密钥设置背书策略,其中需要两个特定组织来背书密钥更改,将两个组织MSPIDs传递给AddOrgs(),然后调用Policy()以构造背书策略字节数组,传递给SetStateValidationParameter()

功能3. 使用分页查询CouchDB状态数据库

客户端现在可以从智能合约查询中浏览结果集,从而可以支持具有高性能的大型结果集。

分页是通过指定pagesize(单页数据条数)和bookmark(查询起始点),代码如下:

func (t *SimpleChaincode) queryMarblesWithPagination(stub shim.ChaincodeStubInterface, args []string) pb.Response {
 
      //   0
      // "queryString"
      if len(args) < 3 {
              return shim.Error("Incorrect number of arguments. Expecting 3")
      }
 
      queryString := args[0]
      //return type of ParseInt is int64
      pageSize, err := strconv.ParseInt(args[1], 10, 32)
      if err != nil {
              return shim.Error(err.Error())
      }
      bookmark := args[2]
 
      queryResults, err := getQueryResultForQueryStringWithPagination(stub, queryString, int32(pageSize), bookmark)
      if err != nil {
              return shim.Error(err.Error())
      }
      return shim.Success(queryResults)
}

 

功能4. Chaincode为开发人员

作为对用Gonode编写的智能合约的当前Fabric支持的补充。现在支持Java1.3版本将明确可用java进行智能合约的编写。

功能5. 基于peer节点通道的事件服务

基于peer通道的事件服务本身并不是新概念(它首次出现在v1.1),但是v1.3版本标志着旧事件中心的结束。在升级到v1.3之前,使用旧事件中心的应用程序必须切换到新的基于peer通道的事件服务。

 

Fabric1.11.2的版本中 core.yaml中有EventHub相关配置,如下

    # EventHub related configuration

    events:

        # The address that the Event service will be enabled on the peer

        address: 0.0.0.0:7053

 

        # total number of events that could be buffered without blocking send

        buffersize: 100

 

        # timeout duration for producer to send an event.

        # if < 0, if buffer full, unblocks immediately and not send

        # if 0, if buffer full, will block and guarantee the event will be sent out

        # if > 0, if buffer full, blocks till timeout

        timeout: 10ms

 

        # timewindow is the acceptable difference between the peer's current

        # time and the client's time as specified in a registration event

        timewindow: 15m

 

        # Keepalive settings for peer server and clients

        keepalive:

            # MinInterval is the minimum permitted time in seconds which clients

            # can send keepalive pings.  If clients send pings more frequently,

            # the events server will disconnect them

            minInterval: 60s

 

1.3的版本,却没有了EventHub相关配置。

但是并不影响使用,您依然可以通过;

 private static EventHub eventHub;

 private static PeerEvents.Event goodEventBlock;

eventHub = new EventHub("test", "grpc://lh:99", null, null);
goodEventBlock = PeerEvents.Event.newBuilder().setBlock(blockBuilder).build();
BlockEvent be = new BlockEvent(eventHub, goodEventBlock);
channel.registerBlockListener(blockEvent -> {
    log.debug("========================Event事件监听========================");
       try {
           org.getBlockListener().received(execBlockInfo(blockEvent));
                } catch (Exception e) {
                    e.printStackTrace();
                    org.getBlockListener().received(getFailFromString(e.getMessage()));
   }
log.debug("========================Event事件监听结束========================");
});

 

 如果觉得能帮到你,就扫码吧,谢谢!

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值