-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
67be29c
commit 6cc5dbe
Showing
5 changed files
with
164 additions
and
77 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,3 +1,57 @@ | ||
pub mod blockchain; | ||
pub mod error; | ||
pub mod subcoin; | ||
mod blockchain; | ||
mod error; | ||
mod network; | ||
mod raw_transactions; | ||
|
||
use blockchain::{Blockchain, BlockchainApiServer}; | ||
use network::{Network, NetworkApiServer}; | ||
use raw_transactions::{RawTransactions, RawTransactionsApiServer}; | ||
use sc_client_api::{AuxStore, BlockBackend, HeaderBackend}; | ||
use sp_runtime::traits::Block as BlockT; | ||
use std::sync::Arc; | ||
use subcoin_network::NetworkHandle; | ||
use subcoin_primitives::BitcoinTransactionAdapter; | ||
|
||
/// Subcoin RPC. | ||
pub struct SubcoinRpc<Block, Client, TransactionAdapter> { | ||
/// Blockchain RPC. | ||
pub blockchain: Blockchain<Block, Client, TransactionAdapter>, | ||
/// Raw transactions RPC. | ||
pub raw_transactions: RawTransactions<Block, Client>, | ||
/// Network RPC. | ||
pub network: Network<Block, Client>, | ||
} | ||
|
||
impl<Block, Client, TransactionAdapter> SubcoinRpc<Block, Client, TransactionAdapter> | ||
where | ||
Block: BlockT + 'static, | ||
Client: HeaderBackend<Block> + BlockBackend<Block> + AuxStore + 'static, | ||
TransactionAdapter: BitcoinTransactionAdapter<Block> + Send + Sync + 'static, | ||
{ | ||
/// Creates a new instance of [`SubcoinRpc`]. | ||
pub fn new(client: Arc<Client>, network_handle: NetworkHandle) -> Self { | ||
Self { | ||
blockchain: Blockchain::<_, _, TransactionAdapter>::new(client.clone()), | ||
raw_transactions: RawTransactions::new(client.clone(), network_handle.clone()), | ||
network: Network::new(client, network_handle), | ||
} | ||
} | ||
|
||
/// Merges the entire Subcoin RPCs into the given RPC module. | ||
pub fn merge_into( | ||
self, | ||
module: &mut jsonrpsee::Methods, | ||
) -> Result<(), jsonrpsee::server::RegisterMethodError> { | ||
let Self { | ||
blockchain, | ||
raw_transactions, | ||
network, | ||
} = self; | ||
|
||
module.merge(blockchain.into_rpc())?; | ||
module.merge(raw_transactions.into_rpc())?; | ||
module.merge(network.into_rpc())?; | ||
|
||
Ok(()) | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,91 @@ | ||
use crate::error::Error; | ||
use jsonrpsee::proc_macros::rpc; | ||
use sc_client_api::{AuxStore, BlockBackend, HeaderBackend}; | ||
use serde::{Deserialize, Serialize}; | ||
use sp_runtime::traits::Block as BlockT; | ||
use std::marker::PhantomData; | ||
use std::sync::Arc; | ||
use subcoin_network::{NetworkHandle, NetworkStatus, PeerSync, PeerSyncState}; | ||
|
||
#[derive(Clone, Serialize, Deserialize)] | ||
#[serde(rename_all = "camelCase")] | ||
pub struct NetworkPeers { | ||
total: usize, | ||
available: usize, | ||
discouraged: usize, | ||
peer_best: Option<u32>, | ||
sync_peers: Vec<PeerSync>, | ||
} | ||
|
||
#[rpc(client, server)] | ||
pub trait NetworkApi { | ||
/// Get overall network status. | ||
#[method(name = "network_status")] | ||
async fn network_status(&self) -> Result<Option<NetworkStatus>, Error>; | ||
|
||
/// Get the sync peers. | ||
#[method(name = "network_peers")] | ||
async fn network_peers(&self) -> Result<NetworkPeers, Error>; | ||
} | ||
|
||
/// This struct provides the Network API. | ||
pub struct Network<Block, Client> { | ||
#[allow(unused)] | ||
client: Arc<Client>, | ||
network_handle: NetworkHandle, | ||
_phantom: PhantomData<Block>, | ||
} | ||
|
||
impl<Block, Client> Network<Block, Client> | ||
where | ||
Block: BlockT + 'static, | ||
Client: HeaderBackend<Block> + BlockBackend<Block> + AuxStore + 'static, | ||
{ | ||
/// Constructs a new instance of [`Network`]. | ||
pub fn new(client: Arc<Client>, network_handle: NetworkHandle) -> Self { | ||
Self { | ||
client, | ||
network_handle, | ||
_phantom: Default::default(), | ||
} | ||
} | ||
} | ||
|
||
#[async_trait::async_trait] | ||
impl<Block, Client> NetworkApiServer for Network<Block, Client> | ||
where | ||
Block: BlockT + 'static, | ||
Client: HeaderBackend<Block> + BlockBackend<Block> + AuxStore + 'static, | ||
{ | ||
async fn network_peers(&self) -> Result<NetworkPeers, Error> { | ||
let sync_peers = self.network_handle.sync_peers().await; | ||
let total = sync_peers.len(); | ||
let mut available = 0; | ||
let mut discouraged = 0; | ||
let mut peer_best = 0; | ||
|
||
for peer in &sync_peers { | ||
match peer.state { | ||
PeerSyncState::Available => available += 1, | ||
PeerSyncState::Discouraged => discouraged += 1, | ||
_ => {} | ||
} | ||
|
||
if peer.best_number > peer_best { | ||
peer_best = peer.best_number; | ||
} | ||
} | ||
|
||
Ok(NetworkPeers { | ||
total, | ||
available, | ||
discouraged, | ||
peer_best: if peer_best > 0 { Some(peer_best) } else { None }, | ||
sync_peers, | ||
}) | ||
} | ||
|
||
async fn network_status(&self) -> Result<Option<NetworkStatus>, Error> { | ||
Ok(self.network_handle.status().await) | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters