safety_rules/
process.rs

1// Copyright (c) The Diem Core Contributors
2// SPDX-License-Identifier: Apache-2.0
3
4// Copyright 2021 Conflux Foundation. All rights reserved.
5// Conflux is free software and distributed under GNU General Public License.
6// See http://www.gnu.org/licenses/
7
8use crate::{
9    persistent_safety_storage::PersistentSafetyStorage,
10    remote_service::{self, RemoteService},
11    safety_rules_manager,
12};
13use diem_config::config::{SafetyRulesConfig, SafetyRulesService};
14
15use std::net::SocketAddr;
16
17pub struct Process {
18    data: Option<ProcessData>,
19}
20
21impl Process {
22    pub fn new(config: SafetyRulesConfig) -> Self {
23        let storage = safety_rules_manager::storage(&config);
24
25        let verify_vote_proposal_signature =
26            config.verify_vote_proposal_signature;
27        let export_consensus_key = config.export_consensus_key;
28        let service = match &config.service {
29            SafetyRulesService::Process(service) => service,
30            _ => panic!("Unexpected SafetyRules service: {:?}", config.service),
31        };
32        let server_addr = service.server_address();
33
34        Self {
35            data: Some(ProcessData {
36                server_addr,
37                storage,
38                verify_vote_proposal_signature,
39                export_consensus_key,
40                network_timeout: config.network_timeout_ms,
41            }),
42        }
43    }
44
45    pub fn start(&mut self) {
46        let data = self.data.take().expect("Unable to retrieve ProcessData");
47        remote_service::execute(
48            data.storage,
49            data.server_addr,
50            data.verify_vote_proposal_signature,
51            data.export_consensus_key,
52            data.network_timeout,
53            // TODO(lpl): Support this?
54            None,
55        );
56    }
57}
58
59struct ProcessData {
60    server_addr: SocketAddr,
61    storage: PersistentSafetyStorage,
62    verify_vote_proposal_signature: bool,
63    export_consensus_key: bool,
64    // Timeout in Seconds for network operations
65    network_timeout: u64,
66}
67
68pub struct ProcessService {
69    server_addr: SocketAddr,
70    network_timeout_ms: u64,
71}
72
73impl ProcessService {
74    pub fn new(server_addr: SocketAddr, network_timeout: u64) -> Self {
75        Self {
76            server_addr,
77            network_timeout_ms: network_timeout,
78        }
79    }
80}
81
82impl RemoteService for ProcessService {
83    fn server_address(&self) -> SocketAddr { self.server_addr }
84
85    fn network_timeout_ms(&self) -> u64 { self.network_timeout_ms }
86}