作者:Thibaud Maréchal

来源:https://bitcoinmagazine.com/technical/navigating-bitcoin-coinjoin

“离间计” 是一种久经考验的军事策略,意思是通过让人们产生分歧、自相残杀而不是一致对外,从而分裂一群人。Wasabi 和 Samourai 这两种流行的比特币钱包,各有各的 Coinjoin 实现,一直在彼此拆台。JoinMarket 是另一种 Coinjoin 实现,也跟其它的隐私特性开发者有过激烈的辩论。

随着不断开展的戏剧事件,了解比特币的隐私和 coinjoin 技术变得非常困难。应该信任谁?如何验证他们说的话?都是不清不楚的。这些戏剧到底为比特币的观望者、普通的比特币用户和虔诚信仰者带来了什么呢?无尽的困惑、恐惧、不确定和怀疑(FUD)。比特币本身令人尴尬的隐私状况,和一直在发生的闹剧,赶走了新的用户。开发者、布道者和普通 用户在上面浪费了宝贵的时间,随便干点什么,都比追踪他们的闹剧要强。

显然,关于 “如何正确实现 coinjoin” 本身,人们还没有达成共识;那么,应该如何实现 coinjoin 以尽可能优化用户的隐私性和比特币的区块空间效率呢?不同的实现之间有何取舍?哪一些实现有明显的缺陷吗?未来几年,数十亿的用户将转向 使用比特币,coinjoin 又如何跨越从寥寥数人问津到主流用户采用的鸿沟呢?

我们要通过追问根本的问题和提出一些假设来了解 coinjoin 技术并建立一些心智模型,这些模型将在后续的文章中评估不同的 Coinjoin 实现时派上用场。

并非所有的 Coinjoin 实现都一个样

区块空间效率是一个重点,因为要确保 coinjoin 交易能够随比特币一起扩展,被全世界越来越多人所用。但它很少被当作第一优先级来讨论。任何忽略区块空间稀缺性的 Coinjoin 设计都是在没有必要地轰炸区块链,同时积累技术债 —— 随着更多用户到来,这种债务会变得越来越难以偿还。在区块链上留下尽可能少的足迹似乎是一个很合理的目标:少量的交易即可达到可接受的匿名程度,听起来很不错。

  • 那么,什么样才是可以接受的匿名程度?
  • 匿名性在比特币隐私的语境下是什么意思?
  • 特定的 Coinjoin 设计是如何处理区块空间稀缺性的?

收回你的隐私

在比特币中,匿名性意味着没有突出的、异常的特征,让给定的一笔交易跟账本上的其它交易有区别。当然,比特币网络在设计上不能保证这一点,它只是一个准匿名系统,其资金的形式(UTXO,未花费的交易输出)因为有独一无二的历史,一般来说不是同质化的。

Coinjoin 技术给比特币网络增加了一点匿名性,因为它打破了交易的输入与输入的关联、让输出看起来都没有分别。区块链分析公司还使用其它的线索来观察比特币网络,比如交易输入所有权同一性假设、左手倒右手假设、整数假设、时区分析,等等,这些线索不一定能被 coinjoin 掩盖。

Coinjoin 帮助比特币用户收回了一些隐私性,但不是一切隐私问题的灵丹妙药。如果隐私被理解为分享信息的自主选择权,更好的隐私性可以通过 coinjoin 技术来实现,但选择正确的 Coinjoin 实现至关重要。

  • 使用 coinjoin 的时候,我的隐私性目标是什么样的?
  • Coinjoin 实现可以帮我抵御什么样的线索分析?
  • 我想要避免哪些风险?

参与者的数量

现有的 Coinjoin 实现使用了不同的办法来提高隐私性。但不管这些实现在设计上如何考量,“匿名集”(匿名程度的一种度量)似乎是最传统的评估 Coinjoin 收获的办法。其它文章可能会使用别的办法。这里的假设是,要么你可以通过参加一笔较大的 Coinjoin 交易来实现更高的匿名性,要么你可以通过参加多次较小的 Coinjoin 交易来实现。这两个参数(参与者数量、参与次数)都有意义,但是否某一个会比另一个更重要?

