一种账户数据链的实现方法

摘要:一种化链为点的存储验证系统中,提出了一种等价验证的方法,通过每个轻客户端节点存储并验证部分账本数据,从而等价为验证了整个账本数据。同时提供检索功能,能够根据txid进行检索。但txid是交易数据的哈希值,与用户并无关联,并不方便用户检索自己的交易数据,并且缺少隐私保护的方式。本文提出一种账户数据链的实现方法,结合机密交易从而实现用户数据的隐私和检索。

 

一.简介

在一种化链为点的存储验证系统中,提出的类Bitcoin系统的交易数据能够形成一条UTXO链,并且是DAG的链式结构。该UTXO链的连接方式为全局唯一的txid(+index),也即交易数据的哈希值与输出索引号。可以将该连接方式替换为其它的连接方式,在保持UTXO链不变的同时,并引入一种账户数据链,将某个用户的相关数据隐蔽的连接在一起。

 

二.账户数据链

在一种化链为点的存储验证系统中,连接存储的输入引用地址为txid(+index),将输入引用地址替换为一个唯一生成的地址,该地址的生成方式是由一个生成参数(或地址参数),与用户的地址生成密钥,生成输入数据里的输出地址,也即是输出数据里的输入引用地址。因为类Bitcoin的锁定脚本中包含一个由用户公钥生成的地址,而对应的解锁脚本中包含该地址的公钥和签名,锁定脚本和解锁脚本是通过txid(+index)相关联。所以可以使用生成全局唯一的一次用户地址方式,替换锁定脚本中由用户公钥生成的地址,对应的解锁脚本中包含该一次地址的公钥和签名,锁定脚本和解锁脚本则通过该一次地址相关联,所以连接存储的输入输出地址也为该一次地址。因为该一次地址可以是由用户一次公钥生成,所以也可以把用户的地址生成密钥,看作为用户的地址主密钥,与不同的生成参数,生成不同的用户公钥,进而生成不同的用户地址。这时未花费交易输出的引用就从txid(+index)变成了全局唯一的一次用户地址,但与txid不同的是,一个交易的输出地址如果是txid,则只会有一个txid(index不同),但替换为一次用户地址的方式后,不同用户的输出地址是不同的,但这并不会影响UTXO链的连接,所以也不会影响连接存储的有效性。

比如Alice转账给Bob的交易Tb,Bob再转账给Charlie和David的交易Tc。可知Tb的输入地址为Alice的地址,输出地址为Bob的地址;而Tc的输入地址为Bob的地址,输出地址分别为Charlie的地址和David的地址。再结合连接存储可知,存储Alice地址的节点,输出数据为Tb;存储Bob地址的节点,输入数据为Tb,输出数据为Tc;存储Charlie地址的节点,输入数据为Tc;存储David地址的节点,输入数据为Tc。可以看出不同用户的地址(对应的交易数据)是存储在不同节点上的。交易数据Tb是Bob的接收交易数据,交易数据Tc是Bob的发送交易数据,并且发送交易数据引用了接收交易数据的输出地址,所以连接存储也是将一个用户的发送交易数据及其引用的接收交易数据关联在一起的。而该地址是由一个生成参数与用户的地址生成密钥生成,假设该生成参数在上一个存储Bob地址节点的连接存储的输入数据中,则生成了本次存储Bob地址节点的连接存储的输入输出地址,也即为key值;而本次存储Bob地址节点的连接存储的输入数据中包含一个新的生成参数,则会生成下一个存储Bob地址节点的连接存储的输入输出地址;所以Bob能够根据上一个存储Bob地址的输入数据,结合Bob的生成密钥生成本次存储Bob地址的key值,进而实现了正向查找的能力,并且输出数据为空时,也即输入数据没有花费,也是可以查找的。而输入数据对应了Bob的接收交易数据,所以也相当于是将Bob所有的接收交易数据依次连接形成了一条链,本文称之为账户数据链。

账户数据链是根据用户的上一次(接收)交易数据里的生成参数,与用户的地址生成密钥,生成了本次(接收)交易数据的地址;并由本次(接收)交易数据里的生成参数,与用户的地址生成密钥,生成了下一次(接收)交易数据的地址;进而形成了一条正向连接的链。该链与UTXO链的区别在于,UTXO链的任意一个连接,都会在某个节点上形成连接存储的输入数据和输出数据,如果没有输出数据,则是未引用交易,并没有形成连接,所以UTXO链会在某个节点上形成连接存储,反映了链的一次连接关系,也即一次交易的输入输出关系;而账户数据链是将某个用户相关的数据连接起来的链,反映的是某个用户的数据链,需要用户的密钥才能检索,所以是隐蔽的。账户数据链也可以用于用户的其它数据,比如非UTXO链上的用户数据,使用上一次用户数据里的生成参数,与用户的地址生成密钥,生成本次用户数据的地址;并用本次用户数据里的生成参数,与用户的地址生成密钥,生成下一次用户数据的地址。所以UTXO是外部的、全局的、公开的、反向的,而账户数据链是内部的、个人的、隐蔽的、正向的。一个系统通常只有一条UTXO链,而账户数据链可以是无数条融入到用户数据里面的,能够提供用户隐私检索的能力。比如上述由某个用户所有的接收交易数据形成的账户数据链,该用户就能通过地址生成密钥依次检索,并且用户的发送交易数据是与引用的接收交易数据连接存储关联在一起的,所以也就可以检索到该用户所有的交易数据。

 

