2021-02-09 15:23:06 +00:00
|
|
|
# Nimbus
|
2021-03-19 08:26:02 +00:00
|
|
|
# Copyright (c) 2018-2021 Status Research & Development GmbH
|
2021-02-09 15:23:06 +00:00
|
|
|
# Licensed under either of
|
|
|
|
# * Apache License, version 2.0, ([LICENSE-APACHE](LICENSE-APACHE) or https://www.apache.org/licenses/LICENSE-2.0)
|
|
|
|
# * MIT license ([LICENSE-MIT](LICENSE-MIT) or https://opensource.org/licenses/MIT)
|
|
|
|
# at your option. This file may not be copied, modified, or distributed except according to those terms.
|
|
|
|
|
|
|
|
{.used.}
|
|
|
|
|
|
|
|
import
|
|
|
|
# Standard library
|
|
|
|
std/[unittest, os],
|
|
|
|
# Status lib
|
|
|
|
eth/db/kvstore,
|
|
|
|
stew/results,
|
|
|
|
nimcrypto/utils,
|
|
|
|
serialization,
|
|
|
|
json_serialization,
|
|
|
|
# Internal
|
2021-03-02 10:27:45 +00:00
|
|
|
../../beacon_chain/validators/[
|
2021-02-09 15:23:06 +00:00
|
|
|
slashing_protection,
|
2021-03-19 08:26:02 +00:00
|
|
|
slashing_protection_v1
|
2021-02-09 15:23:06 +00:00
|
|
|
],
|
|
|
|
../../beacon_chain/spec/[datatypes, digest, crypto, presets],
|
|
|
|
# Test utilies
|
|
|
|
../testutil
|
|
|
|
|
|
|
|
template wrappedTimedTest(name: string, body: untyped) =
|
|
|
|
# `check` macro takes a copy of whatever it's checking, on the stack!
|
|
|
|
block: # Symbol namespacing
|
|
|
|
proc wrappedTest() =
|
|
|
|
timedTest name:
|
|
|
|
body
|
|
|
|
wrappedTest()
|
|
|
|
|
|
|
|
func fakeRoot(index: SomeInteger): Eth2Digest =
|
|
|
|
## Create fake roots
|
|
|
|
## Those are just the value serialized in big-endian
|
|
|
|
## We prevent zero hash special case via a power of 2 prefix
|
|
|
|
result.data[0 ..< 8] = (1'u64 shl 32 + index.uint64).toBytesBE()
|
|
|
|
|
|
|
|
func fakeValidator(index: SomeInteger): ValidatorPubKey =
|
|
|
|
## Create fake validator public key
|
|
|
|
result = ValidatorPubKey()
|
|
|
|
result.blob[0 ..< 8] = (1'u64 shl 48 + index.uint64).toBytesBE()
|
|
|
|
|
|
|
|
func hexToDigest(hex: string): Eth2Digest =
|
|
|
|
result = Eth2Digest.fromHex(hex)
|
|
|
|
|
|
|
|
proc sqlite3db_delete(basepath, dbname: string) =
|
|
|
|
removeFile(basepath / dbname&".sqlite3-shm")
|
|
|
|
removeFile(basepath / dbname&".sqlite3-wal")
|
|
|
|
removeFile(basepath / dbname&".sqlite3")
|
|
|
|
|
|
|
|
const TestDir = ""
|
|
|
|
const TestDbName = "t_slashprot_migration"
|
|
|
|
|
|
|
|
suiteReport "Slashing Protection DB - v1 and v2 migration" & preset():
|
|
|
|
# https://eips.ethereum.org/EIPS/eip-3076
|
|
|
|
sqlite3db_delete(TestDir, TestDbName)
|
|
|
|
|
|
|
|
wrappedTimedTest "Minimal format migration" & preset():
|
|
|
|
let genesis_validators_root = hexToDigest"0x04700007fabc8282644aed6d1c7c9e21d38a03a0c4ba193f3afe428824b3a673"
|
|
|
|
block: # export from a v1 DB
|
|
|
|
let db = SlashingProtectionDB_v1.init(
|
|
|
|
genesis_validators_root,
|
|
|
|
TestDir,
|
|
|
|
TestDbName
|
|
|
|
)
|
|
|
|
|
|
|
|
let pubkey = ValidatorPubKey
|
|
|
|
.fromHex"0xb845089a1457f811bfc000588fbb4e713669be8ce060ea6be3c6ece09afc3794106c91ca73acda5e5457122d58723bed"
|
|
|
|
.get()
|
|
|
|
db.registerBlock(
|
|
|
|
pubkey,
|
|
|
|
Slot 81952,
|
|
|
|
Eth2Digest()
|
|
|
|
)
|
|
|
|
|
|
|
|
db.registerAttestation(
|
|
|
|
pubkey,
|
|
|
|
source = Epoch 2290,
|
|
|
|
target = Epoch 3007,
|
|
|
|
Eth2Digest()
|
|
|
|
)
|
|
|
|
|
|
|
|
let spdir = db.toSPDIR_lowWatermark()
|
|
|
|
Json.saveFile(
|
|
|
|
currentSourcePath.parentDir/"t_migration_slashing_protection_v1.json",
|
|
|
|
spdir,
|
|
|
|
pretty = true
|
|
|
|
)
|
|
|
|
|
|
|
|
db.close()
|
|
|
|
|
|
|
|
block: # Reopen as the new version
|
|
|
|
let db = SlashingProtectionDB.init(
|
|
|
|
genesis_validators_root,
|
|
|
|
TestDir,
|
|
|
|
TestDbName
|
|
|
|
)
|
|
|
|
|
|
|
|
# Check that v2 as been initialized (private field :/)
|
|
|
|
# doAssert: db.db_v2.getMetadataTable_DbV2().get() == genesis_validators_root
|
|
|
|
|
|
|
|
db.exportSlashingInterchange(
|
|
|
|
currentSourcePath.parentDir/"t_migration_slashing_protection_migrated.json"
|
|
|
|
)
|
|
|
|
|
|
|
|
doAssert sameFileContent(
|
|
|
|
currentSourcePath.parentDir/"t_migration_slashing_protection_v1.json",
|
|
|
|
currentSourcePath.parentDir/"t_migration_slashing_protection_migrated.json"
|
|
|
|
)
|