从区块空间效率的角度来说,这里的假设应该是单笔较大的(参与者较多)交易比多次较小(参与者较少)的交易要好。

  • 单笔较大的 coinjoin 交易和多笔较小的 coinjoin 交易,哪个隐私性更好?
  • 如何进行真实、严格的验证?多小的 coinjoin 交易就算 “太小了”?
  • 有无估算你从一笔 coinjoin 交易中得到的隐私性好处的真实指标?
  • 关于 coinjoin 交易的体积和次数,偏重何者的区块空间效率更高?
  • 预期币会随着越来越多人开始使用 coinjoin 而参与多次 coinjoin,是现实的吗?参加多少次算是足够?会不会过犹不及?

简而言之,coinjoin 通过给予用户合理推诿的能力,让他们可以收回一些隐私性。推诿的可信度是对概率的度量 —— 你的比特币到底是被花掉了,还是放到了你依然控制的另一个地址?可能性有多大?某一个输入跟某一个输出有关系的概率有多大?

显然,作为一个囤币者,多个选项的概率越平均,你的合理推诿能力就越强。这种能力是很难保持的,因为需要处处提防。找零输出对在乎隐私的比特币用户来说常常是个问题,也是持续不断的讨论和批评的中心。为什么找零输出在 coinjoin 技术的语境下争议如此之大?

找零输出

这都是因为确定性的关联。如果为比特币交易的隐私性设计一条光谱,那么最左边是绝对的合理推诿能力,意思是完全没有办法知道输入和输出之间的关联。Coinjoin 的语境中也有所谓的 “随机性” 或者 “熵”。这里的假设是,越是随机,或者说熵越高,就越好。而光谱的另一端则是一笔交易有 100% 的确定性关联 —— 每一个输入中的价值去到了哪个输出都一清二楚。

反直觉的是,高熵并不必然意味着交易提供了良好的隐私性。如果一笔交易有三个输入和三个输出,每个输出的价值都相等,那么从技术上来说它有 100% 的熵,意思是无法辨别这三个输出有什么区别;但是,依然有 33.33% 的概率猜中一个输入关联着哪个输出。高熵并不意味着良好的合理推诿能力。

找零输出几乎总是跟其前序交易有非常高的确定性关联。换句话来说,几乎没有疑问,找零输出跟产生它的交易是有关的。如果一个找零输出跟其它的经过 coinjoin 的匿名输入一起花费,那可能会变成一个重大的隐私问题(虽然某些情况可能有例外)。这样的联合花费通常被称为 “UTXO 整合”,如果毛毛躁躁就做了,可能会对隐私性造成致命影响。

如果拿找零输出跟经过 coinjoin、获得了一些合理推诿能力的输出一起花费,找零输出可能会让它们去匿名化。这种失误很常见,有时候当事人还后知后觉。几年的隐私加强活动,就此功亏一篑。那么如何避免这种找零输出问题?

现有的 Coinjoin 实现有三种处理找零输出的办法:将找零隔离到另一个不参与 coinjoin 的钱包中;将找零输出放在参与 coinjoin 的同一个钱包中;通过不设找零,完全放弃掉找零输出。最后一者从隐私性 和区块空间效率的角度看是最好的选择,但我们还需要进一步的探究才能证实或者证伪这个假设。

  • 熵的分数足以量化一笔 coinjoin 交易对你的隐私性的影响吗?
  • 将找零输出隔离对另一个钱包 vs. 完全放弃找零,哪一种做法更好?
  • 找零输出对你的隐私只有负面影响吗?

币的面额

在 coinjoin 交易中去除找零输出,将要求币的面值是可变的。换句话说,参与这样的 coinjoin 交易的输入就不能是(例如)0.1 BTC 这样的固定面额(译者注:原文在这里使用的是 “input(输入)”,但疑应为 “输出”),否则就无法(至少非常难)不设找零而消耗掉输入,因为大部分的 UTXO 都没有整数(例如,在输出等面额的 coinjoin 交易中输入 0.19572394 BTC 将产生 0.1 BTC 的输出和 0.09572394 BTC 的找零)。

