nimbus-eth1/nimbus/conf_utils.nim

51 lines
1.5 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
std/[terminal, os],
chronicles, eth/trie/db, eth/[common, rlp], stew/[io2, byteutils],
./config, ./genesis, ./p2p/chain,
./db/[db_chain, select_backend, storage_types]
type
# trick the rlp decoder
# so we can separate the body and header
EthHeader = object
header: BlockHeader
proc importRlpBlock*(importFile: string, chainDB: BasechainDB) =
let res = io2.readAllBytes(importFile)
if res.isErr:
error "failed to import", fileName = importFile
quit(QuitFailure)
var chain = newChain(chainDB)
# the encoded rlp can contains one or more blocks
var rlp = rlpFromBytes(res.get)
# separate the header and the body
# TODO: probably we need to put it in one struct
var headers: seq[BlockHeader]
var bodies : seq[BlockBody]
let head = chainDB.getCanonicalHead()
while true:
let header = rlp.read(EthHeader).header
let body = rlp.readRecordType(BlockBody, false)
if header.blockNumber > head.blockNumber:
headers.add header
bodies.add body
if not rlp.hasData:
break
let valid = chain.persistBlocks(headers, bodies)
if valid == ValidationResult.Error:
error "failed to import rlp encoded blocks", fileName = importFile
quit(QuitFailure)