科普| 理解閃電網絡,Part-1:構建比特幣的雙向支付通道
網絡
在上一篇文章中,Alice 和Bob 建立了一個雙向的支付通道。現在,Alice 想要給一個第三方Carol 支付1 btc。
一般來說,Alice 和Carol 需要在彼此之間開設一個支付通道。但實際上並不需要。因為Bob 和Carol 之間已經有了一個通道,所以Alice 可以通過Bob 給Carol 支付。
具體來說,Alice 可以給Bob 支付1 btc,而Bob 再支付1 btc 給Carol。
但是,Alice 實際上並不信任Bob,或者Carol 並不信任Bob。她擔心把錢給Bob 之後,Bob 不會給Carol;又或者,他把錢給了Carol,但Carol 謊稱自己壓根沒見到錢,而Alice 也不知道該找哪個來追責。
因此,Alice 希望能保證,僅當Bob 給了Carol 1 btc,自己才需要給Bob 支付1 btc。
當Alice 要給Carol 支付1 btc 時,她讓Carol 先生成一個秘密值(一個隨機的數字串)並把對應的哈希值發給她。 Alice 也告訴Carol 可以用這個秘密值跟Bob 交換1 btc。
與此同時,Alice 把從Carol 處得到的哈希值發給Bob,並告訴Bob 如果Bob 能提供對應於這個哈希值的原始值,她就會給Bob 1 btc(這個原始值當然只有Carol 擁有)。
所以Bob 找到Carol,用1 btc 換來了Carol 的初始值。
然後,Bob 找回Alice,提供這個初始值。 Alice 因此知道了Bob 一定給過錢了,也就是Carol 肯定已經收到了1 btc,於是就把錢給了Bob。
皆大歡喜。
幾乎,啊,幾乎是皆大歡喜。
在這種“過家家” 的情形下,中間人Bob 還是需要新人Alice 和Carol。 Bob 必須相信Carol 給他的是一個真正有用的值(不然錢都給了就拿不回來了),而且要相信Alice 真的會給他1 btc,假如他能提供對應於哈希值的原像的話。
這時候,我們就需要哈希時間鎖合約(HTLC)啦!
哈希時間鎖合約
哈希時間鎖可以讓Alice 和Bob 用秘密值來交換btc(當然Bob 和Carol 也需要這個,但我們先按下不提)。
為了使用哈希時間鎖,Alice 要將1 btc 發送至一個新的多簽地址,而非直接發送給Bob。這個地址中鎖定的btc 可以通過兩種方式解鎖。
第一種方式是Bob 將自己的簽名和秘密值一起發送至該地址。
第二種方式是Alice 將自己的簽名發送至該地址。但是,這個方式存在 CLTV 時間鎖限制:Alice 必須等待一段時間(例如兩週)才能簽署並廣播交易取走這個btc。
也就是說,Bob 有兩週時間來創建一個包含簽名和秘密值的交易,並廣播該交易,將多簽地址上的btc 發送給自己。這樣一來,這筆交易就有了保證。只要Bob 能提供秘密值,他就能取走Alice 的btc:在比特幣網絡公開廣播該交易可以讓Alice 看到它。
如果Bob 沒有在規定時限內提供秘密值,Alice 就可以取回她的btc。就這麼簡單。
再說回網絡,因為這是哈希時間鎖合約真正發揮作用的地方。
如上文所述,不僅Alice 和Bob 之間有哈希時間鎖合約,Bob 和Carol 之間也有。因此,如果Carol 向Bob 索要btc,Bob 也可以從Carol 那裡取得秘密值。這些在區塊鏈上都是可見的。
因此,如果發生這種情況,Bob 也一定可以從Alice 那裡拿到1 btc。 Bob 可以將從Carol 那裡拿到的秘密值在鏈上公開,發送至他與Alice 的哈希時間鎖合約,然後取走多簽地址上的1 btc。這兩個狀態通道有效地關聯了起來。
最後要強調的一點是,Bob 必須在有效期內從Carol 那裡拿到秘密值,否則Alice 就有可能取回多簽地址上的1 btc。如果等Alice 取回1 btc 之後Bob 才從Carol 那裡拿到了秘密值,Bob 就會被卡在中間進退兩難。因此,Bob 和Carol 的哈希時間鎖合約必須比Alice 和Bob 的先到期(例如,前者的時限可以設成10 天,而非兩週)。這就是為什麼哈希時間鎖合約需要CheckLockTimeVerify(絕對時間鎖)而非CheckSequenceVerify(相對時間鎖)。
最後還有一個問題需要解決:要保證閃電網絡的可用性,所有這些必須在鏈下完成。具體是如何實現的將在本系列第三篇文章中揭曉。