理想论坛_专业20年的财经股票炒股论坛交流社区 - 股票论坛

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 2495|回复: 0

Hyperledger Fabric链码作为外部服务

[复制链接]

9650

主题

9650

帖子

2万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
28966
发表于 2019-12-27 11:41 | 显示全部楼层 |阅读模式
链码作为内部办事

Fabric v2.0支持链码在Fabric情况外安排和尝试。答利用户治理与节点连结自力的链码运转。这类计划激励了Fabric中的链码云安排,例如Kubernetes。取代了在每一个节点上面构建与运转链码。链码可以作为一个办事运转,它的生命周期将可以在Fabric情况外举行治理。这类步伐操纵Fabirc v2.0的内部构建和运转功用。其功用具有答应操纵者经过步伐构建,运转,发现链码对节点举行扩大。在读取本文内容之前,应当对内部构建与扩大较为熟悉。
在内部构立功用可以操纵之前,链码包内容要求指定的编程说话的源代码举行构建并作为链码二进制文件运转。新的内部构建和运转功用答利用户有挑选地定制化构建进程。将链码作为内部办事运转。构建进程答应指定链码运转办事的端点信息。是以包内容可以简单地由内部链码运转办事端点信息和用于平安通讯的TLS归档组成。TLS是可选的,可是除了简单的测试情况之外,狠恶倡议全数情况都操纵TLS。
接下来的部分将描摹怎样将链码设备为内部办事:
打包链码

经过Fabric V2.0版本的chaincode lifecycle,链码可以被打包并以.tar.gz格式举行安装。下面的myccpackage.tgz归档说大白要求的结构:
  1. tar xvfz myccpackage.tgzcode.tar.gzmetadata.json
复制代码
code.tar.gz归档要求

code.tar.gz归档必须包含链码端点的毗连信息。该信息将在/bin/release步伐处打包进connection.json(见下面)。在这里间接将connection.json打包进code.tar.gz,所以release步伐可以间接从这里复制。

  • address -可以被peer节点拜候的链码办事端点,必须指定以:格式。
  • dial_timeout -等待毗连完成的间隔时候,字符串典范并需要指定单元,如"10s","500ms","1m",默以为"3s".
  • tls_required -能否操纵TLS加密。假如为false则不要求操纵下面四个属性
  • client_auth_required -假如为true则需如果定客户端权限认证的key_path,cert_path.默以为false.
  • key_path -秘钥文件的途径
  • cert_path -证书文件的途径
  • root_cert_path -根证书文件途径。
例如:
  1. {  "address": "your.chaincode.host.com:9999",  "dial_timeout": "10s",  "tls_required": true,  "client_auth_required": "true",  "key_path": "path/rooted/in/release/directory/key.pem",  "cert_path": "path/rooted/in/release/directory/cert.pem",  "root_cert_path": "path/rooted/in/release/directory/rootcert.pem"}
复制代码
TLS文件可以放在code.tar.gz归档的任何地方,由于.tar.gz文件夹内的文件内容将会供给给内部链码构建剧本。bin/release剧本,将会将文件移动到合适的位置。
metadata.json文件要求

当操纵链码作为内部办事时,需要在metadata.json文件中设备type字段,为了指定操纵的是内部办事,例如:
  1. {"path":"","type":"external","label":"mycc"}
复制代码
设备节点对内部链码举行处置惩罚

这个进程和内部构建与扩大先容的内容是类似的。操纵这些脚本来界说内部链码信息。这些剧本位于peer节点的文件系统而且可以拜候并处置惩罚peer节点处的core.yaml文件中chaincode部分界说的externalBuilders元素。
建立peer节点上的内部构建器和运转器剧本

为了设备链码作为内部办事,必须操纵以下剧本文件:

  • detect -检测metadata.json文件中type能否设备为external并继续链码包。
  • build -构建链码并将构建的归档放置在BUILD_OUTPUT_DIR位置。剧本提取connection.json文件中的链码端点信息并将code.tar.gz文件中的其他归档文件放置在指定位置。
  • release -拷贝被构建的归档(在connection.sjon文件中)到指定位置。
留意到对于链码作为内部办事,没有要求内部构建器和运转器bin/run剧本。
剧本文件要求存在peer节点的文件夹内:
  1.         └── bin        ├── build        ├── detect        └── release
复制代码
使peer节点的core.yaml文件包含externalBuilder

末端,为了让peer节点可以也许操纵内部构建器和运转器剧本,需要点窜位于peer节点的core.yaml文件中的chaincode部分,使它包含externalBuilder设备元素。
  1. externalBuilders:     - name: myexternal       path:  #就是上面的那个途径
复制代码
内部构建和运转的剧本文件模板

为了帮助大白在链码作为内部办事时,每一个剧本需要包含哪些工作,这一部分包含bin/detect,bin/build,bin/release剧本示例。
这些例子操纵jq命令对json个数数据举行转换,可以经过运转jq --version检查能否安装该工具。否则,需要安装jq大要对剧本文件举行得当的点窜。
/bin/detect

bin/detect剧本的职责是决议能否操纵buildpack对链码包举行构建和运转。对于链码作为内部办事,剧本需要检测metadata.json文件中的type能否被设备为external。peer节点经过两个参数挪用该剧本:
  1. bin/detect CHAINCODE_SOURCE_DIR CHAINCODE_METADATA_DIR
