区块链/等级 IV · 深入协议/4.1 Script/课程 5
哈希锁与HTLC
解开一切谜团的秘密,以及防止其永远丢失的计时器
材料任何支持 SHA-256 的文本编辑器或命令行区块浏览器(例如:mempool.space)Poon与Dryja撰写的闪电网络白皮书
好奇
- 如何让一笔付款与只有某个人知晓的秘密绑定,同时又不需该人信任其他人?
- 如果为了领取自己的钱而揭示秘密会将其暴露给整个网络,那么什么能阻止别人抢先偷走它?
- 为什么多节点支付路径中的每一跳都需要略有不同的截止时间?
探索
- 哈希锁是一种比特币脚本条件,它在特定数据(即原像)被揭示之前限制花费。币被锁在一个哈希值之后,该哈希通常由持有秘密的人提供。这里的关键特性在于:一旦任何参与者为领取资金而揭示原像,所有看到这次领取的人都会得知它——在链上是所有人;在闪电网络通道内则是交易对手。
- 这种公开揭示使持有由同一哈希锁定的输出的其他各方也能花费这些输出。在闪电网络中,这意味着当最终收款人(查理)揭示秘密以领取鲍勃的付款时,同一个秘密也会解开爱丽丝为鲍勃锁定的输出。这一机制实现了原子性:要么所有人都拿到钱,要么所有人都拿不到。
- 然而,纯粹的哈希锁有一个缺陷:如果查理消失且始终不揭示原像,资金就会被永久卡住。加入时间锁后,就形成了哈希时间锁合约(HTLC)。对于鲍勃提供的最后一跳,脚本现在规定:“查理可以在截止时间 T 之前揭示原像来领取这些币,或者鲍勃可以在 T 之后取回它们。”
- 这种双路径逻辑确保了无需信任的运作。如果支付成功,查理会在超时窗口内揭示秘密,触发从鲍勃一路回到爱丽丝的连锁领取。如果支付失败或查理离线,每个 HTLC 都会超时,其提供方(向查理提供 HTLC 的鲍勃、向鲍勃提供 HTLC 的爱丽丝)将通过脚本的超时分支取回资金。
- 正是这种公平协议使多跳路由成为可能。路径中每个 HTLC 的超时时间,都比其持有者向下游下一个节点提供的 HTLC 稍长。这一时间差保护了每个中间节点:如果下游对等节点在最后一刻用原像领取了款项,中间节点仍有时间在自己收到的 HTLC 可被退款之前,向上游使用该原像。
- 虽然脚本谜题可以很复杂,但像 HTLC 这样的实际合约总是在哈希锁和时间锁之外同时包含签名检查。这将解锁方案与特定参与方绑定,并防止矿工抢跑(front-running),即矿工在内存池中看到有效的原像后,在交易确认前将款项转给自己。
关键事实
- 哈希锁会限制花费,直到特定的一段数据(原像)被公开揭示。
- 一旦使用某个特定哈希的任何一个哈希锁被打开,被揭示的原像就能让使用同一哈希的所有其他哈希锁也被花费。
- HTLC 结合了哈希锁和时间锁,要求接收方在截止时间前完成花费,否则允许发送方取回退款。
- HTLC被用于闪电网络的承诺交易中,以实现具有原子性的无信任多跳路由。
- 脚本为哈希锁提供了 OP_SHA256 和 OP_HASH160;闪电网络使用 SHA-256 支付哈希。
- 2013年,Tier Nolan 提出了利用这种哈希锁机制实现跨链原子交换。
练习 九、六、三、一
9收集列举9个现实世界或密码学场景,在这些场景中,某个操作会暴露出一个秘密,而这个秘密又能用来解锁其他多个操作(例如打开保险箱、发布工作量证明)。
6归类根据秘密的保护方式将这9个场景分为6类:单一所有者、多个所有者、有时间限制、有空间限制、公开但代价高昂,或不可逆。
3提炼将这6类归纳为3种核心机制,使互不相识的各方能够无需信任地进行协作。
1凝结写1句话,说明为何哈希是一种承诺、原像是一把钥匙,以及计时器如何让它们变得安全。
事实核查
日期、数字及数据均依据下方列出的已发表资料进行核实。