Skip to content

Commit 6429498

Browse files
committed
Simple VSS
1 parent a557da9 commit 6429498

3 files changed

Lines changed: 61 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: 57 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,59 @@ 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 secp = Secp256k1::new();
544+
545+
let vss_xprv = xprv
546+
.derive_priv(&secp, &[ChildNumber::Hardened { index: 877 }]) // todo use const
547+
.map_err(|e| {
548+
log_error!(logger, "Failed to derive VSS secret: {}", e);
549+
BuildError::InvalidSeedBytes
550+
})?;
551+
552+
let vss_seed_bytes: [u8; 32] = vss_xprv.private_key.secret_bytes();
553+
554+
let headers: Arc<dyn VssHeaderProvider> = match vss_cfg.headers {
555+
VssAuth::FixedHeaders(h) => Arc::new(FixedHeaders::new(h)),
556+
VssAuth::LNURLAuthServer(url, headers) => {
557+
let lnurl_auth_xprv = vss_xprv
558+
.derive_priv(&secp, &[ChildNumber::Hardened { index: 138 }]) // todo use const
559+
.map_err(|e| {
560+
log_error!(logger, "Failed to derive VSS secret: {}", e);
561+
BuildError::KVStoreSetupFailed
562+
})?;
563+
564+
let lnurl_auth_jwt_provider = LnurlAuthToJwtProvider::new(
565+
lnurl_auth_xprv,
566+
url,
567+
headers,
568+
)
569+
.map_err(|e| {
570+
log_error!(logger, "Failed to create LnurlAuthToJwtProvider: {e}");
571+
BuildError::KVStoreSetupFailed
572+
})?;
573+
574+
Arc::new(lnurl_auth_jwt_provider)
575+
},
576+
};
577+
Arc::new(VssStore::new(vss_cfg.vss_url, vss_cfg.store_id, vss_seed_bytes, headers)?)
578+
},
525579
};
526580

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

0 commit comments

Comments
 (0)