From e14b42ab53228d927288312a35e1d8e9ae7e0615 Mon Sep 17 00:00:00 2001 From: Stanislav Eliseev Date: Tue, 4 Feb 2025 12:50:16 +0100 Subject: [PATCH] chore(core): move validation logic to a separate function --- block-util/src/message/mod.rs | 11 +++++++++++ core/src/blockchain_rpc/service.rs | 14 +++----------- rpc/src/endpoint/jrpc/mod.rs | 24 +++++++----------------- rpc/src/endpoint/proto/mod.rs | 22 ++++++---------------- 4 files changed, 27 insertions(+), 44 deletions(-) diff --git a/block-util/src/message/mod.rs b/block-util/src/message/mod.rs index bc8f92107..bd2050133 100644 --- a/block-util/src/message/mod.rs +++ b/block-util/src/message/mod.rs @@ -1,2 +1,13 @@ mod ext_msg_repr; pub use ext_msg_repr::{create_big_message, create_deep_merkle, ExtMsgRepr, MsgStorageStat}; + +use crate::message::ext_msg_repr::InvalidExtMsg; + +pub async fn validate_external_message(body: &bytes::Bytes) -> Result<(), InvalidExtMsg> { + let cloned = body.clone(); + if body.len() > ExtMsgRepr::BOUNDARY_BOC_SIZE { + tycho_util::sync::rayon_run_fifo(move || ExtMsgRepr::validate(&cloned)).await + } else { + ExtMsgRepr::validate(&cloned) + } +} diff --git a/core/src/blockchain_rpc/service.rs b/core/src/blockchain_rpc/service.rs index 2eedb88d7..93f9ccafa 100644 --- a/core/src/blockchain_rpc/service.rs +++ b/core/src/blockchain_rpc/service.rs @@ -6,7 +6,6 @@ use bytes::{Buf, Bytes}; use everscale_types::models::BlockId; use futures_util::Future; use serde::{Deserialize, Serialize}; -use tycho_block_util::message::ExtMsgRepr; use tycho_network::{try_handle_prefix, InboundRequestMeta, Response, Service, ServiceRequest}; use tycho_storage::{ArchiveId, BlockConnection, KeyBlocksDirection, PersistentStateKind, Storage}; use tycho_util::futures::BoxFutureOrNoop; @@ -327,19 +326,12 @@ impl Service for BlockchainRpcService { .increment(req.body.len() as u64); BoxFutureOrNoop::future(async move { - let cloned = req.body.clone(); - let validation_result = if req.body.len() > ExtMsgRepr::BOUNDARY_BOC_SIZE { - tycho_util::sync::rayon_run_fifo(move || ExtMsgRepr::validate(&cloned)) - .await - } else { - ExtMsgRepr::validate(&cloned) - }; - - if let Err(e) = validation_result { + if let Err(e) = + tycho_block_util::message::validate_external_message(&req.body).await + { tracing::debug!("failed to validate external message: {e:?}"); return; } - inner .broadcast_listener .handle_message(req.metadata, req.body) diff --git a/rpc/src/endpoint/jrpc/mod.rs b/rpc/src/endpoint/jrpc/mod.rs index c0f4a17b2..b9ea0ecd4 100644 --- a/rpc/src/endpoint/jrpc/mod.rs +++ b/rpc/src/endpoint/jrpc/mod.rs @@ -9,7 +9,6 @@ use everscale_types::models::*; use everscale_types::prelude::*; use serde::{Deserialize, Serialize}; use serde_json::value::RawValue; -use tycho_block_util::message::ExtMsgRepr; use tycho_storage::{CodeHashesIter, TransactionsIterBuilder}; use tycho_util::metrics::HistogramGuard; use tycho_util::serde_helpers; @@ -65,23 +64,14 @@ pub async fn route(State(state): State, req: Jrpc) -> Response } } MethodParams::SendMessage(p) => { - let bytes = p.message.clone(); - if p.message.len() > ExtMsgRepr::BOUNDARY_BOC_SIZE { - let validation_result = if p.message.len() > ExtMsgRepr::BOUNDARY_BOC_SIZE { - tycho_util::sync::rayon_run_fifo(move || ExtMsgRepr::validate(&bytes)).await - } else { - ExtMsgRepr::validate(&bytes) - }; - - if let Err(e) = validation_result { - return JrpcErrorResponse { - id: Some(req.id), - code: INVALID_BOC_CODE, - message: e.to_string().into(), - } - .into_response(); + if let Err(e) = tycho_block_util::message::validate_external_message(&p.message).await { + return JrpcErrorResponse { + id: Some(req.id), + code: INVALID_BOC_CODE, + message: e.to_string().into(), } - }; + .into_response(); + } state.broadcast_external_message(&p.message).await; ok_to_response(req.id, ()) } diff --git a/rpc/src/endpoint/proto/mod.rs b/rpc/src/endpoint/proto/mod.rs index e84fa29d2..12852f633 100644 --- a/rpc/src/endpoint/proto/mod.rs +++ b/rpc/src/endpoint/proto/mod.rs @@ -8,7 +8,6 @@ use bytes::Bytes; use everscale_types::cell::HashBytes; use everscale_types::models::*; use everscale_types::prelude::*; -use tycho_block_util::message::ExtMsgRepr; pub use self::cache::ProtoEndpointCache; use self::protos::rpc::{self, request, response, Request}; @@ -66,22 +65,13 @@ pub async fn route(State(state): State, Protobuf(req): Protobuf { - let bytes = p.message.clone(); - if p.message.len() > ExtMsgRepr::BOUNDARY_BOC_SIZE { - let validation_result = if p.message.len() > ExtMsgRepr::BOUNDARY_BOC_SIZE { - tycho_util::sync::rayon_run_fifo(move || ExtMsgRepr::validate(&bytes)).await - } else { - ExtMsgRepr::validate(&bytes) - }; - - if let Err(e) = validation_result { - return ProtoErrorResponse { - code: INVALID_BOC_CODE, - message: e.to_string().into(), - } - .into_response(); + if let Err(e) = tycho_block_util::message::validate_external_message(&p.message).await { + return ProtoErrorResponse { + code: INVALID_BOC_CODE, + message: e.to_string().into(), } - }; + .into_response(); + } state.broadcast_external_message(&p.message).await; ok_to_response(response::Result::SendMessage(()))