mirror of
				https://github.com/ChristopherA/Learning-Bitcoin-from-the-Command-Line.git
				synced 2025-11-04 04:17:43 +00:00 
			
		
		
		
	First cut of new install
This commit is contained in:
		
							parent
							
								
									21ac143bd8
								
							
						
					
					
						commit
						3bd42fb22e
					
				
							
								
								
									
										267
									
								
								18_2__Interlude_Accessing_a_Second_Lightning_Node.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										267
									
								
								18_2__Interlude_Accessing_a_Second_Lightning_Node.md
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,267 @@
 | 
			
		||||
# Interlude: Accessing a Second Lightning Node
 | 
			
		||||
 | 
			
		||||
When you played with Bitcoin you were accessing an existing network, and that made it relatively easy to work with: you just turned on `bitcoind` and you were immediately interacting with the network. That's now how Lightning works. It's fundamentally a peer-to-peer network, built up from the connections between any two individual nodes. In other words, to interact with the Lightning Network, you'll need to first find a node to connect to.
 | 
			
		||||
 | 
			
		||||
There are three ways to do so:
 | 
			
		||||
 | 
			
		||||
## Asking for Information on a Node
 | 
			
		||||
 | 
			
		||||
If someone else already has a Lightning node on the network of your choice, just ask them for their ID. 
 | 
			
		||||
 | 
			
		||||
If they are are running c-lightning, they just need to use the `getinfo` command:
 | 
			
		||||
```
 | 
			
		||||
$ lightning-cli getinfo
 | 
			
		||||
lightning-cli: WARNING: default network changing in 2020: please set network=testnet in config!
 | 
			
		||||
{
 | 
			
		||||
   "id": "02f3d74746934494fa378235e5bc44cfdbb5b8779d839263fb7f9218be032f6f61",
 | 
			
		||||
   "alias": "GREENSOURCE",
 | 
			
		||||
   "color": "02f3d7",
 | 
			
		||||
   ...
 | 
			
		||||
}
 | 
			
		||||
```
 | 
			
		||||
They can then tell you their `id` (`02f3d74746934494fa378235e5bc44cfdbb5b8779d839263fb7f9218be032f6f61`).
 | 
			
		||||
 | 
			
		||||
## Creating a New c-lightning Node
 | 
			
		||||
 | 
			
		||||
However, for testing purposes, you probably want to have a second node under you own power. The easiest way to do so is to create a second c-lightning node on a new machine, using either Bitcoin Standup, per [§2.1](02_1_Setting_Up_a_Bitcoin-Core_VPS_with_StackScript.md) or compiling it by hand, per [§18.1](18_1_Verifying_Your_Lightning_Setup.md).
 | 
			
		||||
 | 
			
		||||
Once you have your node up, you can run `getinfo` to retrieve your information, as shown above.
 | 
			
		||||
 | 
			
		||||
## Creating a New LND Node
 | 
			
		||||
 | 
			
		||||
However, for our examples in the next chapter, we're instead going to create an LND node. This will allow us to demonstrate a bit of the depth of the Lightning ecosystem by showing how similar commands work on the two different platforms.
 | 
			
		||||
 | 
			
		||||
One way to do so is to run the Bitcoin Standup Scripts again on a new machine, but this time to choose LND, per [§2.1](2_1_Setting_Up_a_Bitcoin-Core_VPS_with_StackScript.md).
 | 
			
		||||
 | 
			
		||||
Another is to compile LND from source code on a machine that you've set up with a Bitcoin node, as follows.
 | 
			
		||||
 | 
			
		||||
### Compiling the LND Source Code 
 | 
			
		||||
 | 
			
		||||
First, you need to download and install Go:
 | 
			
		||||
```
 | 
			
		||||
$ wget --progress=bar:force https://dl.google.com/go/"go1.14.4"."linux"-"amd64".tar.gz -O ~standup/"go1.14.4"."linux"-"amd64".tar.gz
 | 
			
		||||
$ /bin/tar xzf ~standup/"go1.14.4"."linux"-"amd64".tar.gz -C ~standup
 | 
			
		||||
$ sudo mv ~standup/go /usr/local
 | 
			
		||||
```
 | 
			
		||||
