Core Protocol

Binary messages exchanged between Ixian Core peers. Each message has a numeric code and may have a request/response pairing. Detailed structure for each message is documented on its own subpage.

Envelope (v6)

This section defines the binary envelope used by all core messages and links to each message specification. Every message lives in its own file.

OffsetSizeTypeFieldDescription
01uint8startConstant 0xEA
12uint16codeProtocolMessageCode for the payload
34uint32lengthPayload length in bytes (must be > 0, < 50MB)
74uint32checksumCRC32C of the payload bytes
111uint8headerChecksumXOR checksum over the 11 header bytes above
12Nbyte[length]payloadMessage payload, structure depends on code

Header checksum: computed by XOR'ing all header bytes before headerChecksum, starting with seed 0x7F.

Payload checksum: CRC32C (Castagnoli) over the payload bytes.

Global Serialization Rules

The following rules apply to all message payloads unless specified otherwise.

  • Endianness: All multi-byte integer types (uint16, int32, uint64, etc.) are serialized in Little-Endian byte order.
  • String Encoding: All strings are encoded using the standard .NET BinaryWriter format, which prefixes the UTF-8 bytes with the string's length encoded as a 7-bit integer.

Handshake

NameCodeDescription
hello0Initiates handshake; includes node ID, network ID, and capabilities.
helloData1Response to hello, confirming handshake and sharing peer data.
bye2Graceful session termination with details disconnection.

Presence

NameCodeDescription
getKeepAlives6Requests active presence data from peer.
keepAlivesChunk7Chunked response containing presence entries.
updatePresence24Announces local presence change.
keepAlivePresence34Sends or updates a single presence entry.
getPresence236Requests specific presence records.
getRandomPresences48Requests a random subset of active presences for seeding/discovery.
getSectorNodes18Requests nodes for a sector or region.
sectorNodes19Returns sector node list.

Blocks / Headers

NameCodeDescription
getBlockHeaders346Requests block headers by height range or locator.
blockHeaders347Returns full block headers.
compactBlockHeaders150Returns compact (reduced) block headers for fast sync.
getBlock355Requests full block by hash or height.
blockData29Full block data response (transactions, signatures, metadata).
blockSignature213Announces or relays a block signature.
getBlockSignatures214Requests block signatures for a specific block.
getSignatures315Requests signatures using the latest format.
signaturesChunk217Chunked response containing one or more signatures.
getRelevantBlockTransactions49Requests only transactions relevant to a peer for a given block.

Transactions

NameCodeDescription
getTransactions256Requests multiple transactions by hash list or range.
transactionsChunk360Chunked response containing transaction data.
getTransaction358Requests a single transaction by ID.
transactionData28Provides single transaction data.

Other

NameCodeDescription
getBalance230Requests wallet balance by address.
balance231Returns wallet balance data.
inventory259Announces available blocks or transactions by hash or height.
rejected3Message rejected with details about rejection.
s2data26Transfers S2 data payloads across the overlay.

Notes

  • Messages with Chunk may repeat until the dataset is complete.
  • Numeric codes are for wire-level interoperability; use symbolic names in code.
  • Obsolete and deprecated codes are intentionally omitted here.