作者:Kevin Loaec

来源:https://btctranscripts.com/advancing-bitcoin/2023/timelock-enabled-safety-and-recovery-use-cases-for-bitcoin-users/

本文为 Kevin Loaec 在 Advancing Bitcoin 2023 大会上的演讲,由参与 BTC transcript Review 项目的 pgsdesign 将录音转写成文字稿。

开场

我的演讲围绕比特币中的时间锁。我会先非常简略地介绍一下比特币中的不同类型的时间锁。此外,我们还会非常简略地讲讲我们今天在比特币中使用时间锁的理由。然后,是过去几个月间发生的非常令人激动的新东西,它会完全改变我们使用时间锁的用法。最后,我希望我能说服你:在未来的比特币上,时间锁会无处不在。这就是我的演讲的大纲。

快速回顾

首先,我们快速回顾一下时间锁的历史。我想,你们中的大部分人应该都已经听过它了,所以我只准备快速回顾一下它是什么、它是如何工作的。

最早在比特币上使用的一种时间锁是 nLocktime。它工作的方式使之得名 “绝对时间锁”。从一开始,比特币交易就有这个 nLocktime 字段,而你在这个字段中填入的数值将是你的交易可以开始在网络中传播的最小区块高度。这曾经只是一项转发策略,而不是一个共识规则,因此,并不是非常智能。这就意味着,你可以用交易来阻止你自己花费某一笔资金,或者说,要到某个时间点,你的花费才能添加到区块链上。但如果一个矿工提前得到了它,那依然能提前让它进入区块链。这也是为什么,人们很快改变了它,使之成为一个共识规则。所以现在,如果一个区块包含了一笔交易、其 nLocktime 字段的数值是大于该区块的高度的,那么这就是一个无效的区块。

这很酷,但是还不够,因为这是交易层面的,意思是,只要你拥有私钥,你依然可以签名另一笔交易、不使用这个时间锁。所以,你可以绕过你自己,或者说,从交易中移除时间锁。

有趣的地方在于,在你想要强制执行一些条件时,比特币脚本就能派上用场。你可以用一个操作码来执行。这就是 CLTV,CheckLockTimeVerify 。当你在自己的脚本中加入这个操作码时,基本上,它会强制要求花费这个 UTXO 的交易的 nLocktime 字段的数值大于等于你在脚本中设定的数值。这就意味着 —— 在收款时,我会给你一个比特币地址,你大概不会知道它对应的脚本是什么,而我创建的脚本中可能包含了一个 OP_CLTV,这将阻止我在一定的区块高度(比如 80 0000)之前花费你给我的资金。我们现在还没到 80 0000 区块高度,对吧?这就是说,在你给我支付的时候,我是不能立即花费这笔钱的,要等到区块高度达到 80 0000 之后才行。

我们也有一些稍微不同的机制(或者说专门添加了这样的机制),以允许使用实际时间而非区块高度,因为,这对于某一些应用场景或者某一些人群来说更为实用。所以,具体取决于你在 nLocktime 字段中填入的数值,它可以被解释日历上的一个日期。这是用 Unix 时间来表达的。因此,你不是非得设置区块高度,你可以单纯设置成:这些资金在 2130 年之前是无法动用的。当然,实际上,你不会设置这么大的数值。所以,就假设是 2030 吧,你会把自己的资金一直锁定,到 2030 年。

相对时间锁

然后,我们加入了相对时间锁。CLTV 大概是 2015 年加入的,而 2016 年加入了等价的相对时间锁。相对时间锁不会设置一个具体的时间点或者区块高度,而是从一个 UTXO 被创建的时间点开始计时。也就是说,当你的收款交易得到区块确认的时候,它就开始计时。你可以设置区块的数量 —— 必须经过多少区块,这个输出才能被花费。也有等价的时间形式。以 512 秒为一个单位,你可以用递增的数值来设置你的资金需要经过多少秒(而不是多少个区块)才能花费。这就是 CLTV 的对等操作码,叫做 CSV。CSV 同样只是一个操作码,用来强制执行交易层面的相对时间锁。只是从技术上来说,有一点点不同。nLocktime 是交易层面的,而(用于表达相对时间锁的) sequence 是输入层面的。这不是很重要。而且 sequence 字段也被用来做别的事情。我们不会在这里全面讲解。你只要知道就行。我们在这里只讲关于时间锁的部分。

关于时间锁的 FUD

