亿聪哲史首页
<亿聪哲史 />

"Bitcoin is the signal. Everything else is noise."

Return to Block E31

E31·双人成行

曾汨: 听众朋友们大家好,欢迎收听《亿聪哲史》第 31 期,我是主播曾汨。

阿剑: 我是主播阿剑。

曾汨: 今天这期播客,我们想聊一个《亿聪哲史》之前从未深入探讨过的话题,比特币交易的隐私性。我们很高兴邀请到了 PayJoin 协议的开发者 Dan Gould,来和我们聊一聊 PayJoin 这种提升交易隐私性的技术。嗨,Dan,请你先和大家打个招呼,简单介绍一下你自己吧。

Dan Gould: 大家好,曾汨、阿剑你们好。我是一名比特币开发者,也是 PayJoin Foundation 的执行长。我在高中时找到了比特币,也发现美国政府掌握着很多人的资料。你们记得 Edward Snowden 的事情吗?那时候我对隐私很感兴趣。大学的时候,我学的是计算机科学,所以我对密码学很感兴趣。在 Reddit 上,我看过一篇 TumbleBit 的白皮书,它讨论的是闪电网络出现之前的支付通道隐私技术。它的作者其实是我一门课程的助教,我很惊讶,那时候我不知道作者就是他。我在 Reddit 上看到那篇白皮书,觉得这个技术很酷,也有机会和作者交流,所以他在寒假的时候让我们一起研究这些软件。那时候我也很想做一些开源的项目,可以自己做一些贡献。他就是 Ethan Heilman,他现在也在量子计算方向做了很多工作。后来我找到了 PayJoin,觉得它可以更好地解决比特币的隐私问题,也可以进一步改善隐私,让比特币使用起来更有效。

曾汨: 那如果要向第一次听说 PayJoin 这个概念的听众解释,什么是 PayJoin?你会用怎样简单直白的方式来介绍它?

Dan Gould: 我觉得最重要的是,PayJoin 是让两个人进行互动式交易的最简单、最基本的办法。在原本的比特币软件里,我们不会进行互动式交易,一个人会加入所有的输入和输出,建立一笔交易。后来我们发现了很多互动式交易的办法,比如闪电网络、eCash、Ark 或者 CoinJoin,它们都需要很多人一起沟通来完成交易。PayJoin 是最基本的形式,只有两个人互相请求、回应,交换一些资料,然后共同完成交易。因为它是互动的,所以可能带来隐私方面的好处,也有机会降低手续费。

阿剑: 我觉得为了让听众更好地理解 PayJoin,你可不可以先拿一个很简单的例子,解释一下传统方式下比特币交易是怎样发生的?假如我要向你转 0.1 个比特币,传统情况下我是怎样给你转的?如果使用 PayJoin,方式会有什么不同?

Dan Gould: 原始交易,如果你想给我转,假设你有 0.5 个比特币。你先会问我有没有地址,我会把地址给你。然后你会建立原始交易,用你的 0.5 个比特币作为输入,写入我的输出,比如说你要给我 0.4 个比特币,所以你会写入 0.4 和我的地址。你还要找零,因为比特币是硬币模型,没有账户,所以你也会写入你的地址和 0.1 个比特币。你会签名,然后广播,交易就会确认。使用 PayJoin 的时候,我们有机会加入自己的输入。所以使用 PayJoin 的时候,签名之后你不会广播原始交易,而是向我的 PayJoin endpoint 发起请求。这个时候我仍然可以广播你的原始交易,我们把它称作 fallback,如果出现问题,我可以广播原始交易。可是如果我想利用这个机会建立 PayJoin,我会改变原始交易。因为你的签名是针对交易每一部分资料生成的,交易被我改变之后,原来的签名就会失效。交易双方都要同意,所以我会加入我的输入,比如说 0.4。曾汨,你的输入是 0.5,我加入我的 0.4。你原本是想支付我 0.4,但我加入自己的 0.4 之后,我的输出、我的地址就会写成 0.8,然后你也会保留原来的找零 0.1。我会签名,然后回应。现在你也有机会签名,你可以签名并广播。这样我们就一起建立了这笔 PayJoin 交易。

