主页 > imtoken的钱怎么拿出来 > 什么是 SPV? SPV节点和SPV钱包详细介绍

什么是 SPV? SPV节点和SPV钱包详细介绍

imtoken的钱怎么拿出来 2023-09-27 05:13:08

什么是 SPV? SPV节点和SPV钱包详细介绍

什么是 SPV? SPV是“Simplified Payment Verification”的缩写。 中本聪的论文简单提到了这个概念,指出无需运行全节点即可验证支付比特币节点说法错误的是,用户只需保存所有区块头即可。 虽然用户无法自己验证交易,但如果他能在区块链某处找到匹配的交易,他就可以知道网络已经批准了这笔交易,以及它从网络收到了多少确认。

SPV是什么?SPV节点和SPV钱包详情介绍

根据中本聪的原文,这里有一个需要注意的细节。 SPV指的是“支付验证”,而不是“交易验证”。 这两种类型的验证之间存在很大差异。

“交易验证”非常复杂,涉及到验证是否有足够的余额可以花费,是否存在双花,脚本是否可以通过等,通常由运行全节点的矿工完成。

“支付验证”比较简单。 它只判断用于“支付”的交易是否经过验证,获得了多少算力保护(多少确认)。

考虑这样一种情况,A收到B的通知,声称他已经从某个账户汇了一定数额的钱给A,在去中心化的方式下,没有人可以证明B的可靠性,收到这个通知后,A如何判断B说的是真的吗?

在比特币系统中,这个通知是作为一个固定格式的“交易”来实现的,包括B的汇款账户核对、B的签名、汇给A的金额、A的地址。

如果A要亲自验证这笔交易,首先,A需要遍历区块链账本,定位到B的账户,以查看B给的账户支票是否有足够的钱; 接下来,A需要遍历所有后续的账本,检查B是否把这个账户里的支票上的钱花给了别人(是否存在双花欺诈); 然后验证脚本,判断B是否有账户控制权。 这个过程要求A必须获得完整的区块链。

但是,如果A只是想知道支付是否通过验证(如果验证通过就发货),他可以依靠比特币系统进行快速验证。 也就是说,检查发生此付款的交易是否已包含在区块链中以及它收到了多少确认。

原理:区块头中有3个关键字段,一个是prev_block_hash(前一个区块的hash值,保证交易在区块链中记录的顺序); 二是bits(当前区块的计算难度),三是merkle_root_hash(借助于merkle tree算法,保证所有包含在区块中的交易的真实性)。

在验证一笔交易是否真实存在时,理论上用户可以通过以下方式进行验证:

(为了简化模型,我们假设使用tx_hash来定位区块,这种方式存在被“交易延展性”攻击的风险,在实际应用中,可以根据output_point来定位。)

0. 从网络中获取并保存本地最长链的所有区块头;

1、计算交易的哈希值tx_hash;

2.定位包含tx_hash的区块,验证区块头是否包含在已知最长链中;

3. 从区块中获取构建默克尔树所需的哈希值;

4、根据这些哈希值计算merkle_root_hash;

5. 如果计算结果等于区块头中的merkle_root_hash,则交易真实存在。

6. 根据区块头的位置,判断交易收到了多少确认。

优点:大大节省存储空间。 减轻最终用户的负担。 无论未来的交易量有多大,区块头的大小都保持不变,只有 80 字节。 按照每小时6个区块的速度,每年产出52560个区块。 仅保存区块头时,每年新增存储需求约为4MB,100年后累计存储需求仅为400MB。 即使用户使用最低端的设备,正常情况下也能完全加载。

问题:如何通过tx_hash定位交易所在区块? 在以前的比特币协议中没有对此的支持。

比特币钱包

在进一步讨论SPV的实现之前,有必要先解释一下比特币钱包里存储的是什么,钱包和私钥是什么关系?

既然用了“钱包”这个词,应该和我们日常生活中使用的钱包有一定的相似之处。 为了更直观的解释,我们将其与我们日常生活中使用的钱包进行比较。

