Lightning Network Tutorial : From Scratch to a c-lightning Transaction
By Gustavo J. Flores Echaiz over 3 years
Last week, we illustrated the Lightning network protocol, BOLTs (Basics of Lightning Technology), through a visual diagram that we hope has contributed to the community’s understanding of this technology. If you didn’t have time to check it out, don’t hesitate to give it a quick look here!
This week, we want to get into the implementation of this technology to understand how it works in the real world. We have built tutorials for both major implementations, LND & C-lightning. To view the LND one, click here.
C-lightning is a lightning network implementation mostly written in C and the gRPC is done on Python. It is an open-source maintained by Blockstream. Rusty Russell and Christian Decker are the main developers on this project but there are a lot of other contributors. It is only available on Linux for the moment.
This will be a tutorial that will be a step-by-step guide to c-lightning.
Part 1 : Setting up Bitcoind
To install bitcoind on a linux machine like ubuntu, refer to StopandDecrypt awesome step-by-step guide on Medium, this is far better from anything I could have written. In this process, he completely builds from source while verifying the authenticity of the packages.
If you don’t want to build from source for whatever reason, there is an easier way to install bitcoind and bitcoin-qt (GUI version), you simply have to run these commands
sudo apt-add-repository ppa:bitcoin/bitcoin
sudo apt-get update
sudo apt-get install bitcoin-qt bitcoind
Once it is installed, you can create a configuration file by running this command.
nano ~/.bitcoin/bitcoin.conf
My configuration file looks like this and it is the minimum necessary to run c-lightning :
server=1
listen=1
daemon=1
rpcuser=insert_a_username
rpcpassword=insert_a_password
txindex=1
but you can also modify your configuration file with this great tool by Jameson Lopp.
https://jlopp.github.io/bitcoin-core-config-generator/
you can then launch bitcoind by simply entering this in the cli.
bitcoind
or for the gui version :
bitcoin-qt
You have now launched bitcoind, and it has started syncing the blockchain. This can take several days, to check its progress, enter this command :
bitcoin-cli getblockchaininfo
Once this step is finished, you are ready to move forward to c-lightning.
Part 2 : Installing c-lightning
First, we have to install the dependencies, run these commands :
sudo apt-get update
sudo apt-get install -y \
autoconf automake build-essential git libtool libgmp-dev \
libsqlite3-dev python python3 net-tools zlib1g-dev libsodium\
libbase58-dev
This should download all the dependencies but if libsodium’s installation doesn’t work out, here is how to do it!
wget "https://download.libsodium.org/libsodium/releases/LATEST.tar.gz"
tar -xvf ./LATEST.tar.gz
cd libsodium-stable
./configure
make && make check
sudo make install
Now for c-lightning, here are the steps, they are very straightforward.
git clone https://github.com/ElementsProject/lightning.git
cd lightning
./configure
make
The installation is complete and you’re ready to proceed to create and modify the configuration file.
Part 3 : Configuration file
./lightningd/lightningd --network bitcoin --log-level debug &
./cli/lightning-cli help
The config file is written in the .lightning folder under the name config.
nano ~/.lightning/config
my config file looks like this which basically means that the network of the lightning node will be Bitcoin’s mainnet, that the log level to print out will be at the debug level, that :
network=bitcoin
log-level=debug
addr=0.0.0.0:9735
bitcoin-rpcuser=insert_the_same_ username_as_bitcoin_rpc
bitcoin-rpcpassword=insert_the_same_ password_as_bitcoin_rpc
Save and exit.
You can then launch it in an easier way.
~/lightning/cli/lightning-cli stop
~/lightning/lightningd/lightningd &
Part 4 : adding lightningd and lightning-cli to PATH
To add lightningd and lightning-cli to your PATH, type in these commands, first to stop lightningd and then to go on the .profile file.
~/lightning/cli/lightning-cli stop
nano ~/.profile
Then add this at the bottom of the file :
export PATH=$PATH:~/lightning/lightningd
export PATH=~/lightning/lightnind:$PATH
export PATH=$PATH:~/lightning/cli
export PATH=~/lightning/cli:$PATH
There are other ways to do this but this will make it work. You have to pen a new terminal for it to take effect. You can now use lightningd and lightning-cli directly :
lightningd &
lightning-cli getinfo
Note : if something like Permission Denied or Trying to write on Read-mode appears, it means you have to change the ownership status of some files.
ls -l ~/.lightning
gossip_store, lightning-rpc, lightningd.sqlite3 and hsm_secret will probably show as owned by root like here.

