1use polkadot_cli::{Error, Result};
20use polkadot_node_primitives::CollationGenerationConfig;
21use polkadot_node_subsystem::messages::{CollationGenerationMessage, CollatorProtocolMessage};
22use polkadot_primitives::Id as ParaId;
23use sc_cli::{Error as SubstrateCliError, SubstrateCli};
24use sp_core::hexdisplay::HexDisplay;
25use std::{
26 collections::HashSet,
27 fs,
28 io::{self, Write},
29};
30use test_parachain_adder_collator::Collator;
31
32const DEFAULT_PARA_ID: ParaId = ParaId::new(100);
34
35mod cli;
36use cli::Cli;
37
38fn main() -> Result<()> {
39 let cli = Cli::from_args();
40
41 match cli.subcommand {
42 Some(cli::Subcommand::ExportGenesisState(params)) => {
43 let collator = Collator::new();
44 let output_buf =
45 format!("0x{:?}", HexDisplay::from(&collator.genesis_head())).into_bytes();
46
47 if let Some(output) = params.output {
48 std::fs::write(output, output_buf)?;
49 } else {
50 std::io::stdout().write_all(&output_buf)?;
51 }
52
53 Ok::<_, Error>(())
54 },
55 Some(cli::Subcommand::ExportGenesisWasm(params)) => {
56 let collator = Collator::new();
57 let output_buf =
58 format!("0x{:?}", HexDisplay::from(&collator.validation_code())).into_bytes();
59
60 if let Some(output) = params.output {
61 fs::write(output, output_buf)?;
62 } else {
63 io::stdout().write_all(&output_buf)?;
64 }
65
66 Ok(())
67 },
68 None => {
69 let runner = cli.create_runner(&cli.run.base).map_err(|e| {
70 SubstrateCliError::Application(
71 Box::new(e) as Box<dyn 'static + Send + Sync + std::error::Error>
72 )
73 })?;
74
75 runner.run_node_until_exit(|config| async move {
76 let collator = Collator::new();
77
78 let full_node = polkadot_service::build_full(
79 config,
80 polkadot_service::NewFullParams {
81 is_parachain_node: polkadot_service::IsParachainNode::Collator(
82 collator.collator_key(),
83 ),
84 enable_beefy: false,
85 force_authoring_backoff: false,
86 telemetry_worker_handle: None,
87
88 node_version: None,
90 secure_validator_mode: false,
91 workers_path: None,
92 workers_names: None,
93
94 overseer_gen: polkadot_service::CollatorOverseerGen,
95 overseer_message_channel_capacity_override: None,
96 malus_finality_delay: None,
97 hwbench: None,
98 execute_workers_max_num: None,
99 prepare_workers_hard_max_num: None,
100 prepare_workers_soft_max_num: None,
101 keep_finalized_for: None,
102 invulnerable_ah_collators: HashSet::new(),
103 collator_protocol_hold_off: None,
104 experimental_collator_protocol: false,
105 collator_reputation_persist_interval: None,
106 },
107 )
108 .map_err(|e| e.to_string())?;
109 let mut overseer_handle = full_node
110 .overseer_handle
111 .expect("Overseer handle should be initialized for collators");
112
113 let genesis_head_hex =
114 format!("0x{:?}", HexDisplay::from(&collator.genesis_head()));
115 let validation_code_hex =
116 format!("0x{:?}", HexDisplay::from(&collator.validation_code()));
117
118 let para_id = cli.run.parachain_id.map(ParaId::from).unwrap_or(DEFAULT_PARA_ID);
119
120 log::info!("Running adder collator for parachain id: {}", para_id);
121 log::info!("Genesis state: {}", genesis_head_hex);
122 log::info!("Validation code: {}", validation_code_hex);
123
124 let config = CollationGenerationConfig {
125 key: collator.collator_key(),
126 collator: Some(
127 collator.create_collation_function(full_node.task_manager.spawn_handle()),
128 ),
129 para_id,
130 };
131 overseer_handle
132 .send_msg(CollationGenerationMessage::Initialize(config), "Collator")
133 .await;
134
135 overseer_handle
136 .send_msg(CollatorProtocolMessage::CollateOn(para_id), "Collator")
137 .await;
138
139 Ok(full_node.task_manager)
140 })
141 },
142 }?;
143 Ok(())
144}