Skip to content

Instantly share code, notes, and snippets.

@junderw
Created February 8, 2018 02:51
Show Gist options
  • Save junderw/c4662efd1c3aa63ee891db53a2a0ad7c to your computer and use it in GitHub Desktop.
Save junderw/c4662efd1c3aa63ee891db53a2a0ad7c to your computer and use it in GitHub Desktop.
lndのDockerを利用して、A <> B <> C の2チャンネル構成を構築するためのスクリプト
#!/bin/bash
# docker, docker-compose, bash, jq, sed 必要。
# このスクリプトはLinuxで作られたので、各コマンドの細かい使い方が違ってたらすみません。
# OSXは使ったことないので。。。
#
# lndのgithubをクローンしないといけません。例えば:
#
# rm -rf /tmp/lndtest
# mkdir -p /tmp/lndtest
# cd /tmp/lndtest
# git clone https://github.com/lightningnetwork/lnd.git
# cd /tmp/lndtest/lnd/docker
#
# そして、途中で失敗した時のために、bash functionがこれです。Dockerを全滅させます。
#
# function docker_killall() {
# docker stop $(docker ps -a -q)
# docker rm $(docker ps -a -q)
# docker volume prune -f
# }
#
# lndのリポジトリ内のdockerフォルダに cd してからこのスクリプトを実行して下さい。
# 上記の例ですと /tmp/lndtest/lnd/docker とか
#
# エラーか想定外の事象が起きたら、 sleep を伸ばすと上手く行ったりします。
###### First, start up the containers
echo "Running docker-compose to start 3 lnd nodes."
export NETWORK="simnet"
docker-compose run -d --name alice lnd_btc &>/dev/null
echo "alice"
sleep 2
docker-compose run -d --name bob lnd_btc &>/dev/null
echo "bob"
sleep 2
docker-compose run -d --name carl lnd_btc &>/dev/null
echo "carl"
sleep 8
### Need to wait a while for lnd x 3 to get setup before
### running lncli getinfo etc. inside the containers
###### Now we grab the IP, pubkey, and addresses of those we need
echo ""
echo "Grabbing Bob's IP"
BOBIP=$(docker inspect bob | jq -r .[0].NetworkSettings.Networks.docker_default.IPAddress)
echo "Grabbing Carl's IP"
CARLIP=$(docker inspect carl | jq -r .[0].NetworkSettings.Networks.docker_default.IPAddress)
sleep 1
echo "Grabbing Bob's Pubkey"
BOBPUB=$(docker exec -i -t bob lncli getinfo | jq -r '.identity_pubkey' | sed -e 's/[[:space:]]*$//')
sleep 1
echo "Grabbing Carl's Pubkey"
CARLPUB=$(docker exec -i -t carl lncli getinfo | jq -r '.identity_pubkey' | sed -e 's/[[:space:]]*$//')
sleep 1
echo "Grabbing Alice's Address"
ALICEADDR=$(docker exec -i -t alice lncli newaddress np2wkh | jq -r '.address' | sed -e 's/[[:space:]]*$//')
sleep 1
echo "Grabbing Bob's Address"
BOBADDR=$(docker exec -i -t bob lncli newaddress np2wkh | jq -r '.address' | sed -e 's/[[:space:]]*$//')
sleep 1
###### Reset btcd with Alice's address as the mining address
echo ""
echo "Using Alice's address for mining, and restarting btcd"
MINING_ADDRESS=$ALICEADDR docker-compose up -d btcd &>/dev/null
sleep 6
### For some reason we need to wait 6 seconds here. Too fast and LND can't catch up.
## For some reason, calling docker-compose directly leads to all lnd
## instances just giving up and not parsing the blocks, leading to
## out of order block errors. So pass to a new bash session.
echo "Generating 400 blocks then sleeping 23 seconds so all 3 lnd can catch up"
bash -c 'docker-compose run btcctl generate 400 &>/dev/null'
sleep 23
echo "Sending 5 BTC to Bob on chain."
docker exec -i -t alice lncli sendcoins $BOBADDR 500000000 &>/dev/null
sleep 1
echo "Generating 6 blocks to confirm Alice's payment to Bob"
bash -c 'docker-compose run btcctl generate 6 &>/dev/null'
sleep 4
echo "Connecting Alice to Bob"
docker exec -i -t alice lncli connect $BOBPUB@$BOBIP &>/dev/null
sleep 1
echo "Connecting Bob to Carl"
docker exec -i -t bob lncli connect $CARLPUB@$CARLIP &>/dev/null
sleep 1
echo "Opening channel from Alice to Bob, pushing 0.06 BTC"
docker exec -i -t alice lncli openchannel $BOBPUB 10000000 6000000 &>/dev/null
sleep 5
echo "Generating 20 blocks, opening channel"
bash -c 'docker-compose run btcctl generate 20 &>/dev/null'
sleep 5
echo "Opening channel from Bob to Carl, pushing 0.03 BTC"
docker exec -i -t bob lncli openchannel $CARLPUB 10000000 3000000 &>/dev/null
sleep 5
echo "Generating 20 blocks, opening channel"
bash -c 'docker-compose run btcctl generate 20 &>/dev/null'
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment