Bupt3分享03——原子交换和哈希时间锁

Hacker Dōjo Workshop:

资助金额:120 USDT

Bounty链接:原子交换和哈希时间锁 | Bounties | DoraHacks

创作者:北邮在读硕士 Syshems

本项目由Hacker Dōjo资助,文章转载请联系

Telegram: @DoraDojo0

WeChat: @HackerDojo0

一、哈希时间锁

哈希时间锁(Hash Time Locked Contract,简称HTLC)是一种加密货币技术,用于在跨链原子交换(Atomic Swap)和闪电网络(Lightning Network)等场景中实现安全的交易。HTLC 在比特币上早已有,而在支持智能合约的区块链上就更容易实现了。关键的概念是哈希锁时间锁。

1.1 哈希锁:

哈希密钥锁,就是利用非对称加密的哈希函数,把一串输入的密文转换成 256 位固定长度的输出,并在交易脚本里设置必须输入正确密文才可以解锁交易。例如 Alice 收到了一笔 2BTC 转账,但是对方设定了哈希值锁定,所以 Alice 必须得到交易方的密文(Pre-image,原像),同时配合自己的密钥签名才能签署交易。

“哈希锁” 也称 “哈希原像检查”,也就是检查某个传入的数据的哈希值是否为某一值。

  • sha256(H),检查传入的某数据(也称 “原像”)的 sha256 哈希值是否为 H;原像应该是 64 位的 十六进制数
  • ripemd160(H),检查传入的某数据(也称 “原像”)的 ripemd160 哈希值是否为 H;原像应该是 40 位的 十六进制数

哈希锁应用场景:

  • ****资助发现哈希碰撞:****由于哈希函数的单向性,矿工只能使用暴力搜索的方法不断尝试,这就等于是在寻找一个与你手中的原像产生相同哈希值的东西,也就是在搜索哈希碰撞。
  • 原子交换 / 潜水艇互换
  • ****闪电网络:****闪电通道利用了我们已知的所有模块:多签名、时间锁、哈希锁

1.2 时间锁:

哈希时间锁,就是在交易脚本里设置时钟,必须要等待设定时间后才能私钥签名解锁地址里的比特币。例如 Alice 收到了一笔 2BTC 转账,但是对方设定了 1000 个区块之后才能解锁,所以 Alice 必须等待 1000个 区块之后才能用自己的私钥签署交易,花费其中的 BTC 转给 Bob 。

比特币系统可以实现两种时间锁:一种称为 “绝对时间锁”,在一个 “具体” 的时间点(比如某个日期或某个区块高度)后解锁;另一种称为 “相对时间锁”,在一定的时延(比如区块的数量)之后解锁,时延的起点就是该时间锁所在脚本(输出)得到确认的时间。

举个例子,绝对时间锁的意思是:“这笔钱在区块高度 350000 后才可花费”;而相对时间锁的意思是:“这笔钱在得到区块确认的 2 个区块之后才可花费”。

  • after(NUM)older(NUM),分别对应「绝对时间锁」和「相对时间锁」;
  • and(,),表示在括号里的条件都需要满足,才能花费;各条件以逗号分隔;
  • or(,),表示在括号里的条件只需满足一个,即可花费;各条件以逗号分隔。

时间锁应用场景:

  • ****个人的强制储蓄:****一旦用户的比特币资金使用这种方式锁定,就不可能在 TA 自己设定的时间点之前花费。
  • ****灾备措施/意外应对:****一些风险不能仅靠多签名(分散资金的控制权)来消除,配合时间锁可以避免资金赎回问题。
  • ****资金的社交恢复:****假如我弄丢了一把私钥,经过我的 5 个朋友中的 3 个人的帮助,我可以将资金转移到别的地方。跟 “灾备措施” 中的脚本的结构完全一样,都是 “单签名 or 时间锁 + 多签名”。这里的 “单签名” 也可以换成多签名,以减少对朋友的打扰。

