虚拟币钱包开发

新闻资讯

产品分类

热门产品

掌握钱包私钥掌握一切吗?
掌握钱包私钥掌握一切吗?
一般而言,如果一笔区块链交易的交易费设置的很低,它是不会被网络纳入的,但在某些情况下,零

杭州软件开发公司
杭州软件开发公司
杭州区块链软件开发公司哪里比较靠谱,区块链软件开发钱包,区块链商城系统开发,区块

GO开发者:如何成为区块链开发者?
GO开发者:如何成为区块链开发者?
可以这样说,2018年是区块链应用元年,区块链相关概念被炒得沸沸扬扬,作为一项新生技术,虽

稳定币之争
稳定币之争
毫无疑问,在加密货币市场有一个占主导地位的稳定币。 从理论上来说,Tether的代币USDT价

河南省首家区块链技术研究院成立
河南省首家区块链技术研究院成立
10 月 30 日消息据凤凰网商业消息,10 月 10 日,河南省未来区块链技术研究院在中国郑州正

软件开发-钱包开发
软件开发-钱包开发
沧州区块链软件开发钱包,区块链商城系统开发,区块链应用技术开发,区块链钱包开发,区块

宜昌软件开发钱包
宜昌软件开发钱包
宜昌区块链软件开发钱包,区块链商城系统开发,区块链应用技术开发,区块链钱包开发,区

临沂区块链钱包开发
临沂区块链钱包开发
临沂区块链软件开发钱包,区块链商城系统开发,区块链应用技术开发,区块链钱包开发,区

您的当前位置:首页 > 系统开发

开发如何才能快起来


时间:2018-10-15 18:37:20  来源:原创  作者:admin  点击次数:


  在讨论我认为的理想方案之前,我还是用我习惯的逻辑,先向读者解释为什么我们需要分片技术、理想的分片技术究竟应该解决什么问题这些最基本的知识;然后,我会根据自己看过的大量的分片方案,谈谈目前市面上已有的分片方案存在的五个误区或谎言。

  为什么需要分片:从全节点的负担谈起在分析具体技术方案之前,先来看看一个全节点都有哪些负荷:

  网络带宽,这个部分同吞吐量(TPS)线性相关

1. 新区块的广播

  全节点需要下载周期性出现的新区块,并进一步上载给其他需要的节点。对于现在7TPS的比特币区块链来说,平均下载带宽消耗是13.6Kbps,完全不是负担。但是如果TPS提高到7000TPS,则至少需要13.6Mbps的下载带宽才能承受——请注意,这个是关键数据,并且有序,如果区块数据得不到及时传输,区块链将无法持续构造,并且无法重建全网的账簿状态。

2. 未确认新交易的广播

  全节点需要持续发现,并下载尚未被确认的新交易,然后上载给其他节点。在全网不拥堵的情况下,这个数据量和新区块的数据量相当。相对的,这个数据不需要保序,即使下载不全也不会直接导致全节点本身工作异常。但是,如果这种情况大规模地发生,最终会导致部分交易始终没有被矿工看到,而长时间不被确认,最终超时。

  内存容量,这个部分同用户量(address数量)以及智能合约数量线性相关

  账簿的存储占据主要的内存消耗,其他部分的消耗不多,并且基本不会随着网络扩展而增加。

  区块链的基本账簿, 至少需要维护每个用户(每个address)上的余额,每个用户至少需要16 + 32个字节。对于支持智能合约的区块链,每个用户至少需要额外32个字节记录每个智能合约的代币的余额。智能合约自身还可以自定义更多的字段,可以占用远超32字节的内容。

  当然,并不是所有的用户都参与了所有的智能合约,所以我们并不以用户量和智能合约数量的乘积作为内存消耗的估量。现实的情况是,我们按照以太坊的现状来估计,约 4500 万个地址,至少占据了约3GB的内存。每个地址平均消耗了68个字节。这里并不是说以太坊有了4500 万个用户,通常而言,一个用户会拥有好多个地址。