好了,这就是非常、非常简单的介绍。你可能已经听过这些东西了。我猜我这里的数字都是对的,但我也不是非常确定。如果我哪里说错了,不要客气,请纠正我。不过我觉得我应该不会差得太远。

不过,的确有一些关于时间锁的 FUD(害怕、犹豫和怀疑)。我的意思是,一直都有这样一种 FUD:你不该使用时间锁,因为你会让自己的钱永远锁死。没错,事实上确实是可以做到的,如果你做了非常愚蠢的事情的话,但总会有一些相对安全的用法,对不对?假设你实使用 OP_CSV,你可以锁定自己的资金的时间是有一个上限的。如果你以区块数量为单位,那么大概是一年多的时间,455 天。如果你用秒数为单位,那么最长只能锁定 388 天。所以,如果你使用的是 CSV ,即使你犯了非常严重的错误,也没什么大问题。比起你使用 nLocktime、让自己的钱锁定 9500 年以上,那是好得多了。在你做这些事的时候,你可能并不清楚它的后果,但你知道了,就没问题了。我的意思是,用什么方式来触发它并不重要,它总是有限制的。如果是 5 亿及以上的数值,它会被解释成 Unix 时间;而如果是小于 5 亿的数值,则会解释成区块数量。这就是为什么绝对时间锁可以如此之长,因为我们还接近 5 亿的区块高度。而在 sequence 中,会稍微复杂一些。因为不同的比特有不同的含义。如果设置了比特 22,那么时间锁的长度就是这个数值乘以 512 秒。如果没有设置这个比特,那么数值就会被解释成区块的数量。实际时间长度差不多,但你也知道,512 秒并不等于 10 分钟。

为什么要使用时间锁

那么,它有什么用呢?现在我们都把时间锁用在什么地方?用得并不多。我的意思,大概率你不会在你个人的资金保管上使用时间锁。确实有一些应用场景,但非常少。人们可能想要使用时间锁的一个理由是想阻止自己花钱。为什么要阻止自己花钱呢?

应用场景

我不知道。也许你有点强迫症,只想长时间守住你的钱。因此你要自己创建一个地址,对吧?(你当然要自己动手,没有人能强迫你使用时间锁)。因此你创建一个地址,可以保证你存入其中的钱在 10 年内无法移动。这就是一种强制储蓄策略。只要你想,你是可以做到的。这在德国很有用,现在在葡萄牙也一样,税法的要求是如果你存币时间超过一年,就不用收资本利得税;但如果你在一年内转手,你就要支付资本利得税。那么,与其一笔笔记录你买入和卖出的比特币,为什么不直接创建能够阻止你在一年内花费的地址呢,对吧。这样一来,你就知道,你永远不必为自己的比特币纳税。这可能是一种应用场景。

现在真正使用时间锁的地方基本上是多方合约的逃生舱(escape hatch)。还有一些用法是,比如说,来自 Blockstream 的 Green 钱包。在你使用 Green 钱包的时候,你可以使用 Blockstream,或者说,将他们当成双因子中的第二个。这样一来,基本上,你发起的每一笔交易都是得到 Blockstream 的联合签名的。当然,如果他们的服务器离线了、宕机了或他们弄丢私钥了,你也不希望自己的钱被永远锁定。所以它带有一个时间锁。你不会注意到它。但它可以帮助你在一段时间后独自花费你的资金。我感觉 Green 钱包应该一直是这样的。

然后,还有更高级的东西。比如你可能听说过的,我们开发的 Revolt。Revolt 基本上就是加入时间锁,或者说与时间锁和预先签名的交易玩耍,从而能够在比特币交易上强制执行花费策略。这在一些,比如说,多方参与的场景中是有用的。比如说,你是一个团体的医院,你想要委托一些资金给其他人,让他们可以发起支付。你希望确保他们一天之内无法花费超过 10 K 的资金。你可以运用比特币上的智能合约,使用时间锁和预先签名的交易,来强制执行这种构造。如果你感兴趣的话,看看 Revolt。

闪电网络也使用时间锁。它使用时间锁来保证你可以从你的通道(多方合约)中退出。如果你的通道对手消失了,你也不希望你的资金被永远算定。所以你们可以使用一笔带有时间锁的逃生交易。时间锁也用于惩罚尝试偷窃你的钱的通道对手。如果你的通道对手尝试用一个旧的状态来关闭通道,时间锁制造了一个时间窗口,允许你先一步惩罚 TA 并拿走你们通道中的资金。这是今天就在用的东西,但非常专门,对吧?

