(包括项目的主要内容、计划目标、思路方法、组织实施、进度安排等)
区块链是利用密码学、共识机构、智能合约等技术共同实现的多方可信、不可篡改、可追溯的分布式账本[2] 。一定程度上实现了不依赖权威中心的信任机制和价值传递机制,甚至被称为“信任的机器”、“价值互联网”。目前,各个行业都在积极地研究区块链技术,探索区块链与业务的进一步结合,**国务院也千2016 年正式将区块链技术写入国家十三五发展规划中。而且研究区块链需要具有一定的技术和学识基础,上手门槛高。 特点:
第一,
第二,在区块链技术的应用价值方面,本文通过链上可信数据与SPV 技术相结合,设计实现了数字资产及相关操作数据的离线存储和公开验证功能,解决了仓单等数据的确权和追溯。
比特币区块链结构
(1)区块链结构 区块链技术产生于比特币,后续出现的区块链平台都是以比特币为原型。区块是区块链的基本组成部分,每个一区块都记录其上 区块的哈希值。区块由区块头和区块体组成[18], 区块头记录区块的元数据, 区块体存储事务数据。
区块头字段表
区块头的具体 字段如上图所示。父区块哈希值字段是上一个区块数据的数据指纹,通过该字段使得每一个区块都指向上一区块,从而使得所有区块按照先后顺序建立链接关系。为了在区块头中归纳区块体的事务数据, 比特币利用Merkel树组织单个区块内的事务数据, 而Merkel树的根节点哈希可以认为是该区块中事务的数据指纹,同时该根节点哈希存储于区块头中[20] 0 比特币节点通过求解基于哈希算法的数学难题获得打包区块的权利, 为了控制区块产生速度比特币将动态调整数学难题的难度值。因此,区块的难度值不是固定的,所以每一个区块都需要记录其产生时的难度值。比特币节点通过不断试探随机数求解数学难题, 当节点试探到合适的随机数时,就获得了打包区块的权利。节点需要将试探到的随机数存储到区块头中, 其它节点将对该随机数进行验证。
区块链的结构如上图所示。当前区块记录前一区块的哈希值,后一区块记录当前区块的哈希值,即通过单向的哈希链将所有区块组织成一个整体。区块哈希值是区块的摘要信息,区块的改变必将引起区块哈希值的改变。父区块的哈希值已经保存到子区块中,若要篡改父区块,则必须篡改子区块所保存的哈希值。这意味着想要篡改某 区块,则需要将其后续区块全部篡改,但这需要超过全网51%的算力并付出极高的成本,当全网算力非常高时,单个组织或个人很难掌握超过51%的算力。
(2)默克尔树
默克尔(Merker)树是一种由哈希值构成的二叉树,可以快速归纳数据和校验数据的完整性。默克尔树的叶子节点的值是数据的哈希值,非叶子节点的值是将其子节点串联在 起求得的哈希值。
比特币的默克尔树结构如上图所示。默克尔树自底向上构建,首先计算区块中所有事务的哈希,将事务的哈希作为叶子节点,然后将相邻的两个叶子节点串联计算哈希,该哈希将作为这两个子节点的父节点的值,以此类推,直至将所有事务归纳为 个根节点。根节点将作为区块打包的全部事务的数字摘要,保存到区块头中。默克尔树的生成规则需要子节点的数量为偶数,而如果事务数量为奇数时,则将复制一份最后一笔事务的哈希添加到叶子节点中,以使叶子节点的数量为偶数。
如上图所示, 首先计算事务1-7 的哈希, 并复制事务 7 的哈希。然后, 将对相邻的两笔事务的哈希进行拼接, 并对拼接结果求取哈希。 对哈希HI与H2拼接结果求得哈希Hl2, 以此类推, 求得哈希H34、H56与H77。哈希Hl2再与哈希H34 拼接之后, 求得哈希Hl234,类似地求得哈希H5677, 最后求得根节点哈希Hl2345677。
比特币使用默克尔树作为归纳事务的数据结构, 不仅可以防止区块中的事务被篡改还可以快速验证某笔事务是否在区块中[22] 。例如,一个比特币节点要证明事务H6 的存在, 可以生成由三个哈希值HS、 H77 和Hl234组成的验证路径并发送给其它比特币节点。其它节点可以根据验证路径和事务H6 计算出根哈希, 然后将计算得到的根哈希与区块中的根哈希对比,若两者一致则代表事务H6 存在该区块中。 验证路径的验证方式使得比特币节点仅保存区块头也可以验证事务,因此某些节点为了减少存储成本仅保存比特币的区块头,该类节点被称为轻节点。同时验证路径极大地减少了节点验证交易所需的计算鼠,使得快速验证成为可能。
(3)区块链类型
根据参与者和准入机制对区块链进行分类,区块链可以分为三种类型:公有链,联盟链和私有链。
公有链是一种完全去中心化的区块链,其准入门槛低,任何人都可以参与其 中。个人既可作为普通用户使用其服务,也可作为记账节点竞争记账权。公有链所有的参与者都是平等的,而且交易也是公开透明的。此外,公有链最大的特点是具备激励机制,即通过经济奖励激励节点贡献资源维护系统运行。公有链一般使用工作量证明和权益证明等共识算法。
联盟链,顾名思义,是应用千联盟组织的区块链。联盟链是用千解决多个组织之间的信任问题的区块链,因此并非完全去中心化,而是弱中心化或者多中心化。联盟中的成员承担记账职责,每一个组织成员都可以作为记账节点,所以联盟链不需要公有链的激励机制,也不存在代币。因此,联盟链不采用比较消耗算力的“挖矿" [25 ] 类算法, 而是采用常规的共识算法 , 例如 PBFT 和 R a ft[26 1 等。
私有链,通常应用在某个组织的内部,解决组织的数据安全问题。因为私有链的参与节点有限,所以其交易速度较高,而且访问权限有较严格的控制。私有链一般用于管理组织的内部数据,例如财务审计或者供应链管理等。
以太坊是一个具备智能合约的开放区块链平台 [27 ] 。相对千以比特币为代表的加密数字货币区块链,以太坊被称为新一代区块链平台。以太坊通过引入智能 合约概念, 构建了一个可编程的区块链平台。以太坊的体系架构如图 2.3 所示。以太坊可以分为五层:应用层、合约层、共识层、网络层和数据层。
应用层负责用户与以太坊的交互。应用层主要由去中心化应用和钱包组成。去中心化应用是以太坊服务的具体表现形式,类似千应用软件。开发者可以使用智能合约开发丰富的去中心化应用,并部署到以太坊中。以太坊使用私钥与公钥标识用户,私钥相当于密码,公钥相当于账户。以太坊钱包负责管理用户的私钥和公钥,并提供连接以太坊节点的功能。为了简化应用与智能合约的交互,以太坊提供了 web3.js 库, 其封装了 json-rpc 调用方法, 并对外提供调用接口。
合约层由智能合约与以太坊虚拟机组成。智能合约是以太坊的应用程序,其代码和数据保存在区块链中 。智能合约的代码是公开透明的 , 而且部署到以太坊上之后不可篡改。以太坊虚拟机是智能合约的运行环境。因为虚拟机是一个对外隔离的沙盒环境,所以智能合约不能访问网络或者其它系统进程。
共识层负责以太坊节点之间的共识。以太坊使用两种共识机制维护全网共 识, PO W ( 工作量证明)和 POS ( 权益证明)。POW 共识机制要求节点消耗大量算力求解预设的数学难题 , 最先求解出结果的节点将获得记账权。 POW 的共识过程需要节点消耗大量计算资源,造成资源浪费。为了减少资源浪费,以太坊引入了 POS 共识机制。 POS 共识机制根据用户持有的代币数鼠 和持有时间分配权益,权益越高获得记账权的概率越大。
网络层采用 P2P 网络 。 P2P 网络是一种分布式网络技术, 与传统的客户端/服务器结构不同 , 网络中不存在中心化的节点, 每个节点都是对等的。P2P 网络的特点十分符合区块链分布式和去中心化的特 性。因此, 以太坊采用 P2P 网络作为其底层通信协议, 并利用 Kademlia 算法解决节点发现问题。数据层负责数据的存储。以太坊的数据存储采用了和比特币相同的链式区 块结构, 并使用类似 Merkel 树的帕特里夏树存储区块中的事务数据。LevelDB 是以太坊的底层数据库负责数据的持久化。
容器消除了线上线下的环境差异,保证了应用生命周期的环境一致性标准化。开发人员使用镜像实现标准开发环境的构建,开发完成后通过封装着完整环境和应用的镜像进行迁移,由此,测试和运维人员可以直接部署软件镜像来进行测试和发布,大大简化了持续集成、测试和发布的过程。
容器带来的最大好处之一就是其适配性,越来越多的云平台都支持容器,用户再也无需担心受到云平台的捆绑,同时也让应用多平台混合部署成为可能。目前支持容器的IaaS云平台包括但不限于亚马逊云平台(AWS)、 Google云平台(GCP)微软云平台( Azure)、 Open Stack等,还包括如Chef、 Puppet、 Ansible等配置管理工具。
基于容器提供的环境一致性和标准化,你可以使用Gt等工具对容器镜像进行版本控制,相比基于代码的版本控制来说,你还能够对整个应用运行环境实现版本控制,一旦出现故障可以快速回滚。相比以前的虚拟机镜像,容器压缩和备份速度更快,镜像启动也像启动一个普通进程一样快速。
容器容器没有管理程序的额外开销,与底层共享操作系统,性能更加优良,系统负载更低,在同等条件下可以运行更多的应用实例,可以更充分地利用系统资源。同时,容器拥有不错的资源隔离与限制能力,可以精确地对应用分配CPU、内存等资源,保证了应用间不会相互影响。
Linux容器虽然早在 Linux2.6版本内核已经存在,但是缺少容器的跨平台性,难以推广。容器在原有 Linux容器的基础上进行大胆革新,为容器设定了一整套标准化的配置方法,将应用及其依赖的运行环境打包成镜像,真正实现了“构建次,到处运行”的理念,大大提高了容器的跨平台性。
Docker的英文原意是处理集装箱的码头工人,标志是鲸鱼运送一大堆集装箱,集装箱就是容器,生动好记,易于理解。一个开发者可以在15分钟之内人门Docker并进行安装和部署,这是容器使用史上的一次飞跃。因为它的易用性,有更多的人开始关注容器技术,加速了容器标准化的步伐。
Docker官方构建了一个镜像仓库,组织和管理形式类似于 Github,其上已累积了成千上万的镜像。因为 Docker的跨平台适配性,相当于为用户提供了一个非常有用的应用商店,所有人都可以自由地下载微服务组件,这为开发者提供了巨大便利。
借助docker的特性缩短部署的时间,消除繁杂的部署步骤,真正实现一条命令一个架构部署,极大的缩短了部署运维的时间,以及便于在校师生的研究开发。
项目组将以推动我校及周边在区块链方面的发展为目的,以实验室发展为优先建立中心服务基站。项目小组将和FISCO BCOS社区完成合作关系,FISCO BCOS是BCOS开源平台的分支,是基于BCOS平台加以模块升级与功能重塑,可与BCOS互通有无、互相借鉴。另外利用Docker在宿主机器的操作系统上创建Docker引擎,直接在宿主主机的操作系统上调用硬件资源。其优势是加强了开发人员写代码的开发环境与应用程序要部署 的生产环境一致性,从而降低那种“开发时一切正常,肯定是运维的问题”。此外,区块链从本质上讲是一个共享数据库,存储于其中的数据或信息,具有“不可伪造”“全程留痕”“可以追溯”“公开透明”“集体维护”等特征。基于这些特征,区块链技术奠定了坚实的“信任“基础,创造了可靠的“合作”机制,具有广阔的运用前景。充分运用两者的优势,通过合作共赢的方式,利用Docker将FISCO BCOS区块链框架封装成镜像推广给学校的师生,进而推动区块链在我校的发展,从而吸引大批人才投身于我校的创新建设中。
群组架构是FISCO BCOS 2.0众多新特性中的主线,创造灵感来源于人人都熟悉的群聊模式——群的建立非常灵活,几个人就可以快速拉个主题群进行交流。同一个人可以参与到自己感兴趣的多个群里,并行地收发信息。现有的群也可以继续增加成员。
采用群组架构的网络中,根据业务场景的不同,可存在多个不同的账本,区块链节点可以根据业务关系选择群组加入,参与到对应账本的数据共享和共识过程中。该架构的特点是:
- 各群组独立执行共识流程,由群组内参与者决定如何进行共识,一个群组内的共识不受其他群组影响,各群组拥有独立的账本,维护自己的交易事务和数据,使得各群组之间解除耦合独立运作,可以达成更好的隐私隔离;
- 机构的节点只需部署一次,通过群组设置即可参与到不同的多方协作业务中,或将一个业务按用户、时间等维度分到各群组,群组架构可快速地平行扩展,在扩大了业务规模同时,极大简化了运维复杂度,降低管理成本。
FISCO BCOS 2.0新增了对分布式数据存储的支持,节点可将数据存储在远端分布式系统中,克服了本地化数据存储的诸多限制。该方案有以下优点:
- 支持多种存储引擎,选用高可用的分布式存储系统,可以支持数据简便快速地扩容;
- 将计算和数据隔离,节点故障不会导致数据异常;
- 数据在远端存储,数据可以在更安全的隔离区存储,这在很多场景中非常有意义;
- 分布式存储不仅支持Key-Value形式,还支持SQL方式,使得业务开发更为简便;
- 世界状态的存储从原来的MPT存储结构转为分布式存储,避免了世界状态急剧膨胀导致性能下降的问题;
- 优化了数据存储的结构,更节约存储空间。
同时,2.0版本仍然兼容1.0版本的本地存储模式。
2.0版本中新增了合约交易的并行处理机制,进一步提升了合约的并发吞吐量。
1.0版本以及大部分业界传统区块链平台,交易是被打包成一个区块,在一个区块中交易顺序串行执行的。 2.0版本基于预编译合约,实现一套并行交易处理模型,基于这个模型可以自定义交易互斥变量。 在区块执行过程中,系统将会根据交易互斥变量自动构建交易依赖关系图——DAG,基于DAG并行执行交易,最好情况下性能可提升数倍(取决于CPU核数)。
FISCO BCOS 2.0提供预编译合约框架,支持采用C++编写合约,其优势是合约调用响应更快,运行速度更高,消耗资源更少,更易于并行计算,极大提升整个系统的效率。FISCO BCOS内置了多个系统级的合约,提供准入控制、权限管理、系统配置、CRUD式的数据存取等功能,这些功能天然集成在底层平台里,无需手动部署。
FISCO BCOS提供标准化接口和示例,帮助用户进行二次开发,便于用户编写高性能的业务合约,并方便地部署到FISCO BCOS里运行。预编译合约框架兼容EVM引擎,形成了“双引擎”架构,熟悉EVM引擎的用户可以选择将Solidity合约和预编译合约结合,在满足业务逻辑的同时获得巨大的效率提升。
另外,还有类似CRUD操作等也由预编译合约实现。
FISCO BCOS 2.0新增符合CRUD接口的合约接口规范,简化了将主流的面向SQL设计的商业应用迁移到区块链上的成本。其好处显而易见:
- 与传统业务开发模式类似,降低了合约开发学习成本;
- 合约只需关心核心逻辑,存储与计算分离,方便合约升级;
- CRUD底层逻辑基于预编译合约实现,数据存储采用分布式存储,效率更高;
同时,2.0版本仍然兼容1.0版本的合约。
FISCO BCOS 2.0新增控制台,作为FISCO BCOS 2.0的交互式客户端工具。
控制台安装简单便捷,简单配置后即可和链节点进行通信,拥有丰富的命令和良好的交互体验,用户可以通过控制台查询区块链状态、读取和修改配置、管理区块链节点、部署并调用合约。控制台给用户管理、开发、运维区块链带来了巨大的便利,降低了操作繁琐性和使用门槛。
相比于传统的nodejs等脚本工具,控制台安装简单、使用体验更好。
2.0版本引入了最新的以太坊虚拟机版本,支持Solidity 0.5版本。同时,引入了EVMC扩展框架,支持扩展不同虚拟机引擎。 底层内部集成支持interpreter虚拟机,未来可扩展支持WASM/JIT等虚拟机。
2.0版本对落盘加密进行了重塑升级,开启落盘加密功能时,依赖KeyManager服务进行密钥管理,安全性更强。
KeyManager在Github开源发布,节点与KeyManager的交互协议是开放的,支持机构设计实现符合自身密钥管理规范的KeyManager服务,比如采用硬件加密机技术。
2.0版本对准入机制进行了重塑升级,包括网络准入机制和群组准入机制,在不同维度对链和数据访问进行安全控制。
采用新的权限控制体系,基于表进行访问权限的设计,另外还支持CA黑名单机制,可以实现对作恶/故障节点的屏蔽。
2.0版本同时支持交易上链异步通知、区块上链异步通知以及自定义的AMOP消息通知等机制。
2.0版本对核心模块进行升级重塑,进行模块化的单元测试和端对端集成测试,支持自动化持续集成和持续部署。
Python SDK 提供了访问 FISCO BCOS 节点的Python API,支持节点状态查询、部署和调用合约等功能,基于Python SDK可快速开发区块链应用,目前支持 FISCO BCOS 2.0+
- 提供调用 FISCO BCOS JSON-RPC 的Python API
- 支持使用 Channel协议 与 FISCO BCOS节点 通信,保证节点与SDK安全加密通信的同时,可接收节点推送的消息。
- 支持交易解析功能:包括交易输入、交易输出、Event Log等ABI数据的拼装和解析
- 支持合约编译,将
sol
合约编译成abi
和bin
文件 - 支持基于keystore的账户管理
- 支持合约历史查询