磁盘 I/O,这个部分同吞吐量(TPS)线性相关

  全节点收到区块并确认成链之后,区块会被写入磁盘归档起来。这个部分的吞吐量大体和下载新区块的带宽一致。

  这里需要注意的是,按照以太坊的观点(账户模型),账簿是指全网的某一时刻的全量状态,而区块(若干交易的集合)是对账簿的增量修改信息。在磁盘实际存储的是区块,而不是账簿。节点在启动的时候,需要重放所有已经记录的区块,以构造账簿的最新状态。截至目前,以太坊的全部归档区块数据量已经超过160GB。这里的一个优化是定期将账簿全量快照也记录下来(即checkpoint),这样只需要从最近的checkpoint开始重放就可以了。

  而UTXO模型是比特币的观点,这是一个非常有意思的结构,它的区块既是若干交易的集合,同时也是部分账簿的状态,即特定地址上的余额。整条链上余额不为0的UTXO都是账簿的最新状态。至今比特币区块链的全部归档区块数据量已经超过220GB。不过从磁盘I/O的角度来看,重建全网账簿还是需要扫描整条链找出全部余额不为0的UTXO,并没有什么优势。当然checkpoint技术对UTXO一样有效。

  在这个领域,最近我看到了一些被热炒的改进,尤其是在已确认交易集合的聚合表示方面。我注意到斯坦福大学的一个团队最近提出,RSA累加器(RSA Accumulator)可以代替Merkle Tree,用来表示一个已确认交易的集合。这个想法的优异之处在于,可以直接用一个交易的Hash值来校验一个交易是否存在于已确认交易的集合,而Merkle Tree不仅需要一个交易的Hash,还需要从树根到该交易沿途路径上的所有兄弟节点上的Hash。不过,这个做法的代价是,这个表示本身要1.5K字节,Merkle Tree的根仅需要20或32个字节。同时,这并不意味着全节点可以不再保存历史交易,原因在于,首先集合的聚合表示是不具备枚举的能力的,也就是说,在交易未知的情况下,集合的聚合表示无法告诉你里面具体的交易是什么,所以你也无法判读这个集合本身是不是正确的,所以全节点也无法仅凭这个信息确认链头的正确性。全节点在自举的时候还是需要从创始区块(genesis block)开始下载,逐块验证全链的完整性和正确性。但是,当这个验证过程完成之后,为了节省空间全节点,是可以删除掉区块中的实际交易内容的,其代价是丧失枚举交易的能力,同时也丧失了帮助其他全节点自举的能力。

  另外,通过验证一个交易是否在链头上,来确定账户余额的做法,仅对于UTXO交易模型有效。对于以太网这样每个交易仅为增量修改信息的交易模型,仅靠验证一个交易是否在链头上,是无法得知账户的余额的。

CPU处理能力,这个部分同吞吐量(TPS)线性相关

1. 密码学相关计算

  对于每一个收到的新区块,无论最终时候成功成为链的一部分,全节点都需要验证其携带的每一个交易是否被正确签名。同时会验算每个区块的Hash,以确保其达到了当前工作量证明(PoW)难度的要求。对于拜占庭容错(BFT)算法,还需要验证各个委员会成员的签名是否正确。这里主要的工作量是验证签名。验证签名在一台普通计算机上(E5-1620@3.5GHz, C++并行实现)的速度可达 40K op/s,也就是4万TPS(每个交易需要验签一次)。

