LOADING...
LOADING...
LOADING...
当前位置: 玩币族首页 > 币圈百科 > 硬核 | 一起了解比特币混币方案:TumbleBit

硬核 | 一起了解比特币混币方案:TumbleBit

2020-12-04 Nervos 来源:区块链网络
TumbleBit 是 17 年发表在 NDSS 的文章,是一个兼容比特币的中心化混币协议,是解决比特币交易可链接问题的协议,TumbleBit 可以扩展区块链的交易量,也可以扩展区块链的交易速度在本篇文章中,热爱研究的 Nervos 小伙伴马宇峰详细分析了 TumbleBit 的总体框架结构,它的解谜协议和谜题协议,并且介绍了针对TumbleBit不可关联性的一些攻击。快来 Get 新技能吧。

总体框架结构



由于 TumbleBit 需要兼容比特币这种仅支持非图灵完备语言的区块链,它的链上部分需要的密码学原语很少也很简单。此外虽然是中心化的协议,但即使是恶意的 Tumbler 也不能偷币,并且在不和参与用户共谋的情况下也不能找到交易输入和输出的链接关系。和 coinjoin、coinshuffle 这种区中心的混币协议相比,TumbleBit 的优点在于不需要交易方与其他用户交互,交互只发生在交易双方和 Tumbler 之间。
TumbleBit 可以将发给一方的许多交易聚合为两笔链上交易,并且这些交易不需在区块链上存储或验证,因此可以扩展区块链的交易量,并且 TumlbeBit 的链下交易可以在秒级时间内完成,因此也可以扩展区块链的交易速度。TumbeBIt 的主要思想很简单:它使用链下解谜来替代链上支付。当 Alice 想要给 Bob 支付一笔钱时,Alice 给 Bob 一个谜题的解,这个谜题是 Bob 和 Tumbler 交互产生的,这个谜题的解是 Alice 和 Tumbler 交互产生的。每解一个谜,Alice 转给 Tumbler 一个比特币,Tumbler 再转给 Bob 一个比特币。
图 1. TumbleBit 协议概览
TumbleBit 协议构造如上图所示。TumbleBit 协议以 epoch 为周期运行,需要注意的是所有参与 TumbleBit 协议的人都知道每个 epoch 周期内各个阶段的时间。每个epoch分为三个阶段:第一是 Escrow 阶段,这个是链上托管的阶段。在这个阶段收款人 Bob 告诉 Tumbler 在这个 epoch 内最多接收 3 个比特币,然后 Tumbler 构造一笔托管交易这是一个 2-of-2 的多签交易,解锁条件为 Bob 和 tumbler 签名或者超过 tw2 后由 Tumbler 签名取出,然后 Bob 和 Tumbler 之间通过运行一个链下的 Puzzle-Promise 协议让 Bob 获得 promise-puzzle 对,也就是图中的 (c, z),σ是 Tumbler 对这笔交易的签名,c是用对称密钥 ε对签名加密的密文,我们称 c为 promise,z是一个 RSA puzzle,是用 Tumbler 的公钥对对称密钥 ε加密后的密文,协议运行完成后 Tumbler 将交易发到链上,付款人 Alice 在这个阶段也发送一笔托管交易这也是一笔 2-of-2 的多签交易,解锁条件为 Alice 和 Tumbler 的签名,或者超过时间 tw1 后由 Alice 取回;第二是 Payment 阶段,这个是链下支付阶段。在这个阶段 Bob 将 puzzle 盲化后发送给 Alice,盲化 puzzle 的目的是为了防止 Tumbler 将交易方关联起来,盲化方法很简单,就是选取一个盲因子 r,然后用 Tumbler 的公钥对 r加密后乘上原来的 puzzle z,Alice 拿到盲化的 puzzle 后和 Tumbler 运行一个 RSA-Puzzle-Solver 协议,拿到盲化 puzzle 的解,发给 Bob,由于 RSA 算法具有乘法同态性,对盲化 puzzle 解密后就是除以 r即可得到 ε,然后解密就能得到签名 σ.最后是 Cash-out 阶段,这个是链上进行的提现阶段。Alice 拿回剩余的 2 个比特币,支付 Tumbler 一个比特币,Tumbler 拿回剩余的 2 个比特币,支付 Bob 一个比特币。