阿剑: OK,那从曾汨老师的角度出发,使用这种技术的意义在哪里呢?原本情况下,付款方只需要自己签名、广播就可以了。现在多了一个步骤,要和对方联系、交互式创建交易。它的好处是什么?

Dan Gould: 它的好处是,我觉得可以看看中本聪的白皮书。最重要的好处是隐私,收到 PayJoin 的时候也有机会节省手续费。不过花钱的时候,主要还是隐私方面的好处,因为第三方无法分析这笔交易究竟是什么。比如说你是一家公司,雇佣员工并给他们发工资,你可能不希望他们知道同事挣多少钱。或者你是一家公司,买卖商品,也不希望买东西的人知道竞争对手的产品卖多少钱。这很重要。

你可能会问,为什么会有这样的效果?因为中本聪在白皮书第十段讨论隐私时说,每一笔交易的输入都来自同一个人,因为当时的软件没有办法互动式地建立交易,所以每个输入当然都来自一个人。你们知道,有时候你需要把两个币合并起来,也就是 consolidate。传统上,只有在合并币的时候,交易才可能出现多个输入,但使用 PayJoin 之后,这个假设就不成立了。

阿剑: OK,Dan,你的意思是,原本我们看到一笔交易时,会认为它的输入都来自同一个人。但 PayJoin 情况下,交易双方都为这笔交易提供了输入,也就是提供了钱。如果人们仍然认为它们来自同一个人,分析就会出错,会误认为不同的人是同一个人,这就达到了混淆钱包所有者身份的效果。是这个意思吗?

Dan Gould: 从第三方的角度看是这样。可是因为收款人和付款人一起签署了交易,都知道各自的输入和输出,也知道对方的输入和输出,所以对彼此来说没有隐私。但你说得对,PayJoin 让两个人进行互动式交易,原本“每个输入都来自同一个人”的假设就不成立了。

阿剑: OK。同时你提到,这个过程还可以在一定程度上隐藏实际支付金额。原本如果一笔交易只有一个输入、两个输出,一个是支付,一个是找零,我们可以猜测哪个是支付、哪个是找零。但在 PayJoin 交易中有两个输入和两个输出,就不太容易判断钱是从哪个输入流向哪个输出,所以它能在一定程度上隐藏实际支付金额,对吧?

Dan Gould: 你的意思是有没有办法辨认找零?没有。

阿剑: 是的。我知道有些情况下还是能辨认找零。比如输入和输出的数额之间存在类似整数关系,用我们说的整数启发式进行分析时,还是有办法辨认。但有时候确实辨认不出来。比如刚才的例子,你提供 0.4 BTC,曾老师提供 0.5 BTC,输出一个是 0.8 BTC,一个是 0.1 BTC。

Dan Gould: 对,输出不是 0.4。

阿剑: 对,输出不是 0.4,所以人们无法确定 0.1 是什么。即使他们猜测这笔交易实际上来自两个人,也无法判断 0.1 到底属于谁,对吧?

Dan Gould: 对,我们还有一些其他问题。我们只是让最基本、最简单的假设变得不可靠。当然,我觉得 PayJoin 比没有 PayJoin 好,是一个小小的进步,但问题也有点复杂。

