第三章區塊鏈進階[18]

一、簡單支付驗證(SPV)

簡單支付驗證(Simplified Payment Verification,簡稱SPV)是一種無須維護完整的區塊鏈信息,只需要保存所有的區塊頭部信息即可進行支付驗證的技術。該技術可以大大節省區塊鏈支付驗證用戶的存儲空間,減輕用戶存儲負擔,降低區塊鏈未來交易量劇增而給用戶帶來的壓力。以比特幣系統為例,節點只需保存所有區塊頭信息,即可進行交易支付驗證。節點雖然不能獨立驗證交易,但能夠從區塊鏈其他節點獲取交易驗證的必要信息,從而完成交易支付驗證,同時還可以得到整個區塊鏈網絡對交易的確認數。

要理解SPV的概念,首先需要理解如下兩類概念的區別。

一是SPV與輕錢包(或瘦客戶端)的區別。輕錢包指的是節點本地只保存與其自身相關的交易數據(尤其是可支配交易數據),但並不保存完整區塊鏈信息的技術。SPV的目標是驗證某個支付是否真實存在,並得到了多少個確認。比如愛麗絲(Alice)收到來自鮑伯(Bob)的一個通知,鮑伯聲稱已經從其賬戶中匯款一定數額的錢給了愛麗絲。如何快速驗證該支付的真實性,是SPV的工作目標。輕錢包或瘦客戶端的目標不僅是支付驗證,而且是用於管理節點自身的資產收入、支付等信息。比如愛麗絲使用輕錢包或瘦客戶端管理自身在區塊鏈的收入信息、支出信息,在本地只保存與愛麗絲自身相關的交易數據,尤其是可支配交易數據。輕錢包與SPV的最大區別是,輕錢包節點仍需下載每個新區塊的全部數據並進行解析,獲取並本地存儲與自身相關的交易數據,只是無須在本地保存全部數據而已。而SPV節點不需要下載新區塊的全部數據,只需要保存區塊頭部信息即可。雖然輕錢包或瘦客戶端中部分借鑒了SPV的理念,但和SPV是完全不同的。

二是區塊鏈支付驗證與區塊鏈交易驗證的區別。SPV指的是區塊鏈支付驗證,而不是區塊鏈交易驗證。這兩種驗證方式存在很大的區別。區塊鏈交易驗證的過程比較複雜,包括賬戶餘額驗證、雙重支付判斷等,通常由保存區塊鏈完整信息的區塊鏈驗證節點來完成。而支付驗證的過程比較簡單,只是判斷該筆支付交易是否已經得到了區塊鏈節點共識驗證,並得到了多少的確認數即可。還是以比特幣系統為例,用戶愛麗絲收到來自鮑伯的通知,鮑伯聲稱已經從其賬戶中匯款一定數額的錢給愛麗絲。愛麗絲進行交易驗證的過程如下:首先,愛麗絲遍歷完整的區塊鏈賬本,在區塊鏈賬本的交易中保存了鮑伯的歷史交易信息(包括鮑伯的匯款賬戶、鮑伯的簽名、歷史收款人的地址以及匯款金額信息等),查詢鮑伯的賬戶,就可以判斷鮑伯提供的賬戶是否有足夠的餘額,如果餘額不足則交易驗證失敗;其次,愛麗絲要根據區塊鏈賬本判斷鮑伯是否已經支出了這個賬戶上的錢給別人,即是否存在雙重支付問題,如果存在則交易驗證失敗;最後,判斷鮑伯是否擁有其提供賬戶的支配權,如果判斷失敗則交易驗證失敗。而如果愛麗絲只是進行支付驗證,則過程簡單得多:通過SPV,愛麗絲可以進行支付快速驗證,即檢查此項支付交易是否已經被收錄存儲於區塊鏈中,並得到了多少個確認數,就可以判斷支付驗證的合法性。詳細的技術原理如下。

(一)SPV的技術原理

在區塊鏈中,區塊信息主要包括區塊大小、區塊頭、交易數量和交易信息四部分內容。其中,區塊頭大小為固定字節,比如比特幣中區塊頭的大小始終為80字節。區塊頭中一般包括如下信息:前一區塊(也稱父區塊)的哈希值、區塊中交易默克爾樹的根哈希值、時間戳等。以比特幣為例,其區塊頭的數據結構如表3-1所示。

表3-1 區塊頭的數據結構

通過區塊的哈希值,可以識別出區塊鏈中的對應區塊。區塊前後有序鏈接,每一個區塊都可以通過其區塊頭的「前一區塊的哈希值」字段引用前一區塊。這樣把每個區塊均鏈接到各自前一區塊的哈希值序列就創建了一條一直可以追溯到第一個區塊(創世區塊)的鏈條。前一區塊的哈希值,可以確保區塊鏈所記錄的交易次序。默克爾樹的根哈希值則可以確保收錄到區塊中的所有交易的真實性。

區塊鏈節點利用SPV對支付進行驗證的工作原理如下:

1計算待驗證支付的交易哈希值;

2節點從區塊鏈網絡上獲取並存儲最長鏈的所有區塊頭至本地;

3節點從區塊鏈獲取待驗證支付對應的默克爾樹哈希認證路徑;

4根據哈希認證路徑,計算默克爾樹的根哈希值,將計算結果與本地區塊頭中的默克爾樹的根哈希值進行比較,定位到包含待驗證支付的區塊;

5驗證該區塊的區塊頭是否已經包含在已知最長鏈中,如果包含則證明支付真實有效;

6根據該區塊頭所處的位置,確定該支付已經得到的確認數量。

上述方法可以減輕用戶的負擔。以比特幣為例,無論未來的交易量多大,區塊頭的大小始終只有80字節,按照每小時6個的區塊生成速度,每年產出52560個區塊。當只保存區塊頭時,每年新增存儲需求約為4兆字節,100年後累計的存儲需求僅為400兆字節,即使用戶使用的是最低端的設備,正常情況下也完全能夠負載。

