1.本发明涉及数据加密安全通信领域,具体是一种基于区块链的船舶轨迹监测系统。
背景技术:
::2.内河航运是我国水上交通运输的重要渠道,它具有便捷、快速和运输量大的特点,我国依靠得天独厚的地理环境优势,从19世纪30年代至今,全国内河航道通航里程达12.77万公里,通航货运量也逐年增加,据统计2020年仅单月货运量已高达70659万吨,因此,航道的安全与畅通成为了水上交通运输的重要保障。目前,内河航道基本实现了数字化、智能化和网络化。虽然数字化航道建设带来了一定的成效,但由于航道环境复杂恶劣,比如:水深流急、洲滩演变频繁、河床演变剧烈、通信信号不稳定、信号盲区多等,船舶通行指挥系统容易遭受黑客入侵,以上因素导致接收的ais数据缺失或被篡改、轨迹回溯不连续、事故取证难等问题。当控制河段内出现海损事故,如:谎报船位导致上下水船舶同时进槽相撞,肇事船舶撞毁航标逃逸导致后船偏航、搁浅或相撞,船舶损坏岸基设备逃逸等,如果该辖区内的信号台无法准确连续地回溯船舶ais位置信息,航道监管部门因数据证据不充分而无法定位肇事船舶,导致航道监管部门查证困难、权威受到挑衅,国家经济蒙受损失。3.目前,内河航道控制河段船舶轨迹回溯方案仅解决了ais数据如何在单一节点上的存储问题,不具备轨迹数据防篡改和灾备能力。技术实现要素:4.本发明的目的是提供一种基于区块链的船舶轨迹监测系统,包括主通信节点a0和n个副本通信节点。5.所述主通信节点a0和n个副本通信节点组成区块链。6.所述区块链存储ais信息。7.所述副本通信节点从区块链中获取ais信息,完成轨迹回溯查询。8.所述区块链存储ais信息的步骤包括:9.i)任意副本通信节点a接收船舶发送的加密ais信息racca,并对加密ais信息racca进行解析,得到ais信息raccaa=y(racca)。y表示解析协议。a∈{a1,a2···an}。{a1,a2···an}为副本通信节点。10.ii)所述副本通信节点a对接收到的ais信息raccaa进行加密,生成数字摘要信息m,并由数字摘要m生成数字签名(r,s)。所述副本通信节点a在区块链中广播数据raccaa、数字签名(r,s)、副本通信节点a的公钥pa。11.iii)任意副本通信节点b接收到副本通信节点a广播的信息,记为信息m′、数字签名(r′,s′)、副本通信节点a的公钥pa。b∈{a1,a2···an},且b≠a。12.iv)副本通信节点b对信息m′进行验证,若验证通过,则进入步骤v),否则,拒绝接收副本通信节点a广播的信息。13.v)所述副本通信节点b对信息m′进行解密和冗余处理,得到信息r′m={r′x1,r′x2···r′xk}。14.vi)所述副本通信节点b对信息r′m中的每个元素进行hash运算,得到若干j级hash块。其中,元素r′xi对应的j级hash块node0i=hash(r′xi),i=1,2···k。j初始值为1。15.vii)所述副本通信节点b将相邻两个j级hash块串联,并对相邻两个j级hash块进行hash运算,得到j+1级hash块node1(i+1)/2=hash(node0i+node0i+1),i=1,3,5···k-1。若k为为奇数,则末端j+1级hash块node1(i+1)/2=hash(node0i)。16.viii)令j=j+1,并返回步骤vii),直至生成hash值merkleroot,记为mtr。17.所述副本通信节点从区块链中获取ais信息的步骤包括:18.1)副本通信节点ax向主节点a0发送请求指令request。所述请求指令request携带的信息包括请求操作o、时间戳ts、副本通信节点ax的标识client_id、副本通信节点ax的信息msg、副本通信节点ax的公钥pclientx、数字签名sigclientx,x∈{1,2···n}。19.2)主节点a0接收到请求指令request后,利用公钥pclientx校验请求指令request中的数字签名sigclientx,若验证通过,则主节点a0为副本通信节点ax的请求指令分配编号id∈[h,h],并在区块链中广播pre-prepare请求。所述pre-prepare请求携带的信息包括视图编号viewnum、副本通信节点ax的消息摘要dmsg、副本通信节点ax的消息msg、主节点a0公钥pa0、主节点a0数字签名siga0、编号id。[0020]3)副本通信节点ay接收到主节点a0发送的pre-prepare请求后,对pre-prepare请求进行验证,若验证通过,则在区块链中广播prepare请求,否则,拒绝pre-prepare请求。所述prepare请求携带的信息包括视图编号viewnum、消息摘要dpre=dmsg、当前副本通信节点编号y-》num、编号id、副本通信节点ay公钥pay、副本通信节点ay数字签名sigay[0021]4)所述主节点a0和副本通信节点接收到prepare请求后,对prepare请求进行验证,若验证通过,则将验证通过的反馈信息i发送至副本通信节点ay。[0022]5)若副本通信节点ay接收到2f+1个验证通过的反馈信息i,则在区块链中广播commit请求。f为系统中失效节点最大个数。commit请求携带的信息包括视图编号viewnum、消息摘要dcom=dpre=dmsg、当前副本通信节点编号y-》num、副本通信节点ay数字签名sigay。[0023]6)主节点a0和副本通信节点接收到commit请求后,对commit请求进行验证,若验证通过,则将验证通过的反馈信息ii发送至副本通信节点ay。[0024]7)若副本通信节点ay接收到2f+1个验证通过的反馈信息ii,则运行请求操作o,并向副本通信节点ax反馈reply信息。所述reply信息携带的信息包括视图编号viewnum、时间戳ts、副本通信节点ax的标识client_id、请求操作结果r。[0025]8)副本通信节点ax判断接收到的reply信息数量是否大于等于f+1,若是,则进入步骤9),否则重新向主节点a0发送请求指令,并返回步骤2)。[0026]9)主节点a0将区块上传至区块链。所述区块包括区块头和区块体。所述区块头携带的信息包括区块版本号v_id、当前区块哈希值mtr、时间戳、前一个区块的哈希值、主节点的数字签名sigaviewnum。所述区块体携带的信息包括历史间隔时间tais的ais数据。[0027]10)查询方向主节点a0发送查询请求inquire。所述查询请求inquire携带的信息包括请求操作o、时间戳ts、查询方的用户名username、查询方的密码password、查询条件conditionw、查询方公钥keypw。[0028]11)主节点a0利用私钥keysw对查询请求inquire进行解密。解密后,主节点a0根据查询条件conditionw对区块数据遍历查询,得到查询结果resinqdata,并将查询结果resinqdata发送至查询方。所述查询结果resinqdata携带的信息包括时间戳、ais数据、查询方公钥keypw。[0029]12)查询方接收查询结果resinqdata,并根据查询方公钥keypw对查询结果resinqdata进行解密,得到查询的ais数据。查询方将ais映射至电子航道图完成轨迹回溯查询。[0030]进一步,n个副本通信节点分为轻量化节点和全节点。[0031]所述轻量化节点包括控制河段岸基信号台。所述轻量化节点存储区块头数据。[0032]所述全节点包括航道监管部门节点。所述全节点存储区块数据。[0033]进一步,所述ais信息包括船舶mmsi号、ais发送时间、船舶名称、船舶类型、航向、船舶位置、对地船速、对地航速、航艏向、航道状态、转向率。[0034]进一步,所述副本通信节点、查询方均存储有海事数字证书认证中心ca颁发的数字证书。[0035]进一步,对接收到的ais信息ra进行加密的步骤包括:[0036]1)计算数据e=sm3(m″)。其中,参数m″=z||m。m是需要被签名的消息,且{m∈m1,m2···mk}。参数z=sm3(entl||id||a||b||xg||yg||xa||ya)。entl为id的比特长度。id为用户身份标识。(xg,yg)为加密曲线基点坐标,(xa,ya)为用户的公钥。[0037]2)产生随机数q∈[1,n-1]。n为g的阶。g为加密曲线基点。[0038]3)计算加密曲线点g1(x1,y1)=[q]g。[0039]3)计算参数r=(e+x1)modn,若r=0或r+q=n,则返回步骤2),否则,进入步骤4)。[0040]4)计算参数s=((1+da)-1·(q-r·da))modn,若s=0,则返回步骤2),否则进入步骤5)。da∈[1,n-2]是节点私钥。公钥pa=[da]g=(xa,ya)。[0041]5)将解析后的数据ra、数字签名(r,s)、公钥p以p2p方式广播给网络中其他节点。[0042]进一步,根据副本通信节点a的公钥对信息m′进行验证的步骤包括:[0043]1)检验参数r′∈[1,n-1]是否成立,若不成立则验证不通过,若成立,则进入步骤2)。[0044]2)检验初始s′∈[1,n-1]是否成立,若不成立则验证不通过,若成立,则进入步骤3)。[0045]3)计算数据e′=sm3(m″′)。m″′=z||m′。[0046]4)计算参数u=(r′+s′)modn,若u=0,则验证不通过,否则,进入步骤5)。[0047]5)计算加密曲线点(x1,y1)=[s]g+[u]pa。[0048]6)计算参数r=(e′+x′1)modn,并检验r=r′是否成立,若成立则验证通过,否则验证不通过。[0049]进一步,对信息m′进行冗余处理的步骤包括:[0050]1)记节点本地内存池中的数据为rl。[0051]2)对信息m′中的第i条数据m′x→i与数据rl进行比较,如果数据rl包含数据m′x→i,就舍弃数据m′x→i,否则,将数据m′x→i写入数据rl中。i初始值为1。[0052]3)令i=i+1,并重复步骤2),直至信息m′中所有数据均比较完毕,得到rm={rx1,rx1···rxk}。[0053]4)对数据rm中的元素进行拆解,得到时间戳数组tsarr={ts1,ts2···tsk}。根据时间戳对数据rm进行重新排序,得到信息r′m={r′x1,r′x2···r′xk}。[0054]进一步,对pre-prepare请求进行验证的步骤包括:[0055]1)利用公钥pa0校验数字签名siga0是否正确,若正确,则进入步骤2),若不正确,验证不通过。[0056]2)判断当前副本通信节点是否已经收到视图编号viewnum、编号id相同的pre-prepare请求,若是,则验证不通过,否则,进入步骤3)。[0057]3)对信息msg进行摘要运算,并判断摘要运算结果与摘要dmsg是否一致,若不一致,则验证不通过,若一致,则进入步骤4)。[0058]4)判断h≤id≤h是否成立,若成立,则验证通过,否则,验证不通过。[0059]进一步,对prepare请求进行验证的步骤包括:[0060]1)验证prepare携带的数字签名是否正确,若正确,则进入步骤2),若不正确,验证不通过。[0061]2)判断当前副本通信节点是否已经收到视图编号viewnum、编号id相同的prepare请求,若是,则验证不通过,否则,进入步骤3)。[0062]3)判断摘要dpre与当前已收到pre-pprepare请求中的摘要dmsg是否相同,若不同,则验证不通过,若相同,则进入步骤4)。[0063]4)判断h≤id≤h是否成立,若成立,则验证通过,否则,验证不通过。[0064]进一步,对commit请求进行验证的步骤包括:[0065]1)验证commit携带的数字签名是否正确,若正确,则进入步骤2),若不正确,验证不通过。[0066]2)判断当前副本通信节点是否已经收到视图编号viewnum、编号id相同的commit请求,若是,则验证不通过,否则,进入步骤3)。[0067]3)对信息msg进行摘要运算,并判断摘要运算结果与摘要dcom是否一致,若不一致,则验证不通过,若一致,则进入步骤4)。[0068]4)判断h≤id≤h是否成立,若成立,则验证通过,否则,验证不通过。[0069]进一步,所述查询方经过了注册,注册步骤包括:[0070]1)记需查询船舶轨迹的查询方为w。查询方w在前端生成密钥(pw,sw),查询方w向主节点a0发送注册请求register。注册请求register携带的信息包括注册操作、时间戳ts、查询方用户名username、查询方密码password、查询方身份信息id_card、查询方公钥pw、查询方数字签名sigw。[0071]2)主节点a0执行查询方注册操作,为查询方具备查询权限的权限码permission_id和授权的查询方密钥对(keypw,keysw)。[0072]本发明的技术效果是毋庸置疑的,本发明通过区块链技术,解决了船舶轨迹数据因单一节点故障或损坏导致数据无法查证的问题,解决ais因信号不稳定、信号台电脑或服务器系统故障、磁盘损坏等多种因素带来的数据缺失问题,降低数据被篡改的风险,保证ais轨迹数据回溯的连续性、准确性、安全性,增强数据容灾备份能力。降低了ais数据被篡改的风险,增强了ais数据存储的安全性和轨迹回溯的可信性,本系统兼备数据存储节点强认证、数据防篡改、抗攻击等优势。[0073]本发明针对船舶上传的ais数据进行处理时主要通过轻量化节点进行冗余校验和计算,主节点只针对轻量化节点计算结束后的广播数据进行排序、hash计算、区块生成,本发明将主节点部分计算边缘化,不仅降低了主节点负担,也加快了区块的生成速度;[0074]本发明在认证过程中采用第三方ca机构颁发证书进行数字认证,使用了公钥、私钥、数字签名,完全保证了数据的安全性、准确性;[0075]本发明采用了包含非对称加密算法sm2、摘要算法sm3等的国密算法,可实现系统核心单元自主可控,核心算法不依赖于国外,不仅有更高的安全性,还降低了重要信息泄露的风险。[0076]在区块生成过程中,本发明未使用浪费资源严重的工作量证明机制,而是采用节点选举方法实现全网节点的共识计算,降低了资源的浪费和损耗。[0077]本发明采用排序算法时间复杂度仅为n*logn,运算高效快速。[0078]本发明是一种基于区块链技术的船舶轨迹监测系统,主要解决航道监管机构对船舶运行轨迹全过程的准确回溯问题,有效防止船舶轨迹数据篡改以及节点异常带来的数据缺失,文中所使用的强碰撞性国密算法保证了数据的安全性和保密性,使用节点边缘化计算汇总的方式降低全节点负荷,减少资源浪费,能够防止黑客攻击。附图说明[0079]图1为基于区块链的船舶轨迹监测系统结构图;[0080]图2为区块数据结构图;[0081]图3为基于区块链的船舶轨迹回溯流程图;[0082]图4为根据ais数据时间戳重排列数据的流程图;[0083]图5为节点共识计算流程图;[0084]图6为节点视图变更流程图;[0085]图7为数据船舶轨迹数据查询流程图。具体实施方式[0086]下面结合实施例对本发明作进一步说明,但不应该理解为本发明上述主题范围仅限于下述实施例。在不脱离本发明上述技术思想的情况下,根据本领域普通技术知识和惯用手段,做出各种替换和变更,均应包括在本发明的保护范围内。[0087]实施例1:[0088]参见图1至图7,一种基于区块链的船舶轨迹监测系统,包括主通信节点a0和n个副本通信节点。[0089]所述主通信节点a0和n个副本通信节点组成区块链。[0090]所述区块链存储ais信息。[0091]所述副本通信节点从区块链中获取ais信息,完成轨迹回溯查询。[0092]所述区块链存储ais信息的步骤包括:[0093]i)任意副本通信节点a接收船舶发送的加密ais信息racca,并对加密ais信息racca进行解析,得到ais信息raccaa=y(raccaa)。y表示解析协议。a∈{a1,a2···an}。{a1,a2···an}为副本通信节点。[0094]ii)所述副本通信节点a对接收到的ais信息raccaa进行加密,生成数字摘要信息m,并通过摘要m生成数字签名(r,s)。所述副本通信节点a在区块链中广播数据raccaa、数字签名(r,s)、副本通信节点a的公钥pa。[0095]iii)任意副本通信节点b接收到副本通信节点a广播的信息,记为信息m′、数字签名(r′,s′)、副本通信节点a的公钥pa。b∈{a1,a2···an},且b≠a。[0096]iv)副本通信节点b对信息m′进行验证,若验证通过,则进入步骤v),否则,拒绝接收副本通信节点a广播的信息。[0097]v)所述副本通信节点b对信息m′进行解密和冗余处理,得到信息r′m={r′x1,r′x2···r′xk}。[0098]vi)所述副本通信节点b对信息r′m中的每个元素进行hash运算,得到若干j级hash块。其中,元素r′xi对应的j级hash块node0i=hash(r′xi),i=1,2···k。j初始值为1。[0099]vii)所述副本通信节点b将相邻两个j级hash块串联,并对相邻两个j级hash块进行hash运算,得到j+1级hash块node1(i+1)/2=hash(node0i+node0i+1),i=1,3,5···k-1。若k为为奇数,则末端j+1级hash块node1(i+1)/2=hash(node0i)。[0100]viii)令j=j+1,并返回步骤vii),直至生成hash值merkleroot,记为mtr。[0101]所述副本通信节点从区块链中获取ais信息的步骤包括:[0102]1)副本通信节点ax向主节点a0发送请求指令reruest。所述请求指令request携带的信息包括请求操作o、时间戳ts、副本通信节点ax的标识client_id、副本通信节点ax的信息msg、副本通信节点ax的公钥pclientx、数字签名sigclientx,x∈{1,2···n}。[0103]2)主节点a0接收到请求指令request后,利用公钥pclientx校验请求指令request中的数字签名sigclientx,若验证通过,则主节点a0为副本通信节点ax的请求指令分配编号id∈[h,h],并在区块链中广播pre-prepare请求。所述pre-prepare请求携带的信息包括视图编号viewnum、副本通信节点ax的消息摘要dmsg、副本通信节点ax的消息msg、主节点a0公钥pa0、主节点a0数字签名siga0、编号id。[0104]3)副本通信节点ay接收到主节点a0发送的pre-prepare请求后,对pre-prepare请求进行验证,若验证通过,则在区块链中广播prepare请求,否则,拒绝pre-prepare请求。所述prepare请求携带的信息包括视图编号viewnum、消息摘要dpre=dmsg、当前副本通信节点编号y-》num、编号id、副本通信节点ay公钥pay、副本通信节点ay数字签名sigay[0105]4)所述主节点a0和副本通信节点接收到prepare请求后,对prepare请求进行验证,若验证通过,则将验证通过的反馈信息i发送至副本通信节点ay。[0106]5)若副本通信节点ay接收到2f+1个验证通过的反馈信息i,则在区块链中广播commit请求。f为系统中失效节点最大个数。commit请求携带的信息包括视图编号viewnum、消息摘要dcom=dpre=dmsg、当前副本通信节点编号y-》num、副本通信节点ay数字签名sigay。[0107]6)主节点a0和副本通信节点接收到commit请求后,对commit请求进行验证,若验证通过,则将验证通过的反馈信息ii发送至副本通信节点ay。[0108]7)若副本通信节点ay接收到2f+1个验证通过的反馈信息ii,则运行请求操作o,并向副本通信节点ax反馈reply信息。所述reply信息携带的信息包括视图编号viewnum、时间戳ts、副本通信节点ax的标识client_id、请求操作结果r。[0109]8)副本通信节点ax判断接收到的reply信息数量是否大于等于f+1,若是,则进入步骤9),否则重新向主节点a0发送请求指令,并返回步骤2)。[0110]9)主节点a0将区块上传至区块链。所述区块包括区块头和区块体。所述区块头携带的信息包括区块版本号v_id、当前区块哈希值mtr、时间戳、前一个区块的哈希值、主节点的数字签名sigaviewnum。所述区块体携带的信息包括历史间隔时间tais的ais数据。[0111]10)查询方向主节点a0发送查询请求inquire。所述查询请求inquire携带的信息包括请求操作o、时间戳ts、查询方的用户名username、查询方的密码password、查询条件conditionw、查询方公钥keypw。[0112]11)主节点a0利用私钥keysw对查询请求inquire进行解密。解密后,主节点a0根据查询条件conditionw对区块数据遍历查询,得到查询结果resinqdata,并将查询结果resinqdata发送至查询方。所述查询结果resinqdata携带的信息包括时间戳、ais数据、查询方公钥keypw。[0113]12)查询方接收查询结果resinqdata,并根据查询方公钥keypw对查询结果resinqdata进行解密,得到查询的ais数据。查询方将ais映射至电子航道图完成轨迹回溯查询。[0114]n个副本通信节点分为轻量化节点和全节点。[0115]所述轻量化节点包括控制河段岸基信号台。所述轻量化节点存储区块头数据。[0116]所述全节点包括航道监管部门节点。所述全节点存储区块数据。[0117]所述ais信息包括船舶mmsi号、ais发送时间、船舶名称、船舶类型、航向、船舶位置、对地船速、对地航速、航艏向、航道状态、转向率。[0118]所述副本通信节点、查询方均存储有海事数字证书认证中心ca颁发的数字证书。[0119]对接收到的ais信息ra进行加密的步骤包括:[0120]1)计算数据e=sm3(n″)。其中,参数m″=z||m。m是需要被签名的消息,且{m∈m1,m2···mk}。参数z=sm3(entl||id||a||b||xg||yg||xa||ya)。entl为id的比特长度。id为用户身份标识。(xg,yg)为加密曲线基点坐标,(xa,ya)为用户的公钥。[0121]2)产生随机数q∈[1,n-1]。n为g的阶。g为加密曲线基点。[0122]3)计算加密曲线点g1(x1,y1)=[q]g。[0123]3)计算参数r=(e+x1)modn,若r=0或r+q=n,则返回步骤2),否则,进入步骤4)。[0124]4)计算参数s=((1+da)-1·(q-r·da))modn,若s=0,则返回步骤2),否则进入步骤5)。da∈[1,n-2]是节点私钥。公钥pa=[da]g=(xa,ya)。[0125]5)将解析后的数据ra、数字签名(r,s)、公钥p以p2p方式广播给网络中其他节点。[0126]根据副本通信节点a的公钥对信息m′进行验证的步骤包括:[0127]1)检验参数r′∈[1,n-1]是否成立,若不成立则验证不通过,若成立,则进入步骤2)。[0128]2)检验初始s′∈[1,n-1]是否成立,若不成立则验证不通过,若成立,则进入步骤3)。[0129]3)计算数据e′=sm3(m″′)。m″′=z||m′。[0130]4)计算参数u=(r′+s′)modn,若u=0,则验证不通过,否则,进入步骤5)。[0131]5)计算加密曲线点(x1,y1)=[s]g+[u]pa。[0132]6)计算参数r=(e′+x′1)modn,并检验r=r′是否成立,若成立则验证通过,否则验证不通过。[0133]对信息m′进行冗余处理的步骤包括:[0134]1)记节点本地内存池中的数据为rl。[0135]2)对信息m′中的第i条数据m′x→i与数据rl进行比较,如果数据rl包含数据m′x→i,就舍弃数据m′x→i,否则,将数据m′x→i写入数据rl中。i初始值为1。[0136]3)令i=i+1,并重复步骤2),直至信息m′中所有数据均比较完毕,得到rm={rx1,rx1···rxk}。[0137]4)对数据rm中的元素进行拆解,得到时间戳数组tsarr={ts1,ts2···tsk}。根据时间戳对数据rm进行重新排序,得到信息r′m={r′x1,r′x2···r′xk}。[0138]对pre-prepare请求进行验证的步骤包括:[0139]1)利用公钥pa0校验数字签名siga0是否正确,若正确,则进入步骤2),若不正确,验证不通过。[0140]2)判断当前副本通信节点是否已经收到视图编号viewnum、编号id相同的pre-prepare请求,若是,则验证不通过,否则,进入步骤3)。[0141]3)对信息msg进行摘要运算,并判断摘要运算结果与摘要dmsg是否一致,若不一致,则验证不通过,若一致,则进入步骤4)。[0142]4)判断h≤id≤h是否成立,若成立,则验证通过,否则,验证不通过。[0143]对prepare请求进行验证的步骤包括:[0144]1)验证prepare携带的数字签名是否正确,若正确,则进入步骤2),若不正确,验证不通过。[0145]2)判断当前副本通信节点是否已经收到视图编号viewnum、编号id相同的prepare请求,若是,则验证不通过,否则,进入步骤3)。[0146]3)判断摘要dpre与当前已收到pre-pprepare请求中的摘要dmsg是否相同,若不同,则验证不通过,若相同,则进入步骤4)。[0147]4)判断h≤id≤h是否成立,若成立,则验证通过,否则,验证不通过。[0148]对commit请求进行验证的步骤包括:[0149]1)验证commit携带的数字签名是否正确,若正确,则进入步骤2),若不正确,验证不通过。[0150]2)判断当前副本通信节点是否已经收到视图编号viewnum、编号id相同的commit请求,若是,则验证不通过,否则,进入步骤3)。[0151]3)对信息msg进行摘要运算,并判断摘要运算结果与摘要dcom是否一致,若不一致,则验证不通过,若一致,则进入步骤4)。[0152]4)判断h≤id≤h是否成立,若成立,则验证通过,否则,验证不通过。[0153]所述查询方经过了注册,注册步骤包括:[0154]1)记需查询船舶轨迹的查询方为w。查询方w在前端生成密钥(pw,sw),查询方w向主节点a0发送注册请求register。注册请求register携带的信息包括注册操作、时间戳ts、查询方用户名username、查询方密码password、查询方身份信息id_card、查询方公钥pw、查询方数字签名sigw。[0155]2)主节点a0执行查询方注册操作,为查询方具备查询权限的权限码permission_id和授权的查询方密钥对(keypw,keysw)。[0156]实施例2:[0157]参见图1至图7,一种基于区块链的船舶轨迹监测系统,包括主通信节点a0和n个副本通信节点。[0158]所述主通信节点a0和n个副本通信节点组成区块链。[0159]所述区块链存储ais信息。[0160]所述副本通信节点从区块链中获取ais信息,完成轨迹回溯查询。[0161]所述区块链存储ais信息的步骤包括:[0162]i)任意副本通信节点a接收船舶发送的加密ais信息racca,并对加密ais信息racca进行解析,得到ais信息raccaa=y(raccaa)。y表示解析协议。a∈{a1,a2···an}。{a1,a2···an}为副本通信节点。[0163]ii)所述副本通信节点a对接收到的ais信息raccaa进行加密,生成数字摘要信息m,并通过摘要m生成数字签名(r,s)。所述副本通信节点a在区块链中广播数据raccaa、数字签名(r,s)、副本通信节点a的公钥pa。[0164]iii)任意副本通信节点b接收到副本通信节点a广播的信息,记为信息m′、数字签名(r′,s′)、副本通信节点a的公钥pa。b∈{a1,a2···an},且b≠a。[0165]iv)副本通信节点b对信息m′进行验证,若验证通过,则进入步骤v),否则,拒绝接收副本通信节点a广播的信息。[0166]v)所述副本通信节点b对信息m′进行解密和冗余处理,得到信息r′m={r′x1,r′x2···r′xk}。[0167]vi)所述副本通信节点b对信息r′m中的每个元素进行hash运算,得到若干j级hash块。其中,元素r′xi对应的j级hash块node0i=hash(r′xi),i=1,2···k。j初始值为1。[0168]vii)所述副本通信节点b将相邻两个j级hash块串联,并对相邻两个j级hash块进行hash运算,得到j+1级hash块node1(i+1)/2=hash(node0i+node0i+1),i=1,3,5···k-1。若k为为奇数,则末端j+1级hash块node1(i+1)/2=hash(node0i)。[0169]viii)令j=j+1,并返回步骤vii),直至生成hash值merkleroot,记为mtr。[0170]所述副本通信节点从区块链中获取ais信息的步骤包括:[0171]1)副本通信节点ax向主节点a0发送请求指令request。所述请求指令request携带的信息包括请求操作o、时间戳ts、副本通信节点ax的标识client_id、副本通信节点ax的信息msg、副本通信节点ax的公钥pclientx、数字签名sigclientx,x∈{1,2···n}。[0172]2)主节点a0接收到请求指令request后,利用公钥pclientx校验请求指令request中的数字签名sigclientx,若验证通过,则主节点a0为副本通信节点ax的请求指令分配编号id∈[h,h],并在区块链中广播pre-prepare请求。所述pre-prepare请求携带的信息包括视图编号viewnum、副本通信节点ax的消息摘要dmsg、副本通信节点ax的消息msg、主节点a0公钥pa0、主节点a0数字签名siga0、编号id。[0173]3)副本通信节点ay接收到主节点a0发送的pre-prepare请求后,对pre-prepare请求进行验证,若验证通过,则在区块链中广播prepare请求,否则,拒绝pre-prepare请求。所述prepare请求携带的信息包括视图编号viewnum、消息摘要dpre=dmsg、当前副本通信节点编号y-》num、编号id、副本通信节点ay公钥pay、副本通信节点ay数字签名sigay[0174]4)所述主节点a0和副本通信节点接收到prepare请求后,对prepare请求进行验证,若验证通过,则将验证通过的反馈信息i发送至副本通信节点ay。[0175]5)若副本通信节点ay接收到2f+1个验证通过的反馈信息i,则在区块链中广播commit请求。f为系统中失效节点最大个数。commit请求携带的信息包括视图编号viewnum、消息摘要dcom=dpre=dmsg、当前副本通信节点编号y-》num、副本通信节点ay数字签名sigay。[0176]6)主节点a0和副本通信节点接收到commit请求后,对commit请求进行验证,若验证通过,则将验证通过的反馈信息ii发送至副本通信节点ay。[0177]7)若副本通信节点ay接收到2f+1个验证通过的反馈信息ii,则运行请求操作o,并向副本通信节点ax反馈reply信息。所述reply信息携带的信息包括视图编号viewnum、时间戳ts、副本通信节点ax的标识client_id、请求操作结果r。[0178]8)副本通信节点ax判断接收到的reply信息数量是否大于等于f+1,若是,则进入步骤9),否则重新向主节点a0发送请求指令,并返回步骤2)。[0179]9)主节点a0将区块上传至区块链。所述区块包括区块头和区块体。所述区块头携带的信息包括区块版本号v_id、当前区块哈希值mtr、时间戳、前一个区块的哈希值、主节点的数字签名sigaviewnum。所述区块体携带的信息包括历史间隔时间tais的ais数据。[0180]10)查询方向主节点a0发送查询请求inquire。所述查询请求inquire携带的信息包括请求操作o、时间戳ts、查询方的用户名username、查询方的密码password、查询条件conditionw、查询方公钥keypw。[0181]11)主节点a0利用私钥keysw对查询请求inquire进行解密。解密后,主节点a0根据查询条件conditionw对区块数据遍历查询,得到查询结果resinqdata,并将查询结果resinqdata发送至查询方。所述查询结果resinqdata携带的信息包括时间戳、ais数据、查询方公钥keypw。[0182]12)查询方接收查询结果resinqdata,并根据查询方公钥keypw对查询结果resinqdata进行解密,得到查询的ais数据。查询方将ais映射至电子航道图完成轨迹回溯查询。[0183]实施例3:[0184]参见图1至图7,一种基于区块链的船舶轨迹监测系统,主要内容见实施例2,其中,n个副本通信节点分为轻量化节点和全节点。[0185]所述轻量化节点包括控制河段岸基信号台。所述轻量化节点存储区块头数据。[0186]所述全节点包括航道监管部门节点。所述全节点存储区块数据。[0187]实施例4:[0188]参见图1至图7,一种基于区块链的船舶轨迹监测系统,主要内容见实施例2,其中,所述ais信息包括船舶mmsi号、ais发送时间、船舶名称、船舶类型、航向、船舶位置、对地船速、对地航速、航艏向、航道状态、转向率。[0189]实施例5:[0190]参见图1至图7,一种基于区块链的船舶轨迹监测系统,主要内容见实施例2,其中,所述副本通信节点、查询方均存储有海事数字证书认证中心ca颁发的数字证书。[0191]实施例6:[0192]参见图1至图7,一种基于区块链的船舶轨迹监测系统,主要内容见实施例2,其中,对接收到的ais信息ra进行加密的步骤包括:[0193]1)计算数据e=sm3(m″)。其中,参数m″=z||m。m是需要被签名的消息,且{m∈m1,m2···mk}。参数z=sm3(entl||id||a||b||xg||yg||xa||ya)。entl为id的比特长度。id为用户身份标识。(xg,yg)为加密曲线基点坐标,(xa,ya)为用户的公钥。[0194]2)产生随机数q∈[1,n-1]。n为g的阶。g为加密曲线基点。[0195]3)计算加密曲线点g1(x1,y1)=[q]g。[0196]3)计算参数r=(e+x1)modn,若r=0或r+q=n,则返回步骤2),否则,进入步骤4)。[0197]4)计算参数s=((1+da)-1·(q-r·da))modn,若s=0,则返回步骤2),否则进入步骤5)。da∈[1,n-2]是节点私钥。公钥pa=[da]g=(xa,ya)。[0198]5)将解析后的数据ra、数字签名(r,s)、公钥p以p2p方式广播给网络中其他节点。[0199]实施例7:[0200]参见图1至图7,一种基于区块链的船舶轨迹监测系统,主要内容见实施例2,其中,根据副本通信节点a的公钥对信息m′进行验证的步骤包括:[0201]1)检验参数r′∈[1,n-1]是否成立,若不成立则验证不通过,若成立,则进入步骤2)。[0202]2)检验初始s′∈[1,n-1]是否成立,若不成立则验证不通过,若成立,则进入步骤3)。[0203]3)计算数据e′=sm3(m″′)。m″′=z||m′。[0204]4)计算参数u=(r′+s′)modn,若u=0,则验证不通过,否则,进入步骤5)。[0205]5)计算加密曲线点(x1,y1)=[s]g+[u]pa。[0206]6)计算参数r=(e′+x′1)modn,并检验r=r′是否成立,若成立则验证通过,否则验证不通过。[0207]实施例8:[0208]参见图1至图7,一种基于区块链的船舶轨迹监测系统,主要内容见实施例2,其中,对信息m′进行冗余处理的步骤包括:[0209]1)记节点本地内存池中的数据为rl。[0210]2)对信息m′中的第i条数据m′x→i与数据rl进行比较,如果数据rl包含数据m′x→i,就舍弃数据m′x→i,否则,将数据m′x→i写入数据rl中。i初始值为1。[0211]3)令i=i+1,并重复步骤2),直至信息m′中所有数据均比较完毕,得到rm={rx1,rx1···rxk}。[0212]4)对数据rm中的元素进行拆解,得到时间戳数组tsarr={ts1,ts2···tsk}。根据时间戳对数据rm进行重新排序,得到信息r′m={r′x1,r′x2···r′xk}。[0213]实施例9:[0214]参见图1至图7,一种基于区块链的船舶轨迹监测系统,主要内容见实施例2,其中,对pre-prepare请求进行验证的步骤包括:[0215]1)利用公钥pa0校验数字签名siga0是否正确,若正确,则进入步骤2),若不正确,验证不通过。[0216]2)判断当前副本通信节点是否已经收到视图编号viewnum、编号id相同的pre-prepare请求,若是,则验证不通过,否则,进入步骤3)。[0217]3)对信息msg进行摘要运算,并判断摘要运算结果与摘要dmsg是否一致,若不一致,则验证不通过,若一致,则进入步骤4)。[0218]4)判断h≤id≤h是否成立,若成立,则验证通过,否则,验证不通过。[0219]实施例10:[0220]参见图1至图7,一种基于区块链的船舶轨迹监测系统,主要内容见实施例2,其中,对prepare请求进行验证的步骤包括:[0221]1)验证prepare携带的数字签名是否正确,若正确,则进入步骤2),若不正确,验证不通过。[0222]2)判断当前副本通信节点是否已经收到视图编号viewnum、编号id相同的prepare请求,若是,则验证不通过,否则,进入步骤3)。[0223]3)判断摘要dpre与当前已收到pre-pprepare请求中的摘要dmsg是否相同,若不同,则验证不通过,若相同,则进入步骤4)。[0224]4)判断h≤id≤h是否成立,若成立,则验证通过,否则,验证不通过。[0225]实施例11:[0226]参见图1至图7,一种基于区块链的船舶轨迹监测系统,主要内容见实施例2,其中,对commit请求进行验证的步骤包括:[0227]1)验证commit携带的数字签名是否正确,若正确,则进入步骤2),若不正确,验证不通过。[0228]2)判断当前副本通信节点是否已经收到视图编号viewnum、编号id相同的commit请求,若是,则验证不通过,否则,进入步骤3)。[0229]3)对信息msg进行摘要运算,并判断摘要运算结果与摘要dcom是否一致,若不一致,则验证不通过,若一致,则进入步骤4)。[0230]4)判断h≤id≤h是否成立,若成立,则验证通过,否则,验证不通过。[0231]实施例12:[0232]参见图1至图7,一种基于区块链的船舶轨迹监测系统,主要内容见实施例2,其中,所述查询方经过了注册,注册步骤包括:[0233]1)记需查询船舶轨迹的查询方为w。查询方w在前端生成密钥(pw,sw),查询方w向主节点a0发送注册请求register。注册请求register携带的信息包括注册操作、时间戳ts、查询方用户名username、查询方密码password、查询方身份信息id_card、查询方公钥pw、查询方数字签名sigw。[0234]2)主节点a0执行查询方注册操作,为查询方具备查询权限的权限码permission_id和授权的查询方密钥对(keypw,keysw)。[0235]实施例13:[0236]参见图1至图7,一种基于区块链的船舶轨迹监测系统,主要内容见实施例2,其中,数字证书是通过节点数字证书注册与认证获得的。节点数字证书注册与认证的步骤包括:[0237]1)公钥认证与证书分发[0238]如图1所示信号台、航道局、海事局、船舶管理调度中心等通信节点a0,a1···an,通过eigamal算法生成自己的公私钥对{pa0,sa0},{pa1,sa1}···{pan,san},通信节点分别将公钥pa0~pan发送至海事数字证书认证中心ca,ca中心具有自己的一对公私钥{pca,sca},数字证书认证中心对接收到的公钥并用根ca进行hash运算,得到hash(pa0),hash(pa1)···hash(pan),数字证书认证中心通过自己的私钥sca对hash(pa0),hash(pa1)···hash(pan)进行加密,得到hhash(pa0,sca),hhash(pa1,sca)···hhash(pan,sca),ca中心对hhash运算后的密钥附上信息(可能包括版本、序列号、签名算法类型、签发者信息、有效期、被签发人、ca数字签名及其它信息),形成可颁发的数字证书c0,c1···cn,发放给各个通信节点,至此所有经ca中心认证的公钥均合法,后续步骤的进行均赖于公钥的合法性且不在赘述;[0239]2)节点证书验证[0240]当节点a1向节点a2发送消息时,a2需要对a1的数字证书进行验证,此时,将a1证书中的a2使用根ca的公钥pca解密证书,如果解密成功a2将得到a1的公钥,否则失败,当a2成功拥有a1的公钥后才能验证a1的数字签名,该步骤为数字签名验证做支撑,其他除a1,a2节点以外的通信节点均依据此方法进行数字签名验证。[0241]实施例14:[0242]参见图1至图7,一种基于区块链的船舶轨迹监测系统,主要内容见实施例2,其中,根据时间戳对数据rm进行重新排序的步骤包括:[0243]1)将时间戳数组tsarr分为下标中间索引intmid=(start+end)/2,左侧起始索引intstart1=start,左侧结束索引intend1=mid,右侧起始索引intstart2=mid+1,右侧结束索引intend2=end;[0244]2)记临时数组为nttmp,临时数组的索引i=0;[0245]3)判断start1≤end1且start2≤end2是否成立,若是,则进入步骤4),否则,循环;[0246]4)判断tsarr[start1]≤tsarr[start2]是否成立,若是,则令tmp[i]=tsarr[start1];i++;start1++,并进入步骤5),否则,令tmp[i]=tsarr[start2];i++;start2++,并返回步骤3);[0247]5)判断start1≤mid是否成立,若是,则令tmp[i]=tsarr[start1];i++;start1++,并进入步骤6),否则,循环;[0248]判断start2≤end是否成立,若是,则令tmp[i]=tsarr[start2];i++;start2++,并进入步骤6),否则,循环;[0249]6)令i=0;[0250]7)判断i《tmp.length是否成立,若是,则令tsarr[start+i]=tmp[i],i++;[0251]8)最后将tmp数组的元素拷贝到tsarr。该次计算时间复杂度o(n·logn),最后将每条rm数据根据tsarr顺序进行排序得到最终排序结果r′m={r′x1,r′x2···r′xk},具体流程如图4所示。[0252]实施例15:[0253]参见图1至图7,一种基于区块链的船舶轨迹监测系统,主要内容见实施例2,其中,当节点存在异常时,主节点异常处理与主节点变更的步骤包括:[0254]如图6所示,副本节点ay发送节点检查消息《checkpoint,idl,dmsg,y-》num,pay,sigay》给其他节点,idl是当前节点所保留的最后一个视图请求编号,dmsg是对当前状态的一个摘要,将checkpoint消息记录到log中。如果副本节点ay收到了2f+1个验证过的checkpoint消息,则清除先前日志中的消息,并以idl作为当前一个stablecheckpoint。如果主节点异常或被攻击,导致它给不同的请求编上相同的序号,或者不分配序号,或者使序号不连续,备份节点应校验序号的合法性。如果主节点掉线或不广播客户端的请求,客户端设置超时机制,向所有副本节点广播请求消息。副本节点检测出主节点作恶或者下线,发起vchange协议。协议定义如下:[0255]副本节点向其他节点广播《view-change,viewnum+1,idl,c,pl,i》消息;idl是最新的stablecheckpoint的编号,c是2f+1验证过的checkpoint消息集合,pl是当前副本节点未完成的请求的pre-prepare和prepare消息集合。[0256]当主节点p=(viewnum+1)mod|ra|收到2f个有效的view-change消息后,向其他节点广播《new-view,viewnum+1》消息。v是有效的view-change消息集合,o是主节点重新发起的未经完成的pre-prepare消息集合。[0257]pre-prepare消息集合的选取规则:1.选取v中最小的stablecheckpoint编号minmsgnum,选取v中prepare消息的最大编号maxmsgnum;2.在minmsgnum和maxmsgnum之间,如果存在pl消息集合,则创建《《pre-prepare,viewnum+1,idl,d》,msg》消息。否则创建一个空的pre-prepare消息,即:《《pre-prepare,viewnum+1,id,d(null)》,msg(null)》,其中msg(null)空消息,d(null)空消息摘要。副本节点收到主节点的new-view消息,验证有效性,有效进入viewnum+1状态,并且开始o中的pre-prepare消息处理流程。[0258]实施例16:[0259]参见图1至图7,一种基于区块链的船舶轨迹监测系统的使用方法,步骤包括:[0260]1)节点数字证书注册与认证[0261]1.1)公钥认证与证书分发[0262]如图1所示信号台、航道局、海事局、船舶管理调度中心等通信节点a0,a1···an,通过eigamal算法生成自己的公私钥对{pa0,sa0},{pa1,sa1}···{pan,san},通信节点分别将公钥pa0~pan发送至海事数字证书认证中心ca,ca中心具有自己的一对公私钥{pca,sca},数字证书认证中心对接收到的公钥并用根ca进行hash运算,得到hash(pa0),hash(pa1)···hash(pan),数字证书认证中心通过自己的私钥sca对hash(pa0),hash(pa1)···hash(pan)进行加密,得到hhash(pa0,sca),hhash(pa1,sca)···hhash(pan,sca),ca中心对hhash运算后的密钥附上信息(可能包括版本、序列号、签名算法类型、签发者信息、有效期、被签发人、ca数字签名及其它信息),形成可颁发的数字证书c0,c1···cn,发放给各个通信节点,至此所有经ca中心认证的公钥均合法,后续步骤的进行均赖于公钥的合法性且不在赘述;[0263]1.2)节点证书验证[0264]当节点a1向节点a2发送消息时,a2需要对a1的数字证书进行验证,此时,将a1证书中的a2使用根ca的公钥pca解密证书,如果解密成功a2将得到a1的公钥,否则失败,当a2成功拥有a1的公钥后才能验证a1的数字签名,该步骤为数字签名验证做支撑,其他除a1,a2节点以外的通信节点均依据此方法进行数字签名验证。[0265]2)节点数据校验与打包至区块[0266]2.1)初始区块创建,本发明所提区块链中,创世区块block#0由权威机构海事局建立,区块内容包括:当前区块版本编号v_id、历史t0=30s时间段t0=tcurtime-tlatime(其中,tcurtime:当前时刻,tlatime:与当前时刻相差t0的时刻)内ais数据、根哈希值、时间戳,初始化海事局的视图编号viewnum=0,定义海事局通信节点为主节点aviewnum,viewnum=0,即主节点为a0,定义其余节点为副本节点,副本节点个数为n,a0节点将创世区块block#0通过网络广播至全网通信节点,所有节点进行确认,确认结束后主节点将区块添加到区块链并广播至其他副本节点;[0267]2.2)数据转换,控制河段内船舶发送加密的ais信息,数据包括:船舶mmsi号、ais发送时间、船舶名称、船舶类型、航向、船舶位置、对地船速、对地航速、航艏向、航道状态、转向率等加密数据。记行驶于控制河段的船舶数量为z,所有ais上传的数据信息集合记为rsend,控制河段岸边设有k个信号台,ais解析协议为y,信号台通行信号指挥系统采集的ais数据记为racc={racc1,racc2···racck},将racc使用hashset集合处理后得到racc→set,全节点任意30秒内能采集到控制河段所有通行船舶的ais数据,即racc→set=rsend,当前控制河段槽内船舶ais数据t时刻被解析后的数据集合为racca={racca1=y(racc1),racca2=y(racc2)···raccak=y(racck)}。[0268]2.3)数据加密与广播,ra为节点a在t时刻采集的ais数据,且a∈{a1,a2···an},ra∈racca。数据集{racca1,racca2···raccak}经国密算法sm3计算生成运算生成数字摘要{m1,m2···mk},设g是椭圆曲线上的基点(xg,yg),m是需要被签名的消息,且{m∈m1,m2···mk},da是节点私钥,p是节点a的公钥,a,b为常数,n为g的阶,id为用户身份标识,长度为16字节,entl为由两个字节标识的id的比特长度,(xg,yg)为加密曲线基点,(xa,ya)为用户的公钥,节点a的密钥对包括其私钥da(由随机数生成器生成,da∈[1,n-2]和公钥pa=[da]g=(xa,ya),z=sm3(entl||id||a||b||xg||yg||xa||ya);(1)置m′=z||m;(2)计算e=sm3(m′),将e的数据类型转化为整数;(3)用随机数发生器产生随机数q∈[1,n-1];(4)计算椭圆曲线点g1(x1,y1)=[q]g;(5)计算r=(e+x1)modn,若r=0或r+q=n则返回(3);(6)计算s=((1+da)-1·(q-r·da))modn,若s=0则返回第(3)步;(7)将(r,s)转化为字节串,消息m的签名为(r,s)。节点将解析后的数据ra(ra∈racca)、数字签名(r,s)、公钥p以p2p方式广播给网络中其他节点。[0269]2.4)数据解密与验证,除a节点以外的其他节点在收到a节点广播的数据后将开始进行签名验证,设b节点收到消息为m′,收到的签名为(r′,s′),b∈{a1,a2···an},b≠a,pa为a节点的公钥,(1)检验r′∈[1,n-1]是否成立,若不成立则验证不通过;(2)检验s′∈[1,n-1],是否成立,若不成立则验证不通过;(3)置m′=z||m;(4)计算e′=sm3(m′),将e′的数据类型转化为整数;(5)将r′,s′的数据类型转化为整数,计算u=(r′+s′)modn,若u=0,则验证不通过;(6)计算椭圆曲线点(x1,y1)=[s]g+[u]pa;(7)将x1的数据类型转化为整数,计算r=(e′+x′1)modn,检验r=r′是否成立,若成立则验证通过,否则验证不通过。[0270]2.5)数据校验与区块体末端节点数据生成[0271]虽然ais信号是广播信号,但信号台节点接收ais数据时会受到地理环境因素影响,距离相近的信号台节点从控制河段内接收的船舶ais数据可能会存在数据冗余,因此节点在每次收到其他节点广播的数据时需要进行数据冗余处理。节点通过步骤4的验证后,收到的数据为m′,且m′=m,数据长度为len,计算如下:[0272](1)设节点本地内存池中的数据为rl,取出节点本地内存池中的第一条数据记为m′x→1与rl全量数据进行比较,如果rl包含m′x→1就舍弃该消息,否则将数据追加至rl末端,依次根据(1)步骤循环cnt=len-1次结束,最终得到结果集合为rm={rx1,rx1···rxk}的数据。[0273](2)根据(1)计算的结果,将rm中的每个元素进行拆解,得到时间戳数组tsarr={ts1,ts2···tsk},将时间戳数组tsarr索引分为下标中间索引intmid=(start+end)/2,左侧起始索引intstart1=start,左侧结束索引intend1=mid,右侧起始索引intstart2=mid+1,右侧结束索引intend2=end,临时数组inttmp及其索引i=0,计算flg=(start1≤end1&&start2≤end2)为true/false,为true继续判断flg1=(tsarr[start1]≤tsarr[start2]),否则循环,当flg1为true,执行{tmp[i]=tsarr[start1];i++;start1++;},否则执行{tmp[i]=tsarr[start2];i++;start2++;},循环结束后继续判断flg3={start1≤mid},flg3为true就执行{tmp[i]=tsarr[start1];i++;start1++;},判断flg4=(start2≤end),flg4为true执行{tmp[i]=tsarr[start2];i++;start2++;},最后将tmp数组的元素拷贝到tsarr。该次计算时间复杂度o(n·logn),最后将每条rm数据根据tsarr顺序进行排序得到最终排序结果r′m={r′x1,r′x2···r′xk},具体流程如图4所示。[0274]3)区块广播与共识[0275]3.1)记t1=3min,取步骤2.5中时间间隔为t1的ais数据进行计算,计算过程为:s1:对数据块做基于国密sm3算法的hash运算,node0i=hash(r′xi),i=1,2···k;s2:相邻两个hash块串联,然后再做hash运算,node1(i+1)/2=hash(node0i+node0i+1),i=1,3,5···k-1;若k为奇数,则末端树节点采用node1(i+1)/2=hash(node0i)运算;s5:重复s2,直到生成最终的merkleroot,记为:mtr,计算流程如图2所示。[0276]3.2)如图5所示,客户端clientx,x∈{1,2···n},clientx向主节点a0发送请求《《request,o,ts,client_id》,msg,pclientx,sigclientx》,其中,o是请求的操作,ts是时间戳,client_id为客户端标识,msg代表客户端信息,pclientx为节点clientx公钥,sigclientx为节点clientx对《request,o,ts,client_id》的数字签名,当主节点服务被激活,主节点接收到请求后使用pclientx校验sigclientx,校验失败舍弃此请求,否则主节点分配一个编号id,此id用于排序客户端的请求。然后由主节点广播一条《《pre-prepare,viewnum,id,dmsg》,msg,pa0,siga0》消息给通信网络内其他副本节点。viewnum:视图编号,dmsg为客户端消息摘要,msg为消息内容,pa0为节点a0公钥,将《pre-prepare,viewnum,id,dmsg》进行主节点签名得到siga0,id是要在某一个范围区间内的[h,h]。[0277]3.3)副本节点ay(y∈{1,2,3···n},y≠x)收到主节点的pre-prepare消息,需要进行以下校验:a.使用pa0校验主节点pre-prepare的siga0消息签名是否正确;b.当前副本节点是否已经收到了一条在同一viewnum下并且编号也是id,但是签名不同的pre-prepare信息;c.比较msg进行摘要计算后的结果与dmsg是否一致;d.id是否满足h≤id≤h;若校验失败舍弃此请求,否则副本节点ay向其他节点以及主节点发送一条《prepare,viewnum,id,dpre,y-》num,pay,sigay》消息,摘要dpre=dmsg,viewnum、id均与上述pre-prepare消息内容相同,y-》num是当前副本节点编号,pay为ay的公钥,利用《prepare,viewnum,id,dpre,y-》num》对副本节点ay签名得到sigay。同时,记录pre-prepare和prepare消息到log日志保存,用于步骤3.6过程中恢复未完成的请求操作。[0278]3.4)主节点和副本节点收到prepare消息,需要进行以下校验:a.副本节点ay的prepare消息签名是否正确。b.当前副本节点是否已经收到了同一视图viewnum下的id。c.id是否在区间[h,h]内。d.dpre与当前已收到pre-pprepare中的dmsg是否相同,校验失败舍弃此请求,否则通过。如果副本节点ay收到了2f+1个验证通过的prepare消息,f为系统中失效节点最大个数,则向其他节点包括主节点发送一条《commit,viewnum,id,dcom,y-》num,pay,sigay》消息,viewnum,id,dcom,y-》num与上述prepare消息内容相同,此时dcom=dpre=dmsg。利用《commit,viewnum,id,dcom,y-》num》对副本节点ay签名得到sigay。记录commit消息到log中,用于步骤3.6过程中恢复未完成的请求操作。同时,记录其他副本节点发送的prepare消息到log中。[0279]3.5)主节点和副本节点收到commit消息,需要进行以下校验:a.副本节点commit消息签名是否正确。b.当前副本节点是否已经收到了同一视图viewnum下的id。c.dcom与msg摘要计算结果是否一致。d.id是否在区间[h,h]内,校验失败舍弃此消息,否则通过。如果副本节点ay收到了2f+1个验证通过的commit消息,说明当前网络中的大部分节点已经达成共识,运行客户端的请求操作o,并返回《reply,viewnum,ts,client_id,y-》num,r》给客户端,r:是请求操作结果,客户端如果收到f+1个相同的reply消息,说明客户端发起的请求已经达成全网共识,否则客户端需要判断是否重新发送请求给主节点。记录其他副本节点发送的commit消息到log中。[0280]3.6)主节点异常处理与主节点变更。如图6所示,副本节点ay发送节点检查消息《checkpoint,idl,dmsg,y-》num,pay,sigay》给其他节点,idl是当前节点所保留的最后一个视图请求编号,dmsg是对当前状态的一个摘要,将checkpoint消息记录到log中。如果副本节点ay收到了2f+1个验证过的checkpoint消息,则清除先前日志中的消息,并以idl作为当前一个stablecheckpoint。如果主节点异常或被攻击,导致它给不同的请求编上相同的序号,或者不分配序号,或者使序号不连续,备份节点应校验序号的合法性。如果主节点掉线或不广播客户端的请求,客户端设置超时机制,向所有副本节点广播请求消息。副本节点检测出主节点作恶或者下线,发起vchange协议。协议定义如下:[0281]副本节点向其他节点广播《view-change,viewnum+1,idl,c,pl,i》消息;idl是最新的stablecheckpoint的编号,c是2f+1验证过的checkpoint消息集合,pl是当前副本节点未完成的请求的pre-prepare和prepare消息集合。[0282]当主节点p=(viewnum+1)mod|ra|收到2f个有效的view-change消息后,向其他节点广播《new-view,viewnum+1》消息。v是有效的view-change消息集合,o是主节点重新发起的未经完成的pre-prepare消息集合。[0283]pre-prepare消息集合的选取规则:1.选取v中最小的stablecheckpoint编号minmsgnum,选取v中prepare消息的最大编号maxmsgnum;2.在minmsgnum和maxmsgnum之间,如果存在pl消息集合,则创建《《pre-prepare,viewnum+1,idl,d》,msg》消息。否则创建一个空的pre-prepare消息,即:《《pre-prepare,viewnum+1,id,d(null)》,msg(null)》,其中msg(null)空消息,d(null)空消息摘要。副本节点收到主节点的new-view消息,验证有效性,有效进入viewnum+1状态,并且开始o中的pre-prepare消息处理流程。[0284]4)区块上链与存储[0285]所有节点完成共识后,主节点将区块上传至区块链,上传内容包括区块头:区块版本号v_id、当前区块哈希值mtr、时间戳、前一个区块的哈希值、主节点的数字签名sigaviewnum;区块体:历史间隔时间tais=3min的ais数据。主节点将数据广播至全网,全节点存储整个区块链,轻量化节点存储区块头。[0286]5)轨迹回溯查询[0287]5.1)查询方注册,假设需查询船舶轨迹的查询方为w,w已获得ca中心的证书,w在前端生成密钥(pw,sw),w通过主节点授权的注册接口向主节点提交用户注册申请,注册请求内容包括《《register,o,ts,username,password,id_card,tel_phone》,pw,sigw》,其中register为注册请求标识,o是注册操作,ts是时间戳,username是查询方用户名,password是查询方密码,id_card是查询方身份证信息,tel_phone是查询方电话号码,pw是w的公钥信息,sigw是w对消息的签名,主节点验签成功,执行查询方注册,并为其分配仅具备查询权限的权限码permission_id和已授权给的查询方密钥对(keypw,keysw);[0288]5.2)查询请求,如图7所示,查询方w通过注册后,w主动提交查询请求,请求内容包括《《inquire,o,ts,username,password,permissionid,conditionw》,pw,sigw,keypw》,其中inquire为查询请求,o是查询操作,ts是时间戳,username是查询方的用户名,password为查询方的密码,conditionw为查询条件,keypw查询节点公钥,请求前使用keypw加密请求数据。主节点接收到请求后通过私钥keysw解密,如果解密数据符合规范且合法,主节点执行查询操作;[0289]5.3)查询结果,主节点根据conditionw对区块数据通过智能合约遍历查询,成功查询到后返回查询结果的json数据resinqdata,其内容包含时间戳、船舶名称/mmsi号、船舶轨迹list列表、keypw等,并主节点将该数据使用keysw进行加密返回给查询方,查询方使用keypw解密获取查询的ais数据,并将ais映射至电子航道图完成轨迹回溯查询。当前第1页12当前第1页12
技术特征:
1.一种基于区块链的船舶轨迹监测系统,其特征在于:包括主通信节点a0和所述n个副本通信节点。所述主通信节点a0和n个副本通信节点组成区块链;所述区块链存储ais信息;所述副本通信节点从区块链中获取ais信息,完成轨迹回溯查询;所述区块链存储ais信息的步骤包括:i)任意副本通信节点a接收船舶发送的加密ais信息r
acca
,并对加密ais信息r
acca
进行解析,得到ais信息r
accaa
=y(r
acca
);y表示解析协议;a∈{a1,a2…
a
n
};{a1,a2…
a
n
}为副本通信节点;ii)所述副本通信节点a对接收到的ais信息r
accaa
进行加密,生成数字摘要信息m,并通过摘要m生成数字签名(r,s);所述副本通信节点a在区块链中广播数据r
accaa
、数字签名(r,s)、副本通信节点a的公钥p
a
;iii)任意副本通信节点b接收到副本通信节点a广播的信息,记为信息m
′
、数字签名(r
′
,s
′
)、副本通信节点a的公钥p
a
;b∈{a1,a2…
a
n
},且b≠a;iv)副本通信节点b对信息m
′
进行验证,若验证通过,则进入步骤v,否则,拒绝接收副本通信节点a广播的信息;v)所述副本通信节点b对信息m
′
进行解密和冗余处理,得到信息r
′
m
={r
′
x1
,r
′
x2
…
r
′
xk
};vi)所述副本通信节点b对信息r
′
m
中的每个元素进行hash运算,得到若干j级hash块;其中,元素r
′
xi
对应的j级hash块node0
i
=hash(r
′
xi
),i=1,2
…
k;j初始值为1;vii)所述副本通信节点b将相邻两个j级hash块串联,并对相邻两个j级hash块进行hash运算,得到j+1级hash块node1
(i+1)/2
=hash(node0
i
+node0
i+1
),i=1,3,5
…
k-1;若k为奇数,则末端j+1级hash块node1
(i+1)/2
=hash(node0
i
);viii)令j=j+1,并返回步骤vii),直至生成hash值merkle root,记为mt
r
;所述副本通信节点从区块链中获取ais信息的步骤包括:1)副本通信节点a
x
向主节点a0发送请求指令request;所述请求指令request携带的信息包括请求操作o、时间戳ts、副本通信节点a
x
的标识client_id、副本通信节点a
x
的信息msg、副本通信节点a
x
的公钥p
clientx
、数字签名sig
clientx
,x∈{1,2
…
n};2)主节点a0接收到请求指令request后,利用公钥p
clientx
校验请求指令request中的数字签名sig
clientx
,若验证通过,则主节点a0为副本通信节点a
x
的请求指令分配编号id∈[h,h],并在区块链中广播pre-prepare请求;所述pre-prepare请求携带的信息包括视图编号viewnum、副本通信节点a
x
的消息摘要d
msg
、副本通信节点a
x
的消息msg、主节点a0公钥p
a0
、主节点a0数字签名sig
a0
、编号id;3)副本通信节点a
y
接收到主节点a0发送的pre-prepare请求后,对pre-prepare请求进行验证,若验证通过,则在区块链中广播prepare请求,否则,拒绝pre-prepare请求;所述prepare请求携带的信息包括视图编号viewnum、消息摘要d
pre
=d
msg
、当前副本通信节点编号y->num、编号id、副本通信节点a
y
公钥p
ay
、副本通信节点a
y
数字签名sig
ay
;4)所述主节点a0和副本通信节点接收到prepare请求后,对prepare请求进行验证,若验证通过,则将验证通过的反馈信息i发送至副本通信节点a
y
;
5)若副本通信节点a
y
接收到2f+1个验证通过的反馈信息i,则在区块链中广播commit请求;f为系统中失效节点最大个数;commit请求携带的信息包括视图编号viewnum、消息摘要d
com
=d
pre
=d
msg
、当前副本通信节点编号y->num、副本通信节点a
y
数字签名sig
ay
;6)主节点a0和副本通信节点接收到commit请求后,对commit请求进行验证,若验证通过,则将验证通过的反馈信息ii发送至副本通信节点a
y
;7)若副本通信节点a
y
接收到2f+1个验证通过的反馈信息ii,则运行请求操作o,并向副本通信节点a
x
反馈reply信息;所述reply信息携带的信息包括视图编号viewnum、时间戳ts、副本通信节点a
x
的标识client_id、请求操作结果r;8)副本通信节点a
x
判断接收到的reply信息数量是否大于等于f+1,若是,则进入步骤9),否则重新向主节点a0发送请求指令,并返回步骤2);9)主节点a0将区块上传至区块链;所述区块包括区块头和区块体;所述区块头携带的信息包括区块版本号v_id、当前区块哈希值mt
r
、时间戳、前一个区块的哈希值、主节点的数字签名sig
aviewnum
;所述区块体携带的信息包括历史间隔时间t
ais
的ais数据;10)查询方向主节点a0发送查询请求inquire;所述查询请求inquire携带的信息包括请求操作o、时间戳ts、查询方的用户名username、查询方的密码password、查询条件condition
w
、查询方公钥key
pw
;11)主节点a0利用私钥key
sw
对查询请求inquire进行解密;解密后,主节点a0根据查询条件condition
w
对区块数据遍历查询,得到查询结果res
inqdata
,并将查询结果res
inqdata
发送至查询方;所述查询结果res
inqdata
携带的信息包括时间戳、ais数据、查询方公钥key
pw
;12)查询方接收查询结果res
inqdata
,并根据查询方公钥key
pw
对查询结果res
inqdata
进行解密,得到查询的ais数据;查询方将ais映射至电子航道图完成轨迹回溯查询。2.根据权利要求1所述的一种基于区块链的船舶轨迹监测系统,其特征在于:n个副本通信节点分为轻量化节点和全节点;所述轻量化节点包括控制河段岸基信号台;所述轻量化节点存储区块头数据;所述全节点包括航道监管部门节点;所述全节点存储区块数据。3.根据权利要求1所述的一种基于区块链的船舶轨迹监测系统,其特征在于:所述ais信息包括船舶mmsi号、ais发送时间、船舶名称、船舶类型、航向、船舶位置、对地船速、对地航速、航艏向、航道状态、转向率。4.根据权利要求1所述的一种基于区块链的船舶轨迹监测系统,其特征在于:所述副本通信节点、查询方均存储有海事数字证书认证中心ca颁发的数字证书。5.根据权利要求1所述的一种基于区块链的船舶轨迹监测系统,其特征在于,对接收到的ais信息r
a
进行加密的步骤包括:1)计算数据e=sm3(m
″
);其中,参数m
″
=z||m;m是需要被签名的消息,且{m∈m1,m2…
m
k
};参数z=sm3(entl||id||a||b||x
g
||y
g
||x
a
||y
a
);entl为id的比特长度;id为用户身份标识;(x
g
,y
g
)为加密曲线基点坐标,(x
a
,y
a
)为用户的公钥;2)产生随机数q∈[1,n-1];n为g的阶;g为加密曲线基点;3)计算加密曲线点g1(x1,y1)=[q]g;3)计算参数r=(e+x1)mod n,若r=0或r+q=n,则返回步骤2),否则,进入步骤4);4)计算参数s=((1+d
a
)-1
·
(q-r
·
d
a
))mod n,若s=0,则返回步骤2),否则进入步骤5);
d
a
∈[1,n-2]是节点私钥;公钥p
a
=[d
a
]g=(x
a
,y
a
);5)将解析后的数据r
a
、数字签名(r,s)、公钥p以p2p方式广播给网络中其他节点。6.根据权利要求1所述的一种基于区块链的船舶轨迹监测系统,其特征在于,根据副本通信节点a的公钥对信息m
′
进行验证的步骤包括:1)检验参数r
′
∈[1,n-1]是否成立,若不成立则验证不通过,若成立,则进入步骤2);2)检验初始s
′
∈[1,n-1]是否成立,若不成立则验证不通过,若成立,则进入步骤3);3)计算数据e
′
=sm3(m
″′
);m
″′
=z||m
′
;4)计算参数u=(r
′
+s
′
)mod n,若u=0,则验证不通过,否则,进入步骤5);5)计算加密曲线点(x1,y1)=[s]g+[u]p
a
;6)计算参数r=(e
′
+x
′1)mod n,并检验r=r
′
是否成立,若成立则验证通过,否则验证不通过。7.根据权利要求1所述的一种基于区块链的船舶轨迹监测系统,其特征在于:对信息m
′
进行冗余处理的步骤包括:1)记节点本地内存池中的数据为r
l
;2)对信息m
′
中的第i条数据m
′
x
→
i
与数据r
l
进行比较,如果数据r
l
包含数据m
′
x
→
i
,就舍弃数据m
′
x
→
i
,否则,将数据m
′
x
→
i
写入数据r
l
中;i初始值为1;3)令i=i+1,并重复步骤2),直至信息m
′
中所有数据均比较完毕,得到r
m
={r
x1
,r
x1
…
r
xk
};4)对数据r
m
中的元素进行拆解,得到时间戳数组tsarr={ts1,ts2…
ts
k
};根据时间戳对数据r
m
进行重新排序,得到信息r
′
m
={r
′
x1
,r
′
x2
…
r
′
xk
}。8.根据权利要求1所述的一种基于区块链的船舶轨迹监测系统,其特征在于,对pre-prepare请求进行验证的步骤包括:1)利用公钥p
a0
校验数字签名sig
a0
是否正确,若正确,则进入步骤2),若不正确,验证不通过;2)判断当前副本通信节点是否已经收到视图编号viewnum、编号id相同的pre-prepare请求,若是,则验证不通过,否则,进入步骤3);3)对信息msg进行摘要运算,并判断摘要运算结果与摘要d
msg
是否一致,若不一致,则验证不通过,若一致,则进入步骤4);4)判断h≤id≤h是否成立,若成立,则验证通过,否则,验证不通过。9.根据权利要求1所述的一种基于区块链的船舶轨迹监测系统,其特征在于,对prepare请求进行验证的步骤包括:1)验证prepare携带的数字签名是否正确,若正确,则进入步骤2),若不正确,验证不通过;2)判断当前副本通信节点是否已经收到视图编号viewnum、编号id相同的prepare请求,若是,则验证不通过,否则,进入步骤3);3)判断摘要d
pre
与当前已收到pre-pprepare请求中的摘要d
msg
是否相同,若不同,则验证不通过,若相同,则进入步骤4);4)判断h≤id≤h是否成立,若成立,则验证通过,否则,验证不通过。10.根据权利要求1所述的一种基于区块链的船舶轨迹监测系统,其特征在于,对
commit请求进行验证的步骤包括:1)验证commit携带的数字签名是否正确,若正确,则进入步骤2),若不正确,验证不通过;2)判断当前副本通信节点是否已经收到视图编号viewnum、编号id相同的commit请求,若是,则验证不通过,否则,进入步骤3);3)对信息msg进行摘要运算,并判断摘要运算结果与摘要d
com
是否一致,若不一致,则验证不通过,若一致,则进入步骤4);4)判断h≤id≤h是否成立,若成立,则验证通过,否则,验证不通过。11.根据权利要求1所述的一种基于区块链的船舶轨迹监测系统,其特征在于,所述查询方经过了注册,注册步骤包括:1)记需查询船舶轨迹的查询方为w;查询方w在前端生成密钥(p
w
,s
w
),查询方w向主节点a0发送注册请求register;注册请求register携带的信息包括注册操作、时间戳ts、查询方用户名username、查询方密码password、查询方身份信息id_card、查询方公钥p
w
、查询方数字签名sig
w
;2)主节点a0执行查询方注册操作,为查询方具备查询权限的权限码permission_id和授权的查询方密钥对(key
pw
,key
sw
)。
技术总结
本发明公开一种基于区块链的船舶轨迹监测系统,包括主通信节点A0和n个副本通信节点;所述主通信节点A0和n个副本通信节点组成区块链;所述区块链存储AIS信息;所述副本通信节点从区块链中获取AIS信息,完成轨迹回溯查询;本发明是一种基于区块链技术的船舶轨迹监测系统,主要解决航道监管机构对船舶运行轨迹全过程的准确回溯问题,有效防止船舶轨迹数据篡改以及节点异常带来的数据缺失,文中所使用的强碰撞性国密算法保证了数据的安全性和保密性,使用节点边缘化计算汇总的方式降低全节点负荷,减少资源浪费,能够防止黑客攻击。能够防止黑客攻击。能够防止黑客攻击。
技术研发人员:宋涛 李秀华 李辉 杨正益 范琪琳 胡春强 文俊浩
受保护的技术使用者:重庆大学
技术研发日:2021.10.14
技术公布日:2022/3/8