Vitalik :中心化交易所如何做資金證明?

vitalik
2022-11-20 17:50:14
收藏
這篇文章將深入探討試圖讓交易更接近無信任的一兩步的歷史嘗試,這些技術的局限性,以及一些依靠ZK-SNARKs和其他先進技術的更新和更強大的想法。

作者:Vitalik

編譯:董一鳴,ChainCatcher

每當一個重要的中心化交易所爆炸時,一個常見的問題就會被提出來,那就是我們是否可以使用加密技術來解決問題。交易所可以創建加密證明,表明他們在鏈上持有的資金足以支付他們對用戶的負債,而不是僅僅依靠政府許可、審計師和審查公司治理和經營交易所的個人背景等 "法定 "方法。

交易所可以建立一個系統,在未經儲戶同意的情況下,根本無法提取他們的資金。潛在地,我們可以探索在 "不要做壞事 "的有抱負的好人CEX和 "不能做壞事",但現在效率低下和洩露隱私的鏈上DEX之間的整個光譜。這篇文章將深入探討試圖讓交易更接近無信任的一兩步的歷史嘗試,這些技術的局限性,以及一些依靠ZK-SNARKs和其他先進技術的更新和更強大的想法。

收支平衡表 Merkle tree :老 的清償能力證明

交易所最早嘗試用密碼學方法證明他們沒有欺騙他們的用戶,這可以追溯到很久之前。2011年,當時最大的比特幣交易所MtGox通過發送一筆交易,將424242個BTC轉移到一個預先公布的地址,證明他們有資金。2013年,人們開始討論如何解決問題的另一面:證明客戶存款的總規模。如果你證明客戶的存款等於X("負債證明" ),並證明X幣的私鑰的所有權("資產證明" ),那麼你就有了償付能力的證明:你已經證明交易所有資金來償還所有的存款人。

證明存款的最簡單方法是簡單地發布一個(用戶名,餘額)對的列表。每個用戶都可以檢查他們的餘額是否包括在列表中,任何人都可以檢查完整的列表,以查看(i)每個餘額都是非負的,(ii)總金額為賠索金額。當然,這破壞了隱私,所以我們可以稍微改變一下方案:發布一個(哈希(用戶名, salt), 餘額)對的列表,並私下向每個用戶發送他們的salt值。但即使這樣也會洩露餘額,而且會洩露餘額的變化模式。保護隱私的願望把我們帶到了下一個發明:Merkle tree(又稱哈希樹或梅克爾樹)技

image

綠色:Charlie節點。藍色:David節點,也是Charlie將接收到的節點,作為他證明的一部分。黃色:根節點,向大家公開展示。

Merkle tree技術是將客戶的餘額表放入Merkle sum tree中。在Merkle sum tree中,每個節點都是一個(餘額,哈希)對。底層的葉子節點代表個別客戶的餘額和salted的用戶名哈希值。在每個高層節點中,餘額是下面兩個餘額的總和,而哈希值是下面兩個節點的哈希值。Merkle sum證明,就像Merkle證明一樣,是樹的一個 "分支",由從葉到根的路徑上的姐妹節點組成。

交易所將向每個用戶發送其餘額的Merkle sum證明來證明他們的餘額。然後,用戶將得到一個保證,他們的餘額被正確地包括在總數的一部分。一個簡單的代碼示例 可以從 ++這裡++找到

這種設計中的隱私洩露比完全公開的列表要低得多,而且可以通過每次發布根目錄時對分支進行洗牌來進一步減少隱私洩露,但一些隱私洩露還是存在的。Charlie可以得知某人的餘額為164ETH,有兩個用戶的餘額加起來為70ETH,等等。一個控制許多賬戶的攻擊者仍有可能了解到交易所用戶的大量信息。

該方案的一個重要的微妙之處在於負餘額的可能性:如果一個交易所有1390ETH的客戶餘額,但只有890ETH的儲備,試圖通過在樹上的某個假賬戶下增加一個-500ETH的餘額來彌補差額怎麼辦?事實證明,這種可能性並沒有破壞該方案,儘管這就是我們特別需要Merkle sum樹而不是普通Merkle樹的原因。假設Henry是交易所控制的假賬戶,交易所把-500ETH放在那裡。

