关于基于帐户的区块链中的匿名性

长期以来,我们一直对加密货币中的匿名性话题感兴趣,并试图跟踪该领域技术的发展。 在我们的文章中,我们已经详细研究了Monero中机密交易的操作原理,并且对该领域中存在技术进行了比较审查 。 但是,当今所有匿名加密货币都基于比特币提出的数据模型-未花费的交易输出(以下称UTXO)。 对于以太坊等基于帐户的区块链,用于实现匿名和隐私的现有解决方案(例如MobiusAztec )试图在智能合约中重复使用UTXO模型。

2019年2月,来自斯坦福大学和Visa研究的一组研究人员 发布了预印本 “ Zether:走向智能合约世界的隐私”。 作者首先提出了一种确保基于帐户的区块链匿名的方法,并提出了智能合约的两种选择:机密(隐藏余额和转移金额)和匿名(隐藏接收方和发送方)交易。 我们发现所提议的技术很有趣,并且希望共享其设备,并讨论为什么基于帐户的区块链中的匿名性问题被认为非常复杂,以及作者是否设法完全解决它。



关于这些数据模型的设备


在UTXO模型中,事务由“输入”和“输出”组成。 钱包中的钞票直接类似于“出口”:每个“出口”都有一定的面额。 当您与某人付款(形成交易)时,您将花费一个或多个“输出”,而它们却成为交易的“输入”,并且区块链将其标记为已花费。 同时,您的付款收款人(或您自己,如果需要更改)会收到新生成的“输出”。 可以用以下方式表示:

图片

基于帐户的区块链的结构类似于您的银行帐户。 它们仅根据您帐户中的金额和转帐金额进行操作。 当您从帐户中转出一定金额时,您无需燃烧任何“出口”,网络就不需要记住哪些硬币用完了,哪些没有用掉。 在最简单的情况下,将交易验证简化为检查发件人的签名及其资产负债表上的金额:

图片

技术解析


接下来,我们将讨论Zether如何隐藏交易量,接收方和发送方。 在描述他的工作原理的过程中,我们将注意到保密版本和匿名版本的区别。 由于在基于帐户的区块链中确保机密性要容易得多,因此匿名化所施加的某些限制与该技术的机密版本无关。

余额和转账金额的隐瞒


Zether使用El Gamal加密方案对余额和转账金额进行加密。 它的工作原理如下。 当爱丽丝(Alice)要在地址(他的公共密钥) Y上发送鲍勃b硬币时,她选择一个随机数r并加密该数字:

图片

其中C是加密的总和, D是解密该总和所需的辅助值, G是椭圆曲线上的固定点(当私钥乘以公钥时)。

当Bob收到这些值时,他只是将它们添加到自己的余额中,并以相同的方式加密,这对于此方案很方便。

同样,爱丽丝(Alice)从资产负债表中减去相同的值,只使用Y作为她的公钥。

隐藏收件人和发件人


UTXO中“出口”的混合出现在加密货币的曙光中,并有助于隐藏发送者。 为此,发送者在进行转移时会在区块链中收集随机的“出口”,并将其与自己的捏和在一起。 然后,他用环形签名对“出口”进行签名-一种加密机制,使他能够说服验证者,在涉及的“出口”中有发送者硬币。 当然,所涉及的硬币本身不会浪费。

但是,为了隐藏收件人,我们将无法生成伪造的“输出”。 因此,在UTXO中,每个“出口”都有其自己的唯一地址,并且与这些硬币的接收者的地址在密码上关联。 目前,在不知道其秘密密钥的情况下,无法识别唯一的“出口”地址与收件人地址之间的关系。

在基于帐户的模型中,我们不能使用一次性地址(否则它将已经是“退出”模型)。 因此,接收者和发送者必须在区块链的其他账户之间进行揉合。 同时,从揉合的帐户中扣除加密的0个硬币(或在接收者揉合的情况下添加0),而实际上并未更改其真实余额。

由于发送方和接收方都始终具有一个永久地址,因此有必要使用相同的组来混合到相同的地址。 用一个例子来考虑这一点比较容易。

假设爱丽丝(Alice)决定为鲍勃(Bob)的慈善事业做出贡献,但更希望此次转让对外部观察者保持匿名。 然后,为了掩饰自己在发件人字段中的身份,她还输入了Adam和Adele帐户。 并隐藏鲍勃-在收件人字段中另外还有Ben和Bill帐户。 在进行下一部分付款时,爱丽丝决定在她旁边输入Alex和Amanda,在Bob旁边输入Bruce和Bengen。 在这种情况下,在分析这两项交易中的区块链时,只有一对相交的参与者-爱丽丝和鲍勃,将这些交易取消匿名。

