StreamSlotMetricsResponse
StreamSlotMetricsResponse delivers slot metrics at slot-terminator time.
This is a best-effort, live-only feed. One message is published per slot TERMINATOR, which is normally an executed block but is also an account-bootstrap marker carrying zeroed counters and no state commitments. Publication happens AHEAD of the indexer having persisted the slot: a state proof for that slot may not be servable yet, and neither StreamHeight nor GetStateRoots is a durability signal. A subscriber that cannot keep up is disconnected with RESOURCE_EXHAUSTED rather than silently skipped, and there is no replay — a client that reconnects has a gap and must backfill through QueryService.
Package: thru.services.v1
Fields
Section titled “Fields”| Field | Type | # | Description |
|---|---|---|---|
slot | uint64 | 1 · optional | Block slot number. |
global_activated_state_counter | uint64 | 2 · optional | Global counter tracking total activated state across all accounts. |
global_deactivated_state_counter | uint64 | 3 · optional | Global counter tracking total deactivated state across all accounts. |
absent_block_producer_fees | uint64 | 4 · optional | Fees credited to the absent-block-producer fee receiver this block because the block producer account was not live. |
block_timestamp | google.protobuf.Timestamp | 5 · optional | Block timestamp. |
consumed_compute_units | uint64 | 6 · optional | Total compute units consumed across all transactions in this block. |
consumed_state_units | uint32 | 7 · optional | Total state units consumed across all transactions in this block. |
claimed_fees | uint64 | 8 · optional | Fees credited to a live block-producer account this block. Disjoint from absent_block_producer_fees by destination; total block fees = absent_block_producer_fees + claimed_fees. |
compressed_state_root | bytes | 9 · optional | The compressed-state trie root as of this slot: exactly 32 bytes, the commitment that account state proofs are verified against. Sent only when the request set include_compressed_state_root. An all-zero VALUE is legitimate and is not the same as an absent field. The trie is empty until compression warms up, and a slot in which nothing was compressed carries the previous root unchanged, so a repeated or zero root means “nothing merged”, never “unknown”. Absence has five causes, and they are not all distinguishable from the client: 1. the field was not requested; 2. it was requested, and the node reported no execution state for this slot (an account-bootstrap terminator); 3. this server predates the field and ignores the request flag; 4. this server supports the field, but the NODE behind it is older than the wire flag that marks a terminator as post-execution, so the server withholds the commitments rather than guess; 5. the node’s terminator was truncated or malformed, so the server could not read a commitment out of it at all. QueryService.GetVersion separates case 3 from the rest by reporting the server build. Cases 2, 4 and 5 are indistinguishable on the wire — all of them mean “the server declined to state a commitment for this slot”, and none of them is safe to read as a value. |
active_state_hash | bytes | 10 · optional | The active-state hash as of this slot: exactly 32 bytes, computed over the live (uncompressed) account set together with this slot’s block context. Sent only when the request set include_active_state_hash. The same five causes of absence as compressed_state_root apply. Note that this hash covers the block context, which itself contains the compressed-state root — so it transitively commits to the value in compressed_state_root. Agreement between the two fields is therefore NOT an independent cross-check of either one. |