fabric2.0 概念,fabric网络的形成

读研后被分去了做区块链方向,前段时间一直非常无聊,大概是因为我之前基本上不怎么熟悉区块链,也从来没编写过相关的程序,而区块链里面概念又十分繁多,因此一直在摸鱼去搞docker swarm相关的技术,最近觉得如果再这么混下去,可能研究生毕不了业了,所以决定重新钻研一下区块链相关的技术,在实验室内以联盟链为主要研究目标,最典型的就是fabric了,因此先从概念入手,理清楚重要的概念,然后再看看能不能搞个实战项目,做下来应该会对fabric有更深的了解了。

本文基本上是翻译fabric官方文档,当然不是照着全抄,做了一些总结吧,毕竟把一件事讲的很详细的时候,可能就会显得有些啰嗦了,如果有不确定的地方还是可以参考原文:How Fabric networks are structured

0.区块链网络

为应用提供账本和智能合约(打包为链码)的基础设施。后者用于生成交易,这些交易随后会被分发到各个peer进行记录,应用的用户可能是终端用户或者区块链网络管理员。

在大多数情况下,通道由多个组织形成,通过一个事先配置的背书策略集合来对链码进行调用,此外,策略也可以在各组织同意的情况下改变。

在这里插入图片描述

  • R及颜色代表组织
  • P代表peer节点
  • O代表orderer节点
  • A代表应用
  • CA代表CA设施
  • L代表账本
  • S代表链码
  • CC代表通道配置

1.创建网络

第一步是让各组织对配置的定义达成共识。

在这里插入图片描述

R1、R2和R0都对CC1达成共识,这个信息会被包含在被称为"配置块"的区块中,通常由configtxgen工具从configtx.yaml文件创建而来。

一旦这个配置块存在,一个通道就可以说是逻辑上建立了的,尽管在物理上并没有任何组件加入。配置块包含了可以加入组件和与通道交互的组织的记录,除此之外还有如何达成共识的策略。该文件基本上决定了peer和应用的行为。

这些组织的管理员的定义和标识,必须由和这个组织关联的CA机构创建。

CA签发的证书可以用于为交易签名来证明某个组织为交易结果背书(通过对签名的检验),这也是交易被账本接受的前置条件。由于CA证书的重要性,所以其实在网络中经常有不止一个CA,不同组织通常会使用不同的CA。在图中三个组织有三个不同的CA。

证书到组织成员的映射是通过一个叫MSP(Membership Service Provider)的结构实现的,定义一个组织需要通过创建一个绑定到根CA证书的MSP来实现的,在创建了MSP之后,通道配置才能够通过策略分配特定的权限到组织。

2.加入节点到通道中

在这里插入图片描述

peer上拥有账本和链码,是物理上一个组织到通道的连接点。一个peer可以属于任意多的通道(取决于资源和政策等)

排序服务(ordering service),从应用收集背书的交易,然后把他们排序后加入区块中,再将区块分发到通道中的各peer节点。每个排序服务仅属于一个特定的通道,不同的通道的排序服务是不同的。

在图中,由于通道配置中有R1、R2、R0,因此他们可以将peer和order节点加入到通道中(生产环境中,order节点应当至少有三个)。

通道中每一个节点都应该存储一个账本的副本,图中为L1。可以说L1在物理上被R1(或者R2以及R0)的peer节点P1所有,在逻辑上被通道C1所有。

在排序服务加入到通道中之后,就可以向通道配置中提议和提交更新,但是除此之外就不能在做什么了,要实现更多的功能,应该添加链码到通道中。

3.安装,批准和提交链码

在这里插入图片描述

chaincode安装在peer,然后定义并提交到通道中。

在Fabric中,定义组织如何与账本进行交互的业务逻辑都写在智能合约中,进一步被打包成链码。链码安装在相关的peer节点上,由相关的组织批准,然后提交到通道中。可以看作链码在物理上被peer节点持有,在逻辑上被通道持有。在图中,S5为链码,被安装在所有peer节点上,尽管并不是所有组织都需要安装链码。因为orderer节点不需要提议交易,因此并不需要在其上安装链码。链码的安装、配准和提交也被称为其生命周期。