SPV的工作原理中,最為關鍵和複雜的是步驟3,節點從區塊鏈獲取待驗證支付對應的默克爾樹哈希認證路徑的過程。例如,一個區塊鏈節點想要知道其錢包中某個比特幣地址即將到達的某筆支付,該節點會在節點間的通信鏈接上建立起布魯姆過濾器,限制只接受含有目標比特幣地址的交易。當節點探測到某交易符合布魯姆過濾器的要求時,將以默克爾區塊消息的形式發送該區塊。默克爾區塊消息包含區塊頭和一條連接目標交易與默克爾樹根的默克爾哈希認證路徑。默克爾樹哈希認證路徑是驗證待驗證支付是否存在於默克爾樹的關鍵條件,該認證路徑由默克爾樹所有路徑中節點的哈希值共同構成,自下而上進行哈希計算。節點能夠使用該路徑找到與該交易相關的區塊,進而驗證對應區塊中該交易的有無。如圖3-1所示為根據交易A、B、C、D、E、F、G、H生成的默克爾樹。這是一棵自下而上通過哈希運算生成的二叉樹。葉子節點為交易信息的哈希值,葉子節點兩兩進行哈希運算得到其父節點,繼續此過程,直至生成默克爾樹根節點。需要注意的是,如果存在單個葉子節點無法匹配成對,則用複製的方法構成完整的二叉樹,比如圖3-2中交易H不存在,則可以將交易G的哈希值M(G)複製一份替代M(H),從而完成二叉樹的生成過程。

圖3-1 交易默克爾樹結構示意圖
圖3-2 默克爾樹哈希認證路徑示意圖

假設待驗證交易為E,則交易E的默克爾樹哈希認證路徑為圖3-2虛線框所示的M(F)、M(GH)和M(ABCD)。通過該哈希認證路徑,即可以通過哈希計算找到一條鏈接交易E與默克爾樹根的完整路徑。

(二)SPV的功能擴展

雖然SPV可以高效地進行支付驗證,但對於節點當前狀態(賬戶餘額、賬戶信息甚至合約狀態等)均無法給出證明。SPV能否擴展並更進一步呢?以太坊對SPV的功能進行了擴展:每一個區塊頭,並非只包含一棵默克爾樹,而是包含了三棵默克爾樹,分別對應了三種對像——默克爾交易樹、默克爾收據樹和默克爾狀態樹。其中默克爾收據樹和默克爾狀態樹是比特幣等現有區塊鏈系統沒有的。默克爾收據樹是由展示每一筆交易影響的數據條構成的默克爾樹。而在默克爾狀態樹中,則保存賬戶信息、賬戶餘額等信息。三棵默克爾樹的功能分工如下。

1默克爾交易樹:保存交易信息,用於驗證交易是否真實包含於區塊鏈中。

2默克爾收據樹:保存某個地址的歷史事件實例,比如一個交易是否成功執行、一個眾籌合約是否完成了目標等。

3默克爾狀態樹:保存了賬戶名稱、賬戶餘額等信息。

基於上述三棵樹,以太坊不僅可以實現SPV的支付驗證,而且可以快速驗證賬戶是否存在、瞭解賬戶餘額甚至快速判斷交易是否執行成功等信息,實現了良好的SPV擴展。

(三)SPV面臨的問題

SPV面臨的第一個是問題是SPV節點與區塊鏈系統去中心化程度似乎存在一定的矛盾。隨著SPV節點數量的增多,那麼區塊鏈參與完整驗證的節點數量就會減少。然而,SPV卻不能完全獨立構成區塊鏈。由於SPV節點沒有存儲完整的區塊鏈信息,SPV的實現離不開存儲區塊鏈完整信息的節點或系統的輔助。

SPV面臨的第二個問題是交易可鍛性攻擊[19]。由於SPV實現中一個關鍵步驟是根據支付哈希值定位其在區塊中的位置,而該過程可能遭遇交易可鍛性攻擊。比如比特幣系統中,交易可鍛性攻擊體現在交易ID(賬號)可被偽造,而交易ID可被偽造的原因是比特幣簽名算法不夠完善。以比特幣為例,交易可鍛性攻擊的過程如下:在比特幣的交易中,第三方交易系統會將交易發送方、接受方、交易金額等數據作為一個交易發送到比特幣網絡中,發送之前會對這條交易信息進行加密和簽名,接著根據生成的簽名最終獲得一個哈希值,這個哈希值作為交易ID返回給提現的用戶。一次交易請求過後,用戶接收到的僅有一個交易ID,根據這個交易ID可以查看交易是否成功。當交易發送到比特幣網絡中後,網絡中的各個節點會根據之前生成的簽名來驗證交易的真實性。問題就出在簽名算法上:橢圓曲線數字簽名ECDSA這個算法的一個問題是,修改簽名的某個字節能夠使簽名依然校驗成功,這樣偽造簽名之後交易依然能夠成功進行。由於交易ID是根據簽名生成的,而偽造之後的簽名會生成一個完全不同的交易ID,第三方判斷到兩個ID不同便會確定當前交易失敗,而事實上交易已經成功了。這時如果用戶發現交易提示失敗,可以再次發起交易,第三方交易系統一看之前交易確實失敗了,那就會再進行一次交易。這時用戶的比特幣錢包裡就會多收到一份比特幣,也就造成了第三方交易平台資金損失。交易的可鍛性體現在雖然交易簽名被「鍛造過」(即修改偽造過),但最終的交易依然有效。上述攻擊對於SPV是有效的,因為在交易可鍛性攻擊場景中,偽造的交易和正常的交易都在區塊鏈網絡中,如果偽造的交易先被處理,那麼攻擊就成功。從而,SPV支付在區塊鏈中的位置定位過程可能無法完成或出現錯誤,最終影響支付驗證的進程和準確性。

有人提出可以通過改進SPV的工作流程來提升攻擊防範的有效性,比如不再僅根據哈希值來判斷支付的狀態,而是使用雙因素或者多因素驗證,包括賬戶餘額、支付信息追蹤等來綜合判斷支付是否真正成功,但這會增加SPV的複雜度。如何更加有效地解決SPV面臨的問題還值得進一步研究。

二、側鏈

(一)側鏈的起源

側鏈(sidechains)實質上不是特指某個區塊鏈,而是指遵守側鏈協議的所有區塊鏈,該詞是相對於比特幣主鏈來說的。側鏈協議是指可以讓比特幣安全地從比特幣主鏈轉移到其他區塊鏈,又可以從其他區塊鏈安全地返回比特幣主鏈的一種協議。

顯然,只需符合側鏈協議,所有現存的區塊鏈,如以太坊、萊特幣、暗網幣等競爭區塊鏈都可以成為側鏈。元素鏈(Elements)就是這樣一種側鏈。所不同的是,它是由BlockStream公司,即提出側鏈協議的公司開發的一個側鏈的參考實現。

側鏈協議具有重大意義。它意味著比特幣不僅可以在比特幣區塊鏈上流通,還可以在其他區塊鏈上流通,其應用範圍和應用前景會更加廣泛;有創意的人們會研發出各種各樣的應用以側鏈協議與比特幣主鏈對接,使得比特幣這種基準自由貨幣的地位更加牢固。