图片

交易竞速


正如我们已经提到的,为了在基于帐户的系统中隐藏其余额,用户需要加密其余额和转账金额。 此外,他必须证明自己帐户中的余额仍为负数。 问题在于,在进行交易时,用户会建立有关其当前帐户状态的证据。 如果鲍勃将交易发送给爱丽丝,并且比爱丽丝更早接受交易会怎样? 然后,爱丽丝的交易将被视为无效,因为余额证明是在交易鲍勃通过之前建立的。

图片

在这种情况下出现的第一个解决方案是在交易之前冻结您的帐户。 但是这种方法不适合,因为除了在分布式系统中解决此类问题的复杂性之外,在匿名方案中,不清楚要阻止谁的帐户。

为了解决此问题,该技术将传入和传出的交易分开:花钱对资产负债表有直接影响,而收入则递延。 为此,引入了“时代”的概念-一组固定大小的块。 通过将块高度除以组的大小来确定当前的“时代”。 处理交易后,网络会立即更新发送者的余额,并将接收者的资金添加到驱动器中。 仅当设置了新的“时代”时,累积的资金才可供收款人使用。

结果,用户可以发送交易,而无论他们多久收到一次资金(当然,在其余额允许的范围内)。 纪元的大小是根据区块在网络中传播的速度以及交易落入区块的速度来确定的。

该解决方案在机密传输的情况下效果很好,但是对于匿名交易,正如我们稍后将看到的,它会带来严重的问题。

重播攻击防护


在基于帐户的区块链中,每笔交易都由发送者的私钥签名,这使验证者确信交易尚未更改,并由该密钥的所有者创建。 但是,如果正在侦听传输通道的攻击者截获此消息并发送完全相同的秒数怎么办? 验证者将验证交易的签名并确信交易的作者身份,网络将从发件人的余额中再次扣除相同的金额。

这种攻击称为重播攻击。 在UTXO模型中,此类攻击是不相关的,因为攻击者将尝试使用用尽的输出,这些输出本身是无效的,并被网络拒绝。

为了防止这种情况的发生,将随机数据字段插入到事务中,这称为随机数或简称为“盐”。 重新提交含盐交易时,审阅者将查看该随机数是否曾被使用过,如果没有,则认为该交易有效。 为了不将随机数用户的全部历史记录存储在区块链上,通常在第一笔交易中将其设为零,然后再增加一。 网络只能验证新交易的现时与过去的差额为一。

在匿名翻译方案中,出现了验证随机数交易的问题。 我们无法将现时现时明确地绑定到发件人的地址,因为很明显,这会使翻译匿名化。 我们也不能在所有参与帐户的现时添加一个,因为这可能与正在处理的其他翻译冲突。

Zether的作者建议根据“时代”以密码方式生成随机数。 例如:

图片

这里x是发件人的秘密密钥, G epoch是该时代的附加生成器,通过对形式为'Zether +'的字符串进行哈希处理而获得。 现在看来,问题已经解决了-我们不会透露发件人的随机数,也不会干扰无关参与者的随机数。 但是这种方法有一个严重的局限性:一个帐户在“时代”内最多只能发送一笔交易。 不幸的是,这个问题仍然没有解决,并且在我们看来,Zether目前已成为匿名版本的Zether,几乎不适合使用。

零置信证据


在UTXO,发送者必须向网络证明他没有花费负数,否则就有可能从空中产生新的硬币(为什么可能,我们在前一篇文章中写道)。 并且还要在“投入物”上签名,以证明捏合硬币中有属于他的资金。

在基于帐户的区块链的匿名版本中,用于证明的表达式要复杂得多。 发件人证明:

  1. 发送的金额为正;
  2. 余额仍为负数;
  3. 发件人正确加密了传输量(包括零);
  4. 余额余额仅由发送者和接收者更改;
  5. 发件人拥有他帐户中的秘密密钥,而他确实在发件人列表中(包括这些发件人);
  6. 事务中使用的随机数已正确组成。

对于这样复杂的证明,作者使用Bulletproof (顺便说一句,其中一位作者参与了它的创建)和Sigma协议 (称为Sigma-bullets)的混合使用。 此类声明的正式证明是一项相当艰巨的任务,它严重限制了想要实施该技术的人数。

结果如何?


我们认为,Zether的一部分可以为基于帐户的区块链增加隐私,现在可以很好地使用它。 但是目前,该技术的匿名版本对其使用及其实施的复杂性施加了严格的限制。 但是,请不要忘记作者仅在几个月前发布了它,也许其他人会找到今天的解决方案。 确实,这就是科学的过程。

Source: https://habr.com/ru/post/zh-CN452184/


All Articles