Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -7,3 +7,5 @@

/ddk/.env
.env

/releases
1 change: 1 addition & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion ddk-manager/tests/manager_tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ async fn get_manager() -> TestManager {
let blockchain =
Arc::new(EsploraClient::new("http://localhost:30000", Network::Regtest).unwrap());
let store = Arc::new(MemoryStorage::new());
let mut seed = [0u8; 32];
let mut seed = [0u8; 64];
seed.try_fill(&mut bitcoin::key::rand::thread_rng())
.unwrap();
let wallet = Arc::new(
Expand Down
2 changes: 1 addition & 1 deletion ddk-manager/tests/test_utils.rs
Original file line number Diff line number Diff line change
Expand Up @@ -840,7 +840,7 @@ pub async fn create_and_fund_wallet() -> (DlcDevKitWallet, Arc<MemoryStorage>) {
.get_new_address(None, None)
.unwrap()
.assume_checked();
let mut seed = [0u8; 32];
let mut seed = [0u8; 64];
seed.try_fill(&mut bitcoin::key::rand::thread_rng())
.unwrap();
let memory_storage = Arc::new(MemoryStorage::new());
Expand Down
17 changes: 5 additions & 12 deletions ddk-node/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ mod seed;

use bitcoin::secp256k1::PublicKey;
use bitcoin::{Address, Amount, FeeRate, Network};
use ddk::builder::Builder;
use ddk::builder::{Builder, SeedConfig};
use ddk::oracle::kormir::KormirOracleClient;
use ddk::storage::postgres::PostgresStore;
use ddk::transport::nostr::NostrDlc;
Expand Down Expand Up @@ -63,26 +63,19 @@ impl DdkNode {
let network = Network::from_str(&opts.network)?;
std::fs::create_dir_all(storage_path.clone())?;

let seed_bytes = crate::seed::xprv_from_path(storage_path.clone(), network)?;
let seed_bytes = crate::seed::xprv_from_path(storage_path.clone())?;

tracing::info!("Starting DDK node.");

let transport = Arc::new(
NostrDlc::new(
&seed_bytes.private_key.secret_bytes(),
"wss://nostr.dlcdevkit.com",
network,
)
.await?,
);
let transport =
Arc::new(NostrDlc::new(&seed_bytes, "wss://nostr.dlcdevkit.com", network).await?);

let storage = Arc::new(PostgresStore::new(&opts.postgres_url, true, opts.name).await?);

// let oracle = Arc::new(P2PDOracleClient::new(&oracle_host).await?);
let oracle = Arc::new(KormirOracleClient::new(&opts.oracle_host, None).await?);

let mut builder = Builder::new();
builder.set_seed_bytes(seed_bytes.private_key.secret_bytes());
builder.set_seed_bytes(SeedConfig::Bytes(seed_bytes))?;
builder.set_esplora_host(opts.esplora_host);
builder.set_network(network);
builder.set_transport(transport.clone());
Expand Down
14 changes: 5 additions & 9 deletions ddk-node/src/seed.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,4 @@
use bitcoin::bip32::Xpriv;
use bitcoin::key::rand;
use bitcoin::Network;
use rand::Fill;
use std::{
fs::File,
Expand All @@ -10,21 +8,19 @@ use std::{

/// Helper function that reads `[bitcoin::bip32::Xpriv]` bytes from a file.
/// If the file does not exist then it will create a file `seed.ddk` in the specified path.
pub fn xprv_from_path(path: PathBuf, network: Network) -> anyhow::Result<Xpriv> {
pub fn xprv_from_path(path: PathBuf) -> anyhow::Result<[u8; 64]> {
let seed_path = path.join("seed.ddk");
let seed = if Path::new(&seed_path).exists() {
let seed = std::fs::read(&seed_path)?;
let mut key = [0; 32];
let mut key = [0; 64];
key.copy_from_slice(&seed);
Xpriv::new_master(network, &seed)?
key
} else {
let mut file = File::create(&seed_path)?;
let mut entropy = [0u8; 32];
let mut entropy = [0u8; 64];
entropy.try_fill(&mut rand::thread_rng())?;
// let _mnemonic = Mnemonic::from_entropy(&entropy)?;
let xprv = Xpriv::new_master(network, &entropy)?;
file.write_all(&entropy)?;
xprv
entropy
};

Ok(seed)
Expand Down
1 change: 1 addition & 0 deletions ddk/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,7 @@ kormir = { version = "0.5.0", path = "../kormir" }
hmac = "0.12.1"
sha2 = "0.10"
nostr-database = { version = "0.40.0", optional = true }
bip39 = "2.2.0"

[dev-dependencies]
test-log = { version = "0.2.16", features = ["trace"] }
Expand Down
10 changes: 2 additions & 8 deletions ddk/examples/lightning.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
use bitcoin::key::rand::Fill;
use ddk::builder::Builder;
use ddk::builder::{Builder, SeedConfig};
use ddk::oracle::kormir::KormirOracleClient;
use ddk::storage::sled::SledStorage;
use ddk::transport::lightning::LightningTransport;
Expand All @@ -14,13 +13,8 @@ async fn main() -> Result<(), ddk::error::Error> {
let storage = Arc::new(SledStorage::new(current_dir().unwrap().to_str().unwrap()).unwrap());
let oracle_client = Arc::new(KormirOracleClient::new("host", None).await?);

let mut seed_bytes = [0u8; 32];
seed_bytes
.try_fill(&mut bitcoin::key::rand::thread_rng())
.unwrap();

let mut builder = Builder::new();
builder.set_seed_bytes(seed_bytes);
builder.set_seed_bytes(SeedConfig::Random)?;
builder.set_transport(transport.clone());
builder.set_storage(storage.clone());
builder.set_oracle(oracle_client.clone());
Expand Down
6 changes: 3 additions & 3 deletions ddk/examples/nostr.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
use bitcoin::key::rand::Fill;
use bitcoin::Network;
use ddk::builder::Builder;
use ddk::builder::{Builder, SeedConfig};
use ddk::oracle::memory::MemoryOracle;
use ddk::storage::memory::MemoryStorage;
use ddk::transport::nostr::NostrDlc;
Expand All @@ -10,7 +10,7 @@ type NostrDdk = ddk::DlcDevKit<NostrDlc, MemoryStorage, MemoryOracle>;

#[tokio::main]
async fn main() -> Result<(), ddk::error::Error> {
let mut seed_bytes = [0u8; 32];
let mut seed_bytes = [0u8; 64];
seed_bytes
.try_fill(&mut bitcoin::key::rand::thread_rng())
.unwrap();
Expand All @@ -21,7 +21,7 @@ async fn main() -> Result<(), ddk::error::Error> {
let oracle_client = Arc::new(MemoryOracle::default());

let mut builder = Builder::new();
builder.set_seed_bytes(seed_bytes);
builder.set_seed_bytes(SeedConfig::Bytes(seed_bytes))?;
builder.set_transport(transport.clone());
builder.set_storage(storage.clone());
builder.set_oracle(oracle_client.clone());
Expand Down
6 changes: 3 additions & 3 deletions ddk/examples/postgres.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
use bitcoin::key::rand::Fill;
use ddk::builder::Builder;
use ddk::builder::{Builder, SeedConfig};
use ddk::oracle::kormir::KormirOracleClient;
use ddk::storage::postgres::PostgresStore;
use ddk::transport::lightning::LightningTransport;
Expand All @@ -21,13 +21,13 @@ async fn main() -> Result<(), ddk::error::Error> {
let oracle_client =
Arc::new(KormirOracleClient::new("https://kormir.dlcdevkit.com", None).await?);

let mut seed_bytes = [0u8; 32];
let mut seed_bytes = [0u8; 64];
seed_bytes
.try_fill(&mut bitcoin::key::rand::thread_rng())
.unwrap();

let mut builder = Builder::new();
builder.set_seed_bytes(seed_bytes);
builder.set_seed_bytes(SeedConfig::Bytes(seed_bytes))?;
builder.set_transport(transport.clone());
builder.set_storage(storage.clone());
builder.set_oracle(oracle_client.clone());
Expand Down
35 changes: 30 additions & 5 deletions ddk/src/builder.rs
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
use bip39::{Language, Mnemonic};
use bitcoin::key::rand::Fill;
use bitcoin::Network;
use ddk_manager::manager::Manager;
use ddk_manager::SystemTimeProvider;
Expand All @@ -14,6 +16,17 @@ use crate::{Oracle, Storage, Transport};
const DEFAULT_ESPLORA_HOST: &str = "https://mutinynet.com/api";
const DEFAULT_NETWORK: Network = Network::Signet;

/// Configuration for the seed bytes for the wallet.
#[derive(Debug, Clone)]
pub enum SeedConfig {
/// Generates a random seed everytime ddk is run.
Random,
/// The first string is the mnemonic, the second is the passphrase.
Mnemonic(String, String),
/// The bytes to use for the seed.
Bytes([u8; 64]),
}

/// Builder pattern for creating a [`crate::ddk::DlcDevKit`] process.
#[derive(Clone)]
pub struct Builder<T, S, O> {
Expand All @@ -24,7 +37,7 @@ pub struct Builder<T, S, O> {
contract_address_generator: Option<Arc<dyn AddressGenerator + Send + Sync + 'static>>,
esplora_host: String,
network: Network,
seed_bytes: [u8; 32],
seed_bytes: [u8; 64],
}

/// Defaults when creating a DDK application
Expand All @@ -42,7 +55,7 @@ impl<T: Transport, S: Storage, O: Oracle> Default for Builder<T, S, O> {
contract_address_generator: None,
esplora_host: DEFAULT_ESPLORA_HOST.to_string(),
network: DEFAULT_NETWORK,
seed_bytes: [0u8; 32],
seed_bytes: [0u8; 64],
}
}
}
Expand Down Expand Up @@ -107,9 +120,21 @@ impl<T: Transport, S: Storage, O: Oracle> Builder<T, S, O> {
}

/// Set the seed bytes for the wallet.
pub fn set_seed_bytes(&mut self, bytes: [u8; 32]) -> &mut Self {
self.seed_bytes = bytes;
self
pub fn set_seed_bytes(&mut self, seed_config: SeedConfig) -> Result<&mut Self, BuilderError> {
match seed_config {
SeedConfig::Random => {
let mut seed = [0u8; 64];
seed.try_fill(&mut bitcoin::key::rand::thread_rng())
.map_err(|_| BuilderError::SeedGenerationFailed)?;
self.seed_bytes = seed
}
SeedConfig::Mnemonic(mnemonic, passphrase) => {
let mnemonic = Mnemonic::parse_in_normalized(Language::English, &mnemonic).unwrap();
self.seed_bytes = mnemonic.to_seed(passphrase)
}
SeedConfig::Bytes(bytes) => self.seed_bytes = bytes,
}
Ok(self)
}

/// Builds the `DlcDevKit` instance. Fails if any components are missing.
Expand Down
2 changes: 2 additions & 0 deletions ddk/src/error.rs
Original file line number Diff line number Diff line change
Expand Up @@ -137,6 +137,8 @@ pub enum BuilderError {
NoStorage,
#[error("An oracle client was not provided.")]
NoOracle,
#[error("Failed to generate random seed.")]
SeedGenerationFailed,
}

/// Errors related to Bitcoin wallet operations.
Expand Down
2 changes: 1 addition & 1 deletion ddk/src/transport/nostr/relay_handler.rs
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ pub struct NostrDlc {

impl NostrDlc {
pub async fn new(
seed_bytes: &[u8; 32],
seed_bytes: &[u8; 64],
relay_host: &str,
network: Network,
) -> Result<NostrDlc, TransportError> {
Expand Down
19 changes: 6 additions & 13 deletions ddk/src/wallet/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -229,7 +229,7 @@ impl DlcDevKitWallet {
/// - Handles all BDK operations
/// - Manages blockchain synchronization
pub async fn new(
seed_bytes: &[u8; 32],
seed_bytes: &[u8; 64],
esplora_url: &str,
network: Network,
storage: Arc<dyn Storage>,
Expand Down Expand Up @@ -935,7 +935,7 @@ mod tests {
use crate::storage::memory::MemoryStorage;
use bitcoin::{
address::NetworkChecked,
bip32::{ChildNumber, Xpriv},
bip32::ChildNumber,
key::rand::Fill,
secp256k1::{PublicKey, SecretKey},
Address, AddressType, Amount, FeeRate, Network,
Expand All @@ -952,16 +952,9 @@ mod tests {
entropy
.try_fill(&mut bitcoin::key::rand::thread_rng())
.unwrap();
let xpriv = Xpriv::new_master(Network::Regtest, &entropy).unwrap();
DlcDevKitWallet::new(
&xpriv.private_key.secret_bytes(),
&esplora,
Network::Regtest,
storage.clone(),
None,
)
.await
.unwrap()
DlcDevKitWallet::new(&entropy, &esplora, Network::Regtest, storage.clone(), None)
.await
.unwrap()
}

fn generate_blocks(num: u64) {
Expand Down Expand Up @@ -1494,7 +1487,7 @@ mod tests {
.unwrap()
.assume_checked();

let mut seed = [0u8; 32];
let mut seed = [0u8; 64];
seed.try_fill(&mut bitcoin::key::rand::thread_rng())
.unwrap();

Expand Down
6 changes: 4 additions & 2 deletions ddk/tests/nostr.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ mod nostr_test {
use bitcoin::Amount;
use bitcoin::{key::rand::Fill, Network};
use chrono::{Local, TimeDelta};
use ddk::builder::SeedConfig;
use ddk::oracle::memory::MemoryOracle;
use ddk::storage::memory::MemoryStorage;
use ddk::transport::nostr::NostrDlc;
Expand All @@ -17,7 +18,7 @@ mod nostr_test {
type NostrDlcDevKit = DlcDevKit<NostrDlc, MemoryStorage, MemoryOracle>;

async fn nostr_ddk(name: &str, oracle: Arc<MemoryOracle>) -> NostrDlcDevKit {
let mut seed = [0u8; 32];
let mut seed = [0u8; 64];
seed.try_fill(&mut bitcoin::key::rand::thread_rng())
.unwrap();
let esplora_host = "http://127.0.0.1:30000".to_string();
Expand All @@ -31,7 +32,8 @@ mod nostr_test {

let ddk: NostrDlcDevKit = Builder::new()
.set_network(Network::Regtest)
.set_seed_bytes(seed)
.set_seed_bytes(SeedConfig::Bytes(seed))
.unwrap()
.set_esplora_host(esplora_host)
.set_name(name)
.set_oracle(oracle)
Expand Down
12 changes: 8 additions & 4 deletions ddk/tests/test_util.rs
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,11 @@ use std::{

use bitcoincore_rpc::RpcApi;
use ddk::{
builder::Builder, oracle::memory::MemoryOracle, storage::memory::MemoryStorage,
transport::memory::MemoryTransport, DlcDevKit,
builder::{Builder, SeedConfig},
oracle::memory::MemoryOracle,
storage::memory::MemoryStorage,
transport::memory::MemoryTransport,
DlcDevKit,
};

type TestDlcDevKit = DlcDevKit<MemoryTransport, MemoryStorage, MemoryOracle>;
Expand Down Expand Up @@ -108,7 +111,7 @@ pub struct TestSuite {

impl TestSuite {
pub async fn new(secp: &Secp256k1<All>, name: &str, oracle: Arc<MemoryOracle>) -> TestSuite {
let mut seed = [0u8; 32];
let mut seed = [0u8; 64];
seed.try_fill(&mut bitcoin::key::rand::thread_rng())
.unwrap();
let esplora_host = "http://127.0.0.1:30000".to_string();
Expand All @@ -118,7 +121,8 @@ impl TestSuite {

let ddk: TestDlcDevKit = Builder::new()
.set_network(Network::Regtest)
.set_seed_bytes(seed)
.set_seed_bytes(SeedConfig::Bytes(seed))
.unwrap()
.set_esplora_host(esplora_host)
.set_name(name)
.set_oracle(oracle)
Expand Down
Loading
Loading