钱包SPV是什么?SPV节点和SPV钱包详情介绍

日常生活中,可能会在其中存放纸币、支票、印章等(为简化描述,我们将银行卡排除在外,银行卡的使用涉及到很多中间环节,增加了表达的复杂度)。

用钞票购物时,

1、从钱包中取出多张不同面额的纸币,计算总面额是否大于要求的金额,应退回多少零钱;

2. 将这些钞票直接交付给卖家;

3. 卖家验证这些钞票的真伪;

4、卖家计算这些钞票的面额是否大于或等于商品价格,并退回相应的找零。

5. 将收到的零钱退回钱包。

比特币钱包中存放的东西,相当于“一次性支票”,上面标有面值和相应的“印章”。 付款时,

1、用户从钱包中取出几张“一次性支票”,计算总面值是否大于要求金额,应退回多少零钱。 注意扣除比特币系统收取的手续费;

2. 写支票给卖家,注明卖家地址和付款金额; 如果您需要找零,请给自己写一张找零支票(写上您自己的地址和找零的金额);

3、在从钱包中取出的每张支票上盖上相应印章,以确认支付权;

4. 将这些账单提交给比特币系统,比特币系统验证支票的真实性和付款的有效性。

5. 如果比特币系统验证通过,收款人将收到的支票放入钱包。 用户丢弃钱包中已支付的支票(这些支票已被比特币系统视为无效,不能再使用),

即使是刚接触比特币的人也能猜到“印章”指的是“私钥”。 但什么是“一次性支票”?

在比特币系统中,这种“一次性检查”的术语是UTXO,全称是Unspent Transaction Outputs(未花费的交易输出)。 区块链是一个记录所有历史交易(Transaction)的总账,每个区块(block)包含若干笔交易记录。

每笔交易记录由两部分组成:资金来源(可以有多个来源)和资金去向(可以有多个目的地),术语分别为Tx_in(交易输入)和Tx_out(交易输出)。 也就是说,每笔交易TX包含若干个Tx_in和若干个Tx_out。

除了创世块中的交易外,每笔交易都必须有资金来源。 资金来源有两种,一种是挖矿奖励(按固定算法实现的货币发行),出现在每个区块的第一笔交易中; 另一个是之前交易中没有使用过的Tx_out(交易输出),即UTXO。 付款人需要出示证据证明他拥有这个Tx_out,而比特币系统需要验证这个Tx_out是否真的没有被花费(是否是UTXO)以及付款人是否有权利花费它。

资金去向(TX_out)包括两部分,一是转出的金额,二是控制权(谁可以使用)。 提款权是通过比特币的脚本系统实现的。 如果收款人的地址是1开头的普通地址,脚本中会包含该地址对应的公钥的哈希值(hash160)。 一般需要用对应的私钥对钱进行签名; 如果收款人的地址是 3,脚本将包含特定脚本的哈希值 (hash160)。 使用货币时,一般需要根据特定的脚本用多个私钥进行签名。

用户钱包中的比特币实际上是Tx_out中记录的用户已经控制的、尚未花费的金额的总和,即用户可以控制的所有UTXO金额的总和。

一个完整的钱包应该存储若干个UTXO和每个UTXO对应的私钥。 当然,有时候从安全的角度考虑,钱包可能会分为两部分,在线钱包只有UTXO,离线钱包只存储私钥。

但是用户如何将他们所有的 UTXO 都放入钱包中呢?

用户如何包含自己的UTXO

(1) 分权方式:

执行:

1.创建本地数据库,用于存储UTXO;

2. 设置区块扫描起点(区块链上的扫描起点高度),从该点开始,依次下载该点之后所有区块的完整数据。

3. 分析每个区块的所有TX数据,依次读取每个Tx_in的prev_Tx_out([tx hash] + [tx_out serial number]),查看UTXO数据库中是否存在这个Tx_out,存在则删除UTXO 数据库(或标记为删除)。

4.依次分析每个Tx_out的脚本,如果与用户相关,则记录[tx hash]+[Tx_out序列号]和整个tx_out内容到UTXO数据库;

