header
header
is a sub-structure of Block
and UncleBlock
, including raw
and nonce
.
![Structure of header](/img/tech_explanation/header-structure.png)
Fields & Description
Name | Type | Description |
---|---|---|
raw | RawHeader | The payload of the block header. For more, see RawHeader. |
nonce | uint128 | The solution of the PoW puzzle. Similar to Bitcoin nonce. |
Verification Process for Header
This following snippet describes the process to validate the PoW for a block header in the Nervos CKB blockchain:
- Serializing and hashing the block's raw data.
- Concatenating the hash with the nonce.
- Running the concatenated result through the Eaglesong algorithm.
- (Optional) Re-hashing for the Testnet.
- Converting the final output to an integer and ensuring it meets the required difficulty target.
pow_hash := ckbhash(molecule_serialize(raw))
pow_message := pow_hash || to_le(nounce)
pow_output := eaglesong(pow_message)
// for Testnet, there is another round of hash
// pow_output = ckbhash(pow_output)
from_be(pow_output) <= compact_to_target(raw.compact_target)
Functions used in the pseudocode
:=
: assignment||
: binary concatenationckbhash
: Blake2b hash with CKB specific configurationto_le
: converts unsigned integer to bytes in little-endian. The bytes count is the same with the integer width.from_be
: converts bytes encoded in big-endian to an unsigned integermolecule_serialize
: serializes a structure into binary using its schemaeaglesong
: CKB’s Proof-of-Work consensus algorithm. See RFC0010: Eaglesongcompact_to_target
: restores the target from its compact form, which is the difficulty target encoded byraw.compact_target
Header Hash Derivation & Usage
The header
is hashed to produce a unique header_hash
. This header_hash
is then used to reference the block.
header_hash := ckb_hash(molecule_serialize(header))