nimbus-eth1/nimbus/core/block_import.nim

66 lines
1.9 KiB
Nim
Raw Normal View History

# Nimbus
# Copyright (c) 2021 Status Research & Development GmbH
# Licensed under either of
# * Apache License, version 2.0, ([LICENSE-APACHE](LICENSE-APACHE))
# * MIT license ([LICENSE-MIT](LICENSE-MIT))
# at your option.
# This file may not be copied, modified, or distributed except according to
# those terms.
import
2022-12-02 04:35:41 +00:00
chronicles,
eth/rlp, stew/io2,
./chain,
../db/select_backend,
2023-05-30 08:58:41 +00:00
../common/common,
../utils/utils
2022-12-02 04:35:41 +00:00
proc importRlpBlock*(blocksRlp: openArray[byte]; com: CommonRef; importFile: string = ""): bool =
var
# the encoded rlp can contains one or more blocks
2022-04-20 07:57:50 +00:00
rlp = rlpFromBytes(blocksRlp)
2022-12-02 04:35:41 +00:00
chain = newChain(com, extraValidation = true)
errorCount = 0
2023-05-30 08:58:41 +00:00
header: BlockHeader
body: BlockBody
2023-08-06 03:42:28 +00:00
# The following kludge is needed for the `LegacyDbPersistent` type database
# when `pruneTrie` is enabled. For other cases, this code is irrelevant.
com.db.compensateLegacySetup()
2023-06-28 23:24:37 +00:00
# even though the new imported blocks have block number
# smaller than head, we keep importing it.
# it maybe a side chain.
2023-08-06 03:42:28 +00:00
while rlp.hasData:
try:
2023-05-30 08:58:41 +00:00
rlp.decompose(header, body)
2023-06-28 23:24:37 +00:00
if chain.persistBlocks([header], [body]) == ValidationResult.Error:
# register one more error and continue
errorCount.inc
except RlpError as e:
# terminate if there was a decoding error
error "rlp error",
fileName = importFile,
msg = e.msg,
exception = e.name
return false
except CatchableError as e:
# otherwise continue
error "import error",
fileName = importFile,
msg = e.msg,
exception = e.name
errorCount.inc
return errorCount == 0
2022-04-20 07:57:50 +00:00
2022-12-02 04:35:41 +00:00
proc importRlpBlock*(importFile: string; com: CommonRef): bool =
2022-04-20 07:57:50 +00:00
let res = io2.readAllBytes(importFile)
if res.isErr:
error "failed to import",
fileName = importFile
return false
2022-12-02 04:35:41 +00:00
importRlpBlock(res.get, com, importFile)