Skip to content

Commit 5c42586

Browse files
committed
Simple VSS
1 parent 174f0a0 commit 5c42586

3 files changed

Lines changed: 59 additions & 7 deletions

File tree

orange-sdk/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ _cashu-tests = ["_test-utils", "cdk-ldk-node", "cdk/mint", "cdk-sqlite", "cdk-ax
2323
[dependencies]
2424
graduated-rebalancer = { path = "../graduated-rebalancer", version = "0.1.0" }
2525

26-
ldk-node = { git = "https://github.com/benthecarman/ldk-node.git", rev = "3ed1d13451239c54616e9f3fe75fa1f748807b15" }
26+
ldk-node = { git = "https://github.com/benthecarman/ldk-node.git", rev = "8dd1ba745a57994a9fc6ab6fa7a502f00bc92655" }
2727
lightning-macros = "0.2.0-beta1"
2828
bitcoin-payment-instructions = { workspace = true }
2929
chrono = { version = "0.4", default-features = false }

orange-sdk/src/ffi/orange/config.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -57,15 +57,15 @@ impl TryInto<OrangeSeed> for Seed {
5757
#[derive(Debug, Clone, uniffi::Enum)]
5858
pub enum VssAuth {
5959
/// Authentication using an LNURL-auth server.
60-
LNURLAuthServer(String),
60+
LNURLAuthServer(String, HashMap<String, String>),
6161
/// Authentication using a fixed set of HTTP headers.
6262
FixedHeaders(HashMap<String, String>),
6363
}
6464

6565
impl From<VssAuth> for OrangeVssAuth {
6666
fn from(auth: VssAuth) -> Self {
6767
match auth {
68-
VssAuth::LNURLAuthServer(url) => OrangeVssAuth::LNURLAuthServer(url),
68+
VssAuth::LNURLAuthServer(url, headers) => OrangeVssAuth::LNURLAuthServer(url, headers),
6969
VssAuth::FixedHeaders(headers) => OrangeVssAuth::FixedHeaders(headers),
7070
}
7171
}
@@ -74,7 +74,7 @@ impl From<VssAuth> for OrangeVssAuth {
7474
impl From<OrangeVssAuth> for VssAuth {
7575
fn from(auth: OrangeVssAuth) -> Self {
7676
match auth {
77-
OrangeVssAuth::LNURLAuthServer(url) => VssAuth::LNURLAuthServer(url),
77+
OrangeVssAuth::LNURLAuthServer(url, headers) => VssAuth::LNURLAuthServer(url, headers),
7878
OrangeVssAuth::FixedHeaders(headers) => VssAuth::FixedHeaders(headers),
7979
}
8080
}

orange-sdk/src/lib.rs

Lines changed: 55 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,15 +18,19 @@ use crate::trusted_wallet::spark::Spark;
1818
use crate::trusted_wallet::{DynTrustedWalletInterface, WalletTrusted};
1919
use graduated_rebalancer::GraduatedRebalancer;
2020
use ldk_node::bitcoin::Network;
21+
use ldk_node::bitcoin::bip32::{ChildNumber, Xpriv};
2122
use ldk_node::bitcoin::hashes::Hash;
2223
use ldk_node::bitcoin::io;
24+
use ldk_node::bitcoin::key::Secp256k1;
2325
use ldk_node::bitcoin::secp256k1::PublicKey;
2426
use ldk_node::io::sqlite_store::SqliteStore;
27+
use ldk_node::io::vss_store::VssStore;
2528
use ldk_node::lightning::ln::msgs::SocketAddress;
2629
use ldk_node::lightning::util::logger::Logger as _;
2730
use ldk_node::lightning::{log_debug, log_error, log_info, log_trace, log_warn};
2831
use ldk_node::lightning_invoice::Bolt11Invoice;
2932
use ldk_node::payment::{PaymentDirection, PaymentKind};
33+
use ldk_node::vss_client::headers::{FixedHeaders, LnurlAuthToJwtProvider, VssHeaderProvider};
3034
use ldk_node::{BuildError, ChannelDetails, DynStore, NodeError};
3135

3236
use std::collections::HashMap;
@@ -155,7 +159,7 @@ pub enum Seed {
155159
#[derive(Debug, Clone)]
156160
pub enum VssAuth {
157161
/// Authentication using an LNURL-auth server.
158-
LNURLAuthServer(String),
162+
LNURLAuthServer(String, HashMap<String, String>),
159163
/// Authentication using a fixed set of HTTP headers.
160164
FixedHeaders(HashMap<String, String>),
161165
}
@@ -177,7 +181,8 @@ pub struct VssConfig {
177181
pub enum StorageConfig {
178182
/// Local SQLite database configuration.
179183
LocalSQLite(String),
180-
// todo VSS(VssConfig),
184+
/// Versioned Storage Service (VSS) configuration.
185+
VSS(VssConfig),
181186
}
182187

183188
/// Configuration for the blockchain data source.
@@ -518,10 +523,57 @@ impl Wallet {
518523
BuildError::RuntimeSetupFailed
519524
})?);
520525

521-
let store: Arc<DynStore> = match &config.storage_config {
526+
let store: Arc<DynStore> = match config.storage_config.clone() {
522527
StorageConfig::LocalSQLite(path) => {
523528
Arc::new(SqliteStore::new(path.into(), Some("orange.sqlite".to_owned()), None)?)
524529
},
530+
StorageConfig::VSS(vss_cfg) => {
531+
let seed_bytes = match &config.seed {
532+
Seed::Mnemonic { mnemonic, passphrase } => {
533+
mnemonic.to_seed(passphrase.as_deref().unwrap_or(""))
534+
},
535+
Seed::Seed64(bytes) => *bytes,
536+
};
537+
538+
let xprv = Xpriv::new_master(config.network, &seed_bytes).map_err(|e| {
539+
log_error!(logger, "Failed to derive master secret: {}", e);
540+
BuildError::InvalidSeedBytes
541+
})?;
542+
543+
let vss_xprv = xprv
544+
.derive_priv(&Secp256k1::new(), &[ChildNumber::Hardened { index: 877 }]) // todo use const
545+
.map_err(|e| {
546+
log_error!(logger, "Failed to derive VSS secret: {}", e);
547+
BuildError::InvalidSeedBytes
548+
})?;
549+
550+
let vss_seed_bytes: [u8; 32] = vss_xprv.private_key.secret_bytes();
551+
552+
let headers: Arc<dyn VssHeaderProvider> = match vss_cfg.headers {
553+
VssAuth::FixedHeaders(h) => Arc::new(FixedHeaders::new(h)),
554+
VssAuth::LNURLAuthServer(url, headers) => {
555+
let lnurl_auth_xprv = vss_xprv
556+
.derive_priv(&Secp256k1::new(), &[ChildNumber::Hardened { index: 138 }]) // todo use const
557+
.map_err(|e| {
558+
log_error!(logger, "Failed to derive VSS secret: {}", e);
559+
BuildError::KVStoreSetupFailed
560+
})?;
561+
562+
let lnurl_auth_jwt_provider = LnurlAuthToJwtProvider::new(
563+
lnurl_auth_xprv,
564+
url,
565+
headers,
566+
)
567+
.map_err(|e| {
568+
log_error!(logger, "Failed to create LnurlAuthToJwtProvider: {e}");
569+
BuildError::KVStoreSetupFailed
570+
})?;
571+
572+
Arc::new(lnurl_auth_jwt_provider)
573+
},
574+
};
575+
Arc::new(VssStore::new(vss_cfg.vss_url, vss_cfg.store_id, vss_seed_bytes, headers)?)
576+
},
525577
};
526578

527579
let event_queue = Arc::new(EventQueue::new(Arc::clone(&store), Arc::clone(&logger)));

0 commit comments

Comments
 (0)