运行模式

现在,验证区块链客户端的方法主要有两种:完整节点和SPV客户端。其他不被推荐的方法,像server-trusting,不列入讨论范围。

完整节点

完整节点是最先出现且最安全的一个模式,由比特币核心支撑,也被称为“thick”和“完整链”客户端。这种安全模式确保区块链的验证是通过下载、验证从创世块到最新发现的区块完成的。它运用特殊区块的高度来验证网络客户端。

要愚弄一个客户端,攻击者需要提供一个替代的完整块链历史记录。这比提供“真的”块链难度更大,因为这是不可能的,最长的链必然是真正的链。建议6次确认后,愚弄客户端变得棘手,因为只有一个诚实节点是需要有完整的块链的。

简捷支付验证(SPV)

在比特币的原始论文中详述了一个替代的方法,即一个这样的客户端:它只在初始同步过程下载块头,并根据需要从完整节点中下载交易历史。不管总区块的大小是多少,这种模式仅在每块头的80字节中与区块链的高度成线性关系,或是上升到每年4.2MB。

正如白皮书所述,块头中的Merkle root(根节点)连同Merkle branch可以向SPV客户端证明区块链中的区块嵌入了有问题的交易。这并不能确保验证嵌入的交易。相反,它表明了进行“双花”攻击所需要的工作量。

块链的区块深度与在特定区块上执行的累积难度相对应。SPV的客户端知道Merkle root(根节点)和相关交易信息,并向完整节点请求各个区块的Merkle branch。一旦检索到Merkle branch,就证明该区块存在交易。SPV客户端就可以查看区块深度,实现交易验证和交易安全。用恶意节点对嵌入无效交易的用户进行攻击的代价,会随着区块上的累积难度升高,因为单独的恶意节点会挖出伪造的链。

SPV潜在缺陷

如果简单地实现SPV,SPV客户端有几个重要缺陷。

首先,虽然SPV客户端不会轻易上当,将区块中不存在的交易当作存在,反之却不成立。一个完整的节点可以通过疏漏撒谎,让SPV客户端相信没有交易发生。这可以被认为是拒绝服务攻击的一种形式。一种缓解策略是与许多完整节点连接,然后向每个节点发送请求。然而,这种策略会被网络划分或女巫攻击所打败的,因为身份从本质上说是免费的,并提高了带宽的要求。必须小心,以确保客户端没有从诚实节点中切断。

其次,SPV客户端只向与它的密钥相对应的完整节点请求交易。如果SPV客户端下载了所有区块,然后丢弃不需要的,这可以节省非常多的带宽。如果它们只向完整节点请求特定交易的区块,这就允许完整节点与用户对应的公网地址的完整视图。这是一个巨大的隐私泄漏,并允许攻击,如客户端拒绝服务,为客户,用户或地址是由那些运行全节点受到冷遇,以及资金的琐碎链接。客户端可以简单的伪造很多假冒的交易请求,但是这将给SPV客户端上带去很大的压力,并能最终完全战胜瘦客户机的目的。

为了缓解后一个问题,布鲁姆过滤器已成为解决区块数据请求混淆和压缩的方法。

Last updated