解谜协议



关于 TumbleBit 的总体框架结构介绍完了,下面介绍一下刚才提到的两个重要的协议,一个是 Alice 和 Tumbler 之间运行的解谜协议:RSA-puzzle-solving 协议,一个是 Bob 和 Tumbler 间运行的获得谜题协议:Puzzle-Promise 协议
本文会重点介绍一下 RSA-puzzle-solving 协议,这是一个公平交换协议。当且仅当 Tumbler 给 Alice 一个 RSA puzzle 的解时,Alice 支付给 Tumbler 一个比特币,这个协议除了可集成在 TumbleBit 协议上以外,也可以在其他场景中作为公平交换协议独立运行。这个协议的核心思想是 Tumbler 解迷 Alice 的 puzzle 之后,将这个解用对称密钥 k加密得到密文 c,然后使用比特币支持的哈希算法计算 k的哈希为 h,之后将 (c, h),发送给 Alice, Alice 收到之后发送交易解锁条件为提供 h的原像。Tumbler 可以通过构造包含 k的交易来拿到这个比特币,公开后 Alice 就可以拿到 k了,用 k对 c进行解密后就可以拿到 puzzle 的解。这个协议面临一个挑战,就是不使用零知识证明的条件下找到一种办法能够让 Alice 验证密文 c是对正确值的加密。cut-and-choose 可以解决这个问题,cut-and-choose 的思想类似于抽查,即 Alice 选择一些假谜题让 Tumbler 解密,如果 Tumbler 解密正确,那么 Alice 就相信 Tumbler 是诚实的。


图 2. RSA-puzzle-solving 协议
协议的具体细节如上图所示,公共输入是 Tumbler 的 RSA 公钥 (e, N),Alice 的输入是 puzzle y,Tumbler 有一个秘密输入,是 Tumbler 的 RSA 私钥 d;首先 Alice 准备真 puzzle 集合,包含 m 真实 puzzle,由于 RSA 具有乘法同态特性,Alice 只要随机选择 m 个盲因子并用 Tumbler 公钥加密后分别乘以 puzzle 就得到 m 个真 puzzle,这 m 个盲 puzzle 的解去盲后对应同一解;第二步,Alice 准备假消息集合,里面包含 n 个假 puzzle,假 puzzle 就是选一个随机数用 Tumbler 公钥加密得到的;接下来 Alice 对混合真假 puzzle 的集合进行随机排序,得到一个新的集合,并记下真 puzzle 和假 puzzle 所对应的下标,然后将这个新集合发送给 Tumbler;Tumbler 对新集合的每个元素都解密,然后将得到的明文用不同的对称密钥加密得到新密文,之后将所有的新密文以及新密文所对应的密钥的哈希发送给 Alice;Alice 将假 puzzle 的下标以及假 puzzle 中的随机数原文发给 Tumbler, Tumbler 验证集合 F 中的 puzzle 确实是假消息 (如果是真消息的话,Alice没有密钥是不可能知道 y 所对应的明文的),如果验证通过,将假 puzzle 对应的私钥发送给Alice;Alice 解密假 puzzle, 判断 Tumbler 是否欺骗了 Alice. 如果验证通过,Alice 构造并公开交易解锁条件为超过 tw1 由 Alice 签名解锁,或 Tumbler 提供所有真 puzzle 对应的密钥;然后 Alice 将真 puzzle 以及所有盲因子发给 Tumbler, Tumbler 验证所有的真 puzzle 是否对应同一个 puzzle,如果验证通过就发布交易来拿到比特币,里面包含所有的真 puzzle 密钥;最后 Alice 通过真 puzzle 密钥来解谜。可见这个协议只有当 Tumbler 打开的假谜题都是正确的,且所有没打开的真谜题都是错误的时候,Alice 才拿不到一个正确答案,这个概率是,论文中的实现 m 为 15,n 为 285,Tumbler 作弊的概率大概是上述协议如果直接用到 TumbleBit 上的话会存在三个问题:第一个是上述协议只支持 Alice 获得一个 puzzle 的解,应该扩展为可获得任意数量 Q 个谜题的解;第二是这个协议应该完全发生在链下,目前协议需要两个链上交易第三个是交易比典型的交易都长,因为它包含 m 个哈希的原像,这会导致更多的手续费支出。解决方法是:第一,在 escrow 阶段,Alice 发送抵押 Q 个比特币,的解锁条件为 Alice 和Tumbler 的签名或超过时间tw1后由Alice签名解锁;然后在支付阶段,Alice 可以买至多 Q 个puzzle 的解,Tumbler 维持一个计数器来计算已经给 Alice 提供了几个解。现在假设 Alice 正在询问第 i 个 puzzle 的解,原协议在第 8 步以后做如下修改以便完全运行在链下:Alice 构造并签署交易发给Tumbler, Tumbler 收到这个交易后既不签名也不公开;交易指向交易,也就是将交易的输出作为交易的输入,即将交易的比特币转到交易中,交易输出有两个,一个是发给 Tumbler 的 i个比特币,另外一个是发给 Alice 的 i个比特币,当然这个交易需要 Tumbler 提供密钥才能解锁;Tumbler 不使用交易来发送密钥,而是直接将密钥发给 Alice;Alice 验证密钥是否正确,如果正确,Alice 签署一个在提现阶段使用的交易这笔交易反映 Alice 和 Tumlbler 之间的新余额。如果 Alice 作弊收到正确密钥后不发送那么 Tumbler 可通过公开来获得应得的比特币,代价是比常规交易大,需要多付些手续费。经过这些修改后的 RSA-puzzle-solving 协议可以用在比特币上了。

谜题协议



接下来讲一下puzzle-promise协议,这个协议是在 escrow 阶段运行在收款人 Bob 和 Tumbler 之间的链下协议,目标是让 Bob 获得一个 promise-puzzle 对(c, z).
这个协议的挑战是如果 Tumbler 仅仅发送一个(c, z)给 Bob, 那么 Bob 就不知道 c是否是正确签名的加密,也不知道 z是否隐藏了正确密钥。我们仍然可以通过 cut-and-choose 来应对这个挑战。但是和 RSA-puzzle-solving 协议不同的是 Bob 会得到许多puzzle-promsie 对,而 cut-and-choose 保证的是至少有一对是正确的(保证全部正确的概率低于至少一对是正确的概率),而 Bob 一次只能问 Alice 一个谜题,TumbleBit 通过 RSA 商链的技术来解决这个问题,通过使用 RSA 商链技术可以保证 Bob 拿到一个谜题的解后能得到所有的谜题的解。
图 3. Puzzle-promise 协议篇幅所限,下面我们简单地介绍一下cut-and-chosse:Bob 通过对交易进行不同的填充得到μ个格式不同但含义相同的交易作为真集合,然后在准备η个假交易集合,将这两个集合合并打乱后发给 Tumbler,Tumbler 对集合中的每个元素都签名,并使用不同的密钥进行加密,将所有 puzzle-promise 对发给 Bob 后 Bob 发送假消息集合给 Tumbler。Tumbler 验证假消息集合真实性,如果验证通过将假集合对中的对称密钥发给 Bob,Bob 用此密钥解密签名,验签正确后 Tumbler 开始准备 RSA 商链。所谓的商链就是 Tumbler 用后一个对称密钥除以前一个对称密钥,得到 μ- 1 个商(上图第 9 步),然后将这些商发送给 Bob。Bob 利用 RSA 算法的同态性验证这些商的正确性,如果验证通过,将第一个 puzzle 发给 Alice,拿到解 ε1后乘以 q2 就得到了ε2, 以此类推 Bob 可以拿到所有的对称密钥,用这些密钥解密对应的 c 后得到 μ 个交易的签名。虽然这些交易不同,但只是填充部分不同,因此 Bob 只能使用一个交易来取现。

不可关联性