链码定义中最重要的是背书策略,它定义了在一个交易被接受并加入账本之前必须被哪些组织所背书。这些组织可以是网络中节点的任意一个集合,如果没有定义,则会使用通道中默认的配置,即CC1定义的背书策略。

4.在通道中使用应用

在这里插入图片描述

在智能合约提交之后,客户端APP就可以用链码提议交易了。

和peer和orderer节点一样,应用也有其关联的组织,如图中,A1属于R1,链接到通道C1中。客户端APP通过向背书协议定义的peer节点发送交易提议,这个提议会作为链码的输入,来生成背书交易的回应,向客户端APP返回。

在图中,R1和R2的应用A1和A2就可以通过链码S5在其背书策略下访问账本L1。

5.将组件加入到多个通道中

在本节中,会尝试让R2和R3以及R0形成一个新的通道。

5.1.创建一个新的通道配置

在这里插入图片描述

如图,这里新加入了一个CA3,并由其创建证书和标识等进而创建了组织R3,然后创建了一个包含组织R2、R3和R0的通道配置文件CC2。在CC2创建之后,可以说一个新的通道在逻辑上存在了。

5.2.向新的通道加入组件

在这里插入图片描述

重复之前的步骤,创建通道C2。图中的orderer节点加入了多个通道,但是每个通道都有一个独一无二的排序服务的实例。

R2可以选择新建一个peer节点加入C2或者将P2加入C2,在图中选择了后者,并且选择改造应用A2使其加入C2,此时R2既属于C1,又属于C2。

6.向已经存在的通道中加入新的组织

在这里插入图片描述

  1. 决定R3的角色和权限等,以及R3加入通道后的用途,作为管理员还是普通用户等。
  2. 更新通道,包括相关的链码等。
  3. 组织加入peer节点到通道中并且开始参与通道的交易验证等业务。

在本例中,R3加入到C1中,并且和R1、R2享有相同权限,作为S5的背书执行者加入,所以R1和R2必须重新定义S5,然后在通道中批准它。

需要更新通道配置,到CC1.1,尽管通道配置被更新了,但是并不需要重新加入P1、P2节点等组件。

6.1.向新加入的通道中添加已经存在的组件

在这里插入图片描述

