1.一种基于程序分析的数据资源的管控方法,其特征在于,所述方法包括:
预先构建的p2p网络中的第一节点向预设数量个第二节点发起针对智能合约的调用任务,以使所述第二节点执行所述智能合约;所述第一节点为所述p2p网络中的任意节点,所述第二节点为所述p2p网络中事先启动了所述智能合约的节点;
所述第二节点根据所述调用任务,构建由多个基本块构成的控制流图;其中,部分基本块中包括获取数据的代码,该基本块通过所述代码获取数据提供者提供的原始数据;
所述第二节点将获取的原始数据保存在预先定义的变量中,并以变量为粒度,对所述控制流图进行控制依赖分析和/或数据依赖分析,以构建控制依赖图和/或数据依赖图;
所述第二节点依据最新获取的原始数据,对所述控制依赖图和/或所述数据依赖图进行迭代,直至迭代稳定获得变量关系结果;
所述第二节点将所述变量关系结果返回给所述第一节点,以使得所述第一节点将所述变量关系结果作为属性输入,执行基于属性的访问控制方法。
2.根据权利要求1所述的方法,其特征在于,每个获取数据的代码对应一个特定的分支指令,令所述控制流图中分支指令的集合为branches={b1,b2,..bi},bi表示分支指令,i为大于等于1的正整数;
所述第二节点将获取的原始数据保存在预先定义的变量中,并以变量为粒度,对所述控制流图进行控制依赖分析,以构建控制依赖图,包括:
所述第二节点将获取的原始数据保存在预先定义的变量中,并以变量为粒度,通过数据流方程对branches={b1,b2,..bk}进行控制依赖分析,以构建分支指令内的变量与基本块之间的控制依赖图,所述数据流方程为:
outn=inn-killn;
killn={bij|j=0,1,…,如果分支指令bi在该基本块};
上式中,n是表示序号,outn表示第n个基本块的输出集合,inn表示第n个基本块的输入集合,killn表示在第n个基本块kill掉某些变量相关的沾染情况。
3.根据权利要求2所述的方法,其特征在于,所述第二节点依据最新获取的原始数据,对所述控制依赖图进行迭代,直至迭代稳定获得变量关系结果,包括:
所述第二节点依据最新获取的原始数据,使用广度优化算法对所述控制依赖图进行迭代;
在最终迭代之后,判断inn是否不包含{bi1,bi2,..bij}中的所有元素;
若所述inn不包含{bi1,bi2,..bij}中的所有元素,则确定所述分支指令bi控制了基本块n,表明所述分支指令bi内的变量与基本块n具有控制依赖关系;
所述第二节点将所述变量关系结果返回给所述第一节点,以使得所述第一节点将所述变量关系结果作为属性输入,执行基于属性的访问控制方法,包括:
所述第二节点将所述分支指令bi内的变量与基本块n的控制依赖关系返回给所述第一节点,以使得所述第一节点将所述分支指令bi内的变量与基本块n的控制依赖关系作为属性输入,执行基于属性的访问控制方法。
4.根据权利要求1所述的方法,其特征在于,令所述控制流图中获取数据的代码的集合为orig={arg,executecontrac1,…executecontractk};
所述第二节点将获取的原始数据保存在预先定义的变量中,并以变量为粒度,对所述控制流图进行数据依赖分析,以构建数据依赖图,包括:
所述第二节点将获取的原始数据保存在预先定义的变量中,并以变量为粒度,通过数据流方程对orig={arg,executecontrac1,…executecontractk}进行数据依赖分析,以构建获取数据的代码对应的变量间的数据依赖图,所述数据流方程为:
outn=interpreterexec(inn)
上式中,n是表示序号,outn表示第n个基本块的输出集合,inn表示第n个基本块的输入集合;interpreterexec是去符号执行的基本块,以inn作为初始状态,得出计算之后栈桢中的变量与。
5.根据权利要求4所述的方法,其特征在于,每个获取数据的代码对应一个特定的分支指令,所述第二节点依据最新获取的原始数据,对所述数据依赖图进行迭代,直至迭代稳定获得变量关系结果,包括:
所述第二节点将最新获取的原始数据作为污点源添加到所述控制流图起始块的分析结果中,遍历所述控制流图,不断更新分析结果,同时记录所述控制流图中的控制依赖关系,直至迭代稳定获得不同分支指令对应的变量间的数据依赖关系;
所述方法还包括:
在所述控制流图的遍历中,符号执行包括以下操作:
(1)实例化操作,用于符号执行new-instance指令;
(2)复制操作,用于符号执行xload/xstore/dup/swap指令;
(3)一元操作,用于符号执行仅有1个变量的指令;
(4)二元操作,用于符号执行仅有2个变量的指令;
(5)三元操作,用于符号执行仅有3个变量的指令;
(6)函数调用操作,用于符号执行不定变量的指令。
6.根据权利要求1所述的方法,其特征在于,在所述第一节点向预设数量个第二节点发起针对智能合约的调用任务前,所述方法还包括:
所述p2p网络中的任一节点在接收到数据提供者发送的合约启动请求时,该节点作为主节点启动所述智能合约,并在所述p2p网络中随机选择多个从节点,以使所述从节点启动所述智能合约,其中,所述智能合约存储于预先设置的可信分布式账本中;
所述主节点和所述从节点在启动所述智能合约后,生成一组公私钥;其中,所述从节点将所述公私钥中的公钥返回给所述主节点,将所述公私钥中的私钥存储在本地;
所述主节点将所有从节点返回的公钥与所述智能合约的元信息存证到所述可信分布式账本中,并将所述可信分布式账本返回的哈希值作为合约校验地址返回给所述数据提供者;
预先构建的p2p网络中的第一节点向第二节点发起针对智能合约的调用任务,包括:
所述第一节点在接收到数据使用者发送的针对所述智能合约的执行请求时,向所述p2p网络中所有的所述第二节点发起针对所述智能合约的调用任务,所述第二节点为所述主节点或所述从节点;
所述方法还包括:
所述第二节点针对该调用任务执行所述智能合约的执行请求,并根据所述智能合约的状态向所述第一节点返回相应的执行结果,所述执行结果包括所述p2p网络中所有的所述第二节点基于自身私钥的签名;
所述第一节点依据预先设置的结果统计策略,将所述执行结果返回给所述数据使用者;
所述数据使用者以所述数据提供者提供的合约校验地址来获取所述公钥,并根据所述公钥对所述执行结果中的签名进行验证。
7.根据权利要求6所述的方法,其特征在于,所述第二节点针对该调用任务执行所述智能合约的执行请求,并根据所述智能合约的状态向所述第一节点返回相应的执行结果,所述执行结果包括所述p2p网络中所有的所述第二节点基于自身私钥的签名,包括:
当所述智能合约无计算状态时,所述第二节点在执行所述执行请求时,直接执行所述智能合约的逻辑,向所述第一节点返回相应的执行结果;
当所述智能合约有计算状态时,所述第二节点在执行所述执行请求时,保持相互之间的合约状态的同步、合约执行顺序的同步、合约输入数据的同步以及合约输出数据的同步,向所述第一节点返回相应的执行结果。
8.根据权利要求7所述的方法,其特征在于,针对所述合约状态的同步,所述方法还包括:
每个第二节点执行所述智能合约的过程中,对所述智能合约的执行进行记录;
当任一第二节点故障或不能同步执行所述智能合约时,所选取的新的第二节点或不能同步执行所述智能合约的第二节点确定所述预设数量个第二节点中当前处于最新状态的目标节点,并获取所述目标节点对所述智能合约的执行记录;其中,所述新的第二节点为除所述预设数量个第二节点外,在所述p2p网络中随机选择的一个节点;
所述新的第二节点或不能同步执行所述智能合约的第二节点将所述目标节点对所述智能合约的执行记录在本地进行回放。
9.根据权利要求7所述的方法,其特征在于,针对所述合约执行顺序的同步,所述方法还包括:
所述第一节点针对所接收到的执行请求,采用实用拜占庭容错pbft算法对所述执行请求进行定序,以保证所述p2p网络中所有的所述第二节点采用同样的顺序依次执行所有的执行请求;
其中,在所述pbft算法中,每个执行请求会经历如下的阶段:
请求request:所述数据使用者向所述第一节点发送执行请求;
预先准备pre-prepare:所述第一节点为所述执行请求分配序列号,并向所有的所述第二节点广播pre-prepare请求;
已准备prepare:所述第二节点接收pre-prepare请求后,验证pre-prepare请求的正确性,若验证无误则广播prepare消息,并将pre-prepare请求和prepare消息记录到本地日志中;
存储commit:若所述第二节点接收到多于2f+1个与自己一致且有效的prepare消息,则确定定序成功,在本地依次执行已定序的所述智能合约的执行请求,并将执行结果通过自身私钥签名后发送给所述第一节点;
答复reply:所述第二节点在接收到2f+1个一致且有效的commit消息后,在本地执行所述执行请求,并将reply消息通过所述第一节点发送给所述数据使用者;所述数据使用者用于在接收到f+1个不同节点一致且有效的reply消息时,对所述第一节点返回的执行结果进行确认。
10.根据权利要求6所述的方法,其特征在于,所述结果统计策略为all、most或first,所述第一节点依据预先设置的结果统计策略,将所述执行结果返回给所述数据使用者,包括:
all,等待所述p2p网络中所有的所述第二节点的执行结果均返回后,所述第一节点将所述执行结果返回给所述数据使用者,并附上所述p2p网络中所有的所述第二节点的公钥缩写;
most,当所述第一节点接收到所述p2p网络中大于半数的所述第二节点的执行结果后,将所述执行结果返回给所述数据使用者,并附上已返回执行结果的节点的公钥缩写;
first,当所述第一节点接收到所述p2p网络中第一个所述第二节点返回的执行结果后,将所述执行结果返回给所述数据使用者,并附上该节点的公钥缩写。