美文网首页比特币&区块链研究区块链
通往百万TPS之路(三)——提高SPV节点的安全、高效和可扩展

通往百万TPS之路(三)——提高SPV节点的安全、高效和可扩展

作者: 1a8661c5a646 | 来源:发表于2018-06-15 08:30 被阅读11次

    第0章 引言

    前面三篇文章介绍了什么是UTXO、(full node里)UTXO证明的设计和各种节点如何参与UTXO证明,本文讲SPV钱包如何使用UTXO证明。

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

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

    交易验证是完整区块链节点(full node)才能做到的,主要涉及验证是不是有足够的UTXO,是否存在双花,判断解锁脚本等。一个交易验证主要要完整这些任务:

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

    1节点会遍历所有UTXO集,定位到这笔交易输入所在的区块高度,以此来查这笔交易是否有足够的未花费输出(UTXO);

    2节点要依次查难此高度后面所有的交易,以此保证这笔UTXO不存在双花;

    3节点要验证这笔交易的解锁脚本是不是对的,以此验证交易的输入是不是被合法私钥解锁的;

    4节点要验证这笔交易的锁定脚本是不是对的,以此验证交易会不会发到非法的地址上。

    交易验证过程是非常复杂的,各种细节,包括要查交易是不是coinbase交易;交易大小是不是小于100K;交易里的指令是不是少于2万个;交易各个字段是不是合规……。而且各种交易格式,如p2pkh,p2sh,等,又有各自的验证规则,复杂死了,没有一天的功夫,估计没人能读完交易验证那一块代码。

    绝大多数用户一般不会运行一个完整区块链节点,而是使用一个手机安装一个轻钱包。这一类轻钱包无法实现交易验证功能,它们要确认自己收的交易是不是假的需要使用的是支付验证。轻钱包叫SPV钱包,英文是Simplified Payment Verification,简化支付确认,这是中本聪白皮书里第8章描述的。

    但支付验证就要简单很多。支付验证是为SPV钱包设计的,支付验证的目标是为了让SPV钱包获得这笔交易是否已经被完整区块链节点收录进区块链里了,即验证这笔交易是否被打包,并处于最长链就可以了。

    0前提:SPV钱包节点收到一笔交易tx,SPV钱包节点下载好了所有的区块头;

    1SPV钱包节点随机向full node节点索要tx的梅克尔树(merkle tree)的路径(交易在区块里的排序是按梅克尔树算法进行排序的);

    2SPV钱包节点使用tx和获得的Mmerkle tree路径计算出merkle_root_hash,并且和区块头上的merkle_root_hash对比,如果相等,则确认tx是有确认的;

    3依据该tx所处的区块高度,确定该交易已经得到多少个确认。

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

    第2章 SPV钱包的尴尬地位

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

    SPV钱包有两个尴尬的问题,第一个是为什么full node要搭理spv钱包的请求服务呢?

    我们假设一个极端情况,未来有 5亿人使用BCH,全网有只有1万full node节点,那一个full node节点需要服务5万个SPV钱包。Full node会被这些用户给拖累死。因为SPV只是将一个txid发给full node,但full node要在区块中读出这笔交易的梅克尔树的路径,并且发给SPV钱包。这个读写过程是要消耗资源的,发送过程是需要带宽的。如果未来区块大到了1G,一 个区块里有几百万笔交易,那要读出这个梅克尔树路径都是很难的事。

    SPV钱包每次同步区块高度,都是要向完整节点做余额验证来更新自己的余额。而且SPV钱包为了防止full node欺诈它,SPV钱包需要连接多个full node来完成支付验证和各种工作,这又呈倍数地加大了Full node服务SPV节点的难度。

    如果你用过一家公司开发的轻钱包,钱包是通过公司的服务器来完成收币发币的,你一定遇到过服务器维护的情况,用户一多,服务器就要累死。

    从上面这个问题就可以看出,SPV节点需要full node配合做支付验证的模式,是很难扩展的。

    那怎么办?

    另外一种尴尬就是SPV钱包必须将完整的txid随机广播给周围的节点,那隐私就没那么强了。

    想保护隐私,其实最好是运行full node来当钱包用。

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

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

    现在假设全网已经通过硬分叉将UTXO证明塞进了区块头,并且full node都在本地构造始终为100高度的UTXO区块链,也会构造UTXO的梅克尔树,网络也允许输出UTXO区块链。

    一个SPV钱包节点通过下载区块头,就可以获得所有的UTXO证明。

    有了UTXO证明,SPV节点就可以下载和自己相关的UTXO,自己就可以在本地保存自己的UTXO和UTXO梅克尔树路径。这样就可以不再向full node请求余额验证,可以大大降低full node的服务压力。这样做的目的是可以让整个网络变的更加高效。

    SPV节点可以像做交易的支付验证一样,向full node请求“UTXO支付验证”,过程是这样的:

    0前提:SPV钱包节点收到一笔交易tx,SPV钱包节点下载好了所有的区块头;

    1SPV钱包节点随机向full node节点索要UTXO的梅克尔树(merkle tree)的路径(交易在区块里的排序是按梅克尔树算法进行排序的);

    2SPV钱包节点使用tx的UTXO和获得的Mmerkle tree路径计算出UTXO证明,并且和区块头上的区块头里的UTXO证明对比,如果相等,则确认tx是有确认的;

    3依据该tx所处的区块高度,确定该交易已经得到多少个确认。

    这和SPV支付验证是一样的。但full node检索UTXO数据,要比检索一个区块里的交易要更难,事实上这种UTXO支付证明的方式是会加重full node的工作量。要解决full node的工作量问题,下一篇文章来分析分片的技术。

    另外一种SPV可以利用UTXO的模式是,随机选择两个full node,向一个索要SPV支付验证,向另一个索要“UTXO支付验证”,这样可以提供SPV节点的安全性。

    第4章 结束语

    我们需要更加努力一点,找到将BCH系统扩展到更高效的办法。

    相关文章

      网友评论

        本文标题:通往百万TPS之路(三)——提高SPV节点的安全、高效和可扩展

        本文链接:https://www.haomeiwen.com/subject/nbkpeftx.html