关于Eos的TS处理速度的思考

现在Eos的wasm智能合约代码以JIT方式加载代码的速度是30ms,意味着单线程情况下每秒的最低速度为30TPS。

现在Eos采取的做法是采用cache的方式来加快代码的执行速度。也就是说,在第一次执行智能合约的代码时,会cache编译过后的代码,下次再调用智能合约时就可以省掉这30ms的编译时间。

现在假设其中一个producer中途挂掉了,那么它再次启动重新加入后,因为cache已经清空,这时,最开始,在单线程的情况下,它产生块也就只有30TPS的速度了。

为了解决这个问题,producer必须在启动的时候重新加载所有的智能合约。这时,producer的重新启动速度就会随着部署的智能合约越来越多而越来越慢。并且由于编译wasm不支持多线程,也就意味着不能通过多线程来加速。

假如有100万个wasm智能合约,加载wasm代码最少也要30ms,那么总的加载时间就是 1e6*30/1000/60/60,即8个多小时,这显然是太长了。

不仅仅如此,这个缺陷甚至可能被恶意利用。大家都知道Eos的ts是不收费的,带宽和存储空间是按锁定的Eos的来分配的。那么这个带宽和存储空间的分配就必须小心的考虑了,不单单是要考虑存储数据要占用多少存储空间,而且要对数据是否是智能合约代码进行判断,因为编译智能合约的代码要占用额外的内存。如果设计不当,那么攻击者就可能在链上创建大量的智能合约而成本却很低,从而使链上充斥着大量无用的智能合约,从而使ts的处理速度降低并且占用大量的内存和存储空间,甚至使整个系统瘫痪。

另外,cache wasm代码的内存也肯定会消耗得越来越多,如果加载wasm所需的总内存不够了要怎么处理,现在eos还没有看到具体的处理逻辑。并且未来要实现也应该是采用类似于虚拟内存的技术,也就是将一段时间不使用的编译后的wasm代码从内存中删除,以腾出空间来保存需要使用的编译后的wasm代码。然而就像虚拟内存的缺陷一样,虽然这可以解决wasm代码无法加载的问题,但是如果处理不好必然会造成性能的大幅下降。

当然,在主链刚开始上线时这肯定不是问题,而且eos的团队也应该有足够的时间来解决这个问题。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,773评论 19 139
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 175,839评论 25 709
  • 2017年7月26日 这些日子我一直不停地忙着写《30年相聚纪实感悟》系列文章,前天终于把最后一篇稿子写完,哈哈!...
    魅力春天阅读 1,371评论 0 2
  • <正面管教>践行“花时间训练”今我在沙发上看书,10个半月大的菜苗在厅里爬来爬去,发现电视柜上哥哥装托马斯玩具卡的...
    菜籽菜苗妈阅读 1,579评论 0 0
  • 小作者:张皓涵 今天,我们学校举行运动会了。开幕式的时候,...
    张皓涵阅读 1,469评论 0 0