有两种主要的 比特币 启发式: 共同输入所有权启发式和变更地址检测启发式。
在单个交易中,共同输入-所有权启发式假设输入地址都来自一个实体。然而,在某些情况下,输入地址可以是多个实体。这叫做coinjoin,它会打破这个假设。(例如下图中的地址3)
更改地址检测启发式利用了UTXO的特性。由于很难向接收方发送准确的指定金额的资金,其余的资金将通过更改地址返回给实体。 因此,更改地址检测是必要的,因为它是实体的一部分。在这篇文章中,我们将重点介绍更改地址检测启发式。
更改地址检测启发式
我们公司主要致力于研究最可靠的启发式检测集群。以下是我们在开发启发式时偶然发现的一些方法,以及我们对它们的见解。
地址重用
此方法通过检查输出地址来检测更改的地址。如果存在一个以前从未被观察到的地址,那么它很可能是一个更改地址。这是因为在交易中创建新地址的目的是返回剩余的资金。
要使用这种启发式,它必须匹配以下条件。
1. 这个地址以前一定没有被注意到
2. 它必须是唯一一个以前没有被注意到的地址
该启发式相当简单,但它是最常用的启发式之一。我们相信这种方法能够在很多情况下检测到地址的变化。
十进制数检测
更改地址值中的小数位数的长度假定比任何其他输出地址长得多。这是可能的,因为现在每笔交易都要收取交易费,而且交易中指定的金额往往会降低精确度,以便于快速的人为解释注释(例如,您只需向您的朋友发送5美元,而不是发送4.93美元)。
需要注意的是,在过去,有相当数量的交易降低了更改地址的精度值,但是现在所有的输出地址都包含小数。因此,找到正确的参数对于正确检测更改地址是至关重要的。
在我们的实现中,首先搜索一个十进制长度大于7的地址。如果所有其他输出值的十进制长度都小于2,则接受该地址作为更改地址(可以调整这两个参数以提高性能)。尽管这种启发式由于其简单性而有许多例外,但只要两个参数之间的差异较大,它就可以很好地执行。
平等的输入混币原理
如前所述,混币原理是一种输入地址来自多个实体的情况。这些实体将确切数额的资金发送到多个地址,提高了匿名性。
在上图中,地址21和地址32具有相同的输出值。这使得很难区分是哪个实体把基金送到了地址21和地址32。然而,可以通过简单地计算输出值与输入值子集 (eg(0.006 + 0.005) - 0.01 = 0.001)。混币原理的问题是我们必须从一个交易中处理两个或多个实体。
我们的实现:
1. 通过检查两个或多个输出值是否相等来确定交易是否为混币原理
2. 如果条件1为真,则增加要集群的实体数量
3. 目前,我们假设实体的数量等于具有相同值的输出的数量。
必须实现输入的数量不等于具有相等值的输出的数量的情况,以便准确地估计实体。
脚本类型
一个实体很可能在整个交易中只使用一种脚本类型。这意味着,如果所有输入地址都具有相同的脚本类型,而输出地址不是,那么脚本类型与输入地址相同的输出地址就是更改地址。
在上面的图中,我们可以推断地址 4是更改地址,因为它是唯一具有相同脚本类型的输出地址。
整数
这种启发式假设支付金额通常是某个精度较低的数字,例如$5.50或$19.00。在此假设下,具有不降低精度值的输出地址被认为是更改地址。这种方法的问题是,数字可能以某种形式在不同货币(如美元)的精度降低。因此,我们需要导入交易发生时的汇率,但是资源成本超过了性能。
不必要的输入启发式
这种启发式是基于“什么不需要花费,什么保留”的逻辑。例如,我们有:
2 + 3→4 + 1,其中左:输入量,右:输出量
如果我们想发送1BTC,我们只需要发送两个输入地址中的一个。但是,因为我们发送了4BTC,所以我们需要这两个地址。
这种方法的问题在于,有些钱包使用的代币选择算法不符合这种逻辑。
由于上述问题,没有使用这种启发式。此外,该方法本身的性能较低。
结论
我们探索了一些最广为人知的比特币实体集群启发式。根据我们使用这些技术的经验,我们能够发现这些方法中的许多缺陷,从而使集群变得不可靠。因此我们公司致力于开发能够进行有效集群实体的健壮算法。