- 哈希時間鎖定智能合約(HTLCs)
- 閃電網絡的骯臟小秘密
- 為什么 “閃電網絡骯臟的小秘密” 值得關注
- 最后的話
聲明:本文由內容合作伙伴 36 氪戰略合作區塊鏈媒體“Odaily星球日報” 授權發布,譯者 : Moni。
本文來自與 Medium,原文作者是比特幣無限(Bitcoin Unlimited)首席科學家 Peter R. RIzun
圖片來源圖蟲:已授使用
比特幣閃電網絡(Lighting Network)概念是在知名開發人員 Joseph Poon 和 Thaddeus Dryja 發布的《比特幣閃電網絡:可擴展鏈下實時支付》(The Bitcoin Lightning Network: Scalable Off-Chain Instant Payments)白皮書中提出的,本質上是由哈希時間鎖定智能合約(Hashed Time Lock Contract)來安全地處理“0 確認“交易的一種機制,通過巧妙設置”智能合約“,用戶可以在閃電網絡上進行未確認的交易。
閃電網絡支付通道時通過哈希時間鎖定智能合約來實現的——這其實就是限時轉賬,通過該智能合約,雙方約定轉賬方先凍結一筆錢,并提供一個哈希鎖將發起方的交易代幣鎖定,如果在規定時間內有人能夠提供之前生成支付的加密證明,并且與之前約定的哈希值一致,交易即可完成。
然而,閃電網絡哈希時間鎖定智能合約真的如我們想象中的那么完美嗎?在此,星球君(微信:o-daily)希望通過 Peter R. RIzun 的分析告訴大家一個答案。首先,Peter R. RIzun 虛構設計了三個人:Alice、Bob、和 Carol,通過他們之間的閃電網絡交易來解釋哈希時間鎖定智能合約的問題。
閃電通道可以被看作是再兩個人之間伸展的一串珠子(參考圖1),Alice 如果想要支付給 Bob 一筆費用,相當于把自己的一個珠子推送給 Bob。如果 Bob和 Carol 之間也有一個閃電網絡通道,那么 Alice 可以通過 Bob 給 Carol 支付,相當于:Alice 推送一個珠子給 Bob,然后 Bob 再推送一個珠子給 Carol。這里我們就會發現閃電網絡流動性基本規則中存在的一個問題,即珠子可以從一側移動到另一側,但是卻無法離開他們依附的那條“繩子”。
圖 1:Alice 可以發送一筆支付給 Carol,但需要通過 Bob 路由這筆交易。因為珠子不能離開他們依附的那根“繩子“,Bob 可以在與 Alice 連接的那根”繩子“上增加一顆珠子,然后在與 Carol 連接的那根”繩子“上減少一顆珠子。
這其實就是閃電網絡上的資金流動方式,但是這種模式并沒有告訴我們為什么通過閃電網絡支付是安全可靠的。舉個例子,如果 Bob 一直保留 Alice 推送給他的那一個珠子,然后一直不給 Carol 發送一個珠子,情況又會如何呢?
事實上,這就是本文撰寫的目的——尋找“究竟是什么讓閃電支付變得‘去信任(trustless)’?“這個問題的答案。此外在文章的最后,我們還會揭示閃電網絡一個骯臟的小秘密:閃電網絡小額支付并非完全”去信任“——路由節點可能會丟失客戶資金。
(星球君注:區塊鏈去信任是指用戶不需要相信任何第三方。用戶使用去信任的系統或技術處理交易時非常安全和順暢,交易雙方都可以安全地交易,而不需要依賴信任的第三方。)
哈希時間鎖定智能合約(HTLCs)
為了解釋是什么阻止 Bob 一直保留 Alice 發送給自己的那一個珠子,而且不把一個珠子發送給 Carol,我們需要在閃電網絡通道上引入一個物理類比——“鎖(locks)“。”鎖“可以被放置在Alice、Bob 和 Carol 共同依附的那條“繩子“上并限制珠子的移動,只有當特定條件被滿足的時候,”鎖“才會被打開。閃電網絡支付中使用的哈希時間鎖定智能合約包含兩種類型的”鎖“(參見圖2):
第一種是在提供正確密碼的時候才能被打開的“鎖“——我們稱之為”哈希鎖(hash-lock)“。
第二種是在一段時間延遲之后自動打開的“鎖“——我們稱之為”時間鎖(time-lock)“。
圖2:當哈希值達到指定值的時候(在本例中為45f8),輸入密碼即可打開哈希鎖;而時間鎖則是在指定時間過后就會被打開(在本例中為 48 小時)。
現在,讓我們重新回到 Alice 通過 Boc 向 Carol 支付一個珠子的例子上。為了讓這筆支付交易“去信任“,Alice、Bob 和 Carol 需要同時在線,而且還要按照各方都設定好的方式參與交易。
首先,Alice 必須要求 Carol 想出一個密碼,并告訴她這個密碼的哈希值。讓我們假設想出的這個密碼是“boondoggle“,而與之對應的哈希值是”45f8“。接下來,Alice 要在她和 Bob 之間設置一個哈希鎖,并且該鎖必須要在輸入哈希值是”45f8“的密碼時才能被打開。此時,Alice 和 Bob 都無法打開這個哈希鎖,因為他們都不知道密碼。Alice 之后會向這個哈希鎖推送一個珠子,最后她會在自己的珠子上設置一個時間鎖,并將其設置為 48 小時之后打開(如圖 3 所示)。
圖3,在了解到 Carol 秘密設置的密碼哈希值之后,Alice 可以設置一個哈希鎖,并以此保護他轉移給 Bob 的代幣(該代幣之后會路由給 Carol)。Alice 就會用時間鎖鎖定代幣,如果 Bob 未能在 48 小時內完成付款,她就會把這筆錢取回。
如果能夠在 48 小時內找到 Carol 設定的密碼,Bob 就能拿到 Alice 發出的珠子。與此同時,Bobby 也知道(因為 Alice 會告訴他)Carol 會公布這個密碼來換取他的一個珠子。為了誘使 Carol 采取行動,Bob 可以在他和 Carol 之間放置一個相同的哈希鎖,其中放置了他自己的一個珠子,然后 Bob 可以再設置另一個時間鎖(如圖 4 所示)。他知道如果要讓 Carol 打開哈希鎖并拿走珠子,Carol 必須要輸入密碼——很明顯,這個密碼會和 Alice 設定給 Bob 打開的那個哈希鎖密碼一樣。
圖4:如果 Carol 在 48 小時結束之前公布了 Alice 的密碼,那么Bob 會看到 Alice 提供給他的代幣。Bob 會設置相同的哈希鎖,然后推送一個代幣給 Carol,并用一個時間鎖鎖定該代幣。Carol 要獲取 Bob 這個代幣的唯一方式,就是公布 Bob 需要從 Alice 那里獲取代幣的哈希鎖密碼。
Carol 看到自己要獲取的那個珠子,然后在鎖中輸入密碼“boondoggle“(Bob 可以看到并記住),該鎖的 CUP 確認了密碼為“boondoogle”的哈希值是 45f8,然后就打開了這個鎖。接下來,Carol 把這個珠子順著“繩子”移到了自己這邊(如圖 5 所示)。
圖5,Carol 公布了自己的密碼,然后打開密碼鎖取出代幣。
獲取了 Carol 的密碼之后,Bob 用同樣的方式解鎖了 Alice 給自己的珠子(如圖 6 所示),整個支付交易完成。
圖6,獲取了 Carol 的密碼之后,Bob 現在可以獲取 Alice 給自己的珠子,整個支付交易也因此完成了。
你可能想知道,為什么 Bob 會是第一個參與整個流程的人?因為如果 Carol 沒有參與合作的話,Bob 的珠子會被一直凍結,直到時間鎖過期。而在實際交易中,Alice 向 Bob 發送的資金可能會比她給 Carol 的資金更多一點,因為 Alice 希望用這種方式作為 Bob 工作的費用,或是避免出現不必要的風險。支付交易完成之后,Bob 的賬戶余額會比這筆交易完成之前的更多一點,從而也激勵他能去完成這筆交易(或是類似的交易)。
當然,你可能也想知道在整個閃電網絡交易過程中為什么要使用時間鎖。事實上,如果支付交易因為各種原因未能成功,時間鎖能夠讓交易參與各方收回自己的資金。舉個例子,想象一下如果 Alice 把珠子轉移給 Bob 并添加了哈希鎖和時間鎖之后,Bob 突然不合作處理這筆交易,此時時間鎖就能幫助 Alice 取回自己發送給 Bob 的那個珠子,因為她只要等待時間鎖到期就可以了。在此期間,Bob 根本無法偷走這個珠子,因為他需要 Carol 的ima,而且如果 Bob 不給 Carol 轉移一個珠子的話,他就無法獲得這個密碼,因此對于 Bob 來說必須轉出一個珠子,才能獲得一個珠子。
如果你對閃電網絡支付流程感興趣的話,可以深入探討一下如果其中一方在不同步驟中變得不合作,Alice、Bob 和 Carol 會不會因為對方行為面臨資金損失的風險。
閃電網絡的骯臟小秘密
閃電網絡有一個很少人知道的骯臟小秘密,如果想要了解這個秘密是什么,以及這個秘密對閃電網絡支付交易會有什么影響——我們需要再深入挖掘一下。
現在讓我們回想一下,當 Alice 通過 Bob 向 Carol 發送一筆支付交易的時候,其中還存在一種“中間狀態”(如圖 7 所示)。我們就直接用比特幣來做解釋,渠道狀態包括三種輸出:
1、Alice 的比特幣;
2、Bob 的比特幣;
3、“交易過程中(in flight)”的比特幣。
圖7,此時閃電網絡通道狀態交易包含了三種輸出:Alice 的比特幣、Bob 的比特幣、以及“交易過程中”的比特幣。
問題在于:如果交易過程中的比特幣價值低于低于比特幣粉塵(dust)闕值,此時這筆費用則不能在通道狀態交易中表示為第三類輸出!換句話受,如果支付金額太小,則無法使用哈希鎖和時間鎖來保護這筆交易。(星球君 o-daily 注:粉塵就是那些金額太小的 UTXO,把他們花費出去需要支付的手續費高出了其自身價值,所以粉塵就花不出去了。)
為了解釋閃電網絡如何處理這個問題,我必須要首先坦白一個問題,一開始例子中“繩子“上的珠子數量并不是固定不變的。實際上,每根”繩子“邊上都應該還有一個”籃子“,這個”籃子“的標簽是”礦工的費用“,其中包含了很小一部分珠子。”籃子“里的代幣價值將會由確認通道狀態交易的礦工聲明,然后渠道狀態會被推送到區塊鏈上。也就是說,有一部分珠子會從”繩子“上移動到”籃子“里,或者從”籃子“里移回到”繩子“上,但這種情況只有當通道兩端的人都同意時才會發生。
對于小額支付交易而言,Alice 和 Bob 只是將“交易過程中的價值“移動到”費用籃子“里,而不是使用哈希鎖和時間鎖來鎖定價值(如圖 8 所示)。Bob 相信 Alice 會與他合作,而當他公布 Carol 的密碼的時候,” 交易過程中的價值“就會被他從”費用籃子“里拿出來。
圖8,如果“交易過程中“的比特幣低于粉塵闕值,則不能使用哈希時間鎖定智能合約機制,因為在廣播情況下通道狀態交易無法被挖掘,此時”交易過程中“的代幣會被傾倒進”礦工費用籃子“里。
Bob 隨后可以將“交易過程中的價值“轉儲到他與 Carol 分享的第二個”費用籃子”里,并且承諾如果自己知道密碼之后就會把這個“籃子”給 Carol。Carol 告訴了 Bob 這個秘密,然后 Bob 和 Carol 一起把“費用籃子”里的這筆支付款轉移到了 Carol 的一側。接下來,Bob 又回到 Alice 這邊,告訴了她 Carol 的秘密,然后,如果一切順利的話,Alice 也會與 Bob 合作,把“交易過程中的價值”從“籃子”里取出來并放到“繩子”上 Bob 的一側。
與前面描述的哈希時間鎖定智能合約不同,上述防范依賴于信任。比如,Carol 可以向 Bob 透露密碼,然后 Bob 可以將付款留在“費用籃子”里,接著直接去找 Alice 并告訴她密碼就能拿到的這筆付款了。
在這種情況下,Carol 的追索權是非常有限的:她要么什么都不做,并且接受損失,要么關閉她與 Bob 的通道。但是關閉與 Bob 之間的通道又無法成全自己,因為那筆她理應收到的錢其實已經被發送給了礦工。
盡管上述問題聽起來非常瑣碎,但在實際情況下卻真的能夠運作起來。當然,Bob 沒有什么特別的動機不把錢給 Carol,但是如果他不給的話,對自己也沒什么好處,因為礦工將會保留額外的資金,這筆錢并不會留在 Bob 手上。不僅如此,如果 Bob 真的這么做——即不把 Alice 通過自己發送給 Carol 的錢給 Carol,Carol 很可能會關閉通道,這意味著 Bob 是不值得信任的。這樣看來,Bob 能夠造成的損害似乎也比較有限,除了這筆支付交易的金額之外,還有就是構建一個新閃電通道的成本(因為 Carol 已經關閉通道了)。
為什么 “閃電網絡骯臟的小秘密” 值得關注
閃電網絡這個“骯臟的小秘密”非常值得關注,因為它揭示了第一層(L1)的問題(摩擦)已經轉移到了第二層(L2)中,迫使第二層協議不得不實施復雜且難以理解的解決方案。在這種情況下,這些解決方案會改變閃電網絡的“去信任”本質:對于高于粉塵闕值的支付交易,Alice、Bob 和 Carol 都不會因為對方的任何行為而損失資金;而對于低于粉塵闕值的支付交易,Alice、Bob 和 Carol 則有可能因為對方的過錯而損失資金——顯然,這與人們理解的閃電網絡安全支付交易模式不一樣了。
可能有人會爭辯說:
“我們談論的只是小微支付,所以誰會在乎這個問題呢?”
然而,這種想法其實并不對,原因有以下兩點:
1、使用區塊鏈作為高費用清算層的比特幣核心擴容計劃將會提升粉塵闕值。粉塵其實是那些金額太小的未花費交易輸出,把他們花費出去需要支付的鏈上費用高出了其自身價值,所以粉塵就花不出去了。但是如果將粉塵闕值提升,比如 100 美元,那么世界上絕大部分比特幣交易可能都會變成“粉塵”;
2、一些小微支付交易可能會出現快速、連續地丟失(例如發生了一起閃電網絡路由攻擊),可能會造成重大損失。
想象一下,未來大部分支付交易都發生在閃電網絡上,第一層上的交易費用一直都超過 100 美元,此時主鏈上低于 100 美元的粉塵輸出就會變得沒什么價值了,因為鏈上費用比交易金額本身還高。
現在閃電網絡還有另一個問題:即使 50 美元的支付交易也可能無法做到“去信任”,因為如果 50 美元低于粉塵交易闕值的情況下(考慮到 50 美元在第一層協議上也可能出現鏈上費用比交易金額本身還高的情況,因此未來設置這個粉塵闕值政策也是合理的),哈希時間鎖定智能合約就不能用于保護 50 美元以下的支付交易了,也就是說用戶可能會因為自己的過錯導致損失 50 美元。
當然,如果為了避免這個骯臟的小秘密引發“循環漏掉(loop hole)”,開發人員可以嘗試將粉塵闕值設置為 1 美元,這樣大多數閃電網絡交易就可以繼續使用哈希時間鎖定智能合約來保障資金安全。但問題是,當粉塵闕值設置的較低,輸出就不會被花費出去。
也有人覺得路由節點可能會丟失客戶資金,如果未來粉塵費用闕值提升的話,這些丟失的資金規模可能會比較大。我同樣也不太認同這種看法,因為閃電網絡支付路由的全部目的就是以交易費來賺錢,通常路由會利用自己的費用優勢吸引更多流動性,路由節點的交易量越多,費用自然也就越多。現在,閃電網絡開發人員已經意識到不可能讓全部用戶都來路由支付交易,對于普通用戶來說,開發人員更多地是鼓勵他們使用非廣告通道來進行支付交易,同時永遠不要把自己變成一個路由。
如果未來閃電網絡上的費用變得更高,那么一個路由中心(hub)則可以對用戶資金進行有效的監管控制。然而路由中心其實也不可靠,對于一個獨立用戶來說,如果支付交易沒有得到哈希時間鎖定智能合約的保護,就很難在區塊鏈上清算并收回資金。不僅如此,如果用戶余額與鏈上費用處于同一數量級,用戶也會被路由中心困住。事實上,擺脫一個“糟糕”的通道其實很不值得,因為這么做會讓用戶失去自己的全部資金。
此外,路由中心還會設定一些特定條件,比如出于反洗錢(AML)和“了解你的客戶(KYC)”目的而不轉接洋蔥路由(onion-routing)信息。如果客戶無法滿足這些特定條件的話,路由中心就會無限期地鎖定客戶資金。這樣一來,對用戶來說他們唯一的選擇就是要么在區塊鏈上進行清算,要么就丟失全部資金——這根本就不算是真正的選擇!更可怕的是,路由中心還可以設置高額費用,用戶如果想要獲得自己的錢,就不得不支付這筆錢,他們別無選擇。
未來,那些連接狀態較好、但卻收取較高鏈上費用的閃電網絡路由中心必須要受到監管,因為他們已經能夠對其客戶資金進行“托管控制(custodial control)”了。
因此,我們能不能設想推出一個這樣的法則:
當第二層上的支付金額低于在第一層上可實行的支付交易金額,該交易就不能被“去信任”。
如果底層區塊鏈不受約束,閃電網絡就很可能無法像人們所期望的那樣工作。
最后的話
未來,當大多數比特幣交易都發生在閃電網絡上,而且區塊鏈也收取高額費用的時候,人們可能會發現閃電網絡和預期的有很大不同,除了本文提到的這個“骯臟的小秘密”之外,其他閃電網絡的潛在問題還包括:
1、閃電網絡擴容的是交易,而不是用戶。運行完整閃電網絡交易驗證節點的成本仍然很高;
2、第一層上的問題(摩擦)會影響第二層可互換性(fungibility),代幣存在“位置依賴(position-dependent)”價值;
3、流動性:通過閃電網絡交易,大多數“財富狀態”其實是無法獲得的,支付失敗也是不可避免的;
4、如果閃電網絡鋪的很大,路由就會變得越來越難:閃電網絡路由中心將集中化地減少路由和流動性問題;
5、對于使用非托管錢包的用戶來說,體驗總是很糟糕:用戶需要在現上接收資金,然后還要雇傭“瞭望塔(watch towers)”來監控通道是否存在欺詐行為,并且訂閱源路由服務來發送支付交易,甚至還要動態備份通道狀態防止數據損壞。
6、系統性風險:閃電網絡通道(熱錢包)里需要鎖定大量代幣,這樣才能確保提供足夠的流動性;
7、當區塊獎勵用完的時候,第一層上的總礦工費將不足以確保區塊鏈安全。