到这里完整的 TumbleBit 协议部分就介绍完了,接下来看一下 TumbleBit 的不可关联性。我们先看一下 Tumbler 的视角如下图所示,Tumbler 看不到交易间的关联性,但是能看到付款人在哪个时间和自己交互的,因此结合一些额外信息,可以对交易间的关联性进行分析。我们下面介绍一些针对 Unlinkable 的攻击,这些攻击中有些是能避免的,有些是没有很好的方法避免的。

图 4. Tumbler 视角
天花板攻击Alice 和 Tumbler 共谋可以制造 ceiling attack,ceiling attack 被称为天花板攻击。它假设在某时刻比如 t5,Alice 向 Bob 支付一个比特币,但是 Bob 已经达到的接收上限,因此拒绝了 Alice 的付款请求。Alice 把这个消息告诉 Tumbler,Tumbler 可以排除 t5 时刻后的交易是发给 Bob 的可能。如果 Alice 不与 Tumbler 共谋的话Tumbler 是不知道 Bob 啥时候达到接受上限的。这种攻击是有好几种解决办法的,比如:Bob 在 escrow 阶段让自己的接收上限远高于这个预期内能接收的钱;或者可以错开 TumbleBit epoch 的时间,同时运行几个 TumbleBit epoch,Bob 一个 epoch 内的额度用完的话,就用下一个 epoch 的额度。Bob 和 Tumbler 共谋Bob 和 Tumbler 共谋:Bob 告诉 Tumbler 自己发给 Alice 盲化 puzzle, 这样 Tumbler 可以知道 Alice 的身份(尤其适用于Alice和Bob不知道对方身份的场景,比如使用 tor 协议)。解决方法很简单,Alice 对 Bob 发给自己的盲化 puzzle 做二次盲化后再和 Tumbler 运行 RSA-Puzzle-solving 协议,然后将解去盲发给 Bob 即可。Potato 攻击Potato 攻击是指考虑外界信息,假设 Bob 是卖土豆的,一个土豆 7 比特币,且 Tumbler 知道没有其他人卖 7 比特币的东西,那么 Tumbler 就可以排除一些交易(比如 Calor 总共只有 6 笔交易,则她被排除,而 Alice 在短期内刚好有 7 笔交易,那么可以推测 Alice 在买土豆)。解决方法有添加冗余交易,Alice 建立一个收款地址,买土豆的同时给自己的地址转一笔钱,或者买土豆的同时再买些其他东西。Intersection attacksIntersection attacks:unlinkability 仅仅定义在一个周期内,并不能排除周期之间的一些关联。下面要讲的中止攻击就属于这种攻击。中止攻击Abort attacks 中止攻击:Tumbler 可以通过中止交易获得一些信息。比如 Tumbler 注意到在几个周期里:Alice 一直在发起单笔交易而 Bob 一直达到额度上限,然后在下一个周期里,Tumbler 中止 Alice 的支付并发现 Bob 不再达到额度上限,那么 Tumbler 能猜测 Alice 在和 Bob 交易。

小结



虽然存在种种限制,但是如果交易足够多,那么交易的不可连接性还是可以保证的。
笔者认为TumbleBit 的缺点主要是两个,第一是系统中所有用户都使用同一「面额」的钱,怎样定义面额就些困难。如果面额定义的很小,大额支付需要很多线下交互,不过可以通过在系统内多运行几个 Tumbler,每个 Tumbler 提供不同的面额来解决;第二是需要 Tumbler 事先抵押钱。这个可以通过收取手续费来解决,接收方按照要求 Tumbler 抵押的额度来付手续费。如果不考虑金额的隐私性,TumbleBit 是一个非常优秀的混币方案。


注:文中配图均来自TumbleBit 的原始论文:https://eprint.iacr.org/2016/575.pdf





更多深度研究内容,欢迎点击查看:

首发!一份关于支付网络中路由问题的全面研究

干货 | 零知识证明引论(一)

—-

编译者/作者:Nervos

玩币族申明:玩币族作为开放的资讯翻译/分享平台,所提供的所有资讯仅代表作者个人观点,与玩币族平台立场无关,且不构成任何投资理财建议。文章版权归原作者所有。

LOADING...
LOADING...