# Setup Lnd Development Environment
## Metadata
**Status**:: #x
**Zettel**:: #zettel/fleeting
**Created**:: [[2024-03-18]]
**Parent**:: [[BTC HTLC Cross-Chain PoC]]
**URL**:: [github.com](https://github.com/lightningnetwork/lnd)
## Add RPC Methods
- Modify `.proto` files
- Run `make rpc` to generate codes.
## Database Migrations
Lnd uses the key-value database `channeldb` by default.
### channeldb
- Add a `tlv.Type` constant, for example, in `channeldb/invoices.go`
- Add the new field to `tlv.NewStream` in `serializeX` and `deserializeX`
### sqldb
- Add migration files ([examples](https://github.com/golang-migrate/migrate/tree/master/database/postgres/examples/migrations))
- Run `make sqlc`
## Create A Test Clsuter
[doitian/lndx-env (github.com)](https://github.com/doitian/lndx-env)
### Bitcoind
Download from <https://bitcoin.org/en/download>
Create a directory `bitcoind` and create the file `bitcoin.conf` in it
```
server=1
regtest=1
[regtest]
rpcport=8332
rpcuser=btc
rpcpassword=btc
zmqpubrawblock=tcp://127.0.0.1:28332
zmqpubrawtx=tcp://127.0.0.1:28333
```
Start the server
```
bitcoind -conf="$(pwd)/bitcoind/bitcoin.conf" -datadir="$(pwd)/bitcoind"
```
Create wallet
```
bitcoin-cli -conf="$(pwd)/bitcoind/bitcoin.conf" createwallet "dev"
```
Load wallet on restart
```
bitcoin-cli -conf="$(pwd)/bitcoind/bitcoin.conf" loadwallet "dev"
```
Mine 101 blocks and check balance
```
bitcoin-cli -conf="$(pwd)/bitcoind/bitcoin.conf" -generate 101
bitcoin-cli -conf="$(pwd)/bitcoind/bitcoin.conf" getbalance
```
### lnd
Create a directory `bob` and create the file `lnd.conf` in it:
```
[Application Options]
listen=0.0.0.0:9735
rpclisten=localhost:10009
restlisten=0.0.0.0:8080
[Bitcoin]
bitcoin.regtest=1
bitcoin.node=bitcoind
[Bitcoind]
bitcoind.rpchost=localhost:18443
bitcoind.rpcuser=btc
bitcoind.rpcpass=btc
bitcoind.zmqpubrawblock=tcp://127.0.0.1:28332
bitcoind.zmqpubrawtx=tcp://127.0.0.1:28333
```
Start the process
```
lnd --lnddir="$(pwd)/bob"
```
Create an account
```
lncli -n regtest --lnddir="$(pwd)/bob" --rpcserver localhost:10009 create
```
Unlock the account on restart
```
lncli -n regtest --lnddir="$(pwd)/bob" --rpcserver localhost:10009 unlock
```
Check the info
```
lncli -n regtest --lnddir="$(pwd)/bob" --rpcserver localhost:10009 getinfo
```
Add more nodes by duplicating `lnd.conf` in new directories and modifying the ports in `[Application Options]`.
### Send Payment
<https://github.com/lightningnetwork/lnd/tree/master/docker>
Add invoice:
```
$ lncli -n regtest --lnddir="$(pwd)/bob" --rpcserver localhost:11009 addinvoice --amt=10000
{
"r_hash": "<your_random_rhash_here>",
"pay_req": "<encoded_invoice>",
}
```
Send payment in another node, e.g., Alice on RPC port 11009:
```
lncli -n regtest --lnddir="$(pwd)/alice" --rpcserver localhost:11009 sendpayment --pay_req=<encoded_invoice>
```
### Shell Aliases
```shell
alias bitcoind="command bitcoind -conf='$(pwd)/bitcoind/bitcoin.conf' -datadir='$(pwd)/bitcoind'"
alias bitcoin-cli="command bitcoin-cli -conf='$(pwd)/bitcoind/bitcoin.conf'"
alias blnd="lnd --lnddir='$(pwd)/bob'"
alias blncli="lncli -n regtest --lnddir='$(pwd)/bob' --rpcserver localhost:10009"
alias clnd="lnd --lnddir='$(pwd)/charlie'"
alias clncli="lncli -n regtest --lnddir='$(pwd)/charlie' --rpcserver localhost:11009"
alias ilnd="lnd --lnddir='$(pwd)/ingrid'"
alias ilncli="lncli -n regtest --lnddir='$(pwd)/ingrid' --rpcserver localhost:12009"
```
### Start Processes via Honcho
Procfile
```
bitcoind: bitcoind -conf="$(pwd)/bitcoind/bitcoin.conf" -datadir="$(pwd)/bitcoind"
bob: lnd --lnddir="$(pwd)/bob"
charlie: lnd --lnddir="$(pwd)/charlie"
ingrid: lnd --lnddir="$(pwd)/ingrid"
```
Start all processes
```
pip install honcho
```
To start lnd with pre-created wallets, use the `--noseedbackup` option.