client/rpc/impls/
pos.rs

1// Copyright 2020 Conflux Foundation. All rights reserved.
2// Conflux is free software and distributed under GNU General Public License.
3// See http://www.gnu.org/licenses/
4
5use crate::rpc::{
6    errors::build_rpc_server_error,
7    traits::pos::Pos,
8    types::{
9        pos::{
10            Account, Block, BlockNumber, CommitteeState, EpochState,
11            LedgerInfoWithSignatures, PoSEpochReward, Status, Transaction,
12        },
13        RpcAddress,
14    },
15    RpcInterceptor,
16};
17use cfx_addr::Network;
18use cfx_rpc_cfx_api::PosRpcServer;
19pub use cfx_rpc_cfx_impl::{
20    convert_to_pos_epoch_reward, hash_value_to_h256,
21    PosHandler as NewPosHandler,
22};
23use cfx_rpc_utils::error::jsonrpc_error_helpers::error_object_owned_to_jsonrpc_error as convert_error;
24use cfx_types::{H256, U64};
25use cfxcore::{
26    consensus::pos_handler::PosVerifier, BlockDataManager, SharedConsensusGraph,
27};
28use jsonrpc_core::Result as JsonRpcResult;
29use std::sync::Arc;
30
31pub struct PoSInterceptor {
32    pos_handler: Arc<PosVerifier>,
33}
34
35impl PoSInterceptor {
36    pub fn new(pos_handler: Arc<PosVerifier>) -> Self {
37        PoSInterceptor { pos_handler }
38    }
39}
40
41impl RpcInterceptor for PoSInterceptor {
42    fn before(&self, _name: &String) -> JsonRpcResult<()> {
43        match self.pos_handler.pos_option() {
44            Some(_) => Ok(()),
45            None => Err(build_rpc_server_error(
46                crate::rpc::errors::codes::POS_NOT_ENABLED,
47                "PoS chain is not enabled".into(),
48            )),
49        }
50    }
51}
52
53pub struct PosHandler {
54    inner: NewPosHandler,
55}
56
57impl PosHandler {
58    pub fn new(
59        pos_handler: Arc<PosVerifier>, pow_data_manager: Arc<BlockDataManager>,
60        network_type: Network, consensus: SharedConsensusGraph,
61    ) -> Self {
62        PosHandler {
63            inner: NewPosHandler::new(
64                pos_handler,
65                pow_data_manager,
66                network_type,
67                consensus,
68            ),
69        }
70    }
71}
72
73impl Pos for PosHandler {
74    fn pos_status(&self) -> JsonRpcResult<Status> {
75        self.inner.pos_status().map_err(convert_error)
76    }
77
78    fn pos_account(
79        &self, address: H256, view: Option<U64>,
80    ) -> JsonRpcResult<Account> {
81        self.inner.pos_account(address, view).map_err(convert_error)
82    }
83
84    fn pos_account_by_pow_address(
85        &self, address: RpcAddress, view: Option<U64>,
86    ) -> JsonRpcResult<Account> {
87        self.inner
88            .pos_account_by_pow_address(address, view)
89            .map_err(convert_error)
90    }
91
92    fn pos_committee(
93        &self, view: Option<U64>,
94    ) -> JsonRpcResult<CommitteeState> {
95        self.inner.pos_committee(view).map_err(convert_error)
96    }
97
98    fn pos_block_by_hash(&self, hash: H256) -> JsonRpcResult<Option<Block>> {
99        self.inner.pos_block_by_hash(hash).map_err(convert_error)
100    }
101
102    fn pos_block_by_number(
103        &self, number: BlockNumber,
104    ) -> JsonRpcResult<Option<Block>> {
105        self.inner
106            .pos_block_by_number(number)
107            .map_err(convert_error)
108    }
109
110    fn pos_transaction_by_number(
111        &self, number: U64,
112    ) -> JsonRpcResult<Option<Transaction>> {
113        self.inner
114            .pos_transaction_by_number(number)
115            .map_err(convert_error)
116    }
117
118    fn pos_consensus_blocks(&self) -> JsonRpcResult<Vec<Block>> {
119        self.inner.pos_consensus_blocks().map_err(convert_error)
120    }
121
122    fn pos_get_epoch_state(
123        &self, epoch: U64,
124    ) -> JsonRpcResult<Option<EpochState>> {
125        self.inner.pos_get_epoch_state(epoch).map_err(convert_error)
126    }
127
128    fn pos_get_ledger_info_by_epoch(
129        &self, epoch: U64,
130    ) -> JsonRpcResult<Option<LedgerInfoWithSignatures>> {
131        self.inner
132            .pos_get_ledger_info_by_epoch(epoch)
133            .map_err(convert_error)
134    }
135
136    fn pos_get_ledger_info_by_block_number(
137        &self, number: BlockNumber,
138    ) -> JsonRpcResult<Option<LedgerInfoWithSignatures>> {
139        self.inner
140            .pos_get_ledger_info_by_block_number(number)
141            .map_err(convert_error)
142    }
143
144    fn pos_get_ledger_info_by_epoch_and_round(
145        &self, epoch: U64, round: U64,
146    ) -> JsonRpcResult<Option<LedgerInfoWithSignatures>> {
147        self.inner
148            .pos_get_ledger_info_by_epoch_and_round(epoch, round)
149            .map_err(convert_error)
150    }
151
152    fn pos_get_ledger_infos_by_epoch(
153        &self, start_epoch: U64, end_epoch: U64,
154    ) -> JsonRpcResult<Vec<LedgerInfoWithSignatures>> {
155        self.inner
156            .pos_get_ledger_infos_by_epoch(start_epoch, end_epoch)
157            .map_err(convert_error)
158    }
159
160    fn pos_get_rewards_by_epoch(
161        &self, epoch: U64,
162    ) -> JsonRpcResult<Option<PoSEpochReward>> {
163        self.inner
164            .pos_get_rewards_by_epoch(epoch)
165            .map_err(convert_error)
166    }
167}