# Data Structures

## Blockchain Objects

### Signed transaction

#### Version 1 and 2

|          Field Name          |           Type           | Length |
| :--------------------------: | :----------------------: | ------ |
|       Transaction type       |           Byte           | 1      |
|            Version           |           Byte           | 1      |
| *Transaction specific bytes* |                          |        |
|        Proofs version        | Byte (constant, value=1) | 1      |
|        Proof size (N)        |           Short          | 2      |
|             Proof            |       Array\[Byte]       | N      |

#### Version 3+

|          Field Name          |           Type           | Length        |
| :--------------------------: | :----------------------: | ------------- |
|       Transaction type       |           Byte           | 1             |
|            Version           |           Byte           | 1             |
|           Timestamp          |           Long           | 8             |
|       Sender's key type      |      KeyType (Byte)      | 1             |
|      Sender's public key     | PublicKey (Array\[Byte]) | 32 \| 33      |
|              Fee             |           Long           | 8             |
| *Transaction specific bytes* |                          |               |
|      Sponsor's key type      |      KeyType (Byte)      | 1             |
|     Sponsor's public key     | PublicKey (Array\[Byte]) | 0 \| 32 \| 33 |
|        Proofs version        | Byte (constant, value=1) | 1             |
|        Proof size (N)        |           Short          | 2             |
|             Proof            |       Array\[Byte]       | N             |

{% hint style="info" %}
In version 3+ more fields are standardized. These are part of the transaction-specific bytes in versions 1 and 2.
{% endhint %}

### Block

|                        Field Name                       |  Type | Length |
| :-----------------------------------------------------: | :---: | ------ |
| Version (0x02 for Genesis block, 0x03 for common block) |  Byte | 0      |
|                        Timestamp                        |  Long | 1      |
|                  Parent block signature                 | Bytes | 64     |
|         Consensus block length (always 40 bytes)        |  Int  | 4      |
|                       Base target                       |  Long | 8      |
|                  Generation signature\*                 | Bytes | 32     |
|              Transactions block length (N)              |  Int  | 8      |
|                   Transaction #1 bytes                  | Bytes | M1     |
|                           ...                           |  ...  | ...    |
|                   Transaction #K bytes                  | Bytes | MK     |
|                  Generator's public key                 | Bytes | 32     |
|                    Block's signature                    | Bytes | 64     |

Generation signature is calculated as `blake2b256` hash of the following bytes:

|               Field Name              |  Type | Length |
| :-----------------------------------: | :---: | ------ |
| Previous block's generation signature | Bytes | 32     |
|         Generator's public key        | Bytes | 32     |

Block's signature is calculated from the following bytes:

|                        Field Name                       |  Type | Length |
| :-----------------------------------------------------: | :---: | ------ |
| Version (0x02 for Genesis block, 0x03 for common block) |  Byte | 0      |
|                        Timestamp                        |  Long | 1      |
|                  Parent block signature                 | Bytes | 64     |
|         Consensus block length (always 40 bytes)        |  Int  | 4      |
|                       Base target                       |  Long | 8      |
|                  Generation signature\*                 | Bytes | 32     |
|              Transactions block length (N)              |  Int  | 8      |
|                   Transaction #1 bytes                  | Bytes | M1     |
|                           ...                           |  ...  | ...    |
|                   Transaction #K bytes                  | Bytes | MK     |
|                  Generator's public key                 | Bytes | 32     |

## Network messages

### Network message structure

All network messages share the same structure, except the Handshake.

|         Field name        |  Type | Length |
| :-----------------------: | :---: | ------ |
| Packet length (BigEndian) |  Int  | 4      |
|        Magic Bytes        | Bytes | 4      |
|         Content ID        |  Byte | 1      |
|       Payload length      |  Int  | 4      |
|      Payload checksum     | Bytes | 4      |
|          Payload          | Bytes | N      |

Magic Bytes are `0x12 0x34 0x56 0x78`. Payload checksum is the first 4 bytes of *FastHash* of Payload bytes. *FastHash* is the hash function `Blake2b256(data)`.

### Handshake message

Handshake is used to start communication between two nodes.

|                            Field name                           |  Type | Length |
| :-------------------------------------------------------------: | :---: | ------ |
|                   Application name length (N)                   |  Byte | 1      |
|              Application name (UTF-8 encoded bytes)             | Bytes | N      |
|                    Application version major                    |  Int  | 4      |
|                    Application version minor                    |  Int  | 4      |
|                    Application version patch                    |  Int  | 4      |
|                       Node name length (M)                      |  Byte | 1      |
|                 Node name (UTF-8 encoded bytes)                 | Bytes | M      |
|                            Node nonce                           |  Long | 8      |
| Declared address length (K) or 0 if no declared address was set |  Int  | 4      |
|           Declared address bytes (if length is not 0)           | Bytes | K      |
|                            Timestamp                            |  Long | 8      |

