主页 > imtoken安装下载地址 > 百万TPS之路(三)——提升SPV节点的安全性、效率和可扩展性

百万TPS之路(三)——提升SPV节点的安全性、效率和可扩展性

imtoken安装下载地址 2023-04-28 07:45:37

比特币btc钱包_btc官方钱包好用吗_btc轻钱包同步

第0章简介

前面三篇文章介绍了UTXO是什么,UTXO证明的设计(全节点)以及各个节点如何参与UTXO证明。 这篇文章讲的是SPV钱包是如何使用UTXO证明的。

第一章 交易验证和支付验证

如何验证一笔交易是否是双花,钱包如何判断你收到的币是假的,是比特币(包括BTC和BCH)的首要设计目标。 比特币白皮书在第 2 章和第 8 章分别提供了两种验证双花的机制——交易验证和支付验证。

交易验证只能由全区块链节点(全节点)完成,主要涉及验证是否有足够的UTXO、是否存在双花、判断解锁脚本等。一次交易验证主要完成这些工作:

0 前提:区块链节点收到一笔交易,区块链节点同步所有区块并在本地构造一个UTXO集合。

1节点会遍历所有UTXO集合,定位交易输入所在的区块高度,从而检查交易是否有足够的未花费输出(UTXO);

2. 节点应该检查这个高度之后的所有交易,以确保这个UTXO没有双花;

3 节点需要验证交易的解锁脚本是否正确,从而验证交易的输入是否被合法私钥解锁;

4 节点需要验证本次交易的锁定脚本是否正确,以验证交易是否会发送到非法地址。

交易验证过程非常复杂,各种细节包括检查交易是否为coinbase交易; 交易规模是否小于100K; 交易指令是否少于20,000; 交易的各个字段是否合规…… 而且各种交易格式btc轻钱包同步,比如p2pkh、p2sh等,都有自己的验证规则,极其复杂。 不需要一天的时间。 估计没人能看懂交易验证码。

绝大多数用户一般不会运行完整的区块链节点,而是使用手机安装轻钱包。 此类轻钱包无法实现交易验证功能。 他们需要使用支付验证来确认他们收到的交易是否是假的。 轻钱包全称为SPV wallet,英文为SimplifiedPayment Verification,即简化支付确认,在中本聪白皮书第8章有介绍。

但是付款验证要简单得多。 支付验证是为 SPV 钱包设计的。 支付验证的目标是让SPV钱包获得交易是否已经被完整的区块链节点收录到区块链中,即验证交易是否已经打包,是否处于最新状态。 长链很好。

0 前提条件:SPV钱包节点收到一笔交易tx,SPV钱包节点已经下载完所有区块头;

1、SPV钱包节点向全节点节点随机询问tx的merkle树路径(区块中交易顺序按照Merkle树算法排序);

2. SPV钱包节点使用tx和得到的Merkle树路径计算merkle_root_hash,并与区块头上的merkle_root_hash进行比较。 如果相等,则确认tx被确认;

3 根据tx所在的区块高度,判断交易收到了多少个确认。

需要注意的是,有一类手机钱包是依赖服务器来实现验证的。 他们不使用支付验证,他们委托服务器做交易验证。

第二章SPV钱包的尴尬现状

现在市场上很少有人使用真正的SPV钱包。 大家使用的手机钱包往往是某个公司的钱包产品,公司提供服务器帮助用户验证交易。 公司中心化钱包的安全性本质上取决于公司的信用,不是去中心化的解决方案。

SPV 钱包有两个尴尬的问题。 第一个是全节点为什么要处理spv钱包的请求服务?

让我们假设一个极端情况。 未来将有5亿人使用BCH,全网只有10000个全节点。 该完整节点需要为 50,000 个 SPV 钱包提供服务。 全节点会被这些用户拖垮。 因为SPV只是发送一个txid给全节点,但是全节点需要读取区块中交易的Merkle树的路径,然后发送给SPV钱包。 这个读写过程很耗资源,发送过程需要带宽。 如果未来区块大小达到1G,一个区块中有数百万笔交易,Merkle树路径读取起来会非常困难。

SPV钱包每次同步区块高度时,都需要与全节点验证余额,更新自身余额。 而且,为了防止全节点对SPV钱包进行诈骗,SPV钱包需要连接多个全节点来完成支付验证和各种任务,这使得全节点为SPV节点服务的难度成倍增加。

如果你使用过某公司开发的轻钱包,钱包通过该公司的服务器完成收币和发币,你一定遇到过服务器维护的情况。 当用户太多时,服务器将被耗尽。

从上述问题可以看出,SPV节点需要全节点配合支付验证模式,难以扩展。

那么该怎么办?

另一个比较尴尬的是SPV钱包必须随机广播完整的txid给周围的节点,所以隐私性没有那么强。

如果你想保护你的隐私,其实最好是运行全节点作为钱包。

第三章SPV节点使用UTXO证明完成支付验证

我们设想一个新的 SPV 节点的“支付验证”,使用 UTXO 证明来完成支付验证。

现在假设全网已经通过硬分叉将UTXO证明放入区块头,全节点在本地构建了高度为100的UTXO区块链,同时也构建了UTXO的Merkle树,网络也允许输出UTXO 区域区块链。

SPV 钱包节点可以通过下载区块头来获取所有 UTXO 证书。

有了UTXO证明,SPV节点可以下载与自己相关的UTXO,并可以在本地保存自己的UTXO和UTXO Merkle树路径。 这样就可以不再向全节点请求余额验证btc轻钱包同步,可以大大降低全节点的服务压力。 这样做的目的是为了让整个网络更有效率。

SPV节点可以像交易的支付验证一样,向全节点请求“UTXO支付验证”。 过程如下:

0 前提条件:SPV钱包节点收到一笔交易tx,SPV钱包节点已经下载完所有区块头;

1、SPV钱包节点随机向全节点节点询问UTXO的默克尔树路径(区块中交易的顺序由默克尔树算法排序);

2、SPV钱包节点利用tx的UTXO和得到的Mmerkle树路径计算出UTXO证明,并在区块头上与区块头中的UTXO证明进行比较。 如果相等,则确认tx被确认;

3 根据tx所在的区块高度,判断交易收到了多少个确认。

这与 SPV 付款验证相同。 但是,全节点检索 UTXO 数据比检索区块中的交易更困难。 事实上,这种UTXO支付证明的方式会增加全节点的工作量。 解决fullnode的工作量问题,下篇文章将分析分片技术。

SPV 可以使用 UTXO 的另一种模式是随机选择两个全节点,要求一个进行 SPV 支付验证,要求另一个进行“UTXO 支付验证”,可以提供 SPV 节点的安全性。

第四章结语

我们需要更加努力地工作,找到扩展 BCH 系统以提高效率的方法。