cuprate icon indicating copy to clipboard operation
cuprate copied to clipboard

Internal data needed for `cuprated`'s RPC

Open hinto-janai opened this issue 5 months ago • 1 comments

What

This is a discussion for what data is required for cuprated's RPC system.

Notably, this is:

  • Blockchain data
  • Transaction pool data
  • P2P data
  • General process state

The following tables (except the general process state) are newly proposed requests/responses to be added to each system's tower::Service API such that the RPC system can fulfill the request. The RPC system is assumed to have read access (and write access where needed) to all systems via tower::Service handles.

Blockchain

Request Response Needed for Description
PopBlocks(u64) u64 /pop_blocks Pop n blocks, return the new height
Prune TODO prune_blockchain Prune the blockchain
Pruned bool prune_blockchain Is the blockchain pruned?
Block(u64) Block get_block Retrieve block information
BlockByHash([u8; 32]) Block get_block Same as Block; for convenience
TopBlock Block Get the latest Block, Same as Block; for convenience
TopBlockExtendedHeader ExtendedBlockHeader Get the latest ExtendedBlockHeader; for convenience
KeyImageSpent([u8; 32]) bool /is_key_image_spent Singular version of already existing KeyImagesSpent
TopBlockFull (Block, ExtendedBlockHeader) get_last_block_header Get information on the last block to map to cuprate_rpc_types::misc::BlockHeader
TopBlockHash [u8; 32] get_info Get the top block hash.
TotalTxCount u64 get_info Get the total amount of non-coinbase transactions; cuprate_rpc_types::json::GetInfoResponse::tx_count
DatabaseSize (u64, u64) get_info Return byte size of database file and available space for cuprate_rpc_types::json::GetInfoResponse::{database_size,free_space}
BlockWeightLimit u64 get_info cuprate_rpc_types::json::GetInfoResponse::block_weight_limit
BlockWeightMedian u64 get_info cuprate_rpc_types::json::GetInfoResponse::block_weight_median
Difficulty(usize) u128 get_info Difficulty for a specific block (input = height) cuprate_rpc_types::json::GetInfoResponse::difficulty[_top64]
CurrentHardFork HardFork hard_fork_info Retrieve the latest HardFork
HardForkInfo(Hardfork) HardForkInfo hard_fork_info Retrieve various information about a hardfork; cuprate_rpc_types::json::HardForkInfoResponse; https://github.com/monero-project/monero/blob/cc73fe71162d564ffda8e549b79a350bca53c454/src/rpc/core_rpc_server.cpp#L2751; https://github.com/monero-project/monero/blob/a1dc85c5373a30f14aaf7dcfdd95f5a7375d3623/src/cryptonote_basic/hardfork.cpp#L408;
OutputHistogram OutputHistogram get_output_histogram https://github.com/monero-project/monero/blob/a1dc85c5373a30f14aaf7dcfdd95f5a7375d3623/src/blockchain_db/lmdb/db_lmdb.cpp#L4222
CoinbaseTxSum CoinbaseTxSum get_coinbase_tx_sum https://github.com/monero-project/monero/blob/a1dc85c5373a30f14aaf7dcfdd95f5a7375d3623/src/cryptonote_core/cryptonote_core.cpp#L1265
FeeEstimate(grace_blocks: u64) TODO get_fee_estimate TODO: Impl of dynamic fees required: https://github.com/monero-project/monero/blob/a1dc85c5373a30f14aaf7dcfdd95f5a7375d3623/src/cryptonote_core/blockchain.cpp#L3791
MinerData TODO get_miner_data https://github.com/monero-project/monero/blob/a1dc85c5373a30f14aaf7dcfdd95f5a7375d3623/src/cryptonote_core/blockchain.cpp#L1822
TODO TODO get_alternate_chains TODO
TODO TODO TODO TODO

Transaction pool

Request Response Needed for Description
Backlog Vec<TxBacklogEntry> get_txpool_backlog Get misc information on all transactions in the pool.
PoolSize u64 get_info Number of transactions that have been broadcast but not included in a block; cuprate_rpc_types::json::GetInfoResponse::tx_pool_size
Flush(Vec<[u8; 32]>) () flush_txpool Flush the given transaction hashes from the txpool (all if Vec is empty).
TODO TODO TODO TODO

P2P

Request Response Needed for Description
RelayBlock(Block) () submit_block Relay a found block
ConnectionInfo P2P connection data get_connections Must map into cuprate_rpc_types::misc::ConnectionInfo
Syncing bool get_info cuprate_rpc_types::json::GetInfoResponse::busy_syncing
Synced bool get_info cuprate_rpc_types::json::GetInfoResponse::synchronized
Target u64 get_info cuprate_rpc_types::json::GetInfoResponse::target
TargetHeight u64 get_info cuprate_rpc_types::json::GetInfoResponse::target_height
PeerlistSize (u64, u64) get_info cuprate_rpc_types::json::GetInfoResponse::{white,grey}_peerlist_size
ConnectionCount (u64, u64) get_info cuprate_rpc_types::json::GetInfoResponse::{incoming,outgoing}_connections_count
SetBan(cuprate_rpc_types::json::SetBanRequest) () set_ban (Un)ban an IP for n seconds
GetBan cuprate_rpc_types::json::GetBan banned Get information about a single ban
GetBans Vec<cuprate_rpc_types::json::GetBan> get_ban Get information about all bans
TODO TODO TODO TODO

cuprated state

There is extra state the RPC needs on the more global binary/process level.

This is state that makes sense as global statics on the cuprated-level (or some library exposed to all).

Static Type Needed for Description
START_INSTANT, START_INSTANT_UNIX SystemTime, u64 get_info Start time of daemon; cuprate_rpc_types::json::GetInfoResponse::start_time
TODO TODO TODO TODO

hinto-janai avatar Sep 11 '24 21:09 hinto-janai