sui_indexer_alt_schema/
checkpoints.rs

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