具体实施方式
为了便于本领域普通技术人员理解和实施本发明,下面结合实施例对本发明作进一步的详细描述,应当理解,此处所描述的实施示例仅用于说明和解释本发明,并不用于限定本发明。
本发明提供的一种建立在现有的加密货币(基础货币)的基础之上通过分布式匿名机制来保证用户隐私并采用零知识证明进行数据校验的区块链模型,这个模型分为三个部分——最小信任度管理员、私人部分、公共部分,其核心为分布式匿名机制。
最小信任度管理员用来协助交易的进行。在每次交易中,所有参与交易的用户把自己参与此次交易要使用的货币都冻结到这个交易程序中,由这个最小信任度管理员进行相关计算来决定这些货币该如何重新分配,当然,分配前后货币的总价值量保持一致。这个最小信任度管理员能够看到所有交易参与者的输入,并且不会泄露这些用户的输入数据。这个最小信任度管理员由区块链网络中的其他节点担任,这些节点采用类似工作量证明的方法来“竞争上岗”,最后担任最小信任度管理员的节点要支付一定的保证金,若在交易进行过程中由于该最小信任度管理员的问题使交易提前终止,这个保证金不予退还,若是交易圆满完成,该最小信任度管理员不仅可以拿回他的保证金,同时还会得到一定的奖励。也就是说,对于每次交易的进行,都会产生一个最小信任度管理员,而这个最小信任度管理员不等同于一个可信的第三方,因为他可能与某个交易参与者合谋进行资产盗窃,或者是提前终止交易,所以为了保证交易的公平性,要对这个最小信任度管理员收取一定的保证金之后才能确认他不会妨害交易的进行,尽管如此,这个最小信任度管理员也不需要提供或者维持交易的安全性和隐私性,他只是一个推进交易进行的“催化剂”。
私人部分用来定义参与交易的各方的输入信息以及对这些信息的发送和接收,以及交易过程中的相关计算以及交易过程中相关数据的验证。这一部分主要涉及三种操作——冻结操作(freeze),计算操作(compute),结束操作(finalize),这三种操作都是针对用户的私人账本中的货币。冻结操作允许用户像提交数据那样提交自己所拥有的货币,当交易开始时,参与此次交易的用户调用冻结操作提交货币,提交的货币从用户的私人账户中扣除并被冻结到交易程序中。计算操作赋予最小信任度管理员查看相关数据及进行计算的权利,当某个用户调用计算操作后,这个用户的输入数据和提交的货币量就会对这个最小信任度管理员公开,这个最小信任度管理员就可以根据这些数据进行交易中的计算从而得出这些货币应该如何重新分配。结束操作允许最小信任度管理员向区块链网络中的其他节点提交自己的计算结果,最小信任度管理员完成计算后调用结束操作向区块链提交计算结果,经过验证之后,根据计算结果对冻结货币进行重新分配,将其重新存入各个用户的私人账户中。
公共部分用于保证交易的公平进行。假设交易的每个参与者都是自私的,他们会尽可能地去为自己谋求最大利益,有时甚至会进行一些“违法”的操作,如提前终止交易进行以免除付款操作等。为此,必须要有相应的措施对这些非法操作进行制裁。本实施例通过对“违法”用户进行经济制裁,剥夺其部分资产,将其分配给其他参与交易的诚实用户。在这个模型中,还有一个最小信任度管理员,本实施例通过让其缴纳保证金的形式“参与”到此次交易中,并在其做出“违法”行为时没收其保证金分配给其他诚实的交易参与者。
分布式匿名机制,包括新型的货币表示方式、货币所属者的地址表示方法、两种新的交易形式以及一种零知识证明;其不同于现有的区块链技术依靠一个可信方通过对交易记录的打乱重排来实现匿名,所谓分布式匿名就是每个用户自己为自己提供匿名保护。这种机制是建立在基础货币(如比特币)的基础上的一种隐私保护机制。由于执行这种机制的时空开销相对于基础货币来说较大,所以日常交易还是要通过基础货币来进行,但一些涉及隐私的操作就要先采用分布式匿名机制以保证隐私,再通过其他方法将货币转换成基础货币。该机制中涉及如下数据结构和算法:
1.数据结构;
公共账本(public ledger)。用L表示。区块链维持一个公共账本,记录了当前时间下全网发生的所有交易的信息,这些信息包括交易类型、参与交易的用户的地址、交易中涉及到的钱币的序列号以及记录值。对于给定时间T,所有用户都可以获取到发生在时间T之前的交易记录LT。这个公共账本只能添加,即对于T’>T,则有LT是LT’的子集。
私人账本。记为coins。每个用户维持一个私人账本用来记录通过分布式匿名机制生成的具有隐私保护功能的货币。
公共参数(public parameters)。记为pp。包括用来进行零知识证明的密钥对(pkPOUR,vkPOUR)以及用来进行数字签名的密钥对(ppenc,ppsig)。所有用户均可访问。
地址(address)。每个用户至少生成一对地址密钥对(addrpk,addrsk),其中addrpk:=(apk,pkenc),它是公开的,其他用户可以使用这个密钥向它的所有者进行直接的支付;addrsk:=(ask,skenc)由用户自己保存,它允许它的所有者接收发送到addrpk上的资金。另外,用户可以生成任意的地址密钥对;其中apk和ask是用来对用户假名进行保护的一对密钥对,pkenc和skenc是用来完成零知识证明的一对密钥对。
钱币(coins),记为c:=(cm(c),v(c),p(c),addrpk(c),other)。这是一个结构体,用来表示通过DAT生成的具有隐私保护功能的钱币,其中包含了如下一些数据:钱币在公共账本L中对应的记录值cm;钱币的价值量v;钱币的所属者的假名(用来生成钱币的序列号sn);钱币所属者地址的公钥addrpk;other表示一些陷门参数。每个用户所有的c的集合构成了用户的私人账本coins。
两种新的交易形式:(1)“挖掘”交易(mint),记为txmint:=(cm,v,*)。这也是一个结构体类型的数据,包含如下数据:交易所涉及的钱币在公共账本中的记录值cm;钱币的价值量v。除此之外还有一个可选项*,用来备注其他执行依赖信息,比如一些数据或者是陷门参数等;(2)“倾倒”交易(pour),记为txpour:=(rt,sn1 old,sn2 old,cm1 new,cm1 new,vpub,info,*)。同样的,它也是一个结构体,包括如下数据:rt是货币记录值表(CMList)构成的Merkle树的根节点在交易开始之前的值;sn1 old,sn2 old是两种原始货币的序列号;cm1 new,cm1 new是生成的两种货币在公共账本中的记录值;vpub表示要转换成基础货币的价值;info是任意的字符串,用来指示一些信息,一般用来表示vpub的目标;*表示其他一些执行依赖信息,如数字签名、零知识证明信息等。
两种记录信息。对于给定的时间T,可以获取到如下两种记录信息:(1)CMListT表示在时间T时,公共账本中所有的与“挖掘”交易和“倾倒”交易有关的钱币的记录值cm。也就是说,货币记录值表是通过“挖掘”交易和“倾倒”交易生成的钱币的记录值的集合;(2)货币序列号表(SNListT)表示在时间T时,LT中所有出现在“倾倒”交易中的钱币的序列号sn。也就是说,货币序列号表是通过“倾倒”交易花费的钱币的序列号的集合。
2.算法;
初始化(Setup)。Setup用来生成一系列公共参数以实现一次交易中某些参数的初始化。输入包括一个安全参数λ;输出包括一系列公共参数pp。在分布式匿名机制启动时,一个可信方执行Setup算法用来生成一系列可以被所用用户访问的公共参数。这个操作只在分布式匿名机制启动时被执行一次,之后不再执行。
创建交易地址。CreatAddress用来生成一对密钥对,用来代表一个地址。输入包括公共参数pp;输出包括表示地址的密钥对(addrpk,addrsk)。每个用户至少可以生成一个地址对用来完成支付和收款。addrpk:=(apk,pkenc)是公开的,其他用户可以使用它来完成对改地址所属用户的支付,addrsk:=(ask,skenc)是保密的,由用户自己保存,用来接收其他用户支付到addrpk的货款。另外,这个地址对可以是任意的,不需要同其他用户进行协商。
发掘新钱币(Mint)。用户通过“挖矿”发现一个新的货币(coin)后,调用“挖掘”交易生成这个货币并产生一个“挖掘”交易记录。输入包括公共参数pp、货币的价值量v∈{0,1,2,…,vmax}、coin所属用户的公钥addrpk;输出包括价值为v的钱币c:=(cm(c),v(c),p(c),addrpk(c),other)和一条“挖掘”交易记录txmint:=(cm(c),v(c),*)。当用户发现一个新的钱币时,不是直接生成基础货币,而是先生成一种能够保证用户匿名性的货币,在通过验证之后将其存放在用户的私人账本中,然后在适当的时候在转换成基础货币。vmax表示系统设定的一个钱币允许的最大价值。
消费钱币(Pour)。“倾倒”交易将输入钱币转换成新的输出钱币,输入钱币就可以作为开销。同时“倾倒”交易操作可以实现钱币的合并、拆分以及转换成基础货币。输入包括公共参数pp、基于货币记录值表的Merkle树的根节点值rt、原始钱币c1 old,c2 old、原始钱币所属用户的地址的私钥addrsk,1 old,addrsk,2 old、从cm(c1 old)和cm(c2 old)到根节点的路径P1,P2、新的钱币的价值量v1 new,v2 new、新钱币所属的地址的公钥addrpk,1 new,addrpk,2 new、要转换成基础货币的值vpub、交易备注信息info(可选);
输出包括新的钱币c1 new,c2 new;pour交易记录txpour。Pour算法将两个不同的钱币c1 old,c2 old作为输入,并输入一个基于货币记录值表的Merkle树的根节点来验证这两个值的正确性和可用性,同时为了提高验证效率,输入c1 old和c2 old到根节点的可信路径P1,P2。v1 new和v2 new用来指定输出钱币的价值量,vpub表示要转换成基础货币的价值,也就是说v1 new+v2 new+vpub=v1 old+v2 old,而addrpk,1 new,addrpk,2 new分别表示接收这两个钱币的地址,info用来指定vpub的目标。通过对这些变量赋予一些特殊值(如0)可以实现货币的组合,拆分,转移等。
交易验证。VerityTransaction用来验证交易的有效性。输入包括公共参数pp、一个“挖掘”或“倾倒”交易记录tx、当前的公共账本L;输出包括一个比特信息,为1表示验证结果为有效,否则验证结果为无效。“挖掘”交易或“倾倒”交易必须在被记录之前进行验证,确认这个交易过程是正确的。验证操作可以被区块链网络中的所有节点执行。
收款。Receive允许用户扫描公共账本,接收与自己私钥相匹配的钱币。输入包括调用者的地址密钥对(addrpk,addrsk)、当前时间下的公共账本L;输出包括可接收钱币的集合。Receive操作只用来接收那些通过“倾倒”交易的方式发送到用户addrpk上的钱币,而对于用户自己通过Mint方式生成的钱币则不予理会。当一个地址为(addrpk,addrsk)的用户想接收支付到该地址的货款时,调用Receive遍历L中的“倾倒”交易,输出那些地址为addrpk并且还没有被使用的钱币,换句话说,就是扫描L中的“倾倒”交易,记录其中出现钱币的记录值并筛选出序列号没有出现在L中的钱币予以输出。
以下是本实施例的算法具体流程:
Freeze:
交易的参与者u想要使用c∈coins进行交易,设u的地址为(addrpk u,addrsk u),最小信任度的管理员的地址为(addrpk M,addrsk M),具体操作如下:
(1)SetC:=Eenc(pkenc M,(v,p,r,s))
(2)生成(pksig,sksig):=Ksig(ppsig)
(3)hsig:=HASH(pksig)
(4)h:=PRFsk(u)(hsig)
(5)Setx:=(rt,snu,hsig,h)
(6)Set a:=(path,c,addrsk u)
(7)π:=Prove(pkPOUR,x,a)
(8)Set m:=(x,π,C)
(9)ρ:=Ssig(sksig,m)
(10)发送(x,π,m,ρ,pksig)给最小信任度的管理员M
(11)对c进行冻结
参与交易的所有用户共同维持一个交易池,每个用户使用pour操作将钱转移到这个交易池中。每个交易池对用户提交coin的sn进行记录。
Compute:
最小信任度的管理员M维持一个字典(key,value),其中key:=addrpk u,value表示用户u提交的钱币的价值量。M收到u发来的消息后首先进行校验:
(1)如果rt在公共账本L中没有记录,在字典中加入(addrpk u,0)
(2)M检查交易池,如果交易池中找不到匹配的sn,在字典中加入(addrpk u,0)
(3)计算hsig:=HASH(pksig)
(4)计算b:=Vsig(pksig,m,ρ)
(5)计算b’:=Verify(vkPOUR,x,π)
(6)如果b&b’==1,则在字典中加入(addrpk u,v);否则加入(addrpk u,0)
然后M安装合约中约定好的方法计算,对价值进行重新分配,并更新字典。
Finalize:
M将计算结果的零知识证明发送给区块链让全网节点进行验证,验证成功后M按照计算结果使用pour操作对交易池中的货币进行重新分配。
Setup
·INPUT:安全参数λ
·OUTPUT:公共参数pp
1)在安全参数λ的参与下为POUR构建CPOUR
2)(pkPOUR,vkPOUR):=KeyGen(1λ,CPOUR)
3)ppenc:=Genc(1λ)
4)ppsig:=Gsig(1λ)
5)pp:=(pkPOUR,vkPOUR,ppenc,ppsig)
6)输出pp
CreatAddress
·INPUT:公共参数pp
·OUTPUT:地址密钥对(addrpk,addrsk)
1)(pkenc,skenc):=Kenc(ppenc)
2)随机采样一个PRF的种子ask
3)apk:=PRFask(0)
4)addrpk:=(apk,pkenc)
5)addrsk:=(ask,skenc)
6)输出(addrpk,addrsk)
Mint
·INPUT:
-公共参数pp
-coin的价值量v∈{0,1,2,…,vmax}
-coin所属用户的公钥addrpk
·OUTPUT:价值为v的钱币c和一条mint记录txmint
1)解析addrpk,还原出(apk,pkenc)
2)随机采样一个PRF种子p作为假名
3)随机选取两个COMM陷门r,s
4)k:=COMMr(apk||p)
5)cm:=COMMs(v||k)
6)Set c:=(cm,p,v,addrpk,r,s)
7)Set txmint:=(cm,v,*),其中*:=(k,s)
8)输出c和txmint
Pour
·INPUT:
-公共数据pp
-基于CMList的Merkle树的根节点值rt
-原始钱币c1 old,c2 old
-原始钱币所属用户的地址的私钥addrsk,1 old,addrsk,2 old
-从cm(c1 old)和cm(c2 old)到根节点的路径Path1,Path2
-新的钱币的价值量v1 new,v2 new
-新钱币所属的地址的公钥addrpk,1 new,addrpk,2 new
-交易备注信息info(可选)
·OUTPUT:新的钱币c1 new,c2 new和一条pour记录txpour
1)for i in{1,2}
a)解析ci old,还原出(addrpk,i old,vi old,pi old,ri old,si old,cmi old)
b)解析addrsk,i old,还原出(ask,i old,skenc,i old)
c)sni old:=PRFask,I(pi old)
d)解析addrpk,i old,还原出(apk,i old,pkenc,i old)
e)随机选取一个PRF种子pi new
f)随机选取两个COMM陷门ri new,si new
g)ki new:=COMMr(addrpk,i new||pi new),r:=ri new
h)cmi new:=COMMs(vi new||ki new),s:=si new
i)Set ci new:=(cmi new,pi new,vi new,addrpk,i new,ri new,si new)
j)Set Ci:=Eenc(pkenc,i new,(pi new,vi new,ri new,si new))
2)生成(pksig,sksig):=Ksig(ppsig)
3)hsig:=HASH(pksig)
4)h1:=PRFask,1(hsig),h2:=PRFask,2(hsig)
5)Setx:=(rt,sn1 old,sn2 old,cm1 new,cm2 new,hsig,h1,h2)
6)Set a:=(path1,path2,c1 old,c2 old,addrsk,1 old,addrsk,2 old,c1 new,c2 new)
7)πPOUR:=Prove(pkPOUR,x,a)
8)Set m:=(x,πPOUR,info,C1,C2)
9)ρ:=Ssig(sksig,m)
10)Set txpour:=(rt,sn1 old,sn2 old,cm1 new,cm2 new,info,*),其中*:=(pksig,h1,h2,πPOUR,C1,C2,ρ)
11)输出c1 new,c2 new和txpour
VerifyTransaction
·INPUT:
-公共参数pp
-一个mint或pour交易记录tx
-当前的公共账本L
·OUTPUT:一个比特信息,为1表示有效,否则无效
1)如果tx==txmint
a)解析txmint,还原出(cm,v,*),其中*:=(k,s)
b)Set cm’:=COMMS(v||k)
c)如果cm’==cm,输出b:=1;否则输出:=0
2)如果tx==txpour
a)解析txpour,还原出(rt,sn1 old,sn2 old,cm1 new,cm2 new,info,*),其中*:=(pksig,h1,h2,πPOUR,C1,C2,ρ)
b)如果sn1 old或者sn2 old在L中有记录,或者sn1 old==sn2 old,则输出b:=0
c)如果rt在L中没有记录,则输出b:=0
d)hsig:=HASH(pksig)
e)Set x:=(rt,sn1 old,sn2 old,cm1 new,cm2 new,hsig,h1,h2)
f)Set m:=(x,πPOUR,info,C1,C2)
g)b:=Vsig(pksig,m,ρ)
h)b’:=Verify(vkPOUR,x,πPOUR)
i)输出b&b’
Receive
·INPUT:
-公共参数pp
-调用者的地址密钥对(addrpk,addrsk)
-当前时间下的公共账本L
·OUTPUT:可接收钱币的集合
1)解析addrpk,还原出(apk,pkenc)
2)解析addrsk,还原出(ask,skenc)
3)对公共账本上的每一条pour交易:
a)解析txpour,还原出(rt,sn1 old,sn2 old,cm1 new,cm2 new,info,*),其中*:=(pksig,h1,h2,πPOUR,C1,C2,ρ)
b)for i in{1,2}
I)(vi,pi,ri,si):=Denc(skenc,Ci)
II)如果Denc的输出不为空,验证:sni在公共账本中没有记录以及cmi new==COMMs(vi||COMMr(apk||pi))
如果上一步的校验通过,则输出ci:=(addrpk,vi,pi,ri,si,cmi new)。
本发明具有以下有益效果:
1.钱币所有者的匿名性;
COMM表示一种统计隐藏的非交互式提交方法,具体来说就是对于给定的随机数r以及消息m,c:=COMMr(m)表示要记录的信息。
简单来说,当一个新的钱币产出时(通过“倾倒”操作),它的所有者u采样一个随机序列号sn以及一个陷门r,计算出要记录在公共账本上的信息cm:=COMMr(sn)并令c:=(cm(c),r(c),sn(c))。同时,一个对应的“倾倒”交易记录txmint(包含cm,但不包含sn或r)被记录在公共账本L中。
当u想要使用c时,发送一个消息到区块链,这个消息中包含c的序列号sn以及一个关于“我知道cm:=COMMr(sn)中的r”的零知识证明π,这样其他节点在不知道u的身份的情况下就可以确认u确实拥有c。
2.直接匿名支付;
当一个用户uA把一个钱币c:=(cm(c),r(c),sn(c))转移给用户uB后,uA仍然知道c的序列号以及cm(c)的陷门,换句话说,uA仍然可以使用c,而且当uB使用c时,uA就知道是uB在进行交易,这样就无法保证uB的匿名性,因此对原有的数据形式进行了改进。PRFx(·)表示以x为种子的匿名随机函数。
为了确定付款目标,每个账户(一个用户可以有多个账户)都要有一个唯一标识,本实施例用密钥对的形式来表示这个唯一标识,称作该账户的地址。用户u按如下方式产生地址密钥对:随机生成ask,然后生成apk:=PRFask(0)。于是对c:=(cm(c),r(c),sn(c))做如下扩展:当用户u发现一个新的钱币时,随机生成p(可以作为交易时的假名使用),计算sn:=PRFask(p),然后计算k:=COMMr(apk||p)以及cm:=COMMs(v||k),因此c:=(cm,p,v,apk,r,s)、txmint:=(cm,v,k,s)。很显然,任何人都可以验证txmint中的cm所表示的c的价值确实为v,但是无法获取apk以及sn。
“倾倒”交易是用来实现钱币支付的操作,它以某些钱币作为输入,以另外一些具有相同价值的新的钱币作为输出,这样就保证了当uA把一个钱币c转移给用户uB后,uA不知道新的钱币c’的sn,他也无法使用c’。具体来说,其实现过程如下:假设用户u有地址密钥对(ask old,apk old),他想要使用cold:=(apk old,vold,pold,rold,sold,cmold),u调用“倾倒”操作之后生成两个新的钱币c1 new和c2 new,它们的地址公钥分别为apk,1 new,apk,2 new(apk,1 new,apk,2 new可能属于u或者属于其他用户)。c1 new和c2 new的生成方法与Mint操作中生成新钱币的方法一样。假设u不知道与apk,1 new相匹配的ask,1 new,u就无法使用c1 new,因为他无法证明他是c1 new的拥有者;同样,当另外一个用户u’(他知道ask,1 new)试图使用c1 new进行消费时,u也无法对其进行追中,因为u不知道任何关于c1 new的序列号sn1 new的信息。
3.钱币转移;
u通过调用“倾倒”操作产生了两新的钱币c1 new和c2 new,假设apk,1 new是u1的地址公钥,为了使u1能够真正使用c1 new,u1必须知道c1 new中的一些秘密参数(如一些陷门参数)。一种方法是u直接给u1发送一条私密信息,这就需要u和u1之间有一条直接的可信的私密通道,由于u和u1的任意性,全网中任意两个节点之间都要有这种通道,很显然,这样会带来大量成本开销,是不太现实的,于是本实施例采用公共账本来完成这个过程:
之前定义的地址密钥对(ask,apk:=PRFask(0)),对其结构进行修改以实现地址密钥的隐私保护:addrsk:=(ask,skenc),addrpk:=(apk,pkenc)。然后u使用
pkenc,1 new对(v1 new,p1 new,r1 new,s1 new)进行加密得到密文C1,u将C1嵌入到txpour与其一同记录在L中。u1查找L获得u记录的交易信息txpour并从中提取出C1,然后验证者使用skenc,1 new对C1解密即可得到(v1 new,p1 new,r1 new,s1 new)。同样,使用pkenc,2 new对(v2 new,p2 new,r2 new,s2 new)进行加密得到C2并嵌入到txpour中,然后由验证者进行解密。
4.基础货币的转换;
“倾倒”操作允许用户对钱币进行转移,拆分,合并。除此之外,本实施例对“倾倒”交易进行修改允许用户将通过DAT机制生成的钱币c:=(apk,v,p,r,s,cm)转换成基础货币,为此在“倾倒”交易中添加两个值,vpub和info,其中vpub用来指定要转换成基础货币的价值量(若不希望进行基础货币的转换,则将该值设为0),info用来指定vpub的目的地址,这两个值是全局可见的。
5.防扩展性攻击;
攻击者可以通过更改txpour中的info值重新定位vpub所指代的基础货币的交付对象。为此,本实施例采用数字签名的方法抵抗这种攻击,具体实施过程如下:
当用户u进行pour操作时,(1)选取一个密钥对(pksig,sksig)用来进行一次签名;(2)计算hsig:=HASH(pksig);(3)计算两个值:h1:=PRFsk,1(hsig)和h2:=PRFsk,2(hsig),这就相当于将hsig附着在两个原始钱币所有者的地址私钥上;(4)将hsig,h1,h2添加到POUR中,并校验后两者的正确性;(5)用sksig对POUR操作相关的每个值进行签名,获得ρ。由于ask,i old是保密的,hsig在每次交易中也是不一样的,所以h1和h2的值是不可预测的。
6.货币记录值表(CMList)的组织方式;
货币记录值表是所有与“挖掘”操作和“倾倒”操作相关的钱币在公共账本L中的记录值cm的集合,按照Merkle的方式进行组织以加快验证效率。假设要验证cmi,只需给出cmi到rt路径上所有节点的HASH值,就可以快速验证cmi的存在性和正确性,这也就是说一个节点不用维持整个货币记录值表就可以完成校验工作,大大减少了校验过程的时空开销。
应当理解的是,本说明书未详细阐述的部分均属于现有技术。
应当理解的是,上述针对较佳实施例的描述较为详细,并不能因此而认为是对本发明专利保护范围的限制,本领域的普通技术人员在本发明的启示下,在不脱离本发明权利要求所保护的范围情况下,还可以做出替换或变形,均落入本发明的保护范围之内,本发明的请求保护范围应以所附权利要求为准。