Kronex blocks are sealed with kHeavyHash, ported from the Kaspa reference
implementation. The pre-image layout, the cSHAKE256 domain strings, the matrix
generation including its float64 rank check, and the little-endian reading of
the final hash all match kaspad byte for byte. That is deliberate: existing
kHeavyHash miners and kaspa stratum bridges stay compatible with Kronex work.
The pre-image
Kronex uses the kHeavyHash seal hash of the block header as PRE_POW_HASH, and
the header Time field as TIME. The 64x64 matrix depends only on the seal
hash, so a miner generates it once per work template and then rolls only the
nonce.
Two things that differ from Kaspa
The timestamp is in seconds, not milliseconds. Kaspa headers carry
milliseconds; Kronex inherits Ethereum’s second-resolution Time field. A
bridge that multiplies by 1000 produces work nobody can solve.
Share difficulty and consensus difficulty are different scales, exactly
2^32 apart. Take the value the pool hands the miner from the work package
rather than converting network difficulty by hand.
MixDigest must be zero
kHeavyHash needs no DAG and no cache, so there is no light/full verification
split and nothing for a mix digest to carry. Consensus rejects any header whose
MixDigest is non-zero, and
krnx_submitWork expects a zero digest in its third
argument.
What the seal hash covers
The seal hash is an RLP hash over the usual header fields — parent hash, uncle
hash, coinbase, state root, transaction and receipt roots, bloom, difficulty,
number, gas limit, gas used, time, extra data, and the base fee when set.
One Kronex-specific field joins them when it is set: KRNXAuxRoot, the root of
the block’s merge-mining payload. Binding it into the pre-image rather than only
into the block hash is what makes the payload expensive to rewrite — the payload
decides who gets paid, and anything left out of the pre-image could be swapped
after mining without invalidating the seal.
Blocks that carry no merge-mining payload keep the stock pre-image, and
stripping a payload zeroes the root, which drops the field and changes the hash
just the same.
Block time
The target is 10 seconds. Difficulty retargets toward it; see
Difficulty.