在这篇文章中,我们将先容“状态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节点写入优化
郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。