节点数据库
## 节点数据库
节点使用串行 LevelDB 数据库来保存已处理的块、交易等。
数据可以删除也可以不删除,这取决于在config.toml
中是否可以启用修剪标志。用于指定节点是否应该删除数据库的标志是ValidatorCleanOldEpochsData
和ObserverCleanOldEpochsData
。旧版本的配置只有一个标志CleanOldEpochsData
。如果设置为 false,则不会删除旧数据库。
默认情况下,验证器只保留最后 4 个时期,并删除旧的时期以释放磁盘空间。
默认数据库目录为<node-working-directory>/db
,其内容应符合以下结构:
/db
└── <chain id>
├── Epoch_X
│ └── Shard_X
│ ├── BlockHeaders
│ │ ├── 000001.log
│ │ ├── CURRENT
│ │ ├── LOCK
│ │ ├── LOG
│ │ └── MANIFEST-000000
│ ├── BootstrapData
│ │ ├── 000001.log
| .............
└── Static
└── Shard_X
├── AccountsTrie
│ └── MainDB
│ ├── 000001.log
.............
如果在启动过程中检测到状态,节点将从现有数据库中获取状态。如果它与当前网络高度不匹配,它将从网络同步其余数据,直到完全同步。
启动已有数据库的节点
在一些用例中,一个节点可以从完全同步的另一个节点接收整个数据库,以加快进程。为此,必须将整个数据库目录复制到新节点。这就像将db/
目录从一个节点复制到另一个节点一样简单。
除了独立于数据库的 BLS 键之外,配置文件必须与旧节点相同。
同一个碎片中的两个节点生成相同的数据库。这些数据库之间可以互换。然而,作为观察者启动一个节点并设置--destination-shard-as-observer
以便它加入一个预先设置的碎片,要求它的数据库来自同一个碎片。因此,用 shard 0 节点的数据库启动 shard 1 中的观察器将导致忽略数据库和仅网络数据获取。
如果配置和数据库的碎片相同,那么节点应该具有来自数据库的完整状态,并开始与网络同步仅剩余的项目。例如,如果一个节点从 255 个时期的数据库开始,并且当前时期是 256,那么它将只从网络同步来自丢失时期的数据。