95 lines
3.1 KiB
Nim
95 lines
3.1 KiB
Nim
# Nimbus
|
|
# Copyright (c) 2021 Status Research & Development GmbH
|
|
# Licensed under either of
|
|
# * Apache License, version 2.0, ([LICENSE-APACHE](LICENSE-APACHE) or
|
|
# http://www.apache.org/licenses/LICENSE-2.0)
|
|
# * MIT license ([LICENSE-MIT](LICENSE-MIT) or
|
|
# http://opensource.org/licenses/MIT)
|
|
# at your option. This file may not be copied, modified, or distributed
|
|
# except according to those terms.
|
|
|
|
{.push raises: [].}
|
|
|
|
import
|
|
std/[os, strutils],
|
|
chronicles,
|
|
eth/[common, p2p]
|
|
|
|
logScope:
|
|
topics = "sync-ctrl"
|
|
|
|
# ------------------------------------------------------------------------------
|
|
# Private functions
|
|
# ------------------------------------------------------------------------------
|
|
|
|
proc getDataLine(
|
|
name: string;
|
|
lineNum: int;
|
|
): string {.gcsafe, raises: [IOError].} =
|
|
if name.fileExists:
|
|
let file = name.open
|
|
defer: file.close
|
|
let linesRead = file.readAll.splitLines
|
|
if lineNum < linesRead.len:
|
|
return linesRead[lineNum].strip
|
|
|
|
# ------------------------------------------------------------------------------
|
|
# Public functions
|
|
# ------------------------------------------------------------------------------
|
|
|
|
proc syncCtrlBlockNumberFromFile*(
|
|
fileName: Option[string]; # Optional file name
|
|
lineNum = 0; # Read line from file
|
|
): Result[BlockNumber,void] =
|
|
## Returns a block number from the file name argument `fileName`. The first
|
|
## line of the file is parsed as a decimal encoded block number.
|
|
if fileName.isSome:
|
|
let file = fileName.get
|
|
try:
|
|
let data = file.getDataLine(lineNum)
|
|
if 0 < data.len:
|
|
let num = parse(data,UInt256)
|
|
return ok(num.toBlockNumber)
|
|
except CatchableError as e:
|
|
let
|
|
name {.used.} = $e.name
|
|
msg {.used.} = e.msg
|
|
debug "Exception while parsing block number", file, name, msg
|
|
err()
|
|
|
|
proc syncCtrlHashOrBlockNumFromFile*(
|
|
fileName: Option[string]; # Optional file name
|
|
lineNum = 0; # Read line from file
|
|
): Result[HashOrNum,void] =
|
|
## Returns a block number or a hash from the file name argument `fileName`.
|
|
## A block number is decimal encoded and a hash is expexted to be a 66 hex
|
|
## digits string startnib wiyh `0x`.
|
|
if fileName.isSome:
|
|
let file = fileName.get
|
|
|
|
# Parse value dump and fetch a header from the peer (if any)
|
|
try:
|
|
let data = file.getDataLine(lineNum)
|
|
if 0 < data.len:
|
|
if 66 == data.len:
|
|
let hash = HashOrNum(
|
|
isHash: true,
|
|
hash: Hash256(
|
|
data: UInt256.fromHex(data).toBytesBE))
|
|
return ok(hash)
|
|
else:
|
|
let num = HashOrNum(
|
|
isHash: false,
|
|
number: parse(data,UInt256))
|
|
return ok(num)
|
|
except CatchableError as e:
|
|
let
|
|
name {.used.} = $e.name
|
|
msg {.used.} = e.msg
|
|
debug "Exception while parsing hash or block number", file, name, msg
|
|
err()
|
|
|
|
# ------------------------------------------------------------------------------
|
|
# End
|
|
# ------------------------------------------------------------------------------
|