Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 9 additions & 1 deletion core/src/client/client.rs
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ use super::{
};
use crate::block::{ClosedBlock, IsBlock, OpenBlock, SealedBlock};
use crate::blockchain::{BlockChain, BlockProvider, BodyProvider, HeaderProvider, InvoiceProvider, TransactionAddress};
use crate::client::{ConsensusClient, TermInfo};
use crate::client::{ConsensusClient, SnapshotClient, TermInfo};
use crate::consensus::{CodeChainEngine, EngineError};
use crate::encoded;
use crate::error::{BlockImportError, Error, ImportError, SchemeError};
Expand Down Expand Up @@ -908,3 +908,11 @@ impl FindActionHandler for Client {
self.engine.find_action_handler_for(id)
}
}

impl SnapshotClient for Client {
fn notify_snapshot(&self, id: BlockId) {
if let Some(header) = self.block_header(&id) {
self.engine.send_snapshot_notify(header.hash())
}
}
}
4 changes: 4 additions & 0 deletions core/src/client/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -336,3 +336,7 @@ pub trait StateInfo {
/// is unknown.
fn state_at(&self, id: BlockId) -> Option<TopLevelState>;
}

pub trait SnapshotClient {
fn notify_snapshot(&self, id: BlockId);
}
2 changes: 2 additions & 0 deletions core/src/consensus/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -241,6 +241,8 @@ pub trait ConsensusEngine: Sync + Send {

fn register_snapshot_notify_sender(&self, _sender: SnapshotNotifySender) {}

fn send_snapshot_notify(&self, _block_hash: BlockHash) {}

fn get_best_block_from_best_proposal_header(&self, header: &HeaderView<'_>) -> BlockHash {
header.hash()
}
Expand Down
17 changes: 16 additions & 1 deletion core/src/consensus/solo/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -20,13 +20,14 @@ use std::sync::{Arc, Weak};

use ckey::Address;
use cstate::{ActionHandler, HitHandler, TopStateView};
use ctypes::{CommonParams, Header};
use ctypes::{BlockHash, CommonParams, Header};
use parking_lot::RwLock;

use self::params::SoloParams;
use super::stake;
use super::{ConsensusEngine, Seal};
use crate::block::{ExecutedBlock, IsBlock};
use crate::client::snapshot_notify::NotifySender;
use crate::client::ConsensusClient;
use crate::codechain_machine::CodeChainMachine;
use crate::consensus::{EngineError, EngineType};
Expand All @@ -38,6 +39,7 @@ pub struct Solo {
params: SoloParams,
machine: CodeChainMachine,
action_handlers: Vec<Arc<dyn ActionHandler>>,
snapshot_notify_sender: Arc<RwLock<Option<NotifySender>>>,
}

impl Solo {
Expand All @@ -54,6 +56,7 @@ impl Solo {
params,
machine,
action_handlers,
snapshot_notify_sender: Arc::new(RwLock::new(None)),
}
}

Expand Down Expand Up @@ -159,6 +162,18 @@ impl ConsensusEngine for Solo {
1
}

fn register_snapshot_notify_sender(&self, sender: NotifySender) {
let mut guard = self.snapshot_notify_sender.write();
assert!(guard.is_none(), "snapshot_notify_sender is registered twice");
*guard = Some(sender);
}

fn send_snapshot_notify(&self, block_hash: BlockHash) {
if let Some(sender) = self.snapshot_notify_sender.read().as_ref() {
sender.notify(block_hash)
}
}

fn action_handlers(&self) -> &[Arc<dyn ActionHandler>] {
&self.action_handlers
}
Expand Down
4 changes: 2 additions & 2 deletions core/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -65,8 +65,8 @@ pub use crate::block::Block;
pub use crate::client::snapshot_notify;
pub use crate::client::{
AccountData, AssetClient, BlockChainClient, BlockChainTrait, ChainNotify, Client, ClientConfig, DatabaseClient,
EngineClient, EngineInfo, ExecuteClient, ImportBlock, MiningBlockChainClient, Shard, StateInfo, TermInfo,
TestBlockChainClient, TextClient,
EngineClient, EngineInfo, ExecuteClient, ImportBlock, MiningBlockChainClient, Shard, SnapshotClient, StateInfo,
TermInfo, TestBlockChainClient, TextClient,
};
pub use crate::consensus::{EngineType, TimeGapParams};
pub use crate::db::{COL_STATE, NUM_COLUMNS};
Expand Down
71 changes: 25 additions & 46 deletions foundry/rpc.rs
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,8 @@
// along with this program. If not, see <https://www.gnu.org/licenses/>.

use std::io;
use std::net::SocketAddr;

use crate::config::Config;
use crate::rpc_apis;
use crpc::{
jsonrpc_core, start_http, start_ipc, start_ws, HttpServer, IpcServer, MetaIoHandler, Middleware, WsError, WsServer,
Expand All @@ -33,38 +33,27 @@ pub struct RpcHttpConfig {
}

pub fn rpc_http_start(
cfg: RpcHttpConfig,
enable_devel_api: bool,
deps: &rpc_apis::ApiDependencies,
server: MetaIoHandler<(), impl Middleware<()>>,
config: RpcHttpConfig,
) -> Result<HttpServer, String> {
let url = format!("{}:{}", cfg.interface, cfg.port);
let url = format!("{}:{}", config.interface, config.port);
let addr = url.parse().map_err(|_| format!("Invalid JSONRPC listen host/port given: {}", url))?;
let server = setup_http_rpc_server(&addr, cfg.cors.clone(), cfg.hosts.clone(), enable_devel_api, deps)?;
cinfo!(RPC, "RPC Listening on {}", url);
if let Some(hosts) = cfg.hosts {
cinfo!(RPC, "Allowed hosts are {:?}", hosts);
}
if let Some(cors) = cfg.cors {
cinfo!(RPC, "CORS domains are {:?}", cors);
}
Ok(server)
}

fn setup_http_rpc_server(
url: &SocketAddr,
cors_domains: Option<Vec<String>>,
allowed_hosts: Option<Vec<String>>,
enable_devel_api: bool,
deps: &rpc_apis::ApiDependencies,
) -> Result<HttpServer, String> {
let server = setup_rpc_server(enable_devel_api, deps);
let start_result = start_http(url, cors_domains, allowed_hosts, server);
let start_result = start_http(&addr, config.cors.clone(), config.hosts.clone(), server);
match start_result {
Err(ref err) if err.kind() == io::ErrorKind::AddrInUse => {
Err(format!("RPC address {} is already in use, make sure that another instance of a CodeChain node is not running or change the address using the --jsonrpc-port option.", url))
},
Err(e) => Err(format!("RPC error: {:?}", e)),
Ok(server) => Ok(server),
Ok(server) => {
cinfo!(RPC, "RPC Listening on {}", url);
if let Some(hosts) = config.hosts {
cinfo!(RPC, "Allowed hosts are {:?}", hosts);
}
if let Some(cors) = config.cors {
cinfo!(RPC, "CORS domains are {:?}", cors);
}
Ok(server)
},
}
}

Expand All @@ -74,19 +63,17 @@ pub struct RpcIpcConfig {
}

pub fn rpc_ipc_start(
cfg: &RpcIpcConfig,
enable_devel_api: bool,
deps: &rpc_apis::ApiDependencies,
server: MetaIoHandler<(), impl Middleware<()>>,
config: RpcIpcConfig,
) -> Result<IpcServer, String> {
let server = setup_rpc_server(enable_devel_api, deps);
let start_result = start_ipc(&cfg.socket_addr, server);
let start_result = start_ipc(&config.socket_addr, server);
match start_result {
Err(ref err) if err.kind() == io::ErrorKind::AddrInUse => {
Err(format!("IPC address {} is already in use, make sure that another instance of a Codechain node is not running or change the address using the --ipc-path options.", cfg.socket_addr))
Err(format!("IPC address {} is already in use, make sure that another instance of a Codechain node is not running or change the address using the --ipc-path options.", config.socket_addr))
},
Err(e) => Err(format!("IPC error: {:?}", e)),
Ok(server) => {
cinfo!(RPC, "IPC Listening on {}", cfg.socket_addr);
cinfo!(RPC, "IPC Listening on {}", config.socket_addr);
Ok(server)
},
}
Expand All @@ -99,15 +86,10 @@ pub struct RpcWsConfig {
pub max_connections: usize,
}

pub fn rpc_ws_start(
cfg: &RpcWsConfig,
enable_devel_api: bool,
deps: &rpc_apis::ApiDependencies,
) -> Result<WsServer, String> {
let server = setup_rpc_server(enable_devel_api, deps);
let url = format!("{}:{}", cfg.interface, cfg.port);
pub fn rpc_ws_start(server: MetaIoHandler<(), impl Middleware<()>>, config: RpcWsConfig) -> Result<WsServer, String> {
let url = format!("{}:{}", config.interface, config.port);
let addr = url.parse().map_err(|_| format!("Invalid WebSockets listen host/port given: {}", url))?;
let start_result = start_ws(&addr, server, cfg.max_connections);
let start_result = start_ws(&addr, server, config.max_connections);
match start_result {
Err(WsError::Io(ref err)) if err.kind() == io::ErrorKind::AddrInUse => {
Err(format!("WebSockets address {} is already in use, make sure that another instance of a Codechain node is not running or change the address using the --ws-port options.", addr))
Expand All @@ -120,12 +102,9 @@ pub fn rpc_ws_start(
}
}

fn setup_rpc_server(
enable_devel_api: bool,
deps: &rpc_apis::ApiDependencies,
) -> MetaIoHandler<(), impl Middleware<()>> {
pub fn setup_rpc_server(config: &Config, deps: &rpc_apis::ApiDependencies) -> MetaIoHandler<(), impl Middleware<()>> {
let mut handler = MetaIoHandler::with_middleware(LogMiddleware::new());
deps.extend_api(enable_devel_api, &mut handler);
deps.extend_api(config, &mut handler);
rpc_apis::setup_rpc(handler)
}

Expand Down
7 changes: 5 additions & 2 deletions foundry/rpc_apis.rs
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,8 @@ use cnetwork::{EventSender, NetworkControl};
use crpc::{MetaIoHandler, Middleware, Params, Value};
use csync::BlockSyncEvent;

use crate::config::Config;

pub struct ApiDependencies {
pub client: Arc<Client>,
pub miner: Arc<Miner>,
Expand All @@ -31,11 +33,12 @@ pub struct ApiDependencies {
}

impl ApiDependencies {
pub fn extend_api(&self, enable_devel_api: bool, handler: &mut MetaIoHandler<(), impl Middleware<()>>) {
pub fn extend_api(&self, config: &Config, handler: &mut MetaIoHandler<(), impl Middleware<()>>) {
use crpc::v1::*;
handler.extend_with(ChainClient::new(Arc::clone(&self.client)).to_delegate());
handler.extend_with(MempoolClient::new(Arc::clone(&self.client)).to_delegate());
if enable_devel_api {
handler.extend_with(SnapshotClient::new(Arc::clone(&self.client), config.snapshot.path.clone()).to_delegate());
if config.rpc.enable_devel_api {
handler.extend_with(
DevelClient::new(Arc::clone(&self.client), Arc::clone(&self.miner), self.block_sync.clone())
.to_delegate(),
Expand Down
63 changes: 35 additions & 28 deletions foundry/run_node.rs
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ use crate::config::{self, load_config};
use crate::constants::{DEFAULT_DB_PATH, DEFAULT_KEYS_PATH};
use crate::dummy_network_service::DummyNetworkService;
use crate::json::PasswordFile;
use crate::rpc::{rpc_http_start, rpc_ipc_start, rpc_ws_start};
use crate::rpc::{rpc_http_start, rpc_ipc_start, rpc_ws_start, setup_rpc_server};
use crate::rpc_apis::ApiDependencies;

fn network_start(
Expand Down Expand Up @@ -297,36 +297,43 @@ pub fn run_node(matches: &ArgMatches<'_>) -> Result<(), String> {
}
};

let rpc_apis_deps = ApiDependencies {
client: client.client(),
miner: Arc::clone(&miner),
network_control: Arc::clone(&network_service),
account_provider: ap,
block_sync: maybe_sync_sender,
};
let (rpc_server, ipc_server, ws_server) = {
let rpc_apis_deps = ApiDependencies {
client: client.client(),
miner: Arc::clone(&miner),
network_control: Arc::clone(&network_service),
account_provider: ap,
block_sync: maybe_sync_sender,
};

let rpc_server = {
if !config.rpc.disable.unwrap() {
let server = setup_rpc_server(&config, &rpc_apis_deps);
Some(rpc_http_start(server, config.rpc_http_config())?)
} else {
None
}
};

let rpc_server = {
if !config.rpc.disable.unwrap() {
Some(rpc_http_start(config.rpc_http_config(), config.rpc.enable_devel_api, &rpc_apis_deps)?)
} else {
None
}
};
let ipc_server = {
if !config.ipc.disable.unwrap() {
let server = setup_rpc_server(&config, &rpc_apis_deps);
Some(rpc_ipc_start(server, config.rpc_ipc_config())?)
} else {
None
}
};

let ipc_server = {
if !config.ipc.disable.unwrap() {
Some(rpc_ipc_start(&config.rpc_ipc_config(), config.rpc.enable_devel_api, &rpc_apis_deps)?)
} else {
None
}
};
let ws_server = {
if !config.ws.disable.unwrap() {
let server = setup_rpc_server(&config, &rpc_apis_deps);
Some(rpc_ws_start(server, config.rpc_ws_config())?)
} else {
None
}
};

let ws_server = {
if !config.ws.disable.unwrap() {
Some(rpc_ws_start(&config.rpc_ws_config(), config.rpc.enable_devel_api, &rpc_apis_deps)?)
} else {
None
}
(rpc_server, ipc_server, ws_server)
};

let _snapshot_service = {
Expand Down
8 changes: 8 additions & 0 deletions rpc/src/v1/errors.rs
Original file line number Diff line number Diff line change
Expand Up @@ -273,3 +273,11 @@ pub fn invalid_custom_action(err: String) -> Error {
data: None,
}
}

pub fn io(error: std::io::Error) -> Error {
Error {
code: ErrorCode::InternalError,
message: format!("{}", error),
data: None,
}
}
11 changes: 8 additions & 3 deletions rpc/src/v1/impls/devel.rs
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ use std::vec::Vec;

use ccore::{
BlockId, DatabaseClient, EngineClient, EngineInfo, MinerService, MiningBlockChainClient, SignedTransaction,
TermInfo, COL_STATE,
SnapshotClient, TermInfo, COL_STATE,
};
use ccrypto::Blake;
use cjson::bytes::Bytes;
Expand All @@ -33,7 +33,7 @@ use csync::BlockSyncEvent;
use ctypes::transaction::{
Action, AssetMintOutput, AssetOutPoint, AssetTransferInput, AssetTransferOutput, Transaction,
};
use ctypes::{Tracker, TxHash};
use ctypes::{BlockHash, Tracker, TxHash};
use jsonrpc_core::Result;
use kvdb::KeyValueDB;
use primitives::{H160, H256};
Expand Down Expand Up @@ -70,7 +70,7 @@ where

impl<C, M> Devel for DevelClient<C, M>
where
C: DatabaseClient + EngineInfo + EngineClient + MiningBlockChainClient + TermInfo + 'static,
C: DatabaseClient + EngineInfo + EngineClient + MiningBlockChainClient + TermInfo + SnapshotClient + 'static,
M: MinerService + 'static,
{
fn get_state_trie_keys(&self, offset: usize, limit: usize) -> Result<Vec<H256>> {
Expand Down Expand Up @@ -108,6 +108,11 @@ where
}
}

fn snapshot(&self, block_hash: BlockHash) -> Result<()> {
self.client.notify_snapshot(BlockId::Hash(block_hash));
Ok(())
}

fn test_tps(&self, setting: TPSTestSetting) -> Result<f64> {
let common_params = self.client.common_params(BlockId::Latest).unwrap();
let mint_fee = common_params.min_asset_mint_cost();
Expand Down
2 changes: 2 additions & 0 deletions rpc/src/v1/impls/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -20,10 +20,12 @@ mod devel;
mod engine;
mod mempool;
mod net;
mod snapshot;

pub use self::account::AccountClient;
pub use self::chain::ChainClient;
pub use self::devel::DevelClient;
pub use self::engine::EngineClient;
pub use self::mempool::MempoolClient;
pub use self::net::NetClient;
pub use self::snapshot::SnapshotClient;
Loading