Lightning - andyceo/documentation GitHub Wiki
Докерфайл:
FROM ubuntu:latest
USER root
LABEL maintainer="[email protected]"
RUN apt-get update
RUN apt-get install -y wget
RUN apt-get install -y git
RUN apt-get install -y make
ENV GOVERSION 1.8
ENV GOROOT /opt/go
ENV GOPATH /root/.go
ENV PATH = PATH=$PATH:$GOPATH/bin
RUN cd /opt && wget https://storage.googleapis.com/golang/go${GOVERSION}.linux-amd64.tar.gz && \
tar zxf go${GOVERSION}.linux-amd64.tar.gz && rm go${GOVERSION}.linux-amd64.tar.gz && \
ln -s /opt/go/bin/go /usr/bin/ && \
mkdir $GOPATH
RUN go version
RUN go get -u github.com/Masterminds/glide
WORKDIR $GOPATH/src/github.com/Masterminds/glide
RUN make install
RUN git clone https://github.com/lightningnetwork/lnd $GOPATH/src/github.com/lightningnetwork/lnd
WORKDIR $GOPATH/src/github.com/lightningnetwork/lnd
RUN glide install
RUN go install . ./cmd/...
# RUN go install; go test -v -p 1 $(go list ./... | grep -v '/vendor/')
RUN git clone https://github.com/roasbeef/btcd $GOPATH/src/github.com/roasbeef/btcd
WORKDIR $GOPATH/src/github.com/roasbeef/btcd
RUN glide install
RUN go install . ./cmd/...
RUN mkdir ~/.btcd ~/.btcd/data
WORKDIR ${GOPATH}/bin
EXPOSE 10001
EXPOSE 10002
EXPOSE 10003
EXPOSE 10011
EXPOSE 10012
EXPOSE 10013
EXPOSE 8001
EXPOSE 8002
EXPOSE 8003
EXPOSE 18555
EXPOSE 18556
CMD "btcd --testnet --txindex --rpcuser=kek --rpcpass=kek"
# docker pull amrbz/lightning
-
Генерация образа:
docker build . -t username/imagename
, пример:docker build . -t amrbz/lightning
-
Далее запускаем контейнер:
docker run -it -d -v /root/.btcd/data:/root/.btcd/data -p 10001-10003:10001-10003 -p 10011-10013:10011-10013 -p 8001-8003:8001-8003 -p 18555-18556:18555-18556 --name lightning amrbz/lightning
-
Или просто для скачивания/синхронизации тестнета:
docker run -it -d -v /root/.btcd/data:/root/.btcd/data --name testnet amrbz/lightning
где
/root/.btcd/data:/root/.btcd/data
- левая часть это путь к директории, где хранить тестнет на локале (вне контейнера). Это нужно для того чтобы контейнер можно было удалять, сохранив тестнет -
После запуска контейнера нужно зайти внутрь него:
docker exec -it lightning bash
, окажетесь внутри директории$GOPATH/bin
(если не правили докерфайл, то директория/root/.go/bin
-
Далее создаем папку
dev
:mkdir dev
-
Далее внутри нее создаем три папки для каждого узла:
mkdir alice bob charlie
-
Внутри директории
/root
создаем папку.lnd
:cd /root mkdir .lnd
и внутри нее создаем конфиг:
cd .lnd touch lnd.conf
-
Устанавливаем nano:
apt-get install nano
-
Открываем
lnd.conf
файл для редактирования:nano lnd.conf
и вставляем эти настройки:[Application Options] datadir=test_data logdir=test_log debuglevel=info debughtlc=true no-macaroons=true [Bitcoin] bitcoin.testnet=1 bitcoin.active=1 [btcd] btcd.rpcuser=kek btcd.rpcpass=kek
-
Внутри
$GOPATH/bin/dev/alice
инициируем узел:lnd --rpclisten=127.0.0.1:10001 --listen=127.0.0.1:10011 --restlisten=127.0.0.1:8001
-
Открываем новое окно терминала, еще раз заходим внутрь контейнера и переходим в ту же папку:
docker exec -it lightning bash cd ./dev/alice
-
И создаем кошелек:
lncli --rpcserver=127.0.0.1:10001 --no-macaroons create
-
Примерно через 30-60 сек (у меня было так, дайте знать, если у вас другое время) можем проверить, что все норм:
lncli --rpcserver=127.0.0.1:10001 --no-macaroons getinfo
-
Для открытия кошелька:
lncli --rpcserver=127.0.0.1:10001 --no-macaroons unlock
-
И генерируем адрес:
lncli --rpcserver=127.0.0.1:10001 --no-macaroons newaddress np2wkh
-
Можно проверить баланс кошелька:
lncli --rpcserver=127.0.0.1:10001 --no-macaroons walletbalance --witness_only=true
-
Делаем то же самое для Боба и Чарли:
lncli --rpcserver=127.0.0.1:10002 --no-macaroons create lncli --rpcserver=127.0.0.1:10003 --no-macaroons create lncli --rpcserver=127.0.0.1:10002 --no-macaroons unlock lncli --rpcserver=127.0.0.1:10003 --no-macaroons unlock lncli --rpcserver=127.0.0.1:10002 --no-macaroons newaddress np2wkh lncli --rpcserver=127.0.0.1:10003 --no-macaroons newaddress np2wkh
-
Отобразив инфу о ноде видим что-то подобное:
{ "identity_pubkey": "03545eac1566b60ee42cdd88ebdbc3218d519d03a13042dd3333b51d2c40ee87a0", "alias": "", "num_pending_channels": 0, "num_active_channels": 1, "num_peers": 2, "block_height": 1260663, "block_hash": "00000000000007d314f0057512b5bfcc18ac15de9d29839d3cc49b27d3123499", "synced_to_chain": true, "testnet": true, "chains": [ "bitcoin" ], "uris": [ ] }
-
Запоминаем
identity_pubkey
Боба и подключаем Алису к Бобу:lncli --rpcserver=127.0.0.1:10001 --no-macaroons connect <BOB'S_IDENTITY_PUBKEY>@127.0.0.1:10012
-
Можем отобразить перечень пиров к Алисе:
lncli --rpcserver=127.0.0.1:10001 --no-macaroons listpeers
, увидим что-то подобное:{ "peers": [ { "pub_key": "03fa64be36176c9f7b7ad11a0a7ea882e6efa42f3ad53db33a2ccc76c14adf594a", "peer_id": 1, "address": "127.0.0.1:10012", "bytes_sent": "203242", "bytes_recv": "24244689", "sat_sent": "47002", "sat_recv": "11000", "inbound": true, "ping_time": "569" } ] }
-
Видим, что все ОК и теперь можно открыть канал между Алисой и Бобом:
lncli --rpcserver=127.0.0.1:10001 --no-macaroons openchannel --node_key=<BOB_PUBKEY> --local_amt=1000000
Флаг
--local_amt
это количество денег (в сатошах) которые депонируются на канале -
После этого вернется txId трнзакции, открывающей канал
-
Важно! Нужно дождаться 6 подверждений
-
Проверяем, что канал активен:
lncli --rpcserver=127.0.0.1:10001 --no-macaroons listchannels
. Результат примерно такой:{ "channels": [ { "active": true, "remote_pubkey": "03fa64be36176c9f7b7ad11a0a7ea882e6efa42f3ad53db33a2ccc76c14adf594a", "channel_point": "0ceeb8515c54b9a999f02830da1137d78162c76308cf6f4317e2121b4e0806e0:0", "chan_id": "1385531985567612928", "capacity": "1000000", "local_balance": "960378", "remote_balance": "36002", "commit_fee": "3620", "commit_weight": "724", "fee_per_kw": "5000", "unsettled_balance": "0", "total_satoshis_sent": "47002", "total_satoshis_received": "11000", "num_updates": "86", "pending_htlcs": [ ], "csv_delay": 144 } ] }
-
Теперь, например, Боб может сгенерировать счет на оплату:
lncli --rpcserver=127.0.0.1:10002 --no-macaroons addinvoice --value=12000
. Результат примерно такой:{ "r_hash": "732cbc2e89dbdf97b26070e832221df0fff70a35fb547bc6d6b7b949d13f1026", "pay_req": "lntb120u1pdxk0vcpp5wvktct5fm00e0vnqwr5rygsa7rllwz34ld28h3kkk7u5n5flzqnqdqqcqzys5t056rsql9cmlesh0kawnxjqnkcj30g4rjv0aduae60gj79g75wyw7cvvxjps8us23acwyvuapwa4yxtc0uh8l37zef2k0c6cmveaxqpxx98f9" }
-
Теперь Алиса может оплатить счет:
lncli --rpcserver=127.0.0.1:10001 --no-macaroons sendpayment --pay_req=lntb120u1pdxk0vcpp5wvktct5fm00e0vnqwr5rygsa7rllwz34ld28h3kkk7u5n5flzqnqdqqcqzys5t056rsql9cmlesh0kawnxjqnkcj30g4rjv0aduae60gj79g75wyw7cvvxjps8us23acwyvuapwa4yxtc0uh8l37zef2k0c6cmveaxqpxx98f9
-
И видим результат об успешной транзакции:
{ "payment_error": "", "payment_preimage": "b2d247436cb00e06b1d2952088e835f02b2fe1adda008929b99e3b9c39bcca44", "payment_route": { "total_time_lock": 1260808, "total_amt": 12000, "hops": [ { "chan_id": 1385531985567612928, "chan_capacity": 1000000, "amt_to_forward": 12000, "expiry": 1260808 } ] } }
-
Дополнительно можно создать канал между Чарли и Бобом и дождавшись 6 подтверждений, совершить транзакцию между Алисой и Чарли.
На этом все! Делитесь опытом )
Подробнее на http://dev.lightning.community/
Правильно ли понимаю, что для создания канала обязательно надо постоянно иметь доступ к живому узлу mainnet/testnet? Могу ли, например, локально запустить LN, получить какой-то код для транзакции, который через кошелёк просто отправлю в блокчейн; при этом сам узел LN вообще не будет иметь rpc-доступа к блокчейну?
Доступ к блокчейну все же нужен. Более того блогчецн биткойна должен быть тот, чтоиподдерживает SegWit
В докерфайле последняя строка отвечает за это
Тестнет весит 15 гиг, правда качать часов 7-9