С появлением работающей версии сети платежных каналов Lightning у Биткоина появился реальный шанс показать возможности масштабирования и решить проблему высоких комиссий, которая давит на первую криптовалюту еще с 2015 года.

Многие сторонники Lightning с нетерпением ждали релиза версии v1.0. Дополнительные стимулы использовать новую версию появились после того, как компания Blockstream запустила онлайн магазин, принимающий только платежи с помощью Lightning . Ниже представлена инструкция по созданию собственного узла Биткоина, способного отправлять и принимать транзакции в сети платежных каналов Lightning.

Основная задача

Цель данного руководства – пройти весь путь, начав его с полного отсутствия узла Биткоина, и закончив запуском полнофункционального валидационного узла – и все это менее чем за 24 часа. Основное время уйдет на синхронизацию блокчейна Биткоина, поэтому рекомендуем начать этот процесс перед тем, как вы отправитесь спать, и закончить, когда проснетесь.

Подразумевается, что вам известно, как настроить сервер на облачном сервисе Digital Ocean (или любом другом), использующий утилиту Docker. От вас не требуется понимания внутренних процессов – просто копируйте и вставляйте команды - однако мы бы порекомендовали прочитать все изложенное ниже.

Подразумевается также, что вы можете запустить терминал с командной строкой в операционной системе Linux и имеете общее представление о сценариях оболочки, утилите cat, и других распространенных командах Linux.

Если у вас отсутствует полностью синхронизированный узел Биткоина, разделите выполнение данной инструкции на две части:

1. Перед тем как лечь спать: Разверните сервер Linux и начните синхронизировать свой полный узел в сети Биткоина.

2. Когда проснетесь: настройте узел Lightning, пополните его биткоинами и совершите первую транзакцию!

Часть I: создание узла Биткоина

Запуск Docker

Для начала запустим сервер Linux. При наличии учетной записи в Digital Ocean это очень просто:

Создаем дроплет, для этого необходимо более 200 ГБ дискового пространства. В течение 24 часов это будет стоить приблизительно 2.9 доллара.

В верхней части клиента Digital Ocean имеется табличка с надписью «One-click apps», при помощи которой можно развернуть дроплет с предварительно установленным Docker. Отметив все правые таблички, добавим ssh-ключ и нажмем на кнопку «Create» («Создать»).

Соединившись со своим новым сервером через SSH, мы можем приступить к синхронизации узла Биткоина. Имеется возможность выбора из нескольких реализаций, и основное внимание следует уделить файлам lnd и btcdseem: по сути, мы будем использовать демоны bitcoind и lightningd. Возможно, это не самый лучший выбор, с другой стороны, при желании использовать разные библиотеки совсем не сложно.

Начало синхронизации блокчейна Биткоина

Клонируем репозиторий в ~

root@docker-s-6vcpu-16gb-nyc3-01:~# git clone https://github.com/dougvk/lightning-node.git

Создаем docker-образ bitcoind

root@docker-s-6vcpu-16gb-nyc3-01:~# cd lightning-node

root@docker-s-6vcpu-16gb-nyc3-01:~/lightning-node# docker build . -t dougvk/bitcoind

Запускаем узел bitcoind

root@docker-s-6vcpu-16gb-nyc3-01:~# mkdir -p /scratch/bitcoin/mainnet/bitcoind

root@docker-s-6vcpu-16gb-nyc3-01:~# docker run --name bitcoind_mainnet -d -v /scratch/bitcoin/mainnet/bitcoind:/data -p 8333:8333 -p 9735:9735 dougvk/bitcoind:latest

Для проверки процесса синхронизации запускаем команду

root@docker-s-6vcpu-16gb-nyc3-01:~# docker logs bitcoind_mainnet --tail "10"

Здесь нам необходимо настроить процесс демона bitcoind (версия 0.15.1), функционирующего в локальной закрытой сети docker. Данные блокчейна сохраняются в /scratch, и мы задействуем порты, необходимые для того, чтобы узлы bitcoin и lightning услышали пиры по портам 8333 и 9735 соответственно. Порты RPC скрываем, чтобы они не демонстрировались публично.

