是否有任何_true_匿名加密貨幣?
我最近一直在研究比特幣,偶然發現了許多關於比特幣根本不是匿名的筆記,或者它只是部分匿名的,你可以輕鬆地追踪你的資金。
所以,這給我們帶來了我的問題:是否有任何真正的匿名加密貨幣可供我使用並且不會留下任何痕跡。
我是加密世界的一個相當新的成員,所以請保持簡單。:)
最簡潔的答案是不。長答案分為三個部分,每個部分都以一個粗體字開頭。
- 我將討論比特幣中現有的隱私工具。
- 我將討論一些可以實現完全匿名的天上掉餡餅理論加密(但今天還不能實現)。
- 我將討論 CryptoNote、它的局限性以及可以在今天實施的可行方法,特別是那些已經由 Monero 實施的方法。
**今天,**相對於股票比特幣,你可以在隱私方面做很多事情。我應該提到的兩個策略是CoinJoin和CoinSwap。
- CoinJoin 通過有效地將交易粘貼在一起來工作。在比特幣中,每筆交易都是一個輸入列表(通過數字簽名)與輸出列表相關聯。如果總輸出值小於或等於總輸入值(任何差額都是礦工要求的“交易費用”),並且每個輸入都是舊交易的有效(未花費)輸出,則該交易有效. CoinJoin 從兩個或多個使用者那裡獲取交易,結合輸入和輸出列表,並讓兩個使用者簽署結果交易。結果是“所有輸入都屬於同一個人”和“所有輸出都屬於同一個人所有”的標準流程分析習語被打破。CoinJoin 很難很好地實現:輸出值應盡可能統一,以避免將它們分組並將它們與輸入值匹配;結果輸出不應同時使用,因為這也會對它們進行分組;加入應該涉及兩個不同的參與方,它們都不是參與每次加入的中央伺服器。目前還沒有滿足所有這些要求的好工具,但有幾個正在開發中(例如 DarkWallet)。睜大眼睛。
- CoinSwap 進行無需信任的混合,即使跨不同的區塊鏈(只要每個區塊鏈都有足夠豐富的腳本系統)。在這裡總結起來太複雜了,但是結果就像是兩方親自交換了私鑰一樣,只是沒有作弊的餘地。也就是說,硬幣在各方之間移動,但區塊鏈看不到這一點,因此鏈分析無法將它們聯繫起來——除非它們看起來很有趣,所以如果幾乎沒有使用者這樣做,他們的交易可以根據這個事實聯繫起來獨自的。據我所知,沒有任何工具支持這一點。我正在開發一個比特幣錢包,用於支持它的實驗性功能,但可能需要幾個月或幾年的時間。
**完全匿名,**從某種意義上說,當你花錢時,沒有任何來源或去向的痕跡,理論上可以通過使用零知識證明的密碼技術來實現。作為一個極端的例子,你可以想像,礦工不是發布將舊輸出映射到新輸出的塊(這就是比特幣中的交易),而是發布零知識證明,證明他們擁有一組有效的交易,這些交易總體上映射了所有輸出的舊集到所有輸出的新集。您可以通過讓收件人選擇目標地址並將不同的地址傳遞給每個礦工來進一步掩蓋這一點。這樣,只有獲得區塊的礦工(每個區塊可能不同)和接收者才知道錢的去向。
在我所描述的情況下,所有硬幣的價值仍然是可見的,也許可以通過連結價值相似的硬幣來完成跟踪。比如說,我們可以用同態加密的值來解決這個問題。
這種思考的重點是,沒有強有力的理論理由表明你想要的東西是不可能的。但是我要打破我剛剛創建的泡沫並談論實際問題:首先,要進行這種通用計算是零知識,即使遠端可行,您需要使用具有可信設置的系統(在密碼學術語中) ,該方案僅在 CRS(公共參考字元串)模型中是安全的)。這意味著某些方,可能是該計劃的創建者,可以訪問秘密數據,這將使他們能夠製作虛假證明,從而有效地讓他們一直無法察覺地印鈔。最近的一個例子是Eli Ben-Sasson 等人的論文SNARKs for C。al.,它提供了很多歷史背景。
其次,即使有這個致命的缺陷,這些方案在計算上也不是那麼可行。Zerocoin,現在被 Zerocash 取代,採用了這種方法並且需要創建嚴格的限制:所有硬幣都具有相同的價值,沒有腳本(即使對於多重簽名交易,我相信),即使如此,一些嚴肅的工作還是需要進行特殊優化零知識中剩下的任何東西(例如散列)。ZeroCash 的研究是在多方計算中進行初始設置,以便沒有人擁有列印硬幣所需的秘密材料;會有幾個,只要一個安全地銷毀他們的數據,貨幣就不會被偽造。
然而,ZeroCash 的可信設置比以往任何其他 MPC 都要復雜幾個數量級。並且已知的最有效的 MPC 方案也依賴於可信設置,所以我們沒有得到任何東西。
**話雖如此,**我們可以獲得比完全匿名更弱的東西,而且看起來我們可以以一種可行的方式做到這一點。如前所述,基於CryptoNote的貨幣在其交易簽名方案的所有權證明部分使用環簽名(對比組簽名,涉及受信任方)而不是普通的舊 ECDSA 簽名。可以說,最初基於 CryptoNote 的最著名的加密貨幣是門羅幣。雖然門羅幣隨後與其 CryptoNote 的起源大相徑庭,但它仍然實現了以下許多關鍵概念,並且還改進了該答案中最初強調的許多問題領域。
要了解 CryptoNote 的工作原理,我們必須首先回顧一下比特幣交易的工作原理。本質上,在比特幣中,每個交易輸出都有一個與之關聯的公鑰(通過輸出上的比特幣地址辨識,但未透露),並且要使用該輸出,您需要生成一個包含使用此密鑰的數字簽名的小腳本。當每個人都看到該交易時,他們會看到舊的輸出已被花費(因此他們可以忘記它,除非為新使用者保留歷史區塊鏈數據)並且已經創建了新的未花費輸出。另一方面,環簽名與任意一組公鑰相關聯,並且只需要知道一個即可進行簽名。CryptoNote 通過讓每個交易輸入成為一個集合來使用它相同值的潛在未使用輸出,由環簽名使用所有這些輸出的關聯密鑰進行簽名。不可能確定哪一筆是簽名者實際花費的“真實”一筆。
你可能會問,如果無法確定哪些產出被花費,如何防止雙重支出?CryptoNote 使用特殊的環簽名算法(它是現有簽名的修改版本,因此這是原始密碼學並且應該仔細檢查它們的安全證明——幸運的是它並不太複雜)解決了這個問題,其中真正的簽名密鑰具有關聯的密鑰圖像給它,它必須與簽名一起發布。此密鑰圖像無法反轉以獲取原始密鑰並對發送者進行去匿名化,但如果嘗試雙花,使用者將看到相同的密鑰圖像被使用了兩次並拒絕第二次嘗試。
這提供了很好的匿名性,但即使有目前列出的改進,這也不是一個零知識方案。這意味著可連結性被混淆了,但擁有良好分析工具的對手肯定能夠收集非零(字面意思是零倍於零)的資訊量。
這是一個非常有前途的方向,這些簽名可以通過普通電腦進行驗證(雖然它們比較困難,因此擴展性會比比特幣的差),但存在一些嚴重的局限性。幸運的是,一切都是可以修復的。下面的列表是我本人、Greg Maxwell、Peter Todd、Mark Friedenbach、Adam Back 和其他幾個人(我肯定會聯繫我列出的 :))之間對話的結果,據我所知沒有沒有在任何地方發表。因此,有抱負的匿名山寨幣開發者,這裡有一個願望清單:
- 在比特幣中,由於交易輸出無可爭議地被花費,未花費輸出的總列表增長非常緩慢。儲存空間有限的節點能夠儲存這個,基本上沒有其他東西:當他們看到一個新塊時,他們會驗證它,然後相應地更新他們的未使用輸出列表。在 CryptoNote 中,這是不可能的,因為交易輸出永遠不會被絕對花費:有一個巨大的潛在可花費輸出列表,以及一個巨大的已花費關鍵圖像列表,而且這兩者都增長得非常快,而且永遠不會縮小。目前的 CryptoNote 實現,除了 Monero 之外,都將這些都儲存在 RAM 中,這嚴重限制了它們的可擴展性。Monero 的可擴展性改進之一是將這個集合儲存在磁碟上的一個非常快速的 LMDB 數據庫中,但可混合輸出的集合仍然是無限的,並且預計將比比特幣的可比 utxset 增長得更快。
然而,這可以通過讓使用者只儲存他們擁有的密鑰的輸出(加上一些額外的匿名性)和只儲存花費的密鑰圖像的子集來進一步改進,我將對此進行描述。輸出集將儲存在插入排序的 Merkle 樹中(因此,幾乎不儲存任何樹的使用者可以輕鬆驗證附加新輸出,但無法檢測到重複,這很好)。圖像集將儲存在圖像排序的 Merkle 樹中(因此,幾乎不儲存任何樹的使用者可以輕鬆添加新的關鍵圖像並驗證它以前不存在,給定插入證明,這基本上是從新節點到樹根的路徑,以及沿途每個節點的兄弟節點)。為了花費一個輸出,使用者提供一個包含輸出的環簽名,
請注意,要為新的關鍵圖像生成插入證明,使用者需要將其所有鄰居儲存在關鍵圖像樹中。由於關鍵圖像看起來是隨機的,如何在不儲存整個內容的情況下做到這一點?答案是前綴過濾. 當使用者創建一個新密鑰時,他會創建一個其前 10 位(例如)是他所有密鑰圖像都將具有的特定 10 位序列。他儲存開始這十位的每個關鍵圖像,以便他可以生成這些圖像的插入證明。結果是匿名性降低(減少了 2 美元 ^{10} 美元),因為每個人都知道附近的關鍵圖像比遠處的圖像更有可能歸同一個人所有,但儲存空間也相應減少需求(增加了 $2^{10}$ 的係數)和密鑰生成時間的增加(因為平均需要生成 $2^{10}$ 的密鑰,然後才能生成具有正確前綴的密鑰)。這是每個使用者都必須做出的權衡。
Peter Todd 建議每隔幾個月或幾年選擇一個新前綴,並淘汰那些使用了所有已知關鍵圖像的前綴。與簡單地減少前綴長度相比,這為儲存命中提供了更多的隱私,因為不同前綴集中的兩個關鍵圖像不會顯示它們的共同所有者。
- 使用環簽名,匿名集只有你做的那麼大,每個簽名可能只有兩個或三個潛在的密鑰。
我們可以改進這一點,以有效地 CoinJoin 每個區塊中的所有交易(需要注意的是(a)礦工可以對 CoinJoin 進行去匿名化,減少環簽名提供的較小集合的匿名性,以及(b)礦工可以檢測到作弊,因此在探勘後有一個小視窗,其中區塊內容可能會通過揭露其作弊行為而失效,這會增加複雜性)(複雜性受到影響是因為重要的是區塊內容而不是區塊本身無效,否則礦工可以故意作弊,然後在以後揭露作弊,給他們一個很大的視窗,讓其他人都在探勘一個壞鏈)。確切的方案在這個 IRC 日誌的最頂部描述。
(同樣的安全性可以通過花哨的密碼學提供,特別是單向可聚合簽名( Greg Maxwell的“只是數學”),它依賴於基於配對的密碼學,這種密碼學速度很慢,並且需要新的安全假設,這會讓一些人感到不舒服。這些 IRC 日誌從 21:24:58 開始描述了這些的確切使用方式。我們可以在沒有新加密的情況下獲得相同的安全性,這非常酷。)
- 使用環簽名,您的匿名性可能會在事後被您匿名集中的其他人破壞。例如,如果您將一個輸出與其他兩個輸出一起使用一個環簽名,那麼這些其他輸出的所有者將它們與一個單簽名環簽名一起使用(因此它們無可爭議地被花費),現在很清楚您在這三個中的哪一個used 是你的,因為每個只能使用一次。這可以在事後很久才完成,這使分析變得複雜。
這可以通過要求最小大小的匿名集來解決,正如Monero自 2016 年 3 月以來在協議級別上所做的那樣。但是我們遇到了一個新問題——任何給定大小的輸出都只有這麼多,而且由於所有輸出都在匿名集的大小必須相同(這樣網路就知道你花了多少錢),這可能是不可能的。這可以通過允許匿名集中任何大小的輸出並將最小大小作為支出金額來解決。但是,如果給定一個跨越多個輸出密鑰的環簽名,人們就會知道具有最小大小的輸出將是“真正的”輸出。這是因為每個輸出只能使用一次,因此如果將其與較小的輸出混合,您基本上會將其縮小到這些輸出的大小,因為網路只會辨識較小的值。
所有這些問題都將在下一點中解決。
- 使用環簽名,您需要所有潛在輸入具有相同(或相似)的值,這極大地限制了您的匿名集。
事實上,我和 Greg Maxwell 找到了一種方法,可以將每個輸出讀取為任何均勻分佈的輸出(因此 1BTC 可能可以作為單個 1BTC 輸出、兩個 0.5 BTC 輸出或三個 0.33 BTC 輸出等來使用。 ) 有一個單一的“真實”分佈,但只有輸出的創建者知道這一點,除非密鑰洩露,否則不會透露。因此,從字面上看,每個輸出大小都可以合理地聲稱是由每個輸出創建的,因此所有輸出都可以參與每個匿名集。這個方案在這篇文章中有描述。
有了這個地方,設置最小匿名集大小是可行的,防止人們使用沒有匿名集的密鑰並損害自己和他人的匿名性。他們仍然可以通過透露他們的密鑰來進行這種妥協,但我不清楚這甚至可以防止。
Monero 通過實施基於Greg Maxwell 的機密交易的方案,以同樣強大的方式解決了這個問題。這種新穎的方案和實現稱為環機密交易。由於在此 RingCT 方案下不再知道輸出的值,因此您不再被迫只混合輸出的一小部分(即相同面額的輸出,在 CryptoNote 和 pre-RingCT Monero 中都是 ^10 面額輸出)。這極大地增加了潛在的匿名集,並確保即使是大輸出也不會因為只有少數匹配的、可混合的輸出而“卡住”。
**順便說一句,**達世幣(以前的暗幣)不提供匿名性。他們將 CoinJoin 的(損壞的)實現附加到普通的比特幣客戶端,並且至少最初將其作為閉源軟體發布。我還沒有研究過 Anoncoin,但是對於那些研究山寨幣的人,我最好的建議是在有人展示出具體的技術創新之前假設它們是無趣的(並且可能是危險的破壞)。
首先,我是一名門羅幣核心開發人員。不過,我會盡量保持真實和客觀。
現在,為了簡單的答案:使用門羅幣
對於更長的答案:閱讀 Andrew Poelstra 的內容豐富的回复。
我還要添加以下內容:
- 零知識證明有幾個甚至可能無法修復的基本問題(從不太關鍵的到最關鍵的):受信任的累加器、缺乏學術研究、掩蓋整個經濟意味著在經濟出現之前不可能注意到錯誤已經被嚴重損壞了。請參閱我們對 Monero ANN 的比較。
- CryptoNote 技術是健全的,但它的大多數實際實施並非如此——基於市場信心、活動和交易量,Boolberry 尤其是 Monero 是唯一值得考慮的技術。
- Monero 還與 i2p 倡議合作以混淆 IP(一旦 CryptoNote 投入使用,唯一可見的東西)。