复制代码
一个典范的detect剧本应当包含:
  1. #!/bin/bashset -euo pipefailif [ "$#" -ne 2 ]; then    >&2 echo "Expected 2 directories got $#"    exit 2fi#检测`type`能否被设备为`external`if [ "$(jq -r .type "$2/metadata.json")" == "external" ]; then    exit 0fiexit 1
复制代码
metadata.json文件应当包含以下关键点:
  1. {"path":"","type":"external","label":"mycc"}
复制代码
/bin/build

bin/build剧本的职责是构建,编译,以及转换链码包内容到可以被release和run操纵的归档中。对于链码作为内部办事,该剧本拷贝connection.json文件到BUILD_OUTPUT_DIR.peer节点经过三个参数挪用该剧本:
  1. bin/build CHAINCODE_SOURCE_DIR CHAINCODE_METADATA_DIR BUILD_OUTPUT_DIR
复制代码
一个典范的build剧本应当包含:
  1. #!/bin/bashset -euo pipefailif [ "$#" -ne 3 ]; then    >&2 echo "Expected 3 directories got $#"    exit 1fiSOURCE=$1OUTPUT=$3#检查connection.json文件能否存在if [ ! -f "$SOURCE/connection.json" ]  ; then    >&2 echo "$SOURCE/connection.json not found"    exit 1fi#假如需要的话在这里做更多考证#简单拷贝端点信息到指定的输出位置cp $SOURCE/connection.json $OUTPUT/connection.jsonexit 0
复制代码
/bin/release

bin/release剧本的职责是为peer节点供给链码元数据。对于链码作为内部办事,bin/release剧本感化是为peer供给放置在RELEASE_OUTPUT_DIR位置的connection.json文件。peer节点经过两个参数挪用该剧本:
  1. bin/release BUILD_OUTPUT_DIR RELEASE_OUTPUT_DIR
复制代码
一个典范的release剧本应当包含:
  1. #!/bin/bashset -euo pipefailset -xif [ "$#" -ne 2 ]; then    >&2 echo "Expected 2 directories got $#"    exit 2fiBLD="$1"RELEASE="$2"#内部链码渴望归档被放置在"$RELEASE"/chaincode/server途径下if [ -f $BLD/connection.json ]; then   mkdir -p "$RELEASE"/chaincode/server   cp $BLD/connection.json "$RELEASE"/chaincode/server   exit 0fiexit 1
复制代码
编写链码作为内部办事运转

当前,将链码作为内部办事运转模板只支持GO说话链码shim.在Fabric v2.0,Go shim API增加了ChaincodeServer典范。斥地者可以操纵它建立链码办事。Invoke和QueryAPI不受影响。斥地者需要写shim.ChaincodeServerAPI,然后挑选构建链码并在内部情况中运转。这里有一个简单的链码步伐模板用来说明这类形式:
  1. package mainimport (        "fmt"        "github.com/hyperledger/fabric-chaincode-go/shim"        pb "github.com/hyperledger/fabric-protos-go/peer")// SimpleChaincode 模板简单链码实现type SimpleChaincode struct {}func (s *SimpleChaincode) Init(stub shim.ChaincodeStubInterface) pb.Response {        // 初始化代码}func (s *SimpleChaincode) Invoke(stub shim.ChaincodeStubInterface) pb.Response {        // 挪用代码}//NOTE - ccid 和端点信息参数很难在这里编码说明,可以经过量种标准方式指定func main() {       //ccid 筹划用来安装链码实例 (操纵“peer lifecycle chaincode install ” 命令) for instance        ccid := "mycc:fcbf8724572d42e859a7dd9a7cd8e2efb84058292017df6e3d89178b64e6c831"        server := &shim.ChaincodeServer{                        CCID: ccid,                        Address: "myhost:9999"                        CC: new(SimpleChaincode),                        TLSProps: shim.TLSProperties{                                Disabled: true,                        },                }        err := server.Start()        if err != nil {                fmt.Printf("Error starting Simple chaincode: %s", err)        }}
复制代码
将链码作为内部办事运转关键的是操纵shim.ChaincodeServer.操纵的新的链码办事shimAPIshim.ChaincodeServer属性描摹以下:

  • CCID(string):CCID应当婚配peer节点上的链码包。CCID与被安装的链码关联,在操纵peer lifecycle chaincode install CLI命令返回。这可以在安装后操纵peer lifecycle chaincode queryinstalled命令获得。
  • Address(string):链码办事的监听地址。
  • CC(Chaincode):处置惩罚初始化和挪用的链码
  • TLSProps(TLSProperties):链码办事的TLS属性。
  • KaOpts(keepalive.ServerParameters):连结毗连选项,默以为空
安排链码

当GO说话链码预备好安排后,可以经过Packageing chaincode部分表白的内容对链码举行打包。并经过chaincode lifecycle部份内容对链码举行安排。
将链码作为内部办事运转

按照指定的编写链码作为内部办事运转部分建立链码,并挑选构建可运转的链码情况如Kubernetes大要间接在peer主机上运转。
操纵链码作为内部办事模板,将不再要求在每一个节点上安装链码。当链码端点在peer节点上安排并运转后,可以继续一般地实例化和挪用链码。

免责声明:假如加害了您的权益,请联系站长,我们会实时删除侵权内容,感谢合作!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|理想论坛_专业20年的财经股票炒股论坛交流社区 - 股票论坛

GMT+8, 2020-7-12 18:50 , Processed in 0.173358 second(s), 28 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表