### GetPeers message

GetPeers message is sent when sending node wants to know of other nodes on network.

|         Field name        |  Type | Length |
| :-----------------------: | :---: | ------ |
| Packet length (BigEndian) |  Int  | 4      |
|        Magic Bytes        | Bytes | 4      |
|     Content ID (0x01)     |  Byte | 1      |
|       Payload length      |  Int  | 4      |
|      Payload checksum     | Bytes | 4      |

### Peers message

Peers message is a reply on GetPeers message.

|         Field name        |  Type | Length |
| :-----------------------: | :---: | ------ |
| Packet length (BigEndian) |  Int  | 4      |
|        Magic Bytes        | Bytes | 4      |
|     Content ID (0x02)     |  Byte | 1      |
|       Payload length      |  Int  | 4      |
|      Payload checksum     | Bytes | 4      |
|      Peers count (N)      |  Int  | 4      |
|     Peer #1 IP address    | Bytes | 4      |
|        Peer #1 port       |  Int  | 4      |
|            ...            |  ...  | ...    |
|     Peer #N IP address    | Bytes | 4      |
|        Peer #N port       |  Int  | 4      |

### GetSignatures message

|         Field name        |  Type | Length |
| :-----------------------: | :---: | ------ |
| Packet length (BigEndian) |  Int  | 4      |
|        Magic Bytes        | Bytes | 4      |
|     Content ID (0x14)     |  Byte | 1      |
|       Payload length      |  Int  | 4      |
|      Payload checksum     | Bytes | 4      |
|    Block IDs count (N)    |  Int  | 4      |
|        Block #1 ID        | Bytes | 64     |
|            ...            |  ...  | ...    |
|        Block #N ID        | Bytes | 64     |

### Signatures message

|         Field name         |  Type | Length |
| :------------------------: | :---: | ------ |
|  Packet length (BigEndian) |  Int  | 4      |
|         Magic Bytes        | Bytes | 4      |
|      Content ID (0x15)     |  Byte | 1      |
|       Payload length       |  Int  | 4      |
|      Payload checksum      | Bytes | 4      |
| Block signatures count (N) |  Int  | 4      |
|     Block #1 signature     | Bytes | 64     |
|             ...            |  ...  | ...    |
|     Block #N signature     | Bytes | 64     |

### GetBlock message

|         Field name        |  Type | Length |
| :-----------------------: | :---: | ------ |
| Packet length (BigEndian) |  Int  | 4      |
|        Magic Bytes        | Bytes | 4      |
|     Content ID (0x16)     |  Byte | 1      |
|       Payload length      |  Int  | 4      |
|      Payload checksum     | Bytes | 4      |
|          Block ID         | Bytes | 64     |

### Block message

|         Field name        |  Type | Length |
| :-----------------------: | :---: | ------ |
| Packet length (BigEndian) |  Int  | 4      |
|        Magic Bytes        | Bytes | 4      |
|     Content ID (0x17)     |  Byte | 1      |
|       Payload length      |  Int  | 4      |
|      Payload checksum     | Bytes | 4      |
|      Block bytes (N)      | Bytes | N      |

### Score message

|         Field name        |  Type  | Length |
| :-----------------------: | :----: | ------ |
| Packet length (BigEndian) |   Int  | 4      |
|        Magic Bytes        |  Bytes | 4      |
|     Content ID (0x18)     |  Byte  | 1      |
|       Payload length      |   Int  | 4      |
|      Payload checksum     |  Bytes | 4      |
|      Score (N bytes)      | BigInt | N      |

### Transaction message

|         Field name        |  Type | Length |
| :-----------------------: | :---: | ------ |
| Packet length (BigEndian) |  Int  | 4      |
|        Magic Bytes        | Bytes | 4      |
|     Content ID (0x19)     |  Byte | 1      |
|       Payload length      |  Int  | 4      |
|      Payload checksum     | Bytes | 4      |
|   Transaction (N bytes)   | Bytes | N      |

### Checkpoint message

|         Field name         |  Type | Length |
| :------------------------: | :---: | ------ |
|  Packet length (BigEndian) |  Int  | 4      |
|         Magic Bytes        | Bytes | 4      |
|      Content ID (0x64)     |  Byte | 1      |
|       Payload length       |  Int  | 4      |
|      Payload checksum      | Bytes | 4      |
| Checkpoint items count (N) |  Int  | 4      |
|    Checkpoint #1 height    |  Long | 8      |
|   Checkpoint #1 signature  | Bytes | 64     |
|             ...            |  ...  | ...    |
|    Checkpoint #N height    |  Long | 8      |
|   Checkpoint #N signature  | Bytes | 64     |


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.ltonetwork.com/protocol/public/data-structures.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
