Skip to content

Block

The block is the fundamental object on the blockchain. Every 2s or so, a new block is created that may contain account transactions, update transactions or account creations.

Blocks are stored in the collection blocks in MongoDB and represented as:

Information about a block.

GRPC documentation: concordium.v2.BlockInfo

Attributes:

Name Type Description
arrive_time Optional[CCD_TimeStamp]

Time the block was verified.

validator Optional[int]

ID of the validator of this block.

hash CCD_BlockHash

Hash of the block.

height int

Absolute height of the block.

last_finalized_block CCD_BlockHash

The last finalized block when this block was baked.

parent_block CCD_BlockHash

The parent block hash.

receive_time Optional[CCD_TimeStamp]

Time the block was received.

slot_number Optional[int]

The slot number in which the block was baked.

slot_time CCD_TimeStamp

Time of the slot in which the block was baked.

era_block_height int

The height relative to genesis.

finalized bool

Whether the block is finalized.

genesis_index int

The genesis index for this block.

transaction_count int

The number of transactions in the block.

transactions_energy_cost int

The total energy cost of the transactions in the block.

transactions_size int

The total size of the transactions in the block.

transaction_hashes Optional[list[CCD_TransactionHash]]

The hashes of the transactions in the block.

state_hash Optional[CCD_StateHash]

The state hash of the block.

protocol_version Optional[str]

The protocol version of the block.

round Optional[CCD_Round]

The round in which the block was created.

epoch Optional[CCD_Epoch]

The epoch in which the block was created.

Source code in .venv/lib/python3.13/site-packages/ccdexplorer/grpc_client/CCD_Types/__init__.py
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
class CCD_BlockInfo(BaseModel):
    """Information about a block.

    GRPC documentation: [concordium.v2.BlockInfo](https://docs.concordium.com/concordium-grpc-api/#concordium.v2.BlockInfo)

    Attributes:
        arrive_time (Optional[CCD_TimeStamp]): Time the block was verified.
        validator (Optional[int]): ID of the validator of this block.
        hash (CCD_BlockHash): Hash of the block.
        height (int): Absolute height of the block.
        last_finalized_block (CCD_BlockHash): The last finalized block when this block was baked.
        parent_block (CCD_BlockHash): The parent block hash.
        receive_time (Optional[CCD_TimeStamp]): Time the block was received.
        slot_number (Optional[int]): The slot number in which the block was baked.
        slot_time (CCD_TimeStamp): Time of the slot in which the block was baked.
        era_block_height (int): The height relative to genesis.
        finalized (bool): Whether the block is finalized.
        genesis_index (int): The genesis index for this block.
        transaction_count (int): The number of transactions in the block.
        transactions_energy_cost (int): The total energy cost of the transactions in the block.
        transactions_size (int): The total size of the transactions in the block.
        transaction_hashes (Optional[list[CCD_TransactionHash]]): The hashes of the transactions in the block.
        state_hash (Optional[CCD_StateHash]): The state hash of the block.
        protocol_version (Optional[str]): The protocol version of the block.
        round (Optional[CCD_Round]): The round in which the block was created.
        epoch (Optional[CCD_Epoch]): The epoch in which the block was created.
    """

    arrive_time: Optional[CCD_TimeStamp] = None
    baker: Optional[int] = None
    hash: CCD_BlockHash
    height: int
    last_finalized_block: CCD_BlockHash
    parent_block: CCD_BlockHash
    receive_time: Optional[CCD_TimeStamp] = None
    slot_number: Optional[int] = None
    slot_time: CCD_TimeStamp
    era_block_height: int
    finalized: bool
    genesis_index: int
    transaction_count: int
    transactions_energy_cost: int
    transactions_size: int
    transaction_hashes: Optional[list[CCD_TransactionHash]] = None
    state_hash: Optional[CCD_StateHash] = None
    protocol_version: Optional[str] = None  # note this is not optional from the specification,
    # but this type is also used in retrieving blockInfo from MongoDB, where protocol_version
    # isn't stored for all blocks (currently).
    round: Optional[CCD_Round] = None
    epoch: Optional[CCD_Epoch] = None

Key augmentations: - transaction_hashes – inserted by CCDExplorer so downstream jobs can jump from block metadata to transaction details without a secondary lookup. - finalized_time and consensus info from CCD_BlockInfo to drive explorer charts such as TPS and block time stability.

When a finalized block arrives, we persist the block, the transactions and the special events.

How is a block stored in the system?

  1. heartbeat streams finalized blocks via gRPC and upserts them into MongoDB.
  2. ms_block_analyser consumes those inserts and emits Celery tasks so other services (indexers, events, metadata, etc.) can react per block.
  3. Dagster jobs (e.g. dagster_nightrunner) read the blocks collection to build time-series such as block production per validator.***