Skip to content

Commit

Permalink
chore: extend activity_name to all activity relevant logging
Browse files Browse the repository at this point in the history
  • Loading branch information
Ifeanyichukwu committed Apr 7, 2024
1 parent bf3f688 commit 16fd20d
Show file tree
Hide file tree
Showing 4 changed files with 131 additions and 83 deletions.
130 changes: 72 additions & 58 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,42 +1,49 @@
# SimLN

SimLN is a simulation tool that can be used to generate realistic
payment activity on any lightning network topology. It is intentionally
environment-agnostic so that it can be used across many environments -
from integration tests to public signets.
SimLN is a simulation tool that can be used to generate realistic
payment activity on any lightning network topology. It is intentionally
environment-agnostic so that it can be used across many environments -
from integration tests to public signets.

This tool is intended to serve developers who are familiar with
This tool is intended to serve developers who are familiar with
lightning network development. It may be useful to you if you are:
* A protocol developer looking to test proposals.
* An application developer load-testing your application.
* A signet operator interested in a hands-off way to run an active node.
* A researcher generating synthetic data for a target topology.

- A protocol developer looking to test proposals.
- An application developer load-testing your application.
- A signet operator interested in a hands-off way to run an active node.
- A researcher generating synthetic data for a target topology.

## Pre-Requisites
SimLN requires you to "bring your own network" to generate activity