SPV是什么?SPV节点和SPV钱包详情介绍

备注:如果钱包里只有新创建的私钥,可以从最新的区块开始扫描(因为私钥碰撞的可能性可以看作0。在你告诉别人比特币地址之前,对应的地址私钥不会有任何收益)

优点:不依赖于信任; 数据准确。

缺点:速度慢,需要从比特币网络下载大量数据,对网络造成很大压力。

(2)集中方式:

1. 一个中心化的组织(或个人)运行一个完整的比特币节点,并建立一个包含所有 UTXO 的数据库。

2. 用户使用中心化机构提供的API请求与自己相关的UTXO数据。

优点:速度快,不拖累比特币网络;

缺点:依赖信任; 数据可能不准确(中心服务器可能出现故障,或者与中心服务器的会话被劫持,数据可能被篡改)

4、什么是瘦客户端、SPV轻钱包、SPV节点?

瘦客户端:参考SPV机制,在监听收款地址时比特币节点说法错误的是,客户端只需要在本地保存与用户一次性交易相关的数据即可。 由于当地没有完整的区块链,发送方相关数据缺失,客户无法亲自验证交易是否合法。 只能判断交易是否包含,是否收到过多次确认。 这与SPV有很多相似之处,所以这种瘦客户端在很多场合也常被称为“SPV客户端”。 但与SPV不同的是,在去中心化模式下,这些客户端仍然需要下载每个新区块的所有数据进行解析,但不需要将所有数据保存在本地。

“轻钱包”是以瘦客户端模式实现的钱包。 因为它没有存储完整的区块链,所以涉及到如何获取UTXO的问题。 不同的开发者可能有自己的实现方式,但是从效率上来说,往往是集中实现。

SPV 节点:支持使用布隆过滤器快速检索和返回相关数据的节点。

SPV的实施涉及到一个问题。 如何通过交易特征值(如tx_hash)定位支付交易所在区块? 用中心化的方式很容易解决,但是使用去中心化就没那么简单了,因为之前的比特币系统协议缺乏对SPV的支持。 要以去中心化的方式获取数据,必须做到以下两点: 1. 客户端和节点使用公认的协议进行通信; 2. 数据真实性的自我验证——客户端不需要信任节点是否是诚实节点,返回的数据本身就可以证明这个数据的真实性。

原协议中,可以通过getheaders命令获取块头,通过getdata命令获取指定块,但不支持通过tx_hash反向查找块。 为了找到一个区块,客户通常必须下载整个区块链。

新的比特币协议增加了布隆过滤器的功能。 布隆过滤器解决了客户端检索的问题。 其原理是Bloom filter可以快速判断某个搜索值一定不存在于指定集合中,从而过滤掉大量不相关的数据。 数据,减少客户端不必要的下载。 这样的节点可以为去中心化的 SPV 查询提供必要的支持。

如前所述,SPV 的目的是验证一笔付款是否实际存在以及收到了多少确认。 钱包的目的是管理自己的资产和进行支付。 总之,SPV的应用往往是准备交割(知道钱到了),“轻钱包”的应用往往是数钱或花钱。 “轻钱包”虽然部分借鉴了SPV的机制,但在应用方向上与SPV完全不同,直接把两个词联系起来有点牵强。 这种钱包要么采用中心化的方式,提高了效率,但引入了信任风险; 或者采用去中心化的方式,不需要信任,但是效率低下,增加了网络的负担。

SPV节点的出现,使得以去中心化的方式实现高效、低负荷的“轻钱包”成为可能。 笔者认为,将基于SPV节点实现的“轻钱包”简称为“SPV轻钱包”可能更为合适。

如果您对区块链数字货币交易平台的价格比较感兴趣,希望找到靠谱正规的区块链数字货币交易平台,那么您可以更深入的咨询我们的官方客服,您可以申请加入我们免费群内官方社群,全是币圈区块链经验丰富的职业玩家和行业大牛,可以帮助大家答疑解惑,共同进步,在币圈赚钱。