家蛙树

Hyperledger Fabric基础之账本

Zealot
区块链
2018-08-24

参考https://hyperledger-fabric.readthedocs.io/en/release-1.2/ledger/ledger.html

Ledger记账本是Hyperdger Fabric基础的最后一章。
记账本我们天天都在使用,银行卡,支付宝和微信支付,我们最关心的肯定是账号上的余额了(即资产的当前状态),我想看下昨天我具体花了多少钱花在哪里就需要看交易的流水明细。同理Hyperledger Fabric结构也是类似的,需要记录Asset资产的当前状态和交易的历史。

区块链的账本

区块链的账本包含两部分,world state(世界的状态?整体的状态?)和区块链。

首先是World state 通常使用数据库保存一组账本的当前的状态值,这样就不用遍历所有的交易日志去计算当前的状态值,通常使用key-value键值对表示,状态值可被创建,更新和删除。

其次是区块链,记录着决定world state状态的交易日志。交易的信息会收集起来追加到区块链,一旦写入,就不能修改了。

t_df340f0a9bbd4191af593ce23242b29e.png

World State
World state如上所述,程序和应用更多的时候需要获取账本当前的状态值。

t_9547384530d14781a70f17ab7c2d670f.png

上面的例子, 有两个车, 第一个车CAR1(key值/键值), 它的值是Audi。而CAR2的值就更完善些, 类型是BMW,红色,归属于Jane。两个车的版本号都是0。

账本的状态用于记录在区块链中共享的应用信息,我们可以编写程序调用链码采访这些状态,例如通过key操作(查增删)。

现实中,World state常用数据库实现,数据库对于读取和存储状态都提供了高效的实现,是不是和no-sql中的couchdb, mongodb有点像 :-)

交易保存了World state的变化,它是有生命周期的, 从应用发起到提交到区块链保存为止。 只是交易必须要足够的背书节点签名之后才可以更新world state.

我们注意到CAR的记录都有版本号,状态值变化,版本号就会增加。交易创建的时候会对应到状态的版本号,如果交易记录打包到区块分发到其它节点,其它节点的账本副本发现对应的状态版本变了, 那么这个交易记录认为是无效的。 这个跟我们实际开发中常用的乐观锁的概念是类似的。

区块链

我们学习下区块链的大体结构。 区块链是交易日志,内部连接的区块,每个区块包含一系列的交易,每个交易代表一个查询或更新world state的操作。

每个区块的头部包含了区块所有交易的哈希值,还有上一个区块头部的哈希值,
有点像链表,这样所有的交易就有序的串起来了,也可以保证数据的安全。即使保存账本的一个节点被篡改了,它不能让其它有正确区块记录的记账节点认同。

实际上,区块链于world state不同,通常不使用数据库保存,通常使用文件保存。这是一个合理的设计选择,因为区块链的数据结构偏向于大量的小操作的集合, 区块链追加数据是最常用的操作,而查询频率不高。

t_b90e6341eef0424bbc614013982e48f0.png

上图为例, B0是第一个区块,也称为genesis block创世块,没交易记录,只会保存有通道,orderer,peer等信息,后面我们实际部署配置的时候会用到创世块。

区块

(1)区块头部
头部的数字编号,从0开始递增。
当前区块的哈希值,例如下图的CH2
上一块区块的哈希值, 例如PH1

t_8d7a84d74d294d4887da102aad8c1bc9.png

(2)区块数据段
B2开始保存的都是有序的交易日志。

(3)区块的元数据
包含区块写入的时间戳,证书,公钥,写入者的签名,是否合法的标记位等。

交易
参考下图交易数据的具体结构

t_aef0e81cf7644e7992c25e074098767b.png

(1)头部
即上图H4, 包含交易必要的元数据,例如对应的链码和版本等。

(2)Sinature签名
上图S4, 由客户端应用创建,使用客户的私钥做签名。

