閃電網絡“骯髒的小祕密”:哈希時間鎖定智能合約能確保支付安全嗎?

比特幣 設計 Medium Lightning 串珠子 技術 Odaily星球日報 2019-04-05

本文來自與 Medium,原文作者是比特幣無限(Bitcoin Unlimited)首席科學家 Peter R. RIzun

Odaily 星球日報譯者 | Moni

閃電網絡“骯髒的小祕密”:哈希時間鎖定智能合約能確保支付安全嗎?

比特幣閃電網絡(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、當區塊獎勵用完的時候,第一層上的總礦工費將不足以確保區塊鏈安全。

相關推薦

推薦中...