找零输出可能对你的隐私性有害,还记得吗?在 coinjoin 交易中使用多个不等面额的输入和输出,似乎也是个糟糕的想法,因为它会让输入和输出之间的确定性关联更清晰,对不对?其实,既对又不对,这样看情况。如果一笔 coinjoin 只有寥寥几位参与者(输入和输出都很好)那么使用不同的面额就会是一个糟糕的想法。但如果有很多个输入和输出呢,那会怎么样?

在较大的 coinjoin 交易中,使用多个面额可以为每一个结果输出带来更强的合理推诿能力,无需创建找零输出、也不需要发起额外的交易,因此它对区块空间的利用效率更高。当前似乎已经有不少选择了。

  • Coinjoin 交易使用固定的面额还是多种面额更好?
  • 如果要使用多种面额的币,coinjoin 交易应该有多少参与者呢?
  • 使用多种面额是去除 coinjoin 交易的找零输出的最好方法吗?

不必说,不论币的面额是否可变、coinjoin 交易是大是小,多次 Coinjoin 之间产生相互关联都是不可接受的,对吧?这里又有一个需要理解的重要细节。

Coinjoin 轮次间的相互关联

据说,让曾经加入过同一笔 Coinjoin 交易的输入再次参加同一笔 Coinjoin 交易,是毫无合理性可言的。已经共享过 Coinjoin 交易的参与者们,似乎无法从共同参与另一次 Coinjoin 中获益。这对隐私似乎有害,也经常受到批评。

但要是一笔 Coinjoin 交易很大、其一些输入来自其它的 Coinjoin 交易、并且这些 Coinjoin 交易又来自其它 Coinjoin 交易呢?在这种情况下,一起再次混币的参与者依然能提升自己的隐私新,哪怕他们都来自同一笔 Coinjoin 交易。如果每一次 Coinjoin 交易都足够大,那么用户就不需要多次混币,虽然他们可以这样做以进一步提升他们的匿名性。

如果许多大型的 Coinjoin 交易产生连接,最终的匿名集应该能提供大量的合理推诿能力,即使这些资金以前曾经参与过共同的 Coinjoin。

  • Coinjoin 轮次之间的相互关联,也就是使用了过去 Coinjoin 交易的结果,就其本身而言是坏事吗?
  • 当需要再次混合以往 Coinjoin 的结果时,这笔 Coinjoin 应该要多大,才是安全的?

个人全节点

在参与 coinjoin 的时候,你应该运行自己的比特币全节点吗?从表面上看,这是个好主意,而且实际上也往往是。一些 Coinjoin 实现让用户可选,而另一些则要求用户这样做。还有一些甚至不让你使用自己的全节点。要谴责他们吗?你已经读到了这里,那么你应该猜到了,答案是微妙的,而且打开了一个很深的兔子洞。

运行自己的全节点也意味着可用性上的取舍,而且如果不是所有用户都使用,可能不会增加很多隐私性。甚至,运行全节点会给你一种安全性和隐私性的错觉,如果很少 coinjoin 参与者使用全节点,你这样做是极为有害的。如果你把 Tor 用作 coinjoin 技术的一种匿名方法(我们这里先提一句),那么使用可信的全节点来广播 Coinjoin 交易是好的,就像一般情况一样。这里面有非常多的细节,而且,当然,你不应该相信我说的,你要自己验证。

为了不要落入自我表扬隐私性好的人的陷阱,我们有一些根本的问题要问他们:

  • 你的 Coinjoin 是允许使用全节点呢,还是要求使用全节点,还是不允许使用全节点?
  • 如果个人全节点不是强制性的,你们采取了什么隐私保护措施呢?Tor?区块过滤器?
  • 如果我运行自己的全节点,但预计绝大部分用户都会使用受信任的第三方节点来参与 Coinjoin,这对我的隐私性有什么样的影响?协调员可以让我去匿名化吗?

