侧链:私密交易
私密交易
本文译自元素链官网:http://elementsproject.org 上的链接:
https://people.xiph.org/~greg/confidential_values.txt 2015/06/11
译者:申屠青春 深圳大学ATR国防科技重点实验室博士 新浪微博 @我看比特币
注意:本文可随意转发,请留下译者信息,如果觉得本文对你有用,请给译者捐赠,以便翻译更多比特币的核心资料。捐赠地址:1AvjkJrChQDDJ8RhVZ9XYyc422ikUyJA12
译者前言
比特币在国内已经众所周知,但是技术研究并未有效开展,大部分人处于知道和了解程度,一个重要原因是大多数比特币核心资料都是英文,很少有人能静心看完如此繁杂的英文资料。本人拟在研究其英文技术的同时,对一些重要资料进行翻译,让更多的圈内人对比特币有更多的理解。
本文涉及侧链技术,是元素链Alpha版本的中的重要特性“私密交易”的技术说明文章。
正文
1私密交易
元素链中有一个最有用的新特性就是私密交易,一个用来提高比特币隐私性和安全性的密码学工具。该特性仅允许交易的参与者(或他们指定的人)知道交易金额。
比特特币区块链的安全性由统一验证来保证:每个参与者独立和自动化验证每个交易的合法性,无需信任第三方。另一个不利的影响就是所有交易数据必须公开,才能进行公开验证,这点对于传统金融机构的正常需求来说的确显得很奇怪。
财务隐私不充分对商家和个人来说,都会有严重的安全和隐私问题。没有充分的隐私保护,盗贼和诈骗者会着重关注高价值目标,商业竞争者会知道商业细节,谈判地位会被泄漏。因为公开信息需要花费交易,缺乏隐私机制使得其他人免费得到相关信息。隐私不充分还会导致可替换性受损—一些币比其他币更易接受—进一步破坏比特币作为货币的职能。
比特币使用地址部分解决隐私问题,如果人们不知道哪个用户拥有某些地址,隐私能得到保证。但是只要你和其他人交易,你就知道了对方至少一个地址。从这个地址开始,你可以追踪到其他相关联地址,并且评估交易金额和留存金额。举例说:假定你的老板用比特币支付你工资,你后来用这些比特币来支付你的房租和食品。你的房东和超市都知道了你的收入,当你的收入提高时,他们有可能提高给你的价格,或者把你当成盗窃的目标。
目前已经有些技术来进一步提升比特币隐私性(如CoinJoin,以联合支付方式来合并交易),但是这些技术的应用不多,因为有可能追踪到金额。
还有另外一些在竞争链中提出的密码学技术来提升隐私,但是他们都破坏了“剪枝”(比特币创世文章第7部分),使得用户需要一个永远增长的数据库来验证新交易,因为这些系统不知道币是否已经被花费。大多数密码学隐私系统的性能较差,高负载或需要很强密码学假设(而且不易懂)。
私密交易使得交易金额更隐私,同时能让公众网络来验证留存的区块链交易,做到这些无需在比特币系统中新增新的密码学假设,并且系统开销可控。
由于加法同态承诺的密码学技术,CT(私密交易)是可行的,另一方面,CT还启用了附加的隐私“备忘”数据(如发票号或撤款地址)交换,且通过回收大多数CT密码学证明的开销,使得交易大小不会增加。
2私密交易背后的技术
以下工作由Adam Back首次在Bitcointalk上的帖子“bitcoins with homomorphic value(同态值比特币)”:[https://bitcointalk.org/index.php?topic=305791.0]中提出。为了创建CT,我们实现了几个新密码系统,发明了环签名的一般化和几个新优化方法,使得结果更高效。
2.1佩德森的承诺
CT的基础密码学工具是佩德森的承诺。
承诺场景让你把一段数据作为私密保存,但是要承诺它,使得你后来不能改变该数据。一个简单的承诺场景用哈希函数构建如下:
承诺 = SHA256(盲化因子||数据)
如果你仅告诉别人承诺,别人没法确定你承诺了什么数据(对哈希表的属性给定某些假设)。但你后来揭露了盲化因子和数据,别人可以运行该哈希函数来验证是否与你以前的承诺相匹配。盲化因子必须存在,否则别人可以试图猜测数据。如果你的数据比较少而简单,猜测成功可能性比较大。
佩德森承诺与以上场景中的承诺类似,但是附加一个特性:承诺可以相加,多个承诺的总和等于数据总和的承诺(盲化因子的集合即盲化因子总和):
C(BF1, data1) + C(BF2, data2) == C(BF1 + BF2, data1 + data2)
C(BF1, data1) - C(BF1, data1) == 0
换句话说,加法律和交换律适用于承诺。
If data_n = and BF_n = then: C(BF1, data1) + C(BF2, data2) - C(BF3, data3) == 0
我们用椭圆曲线点来构建具体的佩德森承诺(读者无需理解椭圆曲线密码学体系,当成黑盒行为来了解就可以了)。
通常,ECC公钥由私钥x乘以基点G生成。
PUB = xG
结果通常保存为33字节的数组。
ECC公钥遵守以前描述过的加法同态性:
PUB1 + PUB2 = (x1 + x2 ( mod n ))G
(以上特性被BIP32分层确定性钱包用来允许第三方生成新的比特币地址)
佩德森承诺的额外基点(我们叫H点)生成办法,因而没人知道H对G的离散对数(反之亦然),意思是说没人知道x,且xG = H。我们使用G哈希来选择H:
H = to_point(SHA256(ENCODE(G)))
这里to_point把输入当成椭圆曲线上某个点的x值,并且计算出y值。
给定两个基点我们能构建如下承诺场景:
承诺 = xG +aH
这里x是私密盲化因子,a是我们要承诺的金额,你可以用加法交换律验证加法同态承诺场景中的相关关系。
佩德森承诺是信息理论上的隐私,你看到的所有承诺,总能找到一些盲化因子,可以和任意金额一起匹配该承诺。如果你的盲化因子真的随机的话,甚至连具有无穷计算力的攻击者都不能分辨你承诺的金额。这些承诺对于假冒承诺来说是计算安全的,你实际上不能计算出任意映射。如果你做到,这就意味着你能找到两个基点相对于彼此的离散对数,意味着承诺群的安全性受到损害。
2.2佩德森承诺应用
利用该工具,我们替换比特币交易中的8字节整数金额为32字节佩德森承诺.
如果一个交易的发起人认真选择他们的盲化因子,以便正确相加,然后网络还能通过承诺相加为0来验证该交易。
(In1 + In2 + In3 + plaintext_input_amount*H…) -
(Out1 + Out2 + Out3 + … fees*H) == 0
以上公式需要明确的交易费用,在实际交易中,这点没有问题。
生成承诺和承诺验证非常简单,不幸的是,如果没有附加的措施这个场景是不安全的。
问题在于该群是循环群,加法要 mod P(一个256位的质数,用于定义群的秩),结果大数的加法会“溢出”,从而像个负数金额,因而当有些输出金额为负时,承诺加起来为0的特点依然存在,导致可凭空创造5个比特币。
(1 + 1) - (-5 + 7) == 0
以上式子可以被解释成“有人花了2个比特币,得到-5个比特币和7个比特币”。
为了防止产生这种情况,交易中有多输出的时候,我们必须证明每个承诺输出金额都在允许范围(如[0,2^64])内且没有溢出。
我们可以公开金额和盲化因子,以便网络能检查,但是这样一来就损失了所有隐私。因而,我们要证明承诺的金额在允许范围内,除此之外不透露任何信息:我们需要额外密码学系统来证明佩德森承诺的范围,我们使用类似于Schoenmakers二元分解的技术,但是进行了许多优化(包括不使用二元)。
我们从基本的EC签名开始,如果生成了一个签名,签名的“消息”是公钥的哈希,该签名证明签名者知道私钥,即公钥对于某些基点的离散对数。
对于一个类似“公钥”的P = xG + aH ,因为基点H的存在,没有人知道P对于基点G的离散对数,因为没人知道x 使得xG = H,除非a为0。如果a为0,则P = xG ,离散对数恰好是x,有人会为该公钥签名。
把承诺当成公钥,对承诺的哈希值签名,通过这种方法,某个佩德森承诺可以被证明是对0值的承诺。在签名中使用公钥用于防止把签名设置成任意值并且破解出承诺。签名使用的私钥正是盲化因子。
更进一步,假定我想证明C是对金额1的承诺,但不告诉你盲化因子,你能做的就是计算:
C’ = C - 1H
然后向我要公钥C’的签名(相对于基点G的签名),如果我能做到,则C一定是对金额1的承诺(否则我就破解了EC离散对数的安全性)。
2.3环签名
为了避免给出金额,我们还需要另一个密码学技术:环签名。环签名是当存在两个(或多个)公钥的签名场景,签名证明签名者知道至少一个公钥的离散对数。
使用环签名,我们可以构建另一个场景,我证明一个承诺是对金额0或金额1的承诺,我们叫这种场景为“或证明”。
首先,我给你C,你计算C’:
C’ = C - 1H
然后我提供{C,C’}上的环签名。
如果C是对金额1的承诺,则我不知道它的离散对数,但是C’成为金额0的承诺,我知道它的离散对数(就是盲化因子)。如果C是对金额0的承诺,我知道它的离散对数;C’是对金额1的承诺时,我不知道离散对数。如果这是一个对任意其他金额的承诺,没有一个结果为金额0,因而我没法签名。
以上机制对任何数字对有效,只需把金额进行合适的预处理再放到环中,或者超过2个数字。
假定我想证明C在范围[0,32)之中,现在我们有一个或证明,想像我发送给你一个承诺集合,每个承诺都有个或证明:
C1 is 0 or 1 C2 is 0 or 2 C3 is 0 or 4 C4 is 0 or 8 C5 is 0 or 16
如果我为C1-C5选择了正确的盲化因子,能使得C1 + C2 + C3 + C4 + C5 == C。我建立了一些有效的二进制数,和一个只能在区间[ 0,32)内的5位数。
众多优化手段可以让证明过程更有效:
首先我提出一个新的、更有效的环签名公式,Borromean环签名,它仅要求每个公钥32字节,再加上能被其他不同环所共享的32字节。与以前提出的构建方式相比,该环签名能提供两倍效率。
https://github.com/Blockstream/borromean_paper/raw/master/borromean_draft_0.01_34241bb.pdf
CT金额并非直接表述金额,而是使用十进制浮点数来表示,每个数字要与以10为基数的指数相乘,这意味着如果在基数10之前有较少重要数字,你能用小容量证据来证明大金额。比如:11.2345和0.0112345可以有相同大小的证明,即使两个数相差一千倍。
还有一个非隐私的发送“最小金额”,如果用户愿意泄露一些最小金额信息(最小金额信息将对外公开),允许更小的证据覆盖更大范围的金额,并且当使用指数时还允许最小重要数字非0。用交易中第一个金额减少最小的金额,然后证明该值非负。
浮点尾数用4进制编码而不用二进制,因为可以减少要发送的承诺的数值,使得签名数据大小与二进制相当。
对最后的尾数数字的承诺可以跳过,从前向后对已经证明的值创建承诺,其他数字也一样。
最后,通过在证明中小心使用非随机化签名,对于币的接收者(由于带接收者公钥的ECDH密钥协议,他与发送共享一个私密)来说,“重绕”证据并且用它提取发送者发送的消息是可能的,该消息大小为证据大小的80%。我们使用该原理向接收者提供金额和盲化因子,但是也可以用来负载参考编号或撤款地址等信息。
2.4实现情况
其结果是,32位金额的证明有2564字节长,同时传输2048字节的消息。一个32位长的证据可以1e-8的精度覆盖最高42.94967296BTC,以1e-7的精度覆盖429.4967296BTC等等。我的代码可在一台i7-4770R的电脑上实现每秒验证1300个32位证明,还可以进行多种优化。
该实现支持任意尾数大小或指数大小,通过发送者掌握的参数,性能和大小以尾数位数的线性相关;支持奇数位(通过为最后一个数字切换到以2为基数)。
在元素链中,范围证明仅在多私密金额输出(包括费用)时需要,合并多私密金额到一个输出的交易不需要范围证明,因为所有的输入金额都是正确的。
扫描密钥用于验证可重绕的范围证明的共享私钥,通过共享扫描密钥,该方法与监视钱包完全兼容,使用者可和审计者共享这些密钥,让他们看到交易金额。
证据可支持最小金额,如果仅有一个私密输出甚至已经支付费用后,允许跳过范围证明,或者允许节点跳过或使用诈骗证据来延缓验证大范围证据,未来工作将用到以上事实。
这里表述的系统不依赖任何基础的新同态密码学假设,只有对secp256k1椭圆曲线的离散对数难题的难度假设,以及随机预言假设,就像比特币的正常签名一样。
当范围证明的大小非常规时,与其他替代方案(如零币)相比,它们更不占空间并且更快速验证。它们所占的大部分空间可以回收,用于用户之间的附加数据通讯,这是一个经常性要求但很难在公共传播网络中验证的特性。与签名相似,范围证明可分离地放在区块链的支链上,以便客户不用关注(如:以前的区块)去避免接收这些区块。
最重要的是,这个场景与区块链剪枝兼容,不会让比特币的验证状态永远增长;同时还和CoinJoin,CoinSwap兼容,允许交易链隐私,以及修正了这些技术在隐私上的严重缺陷(交易金额泄漏隐私)
与其他建议不一样,本系统不只是技术预测,也不是纯密码学研究,而是已经与比特币系统整合。
私密交易在元素链中启用,并且作为常规交易的默认形式。
Scan QR code with WeChat