側鏈協議的產生有以下幾個原因。

1.應對其他區塊鏈的創新威脅

以太坊(Ethereum)區塊鏈、比特股(Bitshares)區塊鏈後來居上,對比特幣區塊鏈產生相當大的威脅。智能合約和各種去中心化應用在以上兩個區塊鏈上興起,受到人們的歡迎。而基於比特幣的應用則因為開發難度大,項目不多。

2.比特幣核心開發組不歡迎附生鏈

比特幣區塊鏈也有合約幣(Counterparty)、萬事達幣(Mastercoin)和彩色幣(ColoredCoin)等附生鏈,但是比特幣核心開發組並不歡迎它們,覺得它們降低了比特幣區塊鏈的安全性。他們曾經一度把OP_RETURN的數據區減少到40字節,逼迫合約幣開發團隊改用其他方式在比特幣交易中附帶數據。

3.BlockStream商業化考慮

2014年7月以太坊眾籌時,獲得了價值1.4億元人民幣的比特幣,還有20%的以太幣,開發團隊獲得了巨大的回報。但是比特幣核心開發組並沒有因為他們的辛勤工作獲得可觀回報,因而他們成立了BlockStream,擬實現商業化價值。

基於以上三個原因,提出側鏈協議、把比特幣轉出比特幣區塊鏈、另行開發二代區塊鏈,這樣的選擇既能保證比特幣區塊鏈的安全,又能應對二代幣的衝擊,還能針對不同應用場景實現商業化,因而成了BlockStream的必然選擇。

(二)側鏈協議

側鏈協議的目的是實現雙向錨定(Two-way Peg),使比特幣可以在主鏈和側鏈中互轉(圖3-3)。

圖3-3 比特幣主鏈與側鏈關係圖

雙向錨定分為以下幾個階段(圖3-4)。

1.發送鎖定交易,把比特幣鎖定在主鏈上

由比特幣持有者操作,發送一個特殊交易,把比特幣鎖定在區塊鏈上。

圖3-4 雙向錨定示意圖

2.等待確認期

確認期的作用是等待鎖定交易被更多區塊確認,可防止假冒鎖定交易和拒絕服務攻擊,等待時間是1~2天。

3.在側鏈上贖回比特幣

確認期結束後,用戶在側鏈上創建一個交易花掉鎖定交易的輸出,並且提供一個SPV工作量證明,輸出到自己在側鏈上的地址中。該交易稱為贖回交易,SPV工作量證明是指贖回交易所在區塊的工作量證明。

4.等待一個競爭期

競爭期的作用是防止雙重支付。在此期間,1贖回交易不會被打包到區塊;2新傳輸到側鏈的比特幣不能使用;3如果有工作量更大的工作證明出現,即該贖回交易包括了比特幣主鏈更大難度的SPV證明,則上一個贖回交易將被替換。

競爭期結束後,該贖回交易將被打包到區塊中,用戶可以使用自己的比特幣。

從側鏈轉比特幣到主鏈的過程也是如此。這就是側鏈雙向錨定協議。

(三)元素鏈

元素鏈是BlockStream實現的一個參考側鏈,Alpha(阿爾發)版於2015年7月推出。元素鏈Alpha旨在演示技術並且提供測試環境,目前還未開發完成。作為一個與比特幣測試網絡相對接的側鏈,元素鏈Alpha有可能被其他技術取代。

元素鏈Alpha是比特幣測試鏈的一個側鏈。它依賴可審計的聯合簽名者來管理傳輸到側鏈的測試幣(參見確定性錨定特性),並且以此來產生簽名區塊(參見簽名區塊特性)。這樣做能快速探索側鏈實施的可能性,考慮如何使用不同的安全措施。在未來版本中,升級協議接口以完全支持去中心化的側鏈聯合挖礦,最終達到完全雙向錨定的目標。

元素鏈所包括的技術如下。

1.私密交易

元素鏈中最具創新意義的特性莫過於私密交易。私密交易中的金額僅有該交易的參與者知道(或者參與者指定的人),元素鏈以密碼學算法保證不會多花幣。比特幣用地址來保證隱私,同時公開交易讓別人驗證;元素鏈在保護個人隱私上更進一步,隱藏了交易金額。金額隱藏的具體技術見下文。

私密交易最明顯的一點是引入了一種新地址類型,稱為私密地址。私密地址含了一個盲化因子,比普通比特幣地址更長,這種地址在元素鏈Alpha版本中是默認地址。

2.隔離見證

Alpha版的交易中,簽名從交易中分離出來。此舉完全消除了任何已知形式的交易可塑性的威脅,並且允許有效的區塊鏈剪枝。

在比特幣中,交易包含轉賬信息(未花費交易集、地址和金額)和用於證明交易合法性的簽名;對於隔離見證來說,交易ID僅由轉賬信息生成,區塊中包含簽名。這樣做有如下好處:

1比特幣有一些「正常化交易ID」的建議,隔離見證包含了這些建議。因為正常化交易ID機制在可塑性的輸入後還要重寫所依賴的交易,對高層協議如閃電網絡來說是必要基礎。

2交易ID不覆蓋簽名,以比BIP62更好的方式,避免了交易可塑性的所有形式,而後可以安全地使用更大尺寸的多語句智能合同。

3具有更有效提供SPV證明(用於輕錢包)的潛力,因為簽名可以從交易中被省略而不破壞默克爾樹結構。節點無須存貯或驗證簽名,可以把簽名從磁盤中刪除或無須在網絡上傳輸它,以大幅度減少區塊鏈存儲容量和寬帶要求。但在Alpha版本中,證明數據比比特幣簽名更佔空間,因為還包含了大段的輸出金額證明(因為使用了私密交易,隱藏了金額,因而要使用密碼學證明以防止多花)。

3.相對鎖定時間

為序列號賦予了新的意義,使已簽名交易被確認後,其輸入在一段特定時間內保持無效,目的是支持交易替換功能。

比特幣每個交易都有個序列號,初始想法是相比低序列號,最高序列號應該最佔優勢,礦工應該更喜歡它,但這個想法從未真正實現。在假設礦工利益最大化的前提下,為了使得交易替換機制得以加強,新增一個操作碼CHECKSEQUENCEVERIFY,用於比特幣腳本檢查序列號限制。

相對鎖定時間與常規鎖定時間用途一致,如時間鎖定的擔保服務等。但所指的「相對」會使以區塊鏈為媒介的應用更有意思。例如雙向錨定階段可描述為以交易開始的一個相對鎖定時間條件,該交易聲明了贖回證據。

