「spv」欺诈证明和SPV(轻量级)客户

原创 一夕笙歌  |  文章来源:币圈达人发布时间:2020-05-24 01:44  阅读 151 次 评论 0 条
众人帮 趣闲赚 牛帮
摘要:

背景
截至2018年6月,比特币区块链的大小约为173GB。这使得每个人几乎不可能运行完整的比特币节点。用户必须使用轻量级/简化支付验证(SPV)客户端,因为由于运行一个完整的比特币节点所需的计算能力,带宽和成本,并不是每个人都可以运行完整

背景

截至2018年6月,比特币区块链的大小约为173GB。这使得每个人几乎不可能运行完整的比特币节点。用户必须使用轻量级/简化支付验证(SPV)客户端,因为由于运行一个完整的比特币节点所需的计算能力,带宽和成本,并不是每个人都可以运行完整的节点。

SPV客户端将相信矿工或节点告诉他们的一切,正如Peter Todd在下面显示数百万比特币的Android客户端截图中所证明的。向钱包发送了210万个BTC输出的交易。Peter Todd修改了其节点的代码,以欺骗比特币钱包,因为钱包无法验证代币数量(代码可以在其GitHub存储库的“Quick-n-dirty hack to lie to SPV wallets”分支中找到)

介绍

在原始比特币白皮书中,中本聪意识到了背景技术中描述的局限性,并引入了简化支付验证(SPV)的概念。在原始比特币白皮书中,中本聪意识到了背景技术中描述的局限性,并引入了简化支付验证(SPV)的概念。它仅下载具有最长工作量证明链的块头,这是通过获得将事务链接到块的Merkle分支来实现的。链中存有Merkle根以及包含Merkle根的区块之后添加的区块,证实了该链的合法性。

在此系统中,当检测到无效块时,完整节点将需要向SPV客户端提供警报(称为欺诈证明)。然后SPV客户机将被提示下载完整的块,并提醒事务确认不一致性。无效的区块不一定具有恶意的意图,而可能是由于其他记帐错误(无论是偶然还是恶意的)。

全节点与SPV客户端

完整的比特币节点包含以下详细信息:

1. 每个区块;

2. 曾经发送过的每笔交易;

3. 所有未使用的交易输出(UTXO)。

SPV客户端包含:

1. 具有与客户有关的交易数据的区块头,包括计算Merkle根所需的其他交易;

2. 要么只是一个没有交易的区块头。

什么是欺诈证明?

欺诈证明是一种通过提供完整节点的机制来证明链无效的机制来提高SPV客户端安全性的方法,而不论其拥有的工作证明数量。欺诈证明也可能有助于比特币扩展争论,因为SPV客户端更易于运行,因此可以解决比特币可扩展性问题。

现有比特币协议中可能存在的欺诈证明

以下是根据现有比特币协议中的特定欺诈案件证明欺诈所需的证据类型:

由于违反无状态条件而导致的无效交易(正确的语法,满足的输入脚本条件等)

在无效交易的情况下,欺诈证明包括:

1. 无效区块的头;

2. 无效交易;

3. 无效区块的Merkle树,其中包含证明树中存在无效事务所需的最少节点数。

由于已花费输入而导致无效的交易

在这种情况下,欺诈证明将包括:

1. 无效区块的头;

2. 无效交易;

3. 无效交易在无效区块内的证明;

4. 包含原始支出事务的区块的头;

5. 原始支出交易;

6. 显示支出事务在支出事务的头区块内的证明;

由于生成的输出值不正确,交易无效

在这种情况下,欺诈证明由区块本身组成。

如果输入不存在,交易无效

在这种情况下,欺诈证明由整个区块链组成。

欺诈证明要求对比特币协议进行更改

以下欺诈证据将要求更改比特币协议本身。

如果旧区块中不存在输入,则交易无效

在这种情况下,欺诈证明包括:

1. 无效区块的头;

2. 无效交易;

3. 证明无效区块的头部包含无效事务;

4. 证明无效区块的头包含与不存在的输入相对应的叶节点;

