首页 / 一种共识方法、系统和共识节点

一种共识方法、系统和共识节点实质审查 发明

技术领域

[0001] 本说明书实施例属于区块链技术领域,尤其涉及一种共识方法、系统和共识节点。

相关背景技术

[0002] 区块链(Blockchain)是分布式数据存储、点对点传输、共识机制、加密算法等计算机技术的新型应用模式。区块链系统中按照时间顺序将数据区块以顺序相连的方式组合成链式数据结构,并以密码学方式保证的不可篡改和不可伪造的分布式账本。由于区块链具有去中心化、信息不可篡改、自治性等特性,区块链也受到人们越来越多的重视和应用。

具体实施方式

[0033] 为了使本技术领域的人员更好地理解本说明书中的技术方案,下面将结合本说明书实施例中的附图,对本说明书实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本说明书一部分实施例,而不是全部的实施例。基于本说明书中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都应当属于本说明书保护的范围。
[0034] 区块链1.0时代通常是指在2009年到2014年之间,属于区块链应用发展阶段,它们主要致力于解决货币和支付手段的去中心化问题。从2014年开始,开发者们越来越注重于解决区块链在技术和扩展性方面的不足。2013年底,Vitalik Buterin将智能合约引入区块链,打开了区块链在货币领域以外的应用,从而开启了区块链2.0时代。
[0035] 区块链系统中,不同参与方通过部署的节点(Node)可以建立一个分布式的区块链网络。利用链式区块结构构造的去中心化(或称为多中心化)的分布式账本,保存于分布式的区块链网络中的每个节点(或大多节点上,如共识节点)上。这样的区块链系统需要解决去中心化(或多中心化)的多个节点上各自的账本数据的一致性和正确性的问题。每个节点(或多个节点)上都运行着区块链程序,在一定容错需求的设计下,通过共识(consensus)机制保证所有忠诚节点具有相同的交易,从而保证所有忠诚节点对相同交易的执行结果一致,并将交易及执行结果打包生成区块。
[0036] 前述提到,每个节点(或多个节点)上都运行着区块链程序,在一定容错需求的设计下,通过共识机制保证所有忠诚节点具有相同的交易,从而保证所有忠诚节点对相同交易的执行结果一致,并将交易及执行结果打包生成区块。当前主流的共识机制包括:工作量证明(Proof of Work,POW)、股权证明(Proof of Stake,POS)、委任权益证明(Delegated Proof of Stake,DPOS)、实用拜占庭容错(Practical Byzantine Fault Tolerance,PBFT)算法,蜜獾拜占庭容错(HoneyBadgerBFT)算法等。
[0037] 区块链可以采用POW(Proof of Work)作为共识算法。POW的主要思想是量化节点的计算能力,使得整个网络在恶意对手控制的算力不超过1/2时候,能够保证一个大概率的安全。POW适用于无法准确确定节点数量,但非恶意节点占大多数的公有区块链中的应用。POW本身消耗巨大计算资源,而“挖矿”的主要目标只是量化计算能力。而且相关区块链技术必须在区块时间与“挖矿”工作之间取得平衡。为避免分叉,建议用户在6个区块后确认交易,这导致确认交易需要一个多小时。目前,“矿工”为了有更大的出块概率,往往选择联合组建矿池,这与去中心化的思想相违背。
[0038] 以PBFT为例,该算法是Miguel Castro(卡斯特罗)和Barbara Liskov(利斯科夫)在1999年提出来的,解决了原始拜占庭容错算法效率不高的问题,将算法复杂度由指数级降低到多项式级,使得拜占庭容错算法在实际系统应用中变得可行。该论文发表在1999年的操作系统设计与实现国际会议上(OSDI99)。PBFT算法中,所有的副本(replica)在一个被称为视图(View)的轮换过程(succession of configuration)中运行。在某个视图中,一个副本作为主节点(primary),其他的副本作为备份节点(backups)。视图是连续编号的整数。主节点可以由公式p=v mod|R|计算得到,这里v是视图编号,p是副本编号,|R|是副本集合的个数。该算法中假设,当最多存在f个副本(即节点)失效时,如果存在总数为至少3f+1个副本,就能保证在异步系统中提供安全性和活性。为了能够确保所有副本的数据一致性要求和容错要求而需要的一定数量副本的集合,一般是分布式系统中的大多数节点构成的集合,构成大多数(Quorum)。例如在总节点数n为3f+1(n=3f+2或n=3f的情况一般不会对容错效果带来提升)的情况下,Quorum为2f+1。这样,对于包含四个节点的分布式系统,任意三个节点可以构成一个Quorum。
[0039] PBFT包括Normal Case Phase和View Change Phase两个过程,图1为Normal Case Phase(常规阶段)过程的流程图。Normal Case Phase中主要包括PRE‑PREPARE(预准备)、PREPARE(准备)和COMMIT(提交)三个阶段,其中3号节点例如可以表示宕机的节点(图1中以×表示)。当主节点失效的时候(图2中以×表示,如更换视图前主节点Primary也就是Replica 0(副本0)失效)就需要启动视图更换(view change)过程,从而在系统存在故障时进行调整,更换新的主节点(如更换视图后Replica 1为主节点Primary)。图2为View Change Phase(视图切换)的示意图。如果主节点掉线或者作恶而不广播客户端的请求等,客户端可以设置超时机制。如果超时的话,客户端可以向所有副本节点广播请求消息。副本节点检测出主节点作恶或者下线后,也可以发起View Change协议阶段,以更换主节点(经常简称为“换主”)。此外,也可能由于主节点发起错误的提议导致PRE‑PREPARE、PREPARE和COMMIT三阶段共识过程失败,或者,PREPARE、COMMIT阶段可能达不成Quorum数量(如3f+1个节点中的2f+1个,也称为法定数量)的一致,也都无法完成共识。这些情况下也可能发起View Change协议阶段,以更换主节点。
[0040] 在正常情况下,即共识节点都没有宕机,共识消息也能在一定时间内到达对方,即不会发生换主的情况下,PBFT中的Normal Case Phase过程可以如图3所示,该图仍然以4个共识节点为例。
[0041] 在第r‑1轮的Normal Case Phase过程,0号节点作为主节点收集一定数量的待共识交易(或读写集之类,后续以交易为例作说明)后,发起预准备过程(即前述的PRE‑PREPARE,也简称为PP阶段),进而节点1、2、3进入准备过程(即前述的PREPARE,也简称为P阶段),之后节点0、1、2、3进入提交过程(即前述的COMMIT,也简称为C阶段)。PP阶段、P阶段、C阶段一般也合称为PBFT的三阶段。这样,在正常情况下就完成了第r‑1轮PBFT的三阶段过程,也就完成了第m‑1个区块对应的交易数据的共识,同时也产生了这个区块的区块号等信息。从而,各个共识节点可以各自以共识的交易数据为基础,按照共识的交易数据的顺序和内容,顺序执行这些交易,进而生成世界状态和收据。具体的,各个节点各自在本地基于共识的交易数据可以构建Merkle树(包括MPT树等树形结构,MPT全称为Merkle Patricia Tree,是结合了Merkle Tree(默克尔树)和Patricia Tree(压缩前缀树,一种更节省空间的Trie树,字典树)的一种树形结构)并生成这颗Merkle树的树根的hash(也称为交易根hash),类似的,可以基于世界状态数据构建Merkle树并生成这颗Merkle树的树根的hash(也称为状态根hash),可以基于收据数据构建Merkle树并生成这颗Merkle树的树根的hash(也称为收据根hash)。各个节点各自在本地生成这三个根hash后,可以在本地生成第m‑1个区块。该第m‑1个区块的区块头中可以包括前述区块号、交易根hash、状态根hash、收据根hash等信息,区块体可以包括交易数据集合、世界状态集合和收据集合。这样,就生成了第m‑1个区块。
[0042] 在第m个区块的生成过程中,将重复PBFT中的三阶段过程。如图3中,对于第m个区块,0号节点作为主节点收集一定数量的待共识交易后,发起PP过程,进而节点1、2、3进入P过程,之后节点0、1、2、3进入C过程。这样,在正常情况下就完成了第r轮PBFT的三阶段过程,也就完成了第m个区块对应的交易数据的共识,同时也产生了这个区块的区块号等信息。各个节点可以各自以共识的交易数据为基础,按照共识的交易数据的顺序和内容,顺序执行这些交易,进而生成世界状态和收据。各个节点各自在本地生成如前所述的三个根hash后,可以在本地生成第m个区块。该第m个区块的区块头中可以包括前述区块号、交易根hash、状态根hash、收据根hash等信息,区块体可以包括交易数据集合、世界状态集合和收据集合。这样,就生成了第m个区块。类似的,生成第m+1个区块,在这个过程中包含如图3中所示的第r+1轮PBFT的三阶段过程。
[0043] 可见,常规产生区块的情况下,每个共识节点在每个区块的产生过程中包含一次PBFT的Normal Case Phase过程。随着区块的不断产生,每个共识节点将会重复这个共识过程,图3中仅示例性的示出了第r‑1、r和r+1轮共识过程。其中,有的共识节点作为PBFT中的主节点的角色,有的共识节点作为PBFT中的备份节点的角色。
[0044] 在一次共识过程中,即一次PBFT的三阶段过程中,可以包括:
[0045] a110:(PRE‑PREPARE预准备阶段)主节点0收集一定数量的待共识交易后,将待共识交易排序并打包为消息m(也称为原始交易列表),发送pre‑prepare请求至备份节点1、2、3,pre‑prepare请求中包括原始交易列表;
[0046] a120:(PREPARE准备阶段)节点1、2、3收到pre‑prepare请求后,如果检查原始交易列表合法,则分别通过prepare消息广播其收到的消息m的hash值(广播的内容一般不包括消息m本身,因为消息m包括了若干个原始交易请求,体积一般比较大)。具体的,节点1将prepare消息扩散至节点0、2、3,节点2将prepare消息扩散至节点0、1、3,节点3将prepare消息扩散至节点0、1、2。相应的,每一节点还接收其他节点广播的prepare消息。每一节点将自己发送的prepare消息(其中包含消息m的hash值,代表自己的认可)和收到的prepare消息(其中包含消息m的hash值,代表其它节点的认可)都添加到本地日志(Log)中。如果某一节点收集齐来自不同节点的至少Quorum个数量的合法的pp消息/p消息后(包括自身发出的pre‑prepare、prepare消息,和收到的prepare消息),转变成prepared状态。
[0047] a130:(COMMIT提交阶段)参与共识的节点中的每一个在进入prepared状态后,发送commit消息给其他的共识节点,并将自己发送的commit消息添加到本地Log中(代表自己的认可),而且,每一节点还接收其他节点广播的commit消息。某一节点如果收集齐来自不同节点的至少Quorum数量的合法的commit消息后,添加到本地Log中(这时加上自己添加到本地Log中的共有Quorum个),转变成committed状态。
[0048] a140:转变为committed状态的节点将消息m输出为本轮的共识结果。
[0049] 消息m中包含哪些交易,以及所包含的交易的前后顺序,一般是由主节点在a110中决定的。确定包含哪些交易,包含的交易的前后顺序,这两个是共识机制的重要内容。区块链网络中可能接收到很多交易请求,a110中主节点打包哪些交易,决定了哪些交易会被区块链网络处理,交易的执行结果会上链。即使一组相同的交易,前后执行顺序不同会导致最终结果不同,而这影响到各个节点上的账本是否一致。
[0050] PBFT协议中,尽管提供了主节点失效的时的view change过程,从而更换新的主节点(如图2中更换后Replica 1为主节点Primary)。很多PBFT的具体实现中,是在固定的共识节点范围内做主节点的轮转,而且很多实现中主节点的轮转规则也是固定。这样,相对固定的轮转方式,容易被猜测出下一轮的共识主节点,从而该共识主节点容易被攻击。
[0051] 本申请提供一种区块链上的共识方法实施例。如图4所示,包括:
[0052] S110:根据上一轮的随机数确定本轮共识中的共识小组内发起共识提议的共识节点,所述确定的共识节点发起共识提议。
[0053] 假设当前是第r轮共识,上一轮是第r‑1轮共识,并假设区块链网络中共有10个共识节点,编号为从1至10。可以将10个共识节点分为若干个小组,各个小组之间的共识节点可以重合或不重合。这里以10个共识节点分为两组且这两个小组之间的共识节点不重合为例进行说明,其它情况实质上类似。
[0054] 假设共识节点1‑4为第一共识小组,共识节点5‑10为第二共识小组。
[0055] 在第r‑1轮共识中,可以产生随机数,这里设为ξr‑1。在第r轮共识中,一方面可以根据ξr‑1来确定本轮中发起提议的共识节点,另一方面可以生成本轮中的一个随机数,这里设为ξr。
[0056] 具体的,可以基于ξr‑1计算本轮共识中共识小组中各共识节点的优先级,则优先级最高的即为发起共识提议的共识节点。
[0057] 在创世区块中,可以设定一个随机数,作为ξ0。从而从后续从区块1开始可以依据前一区块中的随机数来生成本轮的随机数和确定本轮中发起提议的共识小组。
[0058] 此外,还可以根据所述上一轮的随机数确定本轮共识中的共识小组。仍然如前所述,例如第r‑1轮的共识小组为第二共识小组,则第r轮中的共识小组可以根据ξr‑1确定为第一共识小组。这样,根据第r‑1轮的随机数ξr‑1确定第r轮共识中发起共识提议的共识节点为第一共识小组中的共识节点。类似的,可以基于计算ξr‑1计算本轮共识中各共识小组的优先级,则优先级最高的即为本轮进行共识的共识小组。而共识节点所属的小组,可以通过ξ0确定。
[0059] S120:所述共识节点小组内的共识节点各自分别采用门限签名算法中自身的第一私钥份额对所述共识提议进行签名,生成第一签名份额,并将第一签名份额广播至所述共识小组内的其它共识节点。
[0060] 例如通过S110确定的第r轮共识中的共识小组为第一共识小组,发起共识提议的共识节点为节点1。例如采用PBFT共识算法的区块链网络中:
[0061] 在第r轮共识中,例如共识节点1收集一定量的交易请求后,可以将这些交易请求排序并打包,生成原始交易列表,进而对打包的原始交易列表发起共识提议。共识节点1作为本轮共识的主节点发起PP消息,从而广播包含原始交易列表的PP消息(还可能包括共识的轮次等信息,统称为共识提议)至第一共识小组中的其它共识节点,即节点2‑4。在P阶段,共识节点1‑4中的每一个可以分别采用门限签名算法中自身的第一私钥份额对所述共识提议进行签名,例如对包含原始交易列表(如还包括共识的轮次等信息)的hash值生成第一签名份额,并将第一签名份额通过P消息广播至所述共识小组内的其它共识节点。
[0062] 此外,也可以是在第r轮共识中,例如共识节点1收集一定量的交易请求后,将这些交易请求排序并打包,生成原始交易列表,并采用门限签名算法中自身的第一私钥份额对包含所述原始交易列表(如还包括共识的轮次等信息,统称为共识提议)的hash值进行签名,生成第一签名份额,进而广播包含所述共识提议和该签名份额的PP消息。在P阶段,共识节点2‑4中的每一个可以分别采用门限签名算法中自身的第一私钥份额对所述共识提议进行签名,生成第一签名份额,并将第一签名份额通过P消息广播至所述共识小组内的其它共识节点。
[0063] 此外,也可以是在C阶段,共识节点1‑4中的每一个分别采用门限签名算法中自身的第一私钥份额对所述共识提议进行签名,生成第一签名份额,并将第一签名份额通过C消息广播至所述共识小组内的其它共识节点。
[0064] 门限签名(threshold signature),也称为为阈值签名,是数字签名中的一个重要分支,是门限秘密共享技术和数字签名的一种结合。门限签名方案,首先是包括1个总公钥(或称为聚合公钥)和n个公私钥对。每个公私钥对中的1个公钥称为公钥份额,每个公私钥对中的1个私钥称为私钥份额。其次,存在与这个总公钥和n个公私钥对对应的恢复函数,该恢复函数可以将至少门限数量个不同私钥份额签名的签名份额恢复成一个完整签名(或称为聚合签名),这个生成的完整签名也可以由所述的那1个总公钥来验证正确性。而任意少于门限数量的签名份额则无法恢复生成该完整签名。可以采用基于ECDSA((Elliptic Curve Digital Signature Algorithm,椭圆曲线数字签名算法)的门限签名机制、基于Schnorr(一种基于离散对数难题的知识证明机制)的门限签名机制、基于BLS(Boneh‑Lynn‑Shacham Signature)的门限签名机制等。
[0065] 需要说明的是,在区块链中所采用的门限签名方案,私钥份额的个数可以等于共识节点的个数(设为n),恢复函数产生完整签名的最少签名份额的个数(即门限数量,设为t,一般t
[0066] 所述1个总公钥和n个公私钥对,可以由一个中心化的dealer生成,并分发给n个区块链共识节点,这种属于中心化的密钥分配方式。这样,结合共识算法,n个私钥份额可以是每个区块链共识节点持有其中一个。同时,每个区块链共识节点可以持有相同的1个总公钥。此外,还存在去中心化的密钥分配方式,即取消dealer,而是由n个共识节点通过密钥协商过程协商得到成对的n个公私钥对和1个总公钥,仍然是每个共识节点单独持有n个私钥份额中的一个,且各共识节点持有同一个总公钥。
[0067] 采用门限签名算法,第一共识小组内胆每一共识节点都可以采用自身特有的那一份私钥(例如包含4个节点且采用PBFT作为共识算法的区块链网络中,节点1、节点2、节点3、节点4采用门限签名算法所持有的私钥份额分别是sk1,sk2,sk3,sk4,下标数字可以表示节点的编号)对包含本次共识中原始交易列表的共识提议的hash值进行签名,得到签名结果。
[0068] 此外,S120中接收到共识提议的共识小组内的节点可以验证发起所述共识提议的节点是否为优先级最高的节点,如果是则执行所述S120中的过程,否则判断发起共识提议的节点为恶意节点。
[0069] S130:收集齐门限数量第一签名份额的共识节点采用门限签名算法中的第一恢复函数恢复得到第一聚合签名,并广播第一聚合签名至区块链网络。
[0070] 首先,接收到第一签名份额的的共识节点,可以采用对应的第一公钥验证对所述第一签名份额进行验证。如果验证通过则说明第一签名份额是正确的,否则丢弃该第一签名份额。
[0071] 收集齐至少门限数量的第一签名份额的共识节点,可以采用对应的第一恢复函数对至少门限数量的第一签名份额进行恢复,得到第一聚合签名。
[0072] 例如第一共识小组中的4个节点,每个节点有一个公私钥对,且每个节点都具有对应的恢复函数和1个相同的聚合公钥。则任一节点收集齐至少门限数量的第一签名份额后,都可以采用对应的第一恢复函数对至少门限数量的第一签名份额进行恢复,从而得到第一聚合签名,且这个第一聚合签名可以采用所述第一聚合公钥进行验证。
[0073] 进而,至少一个恢复出第一聚合签名的共识节点可以广播该第一聚合签名至区块链网络,例如广播至共识节点1‑10。至少一个共识节点还可以广播第一聚合公钥至区块链网络,例如广播至共识节点1‑10。
[0074] S140:接收到第一聚合签名和第一聚合公钥的区块链节点采用第一聚合公钥对第一聚合签名进行验证,验证通过后将第一聚合签名对应的共识提议确定为本次的共识结果。
[0075] 如前述步骤,通过门限签名算法,不需要对S140中确认的共识提议通过至少quorum个共识节点的签名来证明达成共识,而是采用第一恢复函数将至少门限个第一签名份额恢复成一个第一聚合签名,可以大大降低签名信息所占的空间和传输资源。
[0076] 接收到第一聚合签名和第一聚合公钥的区块链节点,例如是共识节点1‑10中的任一个,可以采用第一聚合公钥对第一聚合签名进行验证。如前所述,第一聚合公钥可以验证第一聚合签名的正确性。验证通过后,说明该共识提议是共识小组中至少门限个共识节点(t个,例如t=quorum,则满足共识达成的条件)达成共识,即都对所述共识提议通过用自身第一私钥份额进行签名的方式表示认可。一次共识中,共识小组内达到quorum数量的共识节点都对共识提议表示认可,则可以将该共识提议确定为本次的共识结果。
[0077] 一个真正随机产生的共识提议节点,意味着该节点的选择不会事先被知晓。特别是节点数较多的情况下,从概率上可以保障区块链中公示系统的安全性。通过上述方式,每一轮共识中可以根据随机数变更发起共识提议的共识节点,这样共识提议节点的轮转不再相对固定,也就不容易被猜测出,从而降低共识提议节点被攻击的概率。此外,可以根据随机数变更执行共识的共识小组,相应的共识提议节点也改变为执行共识的共识小组内的共识节点,从而可以进一步降低共识提议节点被攻击的概率。
[0078] S110中根据上一轮的随机数确定本轮共识中的共识小组内发起共识提议的共识节点,也可以采用门限签名算法得到。例如如图5所示,包括如下:
[0079] S210:所述共识节点小组内的共识节点各自分别采用门限签名算法中自身的第二私钥份额对上一轮的所述随机数进行签名,生成第二签名份额,并将第二签名份额广播至所述共识小组内的其它共识节点。
[0080] S220:收集齐门限数量第二签名份额的共识节点采用门限签名算法中的第二恢复函数恢复得到第二聚合签名,并根据第二聚合签名生成本轮中的随机数。
[0081] 需要说明的是,上述第二私钥份额可以与第一私钥份额相同或不同,第二恢复函数可以与第一恢复函数相同或不同。
[0082] 上述S110~S140以及S210~S220,都涉及采用门限签名算法。如前所述,可以采用基于ECDSA、Schnorr或BLS的门限签名方案。这类门限签名方案中,首先包括1个聚合公钥和n个公私钥对。每个公私钥对中的1个公钥称为公钥份额,每个公私钥对中的1个私钥称为私钥份额。其次,存在与这个聚合公钥和n个公私钥对对应的恢复函数,该恢复函数可以将至少门限数量个不同私钥份额签名的签名份额恢复成一个聚合签名,这个生成的完整签名也可以由所述的那1个聚合公钥来验证正确性。而任意少于门限数量的签名份额则无法恢复生成该完整签名。此外,用私钥份额签名得到的签名份额,可以用对应的公钥份额进行验证。
[0083] 一个共识小组中的n个参与者,可以通过中心化的方式或去中心化的方式生成公私钥对和聚合公钥。这里以去中心化的方式说明。n个参与者可以采用分布式秘钥生成(Distributed Key Generation,DKG)协议来生成所述的n个公私钥对和1个聚合公钥。例如对于第一共识小组,其中共有4个共识节点,编号分别为1、2、3、4。该方法例如图6所示,包括如下:
[0084] S310:共识小组内的每一共识节点生成一组特有的n个秘密份额,自身保留一个,并将其中n‑1个秘密份额分别加密发送至其它n‑1个节点。
[0085] 每一个节点可以在群Zq上随机选择一个t度多项式。N次多项式函数由N+1个点唯一决定,因为最终需要共识小组中至少quorum个共识节点能够恢复签名,则quorum=N+1,因此多项式的次数t为quorum‑1。这样,可以实现由至少quorum(quorum=t+1)个签名份额经恢复函数恢复得到一个完整签名。当然,也可以将t设置为其它数值。用该多项式构建的椭圆曲线可以如下表示:
[0086] fi(z)=ai0+ai1z+ai2z2+…+aitzt   公式(1)
[0087] 公式(1)中,ai0,ai1,ai2,ai3,...,ait为多项式的系数,通过这一组系数可以确定一个多项式。
[0088] 当区块链网络的共识节点数量n设置为4时,采用PBFT、HBBFT之类算法的quorum为3的情况下,这时t=2。这时,这个多项式为:
[0089] fi(z)=ai0+ai1z+ai2z2   公式(2)
[0090] 节点1可以从一个有限素数域中随机选择一组数作为系数,即作为a10,a11,a12,则2
生成的多项式为:f1(z)=a10+a11z+a12z。
[0091] 类似的,节点2可以从同一有限素数域中随机选择一组数作为系数,即作为a20,2
a21,a22,则生成的多项式为:f2(z)=a20+a21z+a22z。
[0092] 类似的,节点3可以从同一有限素数域中随机选择一组数作为系数,即作为a30,2
a31,a32,则生成的多项式为:f3(z)=a30+a31z+a32z。
[0093] 类似的,节点4可以从同一有限素数域中随机选择一组数作为系数,即作为a40,2
a41,a42,则生成的多项式为:f4(z)=a40+a41z+a42z。
[0094] 每个节点基于确定的多项式,可以进一步确定一组秘密份额。可以根据如下公式由多项式系数确定秘密份额:
[0095] sij=fi(j)mod q(j=1,…,n)   公式(3)
[0096] 公式(3)中,q是每个节点采用的相同的一个大数,对fi(j)用q取模的目的是将fi(j)的值限定在[0,q‑1]的范围内。例如:
[0097] 共识节点1生成4个秘密份额,分别为S11=f1(1)mod q,S12=f1(2)mod q,S13=f1(3)mod q,S14=f1(4)mod q。这里的4个秘密份额,4即是共识节点的总数。也就是说,如果要最终实现在从n个签名份额中取任意w个即可通过恢复函数生成一个完整签名,这里需要生成n个秘密份额。下同。
[0098] 共识节点2生成4个秘密份额,分别为S21=f2(1)mod q,S22=f2(2)mod q,S23=f2(3)mod q,S24=f2(4)mod q。
[0099] 共识节点3生成4个秘密份额,分别为S31=f3(1)mod q,S32=f3(2)mod q,S33=f3(3)mod q,S34=f3(4)mod q。
[0100] 共识节点4生成4个秘密份额,分别为S41=f4(1)mod q,S42=f4(2)mod q,S43=f4(3)mod q,S44=f4(4)mod q。
[0101] 进而,每个节点除了保留一份秘密份额外,可以通过P2P网络与其它共识节点交换生成的其它秘密份额。具体可以如下:
[0102] 共识节点1保留S11,将S12发送至节点2,将S13发送至节点3,将S14发送至节点4,可以通过区块链网络中底层的P2P(Peer to Peer,点对点)网络组件发送。发送出的秘密份额需要保密,共识节点1可以分别用接收方的公钥对待发送的秘密份额加密后再发送至接收方,或者通过TLS(Transport Layer Security,安全传输层协议)之类的安全连接发送至接收方。
[0103] 共识节点2保留S22,将S21发送至节点1,将S23发送至节点3,将S24发送至节点4,例如可以通过区块链网络中底层的P2P网络组件发送。同样的,发送出的秘密份额需要保密,共识节点2可以分别用接收方的公钥对待发送的秘密份额加密后再发送至接收方,或者通过TLS之类的安全连接发送至接收方。
[0104] 共识节点3保留S33,将S31发送至节点1,将S32发送至节点2,将S34发送至节点4。同样的,发送出的秘密份额需要保密,共识节点3可以分别用接收方的公钥对待发送的秘密份额加密后再发送至接收方,或者通过TLS之类的安全连接发送至接收方。
[0105] 共识节点4保留S44,将S41发送至节点1,将S42发送至节点2,将S43发送至节点3。同样的,发送出的秘密份额需要保密,共识节点4可以分别用接收方的公钥对待发送的秘密份额加密后再发送至接收方,或者通过TLS之类的安全连接发送至接收方。
[0106] 可见秘密份额的下标中的两个数字,左边的可以表示发出秘密份额的节点的编号,右边的可以表示接收秘密份额的节点。这样:
[0107] 共识节点1本地具有不同节点生成的秘密份额S11、S21、S31、S41;
[0108] 共识节点2本地具有不同节点生成的秘密份额S12、S22、S32、S42;
[0109] 共识节点3本地具有不同节点生成的秘密份额S13、S23、S33、S43;
[0110] 共识节点4本地具有不同节点生成的秘密份额S14、S24、S34、S44。
[0111] 其中,共识节点1本地具有的S11是自己生成的,共识节点2本地具有的S22是自己生成的,共识节点3本地具有的S33是自己生成的,共识节点4本地具有的S44是自己生成的。
[0112] 共识节点最好是对待发出的秘密份额进行签名,例如用自身私钥签名,或者采用MAC(Message Authentication Code,消息验证码),从而保证消息完整性,避免中间人攻击。相应的,接收到秘密份额的节点可以验证签名的正确性。
[0113] S320:每一节点生成自身秘密份额对应的公共验证参数并广播至共识小组内的其它节点。每一共识节点可以生成自身密钥份额对应的一组验证参数,生成方法可以采用下面公式:
[0114]
[0115] 公式(4)中,g是椭圆曲线上的基点。根据椭圆曲线的运算性质,g的幂次方也是椭圆曲线上的一个点。t是多项式的次数,一般设置为(quorum‑1)。如前所述,如果要最终实现在从n个签名份额中取任意w个即可通过恢复函数生成一个完整签名,这里需要设置多项式的次数是t,其中t=w‑1。下同。
[0116] 基于上述公式(4),设t=2,共识节点1生成的一组验证参数为,广播这一组验证参数至其他节点。类似的,基于上述公式,共识节点2生成的一组验证参数为,广播这一组验证参数至其他节点。类似的,基于上述公式,共识节点3生成的一组验证参数为,广播这一组验证参数至其他节点。类似的,基于上述公式,共识节点4生成的一组验证参数为,广播这一组验证参数至其他节点。
[0117] 基于密码学的性质,Aik公布出去,也不会倒推得到aik,因此即使获得公布的Aik,也不能得到S310中的多项式。
[0118] 这样,广播各节点生成的公共验证参数的结果可以如下:
[0119] 共识节点1本地具有不同节点生成的秘密份额S11、S21、S31、S41,以及验证参数,并可以获得公共验证参数
[0120] 共识节点2本地具有不同节点生成的秘密份额S12、S22、S32、S42,以及验证参数,并可以获得公共验证参数
[0121] 共识节点3本地具有不同节点生成的秘密份额S13、S23、S33、S43,以及验证参数,并可以获得公共验证参数
[0122] 共识节点4本地具有不同节点生成的秘密份额S14、S24、S34、S44,以及验证参数,并可以获得公共验证参数
[0123] S330:每一共识节点对接收到的每一秘密份额和对应的公共验证参数进行验证,并将通过验证的节点编号广播至其它节点。
[0124] 每一共识节点可以接收其它任一节点发来的秘密份额,并接收广播的公共验证参数。
[0125] 前述S310中提到,每一共识节点生成n个秘密份额Sij,自己保留一份,并将其中n‑1个秘密份额分别加密发送至其它n‑1个节点。前述S320中提到,每一节点生成自身秘密份额对应的公共验证参数并广播。
[0126] 如果每一节点发出的秘密份额和对应的公共验证参数是归属于同一个多项式的,则下面等式应当成立:
[0127]
[0128] 如前所述,t=quorum‑1;n=4时,quorum=3,这时t=2。
[0129] 基于公式(5)这样的性质,可以用该公式对接收到的每一秘密份额和公共验证参数进行验证。如果验证等式成立,说明秘密份额和对应的公共验证参数是归属于同一多项式,否则不归属于同一多项式。这样也可以检验生成秘密份额和对应公共验证参数的节点是否存在作恶行为。典型的作恶行为例如为节点根据第一个多项式生成了Sij,但是又以不同的多项式生成了Aik(k=0,...,t)。
[0130] 上述验证,具体的:
[0131] j=1时,即共识节点1可以验证以下内容:
[0132] i=1: (事实上,共识节点1可以不验证这个等式是否成立,因为秘密份额S11和验证参数都是自身生成的)
[0133] i=2:
[0134] i=3:
[0135] i=4:
[0136] j=2时,即共识节点2可以验证以下内容:
[0137] i=1:
[0138] i=2: (事实上,共识节点2可以不验证这个等式是否成立,因为秘密份额S22和验证参数都是自身生成的)
[0139] i=3:
[0140] i=4:
[0141] j=3时,即共识节点3可以验证以下内容:
[0142] i=1:
[0143] i=2:
[0144] i=3: (事实上,共识节点3可以不验证这个等式是否成立,因为秘密份额S33和验证参数都是自身生成的)
[0145] i=4:
[0146] j=4时,即共识节点4可以验证以下内容:
[0147] i=1:
[0148] i=2:
[0149] i=3:
[0150] i=4: (事实上,共识节点4可以不验证这个等式是否成立,因为秘密份额S44和验证参数都是自身生成的)
[0151] 每一共识节点对每一验证通过后,可以将通过验证的节点编号广播至其它节点。
[0152] 共识节点2验证等式 成立,则可以广播节点1的编号至其它节点,以表明节点2对节点1发出的秘密份额及对应公共验证参数通过检验。
[0153] 共识节点3验证等式 成立,则可以广播节点1的编号至其它节点,以表明节点3对节点1发出的秘密份额及对应公共验证参数通过检验。
[0154] 共识节点4验证等式 成立,则可以广播节点1的编号至其它节点,以表明节点4对节点1发出的秘密份额及对应公共验证参数通过检验。
[0155] 这样,共识节点2、3、4中的任一个可以收集齐除节点1之外的其它所有节点对节点1通过验证的确认,因此可以认为节点1发出的秘密份额及对应公共验证参数都是归属于同一多项式的。
[0156] 类似的:
[0157] 共识节点1验证等式 成立,则可以广播节点2的编号至其它节点,以表明节点1对节点2发出的秘密份额及对应公共验证参数通过检验。
[0158] 共识节点3验证等式 成立,则可以广播节点2的编号至其它节点,以表明节点3对节点2发出的秘密份额及对应公共验证参数通过检验。
[0159] 共识节点4验证等式 成立,则可以广播节点2的编号至其它节点,以表明节点4对节点2发出的秘密份额及对应公共验证参数通过检验。
[0160] 这样,共识节点1、3、4中的任一个可以收集齐除节点2之外的其它所有节点对节点2通过验证的确认,因此可以认为节点2发出的秘密份额及对应公共验证参数都是归属于同一多项式的。
[0161] 类似的:
[0162] 共识节点1验证等式 成立,则可以广播节点3的编号至其它节点,以表明节点1对节点3发出的秘密份额及对应公共验证参数通过检验。
[0163] 共识节点2验证等式 成立,则可以广播节点3的编号至其它节点,以表明节点2对节点3发出的秘密份额及对应公共验证参数通过检验。
[0164] 共识节点4验证等式 成立,则可以广播节点3的编号至其它节点,以表明节点4对节点3发出的秘密份额及对应公共验证参数通过检验。
[0165] 这样,共识节点1、2、4中的任一个可以收集齐除节点3之外的其它所有节点对节点3通过验证的确认,因此可以认为节点3发出的秘密份额及对应公共验证参数都是归属于同一多项式的。
[0166] 类似的:
[0167] 共识节点1验证等式 成立,则可以广播节点4的编号至其它节点,以表明节点1对节点4发出的秘密份额及对应公共验证参数通过检验。
[0168] 共识节点2验证等式 成立,则可以广播节点4的编号至其它节点,以表明节点2对节点4发出的秘密份额及对应公共验证参数通过检验。
[0169] 共识节点4验证等式 成立,则可以广播节点4的编号至其它节点,以表明节点3对节点4发出的秘密份额及对应公共验证参数通过检验。
[0170] 这样,DKG合约可以收集齐除节点4之外的其它所有节点对节点4通过验证的确认,因此可以认为节点4发出的秘密份额及对应公共验证参数都是归属于同一多项式的。
[0171] S340:每一共识节点根据各共识节点发来的验证通过的节点编号确定节点集合,并基于验证参数及所述节点集合计算公钥份额,基于本地的秘密份额和节点集合计算自身对应的私钥份额和聚合公钥。
[0172] 进一步的,每一共识节点可以根据各共识节点发来的验证通过的节点编号确定节点集合。
[0173] 例如所述DKG合约,可以根据各共识节点发来的交易校验确定节点集合,具体的,对于一个节点编号,如果某一节点收到了所有其它节点对该节点编号的确认,则将被确认的节点编号加入节点集合。这个集合例如是QUAL集合。
[0174] 例如,S340的例子中,节点2收到了节点3和节点4对节点1的确认,如果节点2自身对节点1也是确认的,则节点2可以将节点1加入到QUAL集合中;类似的,节点3收到了节点2和节点4对节点1的确认,如果节点3自身对节点1也是确认的,则节点3可以将节点1加入到QUAL集合中;类似的,节点4收到了节点2和节点3对节点1的确认,如果节点4自身对节点1也是确认的,则节点4可以将节点1加入到QUAL集合中。此外,如果节点1收到了节点2、节点3和节点4对节点1的确认,则节点1可以将自身的编号加入到QUAL集合中(正常来说节点1对自身来说是认可的)。
[0175] 这样,节点1、2、3、4各自的QUAL集合中包括{1}。
[0176] 类似的,节点1收到了节点3和节点4对节点2的确认,如果节点1自身对节点2也是确认的,则节点1可以将节点2加入到QUAL集合中;类似的,节点3收到了节点1和节点4对节点2的确认,如果节点3自身对节点2也是确认的,则节点3可以将节点2加入到QUAL集合中;类似的,节点4收到了节点1和节点3对节点2的确认,如果节点4自身对节点2也是确认的,则节点4可以将节点2加入到QUAL集合中。此外,如果节点2收到了节点1、节点3和节点4对节点
2的确认,则节点2可以将自身的编号加入到QUAL集合中(正常来说节点2对自身来说是认可的)。
[0177] 这样,节点1、2、3、4各自的QUAL集合中包括{1,2}。
[0178] 类似的,节点1收到了节点2和节点4对节点3的确认,如果节点1自身对节点3也是确认的,则节点1可以将节点3加入到QUAL集合中;类似的,节点2收到了节点1和节点4对节点3的确认,如果节点2自身对节点3也是确认的,则节点2可以将节点3加入到QUAL集合中;类似的,节点4收到了节点1和节点2对节点3的确认,如果节点4自身对节点3也是确认的,则节点4可以将节点3加入到QUAL集合中。此外,如果节点3收到了节点1、节点2和节点4对节点
3的确认,则节点3可以将自身的编号加入到QUAL集合中(正常来说节点3对自身来说是认可的)。
[0179] 这样,节点1、2、3、4各自的QUAL集合中包括{1,2,3}。
[0180] 类似的,节点1收到了节点2和节点3对节点4的确认,如果节点1自身对节点4也是确认的,则节点1可以将节点4加入到QUAL集合中;类似的,节点2收到了节点1和节点3对节点4的确认,如果节点2自身对节点4也是确认的,则节点2可以将节点4加入到QUAL集合中;类似的,节点3收到了节点1和节点2对节点4的确认,如果节点3自身对节点4也是确认的,则节点3可以将节点4加入到QUAL集合中。此外,如果节点4收到了节点1、节点2和节点3对节点
4的确认,则节点4可以将自身的编号加入到QUAL集合中(正常来说节点4对自身来说是认可的)。
[0181] 这样,节点1、2、3、4各自的QUAL集合中包括{1,2,3,4}。
[0182] 进而,一方面,每一共识节点各自可以在本地基于验证参数及合约中的节点集合计算公钥份额,可以按照下面公式计算该公钥份额:
[0183]
[0184] 这样,例如共识节点1计算的公钥份额可以是:
[0185]
[0186] 类似的,例如共识节点2计算的公钥份额可以是:
[0187]
[0188] 类似的,例如共识节点3计算的公钥份额可以是:
[0189]
[0190]
[0191] 类似的,例如共识节点4计算的公钥份额可以是:
[0192]
[0193] 另一方面,每一共识节点各自基于本地的秘密份额和合约中的节点集合计算自身对应的私钥份额,可以按照下面公式计算:
[0194] xj=∑i∈QUAL sij mod q   公式(7)
[0195] 例如,共识节点1在本地计算自身的私钥份额:
[0196]
[0197] 共识节点2在本地计算自身的私钥份额:
[0198]
[0199] 共识节点3在本地计算自身的私钥份额:
[0200]
[0201] 共识节点4在本地计算自身的私钥份额:
[0202]
[0203] 可见,节点1、节点2、节点3和节点4计算得到的私钥份额不相同。
[0204] 再一方面,每一共识节点各自可以在本地基于验证参数及合约中的节点集合计算总公钥,可以按照下面公式计算该总公钥:
[0205] y=∏i∈QUALyi   公式(8)
[0206] 其中,yi=Ai0。
[0207] 这样,例如共识节点1计算总公钥可以是:
[0208] y=y1*y2*y3*y4=A10*A20*A30*A40
[0209] 类似的,例如共识节点2计算总公钥可以是:
[0210] y=y1*y2*y3*y4=A10*A20*A30*A40
[0211] 类似的,例如共识节点3计算总公钥可以是:
[0212] y=y1*y2*y3*y4=A10*A20*A30*A40
[0213] 类似的,例如共识节点4计算总公钥可以是:
[0214] y=y1*y2*y3*y4=A10*A20*A30*A40
[0215] 可见,节点1、节点2、节点3和节点4计算得到的总公钥相同,即通过上述方法,各节点获得相同的总公钥。
[0216] 上述私钥份额x1与公钥份额pub1对应,私钥份额x2与公钥份额pub2对应,私钥份额x3与公钥份额pub3对应,私钥份额x4与公钥份额pub4对应。如前所述,每一公钥份额,可以对对应私钥份额所做的签名份额进行验证。而且,至少quorum个私钥份额产生的签名份额经恢复函数恢复出的一个完整签名,可以由对应的那1个聚合公钥进行验证。
[0217] 以下介绍本申请一种区块链上实现分布式密钥生成的方法实施例,由本轮共识小组的一个共识节点执行,该方法包括:
[0218] 根据上一轮的随机数确定本轮共识中的共识小组内发起共识提议的共识节点;
[0219] 采用门限签名算法中自身的第一私钥份额对所述共识提议进行签名,生成第一签名份额,并将第一签名份额广播至所述共识小组内的其它共识节点;
[0220] 收集齐门限数量第一签名份额后,采用门限签名算法中的第一恢复函数恢复得到第一聚合签名,并广播该第一聚合签名及对应的第一聚合公钥至区块链网络;
[0221] 接收到第一聚合签名和第一聚合公钥后,采用第一聚合公钥对第一聚合签名进行验证,验证通过后将第一聚合签名对应的共识提议确定为本次的共识结果。
[0222] 所述根据上一轮的随机数确定本轮共识中的共识小组内发起共识提议的共识节点,包括:
[0223] 基于上一轮的随机数计算本轮共识中共识小组中各共识节点的优先级,将优先级最高的设为本轮中发起共识提议的共识节点。
[0224] 所述的方法,还包括根据所述上一轮的随机数确定本轮共识中的共识小组。
[0225] 所述根据所述上一轮的随机数确定本轮共识中的共识小组,包括:
[0226] 基于上一轮的随机数计算本轮共识中各共识小组的优先级,将优先级最高的设为本轮中进行共识的共识小组。
[0227] 所述的方法还包括,验证发起所述共识提议的节点为优先级最高的节点。
[0228] 所述的方法还包括,接收到第一签名份额的的共识节点采用对应的第一公钥验证对所述第一签名份额进行验证。
[0229] 所述的方法,还包括根据上一轮的随机数确定本轮的随机数。
[0230] 所述根据上一轮的随机数确定本轮的随机数,包括:
[0231] 采用门限签名算法中自身的第二私钥份额对上一轮的所述随机数进行签名,生成第二签名份额,并将第二签名份额广播至所述共识小组内的其它共识节点;
[0232] 收集齐门限数量第二签名份额后,采用门限签名算法中的第二恢复函数恢复得到第二聚合签名,并根据第二聚合签名生成本轮中的随机数。
[0233] 所述共识小组内的共识节点通过下述过程确定所述门限签名算法中的私钥份额、公钥份额和聚合公钥:
[0234] 生成一组特有的n个秘密份额,自身保留一个,并将其中n‑1个秘密份额分别加密发送至其它n‑1个节点;
[0235] 生成自身秘密份额对应的公共验证参数并广播至共识小组内的其它节点;
[0236] 对接收到的每一秘密份额和对应的公共验证参数进行验证,并将通过验证的节点编号广播至其它节点;
[0237] 根据各共识节点发来的验证通过的节点编号确定节点集合,并基于验证参数及所述节点集合计算公钥份额,基于本地的秘密份额和节点集合计算自身对应的私钥份额和聚合公钥。
[0238] 以下介绍本申请一种区块链系统实施例,包括若干个共识小组,每个共识小组内包括若干共识节点,其中:
[0239] 本轮执行共识的共识小组内的共识节点各自根据上一轮的随机数确定本轮共识中的共识小组内发起共识提议的共识节点;
[0240] 所述确定的共识节点发起共识提议;
[0241] 所述本轮执行共识的共识小组内的共识节点各自分别采用门限签名算法中自身的第一私钥份额对所述共识提议进行签名,生成第一签名份额,并将第一签名份额广播至所述共识小组内的其它共识节点;
[0242] 收集齐门限数量第一签名份额的共识节点采用门限签名算法中的第一恢复函数恢复得到第一聚合签名,并广播该第一聚合签名及对应的第一聚合公钥至区块链网络;
[0243] 所述区块链网络中接收到第一聚合签名和第一聚合公钥的区块链节点采用第一聚合公钥对第一聚合签名进行验证,验证通过后将第一聚合签名对应的共识提议确定为本次的共识结果。
[0244] 以下介绍本申请一种区块链系统中的第一共识节点实施例,第一共识节点为本轮共识小组的一个共识节点,其中,第一共识节点执行:
[0245] 根据上一轮的随机数确定本轮共识中的共识小组内发起共识提议的共识节点;
[0246] 采用门限签名算法中自身的第一私钥份额对所述共识提议进行签名,生成第一签名份额,并将第一签名份额广播至所述共识小组内的其它共识节点;
[0247] 收集齐门限数量第一签名份额后,采用门限签名算法中的第一恢复函数恢复得到第一聚合签名,并广播该第一聚合签名及对应的第一聚合公钥至区块链网络;
[0248] 接收到第一聚合签名和第一聚合公钥后,采用第一聚合公钥对第一聚合签名进行验证,验证通过后将第一聚合签名对应的共识提议确定为本次的共识结果。
[0249] 在20世纪90年代,对于一个技术的改进可以很明显地区分是硬件上的改进(例如,对二极管、晶体管、开关等电路结构的改进)还是软件上的改进(对于方法流程的改进)。然而,随着技术的发展,当今的很多方法流程的改进已经可以视为硬件电路结构的直接改进。设计人员几乎都通过将改进的方法流程编程到硬件电路中来得到相应的硬件电路结构。因此,不能说一个方法流程的改进就不能用硬件实体模块来实现。例如,可编程逻辑器件(Programmable Logic Device,PLD)(例如现场可编程门阵列(Field Programmable Gate Array,FPGA))就是这样一种集成电路,其逻辑功能由用户对器件编程来确定。由设计人员自行编程来把一个数字系统“集成”在一片PLD上,而不需要请芯片制造厂商来设计和制作专用的集成电路芯片。而且,如今,取代手工地制作集成电路芯片,这种编程也多半改用“逻辑编译器(logic compiler)”软件来实现,它与程序开发撰写时所用的软件编译器相类似,而要编译之前的原始代码也得用特定的编程语言来撰写,此称之为硬件描述语言(Hardware Description Language,HDL),而HDL也并非仅有一种,而是有许多种,如ABEL(Advanced Boolean Expression Language)、AHDL(Altera Hardware Description Language)、Confluence、CUPL(Cornell University Programming Language)、HDCal、JHDL(Java Hardware Description Language)、Lava、Lola、MyHDL、PALASM、RHDL(Ruby Hardware Description Language)等,目前最普遍使用的是VHDL(Very‑High‑Speed Integrated Circuit Hardware Description Language)与Verilog。本领域技术人员也应该清楚,只需要将方法流程用上述几种硬件描述语言稍作逻辑编程并编程到集成电路中,就可以很容易得到实现该逻辑方法流程的硬件电路。
[0250] 控制器可以按任何适当的方式实现,例如,控制器可以采取例如微处理器或处理器以及存储可由该(微)处理器执行的计算机可读程序代码(例如软件或固件)的计算机可读介质、逻辑门、开关、专用集成电路(Application Specific Integrated Circuit,ASIC)、可编程逻辑控制器和嵌入微控制器的形式,控制器的例子包括但不限于以下微控制器:ARC 625D、Atmel AT91SAM、Microchip PIC18F26K20以及Silicone Labs C8051F320,存储器控制器还可以被实现为存储器的控制逻辑的一部分。本领域技术人员也知道,除了以纯计算机可读程序代码方式实现控制器以外,完全可以通过将方法步骤进行逻辑编程来使得控制器以逻辑门、开关、专用集成电路、可编程逻辑控制器和嵌入微控制器等的形式来实现相同功能。因此这种控制器可以被认为是一种硬件部件,而对其内包括的用于实现各种功能的装置也可以视为硬件部件内的结构。或者甚至,可以将用于实现各种功能的装置视为既可以是实现方法的软件模块又可以是硬件部件内的结构。
[0251] 上述实施例阐明的系统、装置、模块或单元,具体可以由计算机芯片或实体实现,或者由具有某种功能的产品来实现。一种典型的实现设备为服务器系统。当然,本申请不排除随着未来计算机技术的发展,实现上述实施例功能的计算机例如可以为个人计算机、膝上型计算机、车载人机交互设备、蜂窝电话、相机电话、智能电话、个人数字助理、媒体播放器、导航设备、电子邮件设备、游戏控制台、平板计算机、可穿戴设备或者这些设备中的任何设备的组合。
[0252] 虽然本说明书一个或多个实施例提供了如实施例或流程图所述的方法操作步骤,但基于常规或者无创造性的手段可以包括更多或者更少的操作步骤。实施例中列举的步骤顺序仅仅为众多步骤执行顺序中的一种方式,不代表唯一的执行顺序。在实际中的装置或终端产品执行时,可以按照实施例或者附图所示的方法顺序执行或者并行执行(例如并行处理器或者多线程处理的环境,甚至为分布式数据处理环境)。术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、产品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、产品或者设备所固有的要素。在没有更多限制的情况下,并不排除在包括所述要素的过程、方法、产品或者设备中还存在另外的相同或等同要素。例如若使用到第一,第二等词语用来表示名称,而并不表示任何特定的顺序。
[0253] 为了描述的方便,描述以上装置时以功能分为各种模块分别描述。当然,在实施本说明书一个或多个时可以把各模块的功能在同一个或多个软件和/或硬件中实现,也可以将实现同一功能的模块由多个子模块或子单元的组合实现等。以上所描述的装置实施例仅仅是示意性的,例如,所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,装置或单元的间接耦合或通信连接,可以是电性,机械或其它的形式。
[0254] 本发明是参照根据本发明实施例的方法、装置(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
[0255] 这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
[0256] 这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
[0257] 在一个典型的配置中,计算设备包括一个或多个处理器(CPU)、输入/输出接口、网络接口和内存。
[0258] 内存可能包括计算机可读介质中的非永久性存储器,随机存取存储器(RAM)和/或非易失性内存等形式,如只读存储器(ROM)或闪存(flash RAM)。内存是计算机可读介质的示例。
[0259] 计算机可读介质包括永久性和非永久性、可移动和非可移动媒体可以由任何方法或技术来实现信息存储。信息可以是计算机可读指令、数据结构、程序的模块或其他数据。计算机的存储介质的例子包括,但不限于相变内存(PRAM)、静态随机存取存储器(SRAM)、动态随机存取存储器(DRAM)、其他类型的随机存取存储器(RAM)、只读存储器(ROM)、电可擦除可编程只读存储器(EEPROM)、快闪记忆体或其他内存技术、只读光盘只读存储器(CD‑ROM)、数字多功能光盘(DVD)或其他光学存储、磁盒式磁带,磁带磁磁盘存储、石墨烯存储或其他磁性存储设备或任何其他非传输介质,可用于存储可以被计算设备访问的信息。按照本文中的界定,计算机可读介质不包括暂存电脑可读媒体(transitory media),如调制的数据信号和载波。
[0260] 本领域技术人员应明白,本说明书一个或多个实施例可提供为方法、系统或计算机程序产品。因此,本说明书一个或多个实施例可采用完全硬件实施例、完全软件实施例或结合软件和硬件方面的实施例的形式。而且,本说明书一个或多个实施例可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD‑ROM、光学存储器等)上实施的计算机程序产品的形式。
[0261] 本说明书一个或多个实施例可以在由计算机执行的计算机可执行指令的一般上下文中描述,例如程序模块。一般地,程序模块包括执行特定任务或实现特定抽象数据类型的例程、程序、对象、组件、数据结构等等。也可以在分布式计算环境中实践本本说明书一个或多个实施例,在这些分布式计算环境中,由通过通信网络而被连接的远程处理设备来执行任务。在分布式计算环境中,程序模块可以位于包括存储设备在内的本地和远程计算机存储介质中。
[0262] 本说明书中的各个实施例均采用递进的方式描述,各个实施例之间相同相似的部分互相参见即可,每个实施例重点说明的都是与其他实施例的不同之处。尤其,对于系统实施例而言,由于其基本相似于方法实施例,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。在本说明书的描述中,参考术语“一个实施例”、“一些实施例”、“示例”、“具体示例”、或“一些示例”等的描述意指结合该实施例或示例描述的具体特征、结构、材料或者特点包含于本说明书的至少一个实施例或示例中。在本说明书中,对上述术语的示意性表述不必须针对的是相同的实施例或示例。而且,描述的具体特征、结构、材料或者特点可以在任一个或多个实施例或示例中以合适的方式结合。此外,在不相互矛盾的情况下,本领域的技术人员可以将本说明书中描述的不同实施例或示例以及不同实施例或示例的特征进行结合和组合。
[0263] 以上所述仅为本说明书一个或多个实施例的实施例而已,并不用于限制本本说明书一个或多个实施例。对于本领域技术人员来说,本说明书一个或多个实施例可以有各种更改和变化。凡在本说明书的精神和原理之内所作的任何修改、等同替换、改进等,均应包含在权利要求范围之内。

当前第1页 第1页 第2页 第3页