Skip to content

Lightning

andyceo edited this page Jan 30, 2018 · 1 revision

Lightning митап в LAToken

Докерфайл:

FROM ubuntu:latest
USER root
LABEL maintainer="aboziev@gmail.com"

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

Sidebar is under construction

Clone this wiki locally