2023-10-19 06:02:12 +00:00
|
|
|
# Nimbus
|
|
|
|
# Copyright (c) 2023 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.
|
|
|
|
|
|
|
|
import
|
|
|
|
std/[json, tables, strutils],
|
|
|
|
stint,
|
|
|
|
eth/common/eth_types,
|
|
|
|
stew/byteutils,
|
2023-12-12 19:12:56 +00:00
|
|
|
../db/ledger
|
2023-10-19 06:02:12 +00:00
|
|
|
|
|
|
|
type
|
2023-12-12 19:12:56 +00:00
|
|
|
DumpAccount* = ref object
|
|
|
|
balance* : UInt256
|
|
|
|
nonce* : AccountNonce
|
|
|
|
root* : Hash256
|
|
|
|
codeHash*: Hash256
|
|
|
|
code* : Blob
|
|
|
|
key* : Hash256
|
|
|
|
storage* : Table[UInt256, UInt256]
|
2023-10-19 06:02:12 +00:00
|
|
|
|
|
|
|
StateDump* = ref object
|
2023-12-12 19:12:56 +00:00
|
|
|
root*: Hash256
|
|
|
|
accounts*: Table[EthAddress, DumpAccount]
|
2023-10-19 06:02:12 +00:00
|
|
|
|
|
|
|
proc `%`*(x: UInt256): JsonNode =
|
|
|
|
%("0x" & x.toHex)
|
|
|
|
|
|
|
|
proc `%`*(x: Blob): JsonNode =
|
|
|
|
%("0x" & x.toHex)
|
|
|
|
|
|
|
|
proc `%`*(x: Hash256): JsonNode =
|
|
|
|
%("0x" & x.data.toHex)
|
|
|
|
|
|
|
|
proc `%`*(x: AccountNonce): JsonNode =
|
|
|
|
%("0x" & x.toHex)
|
|
|
|
|
|
|
|
proc `%`*(x: Table[UInt256, UInt256]): JsonNode =
|
|
|
|
result = newJObject()
|
|
|
|
for k, v in x:
|
|
|
|
result["0x" & k.toHex] = %(v)
|
|
|
|
|
|
|
|
proc `%`*(x: DumpAccount): JsonNode =
|
|
|
|
result = %{
|
|
|
|
"balance" : %(x.balance),
|
|
|
|
"nonce" : %(x.nonce),
|
|
|
|
"root" : %(x.root),
|
|
|
|
"codeHash": %(x.codeHash),
|
|
|
|
"code" : %(x.code),
|
|
|
|
"key" : %(x.key)
|
|
|
|
}
|
|
|
|
if x.storage.len > 0:
|
|
|
|
result["storage"] = %(x.storage)
|
|
|
|
|
|
|
|
proc `%`*(x: Table[EthAddress, DumpAccount]): JsonNode =
|
|
|
|
result = newJObject()
|
|
|
|
for k, v in x:
|
|
|
|
result["0x" & k.toHex] = %(v)
|
|
|
|
|
|
|
|
proc `%`*(x: StateDump): JsonNode =
|
|
|
|
result = %{
|
|
|
|
"root": %(x.root),
|
|
|
|
"accounts": %(x.accounts)
|
|
|
|
}
|
|
|
|
|
2023-12-12 19:12:56 +00:00
|
|
|
proc dumpAccount*(db: LedgerRef, acc: EthAddress): DumpAccount =
|
2023-10-19 06:02:12 +00:00
|
|
|
result = DumpAccount(
|
|
|
|
balance : db.getBalance(acc),
|
|
|
|
nonce : db.getNonce(acc),
|
|
|
|
root : db.getStorageRoot(acc),
|
|
|
|
codeHash: db.getCodeHash(acc),
|
|
|
|
code : db.getCode(acc),
|
|
|
|
key : keccakHash(acc)
|
|
|
|
)
|
|
|
|
for k, v in db.cachedStorage(acc):
|
|
|
|
result.storage[k] = v
|
|
|
|
|
2023-12-12 19:12:56 +00:00
|
|
|
proc dumpAccounts*(db: LedgerRef): Table[EthAddress, DumpAccount] =
|
2023-10-19 06:02:12 +00:00
|
|
|
for acc in db.addresses():
|
|
|
|
result[acc] = dumpAccount(db, acc)
|
|
|
|
|
2023-12-12 19:12:56 +00:00
|
|
|
proc dumpState*(db: LedgerRef): StateDump =
|
2023-10-19 06:02:12 +00:00
|
|
|
StateDump(
|
|
|
|
root: db.rootHash,
|
|
|
|
accounts: dumpAccounts(db)
|
|
|
|
)
|
|
|
|
|
2023-12-12 19:12:56 +00:00
|
|
|
proc dumpAccounts*(stateDB: LedgerRef, addresses: openArray[EthAddress]): JsonNode =
|
2023-10-19 06:02:12 +00:00
|
|
|
result = newJObject()
|
|
|
|
for ac in addresses:
|
|
|
|
result[ac.toHex] = %dumpAccount(stateDB, ac)
|
|
|
|
|