關於基於賬戶的區塊鏈中的匿名性

我們長期以來對加密貨幣的匿名性話題很感興趣,並嘗試跟踪該領域技術的發展。 在我們的文章中,我們已經詳細分析了工作原理 保密交易 門羅幣,還舉行了 比較審查 該領域的技術。 然而,如今所有的匿名加密貨幣都是建立在比特幣提出的數據模型——未花費交易輸出(Unspent Transaction Output,以下簡稱UTXO)之上。 對於像以太坊這樣基於賬戶的區塊鏈,現有的匿名和隱私解決方案(例如, 莫比烏斯阿茲特克)嘗試在智能合約中復制UTXO模型。

2019 年 XNUMX 月,來自斯坦福大學和 Visa Research 的研究團隊 獲釋 預印本 “Zether:邁向智能合約世界的隱私”。 作者首次提出了一種確保基於帳戶的區塊鏈中匿名性的方法,並提出了智能合約的兩種選擇:機密(隱藏餘額和轉賬金額)和匿名(隱藏接收者和發送者)交易。 我們發現所提出的技術很有趣,並願意分享其設計,並討論為什麼基於帳戶的區塊鏈中的匿名問題被認為非常困難,以及作者是否設法充分解決它。

關於這些數據模型的結構

在UTXO模型中,一筆交易由“輸入”和“輸出”組成。 “輸出”的直接類比是你錢包裡的鈔票:每個“輸出”都有一定的面額。 當你向某人付款(形成一筆交易)時,你花費了一個或多個“輸出”,而它們成為交易的“輸入”,區塊鏈將它們標記為已花費。 在這種情況下,您的付款接收者(或者您自己,如果您需要找零)會收到新生成的“輸出”。 示意性地,這可以表示如下:

關於基於賬戶的區塊鏈中的匿名性

基於帳戶的區塊鏈的設置與您的銀行帳戶非常相似。 他們僅對您帳戶中的金額和轉賬金額進行操作。 當您從帳戶中轉移一些金額時,您不會燃燒任何“輸出”,網絡不需要記住哪些硬幣被花費了,哪些沒有被花費。 在最簡單的情況下,檢查交易歸結為檢查發件人的簽名及其餘額金額:

關於基於賬戶的區塊鏈中的匿名性

技術分析

接下來,我們將討論Zether如何隱藏交易金額、接收者和發送者。 在描述其操作原理的過程中,我們將注意到機密版本和匿名版本的差異。 由於在基於帳戶的區塊鏈中提供隱私要容易得多,因此匿名化施加的一些限制將與該技術的機密版本無關。

隱藏餘額和轉賬金額

Zether 使用加密方案來加密餘額和轉賬金額 埃爾加邁勒。 其工作原理如下。 當愛麗絲想要發送給鮑勃時 b 按地址(其公鑰)的硬幣 Y,她隨機選擇一個數字 r 並對金額進行加密:

關於基於賬戶的區塊鏈中的匿名性
哪裡 C - 加密金額, D - 破譯該金額所需的輔助值, G - 橢圓曲線上的固定點,當將獲得公鑰的秘密密鑰相乘時。

當鮑勃收到這些值時,他只需將它們以相同的方式加密添加到他的餘額中,這對於該方案來說很方便。

類似地,愛麗絲從她的餘額中減去相同的值,僅作為 Y 使用其公鑰。

隱藏收件人和發件人

UTXO 中的混合“輸出”出現在加密貨幣誕生之初,有助於隱藏發送者。 為此,發送者本人在進行轉賬時,會在區塊鏈中收集隨機“輸出”並將其與自己的“輸出”混合。 然後,他用環簽名對“輸出”進行簽名,這是一種加密機制,可以讓驗證者相信發送者的硬幣屬於所涉及的“輸出”。 當然,硬幣本身並沒有被花掉。

然而,為了隱藏收件人,我們將無法生成虛假的“輸出”。 因此,在 UTXO 中,每個“輸出”都有自己唯一的地址,並且以密碼方式與這些幣的接收者的地址相關聯。 目前,在不知道收件人密鑰的情況下,無法揭示唯一的“退出”地址與收件人地址之間的關係。

在基於帳戶的模型中,我們不能使用一次性地址(否則它已經是一種“退出”模型)。 因此,接收者和發送者必須混合在區塊鏈中的其他帳戶中。 同時,從混合賬戶中扣除加密的 0 個幣(如果接收者是混合的,則添加 0),而不實際改變其真實餘額。

由於發送者和接收者總是有一個永久地址,因此在傳輸到相同地址時需要使用相同的組進行混合。 通過一個例子可以更容易地看出這一點。

假設愛麗絲決定向鮑勃的慈善基金會捐款,但希望這筆轉賬對外部觀察者保持匿名。 然後,為了在發件人字段中偽裝自己,她還進入了亞當和阿黛爾的賬戶。 並在收件人字段中隱藏鮑勃,此外,還隱藏本和比爾的帳戶。 在製作下一部分時,愛麗絲決定將亞歷克斯和阿曼達寫在她旁邊,將布魯斯和班揚寫在鮑勃旁邊。 在這種情況下,在分析這兩個交易中的區塊鏈時,只有一對相交的參與者——Alice和Bob,這使得這些交易去匿名化。

