Photo by Austin Distel on Unsplash
Simulate your first lightning transaction on the Bitcoin regtest network Part 2 (MacOS)
This is a simulation of lightning transactions - a three-part series
๐ Objective
The goal of this article is to help you
- confirm that we have the correct bitcoin.conf settings
- spin up a Bitcoin network
- Ensure we are on the regtest network
- Prepare the first lightning node aka
lnd1
for some action- Spin up node
- Create wallet
- Get some information about the node
- Generate an Address
- Fund the
lnd1
wallet with some bitcoin- load up our existing local Bitcoin wallet
- send some bitcoin to generated
lnd1
wallet address (to be sent tolnd2
later on)
- Check wallet balance
- Prepare the second lightning node aka
lnd2
for some action
๐ Introduction
Welcome to Part 2 of our series, fellow Bitcoin/Lightning developers. I'm sure you're itching for some action...
This is the second part of a two-part series and in case you haven't already read the first part go over here Part 1 so you can fully maximize this second part.
๐ Some boring but very important stuff to get us started
The Lightning Network is a second-layer protocol built on top of the Bitcoin blockchain
and it enables faster and cheaper transactions by creating off-chain payment channels
between users
. These channels
allow multiple transactions to occur without needing to be recorded on the main Bitcoin blockchain
. Instead, only the opening and closing transactions
of the channel are settled on the blockchain
.
The Regtest (regression test) Bitcoin network mode creates a local private blockchain
where you can adjust the parameters to what you want. For this demonstration, we would run our lightning network on top of an active Bitcoin network running a local private blockchain (regtest)
Quick note: throughout this article, long
output
codeblock data are truncated
The easy part:
โ๏ธ Confirming our Bitcoin environment and spinning up a Bitcoin daemon
To confirm that our settings are correct to spin up the required Bitcoin network mode, open up the autogenerated bitcoin.conf
located at /Users/user/Library/Application Support/Bitcoin/bitcoin.conf
with a text editor
Command:
nvim /Users/user/Library/Application Support/Bitcoin/bitcoin.conf
Output:
# Daemon Options
server=1
daemon=1
fallbackfee=0.00072
txindex=1
mintxfee=0.0001
txconfirmtarget=6
# Network Options
regtest=1
#signet=1
#testnet=1
[regtest]
# RPC Options
rpcport=18443
rpcuser=bitcoin
rpcpassword=bitcoin
# ZMQ Options
zmqpubrawblock=tcp://127.0.0.1:28332
zmqpubrawtx=tcp://127.0.0.1:28333
zmqpubhashtx=tcp://127.0.0.1:28332
zmqpubhashblock=tcp://127.0.0.1:28332
Now let's follow through the following steps
๐ Spin up a Bitcoin network (regtest network)
Command:
bitcoind
Output:
Bitcoin Core starting
๐ Ensure we are on the regtest network
Command:
bitcoin-cli getblockchaininfo
output:
{
"chain": "regtest", // ๐๐ฟ just making sure we are on the 'regtest' network
"blocks": 526,
"headers": 526,
...
}
๐ Prepare the first lightning node aka lnd1
for some action
We'll be preparing our first lightning node now so go ahead and open up two new shell tabs or terminal windows and follow the following steps to spin up both of our previously configured lightning nodes respectively.
First Tab:
Let's go ahead and start up our first node
command:
lnd1
output:
2024-02-14 02:38:18.958 [INF] LTND: Version: 0.17.0-beta commit=fn/v1.0.1-85-ge31d15989, build=production, logging=default, debuglevel=info
2024-02-14 02:38:18.958 [INF] LTND: Active chain: Bitcoin (network=regtest)
2024-02-14 02:38:18.958 [INF] RPCS: Generating TLS certificates...
2024-02-14 02:38:18.960 [INF] RPCS: Done generating TLS certificates
2024-02-14 02:38:18.961 [INF] RPCS: RPC server listening on 127.0.0.1:10009
2024-02-14 02:38:18.963 [INF] RPCS: gRPC proxy started at 127.0.0.1:8080
2024-02-14 02:38:18.963 [INF] LTND: Opening the main database, this might take a few minutes...
2024-02-14 02:38:18.963 [INF] LTND: Opening bbolt database, sync_freelist=false, auto_compact=false
2024-02-14 02:38:19.003 [INF] LTND: Creating local graph and channel state DB instances
2024-02-14 02:38:19.069 [INF] CHDB: Checking for schema update: latest_version=31, db_version=31
2024-02-14 02:38:19.069 [INF] CHDB: Checking for optional update: prune_revocation_log=false, db_version=empty
2024-02-14 02:38:19.069 [INF] LTND: Database(s) now open (time_to_open=106.471482ms)!
2024-02-14 02:38:19.069 [INF] LTND: We're not running within systemd or the service type is not 'notify'
2024-02-14 02:38:19.069 [INF] LTND: Waiting for wallet encryption password. Use `lncli create` to create a wallet, `lncli unlock` to unlock an existing wallet, or `lncli changepassword` to change the password of an existing wallet and unlock it.
Second Tab:
Now let's create a wallet, run the command below and follow through the wallet creation prompts
command:
lncli1 create
output:
Input wallet password:
Confirm password:
Do you have an existing cipher seed mnemonic or extended master root key you want to use?
Enter 'y' to use an existing cipher seed mnemonic, 'x' to use an extended master root key
or 'n' to create a new seed (Enter y/x/n): n
Your cipher seed can optionally be encrypted.
Input your passphrase if you wish to encrypt it (or press enter to proceed without a cipher seed passphrase):
Generating fresh cipher seed...
!!!YOU MUST WRITE DOWN THIS SEED TO BE ABLE TO RESTORE THE WALLET!!!
---------------BEGIN LND CIPHER SEED---------------
1. absorb 2. mammal 3. thank 4. isolate
5. depart 6. trigger 7. legal 8. unhappy
9. purchase 10. strong 11. effort 12. kangaroo
13. entry 14. solve 15. flower 16. mule
17. buyer 18. today 19. cancel 20. material
21. pupil 22. napkin 23. employ 24. ill
---------------END LND CIPHER SEED-----------------
!!!YOU MUST WRITE DOWN THIS SEED TO BE ABLE TO RESTORE THE WALLET!!!
lnd successfully initialized!
Let's go ahead and fetch some basic information about our node. Run the command below
command:
lncli1 getinfo
output:
{
"version": "0.17.0-beta commit=fn/v1.0.1-85-ge31d15989",
"commit_hash": "e31d1598932a814c2d44b774e5110746295df711",
"identity_pubkey": "02e0810d836946eebaeb9186c45ebb0c2d17294890ec67f488c9127de4d51dd3cd",
"alias": "02e0810d836946eebaeb",
"color": "#3399ff",
"num_pending_channels": 0,
"num_active_channels": 0,
"num_inactive_channels": 0,
"num_peers": 0, //๐๐ฟ take note of this number (our node is a bit lonely for now)
"block_height": 547,
"block_hash": "10f9fb091fd2b83736ffde6621100d6db40b09fad3676c7930dce1821c31066a",
"best_header_timestamp": "1707215728",
"synced_to_chain": false,
"synced_to_graph": false,
"testnet": false,
"chains": [
{
"chain": "bitcoin",
"network": "regtest"
}
],
....
}
Time to create an address that would receive the bitcoin sent to the lightning node wallet
command:
lncli1 newaddress np2wkh
output:
{
"address": "2N5qZ8TNWbrkaYxmsLYjEd8g6U7CrjDfHky"
}
Let's load up our Bitcoin wallet from the previous tutorial, send some juicy 100
Bitcoin from it to our lightning address above and then generate some blocks to give it some confirmations
"my oh my!!, what a man could do with some real 100
btc just sitting in a wallet ๐คค. Alight alright that's enough buddy, don't be weird let's get back to the article."
Run the commands below in sequence
command 1:
bitcoin-cli loadwallet my_first_regtest_wallet
output:
{
"name": "my_first_regtest_wallet"
}
command 2:
bitcoin-cli sendtoaddress 2N5qZ8TNWbrkaYxmsLYjEd8g6U7CrjDfHky 100
output:
3d36c8fc08f3ffd82bfa4e2aa33a63bf6c254bb46ffa1309fb9c7eb99adb3848
command 3:
bitcoin-cli generatetoaddress 10 "mhF5zQHNn7wzaaQTpzRmtsNgPgFF94fxeY"
output:
[
"2fb9db66a292f9f37260be1490833d7cb4b1d5442478be67fd3d7c48281271c5",
"7f284d403862117a21461da7cfdc3437a870fd608d0afe5e672c5c378ea2bc73",
"4b4e867a02e49145f71b662fa4fea2a30eeff0d9a689953b655222ef2e336bd4",
...
]
Let's go ahead and check our lnd1
wallet balance
command:
lncli1 walletbalance
output:
{
"total_balance": "10000000000", //๐๐ฟ sweet, our wallet was credited successfully
"confirmed_balance": "10000000000",
"unconfirmed_balance": "0",
"locked_balance": "0",
"reserved_balance_anchor_chan": "0",
"account_balance": {
"default": {
"confirmed_balance": "10000000000",
"unconfirmed_balance": "0"
}
}
}
๐ Prepare the second lightning node aka lnd2
for some action
To get the second lnd node configured and running, repeat all the steps we followed above but this time around, funding the lnd2
wallet with some bitcoin is optional as this node would be on the receiving end of our transaction.
๐ Conclusion
We'll conclude here. Thank you for staying with us until the end of the second part. In the final part, we'll walk through connecting peers, opening payment channels, and other processes necessary for a valid lightning transaction.