有兩種主要的比特幣啟發(fā)式: 共同輸入所有權(quán)啟發(fā)式和變更地址檢測啟發(fā)式。
在單個交易中,共同輸入-所有權(quán)啟發(fā)式假設(shè)輸入地址都來自一個實體。然而,在某些情況下,輸入地址可以是多個實體。這叫做coinjoin,它會打破這個假設(shè)。(例如下圖中的地址3)
更改地址檢測啟發(fā)式利用了UTXO的特性。由于很難向接收方發(fā)送準確的指定金額的資金,其余的資金將通過更改地址返回給實體。 因此,更改地址檢測是必要的,因為它是實體的一部分。在這篇文章中,我們將重點介紹更改地址檢測啟發(fā)式。
更改地址檢測啟發(fā)式
我們公司主要致力于研究最可靠的啟發(fā)式檢測集群。以下是我們在開發(fā)啟發(fā)式時偶然發(fā)現(xiàn)的一些方法,以及我們對它們的見解。
地址重用
此方法通過檢查輸出地址來檢測更改的地址。如果存在一個以前從未被觀察到的地址,那么它很可能是一個更改地址。這是因為在交易中創(chuàng)建新地址的目的是返回剩余的資金。
要使用這種啟發(fā)式,它必須匹配以下條件。
1. 這個地址以前一定沒有被注意到
2. 它必須是唯一一個以前沒有被注意到的地址
該啟發(fā)式相當(dāng)簡單,但它是最常用的啟發(fā)式之一。我們相信這種方法能夠在很多情況下檢測到地址的變化。
十進制數(shù)檢測
更改地址值中的小數(shù)位數(shù)的長度假定比任何其他輸出地址長得多。這是可能的,因為現(xiàn)在每筆交易都要收取交易費,而且交易中指定的金額往往會降低精確度,以便于快速的人為解釋注釋(例如,您只需向您的朋友發(fā)送5美元,而不是發(fā)送4.93美元)。
需要注意的是,在過去,有相當(dāng)數(shù)量的交易降低了更改地址的精度值,但是現(xiàn)在所有的輸出地址都包含小數(shù)。因此,找到正確的參數(shù)對于正確檢測更改地址是至關(guān)重要的。
在我們的實現(xiàn)中,首先搜索一個十進制長度大于7的地址。如果所有其他輸出值的十進制長度都小于2,則接受該地址作為更改地址(可以調(diào)整這兩個參數(shù)以提高性能)。盡管這種啟發(fā)式由于其簡單性而有許多例外,但只要兩個參數(shù)之間的差異較大,它就可以很好地執(zhí)行。
平等的輸入混幣原理
如前所述,混幣原理是一種輸入地址來自多個實體的情況。這些實體將確切數(shù)額的資金發(fā)送到多個地址,提高了匿名性。
在上圖中,地址21和地址32具有相同的輸出值。這使得很難區(qū)分是哪個實體把基金送到了地址21和地址32。然而,可以通過簡單地計算輸出值與輸入值子集 (eg(0.006 + 0.005) - 0.01 = 0.001)?;鞄旁淼膯栴}是我們必須從一個交易中處理兩個或多個實體。
我們的實現(xiàn):
1. 通過檢查兩個或多個輸出值是否相等來確定交易是否為混幣原理
2. 如果條件1為真,則增加要集群的實體數(shù)量
3. 目前,我們假設(shè)實體的數(shù)量等于具有相同值的輸出的數(shù)量。
必須實現(xiàn)輸入的數(shù)量不等于具有相等值的輸出的數(shù)量的情況,以便準確地估計實體。
腳本類型
一個實體很可能在整個交易中只使用一種腳本類型。這意味著,如果所有輸入地址都具有相同的腳本類型,而輸出地址不是,那么腳本類型與輸入地址相同的輸出地址就是更改地址。
在上面的圖中,我們可以推斷地址 4是更改地址,因為它是唯一具有相同腳本類型的輸出地址。
整數(shù)
這種啟發(fā)式假設(shè)支付金額通常是某個精度較低的數(shù)字,例如$5.50或$19.00。在此假設(shè)下,具有不降低精度值的輸出地址被認為是更改地址。這種方法的問題是,數(shù)字可能以某種形式在不同貨幣(如美元)的精度降低。因此,我們需要導(dǎo)入交易發(fā)生時的匯率,但是資源成本超過了性能。
不必要的輸入啟發(fā)式
這種啟發(fā)式是基于“什么不需要花費,什么保留”的邏輯。例如,我們有:
2 + 3→4 + 1,其中左:輸入量,右:輸出量
如果我們想發(fā)送1BTC,我們只需要發(fā)送兩個輸入地址中的一個。但是,因為我們發(fā)送了4BTC,所以我們需要這兩個地址。
這種方法的問題在于,有些錢包使用的代幣選擇算法不符合這種邏輯。
由于上述問題,沒有使用這種啟發(fā)式。此外,該方法本身的性能較低。
結(jié)論
我們探索了一些最廣為人知的比特幣實體集群啟發(fā)式。根據(jù)我們使用這些技術(shù)的經(jīng)驗,我們能夠發(fā)現(xiàn)這些方法中的許多缺陷,從而使集群變得不可靠。因此我們公司致力于開發(fā)能夠進行有效集群實體的健壯算法。