所以,时间锁在普通用户这里并不常用。但是,未来会改变的!…… 我的意思是,现在没有得到广泛使用,主要是由于缺乏工具。

工具

我们没有真正好用的工具。比特币上出现时间锁已经 14 年了。但问题在于,它依然要使用高度定制化的脚本,而大家的想法都是,在制作你的个人比特币钱包时,你不该使用定制化的脚本。你可能会弄丢资金,因为你的钱包软件和其它钱包软件不兼容、因为硬件签名器无法处理你的脚本、等等,对吧?这就是为什么没有人真正探索过如何在日常使用的钱包中使用时间锁。

但是最近,我指的是过去几个月里,输出描述符,以及(具体来说) Miniscript,已经彻底改变了这一切。现在,即使使用复杂的比特币脚本(包括时间锁),我们也可以实现钱包之间的兼容了。Bitcoin Core 也已经在上个 11 月为观察钱包(watch-only)添加了 Miniscript 支持;而且刚刚合并了用于签名的代码。这就意味着,你可以使用 Miniscript,向 Bitcoin Core 导入一个带有时间锁的输出描述符,而且如果这些描述符名下有资金,你是可以花费它的,这非常酷。还有一些代码库可以完成同样的事情:BDK,还有 Rust Miniscript,它们都已经推出了可用的版本,所以你可以试用一下。你可以用它们开发出一款钱包软件,并不需要从头开发所有东西。而且这就不再需要手写比特币脚本了。而且,我们已经有了可以持处理 Miniscript 的签名设备;这是最后一块拼图。

Salvatore 可能在房间里,也可能不在 : ) 我没去听他上午的演讲,可能他也跳过了我的。基本上,Ledger 已经在他们的 Bitcoin app 里支持了 Miniscript。所以,如果你有 Ledger,而且更新了软件,你就拥有了能支持 Miniscript 的 app。它可以理解脚本,也可以使用相同的脚本生成找零地址。它还可以签名交易。非常酷。另一款现在可以处理 Miniscript 的硬件签名器是 Spectre DIY。今年会有更多的硬件钱包集成 Miniscript。非常非常让人兴奋,我也真的相信我们可以改变这个局面。

然后是软件钱包。我们开始看到一些钱包支持 Miniscript。我提到了 Bitcoin Core。然后是我们正在开发的 Liana 钱包。我认为 Sparrow 也能处理 Miniscript,虽然它并没有时间锁功能,但可以理解脚本,也能花费。还有一款钱包叫做 MyCitadel。所以支持 Miniscript 的钱包还真不少,它们之间都是兼容的。这也是非常棒的事情。(有了 Miniscript,)我们讨论的就不是定制化的脚本了。你可以在其中一款钱包上生成钱包,然后导入到其它钱包中花费。这是大变局。所有这些都发生在过去几个月里。

安全性

接下来是我的演讲的主体。我准备谈谈更安全的自主保管(safer self-custody)。许多人都谈过自主保管。人们的想法要么是:这实在是太简单了,每个人都能在纸上写下 12 或者 24 个词;要么是另一个极端:人们没法做到安全的自主保管,一定会弄丢自己的钱的。这两者我都不信。我的想法在两者的中间:自主保管既不只是在纸上写下 12 个词,你还要安全地保管这张纸(所以不是那么简单);但也不是不可克服的难,所以解决方案不该是把你所有的钱都交给 Coinbase。

主要路径

但现在我们可以使用一些很酷的东西了。我准备跟你一起探究一下,或者,至少,给你一些基本的概念:我们可以用这些工作开发出什么样的东西。我们不会讨论构造的细节,比如手动构造交易或其它复杂的东西。我们就讲,比如说,图形用户界面、钱包兼容性、跟 Bitcoin Core 的兼容性,这些。这些是你现在就可以用到的,对吧?我只是尝试让你想象一下,我们现在可以用时间锁做什么样的事。

