nim-ethash/spec/test_internal_c.nim

79 lines
2.2 KiB
Nim
Raw Normal View History

import strutils
import ./internal
# Copy-paste all the libethash files alongside this file
###############################################
proc toHex*[N: static[int]](ba: array[N, byte]): string {.noSideEffect.}=
## Convert a big-endian byte array to its hex representation
## Output is in lowercase
##
const hexChars = "0123456789abcdef"
result = newString(2*N)
for i in 0 ..< N:
result[2*i] = hexChars[int ba[i] shr 4 and 0xF]
result[2*i+1] = hexChars[int ba[i] and 0xF]
proc readHexChar(c: char): byte {.noSideEffect.}=
## Converts an hex char to a byte
case c
of '0'..'9': result = byte(ord(c) - ord('0'))
of 'a'..'f': result = byte(ord(c) - ord('a') + 10)
of 'A'..'F': result = byte(ord(c) - ord('A') + 10)
else:
raise newException(ValueError, $c & "is not a hexademical character")
proc hexToByteArrayBE*[N: static[int]](hexStr: string): array[N, byte] {.noSideEffect, noInit.}=
## Read an hex string and store it in a Byte Array in Big-Endian order
var i = 0
if hexStr[i] == '0' and (hexStr[i+1] == 'x' or hexStr[i+1] == 'X'):
inc(i, 2) # Ignore 0x and 0X prefix
assert hexStr.len - i == 2*N
while i < N:
result[i] = hexStr[2*i].readHexChar shl 4 or hexStr[2*i+1].readHexChar
inc(i)
###############################################
# Block 22 (POC-9 testnet, epoch 0)
let blkn = 22'u
var hash = hexToByteArrayBE[32]("372eca2454ead349c3df0ab5d00b0b706b23e49d469387db91811cee0358fc6d")
let nonce = 0x495732e0ed7a801c'u
let full_size = ethash_get_datasize(blkn)
let light_cache = ethash_light_new(blkn)
assert blkn == light_cache.block_number
let r = ethash_light_compute_internal(
light_cache,
full_size,
cast[ethash_h256_t](hash),
nonce
)
###############################################
let expected_mix_hash = "2f74cdeb198af0b9abe65d22d372e22fb2d474371774a9583c1cc427a07939f5"
let expected_boundary = "00000b184f1fdd88bfd94c86c39e65db0c36144d5e43f745f722196e730cb614"
###############################################
echo r.mix_hash.b == hexToByteArrayBE[32](expected_mix_hash)
echo "Result mixhash: " & $r.mix_hash.b.toHex
echo "Expected mixhash: " & $expected_mix_hash
echo "Result value: " & $r.result.b.toHex
echo "Expected value: " & $expected_boundary