查看原文
其他

百度工程师详解合约网关,如何用Quorum中间层快速开发投票智能合约?

林晶晶 区块链大本营 2019-11-27

作者 |林晶晶

责编 | Aholiab、Maozz

出品 | 区块链大本营、百度智能云区块链



区块链从独立的技术范式,慢慢扩展到企业区块链的融合范式,是下一代区块链的核心特征。在区块链技术与AI、大数据、云计算技术加速融合的今天,区块链如何加速企业端的赋能与落地,正在变得越来越重要。


今天起,区块链大本营将携手百度智能云区块链为大家奉上「企业级区块链技术范式」系列专题。


本系列将从企业区块链的技术范式为出发点,以企业区块链架构、企业级智能合约、企业联盟链的高效管理、企业区块链的隐私性、可信区块链的企业应用等5大方面进行展开。深挖企业区块链的深层需求,为读者提供全方位的企业级区块链部署和落地思路。


本篇文章是本系列的第二篇。第一篇《横评3大企业级区块链技术平台!



在2016年,J.P.Morgan为了解决区块链技术在金融及其他行业应用的特殊挑战,启动了开源区块链项目Quorum,它是在以太坊(Ethereum)的基础上开发的,是以太坊的一种企业化实现。不仅提高了交易性能,而且提供了隐私合约执行方案。


继而在今年2月,J.P.Morgan宣布推出JPM Coin,底层基于Quorum区块链;今年5月,星巴克和LV公司相继宣称将使用Quorum区块链来追踪咖啡和奢侈品;7月,百度智能云的区块链引擎提供Quorum联盟链的支持。

这一系列事件表明,Quorum在企业联盟链领域发展迅速,主要由于Quorum具有如下特性

交易隐私保护
交易隐私保护特性对企业联盟链来说是一个非常重要的特性,可以满足特定信息只对特定节点展示使用的需求,Quorum隐私交易方案能够在保障区块链不分叉的前提下,隐私交易只能被相关交易方执行和读取,而非相关方则无法在区块中查到隐私交易信息。目前,Quorum提供了Tessera和Constellation两种隐私交易方案。

节点准入系统
从以太坊的公有链修改为联盟链,使得Quorum并不面向所有人开发,加入联盟需要经过审批机制。

灵活支持多种共识
目前支持IBFT和Raft。

高性能、速度快、抗分叉
Quorum替换了以太坊的POW共识机制,使得交易的处理能力有了较大的提升。

 


为什么

企业级区块链需要中间层?


我们在接触一些已经使用或者想要基于Quorum联盟链开发自身业务的企业,发现这些企业对联盟链的需求往往比较一致,主要包括:
  • 安全稳定可靠,结果可预期;

  • 能够支持较高并发;

  • 开发简单,上链难度小。


由于Quorum本身是基于以太坊开发的,使用Quorum开发业务时,调用执行智能合约的方式与以太坊基本一致(执行隐私合约时,需要指定privateFor参数),一般使用JSON-RPC或者We3.JS,也可通过以太坊提供的不同语言的客户端,比如Go语言的Geth,或者Java语言的Web3J等

使用这些方式执行调用智能合约时,常常会遇到很多问题,比如:


1、Nonce管理
我们知道为了防止交易重播,以太坊的每个账户都有一个Nonce数值,从0开始计数,账户每发送一笔交易,Nonce加1,当同一个账户发生多笔交易时,交易按照Nonce的大小顺序执行。由于区块链节点是分布式的,没法准确的从单一节点获取当前账户下一笔交易所需的Nonce值

因此当需要高并发的发起交易时,就需要一个强一致性的模块来给账户提供连续的Nonce,以保障交易能够正确的执行。

2、参数的编码与解码
使用JSON-RPC发起合约方法的调用时,需要先对方法名称和参数进行编码和签名,交易执行后的结果也需要进行解码,相对来说,使用门槛较高,也比较容易出错。

3、交易执行结果不可预期
当向区块链发起一笔交易时,由于众多不可控因素并不能保障交易一定会被执行,这在企业基于区块链对外提供服务时是不可接受的。

很显然,企业需要有一个链接区块链的桥梁,对用户屏蔽执行和调用交易的复杂操作

这个桥梁要支持根据合约方法与参数类型自动编码以及生成签名数据、托管交易账户的Nonce、预估交易Gas费用,提供可视化与可互动的合约执行功能,同时提供OpenAPI,让用户无需专注区块链的复杂操作,而是专注于自身业务的开发。


揭秘中间层——合约网关
                    
为了解决这一问题,我们设计并开发了一种在Quorum和以太坊之上,在Dapp之下的中间层——合约网关。架构图如下图所示。


核心模块包括以下几个。

