CN115941164A - 一种区块链上实现分布式密钥生成的方法、系统和节点 - Google Patents

一种区块链上实现分布式密钥生成的方法、系统和节点 Download PDF

Info

Publication number
CN115941164A
CN115941164A CN202211347342.1A CN202211347342A CN115941164A CN 115941164 A CN115941164 A CN 115941164A CN 202211347342 A CN202211347342 A CN 202211347342A CN 115941164 A CN115941164 A CN 115941164A
Authority
CN
China
Prior art keywords
node
secret
share
key
contract
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Pending
Application number
CN202211347342.1A
Other languages
English (en)
Inventor
林立
徐文博
马环宇
石柯
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Ant Blockchain Technology Shanghai Co Ltd
Original Assignee
Ant Blockchain Technology Shanghai Co Ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Ant Blockchain Technology Shanghai Co Ltd filed Critical Ant Blockchain Technology Shanghai Co Ltd
Priority to CN202211347342.1A priority Critical patent/CN115941164A/zh
Priority to PCT/CN2022/135591 priority patent/WO2024092936A1/zh
Publication of CN115941164A publication Critical patent/CN115941164A/zh
Pending legal-status Critical Current

Links

Images

Classifications

    • HELECTRICITY
    • H04ELECTRIC COMMUNICATION TECHNIQUE
    • H04LTRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
    • H04L67/00Network arrangements or protocols for supporting network services or applications
    • H04L67/01Protocols
    • H04L67/10Protocols in which an application is distributed across nodes in the network
    • HELECTRICITY
    • H04ELECTRIC COMMUNICATION TECHNIQUE
    • H04LTRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
    • H04L67/00Network arrangements or protocols for supporting network services or applications
    • H04L67/01Protocols
    • H04L67/10Protocols in which an application is distributed across nodes in the network
    • H04L67/104Peer-to-peer [P2P] networks
    • H04L67/1042Peer-to-peer [P2P] networks using topology management mechanisms
    • HELECTRICITY
    • H04ELECTRIC COMMUNICATION TECHNIQUE
    • H04LTRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
    • H04L9/00Cryptographic mechanisms or cryptographic arrangements for secret or secure communications; Network security protocols
    • H04L9/08Key distribution or management, e.g. generation, sharing or updating, of cryptographic keys or passwords
    • HELECTRICITY
    • H04ELECTRIC COMMUNICATION TECHNIQUE
    • H04LTRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
    • H04L9/00Cryptographic mechanisms or cryptographic arrangements for secret or secure communications; Network security protocols
    • H04L9/32Cryptographic mechanisms or cryptographic arrangements for secret or secure communications; Network security protocols including means for verifying the identity or authority of a user of the system or for message authentication, e.g. authorization, entity authentication, data integrity or data verification, non-repudiation, key authentication or verification of credentials

Landscapes

  • Engineering & Computer Science (AREA)
  • Computer Networks & Wireless Communication (AREA)
  • Signal Processing (AREA)
  • Computer Security & Cryptography (AREA)
  • Business, Economics & Management (AREA)
  • General Business, Economics & Management (AREA)
  • Storage Device Security (AREA)

Abstract

一种区块链上实现分布式密钥生成的方法,包括:S1:每一节点生成n个秘密份额,自身保留一份,并将其余n‑1个秘密份额分别用接收方密钥加密;每一节点生成自身秘密份额对应的公共验证参数;每一节点生成自身秘密份额与对应的公共验证参数相匹配的第三零知识证明;S2:每一节点通过同一交易或不同交易发送自身生成的所述秘密份额、公共验证参数以及第三零知识证明至链上合约;S3:所述链上合约通过第三零知识证明验证所述加密的秘密份额及对应的公共验证参数相匹配;S4:每一节点从所述合约信息中获得经过验证的且接收方为自身的秘密份额并采用自身密钥解密,并结合本地的秘密份额计算自身的私钥份额。

Description