2. 交易验证相关计算

  对于每个交易,如果是支付交易,将需要至少查找一次账户的索引结构(通常为哈希表),并做一次加法和大于的判断;为了更新账簿,还需要至少一次加法和减法。这样的一系列操作,在一台普通计算机上的速度可以轻松达到1M op/s。如果是智能合约,会需要在虚拟机中执行对应的智能合约指令,对于现有的金融本质的应用(包括类似Cryptokittes类或Fomo3D类的区块链游戏),至少可以达到100K op/s。

  这意味着什么?

  针对上面的分析,我来做一个小结:对于一台普通的计算机,拥有13Mbps的互联网连接,E5-1620@3.5GHz 4Core的CPU,16G内存,512G SSD 硬盘 (250MB/s)。网络带宽导致的TPS理论上限约为7千TPS,硬盘文件I/O导致的TPS理论上限为5万TPS,CPU处理能力导致的的TPS理论上限约为5万TPS。另外,内存大小导致的地址理论上限约为 2.5 亿个地址。

  这里可以看到,对于性能来说,网络带宽是最首要的瓶颈根源,其次是硬盘的I/O和CPU的处理能力。对于容量来说,内存是最主要的瓶颈根源。

  分片应该做到什么?从上面对瓶颈根源进行分析之后,我们可以得到这样的结论:特定的分片方案至少要切分系统的网络带宽、内存容量相关的工作量,才有可能大幅提高全网的伸缩性,才有可能打破所谓的「不可能三角」。必须再次强调,这个结论非常重要。因为只有真正了解这一点,才能进一步讨论分片方案是否真的可以打破「不可能三角」。

  虽然在前面的分析中,带宽和内存是短板,但实际上,其他部分的约束也并不富余。理想的情况下,分片系统能够切分上述四个方面所有的负担。对于一个有n个分片的系统,其每一个分片仅需要承载1/n的全网负荷,将网络带宽、硬盘文件I/O、CPU处理和内存容量的消耗都降到原来的1/n。在分布式系统中,这个是高伸缩性能带来的性能和容量提升的上界。一个分片系统如果可以实现这个,即性能和容量可能随着分片个数n而线性提升,那么理论上,可以使得全网的性能和容量能够被无限地提升。

  而现实情况是,分片系统为了实现应用逻辑的正确性,协调各个分片之间的运作以及实现整体的安全性,需要每个全节点引入额外的工作量(overhead)。这些额外的工作量是个常数O(1),即和分片个数n无关,那么全网线性提升仍旧可以保证。

  如果额外的工作量的阶(order)小于线性,例如O(logn),那么就意味着随着n的增加,全网提升比额外工作量的增加要来得快,全网线性提升还是可以实现的。但是,如果额外的工作量的阶大于或等于线性,例如O(nlogn) 或 O(n^2),那么基本上全网提升到一定程度,就无法继续了。因为全节点额外引入的工作量成为了新的首要瓶颈。

跨分片交易的原子性保证

  区块链中的每一个交易都是原子的,必须保证其涉及到的操作或者全部完成,或者一个都不开始,才能使得最终状态是正确的。

  对于涉及到多个分片的交易,我们不得不协调发生在各个分片中的操作,保证它们都能被没有错误地完成,并且不受其他交易的干扰。这里看起来可以简单借用在多线程编程中常用的线程同步概念,用诸如临界区(critical section)等方式,锁住涉及到的状态,阻止其他交易触碰这些状态,在完成交易所有操作后释放。但是,这会导致部分分片的执行被阻塞,而导致实际性能大打折扣。并且随着全网规模扩大,分片数量增多,跨分片交易的比例必然会极剧上升,从而使得加锁变得非常频繁。

  一个设计良好的分片系统,必须具备高效的跨分片交易处理算法,并且算法的开销应该和分片数量n无关。

单个分片的安全性保证

  分片系统中,如果每个分片有独立工作的共识系统,也就是每个分片自己一条链,全网能最大获得的吞吐量的n倍提升。

  共识系统的安全性依赖于出块权力的大多数(majority)是可信的,这个大多数在PoW系统中为50%,在BFT系统中为2/3,甚至更高。而当全网有n个独立工作的共识系统时,这时平均分到每一个分片的大多数变会降低到原来的 1/n。这样攻击这些分片中的共识系统的壁垒,对于PoW系统会降低到全网的 50/n% , 对于BFT系统则会降低到1/(3n)。从而导致,仅需要非常低的成本,就可以攻击某一个特定的分片,例如构造双花攻击(double spend)。而在一个分片系统中,只要有一个分片被攻击,其后果会藉由跨片交易迅速污染到其他的分片。

  这就是为什么每一个分片系统都必须处理好安全问题,使得攻击特定分片的代价同攻击全网一样高。


本文来自区块链开发官网 转载请注明

上一篇 下一篇


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表
网站首页| 关于沙僧科技| 区块链开发| 产品案例| 新闻中心| 售后服务| 联系我们