From 1b8f94e6b4162f4427d4834100c19719caaca485 Mon Sep 17 00:00:00 2001 From: Matthias Debernardini Date: Tue, 9 Feb 2021 11:47:11 +0100 Subject: [PATCH] Adding docker example for payment round robin --- code/perpetualpayments/Makefile | 16 ++++ code/perpetualpayments/bitcoind/Dockerfile | 46 +++++++++ code/perpetualpayments/bitcoind/bashrc | 5 + .../bitcoind/bitcoind-entrypoint.sh | 23 +++++ .../bitcoind/bitcoind/bitcoin.conf | 22 +++++ .../bitcoind/bitcoind/keys/demo_address.txt | 1 + .../bitcoind/bitcoind/keys/demo_mnemonic.txt | 1 + .../bitcoind/bitcoind/keys/demo_privkey.txt | 1 + code/perpetualpayments/bitcoind/mine.sh | 20 ++++ code/perpetualpayments/c-lightning/Dockerfile | 33 +++++++ code/perpetualpayments/c-lightning/bashrc | 4 + .../c-lightning/c-lightning-entrypoint.sh | 17 ++++ .../c-lightning/fund-c-lightning.sh | 22 +++++ .../c-lightning/lightningd/config | 9 ++ code/perpetualpayments/c-lightning/logtail.sh | 5 + .../c-lightning/wait-for-bitcoind.sh | 16 ++++ code/perpetualpayments/docker-compose.yml | 95 +++++++++++++++++++ code/perpetualpayments/fund-all-nodes.sh | 36 +++++++ .../perpetualpayments/make-network-payloop.sh | 23 +++++ code/perpetualpayments/make-topology.sh | 38 ++++++++ code/perpetualpayments/payment-loop.sh | 37 ++++++++ 21 files changed, 470 insertions(+) create mode 100644 code/perpetualpayments/Makefile create mode 100644 code/perpetualpayments/bitcoind/Dockerfile create mode 100644 code/perpetualpayments/bitcoind/bashrc create mode 100644 code/perpetualpayments/bitcoind/bitcoind-entrypoint.sh create mode 100644 code/perpetualpayments/bitcoind/bitcoind/bitcoin.conf create mode 100644 code/perpetualpayments/bitcoind/bitcoind/keys/demo_address.txt create mode 100644 code/perpetualpayments/bitcoind/bitcoind/keys/demo_mnemonic.txt create mode 100644 code/perpetualpayments/bitcoind/bitcoind/keys/demo_privkey.txt create mode 100755 code/perpetualpayments/bitcoind/mine.sh create mode 100644 code/perpetualpayments/c-lightning/Dockerfile create mode 100644 code/perpetualpayments/c-lightning/bashrc create mode 100644 code/perpetualpayments/c-lightning/c-lightning-entrypoint.sh create mode 100644 code/perpetualpayments/c-lightning/fund-c-lightning.sh create mode 100644 code/perpetualpayments/c-lightning/lightningd/config create mode 100644 code/perpetualpayments/c-lightning/logtail.sh create mode 100644 code/perpetualpayments/c-lightning/wait-for-bitcoind.sh create mode 100644 code/perpetualpayments/docker-compose.yml create mode 100644 code/perpetualpayments/fund-all-nodes.sh create mode 100644 code/perpetualpayments/make-network-payloop.sh create mode 100644 code/perpetualpayments/make-topology.sh create mode 100644 code/perpetualpayments/payment-loop.sh diff --git a/code/perpetualpayments/Makefile b/code/perpetualpayments/Makefile new file mode 100644 index 0000000..ead00f7 --- /dev/null +++ b/code/perpetualpayments/Makefile @@ -0,0 +1,16 @@ + +REGISTRY=docker.com +NAME=lnbook +CONTAINERS=bitcoind c-lightning + +all: build-all push-all + +build-all: + for container in ${CONTAINERS}; do \ + docker build -t ${NAME}/$$container $$container -f $$container/Dockerfile; \ + done + +push-all: + for container in ${CONTAINERS}; do \ + docker push ${NAME}/$$container; \ + done diff --git a/code/perpetualpayments/bitcoind/Dockerfile b/code/perpetualpayments/bitcoind/Dockerfile new file mode 100644 index 0000000..b2555b6 --- /dev/null +++ b/code/perpetualpayments/bitcoind/Dockerfile @@ -0,0 +1,46 @@ +FROM ubuntu:20.04 AS bitcoind-base + +RUN apt update && apt install -yqq \ + curl gosu jq bash-completion + +ENV BITCOIND_VERSION 0.21.0 +# Install binaries for Bitcoin Core +ADD https://bitcoincore.org/bin/bitcoin-core-${BITCOIND_VERSION}/bitcoin-${BITCOIND_VERSION}-x86_64-linux-gnu.tar.gz /usr/local +RUN cd /usr/local/ \ + && tar -zxf bitcoin-${BITCOIND_VERSION}-x86_64-linux-gnu.tar.gz \ + && cd bitcoin-${BITCOIND_VERSION} \ + && install bin/* /usr/local/bin \ + && install include/* /usr/local/include \ + && install -v lib/* /usr/local/lib + +ENV GH_URL https://raw.githubusercontent.com/bitcoin/bitcoin/master/ +ENV BC /usr/share/bash-completion/completions/ +ADD $GH_URL/contrib/bitcoin-cli.bash-completion $BC/bitcoin-cli +ADD $GH_URL/contrib/bitcoind.bash-completion $BC/bitcoind +ADD $GH_URL/contrib/bitcoin-tx.bash-completion $BC/bitcoin-tx + +FROM bitcoind-base AS bitcoind + +ADD bitcoind /bitcoind +RUN ln -s /bitcoind /root/. + +ADD bashrc /root/.bashrc +ADD bitcoind-entrypoint.sh /usr/local/bin +RUN chmod +x /usr/local/bin/bitcoind-entrypoint.sh +ADD mine.sh /usr/local/bin +RUN chmod +x /usr/local/bin/mine.sh + +# bitcoind P2P +EXPOSE 18444/tcp +# bitcoind regtest RPC +EXPOSE 18443/tcp +# zmqpubrawblock +EXPOSE 12005/tcp +# zmqpubrawtx +EXPOSE 12006/tcp + +WORKDIR /bitcoind +ENTRYPOINT ["/usr/local/bin/bitcoind-entrypoint.sh"] + +# Mine new block every 10 seconds +CMD ["/usr/local/bin/mine.sh"] diff --git a/code/perpetualpayments/bitcoind/bashrc b/code/perpetualpayments/bitcoind/bashrc new file mode 100644 index 0000000..5f4b902 --- /dev/null +++ b/code/perpetualpayments/bitcoind/bashrc @@ -0,0 +1,5 @@ +# Use bash-completion, if available +alias bitcoin-cli="bitcoin-cli -datadir=/bitcoind" + +[[ $PS1 && -f /usr/share/bash-completion/bash_completion ]] && \ + . /usr/share/bash-completion/bash_completion diff --git a/code/perpetualpayments/bitcoind/bitcoind-entrypoint.sh b/code/perpetualpayments/bitcoind/bitcoind-entrypoint.sh new file mode 100644 index 0000000..167ef66 --- /dev/null +++ b/code/perpetualpayments/bitcoind/bitcoind-entrypoint.sh @@ -0,0 +1,23 @@ +#!/bin/bash +set -Eeuo pipefail + +echo Starting bitcoind... +bitcoind -datadir=/bitcoind -daemon +until bitcoin-cli -datadir=/bitcoind getblockchaininfo > /dev/null 2>&1 +do + sleep 1 +done +echo bitcoind started +export address=`cat /bitcoind/keys/demo_address.txt` +export privkey=`cat /bitcoind/keys/demo_privkey.txt` +echo "================================================" +echo "Importing demo private key" +echo "Bitcoin address: " ${address} +echo "Private key: " ${privkey} +echo "================================================" +bitcoin-cli -datadir=/bitcoind createwallet regtest +bitcoin-cli -datadir=/bitcoind importprivkey $privkey + +# Executing CMD +echo "$@" +exec "$@" diff --git a/code/perpetualpayments/bitcoind/bitcoind/bitcoin.conf b/code/perpetualpayments/bitcoind/bitcoind/bitcoin.conf new file mode 100644 index 0000000..36d6903 --- /dev/null +++ b/code/perpetualpayments/bitcoind/bitcoind/bitcoin.conf @@ -0,0 +1,22 @@ +regtest=1 +server=1 +debuglogfile=debug.log +debug=1 +txindex=1 +printtoconsole=0 + +[regtest] +fallbackfee=0.000001 +port=18444 +noconnect=1 +dnsseed=0 +dns=0 +upnp=0 +onlynet=ipv4 +rpcport=18443 +rpcbind=0.0.0.0 +rpcallowip=0.0.0.0/0 +rpcuser=regtest +rpcpassword=regtest +zmqpubrawblock=tcp://0.0.0.0:12005 +zmqpubrawtx=tcp://0.0.0.0:12006 diff --git a/code/perpetualpayments/bitcoind/bitcoind/keys/demo_address.txt b/code/perpetualpayments/bitcoind/bitcoind/keys/demo_address.txt new file mode 100644 index 0000000..ae62ea3 --- /dev/null +++ b/code/perpetualpayments/bitcoind/bitcoind/keys/demo_address.txt @@ -0,0 +1 @@ +2NBKgwSWY5qEmfN2Br4WtMDGuamjpuUc5q1 diff --git a/code/perpetualpayments/bitcoind/bitcoind/keys/demo_mnemonic.txt b/code/perpetualpayments/bitcoind/bitcoind/keys/demo_mnemonic.txt new file mode 100644 index 0000000..37f503c --- /dev/null +++ b/code/perpetualpayments/bitcoind/bitcoind/keys/demo_mnemonic.txt @@ -0,0 +1 @@ +electric flash rain cloud umbrella energy charge ozone air thunder crack wet diff --git a/code/perpetualpayments/bitcoind/bitcoind/keys/demo_privkey.txt b/code/perpetualpayments/bitcoind/bitcoind/keys/demo_privkey.txt new file mode 100644 index 0000000..6acc8df --- /dev/null +++ b/code/perpetualpayments/bitcoind/bitcoind/keys/demo_privkey.txt @@ -0,0 +1 @@ +cSaejkcWwU25jMweWEewRSsrVQq2FGTij1xjXv4x1XvxVRF1ZCr3 diff --git a/code/perpetualpayments/bitcoind/mine.sh b/code/perpetualpayments/bitcoind/mine.sh new file mode 100755 index 0000000..5e08f57 --- /dev/null +++ b/code/perpetualpayments/bitcoind/mine.sh @@ -0,0 +1,20 @@ +#!/bin/bash +set -Eeuo pipefail + +export address=`cat /bitcoind/keys/demo_address.txt` +export privkey=`cat /bitcoind/keys/demo_privkey.txt` +echo "================================================" +echo "Bitcoin address: " ${address} +echo "Private key: " ${privkey} +echo "Balance:" `bitcoin-cli -datadir=/bitcoind getbalance` +echo "================================================" +echo "Mining 101 blocks to unlock some bitcoin" +bitcoin-cli -datadir=/bitcoind generatetoaddress 101 $address +echo "Mining 1 block every 10 seconds" +while sleep 10; do \ + bitcoin-cli -datadir=/bitcoind generatetoaddress 1 $address; \ + echo "Balance:" `bitcoin-cli -datadir=/bitcoind getbalance`; \ +done + +# If loop is interrupted, stop bitcoind +bitcoin-cli -datadir=/bitcoind stop diff --git a/code/perpetualpayments/c-lightning/Dockerfile b/code/perpetualpayments/c-lightning/Dockerfile new file mode 100644 index 0000000..f3df06e --- /dev/null +++ b/code/perpetualpayments/c-lightning/Dockerfile @@ -0,0 +1,33 @@ +FROM lnbook/bitcoind AS c-lightning-base + +# Install software-properties-common to add apt repositories +RUN apt update && apt install -yqq \ + software-properties-common + +# c-lightning +ENV C_LIGHTNING_VER 0.9.3~20210120202101201901~ubuntu20.04.1 +RUN add-apt-repository -u ppa:lightningnetwork/ppa +RUN apt-get install -yqq \ + lightningd=${C_LIGHTNING_VER} + +ADD https://raw.githubusercontent.com/ElementsProject/lightning/master/contrib/lightning-cli.bash-completion /usr/share/bash-completion/completions/lightning-cli + +FROM c-lightning-base AS c-lightning-run + +ADD lightningd /lightningd +WORKDIR /lightningd +RUN ln -s /lightningd /root/.lightning + +ADD bashrc /root/.bashrc +ADD c-lightning-entrypoint.sh /usr/local/bin +RUN chmod +x /usr/local/bin/c-lightning-entrypoint.sh +ADD logtail.sh /usr/local/bin +RUN chmod +x /usr/local/bin/logtail.sh +ADD wait-for-bitcoind.sh /usr/local/bin +RUN chmod +x /usr/local/bin/wait-for-bitcoind.sh + +EXPOSE 9735 9835 +ENTRYPOINT ["/usr/local/bin/c-lightning-entrypoint.sh"] + +# Show logs from beginning and keep following +CMD ["/usr/local/bin/logtail.sh"] diff --git a/code/perpetualpayments/c-lightning/bashrc b/code/perpetualpayments/c-lightning/bashrc new file mode 100644 index 0000000..e0cd922 --- /dev/null +++ b/code/perpetualpayments/c-lightning/bashrc @@ -0,0 +1,4 @@ +alias lightning-cli="lightning-cli --lightning-dir=/lightningd" + +[[ $PS1 && -f /usr/share/bash-completion/bash_completion ]] && \ + . /usr/share/bash-completion/bash_completion diff --git a/code/perpetualpayments/c-lightning/c-lightning-entrypoint.sh b/code/perpetualpayments/c-lightning/c-lightning-entrypoint.sh new file mode 100644 index 0000000..4724a89 --- /dev/null +++ b/code/perpetualpayments/c-lightning/c-lightning-entrypoint.sh @@ -0,0 +1,17 @@ +#!/bin/bash +set -Eeuo pipefail + +source /usr/local/bin/wait-for-bitcoind.sh + +echo Starting c-lightning... +lightningd --lightning-dir=/lightningd --daemon + +until lightning-cli --lightning-dir=/lightningd getinfo > /dev/null 2>&1 +do + sleep 1 +done + +echo "Startup complete" + +echo "$@" +exec "$@" diff --git a/code/perpetualpayments/c-lightning/fund-c-lightning.sh b/code/perpetualpayments/c-lightning/fund-c-lightning.sh new file mode 100644 index 0000000..11f536f --- /dev/null +++ b/code/perpetualpayments/c-lightning/fund-c-lightning.sh @@ -0,0 +1,22 @@ +#!/bin/bash + +# Generate a new receiving address for LND wallet +address=$(lightning-cli --lightning-dir=/lightningd newaddr | jq .address) + +# Ask Bitcoin Core to send 10 BTC to the address, using JSON-RPC call +curl --user regtest:regtest \ + -H 'content-type: text/plain;' \ + http://bitcoind:18443/ \ + --data-binary @- < /dev/null 2>&1 +do + echo -n "." + sleep 1 +done + +echo Waiting for bitcoind to mine blocks... +until bitcoin-cli -rpcconnect=bitcoind -rpcport=18443 -rpcuser=regtest -rpcpassword=regtest getbalance | jq -e ". > 0" > /dev/null 2>&1 +do + echo -n "." + sleep 1 +done diff --git a/code/perpetualpayments/docker-compose.yml b/code/perpetualpayments/docker-compose.yml new file mode 100644 index 0000000..27de45d --- /dev/null +++ b/code/perpetualpayments/docker-compose.yml @@ -0,0 +1,95 @@ +version: "3.3" +networks: + lnnet: + +services: + bitcoind: + container_name: bitcoind + build: + context: bitcoind + image: lnbook/bitcoind:latest + networks: + - lnnet + expose: + - "18443" + - "12005" + - "12006" + restart: always + + Aa: + container_name: Aa + build: + context: c-lightning + image: lnbook/c-lightning:latest + networks: + - lnnet + expose: + - "9735" + restart: always + depends_on: + - bitcoind + + Bb: + container_name: Bb + build: + context: c-lightning + image: lnbook/c-lightning:latest + networks: + - lnnet + expose: + - "9735" + restart: always + depends_on: + - bitcoind + + Cc: + container_name: Cc + build: + context: c-lightning + image: lnbook/c-lightning:latest + networks: + - lnnet + expose: + - "9735" + restart: always + depends_on: + - bitcoind + + Dd: + container_name: Dd + build: + context: c-lightning + image: lnbook/c-lightning:latest + networks: + - lnnet + expose: + - "9735" + restart: always + depends_on: + - bitcoind + + Ee: + container_name: Ee + build: + context: c-lightning + image: lnbook/c-lightning:latest + networks: + - lnnet + expose: + - "9735" + restart: always + depends_on: + - bitcoind + + Ff: + container_name: Ff + build: + context: c-lightning + image: lnbook/c-lightning:latest + networks: + - lnnet + expose: + - "9735" + restart: always + depends_on: + - bitcoind diff --git a/code/perpetualpayments/fund-all-nodes.sh b/code/perpetualpayments/fund-all-nodes.sh new file mode 100644 index 0000000..c82111a --- /dev/null +++ b/code/perpetualpayments/fund-all-nodes.sh @@ -0,0 +1,36 @@ +#!/bin/bash + +#docker-compose exec -T Aa lightning-cli getinfo +#docker-compose exec -T Bb lightning-cli getinfo +#docker-compose exec -T Cc lightning-cli getinfo +#docker-compose exec -T Ee lightning-cli getinfo +#docker-compose exec -T Dd lightning-cli getinfo +#docker-compose exec -T Ff lightning-cli getinfo + +echo getting addresses +a=$(docker-compose exec -T Aa bash -c "lightning-cli newaddr | jq -r .bech32") +echo $a +b=$(docker-compose exec -T Bb bash -c "lightning-cli newaddr | jq -r .bech32") +echo $b +c=$(docker-compose exec -T Cc bash -c "lightning-cli newaddr | jq -r .bech32") +echo $c +d=$(docker-compose exec -T Dd bash -c "lightning-cli newaddr | jq -r .bech32") +echo $d +e=$(docker-compose exec -T Ee bash -c "lightning-cli newaddr | jq -r .bech32") +echo $e +f=$(docker-compose exec -T Ff bash -c "lightning-cli newaddr | jq -r .bech32") +echo $f + +echo funding wallets +ba=$(docker-compose exec -T bitcoind bash -c "bitcoin-cli -regtest -rpcport=18443 -rpcuser=regtest -rpcpassword=regtest sendtoaddress $a 10") +echo $ba +bb=$(docker-compose exec -T bitcoind bash -c "bitcoin-cli -regtest -rpcport=18443 -rpcuser=regtest -rpcpassword=regtest sendtoaddress $b 10") +echo $bb +bc=$(docker-compose exec -T bitcoind bash -c "bitcoin-cli -regtest -rpcport=18443 -rpcuser=regtest -rpcpassword=regtest sendtoaddress $c 10") +echo $bc +bd=$(docker-compose exec -T bitcoind bash -c "bitcoin-cli -regtest -rpcport=18443 -rpcuser=regtest -rpcpassword=regtest sendtoaddress $d 10") +echo $bd +be=$(docker-compose exec -T bitcoind bash -c "bitcoin-cli -regtest -rpcport=18443 -rpcuser=regtest -rpcpassword=regtest sendtoaddress $e 10") +echo $be +bf=$(docker-compose exec -T bitcoind bash -c "bitcoin-cli -regtest -rpcport=18443 -rpcuser=regtest -rpcpassword=regtest sendtoaddress $f 10") +echo $bf diff --git a/code/perpetualpayments/make-network-payloop.sh b/code/perpetualpayments/make-network-payloop.sh new file mode 100644 index 0000000..350e8ec --- /dev/null +++ b/code/perpetualpayments/make-network-payloop.sh @@ -0,0 +1,23 @@ +#!/bin/bash + +#docker-compose up -d && bash make-network-payloop.sh +echo Wait for network to load for 180 sec +sleep 180 + +echo Funding all nodes +source fund-all-nodes.sh +sleep 60 +echo Making topology +source make-topology.sh +sleep 60 +echo Entering the payment loop +source payment-loop.sh + +#docker-compose exec -T Aa lightning-cli +#docker-compose exec -T Bb lightning-cli +#docker-compose exec -T Cc lightning-cli +#docker-compose exec -T Ee lightning-cli +#docker-compose exec -T Dd lightning-cli +#docker-compose exec -T Ff lightning-cli + +exit 0 diff --git a/code/perpetualpayments/make-topology.sh b/code/perpetualpayments/make-topology.sh new file mode 100644 index 0000000..91bda78 --- /dev/null +++ b/code/perpetualpayments/make-topology.sh @@ -0,0 +1,38 @@ +#!/bin/bash + +echo Getting node IDs +a_ID=$(docker-compose exec -T Aa bash -c "lightning-cli getinfo | jq -r .id") +b_ID=$(docker-compose exec -T Bb bash -c "lightning-cli getinfo | jq -r .id") +c_ID=$(docker-compose exec -T Cc bash -c "lightning-cli getinfo | jq -r .id") +d_ID=$(docker-compose exec -T Dd bash -c "lightning-cli getinfo | jq -r .id") +e_ID=$(docker-compose exec -T Ee bash -c "lightning-cli getinfo | jq -r .id") +f_ID=$(docker-compose exec -T Ff bash -c "lightning-cli getinfo | jq -r .id") + +# Let's tell everyone what we found! +#echo A ${a_ID} +#echo B ${b_ID} +#echo C ${c_ID} +#echo D ${d_ID} +#echo E ${e_ID} +#echo F ${f_ID} + +echo Setting up channels... +echo A to B +docker-compose exec -T Aa lightning-cli connect ${b_ID}@Bb +docker-compose exec -T Aa lightning-cli -k fundchannel id=${b_ID} amount=1000000sat minconf=0 +echo B to C +docker-compose exec -T Bb lightning-cli connect ${c_ID}@Cc +docker-compose exec -T Bb lightning-cli -k fundchannel id=${c_ID} amount=1000000sat minconf=0 +echo C to D +docker-compose exec -T Cc lightning-cli connect ${d_ID}@Dd +docker-compose exec -T Cc lightning-cli -k fundchannel id=${d_ID} amount=1000000sat minconf=0 +echo D to E +docker-compose exec -T Dd lightning-cli connect ${e_ID}@Ee +docker-compose exec -T Dd lightning-cli -k fundchannel id=${e_ID} amount=1000000sat minconf=0 +echo E to F +docker-compose exec -T Ee lightning-cli connect ${f_ID}@Ff +docker-compose exec -T Ee lightning-cli -k fundchannel id=${f_ID} amount=1000000sat minconf=0 +echo F to A +docker-compose exec -T Ff lightning-cli connect ${a_ID}@Aa +docker-compose exec -T Ff lightning-cli -k fundchannel id=${a_ID} amount=1000000sat minconf=0 + diff --git a/code/perpetualpayments/payment-loop.sh b/code/perpetualpayments/payment-loop.sh new file mode 100644 index 0000000..78fd158 --- /dev/null +++ b/code/perpetualpayments/payment-loop.sh @@ -0,0 +1,37 @@ +#!/bin/bash + +echo pay in a loop + +start=$(date +"%T") + +for i in {1..2} +do + echo A pays B + INV=$(docker-compose exec -T Bb bash -c "lightning-cli invoice 10000sat inva{$i} desc | jq -r .bolt11") + docker-compose exec -T Aa bash -c "lightning-cli pay $INV" + + echo B pays C + INV=$(docker-compose exec -T Cc bash -c "lightning-cli invoice 10000sat invb{$i} desc | jq -r .bolt11") + docker-compose exec -T Bb bash -c "lightning-cli pay $INV" + + echo C pays D + INV=$(docker-compose exec -T Dd bash -c "lightning-cli invoice 10000sat invc{$i} desc | jq -r .bolt11") + docker-compose exec -T Cc bash -c "lightning-cli pay $INV" + + echo D pays E + INV=$(docker-compose exec -T Ee bash -c "lightning-cli invoice 10000sat invd{$i} desc | jq -r .bolt11") + docker-compose exec -T Dd bash -c "lightning-cli pay $INV" + + echo E pays F + INV=$(docker-compose exec -T Ff bash -c "lightning-cli invoice 10000sat inve{$i} desc | jq -r .bolt11") + docker-compose exec -T Ee bash -c "lightning-cli pay $INV" + + echo F pays A + INV=$(docker-compose exec -T Aa bash -c "lightning-cli invoice 10000sat invf{$i} desc | jq -r .bolt11") + docker-compose exec -T Ff bash -c "lightning-cli pay $INV" +done +stop=$(date +"%T") + +echo time to finish +echo start $start +echo stop $stop