Run these commands to change the ownership of those files to get this result.
sudo chown USERNAME lightningd.sqlite3
sudo chown USERNAME lightning-rpc
sudo chown USERNAME gossip_store
sudo chown root hsm_secret

I would also like to add that backing up hsm_secret will backup your on chain funds. For more information about this, you can check out this issue request on the official repo: https://github.com/ElementsProject/lightning/issues/1156
It should now allow you to directly calling it without using sudo.
lightningd &
lightning-cli getinfo
You can also launch lightningd in a daemon mode :
lightningd --daemon
lightning-cli getinfo
Part 5 : Network and Port Configuration
To allow incoming connections for your bitcoin node and your lightning node, you need to have 8333 and 9735 ports open and correctly forwarding to your respective nodes.
Pierre Rochard’s has written an article that should answer all your questions about port forwarding for bitcoin and lightning. https://medium.com/@pierre_rochard/bitcoin-and-lightning-nodes-port-forwarding-faq-f92ca5c50d5d
This part is obviously optional, but if you decide to do it, here is a complete guide about it.
https://bitcoin.org/en/full-node#network-configuration
To check if your ports are open, use this simple tool.
https://www.yougetsignal.com/tools/open-ports/
Part 6 : Deposit funds and Open a Channel
We are now ready to go on to the lightning-cli commands. The first step, we have to connect to another node to sync the channel graph, I’ve chosen Pierre Rochard’s LightningPowerUsers node to connect and later to open a channel because I consider it one of the best nodes in the network :
lightning-cli connect 0331f80652fb840239df8dc99205792bba2e559a05469915804c08420230e23c7c@74.108.13.152:9735
The syncing is automatic and will probably take a few minutes. It’s now time to generate a bitcoin address to receive funds onchain.
lightning-cli newaddr
The previous command will return a segwit native bc1 address. If you need a p2sh segwit address that starts in a 3 and is compatible will non-segwit wallets or exchanges, run this command instead.
lightning-cli newaddr p2sh-segwit
Make the transaction by sending some bitcoins to the address #reckless, but always keep in mind that this software is still in beta phase, therefore experimental. Run this command to check if the bitcoin was well received.
lightning-cli listfunds
Once the transaction is confirmed, it’s now time to open a channel to go on the Lightning network by running this command.
lightning-cli fundchannel 0331f80652fb840239df8dc99205792bba2e559a05469915804c08420230e23c7c amount_in_satoshis
The funding transaction requires three confirmations for the channel to be available, so it will take around half an hour. Once it is confirmed, you will be able to find the channel by running this command :
lightning-cli listchannels | grep ‘your_node_pubkey’

Once your channel appears by running the previous command, you are now ready to transact on the Lightning network!
Part 7 : Make and receive a transaction
I usually test my node by making a micro-payment to yalls.org to read an article that interests me.

This is the command to pay an invoice. Obviously, change the last part for the payment request id of the invoice that you want to pay.
lightning-cli pay lnbc1500n1pwfja4pp5xmw9m37spxhlppmd4y……………
To receive a payment, you have to either have an incoming channel or to have pushed funds on the other side of the channel by making a payment. First off, if you don’t have anyone that will make an incoming channel to your node, LightningPowerUsers will do it if you make an outcoming channel to the node first, to find out more, check out the website here.
Keep in mind that you will have to have your port 9735 open and forwarded. But you can also just spend money on your outcoming channel, and that money spent will be able to payed back to you by other nodes that can route to yours.
This is the command to create an invoice, this will create an invoice for 50000000 msatoshi or 0.0005 btc with the label : reckless, and the description: craig_wright_is_a_loser.
lightning-cli invoice 50000000 reckless craig_wright_is_a_loser