hyperledger fabric是区块链中联盟链的优秀实现,主要代码由IBM、Intel、各大银行等贡献,目前v1.1版的kafka共识方式可达到1000/s次的吞吐量。本文中我们依次讨论:区块链的共通特性、fabric核心概念、fabric的交易执行流程。本文来源于笔者欲对公司部分业务上链而进行培训的PPT,故图多文字少,不要怕太长。
区块链核心概念是分布式帐本,就像下面的图1所示,同样的帐本(全量的交易数据,详见下节)在任意一台节点(不包括客户端)上都有。所以,其优点是数据很难造假,造假后也可以通过追溯记录来追究法律责任。而缺点就是极大的浪费,传统服务每份数据都尽量少存几份,即使存了三份拷贝都已经考虑到诸多异常,并使服务可用性达到N个9了。而区块链这种特性,同时造成的另一个问题是帐本不能太大,至少不能超过区块链网络中最小结点的存储以及处理能力。所以,这制约了总交易数据(下文为方便概念介绍,统称为帐本ledger)的条数,进而也影响了能写入区块链的单条交易数据的大小。
图1 区块链分布式帐本示意图
什么是区块链呢?我很喜欢《区块链技术进阶与实战》一书中对它的定义:区块链是一种按照时间顺序将数据区块以顺序相连的方式组合成的一种链式数据结构。如果觉得有点抽象,那么我们再来看看下面的图2。
图2-区块链数据结构示意
图2中就是账本,它由多个区块构成了一个有时序的链表,而每个区块里含有多条交易trasaction(缩写为tx)构成的链表。图2下方有一个WorldState世界状态,这其实是为了提升性能用的。比如,key1共交易了10000次,为了获取它的当前状态值,需要正向执行这10000次交易,这就得不偿失了。如果这1万次交易里,每次新交易执行完,都同步更新一个数据库(在fabric里用的是levelDB),这样查询当前状态时,只需要查询该数据库即可,如图3所示。
图3-fabric levelDB状态数据库
图3中,区块链帐本是在FileSystem文件系统中保存的,而Level DB存放世界状态。
区块链的发展过程中,一般1.0时代就是数字货币时代,代表是比特币,而2.0时代就是智能合约(现在是3.0时代,各种联盟链即为代表)。
智能合约是运行在区块链上的模块化、可重用的自动执行脚本,有了它我们就可以完成复杂的业务逻辑,例如同一个区块链上有多份合约,而每份合约可以约定不同的参与者(企业或者相关方)。也可以指定每份合约里每个子命令做一批特定的事,大家可以把它想象成关系数据库里的事务。如图4所示,我们可以在合约里指定允许哪些企业的节点可以参与到交易流程中来(在fabric里这叫共识策略)。
图4-智能合约图示
在fabric中,智能合约叫做chaincode,它有6个状态,如下所示:
Install → Instantiate → invocable → Upgrade → Deinstantiate → Uninstall.
实际上智能合约就是一段代码,fabric官方认可的是GO语言。首先我们需要把合约代码上传到区块链上,这一步的状态就叫Install。
接着,需要做初始化操作。比如,现在的数据是存放在mysql中的,那么上线时需要用Instantiate把数据迁移至链上,这也算初始化。初始化后,chaincode就进入invocable可调用状态了。
通用我们可以通过CLI命令行或者程序里用SDK调用合约(v1.1前还有RestApi调用,现已放弃)。
联盟链由于跨多家企业、多个地区甚至国家,很难使得合约保持一致的版本,因此,每个合约都有版本号。而版本升级时,就是Upgrade状态。
最后两个状态对应着合约下链。
智能合约可以在供应链等较复杂的业务场景下起到很大的作用,如下面的图5所示:
图5-智能合约技术的应用示意