sui_indexer_alt_schema/
checkpoints.rs

1// Copyright (c) Mysten Labs, Inc.
2// SPDX-License-Identifier: Apache-2.0
3
4use anyhow::{Result, anyhow};
5use diesel::prelude::*;
6use sui_field_count::FieldCount;
7use sui_protocol_config::{Chain, ProtocolVersion};
8use sui_types::digests::{ChainIdentifier, CheckpointDigest};
9
10use crate::schema::{kv_checkpoints, kv_genesis};
11
12#[derive(Insertable, Debug, Clone, FieldCount, Queryable)]
13#[diesel(table_name = kv_checkpoints)]
14pub struct StoredCheckpoint {
15    pub sequence_number: i64,
16    /// BCS serialized CheckpointContents
17    pub checkpoint_contents: Vec<u8>,
18    /// BCS serialized CheckpointSummary
19    pub checkpoint_summary: Vec<u8>,
20    /// BCS serialized AuthorityQuorumSignInfo
21    pub validator_signatures: Vec<u8>,
22}
23
24#[derive(Insertable, Selectable, Queryable, Debug, Clone)]
25#[diesel(table_name = kv_genesis)]
26pub struct StoredGenesis {
27    pub genesis_digest: Vec<u8>,
28    pub initial_protocol_version: i64,
29}
30
31impl StoredGenesis {
32    /// Try and identify the chain that this indexer is indexing based on its genesis checkpoint
33    /// digest.
34    pub fn chain(&self) -> Result<Chain> {
35        let bytes: [u8; 32] = self
36            .genesis_digest
37            .clone()
38            .try_into()
39            .map_err(|_| anyhow!("Bad genesis digest"))?;
40
41        let digest = CheckpointDigest::new(bytes);
42        let identifier = ChainIdentifier::from(digest);
43
44        Ok(identifier.chain())
45    }
46
47    /// The protocol version that the chain was started at.
48    pub fn initial_protocol_version(&self) -> ProtocolVersion {
49        ProtocolVersion::new(self.initial_protocol_version as u64)
50    }
51}