Klaytn状态迁移:降低区块链数据大小的有效方法
发布:中币网 时间:2021-03-10 00:00:00 加入收藏 打赏
在这篇文章中,我们将介绍“状态Trie迁移”的概念,这是一个降低Klaytn区块链数据大小的过程。
什么是区块链存储?
区块链存储是保存所有区块链相关数据的地方。它的结构如下图所示:
区块链数据基本上是一个相互连接的区块链,每个区块由区块头( Header)、区块体(Body)和交易收条(Receipt)构成 。当前状态的数据形成所谓的Trie结构,可以通过区块头中包含的状态根(state root)进行访问。因此,区块链包含各种数据元素,这些数据元素最终存储在数据库(LevelDB)中。
开发动机与当前存储状态
自创世(genesis)区块生成以来,Klaytn主网 Cypress已累积了约1.2TB的区块链数据(指定区块链的全部数据)。如果您想在Cypress主网上运行一个节点,就需要使用这个区块链数据,但是存储带来的成本非常高。
截至2020年12月3日,主网Cypress的区块数据大小如下:
完整节点:1.2TB完整节点(每隔128个区块,将状态数据保存在存储中的节点)
存储上一批128个区块状态的完整节点消耗了大约1.2TB的数据,其中942GB是由状态trie消耗的。
存档节点:2.3TB(存储每个新区块状态的节点)
存储每个区块状态的存档节点包含2.3TB的区块链数据,其中约2TB基本上是状态trie结构。
状态Trie的特征
让我们仔细查看状态Trie,它在区块链数据中占用了最多的存储空间。状态trie包含Klaytn上所有帐户(包括合约)的计数器(nonce)、余额(balance)和帐户密钥(account keys)。对于合约帐户,它有一个单独的存储trie,保存在状态trie中。
数据以trie的形式保存,每个trie节点以键/值(key/value)对的形式存储。如下所示,每个trie节点都以键/值对的形式存储在现有数据库中。键是指trie节点值的哈希值,因此即使有几个相同的trie节点,它们也将作为唯一的记录存储在数据库中。
状态Trie迁移背后的理念
正如我们目前所看到的,每个区块都包含一个状态trie。但是请注意下面的trie节点A和B,它们只存在于区块号100中,处理区块号102时并不需要trie结点。
这就是不必要的trie节点开始堆积的原因。也就是说,即使过去的状态是不可检索的,移除这些trie节点并不会影响新区块的处理。
以太坊上有“快速同步”选项;基本上,当您启动一个新节点时,您将通过p2p同步最后一个状态,并且只处理从该节点开始添加的新区块。但是Klaytn抢先一步,想到了一些方法来降低数据大小,且不会影响新添加的以及当前正在运行的节点。
状态迁移过程
下面是一个循序渐进的过程:
1. 创建一个新的数据库(DB)(一个新的状态trie数据库)。首先,若知道在哪个区块上执行迁移后,就需要为新的状态trie创建一个数据库。这一新数据库将存储新添加的区块(包括您为迁移选择的区块)的状态trie。
2. 转移已迁移区块的状态trie并将其复制到新的状态trie 数据库中。
3.迁移完成后,删除旧数据库。
4.现在有了一个新的数据库,存储着指定区块和新区块的状态。
状态Trie迁移过程或许简单,但无法快速完成。在迁移过程中会添加新的区块,并对它们进行处理,结果也会写入新的数据库中。在下图中,新区块102正在处理中,而区块101的迁移仍在进行中,这意味着必须查询新的和现有的数据库。
状态迁移的结果
让我们看看迁移后存储的变化。状态Trie过去在整个节点中占用942GB的存储空间,现在占用55GB,已经大大减少了94%。
已迁移的完整节点:294GB(每隔128个区块,保存区块45、131、309的状态的节点)
技术问题和解决方案
在执行状态迁移的过程中,我们通过性能优化实现了更高的速度。
状态迁移的性能/内存优化
1.并行处理
实现第一次状态迁移之后,发现在AWS EC2 m5.4xlarge 实例上花费了数周以上的时间。之后,通过数据库的并行复制将时间缩短到三天。
2.重复trie节点写入优化
截至区块45131309,状态trie约包含8亿个节点,但移除重复节点后,大约有4亿个。为了消除重复节点,已写入数据库的状态trie的哈希值被保存。在向数据库请求存储之前,该方法会检查状态 trie节点是否已经存储在数据库中。该方法把所需时间从三天缩短到一天。
3.基于LRU的key缓存
在处理重复的trie节点时,必须存储所有trie节点key,这需要为主网Cypress提供20GB以上的内存空间。但是有大约1亿个重复节点,并且,通过使用2GB LRU缓存,实现的性能与存储和检查所有trie节点key时的性能是一致的。
迁移中止和错误
由于状态迁移需要一天以上的时间,所以还必须考虑到出现中止或意外错误的可能性。因此,即便在执行状态迁移时,我们也可以将最新区块中的trie节点存储在现有数据库和新数据库中。即使迁移中止,仍然可以保留现有数据库并删除新数据库。当迁移完成后,新数据库可以保留下来,并代替旧数据库。
我们已经了解了状态迁移过程的技术方面。我们希望降低主网Cypress上区块链数据的大小可以让Klaytn节点的运行更简单、更经济。但是,为加快在处理每个新区块时删除不必要的trie节点的速度,我们会继续探索其他方法,最终提升状态trie运行的可持续性。
状态Trie迁移可以通过调用startStateMigration API来实现,这需求klaytnv1.5.0或以上的版本。我们鼓励大家采用这种方法。
希望这篇文章能够帮助您降低区块数据大小。Klaytn团队始终为用户着想,致力于为用户提供全新的、更好的功能。未来我们将会秉承这一承诺。
谢谢阅读,敬请期待我们的下一篇文章!
关于Klaytn
项目名称: Klaytn
英文缩写: KLAY
官方网站: https://www.klaytn.com/
项目简介:Klaytn是以服务为中心的企业级分布式信任区块链平台,通过高效的“混合”设计,结合了公有链(分布式数据和控制、分布式治理)和私有链(低延迟、高可扩展性)的最优功能。Klaytn与全球众多知名品牌的参与合作,通过共同的不懈努力,创建可靠的去中心化业务平台。Klaytn治理委员会是一个由跨国企业和组织组成的联盟,负责运营共识节点网络,推动生态系统发展。Kakao 的区块链开发部门「Ground X」已正式推出 Klaytn,并可用于商业用途。
来源:
来源:中币网 https://www.zhongbi.net/news/blocknews/307403.html 声明:登载此文仅出于分享区块链知识,并不意味着赞同其观点或证实其描述。文章内容仅供参考,不构成投资建议。投资者据此操作,风险自担。 此文如侵犯到您的合法权益,请联系我们3111859717@qq.com,我们将第一时间处理。