作者:lukechilds
來源:https://gist.github.com/lukechilds/307341239beac72c9d8cfe3198f9bfff
概述
本提議介紹了一種自主保管的積分系統,可以安裝在現有的 ecash 鑄幣廠的前置位置。用戶的餘額保管在一個免信任的積分合約中,可以隨時(比如在支付的時候)在鏈下換成 ecash token。託管的風險僅存在於支付還在處理中的時候,通常來說只有幾秒鐘,而且只有當前被轉移的數額處在這種風險下。用戶的餘額總是自主保管的,如果鑄幣廠消失或拒絕合作,用戶可以單方面退出,在鏈上取回自己的積分。
這套協議在當前的比特幣上就可以實現,無需軟分叉或任何新的操作碼。實際上,它不需要任何操作碼。整個協議幾乎完全是鏈下的,所有可能執行這個免信任積分合約的辦法都會導致一個 MuSig2 taproot 密鑰路徑花費,不需要用到 Bitcoin Script。
問題
一種標準的用戶流程是,用戶收到工資之後,就把每個月要花的錢存到一個 ecash 鑄幣廠,然後逐漸從鑄幣廠發起小額支付。這個貨幣流動過程很大程度上是單向的,除了工資以外,終端用戶很少收到錢。
如果一個用戶每天要支付 4 筆價值 10 美元的交易,那麼一個月就要發起 120 筆交易,總價值是 1200 美元。他們可以在月初向某個 ecash 鑄幣廠存入價值 1200 美元的資金,然後在一個月裡自由花費。這個系統很有意義,因為它將每個月 120 筆經濟交易壓縮成了 1 筆鏈上交易。
缺點在於,這種效率提升伴隨著巨大的風險。所有的餘額都託管在鑄幣廠,用戶需要信任他們不會盜取資金。如果一個鑄幣廠有 1000 名用戶是這麼做的,那麼這個鑄幣廠就託管著總計 120 萬美元的資金。如果鑄幣廠的運營者認為他們可以捲款跑路,這已經是很可觀的數額。即使鑄幣廠運營者是正派人,攻擊者也可能會盯上他。
解決方案
與其讓鑄幣廠來保管餘額,不如把資金存放在用戶與鑄幣廠之間的一個免信任的積分合約中。這些積分是自主保管的,而且用戶和鑄幣廠都可以單方面退出合約,無需對方的協助。積分可以在鏈下即時交付給鑄幣廠、換取 ecash token 。僅在支付時,積分才用來交換 ecash token ,而且這些 ecash token 也會立即被花掉。雖然託管風險依然存在,但僅在處理支付時才存在(通常在幾秒內,支付就完成了),而且只有用在交易中的價值才有風險。
這種免信任的積分系統可以用 Spillman 支付通道(一種單向支付通道)來實現。Spillman 通道從未流行起來,因為它有兩個重大缺點:它是單向的,而且會在預定的時間內失靈。然而,這卻非常適合我們這個應用場景,這兩個缺點都不算什麼。因為在這個用途中,用戶主要是花錢,而不是收款,所以資金只能單向流動就不是問題。而且,用戶本來就需要每個月向鑄幣廠存入一筆錢,所以換成只能存活一個月的通道也不會讓體驗更差。
既然這些缺點沒法阻礙我們,Spillman 通道的好處就非常明顯。對於用戶來說,不需要運行節點、沒有在線要求、沒有複雜的狀態備份需求,也不需要管理收款額度。用戶只需要把錢存進一個通道;把預簽名的交易發送給鑄幣廠,就可以通過通道來支付了。
在本協議中,我們提出了 Spillman 通道的一個新變種,利用比特幣的新功能來提升隱私性和效率。我們將 Spillman 通道實現為:任何可能的花費條件都可以通過一個 MuSig2 taproot 密鑰花費路徑來滿足。缺點是,支付的時候需要雙方交互;但是,因為發行 ecash token 本身就需要跟鑄幣廠交互,所以這不會增加太多複雜性。
協議
免信任的積分合約是用戶與鑄幣廠的一個 2-of-2 MuSig2 多簽名裝置。用戶為合約提供可供自己花費 1 個月的資金,但暫不廣播這筆注資交易。然後,用戶創建一筆退款交易,將合約內所有的餘額轉回給資金,但該筆退款交易的 nLockTime
(絕對時間鎖)表示的時間是一個月之後。然後,退款交易要由用戶和鑄幣廠一起簽名。這就是用戶的單方面退出交易。退款交易簽好名之後,用戶就可以安全地廣播注資交易了。注資交易得到區塊確認之後,這個免信任的積分合約就激活了,而且用戶在該鑄幣廠中有了可供一個月消費的資金,以積分的形式。
要通過鑄幣廠發起一筆支付的時候,用戶必須將免信任的積分換成需要信任的 ecash token。用戶創建一筆新的交易,花費注資交易,將鑄幣廠要求的積分數量發給鑄幣廠,並將合約中剩餘的資金髮回給自身。用戶會創建一個 musig 碎片簽名,併發送給鑄幣廠;鑄幣廠用自己的碎片簽名聚合之後,就可以得到一個有效的簽名。鑄幣廠不會講自己的碎片簽名(或者說有效的簽名交易)回傳給用戶。這就是鑄幣廠的單向退出交易,憑此,他們可以隨時免信任地執行積分合約。現在,鑄幣廠給這個用戶增記相同數額的 ecash token。這些 token 是有託管風險的,但用戶可以立即花掉它們,恢復完全自主保管狀態(剩餘的餘額都存放在免信任的積分合約中)。
下一次用戶要發起支付的時候,就如法炮製,創建一筆新的交易,同樣花費注資交易,從而替代舊的那筆交易。新交易會給鑄幣廠支付上一次的數額加上這一次的數額。因為每一次狀態更新都為鑄幣廠形成一筆新的單向退出交易,並且新交易總是比舊交易更有價值,鑄幣廠只需要保存最新的單向退出交易就可以了,不需要管理複雜的狀態。
到月末的時候,這個免信任的積分合約可以展期到下一個月、同時注入更多積分。用戶和鑄幣廠一起簽名,花費注資交易,給鑄幣廠支付已經用掉的積分,並將剩餘的餘額注入一個新的合約中,供下一個月使用。用戶可以為這筆交易增加新的輸入,從而為新合約注入更多積分。最終,每個月只有一筆鏈上交易,這筆交易既為下一個月注入新的積分,又給鑄幣廠支付用戶在上一個月已經花掉的積分。
執行這個免信任積分合約的所有方式 —— 單向退出、合作退出、合作延期 —— 都只是 musig 密鑰路徑話費,只會留下非常少的鏈上足跡。任何形式的合約執行都不會用到腳本路徑,所以鏈上觀察者不會從合約中看出任何東西。
離開這種免信任的積分合約
雙方還可以隨時合作式退出這種合約。鑄幣廠可以隨時用最新的狀態單方面退出。用戶只能在合約失靈後單方面退出。重要的是,如果合約不是合作式關閉的,鑄幣廠就必須在合約失靈之前單方面退出,否則用戶可以單方面退出、將合約中的所有資金都拿回來。
進一步的思考
隱私性影響
ecsah 最棒的地方之一在於它提供的近乎完美的隱私性。而獲得這種隱私性的部分原因在於你在鑄幣廠中靜默的時間。如果你使用這套協議給同一個鑄幣廠中的用戶支付,你就能保持隱私性。然而,如果你使用這套協議給一個鑄幣廠之外的閃電發票支付,你就無法繼承 ecash 的隱私特性。你依然能夠獲得良好的鏈上隱私性和閃電網絡中的發送者隱私性。不過,鑄幣廠要對 進入鑄幣廠的 積分-token 互換、離開鑄幣廠的 token-閃電支付 互換 執行時序和數額分析是很容易的。從鑄幣廠操作者的角度看,你並沒有隱私性。
不過,這可以通過在鑄幣廠內持有少量託管的 ecash token 來解決。舉例來說,在免信任積分合約中持有大約 95% 的餘額,而以 ecash token 形式持有 5% 的餘額,就可以模糊數額之間的關係、打破 進入/離開 鑄幣廠的 時間/數額 關聯。你可以恢復 ecash 的絕佳隱私性,僅僅暴露 5% 的餘額在託管風險中。有趣的地方在於,這是用戶可以配置的。用戶可以基於自己對 隱私性/託管風險 的偏好,自己調整這個比例。
無法免信任收款
這套協議開啟了免信任支付的體驗,但沒有帶來免信任的收款體驗。如前文標準使用流程部分所述,收款可能不是許多用戶經常要做的事,所以可能不是一個問題。用戶可以直接收取託管的 ecash token,然後優先花掉它們(推遲動用積分)。
以前文為例,如果一個用戶每天需要支付 4 筆價值 10 美元的交易,那麼一個月最多需要 1200 美元以供花費。如果他的其中一筆支付收到了退款,那麼就只暴露了 10 美元在託管風險下(佔所有餘額的 0.8%),並且只會暴露 1/4 天的時間(很快他就會有機會把錢花掉)。
延伸成免信任收款
可以在相反方向複製這套協議,從而啟用免信任的收款體驗,不過,我認為這過於複雜了,而且出於已經解釋過的原因,這是不必要的。可能這對希望通過 ecash 鑄幣廠來收款的商戶來說是有意義的。這樣,鑄幣廠就會成為用戶和商家之間的,快速、小額、信任最小化的支付中心。
你可以設置一個從鑄幣廠到商家的一個反向的免信任積分通道。這時候,是由鑄幣廠向商家開啟一條 Spillman 通道。在這種反向構造中,鑄幣廠必須提前給商家提供預期的流動性,並向商家收費。商家需要信任鑄幣廠不會盜走正在處理中的支付,然而,一旦支付到達,餘額就是自主保管的;而且,如果鑄幣廠不合作,商家可以單方面退出合約、取走資金。如果商家在合約失靈之前忘了關閉或者延期,鑄幣廠可以偷走一個月內收到的支付。
因為這種反向構造的額外複雜性,我認為與商家直接使用閃電通道相比並沒有明顯的優勢。
流動性
本協議不會給鑄幣廠施加額外的流動性要求。如果一個鑄幣廠已經有許多託管用戶和非託管用戶,隨著這些用戶斷斷續續添加積分和花費積分,鑄幣廠不太可能遇到流動性問題。不過,如果大量非託管用戶突然到來,並且都嘗試通過閃電網絡支付大量資金,就有可能耗盡鑄幣廠的閃電支付能力。
請注意,這時候鑄幣廠是沒法用部分準備金方案的,它必須具有足夠多的資金來處理用戶的取款需求,只是鑄幣廠的一部分資金放在了積分合約中。如果資金離開鑄幣廠,鑄幣廠可能需要關閉一些積分合約,來兌付其他用戶的取款。因為跟用戶關閉合約很麻煩,鑄幣廠可以通過準備額外的靈活資金,來避免這種需要;或者,可以將閃電支付外包給一個第三方,然後按月結算。
合約過期
一份合約存續的時間長度是任意的。我們提議一個月,只是為了跟每月支付薪水的典型會計模式保持一致。不過,這就意味著,每個月都需要一筆鏈上交易來保證合約開啟,即使積分合約中還有大量餘額。過期時間可以拉長到一年,這樣一年內合約都能保持開啟。不過,這樣也有缺點,如果鑄幣廠不願意合作,用戶的資金就會被鎖定,最長可達一年。可能這是一個合理的取捨,因為在當前的信任模式(託管模式)下,如果鑄幣廠不合作,所有資金都會丟失。鎖定一年時間依然是明顯的提升。
致謝
感謝 @tiero 和 @ArkLabsHQ 團隊對 Spillman 通道在 Ark 中的作用的研究,這項研究引導我得出本協議的理念。
感謝 @moonsettler 和他嘗試使用基於積分的 ecash 解決相同問題的研究,幫助我連接起了所有碎片。
感謝 @tiero、@robinlinus、@stevenroose、@kukks、@mayankchhabra、@nmfretz 和 @gandlafbtc 花時間閱讀這份提議並給我反饋。
(完)