将R3的组件加入到C1中去,此时,P3需要拉取C1的账本,由于已经重新定义了S5,因此现在P3也可以安装链码S5并用于交易,而A3通过修改之后也可以调用C1的链码提议交易了。

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 下面是一个简单的 Hyperledger Fabric 2.0 Go语言链码示例: ``` package main import ( "fmt" "github.com/hyperledger/fabric-chaincode-go/shim" pb "github.com/hyperledger/fabric-protos-go/peer" ) // SimpleChaincode example simple Chaincode implementation type SimpleChaincode struct { } func (t *SimpleChaincode) Init(stub shim.ChaincodeStubInterface) pb.Response { fmt.Println("ex02 Init") _, args := stub.GetFunctionAndParameters() var A, B string // Entities var Aval, Bval int // Asset holdings var err error if len(args) != 4 { return shim.Error("Incorrect number of arguments. Expecting 4") } // Initialize the chaincode A = args[0] Aval, err = strconv.Atoi(args[1]) if err != nil { return shim.Error("Expecting integer value for asset holding") } B = args[2] Bval, err = strconv.Atoi(args[3]) if err != nil { return shim.Error("Expecting integer value for asset holding") } fmt.Printf("Aval = %d, Bval = %d\n", Aval, Bval) // Write the state to the ledger err = stub.PutState(A, []byte(strconv.Itoa(Aval))) if err != nil { return shim.Error(err.Error()) } err = stub.PutState(B, []byte(strconv.Itoa(Bval))) if err != nil { return shim.Error(err.Error()) } return shim.Success(nil) } func (t *SimpleChaincode) Invoke(stub shim.ChaincodeStubInterface) pb.Response { fmt.Println("ex02 Invoke") function, args := stub.GetFunctionAndParameters() if function == "invoke" { // Make payment of X units from A to B return t.invoke(stub, args) } else if function == "delete" { // Deletes an entity from its state return t.delete(stub, args) } else if function == "query" { // the old "Query" is now implemtned in invoke return t.query(stub, args) } return shim.Error("Invalid invoke function name. Expecting \"invoke\" \"delete\" \"query\"") } // Transaction makes payment of X units from A to B func (t *SimpleChaincode) invoke(stub shim.ChaincodeStubInterface, args []string) pb.Response { var A, B string // Entities var Aval, Bval int // Asset holdings var X int // Transaction value var err error ### 回答2: Hyperledger Fabric 是一个开源的区块链平台,可以用于构建企业级的去心化应用程序。而 Hyperledger Fabric 2.0 是其最新版本,引入了许多新特性和改进。 编写一个 Hyperledger Fabric 2.0 的 Go 语言链码需要按照一定的流程进行: 1. 准备开发环境:首先,需要安装 Go 语言的开发环境和 Hyperledger Fabric 的相关工具,如 Hyperledger Fabric SDK 和 Hyperledger Fabric CA。 2. 编写链码逻辑:使用 Go 语言编写链码的逻辑,链码是在 Hyperledger Fabric 上运行的智能合约。可以根据项目需求和业务逻辑定义相关的数据结构和函数。 3. 定义链码接口:需要定义链码接口,包括 Init 和 Invoke 两个核心函数。Init 函数用于链码的初始化操作,而 Invoke 函数用于链码的业务逻辑执行。 4. 部署链码:将编写好的链码部署到 Hyperledger Fabric 网络。可以使用 Hyperledger Fabric SDK 提供的工具和 API 来进行链码的部署操作。 5. 测试链码:编写相应的测试用例,对链码逻辑进行测试。可以使用模拟的 Fabric 网络进行测试,或者与实际的 Fabric 网络交互进行测试。 6. 部署链码应用程序:将编写好的链码应用程序部署到 Hyperledger Fabric 网络上。可以使用 Hyperledger Fabric SDK 提供的工具和 API 来进行链码应用程序的部署操作。 Go 语言是一种高性能的编程语言,适合于开发区块链平台和链码。编写 Hyperledger Fabric 2.0 的 Go 语言链码需要熟悉 Go 语言的基本语法和特性,以及了解 Hyperledger Fabric 的相关知识。通过合理的设计和编码,可以实现各种复杂的业务逻辑和功能。 ### 回答3: 编写一个Hyperledger Fabric 2.0的Go语言链码可以分为以下几个步骤: 1. 准备开发环境:首先,需要在开发机器上安装Go语言和Hyperledger Fabric的相关依赖。可以通过配置Golang环境变量,并使用Golang包管理器安装Fabric的Go SDK。 2. 创建链码项目:使用Go语言的IDE或文本编辑器创建一个新的文件夹,作为链码项目的根目录。 3. 定义链码结构:创建一个新的Go文件,并定义链码结构。链码结构应该实现fabric的Chaincode接口,并实现Init和Invoke两个方法。 4. 实现Init方法:Init方法在链码被实例化时调用,并进行初始化设置。可以在该方法初始化链码的状态数据和其他必要的准备工作。 5. 实现Invoke方法:Invoke方法在链码接收到调用请求时被调用。在该方法处理具体的业务逻辑,并根据请求的操作类型执行相应的操作。 6. 将链码打包:使用Fabric提供的命令行工具将链码打包成压缩文件,以便于后续部署和安装。 7. 部署和安装链码:使用Fabric提供的链码生命周期管理工具,将链码部署到指定的Fabric网络,并安装到指定的通道上。 8. 实例化链码:在指定的通道上实例化链码,使其可以被其他参与方调用。 9. 调用链码:使用Fabric提供的客户端SDK或命令行工具,向链码发送调用请求,验证链码的功能和逻辑是否正确。 10. 测试链码:编写一些测试用例,用于对链码的功能和性能进行验证。 以上是一个简要的步骤,编写Hyperledger Fabric 2.0的Go语言链码还需要进一步了解链码开发的相关知识和Fabric的API,以有效地实现业务逻辑,并与Fabric网络进行交互。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值