4.Schnorr簽名驗證

元素鏈未使用ECDSA簽名方案,而使用了同一曲線上的Schnorr簽名方案。其好處如下。

1更有效的n/n閾值簽名。多個Schnorr簽名可以被合成一個簽名,該簽名對公鑰的總和來說是有效的,所以任意大的n/n多簽名只需用一個合簽名就可以完成,同時可以被一個CHECKSIG操作所驗證。

2更小的簽名容量(64字節,而非71~72字節),沒有DER編碼問題。潛在支持批量驗證(同時驗證32個簽名達到最高2倍加速),這需要知道R.y坐標(ECDSA忽略這個參數)和腳本級別,確保所有簽名驗證錯誤導致腳本運行錯誤(比如所有CHECKSIG操作與CHECKSIGVERIFY類似),以便提供更強的安全證明。

3能證明沒有固有的簽名可塑性問題。ECDSA有可塑性問題,並且不知道是否存在其他形式的可塑性問題。注意,分離證據使得簽名可塑性不會導致交易可塑性。

4比ECDSA的簽名和驗證速度更快一點。

5.新操作碼

元素鏈Alpha版本新增幾個新腳本操作碼。

1被禁用的操作碼。比特幣以前支持許多操作碼,一些操作碼在2010年因為安全考慮被禁用,需要硬分叉才能重新啟用。Alpha版本重新啟用了一些被禁用但是安全的操作碼,如字符串連接和字串操作碼,整數位移碼和幾個位操作碼。

2DETERMINISTICRANDOM操作碼:根據種子在一個範圍內產生一個隨機數。

3CHECKSIGFROMSTACK操作碼:驗證堆棧中對消息的簽名,而不是驗證對交易本身的簽名。

這些新操作碼有一些使用場景,包括雙花保護債券、彩票、允許1/N多簽名的默克爾樹結構(N可為成千上萬)、概率支付等。

6.金額隱藏技術

以下工作由亞當·拜克首次在Bitcointalk上的帖子《同態值比特幣》中提出。

1佩德森的承諾。CT(密碼學承諾)的基礎密碼學工具是佩德森的承諾。

承諾場景讓你把一段數據作為私密保存,但是要承諾它,使你以後不能改變該數據。一個簡單的承諾場景用哈希函數構建如下:

如果你僅告訴別人承諾,別人沒法確定你承諾了什麼數據。但你後來揭露了盲化因子和數據,別人可以運行該哈希函數來驗證是否與你之前的承諾相匹配。盲化因子必須存在,否則別人可以試圖猜測數據。如果你的數據比較少而簡單,猜測成功的可能性比較大。

佩德森承諾與以上場景中的承諾類似,但是附加一個特性:承諾可以相加,多個承諾的總和等於數據總和的承諾(盲化因子的集合即盲化因子總和):

換句話說,加法律和交換律適用於承諾。

我們用橢圓曲線點來構建具體的佩德森承諾(讀者無須理解橢圓曲線密碼學體系,把它當成黑盒行為來瞭解就可以了)。通常,ECC公鑰由私鑰x乘基點G生成。

結果保存為33字節的數組。ECC公鑰遵守以前描述過的加法同態性:

(以上特性被BIP32分層確定性錢包用來允許第三方生成新的比特幣地址。)

由於佩德森承諾的額外基點(稱之H點)生成方法,因而沒人知道H對G的離散對數(反之亦然),即沒人知道x,且xG=H。我們使用G哈希來選擇H:

這裡to_point把輸入當成橢圓曲線上某個點的x值,並且計算出y值。給定兩個基點我們能構建如下承諾場景:

這裡x是私密盲化因子,a是我們要承諾的金額,你可以用加法交換律驗證加法同態承諾場景中的相關關係。

佩德森承諾是信息理論上的隱私,你看到的所有承諾,總能找到一些盲化因子,可以和任意金額一起匹配該承諾。如果你的盲化因子是真隨機,那麼擁有無窮計算力的攻擊者都不能分辨你承諾的金額。這種承諾無法被假冒,沒法計算出任意其他能被驗證的承諾。如果你做到,這就意味著你能找到兩個基點相對於彼此的離散對數,意味著承諾橢圓曲線公鑰體系被破解。

2佩德森承諾應用。

利用該工具,我們替換比特幣交易中的8字節金額為32字節佩德森承諾。如果一個交易的發送人認真選擇他們的盲化因子,以便正確相加,然後人們還能通過承諾相加為0來驗證該交易。

以上公式需要明確的交易費用,在實際交易中,這點沒有問題。生成承諾和承諾驗證非常簡單,不幸的是,如果沒有附加的措施這個場景是不安全的。

問題在於該群是循環群。加法要mod P(一個256位的質數,用於定義群的秩),結果大數的加法會「溢出」,從而像個負數金額,因而當有些輸出金額為負數時,承諾加起來為0的特點依然存在,導致可憑空創造5個比特幣。

以上式子可以被解釋成「有人花了2個比特幣,得到-5個比特幣和7個比特幣」。為了防止產生這種情況,交易中有多輸出的時候,我們必須證明每個承諾輸出金額都在允許範圍(如[0,2~64])內且沒有溢出。

我們可以公開金額和盲化因子,以便其他人能檢查,但是這樣一來就損失了所有隱私。因而,我們要證明承諾的金額在允許範圍內,除此之外不透露任何信息。我們可以使用類似於Schoenmakers二元分解的技術來解決此問題,但是在此基礎上進行了許多優化(包括不使用二元)。

我們從基本的EC簽名開始,如果生成了一個簽名,簽名的消息是公鑰的哈希,該簽名證明簽名者知道私鑰,即公鑰對於某些基點的離散對數。

對於一個類似公鑰的P=xG+aH,因為基點H的存在,沒有人知道P對於基點G的離散對數,因為沒人知道x使得xG=H,除非a為0。如果a為0,則P=xG,離散對數恰好是x,有人會為該公鑰簽名。

把承諾當成公鑰,對承諾的哈希值簽名,通過這種方法,某個佩德森承諾可以被證明是對0值的承諾。在簽名中使用公鑰用於防止把簽名設置成任意值並且破解出承諾。簽名使用的私鑰正是盲化因子。

更進一步,假定我想證明C是對金額1的承諾,但不告訴你盲化因子,你能做的就是計算:

然後向我要公鑰C′的簽名(相對於基點G的簽名),如果我能做到,則C一定是對金額1的承諾(否則我就破解了EC離散對數的安全性)。

3環簽名。