关于隐私性上的忧虑,始终关键的一点是,搞清楚你想保护什么、你想对抗谁。运行全节点并让自己的钱包使用它,是使用比特币的正确方式,因为它让你无需信任任何人,就可以验证你的钱包余额、把你的交易广播到网络中。但如果你要参与 coinjoin,那就总会有一个 “协调员”。协调员是干什么的、怎么选出来的?往下读。

协调员

Coinjoin 的协调员负责让每个参与者注册自己的输入和输出、在广播交易之前签名协商好的交易。大部分的 Coinjoin 实现都默认设置了一个中心协调员,它是协议的一个单点故障。迄今为止,社区中的绝大部分人都认为这是一种可以接受的权衡。那么,中心化的协调员会出错吗?当然会啊。有一些实现允许任何人来充当协调员,每一次的 Coinjoin 交易都可以使用不同的协调员,但这也面临其它的一些取舍,我们后面再说。

Coinjoin 是非托管的,即使协调员出错,资金也不会损失。协调员永远不应当知道比公开在比特币网络中的信息更多的东西。为什么呢?因为如果协调员知道的比公开的多,那么协调员就会变成攻击的目标,因为它有大量敏感的数据,可以挖掘出来针对信任这项服务的比特币用户。

你永远不应该信任你的 Coinjoin 协调员。如果一个 Coinjoin 协调员无法作恶,那是好事。要是它能作恶,那么它最终会消亡,因为错误、疏忽、被迫或彻底的不诚实等等原因。

敏感数据的一个例子是 XPUB(比特币钱包的主公钥),会确定无疑地泄露一个钱包的所有信息:这个钱包所控制的地址、过去现在和未来的所有比特币交易。另一个例子是运行自己的全节点的用户跟信任协调员的全节点的用户的比例,因为这可以去匿名化运行自己的节点的用户,因此可以确定地知道这些用户的输入与输入的关联。不过这是另一个微妙的话题,需要进一步的研究和讨论。

  • 协调员知道比公开在比特币网络上的信息更多的东西吗?
  • 用户是否向协调员泄露了敏感信息,比如他们的 XPUB,或者他们是否运行了自己的全节点?
  • 协调员是否声称因为有法律机制所以用户可以信任他们(即:法院警告、监管措施,等等)?

手续费

最后,谁来为 Coinjoin 交易支付手续费?这样的比特币交易可能体积很大,因此手续费昂贵,而且有时候手续费的结构对用户来说是不清楚的。很难知道你为了更好的隐私性需要付出多大的代价,甚至你不知道自己到底能不能从中获得更好的隐私性。一些 Coinjoin 实现允许一个输入从其它输入处购买隐私性 —— 这些其它输入只是为了提升自己的匿名集而无偿参与的。可以通过 coinjoin 来获得报酬?你没看错,是可以的。

某一些模式依赖于共同分担手续费,只有一些 UTXO 会支付手续费,其它的不会。另一些模式依赖于邀请越来越多的新的干净的输入(没有混合过的)来为现有的 Coinjoin 交易注资、混合当前匿名性不够高的输入。从长期来看,一些模式似乎是不可持续的,也有一些是很幼稚的,或者对大部分用户来说太贵了。

而且,我们讲的手续费到底指什么?一般来说,参与 Coinjoin 交易的输入需要支付协调费(或者叫吃单者费用,是为了获得一定程度的匿名性而支付的服务费)以及比特币网络的手续费。特定的 Coinjoin 模型可以在某些情况下免除这些费用。Coinjoin 的经济模式是很深的话题,也需要进一步的探究,才能获得更深的理解。

  • 谁,给 Coinjoin 交易里的什么东西付费?总的费用包括什么?
  • Coinjoin 协调员的经济激励在哪?
  • 每一轮 Coinjoin 都要付费吗?还是什么时候可以免费呢?

你已经读到了这里,那么,我的希望是,不求你在选择 Coinjoin 方案是能做到事事了然,但能问出合理的问题。一套评估不同 Coinjoin 实现的思维模式,或者说框架,对于考量使用 Coinjoin 拿回自己的隐私性的用户是非常有用的。分辨社交媒体上的噪音需要智性上的诚实,以及严格运用正确的评估系统。

(完)