Skip to main content
Kronex blocks are sealed with kHeavyHash, ported from its 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 the reference byte for byte. That is deliberate: existing kHeavyHash miners and stratum bridges stay compatible with Kronex work.

The pre-image

PRE_POW_HASH is the seal hash the node selected for this work, handed out as index [0] of krnx_getWork. TIME is index [10]. The 64x64 matrix depends on the seal hash alone, so a miner generates it once per work package and then rolls only the nonce. The two form one immutable job: a miner may not roll TIME alongside the nonce. A different time is a different pre-image, which is work the node never issued.

Two things that break integrations

TIME is in milliseconds, and it is not the block’s timestamp. Header.Time stays in seconds for the EVM, the difficulty controller and reward lockups. Index [10] is a separate value, already in milliseconds, and it goes into the pre-image exactly as received. Multiplying, dividing, or storing it in a uint32 changes the pre-image and every solution is rejected.
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.