功能1. 使用Identity Mixer实现MSP
一种通过使用零知识证明来保持身份匿名和不可链接的方法。工具idexmigen可以在测试环境中生成Identity Mixer凭证。
功能1 零知识证明(科普中国)
零知识证明(Zero—Knowledge Proof),是由S.Goldwasser、S.Micali及C.Rackoff在20世纪80年代初提出的。它指的是证明者能够在不向验证者提供任何有用的信息的情况下,使验证者相信某个论断是正确的。零知识证明实质上是一种涉及两方或更多方的协议,即两方或更多方完成一项任务所需采取的一系列步骤。证明者向验证者证明并使其相信自己知道或拥有某一消息,但证明过程不能向验证者泄漏任何关于被证明消息的信息。大量事实证明,零知识证明在密码学中非常有用。如果能够将零知识证明用于验证,将可以有效解决许多问题。
功能2 什么是Idemix?
Idemix是一个加密协议套件,它提供强大的身份验证以及隐私保护功能,如匿名,无需揭示交易者身份即可进行交易,以及不可链接性,即单个身份发送多个交易的能力,而不会泄露交易是通过相同的身份发送的。
Idemix流中涉及三个参与者:用户,发行者和 验证者。
发行者证明一组用户的属性以数字证书的形式发布,以下称为“凭证”。
用户稍后生成拥有凭证的“ 零知识证明 ”,并且还选择性地仅公开用户选择显示的属性。证明,因为它是零知识,不会向验证者,发行者或任何其他人显示其他信息。
功能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"))
功能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为开发人员
作为对用Go和node编写的智能合约的当前Fabric支持的补充。现在支持Java,1.3版本将明确可用java进行智能合约的编写。
功能5. 基于peer节点通道的事件服务
基于peer通道的事件服务本身并不是新概念(它首次出现在v1.1中),但是v1.3版本标志着旧事件中心的结束。在升级到v1.3之前,使用旧事件中心的应用程序必须切换到新的基于peer通道的事件服务。
在Fabric1.1和1.2的版本中 core.yaml中有EventHub相关配置,在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事件监听结束========================");
});
原文链接:https://blog.csdn.net/wh15055768834/article/details/83153096