分佈式混幣(Decentralized Mixing),不同於一般的混幣交易,指的是用一種用戶之間的點對點模式實現混幣交易的協議。正如你可以想像的,這種方式在理念上與比特幣更加契合。
分佈式模式具有更高的可操作性。首先,分佈式沒有自舉的問題,用戶不需要等待一個有公信力的集中式混幣提供商出現。其次,盜幣行為在分佈式混幣模式下幾乎不太可能發生,這種協議可以保證你可以收回你在進行混幣交易時等值的比特幣,正是因為這一點,即便是要進行一些對分佈式混幣有用的中心化的協作,由於無須說服別人自己是值得信任的,任何人都可以更加容易地設置並提供這樣的服務。最後,在某些方式中,分佈式混幣模式可以提供更好的匿名性。
合幣
分佈式混幣模式的主要方案被稱為合幣(Coinjoin)。在這個協議中,不同的用戶共同創建一個單一的比特幣交易,該交易包含所有的用戶輸入。讓合幣得以有效運作的核心技術原理為:當一個交易擁有多個來自不同地址的輸入時,來自每一個輸入的簽名都是分離並且相互獨立的,所以這些不同的地址可以被不同的人所控制,而不需要任何一方來提取所有的私鑰(參見圖6.9)。
圖6.9 合幣交易
這樣就可以讓一組用戶通過使用單一交易來進行混幣交易。每一個用戶提供一個輸入和輸出地址,然後組合起來就形成一個交易。由於輸入和輸出地址的順序是隨機的,因此攻擊者無法建立輸入和輸出的匹配關係。參與者可以查詢他們的輸出地址已經包含在交易裡,並且會接收到和他們輸入時數量相同的比特幣(減去所有的交易手續費)。一旦他們確認了這些,就可以對這個交易進行確認簽名。
當其他人在區塊鏈網絡上查詢這筆交易的時候,即使他們知道這是一筆合幣交易,也不能確定輸入地址和輸出地址的匹配。從一個外來者來看,這些比特幣已經被充分混幣了,這就是合幣的精髓。
到目前為止,我們已經描述了一輪混幣交易,但是我們在6.3節中討論的原則仍然適用,你想要(想必會)和不同組的用戶重複這樣的流程,你也想保證這些交易比特幣塊大小是標準的,這樣就避免了無意中引入會造成信息洩露的旁路。
現在讓我們來探究一下合幣的細節,我們可以把該流程分為5個步驟:
1.找到想要混幣的交易對手,作為節點。
2.交換輸入/輸出地址。
3.建立交易。
4.發送這個交易給其他人,每一個節點在確認他們的輸出地址之後,進行簽名。
5.廣播這個交易。
一組想要進行混幣的節點,首先需要發現彼此。這個動作需要由一個服務器來完成,其角色有點像一個「飲水坑」(watering holes)[1],允許這一組用戶互相連接並組合在一起。不像中心化的混幣服務,這些服務器既不可能有機會盜取用戶的資金,也不可能危及用戶的匿名性。
一旦一組節點形成,這些節點必須要互相交換它們的輸入和輸出地址。地址交換中要保證即便是組中其他節點也不能知道這些輸入和輸出地址之間的匹配關係。這一點非常重要,否則即使你與一組看上去隨機的節點進行了合幣交易,攻擊者還是有可能偽裝自己進入這個節點組,並由此獲取輸入和輸出的對應匹配。要做到無關聯的地址交換,我們就需要一種匿名通信協議。我們可以使用之前探討過的Tor網絡,或者一種被稱為加密混幣網絡(mix-net)的特殊目的匿名路由協議。
輸入和輸出地址信息一經傳達,其中一個用戶——不管是誰——將會基於這些相對應的輸入和輸出地址構建一個交易,這個未被簽名過的交易將會被轉發傳遞,每一個節點都會驗證這個輸入和輸出地址是否正確,並且簽名確認。
如果所有的節點都遵循這個協議,那麼這個系統就會正常工作。任何一個節點都可以組裝交易,並且任何一個節點都可以將這個交易廣播到網絡中,甚至這些節點中的兩個可以獨立廣播,當然,這個交易只會在區塊鏈網絡中被公佈一次。但是,如果一個或多個節點想要進行破壞,那麼啟動一個拒絕服務攻擊並阻止這個協議完成,是很簡單的事情。
特別地,一個節點可以參與協議的第一階段,提供輸入和輸出地址,但拒絕在第二階段進行簽名。或者,也可能是,在對交易進行簽名確認之後,一個想要破壞交易的節點可以嘗試使用它所提供給其他節點的輸入地址到其他的交易中去,如果另一交易在網絡中被搶先確認,那麼合幣交易就會被當作雙重支付交易而被拒絕。
在合幣交易中,有多種方案可以防止拒絕服務式攻擊。其中一個就是對協議中參與交易的節點施加成本,不管是通過一種工作證明機制(類似於挖礦),或者是通過一種銷毀證明機制(一種可證實能銷毀你所擁有的微量比特幣的技術,這一點我們在第3章探討過)。另外的辦法包括,使用一些密碼學手段鑒別不符合規定的參與者,並且可以把它們從節點組裡剔除。在本章結尾處,我們會看到一些相關細節。
高風險交易流(high-level flows)
我們之前談到過旁路攻擊。現在我們來仔細看一下產生旁路的玄機。我們假設,通過一個特定的地址,愛麗絲每週都固定地收到一定數量的比特幣,比如43.12312個比特幣,有可能這是她的薪水。進一步假設她有一個習慣,每當收到這筆資金的時候就把其中的5%立刻自動存入另外一個比特幣地址,那是她的退休基金賬號。我們將這種轉賬模式稱為高風險交易流。在這種情況下,沒有一種混幣模式可以隱藏這兩個地址之間的關係,考慮到這種行為模式會在區塊鏈網絡中是透明可見的——這樣特定了金額和時間的行為,幾乎不可能是偶然發生的。
有一種技術,可以幫助用戶在高風險交易流的情形下重獲無關聯性,這種技術叫作合併規避(merge avoidance),是由比特幣創始人邁克·赫恩(Mike Hearn)提出的。一般來說,為了完成一筆支付,用戶會盡可能地組合所擁有的比特幣,以便有足夠多的數額可以支付到單一接收地址來完成交易。他們是否可以規避會導致所有輸入地址被關聯在一起的合併行為呢?這種合併規避協議通過允許接收方提供多個輸出地址的方式(盡可能多的),使得無關聯性成為可能。發送方和接收方可以達成一致,通過把一個數額較大的支付分拆為一組小面值的支付方式,使得這個支付使用多個交易來完成,如圖6.10所示。
圖6.10 合併規避
註:愛麗絲想要用8個比特幣去購買一隻茶壺,店舖提供了兩個地址給她,她可以支付5個比特幣到其中一個地址而支付3個比特幣到另外一個地址,與她的可用輸入資金匹配了,這樣就可以避免暴露兩個地址都是屬於愛麗絲的事實。
假設,店舖最終將這兩筆支付和收到的其他支付合併在了一起,這兩個地址就不再是很明顯互相關聯的了。店舖應該避免在收款的同時,馬上重新把這兩個輸入合併在一起,否則這兩個輸入來自同一個個體的事實還是會很明顯。當然,愛麗絲也要避免在同一時間發送這兩筆支付交易,這也有可能類似地暴露信息。
總的來說,合併規避可以幫助緩解高風險交易流的問題:如果某一個交易流水被拆分成許多互相無法關聯的小額流水,攻擊者可能就不會辨別這個交易。這樣做也可以使依賴於識別單一交易中共時花費的多個比特幣的地址簇技術失效。
[1] 這個比喻來自非洲草原上的飲水坑,需要飲水的動物都會到坑邊去。掠食動物也常常在坑邊埋伏捕獵。在網絡安全上,這種類似「飲水坑」的網站也往往是黑客選擇攻擊目標的場所,此類攻擊也被稱作「水坑攻擊」。