其中一个我们可以想象的事情是,现在,我们可以制作一种你不需要备份其中一部分(我称为 “主要路径”)(它是不带有时间锁的日常密钥)的钱包。它的日常使用体验跟常规的单公钥钱包没有区别。但它有一个时间锁,比如说是一年的。那么,在一年之后,你的第二个密钥就可以独自花费这笔资金。所以,你不用备份主要路径中的密钥(“主要密钥”)的 12 字词,你要备份的是需要时间锁解锁后才能使用的第二个密钥。为什么要这样做呢?说实在的,理由还真不少。其中一个理由是,人们天生不擅长好好保管东西。你要把自己的 12 词种子词或者 24 词种子词放在哪里呢?不是真的要问你们哈。只是说,你的保管位置可能不是非常安全。其他人是否知道它在那里?其他人能不能拿到它?也许有时候你会离开它、不能亲自看着它(比如来参加大会),对吧?也许有的人就等这个时候动手。要是他们找到了你的种子词,你就完蛋了。你会丢失自己所有的钱。但现在,你有了一种对抗这种风险的办法。要是别人拿到了你记录种子词的纸,他们也花不了你的钱,除非你一直不移动你的钱、长达一年。有趣的地方就在这里,你可以使用 “防拆包(tamper evident bag)” 这样的基本工具(来保存你的种子词)。只要你经常检查,比如说,参加完大会后你回到家里,看看有没有人打开过你的防拆包,你就知道自己的资金安不安全。只要防拆包没有人打开过,你的钱就是安全的。这非常酷。这跟你单单保存种子词在某个地方、祈祷没有人发现它们完全不一样。这是非常基本的用法。我认为这应该从现在开始成为每一款钱包的默认配置。当然,也不是不能备份主要路径。我在这里只是过分了一点。你可以为主要路径制作一个非常非常安全的备份。比如说非常难以发现、非常安全的备份,但你也有更容易访问的、带有时间锁的路径,以备不时之需。对我来说,这是一种非常好的选择,也可能是未来每一种钱包都会提供的默认选项。

你还可以尝试更奇怪的东西。比如,OpenDime 这样的默认不保存私钥的东西。OpenDime 是有意设计成这样的。它就像一个小的设备一样,把钱放进去之后,花费这些钱的唯一方式就是摧毁这个设备。它可以签名一笔交易,或者把私钥给你,就这样。它是一次性的。要是这个设备坏掉了,你的钱就丢了,没有任何办法能复原。所以,你需要完全信任这个设备,在你转移其中的钱之前不会损坏。你完全能够想象一个在(比如说)10 年后,一个 OpenDime 的芯片坏掉的时候,你有一个退出通道,对吧?但你也假设,在这 10 年中,就会有人使用它,所以这并不会创建一种在 OpenDime 之外抽取你的资金的办法。这就像一种复原办法。你也可以看看 HSM(硬件签名模块),它就是一个能够签名交易的机器,你也不能备份这个 HSM 中的私钥,这就是它的设计目的。它被假设会充当一个飞地,是外部不可访问的,对吧?那么,(有了时间锁)你可以设置一个退出通道,在你的 HSM 坏掉或者拒绝签名等等情况下,起作用。在 HSM 无法操作的很长时间之后,你可以用另一种途径来花费资金或者复原资金。

你也可以再次尝试以前的事物,比如 “脑钱包”。脑钱包指的是你单纯把种子词背下来而不留其它备份形式。你不应该这样做(而应该留下备份),因为这会导致你的资金控制权完全依赖于你的记忆。如果你忘记了,钱就完全丢了。但以后就不必有这个担心了,因为现在你可以使用脑钱包,但在你真的忘记了它的时候,你知道还有一个办法可以在几年之后复原你的资金。所以非常酷。使用口令来保护的钱包也是一样的道理。如果你的种子词之上还有一套口令,而你没有备份这个口令,那么你是有风险忘掉它的。那么,为什么你不设置一个在很长时间后可以启用的退出通道,来应对你真的忘记事情的风险呢?

(译者注:此处的 “脑钱包” 的含义是 “单凭人脑来记忆种子词,不留其它形式的备份”;但也有人在另一种含义上使用 “脑钱包” 的概念:“凭借人脑(以及其它工具)来生成熵,进而生成种子词(私钥)”。前者更多是指备份(记忆)种子词的形式,而后者指的是生成种子词的方法。两者不应混淆。)

社交恢复