一种区块链上实现分布式密钥生成的方法、系统和节点
技术领域
本说明书实施例属于区块链技术领域,尤其涉及一种区块链上实现分布式密钥生成的方法、系统和节点。
背景技术
区块链(Blockchain)是分布式数据存储、点对点传输、共识机制、加密算法等计算机技术的新型应用模式。区块链系统中按照时间顺序将数据区块以顺序相连的方式组合成链式数据结构,并以密码学方式保证的不可篡改和不可伪造的分布式账本。由于区块链具有去中心化、信息不可篡改、自治性等特性,区块链也受到人们越来越多的重视和应用。
发明内容
本发明的目的在于提供一种区块链上实现分布式密钥生成的方法、系统和节点,包括:
一种区块链上实现分布式密钥生成的方法,包括:
S1:每一节点生成n个秘密份额,自身保留一份,并将其余n-1个秘密份额分别用接收方密钥加密;每一节点生成自身秘密份额对应的公共验证参数;每一节点生成自身秘密份额与对应的公共验证参数相匹配的第三零知识证明;
S2:每一节点通过同一交易或不同交易发送自身生成的所述秘密份额、公共验证参数以及第三零知识证明至链上合约;
S3:所述链上合约通过第三零知识证明验证所述加密的秘密份额及对应的公共验证参数相匹配;
S4:每一节点从所述合约信息中获得经过验证的且接收方为自身的秘密份额并采用自身密钥解密,并结合本地的秘密份额计算自身的私钥份额。
一种区块链上实现分布式密钥生成的方法,包括:
S1:每一节点生成n个秘密份额,自身保留一份,并将其余n-1个秘密份额分别用接收方密钥进行加密,并生成对应的证明可解密的第一零知识证明;每一节点生成自身秘密份额对应的公共验证参数;每一节点生成自身秘密份额与对应的公共验证参数相匹配的第三零知识证明;
S2:每一节点可以在同一交易或不同交易中发送所述秘密份额和对应的第一零知识证明、公共验证参数以及所述秘密份额与对应的公共验证参数相匹配的第三零知识证明至链上合约;
S3:所述链上合约通过第一零知识证明验证所述加密的秘密份额,并通过第三零知识证明验证所述加密的秘密份额及对应的公共验证参数相匹配;
S4:每一节点从所述合约信息中获得经过验证的且接收方为自身的秘密份额并采用自身密钥解密,并结合本地的秘密份额计算自身的私钥份额。
一种区块链系统,包括若干节点,其中:
每一节点生成n个秘密份额,自身保留一份,并将其余n-1个秘密份额分别用接收方密钥加密;每一节点生成自身秘密份额对应的公共验证参数;每一节点生成自身秘密份额与对应的公共验证参数相匹配的第三零知识证明;
每一节点通过同一交易或不同交易发送自身生成的所述秘密份额、公共验证参数以及第三零知识证明至链上合约;
所述链上合约通过第三零知识证明验证所述加密的秘密份额及对应的公共验证参数相匹配;
每一节点从所述合约信息中获得经过验证的且接收方为自身的秘密份额并采用自身密钥解密,并结合本地的秘密份额计算自身的私钥份额。
一种区块链系统,包括若干节点,其中:
每一节点生成n个秘密份额,自身保留一份,并将其余n-1个秘密份额分别用接收方密钥进行加密,并生成对应的证明可解密的第一零知识证明;每一节点生成自身秘密份额对应的公共验证参数;每一节点生成自身秘密份额与对应的公共验证参数相匹配的第三零知识证明;
每一节点可以在同一交易或不同交易中发送所述秘密份额和对应的第一零知识证明、公共验证参数以及所述秘密份额与对应的公共验证参数相匹配的第三零知识证明至链上合约;
所述链上合约通过第一零知识证明验证所述加密的秘密份额,并通过第三零知识证明验证所述加密的秘密份额及对应的公共验证参数相匹配;
每一节点从所述合约信息中获得经过验证的且接收方为自身的秘密份额并采用自身密钥解密,并结合本地的秘密份额计算自身的私钥份额。
一种区块链系统中的第一节点,包括:
第一节点生成n个秘密份额,自身保留一份,并将其余n-1个秘密份额分别用接收方密钥加密;第一节点生成自身秘密份额对应的公共验证参数;第一节点生成自身秘密份额与对应的公共验证参数相匹配的第三零知识证明;
第一节点通过同一交易或不同交易发送自身生成的所述秘密份额、公共验证参数以及第三零知识证明至链上合约;
所述链上合约通过第三零知识证明验证所述加密的秘密份额及对应的公共验证参数相匹配;
第一节点从所述合约信息中获得经过验证的且接收方为自身的秘密份额并采用自身密钥解密,并结合本地的秘密份额计算自身的私钥份额。
一种区块链系统中的第一节点,包括:
第一节点生成n个秘密份额,自身保留一份,并将其余n-1个秘密份额分别用接收方密钥进行加密,并生成对应的证明可解密的第一零知识证明;第一节点生成自身秘密份额对应的公共验证参数;第一节点生成自身秘密份额与对应的公共验证参数相匹配的第三零知识证明;
第一节点可以在同一交易或不同交易中发送所述秘密份额和对应的第一零知识证明、公共验证参数以及所述秘密份额与对应的公共验证参数相匹配的第三零知识证明至链上合约;
所述链上合约通过第一零知识证明验证所述加密的秘密份额,并通过第三零知识证明验证所述加密的秘密份额及对应的公共验证参数相匹配;
第一节点从所述合约信息中获得经过验证的且接收方为自身的秘密份额并采用自身密钥解密,并结合本地的秘密份额计算自身的私钥份额。
上述实施例中,对于n个节点,每一节点生成的秘密份额经加密后发送至链上合约,消息复杂度是n,从而避免节点之间点对点的加密传输,即避免n2的消息复杂度,可见能大大降低消息数量。
附图说明
为了更清楚地说明本说明书实施例的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本说明书中记载的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。
图1是一实施例中实用拜占庭容错算法常规阶段的示意图;
图2是一实施例中实用拜占庭容错算法视图切换阶段的示意图;
图3是一实施例中共识节点都没有宕机情况下实用拜占庭容错算法常规阶段的示意图;
图4是本说明书一实施例中区块结构的示意图;
图5是本说明书一实施例中区块链上产生随机数种子的流程图;
图6是本说明书一实施例中区块头结构的示意图;
图7是本说明书一实施例中区块链上实现分布式密钥生成的方法;
图8是本说明书一实施例中区块链上实现分布式密钥生成的方法;
图9是本说明书一实施例中区块链上实现分布式密钥生成的方法。
具体实施方式
为了使本技术领域的人员更好地理解本说明书中的技术方案,下面将结合本说明书实施例中的附图,对本说明书实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本说明书一部分实施例,而不是全部的实施例。基于本说明书中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都应当属于本说明书保护的范围。
DKG(Distributed Key Generation)协议,即分布式密钥生成协议,指在参与协议的多个参与方之间通过协作产生一组密钥的分布式协议。VSS(Verifiable SecretSharing)协议,即可验证秘密分享协议,是DKG协议的重要理论基础。
VSS是指在多个参与方之间进行一个秘密数据的分享时,可以在不泄露秘密数据本身的前提下,将秘密数据拆分成多个分片,交由多个参与方分别保管一个分片。之后,当需要还原秘密数据时,需要收集所有的分片才能成功还原完整的秘密数据。
VSS协议最早由Shamir于1979年提出,是一个基于多项式的秘密分享协议。VSS协议由Shamir秘密分享(Shamir's Secret Sharing,SSS)发展得来,因此先介绍Shamir秘密分享。
Shamir秘密分享,包括秘密分享(或秘密分发)和秘密重构两个阶段,并首先需要由一个Dealer构造一个多项式:
f(x)=a0+a1x+a2x2+…+anxn 多项式(*)
其中,a0为要分享的秘密数据。
这个n次多项式由一组系数(a0,a1,a2,…,an)唯一确定,这一组系数包括n+1个值。这样,如果已知该n次多项式对应的曲线通过平面上的n+1个不同的点,即得到n+1个不同的点的坐标(x1,y1),(x2,y2),…,(xn,yn),(xn+1,yn+1),则可以得到n+1个方程的(n+1)元一次方程组,从而由该方程组可以确定该n+1个系数a0,a1,a2,…,an的取值,进而确定该多项式(*),最终也就可以获得秘密数据a0的值。上述n+1个不同的点的坐标(x1,y1),(x2,y2),…,(xn,yn),(xn+1,yn+1)即为n+1个秘密分片。
关于根据已有的若干点,求出通过这些点的曲线,这个求解过程称为多项式插值。实现多项式插值有多种方法,以下介绍一种常见的拉格朗日插值法。给定一个n次多项式*,已知该多项式对应曲线通过平面上的n+1个点(x1,y1),(x2,y2),…,(xn,yn),(xn+1,yn+1)的坐标,则通过拉格朗日插值法可以得到该n次曲线的多项式如下:
Figure BDA0003918794290000051
多项式(**)与多项式(*)实际上是等价的。多项式(*)中设x=0,则f(0)=a0,即可以得到秘密数据a0的值。因此,多项式(**)中设x=0,也可以得到秘密数据a0的值,即f(0)=a0
综上,可以任取该多项式上的n+1个点,并将这n+1个点在n+1个参与方之间进行分享,例如每个参与方获得一个点的坐标。收集齐任何少于n+1个点的坐标都无法推断出原始的秘密数据a0,只有获得全部n+1个点后才能通过重构多项式系数的方式还原秘密数据a0的值。另外,即使收集齐任何少于n+1个点的坐标,例如是n个点的坐标,则由于过这n个点的n次曲线有无数条,因此从概率上讲也不会泄露秘密数据a0的值。这里的次数n也称为多项式的度。
在此基础上,可以实现门限Shamir秘密分享。例如t-of-n秘密分享,是在n个参与方之间分享秘密,并规定恢复时需要的最少的秘密分片的阈值为t。例如在4方参与的交易中,约定阈值为3,即n=4,t=3,则大于等于3个参与方提供自身的秘密分片时才能还原出秘密,否则无法还原出秘密。具体的,可以构造一个t-1=2度的多项式:
f(x)=a0+a1x+a2x2 多项式(***)
可以得到该2度多项式对应的曲线通过平面上的4个不同的点,即得到4个不同的点的坐标(x1,y1),(x2,y2),(x3,y3),(x4,y4),并在秘密分享阶段将该4个点的坐标分别分发至一个参与方。4个参与方设为Party1,Party2,Party3,Party4,这样,假设Party1具有分片(x1,y1),Party2具有分片(x2,y2),Party3具有分片(x3,y3),Party4具有分片(x4,y4)。由于多项式(**)可以由对应曲线上任3个点来确定,因此,Partyi(i∈{1,2,3,4})中,任意三个参与方都提供自身的秘密分片时,在秘密重构阶段可以还原出多项式(***),从而可以得到秘密值a0。任意少于三个参与方提供自身的秘密分片时,都无法还原出多项式(***),也就无法得到秘密值a0。上述的t也称为门限。
上述Shamir秘密分享和门限Shamir秘密分享,需要一个生成多项式和分发秘密分片的角色,这个角色可以称之为Dealer。这个Dealer是一个知道秘密的实体,需要是各参与方可信的第三方。此外还需要一个用于汇总至少门限个分片并得到秘密的实体,例如是Dealer或某个参与方,也可以是其它实体。
工程实践中,多项式常常定义在有限域(基于椭圆曲线或离散对数)或素数域(基于RSA),而不是实数域或自然数域。
经典的Shamir秘密分享方案中,假设参与方是诚实的。但是实际上有可能有不诚实的行为,或称作恶行为,例如Dealer欺骗某个或某些参与方,将错误的秘密分片发给该参与方等。
在秘密分享中,为了验证作恶问题,如参与方验证Dealer是否欺骗自己(如上所述验证Dealer发送的是否是错误的秘密分片),提出了可验证的秘密分享(VerifiableSecret Sharing,VSS)。Feldman VSS是一种基于Shamir秘密分享构造的实用的VSS方案,包括:
Dealer具有一个秘密并分发这个秘密的n个分片给n个参与方,其中t个参与方可以重构该秘密,可以采用类似上述门限Shamir秘密分享方案,构造一个t-1度多项式:
f(x)=a0+a1x+a2x2+…+at-1xt-1 多项式(****)
Dealer为每一个参与方Partyi任意选择一个非0的xi,计算si=f(xi),并将子秘密si加密发送给参与方者Partyi。同时,Dealer计算
Figure BDA0003918794290000061
其中j=0,1,2,...,t-1,并公开Aj,即公开{A0,A1,A2,…,At-1}。Aj也称为公共验证参数。这里Aj的生成方法与椭圆曲线上基于私钥生成公钥的方法相同,因此,Aj也可以称为公钥分片或公钥分享(share)。
对于选定的多项式是对应椭圆曲线的情形,公开Aj是安全的,因为根据椭圆曲线的性质,无法根据Aj反推得到aj
公共验证参数{A0,A1,A2,…,At-1}也称为承诺(commitment)。该承诺由于绑定了多项式的系数,因此可以用于验证多项式的一个取值是否正确。基于离散对数的实现中,g为有限域上循环群的生成元(generator),g可以为在Dealer和Partyi上预先配置好的。上述子秘密也可称为秘密份额。
参与方收到子秘密si后,可以采用公共验证参数来验证si的有效性。可以通过验证以下等式是否成立来验证si是否有效:
Figure BDA0003918794290000062
多项式(*****)的右侧可以如下推导:
Figure BDA0003918794290000063
多项式(*****)的右侧也可以写为:
Figure BDA0003918794290000064
可见,对于Partyi,Dealer为其选择的一个非0的xi,xi例如为i,则Partyi可以采用i和公共验证参数{A0,A1,A2,…,At-1}计算多项式(*****)的右边,并采用生成元g和子秘密si来计算多项式(*****)的左边,从而可以通过判断多项式(*****)的左、右两边是否相等来判断
Figure BDA0003918794290000071
是否是{A0,A1,A2,…,At-1}对应曲线上的一个点。这个验证,属于秘密分发阶段的验证。为了简单,通常可以取xi=i。
工程中一般都基于离散对数实现,对上面各式都采用取模运算,如mod p,其中p为一个大素数,p也是Dealer和Partyi预先配置好的。mod p在以下类似处也有所省略。
在秘密重构阶段,例如至少门限个参与方分别将自身的秘密分片发送至Dealer,则Dealer可以采用对应该多项式的公共验证参数对每一个秘密分片进行验证。验证不通过的,还可以证明发送该秘密分片的参与方作恶;验证通过的秘密分片可以作为重构秘密的依据。
在秘密重构阶段,参与方可以通过拉格朗日插值法重构多项式f(x),从而得到f(0)的值,即得到秘密值。
此外,通过公共验证参数{A0,A1,A2,…,At-1}也可以对秘密a0的合法性进行验证,即可以验证(0,a0)是否为曲线上的点,因为存在以下关系:
Figure BDA0003918794290000072
也就是说,对秘密a0的合法性进行验证,可以化简为通过公共验证参数A0实现。
上面推导中,定义00=1,而0k=0,k≠0。
以上方案中,需要一个Dealer,而这个Dealer是中心化的,是一个知道秘密的实体,如前所述需要是个可信的第三方,或者说要求参与方都信任这个Dealer。在分布式场景中,需要既能实现分布式的秘密分发,也能实现分布式的秘密重构,这就需要去掉中心化的Dealer,这样也就实现了去信任。针对这个问题,1999年由Rabin等提出一个称为Joint-Feldman的改进协议。该协议的基本思想是并行执行n次Feldman VSS协议,其中每一位参与者都在本地产生一个随机的多项式,然后把随机选择的秘密值在所有参与者中分享。由于分享的是秘密的一个承诺而不是秘密本身,因此只要不发生超过阈值t的多人共谋作弊,就不能恢复得到秘密。这样的去掉可信第三方的分布式VSS协议也称为DVSS协议(Distributed VSS)。
具体的,以4个参与方为例,假设门限t=3,则多项式的度为t-1=2,去中心化门限秘密分享,也就是Joint-Feldman的实现方案,包括如下:
每一个Pi(Partyi简写为Pi,i∈{1,2,3,4})设置要分享的秘密si0,并随机选择其他参数以生成t-1度多项式:
参与方P1生成2度多项式:
f1(z)=a10+a11z+a12z2,其中a10是P1设置的秘密s1
参与方P2生成2度多项式:
f2(z)=a20+a21z+a22z2,其中a20是P2设置的秘密s2
参与方P3生成2度多项式:
f3(z)=a30+a31z+a32z2,其中a30是P3设置的秘密s3
参与方P4生成2度多项式:
f4(z)=a40+a41z+a42z2,其中a40是P4设置的秘密s4
接着,每个参与方Pi生成自身t-1度多项式对应的曲线上的n个值并分发,这里仍然设n=4,t=3,n=1,2,3,4,则:
参与方P1生成s11=f1(1)、s12=f1(2)、s13=f1(3)、s14=f1(4),自己保留s11,并分别加密发送s12至P2,加密发送s13至P3,加密发送s14至P4
参与方P2生成s21=f2(1)、s22=f2(2)、s23=f2(3)、s24=f2(4),自己保留s22,并分别加密发送s21至P1,加密发送s23至P3,加密发送s24至P4
参与方P3生成s31=f3(1)、s32=f3(2)、s33=f3(3)、s34=f3(4),自己保留s33,并分别加密发送s31至P1,加密发送s32至P2,加密发送s34至P4
参与方P4生成s41=f4(1)、s42=f4(2)、s43=f4(3)、s44=f4(4),自己保留s44,并分别加密发送s41至P1,加密发送s42至P2,加密发送s43至P3
而且,每个参与方Pi还生成自身t-1度多项式对应的公共验证参数
Figure BDA0003918794290000081
其中k=0,1,…,t-1,并公布给每一参与方,具体的:
参与方P1生成
Figure BDA0003918794290000082
包括
Figure BDA0003918794290000083
广播{A10,A11,A12}至P2、P3和P4
参与方P2生成
Figure BDA0003918794290000084
包括
Figure BDA0003918794290000085
广播{A20,A21,A22}至P1、P3和P4
参与方P3生成
Figure BDA0003918794290000086
包括
Figure BDA0003918794290000087
广播{A30,A31,A32}至P1、P2和P4
参与方P4生成
Figure BDA0003918794290000088
包括
Figure BDA0003918794290000089
广播{A40,A41,A42}至P1、P2和P3
这样,P1接收到s21后,可以用{A20,A21,A22}进行验证;P1接收到s31后,可以用{A30,A31,A32}进行验证;P1接收到s41后,可以用{A40,A41,A42}进行验证;验证方式类似上述,不再赘述。
类似的,P2接收到s12后,可以用{A10,A11,A12}进行验证;P2接收到s32后,可以用{A30,A31,A32}进行验证;P2接收到s42后,可以用{A40,A41,A42}进行验证;
类似的,P3接收到s13后,可以用{A10,A11,A12}进行验证;P3接收到s23后,可以用{A20,A21,A22}进行验证;P3接收到s43后,可以用{A40,A41,A42}进行验证;
类似的,P4接收到s14后,可以用{A10,A11,A12}进行验证;P4接收到s24后,可以用{A20,A21,A22}进行验证;P4接收到s34后,可以用{A30,A31,A32}进行验证。
假设各参与方验证后得到通过验证的参与方集合设为Qual,设Qual={P1,P2,P3,P4},这样:
P1本地具有不同参与方生成的秘密份额s11、s21、s31、s41,以及公共验证参数{A10,A11,A12},{A20,A21,A22},{A30,A31,A32},{A40,A41,A42};
P2本地具有不同参与方生成的秘密份额s12、s22、s32、s42,以及公共验证参数{A10,A11,A12},{A20,A21,A22},{A30,A31,A32},{A40,A41,A42};
P3本地具有不同参与方生成的秘密份额s13、s23、s33、s43,以及公共验证参数{A10,A11,A12},{A20,A21,A22},{A30,A31,A32},{A40,A41,A42};
P4本地具有不同参与方生成的秘密份额s14、s24、s34、s44,以及公共验证参数{A10,A11,A12},{A20,A21,A22},{A30,A31,A32},{A40,A41,A42}。
接着:
参与方P1可以计算得到秘密份额s1为:s1=s11+s21+s31+s41
参与方P2可以计算得到秘密份额s2为:s2=s12+s22+s32+s42
参与方P3可以计算得到秘密份额s3为:s3=s13+s23+s33+s43
参与方P4可以计算得到秘密份额s4为:s4=s14+s24+s34+s44
每一参与方Pi都可以将自身计算得到的秘密份额si广播给其它参与方。则每一参与方Pi收集齐{s1,s2,s3,s4}中至少门限t个秘密份额后,都可以重构出秘密s0。这里,对于t=3,每一参与方Pi收集齐至少门限=3个秘密份额后,也都可以重构出秘密s0
这是因为,可以汇总各参与方的曲线之和,得到总曲线:
f(z)=f1(z)+f2(z)+f3(z)+f4(z)
f(z)=(a10+a11z+a12z2)+(a20+a21z+a22z2)+(a30+a31z+a32z2)+(a40+a41z+a42z2)
f(z)=(a10+a20+a30+a40)+(a11+a21+a31+a41)z+(a12+a22+a32+a42)z2
多项式(Ⅰ)
这样:
s1=s11+s21+s31+s41=f1(1)+f2(1)+f3(1)+f4(1);
s2=s12+s22+s32+s42=f1(2)+f2(2)+f3(2)+f4(2);
s3=s13+s23+s33+s43=f1(3)+f2(3)+f3(3)+f4(3);
s4=s14+s24+s34+s44=f1(4)+f2(4)+f3(4)+f4(4);
对于总曲线f(z)来说,存在关系:
s1=f1(1)+f2(1)+f3(1)+f4(1)=f(1);
s2=f1(2)+f2(2)+f3(2)+f4(2)=f(2);
s3=f1(3)+f2(3)+f3(3)+f4(3)=f(3);
s4=f1(4)+f2(4)+f3(4)+f4(4)=f(4);
秘密为s0=a10+a20+a30+a40
这样,任一参与方Pi收集齐秘密份额s1、s2、s3、s4中的至少3个后,相当于得到多项式(Ⅰ)对应曲线上的至少3个点,即得到(x1=1,y1=s1),(x2=2,y2=s2),(x3=3,y3=s3),(x4=4,y4=s4)这4个坐标中的至少3个坐标,从而可以恢复出总曲线f(z)。进而,可以计算f(0)=a10+a20+a30+a40=s0,从而可以得到秘密s0
而且,通过验证参数{A10,A11,A12},{A20,A21,A22},{A30,A31,A32},{A40,A41,A42}也可以对秘密si的合法性进行验证,即可以验证(0,si)是否为总曲线上的点。具体的,通过验证以下等式是否成立来判断合法性:
Figure BDA0003918794290000101
这是因为,存在以下关系:
Figure BDA0003918794290000102
Figure BDA0003918794290000111
通常也设多项式(Ⅱ)等号右边为公钥份额,记为pubi,i=1,2,…,n,以用于验证对应的私钥份额。
Figure BDA0003918794290000112
如前所述,一般可以取xi=i for each i=1,2,…,n。这样,i可以作为每个参与者的编号。
对于秘密s0的验证,即xi=0,上式可以进一步推导为如下:
Figure BDA0003918794290000113
定义00=1,而0k=0,k≠0,所以上式可以进一步推导:
Figure BDA0003918794290000114
可见,基于该多项式(Ⅲ),可以验证s0的合法性。
而且,基于上面的多项式(Ⅲ)中的推导,对于验证s0的合法性,可以进一步化简为:
Figure BDA0003918794290000121
通常也设多项式(Ⅳ)等号右边为总公钥,记为pub。
上述Joint-Feldman协议可以实现分布式的分享秘密,即完成了DKG的主要内容。上述从Shamir开始到门限Shamir,Feldman VSS协议,再到Joint-Feldman DVSS协议,是一系列的秘密分享实现方案。实际上,除了Shamir秘密分享为起点的这一系列方案外,还有基于加性秘密分享(Additive Secret Share)、SPDZ(多方安全计算中一个重要协议,最早在2012年提出)、或中国剩余定理的方案等,最终也可以实现DKG,这里省略,不再赘述。
通过上述DKG协议的实现,可以克服由单个实体生成密钥而带来单点故障导致整体不可用的问题,以及需要信任生成密钥的单点的问题。但是,由于各个参与方Pi广播生成的秘密份额sij,i,j∈(1,2,…,n),n为参与方数量,且每一参与方Pi都可以将自身计算得到的秘密份额si广播给其它参与方,这样每一参与方Pi收集齐{s1,s2,s3,s4}中至少门限t个秘密份额后,都可以重构出秘密s0,这样,导致至少门限个参与方将获得最终重构出的秘密s0,即会暴露秘密s0,总曲线也将变得不再可用。如果下一次要再次产生一个新的秘密s0,需要重复执行该DKG协议的过程。
DKG协议在阈值与秘密承诺等方面的性质,结合与之相匹配的门限签名算法,就可以用于构造分布式的门限签名协议。区块链作为分布式系统,大量的使用签名算法。这样,区块链中的节点通过DKG分布式地产生秘密份额,并由至少门限个区块链节点采用秘密份额作为私钥份额对待签名信息进行签名并广播后,任一收集齐至少门限个签名份额的区块链节点可以恢复出总签名,并可以由上述方式恢复出总公钥,且这个恢复出的总签名可以由该总公钥进行验证,从而实现门限签名。而且,这样的好处在于,每个区块链节点自己持有的秘密份额不需要广播给其它节点,从而不会暴露自身的秘密份额,也就不会暴露私钥,因此一次DKG产生的秘密份额可以重复使用多次,而不用为了每次的门限签名都进行一次DKG协议。
以下从区块链、智能合约以及共识机制等基础内容说起。
区块链1.0时代通常是指在2009年到2014年之间,以比特币为代表的区块链应用发展阶段,它们主要致力于解决货币和支付手段的去中心化问题。从2014年开始,开发者们越来越注重于解决比特币在技术和扩展性方面的不足。2013年底,Vitalik Buterin发布了以太坊(Ethereum)白皮书《以太坊:下一代智能合约和去中心化应用平台》,将智能合约引入区块链,打开了区块链在货币领域以外的应用,从而开启了区块链2.0时代。
区块链系统中,不同参与方通过部署的节点(Node)可以建立一个分布式的区块链网络。利用链式区块结构构造的去中心化(或称为多中心化)的分布式账本,保存于分布式的区块链网络中的每个节点(或大多节点上,如共识节点)上。这样的区块链系统需要解决去中心化(或多中心化)的多个节点上各自的账本数据的一致性和正确性的问题。每个节点(或多个节点)上都运行着区块链程序,在一定容错需求的设计下,通过共识(consensus)机制保证所有忠诚节点具有相同的交易,从而保证所有忠诚节点对相同交易的执行结果一致,并将交易及执行结果打包生成区块。
智能合约是一种基于规定触发规则的,可自动执行的计算机合约,也可以看作是传统合约的数字版本。智能合约这一概念最早由跨领域法律学者、密码学研究工作者尼克·萨博(Nick Szabo)在1994年提出。这项技术曾一度因为缺乏可编程数字系统和相关技术而没有被用于实际产业中,直到区块链技术和以太坊的出现为其提供了可靠的执行环境。由于区块链技术采用块链式账本,产生的数据不可篡改或者删除,且整个账本将不断新增账本数据,从而保证了历史数据的可追溯;同时,去中心化的运行机制避免了中心化因素的影响。基于区块链技术的智能合约不仅可以发挥智能合约在成本、效率方面的优势,而且可以避免恶意行为对合约正常执行的干扰。将智能合约以数字化的形式写入区块链中,由区块链技术的特性保障存储、读取、执行整个过程透明可跟踪、不可篡改。
区块链发展及应用多样化。一些业务逻辑被编辑为智能合约并在区块链平台上执行。具体的,这些包含业务逻辑的智能合约可以运行于区块链网络中的每个节点(或大多节点上,如共识节点)上。相对于中心化的业务逻辑执行环境所带来的单点故障导致整个中心化系统不可用的问题,区块链环境中执行智能合约也被称为“世界计算机”,这是因为分布式的区块链网络中有较多节点各自独立执行智能合约。如前所述,这些不同节点上执行相同逻辑的智能合约,需要获得相同的执行结果,从而保证这些节点中的多数保存的账本是一致的。
一些业务逻辑中,可能需要基于随机数产生一个结果,例如实现抽奖的业务逻辑,实现摇号的业务逻辑,或者实现一定范围内随机金额发红包或盲盒等的业务逻辑,这一般需要在智能合约中包含产生随机数的程序。再例如,一些系统合约中,可能需要实现对主节点的投票或对小规模委员会的投票,这个投票逻辑中可能采用随机的方式或者是用到随机数。如前所述,分布式的区块链网络中有一个显著特点,是为了保证分布式的区块链网络整体可用而需要多数节点中的账本是一致的,这也就需要多数节点中的智能合约产生的随机数是一致的。
前述提到,每个节点(或多个节点)上都运行着区块链程序,在一定容错需求的设计下,通过共识机制保证所有忠诚节点具有相同的交易,从而保证所有忠诚节点对相同交易的执行结果一致,并将交易及执行结果打包生成区块。当前主流的共识机制包括:工作量证明(Proof of Work,POW)、股权证明(Proof of Stake,POS)、委任权益证明(DelegatedProof of Stake,DPOS)、实用拜占庭容错(Practical Byzantine Fault Tolerance,PBFT)算法,蜜獾拜占庭容错(HoneyBadgerBFT)算法等。
以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;对于包含七个节点的分布式系统,任意五个节点可以构成一个Quorum;……。
PBFT包括Normal Case Phase和View Change Phase两个过程,图1为Normal CasePhase(常规阶段)过程的流程图。Normal Case Phase中主要包括PRE-PREPARE(预准备)、PREPARE(准备)和COMMIT(提交)三个阶段,其中3号节点例如可以表示宕机的节点(图1中以×表示)。当主节点失效的时候(图2中以×表示,如更换视图前主节点Primary也就是Replica 0(副本0)失效)就需要启动视图更换(view change)过程,从而在系统存在故障时进行调整,更换新的主节点(如更换视图后Replica 1为主节点Primary)。图2为ViewChange Phase(视图切换)的示意图。如果主节点掉线或者作恶而不广播客户端的请求等,客户端可以设置超时机制。如果超时的话,客户端可以向所有副本节点广播请求消息。副本节点检测出主节点作恶或者下线后,也可以发起View Change协议阶段,以更换主节点(经常简称为“换主”)。此外,也可能由于主节点发起错误的提议导致PRE-PREPARE、PREPARE和COMMIT三阶段共识过程失败,或者,PREPARE、COMMIT阶段可能达不成Quorum数量(如3f+1个节点中的2f+1个,也称为法定数量)的一致,也都无法完成共识。这些情况下也可能发起View Change协议阶段,以更换主节点。
在正常情况下,即共识节点都没有宕机,共识消息也能在一定时间内到达对方,即不会发生换主的情况下,PBFT中的Normal Case Phase过程可以如图3所示,该图仍然以4个共识节点为例。
在第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个区块。
在第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的三阶段过程。
可见,常规产生区块的情况下,每个共识节点在每个区块的产生过程中包含一次PBFT的Normal Case Phase过程。随着区块的不断产生,每个共识节点将会重复这个共识过程,图3中仅示例性的示出了第r-1、r和r+1轮共识过程。其中,有的共识节点作为PBFT中的主节点的角色,有的共识节点作为PBFT中的备份节点的角色。
以以太坊(Ethereum)为例,图4是一个区块的区块头的结构示意图。由图4所示的结构中,每一区块的区块头包括若干字段,例如上一区块哈希previous_Hash(图中的PrevHash),Nonce(这是工作量证明涉及的随机数,与本申请中的随机数种子不同,且在一些以以太坊为基础的联盟链中并不启用这个nonce),时间戳Timestamp,上一区块号Block Num,状态根哈希State Root,交易根哈希Transaction Root,收据根哈希Receipt Root等。其中,下一区块(如区块N+1)的区块头中的Prev Hash指向上一区块(如区块N),即为上一区块的hash值,也就是上一区块的区块头的hash值。区块头的hash值,可以是区块头中所包含的各个字段顺序拼接后经某种hash算法计算得到的hash值。通过这种方式,区块链上通过区块头实现了下一区块对上一区块的锁定。特别的,如前所述,state root是世界状态的根hash,即所有账户的状态组成的MPT树的根的哈希值,指向state_root的为一颗MPT形式的状态树state trie。Transaction Root一般是本区块包含的原始交易列表的组织成一种树形结构后的树根节点的hash值,Receipt Root一般是本区块包含的交易经过执行后生成的所有收据组织成一种树形结构后的树根节点的hash值。区块体中的交易树、收据树可以与状态树结构类似,这里省略。
图3中的r-1可以对应图4中的N-1,图3中的r可以对应图4中的N,图3中的r+1可以对应图4中的N+1,以此类推。
在一次共识过程中,即一次PBFT的三阶段过程中,可以包括:
a110:(PRE-PREPARE预准备阶段)主节点0收集一定数量的待共识交易后,将待共识交易排序并打包为消息m(也称为原始交易列表),发送pre-prepare请求至备份节点1、2、3,pre-prepare请求中包括原始交易列表;
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状态。
a130:(COMMIT提交阶段)参与共识的节点中的每一个在进入prepared状态后,发送commit消息给其他的共识节点,并将自己发送的commit消息添加到本地Log中(代表自己的认可),而且,每一节点还接收其他节点广播的commit消息。某一节点如果收集齐来自不同节点的至少Quorum数量的合法的commit消息后,添加到本地Log中(这时加上自己添加到本地Log中的共有Quorum个),转变成committed状态。
a140:转变为committed状态的节点将消息m输出为本轮的共识结果。
消息m中包含哪些交易,以及所包含的交易的前后顺序,一般是由主节点在a110中决定的。确定包含哪些交易,包含的交易的前后顺序,这两个是共识机制的重要内容。区块链网络中可能接收到很多交易请求,a110中主节点打包哪些交易,决定了哪些交易会被区块链网络处理,交易的执行结果会上链。即使一组相同的交易,前后执行顺序不同会导致最终结果不同,而这影响到各个节点上的账本是否一致。
本申请提供一种区块链上产生随机数种子的方法,可以结合上述PBFT三阶段的过程实现。如图5所示,包括:
S110:在PBFT的commit阶段,每一共识节点基于门限签名算法,采用自身私钥份额对包含本次共识中原始交易列表特有值的原始报文进行签名,生成签名份额,并将该签名份额加入到广播的commit消息中。
门限签名是普通数字签名的一个重要分支,是门限秘密分享技术和数字签名的一种结合。常用的门限签名算法,可以包括基于RSA的门限签名算法、基于ECDSA的门限签名算法、基于Schnorr的门限签名算法、基于BLS的门限签名算法等。例如RSA门限签名方案,基于传统的RSA算法实现。
RSA算法是一种非对称加密算法,由罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)于1977年一起提出。RSA算法可以在不直接传递密钥的情况下完成解密,这能够确保信息的安全性的同时,避免直接传递密钥所造成的信息被破解的风险。RSA中包括私钥和公钥,这个私钥和公钥是成对。一个信息由公钥加密后,只能由对应的私钥解密;类似的,一个信息由私钥加密后,只能由对应的公钥解密。之所以具有这样的性质,是因为成对的私钥和公钥之间在数学原理上具有相关性,例如一种底层原理是根据数论,寻求两个大素数比较简单,而将它们的乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥,从而可以保证安全性。私钥通常要严格保密,不能泄露,而公钥是公开的(且可以由多人持有)。由于私钥是由持有者严格保密的,其他人在无法获得私钥的前提下,就无法伪造私钥持有者的签名。
RSA签名机制,可以保证报文传递过程中的完整性。例如节点A需要将报文传送至节点B,且中间可能经过若干个节点的中转。则A可以采用RSA签名机制,将报文连同签名一并经由若干个中间节点传送至B,而B对签名的验证可以确信收到的报文是A发出的,且在传送过程中没有经过篡改。一种RSA签名的过程如下:
b1:A生成一对密钥(公钥和私钥),私钥不公开,自己保留。公钥为公开的,任何人可以获取。
b2:A用自己的私钥对原始报文的hash值进行签名,并将原始报文和签名结果一并传递给B。如前所述,这个传递过程可能经过若干个中间节点的转发。
hash算法也称为散列算法,可以将原始内容映射为一个固定长度的序列,这个序列即为hash值。一般有sha256,sha384,sha512等hash算法。sha256的结果是256个bits,可以表示2的256次方个原始内容。类似的,sha384的结果是384bits,sha512的结果是512bits。这些hash算法,可以针对内容较多体积较大的原始内容,因而hash值相对来说可以比原始内容小很多。好的hash算法可以确保不同原始内容有极大概率映射为不同的hash值,同时这种映射是杂乱无章的,即无法预测不同的原始内容得到的hash值的关联性;而且也是抗逆运算的,即无法由hash值倒推得到原始内容。
原始报文可能内容较多,体积较大,采用私钥直接对原始报文进行签名计算可能比较费时和耗费算力。因此,可以将原始报文采用一种hash算法计算到一个hash值,这样这个hash值长度较小,又可以完全代表原始报文。进而,采用私钥对这个hash值进行加密计算,得到的结果即为签名。
b3:B收到消息后,采用A的公钥进行验签。
一方面,B可以采用与A相同的hash算法来计算原始报文的hash值,计为hash1;另一方面,B采用A的公钥对签名结果进行解密计算,得到hash2。如果hash1与hash2相同,则可以确定收到的原始报文是A发出的,且在传送过程中没有被篡改过。
门限签名方案,首先是包括1个总公钥和n个公私钥对。每个公私钥对中的1个公钥称为公钥份额,每个公私钥对中的1个私钥称为私钥份额。其次,存在与这个总公钥和n个公私钥对对应的恢复函数,该恢复函数可以将至少门限数量个不同私钥份额签名的签名份额恢复成一个完整签名,这个生成的完整签名也可以由所述的那1个总公钥来验证正确性。而任意少于门限数量的签名份额则无法恢复生成该完整签名。
除了可以采用基于RSA的门限签名机制外,还可以采用基于ECDSA((EllipticCurve Digital Signature Algorithm,椭圆曲线数字签名算法)的门限签名机制、基于Schnorr(一种基于离散对数难题的知识证明机制)的门限签名机制、基于BLS(Boneh-Lynn-Shacham Signature)的门限签名机制等。
需要说明的是,在区块链中所采用的门限签名,私钥份额的个数可以等于共识节点的个数,恢复函数产生完整签名的最少签名份额的个数(即门限数量)可以等于PBFT算法中的quorum。当然,私钥的个数也可以不等于共识节点的个数,恢复函数产生完整签名的最少签名份额的个数可以不等于PBFT算法中的quorum。以下以前者为例说明。
所述1个总公钥和n个公私钥对,可以由一个中心化的dealer生成,并分发给n个区块链共识节点,这种属于中心化的密钥分配方式。这样,结合共识算法,n个私钥份额可以是每个区块链共识节点持有其中一个。同时,每个区块链共识节点可以持有相同的1个总公钥。此外,还存在去中心化的密钥分配方式,即取消dealer,而是由n个共识节点通过密钥协商过程协商得到成对的n个公私钥对和1个总公钥,仍然是每个共识节点单独持有n个私钥份额中的一个,且各共识节点持有同一个总公钥。
采用门限签名算法,每一共识节点都可以采用自身特有的那一份私钥(例如包含4个节点且采用PBFT作为共识算法的区块链网络中,节点0、节点1、节点2、节点3采用门限签名算法所持有的私钥份额分别是sk0,sk1,sk2,sk3,下标数字可以表示节点的编号)对包含本次共识中原始交易列表特有值的原始报文进行签名,得到签名结果。这里,原始交易列表的特有值可以作为签名所针对的原始报文。
原始交易列表的特有值,可以包括原始交易列表本身或者原始交易列表的hash值。一般来说,不同的交易,交易内容是不同的,这样,不同的原始交易列表或其hash值一般都不相同。因此,原始报文中可以至少包括原始交易列表或其hash值,这样由hash函数的性质,足以区分不同区块对应的共识过程完毕后所生成的随机数种子。
考虑到共识过程中会为本次共识的内容生成一个编号,如果共识完成,生成的编号可以作为本次共识所对应的区块的区块号,因此,区块号(也就是编号)也可以作为原始报文中的内容。不论第N+1个区块中所包含的原始交易列表与第N个区块中所包含的原始交易表是否相同,区块生成是顺序的,可以体现为后一区块的区块号是前一区块的区块号+1。因此,区块号作为原始报文中的内容,即使第N+1个区块中所包含的原始交易列表与第N个区块中所包含的原始交易表相同,仍然由各个节点采用自身私钥基于(原始交易列表+区块号)得到不同的签名,主节点仍然无法获知其它节点的签名,从而无法预测第N+1号区块的完整签名,因此主节点无法使用第N号块已公开的随机数种子来预测第N+1号块的随机数种子,达到了不可预测的目的。与编号类似的,时间戳也是一个区块特有的,且后一区块的时间戳在前一区块之后。因此,时间戳也可以作为原始报文中的内容。
除了原始交易列表的特有值之外,签名的对象还可以加入其它内容,例如上一区块中产生的随机数种子,即原始报文中还可以包括上一区块中产生的随机数种子。前述a140执行之后,如前所述,各个节点可以各自以共识的交易数据为基础,生成第m个区块。由于第m个区块是各个节点在本地各自独立生成的,因此,如果区块链节点之间没有相互广播自身生成的上一区块的hash值并比对,各个节点可能都无法确定区块链网络中生成的第m个区块是否相同,或者从区块链系统整体可用的角度来说是否有至少quorum数量的共识节点上生成的第m个区块是相同的。经过本申请中随机数种子的生成过程,相同区块的随机数种子应当是相同的,不同区块中的随机数种子应当是不同的,因此可以将随机数种子加入到原始报文中。这样,如果各个节点各自生成的第m个区块对应的随机数种子有所不同,根据门限签名算法的性质,可能无法在第m+1号区块的产生随机数种子的过程中通过恢复函数得出完整签名,从而可以根据本申请的方案帮助共识节点确认上一区块是否一致。也可采用上一区块的hash值来代替上一区块的随机数种子,由于一个区块的hash值一般是唯一的,因此也可以帮助共识节点确认上一区块是否一致。
采用自身私钥份额对包含本次共识中原始交易列表特有值的原始报文进行签名,这个原始报文里可以包括的原始交易列表的特有值,可以是原始交易列表。一般在PBFT的PP阶段已经广播过原始交易列表,且C阶段广播的commit消息较小的话更利于传播及节省带宽,因此原始交易列表特有值可以是原始交易列表的hash值。
对于原始报文包括多个内容,例如包括原始交易列表hash值、区块号、上一区块中产生的随机数种子的情况下,可以先计算原始报文的hash值,进而采用私钥份额对该原始报文hash值进行签名,得到签名结果。
对原始报文进行签名,生成的签名结果和原始报文可以一并加入到广播的commit消息中。这样,在commit阶段,参与共识的节点中的每一个都发送commit消息给其他的共识节点,并将自己发送的commit消息添加到本地Log中(代表自己的认可),而且,每一节点还接收其他节点广播的commit消息。
S120:每一共识节点收集齐至少门限数量的commit消息后,将通过验证的至少门限数量的签名份额经过所述门限签名算法产生的私钥份额所对应的恢复函数得到完整签名。
如前所述,门限签名算法在应用中,可以产生成对的1个总公钥和n个公私钥对,并可以产生该n个公私钥对所对应的恢复函数。前述提到,该恢复函数可以将验证正确的至少门限个签名恢复生成一个完整签名,门限签名算法的门限值即门限数量可以设为w。当然,正确的签名多于w个时也可以通过该恢复函数生成一个完整签名。也就是说,正确的签名大于等于门限数量w时,都可以通过该恢复函数生成一个完整签名,且生成的这个完整签名是确定的,不会因为输入的正确签名的个数而发生变化(只要大于等于w)。
这个生成的完整签名可以由所述的那1个总公钥来验证正确性。这样,任何持有这个总公钥的节点都可以采用该总公钥来验证这个完整签名的正确性。例如,节点1生成完整签名后,可以采用总公钥验证该完整签名的完整性,例如采用总公钥对完整签名进行密码学运算得到第一hash,并对原始报文进行hash运算得到第二hash,如果第一hash与第二hash一致则可以确定该完整签名的完整性。所述完整性包括该完整签名是针对所述原始报文的,且该原始报文没有经过篡改。再例如,节点1生成完整签名后,可以将该完整签名、总公钥和原始报文发送至区块链以外的一个设备,该设备可以采用所述总公钥和原始报文验证这个完整签名的正确性,原理同上不再赘述。这里的报文原文仍然是前述的包含本次共识中原始交易列表特有值的内容,或还包括当前区块的区块号和/或时间戳和/或上一区块中产生的随机数种子。
此外,也可以是每一共识节点收集每一commit消息后,采用对应的公钥份额对所述接收到的commit消息中的签名份额进行验证,然后再将所述至少门限数量的签名份额经过所述门限签名算法产生的私钥份额所对应的恢复函数得到完整签名。相对于采用总公钥对生成的完整签名进行验证的方式,采用公钥份额对每一签名份额进行验证,验证通过后再经恢复函数恢复为完整签名的方式,能够确定哪个签名是错误的,从而能够确定哪个节点可能是作恶节点。
门限签名算法中,每个共识节点都具有1个总公钥和n个公私钥对中的1个私钥份额和对应的1个公钥份额,如前所述,可以是由dealer生成并分发的,也可以是各共识节点协商得到的。
每个共识节点可以采用对应的公钥份额对接收到的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数量。
进而,节点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值,记为hash3,1;节点0还可以对原始报文进行同样的hash计算得到hash′3,1。如果hash3,1与hash′3,1相等,可以证明原始报文是节点1发出的,且在传送过程中没有被篡改过。这样,σ3,1的正确性得到验证。类似的,节点0可以对σ3,2等进行验证,不再赘述。
同样的,节点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)的正确性。
同样的,节点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)的正确性。
同样的,节点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)的正确性。
S130:每一共识节点基于所述完整签名得到随机数种子。
随机数种子(random seed),是指在伪随机数生成器中用于生成伪随机数的初始数值。对于一个伪随机数生成器,从相同的随机数种子出发,可以得到相同的随机数序列。对于单机来说,随机数种子可以由当前计算机的状态确定,如当前的时间。而对于分布式系统来说,要在各个节点上产生相同的随机数种子,以在系统合约/业务合约/区块链平台功能等中基于相同的随机数种子产生相同的随机数,且不应由任一节点以其可操控的、可预测的、可撤销的方式产生随机数。这就需要由参与共识的节点共同确定。而且,考虑到分布式网络往往是异步网络或半同步网络,从即时性出发,还需要在当前区块中的交易执行时即可以产生随机数并采用。
经过上述S110-S120的步骤,正常情况下每个共识节点都可以得到相同的完整签名。当然,考虑到分布式系统的容错特性,在采用PBFT共识算法的区块链网络中至少应当有quorum数量的共识节点各自都可以分别得到相同的完整签名。
这样,基于完整签名,各共识节点可以采用相同的随机数种子生成算法生成随机数种子。一种较为简单的随机数种子生成算法例如是sha256算法。当然,也可以直接将完整签名作为随机数种子。
经过上述过程,即可在区块链上产生随机数种子。
这样,区块链节点在执行当前共识完毕后输出共识结果的过程中,即执行确定了内容和顺序的一系列交易的过程中,如果其中包含需要使用随机数的智能合约/系统合约/区块链平台代码,可以基于S130的随机数种子来执行。例如,在C++语言编写的智能合约中,可以采用C++标准库或boost库提供的mt19937(r)方法来构造一个跨平台一致的随机数引擎,其中的参数r即为随机数种子。类似的,python中的random库,java中的random库,也都提供了类似的随机数生成方法。基于相同的随机数种子,在相同的随机数生成算法下可以生成相同的随机数。这样,例如各个区块链节点各自分别执行相同区块中的相同交易时,对于其中相同的随机数生成过程,可以基于相同随机数种子产生相同的随机数,从而完成诸如摇号、发红包、盲盒之类的业务逻辑,或完成系统合约/区块链平台功能,并在各个节点上得到一致的执行结果。
此外,在上述方案基础上,还可以包括如下步骤:
S140:每一共识节点将得到的随机数种子放至在生成的当前区块的区块头中。
由图6所示的结构中,本申请可以在区块头中增加一个字段——“随机数种子”,即S130中的随机数种子。这样,本区块产生的随机数种子,可以记录在区块链账本上,此外,对于回放区块来说,可以按照区块头中的随机数种子来回放区块中涉及随机数的交易。
本申请提供的上述方案,将门限签名算法与PBFT共识算法相结合,使得对应每个区块的原始交易列表在通过PBFT算法达成共识后,即可通过采用的门限签名算法得到完整签名,从而得到随机数种子,在执行本区块对应的原始交易列表中的交易的过程中,即可以采用随机数,这样,执行本区块的交易不需要额外的等待。
本申请提供的上述方案,基于门限签名算法的性质,各共识节点各自分别基于至少门限数量的签名份额通过恢复函数可以恢复出相同的完整签名,进而生成相同的随机数种子,从而,各个区块链节点各自分别执行相同区块中的相同交易时,对于其中相同的随机数生成过程可以基于相同随机数种子产生相同的随机数,从而完成诸如摇号、发红包、盲盒之类的业务逻辑,或完成系统合约/区块链平台功能,并在各个节点上得到一致的执行结果。
本申请提供的上述方案,将门限签名算法与PBFT共识算法相结合,使得任一共识节点在共识完成前无法预测完整签名,即使是PBFT的主节点也无法预测完整签名,也就无法预测随机数种子和随机数。特别是当门限=quorum时,一旦完成共识,由于quorum数量的节点对交易列表的内容和顺序已达成一致,即生成新区块的基础内容已经确定,这时至少quorum数量的节点根据恢复函数得到的完整签名是相同的,这quorum数量的节点生成的随机数种子也必然相同,即使有不超过f个节点作恶而想要控制或撤销得到的随机数种子,这f个节点也不会影响系统的一致性,即这f个节点不可操控或撤销生成的完整签名、随机数种子和随机数。
本申请中的方法,可以在每一区块生成的过程中实施,这样,每一区块的区块头中都可以包括随机数种子这一字段。即使某一区块的区块体中并不包含涉及随机数的交易,该区块的生成过程中仍然可以包含生成随机数种子的过程。
前面提到,门限签名算法可以采用基于RSA的门限签名机制,基于ECDSA的门限签名机制、基于Schnorr的门限签名机制或基于BLS的门限签名机制等。采用的门限签名算法中,一般都需要生成1个总公钥和n个公私钥对。一种典型且简洁的实现中,私钥份额的个数可以等于共识节点的个数,每个共识节点持有其中一个私钥,也即一个私钥份额。这样,每一共识节点基于门限签名算法,采用自身私钥份额对原始报文进行签名以生成签名份额。恢复函数产生完整签名的最少个数即门限数量w可以等于PBFT算法中的quorum,也就是至少w个签名份额可以由对应的恢复函数生成一个确定的完整签名,而不论是n个签名份额中的至少哪w个,只要这至少w个签名是采用各自正确的私钥份额对同一原始报文所做的签名。
为了在区块链的共识节点上实现门限签名算法,需要通过一种机制使得n个共识节点分别具有1个私钥份额和对应的1个公钥份额,且都具有同一个总公钥。前述提到,可以由一个中心化的dealer生成,并分发给n个区块链共识节点,这种属于中心化的密钥分配方式。这种中心化的密钥分配方式,需要借助第三方dealer,则要求这个dealer不会作恶。例如前述提到的DKG协议的实现,原理上需要生成一个t次多项式,然后根据这个多项式形成的曲线,在上面取出n个点,通过这n个点生成n个私钥份额,并分给n个阈值签名的参与者。这个过程如果放在一个dealer上进行,那么如果这个dealer作恶,则这个dealer可以获取所有n个参与者的私钥份额,不符合区块链系统的安全要求。
此外,还存在去中心化的密钥生成和分配方式,即取消dealer,而是由n个共识节点通过密钥协商过程协商得到n个公私钥对和1个总公钥,仍然是每个共识节点单独持有n个私钥份额中的一个,且各共识节点持有同一个总公钥。上述这种方式,传统的是在区块链之外实现,并且依赖网络同步。区块链上的节点在构成分布式网络,而分布式网络一般是半同步或者异步的。因此,在区块链之外实现分布式网络各节点之间的密钥生成和分配,是不可靠的。而实现可靠的分布式密钥协议,又是区块链上生成随机数种子的重要前提。
前述提到的PBFT协议属于半同步(partial synchronous)协议,其特点是假设网络一开始是异步的,但是能够从某一时刻开始同步。要在网络中让不同节点对同一提议达成共识,最简便的方式是设置主节点,由主节点来统一各个节点的意见。通过设置定时器,可以防止主节点出错。PBFT中,如果在有限时间内没有完成Normal Case Phase,会触发Backups发起View Change Phase,以更换主节点。PBFT将主节点固定在一个位置,所有请求都可以先发送到主节点,再由主节点广播到其他共识节点。与此相对的,HoneyBadgerBFT(也常简称为HBBFT)算法属于一种异步(asynchronous)协议。异步协议适用于异步网络,也就是这个网络中节点间的消息可以被任意延迟,但最终会到达。HoneyBadgerBFT中去掉了定时器,而是通过消息来驱动协议的执行。同时,HoneyBadgerBFT算法中所有节点都是对等的,没有主节点和备份节点之分,也就没有换主的过程。HBBFT等异步网络共识协议无主节点的概念,各节点都可提议请求,尝试构造区块,因此异步网络协议在一定程度上缓解了公平性和单节点瓶颈的问题。
例如为中国专利ZL202111175184.1、ZL202111178795.1、ZL202111178745.3、ZL202111178754.2、ZL202111175144.7、ZL202111175151.7以及中国专利申请CN202111178779.2,都考虑了区块链网络的半同步或异步网络的特性的前提下提出了新的共识算法。
通过区块链网络中的各种共识机制,可以保障区块链网络的整体一致性和同步。对于后者,只要区块链能够持续的出块,就能实现区块的同步。那么,结合区块链实现分布式密钥生成将是可靠的。
以下介绍本申请一种区块链上实现分布式密钥生成的方法,如图7所示,包括:
S310:每一共识节点生成一组特有的n个秘密份额,自身保留一个,并将其中n-1个秘密份额分别加密发送至其它n-1个节点。
DKG算法中对节点重新进行了编号,从1开始。这里为了与DKG算法一致,也将共识节点从1开始编号。
椭圆曲线(Elliptic Curve Cryptography,ECC)加密算法是一种公钥加密技术,以椭圆曲线理论为基础。利用有限域上椭圆曲线的点构成的阿贝尔(Abel)群离散对数难解性,实现加密、解密和数字签名。以下以椭圆曲线为例进行说明。每一个节点可以在群Zq上随机选择一个t度多项式。N次多项式函数由N+1个点唯一决定,因为最终需要区块链网络中quorum个共识节点能够恢复签名,则quorum=N+1,因此多项式的次数t为quorum-1。这样,可以实现由quorum(quorum=t+1)个签名份额经恢复函数恢复得到一个完整签名。当然,也可以将t设置为其它数值。用该多项式构建的椭圆曲线可以如下表示:
fi(z)=ai0+ai1z+ai2z2+…+aitzt 公式(1)
公式(1)中,ai0,ai1,ai2,ai3,...,ait为多项式的系数,通过这一组系数可以确定一个多项式。
当区块链网络的共识节点数量n设置为4时,采用PBFT、HBBFT之类算法的quorum为3的情况下,这时t=2。这时,这个多项式为:
fi(z)=ai0+ai1z+ai2z2 公式(2)
节点1可以从一个有限素数域中随机选择一组数作为系数,即作为a10,a11,a12,则生成的多项式为:f1(z)=a10+a11z+a12z2
类似的,节点2可以从同一有限素数域中随机选择一组数作为系数,即作为a20,a21,a22,则生成的多项式为:f2(z)=a20+a21z+a22z2
类似的,节点3可以从同一有限素数域中随机选择一组数作为系数,即作为a30,a31,a32,则生成的多项式为:f3(z)=a30+a31z+a32z2
类似的,节点4可以从同一有限素数域中随机选择一组数作为系数,即作为a40,a41,a42,则生成的多项式为:f4(z)=a40+a41z+a42z2
每个节点基于确定的多项式,可以进一步确定一组秘密份额。可以根据如下公式由多项式系数确定秘密份额:
sij=fi(j)mod q(j=1,…,n) 公式(3)
公式(3)中,q是每个节点采用的相同的一个大数,对fi(j)用q取模的目的是将fi(j)的值限定在[0,q-1]的范围内。例如:
共识节点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个秘密份额。下同。
共识节点2生成4个秘密份额,分别为S21=f2(1)mod q,S22=f2(2)mod q,S23=f2(3)mod q,S24=f2(4)mod q。
共识节点3生成4个秘密份额,分别为S31=f3(1)mod q,S32=f3(2)mod q,S33=f3(3)mod q,S34=f3(4)mod q。
共识节点4生成4个秘密份额,分别为S41=f4(1)mod q,S42=f4(2)mod q,S43=f4(3)mod q,S44=f4(4)mod q。
进而,每个节点除了保留一份秘密份额外,可以通过P2P网络与其它共识节点交换生成的其它秘密份额。具体可以如下:
共识节点1保留S11,将S12发送至节点2,将S13发送至节点3,将S14发送至节点4,可以通过区块链网络中底层的P2P(Peer to Peer,点对点)网络组件发送。发送出的秘密份额需要保密,共识节点1可以分别用接收方的公钥对待发送的秘密份额加密后再发送至接收方,或者通过TLS(Transport Layer Security,安全传输层协议)之类的安全连接发送至接收方。
共识节点2保留S22,将S21发送至节点1,将S23发送至节点3,将S24发送至节点4,可以通过区块链网络中底层的P2P网络组件发送。同样的,发送出的秘密份额需要保密,共识节点2可以分别用接收方的公钥对待发送的秘密份额加密后再发送至接收方,或者通过TLS之类的安全连接发送至接收方。
共识节点3保留S33,将S31发送至节点1,将S32发送至节点2,将S34发送至节点4,可以通过区块链网络中底层的P2P网络组件发送。同样的,发送出的秘密份额需要保密,共识节点3可以分别用接收方的公钥对待发送的秘密份额加密后再发送至接收方,或者通过TLS之类的安全连接发送至接收方。
共识节点4保留S44,将S41发送至节点1,将S42发送至节点2,将S43发送至节点3,可以通过区块链网络中底层的P2P网络组件发送。同样的,发送出的秘密份额需要保密,共识节点4可以分别用接收方的公钥对待发送的秘密份额加密后再发送至接收方,或者通过TLS之类的安全连接发送至接收方。
可见秘密份额的下标中的两个数字,左边的可以表示发出秘密份额的节点的编号,右边的可以表示接收秘密份额的节点。这样:
共识节点1本地具有不同节点生成的秘密份额S11、S21、S31、S41
共识节点2本地具有不同节点生成的秘密份额S12、S22、S32、S42
共识节点3本地具有不同节点生成的秘密份额S13、S23、S33、S43
共识节点4本地具有不同节点生成的秘密份额S14、S24、S34、S44
其中,共识节点1本地具有的S11是自己生成的,共识节点2本地具有的S22是自己生成的,共识节点3本地具有的S33是自己生成的,共识节点4本地具有的S44是自己生成的。
共识节点最好是对待发出的秘密份额进行签名,例如用自身私钥签名,或者采用MAC(Message Authentication Code,消息验证码),从而保证消息完整性,避免中间人攻击。相应的,接收到秘密份额的节点可以验证签名的正确性。
S320:每一节点生成自身秘密份额对应的公共验证参数并通过链上合约广播;所述链上合约将请求广播的节点的编号加入第一节点集合。
每一共识节点可以生成自身密钥份额对应的一组验证参数,生成方法可以采用下面公式:
Figure BDA0003918794290000271
公式(4)中,g是椭圆曲线上的基点。根据椭圆曲线的运算性质,g的幂次方也是椭圆曲线上的一个点。t是多项式的次数,一般设置为(quorum-1)。如前所述,如果要最终实现在从n个签名份额中取任意w个即可通过恢复函数生成一个完整签名,这里需要设置多项式的次数是t,其中t=w-1。下同。
基于上述公式(4),设t=2,共识节点1生成的一组验证参数为<A10,A11,A12>,通过链上合约广播这一组验证参数。类似的,基于上述公式,共识节点2生成的一组验证参数为<A20,A21,A22>,通过链上合约广播这一组验证参数。类似的,基于上述公式,共识节点3生成的一组验证参数为<A30,A31,A32>,通过链上合约广播这一组验证参数。类似的,基于上述公式,共识节点4生成的一组验证参数为<A40,A41,A42>,通过链上合约广播这一组验证参数。
基于密码学的性质,Aik公布出去,也不会倒推得到aik,因此即使从链上获得公布的Aik,也不能得到S310中的多项式。
通过链上合约广播,具体的,可以由各个节点以自身私钥签名一笔交易发到区块链上。每个节点可以内置区块链SDK(Software Development kit,软件开发工具包)。SDK是一系列程序接口、文档、范例、开发工具等的集合。通过内置SDK,区块链节点可以像区块链客户端一样向区块链网络发起交易。区块链节点用自身私钥签名发出的交易中,可以包含对区块链上的智能合约的调用。被调用的合约,例如是DKG合约。这个DKG合约可以是系统级的合约,即是预先部署在区块链上的合约,例如由具有系统管理员权限的账户创建的合约,起到系统级的控制功能,而非由用户自行开发并部署的实现某种具体的业务逻辑的合约。
像其它合约一样,DKG合约可以在虚拟机(例如Ethereum Virtual Machine,EVM)中执行,当然也可以是在容器(例如docker)中执行,这里并不限定。外部账户向区块链发起一笔调用链上合约的交易,可以触发该合约的执行。交易的内容例如包括from字段、to字段、value字段、data字段。from字段可以是交易发起方的账户地址,to字段可以代表被调用的智能合约的地址,value字段可以是区块链上原生的通证(例如在以太坊中是以太币的值),data字段可以包含的调用智能合约的方法和参数。通过在to字段指明调用的智能合约的地址,可以表明是对区块链上某个智能合约的调用。智能合约中一般可以包括一个或多个函数,每个函数可以包括一些输入的参数。交易中通过data字段可以指明所要调用的智能合约中的某个函数,并在data字段中填入需要传入的参数。
合约执行的结果,一方面可以改变合约的存储,即合约的世界状态,另一方面,该交易的执行结果或相关信息可以记录在区块链的收据(receipt)中。具体的,合约执行结果/相关信息可以表现为收据中的事件(event)。事件的结构例如为如下格式:
Event:
[topic][msg]
[topic][msg]
......
在上述示例中,事件的数量可以为一个或多个。每个事件可以包括主题(topic)和数据(data)等字段。交易执行时输出的事件的格式,可以在合约中指定。通过内置的SDK,区块链客户端或区块链节点可以监听特定topic的事件,并在监听到特定topic事件的情况下,拉取相应的msg的内容,以及可以监听到特定topic或对应msg中的某些内容后执行预设的处理。
通过这种事件机制中,节点可以将执行结果存放到某个topic对应的msg中,从而监听该topic的监听方(即内置区块链SDK的客户端或区块链节点)可以获得相应的执行结果。S320中,可以是某一节点将生成的所述公共验证参数通过发起调用DKG合约中第一函数(例如名为Broadcast的函数,其中该函数可以包括参数,参数可以包括公共验证参数)的方式传入区块链网络,区块链网络执行该交易的一个结果是将所述公共验证参数置入收据中特定topic对应的msg中。从而监听该topic的节点可以获取msg字段中的内容,即获得所述公共验证参数。这样,即完成了链上合约广播。
可以通过SDK向区块链节点注册要监听事件。具体的,区块链节点可以在运行的区块链平台代码中对生成的事件绑定一个钩子函数(钩子函数可以与平台代码一同在开发阶段编辑完成)。这个钩子函数属于一种回调函数,其可以在监听的事件发生时被调用,并可以执行一定的处理逻辑。监听代码例如可以包括监听区块链交易的交易内容,智能合约的合约状态,合约产生的收据等一种或多种。通过SDK向区块链节点注册监听事件后,区块链节点可以保存监听事件与监听者(例如置入SDK并发起事件监听的客户端/节点的网络连接,一般可以包括IP地址、端口号等信息)的映射关系,例如保存监听某个合约的某个事件与监听者的映射关系。当钩子函数监听到对应的事件主题(topic)发生时,可以调用钩子函数,进而钩子函数可以查询所述映射关系,将监听的事件推送至所述网络连接。这样,发起监听的SDK可以通过保持的网络连接获得监听的事件。合约的执行也是通过类似方式的实现链上合约广播。具体的,合约的执行结果和本区块其它交易的执行结果一并存入区块链节点的一个交易结果缓存区。当该区块链的所有交易都执行完毕并组织成块后,区块链平台代码可以监听交易结果中的收据,从中将被监听的事件广播至发起监听的SDK。这里,通过这种监听机制,节点可以监听注册的特定topic事件,并在这样的事件发生时,通过保持的连接获取这个topic对应的msg,从而获得msg中的内容,这里msg中的内容包括公共验证参数。总之,可以通过区块链的事件机制实现广播公共验证参数,并通过事件监听机制实现对广播内容的接收。
这样,通过链上广播各节点生成的公共验证参数的结果可以如下:
共识节点1本地具有不同节点生成的秘密份额S11、S21、S31、S41,以及验证参数<A10,A11,A12>,并可以从链上获得公共验证参数<A20,A21,A22>,<A30,A31,A32>,<A40,A41,A42>;
共识节点2本地具有不同节点生成的秘密份额S12、S22、S32、S42,以及验证参数<A20,A21,A22>,并可以从链上获得公共验证参数<A10,A11,A12>,<A30,A31,A32>,<A40,A41,A42>;
共识节点3本地具有不同节点生成的秘密份额S13、S23、S33、S43,以及验证参数<A30,A31,A32>,并可以从链上获得公共验证参数<A10,A11,A12>,<A20,A21,A22>,<A40,A41,A42>;
共识节点4本地具有不同节点生成的秘密份额S14、S24、S34、S44,以及验证参数<A40,A41,A42>,并可以从链上获得公共验证参数<A10,A11,A12>,<A20,A21,A22>,<A30,A31,A32>。
前述提到,通过链上合约广播,具体的,可以由各个节点以自身私钥签名一笔交易发到区块链上,例如某一节点将生成的所述公共验证参数通过发起一笔交易而发送至区块链网络,这个交易例如调用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集合。
S330:每一共识节点对接收到的每一秘密份额和对应的公共验证参数进行验证,并将验证失败的节点编号通过投诉交易发送至所述合约;所述合约根据各共识节点发来的验证失败的节点编号和第一节点集合确定第二节点集合。
每一共识节点可以接收其它任一节点发来的秘密份额,并接收链上合约广播的公共验证参数。
前述S310中提到,每一共识节点生成n个秘密份额Sij,自己保留一份,并将其中n-1个秘密份额分别通过P2P网络组件并加密发送至其它n-1个节点。前述S320中提到,每一节点生成自身秘密份额对应的公共验证参数并通过链上合约广播。
如果每一节点发出的秘密份额和对应的公共验证参数是归属于同一个多项式的,则下面等式应当成立:
Figure BDA0003918794290000301
如前所述,t=quorum-1;n=4时,quorum=3,这时t=2。
基于公式(5)这样的性质,可以用该公式对接收到的每一秘密份额和公共验证参数进行验证。如果验证等式成立,说明秘密份额和对应的公共验证参数是归属于同一多项式,否则不归属于同一多项式。这样也可以检验生成秘密份额和对应公共验证参数的节点是否存在作恶行为。典型的作恶行为例如为节点根据第一个多项式生成了Sij,但是又以不同的多项式生成了Aik(k=0,...,t)。
上述验证,具体的:
j=1时,即共识节点1可以验证以下内容:
i=1:
Figure BDA0003918794290000311
(事实上,共识节点1可以不验证这个等式是否成立,因为秘密份额S11和验证参数<A11,A12,A13>都是自身生成的)
i=2:
Figure BDA0003918794290000312
i=3:
Figure BDA0003918794290000313
i=4:
Figure BDA0003918794290000314
如果i=2对应的等式不成立,则共识节点1可以将该验证不通过的节点编号2发送至DKG合约。类似的,如果i=2、3对应的等式不成立,则共识节点1可以将该验证不通过的节点编号2、3发送至DKG合约。类似的,如果i=2、3、4对应的等式不成立,则共识节点1可以将该验证不通过的节点编号2、3、4发送至DKG合约。
j=2时,即共识节点2可以验证以下内容:
i=1:
Figure BDA0003918794290000315
i=2:
Figure BDA0003918794290000316
(事实上,共识节点2可以不验证这个等式是否成立,因为秘密份额S22和验证参数<A20,A21,A22>都是自身生成的)
i=3:
Figure BDA0003918794290000317
i=4:
Figure BDA0003918794290000318
如果i=1对应的等式不成立,则共识节点2可以将该验证不通过的节点编号1发送至DKG合约。类似的,如果i=1、3对应的等式不成立,则共识节点2可以将该验证不通过的节点编号1、3发送至DKG合约。类似的,如果i=1、3、4对应的等式不成立,则共识节点2可以将该验证不通过的节点编号1、3、4发送至DKG合约。
j=3时,即共识节点3可以验证以下内容:
i=1:
Figure BDA0003918794290000319
i=2:
Figure BDA00039187942900003110
i=3:
Figure BDA0003918794290000321
(事实上,共识节点3可以不验证这个等式是否成立,因为秘密份额S33和验证参数<A30,A31,A32>都是自身生成的)
i=4:
Figure BDA0003918794290000322
如果i=1对应的等式不成立,则共识节点3可以将该验证不通过的节点编号1发送至DKG合约。类似的,如果i=1、2对应的等式不成立,则共识节点3可以将该验证不通过的节点编号1、2发送至DKG合约。类似的,如果i=1、2、4对应的等式不成立,则共识节点3可以将该验证不通过的节点编号1、2、4发送至DKG合约。
j=4时,即共识节点4可以验证以下内容:
i=1:
Figure BDA0003918794290000323
i=2:
Figure BDA0003918794290000324
i=3:
Figure BDA0003918794290000325
i=4:
Figure BDA0003918794290000326
(事实上,共识节点4可以不验证这个等式是否成立,因为秘密份额S44和验证参数<A40,A41,A42>都是自身生成的)
如果i=1对应的等式不成立,则共识节点4可以将该验证不通过的节点编号1发送至DKG合约。类似的,如果i=1、2对应的等式不成立,则共识节点4可以将该验证不通过的节点编号1、2发送至DKG合约。类似的,如果i=1、2、3对应的等式不成立,则共识节点4可以将该验证不通过的节点编号1、2、3发送至DKG合约。
可以由各个节点以自身私钥签名一笔交易发到区块链上,例如某一节点将验证失败的节点编号通过发起一笔交易而发送至区块链网络,这个交易例如是投诉交易,其可以调用DKG合约中Confirm(r)这一函数,其中该函数可以包括参数r,r可以包括投诉交易中的节点提交的验证失败的节点编号。
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。
需要说明的是,在区块链网络中,由于半同步或异步的网络特性,合约的执行并不一定是在同一个区块中执行的,而是可能在不同的区块中分别执行一部分。这种情况,一般可以在合约中设置状态机,从而在执行完一部分的情况下转变状态机的状态,或直至状态机转变为某种最终状态。状态机执行的每一步,可以是在接收到一个交易后执行并触发的。因此,本步骤中DKG合约确定节点的集合,可能会延续多个区块。
S340:每一共识节点各自基于验证参数及第二节点集合计算公钥份额,并基于本地的秘密份额和第二节点集合计算自身对应的私钥份额。
一方面,每一共识节点各自可以在本地基于验证参数及第二节点集合计算公钥份额,可以按照下面公式计算该公钥份额:
Figure BDA0003918794290000331
另一方面,每一共识节点各自基于本地的秘密份额和第二节点集合计算自身对应的私钥份额,可以按照下面公式计算:
xj=∑i∈QUAL sij mod q 公式(7)
例如,共识节点1在本地计算自身的私钥份额:
Figure BDA0003918794290000332
共识节点2在本地计算自身的私钥份额:
Figure BDA0003918794290000333
共识节点3在本地计算自身的私钥份额:
Figure BDA0003918794290000334
共识节点4在本地计算自身的私钥份额:
Figure BDA0003918794290000335
可见,节点1、节点2、节点3和节点4计算得到的私钥份额不相同。
再一方面,每一共识节点各自可以在本地基于验证参数及第二节点集合计算总公钥,可以按照下面公式计算该总公钥:
y=Πi∈QUAL yi 公式(7)
其中,yi=Ai0
这样,例如共识节点1计算总公钥可以是:
y=y1*y2*y3*y4=A10*A20*A30*A40
类似的,例如共识节点2计算总公钥可以是:
y=y1*y2*y3*y4=A10*A20*A30*A40
类似的,例如共识节点3计算总公钥可以是:
y=y1*y2*y3*y4=A10*A20*A30*A40
类似的,例如共识节点4计算总公钥可以是:
y=y1*y2*y3*y4=A10*A20*A30*A40
可见,节点1、节点2、节点3和节点4计算得到的总公钥相同,即通过上述方法,各节点获得相同的总公钥。
上述私钥份额x1与公钥份额pub1对应,私钥份额x2与公钥份额pub2对应,私钥份额x3与公钥份额pub3对应,私钥份额x4与公钥份额pub4对应。如前所述,每一公钥份额,可以对对应私钥份额所做的签名份额进行验证。而且,至少quorum个私钥份额产生的签名份额经恢复函数恢复出的一个完整签名,可以由对应的那1个总公钥进行验证。
再例如,第二节点集合为:{1,2,3},共识节点1计算的公钥份额可以是:
Figure BDA0003918794290000341
类似的,例如共识节点2计算的公钥份额可以是:
Figure BDA0003918794290000342
类似的,例如共识节点3计算的公钥份额可以是:
Figure BDA0003918794290000343
可见,假设第4节点作恶,其秘密份额和对应公共验证参数并没有按照相同的多项式生成,因而被至少一个节点验证失败并发起投诉,则第二节点集合中不包括该节点4,那么至少第1、2、3节点计算公钥份额的过程中并不会依据节点4生成的公共验证参数,而是依据第二节点集合中节点1、2、3生成的公共验证参数。
每一共识节点各自基于本地的秘密份额和第二节点集合计算自身对应的私钥份额。
例如,共识节点1在本地计算自身的私钥份额:
Figure BDA0003918794290000351
共识节点2在本地计算自身的私钥份额:
Figure BDA0003918794290000352
共识节点3在本地计算自身的私钥份额:
Figure BDA0003918794290000353
共识节点4在本地计算自身的私钥份额:
Figure BDA0003918794290000354
可见,假设第4节点作恶,其秘密份额和对应公共验证参数并没有按照相同的多项式生成,因而被至少一个节点验证失败并发起投诉,则第二节点集合中不包括该节点4,那么至少第1、2、3节点计算私钥份额的过程中并不会依据节点4生成的秘密份额,而是依据第二节点集合中节点1、2、3生成的秘密份额。而且,至少节点1、节点2、节点3计算得到的私钥份额不相同。
每一共识节点各自可以在本地基于验证参数及第二节点集合计算总公钥。
这样,例如共识节点1计算总公钥可以是:
y=y1*y2*y3=A10*A20*A30
类似的,例如共识节点2计算总公钥可以是:
y=y1*y2*y3=A10*A20*A30
类似的,例如共识节点3计算总公钥可以是:
y=y1*y2*y3=A10*A20*A30
类似的,例如共识节点4计算总公钥可以是:
y=y1*y2*y3=A10*A20*A30
可见,假设第4节点作恶,其秘密份额和对应公共验证参数并没有按照相同的多项式生成,因而被至少一个节点验证失败并发起投诉,则第二节点集合中不包括该节点4,那么至少第1、2、3节点计算总公钥的过程中并不会依据节点4生成的公共验证参数,而是依据第二节点集合中节点1、2、3生成的公共验证参数。而且,至少节点1、节点2、节点3计算得到的总公钥相同,即通过上述方法,至少诚实节点获得相同的总公钥。
由此,对于总数量为n的共识节点中,采用门限签名算法,期望m个签名份额中任意至少w个签名份额可以恢复得到完整签名的情况下,如果没有作恶节点,即秘密份额和对应公共验证参数是按照相同的多项式生成,此时n可以等于m。如果存在作恶节点,例如有b个作恶节点,则此时m=n-b,而w保持不变,但m需要确保不小于w,否则门限签名算法失效。
前述S330中提到,每一共识节点对接收到的每一秘密份额和对应的公共验证参数进行验证,验证失败的,可以由验证节点以自身私钥签名一笔投诉交易发到区块链上。具体的,该交易可以调用DKG合约中Confirm(r)这一函数,其中该函数可以包括参数r,r可以包括投诉交易中的节点提交的验证失败的节点编号。例如节点j接收到节点i在S310中加密发送的秘密份额Sij,接收节点j对i发送的Sij利用公式(5)进行验证。典型的一种验证不通过的情况,是节点i发送的Sij与节点i生成并通过链上合约广播的公共验证参数不对应,那么接收到这个秘密份额Sij的节点j,可以在S330中进行验证,并可以在验证不通过后将这个节点的编号i发送至DKG合约。为了证明节点i发送的秘密份额没有经过篡改,除了发送这个节点的编号i,节点j还可以将节点i的秘密份额及签名一并发送至DKG合约。前述S310中也提到节点可以对生成并发出的秘密份额进行签名。为了能够让DKG合约对秘密份额和对应的公共验证参数进行验证,需要在投诉交易中包含该秘密份额的明文,即节点j对节点i加密后的秘密份额解密后得到的明文。并且,为了能够让DKG合约验证签名,最好在S310中由节点i对秘密份额先签名,并将明文的秘密份额和签名一并加密后送至节点j,即生成该秘密份额的共识节点对生成的所述秘密份额签名并加密发送至其它节点。这样,所述节点j发送至DKG合约的投诉交易中除了包含节点i的编号,还包括节点i发送至节点j的明文的秘密份额及生成者i对生成的该明文秘密份额的签名。
所述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}。
此外,可能在前一次分布式密钥生成过程中,节点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合约接收到所述投诉交易后首先可以通过签名验证原始报文经过篡改而不信任本次投诉,这就避免了恶意投诉。
需要说明的是,上述在S330中发送明文的秘密份额,是发生在诚实节点必然会在一定时间内做出正确响应的前提下。这样,并不会因为发送所有的秘密份额而导致私钥份额泄露,最终的完整签名也就不会泄露。
在S320中,每一共识节点通过链上合约所广播的公共验证参数还伴随有所述轮次。这样,可以在网络中存在延迟的情况下区分所述公共验证参数所属的轮次。
通过上述方法,在共识机制保障区块链网络整体一致性和同步的基础上,结合区块链智能合约实现分布式密钥生成,保障了分布式密钥的生成一方面是由各个参与方通过协作来生成的,另一方面生成的结果是一致和可靠的,从而摆脱了原有的区块链之外实现分布式密钥生成对网络同步的强依赖,并解决了该情况下生成结果的不可靠性问题。
上述图7及对应的实施例中,存在较多的消息数量。例如S310中,每一共识节点生成一组特有的n个秘密份额,将其中n-1个秘密份额分别加密发送至其它n-1个节点。这个加密发送一般是在链外以点对点(P2P)的方式进行,则对于包含n个共识节点规模的区块链网络来说,消息复杂度为n2。例如对于100个共识节点,消息规模将达到10000这个数量级。可见,这种模式下,发送的消息较多,占用较大的带宽,对区块链的性能带来较大影响。
本申请提供一种区块链上实现分布式密钥生成的方法,如图8所示,包括:
S410:每一共识节点生成n个秘密份额,自身保留一份,并将其余n-1个秘密份额分别用接收方密钥加密;每一共识节点生成自身秘密份额对应的公共验证参数;每一共识节点生成自身秘密份额与对应的公共验证参数相匹配的第三零知识证明。
仍然以椭圆曲线为例进行说明。设一个区块链网络中共识节点的数量为n,门限签名中的门限值w等于采用的共识算法中的quorum,即w=quorum。每个节点可以在群Zq上随机选择一个t度多项式。这样,根据上述公式,t=w-1=quorum-1。当然,w也可以取其它的值,此时仍保持t=w-1。下面以w=quorum为例加以说明。
每个节点可以在群Zq上随机选择一个t度多项式,例如如下:
fi(z)=ai0+ai1z+ai2z2+…+aitzt 公式(1)
公式(1)中,ai0,ai1,ai2,ai3,...,ait为多项式的系数,通过这一组系数可以确定一个多项式。
当区块链网络的共识节点数量n设置为4时,采用PBFT、HBBFT之类算法的quorum为3的情况下,这时t=2。这时,这个多项式为:
fi(z)=ai0+ai1z+ai2z2 公式(2)
节点1可以从一个有限素数域中随机选择一组数作为系数,即作为a10,a11,a12,则生成的多项式为:f1(z)=a10+a11z+a12z2,a10是节点1设置的秘密s1
类似的,节点2可以从同一有限素数域中随机选择一组数作为系数,即作为a20,a21,a22,则生成的多项式为:f2(z)=a20+a21z+a22z2,其中a20是节点2设置的秘密s2
类似的,节点3可以从同一有限素数域中随机选择一组数作为系数,即作为a30,a31,a32,则生成的多项式为:f3(z)=a30+a31z+a32z2,其中a30是节点3设置的秘密s3
类似的,节点4可以从同一有限素数域中随机选择一组数作为系数,即作为a40,a41,a42,则生成的多项式为:f4(z)=a40+a41z+a42z2,其中a40是节点4设置的秘密s4
每个节点基于确定的多项式,可以进一步确定一组秘密份额。可以根据如下公式由多项式系数确定秘密份额:
sij=fi(j)mod q(j=1,…,n) 公式(3)
公式(3)中,q是每个节点采用的相同的一个大数,也称为阶,对fi(j)用q取模的目的是将fi(j)的值限定在[0,q-1]的范围内。例如:
节点1生成4个秘密份额,分别为S11=f1(1)mod q,S12=f1(2)mod q,S13=f1(3)modq,S14=f1(4)mod q。
节点2生成4个秘密份额,分别为S21=f2(1)mod q,S22=f2(2)mod q,S23=f2(3)modq,S24=f2(4)mod q。
节点3生成4个秘密份额,分别为S31=f3(1)mod q,S32=f3(2)mod q,S33=f3(3)modq,S34=f3(4)mod q。
节点4生成4个秘密份额,分别为S41=f4(1)mod q,S42=f4(2)mod q,S43=f4(3)modq,S44=f4(4)mod q。
每一共识节点对于生成的n个秘密份额,自身保留一份,可以将其余n-1个秘密份额分别用接收方密钥加密。这里优选采用非对称加密的方式。非对称加密是一种公钥加密方案,秘密的接收方生成一对公私钥对,并将公钥公布出去,私钥保密;秘密发送方采用公布的公钥加密后,只有具有对应私钥的接收方才能解密,而不具有对应私钥的人无法解密。而对称加密虽然也可以实现加密传输,但密钥不能公开,同时加密、解密双方需要具有相同的密钥。这样,可以避免采用对称加密而需要的密钥协商和密钥传输以及中间人攻击等问题。
例如:
节点1生成的4个秘密份额s11,s12,s13,s14,节点1自身保留s11,并用节点2的公钥pk2加密s12,用节点3的公钥pk3加密s13,用节点4的公钥pk4加密s14
节点2生成的4个秘密份额s21,s22,s23,s24,节点2自身保留s22,并用节点1的公钥pk1加密s21,用节点3的公钥pk3加密s23,用节点4的公钥pk4加密s24
节点3生成的4个秘密份额s31,s32,s33,s34,节点3自身保留s33,并用节点1的公钥pk1加密s31,用节点2的公钥pk2加密s32,用节点4的公钥pk4加密s34
节点4生成的4个秘密份额s41,s42,s43,s44,节点4自身保留s44,并用节点1的公钥pk1加密s41,用节点2的公钥pk2加密s42,用节点3的公钥pk3加密s43
相应的,每一共识节点可以生成自身多项式对应的公共验证参数Aik,k=1,2,…,t。如前所述,
Figure BDA0003918794290000391
由于这组公共验证参数的连乘可以对多项式对应曲线上的点进行验证,且生成的公共验证参数与ECC上生成公钥的形式相同,即
Figure BDA0003918794290000392
因此连乘的结果也称为公钥。对于xi=i,
Figure BDA0003918794290000393
当总节点数n=4,门限w=3时,即多项式的度数t=2,则:
节点1的公钥为
Figure BDA0003918794290000401
节点2的公钥为
Figure BDA0003918794290000402
节点3的公钥为
Figure BDA0003918794290000403
节点4的公钥为
Figure BDA0003918794290000404
pkj表示第j个节点的公钥。这个pkj公钥不同于上面的pubi公钥。pkj表示每个节点自身生成的公私钥对中的公钥,这里可以称为第一公钥。上面的pubi公钥则表示与节点自身生成的多项式相关的公钥,可以称为第二公钥。
此外,每一共识节点还生成自身秘密份额与对应的公共验证参数相匹配的第三零知识证明。由于S420中需要将加密的秘密份额通过交易发送至链上合约,而不能暴露加密的秘密份额,因此对于验证秘密份额与公共验证参数相匹配,无法直接采用上述公式(5)。作为替代的,每一共识节点可以采用Sigma Protocol生成自身加密的秘密份额与对应的公共验证参数相匹配的第三零知识证明。相应的,通过第三零知识证明并采用SigmaProtocol,可以验证加密的秘密份额与对应的公共验证参数是否匹配。
S420:每一共识节点可以通过同一交易或不同交易中发送自身生成的所述秘密份额、公共验证参数以及所述秘密份额与对应的公共验证参数相匹配的第三零知识证明至链上合约。
区块链节点用自身私钥签名发出的交易中,可以包含对区块链上的智能合约的调用。区块链上可以预先部署合约,这里例如是DKG合约。部署后的合约可以具有一个链上的合约地址。后续,可以通过发起交易的方式对链上合约进行调用,例如将交易的接收方地址设置为需要调用的合约的地址。
共识节点可以采用自身私钥签名一笔交易并发送到区块链上,交易接收方地址可以设置为DKG合约的地址。此外,交易中可以携带调用合约时输入的参数,并可以指明调用的合约中的函数。输入的参数和指明调用的函数可以位于交易的data字段中。
一种实现方式中,每一共识节点可以通过发送一个交易将自身生成的所述秘密份额、公共验证参数以及所述秘密份额与对应的公共验证参数相匹配的第三零知识证明发送至链上合约。
另一种实现方式中,每一共识节点可以通过发送第一交易将自身生成并加密的秘密份额发送至链上合约。其中,可以将加密后的秘密份额设置到第一交易的data字段中。类似的,每一共识节点可以通过发送第二交易将自身生成的公共验证参数发送至链上合约。类似的,每一共识节点可以通过发送第三交易将自身生成的秘密份额与对应的公共验证参数相匹配的第三零知识证明发送至链上合约。该第一、第二、第三交易例如是调用DKG合约的交易。或将所述秘密份额、公共验证参数通过同一交易中发送至链上合约,而通过另一交易将第三零知识证明发送至链上合约;或将第三零知识证明、所述公共验证参数通过同一交易中发送至链上合约,而通过另一交易将所述秘密份额发送至链上合约;或将所述秘密份额、第三零知识证明通过同一交易中发送至链上合约,而通过另一交易将公共验证参数发送至链上合约。
S430:所述链上合约通过第三零知识证明验证所述加密的秘密份额及对应的公共验证参数相匹配。
链上合约通过交易接收到第三零知识证明、秘密份额及对应的公共验证参数后,如上所述,可以通过第三零知识证明验证加密的秘密份额及对应的公共验证参数相匹配。
验证通过后,由于链上合约此时拥有每一共识节点自身生成的多项式所对应公共验证参数,因此,链上合约可以基于所述公共验证参数生成总公钥,这里类似上述公式(7)。
S440:每一共识节点从所述合约中获得经过验证的且接收方为自身的秘密份额并采用自身密钥解密,并结合本地的秘密份额计算自身的私钥份额。
这里类似前述S340,不再赘述。
由于上述S430中链上合约生成了总公钥,因此,S440步骤或之后,每一共识节点还可以从所述合约信息中获得所述总公钥。当然,每一共识节点也可以从所述合约信息中获得公共验证参数,并根据获得的公共验证参数计算得到总公钥。
上述实施例中,对于n个节点,每一节点生成的秘密份额经加密后发送至链上合约,消息复杂度是n,从而避免节点之间点对点的加密传输,即避免n2的消息复杂度,可见能大大降低消息数量。
另外,通过将每一节点生成的秘密份额、公共验证参数以及第三零知识证明发送至链上合约,可以由链上合约中的代码逻辑来通过第三零知识证明验证秘密份额与对应的公共验证参数是否匹配,从而,可以避免S330中节点从链上合约中获得秘密份额和公共验证参数后在链下自行验证。由链上合约来验证秘密份额与对应的公共验证参数是否匹配,避免了S330中每一节点自行链下验证不匹配后的再次向合约发起投诉的环节,节省了至少一轮的通信。
上述S410中,假设每一共识节点都是诚实的,没有作恶。但是实际上可能存在作恶行为,例如共识节点生成并发送的是错误的秘密份额,再例如共识节点并没有采用接收方的公钥对秘密份额加密。如果共识节点并没有采用接收方的公钥对秘密份额加密,按照上述图8实施例,仍然可以通过链上合约的验证,但是接收方并无法对加密的秘密份额正确解密。如果共识节点生成并发送的是错误的秘密份额,则接收方也可能无法正确解密。这样,方案是不完备的。为了使方案更加完备,可以采用零知识证明相关的技术,使得链上合约中的代码逻辑可以进一步验证秘密份额的正确性。
基于此,本申请提供一种区块链上实现分布式密钥生成的方法,如图9所示,包括:
S510:每一共识节点生成n个秘密份额,自身保留一份,并将其余n-1个秘密份额分别用接收方密钥进行加密,并生成对应的证明可解密的第一零知识证明;每一共识节点生成自身秘密份额对应的公共验证参数;每一共识节点生成自身秘密份额与对应的公共验证参数相匹配的第三零知识证明。
类似前述S410,节点1可以从一个有限素数域中随机选择一组数作为系数,即作为a10,a11,a12,则生成的多项式为:f1(z)=a10+a11z+a12z2,a10是节点1设置的秘密s1
类似的,节点2可以从同一有限素数域中随机选择一组数作为系数,即作为a20,a21,a22,则生成的多项式为:f2(z)=a20+a21z+a22z2,其中a20是节点2设置的秘密s2
类似的,节点3可以从同一有限素数域中随机选择一组数作为系数,即作为a30,a31,a32,则生成的多项式为:f3(z)=a30+a31z+a32z2,其中a30是节点3设置的秘密s3
类似的,节点4可以从同一有限素数域中随机选择一组数作为系数,即作为a40,a41,a42,则生成的多项式为:f4(z)=a40+a41z+a42z2,其中a40是节点4设置的秘密s4
每个节点基于确定的多项式,可以进一步确定一组秘密份额。可以根据如下公式由多项式系数确定秘密份额:
sij=fi(j)mod q(j=1,…,n) 公式(3)
公式(3)中,q是每个节点采用的相同的一个大数,也称为阶,对fi(j)用q取模的目的是将fi(j)的值限定在[0,q-1]的范围内。例如:
节点1生成4个秘密份额,分别为S11=f1(1)mod q,S12=f1(2)mod q,S13=f1(3)modq,S14=f1(4)mod q。
节点2生成4个秘密份额,分别为S21=f2(1)mod q,S22=f2(2)mod q,S23=f2(3)modq,S24=f2(4)mod q。
节点3生成4个秘密份额,分别为S31=f3(1)mod q,S32=f3(2)mod q,S33=f3(3)modq,S34=f3(4)mod q。
节点4生成4个秘密份额,分别为S41=f4(1)mod q,S42=f4(2)mod q,S43=f4(3)modq,S44=f4(4)mod q。
如前所述,S420中每一共识节点将通过交易中发送加密的秘密份额至链上合约,这样链上的所有节点都可以从合约信息中得到这个加密的秘密份额,例如任何节点都可以通过前述事件机制进行监听,从而监听到事件的msg中加密的秘密份额。为了保证只有具有合法密钥的接收方才能解密,类似S410中,发送方可以采用接收方的公钥对对应的秘密份额加密。
同时,为了避免共识节点生成并发送的是错误的秘密份额而导致接收方无法正确解密,并且需要由合约代码逻辑可以验证,这里可以采用零知识证明。零知识证明指的是证明者能够在不向验证者提供任何有用的信息的情况下,使验证者相信某个论断是正确的。这里的零知识证明例如采用RangeProof范围证明。RangeProof范围证明是一种证明Pedersen承诺中明文比特长度范围的零知识证明技术,其作用是通过证明密文所加密的明文长度,使验证者确信所加密的密文具备可解密性。例如对于32bits的密文,通过建表,拥有私钥的一方可以快速穷举解密。Pederson承诺(Pedersen Commitment)是密码学中承诺的一种,1992年由Torben Pryds Pedersen提出。目前Pedersen Commitment主要搭配椭圆曲线密码学使用(当然也可以结合指数运算),具有基于离散对数困难问题的强绑定性和同态加法特性的密文形式。
在采用非对称加密的前提下,为了采用RangeProof范围证明,可以采用TwistedElgamal加密作为非对称加密方案。Twisted Elgamal是一种对零知识证明友好的加法同态公钥加密方案。
Twisted Elgamal加密中,解密的过程涉及穷举方式的暴力算法。超过32bits长度的二进制原文经加密后,需要穷举的比特位较多,将无法在合理时间内解密,这个合理时间在普通算力的计算机中例如是毫秒~秒级。例如64bits长度的二进制原文经加密后大约需要若干年这种量级的时间才能完成解密,而256bits则更加是一个天文数字。采用32bits长度的二进制原文经加密后,持有对应私钥的解密方可以在毫秒级别的时间内完成解密。
基于此,对sij的加密中,可以将sij拆分成32bits大小的分段。
通过设置阶q的取值,可以将sij的取值范围限定在统一的范围内。例如,将q设置为256bits的素数,可以将sij的取值范围限定在0~2256-1的范围内,这样,sij的取值可以用一个256bits的二进制数表示。一般的,sij的取值设置为256bits或更大才能保证密文的安全性,即保证没有合法密钥的一方无法在合理时间内破解。
对于设定一个阶数q,可以使得sij的长度为|q|,这里的||表示取二进制数的位数的操作。则对于长度为|q|的一个数,可以将sij从高到低位平均拆分成m份,每份是|q|/m个二进制数构成的分段。对于每个sij都是256bits的情况,可以将其从高到低位拆分成8个32bits的分段,从高位到低位(即从左至右)的编号可以是第7分段,第6分段,第5分段,第4分段,第3分段,第2分段,第1分段,第0分段。
拆分成每个分段32bits,是因为32bits长度对于采用机基于ECC的非对称加密来说,接收方可以快速的解密,例如通过穷举的方式解密。而64bits或更大长度在目前的ECC非对称加密算法的范畴内接收方无法快速解密。当然,如果将q设置为32bits的素数,则可以将sij的取值范围限定在0~232-1的范围内,这样,sij的取值可以用一个32bits的二进制数表示。sij的取值用32bits长度的二进制数表示的话,如上所述,则不需要分段。
接着,节点i可以将自身对应的m份二进制数中的每一份进行加密,得到密文
Figure BDA0003918794290000441
其中,C表示密文,下标i,j与sij的下标相同,表示i号节点产生的第j个秘密份额,将要发送至第j个节点。k表示上述的分段编号,如上述256bits从高到低位拆分成8个32bits的分段,从高位到低位(即从左至右)的编号第7分对应段m=7,第6分段对应段m=6,第5分段对应段m=5,第4分段对应段m=4,第3分段对应段m=3,第2分段对应段m=2,第1分段对应段m=1,第0分段对应段m=0。h与g一样,都表示群上的一个生成元。r表示随机数。pkj表示第j个节点的公钥,这里的第j个节点作为秘密的接收方。
上述
Figure BDA0003918794290000442
等号右侧表示一种加密方式,例如是TwistedElgamal,即采用
Figure BDA0003918794290000443
Figure BDA0003918794290000444
进行掩盖操作,相当于一种加密操作。
这样,对于256bits的原文,通过Twisted Elgamal可以切分为32bits长的8个分段,并加密生成8个密文,每个密文对应一个分段。
相应的,采用RangeProof范围证明,具体可以是对每个密文生成一个RangeProof。这样,对于256bits的原文,最终生成8个密文和对应的8个RangeProof。8个RangeProof,设为RangeProofi,j,m,其中下标i表示生成方的节点编号,j表示接收方的节点编号,m表示分段的编号,这里m=0,1,2,…,7。
前述提到,Twisted Elgamal是一种对零知识证明友好的加法同态公钥加密方案。基于加法同态特性,可以将8个密文和对应的8个RangeProof叠加,生成一个范围证明,设为RangeProofi,j。而且,将多个RangeProof叠加,生成一个范围证明,可以大幅降低证明所占空间。假如RangeProofi,j,m中的每一个占100bytes,则发送方节点i生成的接收方为节点j的密文经切分后的8个密文,对应的8个RangeProofi,j,0,RangeProofi,j,1,...,RangeProofi,j,7总共占用800bytes。而基于上述加法同态特性,将RangeProofi,j,0,RangeProofi,j,1,...,RangeProofi,j,7这8个范围证明合并为一个范围证明,即合并为RangeProofi,j,合并后的RangeProofi,j大约占用200~300bytes,不到800bytes的一半,同时还保留了零知识证明的特性,即这个合并后的范围证明仍然可以证明sij的每一分段的密文都是32bits,即都是合理时间内可解密的,如持有对应私钥的解密方可以在毫秒级别的时间内完成解密。显然的,相比于不合并的范围证明,合并后的范围证明可以降低发送到链上的交易的大小,这也会降低链上数据所需的存储空间。
同时,每一共识节点一般都在链上注册有公钥。上述Twisted Elgamal中用到了接收方的公钥进行加密,相应的,验证方例如链上的智能合约可以采用链上注册的接收方的公钥对RangeProofi,j和Ci,j,k进行验证,如果验证通过,除了可以证明可以在毫秒级别的时间内完成解密外,还可以证明是用解密方持有的公钥pkj进行的加密。这样,区块链上的智能合约在不持有解密方私钥的情况下可以验证持有对应私钥的解密方(即接收方)可以解密。当然,即使不将多个范围证明叠加生成一个范围证明,而是生成多个范围证明,区块链上的智能合约也可以在不持有解密方私钥的情况下可以验证持有对应私钥的解密方(即接收方)对各个密文在合理时间内解密。
相比于不发送第一零知识证明,这里节点将证明发送的秘密份额可由接收方解密的第一零知识证明一并发送至链上合约,使得链上合约中的代码逻辑可以验证秘密份额的正确性。如果通过验证,则链上合约可以确定发送方发送的内容是正确的,接收方也必然可以正确解密,从而后续可以免去前述的投诉环节,也就减少了节点与链上合约交互的轮次数量。
相应的,每一共识节点可以生成自身多项式对应的公共验证参数Aik,k=1,2,…,t。如前所述,
Figure BDA0003918794290000451
由于这组公共验证参数的连乘可以对多项式对应曲线上的点进行验证,且生成的公共验证参数与ECC上生成公钥的形式相同,即
Figure BDA0003918794290000452
因此连乘的结果也称为公钥。对于xi=i,
Figure BDA0003918794290000453
当总节点数n=4,门限w=3时,即多项式的度数t=2,则:
节点1的公钥为
Figure BDA0003918794290000454
节点2的公钥为
Figure BDA0003918794290000455
节点3的公钥为
Figure BDA0003918794290000456
节点4的公钥为
Figure BDA0003918794290000457
上面的pkj表示第j个节点的公钥。这个pkj公钥不同于上面的pubi公钥。pkj表示每个节点自身生成的公私钥对中的公钥,这里可以称为第一公钥。这里的pubi公钥则表示与节点自身生成的多项式相关的公钥,可以称为第二公钥。
S520:每一共识节点可以在同一交易或不同交易中发送所述秘密份额和对应的第一零知识证明、公共验证参数以及所述秘密份额与对应的公共验证参数相匹配的第三零知识证明至链上合约。
本部轴与S420类似,不再赘述。
S530:链上合约通过第一零知识证明验证所述加密的秘密份额,并通过第三零知识证明验证所述加密的秘密份额及对应的公共验证参数相匹配。
如S510中所述,链上合约可以采用链上注册的接收方的公钥,基于TwistedElgamal算法对RangeProofi,j和Ci,j,k进行验证,如果验证通过,除了可以证明接收方可以在毫秒级别的时间内完成解密外,还可以证明是用解密方持有的公钥pkj进行的加密,也就是说,持有对应私钥的接收方节点可以正确解密。
具体的,对于采用RangeProof范围证明,并采用Twisted Elgamal加密的方案,如前所述,对sij的加密中将sij拆分成32bits大小的分段。这样,对于256bits的原文,通过Twisted Elgamal可以切分为32bits长的8个分段,并加密生成8个密文,每个密文对应一个分段。相应的,采用RangeProof范围证明,具体可以是对每个密文生成一个范围证明,也可以将8个密文和对应的8个RangeProof叠加,生成一个范围证明。相应的,S530中,链上合约可以通过验证该范围证明来验证接收方可解密。对于将sij拆分成32bits大小的分段,这里可以将各个分段密文还原,例如按照分段位置进行移位后再叠加。如分段1的密文可以左移32位,分段2的密文可以左移64位,分段3的密文可以左移96位,分段4的密文可以左移128为,分段5的密文可以左移160位,分段6的密文可以左移192位,分段7的密文可以左移224位,而分段0的密文不需要移位或左移0位。移位后的密文可以叠加后合并,并将合并后的密文与合并的范围证明进行验证。上述验证可以表达为:
Figure BDA0003918794290000461
其中
Figure BDA0003918794290000462
对于上面的分为8段,m的取值可以是0到7。
所述通过第三零知识证明验证所述加密的秘密份额及对应的公共验证参数相匹配,与S430类似,不再赘述。
S540:每一共识节点从所述合约信息中获得经过验证的且接收方为自身的秘密份额并采用自身密钥解密,并结合本地的秘密份额计算自身的私钥份额。
本步骤与上面S440类似,不再赘述。
由于S540中链上合约生成了总公钥,因此,S540步骤或之后,每一共识节点还可以从所述合约信息中获得所述总公钥。当然,每一共识节点也可以从所述合约信息中获得公共验证参数,并根据获得的公共验证参数计算得到总公钥。
此外,对于S510中采用RangeProof范围证明,并采用Twisted Elgamal加密的方案,如前所述,对sij的加密中可以将sij拆分成32bits大小的分段。这样,对于256bits的原文,通过Twisted Elgamal可以切分为32bits长的8个分段,并加密生成8个密文,每个密文对应一个分段。这里例如通过Twisted Elgamal可以切分为32bits长的8个分段,并加密生成8个密文,每个密文对应一个分段,则接收方节点可以从合约信息中获得各密文分段,然后按位拼接后得到每一发送方发送的密文,进而采用公式(7)的方式得到私钥份额,不再赘述。
通过上述过程,除了可以避免节点之间的点对点广播,还可以由链上合约通过验证每一节点是否作恶。如果没有作恶,链上合约中的代码逻辑可以进一步验证秘密份额的正确性,并可以验证加密的秘密份额及对应的公共验证参数相匹配。这样,就免去了S330中的验证和投诉过程,也就免去各个节点与链上合约进行交互的过程,从而减少了交互的轮数。
上述尽管多处提到的是共识节点,但本领域技术人员知道,在一些实现目的中也可以是普通节点,或者是共识节点和非共识节点,而非全部是共识节点。
以下介绍本申请提供的一种区块链系统,包括若干个节点,其中:
每一节点生成n个秘密份额,自身保留一份,并将其余n-1个秘密份额分别用接收方密钥加密;每一节点生成自身秘密份额对应的公共验证参数;每一节点生成自身秘密份额与对应的公共验证参数相匹配的第三零知识证明;
每一节点通过同一交易或不同交易发送自身生成的所述秘密份额、公共验证参数以及第三零知识证明至链上合约;
所述链上合约通过第三零知识证明验证所述加密的秘密份额及对应的公共验证参数相匹配;
每一节点从所述合约信息中获得经过验证的且接收方为自身的秘密份额并采用自身密钥解密,并结合本地的秘密份额计算自身的私钥份额。
以下介绍本申请提供的一种区块链系统,包括若干个节点,其中:
每一节点生成n个秘密份额,自身保留一份,并将其余n-1个秘密份额分别用接收方密钥进行加密,并生成对应的证明可解密的第一零知识证明;每一节点生成自身秘密份额对应的公共验证参数;每一节点生成自身秘密份额与对应的公共验证参数相匹配的第三零知识证明;
每一节点可以在同一交易或不同交易中发送所述秘密份额和对应的第一零知识证明、公共验证参数以及所述秘密份额与对应的公共验证参数相匹配的第三零知识证明至链上合约;
所述链上合约通过第一零知识证明验证所述加密的秘密份额,并通过第三零知识证明验证所述加密的秘密份额及对应的公共验证参数相匹配;
每一节点从所述合约信息中获得经过验证的且接收方为自身的秘密份额并采用自身密钥解密,并结合本地的秘密份额计算自身的私钥份额。
以下介绍本申请提供的一种区块链系统中的第一节点,包括:
第一节点生成n个秘密份额,自身保留一份,并将其余n-1个秘密份额分别用接收方密钥加密;第一节点生成自身秘密份额对应的公共验证参数;第一节点生成自身秘密份额与对应的公共验证参数相匹配的第三零知识证明;
第一节点通过同一交易或不同交易发送自身生成的所述秘密份额、公共验证参数以及第三零知识证明至链上合约;
所述链上合约通过第三零知识证明验证所述加密的秘密份额及对应的公共验证参数相匹配;
第一节点从所述合约信息中获得经过验证的且接收方为自身的秘密份额并采用自身密钥解密,并结合本地的秘密份额计算自身的私钥份额。
以下介绍本申请提供的一种区块链系统中的第一节点,包括:
第一节点生成n个秘密份额,自身保留一份,并将其余n-1个秘密份额分别用接收方密钥进行加密,并生成对应的证明可解密的第一零知识证明;第一节点生成自身秘密份额对应的公共验证参数;第一节点生成自身秘密份额与对应的公共验证参数相匹配的第三零知识证明;
第一节点可以在同一交易或不同交易中发送所述秘密份额和对应的第一零知识证明、公共验证参数以及所述秘密份额与对应的公共验证参数相匹配的第三零知识证明至链上合约;
所述链上合约通过第一零知识证明验证所述加密的秘密份额,并通过第三零知识证明验证所述加密的秘密份额及对应的公共验证参数相匹配;
第一节点从所述合约信息中获得经过验证的且接收方为自身的秘密份额并采用自身密钥解密,并结合本地的秘密份额计算自身的私钥份额。
在20世纪90年代,对于一个技术的改进可以很明显地区分是硬件上的改进(例如,对二极管、晶体管、开关等电路结构的改进)还是软件上的改进(对于方法流程的改进)。然而,随着技术的发展,当今的很多方法流程的改进已经可以视为硬件电路结构的直接改进。设计人员几乎都通过将改进的方法流程编程到硬件电路中来得到相应的硬件电路结构。因此,不能说一个方法流程的改进就不能用硬件实体模块来实现。例如,可编程逻辑器件(Programmable Logic Device,PLD)(例如现场可编程门阵列(Field Programmable GateArray,FPGA))就是这样一种集成电路,其逻辑功能由用户对器件编程来确定。由设计人员自行编程来把一个数字系统“集成”在一片PLD上,而不需要请芯片制造厂商来设计和制作专用的集成电路芯片。而且,如今,取代手工地制作集成电路芯片,这种编程也多半改用“逻辑编译器(logic compiler)”软件来实现,它与程序开发撰写时所用的软件编译器相类似,而要编译之前的原始代码也得用特定的编程语言来撰写,此称之为硬件描述语言(Hardware Description Language,HDL),而HDL也并非仅有一种,而是有许多种,如ABEL(Advanced Boolean Expression Language)、AHDL(Altera Hardware DescriptionLanguage)、Confluence、CUPL(Cornell University Programming Language)、HDCal、JHDL(Java Hardware Description Language)、Lava、Lola、MyHDL、PALASM、RHDL(RubyHardware Description Language)等,目前最普遍使用的是VHDL(Very-High-SpeedIntegrated Circuit Hardware Description Language)与Verilog。本领域技术人员也应该清楚,只需要将方法流程用上述几种硬件描述语言稍作逻辑编程并编程到集成电路中,就可以很容易得到实现该逻辑方法流程的硬件电路。
控制器可以按任何适当的方式实现,例如,控制器可以采取例如微处理器或处理器以及存储可由该(微)处理器执行的计算机可读程序代码(例如软件或固件)的计算机可读介质、逻辑门、开关、专用集成电路(Application Specific Integrated Circuit,ASIC)、可编程逻辑控制器和嵌入微控制器的形式,控制器的例子包括但不限于以下微控制器:ARC 625D、Atmel AT91SAM、Microchip PIC18F26K20以及Silicone Labs C8051F320,存储器控制器还可以被实现为存储器的控制逻辑的一部分。本领域技术人员也知道,除了以纯计算机可读程序代码方式实现控制器以外,完全可以通过将方法步骤进行逻辑编程来使得控制器以逻辑门、开关、专用集成电路、可编程逻辑控制器和嵌入微控制器等的形式来实现相同功能。因此这种控制器可以被认为是一种硬件部件,而对其内包括的用于实现各种功能的装置也可以视为硬件部件内的结构。或者甚至,可以将用于实现各种功能的装置视为既可以是实现方法的软件模块又可以是硬件部件内的结构。
上述实施例阐明的系统、装置、模块或单元,具体可以由计算机芯片或实体实现,或者由具有某种功能的产品来实现。一种典型的实现设备为服务器系统。当然,本申请不排除随着未来计算机技术的发展,实现上述实施例功能的计算机例如可以为个人计算机、膝上型计算机、车载人机交互设备、蜂窝电话、相机电话、智能电话、个人数字助理、媒体播放器、导航设备、电子邮件设备、游戏控制台、平板计算机、可穿戴设备或者这些设备中的任何设备的组合。
虽然本说明书一个或多个实施例提供了如实施例或流程图所述的方法操作步骤,但基于常规或者无创造性的手段可以包括更多或者更少的操作步骤。实施例中列举的步骤顺序仅仅为众多步骤执行顺序中的一种方式,不代表唯一的执行顺序。在实际中的装置或终端产品执行时,可以按照实施例或者附图所示的方法顺序执行或者并行执行(例如并行处理器或者多线程处理的环境,甚至为分布式数据处理环境)。术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、产品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、产品或者设备所固有的要素。在没有更多限制的情况下,并不排除在包括所述要素的过程、方法、产品或者设备中还存在另外的相同或等同要素。例如若使用到第一,第二等词语用来表示名称,而并不表示任何特定的顺序。
为了描述的方便,描述以上装置时以功能分为各种模块分别描述。当然,在实施本说明书一个或多个时可以把各模块的功能在同一个或多个软件和/或硬件中实现,也可以将实现同一功能的模块由多个子模块或子单元的组合实现等。以上所描述的装置实施例仅仅是示意性的,例如,所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,装置或单元的间接耦合或通信连接,可以是电性,机械或其它的形式。
本发明是参照根据本发明实施例的方法、装置(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
在一个典型的配置中,计算设备包括一个或多个处理器(CPU)、输入/输出接口、网络接口和内存。
内存可能包括计算机可读介质中的非永久性存储器,随机存取存储器(RAM)和/或非易失性内存等形式,如只读存储器(ROM)或闪存(flash RAM)。内存是计算机可读介质的示例。
计算机可读介质包括永久性和非永久性、可移动和非可移动媒体可以由任何方法或技术来实现信息存储。信息可以是计算机可读指令、数据结构、程序的模块或其他数据。计算机的存储介质的例子包括,但不限于相变内存(PRAM)、静态随机存取存储器(SRAM)、动态随机存取存储器(DRAM)、其他类型的随机存取存储器(RAM)、只读存储器(ROM)、电可擦除可编程只读存储器(EEPROM)、快闪记忆体或其他内存技术、只读光盘只读存储器(CD-ROM)、数字多功能光盘(DVD)或其他光学存储、磁盒式磁带,磁带磁磁盘存储、石墨烯存储或其他磁性存储设备或任何其他非传输介质,可用于存储可以被计算设备访问的信息。按照本文中的界定,计算机可读介质不包括暂存电脑可读媒体(transitory media),如调制的数据信号和载波。
本领域技术人员应明白,本说明书一个或多个实施例可提供为方法、系统或计算机程序产品。因此,本说明书一个或多个实施例可采用完全硬件实施例、完全软件实施例或结合软件和硬件方面的实施例的形式。而且,本说明书一个或多个实施例可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。
本说明书一个或多个实施例可以在由计算机执行的计算机可执行指令的一般上下文中描述,例如程序模块。一般地,程序模块包括执行特定任务或实现特定抽象数据类型的例程、程序、对象、组件、数据结构等等。也可以在分布式计算环境中实践本本说明书一个或多个实施例,在这些分布式计算环境中,由通过通信网络而被连接的远程处理设备来执行任务。在分布式计算环境中,程序模块可以位于包括存储设备在内的本地和远程计算机存储介质中。
本说明书中的各个实施例均采用递进的方式描述,各个实施例之间相同相似的部分互相参见即可,每个实施例重点说明的都是与其他实施例的不同之处。尤其,对于系统实施例而言,由于其基本相似于方法实施例,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。在本说明书的描述中,参考术语“一个实施例”、“一些实施例”、“示例”、“具体示例”、或“一些示例”等的描述意指结合该实施例或示例描述的具体特征、结构、材料或者特点包含于本说明书的至少一个实施例或示例中。在本说明书中,对上述术语的示意性表述不必须针对的是相同的实施例或示例。而且,描述的具体特征、结构、材料或者特点可以在任一个或多个实施例或示例中以合适的方式结合。此外,在不相互矛盾的情况下,本领域的技术人员可以将本说明书中描述的不同实施例或示例以及不同实施例或示例的特征进行结合和组合。
以上所述仅为本说明书一个或多个实施例的实施例而已,并不用于限制本本说明书一个或多个实施例。对于本领域技术人员来说,本说明书一个或多个实施例可以有各种更改和变化。凡在本说明书的精神和原理之内所作的任何修改、等同替换、改进等,均应包含在权利要求范围之内。

Claims (16)

1.一种区块链上实现分布式密钥生成的方法,包括:
S1:每一节点生成n个秘密份额,自身保留一份,并将其余n-1个秘密份额分别用接收方密钥加密;每一节点生成自身秘密份额对应的公共验证参数;每一节点生成自身秘密份额与对应的公共验证参数相匹配的第三零知识证明;
S2:每一节点通过同一交易或不同交易发送自身生成的所述秘密份额、公共验证参数以及第三零知识证明至链上合约;
S3:所述链上合约通过第三零知识证明验证所述加密的秘密份额及对应的公共验证参数相匹配;
S4:每一节点从所述合约信息中获得经过验证的且接收方为自身的秘密份额并采用自身密钥解密,并结合本地的秘密份额计算自身的私钥份额。
2.如权利要求1所述的方法,S2中每一节点采用Sigma Protocol生成自身加密的秘密份额与对应的公共验证参数相匹配的第三零知识证明;相应的,S3中链上合约采用SigmaProtocol并通过第三零知识证明验证所述加密的秘密份额及对应的公共验证参数相匹配。
3.如权利要求1所述的方法,所述链上合约还基于所述公共验证参数生成总公钥。
4.如权利要求3所述的方法,每一节点还从所述合约中获得所述总公钥。
5.如权利要求1所述的方法,每一节点还从所述合约信息中获得所述公共验证参数,并基于公共验证参数计算得到总公钥。
6.一种区块链上实现分布式密钥生成的方法,包括:
S1:每一节点生成n个秘密份额,自身保留一份,并将其余n-1个秘密份额分别用接收方密钥进行加密,并生成对应的证明可解密的第一零知识证明;每一节点生成自身秘密份额对应的公共验证参数;每一节点生成自身秘密份额与对应的公共验证参数相匹配的第三零知识证明;
S2:每一节点可以在同一交易或不同交易中发送所述秘密份额和对应的第一零知识证明、公共验证参数以及所述秘密份额与对应的公共验证参数相匹配的第三零知识证明至链上合约;
S3:所述链上合约通过第一零知识证明验证所述加密的秘密份额,并通过第三零知识证明验证所述加密的秘密份额及对应的公共验证参数相匹配;
S4:每一节点从所述合约信息中获得经过验证的且接收方为自身的秘密份额并采用自身密钥解密,并结合本地的秘密份额计算自身的私钥份额。
7.如权利要求6所述的方法,S1中,每一节点将所述n-1个秘密份额分别用接收方公钥进行非对称加密。
8.如权利要求7所述的方法,S1中,每一节点将所述n-1个秘密份额分别用接收方公钥进行非对称加密后,还生成对应的证明可解密的第一零知识证明。
9.如权利要求8所述的方法,所述每一节点将所述n-1个秘密份额分别用接收方公钥进行非对称加密,包括采用Twisted Elgamal加密。
10.如权利要求9所述的方法,所述采用Twisted Elgamal加密,包括:
对原文按照32比特切分成若干分段,并用接收方公钥基于Twisted Elgamal算法加密生成若干密文,每个密文对应一个分段。
11.如权利要求10所述的方法,第一零知识证明包括RangeProof范围证明。
12.如权利要求11所述的方法,所述RangeProof范围证明包括:
对每个密文生成生成一个RangeProof范围证明;
或,
对每个密文生成生成一个RangeProof范围证明,并将每个密文的RangeProof范围证明合并为一个RangeProof范围证明。
13.一种区块链系统,包括若干节点,其中:
每一节点生成n个秘密份额,自身保留一份,并将其余n-1个秘密份额分别用接收方密钥加密;每一节点生成自身秘密份额对应的公共验证参数;每一节点生成自身秘密份额与对应的公共验证参数相匹配的第三零知识证明;
每一节点通过同一交易或不同交易发送自身生成的所述秘密份额、公共验证参数以及第三零知识证明至链上合约;
所述链上合约通过第三零知识证明验证所述加密的秘密份额及对应的公共验证参数相匹配;
每一节点从所述合约信息中获得经过验证的且接收方为自身的秘密份额并采用自身密钥解密,并结合本地的秘密份额计算自身的私钥份额。
14.一种区块链系统,包括若干节点,其中:
每一节点生成n个秘密份额,自身保留一份,并将其余n-1个秘密份额分别用接收方密钥进行加密,并生成对应的证明可解密的第一零知识证明;每一节点生成自身秘密份额对应的公共验证参数;每一节点生成自身秘密份额与对应的公共验证参数相匹配的第三零知识证明;
每一节点可以在同一交易或不同交易中发送所述秘密份额和对应的第一零知识证明、公共验证参数以及所述秘密份额与对应的公共验证参数相匹配的第三零知识证明至链上合约;
所述链上合约通过第一零知识证明验证所述加密的秘密份额,并通过第三零知识证明验证所述加密的秘密份额及对应的公共验证参数相匹配;
每一节点从所述合约信息中获得经过验证的且接收方为自身的秘密份额并采用自身密钥解密,并结合本地的秘密份额计算自身的私钥份额。
15.一种区块链系统中的第一节点,包括:
第一节点生成n个秘密份额,自身保留一份,并将其余n-1个秘密份额分别用接收方密钥加密;第一节点生成自身秘密份额对应的公共验证参数;第一节点生成自身秘密份额与对应的公共验证参数相匹配的第三零知识证明;
第一节点通过同一交易或不同交易发送自身生成的所述秘密份额、公共验证参数以及第三零知识证明至链上合约;
所述链上合约通过第三零知识证明验证所述加密的秘密份额及对应的公共验证参数相匹配;
第一节点从所述合约信息中获得经过验证的且接收方为自身的秘密份额并采用自身密钥解密,并结合本地的秘密份额计算自身的私钥份额。
16.一种区块链系统中的第一节点,包括:
第一节点生成n个秘密份额,自身保留一份,并将其余n-1个秘密份额分别用接收方密钥进行加密,并生成对应的证明可解密的第一零知识证明;第一节点生成自身秘密份额对应的公共验证参数;第一节点生成自身秘密份额与对应的公共验证参数相匹配的第三零知识证明;
第一节点可以在同一交易或不同交易中发送所述秘密份额和对应的第一零知识证明、公共验证参数以及所述秘密份额与对应的公共验证参数相匹配的第三零知识证明至链上合约;
所述链上合约通过第一零知识证明验证所述加密的秘密份额,并通过第三零知识证明验证所述加密的秘密份额及对应的公共验证参数相匹配;
第一节点从所述合约信息中获得经过验证的且接收方为自身的秘密份额并采用自身密钥解密,并结合本地的秘密份额计算自身的私钥份额。
CN202211347342.1A 2022-10-31 2022-10-31 一种区块链上实现分布式密钥生成的方法、系统和节点 Pending CN115941164A (zh)

Priority Applications (2)

Application Number Priority Date Filing Date Title
CN202211347342.1A CN115941164A (zh) 2022-10-31 2022-10-31 一种区块链上实现分布式密钥生成的方法、系统和节点
PCT/CN2022/135591 WO2024092936A1 (zh) 2022-10-31 2022-11-30 一种区块链上实现分布式密钥生成的方法、系统和节点

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202211347342.1A CN115941164A (zh) 2022-10-31 2022-10-31 一种区块链上实现分布式密钥生成的方法、系统和节点

Publications (1)

Publication Number Publication Date
CN115941164A true CN115941164A (zh) 2023-04-07

Family

ID=86699676

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202211347342.1A Pending CN115941164A (zh) 2022-10-31 2022-10-31 一种区块链上实现分布式密钥生成的方法、系统和节点

Country Status (2)

Country Link
CN (1) CN115941164A (zh)
WO (1) WO2024092936A1 (zh)

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN117134911A (zh) * 2023-10-25 2023-11-28 北京信安世纪科技股份有限公司 秘密共享方法、秘密分割端、秘密恢复端、系统及介质

Family Cites Families (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20230361993A1 (en) * 2020-09-30 2023-11-09 DFINITY Stiftung Redistribution of secret sharings
CN113111373B (zh) * 2021-05-13 2022-06-07 北京邮电大学 Vbft共识机制的随机数生成方法和共识机制系统
CN114650132A (zh) * 2022-03-29 2022-06-21 蚂蚁区块链科技(上海)有限公司 区块链上实现分布式密钥生成的方法、系统和共识节点
CN114640451A (zh) * 2022-03-29 2022-06-17 蚂蚁区块链科技(上海)有限公司 区块链上实现分布式密钥生成的方法、系统和共识节点

Cited By (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN117134911A (zh) * 2023-10-25 2023-11-28 北京信安世纪科技股份有限公司 秘密共享方法、秘密分割端、秘密恢复端、系统及介质
CN117134911B (zh) * 2023-10-25 2024-01-26 北京信安世纪科技股份有限公司 秘密共享方法、秘密分割端、秘密恢复端、系统及介质

Also Published As

Publication number Publication date
WO2024092936A1 (zh) 2024-05-10

Similar Documents

Publication Publication Date Title
US11388152B2 (en) Manicoding for communication verification
Das et al. Spurt: Scalable distributed randomness beacon with transparent setup
Schindler et al. Ethdkg: Distributed key generation with ethereum smart contracts
JP2023134669A (ja) デジタル資産へのアクセスを移すためのコンピュータ実施方法及びシステム
US10846372B1 (en) Systems and methods for trustless proof of possession and transmission of secured data
CN115941163A (zh) 一种区块链上实现分布式密钥生成的方法、系统和节点
CN111989891A (zh) 数据处理方法、相关装置及区块链系统
Garillot et al. Threshold schnorr with stateless deterministic signing from standard assumptions
CN114640451A (zh) 区块链上实现分布式密钥生成的方法、系统和共识节点
WO2019110399A1 (en) Two-party signature device and method
Yurek et al. Long live the honey badger: Robust asynchronous {DPSS} and its applications
CN114650132A (zh) 区块链上实现分布式密钥生成的方法、系统和共识节点
CN114726517A (zh) 一种区块链上产生随机数种子的方法、系统和共识节点
CN114884652A (zh) 一种区块链上产生随机数种子的方法、系统和共识节点
CN115941164A (zh) 一种区块链上实现分布式密钥生成的方法、系统和节点
Damgård et al. Minimizing setup in broadcast-optimal two round MPC
CN115865341A (zh) 一种区块链上实现分布式密钥生成的方法、系统和节点
CN114640450B (zh) 区块链上实现重传秘密份额与确定失败节点的方法、系统
CN114640452A (zh) 区块链上实现分布式密钥生成的方法、系统和共识节点
Cachin State machine replication with Byzantine faults
CN116032461A (zh) 一种区块链上实现分布式密钥生成的方法和节点
Hong et al. Fair threshold decryption with semi-trusted third parties
Banerjee et al. Cumulus: Blockchain-Enabled Privacy Preserving Data Audit in Cloud
Ding et al. Genuine On-Chain and Off-Chain Collaboration: Achieving Secure and Non-Repudiable File Sharing in Blockchain Applications
Liu Building Practical, Efficient, and Reliable Fault-Tolerant Distributed Systems

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination