Skip to content

Commit

Permalink
refactor: rpc module organisation (#4172)
Browse files Browse the repository at this point in the history
  • Loading branch information
aatifsyed authored Apr 10, 2024
1 parent 745c458 commit 6637e24
Show file tree
Hide file tree
Showing 40 changed files with 513 additions and 510 deletions.
2 changes: 1 addition & 1 deletion src/cli/subcommands/attach_cmd.rs
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ use crate::rpc_client::*;
use crate::shim::{address::Address, message::Message};
use crate::{
chain::ChainEpochDelta,
rpc::{self, mpool_api::MpoolPushMessage, RpcMethodExt as _},
rpc::{self, prelude::*},
};
use crate::{cli::humantoken, message::SignedMessage};
use boa_engine::{
Expand Down
12 changes: 4 additions & 8 deletions src/cli/subcommands/auth_cmd.rs
Original file line number Diff line number Diff line change
@@ -1,14 +1,10 @@
// Copyright 2019-2024 ChainSafe Systems
// SPDX-License-Identifier: Apache-2.0, MIT

use crate::rpc_client::{ApiInfo, JsonRpcError};
use crate::rpc_client::ApiInfo;
use crate::{
auth::*,
rpc::{
self,
auth_api::{AuthNew, AuthNewParams},
RpcMethodExt as _,
},
rpc::{self, auth::AuthNewParams, prelude::*},
};
use chrono::Duration;
use clap::Subcommand;
Expand Down Expand Up @@ -38,13 +34,13 @@ pub enum AuthCommands {
},
}

fn process_perms(perm: String) -> Result<Vec<String>, JsonRpcError> {
fn process_perms(perm: String) -> Result<Vec<String>, rpc::ServerError> {
Ok(match perm.as_str() {
"admin" => ADMIN,
"sign" => SIGN,
"write" => WRITE,
"read" => READ,
_ => return Err(JsonRpcError::invalid_params("unknown permission", None)),
_ => return Err(rpc::ServerError::invalid_params("unknown permission", None)),
}
.iter()
.map(ToString::to_string)
Expand Down
3 changes: 1 addition & 2 deletions src/cli/subcommands/chain_cmd.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,7 @@
use crate::blocks::{Tipset, TipsetKey};
use crate::lotus_json::{HasLotusJson, LotusJson};
use crate::message::ChainMessage;
use crate::rpc::chain_api::*;
use crate::rpc::{self, RpcMethodExt as _};
use crate::rpc::{self, prelude::*};
use anyhow::bail;
use cid::Cid;
use clap::Subcommand;
Expand Down
6 changes: 2 additions & 4 deletions src/cli/subcommands/info_cmd.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,9 @@
// SPDX-License-Identifier: Apache-2.0, MIT

use crate::blocks::Tipset;
use crate::rpc::{self, prelude::*};
use crate::rpc_client::ApiInfo;
use crate::shim::econ::TokenAmount;
use crate::{
rpc::{self, chain_api::ChainHead, RpcMethodExt as _},
rpc_client::ApiInfo,
};
use chrono::{DateTime, Utc};
use clap::Subcommand;
use futures::TryFutureExt as _;
Expand Down
10 changes: 2 additions & 8 deletions src/cli/subcommands/mpool_cmd.rs
Original file line number Diff line number Diff line change
@@ -1,18 +1,12 @@
// Copyright 2019-2024 ChainSafe Systems
// SPDX-License-Identifier: Apache-2.0, MIT

use std::str::FromStr;
use std::str::FromStr as _;

use crate::blocks::Tipset;
use crate::lotus_json::LotusJson;
use crate::message::SignedMessage;
use crate::rpc::mpool_api::MpoolPending;
use crate::rpc::types::ApiTipsetKey;
use crate::rpc::{
self,
chain_api::{ChainGetMinBaseFee, ChainHead},
RpcMethodExt as _,
};
use crate::rpc::{self, prelude::*, types::ApiTipsetKey};
use crate::rpc_client::ApiInfo;
use crate::shim::address::StrictAddress;
use crate::shim::message::Message;
Expand Down
3 changes: 1 addition & 2 deletions src/cli/subcommands/send_cmd.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,7 @@

use std::str::FromStr as _;

use crate::rpc::mpool_api::MpoolPushMessage;
use crate::rpc::{self, RpcMethodExt as _};
use crate::rpc::{self, prelude::*};
use crate::rpc_client::ApiInfo;
use crate::shim::address::{Address, StrictAddress};
use crate::shim::econ::TokenAmount;
Expand Down
6 changes: 1 addition & 5 deletions src/cli/subcommands/snapshot_cmd.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,7 @@ use super::*;
use crate::chain_sync::SyncConfig;
use crate::cli_shared::snapshot::{self, TrustedVendor};
use crate::rpc::types::ApiTipsetKey;
use crate::rpc::RpcMethodExt as _;
use crate::rpc::{
self,
chain_api::{ChainExport, ChainExportParams, ChainGetTipSetByHeight, ChainHead},
};
use crate::rpc::{self, chain::ChainExportParams, prelude::*};
use crate::rpc_client::ApiInfo;
use anyhow::Context as _;
use chrono::DateTime;
Expand Down
2 changes: 1 addition & 1 deletion src/libp2p/service.rs
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ use crate::libp2p_bitswap::{
BitswapStoreRead, BitswapStoreReadWrite,
};
use crate::message::SignedMessage;
use crate::{blocks::GossipBlock, rpc::net_api::NetInfoResult};
use crate::{blocks::GossipBlock, rpc::net::NetInfoResult};
use crate::{chain::ChainStore, utils::encoding::from_slice_with_fallback};
use ahash::{HashMap, HashSet};
use cid::Cid;
Expand Down
216 changes: 105 additions & 111 deletions src/rpc/auth_layer.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@
use crate::auth::{verify_token, JWT_IDENTIFIER};
use crate::key_management::KeyStore;
use crate::rpc::{
auth_api, beacon_api, chain_api, common_api, eth_api, gas_api, mpool_api, net_api, node_api,
state_api, sync_api, wallet_api, RpcMethod as _, CANCEL_METHOD_NAME,
auth, beacon, chain, common, eth, gas, mpool, net, node, state, sync, wallet, RpcMethod as _,
CANCEL_METHOD_NAME,
};
use ahash::{HashMap, HashMapExt as _};
use futures::future::BoxFuture;
Expand Down Expand Up @@ -35,140 +35,134 @@ static ACCESS_MAP: Lazy<HashMap<&str, Access>> = Lazy::new(|| {
let mut access = HashMap::new();

// Auth API
access.insert(auth_api::AuthNew::NAME, Access::Admin);
access.insert(auth_api::AuthVerify::NAME, Access::Read);
access.insert(auth::AuthNew::NAME, Access::Admin);
access.insert(auth::AuthVerify::NAME, Access::Read);

// Beacon API
access.insert(beacon_api::BeaconGetEntry::NAME, Access::Read);
access.insert(beacon::BeaconGetEntry::NAME, Access::Read);

// Chain API
access.insert(chain_api::ChainGetMessage::NAME, Access::Read);
access.insert(chain_api::ChainExport::NAME, Access::Read);
access.insert(chain_api::ChainReadObj::NAME, Access::Read);
access.insert(chain_api::ChainGetPath::NAME, Access::Read);
access.insert(chain_api::ChainHasObj::NAME, Access::Read);
access.insert(chain_api::ChainGetBlockMessages::NAME, Access::Read);
access.insert(chain_api::ChainGetTipSetByHeight::NAME, Access::Read);
access.insert(chain_api::ChainGetTipSetAfterHeight::NAME, Access::Read);
access.insert(chain_api::ChainGetGenesis::NAME, Access::Read);
access.insert(chain_api::ChainHead::NAME, Access::Read);
access.insert(chain_api::ChainGetBlock::NAME, Access::Read);
access.insert(chain_api::ChainGetTipSet::NAME, Access::Read);
access.insert(chain_api::ChainSetHead::NAME, Access::Admin);
access.insert(chain_api::ChainGetMinBaseFee::NAME, Access::Admin);
access.insert(chain_api::ChainGetMessagesInTipset::NAME, Access::Read);
access.insert(chain_api::ChainGetParentMessages::NAME, Access::Read);
access.insert(chain_api::CHAIN_NOTIFY, Access::Read);
access.insert(chain_api::ChainGetParentReceipts::NAME, Access::Read);
access.insert(chain::ChainGetMessage::NAME, Access::Read);
access.insert(chain::ChainExport::NAME, Access::Read);
access.insert(chain::ChainReadObj::NAME, Access::Read);
access.insert(chain::ChainGetPath::NAME, Access::Read);
access.insert(chain::ChainHasObj::NAME, Access::Read);
access.insert(chain::ChainGetBlockMessages::NAME, Access::Read);
access.insert(chain::ChainGetTipSetByHeight::NAME, Access::Read);
access.insert(chain::ChainGetTipSetAfterHeight::NAME, Access::Read);
access.insert(chain::ChainGetGenesis::NAME, Access::Read);
access.insert(chain::ChainHead::NAME, Access::Read);
access.insert(chain::ChainGetBlock::NAME, Access::Read);
access.insert(chain::ChainGetTipSet::NAME, Access::Read);
access.insert(chain::ChainSetHead::NAME, Access::Admin);
access.insert(chain::ChainGetMinBaseFee::NAME, Access::Admin);
access.insert(chain::ChainGetMessagesInTipset::NAME, Access::Read);
access.insert(chain::ChainGetParentMessages::NAME, Access::Read);
access.insert(chain::CHAIN_NOTIFY, Access::Read);
access.insert(chain::ChainGetParentReceipts::NAME, Access::Read);

// Message Pool API
access.insert(mpool_api::MpoolGetNonce::NAME, Access::Read);
access.insert(mpool_api::MpoolPending::NAME, Access::Read);
access.insert(mpool::MpoolGetNonce::NAME, Access::Read);
access.insert(mpool::MpoolPending::NAME, Access::Read);
// Lotus limits `MPOOL_PUSH`` to `Access::Write`. However, since messages
// can always be pushed over the p2p protocol, limiting the RPC doesn't
// improve security.
access.insert(mpool_api::MpoolPush::NAME, Access::Read);
access.insert(mpool_api::MpoolPushMessage::NAME, Access::Sign);
access.insert(mpool::MpoolPush::NAME, Access::Read);
access.insert(mpool::MpoolPushMessage::NAME, Access::Sign);

// Sync API
access.insert(sync_api::SYNC_CHECK_BAD, Access::Read);
access.insert(sync_api::SYNC_MARK_BAD, Access::Admin);
access.insert(sync_api::SYNC_STATE, Access::Read);
access.insert(sync::SYNC_CHECK_BAD, Access::Read);
access.insert(sync::SYNC_MARK_BAD, Access::Admin);
access.insert(sync::SYNC_STATE, Access::Read);

// Wallet API
access.insert(wallet_api::WALLET_BALANCE, Access::Write);
access.insert(wallet_api::WALLET_BALANCE, Access::Read);
access.insert(wallet_api::WALLET_DEFAULT_ADDRESS, Access::Read);
access.insert(wallet_api::WALLET_EXPORT, Access::Admin);
access.insert(wallet_api::WALLET_HAS, Access::Write);
access.insert(wallet_api::WALLET_IMPORT, Access::Admin);
access.insert(wallet_api::WALLET_LIST, Access::Write);
access.insert(wallet_api::WALLET_NEW, Access::Write);
access.insert(wallet_api::WALLET_SET_DEFAULT, Access::Write);
access.insert(wallet_api::WALLET_SIGN, Access::Sign);
access.insert(wallet_api::WALLET_VALIDATE_ADDRESS, Access::Read);
access.insert(wallet_api::WALLET_VERIFY, Access::Read);
access.insert(wallet_api::WALLET_DELETE, Access::Write);
access.insert(wallet::WALLET_BALANCE, Access::Write);
access.insert(wallet::WALLET_BALANCE, Access::Read);
access.insert(wallet::WALLET_DEFAULT_ADDRESS, Access::Read);
access.insert(wallet::WALLET_EXPORT, Access::Admin);
access.insert(wallet::WALLET_HAS, Access::Write);
access.insert(wallet::WALLET_IMPORT, Access::Admin);
access.insert(wallet::WALLET_LIST, Access::Write);
access.insert(wallet::WALLET_NEW, Access::Write);
access.insert(wallet::WALLET_SET_DEFAULT, Access::Write);
access.insert(wallet::WALLET_SIGN, Access::Sign);
access.insert(wallet::WALLET_VALIDATE_ADDRESS, Access::Read);
access.insert(wallet::WALLET_VERIFY, Access::Read);
access.insert(wallet::WALLET_DELETE, Access::Write);

// State API
access.insert(state_api::STATE_CALL, Access::Read);
access.insert(state_api::STATE_REPLAY, Access::Read);
access.insert(state_api::STATE_GET_ACTOR, Access::Read);
access.insert(state_api::STATE_MARKET_BALANCE, Access::Read);
access.insert(state_api::STATE_MARKET_DEALS, Access::Read);
access.insert(state_api::STATE_MINER_INFO, Access::Read);
access.insert(state_api::MINER_GET_BASE_INFO, Access::Read);
access.insert(state_api::STATE_MINER_ACTIVE_SECTORS, Access::Read);
access.insert(state_api::STATE_MINER_FAULTS, Access::Read);
access.insert(state_api::STATE_MINER_RECOVERIES, Access::Read);
access.insert(state_api::STATE_MINER_POWER, Access::Read);
access.insert(state_api::STATE_MINER_DEADLINES, Access::Read);
access.insert(state_api::STATE_MINER_PROVING_DEADLINE, Access::Read);
access.insert(state_api::STATE_MINER_AVAILABLE_BALANCE, Access::Read);
access.insert(state_api::STATE_GET_RECEIPT, Access::Read);
access.insert(state_api::STATE_WAIT_MSG, Access::Read);
access.insert(state_api::STATE_SEARCH_MSG, Access::Read);
access.insert(state_api::STATE_SEARCH_MSG_LIMITED, Access::Read);
access.insert(state_api::STATE_NETWORK_NAME, Access::Read);
access.insert(state_api::STATE_NETWORK_VERSION, Access::Read);
access.insert(state_api::STATE_ACCOUNT_KEY, Access::Read);
access.insert(state_api::STATE_LOOKUP_ID, Access::Read);
access.insert(state_api::STATE_FETCH_ROOT, Access::Read);
access.insert(state_api::STATE_GET_RANDOMNESS_FROM_TICKETS, Access::Read);
access.insert(state_api::STATE_GET_RANDOMNESS_FROM_BEACON, Access::Read);
access.insert(state_api::STATE_READ_STATE, Access::Read);
access.insert(state_api::STATE_CIRCULATING_SUPPLY, Access::Read);
access.insert(state_api::STATE_SECTOR_GET_INFO, Access::Read);
access.insert(state_api::STATE_LIST_MESSAGES, Access::Read);
access.insert(state_api::STATE_LIST_MINERS, Access::Read);
access.insert(state_api::STATE_MINER_SECTOR_COUNT, Access::Read);
access.insert(state_api::STATE_VERIFIED_CLIENT_STATUS, Access::Read);
access.insert(state_api::STATE_MARKET_STORAGE_DEAL, Access::Read);
access.insert(
state_api::STATE_VM_CIRCULATING_SUPPLY_INTERNAL,
Access::Read,
);
access.insert(state_api::MSIG_GET_AVAILABLE_BALANCE, Access::Read);
access.insert(state_api::MSIG_GET_PENDING, Access::Read);
access.insert(
state_api::STATE_DEAL_PROVIDER_COLLATERAL_BOUNDS,
Access::Read,
);
access.insert(state::STATE_CALL, Access::Read);
access.insert(state::STATE_REPLAY, Access::Read);
access.insert(state::STATE_GET_ACTOR, Access::Read);
access.insert(state::STATE_MARKET_BALANCE, Access::Read);
access.insert(state::STATE_MARKET_DEALS, Access::Read);
access.insert(state::STATE_MINER_INFO, Access::Read);
access.insert(state::MINER_GET_BASE_INFO, Access::Read);
access.insert(state::STATE_MINER_ACTIVE_SECTORS, Access::Read);
access.insert(state::STATE_MINER_FAULTS, Access::Read);
access.insert(state::STATE_MINER_RECOVERIES, Access::Read);
access.insert(state::STATE_MINER_POWER, Access::Read);
access.insert(state::STATE_MINER_DEADLINES, Access::Read);
access.insert(state::STATE_MINER_PROVING_DEADLINE, Access::Read);
access.insert(state::STATE_MINER_AVAILABLE_BALANCE, Access::Read);
access.insert(state::STATE_GET_RECEIPT, Access::Read);
access.insert(state::STATE_WAIT_MSG, Access::Read);
access.insert(state::STATE_SEARCH_MSG, Access::Read);
access.insert(state::STATE_SEARCH_MSG_LIMITED, Access::Read);
access.insert(state::STATE_NETWORK_NAME, Access::Read);
access.insert(state::STATE_NETWORK_VERSION, Access::Read);
access.insert(state::STATE_ACCOUNT_KEY, Access::Read);
access.insert(state::STATE_LOOKUP_ID, Access::Read);
access.insert(state::STATE_FETCH_ROOT, Access::Read);
access.insert(state::STATE_GET_RANDOMNESS_FROM_TICKETS, Access::Read);
access.insert(state::STATE_GET_RANDOMNESS_FROM_BEACON, Access::Read);
access.insert(state::STATE_READ_STATE, Access::Read);
access.insert(state::STATE_CIRCULATING_SUPPLY, Access::Read);
access.insert(state::STATE_SECTOR_GET_INFO, Access::Read);
access.insert(state::STATE_LIST_MESSAGES, Access::Read);
access.insert(state::STATE_LIST_MINERS, Access::Read);
access.insert(state::STATE_MINER_SECTOR_COUNT, Access::Read);
access.insert(state::STATE_VERIFIED_CLIENT_STATUS, Access::Read);
access.insert(state::STATE_MARKET_STORAGE_DEAL, Access::Read);
access.insert(state::STATE_VM_CIRCULATING_SUPPLY_INTERNAL, Access::Read);
access.insert(state::MSIG_GET_AVAILABLE_BALANCE, Access::Read);
access.insert(state::MSIG_GET_PENDING, Access::Read);
access.insert(state::STATE_DEAL_PROVIDER_COLLATERAL_BOUNDS, Access::Read);

// Gas API
access.insert(gas_api::GAS_ESTIMATE_GAS_LIMIT, Access::Read);
access.insert(gas_api::GAS_ESTIMATE_GAS_PREMIUM, Access::Read);
access.insert(gas_api::GAS_ESTIMATE_FEE_CAP, Access::Read);
access.insert(gas_api::GAS_ESTIMATE_MESSAGE_GAS, Access::Read);
access.insert(gas::GAS_ESTIMATE_GAS_LIMIT, Access::Read);
access.insert(gas::GAS_ESTIMATE_GAS_PREMIUM, Access::Read);
access.insert(gas::GAS_ESTIMATE_FEE_CAP, Access::Read);
access.insert(gas::GAS_ESTIMATE_MESSAGE_GAS, Access::Read);

// Common API
access.insert(common_api::VERSION, Access::Read);
access.insert(common_api::SESSION, Access::Read);
access.insert(common_api::SHUTDOWN, Access::Admin);
access.insert(common_api::START_TIME, Access::Read);
access.insert(common::VERSION, Access::Read);
access.insert(common::SESSION, Access::Read);
access.insert(common::SHUTDOWN, Access::Admin);
access.insert(common::START_TIME, Access::Read);

// Net API
access.insert(net_api::NET_ADDRS_LISTEN, Access::Read);
access.insert(net_api::NET_PEERS, Access::Read);
access.insert(net_api::NET_LISTENING, Access::Read);
access.insert(net_api::NET_INFO, Access::Read);
access.insert(net_api::NET_CONNECT, Access::Write);
access.insert(net_api::NET_DISCONNECT, Access::Write);
access.insert(net_api::NET_AGENT_VERSION, Access::Read);
access.insert(net_api::NET_AUTO_NAT_STATUS, Access::Read);
access.insert(net_api::NET_VERSION, Access::Read);
access.insert(net::NET_ADDRS_LISTEN, Access::Read);
access.insert(net::NET_PEERS, Access::Read);
access.insert(net::NET_LISTENING, Access::Read);
access.insert(net::NET_INFO, Access::Read);
access.insert(net::NET_CONNECT, Access::Write);
access.insert(net::NET_DISCONNECT, Access::Write);
access.insert(net::NET_AGENT_VERSION, Access::Read);
access.insert(net::NET_AUTO_NAT_STATUS, Access::Read);
access.insert(net::NET_VERSION, Access::Read);

// Node API
access.insert(node_api::NODE_STATUS, Access::Read);
access.insert(node::NODE_STATUS, Access::Read);

// Eth API
access.insert(eth_api::ETH_ACCOUNTS, Access::Read);
access.insert(eth_api::ETH_BLOCK_NUMBER, Access::Read);
access.insert(eth_api::ETH_CHAIN_ID, Access::Read);
access.insert(eth_api::ETH_GAS_PRICE, Access::Read);
access.insert(eth_api::ETH_GET_BALANCE, Access::Read);
access.insert(eth_api::ETH_SYNCING, Access::Read);
access.insert(eth_api::WEB3_CLIENT_VERSION, Access::Read);
access.insert(eth::ETH_ACCOUNTS, Access::Read);
access.insert(eth::ETH_BLOCK_NUMBER, Access::Read);
access.insert(eth::ETH_CHAIN_ID, Access::Read);
access.insert(eth::ETH_GAS_PRICE, Access::Read);
access.insert(eth::ETH_GET_BALANCE, Access::Read);
access.insert(eth::ETH_SYNCING, Access::Read);
access.insert(eth::WEB3_CLIENT_VERSION, Access::Read);

// Pubsub API
access.insert(CANCEL_METHOD_NAME, Access::Read);
Expand Down
6 changes: 3 additions & 3 deletions src/rpc/channel.rs
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,7 @@ use std::sync::Arc;
use tokio::sync::broadcast::error::RecvError;
use tokio::sync::{mpsc, oneshot};

use super::error::JsonRpcError;
use super::error::ServerError;

pub const NOTIF_METHOD_NAME: &str = "xrpc.ch.val";
pub const CANCEL_METHOD_NAME: &str = "xrpc.cancel";
Expand Down Expand Up @@ -295,9 +295,9 @@ impl Default for RpcModule {
let opt = channels.lock().remove(&sub_id);
match opt {
Some((_, _, channel_id)) => {
Ok::<ChannelId, JsonRpcError>(channel_id)
Ok::<ChannelId, ServerError>(channel_id)
}
None => Err::<ChannelId, JsonRpcError>(JsonRpcError::from(
None => Err::<ChannelId, ServerError>(ServerError::from(
anyhow::anyhow!("channel not found"),
)),
}
Expand Down
Loading

0 comments on commit 6637e24

Please sign in to comment.