接下来是另一个想法。你可能才刚刚从单签名钱包换成多签名钱包,但一些人已经讨论了钱包的 “社交恢复” 很久了。我不是很喜欢这个想法,但我可以聊一聊。社交恢复的意思是,假设我把事情搞砸了,我弄丢了自己的私钥,我可以请我的一些朋友来帮我复原我的钱包。他们可能彼此互不认识,但只要我能找到足够多的朋友(或者说找到足够多的密钥),我就可以复原我的资金。现在,在你要这样做的时候,你会面临一种风险:他们认识彼此,因此可以串谋欺骗你、偷走你的钱。而有了时间锁,他们就没法这样做了。只要你没有弄丢你的密钥,你就知道他们绝没有可能串通。所以你晚上睡觉也能安稳。你不用成天疑心,他们真的是我的朋友吗?你可以不必担心。

这也可以是一种服务,不必由你的朋友来提供。你可以获得多个不同公司的服务(如果这样的市场会出现的话)。这也一样,你不用担心,老天爷,FBI 会不会给他们施压、没收我的钱?他们可以叫齐所有的公司并强迫这些公司一起签名。不会的,因为根本做不到,除非时间锁过期。这也减轻了第三方的风险,因为现在第三方不会受到威胁了 —— 威胁他们也没法花费你的千克。这是非常大的不同。在你把一个密钥交给别人的时候,他们就有了保证这个密钥安全的责任,这是有成本的。如果某人在一把密钥里放了 100 万美元甚至 10 亿美元,然后把这个密钥分享给别人,那得到这个密钥的人也会成为目标。所以有一个时间锁也可以降低这个第三方的风险。

递减的多签名

你可能也听过 “递减的多签名”。这个概念是说,你可以设置一个非常严格的多签名装置,而不是一个阈值多签名装置。比如说你设置一个 3-of-3 的多签名;然后,在很长时间之后,将可以使用 2-of-3 多签名,从而可以应对丢失一个密钥的情形。那么,为什么不再设置一个更长的时间锁,然后启用 1-of-3 多签名呢?所以,你可以看出,这里不止一个时间锁。你可以想设置多少个,就设置多少个。你可以设置一种时间锁,每过两种就改变条件。这非常酷。而且,这也不再是一种定制化的脚本,也只是你定义自己的花费条件而已。你可以将它导入 Bitcoin Core,也可以导入别的软件钱包,都是一样的。

你还可以尝试一种 稍微不同的东西,就是每隔一段时间就添加额外的密钥。假设你出于某些理由,不想降低阈值,那你可以设置在一段时间之后就可以使用额外的一个密钥。这个密钥可以是律师的,对吧?也许你会添加放在公司的保险柜里的一个密钥。但这些密钥在时间锁过期之前都是无法使用的。所以其安全模型就跟单纯的 3-of-5 不一样:它在一开始是一个 3-of-3 的多签名装置;如果出了问题,就会变成 3-of-4 的多签名;如果还没转移资金,就会变成一个 3-of-5 的多签名。

而且,你还可以从第三方那里获得逃生舱。今天已经有这样的产品了,像 Casa、Unchained、BitGo 这样的公司,都推出了这样的产品。许多公司都提供这样的付费的联合签名服务。在你想花费自己的资金的时候,他们会代替你执行花费策略。但与此同时,他们不想承担这样的风险,或者说你不想承担这样的风险 —— 如果他们消失,或者把事情搞砸,你的钱就全都丢了。现在,应对这种风险的方式是 2-of-3 多签名,你自己保管两个密钥,其中一个是非常安全的备份,你假定自己永远不会使用它;假设联合签名服务商真的出了问题,你也可以放心,因为你还拥有两个密钥,所以可以花费你的资金。这种技术的一个问题是,如果你不设置时间锁,那么任何知道你在使用这个服务的攻击者,只要得到了你的两个密钥,就可以绕开服务商。所以服务并不是自始至终都非用不可。如果我是一个坏人,我知道你在使用这样的服务,那我就可以威胁你,我知道你有两个密钥,虽然我不知道它们在哪儿,但我知道你一定有,我用不着去攻击服务商,因为不是一定要经过他们。而现在,有了时间锁,你就可以真正执行你的花费策略。你可以设置一个严格的 2-of-2 多签名,使我无法绕过签名服务商,而你自己又没有两个密钥。但如果这个签名服务商弄丢了自己的密钥,或者消失了,那么你可以等到时间锁过期,然后启用别的路径。这样的路径可以是递减的,所以你只需一个密钥就可以复原你的资金了。但这也有风险,也许你不想要这个风险,如我们所知,这是人身安全风险。也许你想添加另一个服务商的公钥。所以,我们假设你有一个 Unchained 的公钥,当 Unchained 停止响应的时候,时间锁过期后,你将可以跟 Casa 一起签名。如果 Casa 也不在线,那么,再过一段时间,你可以跟另一个服务商一起签名,等等。所以,你可以制作出可以退出的服务,但又不让他们可以被绕过,对吧。你还跟得上吗?真棒!我希望你可以想出我现在还没想到的东西,对吧。