三.地址生成方法

类Bitcoin一般使用椭圆曲线离散对数生成用户的公私钥,然后使用哈希算法从公钥生成地址。

设E是定义在有限域Fq上的椭圆曲线,n是E(Fq)的阶,G为基点,假设n为素数(spec256k1和SM2都能满足)。用户私钥为d,通过具有单向性的椭圆曲线标量乘法,运算得到用户公钥P = [d] * G。

设用户的地址生成密钥为s,生成参数为c,然后通过散列函数计算中间值k = H(s, c),其中H及后文的散列函数可以是不同哈希算法的组合。计算Q = [k] * P,这里的Q就是生成的一次公钥,然后再计算L = HL(Q),得到生成的一次地址L。L可以用于锁定脚本中的地址,Q就是该地址对应的公钥,而对应的私钥为dt = (d*k) mod n,可以根据私钥生成解锁签名,以解锁未花费交易输出变为已花费。

可以看出,知道了用户的公钥P,以及用户的地址生成密钥s,就可以根据上一次接收交易数据里的生成参数c1,计算得到本次接收交易数据的地址L2;再根据本次接收交易数据里的生成参数c2,计算得到下一次接收交易数据的地址L3;其中第一个生成参数c0可以是固定值比如用户ID,也可以是用户注册时的随机值。所以根据用户公钥P和用户地址生成密钥s,以及第一个生成参数c0,就可以检索到用户所有的接收交易数据,而用户所有的发送交易数据是与之关联的连接存储上的输出数据,如果没有则是未花费。但是知道P和s,并不会知道用户的私钥d,也就不能计算出dt,所以只有用户自己能够签名生成解锁脚本。所以第三方获取用户的生成密钥s后也可以检索用户的交易数据,但不能计算出dt解锁用户的未花费交易。

比如要证明某个一次地址Lx是Bob的,可以给出该地址的公钥Qx相对于Bob公钥P的签名。这时的私钥相当于是中间值kx,基点为Bob的公钥P,因为Qx = [kx] * P,并且Lx = HL(Qx)。因为椭圆曲线标量乘法具有单向性,无法根据其他人的一次地址Ly所对应的公钥Qy,找到对应的ky,使得Qy = [ky] * P,其中P为Bob的公钥,所以也就无法给出其他人的一次地址Ly对应的公钥Qy相对于Bob公钥P的签名;同理也无法找到Bob的一次地址Lx对应的公钥Qx相对于其他人公钥Py的签名,所以能够证明该地址是Bob的地址。并且不会知道用户的地址生成密钥s,也就不能知道用户的其它接收交易数据,所以也只知道与之连接的发送交易数据。所以第三方和用户自己都可以证明某个地址是属于该用户的(第三方需要知道中间值k,不需要知道s),并且不会泄露用户其它交易数据的隐私。

如果使用的是多重签名地址,假设原来是由P1、P2、… Pm生成的多重签名地址,现在变化为由生成密钥s1、s2、… sm以及生成参数c,通过散列函数计算多个中间值k1 = H1(s1, c)、k2 = H2(s2, c)、… km = Hm(sm, c),然后将每个中间值与原来的每个公钥一一对应,生成新的多个公钥,Q1 = [k1] * P1、Q2 = [k2] * P2、… Qm = [km] * Pm,然后根据新的公钥生成新的多重签名地址,L2 = HL2(Q1, Q2, …Qm)。新的多重签名地址与上述非多重签名地址有类似的功能和作用。

 

四.隐私性

上述通过生成地址的方式,实现了一次性地址的功能,从而无法使地址与用户关联上,但能通过用户公钥证书和签名证明该地址所属的用户,并且能够通过地址生成密钥实现检索功能。

交易数额可以通过机密交易(Confidential Transactions)进行保护,通过Pedersen承诺或加法同态承诺验证机密交易的输入数额等于输出数额,并使用范围证明验证机密交易的数额有效。也即把交易数额变为承诺后的密文,但可以通过密文验证交易数额是否正确。

