如何创建一个Hyperledger Fabric channel

创建channel的步骤:

  1. 执行configtxgen tool来生成genesis block;
  2. 执行configtxgen tool来生成初始二进制配置定义;
  3. 通过以下两种方式获取sign-able channel定义:1)使用初始二进制channel配置定义—使用fabric-client SDK从初始二进制配置定义中解析出sign-able channel定义;2)建立一个定制的定义—使用configtxlator将初始二进制channel配置定义转换成可读文本—编辑可读文本—使用configtxlator将可读文本转换成sign-able channel定义。
  4. 使用fabric-client SDK签署sign-able channel定义;
  5. 使用fabric-client SDK将签名与sign-able channel定义发送给orderer;
  6. 使用fabric-client SDK将peer加入到channel;
  7. 新channel可以使用。

使用初始定义来建立sign-able channel定义

初始二进制channel配置定义由configtxgen tool生成,是包含Hyperledger Fabric配置protobuf common.Envelope的二进制元素,在这个元素里面的是common.ConfigUpdate protobuf元素。这个配置元素是必须被签署的元素之一。configtx.yaml中的元素轮廓是初始化二进制channel配置定义的源(由configtxgen tool生成)。

../../../bin/configtxgen -channelID mychannel -outputCreateChannelTX mychannel.tx -profile TwoOrgsChannel

令fabric-client SDK解析对channel.tx文件的配置更新元素:

//首先读取文件,获得二进制配置信封
let envelope_bytes = fs.readFileSync(path.join(__dirname, ‘fabric-samples/balance-tranfer/artifacts/channel/mychannel.tx‘));
//令nodeSDK解析此配置更新
var config_update = client.extractChannelConfig(envelope_bytes);

此二进制config_update现在可以被用于签署过程并被发送到orderer,用于创建channel。

common.ConfigUpdate对于创建与更新执行相同的过程,只不过创建对应于系统channel,而更新对应于channel。提交的common.ConfigUpdate对象只会包含创建与更新的变化。

创建定制的sign-able channel定义

最简单的方式上手创建定制的channel配置的方式是使用configtxlator将一个已存在的二进制转换为可读的JSON文件。使用你建立Hyperledger Fabric网络时采用的configtx.yaml文件,使用configtxgen tool生成新channel的初始二进制配置定义。然后通过将该二进制发送给configtxlator来转换为JSON。此JSON也可以作为创建其他新channel的模板,一个新的channel会继承系统channel的设置,且任何organization加入新的channel必须在系统channel中定义为一个consortium,因此拿到可读的系统channel定义对于创建新channel很有帮助。还可以将genesis.block发送给configtxlator得到JSON文件来作为参考。

使用configtxgen tool来生产二进制配置文件。例如对于样例目录fabric-samples/balance-transfer/artifacts/channel

export FABRIC_CFG_PATH=$PWD
../../../bin/configtxgen -outputBlock genesis.block -profile TwoOrgsOrdererGenesis
../../../bin/configtxgen -channelID mychannel -outputCreateChannelTx mychannel.tx -profile TwoOrgsChannel

将这两个二进制文件发送至configtxlator服务,由于这一步只会进行一次且不需要Nodejs应用,我们使用cURL进行简化并加速以获得结果。注意configtxlator服务路径具有decode(将二进制转换为JSON),这个路径必须包含二进制对象的类型,在第一种情况下,它是common.Block。“decode”与“encode”可以被fabric-client/lib/protos目录下protobuf文件的任何protobuf消息对象类型完成。首先在fabric-samples/bin启动configtxlator服务:

curl -X POST --data-binary @genesis.block http://127.0.0.1:7059/protolator/decode/common.Block > genesis.json
curl -X POST --data-binary @mychannel.tx http://127.0.0.1:7059/protolator/decode/common.Envelope > mychannel.json

解码mychannel.tx的是一个common.Envelope,解码后包含一个common.ConfigUpdate对象。此对象位于“payload.data”的名为“config_update”的JSON对象。是作为创建新channel模板的源需要的对象。common.ConfigUpdate会被所有organization签署并提交给orderer来创建新的channel。

接下来是从TwoOrgsChannel解析的JSON“config_update”(common.ConfigUpdate)对象:

{
  "channel_id": "mychannel",
  "read_set": {
    "groups": {
      "Application": {
        "groups": {
          "Org1MSP": {}
        }
      }
    },
    "values": {
      "Consortium": {
        "value": {
          "name": "SampleConsortium"
        }
      }
    }
  },
  "write_set": {
    "groups": {
      "Application": {
        "groups": {
          "Org1MSP": {}
        },
        "mod_policy": "Admins",
        "policies": {
          "Admins": {
            "policy": {
              "type": 3,
              "value": {
                "rule": "MAJORITY",
                "sub_policy": "Admins"
              }
            }
          },
          "Readers": {
            "policy": {
              "type": 3,
              "value": {
                "sub_policy": "Readers"
              }
            }
          },
          "Writers": {
            "policy": {
              "type": 3,
              "value": {
                "sub_policy": "Writers"
              }
            }
          }
        },
        "version": "1"
      }
    },
    "values": {
      "Consortium": {
        "value": {
          "name": "SampleConsortium"
        }
      }
    }
  }
}

使用的Consortium名字必须存在于系统channel。所有想要加入新channel的organization必须定义在Consortium名下。使用解码后的genesis.block来验证所有值,例如查看上文生成的genesis.json,要想加入一个organization,其必须被放在“Application”下的“group”下,可见Org1MSP是Application.groups的一个属性。此节中所有关于organization Org1MSP的设置都会继承自系统channel(organization属性的空对象{})要查看当前organization的设置的话查看系统channel中Consortium下的SampleConsortium(系统channel的genesis block)。

当你有了你channel的JSON配置文件后,将其发送给configtxlator编码为配置二进制。下面的例子是使用Nodejs包superagent(http请求比较容易)发送一个REST request给configtxlator。

