Fabric概述
从应用层视角来看,Hyperledger Fabric为开发人员提供了CLI命令行终端、事件模块、客户端SDK、链码API等接口,为上层应用提供了身份管理、账本管理、交易管理、智能合约管理等区块链服务,具体如下:
-
身份管理:获取用户注册证书及其私钥,用于身份验证、消息签名与验签等;
-
账本管理:提供多种方式查询与保存账本数据,如查询指定区块号的区块数据;
-
交易管理:构造并发送签名提案消息请求背书,检查合法后请求交易排序,并打包成区块,验证交易后提交账本;
-
智能合约管理:基于链码API编写智能合约程序,安装链码并实例化(部署)后,通过调用链码请求执行更改状态的操作。
从底层视角看,Hyperledger Fabric提供了成员关系服务、共识服务、链码服务、安全与密码服务等服务,具体如下:
基于此,Fabric的测试原则是保证:
从测试类型来看,包括了接口测试、系统功能测试、安全测试和性能测试。
在测试策略上,集成测试阶段,可采用适合的接口测试工具,验证程序内、程序与平台之间的接口调用逻辑;系统功能测试阶段,主要是从黑盒测试的角度,验证信息上链、合约执行功能的正确性,而安全性和性能测试方向,可采用代码扫描工具及轻量级性能测试工具执行基本的测试案例。涉及网络攻击、渗透测试和较大规模压测的,应该提前分析测试需求,开展专项安全及性能测试。
-
成员关系服务:Fabric-CA节点提供成员登录注册服务,接收申请并授权新用户证书与私钥等,对身份证书生命周期进行管理。
-
共识服务:通过Endorser背书节点模拟执行提案消息,请求对模拟执行结果等签名进行背书,再提交到Orderer节点共识组件对交易进行排序并打包出块,然后交由Committer记账节点验证交易并提交账本。同时,基于Gossip消息协议提供P2P网络通信机制,实现高效数据分发与状态同步,确保节点账本的一致性;
-
链码服务:基于Docker容器提供隔离运行环境执行链码,支持多种语言开发的链码程序(智能合约)
-
Fabric 测试方法
-
测试需求与策略
从Fabric的架构中可以看出,开发者在开发过程中主要包括编写智能合约、通过SDK调用智能合约 以及订阅各类事件。所以,从测试角度出发,我们自下而上需要关注:
-
平台中开源智能合约是否可满足项目调用需求
-
平台中加密算法是否可满足项目安全需要
-
调用的SDK时,接口报文是否符合平台规范
-
关键信息是否可以正常上链
-
智能合约的逻辑是否符合产品需求
-
执行智能合约时,是否能正常触发
-
触发后是否可以及时获取区块链事件
-
根据获取的区块链事件,后续交易逻辑是否能正确处理
-
交易处理完成后,是否可及时更新世界状态和peer节点账本状态
-
不能触发的智能合约是否有异常处理机制
-
上链和执行智能合约时,服务器是否可满足业务的性能需求
-
公共接口调用的合法性
-
逻辑处理的正确性
-
数据处理的安全性
-
服务性能的稳定性
测试分析与设计
根据测试策略,我们将分别从以下四个方面测试分析和设计。
1)接口测试
接口可分为系统内部接口和系统外部接口,内部接口为支持程序内功能流转而设计,外部则是指与底层平台或者其他节点之间的接口。比如,某个平台中,存在合约及区块链信息查询接口,使用的是Socket通讯方式,报文是JSON类型。在与Fabric底层或者其他区块链节点的通讯的接口则可以依赖产品本身的特性,使用HTTP、Socket或者其他协议类型,报文可以应用HTTP 、JSON、 XML等。
从这些信息可以分析,在执行接口测试时,需要注意:
使用传统的Postman、JMeter、Robotframework等接口测试工具就可以完成测试实施;
接口测试用例设计与通常项目无异,改变不同的上送参数,验证接口逻辑即可;
测试数据上可能存在特殊内容,如需要查询合约信息时,需指定特定区块的hash值,该数据需要通过工具生成才能用于测试验证;
若需要执行自动化测试,则依据工具特点,选择合适的平台即可。
在Fabric开发的实际项目中,我们需要保证信息上链及智能合约在设定时间点和对象上完成动作,触发的事件、场景状态需要与初始设定相同。也可以防止触发合约的必要条件被篡改(如交易中利用大量的时间转移资产)。
4)安全测试
基于Fabric框架的金融区块链指令上链分析,业务应用与区块链交互过程中会通过应用层、物理层、数据层、拓展层将数据存储上链。即使每个层都会为区块链每个功能的组件及层间协议提供完整性、可用性和机密性等安全防御机制和协议,Fabric仍然存在一些安全风险,安全测试依然是区块链项目的重要组成部分。下面进行详细的阐述。
-
身份认证和鉴别测试。在区跨链业务场景中,应用服务与用户交互应确保用户身份的合法性;进行身份认证与鉴别、成员管理以及审计记录等安全功能测试,防止出现非授权访问与读写区块链数据的情况。在联盟中的组织结构用户接入过程中,应确保所有操作都是由受信任的机构发起,防止身份验证风险和数据传输泄密风险。另外,还需要鉴别秘钥存储安全性、证书服务器自身安全性等。
-
数据安全性。如果涉及账户转账和余额等重要信息上链存储的信息,应在执行背书的节点上存储hash,可以避免敏感数据返回客户端。此外,区跨链上的数据是不可修改,因此如何确保数据上链完整性和机密性、不可篡改性尤为重要。监管方可以设置监管节点和参与整个区跨链系统但是不参与共识;监管方可以保留所有账本以备日后定期审查。
-
Web与移动客户端应用安全测试。是否存在注入、失效的身份认证、敏感信息泄露、XML外部实体(XXE)、失效的访问控制、安全配置错误、跨站脚本(XSS)、不安全的反序列化、使用含有已知漏洞的组件、不足的日志记录和监控等。客户端应能防止进程注入、防止逆向编译导致客户端完整性被破坏。另外,还可以加强渗透评估测试,尽早发现潜在的安全威胁。
-
物理层安全测试。物理层安全风险包括物理环境风险、终端自身硬件风险、人员及管理控制风险和系统安全风险等。金融区块链系统终端存在物理环境破坏、终端外设任意接入、内外网隔离等诸多风险。对路由器等网络设备进行已知漏洞扫描、安全功能检查以及未知漏洞挖掘。
-
数据层安全测试。区块数据以链式结构分布存储在多个节点上,每个节点上的区块数据具有独立性,因此单个节点数据被篡改不会对整个区块链系统造成影响。该项测试主要检查区块链数据或文件是否加密存储与传输;检查数据备份功能是否完善;减少数据文件被破坏无法恢复造成的影响;采用的加密算法是否容易破解。
-
共识机制。对于以Fabric开源框架搭建的区块链是不需要虚拟代币机制的联盟链或私有链,一致性算法首选PBFT。验证网络框架中的节点数是否满足N>=3f+1,只有满足此类条件,才能符合全部相同有效性要求的拜占庭协议,系统才能保证安全性和活性。另一方面,需要验证该系统是否能够阻止双花攻击、是否具有良好的容错能力。
-
智能合约。区块链技术最重要的组成部分在于智能合约,主要验证智能合约是否可信、符合规范和流程;着重检查常见的安全漏洞例如整数溢出漏洞、越权访问漏洞、拒绝服务漏洞、逻辑错误漏洞、信息泄露漏洞以及函数误用等漏洞。还可以在进行代码审计测试工作时,在代码层次寻找可能存在的漏洞。
根据区块链去中心化、防篡改、可追溯、智能合约的特性,项目中功能测试需要覆盖信息上链、背书策略、合约执行、数据更新、信息同步等方面。主要测试方法站在用户角度,使用黑盒测试方法。
背书是验证交易是否具备相应权限的一个步骤,符合背书策略的接收交易预案可以通过,不符合的则不应该被接收。这其中包括提交者是否满足通道权限、签名是否合法、交易预案格式是否符合规则,交易员是否重复发送等。节点收到背书后,会模拟执行链码,功能测试时,需验证数据写操作不会对账本改变。
智能合约中的合约内容是依赖实体规则人为编码写入的,所以,对于合约内容需关注:
此外,功能测试期间对智能合约的容错性需有所准备,当智能合约运行出现错误时,需要停止合约;如若出现账户资金风险,需要限制转账速率或者控制最大转账额度。升级智能合约链码后,验证业务层逻辑是否被修复、数据层是否未受到影响。
3)性能测试
区块链解决的是不可信网络下的分布式共识计算方案。区块链的效率以及规模,取决于核心共识算法,包括合法性、完整性、可终止性三个重要属性。从最早的拜占庭将军问题,引出一种容错理论。随后1985年 Fischer和Lynch发表了FLP不可能性定论和1998年Eric Brewer的三角理论法(CAP),给异步网络下共识模型提供了很好的理论基础。共识的性能决定了给链的节点间视图数据信息一致性效率。而同步的视图的数据,需要提供更大的存储空间,才能为整个链提高区块的批量效率。
- 2)功能测试
-
触发合约的参与方是否完整;智能合约的触发条件是否符合既定规则,不应存在歧义或者模糊的触发条件。
-
当合约触发完成后,验证其他各peer节点同步消息的正确性及时限性;各参与方的状态需合理正确。
-