曾汨: 也就是说,PayJoin 不能解决整个交易环境中的所有隐私问题,但能把其中一部分做好。阿剑老师刚刚讲了,我们分析一笔交易时,通常会假设输入由同一个人提供。观察整个网络上的交易时,我们也会默认输入来自同一个人,然后把这些身份关联起来。有了 PayJoin,输入可以由多个人提供,我们就无法建立这个前提。这里有一个专业术语,叫共同输入所有权启发式,它也是很多链上分析者用来判断地址归属的常见方法。但有了 PayJoin,我们不能再假设所有输入都来自同一个人,这就是 PayJoin 在交易隐私上带来的进步。如果网络上的人都使用 PayJoin,所有交易都会变得混淆,第三方分析者就无法默认一笔交易的输入来自同一个人,共同输入所有权启发式也就不成立了。这是我觉得 PayJoin 很好的一个作用。

Dan Gould: 嗯,重点是使用 PayJoin 后,如果很多人都使用 PayJoin,每笔交易就会有很多可能性。我们不知道哪个输出是收款人的输出,哪个是付款人的找零,会有很多选择。

曾汨: 好,Dan,你能不能举一个实际的例子,解释整个 PayJoin 交易的流程?比如我是顾客,要给商家付款,如果我们都希望使用 PayJoin,整个流程是什么样的?谁先做什么?

Dan Gould: 从顾客的角度来说,PayJoin 和普通交易的体验差不多。商家作为收款人,会给顾客一个地址,不过这个地址里还会包含 PayJoin URI,这是 BIP-21 的规格。它包含 Bitcoin 地址、金额,以及一些 PayJoin 资料,比如 PayJoin mailbox,也就是发送 PayJoin 请求的位置。顾客通过 PayJoin URI 就知道如何开始。首先扫描这个地址的二维码,然后建立原始交易,也就是我刚才说的那种交易。交易签名了,但不广播,而是向商家发起请求。商家收到请求后,有机会把原始交易改成 PayJoin,加入自己的输入和输出。原始交易中支付的金额不变,但商家可以加入自己的输入,也可以增加商家的地址。然后商家签名并回应顾客。顾客收到之后会检查是否接受,确认协议是否符合约定。如果接受,就再次签名。因为原始交易的签名包含了原始交易资料,交易修改后原来的签名不能用了,所以顾客要重新签名。最后,因为顾客和商家都有签名,顾客就可以广播,交易得到确认。

曾汨: 那这个过程首先,商家和顾客都需要使用支持 PayJoin 的钱包,对吗?

Dan Gould: 他们的钱包要知道如何通过 PayJoin 通信。不过 PayJoin 是一个开源规格,写在一份规范里,任何钱包、交易所或公司都可以按照它实现。

曾汨: 现在有哪些钱包可以使用 PayJoin?

Dan Gould: 有很多,而且越来越多。现在 Bull Bitcoin Mobile 和 Cake Wallet 都支持异步 PayJoin,也就是现代的 PayJoin;旧的 BIP-78 是同步 PayJoin 的规格。很多钱包可以发起这种 PayJoin,但不能接收,因为接收方要自己运行服务器。所以支持同步 PayJoin 的有 Wasabi、Sparrow、JoinMarket、BlueWallet 等,还有一些。现代 PayJoin 现在有 Bull Bitcoin Mobile 和 Cake Wallet 两个试点集成。

曾汨: OK,那你刚刚其实提到了一个我们之前没有聊过的概念,一个是同步的 PayJoin,也就是 BIP-78;一个是异步的 PayJoin,也就是 BIP-77。同步和异步到底有什么区别?你可以简单解释一下吗?

Dan Gould: 你刚才说 PayJoin 是让两个人互动式地完成一笔交易。当时还没有统一规格,只是一些开发者在英国一家酒吧聊天,提出了一些想法,后来由 Nicolas Dorier 等开发者发布了 BIP-78。PayJoin 的简单形式是收款人运行自己的服务器,通过 HTTP 请求接收和回应。但问题是付款人和收款人要同时在线。第一个问题是很多人没办法运行自己的服务器;另外,因为要求在线,它也没办法和硬件钱包一起使用。如果一个人离线,比如我在手机上用钱包,想给你发一笔交易,但钱包离线,就没办法沟通。

