drive_abci/rpc/
signature.rs

1use super::core::CORE_RPC_INVALID_ADDRESS_OR_KEY;
2use super::core::CORE_RPC_INVALID_PARAMETER;
3use super::core::CORE_RPC_PARSE_ERROR;
4use crate::error::execution::ExecutionError;
5use crate::error::Error;
6use crate::rpc::core::CoreRPCLike;
7use dpp::dashcore::InstantLock;
8
9/// An entity with a signature verifiable by Core RPC
10pub trait CoreSignatureVerification {
11    /// Verify signature with Core RPC
12    fn verify_signature<C: CoreRPCLike>(
13        &self,
14        core_rpc: &C,
15        core_chain_locked_height: u32,
16    ) -> Result<bool, Error>;
17}
18
19impl CoreSignatureVerification for InstantLock {
20    fn verify_signature<C: CoreRPCLike>(
21        &self,
22        core_rpc: &C,
23        core_chain_locked_height: u32,
24    ) -> Result<bool, Error> {
25        match core_rpc.verify_instant_lock(self, Some(core_chain_locked_height)) {
26            Ok(result) => Ok(result),
27            // Consider signature is invalid in case if instant lock data format is wrong for some reason
28            Err(dpp::dashcore_rpc::Error::JsonRpc(
29                dpp::dashcore_rpc::jsonrpc::error::Error::Rpc(
30                    dpp::dashcore_rpc::jsonrpc::error::RpcError {
31                        code:
32                            CORE_RPC_PARSE_ERROR
33                            | CORE_RPC_INVALID_ADDRESS_OR_KEY
34                            | CORE_RPC_INVALID_PARAMETER,
35                        ..
36                    },
37                ),
38            )) => Ok(false),
39            Err(e) => Err(Error::Execution(ExecutionError::DashCoreBadResponseError(
40                format!("can't verify instant asset lock proof signature with core: {e}",),
41            ))),
42        }
43    }
44}