1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
//! # Common types related to Lightning Network
//!
//! **Warning: while in a good state, this is still considered a preview version!**
//! There are some planned changes.
//!
//! This library aims to provide Rust-idiomatic, ergonomic, and reasonably performant
//! implementation of primitives used in applications interacting with Lightning Network.
//! That means, they are not *just* types used to implement LN itself, they are supposed to be
//! useful to any application that e.g. communicates with an LN implementation. Of course,
//! they should still be useful for an LN implementation itself.
//!
//! ## Important types
//!
//! The most important types currently available:
//!
//! * [`Amount`] - similar to [`bitcoin_units::Amount`] but with millisatoshi precision
//! * [`P2PAddress`] - address of a node usually represented in text as `node_id_hex@host:port`
//! * [`NodeId`] - the byte representation of node's public key (no crypto operations)
//! * [`NodePubkey`] - newtype around [`secp256k1::PublicKey`] to distinguish node public key from
//! other keys. Requires `secp256k1` feature.
//!
//! Note: invoice is not here and isn't planned because it already exists in a separate crate.
//!
//! ## Integrations
//!
//! The crate aims to be interoperable with other crates via optional dependencies.
//!
//! ### Supported external crates
//!
//! Ativate using features of the same name.
//!
//! * `std` - enables [`P2PAddress`] and implements [`std::error::Error`] for error types.
//! Enabled by default, implies `alloc.
//! * `alloc` - enables conversions from/to heap-allocated types as well as additional error
//! information.
//! * [`bitcoin-units`] - converting between types
//! * [`serde`] - serialization and deserialization of types
//! * [`postgres-types`](postgres_types) - storing and retrieving from SQL
//! * [`parse_arg`] - parsing arguments into types in this crate
//! * [`secp256k1`] - provides `NodePubkey`
//! * [`slog`] - provides `slog::Value` and (where relevant) `slog::KV` implementations for the types
//!
//! **Important: some combinations may benefit from additional features!**
//! See below.
//!
//! ### Additional features
//!
//! * `hex-conservative` - improves the performance of displaying `NodeId`/`NodePubkey` at the cost
//! of additional dependency
//! * `node_pubkey_verify` - convenience function for verifying messages signed with
//! [`NodePubkey`], implies `secp256k1/bitcoin_hashes`
//! * `node_pubkey_recovery` - convenience function for verifying lightning messages
//! signed with [`NodePubkey`], implies `node_pubkey_verify` and
//! `secp256k1/recovery`
//! * `secp256k1_std` - required for [`node_pubkey::ParseError`] to return `secp256k1::Error` from
//! `source()` method of [`std::error::Error`]
//! * `serde_alloc` - required for specialization of `serde::de::Visitor::visit_string` method to
//! avoid allocation
//! * `slog_std` - required for error types to use [`slog::Serializer::emit_error`] for logging
//!
//! Feel free to contribute your own!
//!
//! **Disclaimer**: Inclusion of any crate here is neither endorsment nor guarantee of it
//! being secure, honest, non-backdoored or functioning! You're required to do your own review of
//! any external crate.
//!
//! The rules around adding a new integration are lax: the dependency must be optional, must
//! **not** be obviously broken or surprising, and must **not** interact with other implementations
//! in surprising ways.
//!
//! ### `no_std` support
//!
//! This crate works without `std` or `alloc` with these limitations/differences:
//!
//! * [`P2PAddress`] is unavailable without `std` on Rust versions older than 1.77
//! * Resolving a socket address requires `std`
//! * Without `std` all error types display all sources delimited by `: `, with `std` they are
//! returned from the [`source()`](std::error::Error::source) method instead.
//!
//! ## Versioning
//!
//! This crate uses standard Rust Semver with one special exception:
//! **Matching on fully private structs is not allowed and so changing an
//! all-private struct to an enum is considered non-breaking change even
//! though the consumer code matching on it would break!**
//!
//! See [Rust internals discussion](https://internals.rust-lang.org/t/disallow-matching-on-all-private-structs/15993) to learn more.
//!
//! ## MSRV
//!
//! The minimum supported Rust version is 1.56 and will be increased to 1.63 soon.
//! Generally, the intention is to support at least the latest Debian stable.
//!
//! Note that external libraries may have higher MSRV - this is not considered a breakage.
//!
//! ## License
//!
//! MIT
pub extern crate std;
pub extern crate alloc;
pub extern crate bitcoin_units;
pub extern crate parse_arg;
pub extern crate postgres_types_real as postgres_types;
pub extern crate secp256k1;
pub extern crate serde;
pub extern crate slog;
pub
pub use NodeId;
pub use P2PAddress;
pub use Amount;
pub use NodePubkey;