diff --git a/app/main.rs b/app/main.rs index ec8aa40..dd12f5d 100644 --- a/app/main.rs +++ b/app/main.rs @@ -31,10 +31,13 @@ fn set_tracing_subscriber(log_level: tracing::Level) -> anyhow::Result<()> { }) } -async fn spawn_rpc_server( - server: server::Server, +async fn spawn_rpc_server( + server: server::Server, serve_rpc_addr: SocketAddr, -) -> anyhow::Result { +) -> anyhow::Result +where + RpcClient: bitcoin_jsonrpsee::MainClient + Send + Sync + 'static, +{ tracing::info!("serving RPC on {}", serve_rpc_addr); use server::RpcServer; @@ -109,7 +112,7 @@ async fn main() -> anyhow::Result<()> { enforcer, mempool, tx_cache, - rpc_client, + rpc_client.clone(), sequence_stream, |err| async { let err = anyhow::Error::from(err); @@ -121,6 +124,7 @@ async fn main() -> anyhow::Result<()> { mempool, network, network_info, + rpc_client, sample_block_template, )?; let rpc_server_handle = diff --git a/lib/server.rs b/lib/server.rs index e25429e..faaa7fc 100644 --- a/lib/server.rs +++ b/lib/server.rs @@ -28,6 +28,14 @@ pub trait Rpc { &self, request: BlockTemplateRequest, ) -> RpcResult; + + /// Returns None if the block is invalid, otherwise the error code + /// describing why the block was rejected. + #[method(name = "submitblock")] + async fn submit_block( + &self, + block_hex: String, + ) -> RpcResult>; } #[derive(Debug, Error)] @@ -36,20 +44,22 @@ pub enum CreateServerError { SampleBlockTemplate, } -pub struct Server { +pub struct Server { coinbase_spk: ScriptBuf, mempool: MempoolSync, network: Network, network_info: NetworkInfo, + rpc_client: RpcClient, sample_block_template: BlockTemplate, } -impl Server { +impl Server { pub fn new( coinbase_spk: ScriptBuf, mempool: MempoolSync, network: Network, network_info: NetworkInfo, + rpc_client: RpcClient, sample_block_template: BlockTemplate, ) -> Result { if matches!( @@ -63,6 +73,7 @@ impl Server { mempool, network, network_info, + rpc_client, sample_block_template, }) } @@ -435,9 +446,10 @@ async fn block_txs( } #[async_trait] -impl RpcServer for Server +impl RpcServer for Server where BP: CusfBlockProducer + Send + Sync + 'static, + RpcClient: bitcoin_jsonrpsee::client::MainClient + Send + Sync + 'static, { async fn get_block_template( &self, @@ -596,4 +608,17 @@ where }; Ok(res) } + + async fn submit_block( + &self, + block_hex: String, + ) -> RpcResult> { + self.rpc_client + .submit_block(block_hex) + .await + .map_err(|err| match err { + jsonrpsee::core::ClientError::Call(err) => err, + err => internal_error(err), + }) + } }