為了避免給出金額,我們還需要另一個密碼學技術:環簽名。環簽名是當存在兩個(或多個)公鑰的簽名場景時,簽名證明簽名者知道至少一個公鑰的離散對數。使用環簽名,我們可以構建另一個場景。我證明一個承諾是對金額0或金額1的承諾,我們叫這種場景為「或證明」。

首先,我給你C,你計算C′: C′ = C - 1H

然後我提供{C,C′}上的環簽名。

如果C是對金額1的承諾,則我不知道它的離散對數,但是C′成為金額0的承諾,我知道它的離散對數(就是盲化因子)。如果C是對金額0的承諾,我知道它的離散對數;C′是對金額1的承諾時,我不知道離散對數。如果這是一個對任意其他金額的承諾,沒有一個結果為金額0,因而我沒法簽名。

以上機制對任何數字對有效,只需把金額進行合適的預處理再放到環中,或者超過2個數字。

假定我想證明C在範圍[0,32)之中,現在我們有一個或證明,想像我發送給你一個承諾集合,每個承諾都有個或證明:

C1 is 0 or 1C2 is 0 or 2C3 is 0 or 4C4 is 0 or 8C5 is 0 or 16

我為C1—C5選擇了正確的盲化因子,能使得C1 + C2 + C3 + C4 + C5=C。我建立了一些有效的二進制數,和一個只能在區間[ 0,32)內的5位數。

眾多優化手段可以讓證明過程更有效。

首先,我們提出一個新的、更有效的環簽名方法——Borromean環簽名,它僅要求每個公鑰32字節,再加上能被其他不同環所共享的32字節。與以前提出的構建方式相比,該環簽名能達到兩倍效率。

CT金額並非直接表述金額,而是使用十進制浮點數來表示,每個數字要與以10為基數的指數相乘,這意味著如果在基數10之前有較少重要數字,你能用小容量證據來證明大金額。比如:11.2345和0.0112345可以有相同大小的證明,即使兩個數相差一千倍。

還有一個非隱私的發送「最小金額」。如果用戶願意洩露一些最小金額信息(最小金額信息將對外公開),那麼就允許更小的證據覆蓋更大範圍的金額,並且當使用指數時還允許最小重要數字非零。用交易中第一個金額減少最小的金額,然後證明該值非負。

其次,浮點尾數用四進制編碼而不用二進制,因為可以減少要發送的承諾的數值,使得簽名數據大小與二進制相當。對最後的尾數數字的承諾可以跳過,從前向後對已經證明的金額創建承諾,其他數字也一樣。

最後,通過在證明中小心使用非隨機化簽名,對於幣的接收者(由於帶接收者公鑰的ECDH密鑰協議,他與發送者共享一個私鑰)來說,「重繞」證據並且用它提取發送者發送的消息是可能的。該消息大小為證據大小的80%。我們使用該原理向接收者提供金額和盲化因子,但是也可以用來存儲編號或撤款地址等信息。

三、閃電網絡

閃電網絡(The Lightning Network)是一個去中心化的系統。閃電網絡的卓越之處在於,無須信任對方以及第三方即可實現實時的、海量的交易。

(一)閃電網絡的起源

近年來,隨著比特幣的蓬勃發展,比特幣交易數量越來越多,而單個區塊體積有1MB的最大值限制,因此區塊空餘空間顯得越來越小。如圖3-5所示,區塊體積中位數在2015年裡得到了翻番,從1月的292KB(千字節)快速增長至12月的749KB。

圖3-5 比特幣區塊體積大小

數據來源:區塊元blockmeta.com

擴容問題在2015年得到了充分的重視與討論,在2015年6月左右陸續推出了諸多擴容方案,代表有BIP100、BIP101、BIP102、BIP103、BIP109、BIP248等若干方案(見表3-2)。

表3-2 區塊擴容方案表

雖然提出各種方案,但基本可以劃分為兩類:長期規則派與短期擱置派。長期派偏理想、規則型,一口氣敲定便不再折騰,典型代表是BIP101/103,設定一個增長規則,便不再調整。短期派則認為未來不可預測,固定的規則過於簡單暴力,希望設置一個短期數年方案暫時先避開,擱置至未來解決,代表為BIP100,但由於投票過程複雜,後簡化為BIP102/109等,而BIP248則一口推遲至2020年,近幾年就簡單採取翻番增長。

自2015年6月至今,經過了大半年來大範圍的反覆討論,目前長期規則派基本完敗。2015年12月比特幣香港擴容會議由Pieter Wuille提出了隔離見證(Segregated Witness)之後,擴容問題甚至已經簡化為僅升級至2MB,但陷入了關於實施時間點的爭論之中。

一個看似簡單的擴容技術問題,卻引發比特幣社區花了大半年時間,開了數次全球技術會議、私下打了無數回口水仗,卻依然未有明確定論。其背後深刻的原因是,區塊限制值上調是無法真正解決比特幣擴容問題的。

(二)擴容問題

總的來說,根據對比特幣網絡的理解,有兩個劃分:清算系統和現金系統。

1.清算系統

比特幣區塊鏈是全球的、分佈式的、有限容量的且代價昂貴的系統。每一筆交易的價值含量是不一樣的,當塊容量不夠用時,我們應該保障高價值的交易進塊。高價值的交易有意願、有能力支付足夠高的網絡手續費,從而獲得足夠高的優先級進塊。

隨著比特幣的繁榮,交易數量會越來越大,有限的塊容量會使低價值的交易(例如發送1分錢)永遠無法進塊,因為低價值的交易不可能支付高網絡手續費。進而,網絡退化為清算系統,低價值含量交易被趕出,這些交易由第三方記賬系統進行代替完成。

在閃電網絡出現之前,第三方記賬系統主要是鏈外錢包提供商。用戶信任某第三方錢包平台,把比特幣存入其中,同一平台用戶之間轉賬僅帶來賬戶餘額變更,並不會產生比特幣交易。

2.現金系統

現金系統意味著所有交易均應該進入區塊,那麼當塊容量不夠用時,則應該及時調整塊體積限制,對系統進行擴容。短時間可能發生交易入塊堵塞,但長期來看所有交易應該均可以入塊,人人都享有比特幣系統帶來的巨大便利和優勢。

3.擴容大小的選擇

我們進行一個簡單的估算,假設每個交易大小為512字節,手續費單位為0.0004/KB(見表3-3)。

表3-3 區塊未擴容方案表

根據VISA在2015年的記錄,全年共產生92064百萬筆支付交易,折合比特幣網絡數據(見表3-4)。

表3-4 區塊擴容方案表

