作者:Aaron van Wirdum

来源:https://bitcoinmagazine.com/culture/building-on-taproot-payment-pools-could-be-bitcoins-next-layer-two-protocol

原文出版于 2020 年。

Payment pools, a potential Layer Two solution made possible through Taproot, could let groups of bitcoin users share UTXOs and enjoy more privacy.

- 支付池是一种可能的 Layer 2 协议,因为 Taproot 而成为可能;它可以让一群比特币用户共享一个 UTXO,从而获得更好的隐私性 -

本文要讲的是一个基于 Taproot 协议升级的技术概念。如果你还不熟悉 Taproot 的工作原理,我推荐已先看看这篇解读

Taproot 是由 Bitcoin Core 软件贡献者 Gregory Maxwell 最先提出的比特币协议升级,已处在开发的最终阶段。这些技术是一系列密码学技巧的巧妙综合,让用户可以在形态平常的交易中隐藏负载的智能合约 —— 只有合约的某个参与方不愿意合作时,合约的内容才会暴露出来。

基于这个想法,Bitcoin Core 的贡献者,包括(但不限于)Jeremy Rubin、Antoine Riard、Gleb Naumenko 和 Maxwell 自己一直在推敲一个通用的概念,称为 “支付池(payment pool,joinpool 或者 coinpool)”。这些类型的池子 —— 我们现在统一称为支付池 —— 将让一群用户可以共享记录在比特币链上的同一个币(技术上来说就是一个 UTXO)的所有权,同时还能让每个用户都能使用这个币来发起(或接收)支付。因为整个群体以及个人成员都隐藏在一个 Taproot 结构后面,这些用户都能享受到更好的隐私性、智能合约灵活性和其它好处 …… 而且,他们甚至可以在链下享受这些好处,所以支付池也就变成了一种新的 Layer 2 解决方案。

虽然每一种支付池提议的详述都有些许不同,但基本的概念是一样的。

共享同一个币

首先,要创建一个支付池,用户需要将他们的资金汇入一个共享的 Taproot 地址。那么,我们假设 Alice 持有 3 个币,Bob 持有 2 个币,Carol 持有 1 个币,总共是 6 个币。他们一起创建一笔交易,将这些币汇入他们共享的 Taproot 地址,让这个支付池得到了 6 个币。

在区块链上,支付池的地址跟一个普通的比特币地址没有区别,现在有了 6 个币。但表象之下,Alice、Bob 和 Carol 聪明地使用 Taproot 来保证,他们都各自掌控着支付池中自己的那部分。Alice 在任何时候都能取出地址中的 3 个币,Bob 和 Carol 也能随时取出自己的那一份。

这是因为,要想花费地址中的资金,他们只有两种选择。

第一种选择是直接从地址中花费,用术语来说就是 Taproot 的密钥路径。这需要来自三方的合作(也就是密码学签名)。如果 Alice、Bob 和 Carol 一致同意,那这 6 个币就随他们怎么花,而且花费的行为(交易)在比特币链上也跟其它普通的交易没啥区别。例如,这可以是三人决定将他们各自的份额发回各自的地址:Alice 得到 3 个币,Bob 得到 2 个币,Carol 得到 1 个币。但要是他们愿意,也可以将 6 个币都捐给 Julian,或是以他们一致同意的方式花费这些资金。重点在于,他们三个都要参与,所以没有人的份额能不经过 TA 本人的同意就被动用。

第二种选择实际上由一系列的子选项组成。在将资金汇入支付池之前,Alice、Bob 和 Carol 先在 Taproot 地址后面的密码学树上隐藏一些东西:他们加入了从支付池中花费资金的另类方法。(当前,你可以理解为三方都预先签名了使用这个路径来花费资金的交易,那么,设置所有的选项就有一点复杂,而且无法很好地拓展;未来,一些提议中的协议升级有可能把这个过程变得更加简单)。

如果某个参与者选择通过另类的 Tarpoot 路径来花费池中的资金,一般来说,他要将自己的的那一份资金发送到某个地址(比如说是 TA 自己控制的地址)。比如,如果是 Alice 要这样做,她就会把 3 个币发送到自己的地址(相应地,Bob 和 Carol 就分别是 2 和 1)。

使用另类路径时,剩余的币也会被自动花费出去。具体的方式有很多种,就看支付池的设计了,这些方式也就是在复杂性和可扩展性之间取舍。

最简单的方案是将其他人的份额也相应发回去,发到他们自己选择的地址。换句话说,如果某人退出了池子,其他人也都退出这个池子。

第二种方案,也是 Riard 和 Naumenko 喜欢的方案,是把所有的资金发送到一个 新的 支付池中,这个新的支付池跟旧的支付池没有什么区别,只不过删除了现在要退出的这个用户有关的部分。这种设计可以提供更好的用户体验,但也是最难拓展的一个,最主要的原因是,你需要为所有可能的退出情形作好准备,其中也包括因为退出而形成的新的池子的退出情形。不过,有个尚未命名的比特币协议升级候选提议,她可以保证前一个支付池的规则可以带到任何新的支付池中去;有了它,这种转移支付池的方案就有了可扩展性。

但是,Rubin 相信,第二种方案是不现实的,而且偏向于使用介于第一种和第二种方案之间的方案:某一些参与者会立即在自己选定的地址中收到原本属于自己的资金,而其他人的资金则会转入一个新的支付池。这种设计的用户体验不那么理想,但可以更好地扩展,而且提议中的 OP_CHECKTEMPLAVERIFY 提议可以帮助简化这个设计,还能进一步提高可扩展性。(退出将通过树支付来进行;这种支付类型的详情见此文。)

