隨著我在比特幣開發(fā)方面獲得越來越多的經(jīng)驗,我不時地有一個頓悟,它徹底改變了我的思維方式、我的想法以及我如何處理錢包軟件中的基本構件。事實上,每次發(fā)生這種情況時,我都會在腦海中以新的視角徹底重寫我正在創(chuàng)建的錢包。
在過去的幾天里,我想我意識到還有另一種更好的方式來做我現(xiàn)在正在做的事情。不幸的是,重寫我的錢包這次不是一個選項,因為Wasabi 錢包有一個重要的用戶基礎,它可能太冒險重構軟件的本質(zhì)。但至少我可以和你們分享這些見解。
1. 解決心智模型
比特幣錢包有地址,這些地址里有余額。
我創(chuàng)建了我的第一個比特幣錢包:DotNetWallet,附帶一篇文章:構建自己的比特幣錢包。這使用了這個心智模型。但比特幣網(wǎng)絡不是這樣運作的。區(qū)塊鏈上沒有地址,并且根據(jù)地址組織基本數(shù)據(jù)結(jié)構可以防止將來進行任何遠程高級操作。
2. 交易心理模型
下一步是考慮交易而不是地址。我的第二個比特幣錢包: HiddenWallet,它是這樣工作的:我有一堆交易,每當我必須做些什么的時候都需要向用戶顯示余額,找到未使用的UTXO時,我就從交易中計算出所有東西。這最終使我能夠在任何時候都擁有正確的wallet-state并執(zhí)行各種高級操作,但結(jié)果證明這是非常低效的,我需要添加各種輔助的數(shù)據(jù)結(jié)構,以減少這種痛苦。
3.代幣心理模型
接下來,我轉(zhuǎn)向UTXO模型,或者更確切地說是coin模型。我的代幣很聰明,它們知道一堆事情:誰花了它們,它們花了誰,標簽,匿名設置,等等……我的錢包的下一個迭代,Wasabi錢包使用這個數(shù)據(jù)結(jié)構為基礎。
交易開始了,我將把相關的UTXO組織成代幣。
問題是,隨著軟件的發(fā)展,當錢包變得太鼓時,那些檢查我的代幣列表的算法就會變得非常慢。因此,我也開始改變在錢包外添加代幣的方式,這可以解決一些邊緣情況,但我擔心這會讓一切變得更慢,這只會再次影響性能。我需要一種方法來正確地檢查這些代幣之間的關系。
4. 心智模型圖
我的下一個小技巧是創(chuàng)建心智模型圖。如果我要創(chuàng)建一個圖形數(shù)據(jù)結(jié)構,其中節(jié)點將是我的代幣,加權后的邊將記錄硬代幣之間的關系,這可能會很好。
現(xiàn)在的代幣是頂點,不過我會把一些東西移到邊緣。邊是這里的重要部分。
代幣心智模型的問題是,代幣通過txid相互連接:一枚硬代幣在哪個tx中,又會在哪個tx中使用代幣。但在現(xiàn)實中,代幣之間有著各種各樣的聯(lián)系。例如代幣會將共享腳本也應該連接起來。擁有相同標簽的代幣也會連接起來。
好吧,但是為什么要擔心重量呢?以一筆交易為例:
假設輸入#0(代幣#0)和輸出#2(代幣#1)來自同一個用戶,有6種不同的輸出,所以代幣#1的匿名集是6。但是如果0號代幣和1號代幣在同一個地址呢?那么1號代幣的匿名集就是1。我們在Wasabi中處理這種關系,但是,這些額外的檢查和啟發(fā)是資源密集型的,并且遍布整個代碼庫。最好將這種關系添加到圖的邊緣,完全放棄匿名集的概念,轉(zhuǎn)而使用概率模型。
然后我們可以這樣說:
· 如果沒有標簽或腳本匹配,則代幣1號和代幣0號鏈接的強度為1/6。
· 如果存在標簽、腳本或腳本匹配,則無論交易如何,鏈接的強度都為1。
引入更多的連接,并認識到鏈接的強度是圖的權重。這將使我們能夠做很多瘋狂的圖論的事情。例如,我們將能夠決定哪些代幣是最合理的合并在一起,這將導致最小的隱私妥協(xié),只要看看重量!
蝴蝶效應
像這樣的概念乍一看似乎無關緊要,但是在這些層次上的改變和調(diào)整會產(chǎn)生深遠的影響。之前,我以一種非常有趣的方式討論了導致深遠影響的小變化,所以您可能想嘗試一下。
評論