1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
use crate::{CliConfiguration, DatabaseParams, PruningParams, Result as CliResult, SharedParams};
use parity_scale_codec::{Decode, Encode};
use sc_client_api::{backend::Backend as BackendT, blockchain::HeaderBackend};
use sp_blockchain::Info;
use sp_runtime::traits::{Block as BlockT, Header as HeaderT};
use std::{fmt::Debug, io};
#[derive(Debug, Clone, clap::Parser)]
pub struct ChainInfoCmd {
	#[allow(missing_docs)]
	#[clap(flatten)]
	pub pruning_params: PruningParams,
	#[allow(missing_docs)]
	#[clap(flatten)]
	pub shared_params: SharedParams,
	#[allow(missing_docs)]
	#[clap(flatten)]
	pub database_params: DatabaseParams,
}
#[derive(Clone, Eq, PartialEq, Debug, Encode, Decode, serde::Serialize)]
struct ChainInfo<B: BlockT> {
	best_hash: B::Hash,
	best_number: <<B as BlockT>::Header as HeaderT>::Number,
	genesis_hash: B::Hash,
	finalized_hash: B::Hash,
	finalized_number: <<B as BlockT>::Header as HeaderT>::Number,
}
impl<B: BlockT> From<Info<B>> for ChainInfo<B> {
	fn from(info: Info<B>) -> Self {
		ChainInfo::<B> {
			best_hash: info.best_hash,
			best_number: info.best_number,
			genesis_hash: info.genesis_hash,
			finalized_hash: info.finalized_hash,
			finalized_number: info.finalized_number,
		}
	}
}
impl ChainInfoCmd {
	pub fn run<B>(&self, config: &sc_service::Configuration) -> CliResult<()>
	where
		B: BlockT,
	{
		let db_config = sc_client_db::DatabaseSettings {
			trie_cache_maximum_size: config.trie_cache_maximum_size,
			state_pruning: config.state_pruning.clone(),
			source: config.database.clone(),
			blocks_pruning: config.blocks_pruning,
		};
		let backend = sc_service::new_db_backend::<B>(db_config)?;
		let info: ChainInfo<B> = backend.blockchain().info().into();
		let mut out = io::stdout();
		serde_json::to_writer_pretty(&mut out, &info)
			.map_err(|e| format!("Error writing JSON: {}", e))?;
		Ok(())
	}
}
impl CliConfiguration for ChainInfoCmd {
	fn shared_params(&self) -> &SharedParams {
		&self.shared_params
	}
	fn pruning_params(&self) -> Option<&PruningParams> {
		Some(&self.pruning_params)
	}
	fn database_params(&self) -> Option<&DatabaseParams> {
		Some(&self.database_params)
	}
}