用戶資產默克爾樹證明v2.0
- 資產審計
1. 什麼是默克爾樹:
為了使的用戶能夠確信,HTXHTX擁有每一個使用者的真實並且完整的帳戶數據,我們嘗試構建了默克爾樹,運用默克爾樹,可以使的我們所有的用戶獨立而確真的驗證他們對應的財產是完整無二的存儲於HTX平臺中,而又不需要洩漏其他任何使用者的任何資訊。 使用者無需第三方機構的介入,只需要下載自己所特有記錄的id哈希以及默克爾根和證明路徑就可以證明他們的財產是由HTX 1:1所持有的。
默克爾樹 (Merkle Tree) 是 Ralph Merkle 於 1979 年提出並以自己名字命名的一種資料結構。 默克爾樹是比特幣和乙太坊等加密貨幣常用的資料結構。 透過默克爾樹,多個資料可以合併成一個資料,並且能儲存較大規模的資料匯總結果,同時還可以透過密碼學的手段證明相應的資料壓縮在匯總結果中。 透過驗證默克爾樹樹根的資料完整性,可以證明構成默克爾樹的所有資料完整性。 默克爾樹的樹葉部分,是由資料集中所有資料的雜湊值所構成。 具體而言,樹葉構造會連接兩個相鄰的雜湊對,群組在一起后再次進行雜湊處理併產生母雜湊值。 重複進行的群組和雜湊過程,最後產生頂層根雜湊,也就是默克爾樹根 (Merkle Root)。 默克爾樹根的雜湊值包含整棵默克爾樹所有資料的雜湊值,篡改或改動任何節點的資料都會導致默克爾樹根雜湊值改動而有完全不同的值,因此可以保證默克爾樹的資料完整性。
簡單來說,默克爾樹得名於其發明者拉爾夫默克爾,密碼學中是很常用的數據結構,能夠用於去實現驗證大量數據完整性,而又不透露額外資訊。 其能夠將各種數據形式表現為一種無法反解的哈希值,每個使用者可以得到他們自己的用戶證明,其中包含默克爾證明中的證明路徑以及默克爾根,以及使用者哈希,於是使用者可以利用默克爾樹的屬性驗證他們個人使用者的資訊以及財產是否包含在HTXHTX的財產資訊之中。 同時結合零資產證明中的默克爾相關電路約束所構成的儲備金證明,使用者可以驗證HTXHTX的交易所財產(也就是所有使用者財產數據)是由每一個用戶數據計算準確無二計算得到的,這樣使用者可以知曉自己的財產由HTXHTX所持有,且按照1:1的比例保證擁有對應每一個用戶的儲備金。 簡單來說,用戶通過默克爾樹,可以確保自己的所有財產資訊準確無二的
2. 默克爾樹升級:
我們採用了默克爾樹v2.0機制來作為百分百儲備金的驗證證明。
在此之前我們驗證的主要流程為:
1.對所有使用者的餘額進行匿名快照產生默克爾樹,默克爾樹包含了交易所所有使用者持有資產的加密資料
2.從默克爾樹最後一個節點取得默克爾樹根,從默克爾樹根可以取得快照時的單一雜湊值(合併所有交易的雜湊值)及資產總餘額
3.驗證HTX鏈上錢包地址的數位簽名,證明地址的擁有權,並取得可公開核對的資產總餘額。
4.最後,透過比對和鏈上錢包位址中的總餘額是否大於默克爾樹所顯示的資產總樹,證明用戶資產受100%儲備金支撐,展現HTXHTX對用戶資產的兌付能力。
- 升級:
我們將原始的默克爾樹升級為了稀疏默克爾樹,其龐大的樹構成以及多空哈希根所具備更強的容錯性,此外較大的樹,能夠容納更多的使用者。 我們從原版本的五種幣種種類升級為了200種幣種種類,此外增加了使用者總正資產以及總負債,用於同時哈希的計算。 按照此規則構成的稀疏默克爾樹能夠保證使用者每一個節點的獨特性,並且能夠完全的囊括使用者相關的所有財產。 關於稀疏默克爾樹的詳細內容下述。
如何針對單用戶進行默克爾證明:
用戶可以從交互端,核對uid並下載屬於自己的獨特的userproof證明檔。 使用者下載驗證端,讀入自己的userproof檔就可以進行使用者的默克爾證明,驗證自己的所有財產資訊是確真為我們所擁有的。
使用者userproof文件構成:
包含該用戶對應稀疏默克爾樹中的索引位置,uid加密后的id哈希以及全部幣種財產資訊,根哈希,和對應該使用者的證明路徑。 利用其中的財產資訊和id哈希重新計算葉子結點哈希,結合其中驗證路徑哈希,就可以計算並比對最終的根,完成默克爾證明。 (圖解形式)
3. 稀疏默克爾樹
相比於之前的版本我們升級了我們的默克爾樹版本為稀疏默克爾樹的v2.0版本,
圖 1
稀疏默克爾樹的大小是預先設定好的,並且每個葉子結點保存在稀疏默克爾樹的時候,空結點是無需存儲的。 這也就意味著我們只需要存儲已經設置好的用戶結點。 如圖1示
其優勢具體包括:
- 強擴展性:隨著數據量的增加,傳統默克爾樹的高度可能會增加,導致驗證所需的計算量也增加。 稀疏默克爾樹可以通過將空的分支合併來減少樹的高度,從而在某種程度上提高了驗證的效率和可擴充性。
- 可動態更新: 相較於一半的默克爾樹如果需要更新數據,就需要重新計算整個樹的哈希值。 稀疏默克爾樹可以更加高效地支援動態數據的插入和刪除,只需要更新葉節點和一小部分中間節點的哈希值,而不需要重新構建整個樹。
- 快速驗證: 稀疏默克爾樹的結構使得可以在某些情況下更快速地驗證數據的完整性,因為不需要逐層遍歷整個樹。
利用我們上一步計算得到的葉子哈希,並確定我們要添加葉子結點的索引位置,就可以將使用者添加到稀疏默克爾樹之中。 並根據使用者的索引位置就可以得到此使用者的證明路徑,用於驗證該使用者是否確真的位於樹的構成中,保存了您的財產數據)
4. 葉子結點是如何構成的?
- 什麼是hash256計算?
對於任意長度的消息,SHA256都會產生一個256位的哈希值,這一哈希值相當於是個長度為32個字節的陣列,通常有一個長度為64的十六進位字元串來表示,其中1個字節=8位,一個十六進位的字元的長度為4位。
例如,對於消息:
BlockChain
經過Hash256,即能得到一個長度為64的16進位值:
3a6fed5fc11392b3ee9f81caf017b48640d7458766a8eb0382899a605b41f2b9
而該哈希值就能夠保證單向(未知原始消息無法反向計算得到哈希值)且避免碰撞(不同消息難以出現重複的哈希值)這兩大特點,
- 葉子結點的構成
我們首先進行uid的加密計算獲得對應每個使用者id哈希值:
圖 2
利用hashID這一獨一無二的標識就可以查詢到每個使用者獨特的財產以及個人資訊,且hash256不存在線性時間反算求解的可能,這就意味著不可能有其他人有手段能夠暴力計算出使用者自己的hashID(除非這個人知曉您的Uid)。
更進一步,使用者的葉子結點的哈希值,是通過hashID以及所有幣種資訊財產承諾加之使用者的總資產和總負債計算得到,這就確保了,這一獨一無二的hash本身是包含使用者的所有帳戶資訊的。
這一計算過程您可以從圖示中理解:
圖 3
- 為什麼hash不會出現重複的情況?
由於每個使用者的uid是獨一無二的,所以每個使用者的hashID也必然是獨一無二的,在絕大部分情況中,不同用戶之間的所有財產相關的帳戶資訊是很難完全相同的,因此,其哈希值完全相同的概率也是極其小的,再加之hashID所保證的獨特性,每個帳戶的帳戶ID是不太可能出現相同的情況的。
- 為什麼其他使用者不能得到您的哈希值?
SHA-256的核心安全屬性之一是抗碰撞性(collision resistance),這意味著找到兩個不同的輸入,它們產生相同的哈希值是非常困難的。 從哈希值反推出原始輸入,涉及到找到滿足哈希值的所有可能輸入。 這被稱為“逆映射”或“逆哈希”,但在目前的計算環境下,由於哈希函數的設計目標是阻止逆向計算,要實現逆向計算SHA-256是非常困難的。 因此其他人只有完全掌握您的賬戶屬性以及uid才可能獲得您的哈希值。