После запуска данной команды для синхронизации понадобится примерно 12 часов и около 170ГБ дискового пространства. Когда наступит утро, синхронизация полностью завершится.

Далее нам нужно настроить инструмент командной строки Биткоина:

Создаем путь bitcoin-cli к интерфейсу с узлом

root@docker-s-6vcpu-16gb-nyc3-01:~# cat /usr/local/bin/bitcoin-cli

#!/usr/bin/env bash

docker run --rm --network container:bitcoind_mainnet -v /scratch/bitcoin/mainnet/bitcoind:/data dougvk/bitcoind:latest bitcoin-cli "$@"

root@docker-s-6vcpu-16gb-nyc3-01:~# chmod +x /usr/local/bin/bitcoin-cli

root@docker-s-6vcpu-16gb-nyc3-01:~# bitcoin-cli getinfo {

"deprecation-warning": "WARNING: getinfo is deprecated and will be fully removed in 0.16. Projects should transition to using getblockchaininfo, getnetworkinfo, and getwalletinfo before upgrading to 0.16",

"version": 150100,

"protocolversion": 70015,

"walletversion": 139900,

"balance": 0.00038800,

"blocks": 505216,

"timeoffset": -1,

"connections": 15,

"proxy": "",

"difficulty": 2227847638503.628,

"testnet": false,

"keypoololdest": 1516416352,

"keypoolsize": 1999,

"paytxfee": 0.00050000,

"relayfee": 0.00500000,

"errors": "" }

Что делает указанный выше скрипт:

Он содержит только одну команду docker, которая разворачивает и выполняет команду, а затем выполняет очистку. Помните, что поскольку мы спрятали порты RPC, нам необходимо запустить CLI в той же сети, что и процессы docker.

После создания скрипта, осуществляем его тестовый запуск.

Часть II: Настраиваем Lightning

Разворачиваем узел Lightning в основной сети

Убедившись, что узел биткоина сохраняет синхронизацию c сетью (просто удостоверьтесь, что высота блока соответствует последней высоте блока, к примеру, на blockchain.info), разворачиваем узел lightning. Процесс аналогичен демону bitcoind, только быстрее (около 2 минут).

Запускаем узел lightningd в основной сети

root@docker-s-6vcpu-16gb-nyc3-01:~# mkdir -p /scratch/bitcoin/mainnet/clightning

root@docker-s-6vcpu-16gb-nyc3-01:~# docker run --rm --name lightning --network container:bitcoind_mainnet -v /scratch/bitcoin/mainnet/bitcoind:/root/.bitcoin -v /scratch/bitcoin/mainnet/clightning:/root/.lightning --entrypoint /usr/bin/lightningd cdecker/lightningd:master --network=bitcoin --log-level=debug

Проверка вывода записей журнала

lightningd(1): Hello world from 03e71ed1bbedcf41d97e06ef3dfe4cdf79e871e9a3c809ab32b78e71dea45bf78c aka SLICKERGOPHER #03e71e (version v0.5.2-2016-11-21-1414-g5eceaa7)!

...

lightningd(1): Adding block 00000000000000000055234efac33e0ea30cc8e84ded7997f9e434534fd6f1bb

lightningd(1): Adding block 0000000000000000006fcfbab65ccb4634a800c5b12913b8379e6704b42db663

lightningd(1): Adding block 0000000000000000003f350dcff4fa5b1df61355cd80e9b06be55654d6384518

lightningd(1): Adding block 0000000000000000003b414eadfe9751909bdced866c0fa65b3f0156ebe7168e

lightningd(1): Adding block 000000000000000000377f67b9630130f914d142eb27b286cd81364aa7459d1e

lightningd(1): Adding block 000000000000000000739bd7336736f4a050dc22032e611e7cd747750db71c87

lightningd(1): Adding block 0000000000000000002de8afbb90006588e639cc0f55eb740bc2b76746eff050

lightningd(1): Adding block 0000000000000000007ad87ace5ddec90c0afd371d67cfd45ca3ad01f9b78cf1

lightningd(1): Adding block 00000000000000000014cf80dabf7e6d0b8dec51bc9914311401a9605f6b3606

