张亚苹,杨少英
(广东科技学院 广东 东莞 523000)
根据有关部门的推测,预计在2025年时全世界的数据生产量会是2016年的10倍,数据预计达到163 ZB。如此庞大的数据增长促使数据存储行业进行改革发展,以指数形式增长的数据使得传统的集中式数据存储系统不堪重负。传统的数据存储系统几乎均采取中心管理式的存储方式,在如此大量的数据面前,传统的数据存储方案的集中管理可靠性低、扩展性差、成本昂贵等缺点被不停放大,如此一来传统的数据存储系统也将逐渐退出历史舞台。
伴随着云计算的横空出世,分布式的数据存储模式也随之诞生。分布式的存储服务器采用易于扩张的系统架构,使用散布在各个位置的存储服务器来共同存储数据,存储数据的位置信息由特定的服务器进行记录[1]。 然而分布式存储环境的不稳定以及高度集中化的管理,使得用户的数据面临泄露和被非法入侵的问题。为了在提供一定的数据存储服务能力的同时保障用户隐私安全,基于区块链的分布式存储系统由此诞生。
比特币的横空出世使得其底层技术区块链也首次踏入了21世纪,无中心服务器管理的分布式存储系统最大的特性就是安全、无第三方机构参与,同时利用点对点通信网络来实现性能高效、成本低廉等特性。与传统的数据存储方案相比,利用区块链技术构建的数据存储方案可以有效地确保数据的完整性和有效性,同时区块链也为全世界的数据存储行业提供一个新的存储方向从而缓解大量数据的存储压力[2]。
本系统是基于区块链实现的简易数据存储服务器,该系统可以较为良好地实现区块链的基础特性。存储于该服务器中的数据具有不可篡改的特性,同时本系统是去中心化管理的,没有服务器会对系统进行维护,因此在系统运行时要确保应用层的功能尽可能地简便,而底层支持功能要尽可能地完善以保障系统的正常运转。系统应用层的功能是:数据发送和数据展示功能。系统的底层支持功能主要有:提交数据(挖矿)、注册节点、冲突解决等。综上所述,本系统可以分为应用层与底层支持两个模块,如图1所示。
图1 系统总体框图
1.2.1 点对点网络通信
点对点网络(peer-to-peer)又名对等式网络,是一个无服务器管理的开放式节点网络,网络由各个节点共同维护。在点对点网络中用户可以作为节点参与整个服务器,节点可以同时作为前端与后端,前端为用户提供相应功能,后端则是在后台作为服务器进行使用。在对等式网络中节点与节点之间无法直接进行联系,节点与节点之间的交互联系必须依靠网络来实现。在一个开放的点对点网络中,每个节点都可以拥有完整的数据,即便单点出现故障也很难影响整个系统的数据安全[3]。
1.2.2 数字加密技术
数字加密技术简而言之就是将一段需要进行保护的文件数据通过特定的算法手段将其变成一段无意义的数据,文件接收者可以通过特定的算法对无意义的数据进行还原,数据内容在还原后不会发生变化,在文件数据的加密过程中可以有效地保护数据的安全。加密技术根据使用方法不同可以分为:对称加密和非对称加密。
1.2.3 共识机制
共识机制是区块链技术关键的组件,在区块链的分布式存储管理中,由于缺乏中心服务器的管理,在新数据被写入服务器后,节点之间更新数据的速度不一样,共识机制的存在可以确保节点之间达成共识,可以确保节点之间存储的数据具有一致性[4]。目前主流的共识机制有:工作量证明机制(POW)、权益证明机制(POS)、股份授权证明机制(DPOS)、验证池(POOL)。
1.2.4 区块链技术
区块链从原理上可以理解成是一个无中心服务器管理的分布式数据库。区块链由众多合法的区块共同连接而成,每个区块都存储着其自身的哈希值,区块哈希值依据哈希算法不可逆地产生,因此每个区块都有不同的特征值。同时每个区块都存储着上一个区块的哈希值和区块被创建时的时间戳,区块链通过相邻区块的哈希值进行连接。因而如果想要修改某一个区块上的数据,从理论上应该修改3个及以上数量的区块信息才可实现。但由于区块链的分布式网络的存在,数据篡改几乎难以实现,如果拥有具有修改区块链数据的算力,通过篡改数据获得的收益远不如在区块链系统中合法“挖矿”获得的奖励。公有链是完全开放的网络,其特点是任何用户均可注册加入该网络。完全开放的公有链中不存在任何服务器或组织对节点网络进行管理,因此公有链的去中心化程度是三类区块链中最高的。公有链的代表是出现时间最早,发展也最为成熟的比特币交易系统[5]。
私有链是由某个机构或个人控制的区块链。用户想要将数据写入区块或者创建新区块,需得到机构或相关节点的授权。私有链与公有链对比,交易的周期花费的时间更短,交易的成本更为廉价。私有链在保护用户数据这一方的性能也更加优越,因为私有链的区块链信息不会对全网公开。联盟链,是在多方机构共同监督下运行的区块链,由机构控制网络中的节点,再利用节点来存储区块链中的数据,多方组织机构共同维护整条区块链的利益。从本质上而言,联盟链算是一种特殊私有链,不过相对于普通的私有链,联盟链的去中心化程度较高。联盟链的代表为蚂蚁金服于2020年推出的蚂蚁联盟链,其旨在通过一种更为简便的方式来实现商业的联盟链发展,帮助小微企业在不同的区块链上开发更好的应用以及智能合约。
本系统基于Python语言进行编码开发,前端网页使用Python的Flask框架。Flask与Python有很好的兼容性,可以较为出色地完成网页的开发。
Flask框架诞生于2010年,是一个用Python语言基于werkzeug工具箱编写的轻量级Web开发框架。它主要面向内容较少、周期较短的小项目。依赖其简易的使用特性可以较为出色地完成本系统的框架搭建。
下面将对Flask中使用到的路由协议和Http常用的请求方法进行简单的描述。
2.1.1 路由(Route)
当用户在使用网页发送数据时,网页会将用户的请求转交发送给程序实例,在程序实例中记载了接收到不同请求时应返回的数据内容。由于程序实例中无法直接处理多种类型的请求,需要一个中介进行信息的转换,可以使得程序实例在接收到网页发送的请求时,可以直接返回相应的内容。这个进行信息转换的中介便是路由,在路由中存储了各种请求与对应的特定函数的关系表,在FLASK中使用route()来将用户的请求转换成程序实例中的函数。
2.1.2 Http的常用请求方法
Http协议是一个使用范围最大的Internet协议,目前主流的请求方式有8种,分别是GET、POST、HEAD、PUT、DELETE、OPTIONS、TRACE、CONNECT。
下面将对GET、POST、PUT方法进行简单的介绍。
GET方法是利用特定的URI在特定的服务器中发出请求信息,可以简单理解为GET方法是用于请求获取指定的资源。GET请求是可以被浏览器进行记录保存的,当发生遗漏时,用户可以在浏览器的历史访问记录中找回GET请求。GET请求只能用于向指定资源请求获取数据,请求长度也存成一定的限制。
POST方法可以将数据发送至指定的资源中,使得服务器创建新的资源或者修改已有的资源。与上述的GET请求不同,浏览器无法记录POST请求,请求的内容也不存在限制。
PUT方法,PUT请求的功能也是向服务器进行信息的发送。PUT方法与POST方法的不同之处在于,POST请求每次都会让服务器创建一个文件,而PUT请求只是请求服务器将资源进行更新。可以简单理解为,PUT请求用于更新资源,POST请求用于创建资源。
区块链中任何一个区块都需包含上一个区块的哈希值、本区块的哈希值、数据内容、时间戳这四项最为基础的信息。区块如图2所示。
图2 区块框图
初始区块(祖先区块):祖先区块是区块链最初始的一环,它后面连接着众多区块。祖先区块的区块信息中不含上一区块的哈希值,这是最为关键的不同之处。区块连接图如3所示。
图3 区块连接图
本系统采用简单的工作量证明机制,系统需计算出一段满足系统需求的数字。计算难度设置在计算出一段特殊数字中开头数字为0的数量,程序思想采用穷举法实现。程序如下所示:
计算出一串特殊的数字后,需对该数字再次进行验证,验证通过后才能确认这一段特殊数字的有效性。验证的方法是直接验证特殊数字是否满足设置的难度要求,验证规则是判断数字0的数量是否大于或等于难度要求的数量。
程序示例:guessHash[:4]=='0000',这段程序中数字0的数量可以进行改变,比特币系统也同样使用这类最为简便直接有效的验证方法。但比特币的难度是处于动态的自我调节中,由系统进行自动调整计算难度。比特币系统会根据在目前算力环境下所花费的时间进行调整。截至今天计算难度已经达到21.87T,需计算出前17位数字为0的特殊数字(哈希值)。具体实现流程图如图4所示。
图4 POW模块程序流程框图
本系统采用Python的Flask框架来实现添加API接口,API接口是后端负责接收请求、响应纯数据的端口。对于区块链系统而言,实现新交易数据、查询显示数据、注册节点模块、解决冲突模块都是非常关键。在所实现的技术领域上应当将区块链的整体设计与模块化的实现关联起来,让系统表现得更加充分。
创建一个接口供于提交新数据,提交的数据包括作者及其数据。首先获取信息数据,将获取的内容转换成JSON格式。再确认接收的数据是否满足“作者+内容”的数据格式,若满足则将其添加至新数据,不满足则返回提交数据不符合规则的提示。
创建一个API,该API的功能用于返回区块链中的交易内容。这个接口可以获取完整的区块链内容,并将其按照时间顺序进行显示。
注册节点不同于上述的提交交易模块和显示数据模块,注册节点是POST请求,不是GET请求。用户需使用Postman软件或者curl来实现注册节点。注册节点需要注意注册节点的格式,其格式需满足要求。
服务器网络处于一个动态的变化之中,不断有新区块的产生,当网络中的节点确认的区块数量发生分歧时,需要一个解决冲突的方案。方案采用最为简便有效的方法,最长链唯一有效制。模块思想是寻求最长的链,并将出现问题节点的链的长度二者进行比较,链的长度较长的一方有效,将取代另一方。由此,冲突模块能够让区块链系统形成协调作用。
系统基于一个单机网络,无法实现其他设备对系统的访问,在后续可以考虑设计局域网络实现接入同一个网络均可访问的功能;系统处于一个开放的输入环境,用户输入的昵称是操作者个人进行输入的,无法有效地验证其身份。由于用户的不确定性身份,无法在系统中实现数字签名的功能;新注册的节点无法实现单独挖矿的功能,故新注册的节点只能进行查看区块链的操作,在后续的改善中希望可以实现新注册节点实现“挖矿”的操作。