基于以太坊私有链的数据存证与验证服务
2021-11-13杨春节高琪娟徐光翔
杨春节,朱 军,高琪娟,徐光翔
(安徽农业大学 a.信息化办公室;b.信息与计算机学院,合肥 230036)
0 引 言
区块链技术被视为继云计算、物联网、大数据之后的又一项颠覆性技术,在本质上是一种安全可靠的数据库技术方案,区块数据无法修改,所有历史记录数据永久保留是其重要特性。[1,2]当前主流的数据库Oracle、SQL Server、Mysql等数据库技术是信息系统的核心,解决了计算机信息处理过程中大量数据有效地组织、存储、检索和处理等方面的问题,但信息系统及数据库管理工具可以任意修改数据库中的数据,由此带来的数据安全问题也比较突出,数据泄露、SQL注入攻击、数据库违规操作等数据安全事件屡屡出现。在信息系统开发及应用中,融合区块链技术是提升数据安全的又一重要途径,在信息系统数据管理模块增加数据上链及数据验证功能可以加强信息系统数据的安全管理和监测。
基于区块链技术的数据存证与验证公共服务链采用以太坊开源项目[3,4]进行基础平台建设,运行具有普适性的数据存证与验证智能合约[1,5,6,7],通过RPC服务[8]面向第三方信息系统提供数据上链及验证接入服务。信息系统调用公共服务平台的服务接口[9],实现应用集成后即可拥有基于区块链技术的数据存证与验证能力。
1 区块链相关技术及应用简介
1.1 区块链
区块链是一个信息技术领域的术语。区块链把数据分成不同的区块,每个区块通过特定的信息链接到上一区块的后面,前后顺连,呈现一套完整的数据。每个区块的块头包含前一个区块的哈希值,该值是对前区块的块头进行哈希函数计算而得到。区块之间都会由这样的哈希值与先前的区块环环相扣形成一个链条,存储于其中的数据或信息,具有不可伪造、全程留痕、可以追溯、公开透明、集体维护等特征。[1]区块链接示意如图1。
图1 区块链接示意图
根据应用场景不同,区块链可以分为公有链(Public Blockchain)、联盟链(Consortium Blockchain)和私有链(Private Blockchain)。公有链是指全世界任何人都可以随时进入系统中读取数据、发送可确认交易、竞争记账的区块链。公有链通常被认为是完全去中心化的,没有任何人或机构可以控制或者篡改其中数据的读写。联盟链是指由若干个机构共同参与管理的区块链,每个机构都运行着一个或多个节点,其中的数据只允许系统内不同的机构进行读写和发送交易,并且共同来记录交易数据。私有链是指其写入权限是由某个组织和机构控制的区块链,参与的节点是有限和可控的,具有极快的交易速度、更好的隐私保护、更低的交易成本、不容易被恶意攻击等优点。
1.2 智能合约
智能合约是一种模块化、可重用的自动执行脚本,可替代第三方信任平台实现交易双方直接进行可信交易,这些交易可追溯且无法发生回滚。智能合约根据按照实际业务逻辑定义相应规则,调用智能合约将会按照合约定义的交易规则来实现链上的交易,访问链上信息。
1.3 以太坊
以太坊(Ethereum)是一个开源的有智能合约功能的公共区块链平台。依托以太坊开源项目可以很方便地搭建公有链、联盟链和私有链,发布智能合约等。在以太坊平台上可以使用Solidity语言作为智能合约开发语言[10],Remix在线开发平台为开发工具。[10]
1.4 Web3j
web3j是一个轻量级、高度模块化、响应式、类型安全的 Java 和 Android 库,用于与智能合约以及与以太坊网络上的客户端(节点)进行集成。[12]
1.5 哈希算法(HASH)
哈希算法将任意长度的二进制值映射为较短的固定长度的二进制值,这个二进制值称为哈希值。哈希值是一段数据唯一且极其紧凑的数值表示形式,可以检验数据的完整性。[13]散列明文中任何改动都会产生不同的哈希值,要找到散列为同一个值的两个不同的输入,在计算上是不可能的。
2 系统设计与开发
2.1 系统模型
本系统依托以太坊开源项目搭建私有链,作为区块链技术具体实现和应用平台,基于该平台开发智能合约,实现数据存证与验证功能,面向第三方信息系统提供数据存证与验证服务。信息系统服务器端通过区块链接口层调用智能合约,实现数据上链与验证。整个系统由区块链层、信息系统层、区块链层组成。系统模型见图2。
图2 系统架构图
区块链层使用以太坊开源项目实现,鉴于区块链技术的特性,可以确保链上数据的安全性和不可篡改性。
信息系统层是信息系统的原有架构,需要实现关键数据存证与验证服务时,需要通过改造相应模块,借助区块链接口层与区块链层进行集成。信息系统与区块链层集成时,信息系统的数据管理模块在数据保存至数据库的同时把该关键数据的HASH值、关键数据加密并转换成十六进制后,通过线程技术上传数据HASH值及密文的十六进制至区块链,根据哈希算法的特性,可以实现可信数据存证;在数据查询环节,通过异步执行的方式获取区块链中数据的HASH值,与信息系统数据库中的数据HASH值进行比对实现数据验证,监测数据是否发生篡改及非法修改情况。同时,使用区块链所有历史记录数据永久保留的特性可以从区块链获取区块链中相应数据的十六进制值,通过数据转换及解密可以实现数据回溯。
区块链接口层(Web3j)[12,14,15]是第三方信息系统(JAVA)与区块链网络进行交互的“桥梁”,实现数据存证及验证时请求及响应数据的传输。
2.2 智能合约设计
智能合约是在区块链网络实现数据存证与验证的关键,本文采用Solidity语言开发智能合约,主要涉及智能合约存证数据的结构设计、存证函数与验证函数的编写。数据存证与验证智能合约主要变量及函数、用于存证的自定义结构类型(ProofContent)成员名称及说明见表1、表2。
表1 数据存证与验证智能合约主要变量及函数
表2 自定义结构类型成员名称及说明
智能合约代码如下:
pragma solidity ^0.4.25;
contract AhauProof {
//合约功能:记录数据凭证、检验数据修改情况
//自定义的结构类型
struct ProofContent {
address _from;
string recordId; //系统名称+表名+记录ID
string hash; //关键数据hash
string data; //关键数据(json格式的加密数据,支持验证时解密)
}
//映射数据
mapping(string =>ProofContent)private proofContents;
string recordId;
function setRecordId(string memory _recordId)public{
recordId =_recordId;
}
function getRecordId()view public returns (string){
return recordId;
}
event InsertEvn(string recordId ,string hash ,string data);
//记录上链
function insertProof(string memory _recordId,string memory hash,string memory data)public {
//recordId首次上链
if (isEqual(proofContents[_recordId].data,"")){
proofContents[_recordId].recordId =recordId;
proofContents[_recordId].hash =hash;
proofContents[_recordId].data =data;
} else {
//recordId再次上链时
proofContents[_recordId].recordId =recordId;
proofContents[_recordId].hash
string(constatString(proofContents[_recordId].hash,hash));
proofContents[_recordId].data
string(constatString(proofContents[_recordId].data,data));
}
emit InsertEvn(recordId,proofContents[_recordId].hash,proofContents[_recordId].data);
}
//查看链上记录-hash数据
function viewHash()public view returns(string){
return proofContents[recordId].hash;
}
//查看链上记录-data数据
function viewData()public view returns(string memory){
return proofContents[recordId].data;
}
//字符串比较
function isEqual(string memory a,string memory b)public pure returns (bool){
bytes32 hashA =keccak256(abi.encode(a));
bytes32 hashB =keccak256(abi.encode(b));
return hashA ==hashB;
}
//字符串连接
function constatString(string memory a,string memory b)private pure returns(bytes memory){
bytes memory str1 =bytes(a);
bytes memory str2 =bytes(b);
string memory ret =new string(str1.length+str2.length+1);
bytes memory bret =bytes(ret);
uint k =0;
for (uint i=0;i bret[k++] =“&”; for (i=0;i return bret; } } 信息系统开发一般采用分层开发模式,如使用JAVA语言开发应用程序时常用的SSH框架一般分为实体层、数据层、业务逻辑层、控制层。为了尽量减少信息系统与区块链集成时对业务逻辑的影响,可以选择在业务逻辑层或数据层的数据增删改业务功能完成后,新开线程完成数据上链,以避免线程阻塞,影响程序运行效率[16,17]。数据验证及变动历史查询一般在业务逻辑层开发,面向前端界面提供调用服务,而在前端界面中则通过Ajax异步调用方式进行集成,以避免调用区块链的接口服务时影响网页加载速度。JAVA应用程序与区块链集成后示意图如图3所示。 图3 JAVA应用程序与区块链集成示意图 按照2.3所述思路进行系统集成后,功能测试情况如下: (1)数据上链存证:记录新增及修改功能正常,数据保存的同时实现相关数据上链存证。 (2)数据验证:在数据查询界面中,链上验证异步运行,网页加载速度正常。当从数据库中直接更改某一记录值时,链上验证则不通过,如图4所示。 图4 链上验证示意图 (3)数据历史溯源:信息系统中数据的正常修改历史可以从链上获取。 通过信息系统与区块链技术集成可以加强信息系统运行过程中对数据非法篡改或者通过数据库非正常修改数据行为的监测,有效提升信息系统的数据安全能力。但在系统开发及测试的过程中,我们发现即使采用效率较高的私有链技术,区块链的数据存取效率与传统数据库系统仍存在着较大的差距,研究、完善区块链的在信息系统高并发、大规模集群应用需求下的技术显得至关重要。2.3 信息系统与区块链集成
2.4 功能测试
3 总 结