反向出口

反向出口是我们发现的一个非常非常酷的东西。所以,哈哈,这是一个剧透警告。我认为未来我们会尝试用这个功能来创收。这跟人们至今还在使用托管商的原因有关。人们担心自己会弄丢自己的密钥。他们不想承担自己保管密钥的责任。但每个人都知道,成为自己的托管商 —— 也就是自主保管 ——— 是非常棒的,对吧?那为什么不双管齐下呢?为什么不让人们能完全保管自己的钱呢?他们将使用自己的密钥,保管自己的钱。但是,当且仅当他们真的把事情搞砸、弄丢密钥、弄丢备份、弄丢一切的时候,他们依然有一个紧急按钮。比如说,我忘记了自己的口令,但在一个时间锁之后,资金会实质上进入托管,因此可以被你信任的人花费。谁能成为这样的你信任的人我不知道,也许是 Casa、Unchained,等等。你可以想象这个第三方并不掌控你的钱,仅在你弄丢了所有东西的时候,才能有所作为。这里的时间锁是相对时间锁。只要你还在使用你的钱包、只要你依然拥有你的密钥,他们是无法动用你的钱的,对吧?仅在你弄丢密钥时,这些服务才能生效。我想说的是,我觉得它会改变一切。我觉得它会改变跟自主保管相关的所有东西。你不必再非此即彼,要么是自主保管然后面临一些风险,要么是使用托管商、让托管商帮你承担所有风险。你可以获得两者的综合,只要你还没倒霉,你就完成控制着自己的资金。

当然,也不一定需要是第三方托管商,你可以制作类似的东西,但让你的母亲或者你的家人来帮助你。作为比特币人,你可能已经做过类似的事情。你曾经帮助他们设置硬件签名器以及所有东西,但再你的内心深处,你觉得他们一定会忘记。所以你帮他们保管了一份助记词。我非常确定,你们中间一定有不少人有这样的助记词副本,你知道自己不该多留一份,但你担心万一。那么,为什么不多给他们一些信任,或者说期望呢?你应该让他们完全保管自己的资金。他们也应该这样做,对吧?仅当他们真的忘记了,并且又过了很长时间,当他们跟你求救的时候,你知道自己还可以帮助他们。我们是能做出这样的东西的。

这是一张截图。【听众提问】是的。它可以是三个不同服务商中的任意两个,所以你不必信任任何一个第三方。它是一个可以组合的东西。【听众提问】没错,没错。你当然可以使用多签名,比如,再前一个逃生舱中。不是只能使用一方。也不必是一个第三方。可以是任何东西。这只是 Liana 钱包当前的模式的一个截图。Liana 是一个处理时间锁、Miniscript、一切、描述符的钱包。它是为时间锁而设计的。所以在你建立钱包的时候,也就是第一次打开它的时候,用户界面会有一些不同。这就是它的样子。一旦你开始使用,它就又像一个常规的钱包了。正常收款、正常花费。这时候你不必考虑时间锁。实际上,我们选择了一个非常复杂的例子。我应该先简化一下。但不管怎么说,假设我希望设置一个使用一个 HSM 的花费策略,也就是用一个机器来强制执行我设定的规则。假设我的每日花费不应超过 1000 欧元,而这个 HSM 可以强制执行这个规则。我不希望自己能绕过这个规则,因为我很懂技术,而且,也可能我想要的新电脑是 2000 欧元,因此我心痒痒;总之,我不希望自己能绕过这个 HSM。因此,我设置一个 2-of-2 多签名,总是要求这个 HSM 跟我一起签名交易。但与此同时,这个 HSM 是一个我没法备份的机器。我又不希望自己能够绕过它,但我也不能备份它,所以我需要一种办法,可以在它坏掉的时候有办法复原资金。如果发生了什么事情、我又弄丢了我的密钥,但依然可以复原我的资金,那该多好。所以,我加入了一个长达 1 年的时间锁,并将我的妈妈加入作为多签名的一个签名人。这是一个 2-of-3 的门限多签名装置。这就意味着,如果那个 HSM 坏掉了,我可以在一年之后拜访我妈妈,然后复原我的资金。又或者,如果我弄丢了自己的密钥,但 HSM 还没坏,我也可以复原我的资金。如果我死了,我妈妈可以和 HSM 一起签名交易,然后拿出我的钱。这是非常强大的,除非等待一年,否则我无法绕过这个 HSM,对吧?现在,这样的用法可以成为现实了。只需点几下鼠标,就可以建立。而它的描述符,你可以导入到 Bitcoin Core,等等。

