From 68e7a7d04645fc9e9f0fe6e3b03601513f0ea619 Mon Sep 17 00:00:00 2001 From: Borja Castellano Date: Thu, 5 Mar 2026 22:27:41 +0000 Subject: [PATCH] move Network struct inside teh dashcore crate --- .codecov.yml | 2 - .github/ci-groups.yml | 2 - .github/ci-no-std.yml | 3 - .github/workflows/sanitizer.yml | 4 +- AGENTS.md | 2 +- CLAUDE.md | 4 +- Cargo.toml | 2 +- README.md | 4 +- dash-network-ffi/Cargo.toml | 21 --- dash-network-ffi/README.md | 106 ----------- dash-network-ffi/build.rs | 4 - .../src/dash_network_ffiFFI.modulemap | 7 - dash-network-ffi/src/lib.rs | 174 ------------------ dash-network/Cargo.toml | 30 --- dash-network/README.md | 71 ------- dash-network/src/lib.rs | 151 --------------- dash-spv/src/client/lifecycle.rs | 1 - dash-spv/src/sync/masternodes/manager.rs | 1 - dash/Cargo.toml | 9 +- dash/src/address.rs | 8 +- dash/src/blockdata/constants.rs | 6 +- dash/src/blockdata/transaction/mod.rs | 2 +- dash/src/consensus/params.rs | 4 +- dash/src/crypto/key.rs | 5 +- dash/src/crypto/sighash.rs | 2 +- dash/src/lib.rs | 2 +- dash/src/network/constants.rs | 162 ++++++++++++---- dash/src/sml/llmq_type/mod.rs | 2 +- dash/src/sml/llmq_type/network.rs | 7 +- dash/src/sml/masternode_list/apply_diff.rs | 4 +- dash/src/sml/masternode_list/from_diff.rs | 5 +- dash/src/sml/masternode_list_engine/mod.rs | 3 +- .../sml/quorum_entry/quorum_modifier_type.rs | 2 +- dash/src/test_utils/address.rs | 2 +- key-wallet-ffi/Cargo.toml | 1 - key-wallet-ffi/src/derivation.rs | 2 +- key-wallet/Cargo.toml | 7 +- key-wallet/IMPLEMENTATION_SUMMARY.md | 2 - key-wallet/src/bip32.rs | 4 +- key-wallet/src/derivation_bls_bip32.rs | 2 +- key-wallet/src/derivation_slip10.rs | 2 +- key-wallet/src/dip9.rs | 2 +- key-wallet/src/lib.rs | 2 +- 43 files changed, 167 insertions(+), 671 deletions(-) delete mode 100644 dash-network-ffi/Cargo.toml delete mode 100644 dash-network-ffi/README.md delete mode 100644 dash-network-ffi/build.rs delete mode 100644 dash-network-ffi/src/dash_network_ffiFFI.modulemap delete mode 100644 dash-network-ffi/src/lib.rs delete mode 100644 dash-network/Cargo.toml delete mode 100644 dash-network/README.md delete mode 100644 dash-network/src/lib.rs diff --git a/.codecov.yml b/.codecov.yml index 9b5c5d181..521943d21 100644 --- a/.codecov.yml +++ b/.codecov.yml @@ -25,7 +25,6 @@ flags: - dash/src/ - hashes/src/ - internals/src/ - - dash-network/src/ spv: paths: - dash-spv/src/ @@ -35,7 +34,6 @@ flags: - key-wallet-manager/src/ ffi: paths: - - dash-network-ffi/src/ - dash-spv-ffi/src/ - key-wallet-ffi/src/ rpc: diff --git a/.github/ci-groups.yml b/.github/ci-groups.yml index 2141a4171..eb99bb958 100644 --- a/.github/ci-groups.yml +++ b/.github/ci-groups.yml @@ -6,7 +6,6 @@ groups: - dashcore - dashcore_hashes - dashcore-private - - dash-network spv: - dash-spv @@ -16,7 +15,6 @@ groups: - key-wallet-manager ffi: - - dash-network-ffi - dash-spv-ffi - key-wallet-ffi diff --git a/.github/ci-no-std.yml b/.github/ci-no-std.yml index e82d8696c..76222a874 100644 --- a/.github/ci-no-std.yml +++ b/.github/ci-no-std.yml @@ -11,6 +11,3 @@ dashcore_hashes: dashcore-private: - bare - alloc - -dash-network: - - no-std diff --git a/.github/workflows/sanitizer.yml b/.github/workflows/sanitizer.yml index 81f9eb896..c686ec009 100644 --- a/.github/workflows/sanitizer.yml +++ b/.github/workflows/sanitizer.yml @@ -10,12 +10,10 @@ on: paths: - 'key-wallet-ffi/**' - 'dash-spv-ffi/**' - - 'dash-network-ffi/**' - 'dashcore/**' - 'dashcore_hashes/**' - 'key-wallet/**' - 'dash-spv/**' - - 'dash-network/**' permissions: contents: read @@ -43,7 +41,7 @@ jobs: run: | # FFI crates (C interop) cargo +nightly test -Zbuild-std --target x86_64-unknown-linux-gnu \ - -p key-wallet-ffi -p dash-spv-ffi -p dash-network-ffi --lib --tests + -p key-wallet-ffi -p dash-spv-ffi --lib --tests # Core crypto crates (unsafe optimizations) cargo +nightly test -Zbuild-std --target x86_64-unknown-linux-gnu \ diff --git a/AGENTS.md b/AGENTS.md index 474639074..c5832e1ff 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -1,7 +1,7 @@ # Repository Guidelines ## Project Structure & Module Organization -- Workspace with crates: `dash`, `hashes`, `internals`, `dash-network`, `dash-spv`, `key-wallet`, `rpc-*`, utilities (`fuzz`, `test-utils`), and FFI crates (`*-ffi`). +- Workspace with crates: `dash`, `hashes`, `internals`, `dash-spv`, `key-wallet`, `rpc-*`, utilities (`fuzz`, `test-utils`), and FFI crates (`*-ffi`). - Each crate keeps sources in `src/`; unit tests live alongside code with `#[cfg(test)]`. Integration tests use `tests/` (e.g., `rpc-integration-test`). - FFI bindings are in `*-ffi`. Shared helpers in `internals/` and `test-utils/`. diff --git a/CLAUDE.md b/CLAUDE.md index 2779b0cb6..917094ef8 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -22,9 +22,7 @@ rust-dashcore is a Rust implementation of the Dash cryptocurrency protocol libra - `hashes/` - Cryptographic hash implementations (SHA256, X11, Blake3) - `internals/` - Internal utilities and macros -### Network & SPV -- `dash-network/` - Network protocol abstractions -- `dash-network-ffi/` - C-compatible FFI bindings for network types +### SPV - `dash-spv/` - SPV client implementation - `dash-spv-ffi/` - C-compatible FFI bindings for SPV client diff --git a/Cargo.toml b/Cargo.toml index f6a43bbde..52eec3292 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,5 +1,5 @@ [workspace] -members = ["dash", "dash-network", "dash-network-ffi", "hashes", "internals", "fuzz", "rpc-client", "rpc-json", "rpc-integration-test", "key-wallet", "key-wallet-ffi", "key-wallet-manager", "dash-spv", "dash-spv-ffi"] +members = ["dash", "hashes", "internals", "fuzz", "rpc-client", "rpc-json", "rpc-integration-test", "key-wallet", "key-wallet-ffi", "key-wallet-manager", "dash-spv", "dash-spv-ffi"] resolver = "2" [workspace.package] diff --git a/README.md b/README.md index 5654b5ed9..694a0a48f 100644 --- a/README.md +++ b/README.md @@ -24,10 +24,10 @@ | Group | Crates | Coverage | |-------|--------|----------| -| core | dashcore, dashcore_hashes, dashcore-private, dash-network | [![codecov](https://codecov.io/gh/dashpay/rust-dashcore/graph/badge.svg?flag=core)](https://codecov.io/gh/dashpay/rust-dashcore?flags[0]=core) | +| core | dashcore, dashcore_hashes, dashcore-private | [![codecov](https://codecov.io/gh/dashpay/rust-dashcore/graph/badge.svg?flag=core)](https://codecov.io/gh/dashpay/rust-dashcore?flags[0]=core) | | spv | dash-spv | [![codecov](https://codecov.io/gh/dashpay/rust-dashcore/graph/badge.svg?flag=spv)](https://codecov.io/gh/dashpay/rust-dashcore?flags[0]=spv) | | wallet | key-wallet, key-wallet-manager | [![codecov](https://codecov.io/gh/dashpay/rust-dashcore/graph/badge.svg?flag=wallet)](https://codecov.io/gh/dashpay/rust-dashcore?flags[0]=wallet) | -| ffi | dash-network-ffi, dash-spv-ffi, key-wallet-ffi | [![codecov](https://codecov.io/gh/dashpay/rust-dashcore/graph/badge.svg?flag=ffi)](https://codecov.io/gh/dashpay/rust-dashcore?flags[0]=ffi) | +| ffi | dash-spv-ffi, key-wallet-ffi | [![codecov](https://codecov.io/gh/dashpay/rust-dashcore/graph/badge.svg?flag=ffi)](https://codecov.io/gh/dashpay/rust-dashcore?flags[0]=ffi) | | rpc | dashcore-rpc, dashcore-rpc-json | [![codecov](https://codecov.io/gh/dashpay/rust-dashcore/graph/badge.svg?flag=rpc)](https://codecov.io/gh/dashpay/rust-dashcore?flags[0]=rpc) | diff --git a/dash-network-ffi/Cargo.toml b/dash-network-ffi/Cargo.toml deleted file mode 100644 index 55140ed40..000000000 --- a/dash-network-ffi/Cargo.toml +++ /dev/null @@ -1,21 +0,0 @@ -[package] -name = "dash-network-ffi" -version = { workspace = true } -edition = "2021" -authors = ["Quantum Explorer "] -license = "CC0-1.0" -repository = "https://github.com/dashpay/rust-dashcore/" -description = "FFI bindings for dash-network types" -keywords = ["dash", "network", "ffi", "bindings"] -readme = "README.md" - -[dependencies] -dash-network = { path = "../dash-network", default-features = false } -thiserror = "2.0.12" - -[dev-dependencies] -hex = "0.4" - -[lib] -crate-type = ["cdylib", "staticlib"] -name = "dash_network_ffi" diff --git a/dash-network-ffi/README.md b/dash-network-ffi/README.md deleted file mode 100644 index d948bfc39..000000000 --- a/dash-network-ffi/README.md +++ /dev/null @@ -1,106 +0,0 @@ -# dash-network-ffi - -FFI bindings for the dash-network crate, providing C-compatible language bindings. - -## Overview - -This crate provides Foreign Function Interface (FFI) bindings for the `dash-network` types, allowing them to be used from other programming languages like Swift, Python, Kotlin, and Ruby. - -## Features - -- C-compatible FFI bindings for the Network enum -- Network information and utilities exposed through FFI -- Support for magic bytes operations -- Core version activation queries - -## Usage - -### Building - -```bash -cargo build --release -``` - -### Example Usage (Swift) - -```swift -// Initialize the library -dashNetworkFfiInitialize() - -// Create a network info object -let networkInfo = NetworkInfo(network: .dash) - -// Get magic bytes -let magic = networkInfo.magic() -print("Dash network magic: \(String(format: "0x%08X", magic))") - -// Check if core v20 is active -if networkInfo.isCoreV20Active(blockHeight: 2000000) { - print("Core v20 is active!") -} - -// Create from magic bytes -do { - let network = try NetworkInfo.fromMagic(magic: 0xBD6B0CBF) - print("Network: \(network.toString())") -} catch { - print("Invalid magic bytes") -} -``` - -### Example Usage (Python) - -```python -import dash_network_ffi - -# Initialize the library -dash_network_ffi.initialize() - -# Create a network info object -network_info = dash_network_ffi.NetworkInfo(dash_network_ffi.Network.DASH) - -# Get magic bytes -magic = network_info.magic() -print(f"Dash network magic: 0x{magic:08X}") - -# Check if core v20 is active -if network_info.is_core_v20_active(2000000): - print("Core v20 is active!") - -# Create from magic bytes -try: - network = dash_network_ffi.NetworkInfo.from_magic(0xBD6B0CBF) - print(f"Network: {network.to_string()}") -except dash_network_ffi.NetworkError.InvalidMagic: - print("Invalid magic bytes") -``` - -## API - -### Network Enum - -- `Dash` - Dash mainnet -- `Testnet` - Dash testnet -- `Devnet` - Dash devnet -- `Regtest` - Regression test network - -### NetworkInfo Class - -#### Constructors -- `new(network: Network)` - Create from a Network enum value -- `from_magic(magic: u32)` - Create from magic bytes (throws NetworkError) - -#### Methods -- `magic() -> u32` - Get the network's magic bytes -- `to_string() -> String` - Get the network name as a string -- `is_core_v20_active(block_height: u32) -> bool` - Check if core v20 is active at height -- `core_v20_activation_height() -> u32` - Get the activation height for core v20 - -### NetworkError Enum - -- `InvalidMagic` - Invalid magic bytes provided -- `InvalidNetwork` - Invalid network specified - -## License - -This project is licensed under the CC0 1.0 Universal license. diff --git a/dash-network-ffi/build.rs b/dash-network-ffi/build.rs deleted file mode 100644 index 96c61d8a5..000000000 --- a/dash-network-ffi/build.rs +++ /dev/null @@ -1,4 +0,0 @@ -fn main() { - // Build script for dash-network-ffi - // Standard FFI compilation without uniffi -} diff --git a/dash-network-ffi/src/dash_network_ffiFFI.modulemap b/dash-network-ffi/src/dash_network_ffiFFI.modulemap deleted file mode 100644 index 3af2a90ee..000000000 --- a/dash-network-ffi/src/dash_network_ffiFFI.modulemap +++ /dev/null @@ -1,7 +0,0 @@ -module dash_network_ffiFFI { - header "dash_network_ffiFFI.h" - export * - use "Darwin" - use "_Builtin_stdbool" - use "_Builtin_stdint" -} diff --git a/dash-network-ffi/src/lib.rs b/dash-network-ffi/src/lib.rs deleted file mode 100644 index 4b8e96ae9..000000000 --- a/dash-network-ffi/src/lib.rs +++ /dev/null @@ -1,174 +0,0 @@ -//! FFI bindings for dash-network library - -use std::fmt; - -use dash_network::Network as DashNetwork; - -// Initialize function -pub fn initialize() { - // Any global initialization if needed -} - -// Re-export Network enum for FFI -#[derive(Debug, Clone, Copy, PartialEq, Eq)] -pub enum Network { - Dash, - Testnet, - Devnet, - Regtest, -} - -impl From for DashNetwork { - fn from(n: Network) -> Self { - match n { - Network::Dash => DashNetwork::Dash, - Network::Testnet => DashNetwork::Testnet, - Network::Devnet => DashNetwork::Devnet, - Network::Regtest => DashNetwork::Regtest, - } - } -} - -impl From for Network { - fn from(n: DashNetwork) -> Self { - match n { - DashNetwork::Dash => Network::Dash, - DashNetwork::Testnet => Network::Testnet, - DashNetwork::Devnet => Network::Devnet, - DashNetwork::Regtest => Network::Regtest, - unknown => panic!("Unhandled Network variant {:?}", unknown), - } - } -} - -#[derive(Debug, Clone, PartialEq, Eq, thiserror::Error)] -pub enum NetworkError { - #[error("Invalid magic bytes")] - InvalidMagic, - #[error("Invalid network")] - InvalidNetwork, -} - -pub struct NetworkInfo { - network: DashNetwork, -} - -impl NetworkInfo { - pub fn new(network: Network) -> Self { - Self { - network: network.into(), - } - } - - pub fn from_magic(magic: u32) -> Result { - DashNetwork::from_magic(magic) - .map(|network| Self { - network, - }) - .ok_or(NetworkError::InvalidMagic) - } - - pub fn magic(&self) -> u32 { - self.network.magic() - } - - pub fn is_core_v20_active(&self, block_height: u32) -> bool { - self.network.core_v20_is_active_at(block_height) - } - - pub fn core_v20_activation_height(&self) -> u32 { - self.network.core_v20_activation_height() - } -} - -impl fmt::Display for NetworkInfo { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - self.network.fmt(f) - } -} - -#[cfg(test)] -mod tests { - use super::*; - - #[test] - fn test_network_conversion() { - // Test FFI to Dash Network conversion - assert_eq!(DashNetwork::from(Network::Dash), DashNetwork::Dash); - assert_eq!(DashNetwork::from(Network::Testnet), DashNetwork::Testnet); - assert_eq!(DashNetwork::from(Network::Devnet), DashNetwork::Devnet); - assert_eq!(DashNetwork::from(Network::Regtest), DashNetwork::Regtest); - - // Test Dash Network to FFI conversion - assert_eq!(Network::from(DashNetwork::Dash), Network::Dash); - assert_eq!(Network::from(DashNetwork::Testnet), Network::Testnet); - assert_eq!(Network::from(DashNetwork::Devnet), Network::Devnet); - assert_eq!(Network::from(DashNetwork::Regtest), Network::Regtest); - } - - #[test] - fn test_network_info_creation() { - let info = NetworkInfo::new(Network::Dash); - assert_eq!(info.network, DashNetwork::Dash); - } - - #[test] - fn test_magic_bytes() { - let dash_info = NetworkInfo::new(Network::Dash); - assert_eq!(dash_info.magic(), 0xBD6B0CBF); - - let testnet_info = NetworkInfo::new(Network::Testnet); - assert_eq!(testnet_info.magic(), 0xFFCAE2CE); - - let devnet_info = NetworkInfo::new(Network::Devnet); - assert_eq!(devnet_info.magic(), 0xCEFFCAE2); - - let regtest_info = NetworkInfo::new(Network::Regtest); - assert_eq!(regtest_info.magic(), 0xDCB7C1FC); - } - - #[test] - fn test_from_magic() { - // Valid magic bytes - assert!(NetworkInfo::from_magic(0xBD6B0CBF).is_ok()); - assert!(NetworkInfo::from_magic(0xFFCAE2CE).is_ok()); - assert!(NetworkInfo::from_magic(0xCEFFCAE2).is_ok()); - assert!(NetworkInfo::from_magic(0xDCB7C1FC).is_ok()); - - // Invalid magic bytes - assert!(matches!(NetworkInfo::from_magic(0x12345678), Err(NetworkError::InvalidMagic))); - } - - #[test] - fn test_network_to_string() { - assert_eq!(NetworkInfo::new(Network::Dash).to_string(), "dash"); - assert_eq!(NetworkInfo::new(Network::Testnet).to_string(), "testnet"); - assert_eq!(NetworkInfo::new(Network::Devnet).to_string(), "devnet"); - assert_eq!(NetworkInfo::new(Network::Regtest).to_string(), "regtest"); - } - - #[test] - fn test_core_v20_activation() { - let dash_info = NetworkInfo::new(Network::Dash); - assert_eq!(dash_info.core_v20_activation_height(), 1987776); - assert!(!dash_info.is_core_v20_active(1987775)); - assert!(dash_info.is_core_v20_active(1987776)); - assert!(dash_info.is_core_v20_active(2000000)); - - let testnet_info = NetworkInfo::new(Network::Testnet); - assert_eq!(testnet_info.core_v20_activation_height(), 905100); - assert!(!testnet_info.is_core_v20_active(905099)); - assert!(testnet_info.is_core_v20_active(905100)); - } - - #[test] - fn test_round_trip_conversions() { - let networks = vec![Network::Dash, Network::Testnet, Network::Devnet, Network::Regtest]; - - for network in networks { - let dash_network: DashNetwork = network.into(); - let back_to_ffi: Network = dash_network.into(); - assert_eq!(network, back_to_ffi); - } - } -} diff --git a/dash-network/Cargo.toml b/dash-network/Cargo.toml deleted file mode 100644 index 313e0e286..000000000 --- a/dash-network/Cargo.toml +++ /dev/null @@ -1,30 +0,0 @@ -[package] -name = "dash-network" -version.workspace = true -edition = "2021" -authors = ["Quantum Explorer "] -license = "CC0-1.0" -repository = "https://github.com/dashpay/rust-dashcore/" -documentation = "https://docs.rs/dash-network/" -description = "Dash network types shared across Dash crates" -keywords = ["dash", "network"] -readme = "README.md" - -[dependencies] -hex = { version = "0.4.3", default-features = false, features = ["alloc"] } - -# Optional dependencies for serialization -serde = { version = "1.0", default-features = false, optional = true, features = ["derive", "alloc"] } -bincode = { version = "2.0.1", optional = true, default-features = false } -bincode_derive = { version = "2.0.1", optional = true } - -[features] -default = ["std"] -std = ["hex/std"] -no-std = [] -serde = ["dep:serde"] -bincode = ["dep:bincode", "dep:bincode_derive"] - -[lib] -name = "dash_network" -path = "src/lib.rs" diff --git a/dash-network/README.md b/dash-network/README.md deleted file mode 100644 index 2156d4f64..000000000 --- a/dash-network/README.md +++ /dev/null @@ -1,71 +0,0 @@ -# dash-network - -A Rust library providing network type definitions for the Dash cryptocurrency. - -## Overview - -This crate defines the `Network` enum used across Dash-related Rust projects to identify which network (mainnet, testnet, devnet, or regtest) is being used. It provides a centralized definition to avoid duplication and circular dependencies between crates. - -## Features - -- **Network Identification**: Enum representing Dash networks (Dash mainnet, Testnet, Devnet, Regtest) -- **Magic Bytes**: Network-specific magic bytes for message headers -- **Protocol Information**: Core version activation heights and network-specific parameters -- **Serialization Support**: Optional serde and bincode support via feature flags - -## Usage - -Add this to your `Cargo.toml`: - -```toml -[dependencies] -dash-network = "0.42.0" -``` - -### Basic Example - -```rust -use dash_network::Network; - -fn main() { - let network = Network::Dash; - - // Get network magic bytes - let magic = network.magic(); - println!("Network magic: 0x{:08X}", magic); - - // Check core v20 activation - let block_height = 2_000_000; - if network.core_v20_is_active_at(block_height) { - println!("Core v20 is active at height {}", block_height); - } -} -``` - -### Network Types - -- `Network::Dash` - Dash mainnet -- `Network::Testnet` - Dash testnet -- `Network::Devnet` - Dash devnet -- `Network::Regtest` - Regression test network - -### Features - -- `default`: Enables `std` -- `std`: Standard library support (enabled by default) -- `no-std`: Enables no_std compatibility -- `serde`: Enables serde serialization/deserialization -- `bincode`: Enables bincode encoding/decoding - -## Network Magic Bytes - -Each network has unique magic bytes used in message headers: - -- Dash mainnet: `0xBD6B0CBF` -- Testnet: `0xFFCAE2CE` -- Devnet: `0xCEFFCAE2` -- Regtest: `0xDAB5BFFA` - -## License - -This project is licensed under the CC0 1.0 Universal license. diff --git a/dash-network/src/lib.rs b/dash-network/src/lib.rs deleted file mode 100644 index 23cab92b7..000000000 --- a/dash-network/src/lib.rs +++ /dev/null @@ -1,151 +0,0 @@ -//! Dash network types shared across Dash crates - -#[cfg(feature = "bincode")] -use bincode_derive::{Decode, Encode}; -use std::fmt; - -/// The cryptocurrency network to act on. -#[derive(Copy, PartialEq, Eq, PartialOrd, Ord, Clone, Hash, Debug)] -#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] -#[cfg_attr(feature = "serde", serde(rename_all = "lowercase"))] -#[non_exhaustive] -#[repr(u8)] -#[cfg_attr(feature = "bincode", derive(Encode, Decode))] -pub enum Network { - /// Classic Dash Core Payment Chain - Dash, - /// Dash's testnet network. - Testnet, - /// Dash's devnet network. - Devnet, - /// Bitcoin's regtest network. - Regtest, -} - -impl Network { - /// Creates a `Network` from the magic bytes. - /// - /// # Examples - /// - /// ```rust - /// use dash_network::Network; - /// - /// assert_eq!(Some(Network::Dash), Network::from_magic(0xBD6B0CBF)); - /// assert_eq!(None, Network::from_magic(0xFFFFFFFF)); - /// ``` - pub fn from_magic(magic: u32) -> Option { - // Note: any new entries here must be added to `magic` below - match magic { - 0xBD6B0CBF => Some(Network::Dash), - 0xFFCAE2CE => Some(Network::Testnet), - 0xCEFFCAE2 => Some(Network::Devnet), - 0xDCB7C1FC => Some(Network::Regtest), - _ => None, - } - } - - /// Return the network magic bytes, which should be encoded little-endian - /// at the start of every message - /// - /// # Examples - /// - /// ```rust - /// use dash_network::Network; - /// - /// let network = Network::Dash; - /// assert_eq!(network.magic(), 0xBD6B0CBF); - /// ``` - pub fn magic(self) -> u32 { - // Note: any new entries here must be added to `from_magic` above - match self { - Network::Dash => 0xBD6B0CBF, - Network::Testnet => 0xFFCAE2CE, - Network::Devnet => 0xCEFFCAE2, - Network::Regtest => 0xDCB7C1FC, - } - } - - /// The known activation height of core v20 - pub fn core_v20_activation_height(&self) -> u32 { - match self { - Network::Dash => 1987776, - Network::Testnet => 905100, - Network::Devnet => 1, // v20 active from genesis on devnet - Network::Regtest => 1, // v20 active from genesis on regtest - #[allow(unreachable_patterns)] - other => panic!("Unknown activation height for network {:?}", other), - } - } - - /// Helper method to know if core v20 was active - pub fn core_v20_is_active_at(&self, core_block_height: u32) -> bool { - core_block_height >= self.core_v20_activation_height() - } -} - -impl fmt::Display for Network { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - match self { - Network::Dash => write!(f, "dash"), - Network::Testnet => write!(f, "testnet"), - Network::Devnet => write!(f, "devnet"), - Network::Regtest => write!(f, "regtest"), - } - } -} - -impl std::str::FromStr for Network { - type Err = String; - - fn from_str(s: &str) -> Result { - match s.to_lowercase().as_str() { - "dash" | "mainnet" => Ok(Network::Dash), - "testnet" | "test" => Ok(Network::Testnet), - "devnet" | "dev" => Ok(Network::Devnet), - "regtest" => Ok(Network::Regtest), - _ => Err(format!("Unknown network type: {}", s)), - } - } -} - -#[cfg(test)] -mod tests { - use super::*; - - #[test] - fn test_network_magic() { - assert_eq!(Network::Dash.magic(), 0xBD6B0CBF); - assert_eq!(Network::Testnet.magic(), 0xFFCAE2CE); - assert_eq!(Network::Devnet.magic(), 0xCEFFCAE2); - assert_eq!(Network::Regtest.magic(), 0xDCB7C1FC); - } - - #[test] - fn test_network_from_magic() { - assert_eq!(Network::from_magic(0xBD6B0CBF), Some(Network::Dash)); - assert_eq!(Network::from_magic(0xFFCAE2CE), Some(Network::Testnet)); - assert_eq!(Network::from_magic(0xCEFFCAE2), Some(Network::Devnet)); - assert_eq!(Network::from_magic(0xDCB7C1FC), Some(Network::Regtest)); - assert_eq!(Network::from_magic(0x12345678), None); - } - - #[test] - fn test_network_display() { - assert_eq!(Network::Dash.to_string(), "dash"); - assert_eq!(Network::Testnet.to_string(), "testnet"); - assert_eq!(Network::Devnet.to_string(), "devnet"); - assert_eq!(Network::Regtest.to_string(), "regtest"); - } - - #[test] - fn test_network_from_str() { - assert_eq!("dash".parse::().unwrap(), Network::Dash); - assert_eq!("mainnet".parse::().unwrap(), Network::Dash); - assert_eq!("testnet".parse::().unwrap(), Network::Testnet); - assert_eq!("test".parse::().unwrap(), Network::Testnet); - assert_eq!("devnet".parse::().unwrap(), Network::Devnet); - assert_eq!("dev".parse::().unwrap(), Network::Devnet); - assert_eq!("regtest".parse::().unwrap(), Network::Regtest); - assert!("invalid".parse::().is_err()); - } -} diff --git a/dash-spv/src/client/lifecycle.rs b/dash-spv/src/client/lifecycle.rs index 4619db179..6c6c9f333 100644 --- a/dash-spv/src/client/lifecycle.rs +++ b/dash-spv/src/client/lifecycle.rs @@ -26,7 +26,6 @@ use crate::sync::{ InstantSendManager, Managers, MasternodesManager, SyncCoordinator, }; use crate::types::MempoolState; -use dashcore::network::constants::NetworkExt; use dashcore::sml::masternode_list_engine::MasternodeListEngine; use dashcore_hashes::Hash; use key_wallet_manager::wallet_interface::WalletInterface; diff --git a/dash-spv/src/sync/masternodes/manager.rs b/dash-spv/src/sync/masternodes/manager.rs index 78e168669..d27d35246 100644 --- a/dash-spv/src/sync/masternodes/manager.rs +++ b/dash-spv/src/sync/masternodes/manager.rs @@ -7,7 +7,6 @@ use std::sync::Arc; use std::time::Instant; -use dashcore::network::constants::NetworkExt; use dashcore::sml::masternode_list_engine::MasternodeListEngine; use tokio::sync::RwLock; diff --git a/dash/Cargo.toml b/dash/Cargo.toml index 0bcaf4203..a69ed823a 100644 --- a/dash/Cargo.toml +++ b/dash/Cargo.toml @@ -23,7 +23,7 @@ default = [ "std", "secp-recovery", "bincode" ] base64 = [ "base64-compat" ] rand-std = ["secp256k1/rand"] rand = ["secp256k1/rand"] -serde = ["dep:serde", "dashcore_hashes/serde", "secp256k1/serde", "dash-network/serde"] +serde = ["dep:serde", "dashcore_hashes/serde", "secp256k1/serde"] secp-lowmemory = ["secp256k1/lowmemory"] secp-recovery = ["secp256k1/recovery"] signer = ["secp-recovery", "rand", "base64"] @@ -32,7 +32,7 @@ bls = ["blsful"] eddsa = ["ed25519-dalek"] quorum_validation = ["bls"] message_verification = ["bls"] -bincode = [ "dep:bincode", "dep:bincode_derive", "dashcore_hashes/bincode", "dash-network/bincode" ] +bincode = [ "dep:bincode", "dep:bincode_derive", "dashcore_hashes/bincode" ] test-utils = [] # At least one of std, no-std must be enabled. @@ -40,8 +40,8 @@ test-utils = [] # The no-std feature doesn't disable std - you need to turn off the std feature for that by disabling default. # Instead no-std enables additional features required for this crate to be usable without std. # As a result, both can be enabled without conflict. -std = ["secp256k1/std", "dashcore_hashes/std", "bech32/std", "internals/std", "dash-network/std"] -no-std = ["core2", "dashcore_hashes/alloc", "dashcore_hashes/core2", "secp256k1/alloc", "dash-network/no-std"] +std = ["secp256k1/std", "dashcore_hashes/std", "bech32/std", "internals/std"] +no-std = ["core2", "dashcore_hashes/alloc", "dashcore_hashes/core2", "secp256k1/alloc"] [package.metadata.docs.rs] all-features = true @@ -52,7 +52,6 @@ internals = { path = "../internals", package = "dashcore-private" } bech32 = { version = "0.9.1", default-features = false } dashcore_hashes = { path = "../hashes", default-features = false } secp256k1 = { default-features = false, features = ["hashes"], version= "0.30.0" } -dash-network = { path = "../dash-network", default-features = false } core2 = { version = "0.4.0", optional = true, features = ["alloc"], default-features = false } rustversion = { version="1.0.20"} serde = { version = "1.0.219", default-features = false, features = [ "derive", "alloc" ], optional = true } diff --git a/dash/src/address.rs b/dash/src/address.rs index 25835d55d..9a0cadda8 100644 --- a/dash/src/address.rs +++ b/dash/src/address.rs @@ -59,10 +59,10 @@ use crate::blockdata::script::{ use crate::crypto::key::{PublicKey, TapTweak, TweakedPublicKey, UntweakedPublicKey}; use crate::error::ParseIntError; use crate::hash_types::{PubkeyHash, ScriptHash}; +use crate::network::constants::Network; use crate::prelude::*; use crate::taproot::TapNodeHash; use bech32; -use dash_network::Network; use hashes::{Hash, HashEngine, sha256}; use internals::write_err; use secp256k1::{Secp256k1, Verification, XOnlyPublicKey}; @@ -994,18 +994,15 @@ impl Address { let p2pkh_prefix = match self.network() { Network::Dash => PUBKEY_ADDRESS_PREFIX_MAIN, Network::Testnet | Network::Devnet | Network::Regtest => PUBKEY_ADDRESS_PREFIX_TEST, - other => unreachable!("Unknown network {other:?} – add explicit prefix"), }; let p2sh_prefix = match self.network() { Network::Dash => SCRIPT_ADDRESS_PREFIX_MAIN, Network::Testnet | Network::Devnet | Network::Regtest => SCRIPT_ADDRESS_PREFIX_TEST, - other => unreachable!("Unknown network {other:?} – add explicit prefix"), }; let bech32_hrp = match self.network() { Network::Dash => "ds", Network::Testnet | Network::Devnet => "tb", Network::Regtest => "dsrt", - other => unreachable!("Unknown network {other:?} – add explicit prefix"), }; let encoding = AddressEncoding { payload: self.payload(), @@ -1253,7 +1250,6 @@ impl Address { (Network::Dash, _) | (_, Network::Dash) => false, (Network::Regtest, _) | (_, Network::Regtest) if !is_legacy => false, (Network::Testnet, _) | (Network::Regtest, _) | (Network::Devnet, _) => true, - _ => false, } } @@ -1466,8 +1462,8 @@ mod tests { use secp256k1::XOnlyPublicKey; use super::*; + use crate::Network::{Dash, Testnet}; use crate::crypto::key::PublicKey; - use dash_network::Network::{Dash, Testnet}; fn roundtrips(addr: &Address) { assert_eq!( diff --git a/dash/src/blockdata/constants.rs b/dash/src/blockdata/constants.rs index 294006339..32426b2fd 100644 --- a/dash/src/blockdata/constants.rs +++ b/dash/src/blockdata/constants.rs @@ -22,8 +22,8 @@ use crate::blockdata::transaction::outpoint::OutPoint; use crate::blockdata::transaction::txin::TxIn; use crate::blockdata::transaction::txout::TxOut; use crate::blockdata::witness::Witness; +use crate::network::constants::Network; use crate::pow::CompactTarget; -use dash_network::Network; /// How many satoshis are in "one dash". pub const COIN_VALUE: u64 = 100_000_000; @@ -178,16 +178,14 @@ pub fn genesis_block(network: Network) -> Block { txdata, } } - // Any new network variant must be handled explicitly. - _ => unreachable!("genesis_block(): unsupported network variant {network:?}"), } } #[cfg(test)] mod test { use super::*; + use crate::Network; use crate::internal_macros::hex; - use dash_network::Network; #[test] fn dash_genesis_first_transaction() { diff --git a/dash/src/blockdata/transaction/mod.rs b/dash/src/blockdata/transaction/mod.rs index 9da6ee4e4..4f06f8ff7 100644 --- a/dash/src/blockdata/transaction/mod.rs +++ b/dash/src/blockdata/transaction/mod.rs @@ -896,8 +896,8 @@ mod tests { #[test] fn test_is_coinbase() { + use crate::Network; use crate::blockdata::constants; - use dash_network::Network; let genesis = constants::genesis_block(Network::Dash); assert!(genesis.txdata[0].is_coin_base()); diff --git a/dash/src/consensus/params.rs b/dash/src/consensus/params.rs index 5943564b9..c527a8915 100644 --- a/dash/src/consensus/params.rs +++ b/dash/src/consensus/params.rs @@ -21,8 +21,7 @@ //! chains (such as mainnet, testnet). //! -use crate::Work; -use dash_network::Network; +use crate::{Work, network::constants::Network}; /// Parameters that influence chain consensus. #[non_exhaustive] @@ -123,7 +122,6 @@ impl Params { allow_min_difficulty_blocks: true, no_pow_retargeting: true, }, - other => panic!("Unsupported network variant: {other:?}"), } } diff --git a/dash/src/crypto/key.rs b/dash/src/crypto/key.rs index aa4e7a61d..32953e810 100644 --- a/dash/src/crypto/key.rs +++ b/dash/src/crypto/key.rs @@ -30,10 +30,10 @@ use internals::write_err; pub use secp256k1::{self, Keypair, Parity, Secp256k1, Verification, XOnlyPublicKey, constants}; use crate::hash_types::{PubkeyHash, WPubkeyHash}; +use crate::network::constants::Network; use crate::prelude::*; use crate::taproot::{TapNodeHash, TapTweakHash}; use crate::{base58, io}; -use dash_network::Network; /// A key-related error. #[derive(Clone, PartialEq, Eq, PartialOrd, Ord, Hash, Debug)] @@ -407,7 +407,6 @@ impl PrivateKey { ret[0] = match self.network { Network::Dash => 204, Network::Testnet | Network::Devnet | Network::Regtest => 239, - _ => 239, }; ret[1..33].copy_from_slice(&self.inner[..]); let privkey = if self.compressed { @@ -820,9 +819,9 @@ mod tests { use secp256k1::Secp256k1; use super::*; + use crate::Network::{Dash, Testnet}; use crate::address::Address; use crate::io; - use dash_network::Network::{Dash, Testnet}; #[test] fn test_key_derivation() { diff --git a/dash/src/crypto/sighash.rs b/dash/src/crypto/sighash.rs index 4e3861f06..d8e9732be 100644 --- a/dash/src/crypto/sighash.rs +++ b/dash/src/crypto/sighash.rs @@ -1178,13 +1178,13 @@ mod tests { use hashes::HashEngine; use super::*; + use crate::Network; use crate::address::Address; use crate::consensus::deserialize; use crate::crypto::key::PublicKey; use crate::crypto::sighash::{LegacySighash, TapSighash}; use crate::internal_macros::hex; use crate::taproot::TapLeafHash; - use dash_network::Network; #[test] fn sighash_single_bug() { diff --git a/dash/src/lib.rs b/dash/src/lib.rs index 608b41c79..0ec4197cc 100644 --- a/dash/src/lib.rs +++ b/dash/src/lib.rs @@ -157,11 +157,11 @@ pub use crate::hash_types::{ TxMerkleNode, Txid, WPubkeyHash, WScriptHash, Wtxid, }; pub use crate::merkle_tree::MerkleBlock; +pub use crate::network::constants::Network; pub use crate::pow::{CompactTarget, Target, Work}; pub use crate::transaction::outpoint::OutPoint; pub use crate::transaction::txin::TxIn; pub use crate::transaction::txout::TxOut; -pub use dash_network::Network; #[cfg(not(feature = "std"))] mod io_extras { diff --git a/dash/src/network/constants.rs b/dash/src/network/constants.rs index bcf659ae9..71f4c90ce 100644 --- a/dash/src/network/constants.rs +++ b/dash/src/network/constants.rs @@ -18,16 +18,13 @@ //! Dash network constants. //! //! This module provides various constants relating to the Dash network -//! protocol, such as protocol versioning and magic header bytes. -//! -//! The [`Network`][1] type is now provided by the `dash_network` crate. -//! -//! [1]: https://docs.rs/dash-network/latest/dash_network/enum.Network.html +//! protocol, such as protocol versioning and magic header bytes and the +//! different network types supported by Dash. //! //! # Example: encoding a network's magic bytes //! //! ```rust -//! use dash_network::Network; +//! use dashcore::Network; //! use dashcore::consensus::encode::serialize; //! //! let network = Network::Dash; @@ -43,7 +40,6 @@ use hashes::Hash; use crate::consensus::encode::{self, Decodable, Encodable}; use crate::{BlockHash, io}; -use dash_network::Network; // Re-export NODE_HEADERS_COMPRESSED for convenience pub const NODE_HEADERS_COMPRESSED: ServiceFlags = ServiceFlags::NODE_HEADERS_COMPRESSED; @@ -65,18 +61,71 @@ pub const NODE_HEADERS_COMPRESSED: ServiceFlags = ServiceFlags::NODE_HEADERS_COM /// 60001 - Support `pong` message and nonce in `ping` message pub const PROTOCOL_VERSION: u32 = 70237; -/// Extension trait for Network to add dash-specific methods -pub trait NetworkExt { - /// The known dash genesis block hash for mainnet and testnet - fn known_genesis_block_hash(&self) -> Option; - - /// V20 activation height when quorumsCLSigs was introduced (protocol 70230). - /// See DIP-0029 and Dash Core src/chainparams.cpp. - fn v20_activation_height(&self) -> u32; +#[cfg(feature = "bincode")] +use bincode_derive::{Decode, Encode}; + +/// The cryptocurrency network to act on. +#[derive(Copy, PartialEq, Eq, PartialOrd, Ord, Clone, Hash, Debug)] +#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] +#[cfg_attr(feature = "serde", serde(rename_all = "lowercase"))] +#[non_exhaustive] +#[repr(u8)] +#[cfg_attr(feature = "bincode", derive(Encode, Decode))] +pub enum Network { + /// Classic Dash Core Payment Chain + Dash, + /// Dash's testnet network. + Testnet, + /// Dash's devnet network. + Devnet, + /// Bitcoin's regtest network. + Regtest, } -impl NetworkExt for Network { - fn known_genesis_block_hash(&self) -> Option { +impl Network { + /// Creates a `Network` from the magic bytes. + /// + /// # Examples + /// + /// ```rust + /// use dashcore::Network; + /// + /// assert_eq!(Some(Network::Dash), Network::from_magic(0xBD6B0CBF)); + /// assert_eq!(None, Network::from_magic(0xFFFFFFFF)); + /// ``` + pub fn from_magic(magic: u32) -> Option { + // Note: any new entries here must be added to `magic` below + match magic { + 0xBD6B0CBF => Some(Network::Dash), + 0xFFCAE2CE => Some(Network::Testnet), + 0xCEFFCAE2 => Some(Network::Devnet), + 0xDCB7C1FC => Some(Network::Regtest), + _ => None, + } + } + + /// Return the network magic bytes, which should be encoded little-endian + /// at the start of every message + /// + /// # Examples + /// + /// ```rust + /// use dashcore::Network; + /// + /// let network = Network::Dash; + /// assert_eq!(network.magic(), 0xBD6B0CBF); + /// ``` + pub fn magic(self) -> u32 { + // Note: any new entries here must be added to `from_magic` above + match self { + Network::Dash => 0xBD6B0CBF, + Network::Testnet => 0xFFCAE2CE, + Network::Devnet => 0xCEFFCAE2, + Network::Regtest => 0xDCB7C1FC, + } + } + + pub fn known_genesis_block_hash(&self) -> Option { match self { Network::Dash => { let mut block_hash = @@ -100,11 +149,10 @@ impl NetworkExt for Network { block_hash.reverse(); Some(BlockHash::from_byte_array(block_hash.try_into().expect("expected 32 bytes"))) } - _ => None, } } - fn v20_activation_height(&self) -> u32 { + pub fn v20_activation_height(&self) -> u32 { match self { Network::Dash => 1_987_776, Network::Testnet => 905_100, @@ -114,6 +162,31 @@ impl NetworkExt for Network { } } +impl fmt::Display for Network { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + match self { + Network::Dash => write!(f, "dash"), + Network::Testnet => write!(f, "testnet"), + Network::Devnet => write!(f, "devnet"), + Network::Regtest => write!(f, "regtest"), + } + } +} + +impl std::str::FromStr for Network { + type Err = String; + + fn from_str(s: &str) -> Result { + match s.to_lowercase().as_str() { + "dash" | "mainnet" => Ok(Network::Dash), + "testnet" | "test" => Ok(Network::Testnet), + "devnet" | "dev" => Ok(Network::Devnet), + "regtest" => Ok(Network::Regtest), + _ => Err(format!("Unknown network type: {}", s)), + } + } +} + /// Flags to indicate which network services a node supports. #[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)] pub struct ServiceFlags(u64); @@ -291,34 +364,57 @@ impl Decodable for ServiceFlags { #[cfg(test)] mod tests { use super::ServiceFlags; + use crate::Network; use crate::consensus::encode::{deserialize, serialize}; - use dash_network::Network; #[test] - fn serialize_test() { - assert_eq!(serialize(&Network::Dash.magic()), &[0xbf, 0x0c, 0x6b, 0xbd]); - assert_eq!(serialize(&Network::Testnet.magic()), &[0xce, 0xe2, 0xca, 0xff]); - assert_eq!(serialize(&Network::Devnet.magic()), &[0xe2, 0xca, 0xff, 0xce]); - assert_eq!(serialize(&Network::Regtest.magic()), &[0xfc, 0xc1, 0xb7, 0xdc]); + fn test_network_magic() { + assert_eq!(Network::Dash.magic(), 0xBD6B0CBF); + assert_eq!(Network::Testnet.magic(), 0xFFCAE2CE); + assert_eq!(Network::Devnet.magic(), 0xCEFFCAE2); + assert_eq!(Network::Regtest.magic(), 0xDCB7C1FC); + } - assert_eq!(deserialize(&[0xbf, 0x0c, 0x6b, 0xbd]).ok(), Some(Network::Dash.magic())); - assert_eq!(deserialize(&[0xce, 0xe2, 0xca, 0xff]).ok(), Some(Network::Testnet.magic())); - assert_eq!(deserialize(&[0xe2, 0xca, 0xff, 0xce]).ok(), Some(Network::Devnet.magic())); - assert_eq!(deserialize(&[0xfc, 0xc1, 0xb7, 0xdc]).ok(), Some(Network::Regtest.magic())); + #[test] + fn test_network_from_magic() { + assert_eq!(Network::from_magic(0xBD6B0CBF), Some(Network::Dash)); + assert_eq!(Network::from_magic(0xFFCAE2CE), Some(Network::Testnet)); + assert_eq!(Network::from_magic(0xCEFFCAE2), Some(Network::Devnet)); + assert_eq!(Network::from_magic(0xDCB7C1FC), Some(Network::Regtest)); + assert_eq!(Network::from_magic(0x12345678), None); } #[test] - fn string_test() { + fn test_network_display() { assert_eq!(Network::Dash.to_string(), "dash"); assert_eq!(Network::Testnet.to_string(), "testnet"); - assert_eq!(Network::Regtest.to_string(), "regtest"); assert_eq!(Network::Devnet.to_string(), "devnet"); + assert_eq!(Network::Regtest.to_string(), "regtest"); + } + #[test] + fn test_network_from_str() { assert_eq!("dash".parse::().unwrap(), Network::Dash); + assert_eq!("mainnet".parse::().unwrap(), Network::Dash); assert_eq!("testnet".parse::().unwrap(), Network::Testnet); - assert_eq!("regtest".parse::().unwrap(), Network::Regtest); + assert_eq!("test".parse::().unwrap(), Network::Testnet); assert_eq!("devnet".parse::().unwrap(), Network::Devnet); - assert!("fakenet".parse::().is_err()); + assert_eq!("dev".parse::().unwrap(), Network::Devnet); + assert_eq!("regtest".parse::().unwrap(), Network::Regtest); + assert!("invalid".parse::().is_err()); + } + + #[test] + fn serialize_test() { + assert_eq!(serialize(&Network::Dash.magic()), &[0xbf, 0x0c, 0x6b, 0xbd]); + assert_eq!(serialize(&Network::Testnet.magic()), &[0xce, 0xe2, 0xca, 0xff]); + assert_eq!(serialize(&Network::Devnet.magic()), &[0xe2, 0xca, 0xff, 0xce]); + assert_eq!(serialize(&Network::Regtest.magic()), &[0xfc, 0xc1, 0xb7, 0xdc]); + + assert_eq!(deserialize(&[0xbf, 0x0c, 0x6b, 0xbd]).ok(), Some(Network::Dash.magic())); + assert_eq!(deserialize(&[0xce, 0xe2, 0xca, 0xff]).ok(), Some(Network::Testnet.magic())); + assert_eq!(deserialize(&[0xe2, 0xca, 0xff, 0xce]).ok(), Some(Network::Devnet.magic())); + assert_eq!(deserialize(&[0xfc, 0xc1, 0xb7, 0xdc]).ok(), Some(Network::Regtest.magic())); } #[test] diff --git a/dash/src/sml/llmq_type/mod.rs b/dash/src/sml/llmq_type/mod.rs index b72787fa3..8049b62d3 100644 --- a/dash/src/sml/llmq_type/mod.rs +++ b/dash/src/sml/llmq_type/mod.rs @@ -7,8 +7,8 @@ use std::io; #[cfg(feature = "bincode")] use bincode::{Decode, Encode}; +use crate::Network; use crate::consensus::{Decodable, Encodable, encode}; -use dash_network::Network; /// Represents a DKG (Distributed Key Generation) mining window /// This is the range of blocks where a quorum commitment can be mined diff --git a/dash/src/sml/llmq_type/network.rs b/dash/src/sml/llmq_type/network.rs index 6b540d68b..c70876c17 100644 --- a/dash/src/sml/llmq_type/network.rs +++ b/dash/src/sml/llmq_type/network.rs @@ -1,5 +1,5 @@ +use crate::Network; use crate::sml::llmq_type::{DKGWindow, LLMQType}; -use dash_network::Network; use std::collections::BTreeMap; /// Extension trait for Network to add LLMQ-specific methods @@ -20,7 +20,6 @@ impl NetworkLLMQExt for Network { Network::Testnet => LLMQType::Llmqtype50_60, Network::Devnet => LLMQType::LlmqtypeDevnet, Network::Regtest => LLMQType::LlmqtypeTestInstantSend, - other => unreachable!("Unsupported network variant {other:?}"), } } @@ -30,7 +29,6 @@ impl NetworkLLMQExt for Network { Network::Testnet => LLMQType::Llmqtype60_75, Network::Devnet => LLMQType::LlmqtypeDevnetDIP0024, Network::Regtest => LLMQType::LlmqtypeTestDIP0024, - other => unreachable!("Unsupported network variant {other:?}"), } } @@ -40,7 +38,6 @@ impl NetworkLLMQExt for Network { Network::Testnet => LLMQType::Llmqtype50_60, Network::Devnet => LLMQType::LlmqtypeDevnet, Network::Regtest => LLMQType::LlmqtypeTest, - other => unreachable!("Unsupported network variant {other:?}"), } } @@ -50,7 +47,6 @@ impl NetworkLLMQExt for Network { Network::Testnet => LLMQType::Llmqtype25_67, Network::Devnet => LLMQType::LlmqtypeDevnet, Network::Regtest => LLMQType::LlmqtypeTest, - other => unreachable!("Unsupported network variant {other:?}"), } } @@ -80,7 +76,6 @@ impl NetworkLLMQExt for Network { LLMQType::LlmqtypeTestDIP0024, LLMQType::LlmqtypeTestInstantSend, ], - other => unreachable!("Unsupported network variant {other:?}"), } } diff --git a/dash/src/sml/masternode_list/apply_diff.rs b/dash/src/sml/masternode_list/apply_diff.rs index e2a4656cc..53a914920 100644 --- a/dash/src/sml/masternode_list/apply_diff.rs +++ b/dash/src/sml/masternode_list/apply_diff.rs @@ -1,5 +1,5 @@ +use crate::Network; use crate::bls_sig_utils::BLSSignature; -use crate::network::constants::NetworkExt; use crate::network::message_sml::MnListDiff; use crate::prelude::CoreBlockHeight; use crate::sml::error::SmlError; @@ -10,7 +10,6 @@ use crate::sml::masternode_list::MasternodeList; use crate::sml::quorum_entry::qualified_quorum_entry::{ QualifiedQuorumEntry, VerifyingChainLockSignaturesType, }; -use dash_network::Network; impl MasternodeList { /// Applies an `MnListDiff` to update the current masternode list. @@ -170,7 +169,6 @@ impl MasternodeList { mod tests { use super::*; use crate::consensus::deserialize; - use crate::network::constants::NetworkExt; use crate::sml::masternode_list::from_diff::TryFromWithBlockHashLookup; #[test] diff --git a/dash/src/sml/masternode_list/from_diff.rs b/dash/src/sml/masternode_list/from_diff.rs index 0594118fe..b1ad507f5 100644 --- a/dash/src/sml/masternode_list/from_diff.rs +++ b/dash/src/sml/masternode_list/from_diff.rs @@ -1,5 +1,6 @@ use crate::bls_sig_utils::BLSSignature; -use crate::network::constants::NetworkExt; + +use crate::Network; use crate::network::message_sml::MnListDiff; use crate::sml::error::SmlError; use crate::sml::llmq_entry_verification::{ @@ -11,7 +12,6 @@ use crate::sml::quorum_entry::qualified_quorum_entry::{ QualifiedQuorumEntry, VerifyingChainLockSignaturesType, }; use crate::{BlockHash, QuorumHash}; -use dash_network::Network; use hashes::Hash; use std::collections::BTreeMap; @@ -158,7 +158,6 @@ impl TryFromWithBlockHashLookup for MasternodeList { mod tests { use super::*; use crate::consensus::deserialize; - use crate::network::constants::NetworkExt; #[test] fn post_v20_requires_chainlock_signatures() { diff --git a/dash/src/sml/masternode_list_engine/mod.rs b/dash/src/sml/masternode_list_engine/mod.rs index 3b9ef270c..a81677684 100644 --- a/dash/src/sml/masternode_list_engine/mod.rs +++ b/dash/src/sml/masternode_list_engine/mod.rs @@ -8,8 +8,8 @@ mod validation; use std::collections::{BTreeMap, BTreeSet}; +use crate::Network; use crate::bls_sig_utils::{BLSPublicKey, BLSSignature}; -use crate::network::constants::NetworkExt; use crate::network::message_qrinfo::{QRInfo, QuorumSnapshot}; use crate::network::message_sml::MnListDiff; use crate::prelude::CoreBlockHeight; @@ -28,7 +28,6 @@ use crate::transaction::special_transaction::quorum_commitment::QuorumEntry; use crate::{BlockHash, QuorumHash}; #[cfg(feature = "bincode")] use bincode::{Decode, Encode}; -use dash_network::Network; use hashes::Hash; #[cfg(feature = "serde")] use serde::{Deserialize, Serialize}; diff --git a/dash/src/sml/quorum_entry/quorum_modifier_type.rs b/dash/src/sml/quorum_entry/quorum_modifier_type.rs index 03292bfed..cc1a5ee87 100644 --- a/dash/src/sml/quorum_entry/quorum_modifier_type.rs +++ b/dash/src/sml/quorum_entry/quorum_modifier_type.rs @@ -105,7 +105,7 @@ impl LLMQModifierType { best_cl_signature: BLSSignature, network: Network, ) -> Result { - if network.core_v20_is_active_at(work_block_height) { + if work_block_height >= network.v20_activation_height() { Ok(LLMQModifierType::CoreV20(llmq_type, work_block_height, best_cl_signature)) } else { Ok(LLMQModifierType::PreCoreV20(llmq_type, work_block_hash)) diff --git a/dash/src/test_utils/address.rs b/dash/src/test_utils/address.rs index fea6e7653..c1a7e093b 100644 --- a/dash/src/test_utils/address.rs +++ b/dash/src/test_utils/address.rs @@ -1,4 +1,4 @@ -use dash_network::Network; +use crate::Network; use hashes::{Hash, sha256}; use crate::{Address, PrivateKey, PublicKey}; diff --git a/key-wallet-ffi/Cargo.toml b/key-wallet-ffi/Cargo.toml index 23edb7c31..0b0fbd7fb 100644 --- a/key-wallet-ffi/Cargo.toml +++ b/key-wallet-ffi/Cargo.toml @@ -23,7 +23,6 @@ bls = ["dashcore/bls", "key-wallet/bls"] key-wallet = { path = "../key-wallet", default-features = false, features = ["std"] } key-wallet-manager = { path = "../key-wallet-manager", features = ["std"] } dashcore = { path = "../dash", features = ["std"] } -dash-network = { path = "../dash-network" } secp256k1 = { version = "0.30.0", features = ["global-context"] } tokio = { version = "1.32", features = ["rt-multi-thread", "sync"] } libc = "0.2" diff --git a/key-wallet-ffi/src/derivation.rs b/key-wallet-ffi/src/derivation.rs index 5b8b35b8c..1bfca0daf 100644 --- a/key-wallet-ffi/src/derivation.rs +++ b/key-wallet-ffi/src/derivation.rs @@ -2,7 +2,7 @@ use crate::error::{FFIError, FFIErrorCode}; use crate::types::FFINetwork; -use dash_network::Network; +use dashcore::Network; use key_wallet::{ExtendedPrivKey, ExtendedPubKey}; use secp256k1::Secp256k1; use std::ffi::{CStr, CString}; diff --git a/key-wallet/Cargo.toml b/key-wallet/Cargo.toml index 606b40223..e514ae10f 100644 --- a/key-wallet/Cargo.toml +++ b/key-wallet/Cargo.toml @@ -10,9 +10,9 @@ license = "CC0-1.0" [features] default = ["std"] -std = ["dashcore_hashes/std", "secp256k1/std", "bip39/std", "getrandom", "dash-network/std", "rand"] -serde = ["dep:serde", "dep:serde_json", "dashcore_hashes/serde", "secp256k1/serde", "dash-network/serde", "dashcore/serde"] -bincode = ["serde", "dep:bincode", "dep:bincode_derive", "dash-network/bincode", "dashcore_hashes/bincode", "dashcore/bincode"] +std = ["dashcore_hashes/std", "secp256k1/std", "bip39/std", "getrandom", "rand"] +serde = ["dep:serde", "dep:serde_json", "dashcore_hashes/serde", "secp256k1/serde", "dashcore/serde"] +bincode = ["serde", "dep:bincode", "dep:bincode_derive", "dashcore_hashes/bincode", "dashcore/bincode"] bip38 = ["scrypt", "aes", "bs58", "rand"] eddsa = ["dashcore/eddsa"] bls = ["dashcore/bls"] @@ -28,7 +28,6 @@ serde = { version = "1.0", default-features = false, features = ["derive"], opti base58ck = { version = "0.1.0", default-features = false } bitflags = { version = "2.6", default-features = false } getrandom = { version = "0.2", optional = true } -dash-network = { path = "../dash-network", default-features = false } # BIP38 dependencies (optional) scrypt = { version = "0.11", default-features = false, optional = true } aes = { version = "0.8", default-features = false, optional = true } diff --git a/key-wallet/IMPLEMENTATION_SUMMARY.md b/key-wallet/IMPLEMENTATION_SUMMARY.md index 5f7d86278..cf2f2ef63 100644 --- a/key-wallet/IMPLEMENTATION_SUMMARY.md +++ b/key-wallet/IMPLEMENTATION_SUMMARY.md @@ -105,7 +105,6 @@ - ✅ BIP38 encryption/decryption ### Integration Points -- Works with dash-network for network types - Compatible with bitcoin_hashes - Uses secp256k1 for cryptography - Integrates with bip39 crate @@ -187,7 +186,6 @@ let transaction = builder.build()?; - `secp256k1` - Elliptic curve cryptography - `bip39` - Mnemonic phrase support - `base58ck` - Base58check encoding -- `dash-network` - Network types ### Optional - `serde` - Serialization support diff --git a/key-wallet/src/bip32.rs b/key-wallet/src/bip32.rs index 9c597587a..457927c9a 100644 --- a/key-wallet/src/bip32.rs +++ b/key-wallet/src/bip32.rs @@ -46,7 +46,7 @@ use alloc::{string::String, vec::Vec}; use base58ck; #[cfg(feature = "bincode")] use bincode_derive::{Decode, Encode}; -use dash_network::Network; +use dashcore::Network; /// XpubIdentifier as a hash160 result type XpubIdentifier = hash160::Hash; @@ -2104,7 +2104,7 @@ mod tests { use super::ChildNumber::{Hardened, Normal}; use super::*; - use dash_network::Network::{self, Dash}; + use dashcore::Network::{self, Dash}; #[test] fn test_parse_derivation_path() { diff --git a/key-wallet/src/derivation_bls_bip32.rs b/key-wallet/src/derivation_bls_bip32.rs index 6f980ed04..d11d9a31a 100644 --- a/key-wallet/src/derivation_bls_bip32.rs +++ b/key-wallet/src/derivation_bls_bip32.rs @@ -24,7 +24,7 @@ use dashcore::blsful::{ #[cfg(feature = "serde")] use serde; -use dash_network::Network; +use dashcore::Network; use serde::Deserialize; use crate::bip32::{ChainCode, ChildNumber, DerivationPath, Fingerprint}; diff --git a/key-wallet/src/derivation_slip10.rs b/key-wallet/src/derivation_slip10.rs index c8eaddd61..14f9890d8 100644 --- a/key-wallet/src/derivation_slip10.rs +++ b/key-wallet/src/derivation_slip10.rs @@ -13,8 +13,8 @@ use core::fmt; use std::error; use alloc::{string::String, vec::Vec}; -use dash_network::Network; pub use dashcore::ed25519_dalek::{SigningKey, VerifyingKey}; +use dashcore::Network; use dashcore_hashes::{sha512, Hash, HashEngine, Hmac, HmacEngine}; #[cfg(feature = "serde")] use serde; diff --git a/key-wallet/src/dip9.rs b/key-wallet/src/dip9.rs index d4b094fc9..276972df7 100644 --- a/key-wallet/src/dip9.rs +++ b/key-wallet/src/dip9.rs @@ -2,7 +2,7 @@ use crate::bip32::{ChildNumber, DerivationPath, Error, ExtendedPrivKey, Extended #[cfg(feature = "bincode")] use bincode_derive::{Decode, Encode}; use bitflags::bitflags; -use dash_network::Network; +use dashcore::Network; use secp256k1::Secp256k1; #[cfg(feature = "serde")] use serde::{Deserialize, Serialize}; diff --git a/key-wallet/src/lib.rs b/key-wallet/src/lib.rs index 38b4e3cd8..08dedc2bd 100644 --- a/key-wallet/src/lib.rs +++ b/key-wallet/src/lib.rs @@ -57,7 +57,7 @@ pub use account::{Account, AccountCollection, AccountType}; pub use bip32::{ChildNumber, DerivationPath, ExtendedPrivKey, ExtendedPubKey}; #[cfg(feature = "bip38")] pub use bip38::{encrypt_private_key, generate_intermediate_code, Bip38EncryptedKey, Bip38Mode}; -pub use dash_network::Network; +pub use dashcore::Network; pub use dashcore::{Address, AddressType}; pub use derivation::{DerivationPathBuilder, DerivationStrategy, KeyDerivation}; pub use dip9::{DerivationPathReference, DerivationPathType};