Skip to content

Data Models

This page describes key data structures used in Kaspeak SDK for forming, sending, and receiving messages.


Payload Structure

Payload is a data structure embedded in a Kaspa transaction. Each payload contains the actual data and necessary metadata.

Payload always starts with a unique KSPK marker (0x4B53454B).

Payload Format

Offset Field Size Description
0 marker 4 Marker KSPK (SDK identifier)
4 version 1 Protocol version (currently = 1)
5 prefix 4 Application prefix (ASCII)
9 type 2 Message type (messageType)
11 id 33 Message identifier (Identifier)
44 publicKey 33 Sender's public key
77 signature 64 Payload's Schnorr signature
141 dataLen 2 Data length (bytes)
143 data N Data (CBOR, compressed, possibly encrypted)

Peer Object

Peer describes the message sender and stores the public key and shared secret for encrypted messages.

Peer fields:

Field Type Description
address string Sender's Kaspa address
publicKey Uint8Array Sender's public key
signature Uint8Array Schnorr signature of payload
isOwn boolean true if the message sent by SDK itself
sharedSecret Uint8Array Shared secret (encryption key)
chainKey bigint Scalar for generating message ID chains

Identifier and SecretIdentifier

Cryptographic message identifiers ensure privacy and message linkage within conversations.

Identifier

A compressed secp256k1 curve point uniquely identifying a message without revealing order externally.

Field Type Description
hex string Hex representation of a point (66 characters, compressed format)
bytes Uint8Array Binary representation of an identifier (33 bytes)

Methods:

  • fromHex(hex) / fromBytes(buf)
  • fromChainKey(chainKey, i, PK)
  • next(chainKey, n) / prev(chainKey, n)
  • verify(sig, msg)

SecretIdentifier

Extends Identifier by adding a private key (scalar) for creating signatures.

Field Type Description
secret bigint Private scalar for signing messages

Optional methods:

  • sign(msg) - creating a Schnorr signature of a message using a secret key.

Important: SecretIdentifier cannot be created from public data. Use factories:

  • SecretIdentifier.fromSecret(secret)
  • SecretIdentifier.random()

MessageHeader Object

MessageHeader contains all necessary message information.

MessageHeader fields:

Field Type Description
txid string Kaspa transaction ID
peer Peer Sender information
prefix string Application prefix
type number Message type
identifier Identifier Message identifier
blockMeta.hash string Hash of the block in which the transaction was confirmed
blockMeta.timestamp bigint Confirmation time (Unix-time)
blockMeta.daaScore bigint Kaspa network complexity index (DAA)
consensusHash string Consensus hash (signed data)