结论

我的演讲就到这里了。我想说的是,对我来说,2023 年极大地改变了我们可以用比特币做的事,就是因为 Miniscript。没错,就是这样,点几下鼠标,你就可以获得自己的钱包的描述符,你可以将它导入任何钱包,只要它支持描述符。而硬件钱包现在也开始支持它了。所以我们的进展不错。试想一下你可以在自己的钱包里加入什么、你想要什么,因为人们可以为你开发出来。而且我们可以让比特币比起今天更加安全、更能容错。对我来说,这真是开天辟地的大事。感谢每一个人开发 Miniscript、将它集成到硬件签名器和软件库中的每一个人。

谢谢。

MC:非常棒的演讲,当你提到是否还有其他人知道你的种子词的时候,人群里响起了紧张的笑声。现在是问答时间。

问:根据你对这些时间锁的描述,假设它们不使用某种限制条款(covenant)方案或某种预先签名交易然后删除私钥的方案,你是不是需要经常轮换你的 UTXO 以重置时间锁?Liana 是否会自动为你重置?或者,它会提醒你应该定期上线检查并准备好签名的硬件签名器吗?

答:很棒的问题。问题的核心是,如何刷新时间锁?在 Liana 钱包中,我们使用 OP_CSV,所以,时间锁的起始点是一个输出得到区块确认的时间。如果你长期不移动自己的资金,那么,没错,时间锁会过期。所以你需要保证经常使用自己的钱包。这是一个 UI 问题,而不是一个脚本或者限制条款或者预签名交易的问题。我的意思是,没错,时间锁当然有可能过期。所以,因为 OP_CSV,它不应该作为你的长期储蓄钱包,因为 CSV 只能持续一年。所以你每年至少需要花费一次,以刷新你的时间锁。从 UI 的角度来说,这将成为钱包之间的一个区别因素,因为 Miniscript 允许你做一些非常奇怪的事情。而钱包,或者说开发钱包的人,没办法穷举人们可以使用 Miniscript 可以做的所有事情。所以,从技术的角度看,一款钱包只要兼容 Miniscript,就能花费你的资金。它将能理解如何构造交易并花费你的资金。但不一定能够给你展示关于这个脚本实际上做了什么的所有信息。所以,在 Liana 钱包里面,你会看到一个计时器。它会告诉你还剩多少个区块 —— 再过多少个区块,第二条路径就能动用了。每个 UTXO 都会有一个计时器,当时间锁快要过期的时候,它会告诉你,要求你轮换你的 UTXO。我们还没有自动轮换机制,但未来会有的。我认为这应该已经回答你的问题了,对吧?

MC:很好。这里有一个问题。

问:您好。之前我曾经想要在比特币钱包中实现这种时间锁。按照我的理解,我需要 —— 为了备份它,我既需要备份助记词,也需要备份这个交易的时间锁。我该如何解决这个 UX 问题呢?

答:你的意思是,你要备份什么东西,对吗?

问:是的。我希望用时间锁交易来复原我的钱包。

答:在任何比特币钱包种,你都需要两个东西。首先,你需要私钥(或者说秘密值),从而能够花费钱包中的资金。然后,你需要能够找出你能够花费多少钱,对吧?从一个 UI/UX 的角度看,我认为这是一个错误,但不管怎么说,这么长时间下来,人们主要使用的钱包类型就是单签名钱包。因为钱包只包含一个密钥,所以你只需备份一套助记词,基本上就是这样。而今天的钱包的做法是,助记词中不包含任何能让你找出自己能花多少钱的信息。这很疯狂。虽然你拥有私钥,但你也只拥有私钥;然后,猜测你能花费多少资金的工作就交给了钱包。这种办法对常规钱包是有用的,它可以暴力穷举最常用的密钥派生路径。钱包会尝试分辨:这个私钥的主人使用 SegWit 输出吗?TA 使用 Taproot 输出吗?TA 到底使用哪种地址呢?钱包会穷举,这就是它的工作方法。我认为,这是非常糟糕的。但不管怎么说,这就是为什么我们今天不需要备份很多信息 —— 因为你让钱包通过穷举来确定你能花多少钱。

