家蛙树

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 · 38天前 
对于Fabric的权限和MSP配置这块,可能大家实际部署会给一堆msp目录绕晕,我们回过头来梳理一下。 1.Peer节点如何控制用户的采访权限?我们以first-network为例, 先看下peer0的启动配置docker-compose-cli.yaml。 引用到base/docker-compose-base.yaml peer0.org1.example.com: container_name: peer0.org1.example.com extends: fi
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), 可实现身份的匿名和不可连接。 开发环境提供了
Zealot · 88天前 
Hyperledger Fabric当前最新版本为1.2, 自行参考官方安装文档 https://hyperledger-fabric.readthedocs.io/en/release-1.2/prereqs.html 以Centos7安装为例, 简单说明注意事项。 1.安装或更新curl yum install curlyum update curl保证尽量新的版本, 后面步骤安装脚本使用curl下载文件 2.docker安装 (1)Docker CE安装参考官
Zealot · 52天前 
1.基于Hyperledger Cello Cello的定位是为Fabric提供一个BaaS平台,使用Web UI方便的管理区块链网络,节点和链码。 理想丰满,希望兼容K8s,swarm等多容器,提供了安装网络,简单监控,安装链码,调用等基本功能,可惜bugs一堆,又得兼顾Fabric快速迭代的版本。还有一点,以docker为例,实际Work Node使用remote docker访问模式,需要在Master的管理平台手工输入所有的worker node ip和端口,有些维护
1.Consistency 一致性 一致性是分布式系统需要解决的基础问题,一致性是对外呈现的一致的状态或结果,一致性为什么很重要,举个扫码支付的例子。 小明到商场想玩夹娃娃机,他爸爸扫码支付了10元,娃娃取币机正常情况下需要弹出10个币,假设取币机出了问题,没接收到支付成功的通知,没弹出币就让人抓狂了。两个系统中订单状态不一致了,支付系统认为是支付成功,娃娃取币机认为订单待支付。 1.1一致性模型 一致性的模型定义,只列出一些常见的,一起学习研究。(1)Strict Consist