Skip to content

Commit

Permalink
Update to LNP/BP stack v0.9
Browse files Browse the repository at this point in the history
  • Loading branch information
dr-orlovsky committed Dec 27, 2022
1 parent 60d68d2 commit 5fe97c5
Show file tree
Hide file tree
Showing 12 changed files with 361 additions and 417 deletions.
608 changes: 277 additions & 331 deletions Cargo.lock

Large diffs are not rendered by default.

48 changes: 25 additions & 23 deletions Cargo.toml
Expand Up @@ -5,7 +5,7 @@ members = [".", "rpc", "cli"]
[package]
name = "lnp_node"
description = "LNP node"
version = "0.8.0"
version = "0.9.0-rc.1"
authors = ["Dr. Maxim Orlovsky <orlovsky@pandoracore.com>"]
license = "MIT"
keywords = ["bitcoin", "bifi", "lightning-network", "smart-contracts", "lnp"]
Expand Down Expand Up @@ -45,26 +45,28 @@ required-features = ["server"]
[dependencies]
# LNP/BP crates
amplify = "3.13.0"
strict_encoding = { version = "0.8.0", features = ["miniscript"] }
descriptor-wallet = { version = "0.8.0", features = ["keygen", "miniscript", "electrum"] }
lnpbp = "0.8.0"
lnp-core = "0.8.0"
lnp_rpc = { version = "0.8.0", path = "./rpc" }
internet2 = { version = "0.8.3", features = ["keygen"] }
microservices = { version = "0.8.10", default-features = false, features = ["node", "peer"] }
strict_encoding = { version = "0.9.0-rc.2", features = ["miniscript"] }
bitcoin_scripts = "0.9.0-rc.1"
bitcoin_blockchain = "0.9.0-rc.1"
descriptor-wallet = { version = "0.9.0-rc.1", features = ["keygen", "miniscript", "electrum", "sign", "construct"] }
lnpbp = "0.9.0-rc.1"
lnp-core = "0.9.0-rc.1"
lnp_rpc = { version = "0.9.0-rc.1", path = "./rpc" }
internet2 = { version = "0.9.0-rc.1", features = ["keygen"] }
microservices = { version = "0.9.0-rc.1", default-features = false, features = ["node", "peer"] }
# Bitcoin
bitcoin = { version = "0.28.1", features = ["rand"] }
miniscript = "7.0.0"
electrum-client = "0.10.2"
lightning-invoice = "0.16.0"
bitcoin = { version = "0.29.2", features = ["rand"] }
miniscript = "9.0.0"
electrum-client = "0.12.0"
lightning-invoice = "0.21.0"
# OS
serde = "1"
serde_json = "1"
chrono = "0.4"
nix = "0.24"
log = { version = "0.4", features = ["max_level_trace", "release_max_level_debug"] }
env_logger = "0.7"
clap = { version = "~3.1.18", optional = true, features = ["env", "derive"] }
clap = { version = "~3.2.23", optional = true, features = ["env", "derive"] }
settings = { version = "0.10", package = "config", optional = true }
configure_me = { version = "0.4", optional = true }
dotenv = { version = "0.15", optional = true }
Expand All @@ -75,19 +77,19 @@ rpassword = { version = "5.0.1", optional = true }
zmq = { package = "zmq2", version = "0.5.0" }

[dev-dependencies]
strict_encoding_test = "1.8.0"
strict_encoding_test = "0.9.0-rc.1"

[build-dependencies]
amplify = "3.13.0"
lnpbp = "0.8.0"
bitcoin = "0.28.1"
lightning-invoice = "0.16.0"
lnp-core = "0.8.0"
lnp_rpc = { version = "0.8.0", path = "./rpc" }
internet2 = "0.8.3"
microservices = { version = "0.8.10", default-features = false, features = ["peer"] }
clap = { version = "~3.1.18", features = ["env", "derive"] }
clap_complete = "~3.1.4"
lnpbp = "0.9.0-rc.1"
bitcoin = "0.29.2"
lightning-invoice = "0.21.0"
lnp-core = "0.9.0-rc.1"
lnp_rpc = { version = "0.9.0-rc.1", path = "./rpc" }
internet2 = "0.9.0-rc.1"
microservices = { version = "0.9.0-rc.1", default-features = false, features = ["peer"] }
clap = { version = "~3.2.23", features = ["env", "derive"] }
clap_complete = "~3.2.5"
log = { version = "0.4", features = ["max_level_trace", "release_max_level_debug"] }
shellexpand = "2"
configure_me_codegen = "0.4"
Expand Down
28 changes: 14 additions & 14 deletions cli/Cargo.toml
@@ -1,7 +1,7 @@
[package]
name = "lnp-cli"
description = "LNP node command-line interface"
version = "0.8.0"
version = "0.9.0-rc.1"
authors = ["Dr. Maxim Orlovsky <orlovsky@pandoracore.com>"]
license = "MIT"
keywords = ["bitcoin", "node", "lightning-network", "smart-contracts", "lnp"]
Expand All @@ -17,23 +17,23 @@ name = "lnp-cli"

[dependencies]
amplify = "3.13.0"
lnp-core = { version = "0.8.0", default-features = false }
lnp_rpc = { version = "0.8.0", path = "../rpc" }
lightning-invoice = { version = "0.16.0", optional = true }
internet2 = "0.8.3"
microservices = { version = "0.8.10", default-features = false, features = ["cli"] }
lnp-core = { version = "0.9.0-rc.1", default-features = false }
lnp_rpc = { version = "0.9.0-rc.1", path = "../rpc" }
lightning-invoice = { version = "0.21.0", optional = true }
internet2 = "0.9.0-rc.1"
microservices = { version = "0.9.0-rc.1", default-features = false, features = ["cli"] }
shellexpand = "2.1"
clap = { version = "~3.1.18", features = ["derive", "env"] }
clap = { version = "~3.2.23", features = ["derive", "env"] }
log = "0.4.14"

[build-dependencies]
amplify = "3.12.1"
clap = { version = "~3.1.18", features = ["derive", "env"] }
clap_complete = "~3.1.4"
lightning-invoice = "0.16.0"
internet2 = "0.8.0"
lnp-core = { version = "0.8.0-beta.1", default-features = false }
lnp_rpc = { version = "0.8.0-beta.1", path = "../rpc" }
amplify = "3.13.0"
clap = { version = "~3.2.23", features = ["derive", "env"] }
clap_complete = "~3.2.5"
lightning-invoice = "0.21.0"
internet2 = "0.9.0-rc.1"
lnp-core = { version = "0.9.0-rc.1", default-features = false }
lnp_rpc = { version = "0.9.0-rc.1", path = "../rpc" }
configure_me_codegen = "0.4"

[features]
Expand Down
24 changes: 12 additions & 12 deletions rpc/Cargo.toml
@@ -1,7 +1,7 @@
[package]
name = "lnp_rpc"
description = "LNP node RPC API"
version = "0.8.0"
version = "0.9.0-rc.1"
authors = ["Dr. Maxim Orlovsky <orlovsky@pandoracore.com>"]
license = "MIT"
keywords = ["bitcoin", "node", "lightning-network", "smart-contracts", "rpc"]
Expand All @@ -15,17 +15,17 @@ name = "lnp_rpc"

[dependencies]
amplify = "3.13.0"
strict_encoding = "0.8.1"
lnp-core = { version = "0.8.0", default-features = false }
lnpbp = "0.8.0"
bitcoin = { version = "0.28.1", features = ["rand"] }
lightning-invoice = { version = "0.16.0", optional = true }
internet2 = "0.8.3"
microservices = { version = "0.8.10", default-features = false, features = ["client"] }
descriptor-wallet = "0.8.2"
strict_encoding = "0.9.0-rc.2"
lnp-core = { version = "0.9.0-rc.1", default-features = false }
lnpbp = "0.9.0-rc.1"
bitcoin = { version = "0.29.2", features = ["rand"] }
lightning-invoice = { version = "0.21.0", optional = true }
internet2 = "0.9.0-rc.1"
microservices = { version = "0.9.0-rc.1", default-features = false, features = ["client"] }
descriptor-wallet = "0.9.0-rc.1"
serde_crate = { package = "serde", version = "1", features = ["derive"], optional = true }
serde_with = { version = "1.8", optional = true }
serde_yaml = { version = "0.8.23", optional = true }
serde_with = { version = "1.14", optional = true }
serde_yaml = { version = "0.8", optional = true }
log = "0.4.14"
colored = "2.0.0"
zmq = { package = "zmq2", version = "0.5.0" }
Expand All @@ -38,7 +38,7 @@ bolt = ["lnp-core/bolt", "lightning-invoice"]
bifrost = ["lnp-core/bifrost"]

serde = [
"serde_crate", "serde_with", "serde_yaml", "bitcoin/use-serde",
"serde_crate", "serde_with", "serde_yaml", "bitcoin/serde",
"amplify/serde", "internet2/serde", "microservices/serde",
"lnpbp/serde", "descriptor-wallet/serde", "lnp-core/serde"
]
4 changes: 2 additions & 2 deletions src/bus/ctl.rs
Expand Up @@ -13,6 +13,8 @@

use amplify::Slice32;
use bitcoin::Txid;
use bitcoin_scripts::hlc::HashLock;
use bitcoin_scripts::PubkeyScript;
use internet2::addr::{NodeAddr, NodeId};
use internet2::presentation::sphinx::Hop;
use lnp::channel::bolt::{CommonParams, LocalKeyset, PeerParams, Policy};
Expand All @@ -22,9 +24,7 @@ use lnp_rpc::{ChannelInfo, Failure, PeerInfo};
use microservices::esb::ClientId;
use microservices::util::OptionDetails;
use strict_encoding::{NetworkDecode, NetworkEncode};
use wallet::hlc::HashLock;
use wallet::psbt::Psbt;
use wallet::scripts::PubkeyScript;

use crate::rpc::ServiceId;

Expand Down
4 changes: 2 additions & 2 deletions src/channeld/automata/propose.rs
Expand Up @@ -11,12 +11,12 @@
// You should have received a copy of the MIT License along with this software.
// If not, see <https://opensource.org/licenses/MIT>.

use bitcoin_scripts::address::AddressCompat;
use lnp::channel::bolt::Lifecycle;
use lnp::p2p::bolt::{ActiveChannelId, ChannelId, FundingCreated, Messages as LnMsg};
use lnp::Extension;
use microservices::cli::LogStyle;
use microservices::esb::Handler;
use wallet::address::AddressCompat;

