一种残膜回收机防缠绕挑膜装置的制 一种秧草收获机用电力驱动行走机构

区块链上实现分布式密钥生成的方法、系统和共识节点与流程

2022-06-22 14:30:18 来源:中国专利 TAG:


1.本说明书实施例属于区块链技术领域,尤其涉及一种区块链上实现分布式密钥生成的方法、系统和共识节点。


背景技术:

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


技术实现要素:

3.本说明书的目的在于提供一种区块链上实现分布式密钥生成的方法、系统和共识节点,包括:
4.一种区块链上实现分布式密钥生成的方法,包括:
5.每一共识节点生成n个秘密份额,自身保留一份,并将其中n-1个秘密份额分别加密发送至其它n-1个节点;
6.每一共识节点生成自身秘密份额对应的公共验证参数并通过链上合约广播;所述合约将请求广播的节点的编号加入第一节点集合;
7.每一共识节点对接收到的每一秘密份额和对应的公共验证参数进行验证,并将验证失败的节点编号通过投诉交易发送至所述合约;所述合约根据各共识节点发来的验证失败的节点编号和第一节点集合确定第二节点集合;
8.每一共识节点各自基于验证参数及第二节点集合计算公钥份额,并基于本地的秘密份额和第二节点集合计算自身对应的私钥份额。
9.一种区块链上实现分布式密钥生成的方法,包括:
10.第一节点接收其它节点生成并加密的秘密份额,并通过链上合约广播接收对应的公共验证参数;所述合约将请求广播的节点的编号加入第一节点集合;
11.第一节点对接收到的每一秘密份额和对应的公共验证参数进行验证,并将验证失败的节点编号通过投诉交易发送至所述合约;所述合约根据各共识节点发来的验证失败的节点编号和第一节点集合确定第二节点集合;
12.第一节点各自基于验证参数及第二节点集合计算公钥份额,并基于本地的秘密份额和第二节点集合计算自身对应的私钥份额。
13.一种区块链系统,包括若干个共识节点,其中:
14.每一共识节点生成n个秘密份额,自身保留一份,并将其中n-1个秘密份额分别加密发送至其它n-1个节点;
15.每一共识节点生成自身秘密份额对应的公共验证参数并通过链上合约广播;所述合约将请求广播的节点的编号加入第一节点集合;
16.每一共识节点对接收到的每一秘密份额和对应的公共验证参数进行验证,并将验证失败的节点编号通过投诉交易发送至所述合约;所述合约根据各共识节点发来的验证失败的节点编号和第一节点集合确定第二节点集合;
17.每一共识节点各自基于验证参数及第二节点集合计算公钥份额,并基于本地的秘密份额和第二节点集合计算自身对应的私钥份额。
18.一种区块链系统中的第一共识节点,包括:
19.第一节点接收其它节点生成并加密的秘密份额,并通过链上合约广播接收对应的公共验证参数;所述合约将请求广播的节点的编号加入第一节点集合;
20.第一节点对接收到的每一秘密份额和对应的公共验证参数进行验证,并将验证失败的节点编号通过投诉交易发送至所述合约;所述合约根据各共识节点发来的验证失败的节点编号和第一节点集合确定第二节点集合;
21.第一共识节点各自基于验证参数及第二节点集合计算公钥份额,并基于本地的秘密份额和第二节点集合计算自身对应的私钥份额。
22.本说明书提供的上述方案,在共识机制保障区块链网络整体一致性和同步的基础上,结合区块链智能合约实现分布式密钥生成,保障了分布式密钥密钥的生成一方面是由各个参与方通过协作来生成的,另一方面生成的结果是一致和可靠的,从而摆脱了原有的区块链之外实现分布式密钥生成对网络同步的强依赖,并解决了该情况下生成结果的不可靠性问题。
附图说明
23.图1是一实施例中实用拜占庭容错算法常规阶段的示意图;
24.图2是一实施例中实用拜占庭容错算法视图切换阶段的示意图;
25.图3是一实施例中共识节点都没有宕机情况下实用拜占庭容错算法常规阶段的示意图;
26.图4是本说明书一实施例中区块链上产生随机数种子的流程图;
27.图5是本说明书一实施例中区块头结构的示意图;
28.图6是本说明书一实施例中区块链上产生随机数种子的流程图;
29.图7是本说明书一实施例中区块链上实现分布式密钥生成的方法;
30.图8是本说明书一实施例中区块链上实现分布式密钥生成的方法。
具体实施方式
31.为了使本技术领域的人员更好地理解本说明书中的技术方案,下面将结合本说明书实施例中的附图,对本说明书实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本说明书一部分实施例,而不是全部的实施例。基于本说明书中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都应当属于本说明书保护的范围。
32.区块链1.0时代通常是指在2009年到2014年之间,区块链应用发展阶段,它们主要致力于解决货币和支付手段的去中心化问题。从2014年开始,开发者们越来越注重于解决上述方案在技术和扩展性方面的不足。2013年底,vitalik buterin将智能合约引入区块
链,打开了区块链在货币领域以外的应用,从而开启了区块链2.0时代。
33.区块链系统中,不同参与方通过部署的节点(node)可以建立一个分布式的区块链网络。利用链式区块结构构造的去中心化(或称为多中心化)的分布式账本,保存于分布式的区块链网络中的每个节点(或大多节点上,如共识节点)上。这样的区块链系统需要解决去中心化(或多中心化)的多个节点上各自的账本数据的一致性和正确性的问题。每个节点(或多个节点)上都运行着区块链程序,在一定容错需求的设计下,通过共识(consensus)机制保证所有忠诚节点具有相同的交易,从而保证所有忠诚节点对相同交易的执行结果一致,并将交易及执行结果打包生成区块。
34.智能合约是一种基于规定触发规则的,可自动执行的计算机合约,也可以看作是传统合约的数字版本。智能合约这一概念最早由跨领域法律学者、密码学研究工作者尼克
·
萨博(nick szabo)在1994年提出。这项技术曾一度因为缺乏可编程数字系统和相关技术而没有被用于实际产业中,直到区块链技术的出现为其提供了可靠的执行环境。由于区块链技术采用块链式账本,产生的数据不可篡改或者删除,且整个账本将不断新增账本数据,从而保证了历史数据的可追溯;同时,去中心化的运行机制避免了中心化因素的影响。基于区块链技术的智能合约不仅可以发挥智能合约在成本、效率方面的优势,而且可以避免恶意行为对合约正常执行的干扰。将智能合约以数字化的形式写入区块链中,由区块链技术的特性保障存储、读取、执行整个过程透明可跟踪、不可篡改。
35.区块链发展及应用多样化。一些业务逻辑被编辑为智能合约并在区块链平台上执行。具体的,这些包含业务逻辑的智能合约可以运行于区块链网络中的每个节点(或大多节点上,如共识节点)上。相对于中心化的业务逻辑执行环境所带来的单点故障导致整个中心化系统不可用的问题,区块链环境中执行智能合约也被称为“世界计算机”,这是因为分布式的区块链网络中有较多节点各自独立执行智能合约。如前所述,这些不同节点上执行相同逻辑的智能合约,需要获得相同的执行结果,从而保证这些节点中的多数保存的账本是一致的。
36.一些业务逻辑中,可能需要基于随机数产生一个结果,例如实现抽奖的业务逻辑,实现摇号的业务逻辑,或者实现一定范围内随机金额发红包或盲盒等的业务逻辑,这一般需要在智能合约中包含产生随机数的程序。再例如,一些系统合约中,可能需要实现对主节点的投票或对小规模委员会的投票,这个投票逻辑中可能采用随机的方式或者是用到随机数。如前所述,分布式的区块链网络中有一个显著特点,是为了保证分布式的区块链网络整体可用而需要多数节点中的账本是一致的,这也就需要多数节点中的智能合约产生的随机数是一致的。
37.前述提到,每个节点(或多个节点)上都运行着区块链程序,在一定容错需求的设计下,通过共识机制保证所有忠诚节点具有相同的交易,从而保证所有忠诚节点对相同交易的执行结果一致,并将交易及执行结果打包生成区块。当前主流的共识机制包括:工作量证明(proof of work,pow)、股权证明(proof of stake,pos)、委任权益证明(delegated proof of stake,dpos)、实用拜占庭容错(practical byzantine fault tolerance,pbft)算法,蜜獾拜占庭容错(honeybadgerbft)算法等。
38.以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。
39.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协议阶段,以更换主节点。
40.在正常情况下,即共识节点都没有宕机,共识消息也能在一定时间内到达对方,即不会发生换主的情况下,pbft中的normal case phase过程可以如图3所示,该图仍然以4个共识节点为例。
41.在第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个区块。
42.在第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的三阶段过程。
43.可见,常规产生区块的情况下,每个共识节点在每个区块的产生过程中包含一次pbft的normal case phase过程。随着区块的不断产生,每个共识节点将会重复这个共识过程,图3中仅示例性的示出了第r-1、r和r 1轮共识过程。其中,有的共识节点作为pbft中的主节点的角色,有的共识节点作为pbft中的备份节点的角色。
44.在一次共识过程中,即一次pbft的三阶段过程中,可以包括:
45.a110:(pre-prepare预准备阶段)主节点0收集一定数量的待共识交易后,将待共识交易排序并打包为消息m(也称为原始交易列表),发送pre-prepare请求至备份节点1、2、3,pre-prepare请求中包括原始交易列表;
46.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状态。
47.a130:(commit提交阶段)参与共识的节点中的每一个在进入prepared状态后,发送commit消息给其他的共识节点,并将自己发送的commit消息添加到本地log中(代表自己的认可),而且,每一节点还接收其他节点广播的commit消息。某一节点如果收集齐来自不同节点的至少quorum数量的合法的commit消息后,添加到本地log中(这时加上自己添加到本地log中的共有quorum个),转变成committed状态。
48.a140:转变为committed状态的节点将消息m输出为本轮的共识结果。
49.消息m中包含哪些交易,以及所包含的交易的前后顺序,一般是由主节点在a110中
决定的。确定包含哪些交易,包含的交易的前后顺序,这两个是共识机制的重要内容。区块链网络中可能接收到很多交易请求,a110中主节点打包哪些交易,决定了哪些交易会被区块链网络处理,交易的执行结果会上链。即使一组相同的交易,前后执行顺序不同会导致最终结果不同,而这影响到各个节点上的账本是否一致。
50.本说明书提供一种区块链上产生随机数种子的方法,可以结合上述pbft三阶段的过程实现。如图4所示,包括:
51.s110:在pbft的commit阶段,每一共识节点基于门限签名算法,采用自身私钥份额对包含本次共识中原始交易列表特有值的原始报文进行签名,生成签名份额,并将该签名份额加入到广播的commit消息中。
52.门限签名是普通数字签名的一个重要分支,是门限秘密共享技术和数字签名的一种结合。传统的签名方案,可以采用rsa算法实现。rsa算法是一种非对称加密算法,由罗纳德
·
李维斯特(ron rivest)、阿迪
·
萨莫尔(adi shamir)和伦纳德
·
阿德曼(leonard adleman)于1977年一起提出。rsa算法可以在不直接传递密钥的情况下完成解密,这能够确保信息的安全性的同时,避免直接传递密钥所造成的信息被破解的风险。rsa中包括私钥和公钥,这个私钥和公钥是成对。一个信息由公钥加密后,只能由对应的私钥解密;类似的,一个信息由私钥加密后,只能由对应的公钥解密。之所以具有这样的性质,是因为成对的私钥和公钥之间在数学原理上具有相关性,例如一种底层原理是根据数论,寻求两个大素数比较简单,而将它们的乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥,从而可以保证安全性。私钥通常要严格保密,不能泄露,而公钥是公开的(且可以由多人持有)。由于私钥是由持有者严格保密的,其他人在无法获得私钥的前提下,就无法伪造私钥持有者的签名。
53.rsa签名机制,可以保证报文传递过程中的完整性。例如节点a需要将报文传送至节点b,且中间可能经过若干个节点的中转。则a可以采用rsa签名机制,将报文连同签名一并经由若干个中间节点传送至b,而b对签名的验证可以确信收到的报文是a发出的,且在传送过程中没有经过篡改。一种rsa签名的过程如下:
54.b1:a生成一对密钥(公钥和私钥),私钥不公开,自己保留。公钥为公开的,任何人可以获取。
55.b2:a用自己的私钥对原始报文的hash值进行签名,并将原始报文和签名结果一并传递给b。如前所述,这个传递过程可能经过若干个中间节点的转发。
56.hash算法也称为散列算法,可以将原始内容映射为一个固定长度的序列,这个序列即为hash值。一般有sha256,sha384,sha512等hash算法。sha256的结果是256个bits,可以表示2的256次方个原始内容。类似的,sha384的结果是384bits,sha512的结果是512bits。这些hash算法,可以针对内容较多体积较大的原始内容,因而hash值相对来说可以比原始内容小很多。好的hash算法可以确保不同原始内容有极大概率映射为不同的hash值,同时这种映射是杂乱无章的,即无法预测不同的原始内容得到的hash值的关联性;而且也是抗逆运算的,即无法由hash值倒推得到原始内容。
57.原始报文可能内容较多,体积较大,采用私钥直接对原始报文进行签名计算可能比较费时和耗费算力。因此,可以将原始报文采用一种hash算法计算到一个hash值,这样这个hash值长度较小,又可以完全代表原始报文。进而,采用私钥对这个hash值进行加密计
算,得到的结果即为签名。
58.b3:b收到消息后,采用a的公钥进行验签。
59.一方面,b可以采用与a相同的hash算法来计算原始报文的hash值,计为hash1;另一方面,b采用a的公钥对签名结果进行解密计算,得到hash2。如果hash1与hash2相同,则可以确定收到的原始报文是a发出的,且在传送过程中没有被篡改过。
60.门限签名方案,首先是包括1个总公钥和n个公私钥对。每个公私钥对中的1个公钥称为公钥份额,每个公私钥对中的1个私钥称为私钥份额。其次,存在与这个总公钥和n个公私钥对对应的恢复函数,该恢复函数可以将至少门限数量个不同私钥份额签名的签名份额恢复成一个完整签名,这个生成的完整签名也可以由所述的那1个总公钥来验证正确性。而任意少于门限数量的签名份额则无法恢复生成该完整签名。
61.除了可以采用基于rsa的门限签名机制外,还可以采用基于ecdsa((elliptic curve digital signature algorithm,椭圆曲线数字签名算法)的门限签名机制、基于schnorr(一种基于离散对数难题的知识证明机制)的门限签名机制、基于bls(boneh-lynn-shacham signature)的门限签名机制等。
62.需要说明的是,在区块链中所采用的门限签名,私钥份额的个数可以等于共识节点的个数,恢复函数产生完整签名的最少签名份额的个数(即门限数量)可以等于pbft算法中的quorum。当然,私钥的个数也可以不等于共识节点的个数,恢复函数产生完整签名的最少签名份额的个数可以不等于pbft算法中的quorum。以下以前者为例说明。
63.所述1个总公钥和n个公私钥对,可以由一个中心化的dealer生成,并分发给n个区块链共识节点,这种属于中心化的密钥分配方式。这样,结合共识算法,n个私钥份额可以是每个区块链共识节点持有其中一个。同时,每个区块链共识节点可以持有相同的1个总公钥。此外,还存在去中心化的密钥分配方式,即取消dealer,而是由n个共识节点通过密钥协商过程协商得到成对的n个公私钥对和1个总公钥,仍然是每个共识节点单独持有n个私钥份额中的一个,且各共识节点持有同一个总公钥。
64.采用门限签名算法,每一共识节点都可以采用自身特有的那一份私钥(例如包含4个节点且采用pbft作为共识算法的区块链网络中,节点0、节点1、节点2、节点3采用门限签名算法所持有的私钥份额分别是sk0,sk1,sk2,sk3,下标数字可以表示节点的编号)对包含本次共识中原始交易列表特有值的原始报文进行签名,得到签名结果。这里,原始交易列表的特有值可以作为签名所针对的原始报文。
65.原始交易列表的特有值,可以包括原始交易列表本身或者原始交易列表的hash值。一般来说,不同的交易,交易内容是不同的,这样,不同的原始交易列表或其hash值一般都不相同。因此,原始报文中可以至少包括原始交易列表或其hash值,这样由hash函数的性质,足以区分不同区块对应的共识过程完毕后所生成的随机数种子。
66.考虑到共识过程中会为本次共识的内容生成一个编号,如果共识完成,生成的编号可以作为本次共识所对应的区块的区块号,因此,区块号(也就是编号)也可以作为原始报文中的内容。不论第n 1个区块中所包含的原始交易列表与第n个区块中所包含的原始交易表是否相同,区块生成是顺序的,可以体现为后一区块的区块号是前一区块的区块号 1。因此,区块号作为原始报文中的内容,即使第n 1个区块中所包含的原始交易列表与第n个区块中所包含的原始交易表相同,仍然由各个节点采用自身私钥基于(原始交易列表 区块
号)得到不同的签名,主节点仍然无法获知其它节点的签名,从而无法预测第n 1号区块的完整签名,因此主节点无法使用第n号块已公开的随机数种子来预测第n 1号块的随机数种子,达到了不可预测的目的。与编号类似的,时间戳也是一个区块特有的,且后一区块的时间戳在前一区块之后。因此,时间戳也可以作为原始报文中的内容。
67.除了原始交易列表的特有值之外,签名的对象还可以加入其它内容,例如上一区块中产生的随机数种子,即原始报文中还可以包括上一区块中产生的随机数种子。前述a140执行之后,如前所述,各个节点可以各自以共识的交易数据为基础,生成第m个区块。由于第m个区块是各个节点在本地各自独立生成的,因此,如果区块链节点之间没有相互广播自身生成的上一区块的hash值并比对,各个节点可能都无法确定区块链网络中生成的第m个区块是否相同,或者从区块链系统整体可用的角度来说是否有至少quorum数量的共识节点上生成的第m个区块是相同的。经过本说明书中随机数种子的生成过程,相同区块的随机数种子应当是相同的,不同区块中的随机数种子应当是不同的,因此可以将随机数种子加入到原始报文中。这样,如果各个节点各自生成的第m个区块对应的随机数种子有所不同,根据门限签名算法的性质,可能无法在第m 1号区块的产生随机数种子的过程中通过恢复函数得出完整签名,从而可以根据本说明书的方案帮助共识节点确认上一区块是否一致。也可采用上一区块的hash值来代替上一区块的随机数种子,由于一个区块的hash值一般是唯一的,因此也可以帮助共识节点确认上一区块是否一致。
68.采用自身私钥份额对包含本次共识中原始交易列表特有值的原始报文进行签名,这个原始报文里可以包括的原始交易列表的特有值,可以是原始交易列表。一般在pbft的pp阶段已经广播过原始交易列表,且c阶段广播的commit消息较小的话更利于传播及节省带宽,因此原始交易列表特有值可以是原始交易列表的hash值。
69.对于原始报文包括多个内容,例如包括原始交易列表hash值、区块号、上一区块中产生的随机数种子的情况下,可以先计算原始报文的hash值,进而采用私钥份额对该原始报文hash值进行签名,得到签名结果。
70.对原始报文进行签名,生成的签名结果和原始报文可以一并加入到广播的commit消息中。这样,在commit阶段,参与共识的节点中的每一个都发送commit消息给其他的共识节点,并将自己发送的commit消息添加到本地log中(代表自己的认可),而且,每一节点还接收其他节点广播的commit消息。
71.s120:每一共识节点收集齐至少门限数量的commit消息后,将通过验证的至少门限数量的签名份额经过所述门限签名算法产生的私钥份额所对应的恢复函数得到完整签名。
72.如前所述,门限签名算法在应用中,可以产生成对的1个总公钥和n个公私钥对,并可以产生该n个公私钥对所对应的恢复函数。前述提到,该恢复函数可以将验证正确的至少门限个签名恢复生成一个完整签名,门限签名算法的门限值即门限数量可以设为w。当然,正确的签名多于w个时也可以通过该恢复函数生成一个完整签名。也就是说,正确的签名大于等于门限数量w时,都可以通过该恢复函数生成一个完整签名,且生成的这个完整签名是确定的,不会因为输入的正确签名的个数而发生变化(只要大于等于w)。
73.这个生成的完整签名可以由所述的那1个总公钥来验证正确性。这样,任何持有这个总公钥的节点都可以采用该总公钥来验证这个完整签名的正确性。例如,节点1生成完整
签名后,可以采用总公钥验证该完整签名的完整性,例如采用总公钥对完整签名进行密码学运算得到第一hash,并对原始报文进行hash运算得到第二hash,如果第一hash与第二hash一致则可以确定该完整签名的完整性。所述完整性包括该完整签名是针对所述原始报文的,且该原始报文没有经过篡改。再例如,节点1生成完整签名后,可以将该完整签名、总公钥和原始报文发送至区块链以外的一个设备,该设备可以采用所述总公钥和原始报文验证这个完整签名的正确性,原理同上不再赘述。这里的报文原文仍然是前述的包含本次共识中原始交易列表特有值的内容,或还包括当前区块的区块号和/或时间戳和/或上一区块中产生的随机数种子。
74.此外,也可以是每一共识节点收集每一commit消息后,采用对应的公钥份额对所述接收到的commit消息中的签名份额进行验证,然后再将所述至少门限数量的签名份额经过所述门限签名算法产生的私钥份额所对应的恢复函数得到完整签名。相对于采用总公钥对生成的完整签名进行验证的方式,采用公钥份额对每一签名份额进行验证,验证通过后再经恢复函数恢复为完整签名的方式,能够确定哪个签名是错误的,从而能够确定哪个节点可能是作恶节点。
75.门限签名算法中,每个共识节点都具有1个总公钥和n个公私钥对中的1个私钥份额和对应的1个公钥份额,如前所述,可以是由dealer生成并分发的,也可以是各共识节点协商得到的。
76.每个共识节点可以采用对应的公钥份额对接收到的commit消息中的签名份额进行验证。具体的,例如在包含4个共识节点的采用pbft共识算法的联盟链中,节点0在s110中向节点1、2、3广播自身生成的签名份额σ
3,0
,其中σ
3,0
的下标3可以表示区块号,0可以表示这是节点0的签名份额;在s120中,节点0也接收到节点1、2分别广播的签名份额σ
3,1
、σ
3,2
。这样,节点0已经收齐至少3个签名份额,其中包括自身广播的签名份额σ
3,0
和节点1、2广播的签名份额σ
3,1
、σ
3,2
。当然,节点0也可以收集齐所有的签名份额σ
3,0
、σ
3,1
、σ
3,2
和σ
3,3
,这样也当然满足至少quorum数量。
77.进而,节点0可以用对应的公钥份额来验证收集的σ
3,0
、σ
3,1
、σ
3,2
或还包括σ
3,3
(或者是σ
3,0
、σ
3,1
、σ
3,3
或还包括σ
3,2
,或者是σ
3,1
、σ
3,2
、σ
3,3
或还包括σ
3,0
,或者是σ
3,0
、σ
3,2
、σ
3,3
或还包括σ
3,1
)的正确性。具体的,例如,节点0可以采用对应的公钥份额来对签名份额σ
3,1
进行计算,得到一个hash值,记为hash
3,1
;节点0还可以对原始报文进行同样的hash计算得到hash

3,1
。如果hash
3,1
与hash

3,1
相等,可以证明原始报文是节点1发出的,且在传送过程中没有被篡改过。这样,σ
3,1
的正确性得到验证。类似的,节点0可以对σ
3,2
等进行验证,不再赘述。
78.同样的,节点1可以用对应的公钥份额来验证收集的σ
3,0
、σ
3,1
、σ
3,2
或还包括σ
3,3
(或者是σ
3,0
、σ
3,1
、σ
3,3
或还包括σ
3,2
,或者是σ
3,1
、σ
3,2
、σ
3,3
或还包括σ
3,0
,或者是σ
3,0
、σ
3,2
、σ
3,3
或还包括σ
3,1
)的正确性。
79.同样的,节点2可以用对应的公钥份额来验证收集的σ
3,0
、σ
3,1
、σ
3,2
或还包括σ
3,3
(或者是σ
3,0
、σ
3,1
、σ
3,3
或还包括σ
3,2
,或者是σ
3,1
、σ
3,2
、σ
3,3
或还包括σ
3,0
,或者是σ
3,0
、σ
3,2
、σ
3,3
或还包括σ
3,1
)的正确性。
80.同样的,节点3可以用对应的公钥份额来验证收集的σ
3,0
、σ
3,1
、σ
3,2
或还包括σ
3,3
(或者是σ
3,0
、σ
3,1
、σ
3,3
或还包括σ
3,2
,或者是σ
3,1
、σ
3,2
、σ
3,3
或还包括σ
3,0
,或者是σ
3,0
、σ
3,2
、σ
3,3
或还
包括σ
3,1
)的正确性。
81.s130:每一共识节点基于所述完整签名得到随机数种子。
82.随机数种子(random seed),是指在伪随机数生成器中用于生成伪随机数的初始数值。对于一个伪随机数生成器,从相同的随机数种子出发,可以得到相同的随机数序列。对于单机来说,随机数种子可以由当前计算机的状态确定,如当前的时间。而对于分布式系统来说,要在各个节点上产生相同的随机数种子,以在系统合约/业务合约/区块链平台功能等中基于相同的随机数种子产生相同的随机数,且不应由任一节点以其可操控的、可预测的、可撤销的方式产生随机数。这就需要由参与共识的节点共同确定。而且,考虑到分布式网络往往是异步网络或半同步网络,从即时性出发,还需要在当前区块中的交易执行时即可以产生随机数并采用。
83.经过上述s110-s120的步骤,正常情况下每个共识节点都可以得到相同的完整签名。当然,考虑到分布式系统的容错特性,在采用pbft共识算法的区块链网络中至少应当有quorum数量的共识节点各自都可以分别得到相同的完整签名。
84.这样,基于完整签名,各共识节点可以采用相同的随机数种子生成算法生成随机数种子。一种较为简单的随机数种子生成算法例如是sha256算法。当然,也可以直接将完整签名作为随机数种子。
85.经过上述过程,即可在区块链上产生随机数种子。
86.这样,区块链节点在执行当前共识完毕后输出共识结果的过程中,即执行确定了内容和顺序的一系列交易的过程中,如果其中包含需要使用随机数的智能合约/系统合约/区块链平台代码,可以基于s130的随机数种子来执行。例如,在c 语言编写的智能合约中,可以采用c 标准库或boost库提供的mt19937(r)方法来构造一个跨平台一致的随机数引擎,其中的参数r即为随机数种子。类似的,python中的random库,java中的random库,也都提供了类似的随机数生成方法。基于相同的随机数种子,在相同的随机数生成算法下可以生成相同的随机数。这样,例如各个区块链节点各自分别执行相同区块中的相同交易时,对于其中相同的随机数生成过程,可以基于相同随机数种子产生相同的随机数,从而完成诸如摇号、发红包、盲盒之类的业务逻辑,或完成系统合约/区块链平台功能,并在各个节点上得到一致的执行结果。
87.此外,在上述方案基础上,还可以包括如下步骤:
88.s140:每一共识节点将得到的随机数种子放至在生成的当前区块的区块头中。
89.图4是一个区块的区块头的结构示意图。由图5所示的结构中,每一区块的区块头包括若干字段,例如上一区块哈希previous_hash(图中的prev hash),nonce(这是工作量证明涉及的随机数,与本说明书中的随机数种子不同,且在一些联盟链中并不启用这个nonce),时间戳timestamp,上一区块号block num,状态根哈希state root,交易根哈希transaction root,收据根哈希receipt root等。其中,下一区块(如区块n 1)的区块头中的prev hash指向上一区块(如区块n),即为上一区块的hash值,也就是上一区块的区块头的hash值。区块头的hash值,可以是区块头中所包含的各个字段顺序拼接后经某种hash算法计算得到的hash值。通过这种方式,区块链上通过区块头实现了下一区块对上一区块的锁定。特别的,如前所述,state root是当前区块中所有账户的状态组成的mpt树的根的哈希值,指向state_root的为一颗mpt形式的状态树state trie。transaction root一般是本
区块包含的原始交易列表的组织成一种树形结构后的树根节点的hash值,receipt root一般是本区块包含的交易经过执行后生成的所有收据组织成一种树形结构后的树根节点的hash值。
90.这里需要注意的是,本说明书可以在区块头中增加一个字段——“随机数种子”,即s130中的随机数种子。这样,本区块产生的随机数种子,可以记录在区块链账本上,此外,对于回放区块来说,可以按照区块头中的随机数种子来回放区块中涉及随机数的交易。
91.本说明书提供的上述方案,将门限签名算法与pbft共识算法相结合,使得对应每个区块的原始交易列表在通过pbft算法达成共识后,即可通过采用的门限签名算法得到完整签名,从而得到随机数种子,在执行本区块对应的原始交易列表中的交易的过程中,即可以采用随机数,这样,执行本区块的交易不需要额外的等待。
92.本说明书提供的上述方案,基于门限签名算法的性质,各共识节点各自分别基于至少门限数量的签名份额通过恢复函数可以恢复出相同的完整签名,进而生成相同的随机数种子,从而,各个区块链节点各自分别执行相同区块中的相同交易时,对于其中相同的随机数生成过程可以基于相同随机数种子产生相同的随机数,从而完成诸如摇号、发红包、盲盒之类的业务逻辑,或完成系统合约/区块链平台功能,并在各个节点上得到一致的执行结果。
93.本说明书提供的上述方案,将门限签名算法与pbft共识算法相结合,使得任一共识节点在共识完成前无法预测完整签名,即使是pbft的主节点也无法预测完整签名,也就无法预测随机数种子和随机数。特别是当门限=quorum时,一旦完成共识,由于quorum数量的节点对交易列表的内容和顺序已达成一致,即生成新区块的基础内容已经确定,这时至少quorum数量的节点根据恢复函数得到的完整签名是相同的,这quorum数量的节点生成的随机数种子也必然相同,即使有不超过f个节点作恶而想要控制或撤销得到的随机数种子,这f个节点也不会影响系统的一致性,即这f个节点不可操控或撤销生成的完整签名、随机数种子和随机数。
94.本说明书中的方法,可以在每一区块生成的过程中实施,这样,每一区块的区块头中都可以包括随机数种子这一字段。即使某一区块的区块体中并不包含涉及随机数的交易,该区块的生成过程中仍然可以包含生成随机数种子的过程。
95.以下在先共识交易列表后执行共识的交易列表中的交易的区块链网络中,以区块链网络中一个共识节点的角度介绍本说明书一种区块链上产生随机数种子的方法,且采用的共识算法中通过最后一阶段中相互广播提交提议来输出共识结果,则共识节点执行如图6所示内容:
96.s210:在所述共识算法中最后一阶段中,所述共识节点基于门限签名算法,采用自身私钥份额对包含本次共识中原始交易列表特有值的原始报文进行签名,生成签名份额,并将该签名份额加入到广播的所述共识消息中。
97.除了pbft通过最后一阶段中相互广播提交提议来输出共识结果,还有一些共识算法也可以通过最后一阶段中相互广播提交提议来输出共识结果,后者例如为中国专利zl202111175184.1、zl202111178795.1、zl202111178745.3、zl202111178754.2、zl202111175144.7、zl202111175151.7以及中国专利申请cn202111178779.2。
98.采用门限签名算法,共识节点可以采用自身特有的那一份私钥份额对包含本次共
识中原始交易列表特有值的原始报文进行签名,得到签名结果。这里,原始交易列表的特有值可以作为签名所针对的原始报文。
99.原始交易列表的特有值,可以包括原始交易列表本身或者原始交易列表的hash值。区块号(也就是编号)和/或时间戳也可以作为原始报文中的内容。除了原始交易列表的特有值之外,签名的对象还可以加入其它内容,例如上一区块中产生的随机数种子,即原始列表中还可以包括上一区块中产生的随机数种子,这样可以根据本说明书的方案帮助共识节点确认上一区块是否一致。
100.s220:所述共识节点收集齐至少门限数量的所述共识消息后,将所述至少门限数量的签名份额经过所述门限签名算法产生的私钥份额所对应的恢复函数得到完整签名。
101.如前所述,门限签名算法在应用中,可以产生1个总公钥和n个公私钥对,并可以产生该n个公私钥对所对应的恢复函数。前述提到,该恢复函数可以将验证正确的至少门限数量个签名恢复生成一个完整签名,门限签名算法的门限值即门限数量可以设为w。当然,正确的签名多于w个时也可以通过该恢复函数生成一个完整签名。也就是说,正确的签名大于等于门限数量w时,都可以通过该恢复函数生成一个完整签名,且生成的这个完整签名是确定的,不会因为输入的正确签名的个数而发生变化(只要大于等于w)。
102.这个生成的完整签名可以由所述的那1个总公钥来验证正确性。这样,任何持有这个总公钥的节点或其它设备都可以采用该总公钥来验证这个完整签名的正确性。例如,节点1生成完整签名后,可以采用总公钥验证该完整签名的完整性,例如采用总公钥对完整签名进行密码学运算得到第一hash,并对原始报文进行hash运算得到第二hash,如果第一hash与第二hash一致则可以确定该完整签名的完整性。所述完整性包括该完整签名是针对所述原始报文的,且该原始报文没有经过篡改。再例如,节点1生成完整签名后,可以将该完整签名、总公钥和原始报文发送至区块链以外的一个设备,该设备可以采用所述总公钥和原始报文验证这个完整签名的正确性,原理同上不再赘述。这里的报文原文仍然是前述的包含本次共识中原始交易列表特有值的内容,或还包括当前区块的区块号和/或时间戳和/或上一区块中产生的随机数种子。
103.此外,也可以是每一共识节点收集每一commit消息后,采用对应的公钥份额对所述接收到的commit消息中的签名份额进行验证,然后再将所述至少门限数量的签名份额经过所述门限签名算法产生的私钥份额所对应的恢复函数得到完整签名。相对于采用总公钥对生成的完整签名进行验证的方式,采用公钥份额对每一签名份额进行验证,验证通过后再经恢复函数恢复为完整签名的方式,能够确定哪个签名是错误的,从而能够确定哪个节点可能是作恶节点。
104.门限签名算法中,每个共识节点都具有1个总公钥和n个公私钥对中的1个私钥份额和对应的1个公钥份额,如前所述,可以是由dealer生成并分发的,也可以是各共识节点协商得到的。
105.每个共识节点可以采用对应的公钥份额对接收到的commit消息中的签名份额进行验证。具体的,例如在包含4个共识节点的采用pbft共识算法的联盟链中,节点0在s210中向节点1、2、3广播自身生成的签名份额σ
3,0
,其中σ
3,0
的下标3可以表示区块号,0可以表示这是节点0的签名份额;在s220中,节点0也接收到节点1、2分别广播的签名份额σ
3,1
、σ
3,2
。这样,节点0已经收齐至少3个签名份额,其中包括自身广播的签名份额σ
3,0
和节点1、2广播的
签名份额σ
3,1
、σ
3,2
。当然,节点0也可以收集齐所有的签名份额σ
3,0
、σ
3,1
、σ
3,2
和σ
3,3
,这样也当然满足至少quorum数量。
106.进而,节点0可以用对应的公钥份额来验证收集的σ
3,0
、σ
3,1
、σ
3,2
或还包括σ
3,3
(或者是σ
3,0
、σ
3,1
、σ
3,3
或还包括σ
3,2
,或者是σ
3,1
、σ
3,2
、σ
3,3
或还包括σ
3,0
,或者是σ
3,0
、σ
3,2
、σ
3,3
或还包括σ
3,1
)的正确性。具体的,例如,节点0可以采用对应的公钥份额来对签名份额σ
3,1
进行计算,得到一个hash值,记为hash
3,1
;节点0还可以对原始报文进行同样的hash计算得到hash

3,1
。如果hash
3,1
与hash

3,1
相等,可以证明原始报文是节点1发出的,且在传送过程中没有被篡改过。这样,σ
3,1
的正确性得到验证。类似的,节点0可以对σ
3,2
等进行验证,不再赘述。
107.同样的,节点1可以用对应的公钥份额来验证收集的σ
3,0
、σ
3,1
、σ
3,2
或还包括σ
3,3
(或者是σ
3,0
、σ
3,1
、σ
3,3
或还包括σ
3,2
,或者是σ
3,1
、σ
3,2
、σ
3,3
或还包括σ
3,0
,或者是σ
3,0
、σ
3,2
、σ
3,3
或还包括σ
3,1
)的正确性。
108.同样的,节点2可以用对应的公钥份额来验证收集的σ
3,0
、σ
3,1
、σ
3,2
或还包括σ
3,3
(或者是σ
3,0
、σ
3,1
、σ
3,3
或还包括σ
3,2
,或者是σ
3,1
、σ
3,2
、σ
3,3
或还包括σ
3,0
,或者是σ
3,0
、σ
3,2
、σ
3,3
或还包括σ
3,1
)的正确性。
109.同样的,节点3可以用对应的公钥份额来验证收集的σ
3,0
、σ
3,1
、σ
3,2
或还包括σ
3,3
(或者是σ
3,0
、σ
3,1
、σ
3,3
或还包括σ
3,2
,或者是σ
3,1
、σ
3,2
、σ
3,3
或还包括σ
3,0
,或者是σ
3,0
、σ
3,2
、σ
3,3
或还包括σ
3,1
)的正确性。
110.s230:所述共识节点基于所述完整签名得到随机数种子。
111.经过上述s210-s220的步骤,正常情况下所述共识节点可以得到完整签名。这样,基于完整签名,所述共识节点可以采用随机数种子生成算法生成随机数种子。一种较为简单的随机数种子生成算法例如是sha256算法。当然,也可以直接将完整签名作为随机数种子。
112.经过上述过程,即可在所述共识节点本地的区块链上产生随机数种子。
113.本说明书还提供一种生成区块头的方法,在上述s210-s230方法基础上还可以包括:所述共识节点将得到的随机数种子放至在生成的当前区块的区块头中。
114.本说明书还提供一种区块链上产生随机数的方法,在上述s210-s230方法基础上还可以包括:所述共识节点基于产生的随机数种子产生随机数。
115.前面提到,门限签名算法可以采用基于rsa的门限签名机制,基于ecdsa的门限签名机制、基于schnorr的门限签名机制或基于bls的门限签名机制等。采用的门限签名算法中,一般都需要生成1个总公钥和n个公私钥对。一种典型且简洁的实现中,私钥份额的个数可以等于共识节点的个数,每个共识节点持有其中一个私钥,也即一个私钥份额。这样,每一共识节点基于门限签名算法,采用自身私钥份额对原始报文进行签名以生成签名份额。恢复函数产生完整签名的最少个数即门限数量w可以等于pbft算法中的quorum,也就是至少w个签名份额可以由对应的恢复函数生成一个确定的完整签名,而不论是n个签名份额中的至少哪w个,只要这至少w个签名是采用各自正确的私钥份额对同一原始报文所做的签名。
116.为了在区块链的共识节点上实现门限签名算法,需要通过一种机制使得n个共识节点分别具有1个私钥份额和对应的1个公钥份额,且都具有同一个总公钥。前述提到,可以
由一个中心化的dealer生成,并分发给n个区块链共识节点,这种属于中心化的密钥分配方式。这种中心化的密钥分配方式,需要借助第三方dealer,则要求这个dealer不会作恶。例如一种分布式密钥生成(distributed key generation)协议的实现,原理上需要生成一个t次多项式,然后根据这个多项式形成的曲线,在上面取出n个点,通过这n个点生成n个私钥份额,并分给n个阈值签名的参与者。这个过程如果放在一个dealer上进行,那么如果这个dealer作恶,则这个dealer可以获取所有n个参与者的私钥份额,不符合区块链系统的安全要求。
117.此外,还存在去中心化的密钥生成和分配方式,即取消dealer,而是由n个共识节点通过密钥协商过程协商得到n个公私钥对和1个总公钥,仍然是每个共识节点单独持有n个私钥份额中的一个,且各共识节点持有同一个总公钥。上述这种方式,传统的是在区块链之外实现,并且依赖网络同步。区块链上的节点在构成分布式网络,而分布式网络一般是半同步或者异步的。因此,在区块链之外实现分布式网络各节点之间的密钥生成和分配,是不可靠的。而实现可靠的分布式密钥协议,又是区块链上生成随机数种子的重要前提。
118.前述提到的pbft协议属于半同步(partial synchronous)协议,其特点是假设网络一开始是异步的,但是能够从某一时刻开始同步。要在网络中让不同节点对同一提议达成共识,最简便的方式是设置主节点,由主节点来统一各个节点的意见。通过设置定时器,可以防止主节点出错。pbft中,如果在有限时间内没有完成normal case phase,会触发backups发起view change phase,以更换主节点。pbft将主节点固定在一个位置,所有请求都可以先发送到主节点,再由主节点广播到其他共识节点。与此相对的,honeybadgerbft(也常简称为hbbft)算法属于一种异步(asynchronous)协议。异步协议适用于异步网络,也就是这个网络中节点间的消息可以被任意延迟,但最终会到达。honeybadgerbft中去掉了定时器,而是通过消息来驱动协议的执行。同时,honeybadgerbft算法中所有节点都是对等的,没有主节点和备份节点之分,也就没有换主的过程。hbbft等异步网络共识协议无主节点的概念,各节点都可提议请求,尝试构造区块,因此异步网络协议在一定程度上缓解了公平性和单节点瓶颈的问题。
119.例如为中国专利zl202111175184.1、zl202111178795.1、zl202111178745.3、zl202111178754.2、zl202111175144.7、zl202111175151.7以及中国专利申请cn202111178779.2,都考虑了区块链网络的半同步或异步网络的特性的前提下提出了新的共识算法。
120.通过区块链网络中的各种共识机制,可以保障区块链网络的整体一致性和同步。对于后者,只要区块链能够持续的出块,就能实现区块的同步。那么,结合区块链实现分布式密钥生成将是可靠的。
121.以下结合图7介绍本说明书一种区块链上实现分布式密钥生成的方法,包括:
122.s310:每一共识节点生成一组特有的n个秘密份额,自身保留一个,并将其中n-1个秘密份额分别加密发送至其它n-1个节点。
123.dkg算法中对节点重新进行了编号,从1开始。这里为了与dkg算法一致,也将共识节点从1开始编号。
124.椭圆曲线(elliptic curve cryptography,ecc)加密算法是一种公钥加密技术,以椭圆曲线理论为基础。利用有限域上椭圆曲线的点构成的阿贝尔(abel)群离散对数难解
性,实现加密、解密和数字签名。以下以椭圆曲线为例进行说明。每一个节点可以在群zq上随机选择一个t度多项式。n次多项式函数由n 1个点唯一决定,因为最终需要区块链网络中quorum个共识节点能够恢复签名,则quorum=n 1,因此多项式的次数t为quorum-1。这样,可以实现由quorum(quorum=t 1)个签名份额经恢复函数恢复得到一个完整签名。当然,也可以将t设置为其它数值。用该多项式构建的椭圆曲线可以如下表示:
125.fi(z)=a
i0
a
i1
z a
i2
z2

a
itzt
ꢀꢀꢀ
公式(1)
126.公式(1)中,a
i0
,a
i1
,a
i2
,a
i3
,...,a
it
为多项式的系数,通过这一组系数可以确定一个多项式。
127.当区块链网络的共识节点数量n设置为4时,采用pbft、hbbft之类算法的quorum为3的情况下,这时t=2。这时,这个多项式为:
128.fi(z)=a
i0
a
i1
z a
i2
z2ꢀꢀꢀ
公式(2)
129.节点1可以从一个有限素数域中随机选择一组数作为系数,即作为a
10
,a
11
,a
12
,则生成的多项式为:f1(z)=a
10
a
11
z a
12
z2。
130.类似的,节点2可以从同一有限素数域中随机选择一组数作为系数,即作为a
20
,a
21
,a
22
,则生成的多项式为:f2(z)=a
20
a
21
z a
22
z2。
131.类似的,节点3可以从同一有限素数域中随机选择一组数作为系数,即作为a
30
,a
31
,a
32
,则生成的多项式为:f3(z)=a
30
a
31
z a
32
z2。
132.类似的,节点4可以从同一有限素数域中随机选择一组数作为系数,即作为a
40
,a
41
,a
42
,则生成的多项式为:f4(z)=a
40
a
41
z a
42
z2。
133.每个节点基于确定的多项式,可以进一步确定一组秘密份额。可以根据如下公式由多项式系数确定秘密份额:
134.s
ij
=fi(j)mod q(j=1,

,n)
ꢀꢀꢀ
公式(3)
135.公式(3)中,q是每个节点采用的相同的一个大数,对fi(j)用q取模的目的是将fi(j)的值限定在[0,q-1]的范围内。例如:
[0136]
共识节点1生成4个秘密份额,分别为s
11
=f1(1)mod q,s
12
=f1(2)mod q,s
13
=f1(3)mod q,s
14
=f1(4)mod q。这里的4个秘密份额,4即是共识节点的总数。也就是说,如果要最终实现在从n个签名份额中取任意w个即可通过恢复函数生成一个完整签名,这里需要生成n个秘密份额。下同。
[0137]
共识节点2生成4个秘密份额,分别为s
21
=f2(1)mod q,s
22
=f2(2)mod q,s
23
=f2(3)mod q,s
24
=f2(4)mod q。
[0138]
共识节点3生成4个秘密份额,分别为s
31
=f3(1)mod q,s
32
=f3(2)mod q,s
33
=f3(3)mod q,s
34
=f3(4)mod q。
[0139]
共识节点4生成4个秘密份额,分别为s
41
=f4(1)mod q,s
42
=f4(2)mod q,s
43
=f4(3)mod q,s
44
=f4(4)mod q。
[0140]
进而,每个节点除了保留一份秘密份额外,可以通过p2p网络与其它共识节点交换生成的其它秘密份额。具体可以如下:
[0141]
共识节点1保留s
11
,将s
12
发送至节点2,将s
13
发送至节点3,将s
14
发送至节点4,可以通过区块链网络中底层的p2p(peer to peer,点对点)网络组件发送。发送出的秘密份额需要保密,共识节点1可以分别用接收方的公钥对待发送的秘密份额加密后再发送至接收方,
或者通过tls(transport layer security,安全传输层协议)之类的安全连接发送至接收方。
[0142]
共识节点2保留s
22
,将s
21
发送至节点1,将s
23
发送至节点3,将s
24
发送至节点4,可以通过区块链网络中底层的p2p网络组件发送。同样的,发送出的秘密份额需要保密,共识节点2可以分别用接收方的公钥对待发送的秘密份额加密后再发送至接收方,或者通过tls之类的安全连接发送至接收方。
[0143]
共识节点3保留s
33
,将s
31
发送至节点1,将s
32
发送至节点2,将s
34
发送至节点4,可以通过区块链网络中底层的p2p网络组件发送。同样的,发送出的秘密份额需要保密,共识节点3可以分别用接收方的公钥对待发送的秘密份额加密后再发送至接收方,或者通过tls之类的安全连接发送至接收方。
[0144]
共识节点4保留s
44
,将s
41
发送至节点1,将s
42
发送至节点2,将s
43
发送至节点3,可以通过区块链网络中底层的p2p网络组件发送。同样的,发送出的秘密份额需要保密,共识节点4可以分别用接收方的公钥对待发送的秘密份额加密后再发送至接收方,或者通过tls之类的安全连接发送至接收方。
[0145]
可见秘密份额的下标中的两个数字,左边的可以表示发出秘密份额的节点的编号,右边的可以表示接收秘密份额的节点。这样:
[0146]
共识节点1本地具有不同节点生成的秘密份额s
11
、s
21
、s
31
、s
41

[0147]
共识节点2本地具有不同节点生成的秘密份额s
12
、s
22
、s
32
、s
42

[0148]
共识节点3本地具有不同节点生成的秘密份额s
13
、s
23
、s
33
、s
43

[0149]
共识节点4本地具有不同节点生成的秘密份额s
14
、s
24
、s
34
、s
44

[0150]
其中,共识节点1本地具有的s
11
是自己生成的,共识节点2本地具有的s
22
是自己生成的,共识节点3本地具有的s
33
是自己生成的,共识节点4本地具有的s
44
是自己生成的。
[0151]
共识节点最好是对待发出的秘密份额进行签名,例如用自身私钥签名,或者采用mac(message authentication code,消息验证码),从而保证消息完整性,避免中间人攻击。相应的,接收到秘密份额的节点可以验证签名的正确性。
[0152]
s320:每一节点生成自身秘密份额对应的公共验证参数并通过链上合约广播;所述链上合约将请求广播的节点的编号加入第一节点集合。
[0153]
每一共识节点可以生成自身密钥份额对应的一组验证参数,生成方法可以采用下面公式:
[0154][0155]
公式(4)中,g是椭圆曲线上的基点。根据椭圆曲线的运算性质,g的幂次方也是椭圆曲线上的一个点。t是多项式的次数,一般设置为(quorum-1)。如前所述,如果要最终实现在从n个签名份额中取任意w个即可通过恢复函数生成一个完整签名,这里需要设置多项式的次数是t,其中t=w-1。下同。
[0156]
基于上述公式(4),设t=2,共识节点1生成的一组验证参数为《a
10
,a
11
,a
12
》,通过链上合约广播这一组验证参数。类似的,基于上述公式,共识节点2生成的一组验证参数为《a
20
,a
21
,a
22
》,通过链上合约广播这一组验证参数。类似的,基于上述公式,共识节点3生成的一组验证参数为《a
30
,a
31
,a
32
》,通过链上合约广播这一组验证参数。类似的,基于上述公式,共识节点4生成的一组验证参数为《a
40
,a
41
,a
42
》,通过链上合约广播这一组验证参数。
[0157]
基于密码学的性质,a
ik
公布出去,也不会倒推得到a
ik
,因此即使从链上获得公布的a
ik
,也不能得到s310中的多项式。
[0158]
通过链上合约广播,具体的,可以由各个节点以自身私钥签名一笔交易发到区块链上。每个节点可以内置区块链sdk(software development kit,软件开发工具包)。sdk是一系列程序接口、文档、范例、开发工具等的集合。通过内置sdk,区块链节点可以像区块链客户端一样向区块链网络发起交易。区块链节点用自身私钥签名发出的交易中,可以包含对区块链上的智能合约的调用。被调用的合约,例如是dkg合约。这个dkg合约可以是系统级的合约,即是预先部署在区块链上的合约,例如由具有系统管理员权限的账户创建的合约,起到系统级的控制功能,而非由用户自行开发并部署的实现某种具体的业务逻辑的合约。
[0159]
像其它合约一样,dkg合约可以在虚拟机(例如ethereum virtual machine,evm)中执行,当然也可以是在容器(例如docker)中执行,这里并不限定。外部账户向区块链发起一笔调用链上合约的交易,可以触发该合约的执行。交易的内容例如包括from字段、to字段、value字段、data字段。from字段可以是交易发起方的账户地址,to字段可以代表被调用的智能合约的地址,value字段可以是区块链上原生的通证,data字段可以包含的调用智能合约的方法和参数。通过在to字段指明调用的智能合约的地址,可以表明是对区块链上某个智能合约的调用。智能合约中一般可以包括一个或多个函数,每个函数可以包括一些输入的参数。交易中通过data字段可以指明所要调用的智能合约中的某个函数,并在data字段中填入需要传入的参数。
[0160]
合约执行的结果,一方面可以改变合约的存储,即合约的世界状态,另一方面,该交易的执行结果或相关信息可以记录在区块链的收据(receipt)中。具体的,合约执行结果/相关信息可以表现为收据中的事件(event)。事件的结构例如为如下格式:
[0161]
event:
[0162]
[topic][msg]
[0163]
[topic][msg]
[0164]
......
[0165]
在上述示例中,事件的数量可以为一个或多个。每个事件可以包括主题(topic)和数据(data)等字段。交易执行时输出的事件的格式,可以在合约中指定。通过内置的sdk,区块链客户端或区块链节点可以监听特定topic的事件,并在监听到特定topic事件的情况下,拉取相应的msg的内容,以及可以监听到特定topic或对应msg中的某些内容后执行预设的处理。
[0166]
通过这种事件机制中,节点可以将执行结果存放到某个topic对应的msg中,从而监听该topic的监听方(即内置区块链sdk的客户端或区块链节点)可以获得相应的执行结果。s320中,可以是某一节点将生成的所述公共验证参数通过发起调用dkg合约中第一函数(例如名为broadcast的函数,其中该函数可以包括参数,参数可以包括公共验证参数)的方式传入区块链网络,区块链网络执行该交易的一个结果是将所述公共验证参数置入收据中特定topic对应的msg中。从而监听该topic的节点可以获取msg字段中的内容,即获得所述公共验证参数。这样,即完成了链上合约广播。
[0167]
可以通过sdk向区块链节点注册要监听事件。具体的,区块链节点可以在运行的区块链平台代码中对生成的事件绑定一个钩子函数(钩子函数可以与平台代码一同在开发阶
段编辑完成)。这个钩子函数属于一种回调函数,其可以在监听的事件发生时被调用,并可以执行一定的处理逻辑。监听代码例如可以包括监听区块链交易的交易内容,智能合约的合约状态,合约产生的收据等一种或多种。通过sdk向区块链节点注册监听事件后,区块链节点可以保存监听事件与监听者(例如置入sdk并发起事件监听的客户端/节点的网络连接,一般可以包括ip地址、端口号等信息)的映射关系,例如保存监听某个合约的某个事件与监听者的映射关系。当钩子函数监听到对应的事件主题(topic)发生时,可以调用钩子函数,进而钩子函数可以查询所述映射关系,将监听的事件推送至所述网络连接。这样,发起监听的sdk可以通过保持的网络连接获得监听的事件。合约的执行也是通过类似方式的实现链上合约广播。具体的,合约的执行结果和本区块其它交易的执行结果一并存入区块链节点的一个交易结果缓存区。当该区块链的所有交易都执行完毕并组织成块后,区块链平台代码可以监听交易结果中的收据,从中将被监听的事件广播至发起监听的sdk。这里,通过这种监听机制,节点可以监听注册的特定topic事件,并在这样的事件发生时,通过保持的连接获取这个topic对应的msg,从而获得msg中的内容,这里msg中的内容包括公共验证参数。总之,可以通过区块链的事件机制实现广播公共验证参数,并通过事件监听机制实现对广播内容的接收。
[0168]
这样,通过链上广播各节点生成的公共验证参数的结果可以如下:
[0169]
共识节点1本地具有不同节点生成的秘密份额s
11
、s
21
、s
31
、s
41
,以及验证参数《a
10
,a
11
,a
12
》,并可以从链上获得公共验证参数《a
20
,a
21
,a
22
》,《a
30
,a
31
,a
32
》,《a
40
,a
41
,a
42
》;
[0170]
共识节点2本地具有不同节点生成的秘密份额s
12
、s
22
、s
32
、s
42
,以及验证参数《a
20
,a
21
,a
22
》,并可以从链上获得公共验证参数《a
10
,a
11
,a
12
》,《a
30
,a
31
,a
32
》,《a
40
,a
41
,a
42
》;
[0171]
共识节点3本地具有不同节点生成的秘密份额s
13
、s
23
、s
33
、s
43
,以及验证参数《a
30
,a
31
,a
32
》,并可以从链上获得公共验证参数《a
10
,a
11
,a
12
》,《a
20
,a
21
,a
22
》,《a
40
,a
41
,a
42
》;
[0172]
共识节点4本地具有不同节点生成的秘密份额s
14
、s
24
、s
34
、s
44
,以及验证参数《a
40
,a
41
,a
42
》,并可以从链上获得公共验证参数《a
10
,a
11
,a
12
》,《a
20
,a
21
,a
22
》,《a
30
,a
31
,a
32
》。
[0173]
前述提到,通过链上合约广播,具体的,可以由各个节点以自身私钥签名一笔交易发到区块链上,例如某一节点将生成的所述公共验证参数通过发起一笔交易而发送至区块链网络,这个交易例如调用dkg合约中broadcast(r)这一函数,其中该函数可以包括参数r,r可以包括公共验证参数。broadcast(r)这一函数的执行逻辑除了包括上述所说的将所述公共验证参数置入收据中特定topic对应的msg中以外,broadcast(r)函数的执行逻辑还可以包括将请求广播的节点的编号加入第一节点集合,即前述所述的改变合约的存储,亦即改变合约的世界状态。假设共识节点1-4均分别发送调用dkg合约中broadcast(r)这一函数的交易,则broadcast(r)这一函数的执行结果包括将4个发起所述交易的共识节点的编号1-4存入该合约维护的第一状态中,这个状态例如形为{1,2,3,4},{}表示集合,这个集合例如名为parties集合。
[0174]
s330:每一共识节点对接收到的每一秘密份额和对应的公共验证参数进行验证,并将验证失败的节点编号通过投诉交易发送至所述合约;所述合约根据各共识节点发来的验证失败的节点编号和第一节点集合确定第二节点集合。
[0175]
每一共识节点可以接收其它任一节点发来的秘密份额,并接收链上合约广播的公共验证参数。
[0176]
前述s310中提到,每一共识节点生成n个秘密份额s
ij
,自己保留一份,并将其中n-1个秘密份额分别通过p2p网络组件并加密发送至其它n-1个节点。前述s320中提到,每一节点生成自身秘密份额对应的公共验证参数并通过链上合约广播。
[0177]
如果每一节点发出的秘密份额和对应的公共验证参数是归属于同一个多项式的,则下面等式应当成立:
[0178][0179]
如前所述,t=quorum-1;n=4时,quorum=3,这时t=2。
[0180]
基于公式(5)这样的性质,可以用该公式对接收到的每一秘密份额和公共验证参数进行验证。如果验证等式成立,说明秘密份额和对应的公共验证参数是归属于同一多项式,否则不归属于同一多项式。这样也可以检验生成秘密份额和对应公共验证参数的节点是否存在作恶行为。典型的作恶行为例如为节点根据第一个多项式生成了s
ij
,但是又以不同的多项式生成了a
ik
(k=0,...,t)。
[0181]
上述验证,具体的:
[0182]
j=1时,即共识节点1可以验证以下内容:
[0183]
i=1:(事实上,共识节点1可以不验证这个等式是否成立,因为秘密份额s
11
和验证参数《a
11
,a
12
,a
13
》都是自身生成的)
[0184]
i=2:
[0185]
i=3:
[0186]
i=4:
[0187]
如果i=2对应的等式不成立,则共识节点1可以将该验证不通过的节点编号2发送至dkg合约。类似的,如果i=2、3对应的等式不成立,则共识节点1可以将该验证不通过的节点编号2、3发送至dkg合约。类似的,如果i=2、3、4对应的等式不成立,则共识节点1可以将该验证不通过的节点编号2、3、4发送至dkg合约。
[0188]
j=2时,即共识节点2可以验证以下内容:
[0189]
i=1:
[0190]
i=2:(事实上,共识节点2可以不验证这个等式是否成立,因为秘密份额s
22
和验证参数《a
20
,a
21
,a
22
》都是自身生成的)
[0191]
i=3:
[0192]
i=4:
[0193]
如果i=1对应的等式不成立,则共识节点2可以将该验证不通过的节点编号1发送至dkg合约。类似的,如果i=1、3对应的等式不成立,则共识节点2可以将该验证不通过的节点编号1、3发送至dkg合约。类似的,如果i=1、3、4对应的等式不成立,则共识节点2可以将该验证不通过的节点编号1、3、4发送至dkg合约。
[0194]
j=3时,即共识节点3可以验证以下内容:
[0195]
i=1:
[0196]
i=2:
[0197]
i=3:(事实上,共识节点3可以不验证这个等式是否成立,因为秘密份额s
33
和验证参数《a
30
,a
31
,a
32
》都是自身生成的)
[0198]
i=4:
[0199]
如果i=1对应的等式不成立,则共识节点3可以将该验证不通过的节点编号1发送至dkg合约。类似的,如果i=1、2对应的等式不成立,则共识节点3可以将该验证不通过的节点编号1、2发送至dkg合约。类似的,如果i=1、2、4对应的等式不成立,则共识节点3可以将该验证不通过的节点编号1、2、4发送至dkg合约。
[0200]
j=4时,即共识节点4可以验证以下内容:
[0201]
i=1:
[0202]
i=2:
[0203]
i=3:
[0204]
i=4:(事实上,共识节点4可以不验证这个等式是否成立,因为秘密份额s
44
和验证参数《a
40
,a
41
,a
42
》都是自身生成的)
[0205]
如果i=1对应的等式不成立,则共识节点4可以将该验证不通过的节点编号1发送至dkg合约。类似的,如果i=1、2对应的等式不成立,则共识节点4可以将该验证不通过的节点编号1、2发送至dkg合约。类似的,如果i=1、2、3对应的等式不成立,则共识节点4可以将该验证不通过的节点编号1、2、3发送至dkg合约。
[0206]
可以由各个节点以自身私钥签名一笔交易发到区块链上,例如某一节点将验证失败的节点编号通过发起一笔交易而发送至区块链网络,这个交易例如是投诉交易,其可以调用dkg合约中confirm(r)这一函数,其中该函数可以包括参数r,r可以包括投诉交易中的节点提交的验证失败的节点编号。
[0207]
confirm(r)这一函数的执行逻辑可以包括将第一节点集合parties中没有收到投诉交易的节点编号复制到第二节点集合中。假设第一节点集合parties为{1,2,3,4},但dkg合约接收到的投诉交易中包括的节点编号为4,例如共识节点1发起的投诉交易中调用confirm(r)的函数中包括的参数r=4,则dkg合约将第一节点集合parties中的节点编号4标记为删除。假设其它第一节点集合parties中的其它节点编号均未收到对应的投诉,则第一节点集合中的节点编号1、2、3仍然保留。这样,dkg合约根据各共识节点发来的验证失败的节点编号4和第一节点集合{1,2,3,4}可以确定第二节点集合{1,2,3},第二节点集合例如名为qual。
[0208]
需要说明的是,在区块链网络中,由于半同步或异步的网络特性,合约的执行并不一定是在同一个区块中执行的,而是可能在不同的区块中分别执行一部分。这种情况,一般可以再合约中设置状态机,从而在执行完一部分的情况下转变状态机的状态,或直至状态机转变为某种最终状态。状态机执行的每一步,可以是在接收到一个交易后执行并触发的。因此,本步骤中dkg合约确定节点的集合,可能会延续多个区块。
[0209]
s340:每一共识节点各自基于验证参数及第二节点集合计算公钥份额,并基于本
地的秘密份额和第二节点集合计算自身对应的私钥份额。
[0210]
一方面,每一共识节点各自可以在本地基于验证参数及第二节点集合计算公钥份额,可以按照下面公式计算该公钥份额:
[0211][0212]
这样,例如第二节点集合为:{1,2,3,4},共识节点1计算的公钥份额可以是:
[0213][0214]
类似的,例如共识节点2计算的公钥份额可以是:
[0215][0216]
类似的,例如共识节点3计算的公钥份额可以是:
[0217][0218]
类似的,例如共识节点4计算的公钥份额可以是:
[0219][0220]
另一方面,每一共识节点各自基于本地的秘密份额和第二节点集合计算自身对应的私钥份额,可以按照下面公式计算:
[0221]
xj=∑
i∈qualsij
mod q
ꢀꢀꢀ
公式(7)
[0222]
例如,共识节点1在本地计算自身的私钥份额:
[0223][0224]
共识节点2在本地计算自身的私钥份额:
[0225][0226]
共识节点3在本地计算自身的私钥份额:
[0227][0228]
共识节点4在本地计算自身的私钥份额:
[0229][0230]
可见,节点1、节点2、节点3和节点4计算得到的私钥份额不相同。
[0231]
再一方面,每一共识节点各自可以在本地基于验证参数及第二节点集合计算总公钥,可以按照下面公式计算该总公钥:
[0232]
y=∏
i∈qual
yiꢀꢀꢀ
公式(8)
[0233]
其中,yi=a
i0

[0234]
这样,例如共识节点1计算总公钥可以是:
[0235]
y=y1*y2*y3*y4=a
10
*a
20
*a
30
*a
40
[0236]
类似的,例如共识节点2计算总公钥可以是:
[0237]
y=y1*y2*y3*y4=a
10
*a
20
*a
30
*a
40
[0238]
类似的,例如共识节点3计算总公钥可以是:
[0239]
y=y1*y2*y3*y4=a
10
*a
20
*a
30
*a
40
[0240]
类似的,例如共识节点4计算总公钥可以是:
[0241]
y=y1*y2*y3*y4=a
10
*a
20
*a
30
*a
40
[0242]
可见,节点1、节点2、节点3和节点4计算得到的总公钥相同,即通过上述方法,各节点获得相同的总公钥。
[0243]
上述私钥份额x1与公钥份额pub1对应,私钥份额x2与公钥份额pub2对应,私钥份额x3与公钥份额pub3对应,私钥份额x4与公钥份额pub4对应。如前所述,每一公钥份额,可以对对应私钥份额所做的签名份额进行验证。而且,至少quorum个私钥份额产生的签名份额经恢复函数恢复出的一个完整签名,可以由对应的那1个总公钥进行验证。
[0244]
再例如,第二节点集合为:{1,2,3},共识节点1计算的公钥份额可以是:
[0245][0246]
类似的,例如共识节点2计算的公钥份额可以是:
[0247][0248]
类似的,例如共识节点3计算的公钥份额可以是:
[0249][0250]
类似的,例如共识节点4计算的公钥份额可以是:
[0251][0252]
可见,假设第4节点作恶,其秘密份额和对应公共验证参数并没有按照相同的多项式生成,因而被至少一个节点验证失败并发起投诉,则第二节点集合中不包括该节点4,那么至少第1、2、3节点计算公钥份额的过程中并不会依据节点4生成的公共验证参数,而是依据第二节点集合中节点1、2、3生成的公共验证参数。
[0253]
每一共识节点各自基于本地的秘密份额和第二节点集合计算自身对应的私钥份额。
[0254]
例如,共识节点1在本地计算自身的私钥份额:
[0255][0256]
共识节点2在本地计算自身的私钥份额:
[0257][0258]
共识节点3在本地计算自身的私钥份额:
[0259][0260]
共识节点4在本地计算自身的私钥份额:
[0261][0262]
可见,假设第4节点作恶,其秘密份额和对应公共验证参数并没有按照相同的多项式生成,因而被至少一个节点验证失败并发起投诉,则第二节点集合中不包括该节点4,那么至少第1、2、3节点计算私钥份额的过程中并不会依据节点4生成的秘密份额,而是依据第二节点集合中节点1、2、3生成的秘密份额。而且,至少节点1、节点2、节点3计算得到的私钥份额不相同。
[0263]
每一共识节点各自可以在本地基于验证参数及第二节点集合计算总公钥。
[0264]
这样,例如共识节点1计算总公钥可以是:
[0265]
y=y1*y2*y3=a
10
*a
20
*a
30
[0266]
类似的,例如共识节点2计算总公钥可以是:
[0267]
y=y1*y2*y3=a
10
*a
20
*a
30
[0268]
类似的,例如共识节点3计算总公钥可以是:
[0269]
y=y1*y2*y3=a
10
*a
20
*a
30
[0270]
类似的,例如共识节点4计算总公钥可以是:
[0271]
y=y1*y2*y3=a
10
*a
20
*a
30
[0272]
可见,假设第4节点作恶,其秘密份额和对应公共验证参数并没有按照相同的多项式生成,因而被至少一个节点验证失败并发起投诉,则第二节点集合中不包括该节点4,那么至少第1、2、3节点计算总公钥的过程中并不会依据节点4生成的公共验证参数,而是依据第二节点集合中节点1、2、3生成的公共验证参数。而且,至少节点1、节点2、节点3计算得到的总公钥相同,即通过上述方法,至少诚实节点获得相同的总公钥。
[0273]
由此,对于总数量为n的共识节点中,采用门限签名算法,期望m个签名份额中任意至少w个签名份额可以恢复得到完整签名的情况下,如果没有作恶节点,即秘密份额和对应公共验证参数是按照相同的多项式生成,此时n可以等于m。如果存在作恶节点,例如有b个作恶节点,则此时m=n-b,而w保持不变,但m需要确保不小于w,否则门限签名算法失效。
[0274]
前述s330中提到,每一共识节点对接收到的每一秘密份额和对应的公共验证参数进行验证,验证失败的,可以由验证节点以自身私钥签名一笔投诉交易发到区块链上。具体的,该交易可以调用dkg合约中confirm(r)这一函数,其中该函数可以包括参数r,r可以包括投诉交易中的节点提交的验证失败的节点编号。例如节点j接收到节点i在s310中加密发送的秘密份额s
ij
,接收节点j对i发送的s
ij
利用公式(5)进行验证。典型的一种验证不通过的情况,是节点i发送的s
ij
与节点i生成并通过链上合约广播的公共验证参数不对应,那么接收到这个秘密份额s
ij
的节点j,可以在s330中进行验证,并可以在验证不通过后将这个节
点的编号i发送至dkg合约。为了证明节点i发送的秘密份额没有经过篡改,除了发送这个节点的编号i,节点j还可以将节点i的秘密份额及签名一并发送至dkg合约。前述s310中也提到节点可以对生成并发出的秘密份额进行签名。为了能够让dkg合约对秘密份额和对应的公共验证参数进行验证,需要在投诉交易中包含该秘密份额的明文,即节点j对节点i加密后的秘密份额解密后得到的明文。并且,为了能够让dkg合约验证签名,最好在s310中由节点i对秘密份额先签名,并将明文的秘密份额和签名一并加密后送至节点j,即生成该秘密份额的共识节点对生成的所述秘密份额签名并加密发送至其它节点。这样,所述节点j发送至dkg合约的投诉交易中除了包含节点i的编号,还包括节点i发送至节点j的明文的秘密份额及生成者i对生成的该明文秘密份额的签名。
[0275]
所述dkg合约根据各共识节点发来的验证失败的节点编号和第一节点集合确定第二节点集合之前,所述dkg合约可以首先验证所述投诉交易中秘密份额的签名,如果验证正确,则可以确认上述例子中节点i原始发送至节点j的秘密份额,没有经过篡改。进一步的,所述dkg合约可以对该秘密份额与和对应的公共验证参数进行验证是否归属于同一多项式进行验证,如根据前述公式(5)进行验证。如果根据公式(5)验证等式不成立,则可以确认该秘密份额与和对应的公共验证参数并不归属于同一多项式,则投诉成立;如果根据公式(5)验证等式成立,则可以确认该秘密份额与和对应的公共验证参数进行验证归属于同一多项式,则投诉不成立。对于投诉成立的,即确认验证失败的,dkg合约可以根据投诉交易中的节点编号和第一节点集合确定第二节点集合。例如投诉交易中包括节点编号4,则如前述所说的例子,dkg合约可以将第一节点集合parties中的节点编号4标记为删除,第一节点集合parties={1,2,3,4}。进而,dkg合约可以根据验证失败的节点编号4和parties集合{1,2,3,4}确定第二节点集合qual={1,2,3}。而对于投诉不成立的,即无法确认验证失败的,dkg合约并不将第一节点集合parties中的节点编号4标记为删除,也不会因此将qual设为{1,2,3},而是仍然保持{1,2,3,4}。
[0276]
此外,可能在前一次分布式密钥生成过程中,节点i发送至节点j的秘密份额与对应的节点i生成的公共验证参数并不一致,因此节点j对节点i的投诉交易成功,而在后一次分布式密钥生成的过程中,节点i发送至节点j的秘密份额与对应的节点i生成的公共验证参数实际是一致的。这种情况下,在后一轮中,节点j仍然可以用前一轮节点i的明文秘密份额和签名来发起投诉交易,从而在后一轮中使得dkg合约发生误判。显然这是一种恶意投诉。对此,每一轮次的分布式密钥生成过程中,可以在发起的交易中包括一个表示本轮次分布式密钥生成过程的序号,例如为epoch。每进行新一轮的分布式密钥生成,epoch可以在原有数值基础上加1。这样,在s310中,节点i生成并发送的秘密份额和epoch可以一并签名后再进行加密。进而,在epoch=p的分布式密钥生成过程中,如果节点i作恶,节点j通过投诉交易可以发送验证失败的节点i的编号和节点i发送至节点j的明文的秘密份额、epoch=p以及签名,从而dkg合约接收到所述投诉交易后可以验证,并首先可以通过签名验证原始报文中的明文的秘密份额、epoch=p没有经过篡改。这样,在epoch=p 1的分布式密钥生成过程中,假设节点i并未作恶,节点j即使通过投诉交易发送验证失败的节点i的编号和节点i发送至节点j的明文的秘密份额、epoch=p 1以及上一轮的签名,由于上一轮的签名是针对epoch=p的,该签名与原始报文无法吻合,从而dkg合约接收到所述投诉交易后首先可以通过签名验证原始报文经过篡改而不信任本次投诉,这就避免了恶意投诉。
[0277]
需要说明的是,上述在s330中发送明文的秘密份额,是发生在诚实节点必然会在一定时间内做出正确响应的前提下。这样,并不会因为发送所有的秘密份额而导致私钥份额泄露,最终的完整签名也就不会泄露。
[0278]
在s320中,每一共识节点通过链上合约所广播的公共验证参数还伴随有所述轮次。这样,可以在网络中存在延迟的情况下区分所述公共验证参数所属的轮次。
[0279]
通过上述方法,在共识机制保障区块链网络整体一致性和同步的基础上,结合区块链智能合约实现分布式密钥生成,保障了分布式密钥的生成一方面是由各个参与方通过协作来生成的,另一方面生成的结果是一致和可靠的,从而摆脱了原有的区块链之外实现分布式密钥生成对网络同步的强依赖,并解决了该情况下生成结果的不可靠性问题。
[0280]
以下结合图8以一个共识节点的角度描述区块链上实现分布式密钥生成的方法,包括:
[0281]
s410:第一节点接收其它节点生成并加密的秘密份额,并通过链上合约广播接收对应的公共验证参数;所述合约将请求广播的节点的编号加入第一节点集合;
[0282]
s420:第一节点对接收到的每一秘密份额和对应的公共验证参数进行验证,并将验证失败的节点编号通过投诉交易发送至所述合约;所述合约根据各共识节点发来的验证失败的节点编号和第一节点集合确定第二节点集合;
[0283]
s430:第一节点各自基于验证参数及第二节点集合计算公钥份额,并基于本地的秘密份额和第二节点集合计算自身对应的私钥份额。
[0284]
其中,第一节点接收的加密的秘密份额还可以包括签名并加密的秘密份额。
[0285]
其中,所述投诉交易中还可以包括生成者生成的明文的秘密份额和生成者对该明文秘密份额的签名。
[0286]
其中所述合约根据各共识节点发来的验证失败的节点编号和第一节点集合确定第二节点集合之前,还可以包括:
[0287]
所述合约验证所述投诉交易中秘密份额的签名;
[0288]
所述合约验证所述秘密份额的签名正确后,还对所述秘密份额和对应的公共验证参数进行验证。
[0289]
其中,所述第一节点接收的加密的秘密份额还可以包括连同表示分布式密钥生成轮次的编号一并签名并加密的秘密份额。
[0290]
其中,所述投诉交易中还可以包括生成者生成的明文的秘密份额、所述轮次以及生成者对该明文秘密份额和轮次的签名。
[0291]
其中,所述合约根据各共识节点发来的验证失败的节点编号和第一节点集合确定第二节点集合之前,还可以包括:
[0292]
所述合约验证所述投诉交易中秘密份额和轮次的签名;
[0293]
所述合约验证所述秘密份额和轮次的签名正确后,还对所述秘密份额和对应的公共验证参数进行验证。
[0294]
其中,第一节点通过链上合约接收的公共验证参数还伴随有所述轮次。
[0295]
其中,所述合约对所述秘密份额和对应的公共验证参数进行验证,确认验证失败后,可以根据所述投诉交易中的节点编号和第一节点集合确定第二节点集合。
[0296]
其中,第一节点还可以基于验证参数及第二节点集合计算公钥份额总公钥。
[0297]
以下介绍本说明书提供的一种区块链系统,包括若干个共识节点,其中:
[0298]
每一共识节点生成n个秘密份额,自身保留一份,并将其中n-1个秘密份额分别加密发送至其它n-1个节点;
[0299]
每一共识节点生成自身秘密份额对应的公共验证参数并通过链上合约广播;所述合约将请求广播的节点的编号加入第一节点集合;
[0300]
每一共识节点对接收到的每一秘密份额和对应的公共验证参数进行验证,并将验证失败的节点编号通过投诉交易发送至所述合约;所述合约根据各共识节点发来的验证失败的节点编号和第一节点集合确定第二节点集合;
[0301]
每一共识节点各自基于验证参数及第二节点集合计算公钥份额,并基于本地的秘密份额和第二节点集合计算自身对应的私钥份额。
[0302]
以下介绍本说明书提供的一种区块链系统中的第一共识节点,包括
[0303]
第一节点接收其它节点生成并加密的秘密份额,并通过链上合约广播接收对应的公共验证参数;所述合约将请求广播的节点的编号加入第一节点集合;
[0304]
第一节点对接收到的每一秘密份额和对应的公共验证参数进行验证,并将验证失败的节点编号通过投诉交易发送至所述合约;所述合约根据各共识节点发来的验证失败的节点编号和第一节点集合确定第二节点集合;
[0305]
第一共识节点各自基于验证参数及第二节点集合计算公钥份额,并基于本地的秘密份额和第二节点集合计算自身对应的私钥份额。
[0306]
在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。本领域技术人员也应该清楚,只需要将方法流程用上述几种硬件描述语言稍作逻辑编程并编程到集成电路中,就可以很容易得到实现该逻辑方法流程的硬件电路。
[0307]
控制器可以按任何适当的方式实现,例如,控制器可以采取例如微处理器或处理器以及存储可由该(微)处理器执行的计算机可读程序代码(例如软件或固件)的计算机可
读介质、逻辑门、开关、专用集成电路(application specific integrated circuit,asic)、可编程逻辑控制器和嵌入微控制器的形式,控制器的例子包括但不限于以下微控制器:arc 625d、atmel at91sam、microchip pic18f26k20以及silicone labs c8051f320,存储器控制器还可以被实现为存储器的控制逻辑的一部分。本领域技术人员也知道,除了以纯计算机可读程序代码方式实现控制器以外,完全可以通过将方法步骤进行逻辑编程来使得控制器以逻辑门、开关、专用集成电路、可编程逻辑控制器和嵌入微控制器等的形式来实现相同功能。因此这种控制器可以被认为是一种硬件部件,而对其内包括的用于实现各种功能的装置也可以视为硬件部件内的结构。或者甚至,可以将用于实现各种功能的装置视为既可以是实现方法的软件模块又可以是硬件部件内的结构。
[0308]
上述实施例阐明的系统、装置、模块或单元,具体可以由计算机芯片或实体实现,或者由具有某种功能的产品来实现。一种典型的实现设备为服务器系统。当然,本说明书不排除随着未来计算机技术的发展,实现上述实施例功能的计算机例如可以为个人计算机、膝上型计算机、车载人机交互设备、蜂窝电话、相机电话、智能电话、个人数字助理、媒体播放器、导航设备、电子邮件设备、游戏控制台、平板计算机、可穿戴设备或者这些设备中的任何设备的组合。
[0309]
虽然本说明书一个或多个实施例提供了如实施例或流程图所述的方法操作步骤,但基于常规或者无创造性的手段可以包括更多或者更少的操作步骤。实施例中列举的步骤顺序仅仅为众多步骤执行顺序中的一种方式,不代表唯一的执行顺序。在实际中的装置或终端产品执行时,可以按照实施例或者附图所示的方法顺序执行或者并行执行(例如并行处理器或者多线程处理的环境,甚至为分布式数据处理环境)。术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、产品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、产品或者设备所固有的要素。在没有更多限制的情况下,并不排除在包括所述要素的过程、方法、产品或者设备中还存在另外的相同或等同要素。例如若使用到第一,第二等词语用来表示名称,而并不表示任何特定的顺序。
[0310]
为了描述的方便,描述以上装置时以功能分为各种模块分别描述。当然,在实施本说明书一个或多个时可以把各模块的功能在同一个或多个软件和/或硬件中实现,也可以将实现同一功能的模块由多个子模块或子单元的组合实现等。以上所描述的装置实施例仅仅是示意性的,例如,所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,装置或单元的间接耦合或通信连接,可以是电性,机械或其它的形式。
[0311]
本说明书是参照根据本说明书实施例的方法、装置(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
[0312]
这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
[0313]
这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
[0314]
在一个典型的配置中,计算设备包括一个或多个处理器(cpu)、输入/输出接口、网络接口和内存。
[0315]
内存可能包括计算机可读介质中的非永久性存储器,随机存取存储器(ram)和/或非易失性内存等形式,如只读存储器(rom)或闪存(flash ram)。内存是计算机可读介质的示例。
[0316]
计算机可读介质包括永久性和非永久性、可移动和非可移动媒体可以由任何方法或技术来实现信息存储。信息可以是计算机可读指令、数据结构、程序的模块或其他数据。计算机的存储介质的例子包括,但不限于相变内存(pram)、静态随机存取存储器(sram)、动态随机存取存储器(dram)、其他类型的随机存取存储器(ram)、只读存储器(rom)、电可擦除可编程只读存储器(eeprom)、快闪记忆体或其他内存技术、只读光盘只读存储器(cd-rom)、数字多功能光盘(dvd)或其他光学存储、磁盒式磁带,磁带磁磁盘存储、石墨烯存储或其他磁性存储设备或任何其他非传输介质,可用于存储可以被计算设备访问的信息。按照本文中的界定,计算机可读介质不包括暂存电脑可读媒体(transitory media),如调制的数据信号和载波。
[0317]
本领域技术人员应明白,本说明书一个或多个实施例可提供为方法、系统或计算机程序产品。因此,本说明书一个或多个实施例可采用完全硬件实施例、完全软件实施例或结合软件和硬件方面的实施例的形式。而且,本说明书一个或多个实施例可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、cd-rom、光学存储器等)上实施的计算机程序产品的形式。
[0318]
本说明书一个或多个实施例可以在由计算机执行的计算机可执行指令的一般上下文中描述,例如程序模块。一般地,程序模块包括执行特定任务或实现特定抽象数据类型的例程、程序、对象、组件、数据结构等等。也可以在分布式计算环境中实践本本说明书一个或多个实施例,在这些分布式计算环境中,由通过通信网络而被连接的远程处理设备来执行任务。在分布式计算环境中,程序模块可以位于包括存储设备在内的本地和远程计算机存储介质中。
[0319]
本说明书中的各个实施例均采用递进的方式描述,各个实施例之间相同相似的部分互相参见即可,每个实施例重点说明的都是与其他实施例的不同之处。尤其,对于系统实施例而言,由于其基本相似于方法实施例,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。在本说明书的描述中,参考术语“一个实施例”、“一些实施例”、“示例”、“具体示例”、或“一些示例”等的描述意指结合该实施例或示例描述的具体特征、结构、材料或者特点包含于本说明书的至少一个实施例或示例中。在本说明书中,对上述术语的示意
性表述不必须针对的是相同的实施例或示例。而且,描述的具体特征、结构、材料或者特点可以在任一个或多个实施例或示例中以合适的方式结合。此外,在不相互矛盾的情况下,本领域的技术人员可以将本说明书中描述的不同实施例或示例以及不同实施例或示例的特征进行结合和组合。
[0320]
以上所述仅为本说明书一个或多个实施例的实施例而已,并不用于限制本本说明书一个或多个实施例。对于本领域技术人员来说,本说明书一个或多个实施例可以有各种更改和变化。凡在本说明书的精神和原理之内所作的任何修改、等同替换、改进等,均应包含在权利要求范围之内。
再多了解一些

本文用于企业家、创业者技术爱好者查询,结果仅供参考。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

相关文献