因为这些问题,我们开始发展 BIP-77,也就是异步 PayJoin。异步 PayJoin 使用第三方服务器,我们称它为 blind server,看不到消息里面的交易内容。两个人使用第三方服务器,有点像电子邮件,你发一封邮件,邮件会经过其他服务器。收款人拥有一个地址,但不需要自己的服务器,他的 PayJoin URL 其实是第三方服务器的地址,也就是他的 mailbox。付款人把 PayJoin 请求放进 mailbox,收款人之后查看有没有消息,然后继续执行基本相同的 protocol。这样你可以离线操作,可以等一会儿再继续,也可以使用离线手机和硬件钱包。

曾汨: 刚才你说,如果支持异步 PayJoin,它就可以和硬件钱包结合使用。但同步 PayJoin 需要实时在线签署交易,没办法配合硬件钱包使用。是这样吗?

Dan Gould: 嗯,异步的更容易整合。因为你只需要一个 HTTP client,软件不需要服务器。我们还有 PayJoin DevKit,这是一个软件,你可以把它放进钱包、交易所,或者任何钱包软件都可以整合。

曾汨: 但现在支持异步 PayJoin,也就是 BIP-77 的,目前是两款钱包,一款是 Bull Bitcoin Mobile,一款是 Cake Wallet,对吗?

Dan Gould: 是。

曾汨: 那我们刚才聊了 PayJoin 实现的基本原理。因为 PayJoin 的核心目的是提升比特币交易的隐私性,我们想知道它的能力边界在哪里,有哪些隐私问题是它不能解决的?

Dan Gould: 其实还有很多。PayJoin 只是打破最简单的假设,也就是一笔交易的所有输入都来自同一个人。但每个钱包都有自己的 fingerprint,也就是指纹特征,比如可能有 lock time,更严重的是,如果你的找零总是在第一个输出,很多人就能知道你使用的是什么钱包。比如你用 Cake Wallet,或者作为付款方使用 Bull Bitcoin Mobile,这两个钱包都有自己的 fingerprint,链上分析仍然可以知道你用的是什么钱包。所以 PayJoin 很重要,但我们还需要处理其他隐私问题。

另外,PayJoin 让第三方不知道交易里的支付金额,或者输入来自哪里。但如果我是付款人,我知道收款人的输入和输出,所以 PayJoin 对我没有隐私。未来我们可以把 PayJoin 扩展到三个人或更多人,这样就能解决这些问题。

还有一个问题是,目前支持 PayJoin 的钱包还不多。我们刚刚发布了 PayJoin DevKit 1.0,这是第一个稳定版本。现在你可以把 PayJoin 集成到自己的软件里,我们可以帮助你完成这件事。一个月前还做不到,现在终于可以了。

曾汨: 给听众朋友们同步一个信息,PayJoin DevKit 1.0 是 5 天前发布的,也就是 8 月 13 日,刚刚上线。Dan,你刚刚提到了多个人参与的 PayJoin,也就是多方 PayJoin。这会是接下来 PayJoin 的一个开发方向吗?

Dan Gould: 其实现在的 PayJoin 也可以变得复杂一点。我们有一种叫 cut-through 的方式。比如两个人在一个交易所,一个人要 deposit,另一个人要 withdraw。发起 deposit 的人可以请求使用 PayJoin 存钱,交易所则可以把收款地址改成 withdrawer 的地址,所以我们可以实现 cut-through。这样已经可以让三个人一起使用 PayJoin。不过现在 BIP-77 还没有稳定、还没有 complete,仍然是一个 draft,我们还在鼓励其他钱包和交易所采用。之后我们会发展更复杂的 PayJoin,让更多参与方轮流互动。如果做到这一点,就能解决第二方知道你输入和输出的问题。

曾汨: 提到 PayJoin,还有一个很多人会想到的概念,就是 CoinJoin。PayJoin 和 CoinJoin 都支持让一笔交易的输入来自多个不同参与方,它们最核心的区别在哪里?

