С появлением работающей версии сети платежных каналов 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 здесь выступает в роли ужасной третьей стороны… надеемся, что они выполнят свою часть обязательств, ведь, к сожалению, реальный мир не настолько безопасен, как криптовалютный.