Fast catchup
密钥可以有一个关联的创建时间。 如果钱包知道所有密钥的创建时间,那么当您将其添加到 PeerGroup 时,会为您设置快速追加时间。 在快速追赶时间之前阻止内容不必下载,只需要下载头文件,因此以这种系统的引导方式要快得多。 如果你正在实施一个钱包应用程序,这是一个非常有用的优化,将自动利用。
可以使用 PeerGroup.setFastCatchupTime 明确设置快速追加时间,不过每次添加钱包或将keys添加到钱包时都会重新计算。 时间简单地设置为通过调用 Wallet.getEarliestKeyCreationTime() 获得的所有钱包的最早密钥创建时间的最小值。
Checkpointing
尽管 Fast catchup 和 Bloom Filter(见下文)意味着您可以通过下载标头和一些交易+ Merkle分支来同步链,但有时候这仍然太慢了。标题只有80个字节,但系统每运行10分钟就有一个标题。我们可以通过简单的乘法来看到,系统每年只需要大约4兆字节的数据,因此到2013年7月,新用户仍然必须下载并处理超过16兆字节的数据才能使用。
为了解决这个问题,我们有检查点文件。这些是使用 BuildCheckpoints 工具生成的,该工具可以在bitcoinj源代码的工具模块中找到。 BuildCheckpoints下载头文件并将它们的一部分写入文件。该文件可以随应用程序一起发货。当您创建新的BlockStore对象时,可以使用该文件将其初始化为在钱包快速追赶时间之前(即钱包中最老的密钥的生日)的任何检查点块。那么你只需要从这一点开始下载标题。
Checkpointing 称为检查点,因为与上游的Satoshi客户端一样,一旦您用一个比特币初始化区块存储库,就会拒绝重新组织(过程链分割)。事实上,它甚至不会意识到重组组织已经发生,因为较早的块不存在于块存储中,因此链的替代叉将仅被看作一组孤立块。出于这个原因,BuildCheckpoints 工具不会添加任何运行时间超过一个月的检查点 - 只需要几秒钟就可以下载最后几个月的链表头,并且没有任何分支可能会超过一个月。
Bloom filtering
默认情况下,PeerGroup和Wallet将一起工作来计算Bloom Filter并将其上传到每个连接的节点。Bloom filtering可以紧凑的,隐私的保护钱包中的密钥/地址。当传递给远程节点时,它会改变其行为。不是中继所有的广播交易和块的全部内容,而是匹配它看到的与过滤器相关的每个交易。如果过滤器匹配,该交易将发送到您的应用,否则将被忽略。当交易发送给您时,因为它在一个区块中,所以它带有一个Merkle分支,它在数学上证明交易已包含在该区块中。 BitcoinJ会为每笔交易检查Merkle分支,并拒绝任何企图欺骗您的行为。
Bloom filtering可能会很繁琐。比实际存在于钱包中更多密钥或地址的过滤器还要繁琐。繁琐是有意识的,用来保护您的钱包隐私 - 远程节点无法知道匹配的交易是否真的是您的。理论上,钱包密钥/地址可以分散到每个连接的节点上以获得更多隐私,但bitcoinj目前尚未实现。使用 PeerGroup.setBloomFilterFalsePositiveRate 可以控制添加到Bloom filtering的noise。从本质上讲,这是一个带宽与隐私的权衡 - 较高的FP率会让远程窃听者更加混淆,但是您必须下载更多无用的数据。如果您不调用该方法,则bitcoinj几乎不会出现误报,从而计算Bloom筛选器。将来,此行为可能会更改为默认情况下保护隐私。
请注意,使用Bloom Filter时,您的安全性会降低一小部分 - 而远程同行无法说服您将交易包含在一个块中(如果它们不是这样),则它们可以完全排除交易并因此挂载一种拒绝服务的服务攻击你。如果同伴这样做,那么bitcoinj将不会注意到,并且在重新扫描块链之前,您的余额可能不正确。您无需执行任何操作即可利用Bloom筛选功能。它是由框架为您完成的。从bitcoinj 0.10开始,如果您碰巧连接到旧节点,那么太旧以至于无法支持Bloom过滤的节点会自动断开连接,以避免您被广播流量淹没。