(3)Proposal 提议
上图P4, 封装了应用提供给链码使用的输入参数,链码执行,使用这些入参, 与现有world state一起使用,就能计算出新的world state.

(4)响应
R4, 保存world state改变前后的状态值,作为读写的结合。 这个就是链码的响应,如果后面交易验证通过了,账本就按照响应去更新world state状态值。

(5)Endorsements背书记录
E4, 如之前章节所述,更新交易第一步发起提议后,需要背书节点的签名,就在这里记录了。

World State数据库的选择
Hyperledger Fabric当前支持Level DB和CouchDB.
Level DB适合于简单的key-value键值对,嵌入网络的peer节点进程。
CouchDB适合于复杂些的world state状态要用JSON文档表示的场景,提供了更多的富查询特性,与peer节点进程隔离开。
重要的是,Hyperledger Fabric作为state DB实现的level DB或couchDB都是可插拔的设计, 完全可能用其它的关系型数据库或非关系型数据库实现。

基础完结, 后面我们会通过Hyperledger Fabric的入门例子, 实际操作和配置, 使用Go和Nodejs编写联链码。
再之后估计就是学下更方便些的Hyperledger Composer的方式去开发部署区块链。

但是相信有了前面这些核心基础知识, 后面的学习会相对简单很多。技术原本就是苦中作乐的事情,希望大家多些快乐。

点赞 1
0条评论
其他心得
编写过一些链码的人可能会觉得是在操作一个简单的key-value数据库, 就是GetState和PutState去操作键值对,而对复杂些的一对多,多对多等实体关系和数据模型不知怎么设计。我们先从官方的例子入手一起探讨下。 1.简单转账例子 /fabric-samples/chaincode/chaincode_example02/go/chaincode_example02.go 假设链码调用peer chaincode invoke … -c ‘{“Args”:[“invoke”,”a
Zealot · 22天前 
区块链的真实数据依赖于物联网和智能设备,记一次折腾的android无线调试经历。 Android 4.2.2定制版智能硬件, USB口能插鼠标键盘, 但是不能USB调试。供应商两个方案, 要么开壳找到USB OTG排座, USB口自己接线, 但是开壳会导致硬件功能无法使用; 要么手工打包apk安装到硬件慢慢的toast。 摸索出第三条路。 搜索android无线调试, 基本都需要第一次USB调试线, adb tcpip 5555开启android设备端口监听, 之后adb connect ip
武汉珞樱联创Luoying-server和Fabric-REST开源 https://github.com/zealzeng/luoying-server https://github.com/zealzeng/fabric-rest Luoying Server Framework Luoying server是一个轻量级的服务器开发框架,方便开发者快速的定制多种协议的服务器,servlet style的API和简单的容器注入模式让开发者专注于业务实现。 Maven地址
Zealot · 34天前 
Fabric打鸡血了, 1.3正式版发布一个月1.4的RC版出来了,按照惯例在两个月内1.4正式版会发布,我们先预览下新特性。官方文档链接参考 https://hyperledger-fabric.readthedocs.io/en/release-1.4/whatsnew.html 自1.0版本开始, Fabric日渐成熟。1.4版本专注于提高运维和开发的易用性,主要包括两方面。 (1)可维护性和可操作性 1.4大大的改进了日志,服务健康检查和可操作的度量指标, 持续的修复bug和提供系
分享些干货,吸点人气,2018年区块链技术大会的部分PPT放出。建立开源的安全区块链生态系统(PPT下载) http://cbc.dbw.org.cn/documents/%E5%A4%A7%E4%BC%9A%E6%8A%A5%E5%91%8A/%E5%AE%B9%E6%B7%B3%E9%93%AD.pdf企业区块链(PPT下载) http://cbc.dbw.org.cn/documents/%E5%A4%A7%E4%BC%9A%E6%8A%A5%E5%91%8A/%E7%99%BD%E7%