Hyperledger Fabric 1.3正式版新特性
Fabric在半天前发布1.3版本,参考 https://github.com/hyperledger/fabric/releases 介绍下1.3的新特性,参考 https://hyperledger-fabric.readthedocs.io/en/release-1.3/whatsnew.html
1.MSP新实现方式,使用身份混合器/Identify Mixer
通过使用零知识证明(zero-knowledge proofs), 可实现身份的匿名和不可连接。
开发环境提供了idexmigen的命令行可方便生成身份混合器的证书。
生产环境就要用Fabric CA 1.3了,也要客户端SDK打配合。
Idemix也可用在chaincode的策略上。
整体看来,零知识证明idemix的引入是为了同样安全的前提下减少交互方便使用,需要三方系统或工具的配合,可以作为新的尝试学习,版本稳定估计尚需时日。
具体细节参考https://hyperledger-fabric.readthedocs.io/en/release-1.3/idemix.html
2.支持设置key级别的背书策略
Chaincode/链码级别的背书策略之前我们是在chaincode实例化和更新时才能修改背书策略, 而现在新的shim api接口支持在chaincode编写的时候动态的设置背书策略。
对应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)
对应ep策略结构
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)
}
3.CouchDB作为State DB实现可支持分页
Shim api的接口GetStateByRangeWithPagination, GetQueryResultWithPagination
func (t *SimpleChaincode) getMarblesByRangeWithPagination(stub shim.ChaincodeStubInterface, args []string) pb.Response {
if len(args) < 4 {
return shim.Error("Incorrect number of arguments. Expecting 4")
}
startKey := args[0]
endKey := args[1]
//return type of ParseInt is int64
pageSize, err := strconv.ParseInt(args[2], 10, 32)
if err != nil {
return shim.Error(err.Error())
}
bookmark := args[3]
resultsIterator, responseMetadata, err := stub.GetStateByRangeWithPagination(startKey, endKey, int32(pageSize), bookmark)
if err != nil {
return shim.Error(err.Error())
}
defer resultsIterator.Close()
buffer, err := constructQueryResponseFromIterator(resultsIterator)
if err != nil {
return shim.Error(err.Error())
}
bufferWithPaginationInfo := addPaginationMetadataToQueryResults(buffer, responseMetadata)
fmt.Printf("- getMarblesByRange queryResult:\n%s\n", bufferWithPaginationInfo.String())
return shim.Success(buffer.Bytes())
}
func getQueryResultForQueryStringWithPagination(stub shim.ChaincodeStubInterface, queryString string, pageSize int32, bookmark string) ([]byte, error) {
fmt.Printf("- getQueryResultForQueryString queryString:\n%s\n", queryString)
resultsIterator, responseMetadata, err := stub.GetQueryResultWithPagination(queryString, pageSize, bookmark)
if err != nil {
return nil, err
}
defer resultsIterator.Close()
buffer, err := constructQueryResponseFromIterator(resultsIterator)
if err != nil {
return nil, err
}
bufferWithPaginationInfo := addPaginationMetadataToQueryResults(buffer, responseMetadata)
fmt.Printf("- getQueryResultForQueryString queryResult:\n%s\n", bufferWithPaginationInfo.String())
return buffer.Bytes(), nil
}
更这应该是使用couchdb 的selector, skip,limit,bookmark等语法查询出来的分页.
4.支持Java语言开发chaincode
Shim API算是正式支持Java了, 对于国内开发者应该是个好事,go, node.js的依赖常常受限网络真的让人有点麻烦,Java一般依赖都用Maven,Gradle之类的处理,应该会方便很多,具体内容后面跟进。
5.channel为基础的Peer消息服务
Fabric 1.1之前的消息服务定义为了event hub, 基于各自peer节点通知。 Fabric 1.1只开始支持基于channel级别的消息通知服务,增加通知的可用性,但是向后兼容. Fabric 1.3不再支持event hub了。
新的BYFN也有升级到1.3的例子, 参考 https://hyperledger-fabric.readthedocs.io/en/release-1.3/build_network.html
BTW, 1.2最近是升级到了1.2.1, Java SDK也修复不少bug, 特别是346这个bug挺烦人,应该稳定不少了,推荐升级。
1.3 Java SDK还是快照版本, 如果真用于生产,最好3-6个月出了稳定版再升级吧。
Fabric迭代真算快了的,方向是好的,想把东西做简单和稳定, 好像MSP配置确实不方便。路漫漫兮上下求索,互勉吧。
- 原文作者:Zealot
- 原文链接:https://www.51discuss.com/posts/fabric-1.3-release/
- 版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可,非商业转载请注明出处(作者,原文链接),商业转载请联系作者获得授权。