作者:Seth For Privacy
来源:https://bitcoinmagazine.com/technical/silent-payments-make-bitcoin-more-private
在比特币上,人们一直认为,提升你的隐私性的最基本的方法,就是避免为多笔支付使用同一个地址(“地址复用”)。虽然今天的大多数钱包都会自动为每一笔支付生成新的地址,所以实践起来已经容易多了,但如果我们需要重复跟某一些人接收支付,我们能怎么办呢?
这就是所谓的 “可复用的支付码”(有时候也叫 “隐身地址(Stealth Address)”)的用处,它可以让用户生成一个静态的地址,可以用在重复的支付中,同时,因为这些支付很难被关联起来,它还能保持用户在链上的隐私性。
为什么比特币需要可复用的支付码?
虽然现在可以使用更复杂的基础设施,比如 BTCPay Server 提供的支付处理系统,来接收捐赠和支付,而不会复用地址,这毕竟需要在比特币节点之外建立一套完全独立的服务,让接收支付这么简单的一个用途变得过于复杂(对大多数人来说)。
如果你只是想要搞一个捐赠活动,让朋友们可以多次给你发送比特币,或是让别人可以给你打赏,想要使用静态的比特币地址,你要么得运行复杂的基础设施,要么只能得到非常差的隐私性。
这就是可复用支付码的用场。这个概念可以追溯到 2015 年,Peter Todd 提出的隐身地址 BIP。虽然这个原始提议从未正式成为一个 BIP(徒有编号 63),其继任者 BIP47 在近几年开始得到 Samourai Wallet 和 Sparrow Wallet 这样的钱包的采用。这两个钱包也是非常棒的、专注隐私性的比特币钱包。
那为什么我们最终走向静默支付?
不幸的是,BIP47 有一个严重的缺点:为了让接收者知道他们即将收到一笔支付(并因此有能力花费它),发送者必须创建一笔特殊的交易 —— 叫做 “通知交易” —— 让接收者可以发现自己的资金,而且 这笔交易跟真正的支付是完全分开的。虽然每个发送者只需做一次这样的操作,而且这是 BIP47 得以利用轻钱包的核心特性,它有严重的手续费和可扩展性问题。更重要的是,它还有悖于可复用支付码的用途 —— 它对隐私性有害。
幸好,Ruben Somsen 在 2022 年 3 月 13 日发表的一篇 GitHub 帖子提出了一个非常有前景的提议,叫做 “静默支付”,其关键取舍是将(可能带来糟糕后果的)通知交易换成了接收者一端更复杂的链上扫描程序。静默支付是对原本的 “隐身地址” 提议的改进,但利用了比特币扫描技术和脚本类型(Taproot)的进步,以及一些漂亮的技巧。
如果你更深入地研究静默支付的起源和它的目标功能,我非常推荐你阅读 Shinobi 的这篇文章《比特币静默支付和隐形钥匙》(中文译本),但我们还是会很简要地讲一下它的实现方式。
静默支付工作原理,简化版
在我尽情阐述我何以对静默支付如此激动之前,我们起码得先理解静默支付在发送者和接收者两端是如何工作的。
发送者
当某人想要发送资金到某个静默支付地址时,实际上,TA 只需要扫描或者 复制-粘贴 那个支付码,然后放到自己喜欢用的钱包里面(假设这个钱包支持静默支付),然后跟平常一样发送交易就可以了。但是,钱包在后台是怎么处理支付码的呢?
当发送者输入一个静默支付地址到钱包中时,钱包会结合三个密钥,创建出一个独一无二的、一次性的地址,而且只有目标接收者才能花费其中的资金。这个唯一地址是通过结合发送者希望花费的输入之一的公钥(按照普通用户的理解就是 “地址”)、接收者的公钥(包含在静默支付地址中)以及一个只有发送者和接收者知道的 “共享秘密” 密钥来生成的。感谢密码学的 “交换(commutative)” 属性,发送者可以结合这些密钥,但 无法花费这个过程所产生的地址,因为 TA 不知道接收者的私钥(TA 当然不知道)。
发送者结合了这三个密钥之后,他们就能创建出一个新的公钥(或者说地址),然后将目标资金发送到这个只有接收者控制的新地址中。在比特币区块链上,这笔交易看起来跟相同脚本类型的花费交易 没有任何区别,没有任何因素能使外部观察者辨别出这是一笔静默支付交易,更别说它用到了哪个静默支付地址。
接收者
从接收者一端,可以更清楚看出静默支付做了哪些取舍。如果你还记得发送者使用被花费的一个输出的公钥来生成唯一的、一次性的地址,你可能会问,“接收者怎么知道有人给自己发送了资金,发到了哪个地址上?”
这个问题的答案正是静默支付提议的核心,它意味着接收者(在创建自己的静默支付地址后)必须扫描比特币区块链上的 每一笔 交易,这是相对比较昂贵的。扫描过程就是检查每一笔交易的每一个输入的公钥,加上一个使用自己的静默支付地址生成的共享秘密值以及一个输出的公钥,是否能够与自己的私钥相匹配,如果匹配就放入钱包中标记为可以花费的资金。
这个扫描过程比起标准的比特币钱包扫描过程会昂贵很多,因为你没法直接对比你的钱包推导出的地址列表和交易输出的列表。相反,你必须遍历每一笔交易、为每一个输入计算共享秘密值,并跟输出对比;Somsen 在 “解释比特币” 播客中将它比作 “每个签名都检查两次,而不是一次”。
理想情况下,这个扫描过程将在初次区块下载(你第一次扫描整个比特币区块链)的时候完成,或者由一个专门的软件来完成,从而减轻钱包和比特币节点的负担。
为接收者优化扫描时间
虽然扫描的计算量是非常大的,我们可以通过下面三种优化方法来提高效率,而且不会牺牲隐私性或者说可互换性:
- 在你创建一个静默支付地址时,带上一个 “生日” 数据并保存起来,这样当你恢复钱包时,就不必从头开始扫描,只需从 “生日” 那个区块开始扫描区块链就好。
- 只检查 Taproot 输出,因为现在链上只有很少一部分输出是 P2TR(Pay-to-Taproot) 的,这将消去大量需要扫描的交易,极大地减少需要扫描的时间。不过,随着 Taproot 被用得越来越多,这种办法会越来越失去意义。不过,在一段时间内,它有可能是最高效的优化手段。
- 只检查 UTXO 集,而不是扫描每一笔历史交易,因为你只关心跟你的静默支付地址有关的,新的、即将到来的、尚未花费的输出。这种办法的缺点是不提供交易历史,而且可能需要在常规方法以外维护一个专门的数据库。
为什么静默支付比 PayNyms 更好?
现在关键问题来了:我们已经有 PayNyms(BIP47)了,而且它的采用率也在增长,为什么我们需要静默支付?很遗憾,BIP47 的恼人问题应然跟通知交易有关,有两大主要原因;正是这两个原因,在我看来,静默支付在敌对环境中会更优越。
其一,需要发起通知交易,将让只发生一次的交易变得非常低效,因为你需要发送两笔交易来完成一次支付。对于可复用支付码的需要常见用场来说,这是一个灾难性的缺点,它显著提高了链上手续费,并使区块链膨胀。其二,通知交易也可能有 显著 的隐私性缺陷,因为任何能上网的人都可以看到比特币区块链,并确定哪个钱包集群可以(在何种程度上)跟给定的一笔 PayNym “联系起来”。
我们就拿加拿大在今年 2 月的 “自由车队” 卡车司机抗议事件为例。如果有人为这些抗议者使用 BIP47 PayNym 来收集和分发比特币捐赠,在链上,这些跟这个 PayNym 相关联的钱包集群会变得非常显眼,很有可能每个向 “自由车队” 捐赠过的钱包都会曝光,让政府和交易所可以打击这些捐赠者。
虽然比特币可以防止捐赠资金被没收(不像 GoFundMe 那么糟糕),要是这些捐赠者的钱包跟一个 KYC(了解顾客信息)的交易所账户或者他们的真实身份关联起来,他们所在地的政府就可以上门要求解释,甚至可以直接起诉他们。
因为这些严重的问题,我认为,BIP47 PayNyms 不足以应对可复用支付码经常面临的敌对环境,这也是我对静默支付如此激动的原因。虽然静默支付 将 提高使用可复用支付码接收资金的复杂性(对比 PayNym),最终的隐私性、效率性和非交互性好处,足以盖过其复杂性,使之成为比特币可复用支付码在大多数用途中的理想下一步,这是我们急缺的东西。
也就是说,PayNyms 只适合一个非常具体的用途 —— 允许使用可复用支付码而 无需 运行一个比特币全节点。(作为接收者)在额外的交易成本和隐私问题跟运行全节点的负担相比较小时,PayNyms 依然可以作为实现可复用支付码的优秀方法,同时保持轻钱包的用户体验优势。未来也有可能出现将通知交易外包给第三方、从而减少一些链上隐私问题的通知交易处理办法(但是会引入一个受信任的第三方),可在这里了解。
Samourai Wallet 正在使用上述想法的一个变种,可以利用 PayNyms 的好处,无需为双方沟通而发起通知交易。
下一步是什么?
虽然静默支付让人非常激动,我们要知道这个提议还处于非常初步的阶段。GitHub 上的帖子正在接收广泛的审核和评论,而且许多人都在测试这个提案的许多关键方法,同时追求优化和提升。静默支付正在进行的主要研究是列出这许多种方案的比较基准,并找出一个不需要牺牲隐私性和可互换性的扫描优化方案。
要是你是懂技术的用户或者开发者,请记住:参与这个提案的测试、基准测试和审核的人越多、越早,这个提议就能走得越远、变得越好。所以,如果你懂技术的话,请看看这个 GitHub 帖子。
要是你不太懂技术,请记得关注 Bitcoin Magazine 上出现的新文章、听听 “解释比特币”这个很棒的播客关于静默支付的一期、看看Ruben Somsen 为静默支付作的演讲,以获得对静默支付的工作原理和设计哲学的更深入的理解。
最后,我想说,看到帮助推动比特币隐私性的新开发和新研究总是让人激动,而且,这个领域虽然很少被视为 “酷炫” 的领域,却是让比特币保持抗审查性、成为真正的 “自由货币” 的关键一环。
格外感谢 Ruben Somsen 和 Samourai Wallet 的 TdevD,他们花时间审核了本文并给出了反馈。
(完)