Coder Social home page Coder Social logo

sim-ln's Introduction

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.

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.

Pre-Requisites

SimLN requires you to "bring your own network" to generate activity on. You will need:

  • A lightning network connected with any topology of channels.
  • Access to execute commands on at least one node in the network.
  • Rust compiler installed.

LN Implementation Support

  • LND โœ…
  • CLN โœ…
  • Eclair ๐Ÿ—๏ธ
  • LDK-node ๐Ÿ—๏ธ

See our tracking issue for updates on implementation support (contributions welcome!).

Getting Started

Clone the repo:

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

Install the CLI:

cargo install --locked --path sim-cli/

Run with Simulation File (see setup instructions for details):

sim-cli sim.json

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 enabled in LND using --accept-keysend.

Payment activity can be simulated in two different ways:

  • 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 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 not "drain" from the simulation.

{
  "nodes": [
    {
      "LND": {
        "id": "Alice",
        "address": "https://localhost:10011",
        "macaroon": "/path/admin.macaroon",
        "cert": "/path/tls.cert"
      }
    },
    {
      "CLN": {
        "id": "0230a16a05c5ca120136b3a770a2adfdad88a68d526e63448a9eef88bddd6a30d8",
        "address": "https://localhost:10013",
        "ca_cert": "/path/ca.pem",
        "client_cert": "/path/client.pem",
        "client_key": "/path/client-key.pem"
      }
    }
  ]
}

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 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 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 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 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 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).

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.
{
  "nodes": [
    {
      "LND": {
        "id": "Alice",
        "address": "https://localhost:10011",
        "macaroon": "/path/admin.macaroon",
        "cert": "/path/tls.cert"
      }
    },
    {
      "CLN": {
        "id": "0230a16a05c5ca120136b3a770a2adfdad88a68d526e63448a9eef88bddd6a30d8",
        "address": "https://localhost:10013",
        "ca_cert": "/path/ca.pem",
        "client_cert": "/path/client.pem",
        "client_key": "/path/client-key.pem"
      }
    }
  ],
  "activity": [
    {
      "source": "Alice",
      "destination": "02d804ad31429c8cc29e20ec43b4129553eb97623801e534ab5a66cdcd2149dbed",
      "interval_secs": 1,
      "amount_msat": 2000
    },
    {
      "source": "0230a16a05c5ca120136b3a770a2adfdad88a68d526e63448a9eef88bddd6a30d8",
      "destination": "Alice",
      "interval_secs": 50,
      "amount_msat": 140000
    },
    {
      "source": "0230a16a05c5ca120136b3a770a2adfdad88a68d526e63448a9eef88bddd6a30d8",
      "destination": "03232e245059a2e7f6e32d6c4bca97fc4cda935c553ea3693adb3265a19050c3bf",
      "interval_secs": 2,
      "amount_msat": 1000
    }
  ]
}

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

A summary of the results will be logged by the simulator, and a full list of payments made with their outcomes is available in simulation_{timestamp}.csv in the directory that the simulation was executed in. For more detailed logs, use the --log-level cli flag.

Lightning Environments

If you're looking to get started with local lightning development, we recommend polar. For larger deployments, see the Scaling Lightning project.

sim-ln's People

Contributors

carlakc avatar sr-gi avatar okjodom avatar bigmarh avatar emmanuel-develops avatar extheoisah avatar m3dwards avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.