Fabric 2.0 之账本(Ledger)

  参考资料(官方文档):Ledger

Ledger

  在Hyperledger Fabric里面,账本由两个不同但相关的部分组成:世界状态(world state)和区块链(blockchain).
  世界状态数据库保存了账本中最新的值,世界状态使程序可以直接访问当前状态数据库的值,无需遍历所有的交易日志。世界状态可以频繁更改(创建/更新/删除)
  而区块链中记录当前世界状态的所有更改的交易日志,交易是附加到区块内部的,可追溯。区块链的数据结构与世界状态不同,一旦写入无法修改。
在这里插入图片描述
  实际网络中,通过共识维护了一个账本的多个副本。

世界状态(World State)

  世界状态维护了对象的最新值,这是很有用的。无需遍历整个区块链来计算当前的值,从世界状态获取即可。
在这里插入图片描述
  世界状态都会有个版本号,版本号初始为0,每次状态更改时都会递增,同时每次更新时都需要做版本校验。有一点需要注意,当首次创建账本时,世界状态为空,因为任何代表世界状态有效改变的交易都记录在区块链上,意味着随时可以从区块链生成世界状态。例如当节点创建/重启时自动生成世界状态。

区块链(Blockchain)

  区块链通过区块互联顺序记录日志,其中每个区块都会包含一系列交易(世界状态的查询或是更新)。每个区块的头均包含该区块交易的哈希值,以及前一个区块的头的哈希值。

  与使用数据库的世界状态相反,区块链通过文件实现。这是一个明智的设计选择,因为每次追加到区块链的末尾是主要操作,而查询是相对不频繁的操作。
在这里插入图片描述
  如上图所示,区块链中的第一个块称为创世块(genesis block)。 尽管它不包含任何用户交易,但它是账本的开始。

区块(Block)

  如下图所示,每个区块主要包含三个部分:
  区块头:包含三个字段,伴随区块创建写入。

  1. 区块号(Block number):从0(创世块)开始的整数,每次新生成区块时加1
  2. 当前区块哈希(Current Block Hash):当前区块所有交易的哈希
  3. 上一区块哈希(Previous Block Header Hash):上一个区块头的哈希
    在这里插入图片描述

  区块数据(Block Data):按顺序排列的交易(下节介绍)列表。

  区块元数据:包含块创建者的证书和签名,用于通过网络节点验证块。 随后,块提交者将每个事务的有效/无效指示符添加到也驻留在块元数据中的位图中,以及直到(包括)该块为止的累积状态更新的哈希,以检测状态派生。 与块数据和区块头字段不同,此部分不是块哈希计算的输入。

交易(Transaction)

  下图为交易的结构:
在这里插入图片描述
  主要包括以下五部分:

  1. Header:包含交易的一些元数据,例如链码的名称及版本
  2. Signature:包含由客户端应用程序创建的加密签名。 此字段用于检查交易明细是否未被篡改,因为它需要应用程序的私钥来生成它。
  3. Proposal:应用程序提供给智能合约进行模拟账本执行的输入参数的数据结构。
  4. Response: 它是智能合约的输出,如果交易成功通过验证,将更新世界状态,包含了读写集等信息。
  5. Endorsements:各个组织的背书签名,每个组织的签名的都是特定的,当背书签名数量不足,视为无效交易。

世界状态数据库选择

  LevelDB是默认的状态数据库,LevelDB是节点内嵌数据库,适合简单的key-value形式的数据。

  当数据为JSON格式时,CouchDB是一个特别合适的选择,因为CouchDB支持富查询。在实现方面,CouchDB在单独的操作系统进程中运行。
  关于启用CouchDB参考:Fabric启用CouchDB

通道

  前文我们将账本呈现为一个单一的世界状态和单个区块链,但这还是有点过分简化了。 实际上,每个链码都有自己的世界状态,该世界状态与所有其他链码是分开的。 世界状态位于命名空间(namespace)中,因此只有相同链代码内的智能合约才能访问给定的命名空间。

  在Hyperledger Fabric中,每个通道都有一个完全独立的账本。 这意味着完全独立的区块链,以及完全独立的世界状态,包括名称空间。 应用程序和智能合约可以在通道之间进行通信,以便可以在它们之间访问账本信息。

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值