若提高區塊體積限制至30MB,最大的問題不是CPU計算能力瓶頸,而是塊的傳播與存儲。

30MB的塊可能會導致全網孤塊率和空塊率大幅上升,一年產出1.5TB的區塊鏈數據也超出大部分節點機器的硬盤容量。基於這1.5TB的數據,區塊鏈瀏覽器、錢包服務商等則可能膨脹10倍達到15TB。這對於目前來說,已經遠超普通機器/數據庫的磁盤容量。

誠然,這些數據對於中性化的系統而言,並不具有多麼大的挑戰性,但對於一個全球分佈式系統而言,則非常具有挑戰性,會極大削弱節點數量,提高開發接入門檻,使比特幣變得中心化。

擴容爭論的最後,還是傾向於2MB,使升級過程更加可控一些,風險更低一些。

(三)微支付通道

閃電網絡在一片擴容的吵鬧聲中於2015年7月發出了首篇論文。在介紹閃電之前,我們先介紹一下微支付通道(Micro-Payments Channel)。

微支付通道概念於2012年首次被提出,是解決小額度、高頻次支付場景的方案,目的在於縮減支付的交易數量,使高頻、小額支付成為可能。下面我們先研究一下微支付通道的原理。

假設愛麗絲為消費者,鮑伯為一家視頻網站。愛麗絲非常喜歡去鮑伯網站看電影,看一部電影需要支付0.1BTC(比特幣),那麼愛麗絲看了10部電影就需要支付10次0.1BTC,共計1BTC並發出10筆交易。而採用微支付通道就會縮減至兩筆,或者說任何多次的交易均會縮減至兩筆,只要總金額不超過存入通道的額度即可。

通道(Channel)的建立以及更新過程如下。

1愛麗絲支付1BTC至一個多重簽名地址,簽名採用2/2方式,我們把該交易稱為FTX(Fund Tx)。愛麗絲生成該交易後,並不廣播。

圖3-6 微支付交易結構

2愛麗絲再構造一個贖回交易,稱之為RTX(Refund Tx)。其輸入為交易FTX的輸出,輸出為愛麗絲自己。同時,該交易有Locktime鎖定期,所以N天之後才會生效,才可以進塊。

3愛麗絲把構造好的空RTX給鮑伯,並讓鮑伯進行簽名。

4愛麗絲拿到帶有鮑伯簽名的交易RTX後,廣播出FTX。此時的交易結構如圖3-6所示,圖中帶有尖括號的簽名表示待填入。

5愛麗絲再看了一部電影,那麼她需要再支付0.1BTC給鮑伯。於是,愛麗絲構造另一筆交易PTX2:輸入依然是交易FTX;輸出為兩個地址,其中愛麗絲為0.8BTC,鮑伯為0.2BTC。愛麗絲對該交易簽名,並將交易和她的簽名給鮑伯(圖3-7)。

6鮑伯可以隨時簽名並廣播交易PTX2,當然,他依然可以廣播交易PTX1。作為一名理性經濟人,鮑伯必然總是廣播自己收益最大的那筆交易,也就是當前的PTX2。在目前總是愛麗絲付款的情況下,鮑伯總是樂於廣播最後一個交易。

7當鮑伯廣播出最後一筆交易PTXn時,則意味著通道關閉,合作結束。鮑伯需要在交易RTX鎖定期結束前關閉通道,否則意味著愛麗絲可以在交易RTX解鎖後拿回她所有的幣。

上述,就是微支付通道建立、更新與關閉過程。在一個完整的過程中,有且僅有兩筆交易廣播至鏈上,

同時雙方均無須信任對方,任何一方也無法侵害另一方的利益。在更新過程中雙方只是交換交易和簽名數據,並無交易廣播至鏈上,那麼意味著在存入額度範圍內,

圖3-7 微支付交易廣播收益最大化的那筆交易

可以創造出無數筆交易。不僅通道內的更新次數不受限制,頻率也可以達到非常高,只要系統允許,目前硬件條件可以輕鬆達到每秒數千筆。

在特定場景下,微支付通道擁有著巨大優勢,讓小額高頻支付成為可能。但它存在一個巨大制約:幣在通道中的流向是單向的。在上述例子中,幣僅能從愛麗絲流至鮑伯。

(四)閃電網絡交易合約

微支付通道解決了合併交易的問題,但並沒有解決撤銷上個交易的問題,利用「理性經濟人」和單向流動來達到撤銷上個交易目的,並不是真正的撤銷。若交易可以撤銷,則幣可雙向流動。

閃電網絡是基於微支付通道演進而來,創造性地設計出了兩種類型的交易合約:序列到期可撤銷合約RSMC(Revocable Sequence Maturity Contract),哈希時間鎖定合約HTLC(Hashed Timelock Contract)。

RSMC解決了通道中幣單向流動問題,HTLC解決了幣跨節點傳遞的問題。這兩個類型的交易組合構成了閃電網絡。

1.RSMC創建

我們先來創建一個序列到期可撤銷合約(RSMC)。愛麗絲和鮑伯是合作方,經常有比特幣往來,所以他們決定各拿出0.5BTC放入通道中,便於業務往來。

RSMC交易結構(圖3-8)的下方,左側為愛麗絲的視角,右側為鮑伯的視角。中間Funding Tx為共同可見;C1a和RD1a為愛麗絲持有;C1b和RD1b為鮑伯持有。交易圖中帶有尖括號的簽名表示待填入。

圖3-8 RSMC交易的結構圖

1雙方各拿出0.5BTC,構建Funding Tx,輸出為愛麗絲和鮑伯的2/2多重簽名。此時,Funding Tx未簽名,更不廣播。

2愛麗絲構造Commitment Tx:C1a和RD1a,並交給鮑伯簽名。C1a的第一個輸出為多重簽名地址,愛麗絲的另一把私鑰愛麗絲2和鮑伯的2/2多重簽名,第二個輸出為鮑伯0.5BTC。

3RD1a為C1a第一個輸出的花費交易,輸出給愛麗絲0.5BTC,但此類型交易帶有sequence,作用是阻止當前交易進塊,只有前向交易有1000個sequence確認時才能進塊。

4鮑伯構造Commitment Tx:C1b和RD1b,並交給愛麗絲簽名。結構與C1a、RD1a是對稱關係。

5鮑伯對C1a和RD1a進行簽名,並將簽名給愛麗絲;同理,愛麗絲對C1b和RD1b簽名,完成後給鮑伯。此時,由於並未對Funding Tx進行簽名,任何一方均無法作惡,任何一方也不會有任何損失。