( 第二种和第三种方案之间的权衡取舍还有很多,但它们的长短之处的细节已经超出了本文的范围;请读 bitcoin-dev 邮件组中的讨论获取详情。)

要知道将剩余的币发往新的支付池会变成什么情形,我们还是假设 Alice、Bob 和 Carol 组成了一个支付池,并且选择了第二种选择(另类路径)来花费,某人退出时会把剩余的 所有 资金都发到一个新的支付池。假设 Alice 退出了第一个支付池,那么 3 个币会发到她自己指定的地址,而其它的币则会发到 Bob 和 Carol 形成的一个新的支付池。Alice 现在让自己的币完全回到自己的掌控之下了,但 Bob 和 Carol 的情形没有发生这么大的变化。他们依然可以合作来花费剩余的资金,或者某个人可以单方面退出,就像 Alice 做的那样。

要是 Bob 从第二个支付池单方面退出了,他会发送 2 个币到自己指定的地址,1 个币到只有 Carol 所在的(第三个)支付池。(当然,如果把最后一个资金池替换会 Carol 选定的一个地址会更有意义,但这是实现上的细节,而且这只是个简化的例子)。

这里的重点是,一个支付池中的参与者可以合作从池中产生任何类型的支付,同时任何人都可以在任何时间拿着自己的资金退出,让其他人继续控制他们自己的资金。

支付池的支付

现在,我们已经实现了所有参与者都能从支付池中取出自己的资金,以及 —— 如果他们意见一致 —— 可以从池中花费。这第二种选择实际上预示着:支付池可以是动态的。只要所有参与者都同意,他们不仅能够把资金取回,还能给他人支付(比如 Julian),但他们还可以做更有意思的事情。他们可以将资金移到更新的、带有不同设计的支付池中。

例如,这使得他们中的任何一个,都可以从池中花费。

假设 Alice 要买一辆新车,想要支付 1 个币,Alice 、Bob 和 Carol 可以从支付池中创建一笔交易,把 1 个币发给车商,然后将剩余的 5 个币发到一个看起来个原有支付池别无二致的 支付池中,只不过在这个新的支付池中,Alice 要单方面退出只能拿走 2 个币,比先前少了 1个。

同时,这笔交易看起来也跟其它常规的比特币交易没有区别。车商(以及区块链专家)也许会断定 Alice 拥有 6 个币,把其中 1 个发给了他,另外 5 个当成了找零。他们不会知道有一些币是属于 Bob 和 Carol 的,也不知道他们参与到了交易中。

下一次,当 Bob 要发起一笔支付,Alice 和 Carol 合作时,也是从一个支付池中支付,其交易看起来也跟普通的比特币交易一样。在最终的支付池中,Bob 如果单方面退出,将只能拿走 1 个币。这时候区块链专家可能会以为 Alice 又做了一次支付,进一步陷入模糊。(而且,即使这个专家手段高明,知道了这个之地址是 Alice 、Bob 和 Carol 之间的一个支付池,也始终不知道到底是谁发起了最后一笔支付。)

每次 Alice、Bob 或 Carol 要支付时,外人都不可能分辨出到底是谁在支付。

支付池不仅允许支付。如果 Alice 想要增加自己在池中的 “余额”,她也可以做到。Alice、Bob 和 Carol 将合作将当前的 5 个币转移到一个新的 Taproot 地址中,并且,在同一笔交易中,Alice 将从自己控制的某个地址发送额外的 1 个币到这个地址中。新的 Taproot 地址将依旧有 6 个币,其中 3 个属于 Alice,这也会在她的单方面退出条款中反映出来。

同样地,我们也可以让新的用户加入这个支付池,如果 Alice、Bob 和 Carol 都同意 Dave 加入,那么他们三个可以跟 Dave 一起创建一笔交易,将原有的支付池中的资金以及 Dave 新注入的资金一起发送到一个新的支付池。这个支付池是为 Dave 参与而设计的 —— 而且 Dave 也可以随时退出。

此外,支付池中的参与者也可以相互支付。例如,假如 Alice 要给 Bob 支付 1 个币,他们三人可以将池中的资金发送到一个新的支付池,在这个支付池中,Alice 的余额将比先前少 1 个,而 Bob 的余额会比原来多 1 个。这笔交易在比特币链上也跟普通交易一样,区块链专家将完全不知道是谁给谁支付了,也不知道支付了多少。(其实 Dave 也可以用类似的方式,也就是接收内部人支付的方式加入支付池。)

增加额外的一丁点复杂性(最好是有一个类似于 Noinput 的比特币升级提议的帮助),支付甚至可以在链下完成。这时候,当 Alice 给 Bob 支付时,所有参与者创建一笔交易,将资金发到一个新的支付池中,只不过,这笔交易仅在三人内部分享,不会广播道网络中(除非某个人试图欺诈)。这样一来,Alice、Bob 和 Carol 就可以不断在 “内部” 相互支付、更新余额,甚至在某个时候让 Dave 加入进来。当他们一致决定关闭这个池子时,他们可以创建中一笔最终的交易,从最初的支付池中花费,将所有参与者最终的余额发回给各方。

这样的支付池类似于之前一个名叫 “通道工厂” 的概念,最终甚至可以用来托管闪电网络通道或其他 layer 2 协议。所以,最终我们甚至有可能用这样的支付池来 “封装” 任何类型的其他协议,将它们的复杂性都隐藏在普普通通、一模一样的交易中。

(完)