Fabric学习-区块链网络的形成(2)

1、声明

这是本人的学习笔记,目标不是想要做知识分享,所以整个文章会以笔记形式出现,中间会夹杂我个人的理解和注释。但我不是拒绝分享,有兴趣的可以参考。

而且这些都是基于官方文档的翻译(直接拿google浏览器插件翻译过来的),之所以会放在原创,就是因为这些翻译我会自己去修改那些讲不通的地方,修改的过程也比较花时间,所以就记录下来,避免重复性劳动。

2、前言

上章节学习基于Fabric如何去从零开始搭建一个基础的区块链网络,但只是局限于一个联盟的情况下的最简单的网络,但事实上区块链网络可以有多个联盟多个交易通道的存在,这个文档就在上个文档基础上演示如何增加一个联盟和一个通道,使得区块链网络更加接近实际的使用场景。

3、引进更多联盟和组织参与

3.1 添加新联盟定义

本来网络中存在一个最小联盟X1(包含R1和R2),增加新联盟就需要引入新的组织,假设是R3,我们计划为组织R2和R3提供一个单独的应用程序通道,使它们能够彼此进行交易。该应用程序通道将与先前定义的通道完全分开,因此R2和R3事务可以保持私有。

现在我们为R2和R3新定义一个联盟定义,如下图所示(为了保证新增的变化能够更加清晰的呈现,因此去掉了在上个文章中已经形成的网络连线,只保留重要的网络元素):

组织R1或R4的网络管理员添加了新的联盟定义X2,其中包括组织R2和R3。这将用于为X2定义一个新通道。

现在网络中,组织R1和R2使用X1,组织R2和R3使用X2。而联盟定义X2已添加到网络配置NC4中。

创建新通道需要在网络配置策略NC4中明确标识为具有适当权限的组织,目前只有R1和R4。当然这是基于示例的策略,该策略将可以在网络级别管理资源的组织与可以在通道级别管理资源的组织区分开来。这有助于我们理解为什么Hyperledger Fabric具有复杂的分层策略结构。

我的理解:区块链的管理分为两个层级:第一层是基于全局网络组织管理,通常由网络管理员负责联盟定义的创建、通道定义、创建与授权,这种管理就是基于网路配置NC(我理解NC=Network Config)第二层定义就是基于联盟内部管理,就是对通道内部的维护,这种管理是基于通道配置完成的,通道配置为CC(我理解CC=Channel Config)。我们可以把两种管理分为网络管理和联盟管理。

3.2 新增通道

现在使用这个新的联盟定义X2创建一个新的渠道C2,如下图所示:

使用联盟定义X2为R2和R3创建了一个新的通道C2。该通道具有完全独立于网络配置NC4的通道配置CC2和通道配置CC1。通道C2由R2和R3管理,它们具有CC2中的策略所定义的对C2相同的权限。R1和R4在CC2中均未定义任何权限。

通道C2为联盟X2提供了专用的通信机制。通道配置CC2现在包含管理通道资源的策略,并通过通道C2向组织R2和R3分配管理权限。它仅由R2和R3管理;R1和R4在通道C2中没有权限。例如,通道配置CC2随后可以更新以添加组织来支持网络增长,但这只能由R2或R3完成。

请注意,通道配置CC1和CC2如何保持彼此完全隔离,并与网络配置NC4完全分离。再次,我们看到了Hyperledger Fabric网络的去中心化性质。创建通道C2后,组织R2和R3会独立于其他网络元素来管理它。渠道策略始终保持彼此独立,并且只能由

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
要连接虚拟机区块链网络,需要进行以下步骤: 1. 安装 Hyperledger Fabric 网络,并确保网络正在运行。 2. 下载并安装 fabric-sdk-java。 3. 创建一个 Java 应用程序,并将 fabric-sdk-java 添加到类路径中。 4. 在 Java 应用程序中创建一个 Fabric 客户端对象,并指定连接的节点信息。 5. 使用客户端对象创建一个 Fabric 通道对象,并向通道添加一个或多个对等方和一个或多个排序服务。 6. 在通道对象中定义和安装链码。 7. 使用客户端对象调用链码函数。 下面是一个简单的示例代码,展示如何连接虚拟机区块链网络。 ```java import org.hyperledger.fabric.sdk.*; import org.hyperledger.fabric.sdk.exception.*; public class FabricClient { private HFClient client; private Channel channel; public FabricClient() throws Exception { client = HFClient.createNewInstance(); // 设置连接信息 String peerUrl = "grpc://localhost:7051"; String ordererUrl = "grpc://localhost:7050"; String pemFile = "/path/to/pem/file"; String userName = "user1"; String orgName = "org1"; // 创建一个 Fabric 用户对象 User user = new FabricUser(userName, orgName, pemFile); // 初始化客户端对象 client.setUserContext(user); client.setCryptoSuite(CryptoSuite.Factory.getCryptoSuite()); // 创建一个 Fabric 通道对象 channel = client.newChannel("mychannel"); // 添加对等方节点 Peer peer = client.newPeer("peer1", peerUrl); channel.addPeer(peer); // 添加排序服务节点 Orderer orderer = client.newOrderer("orderer", ordererUrl); channel.addOrderer(orderer); // 初始化通道对象 channel.initialize(); } public String invokeChaincode(String functionName, String... args) throws Exception { // 创建一个链码调用请求对象 TransactionProposalRequest request = client.newTransactionProposalRequest(); ChaincodeID chaincodeID = ChaincodeID.newBuilder().setName("mychaincode").build(); request.setChaincodeID(chaincodeID); request.setFcn(functionName); request.setArgs(args); // 发送链码调用请求并等待响应 Collection<ProposalResponse> responses = channel.sendTransactionProposal(request); for (ProposalResponse response : responses) { if (response.getStatus() != ChaincodeResponse.Status.SUCCESS) { throw new Exception("Chaincode invoke failed: " + response.getMessage()); } } // 提交链码调用事务 channel.sendTransaction(responses); return "Chaincode invoke succeeded"; } } ``` 在这个示例代码中,我们创建了一个名为 FabricClient 的 Java 类,它充当了 Fabric 客户端的角色。在构造函数中,我们初始化了客户端对象,并连接了一个名为 mychannel 的 Fabric 通道。然后,我们定义了一个名为 invokeChaincode 的函数,该函数接受一个链码函数名和一个或多个参数,并将其用作链码调用请求。最后,我们向通道提交了链码调用事务。 要使用这个示例代码,您需要将其添加到一个 Java 应用程序中,并在应用程序中创建一个 FabricClient 对象。然后,您可以使用 FabricClient 对象调用 invokeChaincode 函数来调用链码函数。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值