Hyperledger Fabric 1.3正式版新特性

Zealot
区块链
2018-10-11

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

t_a7d06e68f63c4fecb7891f57b99496cc.png

整体看来,零知识证明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挺烦人,应该稳定不少了,推荐升级。

t_5145268cd9ea43b8b1d8d12fbd0e050b.png

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

Fabric迭代真算快了的,方向是好的,想把东西做简单和稳定, 好像MSP配置确实不方便。

路漫漫兮上下求索,互勉吧。

t_cadee59e05d146b89cc7d5c7284e37eb.png

点赞 0
0条评论
其他心得
Zealot · 271天前 
1.简介 Fabric CA基于开源项目CFSSL开发, 主要为fabric网络提供PKI证书服务,是MSP生成的基础。可能有人会问, 官方不是有cryptogen工具批量生成MSP吗? cryptogen实际是辅助测试工具,默认不同orderer,org都有不同的CA, 如果一个org要追加个peer或user, cryptogen就不管用了。生产环境我们建议使用fabric ca全面管理证书, 如果想简单来而区块链组织,节点和用户基本不会变, cryptogen也没问题。 2.
Zealot · 168天前 
去年得知蚂蚁金服放出SOFA的部分开源项目, RPC部分号称源于阿里内部的HSF, HSF当年可是把dubbo 1.x踢出局的, 只是没想到京东改造dubbo为JSF, 当当改为dubbox。国内蛮多电商公司实施服务化就直接上dubbo 1.x或dubbox。这应该是阿里没想到的, 所以现在dubbo 2.x又回笼为apache的顶级项目, 把dubbox合并还继续完善。 朋友说他们公司花了千万买了SOFA的商业版, 那么值钱的东西今天抽空过了一下开源部分的SOFAStack和dubbo2.x文档
Zealot · 177天前 
Fabric 1.4.1引入Raft排序服务, 运维界比较出名的etcd实现的orderer服务。后生可畏, etcd是中国一个年轻人的作品, 实现了raft协议, 在k8s等容器化, 虚拟化, 集群化有官方应用。etcd也是go语言编写, fabric开窍了, 直接把etcd和orderer整合了, 相比kafka/zookeeper的排序服务,搭建简单多了,也比kafka这些省了很多资源(kafka默认开的堆是2GB..), 所以个人是强烈推荐使用,尽量出来不久,但在1.4LTS维护,
Luoying web framework Luoying web framework contains a bundle of components to accelerate J2EE development Github地址 https://github.com/zealzeng/luoying-web Maven地址 <dependency> <groupId>com.whlylc</groupId> <artifac
Zealot · 185天前 
Hyperledger Fabric v2.0 Alpha引入两大新功能,新的Fabric链码生命周期和FabToken. 新的链码生命周期 2.0支持链码的去中心化的治理,引入新的流程在节点上安装链码,在通道上启动实例。新的链码生命周期允许多个组织对链码的参数协同达成一致,例如链码的背书策略。新的模型的改进点如下: (1) 多个组织必须确认同意链码的参数 1.x版本里,一个组织拥有修改链码参数的能力,例如修改背书策略,通道的其它成员也被同步而更改。新的链码生命周期更灵活一些,它兼容支