一种通过使用零知识证明来保持身份匿名和不可链接的方法。工具idexmigen可以在测试环境中生成Identity Mixer凭证。
零知识证明(Zero—Knowledge Proof),是由S.Goldwasser、S.Micali及C.Rackoff在20世纪80年代初提出的。它指的是证明者能够在不向验证者提供任何有用的信息的情况下,使验证者相信某个论断是正确的。零知识证明实质上是一种涉及两方或更多方的协议,即两方或更多方完成一项任务所需采取的一系列步骤。证明者向验证者证明并使其相信自己知道或拥有某一消息,但证明过程不能向验证者泄漏任何关于被证明消息的信息。大量事实证明,零知识证明在密码学中非常有用。如果能够将零知识证明用于验证,将可以有效解决许多问题
Idemix是一个加密协议套件,它提供强大的身份验证以及隐私保护功能,如匿名,无需揭示交易者身份即可进行交易,以及不可链接性,即单个身份发送多个交易的能力,而不会泄露交易是通过相同的身份发送的。
Idemix流中涉及三个参与者:用户,发行者和 验证者。
发行者证明一组用户的属性以数字证书的形式发布,以下称为“凭证”。
用户稍后生成拥有凭证的“ 零知识证明 ”,并且还选择性地仅公开用户选择显示的属性。证明,因为它是零知识,不会向验证者,发行者或任何其他人显示其他信息。
要在Hyperledger Fabric中使用Idemix,需要以下三个基本步骤:
发行者:Fabric CA 或者 idemixgen
验证者:Idemix MSP
用户 :java SDK类org.hyperledger.fabric_ca.sdk.HFCAClient
(例如:IdemixEnrollment idemixEnrollment = hfcaClient.idemixEnroll(x509enrollment, "idemixMSPID1"))
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
^
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的初始化
第一步:创建文件夹
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
Fabric CA (version 1.3 or later)在Fabric-ca-sever初始化的目录下会生成IssuerPublicKey和IssuerRevocationPublicKey,会在下一步使用。
cd $GOPATH/src/github.com/hyperledger/fabric-ca
idemixgen ca-keygen
会在fabric-ca下生成msp目录等
生成ca和msp目录后 ,可以将目录中指定的默认签名者添加到配置
命令例如:idemixgen signerconfig -u OrgUnit1 --admin -e "johndoe" -r 1234
(签名者是组织单元“OrgUnit1”的成员,注册标识为“johndoe”,撤销句柄为“1234”,这是一个管理员)
$ idemixgen signerconfig -h
usage: idemixgen signerconfig []
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
允许每个密钥级的背书策略覆盖默认的链码级背书策略。
在Fabric1.3版本之前常见的背书策略是:
实例化或者升级chaincode代码时设置的,例如:
peer chaincode instantiate -C -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的任何成员
在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()。
客户端现在可以从智能合约查询中浏览结果集,从而可以支持具有高性能的大型结果集。
分页是通过指定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)
}
作为对用Go和node编写的智能合约的当前Fabric支持的补充。现在支持Java,1.3版本将明确可用java进行智能合约的编写。
基于peer通道的事件服务本身并不是新概念(它首次出现在v1.1中),但是v1.3版本标志着旧事件中心的结束。在升级到v1.3之前,使用旧事件中心的应用程序必须切换到新的基于peer通道的事件服务。
在Fabric1.1和1.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事件监听结束========================");
});
如果觉得能帮到你,就扫码吧,谢谢!