快如闪电-发现闪电网络交易

在设计信贷/借方输出之前,我们首先回顾一下本地和远程输出为何可靠的原因。

保护本地和远程输出

很明显,鲍勃(Bob)没有动力广播较旧的交易TX B01,因为他的钱在TX B02中。但是,对于爱丽丝

  • 如果Bob失踪,她可以播放TX A02退款,并在两周内花光这笔钱。
  • 如果爱丽丝广播TX A02,则鲍勃没有办法花费其本地输出,因为他没有revocation_prikey_tx_a2,后者是从alice_prikey_tx_a2和bob_prikey_tx_a2派生的。
  • 如果爱丽丝广播TX A01,则必须等两周才能花光。同时,Bob将使用alice_prikey_tx_a1和bob_prikey_tx_a1派生revocation_prikey_tx_a1,后者可以产生revocation_sig_tx_a1来解锁输出,并将所有款项作为对Alice的罚款。

因此,更新本地和远程输出是安全的。接收者不必担心发送者会作弊,发送者也不必担心接收者可能会消失(详细分析已包含在闪电般的速度中—了解闪电网络的发展情况,请检查更新通道余额部分是否需要)。

更为棘手的问题是我们如何确保信贷/借记输出?

撤销付款

假设鲍勃有一只金鹅,并同意以0.1 BTC的价格卖给爱丽丝(为什么?因为鸡肉是我们最好的朋友)。由Bob发起付款请求。过程如下,

  • 鲍勃生成一个秘密的payment_secret并将其保留给自己。
  • 鲍勃对付款机密进行哈希处理以生成一个付款机哈希并将其发送给爱丽丝。
  • 爱丽丝创建了一个新的承诺交易,其中借记输出可以在以下任何一种情况下使用-如果经过3天,爱丽丝得到了钱,或者如果鲍勃可以提供Payment_secret,鲍勃得到了钱。
  • 鲍勃创建了一个新的承诺交易,可以在相同的条件下使用信用输出。
  • Alice在TX A02中的借方输出Bob在TX B02中的借方输出,与当前Alice的借方输出相同。

    请记住,

    • 如果鲍勃在3天内提供了Payment_secret,他将得到款项。如果3天过去了,即使鲍勃提供了Payment_secret,他也不会得到这笔钱。换句话说,鲍勃拥有这笔钱的条件需要a)他知道payment_secret,并且b)他要在3天内将其透露给爱丽丝。在我们的案例中,由于Bob生成了payment_secret,因此他从一开始就知道其价值。
    • 如果3天过去了,则款项应归给Alice,条件是Bob不能在3天内提供Payment_secret。换句话说,如果鲍勃在3天之内透露了payment_secret,但他没有花光输出,那么3天过去了,爱丽丝将不拥有这笔钱。

    我知道这很困惑。由于闪电网络的原理是确保交易尽可能少地出现在比特币网络上,因此我们希望设计一种方式,使爱丽丝和鲍勃既可以保证自己的资金安全,又无需广播承诺交易并保持长期开放。对于我们而言,如果鲍勃在三天内知道了Payment_secret,则不需要他广播交易以证明该陈述。

    因此,在鲍勃运送他心爱的金鹅之前,我们需要深入了解时间锁定。

    比特币中的时间锁

    比特币中使用两种类型的时间锁,一种是绝对时间锁,另一种是相对时间锁。它们的区别很简单,例如“下午3:00与我见面”,而“在2小时内与我见面”,而相对的时间锁定则在进行交易时开始倒计时。根据时间锁的放置位置,它可以控制何时可以广播事务或可以花费其输出。在每个事务中,三个位置用于指定时间锁,

    • 在输入部分,每个输入都有一个nSequence字段,用于指定相对时间锁。
    • 在输出部分的每个输出的锁定脚本中,一个CheckLockTimeVerify(CLTV)指定一个绝对时间锁,一个CheckSequenceVerify(CSV)指定一个相对时间锁。
    • 在事务级别,nLocktime用于指定绝对时间锁。

    事务突出显示时间锁的位置。

    闪电网络在其设计中已实现nLocktime,CheckSequenceVerify和CheckLockTimeVerify。 nLocktime控制交易何时可以进入区块链。如果使用nLocktime,2140/01 / 01,12am编码的事务被编码,则直到一百多年后才能广播。 CheckSequenceVerify和CheckLockTimeVerify控制何时可以使用输出。如果放置了30天的CheckSequenceVerify,则直到30天后才能使用交易输出。如果放置了CheckLockTimeVerify和2140/01/01 12am,则除非达到2140/01/01 12am的时间,否则将无法使用输出。简而言之,nLocktime控制事务的广播时间,而CheckSequenceVerify和CheckLockTimeVerify控制输出的花费时间。

    输出中使用的时间锁

    具有撤销作用的输出(即本地和远程输出)使用相对时间锁,因为需要公开广播旧事务的行为。因此,只有在广播和挖矿旧交易时才开始倒计时。例如,如果爱丽丝(Alice)决定通过广播TX A01作弊,那么当矿工开采该交易时,她必须再等两周才能花费其输出,这使鲍勃(Bob)有时间做出反应。但是,如果使用绝对时间锁定,例如2019/12/31 23:59:59,她可以等到除夕,立即广播并花费它,而无需Bob的通知。

    记录付款的输出(即贷方和借方输出)使用了绝对时间锁定,因为这是在不广播交易的情况下对付款索取者(例如鲍勃)施加了压力。如果Bob无法在绝对时间(例如今天下午6点)之前提供Payment_secret,则Alice将保留在下午6点之后花钱的能力。如果使用了3天的相对时间锁定,则Bob不会急忙,除非他看到Alice广播了该交易,直到3天过去了,她才可以花费输出。假设他们今天上午8:00付款,爱丽丝给鲍勃10个小时来透露他的payment_secret,现在我们更新后的输出如下:

    Alice在TX A02中的借方输出Bob在TX B02中的借方输出,与当前Alice的借方输出相同。

    时间锁定可以解决上述问题,因为任何参与者都无需通过广播其交易来证明其陈述。

    安全的贷方和借方输出

    已经是下午5点了仅一小时之遥,爱丽丝就可以通过将借记输出花在TX A02上来取回款项。尽管Bob拥有payment_secret,但由于他已经将金鹅运到了Alice,因此他似乎必须广播TX B02以确保付款。有没有办法阻止爱丽丝作弊?当然可以爱丽丝的借方输出可以进一步锁定一个相对的时间锁定,例如2周,如下所示,

    爱丽丝在TX A02中的借方输出

    如果爱丽丝广播TX A02,则必须等待两个星期才能花钱。同时,一旦Bob监视了比特币网络并找出来,他将立即用他的payment_secret花费借方输出。现在轮到爱丽丝担心了。下午6点之后,如果爱丽丝广播TX A02,则带有payment_secret的Bob仍可以使用借方输出,而他只能在下午6点之前使用借方输出。有没有办法阻止鲍勃在下午6点以后花钱?

    Alice无需在借方输出中设置时间锁,而是可以在一个条件下在她希望的任何时间使用它-她必须创建一个特殊的事务来使用它,即HTLC-Timeout事务。

    爱丽丝的HTLC超时事务,其输出只能由爱丽丝使用。

    HTLC-Timeout事务使用绝对时间锁(nLocktime),如上所示,

    • 它消耗TX A02的输出,输出编号1,这是Alice的借方输出。
    • 它的nLocktime为下午6点。今天,这意味着该交易无法在下午6点之前播出。

    借方输出也已更改,

    爱丽丝在TX A02中的借方输出

    问题几乎解决了。爱丽丝要想领取钱,涉及两个步骤,

  • 她需要先广播TX A02。
  • 下午6点后,她需要广播HTLC-Timeout交易。
  • 下午6点之前,爱丽丝对广播TX A02没有兴趣,因为由于nLocktime的原因,她不能通过HTLC-Timeout交易花费其输出,而鲍勃将使用Payment_secret收取这笔钱。下午6点已经过去了,即使Bob拥有payment_secret,他也无法花费,因为借方输出已经被Alice的HTLC-Timeout交易消耗了。从本质上讲,尽管锁定脚本提供了两种可能的方案,但比特币网络确保每个交易输出只能花费一次。

    但是,TX A02和HTLC-Timeout事务是由Alice创建的,为什么她会按照指定的方案来创建锁定脚本?

    她不会这样做,并且进行了最后更改,使Bob可以按预期检查Alice创建的交易。如果爱丽丝想通过HTLC-Timeout交易花费借方输出,则需要鲍勃的批准。

    你可能还喜欢