络谱中间件产品功能概要

1 中间件产品说明

络谱区块链中间件产品,是为了加速区块链技术落地而专门设计的产品,作为 BROP tool 的主要部分共同发布。它可以用于与传统MIS、ERP、CRM等各类业务系统对接。在联盟链场景下,通过使用智能合约,减少业务开发中集成区块链的基础工作,从而降低学习成本和开发成本。

本文的目标读者是希望将区块链技术引入到产品中的系统架构师及各类技术人员。因此,本文将不会对区块链原理进行讲解,但会提到相关特性。

下文中将分为两个章节,分别介绍中间件产品的实际形态,及中间件提供的功能。

通过对这些问题的描述,帮助用户快速了解中间件的整体背景和可能的使用方法,帮助区块链相关的开发团队快速评估如何引入中间件产品。

2 中间件产品形态

一个独立的Java 应用服务。
通过MongoDB数据库实现对区块链数据进行索引的能力,数据库的数据同步来自区块链账本。
提供一组简单的页面,用于对区块链中的数据信息进行检索、查询。
提供一组Web界面,进行常用的文件上链、文件鉴定等功能。
通过消息队列的形式对外发布信息,业务开发者可以通过订阅消息获得及时的通知。

3 功能介绍

3.1 为区块链提供统一的快速开发接口

区块链中间件产品的首要设计目标是简化用户的开发,区块链开发中的第一个环节就是与区块链的接口交互。目前行业中并没有标准的区块链接口规范,各种区块链接口的设计也各不相同。
络谱中间件产品将区块链原生操作进行封装,通过一组统一的接口方案为用户提供全面的区块链功能。这些接口涵盖合约的编译、部署、交易发送、信息查询等功能。

3.2 为数据建立索引,提供灵活的查询接口

区块链节点的数据以区块为单位,形成链表进行存储。这样的数据存储结构虽然便于定位和验证,但通常只能根据没有业务意义的key 进行检索。区块链本身的设计并不关心业务内容,导致了区块链不能满足业务系统的检索需求。

中间件提供一种同步机制,分析区块链上的数据,并建立一套高效的索引数据库。用户对业务数据的查询,可以在这套索引数据库中完成。业务系统将查询请求发送到中间件的查询接口,就可以方便、快速地检索到需要的业务数据。这在相当大程度上,减少了各个业务系统在接入区块链技术时需要进行的二次开发工作。

3.3 向业务系统提供关于区块链事件通知

区块链是一项帮助企业间建立更强信任的技术,所以区块链的接口设计应该兼具通信和存储的功能。对于业务系统来说,通常需要感知与自身业务相关的数据变化。而目前市面上大部分区块链系统都只是单纯地存储数据,不具备通知数据变化的机制。

中间件与底层区块链之间通过同步机制建立紧密联系。利用这种联系,中间件会及时发现区块链上正在发生的数据变化,并将这些变化封装成各种“事件”,通知给业务系统。上层业务系统可以通过监听这些事件了解到区块链上的数据变化。这样的机制能大大地降低业务系统的开发和运行成本,简化业务系统的复杂度。

3.4 为存证记录提供权威的时间信息

区块链的各种常见业务中,存证和交易等场景都带有较强的时间属性。中间件为用户的存证、信息登记提供了简单的时间戳接口,时间戳数据来自中国科学院国家授时中心,帮助业务系统方便地添加权威时间信息。

时间戳接口服务帮助用户方便地为存证信息添加时间戳,这个信息会随着存证信息一起记录到区块链上,同时,因区块链具备不可篡改特性,为存证信息提供清晰且强有力的证明和支持。

3.5 精简区块链索引,降低运维成本

区块链技术通过充分的冗余备份,实现了账本数据的见证和高可用,但因此造成的成本也是显而易见的。当区块链网络成熟之后,节点和中间件可以分担进行数据见证和数据索引。业务参与方可以选择只关注应用层数据的索引,通过中间件所获取必要的数据后,再向具有可靠数据的区块链节点发起请求,进行数据验证。然而,整个区块链账本中有很多数据与业务系统本身并不相关,中间件在建立数据索引时,还提供了数据过滤功能,只将与业务相关的账号、合约信息编入索引,帮助业务系统降低运维成本。

目前中间件支持通过简单参数配置实现过滤区块链数据的功能,其中,支持的特定规则主要是根据合约和合作方账户进行过滤。未来,研发团队还将陆续推出更多的过滤规则和更灵活的配置方式。

3.6 提供交易重试和调度机制

在研发基于区块链的系统过程中,我们发现了一些困扰开发者的问题。

第一,业务系统在向区块链发送交易时,需要进行编码、签名以及发送等操作。因此区块链确认交易时会产生一段时间的延迟,导致用户在发送操作后通常不会同步得到结果。然而用户需要关心各个步骤和操作中的异常、失败和重试等各种情况。这类需求非常普遍。第二,区块链相对传统的中心化系统,吞吐带宽和并发交易数有限,业务开发者通常需要对交易进行调度,避免出现交易高峰。

针对这类场景,中间件提供交易重试和调度机制,该机制可以将交易进行存储,以及对交易异常、失败、重试等情况进行相关处理。这样,用户只需要关心交易是否已经发送到中间件,而无需关注交易上链过程中各个阶段的情况。当业务出现高峰时,可以由中间件来限制交易的发送时间,极大地简化了业务系统的复杂度。

3.7 简化大文件存证流程

区块链是一项适合保存数据的技术,但它的设计重点在于防篡改和可追查,所有的节点都完全对等地存储账本里的所有数据。在这样的方案下,对大文件的防篡改能力成为一种技术成本相当高的场景。然而,通常几兆字节的数据已经被认为是相当大的体积。

