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的策略上。 id mixer

整体看来,零知识证明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)
}

具体参考 https://hyperledger-fabric.readthedocs.io/en/release-1.3/endorsement-policies.html#key-level-endorsement

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挺烦人,应该稳定不少了,推荐升级。 id mixer

1.3 Java SDK还是快照版本, 如果真用于生产,最好3-6个月出了稳定版再升级吧。

Fabric迭代真算快了的,方向是好的,想把东西做简单和稳定, 好像MSP配置确实不方便。路漫漫兮上下求索,互勉吧。