6雙方均完成對Commitment Tx的簽名並交換後,各自再對Funding Tx進行簽名,並交換。此時,Funding Tx是完整的交易,廣播之。

上述過程以及結構圖的描述,就是創建RSMC的全部過程。

C1a和C1b兩筆交易花費的是同一個輸出,故他們兩個交易只有一個能進塊。若愛麗絲廣播C1a,則鮑伯立即拿到0.5BTC(C1a的第二個輸出),而愛麗絲需要等C1a得到1000個確認,才能通過RD1a的輸出拿到0.5BTC。另一方,若鮑伯廣播C1b,則愛麗絲立即拿到0.5BTC,鮑伯等待C1b得到1000個確認,才能通過RD1b拿到0.5BTC。也就是說,單方廣播交易終止合約的那一方會延遲拿到幣,而另一放則立即拿幣。

2.交易更新

愛麗絲和鮑伯各自有0.5BTC的餘額,此時愛麗絲從鮑伯處購買了一件商品,價格為0.1BTC,那麼餘額應該變為愛麗絲0.4BTC,鮑伯0.6BTC。於是創建新的Commitment Tx,對於愛麗絲來說是C2a和RD2a,對於鮑伯來說是C2b和RD2b,過程與上面類似(圖3-9)。

圖3-9 交易更新時的交易結構

此時兩個狀態均是有效的,那麼最核心的問題來了:如何才能徹底廢棄C1a和C1b呢?

RSMC採用了一個非常巧妙的方法:在C1a的第一個輸出中,採用了愛麗絲2和鮑伯的多重簽名,愛麗絲將愛麗絲2的私鑰交給鮑伯,即表示愛麗絲放棄C1a,承認C2a(圖3-10)。

圖3-10 交易更新時的多重簽名

愛麗絲交出愛麗絲2的私鑰給鮑伯,那麼鮑伯就可以修改RD1a的輸出給他自己,形成新的交易BR1a。若愛麗絲破壞合約,在存在C2a的情況下依然廣播出C1a,那麼愛麗絲受到的懲罰就是失去她全部的幣。愛麗絲交出愛麗絲2的私鑰,或者對交易BR1a進行簽名,兩者是等同的,都是對C1a的放棄。

反之亦然,鮑伯交出鮑伯2的私鑰給愛麗絲即意味放棄C1b,而僅能認可C2b。

引入sequence的目的是,阻止後續交易進塊(RD1a),給出一個實施懲罰窗口期,當發現對方破壞合約時,可以有1000個塊確認的時間去實施懲罰交易,即廣播BR1a代替RD1a。若錯過1000個塊時間窗口,則無法再實施懲罰了(RD1a進塊了)。

3.交易關閉

關閉RSMC,直接按照最終的餘額構造出一個Commitment TX即可。例如,輸出為愛麗絲0.1BTC,鮑伯0.9BTC,無需再設置多重簽名,構造懲罰交易等。

4.中轉交易

愛麗絲想要支付0.5BTC給鮑伯,但她並沒有一個渠道來和他進行交易。幸運的是,她和查理有一個交易渠道,而查理正好和鮑伯有一個交易渠道。這樣愛麗絲就能借助查理的交易渠道,通過哈希時間鎖定合約(HTLC)來和鮑伯進行交易了(圖3-11)。

圖3-11 中轉交易示意圖

為了完成這次交易,愛麗絲就會給鮑伯發短信說:「嘿!我要給你付筆款。」這時鮑伯將收到一個隨機數字(R),接著鮑伯便會回一個被哈希的數字(H)(你可以認為被哈希的數字H是隨機數字R的一種加密形式)給愛麗絲。然後愛麗絲的錢包緊接著就會聯繫查理說:「嘿,查理。如果你給我生成(H)的未加密值(R),那麼我就同意更新我們渠道的支付分配,這樣你得到的就會比0.5BTC多一點,我得的比0.5BTC少一點。」儘管查理並不知道R,但他也會同意。之後查理便會去找鮑伯說:「嘿,鮑伯。如果你給我那個能生成H的未加密的值R,我將同意更新我們渠道的支付分配,這樣你得到的會比0.5BTC多一點,我得到的比0.5BTC少一點。」

因為R就是從鮑伯這裡生成的,所以他肯定知道。接著他馬上將R告訴查理,並更新了其渠道的支付分配。然後查理將R告訴給了愛麗絲之後也更新他們的渠道,最後交易完成,愛麗絲以脫鏈的形式付給鮑伯0.5BTC。

5.總結

RSMC通過巧妙地設置Commitment TX的多重簽名輸出,以及sequence的延遲進塊形成懲罰窗口期,解決了在微支付通道中的幣單向流動問題。

(五)閃電網絡面臨的問題

閃電網絡的最初設想為一個中心輻射型網絡(圖3-12)。你的錢包將會連接到一個「支付中轉站」,由於各種支付渠道彼此之間都保持暢通,愛麗絲有一個和中轉站A相通的渠道,而鮑伯也有一個和中轉站B相通的渠道,愛麗絲只需通過一兩個中轉站的跳躍就能直接和鮑伯交易了。

圖3-12 中心輻射型網絡

如果能有成百上千個中轉站(小額支付中心),那麼這個網絡拓撲結構就能完美運行。但是,若是只有少數幾個大型中轉站,那麼這個網絡的去中心化就會受到損害,變成另一個VISA卡、萬事達卡或者美國運通。

1.中轉站的中心化風險

要精確地預測出存在於網絡均衡中的中轉站的數量是完全不可能的,但是由於眾所周知的馬太效應,這個數字會逐漸變小,而不是變大。然而不可否認的是,在開源項目中,任何人都可以在上面運行一個支付中轉站(至少在政府部門決定監管之前),只是支付中轉站運行的高成本就像是給進入者們設置了一道堅固的壁壘,從而產生了中心化壓力。

為什麼建立支付中轉站需要高成本?讓我們回到查理扮演「交易中轉站」的那個例子。回想一下,愛麗絲需要通過查理把比特幣付給鮑伯,所以查理不得不在更新他和愛麗絲的分配渠道之前就更新他與鮑伯的分配渠道(付給鮑伯的多,自己得到的要少)。也就是說,查理在得到鮑伯的0.5BTC之前,就得先付錢給愛麗絲。

這意味著如果查理想要成為一個支付中轉站,那他自己必須在與「客戶」共有的渠道裡存足夠多的比特幣,這樣才能促成這些「客戶」的脫鏈交易。如果查理沒有預存至少0.5BTC到鮑伯的渠道裡,那麼這筆交易就不能做成。