针对广泛的业务需要,中间件系统为文件存储进行了更多的定制,使得文件系统与区块链功能结合起来,为业务方提供了一套统一的文件存储接口,可以帮助用户将所有文件作为区块链的附件,存储在文件服务器中。用户只要向中间件发送自己签名的文件,即可快速进行保存,并将文件保存结果发送到区块链上,从而实现大文件的防篡改、反抵赖的能力,极大地简化了在防伪、存证等领域引入区块链技术的工作。

关于区块链的确定性

最近的两年来,我们多次跟络谱的合作伙伴沟通过关于区块链的设计、应用、对接难点,总结下来,其中一个比较普遍的问题是关于如何理解区块链中的事务确定性问题。比如,如何比特币的交易有分叉,络谱是什么样的?以太坊的数据要有统一的 nonce 计数器,导致必须维护一个单点信号,不适合传统的服务器开发,怎么解决?

对于以上问题,我们整理了一份说明,来解释我们如何在络谱平台上解决这些问题。

确定性的价值

对于区块链用户来说,“事务的确定性”是一个很重要的特性,事务(Transaction)的确定性是指,用户应该能够在有限的时间内,能够确定地知道写入的数据是否被共识机制认可,以及,一旦得到了共识机制的认可,结果应该不会再发生变化。不能变化的内容包括事务的所有属性都不能再发生变化(包括事务自身属性,和事务被记录到账本里的时间等)。试想,如果没有确定性,用户将面对一个混乱的账本:向区块链发送了数据却没法确认结果,这时,用户先是不知道应不应该发起重试,接下来重试不成功后又不知道是否可以认为事务一定会失败——所有的事务都处于混沌的状态。

区块链确定性问题的现状

以比特币网络、以太坊网络为代表的公有区块链技术,为保证广泛的节点、网络特性,在很大程度上牺牲了事务的确定性。许可链(也被称为联盟链)在有限的网络范围内,可以保证相对较高的确认速度,因此天然具备确定性特征。
然而某些共识机制在提高性能、提高对开放网络的支持程度时,允许不彻底的确定性,比如,比特币网络里允许出现分叉,使得用户和很多交易所,在收到转账后,需要更长的时间确认,在若干个区块之后,通过一个相对安全的阈值(相对的信心)来决定是否认可这笔交易。

络谱的解决方案

络谱提供的确定性,使得用户能够明确地断言“失败”

建立明确的失败判定策略

关于确定性,我们假设一个场景:银行收到张三的一万元存款,打算把这件事记录到某个分布式账本,交易发上去了,第一个块里没有数据,第二个块里还是没有交易,第三个第四个仍然没有……那么银行是否应该重新发出这笔交易呢?如果重发出一次交易,那么可能被记录为向张三转两笔钱,如果不发出,那么可能交易已经被抛弃了。

一种简单的解决方法,是采用 nonce 机制,及每个交易有唯一的 nonce,只要保证重试时再次用同一个 nonce 发出,就可以让区块链账本抛弃这个请求了。nonce 的设计解决了如何重试的问题,但仍然没有解决一个问题:当没有等到交易结果时,如果不打算重试的话,什么时候才能断言说这笔交易一定不会成立了?根据对等网络的特性,20分钟后突然又出现在区块链上,是有可能的。

络谱自有区块链通过一套我们称为 BlockLimit 的机制,在许可链上真正解决了对于“失败”的确定性问题。在发送交易时,发送方可以指定一个能够等待的最远块,即 BlockLimit,将这个约定跟在交易中发给区块链账本。账本打算打包这笔交易时,会检查这个 BlockLimit,如果区块链当前高度已经超过了 BlockLimit 约定的高度,则拒绝这笔交易。对于应用方来说,只要在任意一个区块链节点内,当区块链高度超过 BlockLimit 的后仍然不能检索到交易,就可以断言这个交易一定是失败了,可以重新发起重试了。

关于失败的确定性 —— 定时出块是十分重要的

关于确定性的另一个问题,在下一个区块出现前如何判定交易是否成功。在很多区块链设计中,为了节省空间,设计者通常倾向于采用“没有交易时不产生区块”的策略,我们称之为空闲期停链的设计。但这个设计会产生一些问题,设想这样一个场景:某银行将张三存款一万元的交易,发送到一个空闲期停链区块链账本的节点上,接下来的两个小时内,银行的查询节点没有得到任何新块,这时银行要如何判断到底是张三的交易在其它节点共识时抛弃了呢?还是已经被记录到其它节点,但本地节点没收到通知?如果没有定时出块机制,银行是无法做出判断的。

络谱平台自主研发的区块链采用定时出块的策略,即使区块链没有收到交易,也会定时产生一个空区块,区块内含有必要的时间、摘要等信息,没有交易。这时银行可以作出判断——如果新块内没有交易,则说明交易确实没有得到最近的共识机制的支持,如果长时间没有收到新块,则说明网络出现故障,需要尽快通过技术修正来解决故障。


关于 nonce 的设计方案,在以太坊白皮书中有一个典型的例子 

络谱平台九月初发布新版本

九月初,络谱平台发布新版本,v1.7.2,本次更新后,络谱平台形成完整的异构多链平台。主要功能更新包含以下内容:

合作方控制台

新增数据托管服务统一入口,申请服务更便捷;

新增存证合约黑白名单模式显示,以及可查询合作方写入权限,业务动态,尽在掌握;

区块链浏览器

支持多链切换,不用记忆多个URL;

支持按存证项目关键词查询存证;

中间件

增加存证记录写入权限查询接口,便于查询用户是否有某个存证合约的写入权限;

除上述更新外,本次更新也在文档中心增加了历史版本说明,帮助用户了解每个版本的主要变化。