var response = superagent.post(‘http://127.0.0.1:7059/protolator/encode/common.ConfigUpdate‘, config_json.toString())
  .buffer()
  .end((err, res) => {
    if(err) {
      logger.error(err);
      return;
    }
    config_proto = res.body;
  });

签署并提交channel更新

二进制配置必须被所有organization签署。应用需要保存此二进制配置并令其能够被所有签名签署并收集且保存所有签名。因此当签名结束时,应用将二进制配置与所有签名一起发送给orderer通过fabric-client SDK API createChannel()。

首先签署,假设client fabric-client SDK对象在已知organization中有一个有效用户:

var signature = client.signChannelConfig(config_proto);
signatures.push(signature);

现在是时候进行channel创建了,假设client.signChannelConfig()方法返回的signature对象是common.ConfigSignature的一个排列。

注意:orderer必须起始于genesis.block

//创建一个orderer对象代表网络中的orderer
var orderer = client.newOrderer(url,opts);

// 令SDK生成一个交易id
let tx_id = client.newTransactionID();

request = {
  config: config_proto, //二进制配置
  signatures : signatures, // 收集的签名
  name : ‘mychannel‘, // channel名
  orderer : orderer, //上文的orderer
  txId  : tx_id //生成的交易id
};

// 此调用返回一个Promise
client.createChannel(request)

createChannel API返回一个Promise来返回提交的状态码。创建channel的过程会在orderer中异步发生。

一小段时间后channel会被成功创建且可以加入peers。channel要求向peers发布以下内容,这是一个两步的过程:第一步获取channel的genesis block,然后将其发送给peer。下面的例子中genesis block既可以从orderer中提取,也可以从文件加载:

// 为网络节点启动channel
var orderer  = client.newOrderer(orderer_url,orderer_opts);
channel.addOrderer(orderer);
var peer = client.newPeer(peer_url,peer_opts);
channel.addPeer(peer);

tx_id = client.newTransactionID();
let g_request = {
  txId :     tx_id
};

// 从orderer中获取genesis block
channel.getGenesisBlock(g_request).then((block) =>{
  genesis_block = block;
  tx_id = client.newTransactionID();
  let j_request = {
    targets : targets,
    block : genesis_block,
    txId :     tx_id
  };

  // 将genesis block发送给peer
  return channel.joinChannel(j_request);
}).then((results) =>{
  if(results && results.response && results.response.status == 200) {
    // 加入成功
  } else {
    // 不成功
  }
});
时间: 2024-12-18 14:58:47

如何创建一个Hyperledger Fabric channel的相关文章

HyperLedger Fabric Introduction——区块链超级账本介绍

介绍 HyperLedger Fabric是一个基于模块化架构的分布式账本解决方案平台,它拥有深度加密.便捷扩展.部署灵活及可插拔等特性.它设计之初的目的是支持不同组件的可插拔实现,并适应整个经济生态系统中存在的复杂性和高精度性. HyperLedger Fabric与其它的区块链平台解决方案相比,提供了一种独特的扩展便捷和灵活部署的架构.它更多的适用于联盟链形式,即适合企业级之间的区块链联盟方向,建立在可信任的基础上.如果是企业级区块链部署的话,建议可以采用HyperLedger Fabric

Hyperledger Fabric on SAP Cloud Platform

今天的文章来自Wen Aviva, 坐Jerry面对面的程序媛. Jerry在之前的公众号文章<在SAP UI中使用纯JavaScript显示产品主数据的3D模型视图>已经介绍过Aviva了,SAP成都C4C开发团队中其他同事评价她为:"美腻与智慧的化身","云时代女王","是大家前沿技术的引路人".因为Jerry和Aviva就在一个组,所以我的看法是,这些评价都实至名归. 比如Jerry了解到的Javascript 3D渲染,增强现

Hyperledger Fabric CA User’s Guide——概述(二)

概述 下面的图表说明了如何将Hyperledger Fabric CA与总体的Hyperledger Fabric结构相匹配. 有两种方式与一种Hyperledger Fabric CA服务器进行交互:通过Hyperledger Fabric CA的客户端或通过任意一种Fabric的SDKs.所有与Hyperledger Fabric CA服务器的通信都是通过REST api进行的.有关这些REST api的swagger文档,请参见fabric-ca/swagger/swagger-fabri

Hyperledger Fabric 建立一个简单网络

p { margin-bottom: 0.25cm; line-height: 120% } Building you first network 网络结构: 2个Orgnizations(每个Org包含2个peer节点)+1个solo ordering service 打开fabric-sample下的示例first-network p { margin-bottom: 0.25cm; line-height: 120% } 其中byfn.sh为启动这个网络的启动脚本,启动脚本中除建立一个包含

Hyperledger Fabric 1.0 从零开始(六)——创建Fabric多节点集群

4:创建Fabric多节点集群 4.1.配置说明 首先可以根据官方Fabric自带的e2e_cli列子中的集群方案来生成我们自己的集群,与案例不同的是我们需要把容器都分配到不同的服务器上,彼此之间通过网络来进行通信,网络构建完成后则进行相关的channel和chaincode操作. 笔者目前申请了五台服务器,所有的服务器均是按照上述e2e_cli环境构建与测试步骤配置.计划其中四台服务器运行peer节点,另外一台服务器运行orderer节点,为其它四个节点提供order服务. 虚拟机具体参数如下

如何编写一个企业级Hyperledger Fabric开源框架

Convector(a.k.a Convector Smart Contracts)是为企业区块链框架构建的JavaScript开发框架.它增强了开发体验,同时帮助开发人员创建更强大,更安全的智能合约系统.它通过链代码和后端一直到前端,允许开发人员以库的形式重用相同的代码库.它基于模型/控制器模式,支持Hyperledger Fabric,并沿着Fabric精心设计的模式本地运行. 这篇博客文章介绍了该项目的历史,并重点介绍了沿途开发的挑战和解决方案. 当我们开始研究Tellus时,一切都开始了

Hyperledger Fabric 架构梳理

区块链的数据结构 State数据结构 由peer维护,key/value store Ledger  记录了所有成功和不成功的状态更新交易.Ledger被ordering service构造,是一个全排序的交易区块(有效的和无效的)哈希链. Ledger存储在peer节点和orderer的一个子集里.存储在peer上的Ledger和存储在Orderer上的Ledger不同地方在于peer上的Ledger在本地维护一个位掩码(比特位)用来区分有效交易和无效交易. PeerLedger在v1后续版本

Hyperledger Fabric 1.0 从零开始(五)——运行测试e2e

3:运行测试e2e 3.1.运行fabric-samples的问题说明 该问题说明能够解决6.1.平台特定使用的二进制文件配置第一步的问题.可以选择继续阅读该说明,或者等参考到6.1小节时再反向阅读本说明,具体在6.1中会重新指向本步骤. 一般情况下,我们会参照官网来完成第一个网络测试,在该在线文档中会让我们去下载一个fabric-samples,下载地址在github上,我们需要将其下载至本地是一个fabric-samples-release文件夹,将其更名为fabric-samples随后上

Hyperledger Fabric 1.0 从零开始(一)——吐槽

在HyperLedger/Fabric发布0.6的时候,公司就已经安排了一个团队研究这一块,后来也请IBM的专家组过来培训了一批人,不幸的是,这批人后来全走了,然后没过多久1.0就发布了.自从2017年7月HyperLedger/Fabric发布了1.0正式版后(可以参考:Hyperledger Fabric 1.0发布:基于区块链的开源分布式账本),公司领导就更加关注这个领域.然后,就安排我一个人来接手,我主要是做Android和iOS方向的开发,偶尔客串一下java后台服务开发,对linux