假定讀者了解UTXO,比特幣腳本和數字簽名的概念。
閃電網路為比特幣擴容而生。
如果兩個參與者決定加入閃電網路,第一步是創建一個多重簽名地址建立共同帳戶,即在他們之間打開一條通道。建立通道後,將維護用於在網路內的轉移資金。如果出於某種原因需要將資金提取到比特幣網路中,則參與者可以合作關閉通道。如果參與者決定開放通道,資金就會從比特幣網路流向閃電網路,除非他們希望關閉通道,否則資金絕不能反向流動。一般而言,跨層交易的兩個預期場景是打開和關閉通道,不同的是,當某個參與者長時間不響應或作惡時,其他相關參與者可以單方面關閉該通道。
建立共同賬戶
要使用閃電網路,第一步是發送比特幣。參與者將一起創建多重簽名地址,BTC將被發送到該地址。例如,Alice和Bob決定開設一個總餘額為1.5BTC的通道,Alice提供0.5BTC,Bob提供1BTC。
他們各自創建一筆交易,以便為公共賬戶提供資金,除非雙方同意,否則鎖定在該地址中的資金將無法支出。
為了演示,省略了輸入中的交易ID和輸出編號。
為了演示,省略了輸入中的交易ID和輸出編號。
現在考慮以下情況,
• 其中一位參與者拒絕合作怎麼辦?
• Alice或Bob或兩者決定關閉通道並收回他們的錢怎麼辦?
• 需要更新通道餘額怎麼辦?假設,Alice從Bob那裡買了東西,付給Bob0.1 BTC?
在解決這些問題之前,需要強調,閃電網路的設計應兼備安全性和去中心化。在閃電網路中進行資金轉移應該像在比特幣網路中一樣,即不需要依賴任何第三方。因此,需要使用比特幣腳本更複雜的設計。比特幣網路的安全性依賴於算力,而閃電網路通過在其系統中引入懲罰機制來提高資金安全性。
先解決資金問題,第一層交易分三步完成,
1.創建交易;
2.對交易簽名,或更籠統地說,提供解鎖腳本;
3.廣播已簽名的交易;
也許在這之間可以存在一個天才的設計?
原始方式:無需簽名即可提供資金
Alice和Bob可以在不簽名的情況下創建上述相同的交易。未簽名的目的是在任何人拒絕合作時可以退出通道。由於交易是未簽名的,沒有人做出承諾,因此目前不會造成損失。通過引用未簽名的交易,Alice和Bob可以創建一個新交易,以決定多簽名地址中鎖定的資金應該去哪裡。在當前情況下,應該給Alice0.5BTC,給Bob1BTC。
創建完成後,與該交易有關的兩個問題:
1.他們應該簽署新交易嗎?是的。因為目前大家都沒有虧損風險。如果Alice簽署了交易但Bob拒絕了,她可以立即中止合作,不需要承擔任何費用。反之亦然。
2.他們應該廣播新交易嗎?否。新交易的目的是防止因參與者不響應而造成的損失。除非另一方沒有反應,或者參與者決定關閉通道,否則該新交易將永遠不會被廣播。
一旦Alice和Bob各自擁有完全簽名的新交易副本,則應該簽名並廣播原始資金交易。新交易類似於租賃公寓時的保證金,是為了表明自己對合約的承諾,當合約失效時,可以拿回保證金。因此,該新交易通常稱為承諾交易。
總而言之,Alice和Bob安全打開通道的過程如下,
1.Alice和Bob各自創建了一筆資金交易,但不簽名。
2.Alice和Bob根據資金交易創建並簽署承諾交易。例如,Alice創建承諾交易,對其進行簽名,然後發送給Bob,Bob簽名後將其發送回去。或者他們可以為該特定交易交換其簽名。無論哪種方式,結果都是它們具有相同的可支出承諾交易。
3.Alice和Bob廣播他們的資金交易。
一旦交易得到確認,該通道將獲得資金,他們需要找到一種發送比特幣的方法。但是,在設計比特幣腳本以使餘額更新可行之前,這裡的關鍵問題是,如何才能花費未簽名交易的輸出?
簽名類型
通常,以比特幣發送交易時,假定所有輸入和輸出均由同一人簽名。同時,在其他情況下,並非所有輸入和輸出都需要簽名,即,用戶可能有一個包含多個輸入和輸出的交易,而用戶只想簽名某些輸入和/或輸出。為了提供靈活的交易簽名方式,比特幣定義了各種簽名模式並將其命名為簽名標誌。就在這時,有四個激活簽名標記:SIGHASH_ALL、SIGHASH_NONE、SIGHASH_SINGLE和SIGHASH_ANYONECANPAY,最常見的標誌是SIGHASH_ALL。
言歸正傳,通過從一個未簽名的交易中引用UTXO來構建交易在目前看來是不可行的。為了實現這種功能,需要對比特幣進行更新,即BIP118,它提出對交易簽名時要使用的新簽名標記SIGHASH_NOINPUT。簡言之,該標誌是要放入解鎖腳本(ScriptSig)中的新指令,它使用戶能夠基於未簽名的交易構建新的交易。BIP118於2016年首次提出,目前仍在開發中。如果進行升級,它將不僅為當前的閃電網路啟用雙方資金功能,而且還將啟用其他第二層協議,例如eltoo,它設想了一種獨立的,可理解的方式來更新閃電網路中的餘額。
備選方案——單方面資金
閃電網路的實際實施是通過改變資金交易的簽名和廣播方式來使用單方面資金。首先,任何一個參與者都可以是出資者。Alice決定向Bob購買商品,她可以將付款視為與Bob開通通道的資金。後來,當Bob從其他人那裡進行購買時,他可以在不與比特幣網路互動的情況下,使用通道中的資金。隨著通道數量增加,每個參與者最終都將在帳戶中保持一定的餘額,這首先意味著要獲得雙方資金。
如果Alice是最初的出資者,那麼至關重要的是確保當Bob沒有響應時,她的資金交易是可以追回的。
在比特幣中構建交易時,在輸入部分中需要參考交易ID和輸出編號。因此,對於Alice而言,無需先廣播即可創建她的資金交易,並且當與Bob共享她的資金交易ID和輸出編號是絕對安全的。當Bob獲得信息時,因為沒有Alice的簽名,所以他對Alice的資金交易無計可施,只能創建一個承諾交易,承諾交易將把錢退還給Alice。步驟總結如下:
1.Alice創建一筆資金交易,對其進行簽名,並與Bob共享交易ID和輸出編號。
2.Alice和Bob根據資金交易的ID和輸出編號創建並簽署承諾交易。請注意,資金交易將Alice的錢放入一個多重簽名的地址中,如果他們想使用承諾交易將其發送回Alice,則需要Alice和Bob的簽名。
3.Alice廣播她的資金交易。此時,如果Bob不響應,Alice可以廣播承諾交易以收回其資金。
Alice的資金交易保持不變。但是,她不會廣播它,也不會與Bob共享簽名的交易,而只會給Bob 交易ID(00)和輸出編號(0)。
由於比特幣在交易中使用UTXO,因此這種單方面的資金計劃消除了出資者資金損失的風險。儘管該計劃可以進一步擴展為雙方資金,但雷電協議選擇了單方面資金,因為如果單方面資助,則需要的節點間通信較少。
賬戶餘額更新
現在我們有一個可終止的帳戶,如何進行更新?Alice發送了0.5BTC來開通通道,她將向Bob發送0.1BTC用於交換筆記本,他們在閃電網路中如何完成呢?
一個簡單的解決方案是Alice和Bob可以創建新交易以反映其最新餘額。
對於Alice,她將按照以下方式創建交易,對其進行簽名,然後將其發送給Bob。由於該交易已經由Alice簽署,因此Bob可以簽署交易並廣播。
注意,我們引用的是Alice的資金交易,而不是承諾交易。
對於Bob來說,除了簽名並將交易發送給Alice之外,其他都是一樣的。目前,兩個參與者都並行執行了兩個有效交易,到目前為止,我們總共看到了五筆交易,如下所示:
• 來自Alice的資金交易,已經廣播;
• 我們將Alice的承諾交易(歸還她的錢)貼上標籤TX A1。
• Bob也有承諾交易的副本,我們將其標記為TX B1。
• 為Alice新創建的交易記錄了餘額,並更新了餘額並提供了Alice0.4BTC和Bob0.1BTC TX A2。
• Bob還擁有新創建的交易的副本,標記為TX B2。
交易簡化如下:
這四筆交易在進入比特幣網路之前都是有效的,並且如果被同時廣播的話,被礦工接受的機會均等。這裡可以將比特幣當作Tom,他是一個記賬者,可以根據聽到的第一筆交易來更新分類帳,後面的交易可以不更新。
在當前情況下,從經濟上合理的角度來講,Alice可以廣播TX A1以換取她應該給Bob的0.1BTC。對於Bob而言,他可能廣播TX B2,因為這樣就有機會將獲得0.1 BTC。如果同時廣播這兩個交易,公平交易的機率是50%,這是不可接受的。
那麼該如何解決這個問題?具體來說,我們如何確保所有參與者始終廣播最新交易,而不廣播舊交易?
先回顧一下交易類型,因為在研究閃電網路中發生的所有交易時很容易感到困惑。
• 如果交易與閃電網路無關,換句話說,它僅發生在比特幣網路中,則稱為第一層交易。
• 如果交易將資金從比特幣網路帶入閃電網路,即打開一個通道,或將資金從閃電網路帶入比特幣網路,即關閉一個通道,這種通常成為跨層交易,因為它與兩個網路交互。
• 如果該交易留在閃電網路中,則稱為第二層交易。雖然,如果第二層交易被惡意或意外地廣播到比特幣網路,則它將成為跨層交易。閃電網路就是要確保第二層交易不被交叉。
本質上,在閃電網路中進行的交易可以合法地廣播到比特幣網路中,這意味著第二層交易可以看作是專門的第一層交易。因為比特幣網路速度慢而閃電網路速度快,所以整個設計是要確保儘可能少進行第一層交易。
升級鎖定腳本
以前,所有涉及的鎖定腳本都只應用了多簽(multisig)函數。現在,是否可以通過操縱交易中的輸出部分來找到一種更新餘額的安全方法。目標很簡單,我們將對作惡者實施懲罰,作惡者為廣播舊交易的任何人。閃電網路不採取任何可能的懲罰方式,而是一旦對方在一定時間內發現到作惡行為,另一方將損失金錢。
示例中,如果Alice嘗試廣播TX A1,並記入她0.5BTC的積分,我們希望將其納入設計中,這樣Bob就有足夠的時間發現並採取行動,而Alice的0.5BTC將作為懲罰。
時間鎖開始發揮作用,尤其是OP_CHECKSEQUENCEVERIFY。它的作用是在廣播交易(或更準確地說,是礦工接受)時開始倒計時,並鎖定資金直到經過指定的時間範圍。如果今天廣播具有40天序列時間鎖的交易,那麼直到40天後才能花費。如果是一年後廣播的,則要等到一年後再過40天才能使用。此相對時間鎖可以合併到我們的新鎖定腳本中,
• TX A1萬一Bob變得遲遲不響應,Alice可以廣播來索要她的資金。
• 她必須等待2個星期,才能使用TX A1中的UTXO 。
• 如果Bob沒有響應,並且發現Alice已經廣播TX A1,他可以獲得所有資金作為對Alice的懲罰。
升級後的TX A1(我們只關注輸出部分):
如果Alice試圖在TX A1上進行跨層交易,則必須等到兩周後才能拿到錢,這是由時間鎖強制執行的。同時,如果Bob監視比特幣網路並發現TX A1已經廣播,他可以立即花費0.5BTC。
當前的設計將確保如果廣播了較舊的交易,則將Alice的錢作為罰款。另一方面,由於Bob的簽名可以花光所有錢,所以它賦予Bob太多的權力,可能使Bob作惡。讓Alice能夠收回其0.5BTC的目的是保護她免受參與者響應延遲的困擾。儘管如此,Bob還是有可能去欺騙Alice故意不響應,並隨後拿走Alice錢。
如此一來,就必須改進設計。
RSMC(序列到期可撤銷合約)
當我們使用諸如Alice的簽名之類的密鑰時,指的是由Alice的密鑰之一生成的簽名。這裡有Alice簽名的概念,而從本質上講,總是有一個私鑰創建此簽名。另一方面,Alice可以根據需要創建任意多個私鑰。這很重要,因為它是不可或缺的屬性,可以減少先前設計創建的Bob的優勢。
不是在鎖定腳本中詢問Bob的簽名,而是使用了多重簽名功能來阻止Bob竊取金錢。當參與者同意通過創建新交易來更新其餘額時,將多簽函數從舊交易中指定的私鑰。
為了演示起見,將私鑰命名為保持跟蹤。作為一個起點,Alice生成四個私鑰,A1,Rick,Batman和Tom。Bob的四個私鑰分別為B1,Morty,Robin和Jerry。
對於Alice來說,新的TX A1如下:
對於Bob來說,TX B1中的鎖定腳本很簡單,因為他沒有廣播它的動機。
通過在TX A1中應用多簽函數,Bob的優勢被剝奪了。如果沒有更新進行的,也就是說,TX A2和TX B2不存在,即使Bob不響應,Alice的資金也能得以保護,因為他沒有私鑰。如果他們想進一步更新其餘額,則可以使用類似的鎖定腳本來創建新交易。在創建過程中,他們將交換在最後一個交易中指定的私鑰。特別是,Alice在創建TX A2時將私鑰Rick發送給Bob。此舉將改變遊戲規則,它破壞了Alice廣播TX A1的動力,由於Bob將使用Rick和Morty解鎖腳本,因為Alice可能失去所有的資金。
對於Alice來說,新的TX A2如下圖:
Bob的TX B2:
如果Alice進行另一次更新並支付Bob0.2BTC,則步驟如下,
1. 創建新交易。Alice和Bob都將生成新的私鑰,以便創建上面顯示的類似交易。新的交易TX A3和TX B3將記入Alice0.2 BTC和Bob 0.3 BTC。
2. 交換舊私鑰。Alice將給Bob專用密鑰Batman,Bob將給Alice專用密鑰Jerry。這樣一來沒人會廣播舊交易。
重申一遍,BoB對廣播舊交易TX B2沒有興趣。如果Alice決定通過廣播TX A2來作惡,她將等待兩個星期才能花錢。但是,由於Bob擁有私鑰Batman,該私鑰是由Alice在更新其餘額時提供的,並且Robin由他控制,因此他可以立即花費這筆錢。不廣播舊交易是Alice的最大利益,Bob必須監視區塊鏈以檢查Alice是否作弊。問題得到解決,只要每個人的利益最大化,就不會有人欺騙。這種複雜的,經濟的激勵驅動設計被稱為RSMC,序列到期可撤銷合約,它是閃電網路發展的基礎。
顧名思義,它是可撤銷的,因為可以用新交易代替第二層交易。它使用時間鎖函數OP_CHECKSEQUENCEVERIFY,因此有一個序列,表示區塊鏈中的時間(如區塊高度或時間戳)。由於資金是按時間鎖定的,因此它會到期,直到經過足夠的時間才可以花掉。則會就是「序列到期可撤銷合約」。
RSMC有其局限性,因為它一次只能服務兩個參與者。我們想要的是擴展網路,以便人們可以無縫地在閃電網路上付款。在RSMC上稍加修改,以達到HTLC,哈希時間鎖定合約。
HTLC(哈希時間鎖定合約)
想像一下,我們有三個參與者和兩個通道。一個通道在Alice和Bob之間打開,另一個通道在Bob和Charlie之間打開。如果Alice想給Charlie發送代幣,有兩種選擇,
1. Alice和Charlie可以打開一條新通道進行交易;
2. Alice和Charlie可以利用當前通道。
第一種方法似乎有效,但是隨著參與者人數的增加,它無法解決問題。讓我們做一個簡單的數學。
• 對於3位參與者,我們需要3個通道;
• 對於4名參與者,我們需要6通道;
• 對於10位參與者,我們需要45個通道;
• 對於1000位參與者,我們需要499,500個通道!
通道太多了(計算公式為Cn2)。與Alice和Charlie向Bob求助的替代方法相比,這種方法並不可取。由於他們每個人都已經與Bob建立了通道,為什麼不將其進一步發展為來迴轉移資金的通道呢?
加密哈希函數
為了實現通道之間的路由,我們需要從加密技術中借用一個工具——加密哈希函數,並了解其本能和屬性。
哈希函數只是將任何輸入映射到固定大小的輸出。例如,一個簡單的散列函數可以是,取一個單詞並按首字母分組。
輸入是單詞(apple,agent),輸出是字母(a)。另一個簡單的哈希函數可以是簡單的模塊運算。例如,我們可以定義一個哈希函數,它接受任意數字作為輸入,對它們進行7的模塊運算以產生輸出。所有輸出的固定在0到6之間。
這些哈希函數用於演示密碼哈希函數的兩個屬性,
• 單向函數,即給定輸出,很難找到輸入。如果輸出是1,則很難確定輸入值是否為2,9,還是產生餘數1的任何數字。或者,給定字母a,很難確定輸入是apple還是agent。
• 防碰撞性,這意味著很難找到兩個產生相同輸出的輸入。簡單哈希函數沒有此屬性,因為很容易發現2和9產生相同的結果2,並且apple和agent都被哈希到字母a中。
密碼哈希函數通過應用複雜的數學函數實現了這些屬性。無需費神就可以輕鬆理解其設計背後的本能。要建立單向函數,它需要一個數學函數,該函數易於在提供答案時進行驗證,但難以求解。或者,更確切地說,要找到有效答案要比驗證答案更難。在密碼學中,難度越大意味著需要更多的計算能力和時間。因式分解是一個很好的例子。考慮以下,
• 挑戰一,找到兩個可以相乘得到2449的數字。
• 挑戰二,確認31 x 79等於2449。
顯然,第二個挑戰比第一個挑戰容易得多。儘管密碼學依賴於複雜的數學模型(例如,離散對數),但其原理不變。另一方面,為了實現抗碰撞性,需要大幅增加可能的唯一輸出的大小,以使不同的輸入不太可能發生衝突以生成相同的輸出。常用演算法是SHA256,產生2²⁵⁶的可能輸出,這是一個超出想像的天文數字。
密碼哈希函數的一個簡單用例是隱藏一個秘密,然後將其透露出來(零知識證明)。Alice聲稱她是第一個知道魔術貼的人,這將使人們成為億萬富翁,但Charlie卻不買賬。如果Alice直接告訴Charlie消息,Bob將跳出來聲稱自己擁有真實性。為避免盜用知識產權,Alice將在魔術貼上應用加密哈希函數,與所有人共享結果,並聲稱她知道魔術貼而無需先將其透露出來。
她使用SHA256對她的魔術貼進行哈希處理,從而生成輸出,
8816cee3feb85ccaad0557ffb2f6b38947a27bea4ccdea1835fded53ad71c31a
然後,Alice與Charlie分享了它。Charlie現在可以要求Bob顯示與該輸出相對應的原始消息。當然,Bob不知道答案,也不能偽造答案。現在,Alice可以安全地告知魔術貼,「金錢是一種社會建構」。
隱藏和揭示秘密
如果Alice想向Charlie發送1個比特幣,只要求Bob轉賬就太天真了。Bob有所有理由自己拿錢。為了解決此問題,在設計中應用了密碼哈希函數。如果Alice想向Charlie發送1個BTC,則Charlie要發起付款請求。這是他需要做的
1. Charlie將生成一個隨機數r並將其保密。
2. Charlie將應用加密功能對秘密進行哈希處理r,並將哈希結果R與1BTC的請求費用Alice一起發送給Bob。
3. Charlie將等待Bob向他支付1BTC。
Bob收到付款請求以及哈希值後R,會將其轉發給Alice,並要求她通過以下鎖定腳本進行交易,向他發送1個BTC,
• 如果3天過去了,並且出現了Alice的簽名,那麼Alice將錢退回。
• 否則,如果出現來自Bob的簽名和可以哈希的值R(這是密鑰r),那麼Bob就會得到錢。
如果Bob可以從Charlie那裡獲得密鑰r,那麼他將能夠解鎖交易並花費UTXO。否則,一旦3天過去了,Alice就能收回她的1個BTC。3天條件是一個絕對時間鎖,與之前的時間鎖不同。如果Bob不能在3天內提供秘密,它可以讓Alice取回她的錢。現在,Bob放心了,如果他知道A的值r,他將從Alice獲得1BTC,然後可以通過使用鎖定腳本創建類似的交易來向Charlie發送1 BTC,如下所示,
• 如果2天過去了,並且Charlie出示了Bob的簽名,那麼Bob將錢退回。
• 否則,如果顯示來自Bob的簽名和可以散列的值R,那麼Charlie會得到這筆錢。
為了索要這筆錢,Charlie必須向Bob透露密鑰r。一旦Bob知道r,他就可以花費他和Alice之間創建的交易。鎖定時間的長度隨著它靠近最終接收者而減少,即Charlie有2天的時間顯示密鑰r,而Bob有3天的時間,因此每個參與者都有足夠的時間採取行動。Bob 將密鑰r透露給Alice 的舉動證明,他已將自己的1個BTC發送給了Charlie,因為那是Bob唯一了解密鑰的方法。
但是有人可以作惡嗎?
Alice的錢僅受3天期限的限制。解鎖時間鎖後,無論Bob有沒有密鑰,Alice都可以自由地花錢。至於Bob,他對密鑰r的了解完全決定了他花費輸出的能力。即使3天過去了,只要Bob可以提供密鑰信息,這筆錢對他還是可以花費的 。無論更新餘額如何,如果當前設計看起來不錯,
• Bob在得知密鑰r後便會立即使用他的UTXO ,這意味著他將在3天之內廣播此交易。
• Alice將在3天後儘快使用她的UTXO,這意味著她將在3天後(如果適用)廣播此交易。
但是,如果廣播了第二層交易,它將成為跨層交易並觸及比特幣網路,這違反了閃電網路的原理:儘可能將交易保留在其中。因此,需要一種具有RSMC類似效果的新設計——我們不依賴誠實的人,而是將懲罰那些不誠實的人。
冷萃財經原創,作者:Awing,轉載請註明出處:https://www.lccjd.top/2019/11/08/%e4%b8%80%e6%96%87%e9%81%8d%e5%8e%86%e9%97%aa%e7%94%b5%e7%bd%91%e7%bb%9c%e5%8f%91%e5%b1%95%e8%bf%9b%e7%a8%8b/?variant=zh-tw
文章評論