閃電網路系列——RSMC
今天深入分析閃電網路的第1個部分:RSMC。
RSMC
RSMC,全稱Revocable Sequence Maturity Contract。 Revocable,就是可撤銷的意思; Sequence就是指第12課 nLockTime(CLTV)與Sequence number(CSV) 講述的Sequence Number。 Sequence Maturity,通俗點講,就是等到Sequence Number滿足條件了,進行履約。
所以翻譯成中文就是:可撤銷的、基於Sequence成熟度的合約。
RSMC解決的問題
(1)雙向支付,而不是單通道
(2)1方中途退出,另外1方要立即拿回錢,而不是等到nLockTime到期才能拿回錢。 同時,應該對主動退出方實行懲罰。
(3)保證交易雙方,任何1方都不能抵賴、反悔。
RSMC交易過程詳解
下面就看一下,RSMC如何達成上面的目標。
考慮如下場景,假設Alice與Bob之間經常有資金往來,看他們如何通過RSMC技術實現互相轉賬:
Step1: 同微支付通道1樣,生成1個保證金交易(Funding Transaction)。不過和微支付通道的區別是,這裡是雙向支付。所以雙方,各拿1筆錢出來,打入這個公共賬戶。
Step2: 同微支付通道類似,為這筆錢生成退款交易(Refund Transaction)。雙方可以各自拿回自己的0.5比特幣。
備註:和微支付通道一樣,實際過程是,雙方完成了Step2之後,才會把Step1的交易廣播出去。以防錢被死鎖在公共賬號裡面!!!
重點來了:Alice生成的退款交易是C1a + RD1a,Bob生成的退款交易是C1b+RD1b,2者是對稱的。
假入Alice要拿回錢,它就廣播C1a + RD1a;
假入Bob要拿回錢,它就廣播C1b + RD1b。
為什麼這麼處理呢?
我們看一下:假設Alice想主動中斷交易,也就是它把C1a + RD1a 廣播到了區塊鏈網路上,那結果是什麼呢??
我們會看到C1a裡面,會把Bob的0.5比特幣立即返還給Bob,而Alice的0.5比特幣被打到了1個新的公共賬號: Alice2 & Bob裡面!!!
Alice要拿回自己的0.5比特幣,要等到RD1a被兌現。而RD1a有個seq = 1000屬性,也就是要等到C1a所在的塊,後面被追加了1000個塊之後,RD1a這個交易才會被進入區塊鏈裡面,Alice才能拿到自己的錢!!
一句話:如果Alice主動中斷交易(把C1a + RD1a廣播到了區塊鏈上),Bob立馬拿回自己的錢,Alice則要等到Sequence Maturity之後,才能拿回錢(Alice被輕微懲罰了)。反之亦然!!
Step3: Alice與Bob開始交易
假設Alice要付給Bob 0.1 比特幣,那麼公共賬號裡面的資金分配,就從0.5/0.5,變成了0.4/0.6。
過程如下:
Alice生成了C2a與RD2a,C1a與RD1a廢除;
同樣,Bob生成了C2b與RD2b, C1b和RD1b廢除。
重點:
在雙方達成了C2a/RD2a, C2b/RD2b之後,如何讓C1a, RD1a, C1b, RD1b 廢除呢? 換句話說,如何保證Alice不反悔(不讓Alice把C1a與Rd1a廣播到區塊鏈上去?)同樣,如何保證Bob不反悔(不讓Bob把C1b與Rd1b廣播到區塊鏈上去?)
這需要引入懲罰機制!!
在Alice生成C2a/RD2a之前,他要把自己在C1a裡面的私鑰 Alice2發給Bob;同樣,Bob把自己的C1b裡面的私鑰Bob2發給Alice。
這樣,各自會生成一個懲罰交易:
如下圖所示:Alice把祕鑰Alice2給了Bob,Bob會為C1a生成1個懲罰交易BR1a,攥在自己手裡,以防Alice反悔。
假設Alice反悔,也就是把C1a + RD1a廣播出去了,Bob就把BR1a廣播出去!! BR1a由於沒有Sequence,肯定會先於RD1a執行,所以結果是RD1a不會被執行,BR1a執行了。造成的結果是,Alice拿不回錢,Bob會把Alice的0.5 比特幣全轉賬到自己賬戶裡面,這就是對Alice的懲罰。
反之亦然,會為C1b生成BR1b。
一句話:BR1a是Bob攢在手裡的Alice的把柄,BR1b是Alice攥在手裡的Bob的把柄,任何1方都不敢把舊的交易廣播出去。也就是一旦達成了C2a/RD2a + C2b/RD2b,1就廢除了。
Step4: 同微支付通道一樣,雙方最終完成了交易,把Step3裡面,最後1次更新,廣播到網路上,各自得到自己的錢。最後1次的,sequence = 0,雙方都立即拿到自己的錢。
總結
通過上面的過程分析,我們可以看出,RSMC設計的很巧妙:
(1)通過雙方各自往同1個公共賬號打錢,實現了雙向支付。
(2)Alice拿回錢的時候,沒有直接打回到她自己的賬號裡面。而是打到1個新的公共賬號 Alice2 & Bob,然後再用一個有sequence number的 RD1a最終拿回錢。通過這點,實現了誰主動中斷,誰延遲退錢。這點做的很巧妙!!!
(3)雙方協商新1輪的時候,都把自己上1輪的私鑰給對方,相當於把自己的把柄給了對方,這樣雙方都不敢反悔。
這裡,又1個很巧的地方:
雖然Alice把私鑰給了對方,但Alice不廣播C1a,那對方的處罰交易BR1a也不會執行。
Alice廣播了C1a,對方就基於廣播的交易執行處罰交易BR1a;
Alice不廣播C1a,對方也就沒機會執行處罰交易BR1a。
反之亦然!