1.3 工作原理:

  1. 两个参与者(通常是交易的发起者和接收者)之间达成协议,确定交易的条件和参数。
  2. 发起者生成一个随机数(preimage)并计算其哈希值(hash),这个哈希值被称为哈希锁(hash lock)。
  3. 发起者将带有哈希锁的交易信息发送给接收者。
  4. 接收者收到交易信息后,可以验证哈希锁的有效性,即通过计算哈希函数确认哈希锁的哈希值与接收者期望的哈希值是否匹配。
  5. 如果哈希锁有效,接收者可以执行交易,并生成自己的随机数和哈希锁。
  6. 接收者将包含自己随机数和哈希锁的交易信息发送给发起者。
  7. 发起者验证接收者的交易信息中的哈希锁是否有效。
  8. 一旦发起者确认接收者的交易信息有效,交易就完成,发起者可以使用接收者提供的随机数解开哈希锁,完成交易。

HTLC 通过引入时间限制,确保在一定时间内完成交易,否则交易将自动取消并回退。这种时间限制保证了交易的及时性和公平性,避免了一方恶意中止交易而不履行承诺。

总之,哈希时间锁是一种基于哈希函数和时间限制的机制,用于确保在不信任的环境下进行安全的交易。它在加密货币领域的原子交换和闪电网络等技术中起到了重要的作用。

二、原子交换

原子交换(Atomic Swap),就是去中心化(无第三方参与)下,两个人实现原子性的跨链公平交易。原子交换的思想提出很早,在 2013 年 bitcointalk 上就有人提出。它的实现条件使用了 HTLC 和博弈论思想。

  • 原子性:要么交换成功,要么失败,不会存在中间状态
  • 公平交易:换币时,我骗不了你,你也骗不了我,对双方都是公平的。

2.1 工作原理

原子交换机制依赖于哈希时间锁定合约 (HTLC),可以被理解为是一个带有“哈希锁定”(HashLock) 和“时间锁定”(TimeLock) 两项特殊保障的虚拟保险箱:

  • 哈希锁定:在交易发起方将用于解锁 HTLC 合约的密钥发给另一方之前,确保资金被锁定在合约中。
  • 时间锁定:如果交易未在指定的时间段内完成,则将交易的加密货币退还给交易者。

一旦双方都提交了合约密钥,交易就完成了。如果双方未在规定时间内提交,则交易将被取消,确保没有人蒙受损失。

2.2 案例:Alice 用 1BTC 与 Bob 交换 3ETH

Alice:

  1. 生成随机数 a 并计算 hash(a)
  2. 生成 1BTC 的比特币交易 tx1,但不先广播。tx1 的输出是分支输出:当解锁脚本满足下面某个分支时,可以花费 tx1 里的 1BTC
    1. Alice 和 Bob 的签名
    2. hash(a) 的原像(preimage)和 Bob 的签名
  3. 生成交易 tx11,该交易把 1BTC 从 tx1 转到 Alice 自己的地址里,有 48h locktime,即要前一笔交易上链后过 48h,本交易才能上链。这笔交易是为了保证在整个交换过程失败时,Alice 可以取回她的钱。
  4. 请求 Bob 对 tx11 的签名。此后,Alice 再附上自己的签名,tx11 就同时有 Alice 和 Bob 的签名。但 Alice 不能上链该交易,她需要等到 48h 的 locktime。
  5. 广播 tx1,该交易上链。

Bob:做和 Alice 相似的操作

  1. 确认 tx1 上链后,生成 3ETH 的以太坊交易 tx2,但先不广播。tx2 的输出也是分支输出:当解锁脚本满足下面某个分支时,可以花费 tx2 里的 3ETH
    1. Alice 和 Bob 的签名
    2. hash(a) 的原像和 Alice 的签名(Bob 可从已上链的 tx1 知道 hash(a))
  2. 生成交易 tx21,该交易可以在 24h locktime(一定要比 tx11 的 48h locktime 短)之后,把 3ETH 从 tx2 转回 Bob 的以太坊地址里。
  3. 请求 Alice 对 tx21 的签名
  4. 广播 tx2,该交易上链。


![原子交换里交易的上链顺序应该为:tx1->tx2->Max(tx12, tx22)。前一个交易应该等到后一个交易完全上链,才能保证整个过程的绝对安全,双方都不会损失钱。]

原子交换里交易的上链顺序应该为:tx1->tx2->Max(tx12, tx22)。前一个交易应该等到后一个交易完全上链,才能保证整个过程的绝对安全,双方都不会损失钱。

