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
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
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.***