Помните, что мы запускаем узел lightning на том же самом сетевом интерфейсе docker, что и Биткоин. Поэтому клиенты RPC могут общаться друг с другом. Этот же трюк используем с инструментом командной строки lightning:

Создаем путь lightning-cli к интерфейсу с узлом

#!/usr/bin/env bash

docker run --rm -v /scratch/bitcoin/mainnet/clightning:/root/.lightning --entrypoint /usr/bin/lightning-cli cdecker/lightningd:master "$@"

root@docker-s-6vcpu-16gb-nyc3-01:~# chmod +x /usr/local/bin/lightning-cli

root@docker-s-6vcpu-16gb-nyc3-01:~# lightning-cli getinfo

{ "id" : "03e71ed1bbedcf41d97e06ef3dfe4cdf79e871e9a3c809ab32b78e71dea45bf78c", "port" : 9735, "address" :

[ ], "version" : "v0.5.2-2016-11-21-1414-g5eceaa7", "blockheight" : 505236 }

Поздравляем! Вы развернули полный узел lightning! Осталось соединить его с другими узлами и открыть платежные каналы. Теперь нам предстоит сложная, но одновременно и самая плодотворная часть.

Пополняем узел Lightning биткоинами

Чтобы получить стикеры на 20 долларов, нам необходимо отправить в узел lightning 0.003 BTC (примерно 30 долларов). Помните, что все это пока очень ново и проблематично. Отправляйте только то, что вы согласны потерять. Чтобы получить монеты, необходимо сгенерировать адрес кошелька.

Создаем адрес кошелька узла lightning

root@docker-s-6vcpu-16gb-nyc3-01:~# lightning-cli newaddr

{ "address" : "3Dx1XCcBsTtUQmWW6KD8PfMx6fB9saejYM" }

Ждем 6 подтверждений, затем проверяем баланс

root@docker-s-6vcpu-16gb-nyc3-01:~# lightning-cli listfunds

{ "outputs" :

[

{ "txid" : "[HIDDEN]", "output" : 0, "value" : 300000 } ] }

На подтверждение платежа уйдет около 60 минут, и вот, наконец, наши 300 000 сатоши отправляются в путь!

Соединение с другими узлами

Самое интересное начинается дальше. Чтобы найти другие узлы сети Lightning, можно использовать этот сайт. Здесь можно присоединиться к еще одному активному узлу или выбрать другой. Помните, чем больше соединений, тем меньше преград встретится на платежном маршруте и тем ниже будет размер комиссий. К примеру, можно выбрать SLEEPYARK (см. фото).

Далее присоединяемся к узлу и открываем платежный канал.

Примечание: полезно использовать документацию на GitHub.

Находим на сайте узел, например, SLEEPYARK

сеть

root@docker-s-6vcpu-16gb-nyc3-01:~# lightning-cli connect 02f6725f9c1c40333b67faea92fd211c183050f28df32cac3f9d69685fe9665432 104.198.32.198 9735

{ "id" : "02f6725f9c1c40333b67faea92fd211c183050f28df32cac3f9d69685fe9665432" }

Обмениваемся сообщениями с узлом

root@docker-s-6vcpu-16gb-nyc3-01:~# lightning-cli getpeers

{ "peers" :

[

{ "state" : "GOSSIPING", "peerid" : "02f6725f9c1c40333b67faea92fd211c183050f28df32cac3f9d69685fe9665432", "netaddr" :

[ "104.198.32.198:9735" ], "connected" : true, "owner" : "lightning_gossipd" } ] }

Устанавливаем разумную комиссию

root@docker-s-6vcpu-16gb-nyc3-01:~# bitcoin-cli settxfee 0.005

Открываем и находим канал lightning 2 уровня

root@docker-s-6vcpu-16gb-nyc3-01:~# lightning-cli fundchannel 02f6725f9c1c40333b67faea92fd211c183050f28df32cac3f9d69685fe9665432 200000