1. 合约解析模块
主要有两个功能:
a)解析用户请求体内需要调用的智能合约方法的函数签名和输入参数,构造成以太坊所支持的智能合约调用所需的结构。
b)反解智能合约返回的结果,解析成用户可读的结构

2. 节点管理模块
该模块负责监控节点的健康状况,同时具有交易请求的负载均衡功能,会综合节点健康与负载情况,将用户的交易请求转发到合适节点JSON-RPC地址中。

3. Nonce管理模块
为交易提供强一致的Nonce管理服务。

4. 交易管理模块
对Transaction类型的交易请求进行监控,定时查看交易的上链情况,如发现交易执行失败或执行超时,则会启动交易重发机制,将该笔交易重新发送到区块链节点上。

5. 事件订阅模块
为交易创建Websocket事件监听,当事件触发后订阅池会收到事件数据,对数据进行解析后推送给订阅用户。

6. 智能合约桥接
智能合约调用桥主要是利用以太坊官方提供的Golang语言的SDK来与节点通讯、发起智能合约的查询与交易请求
 
在BBE(百度区块链引擎)上,Quorum联盟链内组织的Quorum节点运行在一个网络隔离的内网环境中,从一个组织内的节点上只能够获取到组织内的节点间的网络拓扑,因此Quorum节点网络拓扑结构不会泄漏。
 
除此之外,这套系统在组织之间的通信和企业业务上链方面的设计是这样考虑的。
 
组织之间的通信可以依靠自研的网关节点,在组织内部网关节点作为Quorum P2P网络中的一个peer节点,但是自身不维护链上数据,不参与共识。

同一个联盟内不同的组织的网关节点之间通过双向认证和加密来建立一条安全隧道,通过该隧道实现联盟内跨组织的Quorum节点间的间接互通
 
在企业级业务上链方面,BBE的Quorum联盟链提供了一系列的合约网关服务。包括组织、联盟、合约管理/中间层和事件中心。

他们的作用如下:


组织:能够让用户对自己的组织进行管理,包括组织成员、组织成员的身份、组织成员的权限管控。
联盟:以组织粒度创建和加入联盟,实现区别于Quorum原有属性的联盟链管理模式。
合约管理/中间层与Remix合约编辑器集成,能够快速获取用户所部属的合约,同时通过合约网关的处理,用户可以通过RESTful API接口的方式对合约进行调用
事件中心:协调各个组织之间的协作,整合Quorum原有的投票机制,将前端审批操作与链上投票机制进行打通,实现用户与区块链的快速交互。


使用合约网关执行投票合约示例


这里我们以Solidity中的投票合约为示例,分别使用Web3和合约网关来执行合约,可以看出两者的对比。

投票合约示例代码如下:


从上面代码可以看出,我们将合约部署到了BBE上的一个Quorum网络中。
合约地址为:
0xdba00ca3e38c414e5b5eae9d42b7f69754b34628


 BBE地址:https://cloud.baidu.com/product/bbe.html

我们首先使用Web3调用投票合约的vote方法,在调用之前首先要确保已经成功安装了Web3。代码示例如下:


需要留意的是,在第二步中构造交易对象时,nonce需要手动指定,这里我设置的是0;data是合约方法及参数`vate(0)`编码后的十六进制数据


从示例代码中可见,需要经过5步,才能发送一笔合约交易。


通过合约网关的在线可视化API,我们可以很直观的看到合约网关可调用投票合约相关方法及事件。如下图所示。

 

同样是调用合约里的vote方法,我们只需要发起一个简单的post请求即可,请求代码示例如下:



通过上面的示例,我们看到使用合约网关调用投票合约的vote方法要比使用Web3方便很多,不需要管理nonce、签名数据。合约网关本身是以RestFul API形式提供服务,不受语言和平台限制,开发者可以很方便的将合约网关的服务集成到自身业务中。 


总的来说,BBE Quorum联盟链最大的特点就是,强化了Quorum组织的概念,从网络上隔离一个组织内的Quorum节点与组织外的Quorum节点间的直接互联,从而构建了一个安全的内网环境。


同时,为实现跨组织的Quorum节点间的互通,添加了网关节点,实现了联盟准入准出的强管控和TPS的低损失。


借此希望能够让Quorum满足企业对准入准出机制的强管控,让Quorum框架也可以在企业区块链实践中得到广泛的应用

 *关于作者:
林晶晶,百度智能云区块链高级工程师。百度区块链引擎BBE以太坊、Quorum区块链网络核心开发者。




11月18日之前报名,免费赠送北京2019软件绿色联盟开发者大会(包括工程院院士倪光南、红杉资本周逵、CSDN蒋涛以及阿里、腾讯、百度、开源中国等大牛演讲)一张。

限时买一赠一,数量有限,仅有85张!先到先得!



推荐阅读


猛戳"阅读原文"有惊喜哟

老铁在看了吗?👇

    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存