[0031] 以下结合附图对本发明作进一步说明。
[0032] 如图1所示,该存储方法利用智能合约不可篡改和一致性的特点向模型中的各类节点提供节点身份管理服务和数据管理服务。Tangle域中的各类智能合约包括了节点身份控制合约(node identity controller contract,以下简称NICC)、节点身份管理合约(node identity manage contract,以下简称NIMC)和数据管理合约(data manage contract,以下简称DMC)等。
[0033] 如图2所示,NICC合约负责对方法中的节点进行统一管理,包括节点身份的识别、注册,以及在获取合法节点身份后对其行为的管理,如数据存储、数据更新、执行自适应PoW算法等。合约检查节点的身份标识信息(NODE‑ID)与其持有的公钥(PUB‑KEY)是否匹配。如果节点身份尚未创建,本合约会调用NIMC合约注册其身份。
[0034] NIMC合约通过节点主动发起注册的方式让其加入存储模型。子合约包括节点身份创建合约(node identity creation contract,以下简称NICC2)和边缘节点注册合约(light node register contract,以下简称LNRC):节点调用NICC2合约生成唯一的公私钥对,公钥经过单向哈希算法生成对应的NODE‑ID;新节点拥有合法身份后,可以向算力较强的节点请求调用LNRC合约,向该节点注册,由该节点代理其交易事务,成为该节点的边缘节点。
[0035] DMC合约用于实现设备数据及其索引信息的存储、读取与更新,子合约包括数据存储合约(data storage contract,以下简称DSC)和链上数据更新合约(on‑chain data update contract,以下简称ODUC):DSC合约将收到的数据索引信息进一步处理,等待存储节点发送凭证信息,对比确认后,将相应的索引信息存储到Tangle网络上。索引信息即数据索引对象(rawJSON),包含数据的哈希值、版本号、存储地址等信息;ODUC合约对更新后的数据进行切分,并与原始数据进行比较,筛选本次更新需上传的碎片数据,生成对应的索引信息。Tangle网络中的新交易会引用包含原始数据索引信息的旧交易。
[0036] DSC合约用于实现自适应PoW算法的关键部分。该合约计算节点的贡献值,并通过映射方式得到PoW算法的执行难度。
[0037] 1)边缘域
[0038] 边缘域中的边缘节点是物联网中资源受限的设备,如智能家具或传感器等。由于有限的存储空间及受限的算力,这些设备不参与区块链中交易的处理。边缘节点通过数据分块操作将数据切分成碎片并生成相应的索引信息。数据分块操作表示对二进制形式存储的数据进行平均切分。碎片数据与由碎片生成的索引信息被分别传输到存储域和全节点域进行处理。
[0039] 边缘域中的节点会预先准备数据索引对象rawJSON,该流程见算法1。rawJSON是以JSON格式序列化存储的摘要信息,其中包含了数据的MD5值、版本号、多个数据源的存储地址、时间戳等信息,rawJSON的结构如下:
[0040] {
[0041] "ID":"D836DFF83FD9DAB1FH2AEF8701 BA64CF",
[0042] "MD5":"c4d801 c2cf089d8f4f25d5af034867d7",
[0043] "VERSION":1,
[0044] "STORAGE_NODE_ID":{
[0045] "010966776006953D5567439E5E39F86A0D273BEE",
[0046] "E934765D0A68F93EEEB37255D359600677669010"
[0047] "F93EE376EB00596006255D76953D556EB3769010"
[0048] },
[0049] "TIMESTAMP":"1588989385*,
[0050] "LABEL":{
[0051] "小米温度计",
[0052] "卧室"
[0053] },
[0054] "SLICE":{
[0055] {
[0056] "ID":"AB1FD8019DH2AEF8BA64CF36DFF83FD7",
[0057] "MD5":"c2cf089d8f4f2501 af03d5486c4d87d7",
[0058] "SORT":1
[0059] },
[0060] {
[0061] "ID":"FF83F870D9DABD836D1FHBA64CF2AEF1",
[0062] "MD5":"89d8c4d801c2cf0f4f2534867d7d5af0",
[0063] "SORT":2
[0064] }
[0065] }
[0066] }
[0067] 边缘节点将数据DRaw切分为多个碎片 并通过MD5(Message‑Digest Algorithm 5)信息摘要算法为每份数据碎片计算MD5值
并生成数据索引对象rawJSON,
表示构成rawJSON的元数据信息,包括数据的哈希值、版本号、存储地址等。边缘节点对rawJSON签名后,将rawJSON传输到其注册的全节点。
[0068]
[0069]
[0070] 2)全节点域&Tangle域
[0071] 全节点域中的节点相比边缘域中的节点,其算力更强,被称为全节点。全节点借助部署在Tangle域中的智能合约,将索引信息打包进交易,收集来自存储域的存储凭证,最后执行自适应PoW算法,将交易传输至Tangle域中,完成交易上链、广播交易等操作。Tangle域中包括了Tangle网络、协调节点和各类智能合约。协调节点会定期检查Tangle网络中发布的交易,可以加快某一区域交易的确认速度、提高Tangle网络的安全性。
[0072] 通过全节点域与Tangle域的协作,共同完成对数据索引对象rawJSON的存储。全节点从边缘域接收rawJSON后,检查签名,确认该签名所属节点是否在本地进行过注册。接着,全节点将rawJSON发送到Tangle域中的DSC合约进行处理,并返回一个签名消息给边缘节点,消息中包含执行DSC合约的交易地址。DSC合约被调用后,会对rawJSON进行解析,获得数据源的身份标示信息,即STORAGE_NODE_ID字段,并进入等待状态,直到对应的数据源即存储节点发送存储凭证至当前交易。合约会检查存储凭证中签名是否与rawJSON中包含的数据源信息匹配,如果匹配,合约会通知全节点将该索引信息打包进交易,进行发布。如果不匹配,智能合约会一直处于等待状态,具体流程见算法2。
[0073]
[0074]
[0075] 3)存储域
[0076] 存储域中的节点是具有数据存储功能的数据服务器,被称为存储节点。存储节点根据边缘域传来的存储地址信息,将碎片的数据副本存储在多个独立存储节点中。数据存储完成后,每个存储节点会发送一份存储凭证到Tangle域,该凭证会被打包进待发布的交易中,作为数据存储的证明被记录在区块链上,具体流程见算法3。
[0077]
[0078] 图3为存储节点、边缘节点、全节点之间的数据流图。ODUC合约实现了数据的增量更新,具体流程见算法4。首先,边缘节点从全节点处获取原始数据所在的交易位置接着从存储节点获取原始数据。设备对原始数据修改后,按照相同的数据切分策略对新数据进行切分,得到piecenew list,并对其使用MD5算法得到md5new list。
设备对比得到的md5new list与之前计算得到的md5list,若值相同,则表示该MD5值对应的数据碎片未被修改,无需更新;若数值不同,则表示该数据碎片被修改了,需要被重传。设备筛选出需要被二次上传的数据碎片后,将其打包为md5upload list和pieceupload list。接下来的流程与数据存储阶段类似,不同之处在于,ODUC智能合约要求本次全节点验证的交易中必须包含原始交易,原始交易即原始数据碎片对应的索引信息所在的交易。全节点需要验证原始交易并将新交易链接至原始交易,用于数据修改的溯源。
[0079]
[0080]
[0081] 4)自适应PoW算法
[0082] 自适应PoW算法会根据全节点的行为动态调整PoW算法的执行难度。该算法在提高交易效率的同时,减少了系统因为PoW算法难度降低而增加的安全风险。
[0083] 定义系统中全节点i具有贡献值Ci的属性。贡献值表示节点在其最近的生命周期中对区块链网络的贡献程度。影响贡献值的因素包括索引对象rawJSON中SLICE字段序列的元素数目是否超过阈值、节点是否对Tangle网络中的其他交易进行了正确的验证、节点发布的交易是否合法。rawJSON中SLICE字段序列的每一个元素表示了一个数据碎片的MD5值,元素过多会加大Tangle网络查询和存储的压力。因此,模型设定了一个阈值以限制rawJSON中SLICE字段序列的元素数目。基于有向无环图的区块链需要解决懒惰问题,发生懒惰问题意味着全节点会始终验证大多数全节点都已经确认的旧交易,而不是验证那些等待确认的交易。Tangle网络中的协调节点会定期对Tangle网络中的交易进行检查,一旦发现节点的懒惰行为或恶意攻击行为,协调节点会将检查结果打包进交易,然后广播到Tangle网络中。全节点需要根据检查结果重新计算贡献值,并调整PoW算法的执行难度。
[0084] 全节点的Ci值越小,表示节点的贡献值越低,PoW算法的执行难度也就越大,发布交易所需的时间也就越多。因此,自适应PoW算法会鼓励节点执行有益于Tangle网络的操作,增加恶意节点发起攻击的成本,在提高交易效率的同时,防止系统安全性下降。
[0085] 使用以下公式计算全节点的贡献值:
[0086]
[0087] 其中 表示对不同属性的交易进行验证的影响因子, 表示恶意行为的影响因子, 表示rawJSON中SLICE字段元素数目的影响因子,λ1,λ2,λ3代表每个影响因子的权重值。
[0088] 被表示为:
[0089]
[0090] 其中,ni表示全节点在一个单位时间内发布的交易数。T1(t)代表时间衰减函数,该函数随着时间增加,值会逐渐减小。表示历史交易距离当前时间越近,重要性越大。α(b)代表行为behavior对贡献值影响的权重。当节点至少引用验证了一个待确认交易时,α(b)的值为N,否则,α(b)的值为‑N。α(b)可定义为:
[0091]
[0092] 表示被检测出的恶意行为对贡献值的影响因子,可以被表示为:
[0093]
[0094] 不同的恶意行为对应不同的β(b)值。行为破坏性越大,β(b)值越高。β(b)可被表示为:
[0095]
[0096] T2(t)也是时间衰减函数,但T2(t)中的常量值与T1(t)中的常量值不同,代表了两种不同的时间衰减特征。
[0097] 展示了rawJSON中SLICE字段序列的元素数目如何影响节点的贡献值,其公式如下:
[0098]
[0099] Numpieces表示当前交易中SLICE字段序列的元素数量,Numbase表示模型设定的阈值。 的值越大,节点的贡献值越低。
[0100] 在全节点打包完交易后,会把当前节点的NODE_ID、rawJSON中SLICE字段的内容、验证的交易位置 发送到区块链上的DAC合约,即难度自动设定合约,计算本次节点的贡献值,并设定PoW算法的执行难度。
[0101] 如图4所示,本发明方法的具体步骤是:
[0102] 步骤1:物联网设备(即边缘设备)完成对数据的收集,以二进制形式进行存储。
[0103] 步骤2:数据分块操作,边缘设备将完整数据均等分割成n份数据碎片,并由数据碎片计算得到对应的MD5值。
[0104] 步骤3:打包数据索引对象rawJSON,将碎片的MD5值、版本号、多个数据源的存储地址、时间戳打包成索引信息,签名后将其发送到指定的全节点处。
[0105] 步骤4:全节点对收到数据包中的签名进行验证,验证通过后调用DSC智能合约等待来自对应数据源的存储凭证。
[0106] 步骤5:边缘节点将数据上传至多份数据源地址,数据源存储成功后,发送存储凭证到智能合约执行所在的交易上。
[0107] 步骤6:智能合约接收到正确的存储凭证后,通知全节点进行交易发布。
[0108] 步骤7:全节点打包索引信息以及对应的存储凭证,创建交易,执行自适应PoW算法,将交易广播至区块链网络中。