SimLN requires you to "bring your own network" to generate activity
on. You will need:
* A [lightning network](#lightning-environments) connected with any

- A [lightning network](#lightning-environments) connected with any
topology of channels.
* Access to execute commands on _at least_ one node in the network.
* Rust compiler [installed](https://www.rust-lang.org/tools/install).
- Access to execute commands on _at least_ one node in the network.
- Rust compiler [installed](https://www.rust-lang.org/tools/install).

## LN Implementation Support
* LND ✅
* CLN ✅
* Eclair 🏗️
* LDK-node 🏗️

- LND ✅
- CLN ✅
- Eclair 🏗️
- LDK-node 🏗️

See our [tracking issue](https://github.com/bitcoin-dev-project/sim-ln/issues/26)
for updates on implementation support (contributions welcome!).

## Getting Started
Clone the repo:

Clone the repo:

```
git clone https://github.com/bitcoin-dev-project/sim-ln
cd sim-ln
```

Install the CLI:
Install the CLI:

```
cargo install --locked --path sim-cli/
```
Expand All @@ -52,9 +59,10 @@ Run `sim-cli -h` for details on `--data-dir` and `--sim-file` options that allow
Interested in contributing to the project? See [CONTRIBUTING](CONTRIBUTING.md) for more details.

### Simulation File Setup
The simulator requires access details for a set of `nodes` that you
have permission to execute commands on. Note that the current version
of the simulator uses keysend to execute payments, which must be

The simulator requires access details for a set of `nodes` that you
have permission to execute commands on. Note that the current version
of the simulator uses keysend to execute payments, which must be
enabled in LND using `--accept-keysend` (for CLN node it is enabled by default).

The required access details will depend on the node implementation. For LND, the following
Expand All @@ -72,7 +80,7 @@ information is required:
Whereas for CLN nodes, the following information is required:

```
{
{
"id": <node_id>,
"address": https://<ip:port or domain:port>,
"ca_cert": <path_to_ca_cert>,
Expand All @@ -84,17 +92,18 @@ Whereas for CLN nodes, the following information is required:
**Note that node addresses must be declare with HTTPS transport, i.e. <https://ip-or-domain:port>**

Payment activity can be simulated in two different ways:
* Random activity: generate random activity on the `nodes` provided,

- Random activity: generate random activity on the `nodes` provided,
using the graph topology to determine payment frequency and size.
* Defined activity: provide descriptions of specific payments that
- Defined activity: provide descriptions of specific payments that
you would like the generator to execute.

### Setup - Random Activity

To run the simulator with random activity generation, you just need to
provide a set of nodes and the simulator will generate activity based
on the topology of the underlying graph. Note that payments will only
be sent between the `nodes` that are provided so that liquidity does
To run the simulator with random activity generation, you just need to
provide a set of nodes and the simulator will generate activity based
on the topology of the underlying graph. Note that payments will only
be sent between the `nodes` that are provided so that liquidity does
not "drain" from the simulation.

```
Expand All @@ -106,7 +115,7 @@ not "drain" from the simulation.
"macaroon": "/path/admin.macaroon",
"cert": "/path/tls.cert"
},
{
{
"id": "0230a16a05c5ca120136b3a770a2adfdad88a68d526e63448a9eef88bddd6a30d8",
"address": "https://localhost:10013",
"ca_cert": "/path/ca.pem",
Expand All @@ -118,38 +127,41 @@ not "drain" from the simulation.
```

Nodes can be identified by an arbitrary string ("Alice", "CLN1", etc) or
by their node public key. If a valid public key is provided it *must*
by their node public key. If a valid public key is provided it _must_
match the public key reported by the node.

There are a few cli flags that can be used to toggle the characteristics
of the random activity that is generated:
* `--expected-payment-amount`: the approximate average amount that
There are a few cli flags that can be used to toggle the characteristics
of the random activity that is generated:

- `--expected-payment-amount`: the approximate average amount that
will be sent by nodes, randomness will be introduced such that larger
nodes send a wider variety of payment sizes around this expectation.
* `--capacity-multiplier`: the number of times over that each node in
- `--capacity-multiplier`: the number of times over that each node in
the network sends their capacity in a calendar month, for example:
* `capacity-multiplier=2` means that each node sends double their
capacity in a month.
* `capacity-multiplier=0.5` means that each node sends half their
- `capacity-multiplier=2` means that each node sends double their
capacity in a month.
- `capacity-multiplier=0.5` means that each node sends half their
capacity in a month.

### Setup - Defined Activity
If you would like SimLN to generate a specific payments between source
and destination nodes, you can provide `activity` descriptions of the
source, destination, frequency, amount for payments that you'd like
to execute and an optional name for each `activity` description that is used
as the logging prefix to relate logs to their corresponding activity description
(The index of each `activity` description will be used if a name is not
provided for the `activity` description). Note that `source` nodes *must* be contained in `nodes`,
but destination nodes can be any public node in the network (though
this may result in liquidity draining over time).

If you would like SimLN to generate a specific payments between source
and destination nodes, you can provide `activity` descriptions of the
source, destination, frequency and amount for payments that you'd like
to execute. Note that `source` nodes _must_ be contained in `nodes`,
but destination nodes can be any public node in the network (though
this may result in liquidity draining over time). You can also add an optional name for each `activity` description that is
used as the logging prefix to relate logs to their corresponding activity
description (The index of each `activity` description will be used if a name is not provided for the `activity` description).

The example simulation file below sets up the following simulation:
* Connect to `Alice` running LND to generate activity.
* Connect to `Bob` running CLN to generate activity.
* Dispatch 2000 msat payments from `Alice` to `Carol` every 1 seconds.
* Dispatch 140000 msat payments from `Bob` to `Alice` every 50 seconds.
* Dispatch 1000 msat payments from `Bob` to `Dave` every 2 seconds.

- Connect to `Alice` running LND to generate activity.
- Connect to `Bob` running CLN to generate activity.
- Dispatch 2000 msat payments from `Alice` to `Carol` every 1 seconds.
- Dispatch 140000 msat payments from `Bob` to `Alice` every 50 seconds.
- Dispatch 1000 msat payments from `Bob` to `Dave` every 2 seconds.

```
{
"nodes": [
Expand Down Expand Up @@ -194,10 +206,10 @@ The example simulation file below sets up the following simulation:

**Note that node addresses must be declare with HTTPS transport, i.e <https://ip-or-domain>**

Nodes can be identified by their public key or an id string (as
described above). Activity sources and destinations may reference the
`id` defined in `nodes`, but destinations that are not listed in `nodes`
*must* provide a valid public key.
Nodes can be identified by their public key or an id string (as
described above). Activity sources and destinations may reference the
`id` defined in `nodes`, but destinations that are not listed in `nodes`
_must_ provide a valid public key.

### Simulation Output

Expand All @@ -208,10 +220,12 @@ Run `sim-cli -h` for details on data directory (`--data-dir`) and other options
which affect how simulation outputs are persisted

## Lightning Environments

If you're looking to get started with local lightning development, we
recommend [polar](https://lightningpolar.com/). For larger deployments,
see the [Scaling Lightning](https://github.com/scaling-lightning/scaling-lightning)
recommend [polar](https://lightningpolar.com/). For larger deployments,
see the [Scaling Lightning](https://github.com/scaling-lightning/scaling-lightning)
project.

## Docker

If you want to run the cli in a containerized environment, see the docker set up docs [here](./docker/README.md)
10 changes: 9 additions & 1 deletion sim-cli/src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -132,7 +132,7 @@ async fn main() -> anyhow::Result<()> {
alias_node_map.insert(node_info.alias.clone(), node_info);
}

let mut validated_activities = vec![];
let mut validated_activities: Vec<ActivityDefinition> = vec![];
// Make all the activities identifiable by PK internally
for act in activity.into_iter() {
// We can only map aliases to nodes we control, so if either the source or destination alias
Expand Down Expand Up @@ -182,6 +182,14 @@ async fn main() -> anyhow::Result<()> {
},
};

for validated_activity in &validated_activities {
if validated_activity.activity_name == act.activity_name {
anyhow::bail!(LightningError::ValidationError(
"Duplicate activity name is not allowed".to_string(),
));
}
}

validated_activities.push(ActivityDefinition {
source,
destination,
Expand Down
17 changes: 12 additions & 5 deletions sim-lib/src/defined_activity.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,14 +7,16 @@ pub struct DefinedPaymentActivity {
destination: NodeInfo,
wait: Duration,
amount: u64,
activity_name: String,
}

impl DefinedPaymentActivity {
pub fn new(destination: NodeInfo, wait: Duration, amount: u64) -> Self {
pub fn new(destination: NodeInfo, wait: Duration, amount: u64, activity_name: String) -> Self {
DefinedPaymentActivity {
destination,
wait,
amount,
activity_name,
}
}
}
Expand All @@ -23,8 +25,8 @@ impl fmt::Display for DefinedPaymentActivity {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(
f,
"static payment of {} to {} every {:?}",
self.amount, self.destination, self.wait
"{} activity: static payment of {} to {} every {:?}",
self.activity_name, self.amount, self.destination, self.wait
)
}
}
Expand Down Expand Up @@ -68,9 +70,14 @@ mod tests {

let source = get_random_keypair();
let payment_amt = 50;
let activity_name = String::from("Coffee Purchase");

let generator =
DefinedPaymentActivity::new(node.clone(), Duration::from_secs(60), payment_amt);
let generator = DefinedPaymentActivity::new(
node.clone(),
Duration::from_secs(60),
payment_amt,
activity_name,
);

let (dest, dest_capacity) = generator.choose_destination(source.1);
assert_eq!(node.pubkey, dest.pubkey);
Expand Down
Loading

0 comments on commit 16fd20d

Please sign in to comment.