2019-11-13 14:49:39 +00:00
|
|
|
import unittest2, strutils, tables, os, json,
|
2019-08-23 15:54:25 +00:00
|
|
|
../nimbus/utils/difficulty, stint, times,
|
2020-02-20 03:43:47 +00:00
|
|
|
eth/common, test_helpers, stew/byteutils,
|
|
|
|
../nimbus/constants, ../nimbus/vm/interpreter/vm_forks
|
2019-08-23 15:54:25 +00:00
|
|
|
|
|
|
|
type
|
|
|
|
Tester = object
|
|
|
|
parentTimestamp: int64
|
|
|
|
parentDifficulty: Uint256
|
|
|
|
parentUncles: Hash256
|
|
|
|
currentTimestamp: int64
|
|
|
|
currentBlockNumber: Uint256
|
|
|
|
currentDifficulty: Uint256
|
|
|
|
|
|
|
|
Tests = Table[string, Tester]
|
|
|
|
|
|
|
|
proc hexOrInt64(data: JsonNode, key: string, hex: static[bool]): int64 =
|
|
|
|
when hex:
|
|
|
|
getHexadecimalInt data[key]
|
|
|
|
else:
|
|
|
|
int64(parseInt data[key].getStr)
|
|
|
|
|
|
|
|
proc hexOrInt256(data: JsonNode, key: string, hex: static[bool]): Uint256 =
|
|
|
|
when hex:
|
|
|
|
UInt256.fromHex data[key].getStr
|
|
|
|
else:
|
|
|
|
parse(data[key].getStr, Uint256)
|
|
|
|
|
|
|
|
proc parseTests(name: string, hex: static[bool]): Tests =
|
|
|
|
let fileName = "tests" / "fixtures" / "DifficultyTests" / "difficulty" & name & ".json"
|
|
|
|
let fixtures = parseJSON(readFile(fileName))
|
|
|
|
|
|
|
|
result = initTable[string, Tester]()
|
|
|
|
var t: Tester
|
|
|
|
for title, data in fixtures:
|
|
|
|
t.parentTimestamp = hexOrInt64(data, "parentTimestamp", hex)
|
|
|
|
t.parentDifficulty = hexOrInt256(data, "parentDifficulty", hex)
|
2020-02-20 03:43:47 +00:00
|
|
|
let pu = data.fields.getOrDefault("parentUncles")
|
|
|
|
if pu.isNil:
|
|
|
|
t.parentUncles = EMPTY_UNCLE_HASH
|
|
|
|
else:
|
|
|
|
hexToByteArray(pu.getStr, t.parentUncles.data)
|
2019-08-23 15:54:25 +00:00
|
|
|
t.currentTimestamp = hexOrInt64(data, "currentTimestamp", hex)
|
|
|
|
t.currentBlockNumber = hexOrInt256(data, "currentBlockNumber", hex)
|
|
|
|
t.currentDifficulty = hexOrInt256(data, "currentDifficulty", hex)
|
|
|
|
result[title] = t
|
|
|
|
|
|
|
|
template runTests(name: string, hex: bool, calculator: typed) =
|
2020-02-20 03:43:47 +00:00
|
|
|
let testTitle = if name == "": "Difficulty" else: name
|
|
|
|
test testTitle:
|
2019-05-30 16:42:55 +00:00
|
|
|
let data = parseTests(name, hex)
|
|
|
|
for title, t in data:
|
|
|
|
var p = BlockHeader(
|
|
|
|
difficulty: t.parentDifficulty,
|
|
|
|
timestamp: times.fromUnix(t.parentTimestamp),
|
|
|
|
blockNumber: t.currentBlockNumber - 1,
|
|
|
|
ommersHash: t.parentUncles)
|
2019-08-23 15:54:25 +00:00
|
|
|
|
2019-05-30 16:42:55 +00:00
|
|
|
let diff = calculator(times.fromUnix(t.currentTimeStamp), p)
|
2019-08-23 15:54:25 +00:00
|
|
|
check diff == t.currentDifficulty
|
|
|
|
|
2020-02-20 03:43:47 +00:00
|
|
|
func calcDifficultyMainNetWork(timeStamp: EthTime, parent: BlockHeader): DifficultyInt =
|
|
|
|
calcDifficulty(timeStamp, parent, parent.blockNumber.toFork)
|
|
|
|
|
2019-09-21 05:45:23 +00:00
|
|
|
proc difficultyMain*() =
|
|
|
|
suite "DifficultyTest":
|
2020-02-20 03:43:47 +00:00
|
|
|
runTests("EIP2384_random_to20M", true, calcDifficultyGlacierMuir)
|
|
|
|
runTests("EIP2384_random", true, calcDifficultyGlacierMuir)
|
|
|
|
runTests("EIP2384", true, calcDifficultyGlacierMuir)
|
2019-09-21 05:45:23 +00:00
|
|
|
runTests("Byzantium", true, calcDifficultyByzantium)
|
|
|
|
runTests("Constantinople", true, calcDifficultyConstantinople)
|
|
|
|
runTests("Homestead", true, calcDifficultyHomestead)
|
2020-02-20 03:43:47 +00:00
|
|
|
runTests("MainNetwork", true, calcDifficultyMainNetwork)
|
2019-09-21 05:45:23 +00:00
|
|
|
runTests("Frontier", true, calcDifficultyFrontier)
|
|
|
|
runTests("", false, calcDifficulty)
|
2019-10-26 01:24:05 +00:00
|
|
|
|
|
|
|
when isMainModule:
|
|
|
|
difficultyMain()
|