image

Greta的證明驗證將失敗:交易所將不得不給她Henry的-500 ETH節點,她將拒絕這個節點,因為它是無效的。Eve和Fred的驗證也會失敗,因為Henry上面的中間節點的ETH總量為-230,所以也是無效的!為了逃脫盜竊,交易所將不得不希望整個樹的右半部分沒有人檢查他們的餘額證明。

如果交易所能夠識別出價值500ETH的的用戶,他們相信這些用戶要麼不會費心檢查證明,要麼在抱怨從未收到證明時不會被相信,那麼他們就有信心逃脫偷竊的懲罰。但是,交易所也可以將這些用戶從樹上排除,從而達到同樣的效果。

因此,如果只是為了實現負債證明的目標,Merkle樹技術基本上和負債證明方案(proof-of-liabilities)一樣好,但它的隱私屬性仍然不理想。你可以通過以更巧妙的方式使用Merkle樹,比如++讓每個satoshi或wei成為一個單獨的葉子++,但最終隨著更現代的技術,還有更好的方法來做到這一點。

用ZK-SNARKs改善隱私和穩健性

ZK-SNARKs是一項強大的技術。ZK-SNARKs對密碼學的作用可能就像變壓器對人工智能的作用一樣:它是如此強大的一種通用技術,以至於它將完全碾壓幾十年前開發的特定應用技術中的一大堆問題。因此,當然,我們可以使用ZK-SNARKs來大大簡化和改善責任證明協議中的隱私。

我們可以做的最簡單的事情是將所有用戶的存款放入一個Merkle樹(或者更簡單,一個++KZG承諾++),並使用ZK-SNARK來證明該樹中的所有餘額都是非負的,並且加起來等於某個聲稱的值。如果我們為隱私添加一層哈希,給每個用戶的Merkle分支(或KZG證明)將不會透露任何其他用戶的餘額。

image

使用KZG承諾是避免隱私洩漏的一種方法,因為不需要提供"姐妹節點"作為證明,一個簡單的ZK-SNARK可以用來證明餘額的總和,並且每個餘額都是非負的。

我們可以用一個特殊用途的ZK-SNARK來證明上述KZG中餘額的和與非負性。這裡有一個簡單的例子,可以做到這一點。我們引入一個輔助多項式,它 "建立了每個餘額的位"(為了舉例,我們假設餘額在),並且每16個位置都跟蹤一個帶有偏移的運行總數,因此只有當實際總數與聲明的總數一致時,它的總和才為零。如果z是-128次的單位根,我們可以證明以下等式。

image

有效設置的第一個值是0 0 0 0 0 0 0 0 0 0 1 2 5 10 20 -165 0 0 0 0 0 0 0 0 1 3 6 12 25 50 -300 …

關於如何將這樣的方程轉化為多項式檢查,然後再轉化為ZK-SNARK,請參見我在++ZK-SNARK的文章中++++這裡++++這裡++的進一步解釋。這不是一個最佳協議,但它確實顯示了這些天來這些類型的加密證明並不那麼詭異!

只需幾個額外的公式,像這樣的約束系統就可以適應更複雜的環境。例如,在一個槓桿交易系統中,個別用戶出現負餘額是可以接受的,但前提是他們有足夠的其他資產來覆蓋有一些抵押保證金的資金。一個SNARK可以用來證明這個更複雜的約束,讓用戶放心,交易所不會通過++暗中++ ++豁免++ ++其他用戶++的規則來給他們的資金帶來風險。

在更長遠的未來,這種ZK債務證明也許不僅可以用於客戶在交易所的存款,還可以用於更廣泛的貸款。任何人在貸款時,都会將一條記錄放入一個包含該貸款的多項式或樹中,而該結構的根將被公布在鏈上。這將讓任何尋求貸款的人向貸款人提供他們還沒有借出太多其他貸款的ZK證明。最終,法律創新甚至可以使已經以這種方式承諾的貸款比沒有承諾的貸款具有更高的優先級。這將我們引向與++"去中心化社會++ ++:++ ++尋找Web3的靈魂 "++中討論的一個想法完全相同的方向:通過某種形式的 "靈魂代幣(soulbound token)",在鏈上建立一個負面的聲譽或抵押品的概念。

