2023-11-08 12:18:32 +00:00
|
|
|
# nimbus-eth1
|
2024-02-01 21:27:48 +00:00
|
|
|
# Copyright (c) 2023-2024 Status Research & Development GmbH
|
2023-11-08 12:18:32 +00:00
|
|
|
# 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.
|
|
|
|
|
|
|
|
## Aristo DB -- Sign Helper
|
|
|
|
## ========================
|
|
|
|
##
|
|
|
|
{.push raises: [].}
|
|
|
|
|
|
|
|
import
|
|
|
|
eth/common,
|
|
|
|
results,
|
|
|
|
"."/[aristo_constants, aristo_desc, aristo_get, aristo_hashify, aristo_init,
|
2024-02-01 21:27:48 +00:00
|
|
|
aristo_merge]
|
2023-11-08 12:18:32 +00:00
|
|
|
|
|
|
|
# ------------------------------------------------------------------------------
|
|
|
|
# Public functions, signature generator
|
|
|
|
# ------------------------------------------------------------------------------
|
|
|
|
|
|
|
|
proc merkleSignBegin*(): MerkleSignRef =
|
|
|
|
## Start signature calculator for a list of key-value items.
|
|
|
|
let
|
|
|
|
db = AristoDbRef.init VoidBackendRef
|
2024-02-01 21:27:48 +00:00
|
|
|
vid = VertexID(2)
|
2023-11-08 12:18:32 +00:00
|
|
|
MerkleSignRef(
|
|
|
|
root: vid,
|
|
|
|
db: db)
|
|
|
|
|
|
|
|
proc merkleSignAdd*(
|
|
|
|
sdb: MerkleSignRef;
|
|
|
|
key: openArray[byte];
|
|
|
|
val: openArray[byte];
|
|
|
|
) =
|
|
|
|
## Add key-value item to the signature list. The order of the items to add
|
|
|
|
## is irrelevant.
|
|
|
|
if sdb.error == AristoError(0):
|
|
|
|
sdb.count.inc
|
2024-02-01 21:27:48 +00:00
|
|
|
discard sdb.db.merge(sdb.root, key, val, VOID_PATH_ID).valueOr:
|
2023-11-08 12:18:32 +00:00
|
|
|
sdb.`error` = error
|
|
|
|
sdb.errKey = @key
|
|
|
|
return
|
|
|
|
|
|
|
|
proc merkleSignCommit*(
|
|
|
|
sdb: MerkleSignRef;
|
|
|
|
): Result[HashKey,(Blob,AristoError)] =
|
|
|
|
## Finish with the list, calculate signature and return it.
|
|
|
|
if sdb.count == 0:
|
|
|
|
return ok VOID_HASH_KEY
|
|
|
|
if sdb.error != AristoError(0):
|
|
|
|
return err((sdb.errKey, sdb.error))
|
2024-02-22 08:24:58 +00:00
|
|
|
sdb.db.hashify().isOkOr:
|
2023-11-08 12:18:32 +00:00
|
|
|
let w = (EmptyBlob, error[1])
|
|
|
|
return err(w)
|
|
|
|
let hash = sdb.db.getKeyRc(sdb.root).valueOr:
|
|
|
|
let w = (EmptyBlob, error)
|
|
|
|
return err(w)
|
|
|
|
ok hash
|
|
|
|
|
|
|
|
# ------------------------------------------------------------------------------
|
|
|
|
# End
|
|
|
|
# ------------------------------------------------------------------------------
|