EOS主网运行九个月以来,数据越来越多,运行完整的历史记录变得昂贵、复杂且耗时。目前,只有Sw/eden、EOS Canada,EOS Asia和Oracle Chain等少数BP仍在坚持,但为此每月花费超过15000美元,这在币价低迷的熊市是难得可贵的。为了解决这个问题,社区很多人都在出谋划策,其中EOS Rio提出了Hyperion History API解决方案,EOS Cafe为其创建了js库,并且已经在区块链浏览器 bloks.io上集成了Hyperion History(v2 API)。
History API可以说是EOS主网上几个月来最紧迫的问题。DApp、区块浏览器和钱包必须查阅历史信息才能正常工作,而在EOS主网上运行完整的历史记录变得昂贵、复杂且耗时。
V1 History API已被弃用,只有少数BP坚持不断为整个网络提供完整的公共历史节点,(特别感谢Sw / eden,CryptoLions,EOS Tribe,Greymass,EOS Canada,EOS Asia和Oracle Chain!),而其他许多人也都为解决这个问题付出了巨大努力。
有些人认为这不是一个大问题,认为DApp可以找到一种商业模式来专门支付于他们交易的部分历史节点,而区块浏览器和钱包可以使用轻历史节点。然而,EOS社区普遍认为,难以提供历史链数据可能会妨碍EOS满足可扩展性预期的能力,而这种预测常常会成真。
在撰写本文时(2019年3月7日),EOS 主链包含大约4600万个区块,因此对于新手开始提供服务,节点必须摄取所有这些区块以及每秒附加到区块链中的另外两个区块。目前来看,是一个需要数周的过程。同步后,当前的v1 History Plugin需要超过5 Tb的存储空间才能运行。查询此数据库需要大量处理能力和网络带宽。因此,运行完整的历史记录可能会花费超过15,000美元/月。
一个新视角
几个月前,EOS Rio团队开始就此问题的可能性解决方案进行头脑风暴。我们决定从头开始,而不是专注于感知瓶颈以增加数据摄取、存储和查询功能。第一步是分析可以采取哪些措施来优化数据库大小本身。我们了解到History API v1存储了大量冗余信息。
原始的history_plugin与eosio捆绑在一起,提供了v1 API,存储了嵌套在根操作中的内联动作跟踪。每当用户请求给定帐户的操作历史时,将导致存储和传输过量数据。此外,内联操作通常用作“事件”机制,以通知交易方,并且存储它几乎没有价值。
Hyperion History实现了一种新的数据结构和存储方法:
1、动作以展平格式存储。
2、将父字段添加到内联操作以指向父全局序列。
3、如果内联操作数据与父操作数据相同,则将其视为通知,从而从数据库中删除。
4、没有存储区块或事务数据,可以从动作重建所有信息。
5、没有存储交易验证信息,因为可以使用Chain API在区块信息上验证所有信息,DApp不使用历史记录。
通过这些更改,API格式专注于缩短响应时间,降低带宽开销,并使UI / UX开发人员更易于使用。
数据结构存储如下:
小但强大
更改格式和减少数据冗余可将数据库大小减少约85%,从近5Tb减少到约650 Gb。为了进一步提高性能,我们设计了一个多线程索引器,它从状态历史插件中提取数据,并且可以在大约72小时内通过适当的硬件优化来摄取完整的EOS区块链,而当前的解决方案可能需要数周时间。
我们还引入了“ABI历史缓存层”组件,以防止在ABI修改上并行处理历史数据时出现反序列化失败。
对于数据库,我们部署了一个Elasticsearch集群,该集群在位于巴西里约热内卢的一级基础架构上并置的两个定制组装裸机服务器上运行。
优化的数据结构倾向于减少CPU和带宽消耗,使基础架构更具可扩展性。运行完整历史API的其他BP已经在测试Hyperion并帮助其发展。
我们非常感谢来自EOS Cafe的Syed Jafri为Hyperion HTTP API创建了一个javascript库,并且已经在 bloks.io上集成了Hyperion History(v2 API)。还有Sw/eden团队在cleos上添加v2兼容性。非常感谢eosDAC、CryptoLions和BlockMatrix的贡献。
新history API标准的建议
对于开发人员来说,提供扁平的结果优于今天的history API标准。当前的eosio历史插件不必要地使用冗余信息来扩充数据库(用于最终用户历史记录)。过滤内联操作的可能性允许减少API带宽消耗和编码复杂性。
为适应这些变化,EOS Rio和其他开发历史解决方案的BP们正在倡导history API V2标准,以供 EOS 社区采用。
请您用一点儿宝贵时间对其进行评估并向我们发送反馈信息。
一个开源项目
EOS Rio已经在br.eosrio.io/v2/history上使用Hyperion提供History API。项目代码和初步设置说明在github.com/eosrio/Hyperion-History-API,我们将根据开源许可证发布此用于非商业用途。
我们可以帮助任何想要运行Hyperion History的人,我们期待您的反馈信息。
下一步
下一步是为操作流实现WebSocket API。这就是我们现在正在做的事情。
完成后,下一个功能将实现Hyperion Analytics,这是Hyperion History API上的一个高级层,可提供详细的EOS统计信息。
网友评论