2024-11-06 02:01:42 +00:00
|
|
|
# Nimbus
|
2024-11-29 09:13:08 +00:00
|
|
|
# Copyright (c) 2021-2024 Status Research & Development GmbH
|
2024-11-06 02:01:42 +00:00
|
|
|
# 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.
|
|
|
|
|
|
|
|
{.push raises: [].}
|
|
|
|
|
|
|
|
import
|
|
|
|
std/[typetraits, tables],
|
|
|
|
eth/common/base,
|
|
|
|
eth/common/times,
|
|
|
|
eth/common/hashes,
|
|
|
|
eth/common/addresses,
|
|
|
|
stew/endians2,
|
|
|
|
stint,
|
|
|
|
nimcrypto/sha2,
|
|
|
|
./chain_config
|
|
|
|
|
|
|
|
# ------------------------------------------------------------------------------
|
|
|
|
# When the client doing initialization step, it will go through
|
|
|
|
# complicated steps before the genesis hash is ready. See `CommonRef.init`.
|
|
|
|
# If the genesis happen to exists in database belonging to other network,
|
|
|
|
# it will replace the one in CommonRef cache.
|
|
|
|
# That is the reason why using genesis header or genesis hash + ChainId is
|
|
|
|
# not a good solution to prevent loading existing data directory for
|
|
|
|
# the wrong network.
|
|
|
|
# But the ChainConfig + raw Genesis hash will make the job done before
|
|
|
|
# CommonRef creation.
|
|
|
|
# ------------------------------------------------------------------------------
|
|
|
|
|
|
|
|
# ------------------------------------------------------------------------------
|
|
|
|
# Private helper functions
|
|
|
|
# ------------------------------------------------------------------------------
|
|
|
|
|
|
|
|
func update(ctx: var sha256, val: uint64 | UInt256) =
|
|
|
|
ctx.update(val.toBytesLE)
|
|
|
|
|
|
|
|
func update(ctx: var sha256, val: ChainId | EthTime | NetworkId) =
|
|
|
|
ctx.update(distinctBase val)
|
|
|
|
|
|
|
|
func update(ctx: var sha256, val: bool) =
|
|
|
|
ctx.update([val.byte])
|
|
|
|
|
|
|
|
func update(ctx: var sha256, val: Hash32 | Bytes8 | Bytes32 | Address) =
|
|
|
|
ctx.update(val.data)
|
|
|
|
|
|
|
|
func update[T](ctx: var sha256, val: Opt[T]) =
|
|
|
|
if val.isSome:
|
|
|
|
ctx.update(val.get)
|
|
|
|
|
|
|
|
func update[K, V](ctx: var sha256, val: Table[K, V]) =
|
|
|
|
mixin update
|
|
|
|
for k, v in val:
|
|
|
|
ctx.update(k)
|
|
|
|
ctx.update(v)
|
|
|
|
|
|
|
|
func update[T: object](ctx: var sha256, val: T) =
|
|
|
|
for f in fields(val):
|
|
|
|
ctx.update(f)
|
|
|
|
|
|
|
|
func update[T: ref](ctx: var sha256, val: T) =
|
|
|
|
for f in fields(val[]):
|
|
|
|
ctx.update(f)
|
|
|
|
|
|
|
|
# ------------------------------------------------------------------------------
|
|
|
|
# Public functions
|
|
|
|
# ------------------------------------------------------------------------------
|
|
|
|
|
|
|
|
func calcHash*(networkId: NetworkId, conf: ChainConfig, genesis: Genesis): Hash32 =
|
|
|
|
var ctx: sha256
|
|
|
|
ctx.init()
|
|
|
|
ctx.update(networkId)
|
|
|
|
ctx.update(conf)
|
|
|
|
if genesis.isNil.not:
|
|
|
|
ctx.update(genesis)
|
|
|
|
ctx.finish(result.data)
|
|
|
|
ctx.clear()
|
|
|
|
|
|
|
|
func calcHash*(networkId: NetworkId, params: NetworkParams): Hash32 =
|
|
|
|
calcHash(networkId, params.config, params.genesis)
|