5. 叶子节点引用的区块(如果存在);

缺少证明树项

在这种情况下,欺诈证明包括:

1. 无效区块的头;

2. 缺少证明树节点的事务;

3. 关于丢失的证明树节点的事务中的哪个输入丢失的指示;

4. 证明无效区块的头包含缺少的证明树节点的转换;

5. 证明证明树包含两个相邻叶节点;

通用欺诈证明(建议的改进)

可见,对不同的欺诈证明要求不同的欺诈证明结构会变得很麻烦。Al-Bassam等人,针对大多数情况提出了一个通用的欺诈证明结构。他们的主张是将整个区块链概括为一个状态转换系统,并使用稀疏的Merkle树将整个状态表示为Merkle根,每个事务都会改变区块链的状态根。这可以通过以下函数来简化:

transaction(state,tx) = State or Error

欺诈证明:通过不诚实的多数手段最大程度地提高轻客户端安全性和扩展区块链

对于比特币区块链,将整个区块链表示为键值存储稀疏Merkle树意味着:

Key = UTXO ID

Value = 1 if unspent or 0 if spent

每笔交易都将改变区块链的状态根,并可以用以下函数表示:

TransitionRoot(stateRoot,tx,Witnesses) = stateRoot or Error

在此提议中,有效的欺诈证明构造将包括:

1. 交易;

2. 前状态根;

3. 后状态根源;

4. 见证人(事务访问/修改状态的所有部分的Merkle证明);

也表示为此函数:

rootTransition(stateRoot, tx, witnesses) != stateRoot

因此一个完整的节点将发送一个轻型客户机/SPV这个数据来证明一个有效的欺诈证据。SPV将计算此函数,如果状态根的转换根与块中的状态根不同,则拒绝该区块。

欺诈证明:通过不诚实的多数手段最大程度地提高轻客户端安全性和扩展区块链

为了节省块空间,可以排除后状态根。然而这确实增加了防欺诈的规模。这在假设SPV客户机连接到至少一个诚实节点的情况下工作。

SPV客户如何工作

SPV客户端使用Bloom过滤器接收与用户相关的事务。Bloom过滤器是一种概率数据结构,用于通过使用布尔值回答更快地检查集合中元素的存在性。

论轻量比特币客户端Bloom过滤器的隐私条款

除了Bloom过滤器之外,SPV客户机还依赖Merkle树-二元结构,其中包含块(apex)和事务(leaf)之间所有散列的列表。使用Merkle树,只需要检查块的一小部分(称为Merkle根)即可证明交易已被网络接受。

欺诈证明是SPV客户端安全的组成部分。但是SPV客户端中的其他组件并非没有问题。

SPV客户端的安全和隐私问题

弱Bloom过滤器与Merkle树设计

2017年8月,发现比特币Merkle树设计的弱点,降低了SPV客户的安全性。这一弱点可以让攻击者利用SPV钱包模拟向受害者支付任意金额,并诱使受害者接受其为有效金额。比特币Merkle树不区分内部节点和叶节点,因此可以被攻击操作,该攻击可以将交易重新解释为节点,而将节点重新解释为交易。这个弱点是由于内部节点没有固定模式,只需要64字节的长度就可以。

暴力攻击尤其会影响自动接受SPV证明的系统,并且攻击费用大概只需要大约300万美元。一个有效的解决方案是确保SPV钱包/客户端永远不会接受任何内部64位节点作为有效事务。

BIP37 SPV的 Bloom过滤器没有相关的隐私功能。它们会泄漏诸如用户的IP地址、多个地址是否属于单个所有者等信息(如果不使用Tor或虚拟专用网络(vpn))。

此外当SPV客户端同步时,由于处理负载(80 GB磁盘读取),SPV客户端面临着针对完整节点的拒绝服务攻击的风险,并且完整节点本身可以通过向请求返回NULL筛选器响应来导致SPV客户端拒绝服务。Peter Todd 恰当地证明了SPV拒绝服务的风险。

改进之处

