> ## Documentation Index
> Fetch the complete documentation index at: https://docs.kronex.network/llms.txt
> Use this file to discover all available pages before exploring further.

# Consensus

> kHeavyHash, the Kaspa-compatible pre-image Kronex seals blocks with, and what differs from Kaspa.

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

```text theme={null}
PRE_POW_HASH (32) || TIME uint64 LE (8) || zero padding (32) || NONCE uint64 LE (8)
```

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

<Warning>
  **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.
</Warning>

<Warning>
  **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.
</Warning>

## 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`](/rpc/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](/learn/difficulty).