原子交换成功:

  1. Alice 确认 tx2 上链后,在 24h 内构造并广播交易 tx22:将 3ETH 从 tx2 里转到 Alice 的以太坊地址里(满足 tx2 的解锁条件2:揭露 a 和 Alice 的签名)。tx22 上链以太坊网络。
  2. Bob 从广播的 tx22 里得到 a 后,构造交易并广播 tx12:将 1BTC 从 tx1 里转到 Bob 的比特币地址里(满足 tx1 的解锁条件2:揭露 a 和 Bob 的签名)。tx12 上链比特币网络。
  3. 交易完成

原子交换失败:

  1. 若 24h 内,Alice 没有构造并广播交易 tx22。
  2. 则 24h 后,Bob 签名并广播 tx21(超过 locktime,且同时有 Alice 和 Bob 的签名),把 3ETH 转回给自己。tx21 上链以太坊网络。
  3. 48h 后,Alice 同理广播 tx11,把 1BTC 转回给自己。tx11 上链比特币网络。
  4. 交易失败,但双方都不会损失钱。

2.3 原子交换的升级版 - 潜水艇交换(Submarine Swap)

潜水艇互换可能是人们尝试闪电网络支付最简单的手段。虽然你还是要支付链上手续费,整个支付流程也很像链上支付,但收款方可以是即时到账的(跟具体的实现有关)。如果你想开一个闪电网络通道,也需要发起一笔链上交易。考虑到我们现在还在闪电网络早期,有一个易于上手的玩法是很重要的。这也是为什么我们在Muun Wallet中实现了潜水艇互换。

参考:一文了解闪电网络中的 Submarine Swap_陀螺科技

三、原子交换和跨链

3.1 Vitalik 关于跨链的思考:

1、以太坊就算遭受 51% 攻击,非法交易会被审查和回滚,保证链上原生资产(ETH、DAI)的安全,保证 L2 资产(OP、Arbitrum资产)的安全。

2、对于跨链应用来说,51% 攻击不可以恢复映射资产(solana-weth、ethereum-wsol)。跨链活动具有反网络效应:跨链应用越少越安全,跨链应用越多越存在安全风险。

3、对多链(multi-chain)保持乐观,对 cross-rollup 保持乐观,对跨链(cross-chain)保持悲观。

4、rollup 不能使用与原生资产不同的链作为数据层。

https://twitter.com/VitalikButerin/status/1479501366192132099

3.2 原子交换的缺陷:

  • 缺陷一:可以看出,不管交换成功或失败,总会有 4 个交易被上链。如果按照比特币现有的拥堵状态和高手续费,原子交换是基本行不通的,代价过高且会有损失钱的风险。
  • 缺陷二:在考虑外部市场后,会存在对手风险,原子交换是不适用的。如在上面的协议描述里,Alice 和 Bob 已经将 tx1 和 tx2 上链。则这之后,原子交换的成功与否取决于 Alice 是否要抛出 hash(a) 的原像,她有 24h 的考虑时间去决定。那在这 24 小时内,Alice 大可在对比交易所和原子交换的比率差别,如果交易所的汇率对自己有利,那就去交易所交易,抛弃原子交换。在这种情况下,Alice 除了会锁定 48h 的币,没有其他风险,风险全部转嫁给了 Bob。那么有人说,缩短 24h 和 48h 的参数设定就好了啊。但无论怎么缩短,这个风险都不能消除。且缩短锁定时间还可能带来安全风险。
  • 缺陷三:除此之外,还有一种攻击。在 tx1 和 tx2 上链后,Bob 完全封锁 Alice 的网络(由于存在点对点通信,会增加这种风险)。Alice 发出的 tx22 无法广播到网络里,但 Bob 可以截取到。Bob 因此可以得到 Hash(a) 的原像,从而上链 tx12(满足 tx1 的解锁条件2)拿到 1BTC。之后,Bob 再封锁 Alice 的网络 24 小时,他就又可以上链 tx21(满足 tx2 的解锁条件1)拿到 3ETH。那有人说,只要 Alice 迟迟发现自己发出的 tx22 不上链,那就去找个网吧重新发交易啊。Bob 总不能连人去哪都可以追踪吧。这确实是最简单的抵御方法。但也说明,原子交换需要人类来监控,在完全程序自动化的条件下完成仍存在风险。

参考:

哈希锁:https://learnblockchain.cn/article/5706

时间锁:https://learnblockchain.cn/article/5705

原子交换:什么是原子交换(Atomic Swap)? - 知乎

Vitalik 对多链和跨链的看法:https://twitter.com/VitalikButerin/status/1479501366192132099