資產證明

資產證明的最簡單版本是我們上面看到的協議:為了證明你持有X枚幣,你只需在某個預先約定的時間或在數據字段包含 "這些資金屬於幣安"的交易中移動X個幣。為了避免支付交易費用,你可以簽署一個鏈外信息來代替;比特幣和以太坊都有鏈外簽名信息的標準。

這種簡單的資產證明技術有兩個實際問題。

  • "冷庫" 處理
  • 抵押品的雙重用途

出於安全考慮,大多數交易所將絕大多數客戶的資金保存在 "冷庫 "中:在離線計算機上,交易需要手動簽署並轉移到互聯網上。我曾經為個人資金使用設置的冷庫涉及到一台永久離線的計算機,它會生成一個包含簽名交易的二維碼,我可以用我的手機掃描。現代交換協議更加瘋狂,經常涉及到幾個設備之間的多方計算。鑑於這種設置,即使是一個額外的信息來證明對一個地址的控制,也是個昂貴的操作!

一個交易可以採取以下幾種路徑:

  • 保留幾個公開的長期使用的地址。交易所將生成幾個地址,對每個地址發布一次證明,以證明所有權,然後重複使用這些地址。這是迄今為止最簡單的方案,儘管它確實在如何保護安全和隱私方面增加了一些限制。
  • 設置 許多地址,隨機地證明幾個。交易所會有許多地址,也許甚至每個地址只使用一次,並在一次交易後退役。在這種情況下,交易所可能有一個協議,不時地隨機選擇幾個地址,必須 "打開 "以證明所有權。一些交易所已經用審計師做了類似的事情,但原則上這種技術可以變成一個完全自動化的程序。
  • 更複雜的ZKP選項。例如,一個交易所可以將其所有的地址設置為1/2個多重簽名,其中每個地址的密鑰是不同的,另一個是某個 "重大"緊急備份密鑰的盲版,以某種複雜但非常高安全的方式存儲,例如12/16個多重簽名。為了保護隱私和避免暴露其地址的整個集合,交易所甚至可以在區塊鏈上運行一個零知識證明,它證明鏈上所有具有這種格式的地址的總餘額。

另一個主要問題是防止抵押品的雙重用途。交易所可以很容易地在彼此之間來回運送抵押品以進行儲備證明,這將使他們在實際沒有償付能力時假裝有償付能力。理想情況下,償付能力的證明是實時進行的,在每個區塊之後都會更新證明。如果這不現實,次優選擇是在不同的交易所之間協調一個固定的時間表,例如,在每週二UTC 14點證明儲備。

最後一個問題是:能在法幣上做資產證明嗎?交易所不只是持有加密貨幣,他們還在銀行系統內持有法幣。在這裡,答案是:可以,但這樣的程序將不可避免地依賴於 "法幣 "信任模型:銀行本身可以證明餘額,審計師可以證明資產負債表,等等。考慮到法幣是不可加密驗證的,這是在該框架內所能做到的最好的,但它仍然值得做。

另一種方法是將一個運行交易所和處理USDC等資產支持的穩定幣的實體和另一個處理在加密貨幣和傳統銀行系統之間移動的現金進出過程的實體(USDC本身)乾淨地分開。因為USDC的 "負債 "只是鏈上的ERC20代幣,負債證明是 "免費的",只需要資產證明。

Plasma 和validiums:我們可以使CEXs不受拘束嗎?

假設我們想更進一步:我們不想僅僅證明交易所有資金來償還用戶的錢。相反,我們想完全防止交易所竊取用戶的資金。

這方面的第一個重大嘗試是Plasma,這是一個在2017年和2018年在以太坊研究圈流行的擴展解決方案。Plasma的工作原理是將餘額分割成一組單獨的 "硬幣",每個硬幣都被分配了一個索引,並位於Plasma區塊的Merkle樹中的一個特定位置。對一個硬幣進行有效的轉移需要將交易放到樹的正確位置,而樹的根部會在鏈上公布。

image