Be sure that the Go version is the most up to date (it's `go1.14.4` at the current time), and the platform and architecture are right for your machine. (The above will work for Debian.)
 | 
			
		||||
 | 
			
		||||
Update your path:
 | 
			
		||||
```
 | 
			
		||||
$ export GOPATH=~standup/gocode
 | 
			
		||||
$ export PATH="$PATH":/usr/local/go/bin:"$GOPATH"/bin
 | 
			
		||||
```
 | 
			
		||||
Then be sure that `go` works:
 | 
			
		||||
```
 | 
			
		||||
$ go version
 | 
			
		||||
go version go1.14.4 linux/amd64
 | 
			
		||||
```
 | 
			
		||||
You'll also need `git` and `make`:
 | 
			
		||||
````
 | 
			
		||||
$ sudo apt-get install git
 | 
			
		||||
$ apt-get install build-essential
 | 
			
		||||
```
 | 
			
		||||
You're now ready to retrieve LND. Be sure to get the current verison (currently `v0.11.0-beta.rc4`).
 | 
			
		||||
```
 | 
			
		||||
$ go get -d github.com/lightningnetwork/lnd
 | 
			
		||||
```
 | 
			
		||||
And now you can compile:
 | 
			
		||||
```
 | 
			
		||||
$ cd "$GOPATH"/src/github.com/lightningnetwork/lnd
 | 
			
		||||
$ git checkout v0.11.0-beta.rc4
 | 
			
		||||
$ make
 | 
			
		||||
$ make install
 | 
			
		||||
```
 | 
			
		||||
This will install to `~/gocode/bin`, which is `$GOPATH/bin`.
 | 
			
		||||
 | 
			
		||||
And this will put it in global directories:
 | 
			
		||||
```
 | 
			
		||||
$ sudo cp $GOPATH/bin/lnd $GOPATH/bin/lncli /usr/bin
 | 
			
		||||
```
 | 
			
		||||
Finally, this will create some standard directories:
 | 
			
		||||
```
 | 
			
		||||
$ sudo mkdir -p /etc/lnd /var/lib/lnd
 | 
			
		||||
$ sudo chown standup -R /var/lib/lnd
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
### Creating an LND Config File
 | 
			
		||||
 | 
			
		||||
Unlike with c-lightning, you will need to create a default config file for LND.
 | 
			
		||||
 | 
			
		||||
First, you need to retrieve your rpcuser and rpcpassword. Here's an automated way to do so:
 | 
			
		||||
```
 | 
			
		||||
$ BITCOINRPC_USER=$(cat ~standup/.bitcoin/bitcoin.conf | grep rpcuser | awk -F = '{print $2}')
 | 
			
		||||
$ BITCOINRPC_PASS=$(cat ~standup/.bitcoin/bitcoin.conf | grep rpcpassword | awk -F = '{print $2}')
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
> :warning: **WARNING:** Obviously, never store your RPC password in a shell variable in a production environment.
 | 
			
		||||
 | 
			
		||||
Second, you need to enable ZMQ on your Bitcoind, if you didn't already in [§15.3](15_3_Receiving_Bitcoind_Notifications_with_C.md).
 | 
			
		||||
 | 
			
		||||
This requires adding the following to your `~/.bitcoin/bitcoin.conf` file:
 | 
			
		||||
```
 | 
			
		||||
zmqpubrawblock=tcp://127.0.0.1:28332
 | 
			
		||||
zmqpubrawtx=tcp://127.0.0.1:28333
 | 
			
		||||
```
 | 
			
		||||
You must then restart bitcoin. You can test that it's working as follows:
 | 
			
		||||
```
 | 
			
		||||
bitcoin-cli getzmqnotifications
 | 
			
		||||
[
 | 
			
		||||
  {
 | 
			
		||||
    "type": "pubrawblock",
 | 
			
		||||
    "address": "tcp://127.0.0.1:28332",
 | 
			
		||||
    "hwm": 1000
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "type": "pubrawtx",
 | 
			
		||||
    "address": "tcp://127.0.0.1:28333",
 | 
			
		||||
    "hwm": 1000
 | 
			
		||||
  }
 | 
			
		||||
]
 | 
			
		||||
```
 | 
			
		||||
Now you're ready to create a config file:
 | 
			
		||||
```
 | 
			
		||||
$ mkdir ~/.lnd
 | 
			
		||||
$ cat > ~/.lnd/lnd.conf << EOF
 | 
			
		||||
[Application Options]
 | 
			
		||||
maxlogfiles=3
 | 
			
		||||
maxlogfilesize=10
 | 
			
		||||
#externalip=1.1.1.1 # change to your public IP address if required.
 | 
			
		||||
alias=StandUp
 | 
			
		||||
listen=0.0.0.0:9735
 | 
			
		||||
debuglevel=debug
 | 
			
		||||
[Bitcoin]
 | 
			
		||||
bitcoin.active=1
 | 
			
		||||
bitcoin.node=bitcoind
 | 
			
		||||
bitcoin.testnet=true
 | 
			
		||||
[Bitcoind]
 | 
			
		||||
bitcoind.rpchost=localhost
 | 
			
		||||
bitcoind.rpcuser=$BITCOINRPC_USER
 | 
			
		||||
bitcoind.rpcpass=$BITCOINRPC_PASS
 | 
			
		||||
bitcoind.zmqpubrawblock=tcp://127.0.0.1:28332
 | 
			
		||||
bitcoind.zmqpubrawtx=tcp://127.0.0.1:28333
 | 
			
		||||
EOF
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
### Creating an LND Service
 | 
			
		||||
 | 
			
		||||
Finally, you can create an LND service to automatically run `lnd`:
 | 
			
		||||
```
 | 
			
		||||
$ cat > ~/lnd.service << EOF
 | 
			
		||||
# It is not recommended to modify this file in-place, because it will
 | 
			
		||||
# be overwritten during package upgrades. If you want to add further
 | 
			
		||||
# options or overwrite existing ones then use
 | 
			
		||||
# $ systemctl edit lnd.service
 | 
			
		||||
# See "man systemd.service" for details.
 | 
			
		||||
# Note that almost all daemon options could be specified in
 | 
			
		||||
# /etc/lnd/lnd.conf, except for those explicitly specified as arguments
 | 
			
		||||
# in ExecStart=
 | 
			
		||||
[Unit]
 | 
			
		||||
Description=LND Lightning Network Daemon
 | 
			
		||||
Requires=bitcoind.service
 | 
			
		||||
After=bitcoind.service
 | 
			
		||||
[Service]
 | 
			
		||||
ExecStart=/usr/bin/lnd
 | 
			
		||||
ExecStop=/usr/bin/lncli --lnddir /var/lib/lnd stop
 | 
			
		||||
PIDFile=/run/lnd/lnd.pid
 | 
			
		||||
User=standup
 | 
			
		||||
Type=simple
 | 
			
		||||
KillMode=process
 | 
			
		||||
TimeoutStartSec=60
 | 
			
		||||
TimeoutStopSec=60
 | 
			
		||||
Restart=always
 | 
			
		||||
RestartSec=60
 | 
			
		||||
[Install]
 | 
			
		||||
WantedBy=multi-user.target
 | 
			
		||||
EOF
 | 
			
		||||
```
 | 
			
		||||
You'll then need to install that:
 | 
			
		||||
```
 | 
			
		||||
$ sudo cp ~/lnd.service /etc/systemd/system
 | 
			
		||||
$ sudo systemctl enable lnd
 | 
			
		||||
$ sudo systemctl start lnd
 | 
			
		||||
```
 | 
			
		||||
(Expect this to take a minute the first time.)
 | 
			
		||||
 | 
			
		||||
### Creating a Wallet
 | 
			
		||||
 | 
			
		||||
The first time you run LND, you must create a wallet:
 | 
			
		||||
```
 | 
			
		||||
$ lncli --network=testnet create
 | 
			
		||||
```
 | 
			
		||||
It will ask you for a password and then ask if you want to enter an existing mnemonic (just hit `n` for the latter one).
 | 
			
		||||
 | 
			
		||||
You should now have a functioning `lnd`, which you can verify with `getinfo`:
 | 
			
		||||
```
 | 
			
		||||
$ lncli --network=testnet getinfo
 | 
			
		||||
{
 | 
			
		||||
    "version": "0.11.0-beta.rc4 commit=v0.11.0-beta.rc4",
 | 
			
		||||
    "commit_hash": "fc12656a1a62e5d69430bba6e4feb8cfbaf21542",
 | 
			
		||||
    "identity_pubkey": "032a7572dc013b6382cde391d79f292ced27305aa4162ec3906279fc4334602543",
 | 
			
		||||
    "alias": "StandUp",
 | 
			
		||||
    "color": "#3399ff",
 | 
			
		||||
    "num_pending_channels": 0,
 | 
			
		||||
    "num_active_channels": 0,
 | 
			
		||||
    "num_inactive_channels": 0,
 | 
			
		||||
    "num_peers": 2,
 | 
			
		||||
    "block_height": 1862848,
 | 
			
		||||
    "block_hash": "000000000000000ecb6fd95e1f486283d48683aa3111b6c23144a2056f5a1532",
 | 
			
		||||
    "best_header_timestamp": "1602632294",
 | 
			
		||||
    "synced_to_chain": true,
 | 
			
		||||
    "synced_to_graph": false,
 | 
			
		||||
    "testnet": true,
 | 
			
		||||
    "chains": [
 | 
			
		||||
        {
 | 
			
		||||
            "chain": "bitcoin",
 | 
			
		||||
            "network": "testnet"
 | 
			
		||||
        }
 | 
			
		||||
    ],
 | 
			
		||||
    "uris": [
 | 
			
		||||
    ],
 | 
			
		||||
    "features": {
 | 
			
		||||
        "0": {
 | 
			
		||||
            "name": "data-loss-protect",
 | 
			
		||||
            "is_required": true,
 | 
			
		||||
            "is_known": true
 | 
			
		||||
        },
 | 
			
		||||
        "5": {
 | 
			
		||||
            "name": "upfront-shutdown-script",
 | 
			
		||||
            "is_required": false,
 | 
			
		||||
            "is_known": true
 | 
			
		||||
        },
 | 
			
		||||
        "7": {
 | 
			
		||||
            "name": "gossip-queries",
 | 
			
		||||
            "is_required": false,
 | 
			
		||||
            "is_known": true
 | 
			
		||||
        },
 | 
			
		||||
        "9": {
 | 
			
		||||
            "name": "tlv-onion",
 | 
			
		||||
            "is_required": false,
 | 
			
		||||
            "is_known": true
 | 
			
		||||
        },
 | 
			
		||||
        "13": {
 | 
			
		||||
            "name": "static-remote-key",
 | 
			
		||||
            "is_required": false,
 | 
			
		||||
            "is_known": true
 | 
			
		||||
        },
 | 
			
		||||
        "15": {
 | 
			
		||||
            "name": "payment-addr",
 | 
			
		||||
            "is_required": false,
 | 
			
		||||
            "is_known": true
 | 
			
		||||
        },
 | 
			
		||||
        "17": {
 | 
			
		||||
            "name": "multi-path-payments",
 | 
			
		||||
            "is_required": false,
 | 
			
		||||
            "is_known": true
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
```
 | 
			
		||||
This node's ID is `032a7572dc013b6382cde391d79f292ced27305aa4162ec3906279fc4334602543`.
 | 
			
		||||
 | 
			
		||||
## Summary: Accessing a Second Lightning Node
 | 
			
		||||
 | 
			
		||||
You always need two Lightning nodes to form a channel. If you don't have someone else who is testing things out with you, you're going to need to create a second one, either using c-lightning or (as we will in our examples) LND
 | 
			
		||||
 | 
			
		||||
## What's Next?
 | 
			
		||||
 | 
			
		||||
Continue "Understanding Your Lightning Setup" with [§18.3: Setting Up_a_Channel](18_3_Setting_Up_a_Channel.md).
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user