论文部分内容阅读
摘 要: 区块链是一种链式存储数据结构,它的特点是对于数据修改有固有抵抗力,但在检索方面有着较大的弊端。传统SQL数据库中由于开放数据访问和复杂的网络安全破坏机制所提供的易变环境,数据极易被篡改且无法被直接检测到。本文通过借鉴区块链技术思想,设计10区块链结构数据表为传统关系型数据库赋予区块链的防篡改、防伪特性,在保证数据可信的同时拥有较高的检索速度。
关键词: 区块链;数据库;防篡改;数据可信
中图分类号: TP311 文献标识码: A DOI:10.3969/j.issn.1003-6970.2020.06.013
本文著录格式:任晋宏,肖攸安,黄文禹,等. 具有区块链结构的数据库[J]. 软件,2020,41(06)6367
【Abstract】: Block chain is a kind of chained storage data structure, which has inherent resistance to data modification, but it has great disadvantages in retrieving information. Due to the volatile environment provided by open data access and complex network security failure mechanism in traditional SQL database, data is easily tampered and cannot be directly detected. In this essay, by referring to the block chain technology, the data table with blockchain structure is designed to give the block chain 25tamper-proof and anti-counterfeiting features to the traditional relational database, so as to ensure the data credibility and at the same time have a high retrieval speed.
【Key words】: Blockchain; Database; Tamper proof storage; Reliable data
0 引言
随着Bitcoin、Ethereum、Ripple等加密货币的兴起,其底层的区块链技术不断发展并受到各领域的密切关注[1]。区块链技术规定了区块链的数据定义,以比特币为例,每个区块由区块头和区块体两部分组成,区块体中存放了自前一区块之后发生的多笔交易;区块头中存放了前块哈希(PreBlockHash)、随机数(Nonce)、Merkle根(MerkleRoot)等[2]。区块链是用于数据存储并保证数据可信的链式数据结构。
区块链的特点和它的缺点一样突出,由于其较差的数据格式,它在搜索查询方面不尽如人意。例如,比特币中一个事物的发布、验证和最终的确认可能需要1个小时甚至更久的时间[3]。传统SQL数据库不但有数据结构化的特点,还有快速查询处理的优势,但它不能抵抗数据修改。
为了实现同时具备区块链对数据的固有抵抗力和高效的查询速度,本文借鉴区块链技术设计了区块链结构的数据库,通过对数据库表增设hash、prehash等字段并结合数字签名技术、哈希算法使其符合区块链数据结构。数据库中每条记录可视作一个区块,每个区块的哈希值都包含前一区块的哈希值,每个区块的哈希不仅是为区块数据提供篡改阻力的元数据,也是指向前一区块的哈希指针;每个区块中的数字签名为数据提供了防伪证明。关系型数据库中的数据库表可视为一条区块链,多张表可视为多条区块链,可针对单张表进行数据校验,验证数据完整性。
1 区块链结构数据库
1.1 区块链数据结构
区块链中的每个区块都通过散列值连接到前一个区块,每个区块主要由区块头和包含交易数据的区块体组成[2]。区块链的数据结构如表1所示。
区块链中的前后区块通过哈希值进行连接,哈希值是对交易数据和前一区块的哈希值进行Hash运算得到的结果。为了生成区块X,区块X-1必须先于区块X生成,所以区块链可以在时间上向前遍历检测数据是否被篡改[4]。若要对区块链上的数据进行篡改,则必须从初始写入数据的区块到当前时刻的所有区块进行篡改。
1.2 面向关系型数据库的区块链数据结构
区块链中的信息在逻辑上可分为两部分,一部分为是要存储的数据,另一部分是为存储数据提供篡改阻力的元数据[4]。本文对Sql数据库表的字段进行了设计,如表1.2所示,数据库表的字段分为区块头(Blockhead)和数据(Data)两部分:区块头中的字段有包含区块编号id,前一区块哈希(prev_ hash)、时间戳(timestamp)、本次交易哈希(hash)和交易簽名(signature);数据中的字段根据需存储数据设计。数据库中的每一张表可以视为一条区块链,多张表可视为多条链,一张表中的每条数据可视为一个区块。每个区块中的Hash是由对本区块的所有数据和前一区块的Hash经过哈希运算得到,所以每个区块的Hash都指向前一区块。由此数据库表中每条记录构成一条区块链,这样每个新的区块就会包含前一区块的信息。
1.3 数据存储流程
本文设计了区块链处理器完成数据的写入、读取、修改、删除和校验功能。数据存储过程如图1所示,在接收到交易数据Data后,后台连接数据库获取当前最新记录的哈希值并赋值给Prehash字段,对Data、Prehash和当前系统时间Timestamp一起进行哈希运算生成Data的摘要值Hash,然后使用发送者的私钥对Hash签名,最后将Data、Prehash、Timestamp、Hash和Signature一起写入数据库中。 为保证区块链完整性,不允许直接在数据库中修改或删除数据。为了符合多应用场景,有修改需求的需重新向后台提交,在数据库中生成一条有相同Id的新记录。用户查询数据时,后台会根据时间戳将最新记录返回给用户。若想要删除数据,将各个字段赋值null,提交给后台即可。
1.4 数据校验流程
图2为数据的校验过程,首先在数据库中检索最新记录的数据,然后对数据进行哈希运算,将运算结果与数据中的哈希值对比,若不匹配,则说明区块X中的哈希值被篡改;然后根据数据中的preHash字段在数据库中检索上条记录,若返回空值,则说明上条记录被删除或数据中的preHash被篡改;当检测到preHash为空或检测到数据被篡改时,结束循坏,将结果返回给用户。
2 区块链处理器
区块链处理器对存储数据进行编码,以区块的形式存入数据库中,并对数据库中区块链结构数据进行校验,验证数据是否被篡改。
2.1 数据存储算法
根据区块链数据结构定义,数据库表结构定义如下:
CREATE TABLE Blockchain
(
Field0 varchar(32),
Field1 varchar(32),
Field2 varchar(32),
…
prev_hash varchar(256), //前一区块哈希
hash varchar(256), //该区块哈希
timestamp timestamp, //时间戳
signature varchar(256) //交易签名
);
接收到交易数据data后,区块链处理器首先判断数据库表最新区块是否为空,若为空,则对prehash赋值为null;否则获取当前最新区块的哈希值赋值给prehash,然后对data、时间戳timestamp和prehash一起进行哈希运算,生成新区块的哈希值,最后将新区块写入数据库中。
算法1.数据插入算法
输入:交易数据data
//客户端加密
1. String preHash = 当前数据库中最新記录的摘要值hash;
2. String hash = hashEncrypt(data,timestamp, preHash);
3. signature = RSAEncrypt(hash,privateKey);
4. sendMessage(data,hash,preHash,timestamp, signature);
//服务器端解密,存入数据库
//hash1为对signature解密后的结果,hash为客户端发送的哈希值
5. data,hash,preHash,timestamp,signature = receive(data,hash,preHash,timestamp,signature);
6. hash1 = RSADecrypt(signature,publicKey);
7. if(compareHash(hash,hash1)){
8. //将数据写入数据库中
9. }else{
10. //返回错误信息
11. }
算法1的第1行~第4行是有客户端对数据使用哈希算法生成哈希值,使用用户私钥对数据的哈希值进行数字签名,并发送给服务器端。
第5行是服务器端接收客户端发送的数据。
第6行是使用用户公钥对签名signature解密。
第7行~第11行是判断解密哈希与发送的哈希值是否匹配。
2.2 数据校验算法
数据校验算法用于保证数据完整性,数据完整性遭到破坏的可能情况有两种:部分区块被删除和区块内数据被篡改。针对这两种情况我们提出以下算法判别数据完整性。
算法2 校验算法
输入:无
输出:数据未被篡改,返回null;检测异常返回检测出的第一条异常数据。
1. Data data = 当前最新区块数据;
2. String preHash = data.getPrehash();
3. while (preHash != null){
4. try{
5. dataPre = 前一区块哈希值;
6. } catch (Exception e){
7. return JsonData.buildError(-2,"前一区块数据被删除",data.getId());
8. } 9. String checkHash=HashUtils.genHash(data); //计算当前区块的哈希值
10. String hash=data.getHash();
11. if(checkHash!=hash){
12. return Jsondata.buildError(-3,"数据被篡改");
13. }
14. preHash = dataPre.hash();
15. if(preHash = null){
16. return Jsondata.buildSucess();
17. }
18. }
算法2是在时间顺序上向前遍历,第3行代码用于判别当前区块是否为初始区块。
第4行~第8行代码通过当前区块存储的prehash检索前一区块数据,若检索失败,说明前一区块数据被删除。
第9行~第13行代码通过对当前区块存储信息重新进行哈希运算来判别当前区块的数据是否被篡改。
第15行~第17行代码通过判断prehash是否为null来确认该链是否校验完成。
3 实验
3.1 试验1 篡改数据测试
将数据库中订单号为201910204291的区块信息进行修改,使用校验算法对发生篡改的区块链进行校验,查验数据完整性,查验结果如图3所示。
删除数据库中订单号为201910019023的区块的前一区块,使用校验算法对这条区块链进行校验,查验数据完整性,查验结果如图4所示。
3.2 试验2 数据校验性能测试
本文使用被动检测机制保证数据可信,交易数据按照时间顺序写入数据库中,交易信息校验过程中要获取当前交易数据和上一条数据的哈希值,使用算法重新当前交易的哈希值并与数据库中存储的哈希值相比较。我们测试在每条数据大小为322B,10000-50000条数据量情况下的校验速度,如图5所示,在10000-50000条数据范围内,数据校验速度与数据量大小成线性关系,在可接受的时间内保证数据可信。
3.3 试验3 数据版本对查询速率的影响
为保证数据以区块链的链式结构存储,不允许直接对数据库中的数据进行修改或删除,为满足对修改和删除的需求,我们通过在数据库写入有着相同主键的新记录完成修改和删除功能,在查询数据时仅显示时间戳最新的数据。我们设计了实验测试数据版本数对查询速率的影响,在10000条数据环境下,查询大小为297b大小的数据。实验结果如图6所示,在修改24次数据后,单次查询速度与修改4次数据后的单次查询速度并未有明显差距,说明版本数对数据查询速率影响极低。
4 结论
本文借鉴区块链思想提出了在关系型数据库中以区块链的链式结构存储数据的方法和被动检测机制,以此保证数据可信和数据检索速率。通过实验测试,实验数据表明在保证数据可信的基础上同时具有较高的数据检索速率;在一定数据量范围内,数据量与校验速度呈线性关系,可只对关键字段进行加密处理,减少算法运行时间,提高校验速度,之后会在此基础上进一步研究提高校验速率的方法。
参考文献
[1] 焦通, 申德荣, 聂铁铮, 寇月, 李晓华, 于戈. 区块链数据库: 一种可查询且防篡改的数据库[J]. 软件学报, 2019, 30(9): 2671-2685.
[2] 邵奇峰, 金澈清, 张召, 钱卫宁, 周傲英, 区块链技术: 架构及进展[OL]. (2017-11-15)[2019-12-03]. http://kns. cnki. net/kcms/detail/11. 1826. TP. 20171115. 2302. 006. html.
[3] Muhammad Muzammal, Qiang Qu, Bulat Nasrulin. Renovating blockchain with distributed databases: An open source system[J]. Future Generation Computer Systems, 2019, 90: 105-117.
[4] MANIFOLD TECHNOLOGY, INC, MENLO PARK, CA (US). BLOCKCHAIN-ENHANCED DATABASE[P]. US 2017/0228371, A1. Aug. 10, 201.
[5] Conaghy T, Marques R, Müller A, Jonghe DD, McConaghy TT, McMullen G, Henderson R, Bellemare S, Granzotto A. BigchainDB: A scable blockchain database[OL]. (2016-06-08) [2019-12-03]. https://www.bigchaindb.com/whitepaper.
[6] 騰讯FiT, 腾讯研究院. 腾讯区块链方案白皮书[Z]. WhitePaper, 2017.
[7] 蒋东东. 宝武集团区块链可信电子仓单系统的研发[D]. 西安: 西安工程大学, 2018.
[8] 葛利洁. 基于区块链技术的交易信息存储与查询系统的设计与实现[D]. 北京: 北京邮电大学, 2018.
[9] 北京众享比特科技有限公司. 基于区块链的数据库应用平台技术白皮书[Z]. WhitePaper, 2017.
[10] 张偲. 区块链技术原理、应用及建议[J]. 软件, 2016, 37(11): 51-54.
[11] 尚永强. 计算机网络信息安全中数据加密技术的探讨[J]. 软件, 2018, 39(12): 198-201.
关键词: 区块链;数据库;防篡改;数据可信
中图分类号: TP311 文献标识码: A DOI:10.3969/j.issn.1003-6970.2020.06.013
本文著录格式:任晋宏,肖攸安,黄文禹,等. 具有区块链结构的数据库[J]. 软件,2020,41(06)6367
【Abstract】: Block chain is a kind of chained storage data structure, which has inherent resistance to data modification, but it has great disadvantages in retrieving information. Due to the volatile environment provided by open data access and complex network security failure mechanism in traditional SQL database, data is easily tampered and cannot be directly detected. In this essay, by referring to the block chain technology, the data table with blockchain structure is designed to give the block chain 25tamper-proof and anti-counterfeiting features to the traditional relational database, so as to ensure the data credibility and at the same time have a high retrieval speed.
【Key words】: Blockchain; Database; Tamper proof storage; Reliable data
0 引言
随着Bitcoin、Ethereum、Ripple等加密货币的兴起,其底层的区块链技术不断发展并受到各领域的密切关注[1]。区块链技术规定了区块链的数据定义,以比特币为例,每个区块由区块头和区块体两部分组成,区块体中存放了自前一区块之后发生的多笔交易;区块头中存放了前块哈希(PreBlockHash)、随机数(Nonce)、Merkle根(MerkleRoot)等[2]。区块链是用于数据存储并保证数据可信的链式数据结构。
区块链的特点和它的缺点一样突出,由于其较差的数据格式,它在搜索查询方面不尽如人意。例如,比特币中一个事物的发布、验证和最终的确认可能需要1个小时甚至更久的时间[3]。传统SQL数据库不但有数据结构化的特点,还有快速查询处理的优势,但它不能抵抗数据修改。
为了实现同时具备区块链对数据的固有抵抗力和高效的查询速度,本文借鉴区块链技术设计了区块链结构的数据库,通过对数据库表增设hash、prehash等字段并结合数字签名技术、哈希算法使其符合区块链数据结构。数据库中每条记录可视作一个区块,每个区块的哈希值都包含前一区块的哈希值,每个区块的哈希不仅是为区块数据提供篡改阻力的元数据,也是指向前一区块的哈希指针;每个区块中的数字签名为数据提供了防伪证明。关系型数据库中的数据库表可视为一条区块链,多张表可视为多条区块链,可针对单张表进行数据校验,验证数据完整性。
1 区块链结构数据库
1.1 区块链数据结构
区块链中的每个区块都通过散列值连接到前一个区块,每个区块主要由区块头和包含交易数据的区块体组成[2]。区块链的数据结构如表1所示。
区块链中的前后区块通过哈希值进行连接,哈希值是对交易数据和前一区块的哈希值进行Hash运算得到的结果。为了生成区块X,区块X-1必须先于区块X生成,所以区块链可以在时间上向前遍历检测数据是否被篡改[4]。若要对区块链上的数据进行篡改,则必须从初始写入数据的区块到当前时刻的所有区块进行篡改。
1.2 面向关系型数据库的区块链数据结构
区块链中的信息在逻辑上可分为两部分,一部分为是要存储的数据,另一部分是为存储数据提供篡改阻力的元数据[4]。本文对Sql数据库表的字段进行了设计,如表1.2所示,数据库表的字段分为区块头(Blockhead)和数据(Data)两部分:区块头中的字段有包含区块编号id,前一区块哈希(prev_ hash)、时间戳(timestamp)、本次交易哈希(hash)和交易簽名(signature);数据中的字段根据需存储数据设计。数据库中的每一张表可以视为一条区块链,多张表可视为多条链,一张表中的每条数据可视为一个区块。每个区块中的Hash是由对本区块的所有数据和前一区块的Hash经过哈希运算得到,所以每个区块的Hash都指向前一区块。由此数据库表中每条记录构成一条区块链,这样每个新的区块就会包含前一区块的信息。
1.3 数据存储流程
本文设计了区块链处理器完成数据的写入、读取、修改、删除和校验功能。数据存储过程如图1所示,在接收到交易数据Data后,后台连接数据库获取当前最新记录的哈希值并赋值给Prehash字段,对Data、Prehash和当前系统时间Timestamp一起进行哈希运算生成Data的摘要值Hash,然后使用发送者的私钥对Hash签名,最后将Data、Prehash、Timestamp、Hash和Signature一起写入数据库中。 为保证区块链完整性,不允许直接在数据库中修改或删除数据。为了符合多应用场景,有修改需求的需重新向后台提交,在数据库中生成一条有相同Id的新记录。用户查询数据时,后台会根据时间戳将最新记录返回给用户。若想要删除数据,将各个字段赋值null,提交给后台即可。
1.4 数据校验流程
图2为数据的校验过程,首先在数据库中检索最新记录的数据,然后对数据进行哈希运算,将运算结果与数据中的哈希值对比,若不匹配,则说明区块X中的哈希值被篡改;然后根据数据中的preHash字段在数据库中检索上条记录,若返回空值,则说明上条记录被删除或数据中的preHash被篡改;当检测到preHash为空或检测到数据被篡改时,结束循坏,将结果返回给用户。
2 区块链处理器
区块链处理器对存储数据进行编码,以区块的形式存入数据库中,并对数据库中区块链结构数据进行校验,验证数据是否被篡改。
2.1 数据存储算法
根据区块链数据结构定义,数据库表结构定义如下:
CREATE TABLE Blockchain
(
Field0 varchar(32),
Field1 varchar(32),
Field2 varchar(32),
…
prev_hash varchar(256), //前一区块哈希
hash varchar(256), //该区块哈希
timestamp timestamp, //时间戳
signature varchar(256) //交易签名
);
接收到交易数据data后,区块链处理器首先判断数据库表最新区块是否为空,若为空,则对prehash赋值为null;否则获取当前最新区块的哈希值赋值给prehash,然后对data、时间戳timestamp和prehash一起进行哈希运算,生成新区块的哈希值,最后将新区块写入数据库中。
算法1.数据插入算法
输入:交易数据data
//客户端加密
1. String preHash = 当前数据库中最新記录的摘要值hash;
2. String hash = hashEncrypt(data,timestamp, preHash);
3. signature = RSAEncrypt(hash,privateKey);
4. sendMessage(data,hash,preHash,timestamp, signature);
//服务器端解密,存入数据库
//hash1为对signature解密后的结果,hash为客户端发送的哈希值
5. data,hash,preHash,timestamp,signature = receive(data,hash,preHash,timestamp,signature);
6. hash1 = RSADecrypt(signature,publicKey);
7. if(compareHash(hash,hash1)){
8. //将数据写入数据库中
9. }else{
10. //返回错误信息
11. }
算法1的第1行~第4行是有客户端对数据使用哈希算法生成哈希值,使用用户私钥对数据的哈希值进行数字签名,并发送给服务器端。
第5行是服务器端接收客户端发送的数据。
第6行是使用用户公钥对签名signature解密。
第7行~第11行是判断解密哈希与发送的哈希值是否匹配。
2.2 数据校验算法
数据校验算法用于保证数据完整性,数据完整性遭到破坏的可能情况有两种:部分区块被删除和区块内数据被篡改。针对这两种情况我们提出以下算法判别数据完整性。
算法2 校验算法
输入:无
输出:数据未被篡改,返回null;检测异常返回检测出的第一条异常数据。
1. Data data = 当前最新区块数据;
2. String preHash = data.getPrehash();
3. while (preHash != null){
4. try{
5. dataPre = 前一区块哈希值;
6. } catch (Exception e){
7. return JsonData.buildError(-2,"前一区块数据被删除",data.getId());
8. } 9. String checkHash=HashUtils.genHash(data); //计算当前区块的哈希值
10. String hash=data.getHash();
11. if(checkHash!=hash){
12. return Jsondata.buildError(-3,"数据被篡改");
13. }
14. preHash = dataPre.hash();
15. if(preHash = null){
16. return Jsondata.buildSucess();
17. }
18. }
算法2是在时间顺序上向前遍历,第3行代码用于判别当前区块是否为初始区块。
第4行~第8行代码通过当前区块存储的prehash检索前一区块数据,若检索失败,说明前一区块数据被删除。
第9行~第13行代码通过对当前区块存储信息重新进行哈希运算来判别当前区块的数据是否被篡改。
第15行~第17行代码通过判断prehash是否为null来确认该链是否校验完成。
3 实验
3.1 试验1 篡改数据测试
将数据库中订单号为201910204291的区块信息进行修改,使用校验算法对发生篡改的区块链进行校验,查验数据完整性,查验结果如图3所示。
删除数据库中订单号为201910019023的区块的前一区块,使用校验算法对这条区块链进行校验,查验数据完整性,查验结果如图4所示。
3.2 试验2 数据校验性能测试
本文使用被动检测机制保证数据可信,交易数据按照时间顺序写入数据库中,交易信息校验过程中要获取当前交易数据和上一条数据的哈希值,使用算法重新当前交易的哈希值并与数据库中存储的哈希值相比较。我们测试在每条数据大小为322B,10000-50000条数据量情况下的校验速度,如图5所示,在10000-50000条数据范围内,数据校验速度与数据量大小成线性关系,在可接受的时间内保证数据可信。
3.3 试验3 数据版本对查询速率的影响
为保证数据以区块链的链式结构存储,不允许直接对数据库中的数据进行修改或删除,为满足对修改和删除的需求,我们通过在数据库写入有着相同主键的新记录完成修改和删除功能,在查询数据时仅显示时间戳最新的数据。我们设计了实验测试数据版本数对查询速率的影响,在10000条数据环境下,查询大小为297b大小的数据。实验结果如图6所示,在修改24次数据后,单次查询速度与修改4次数据后的单次查询速度并未有明显差距,说明版本数对数据查询速率影响极低。
4 结论
本文借鉴区块链思想提出了在关系型数据库中以区块链的链式结构存储数据的方法和被动检测机制,以此保证数据可信和数据检索速率。通过实验测试,实验数据表明在保证数据可信的基础上同时具有较高的数据检索速率;在一定数据量范围内,数据量与校验速度呈线性关系,可只对关键字段进行加密处理,减少算法运行时间,提高校验速度,之后会在此基础上进一步研究提高校验速率的方法。
参考文献
[1] 焦通, 申德荣, 聂铁铮, 寇月, 李晓华, 于戈. 区块链数据库: 一种可查询且防篡改的数据库[J]. 软件学报, 2019, 30(9): 2671-2685.
[2] 邵奇峰, 金澈清, 张召, 钱卫宁, 周傲英, 区块链技术: 架构及进展[OL]. (2017-11-15)[2019-12-03]. http://kns. cnki. net/kcms/detail/11. 1826. TP. 20171115. 2302. 006. html.
[3] Muhammad Muzammal, Qiang Qu, Bulat Nasrulin. Renovating blockchain with distributed databases: An open source system[J]. Future Generation Computer Systems, 2019, 90: 105-117.
[4] MANIFOLD TECHNOLOGY, INC, MENLO PARK, CA (US). BLOCKCHAIN-ENHANCED DATABASE[P]. US 2017/0228371, A1. Aug. 10, 201.
[5] Conaghy T, Marques R, Müller A, Jonghe DD, McConaghy TT, McMullen G, Henderson R, Bellemare S, Granzotto A. BigchainDB: A scable blockchain database[OL]. (2016-06-08) [2019-12-03]. https://www.bigchaindb.com/whitepaper.
[6] 騰讯FiT, 腾讯研究院. 腾讯区块链方案白皮书[Z]. WhitePaper, 2017.
[7] 蒋东东. 宝武集团区块链可信电子仓单系统的研发[D]. 西安: 西安工程大学, 2018.
[8] 葛利洁. 基于区块链技术的交易信息存储与查询系统的设计与实现[D]. 北京: 北京邮电大学, 2018.
[9] 北京众享比特科技有限公司. 基于区块链的数据库应用平台技术白皮书[Z]. WhitePaper, 2017.
[10] 张偲. 区块链技术原理、应用及建议[J]. 软件, 2016, 37(11): 51-54.
[11] 尚永强. 计算机网络信息安全中数据加密技术的探讨[J]. 软件, 2018, 39(12): 198-201.