40

手握近百万BTC,揭秘巨鲸Coinbase是如何管理它们的

 4 years ago
source link: https://www.8btc.com/article/561238
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

而在这篇文章中,Coinbase Custody的工程经理Andrei Anisimov介绍了该公司如何使用比特币“父子支付”(Child-Pays-For-Parent)技术来管理他们的钱包。

ziauiuy.jpg!web

以下为译文:

安全性是所有托管技术的主要内容,而客户则主要通过可靠性和便利性来判断我们的产品。我们的用户经常会执行一些高价值、高实效性的提款交易,然后期望在区块链的交易确认方面不会有延迟,并且有干净可预测的金额可以到达目的地地址(也就是说,不会从金额中扣除任何费用)。

幸运的是,比特币的先进技术 “父子支付”(CPFP) 能够帮助我们实现以上的所有要求,即:零费用交易、可靠的确认时间,同时保持安全的冷存储基本属性(每个私钥只严格使用一次)。

比特币费用和冷存储

通常来说,提交给比特币网络的每一笔交易,都需要有一笔支付给矿工的费用,然后矿工会处理该交易,并将其纳入一个区块当中。平均而言,比特币网络每10分钟会产生一个区块。当所有待处理交易的大小超过区块大小限制(1MB)时,矿工将优先考虑具有高手续费的交易,同时将低费用交易推迟到下一个区块。这样的过程可能会重复多次,从而导致交易无限期地推迟(直至网络堵塞的情况消除)。

如果你在2017年-2018年进行过比特币交易,你可能还记得,在价格波动剧烈期,以及其它重要事件高峰期间,比特币交易经常会出现数小时甚至数天的延迟。在这段时间里,为了确保交易不被延迟,而支付超100倍正常交易费用的情况并不少见。下图显示了比特币费用的波动情况。

FfYv2eY.png!web

(图:比特币交易费用历史数据,来自https://jochen-hoenicke.de/queue/#0,all)

在Coinbase Custody,我们意识到了这一障碍,并尝试了一些解决方案,以在客户最需要的时候为他们提供优势。一个显而易见的解决方案,是在广播交易之前,立即计算交易费用,知道当前的网络状况,使得我们能够预测最佳的费用。

不幸的是,冷存储的安全要求,使得在广播之前是很难估算费用的。

冷存储遇到的挑战

冷存储安全模型,要求事先完全了解完整的交易有效载荷(包括金额和目的地),以防止在密钥恢复过程启动后,对有效载荷进行任何的更改。

另一方面,由于交易费用被编码在有效载荷中,因此这意味着必须提早在广播交易前计算费用。如果在该时间间隔内,网络突然变得拥挤,则计算出的费用可能不足以及时确认交易。

父子支付(CPFP)解决方案

比特币UTXO模型的一个有趣的特性是,交易是可以捆绑在一起的,然后矿工对费用进行整体评估。例如,如果一项(子项)交易花费了另一项(父项)交易的输出,则子项交易可以同时为这两项交易支付费用,而矿工是别无选择的,如果他们想从子项交易中收取超额费用,他们只能纳入父项交易。这种方法,通常被称为“父子支付”(CPFP)方案。

Coinbase的客户平台使用该方案来加速提款已经有很长一段时间了,你可以在博客文章中了解到更多的信息,而Custody所面临的独特挑战,迫使我们重新考虑该方法,并由此提出了不同的设计。

在Custody托管产品中,我们使用“父子支付”(CPFP)技术将费用估算移动到广播之前。此外,我们使用特殊的加油站服务来支付交易费用。逐步的方法如下:

  1. 当一笔提款从冷钱包地址发起时,我们会进行初始费用估算,并使用加油站服务向该地址发送10倍的估算费用;
  2. 除了目的地和找零输出之外,当构建取款(父)交易时,我们添加一个输出,将预充的10倍费用移动到一个特殊的“费用”地址(该地址为每次取款生成,并且仅用一次)。我们把这个输出称为“CPFP link”。
  3. 一旦在密钥恢复仪式结束以及广播前签署了主交易,费用将根据当前网络条件重新估算。
  4. 费用地址会生成一笔子交易,它会花费CPFP link输出,支付两笔交易的费用,并将剩余的预充费用发送回加油站。

举例说明

Eniiuym.png!web

让我们通过一个具体的例子来更好地理解这个解决方案的机制。请注意,为了简单起见,这里省略了一些小细节。

假设我们有一个客户,他账户里的余额是15 BTC,然后他想从Custody账户中提取12 BTC到一个外部比特币地址。以下是将要发生的步骤(请注意,聪是比特币中最小的单位,它等于0.00000001 BTC):

  1. Custody估计完成这笔交易的费用为10000聪;
  2. 加油站将10倍估算费用的10万聪发送到冷钱包地址(存放待提取资金的地址);
  3. Custody生成的取款交易有两个主要输出:12 BTC到目的地地址,3 BTC“找零”返回冷钱包;
  4. 我们添加了第三个“CPFP-link”输出,将10万聪移动到新生成的费用地址(这笔金额稍后将用于支付费用);
  5. “密钥恢复”仪式开始。其结果是,一个已签名的交易有效载荷准备好向网络广播;
  6. 就在广播之前,我们再次估算下费用,事实证明,网络突然变得拥挤,现在的费用是最初估算费用的2倍(即2万聪);
  7. 我们创建一笔子交易,该交易花费“CPFP link”输出,支付2万聪费用,并将剩余的8万聪返回到加油站;
  8. 我们把这两笔交易广播到网络;

在这之后,目的地地址会接收到完整的12 BTC金额。而从用户的角度来看,费用和子交易都是不存在的,它们被抽象了出来,由此实现了可靠的零费用比特币取款。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK