Skip to content

Block Header Binary Encoding

Lars Kuhtz edited this page May 21, 2020 · 30 revisions

BlockHeader Binary Format For Chain Graphs of Degree Three without Hash

defined in Chainweb.BlockHeader

Size Bytes Value
8 0-7 flags
8 8-15 time
32 16-47 parent
110 48-157 adjacents
32 158-189 target
32 190-221 payload
4 222-225 chain
32 226-257 weight
8 258-265 height
4 266-269 version
8 270-277 epoch start
8 278-285 nonce
32 286-317 hash

total: 318 bytes

Adjacent Parents Record (length 3):

Bytes Value
0-1 length
2-109 adjacents

total: 110 bytes

Adjacent Parent:

Bytes Value
0-3 chain
4-35 hash

total: 36 bytes

Fields

POW related values:

Arithmetic operations and comparisons on parent, target, weight, and hash interpret the value as unsigned 256 bit integral numbers in little endian encoding.

Time Stamps:

time and epoch start are a little endian twoth complement encoded integral numbers that counts SI microseconds since POSIX epoch. These numbers are always positive (highest bit is 0).

Numbers:

  • height is a little endian encoded unsigned integral 64 bit number.
  • length is a little endian encoded unsigned integral 16 bit number.

Version:

version identifies the chainweb version. It is a 32 bit value in little endian encoding. Values up to 0x0000FFFF are reserved for production versions (which includes Development and testnets).

value version
0x00000001 Development
0x00000004 Testnet02

Other:

  • nonce is any sequence of 8 bytes that is only compared for equality.
  • chain is any sequence of 4 bytes that identifies a chain and can be compared for equality.
  • payload is any sequence of 32 bytes that is a cryptographic hash of the payload associated with the block and can be compared for equality.
  • flags are eight bytes of value 0x0 that are reserved for future use.

Work Header Binary Format

The work bytes received the /miner/work endpoint is slightly different than the above header format. These headers do not include the block hash, instead prefixing the header above (without hash) with chain id and hash target bytes.

The first 36 bytes are informational. Only the bytes from position 36 to the end are subject the the POW hash computation.

The final 8 bytes are the nonce. The creation time is encoded in bytes 44-52 (see above for details of the encoding). Miners are encouraged to update the time to reflect the solve time for the block as close as possible. A larger value for the creation time increases the accuracy of difficulty adjustment which is in the interest of miners -- the high difficulty guarantees that the outcome of the race of winning blocks is determined by actual hash power. However, blocks that are predated (i.e. have a a creation time that is in the future) are rejected during block header validation.

Miners must not change or make any assumptions about the content of the "reserved" bytes.

Defined in Chainweb.Miner.Core

Size Bytes Value
4 0-3 chain
32 4-35 hash-target
8 36-43 reserved
8 44-51 time
298 52-313 reserved
8 314-321 nonce

total: 322 bytes