標籤:

深入淺出微支付通道

深入淺出微支付通道

來自專欄 BFTF區塊鏈技術7 人贊了文章

大家都知道,現在的比特幣網路每秒鐘最多處理6到7筆交易,並且每筆交易還需要手續費。如果買賣雙方有大量的小額交易。那大量的小額交易,不但交易確認速度難以保證,而且手續費也不划算。

因此有人就提出了,買賣雙方可以建立小額支付通道,專門支持雙方的小額支付,不需要經過比特幣網路。這個通道除了建立、關閉的時候,要和比特幣網路通信,其他時間,都是雙方點到點的通信,因此不但交易速度得以保證,手續費也不至於難以接受。

問題的難點

我們知道,比特幣網路之所以是可靠的,最重要的原因是每筆交易都是公開的,每筆交易都會記錄到比特幣區塊鏈上,都會得到網路上每個節點的認可,所以交易雙方沒辦法反悔、抵賴。 如果交易不記錄在比特幣區塊鏈上,那麼交易就只有交易雙方自己知道,在沒有區塊鏈的情況下怎麼保證交易雙方不會反悔、抵賴?

基礎知識

1 比特幣基本數據結構

比特幣區塊是交易的集合,其中一個交易有一組輸入和一組輸出。每個輸出都有自己的鎖定腳本,輸入需要構造解鎖腳本以匹配相應的輸出。簡化版本的go語言代碼如下:

其中Input的簽名腳本(SignatureScript)用於解鎖Output的鎖定腳本(ScripteByte)。Output中的value是這筆輸出花的具體數值(比如一個比特幣)。Input中的Sequence和Transaction中的LockTime,作用會在後文解釋。

2 多重簽名

跟常規的地址不同,多重簽名地址需要多個密鑰持有者的授權才能轉移比特幣。普通地址一個私鑰就夠了,多重簽名的運作原理非常不同,需要幾個人同時簽名。

舉個栗子,普通地址:A想轉給B一個比特幣,A只需要自己的簽名(使用私鑰)就可以完成交易。針對多重簽名地址來說,A想轉給C一個比特幣,設置了一個多重簽名(ABC3個人需要2個簽名才能轉賬),那麼A想給C轉賬的時候需要B或C也完成簽名(使用私鑰)。

注意這裡的地址,不論常規地址還是多重簽名地址,都是指上面代碼Output中的PublicKey。

3 LockTime和Sequence

Locktime, 也被稱為nLockTime,它定義了個最早時間,只有過了這個最早時間,這個transaction可以被發送到比特幣網路。通常被設置為0,表示transaction一創建好就馬上發送到比特幣網路。如果nLocktime的時間在1到5億之間,則表示該transaction只會被添加到區塊高度大於或等於nLocktime的區塊中去。如果nLocktime的值超過5億,則表示從1970年01月01日開始算,加上nLocktime秒之後的一個時間點,如果transaction被創建的時間早於那個時間點,則該transaction不會被發送到比特幣網路。帶locktime的transaction,指明了transactions在未來的一個區塊或者未來的一個時間點,才會被驗證並發送到比特幣網路上去。

Sequence Number,原理和LockTime類似,也是需要等到該Input所引用的交易(也就是上1個交易的UTXO)所在的Block,其後面跟隨了Sequence Number個Block之後,該交易才能被打包,被廣播進區塊鏈網路。

從上面的解釋可以看出,LockTime和Sequence Number,都是一個Time Lock,使用他們可以創建時間鎖定交易。

兩者都是關於時間的,但有個很大差別:

  • LockTime :絕對時間,用的是整個區塊鏈的長度,或者時間戳來表達的。
  • Sequence Number : 相對時間,當前交易所引用的UTXO所在的塊,後面追加了多少個塊。

為什麼要設計這個讓交易在將來生效的機制呢?因為交易只會在將來生效,這給簽名者一個的反悔的機會。

如果任何一個簽名者反悔了,他可以創建一個沒有時間鎖定的交易。因為新創建的交易可以花掉舊交易的那部分input,所以舊交易在到期解鎖後找不到可以花掉的input,舊交易就失效了。

微支付通道

微支付通道的流程

考慮如下場景:A要去星巴克(用S替代)買咖啡。一杯星巴克咖啡大概30元,相當於0.00064 比特幣,如果每次買咖啡都使用比特幣支付顯然不划算。