關於基於賬戶的區塊鏈中的匿名性

交易競賽

正如我們已經提到的,為了在基於帳戶的系統中隱藏其餘額,用戶對其餘額和轉賬金額進行加密。 同時,他必須證明其賬戶餘額仍為非負值。 問題在於,在形成交易時,用戶會建立有關其當前帳戶狀態的證明。 但是,如果 Bob 向 Alice 發送一筆交易,並且該交易在 Alice 發送的交易之前被接受,會發生什麼情況? 那麼Alice的交易將被視為無效,因為餘額證明是在Bob的交易被接受之前建立的。

關於基於賬戶的區塊鏈中的匿名性

在這種情況下,第一個解決方案是凍結帳戶,直到交易發生。 但這種方法並不合適,因為除了在分佈式系統中解決此類問題的複雜性之外,在匿名方案中也不會明確要阻止誰的帳戶。

為了解決這個問題,該技術將傳入和傳出交易分開:支出資金對資產負債表有立即影響,而收入則有延遲影響。 為此,引入了“紀元”的概念——一組固定大小的塊。 當前的“紀元”是通過將塊高度除以組大小來確定的。 處理交易時,網絡立即更新發送者的餘額,並將接收者的資金添加到累加器中。 僅當新的“紀元”開始時,收款人才能使用累積的資金。

因此,用戶可以發送交易,無論他接收資金的頻率如何(當然,只要他的餘額允許)。 紀元大小是根據塊在網絡中傳播的速度以及事務進入塊的速度來確定的。

該解決方案在保密傳輸的情況下效果很好,但對於匿名交易,正如我們稍後將看到的,它會產生嚴重的問題。

防止重放攻擊

在基於帳戶的區塊鏈中,每筆交易都使用發送者的私鑰進行簽名,這使驗證者相信該交易尚未被修改並且是由該密鑰的所有者創建的。 但是,如果在傳輸通道上偵聽的攻擊者截獲此消息並發送完全相同的第二條消息怎麼辦? 驗證者將驗證交易的簽名並確信其作者身份,網絡將再次從發送者的餘額中註銷相同的金額。

這種攻擊稱為重放攻擊。 在 UTXO 模型中,此類攻擊是不相關的,因為攻擊者將嘗試使用已花費的輸出,這本身是無效的並被網絡拒絕。

為了防止這種情況發生,交易中嵌入了一個包含隨機數據的字段,稱為隨機數或簡稱為“鹽”。 當重新發送帶有“鹽”的交易時,驗證者會查看之前是否使用過該隨機數,如果沒有,則認為該交易有​​效。 為了不在區塊鏈中存儲用戶隨機數的整個歷史記錄,通常在第一筆交易中將其設置為零,然後加一。 網絡只需要檢查新交易的隨機數是否與之前的一筆不同。

在匿名傳輸方案中,出現了驗證交易隨機數的問題。 我們無法將隨機數顯式綁定到發送者的地址,因為顯然,這會使傳輸去匿名化。 我們也無法向所有參與賬戶的隨機數添加一個,因為這可能與正在進行的其他轉賬發生衝突。

Zether 的作者建議根據“紀元”以加密方式生成隨機數。 例如:

關於基於賬戶的區塊鏈中的匿名性
這裡 x 是發送者的密鑰,並且 格波赫 — 紀元的附加生成器,通過散列“Zether +”形式的字符串獲得。 現在問題似乎已經解決了——我們不公開發送者的隨機數,也不干擾不相關參與者的隨機數。 但這種方法有一個嚴重的限制:一個賬戶在每個“時期”只能發送一筆交易。 不幸的是,這個問題仍未解決,目前我們認為匿名版本的 Zether 幾乎無法使用。

零知識證明的複雜性

在UTXO中,發送者必須向網絡證明他沒有花費負數,否則就有可能憑空產生新的幣(為什麼這是可能的,我們在之前的一篇文章中寫過) 用品)。 並且還要在“入口”上籤上環簽名,以證明正在揉捏的硬幣中有屬於他的資金。

在基於賬戶的區塊鏈的匿名版本中,證明表達式要復雜得多。 發件人證明:

  1. 發送的金額為正;
  2. 餘額仍為非負值;
  3. 發送方正確加密轉賬金額(包括零);
  4. 餘額上的餘額僅針對發件人和收件人發生變化;
  5. 發件人擁有其帳戶的密鑰,並且他確實存在於發件人列表中(在相關人員中);
  6. 交易中使用的隨機數是正確的。

對於如此復雜的證明,作者使用了混合 防彈 (順便說一下,其中一位作者參與了它的創作)和 西格瑪協議,稱為西格瑪子彈。 這種說法的形式化證明是一項相當困難的任務,它極大地限制了願意實施該技術的人數。

結果如何呢?

我們認為,Zether 為基於賬戶的區塊鏈帶來隱私的部分現在就可以使用。 但目前,該技術的匿名版本對其使用及其實施的複雜性施加了嚴格的限制。 然而,不應該低估的是,作者在幾個月前才發布了它,也許其他人會找到解決當今存在的問題的方法。 畢竟,科學就是這樣進行的。

來源: www.habr.com

添加評論