为了解决这些问题,引入了一个新的概念,称为提交Bloom过滤器,以提高SPV客户端的性能和安全性。在这个概念中,可以用BIP37代替,它使用包含小块整体块大小的过滤器创建每个块的输入,输出和交易的Bloom过滤器摘要(BFD)。

使用所有事务创建第二个Bloom过滤器,并进行二进制比较以确定匹配的事务。这个BFD允许SPV客户端缓存过滤器,而无需重新计算。它还通过允许SPV客户端通过任何带外方法下载块数据来引入半信任的Oracle,以提高SPV客户端的安全性和隐私性。

SPV实施示例

比特币有两种众所周知的SPV实现:bitcoinj和elecrum。后者进行SPV级别验证,将多个elecrum相互比较。它的安全性与bitcoinj非常相似,但由于bitcoinj实现了Bloom filters,它可能具有更好的隐私性。

其他建议的防欺诈改进

纠删码

除了提出的通用防欺诈解决方案之外,防欺诈的另一个数据可用性问题是纠删码。纠删码允许将一段M长的数据扩展成一段N长的数据(“数据块”可以是任意大小),这样N个数据块中的任意M都可以用来恢复原始数据。然后需要区块来提交这个扩展数据的Merkle根,并让轻客户端概率地检查大多数扩展数据是否可用。

根据提出的解决方案,使用纠删码时,对于SPV客户端,以下三个条件之一将成立:

1. 整个扩展数据可用,纠删码正确构建且该区块有效。

2. 整个扩展数据可用,纠删码正确构建,但该区块无效。

3. 整个扩展数据都可用,但是纠删码的构造不正确。

在案例(1)中,区块是有效的,轻型客户端可以接受它。在案例(2)中,预计其他节点将快速构造和转发欺诈证明。在第(3)种情况下,还期望其他节点快速构造并中继一种特殊的欺诈证明,表明纠删码的构造不正确。

Merklix Trees

比特币区块链的另一个建议的欺诈证明改进是通过使用Merklix树进行分块和验证。Merklix树本质上是使用无序集的Merkle树。这也假设每个分片至少有一个诚实节点。使用Merklix证明,可以证明以下内容:

1. 交易在区块中。

2. 交易的输入和输出是否在UTXO集中。

在这种情况下,可以使SPV客户端知道块中的任何无效,并且不能对UTXO集说谎。

支付通道

比特币可以抵御拒绝服务(DoS)攻击。然而SPV客户的情况并非如此。这可能是一个问题,如果恶意警报节点垃圾邮件与虚假欺诈证据。一个建议的解决方案是支付通道,原因是:

1. 以近乎即时的速度运行,从而可以快速提醒欺诈证据;

2. 促进微交易;

3. 对临时采矿失败具有较强的抵抗力(因为它们使用了较长的“保留期”);

通过这种方式,支付通道的使用可以帮助激励整个节点发布欺诈证据。

结论,意见和建议

欺诈证明可能很复杂,很难实施。然而它们对于区块链的可伸缩性以及SPV客户端的安全性和隐私性似乎是必要的,因为不是每个人都可以或应该运行完整的节点来参与网络。当前的SPV实现正致力于提高这些SPV客户端的安全性和隐私性。此外,对于当前的区块链,将需要进行硬分叉或软分叉,以将数据容纳在块头中。

根据支付渠道欺诈证明提议,该提议建议对发出警报/欺诈证据的节点进行某种形式的激励,似乎必须出现某种欺诈证明提供者和消费者市场。

就Tari而言,似乎需要研究通用的防欺诈提案或类似提案,因为毫无疑问,协议/网络的最终用户将主要使用轻型客户端。然而,由于这些欺诈证明是基于至少一个诚实节点的假设工作的,对于数字发行人(可能是一个或多个),因此欺诈证明在这种假设下是不可行的,因为数字发行人可能是唯一的节点。

历史上的今天:

本文地址:https://www.u5881.com/7322.html
版权声明:本站推荐的部分活动具有时效性,老淘本人并不能保证当您看到本文时,该项活动是否仍在继续。

发表评论


表情