Dan Gould: 最大的差别是做的时机。CoinJoin 是额外的行为,为了获得隐私。PayJoin 不是,PayJoin 是你本来就要支付的时候,有机会把交易 batch 在一起,获得隐私只是一个 side effect,是结果。这是最大的区别。PayJoin 差不多是多人一起各自处理自己的付款;PayJoin 的情况是,我已经要把钱付给别人,同时有机会和对方一起交易。

曾汨: 也就是说,CoinJoin 是主动行为。比如我的钱包里有很多 UTXO,觉得隐私不够,就把一部分 UTXO 单独拿去参加 CoinJoin,让这些 UTXO 重新获得隐私。PayJoin 则是在我本来就要进行一笔交易的时候,因为使用了 PayJoin,这笔交易同时获得了隐私。所以它们参与的环节不同。我可以在每笔交易里使用 PayJoin 获得隐私,也可以在交易完成之后,对 UTXO 再使用 CoinJoin,让它们获得额外的隐私。它们解决的是不同环节的问题。

Dan Gould: PayJoin 是你已经在做的行为,是你已经习惯的比特币用法。

阿剑: 我想问一个实现方面的细节。现在 PayJoin 的实现中,是否强制输出只能有两个,也就是只能有两方参与?

Dan Gould: 没有。

阿剑: 是可以多个的。

Dan Gould: 当然可以。付款人和收款人都可以随意加入输入和输出。当然我们的工具会推荐一些选择,但规格上没有 Coin Control 的限制,规定的是两个人如何同意一起建立交易。如果你要花更多钱,可以使用很多输入和输出。收款人也不需要加入输入或输出,他们可以直接使用 Payment Cut Through,也就是把收款地址改成新参与者或新钱包的地址。

我们还看到一些 Ark Wallet,它们的第二层协议叫 Bark,也会使用 PayJoin。因为 Bark 也是一个很复杂的规格,如果你要把钱放进 ARK 里,首先要支付给链上的 Bark 钱包,然后 Bark 会产生两笔交易。但如果这个 Bark 钱包支持接收 PayJoin,付款钱包只需要请求“我要和这个 Bark Wallet 做 PayJoin”,然后 Bark 钱包就可以把这个请求变成一个 Bark onboarding。这个想法很好,也可以用 cut-through 连接闪电网络的通道。

阿剑: 所以如果再复杂一点,在闪电通道的 splicing 这个动作中,也可以尝试把 splicing 和 PayJoin endpoint 结合起来互动,对吧?

Dan Gould: 可以。

阿剑: 这个方向很有趣。因为如果原本的收款方可以借助付款方发送交易的机会,把自己的支付交易塞进来,通用性会很广。比如商家本来就需要给供应商付款,就可以在顾客给他付款的时候直接参与进来,这种灵活性非常好,对吧?

Dan Gould: 有很多这样的机会,我们还没有探索完。

曾汨: OK,Dan,你还有哪些方面希望在节目里分享?

Dan Gould: 嗯,如果你有兴趣,可以看看 PayJoin DevKit 的文章。如果你有推荐,也可以告诉我。这样就好,谢谢你们让我来和你们交流。嗯。

曾汨: 希望有更多钱包厂商加入对 PayJoin 的支持。这样我们作为用户,在使用比特币发起交易时都能使用 PayJoin,所有人的隐私性都会得到更大提升。使用的人越多,第三方观察者监测链上活动、分析每个人链上行为的难度就越大,这对所有人都是更好的事情。好的,今天我们就聊到这里。非常感谢 Dan 今天带来的 PayJoin 分享,希望今天的讨论能让大家对 PayJoin 有更清晰、准确的认识。我们下一期节目再见,拜拜!

Follow us:
RSS Feed:

Vires in Numeris
// 以数字铸就力量

Libertas in Cryptographia
// 以密码学捍卫自由