Oddbean new post about | logout
 #eltoo 之前没看懂 eltoo 是怎么交互的,跟当前方式的通道有什么区别,晚上又重新仔细看了这篇[博文](https://medium.com/@brandonarvanaghi/breaking-down-the-bitcoin-lightning-network-eltoo-c48554f5ae02)。大致过程如下。

A 和 B 建立双向流量通道,和当前方式一样,在构建充值交易 F 之前,先商量构建保底的让双方都不被骗的结算交易 S0。典型的充值交易 F 两个 input(双方分别注资,)1 个 output。这个 output 有两种花费方式:1. 被**两方结算密钥多签**花掉,这就是结算交易 S0,但结算交易上链有 10 个高度的时间锁;2. 被**两方更新密钥多签**花掉。

发生支付行为后,比如 A 向 B 支付。商量构建新的结算交易 S1,但它花的不是充值交易 F,而是另一个等待商量着构建的交易,也就是更新交易 U1,它的 input 用方式 2 花掉 F 的 output, 它自己的 output 的形式和充值交易 F 一样,同样两种方式可花掉它。

也就是初始状态 S0 花 F,支付一次,构建S1 花 U1,U1 花 F,再支付一次,构建 S2 花 U2,U2 花 U1。

关闭通道,只需要 F、最后的 U、最后的 S 这 3 个交易上链。

Q&A:

Q1. U1 花 F,U2 花 U1,U3 花 U2,为什么中间的 U 不用上链,直接上链最后一个 U 而它就能直接花掉 F?

A:基于 SIGHASH_NOINPUT 这种新的 SigHashType,在 U 的 input 里生成签名时,跟它要花的 UTXO 无关,只用它自己的 ouput 计算哈希(input 不参与),这样最后一个 U 要上链时,input 的签名(这是个两方更新密钥多签)不用变,就可以把 input 改一下变成指向 F 的 output。

Q2. 那最后的 U 上链要更换了 input,它的 tx hash 变了,对应要花它的 S 的 input 指向的 tx hash 就对不上了?

A:S 也要使用 SIGHASH_NOINPUT,它的 input 也要变,重新指向这个新替换的 U 的 tx hash,input 里的签名(这是两方结算密钥多签)不用变。

Q3:如果任意一套 U 和 S 都可以花掉 F,那坏人用中间一套 U 和 S 上链怎么办?

A:这时另一方需要观察到这个恶意 U 上链(恶意 S 上不了链,因为 U 有 10 个高度的时间锁),然后更改他自己保存的最终的 U 的 input,去上链花掉这个恶意的 U,然后等自己的 S 上链。U 只能是后构造可以花掉先前构造的(不可以反过来,否则坏人会继续用中间的 U 上链),因为 F 和 U 的 output 用方式 2 花费时,带有自己的序列号(作为 UTXO 级别的绝对时间锁),同时将交易的高度锁 nLockTime 字段设置成这个序列号数值。这样后序列的 U 可以花前面的 U,因为它的 nLocktime 满足 UTXO 时间锁条件,但反过来就不满足。

Q4:那即使坏人不能继续用中间的 U 上链搞破坏,但好人的 S 在等待 10 个高度准备上链,坏人拿中间的 S(也更改 input 重新指向已经上链的最后的 U)也准备上链,两个 S 看运气上链?

A:每次重新商量构建结算交易 S 时,双方都要**更换结算密钥**,这样每个 S 只能花对应的 U。中间状态的 S 留着是没有用的,因为它对应的 U 上链就会进入 Q3 情形,是没有好处的。

总结:和当前方式一样,eltoo 也需要 watchtower,及时发现中间的 U 是否恶意上链(似乎只需要记住这一串 U 的 tx hash,而在当前方式下,还需要保存对应的揭秘密钥去实施惩罚,这样 eltoo 的通道状态备份更简单一点)。当前方式这样做,被发现会面临经济惩罚,但 eltoo 做了只相当于在捣乱,可以即使纠正,但也没有惩罚(最大损失仅可能是手续费,而且这个 U 的手续费扣的还可能是另一方的)。eltoo 的 F 从一开始似乎不用上链,这样构建通道不用等待链上确认,但关闭通道需要 3 个交易,当前方式下开通再结算只需要 2 个交易。eltoo 在双向流量通道上似乎并没有特殊的,当前通道在构建时,理论上双方愿意的话也可以每人提供一个 input,跟 eltoo 一样一开始就有双向流量。
 
 按理说 F 一样要先上链,否则注资的 input 指向双方各自的 UTXO 可能会失效。