iota_graphql_rpc/types/
chain_identifier.rs

1// Copyright (c) Mysten Labs, Inc.
2// Modifications Copyright (c) 2024 IOTA Stiftung
3// SPDX-License-Identifier: Apache-2.0
4
5use async_graphql::*;
6use diesel::QueryDsl;
7use iota_indexer::schema::chain_identifier;
8use iota_types::{
9    digests::ChainIdentifier as NativeChainIdentifier, messages_checkpoint::CheckpointDigest,
10};
11
12use crate::{
13    data::{Db, DbConnection, QueryExecutor},
14    error::Error,
15};
16
17pub(crate) struct ChainIdentifier;
18
19impl ChainIdentifier {
20    /// Query the Chain Identifier from the DB.
21    pub(crate) async fn query(db: &Db) -> Result<NativeChainIdentifier, Error> {
22        use chain_identifier::dsl;
23
24        let digest_bytes = db
25            .execute(move |conn| {
26                conn.first(move || dsl::chain_identifier.select(dsl::checkpoint_digest))
27            })
28            .await
29            .map_err(|e| Error::Internal(format!("Failed to fetch genesis digest: {e}")))?;
30
31        Self::from_bytes(digest_bytes)
32    }
33
34    /// Treat `bytes` as a checkpoint digest and extract a chain identifier from
35    /// it.
36    pub(crate) fn from_bytes(bytes: Vec<u8>) -> Result<NativeChainIdentifier, Error> {
37        let genesis_digest = CheckpointDigest::try_from(bytes)
38            .map_err(|e| Error::Internal(format!("Failed to deserialize genesis digest: {e}")))?;
39        Ok(NativeChainIdentifier::from(genesis_digest))
40    }
41}