有一种常见的误解是,即将到来的 Taproot 升级可以帮助 CoinJoin 提高隐私性。 摘要:即将到来的 Taproot 升级完全无法帮助等面额输出的 CoinJoin 交易,虽然它有可能可以提高其它协议的的隐私性,比如闪电网络和托管合约。 如果你想了解详情,那就读下去! 等面额输出的 CoinJoin我们先来讲讲等面额输出的 CoinJoin,这是 JoinMarket 和 Wasabi 钱包使用的 CoinJoin 类型。它的流程第一步是,一些参与者先集体同意一个公共值。在 JoinMarket 中,由 taker 来定义这个值,并给 maker 支付来取得他们的同意;而在 Wasabi 中,服务器会定义一个大致等于 0.1 BTC 的数值。 然后,每个参与者都提供自己单方面控制的输入,每个人提供的输入总面额都要等于或大于公共值。一般来说,因为每个输入都是单方面控制的,所以每个输入都需要一个单签名。每个参与者也都提供自己控制的两个地址,一个地址会得到面额为公共值的支付;另一个则用来接收其所提供的输入中大于公共值的部分(也即找零输出)。 再然后,这组参与者共同生成一笔交易,该交易花费所有参与者提供的输出,并支付给合适的输出。输入和输出都以一些安全的模式混淆一通。然后这笔伪签名的交易又发回给每个参与者。 最后,每个参与者检查这笔交易花费了自己提供的输入(更重要的是它 没有 花费自己 不想 提供的其它资金!)以及支付给了合适的地址。验证完了之后,每个人都为自己提供的输入补充签名。 每个人都为自己约定的所有输入提供签名之后,该交易就有了完整的签名,这笔 CoinJoin 就是有效的,可以打包上链了。 CoinJoin 原理上很简单但有直接的隐私提升效果,它不需要脚本编程,它只需要每个人都提供签名。 隐私性假设我们有两个参与者,同意加入一个公共值为 0.1 BTC 的 CoinJoin 交易。甲提供了一个面额为 0.105 的输入,乙提供了一个面额为 0.114 的输入。结果是,该 CoinJoin 交易有两个输入,面额分别为 0.105、0.114,而输出则是 0.1、0.005、0.014 以及 0.1 BTC. 现在,很显然这个 0.005 的输出是从 0.105 的输入中来的,而 0.014 的输出是从 0.114 的输入中来的。 但两个 0.1 BTC 的输出无法断言是从哪个输入中来的。没有能够关联起来的信息,因为两个输出都从两个输入中来。这就是常见的 CoinJoin 实现,比如 Wasabi 和 JoinMarket 如何提高隐私性的。 禁止 CoinJoin不走运的是,Wasabi 和 JoinMarket 的模式下,大规模的 CoinJoin 是非常显眼的。 你只要看到一笔交易有(比如)超过 3 个相等面额的输出,而输入的数量等于或大于等面额输出的数量,那它大概率就是 CoinJoin 交易。因此,很容易找出 Wasabi 和 JoinMarket 做的等面额输出 CoinJoin。甚至你可以很容易地区分它们:Wasabi 的等面额输出 CoinJoin 可能有多于 100 个输入,而输出的面额在 0.1 BTC 左右;JoinMarket 的等面额输出数量一般小于 10 个(通常在 4 ~ 6 个),但公共值变化很大,低至 0.001 BTC,高至几个比特币甚至更多。 这导致了一些反隐私的交易所拒绝为托管账户入账,如果存入的资金上溯一定步数会遇到等面额 CoinJoin 交易的话,通常是以监管上的考虑为理由。致命的是,这些交易所会继续持有那些 “被禁止” 的存款的私钥,所以也可以花费它们,本质上这与盗窃无异。如果你的交易所对你做了这样的事,你应该曝光该交易所从客户手上盗窃资金。此外,谨记,无私钥,即无币。 因此,CoinJoin 表现为隐私上的一种取舍:
Taproot现在我们来讨论一下叫做 “Taproot” 的新奇有趣事物。 Taproot 包含两个部分:
它有一些很棒的属性:
Taproot 无法帮助 CoinJoin来回顾一下! CoinJoin:
Taproot:
完全没有交集。Taproot 帮助的是 CoinJoin 不会用到的东西。CoinJoin 用到的是 Taproot 无法提升的东西。 但有人这么说了!许多对 Taproot 的早期介绍都声称 Taproot 有益于 CoinJoin。 让他们搞混的地方在于,早期的 Taproot 草案包含一个叫做 “跨输入的签名聚合” 的功能。 在当前的比特币上,每一个输入,在花费时,都需要独立的签名。而有了跨输入的签名聚合,所有支持这个特性的输入可以用一个签名来覆盖。所以,举个例子,如果你想花费两个输入,当前的比特币协议需要你为每个输入提供一个签名,但有了跨输入的签名聚合,你可以用一个签名来解锁这两个输入。甚至即使输入是属于不同公钥的也可以:两个输入的跨输入签名聚合本质上是定义了一个 2-2 的公钥,而你只能在知道这两个输入的私钥时才能给它们签名;或者你能跟其他知道相应输入的私钥的人合作也可以。 它才能帮助 CoinJoin 节省成本。因为 CoinJoin 会有很多输入(每个参与者都会提供至少一个输入,有时会更多;而参与者集合越大,CoinJoin 的隐私性就越强),如果所有输入都启用了跨输入的签名聚合,这样大型的 CoinJoin 也可以只用一个签名。 它会让 CoinJoin 的签名流程变得更复杂(签名者现在要合作签名),但这也是值得的,它可以减少签名的体积,因此降低手续费。 但要注意,虽然跨输入的签名聚合提高了 CoinJoin 的经济性,它并不能提升隐私性!等面额输出的 CoinJoin 仍然是非常显眼的,仍然很容易被憎恨隐私性的交易所禁止。它不能提高 CoinJoin 的隐私性。另外,见:https://old.reddit.com/r/Bitcoin/comments/gqb3ur/design_for_a_coinswap_implementation_for/ 为什么现在不加上跨输入的签名聚合?有一些非常复杂的技术理由导致跨输入的签名聚合不在最新的 Taproot 提议中。 首要的理由是降低 Taproot 的技术复杂性,希望这样能更容易说服用户激活 Taproot(虽然 Taproot 的呼声很高,但考虑到之前隔离见证(SegWit)遇到的困难,开发者对新的提议能否激活持谨慎态度)。 这里主要的技术复杂性在于,它会跟未来增强比特币的方法相互作用。 本文后面的部分假设你已经知道了比特币的脚本是怎么工作的。如果你并不深入了解比特币脚本的工作原理,那简而言之,跨输入的签名聚合会导致未来增强比特币的方法变得更加复杂,所以大家推迟了它,好让开发者有更多的时间思考。 (下文是我的理解;可能 /u/pwuille 或 /u/ajtowns 可以给出更好的总结。) 详细说来,Taproot 也引入了 现在, 软分叉基本上意味着:如果一个脚本在最新版本的软件中会处理通过,那在所有旧版本中也必须通过;不能在新版本可以通过、同时在旧版本中却会导致失败,因为这会使网络内产生分歧,会将旧节点踢出网络(即,那就变成一个硬分叉了)。 但
那么, 这里的重点是,想要把一个公钥加入总和公钥中参与最终签名的检查,就必须执行 但你记得吗, 因此,因为实现跨输入的签名聚合并保证其与未来协议插件相兼容的复杂性,跨输入的签名聚合被推迟了。 (完) |