現在,雖然查理仍保留這些比特幣百分之百的控制權,但是這筆錢至少還是需要放在那些渠道裡,以便促成那些鏈外支付,因而資金的沉澱成本非常高昂。所以,要運行一個支付中轉站還是需要真金實銀的投入,最起碼在剛開始之前就需要準備足夠的預存款。

那麼,一個支付中轉站應該給每個渠道存入多少預存款呢?如果一個比特幣是500美元的話,那麼你想要運行一個服務100人的支付中轉站,需要50000美元的資產來啟動它。

因此,如果某天閃電網絡最終演變為中轉站輻射型拓撲網絡,那麼中心化就是它最大的隱患。

2.點對點的路徑交易

閃電網絡是否有比中轉站輻射型更好的模式?目前已經有很多規避支付中轉站的設想,開發者嘗試創造出更多去中心化、有組織的錢包對錢包的路徑。

試想一下,如果愛麗絲想要買一杯咖啡,在此之前,她的錢包會用相同的技術在網絡中通過其他節點找到一個路徑來支付這杯咖啡。如果錢包找不到任何一個節點,那麼它將與咖啡店打開一個新的支付渠道來完成這筆交易,然後留著這個渠道以便日後再用。理論上愛麗絲的錢包能夠維持數十個開放的渠道。

如果有人每次在嘗試支付時都不能找到一個渠道,那麼新的渠道將會被打開,長此以往,用戶間的一些有組織的渠道路徑就會形成(圖3-13)。

圖3-13 點對點的路徑交易示意圖

從圖3-13我們可以看到,愛麗絲在離開咖啡店後仍保持其支付渠道的開放。鮑伯最近去了咖啡店後也保持其支付渠道的開放,而且他還從商店裡買了一條新領帶,這個支付渠道也是處於開放狀態。

在這個例子中,愛麗絲不僅可以將比特幣以鏈外的形式給鮑伯,還可以通過已形成的有組織的路徑將比特幣付給商店老闆。這可以解決閃電網絡中心化的問題。但在具體應用中,很難找到從愛麗絲到商店並通過咖啡店和鮑伯的支付路徑。

圖3-14 點對點交易的支付路徑

愛麗絲和鮑伯都要花0.011BTC來買一杯咖啡(約5美元),這就是為什麼咖啡店在愛麗絲和鮑伯的渠道中都有0.011BTC(圖3-14)。對愛麗絲來說,不管她是想把錢給鮑伯還是商店老闆,咖啡店老闆都需要更新他和鮑伯的支付分配渠道。咖啡店老闆自己得到的少(從愛麗絲想要付的錢中),鮑伯從中得到的多。但是注意一下,咖啡店老闆在和鮑伯的渠道中只有0.011BTC(約5美元),也就是說愛麗絲最多只能付給鮑伯或是商店老闆5美元。如果她想要付更多的錢,那她就需要重新開一個渠道。

當人們以不同金額買不同的東西時,這種類型的數值不對稱性就很有可能會頻繁發生。從一個節點到另一個節點的路徑很容易被找到,但是每一次找到正確數值的跳躍路徑則是最困難的部分。

3.路徑交易造成更多的鏈上交易

設想一下,要是愛麗絲的錢包不能從商店那裡找到一條她想要數額的路徑時,她是怎樣開啟一條新的渠道的。據估算,在給定的時間內你錢包中的比特幣有絕大部分會留在渠道中。那麼愛麗絲的錢包哪裡還有比特幣來和商店開一個新的渠道呢?好,如果它不得不關閉現存的渠道之一,那麼當你的錢包在交易時不能找到一條路徑的過程將是這樣:1關閉現有的一條渠道完成鏈上交易。2和收款人開啟一條新的渠道完成鏈上交易。

這兩筆鏈上交易中還只有一筆付款,要是有一筆大交易無法找到一條路徑(因此不得不關閉一個舊的渠道來打開一條新的渠道),很多的預存款都將被浪費掉。如果有超過50%的交易找不到路徑,閃電網絡實際上會促成更多的鏈上交易,而不是即時的鏈外交易。

4.路徑交易時,發送者和接收者需要同時在線

人們即便是使用桌面上的錢包,也不會讓它24小時都開啟。他們在不用錢包的時候就會關閉程序,蓋上筆記本電腦的蓋子,關掉電腦等。除此之外,很多人的手機錢包都是休眠狀態,不會時刻保持上線狀態。因此,99%的預期用戶都不會參與路徑付款。

在哈希時間鎖定合約(HTLC)的例子中,愛麗絲的錢包聯繫鮑伯的錢包,並問他要一個哈希化的隨機數字(R)。鮑伯需要在線才能將那個數字給她。而在比特幣目前的使用中,發送者和接收者是不需要同時在線的。

參考資料

[1]http://8btc.com/article-2002-1.html

[2]http://www.bitabc.com/?id=169

[3]http://www.8btc.com/merkling-in-ethereum

[4]http://8btc.com/thread-23806-1-8.html

[5]http://8btc.com/article-1790-1.html

[6] http://www.8btc.com/confidential

[7] http://www.8btc.com/elements

[8] https://www.elementsproject.org/elements/deterministic-pegs/

[9] https://www.elementsproject.org/sidechains.pdf

[10] https://github.com/ElementsProject

[11]https://github.com/Blockstream/borromean_paper/raw/master/borromean_draft_0.01_34241bb.pdf

[12] https://people.xiph.org/~greg/confidential_values.txt

[13] https://bitcointalk.org/index.php?topic=305791.0

[14] https://www.elementsproject.org/elements/relative-lock-time/

[18] 本章《簡單支付驗證》部分由海濱完成,《側鏈》部分由申屠青春完成,《閃電網絡》部分由潘志彪完成。

申屠青春,深圳銀鏈科技CEO,深圳大學ATR國防科技重點實驗室博士。

潘志彪,現任比特大陸軟件研發總監,BTC.COM團隊負責人。前幣付寶CTO、聯合創始人。中國比特幣行業知名技術專家,曾就職於百度,當當等互聯網公司,對於大數據處理、推薦系統、模式識別等有較為深入的研究。

[19] 交易可鍛性(transaction malleability)攻擊,又稱交易延展性攻擊。攻擊者偵聽比特幣P2P網絡中的交易,利用交易簽名算法的特徵修改原交易中的input簽名,生成擁有一樣input和output的新交易,然後廣播到網絡中形成雙重支付。這樣,原來的交易將有一定的概率不能被確認,造成不可預料的後果。

《區塊鏈:從數字貨幣到信用社會》