現在看一下,微支付通道如何解決這個問題:

  • 第一步: A發起一筆交易,把1比特幣打到一個公共賬號上面(這個公共賬號同時需要A,S的公鑰,也就是前面所說的多重簽名)。這筆錢,需要A,S同時出具私鑰,才能把錢取出來。這筆交易叫做保證金交易(Funding Transaction)。如圖所示:

  • 第二步:與此同時,A發起一筆退款交易(Refund Transaction)。這筆退款交易的輸入,就是第一步裡面的交易,其目的是把第一步里的1個比特幣,再返回給A。這筆交易的LockTime為一個>0的值,也就是該筆交易不會立即生效。

具體做法是:A先把這筆交易發給S,讓S用私鑰簽名,再返回給A,A把這個Refund Transaction保存下來,這筆交易其實是A的一個保底的措施,保證前面的1比特幣不會永遠拿不回來。到了這一步,Funding Transaction才被A廣播到比特幣區塊鏈上(想想為什麼?)。

  • 第三步:現在第二步的Refund Transaction裡面,有2個輸出:A,1 ;S,0。

假設A買第一杯咖啡,我們把Refund Transaction拷貝1份,調整一下輸出:A, 0.99936 ;S, 0.00064。也就是付給S 0.00064個比特幣。然後A把這個交易發給S,S保留這個交易,但是不廣播到比特幣區塊鏈上。

A繼續買第二杯咖啡,我們把Refund Transaction再拷貝1份,調整一下輸出:A, 0.99872 ;S, 0.00128。也就是付給S 0.00128 個比特幣。

......

這些交易,稱為Commitment Transaction,只會在A,S之間傳遞,不會廣播到區塊鏈上。

  • 第四步,等A買完第1562杯咖啡的時候,這時候的錢已經不足以支付下一杯咖啡了,這時候Transaction的輸出為:A,0.00032;S,0.99968。這個Transaction叫做Settlement Transaction。其nLockTime = 0,S收到這個交易,廣播到網路上,交易立即生效,S收到0.99968個比特幣,剩下0.00032個比特幣找零給A。

整個過程如圖所示:

注意:這裡的情況沒有考慮比特幣價格變化和礦工手續費的問題,只是為了簡化條件說明問題。另外想關閉通道的時候,就可以發起Settlement Transaction,不需要等到最後沒錢再關閉。

從這個流程中我們可以看到:

  1. 整個過程只有第一步的Funding Transaction和第四步的Settlement Transaction會廣播到區塊鏈上。
  2. 為什麼到第二步才把Funding Transaction廣播? 萬一是個假星巴克,A拿回錢的時候他不配合,A這時候就可以廣播Refund Transaction,拿回自己所有的錢(要等一定的鎖定時間)。
  3. 因為所有的Commitment Transaction,都是A簽名之後發給S,因此即時A跑路,S也可以發送最新的Transaction到區塊鏈(有locktime)。這樣S等待一段時間後,就可以拿到自己的錢。
  4. 由於在整個過程中,每次Commitment Transaction之後,locktime都會變小,因此也不存在雙花的風險。因為假設A在支付(花錢)後廣播Refund Transaction,這時候S可以通過廣播Commitment Transaction,由Commitment Transaction的locktime會比Refund Transaction的locktime小,所以會提前生效,避免A雙花的可能。
  5. S不存在廣播老的Commitment Transaction的問題(因為他拿到的錢少)。如果A想廣播老Commitment Transaction,這時候S可以廣播最新的Commitment Transaction,由於新的Commitment Transaction的locktime較小,因此廣播後會先被打包,避免A耍賴的可能。

如何做到在off-chain的情況下,保證雙方都沒辦法反悔、抵賴交易?那就是通過博弈論的方法,讓交易雙方都持有對方的把柄,任何一方中途中斷,另外一方,就可以把這個把柄廣播到區塊鏈網路,通過可以執行合約,拿到屬於自己的錢。

微支付通道的缺點

上面說的微支付通道,解決了A給S轉賬的,大量小額交易問題,但它也有幾個缺點:

  1. 它是單向的,只能用來A給S轉賬。如果反過來,需要另外再建立1個S到A的通道。(假設星巴克要給你退錢)
  2. LockTime的限制。假設S跑路了,A也要等到Refund Transaction的LockTime到期了,才能拿回自己的錢;同樣,假設A跑路了,S也要等到Commitment Transaction的LockTime到期了,拿到屬於自己的錢。

那又如何解決這兩個問題呢?這就需要閃電網路出場了。下篇文章我會詳細分解閃電網路。


推薦閱讀:

大愛工行大媽,4000菜卡歷時9個月提額至6.3萬
關於即時通訊工具在金融領域的應用
【8.31操作思路   僅供參考】
三天大跌近20%,「碧桂園」到底發生了什麼?
線下財富管理公司,基本都是騙局!

TAG:金融 |