use super::Error;
use crate::automata::{Event, StateMachine};
Expand Down Expand Up @@ -183,7 +183,7 @@ fn complete_proposed(

if let Some(address) = channel
.network()
.and_then(|network| AddressCompat::from_script(&fund_channel.script_pubkey, network))
.and_then(|network| AddressCompat::from_script(&fund_channel.script_pubkey, network.into()))
{
debug!("Channel funding address is {}", address);
}
Expand Down
20 changes: 8 additions & 12 deletions src/lnpd/daemons.rs
Expand Up @@ -11,18 +11,15 @@
// You should have received a copy of the MIT License along with this software.
// If not, see <https://opensource.org/licenses/MIT>.

use std::convert::TryInto;
use std::fs;
use std::io::Read;
use std::net::IpAddr;
use std::path::{Path, PathBuf};
use std::process::Command;

use amplify::hex::ToHex;
use bitcoin::secp256k1::{SecretKey, SECP256K1};
use internet2::addr::LocalNode;
use internet2::session::noise::FramingProtocol;
use internet2::transport;
use lnp::p2p;
use lnp::p2p::bolt::ActiveChannelId;
use microservices::cli::LogStyle;
Expand Down Expand Up @@ -113,15 +110,14 @@ impl Launcher for Daemon {
};

match self {
Daemon::PeerdBolt(PeerSocket::Listen(node_addr), _)
| Daemon::PeerdBifrost(PeerSocket::Listen(node_addr), _) => {
let ip: IpAddr = node_addr
.addr
.address()
.try_into()
.map_err(|_| transport::Error::TorNotSupportedYet)?;
let port = node_addr.addr.port().ok_or(transport::Error::TorNotSupportedYet)?;
cmd.args(["--listen", &ip.to_string(), "--port", &port.to_string()]);
Daemon::PeerdBolt(PeerSocket::Listen(socket_addr), _)
| Daemon::PeerdBifrost(PeerSocket::Listen(socket_addr), _) => {
cmd.args([
"--listen",
&socket_addr.ip().to_string(),
"--port",
&socket_addr.port().to_string(),
]);
}
Daemon::PeerdBolt(PeerSocket::Connect(node_addr), _) => {
cmd.args(["--connect", &format!("bolt://{}", node_addr)]);
Expand Down
20 changes: 10 additions & 10 deletions src/lnpd/funding.rs
Expand Up @@ -22,22 +22,22 @@ use bitcoin::psbt::PartiallySignedTransaction;
use bitcoin::secp256k1::{self, Secp256k1};
use bitcoin::util::bip32::ChildNumber;
use bitcoin::{Address, EcdsaSighashType, Network, OutPoint, Txid};
use bitcoin_blockchain::locks::SeqNo;
use bitcoin_scripts::PubkeyScript;
use electrum_client::{Client as ElectrumClient, ElectrumApi};
use lnp::channel::PsbtLnpFunding;
use lnp::p2p::bolt::TempChannelId;
use lnpbp::chain::{Chain, ConversionImpossibleError};
use miniscript::psbt::PsbtExt;
use miniscript::{Descriptor, DescriptorTrait, ForEachKey};
use miniscript::{Descriptor, ForEachKey};
use strict_encoding::{StrictDecode, StrictEncode};
use wallet::descriptors::locks::SeqNo;
use wallet::descriptors::derive::{DeriveDescriptor, Descriptor as _};
use wallet::descriptors::InputDescriptor;
use wallet::hd::{
DerivationAccount, DerivationSubpath, DeriveError, Descriptor as DescriptorExt, SegmentIndexes,
UnhardenedIndex,
DerivationAccount, DerivationSubpath, DeriveError, SegmentIndexes, UnhardenedIndex,
};
use wallet::onchain::ResolveUtxo;
use wallet::onchain::ResolveDescriptor;
use wallet::psbt::Psbt;
use wallet::scripts::PubkeyScript;

// The default fee rate is 2 sats per kilo-vbyte
const DEFAULT_FEERATE_PER_KW: u32 = 2u32 * 1000 * 4;
Expand Down Expand Up @@ -163,7 +163,7 @@ impl FundingWallet {
let wallet_data = WalletData::strict_decode(&wallet_file)?;

let target_network = chain.try_into()?;
let wallet_network = DescriptorExt::<bitcoin::PublicKey>::network(&wallet_data.descriptor)?;
let wallet_network = wallet_data.descriptor.network(matches!(chain, Chain::Regtest(_)))?;

let is_correct_network = match (wallet_network, target_network) {
(Network::Bitcoin, Network::Bitcoin) => true,
Expand Down Expand Up @@ -276,7 +276,7 @@ impl FundingWallet {
outpoint: *utxo.outpoint(),
terminal: vec![case, index],
script_pubkey: script_pubkey.clone(),
amount: utxo.amount().as_sat(),
amount: utxo.amount().to_sat(),
})
})
.collect())
Expand All @@ -296,11 +296,12 @@ impl FundingWallet {
}

pub fn next_funding_address(&self) -> Result<Address, Error> {
let spk = DescriptorExt::<bitcoin::PublicKey>::script_pubkey(
let descriptor = DeriveDescriptor::<bitcoin::PublicKey>::derive_descriptor(
&self.wallet_data.descriptor,
&self.secp,
&[UnhardenedIndex::zero(), self.wallet_data.last_normal_index],
)?;
let spk = descriptor.script_pubkey();
let address = Address::from_script(&spk, self.network)
.expect("Incorrect scriptPubkey to represents address");
Ok(address)
Expand Down Expand Up @@ -353,7 +354,6 @@ impl FundingWallet {

let mut root_derivations = map![];
descriptor.for_each_key(|account| {
let account = account.as_key();
if let Some(fingerprint) = account.master_fingerprint() {
root_derivations
.insert(account.account_fingerprint(), (fingerprint, &account.account_path));
Expand Down
4 changes: 2 additions & 2 deletions src/lnpd/runtime.rs
Expand Up @@ -584,7 +584,7 @@ impl Runtime {
protocol: p2p::Protocol,
) -> Result<String, LauncherError<Daemon>> {
info!("Starting peer connection listening daemon on {}...", addr);
let socket = PeerSocket::Listen(addr);
let socket = PeerSocket::Listen(addr.addr.try_into().expect("tor is not supported"));
let node_key_path = self.node_key_path.clone();
let daemon = match protocol {
Protocol::Bolt => Daemon::PeerdBolt(socket, node_key_path),
Expand All @@ -599,7 +599,7 @@ impl Runtime {
bmap! {},
|mut acc, f| -> Result<_, Error> {
let addr = Address::from_script(&f.script_pubkey, self.funding_wallet.network())
.ok_or(funding::Error::NoAddressRepresentation)?;
.map_err(|_| funding::Error::NoAddressRepresentation)?;
*acc.entry(addr).or_insert(0) += f.amount;
Ok(acc)
},
Expand Down
10 changes: 5 additions & 5 deletions src/peerd/opts.rs
Expand Up @@ -11,10 +11,10 @@
// You should have received a copy of the MIT License along with this software.
// If not, see <https://opensource.org/licenses/MIT>.

use std::net::{IpAddr, Ipv4Addr};
use std::net::{IpAddr, Ipv4Addr, SocketAddr};

use clap::{ArgGroup, ValueHint};
use internet2::addr::{InetSocketAddr, NodeAddr, NodeId};
use internet2::addr::NodeId;
use lnp::addr::LnpAddr;
use lnp::p2p;
use lnp::p2p::bifrost::LNP2P_BIFROST_PORT;
Expand Down Expand Up @@ -145,15 +145,15 @@ impl KeyOpts {
}

impl Opts {
pub fn peer_socket(&self, node_id: NodeId) -> PeerSocket {
pub fn peer_socket(&self, _node_id: NodeId) -> PeerSocket {
if let Some(peer_addr) = self.connect {
PeerSocket::Connect(peer_addr.node_addr)
} else if let Some(bind_addr) = self.listen {
let addr = InetSocketAddr::socket(
let addr = SocketAddr::new(
bind_addr.unwrap_or(IpAddr::V4(Ipv4Addr::UNSPECIFIED)).into(),
self.port.unwrap_or(self.port()),
);
PeerSocket::Listen(NodeAddr::new(node_id, addr))
PeerSocket::Listen(addr)
} else {
unreachable!("Either `connect` or `listen` must be present due to Clap configuration")
}
Expand Down
6 changes: 3 additions & 3 deletions src/peerd/runtime.rs
Expand Up @@ -96,7 +96,7 @@ pub fn run(
identity,
local_id: params.local_id,
remote_id: params.remote_id,
local_socket: params.local_socket,
local_socket: params.local_socket.map(InetSocketAddr::from),
remote_socket: params.remote_socket,
channels: empty!(),
sender,
Expand Down Expand Up @@ -510,10 +510,10 @@ impl Runtime {
);
}
let mut rng = rand::thread_rng();
let len: u16 = rng.gen_range(4, 32);
let len: u16 = rng.gen_range(4..=32);
let mut noise = vec![0u8; len as usize];
rng.fill_bytes(&mut noise);
let pong_size = rng.gen_range(4, 32);
let pong_size = rng.gen_range(4..=32);
self.messages_sent += 1;
match self.config.protocol {
p2p::Protocol::Bolt => {
Expand Down

0 comments on commit 5fe97c5

Please sign in to comment.