机密交易中一般具有盲化因子,用于盲化实际的交易数额,这里假设将盲化因子加密存储在交易数据中,以方便用户获取,并且只需要使用承诺隐藏交易数额,花费还是使用一次用户地址对应的私钥进行解锁。可以使用生成密钥的方式,生成一次用户加密密钥保护盲化因子。但与上述生成地址的方式不同,这里只需要根据本次交易里的生成参数,与加密生成密钥生成一次加密密钥,进而保护盲化因子。比如用户的加密生成密钥s2,与本次交易里的生成参数c,通过散列函数计算哈希值ke = He(s2, c),然后使用ke作为一次加密密钥保护盲化因子,加密算法可以是对称加密算法。除盲化因子外,生成的一次加密密钥也可以用于保护本次交易里用户的其它数据。

如果采用能抵抗量子计算破解的散列函数,还可以进一步加强安全性。比如某个地址Lx的公钥Qx,其对应的私钥dtx被破解,其中Qx = [dtx] * G,也即椭圆曲线标量乘法不再具有单向性。但此时是无法与系统里的某个用户公钥关联上的,因为任意一个用户的公钥P’,都能找到一个k’值,使得Qx = [k’] * P’,也即该地址的公钥能从所有的用户公钥计算得到;私钥也是类似的,dtx = (d’*k’) mod n,其中d’可以是任意一个用户的私钥。所以即使量子计算破解了椭圆曲线上的离散对数运算,但还是无法将某个交易与具体的用户关联上,因为需要破解中间值k,而中间值k是采用能抵抗量子计算破解的散列函数生成的。在多重签名地址的生成中,每个公钥都采用了不同的散列函数生成不同的中间值,因为如果不同公钥使用相同的中间值,可能会导致破解后找到对应的公钥,从而导致用户隐私泄露。

生成的一次加密密钥也类似,因为每个交易中的加密密钥都是不同的,无法找到不同交易加密密钥的关联,所以也就保护了用户隐私。可以看出,该方法主要是将破解与用户的关联转移到了散列函数,并通过能抵抗量子计算破解的散列函数保护用户隐私。所以其主要作用在于,系统未来升级为抗量子计算破解的算法后,之前公开的数据不会因为被破解而导致用户隐私泄露。

但这里还有两个问题,一个是连接存储需要保留UTXO链,所以用户的发送交易引用接收交易时,该接收交易的其它用户可能会知道;如果发送交易中有找零交易,该找零交易是在UTXO链上的,也可能有泄露的风险。二是目前的机密交易是不能够抵抗量子计算破解后不泄露交易数额的,交易数额的透明化也可能导致用户相关数据的泄露。这里可以采用一种中间用户的混淆方式,比如找零的是中间用户RA的地址,而中间用户RB再将相应的余额发送回给用户,并且可以是多个无相关的用户在同一交易里返回,因为都是一次性的地址。而中间用户RA和RB可以是无关的,这样该用户的下一次交易在UTXO链上就被打断了。交易数额也可以做进一步的混淆处理,从而加强用户数据的隐私。

 

五.总结

在一种化链为点的存储验证系统的基础上,再次融入了一种链,本文称之为账户数据链。所以系统中可以有三种不同的链,以下分析各种链的不同特点和应用:

  1. 区块(头)链,由区块(头)数据依次连接构成,这是一条反向连接的链,可以反映一致的状态,并且可以使用Merkle Tree验证某个交易数据是否为链上的数据并且未被篡改,保证了账本数据的不可篡改性和客户端状态的一致性。
  2. 交易数据形成的UTXO链,由交易数据引用前向的未花费交易输出并创建新的未花费交易输出,且不断循环的向后延伸构成,这是一条反向连接的链,并且是DAG的链式结构,可以使用连接存储将其转化“点”的方式进行处理,保证了交易数据的正确性,包括引用的未花费交易输出是否存在、有无双花、交易数额是否正确、解锁签名是否有效等。并能通过等价验证,使每个客户端存储和验证部分账本数据,等价为验证了整个账本数据。
  3. 账户数据链,由每个用户各自的(交易)数据形成的逻辑链,这是正向连接的链,可以是无数条链融入到用户数据里,用户可以通过密钥实现隐私检索。并且具有一次性地址的功能,结合机密交易实现用户数据的隐私。

系统就从上一篇的连接存储的key为txid,改变成为了用户的地址,并且通过账户数据链使用户连接存储的key也即用户地址隐蔽的连接在一起,所以用户就能通过地址生成密钥依次检索,同时具有一次性地址的功能,并结合机密交易实现用户数据的隐私。系统里的结构化对等网络轻客户端节点也就能构成集存储、验证、用户数据隐私检索为一体的系统结构,每个节点只需存储部分账本数据并验证部分账本数据即可等价为验证了整个账本数据,并且同时提供了用户数据的隐私检索功能。

 

参考

1.Gregory Maxwell. Confidential transactions. https://people.xiph.org/~greg/confidential_values.txt, 2016.

 

注:文本中的相关技术已申请PCT专利,未经许可不得使用。

猜你喜欢

转载自blog.csdn.net/zym11/article/details/106679812
今日推荐