{ "tx": "020000000001018bfe9f8ad414a2ba6cabe3ff91901dd9b4a51e40dede0439a5fcdcca1b d6a7a800000000171600149d3b1cdf27cc5d1d1cbaf74b24621ea979b11168ffffffff02465e01000000000 01600141679b360311df963d881d7560fe08a615583fda4400d0300000000002200205c5b2b6b7bf08e 157b66144644ed69cb0fc3b356285c80b63e31def60937925e02483045022100e6a8ef79cf4109cddb8 de45167a962ce918e1f148a8fcf2dcfe8c74dec8aecdb02207d58a824152985b974fdf0e55acc04bc7b14 061fda3528119f1d1aceab20b335012103dd126550f1c399bc5d0aa210c0a9725d4d31fe0f3e711298f8 0765058703d27300000000" }

Проверяем txid

root@docker-s-6vcpu-16gb-nyc3-01:~# lightning-cli listfunds

{ "outputs" :

[

 {"txid":"c48cbca7bc1569514e9b52dc7d4df01ae3372503cb204b82f7b2d7e3fb742b7c",
 "output" : 0, "value": 89670 } ] }

Сайт для вычисления правильного размера комиссий.

Дождавшись 6 подтверждений транзакции для открытия канала Lightning, можно переходить к финалу тестирования – оплате стикеров Blockstream. Переходим в магазин, добавляем стикеры в корзину и переходим на страницу оплаты.

оплата

Эта длинная цепочка символов называется адресом BOLT11 . Чтобы раскодировать процесс, копируем и вставляем наш адрес в команду.

Вы увидите все подробности своего заказа (в нашем случае, заказа с Blockstream). Одно из закодированных полей содержит информацию о получателе платежа – это ID узла Lightning, на который мы пытаемся отправить платеж. Этот ID можно использовать для вычисления стоимости маршрутизации платежа к узлу, а затем отправить платеж!

Находим маршрут к узлу

root@docker-s-6vcpu-16gb-nyc3-01:~# lightning-cli getroute 02f6725f9c1c40333b67faea92fd211c183050f28df32cac3f9d69685fe9665432 200000000 0

{ "route" :

[

{ "id" : "02f6725f9c1c40333b67faea92fd211c183050f28df32cac3f9d69685fe9665432", "channel" : "505231:2001:1", "msatoshi" : 200000000, "delay" : 9 } ] }

Платим на адрес BOLT11

root@docker-s-6vcpu-16gb-nyc3-01:~# lightning-cli pay lnbc1712393610p1pdx8n8mp p5c72tc40vzyf9deqm5lzn76404heejady02l494ykke3vm3x44y8qdy2gfkx7cmtwd68yetpd5azqv339cunvgz 42dzzqen0wgsyymr0vd4hxarjv4sk6gznv96x2mrvd96x2grnw35kx6m9wgs8sgp5ypskuepqf35kw6r5de5ku eeqwd6xjcmtv4ezq7pqxvcqpggq86huylgdcd4st0d8thgdlw67tefjkhrnssyf8zk2s9cu37hdanwm6q96llg5zgjc kwe7jamsmxnp4vy4q7vyulv57d9yg0wm7df0cpgwgu2m

{ "preimage" : "79f88fe9765997d2005e012ff32bc5dceeb99b111b81aa5087b815f2e4cdc59a" }

Проверяем остаток в канале

root@docker-s-6vcpu-16gb-nyc3-01:~# lightning-cli getpeers

{ "peers" :

[

{ "state" : "CHANNELD_NORMAL", "netaddr" : [ "104.198.32.198:9735" ], "peerid" : "02f6725f9c1c40333b67faea92fd211c183050f28df32cac3f9d69685fe9665432", "connected" : true, "owner" : "lightning_channeld", "channel" : "505231:2001:1", "msatoshi_to_us" : 28760639, "msatoshi_total" : 200000000 }]}

Здесь необходимо отметить одну вещь. Платеж отправляется не в блокчейн Биткоина. Он все еще существует в платежном канале сети Lightning. Однако, благодаря природе протокола Lightning, Blockstream не подвергается риску неисполнения платежа.

Теперь остается дождаться наших стикеров. Blockstream здесь выступает в роли ужасной третьей стороны… надеемся, что они выполнят свою часть обязательств, ведь, к сожалению, реальный мир не настолько безопасен, как криптовалютный.