但是,你应该总是有一张地图,可以标示出你的钱在哪儿,这就是我们今天说的 “描述符”(全称 “输出描述符”)的作用。基本上,如果你创建过多签名钱包,你应该已经注意到了这个东西。基本上,Miniscript 做的事情也差不多,对吧?所以,任何钱包,只要兼容 Miniscript,就能为你生成输出描述符。我没有放案例在我的幻灯片上,但如果你听了今天上午关于 Miniscript 的演讲,你应该已经看过了一些。它就是一堆字符,解释应该如何寻找你的资金。如果你创建的是多签名钱包,它就会包含关于你的多签名钱包的信息,比如第一个公钥是什么、第二个公钥是什么,等等。

所以你需要备份这两个东西。首先是助记词,然后是描述符。

问:你认为现在应该推出一种新的助记词标准吗?

答:我并不这么认为。我认为人们应该,怎么说呢,助记词本身也是一堆烂泥,但重点是让人们理解自己到底备份了什么东西。描述符表示应该如何寻找你的资金。然后你要保存秘密材料,基本上就是私钥,不管它的形式是什么样的,对吧?即使是助记词,也只是另一种可以导出的私钥形式,这不是重点。重点是:一,你要能找到自己的资金;二,你要能够签名从而花费它们。这是两个不同的东西,所以我们总是需要两种东西。这不是我现在才提出的新问题。

MC:很好。我看到台前还有一个提问。

问:我应该没忘记我要问的问题。稍等,嗯,是这样的。假设我们制作了这样一种装置,比如说我可以动用自己的比特币,然后,一年之后,其他人,比如说我妈妈,可以动用我的比特币。等等。那么,我猜测我们两个人都需要备份这个描述符。那这不就让其他人也能看到我的交易历史以及所有东西了吗?

答:没错,描述符就像标记你的资金存放地点的地图。它不是私钥这样的秘密材料,但它确实完全反映了你的一切,因为它会展示你所有的资金以及你所有的交易历史,对吧?这看起来是同一个问题。

问:密钥会轮换吗?或者说,是否你每次更换密钥,都需要改变描述符呢?

答:不不不,不需要,这就是重点。描述符描述的是你建立钱包的方法。然后,你知道,所有的地址和找零地址都在其中了,所以你不需要考虑这个问题。在你使用的时候,你不需要考虑时间锁。仅在你第一次建立钱包的时候,你才需要考虑它。在你设置好时间锁之后,就能创建自己的钱包描述符。然后你每次收取交易、发送交易,都跟现在的常规钱包是一样的。所以只有一个描述符,你保管好它就可以了。

MC:很好。那我们还能回答问题吗?看起来可以。

问:那我接着往下问。假设我的妈妈是一个联合签名人,我怎么向她隐藏呢?你现在有什么办法,能向 5 美元扳手先生隐藏这个描述符吗?因为不给出这些信息是个好事。你是否认为我们需要用每一个私钥来加密,然后把加密的描述符藏起来?

答:在 “5 美元扳手攻击”(译者注:人身威胁)中,我不认为真的有工具能帮上忙。我不认为这是一个重点。但从保存和复制这些描述符的角度看,是的,你可以加密它们。而且,一旦你使用每一个密钥来加密它,你就知道它不会丢了。因为基本上你需要至少一个密钥来花费它。所以如果你还有至少一个密钥,你就能解密那个描述符。没错,描述符可以备份在云端服务器,如果加密了,那是更好的,这样就不会有泄露信息的风险。

问:我再追问一下。所以,我猜,这在你使用这些服务商作为自己的应急备份的时候,加密描述符也是有用的。因为你不希望他们跟踪你,除非你真的要用到他们。他们应该能在恰当的时候得到描述符,但不应该提前得到。

答:是的。但你也会发现,我妈妈也差不多,我也不希望我妈妈知道我有多少比特币。

问:但她没法使用你的描述符呀。

答:这话是什么意思呢?

问:我不知道你妈妈有多了解比特币钱包 : )

答:哈哈。但基本上,我可以跟别人分享这个描述符。描述符跟秘密值不一样。我可以用我妈妈的密钥来加密。只要他们不能串谋,我妈妈就不知道我有多少钱。她只能在我死后才能动用我的钱,这非常好。

(完)