Plasma 一個版本的過度簡化示意圖。硬幣存放在智能合約中,在提現時強行執行Plasma協議的規則。

OmiseGo試圖在這個協議的基礎上做一個去中心化的交易所,但從那時起,他們就轉向了其他的想法---就這一點而言,Plasma集團本身也是如此,它現在是optimistic EVM的rollup項目++Optimism++

在2018年設想的Plasma的技術局限性(例如,++證明硬幣碎片化++)是不值得一看的。自2018年Plasma論述的高峰期以來,ZK-SNARKs在與擴展有關的用例中變得更加可行,正如我們上面所說,ZK-SNARKs改變了一切。

Plasma想法的更現代版本是Starkware所謂的++validium++:基本上與ZK-rollup相同,只是數據被保存在鏈外。這種結構可以用於很多用例,可以想象任何集中式服務器需要運行一些代碼並證明其正確執行代碼的情況。在一個 validium內 ,運營商沒有辦法竊取資金,儘管取決於實施的細節,如果運營商消失,一些數量的用戶資金可能會被卡住。

這一切都真的很好:CEX與DEX遠不是二元對立的關係,事實證明,它有一整套的選擇,包括各種形式的混合中心化,你可以獲得一些好處,如效率,但仍有許多加密護欄,防止中心化的運營商參與大多數形式的濫用。

image

但是,這個設計空間的右半部分,我們還是有必要討論一下最基本的問題:處理用戶錯誤。到目前為止,最重要的錯誤類型是:如果用戶忘記了他們的密碼,丟失了他們的設備,被黑客攻擊,或以其他方式失去了對他們賬戶的訪問,該怎麼辦?

交易所可以解決這個問題:首先是電子郵件恢復,如果連這個都失敗了,可以通過KYC進行更複雜形式的恢復。但是,為了能夠解決這樣的問題,交易所需要真正擁有對硬幣的控制權。為了有能力以好的理由恢復用戶賬戶的資金,交易所需要有權力,也可能被用來以壞的理由竊取用戶賬戶的資金。這是一個不可避免的權衡。

理想的長期解決方案是依靠自我保管,並輔以++多重簽名++ ++和社會恢復錢包++等技術,幫助用戶處理緊急情況。但在短期內,有兩個明顯的替代方案,其成本和收益明顯不同。

image

結論:未來更好的交易所

在短期內,有兩個明顯的交易所 "類別":托管型交易所和非托管型交易所。今天,後一類只是DEXes,如Uniswap,在未來,我們也可能看到加密學上"受約束 "的CEXes,用戶的資金被保存在類似validium智能合約的東西中。我們也可能看到半托管的交易所,我們用法幣而不是加密貨幣信任他們。

這兩種類型的交易所都將繼續存在,而提高托管交易所安全性的最簡單的向後兼容的方法是增加準備金證明。這包括資產證明和負債證明的結合。為這兩者制定良好的協議存在技術挑戰,但我們也應該盡可能地在這兩方面取得進展,並盡可能地將軟件和流程開源,以便所有交易所都能受益。

在更長遠的未來,我希望我們越來越接近所有交易所都是非托管的,至少在加密貨幣方面。錢包恢復會存在,對於處理小金額的新用戶,以及出於法律原因需要這種安排的機構,可能需要有高度集中的恢復選項,但這可以在錢包層而不是在交易所本身內完成。++magic.link++++Polymarket++等平台的互動方式就是這種方法的一個例子。在法幣方面,傳統銀行系統和加密貨幣生態系統之間的流動可以通過資產支持的穩定幣(如USDC)的本地現金流入/現金流出流程來完成。然而,在我們完全達到這個目標之前,還需要一段時間。

特別感謝Balaji Srinivasan,以及Coinbase、Kraken和幣安工作人員的討論。

鏈捕手ChainCatcher提醒,請廣大讀者理性看待區塊鏈,切實提高風險意識,警惕各類虛擬代幣發行與炒作,站內所有內容僅係市場信息或相關方觀點,不構成任何形式投資建議。如發現站內內容含敏感信息,可點擊“舉報”,我們會及時處理。
ChainCatcher 與創新者共建Web3世界