Розробка Lightning-каналів для мгновенних платежів
Lightning Network розв'язує конкретну проблему Bitcoin: on-chain транзакція займає 10–60 хвилин та коштує $1–50 залежно від congestion mempool. Для мікроплатежів, стрімингу сатоші, або платіжних систем з високою частотою транзакцій — неприпустимо. Lightning дає підтвердження за секунди та комісії у одиниці сатоші.
Як працюють канали: технічна суть
Lightning-канал — це мультисиг 2-of-2 на блокчейні з набором off-chain транзакцій, підписаних обома сторонами. Відкриття каналу — одна on-chain транзакція (funding tx). Усі подальші платежі всередині каналу — обмін підписаними станами, ніщо не йде в блокчейн.
Безпека забезпечується HTLC (Hash Time-Locked Contract): одержувач платежу знає preimage секрету, чий хеш зафіксований у контракті. Платіж проходить по ланцюжку вузлів, кожен розкриває preimage тільки при отриманні коштів — це атомарність без довіри.
Закриття каналу — фінальна on-chain транзакція з останнім узгодженим балансом. Якщо одна зі сторін намагається broadcast старе (вигідне для себе) стан — інша сторона може оспорити через penalty транзакцію протягом to_self_delay блоків.
Вибір LN реалізації
| Реалізація | Мова | Зрілість | Особливості |
|---|---|---|---|
| LND (Lightning Labs) | Go | Висока | Найпоширеніша, gRPC API, Taproot Assets |
| Core Lightning (CLN) | C | Висока | Плагін-система, мінімальні ресурси |
| Eclair | Scala | Середня | Mobile-friendly, використовується у Phoenix Wallet |
| LDK (Lightning Dev Kit) | Rust | Росте | Бібліотека для вбудовування в програми |
LND — de facto стандарт для server-side програм. Добра документація, багатий API, широка екосистема інструментів (LNbits, RTL, Thunderhub). Вибір за замовчуванням, якщо немає специфічних вимог.
Розгортання LND
Інфраструктура
LND потребує Bitcoin Core ноди (або Neutrino для light client, але не для production):
# bitcoin.conf — вимоги від LND
server=1
txindex=1
zmqpubrawblock=tcp://127.0.0.1:28332
zmqpubrawtx=tcp://127.0.0.1:28333
rpcuser=bitcoin
rpcpassword=secure_password
# lnd.conf
[Application Options]
alias=YourNodeName
color=#FF6600
maxpendingchannels=5
[Bitcoin]
bitcoin.active=1
bitcoin.mainnet=1
bitcoin.node=bitcoind
[Bitcoind]
bitcoind.rpchost=127.0.0.1
bitcoind.rpcuser=bitcoin
bitcoind.rpcpass=secure_password
bitcoind.zmqpubrawblock=tcp://127.0.0.1:28332
bitcoind.zmqpubrawtx=tcp://127.0.0.1:28333
[routing]
routing.assumechandb=true # Прискорює перший старт
Мінімальні вимоги для production LND: 2 CPU, 4GB RAM, 50GB SSD (плюс місце під Bitcoin Core).
Первоначальна настройка через lncli
# Створити гаманець (один раз)
lncli create
# ВАЖЛИВО: зберегти seed phrase у cold storage!
# Розблокувати при кожному запуску
lncli unlock
# Перевірити синхронізацію
lncli getinfo | jq '.synced_to_chain, .block_height'
# Отримати on-chain адресу для пополнення
lncli newaddress p2wkh
API інтеграція: створення та прийом платежів
Прийом платежів (створення invoice)
import grpc, codecs
import lnd_pb2 as ln
import lnd_pb2_grpc as lnrpc
def get_lnd_stub():
# Завантажуємо TLS сертифікат та macaroon
with open('/home/lnd/.lnd/tls.cert', 'rb') as f:
cert = f.read()
with open('/home/lnd/.lnd/data/chain/bitcoin/mainnet/invoice.macaroon', 'rb') as f:
macaroon = codecs.encode(f.read(), 'hex').decode()
creds = grpc.ssl_channel_credentials(cert)
channel = grpc.secure_channel('localhost:10009', creds)
# Додаємо macaroon до кожного запиту
def macaroon_interceptor(continuation, client_call_details, request_iterator):
client_call_details.metadata.append(('macaroon', macaroon))
return continuation(client_call_details, request_iterator)
return lnrpc.LightningStub(channel)
stub = get_lnd_stub()
def create_invoice(amount_sats: int, memo: str, expiry_seconds: int = 3600) -> dict:
invoice = stub.AddInvoice(ln.Invoice(
value=amount_sats,
memo=memo,
expiry=expiry_seconds
))
return {
"payment_hash": codecs.encode(invoice.r_hash, 'hex').decode(),
"payment_request": invoice.payment_request, # BOLT11 строка для QR коду
"add_index": invoice.add_index
}
Відслідковування оплати
def subscribe_invoices(callback, settle_index: int = 0):
"""Стримим усі нові та оновлені invoices"""
request = ln.InvoiceSubscription(settle_index=settle_index)
for invoice in stub.SubscribeInvoices(request):
if invoice.state == ln.Invoice.SETTLED:
callback({
"payment_hash": codecs.encode(invoice.r_hash, 'hex').decode(),
"amount_sats": invoice.amt_paid_sat,
"settled_at": invoice.settle_date,
"memo": invoice.memo
})
Відправлення платежів
def pay_invoice(payment_request: str, fee_limit_sats: int = 50) -> dict:
response = stub.SendPaymentSync(ln.SendRequest(
payment_request=payment_request,
fee_limit=ln.FeeLimit(fixed=fee_limit_sats),
timeout_seconds=30
))
if response.payment_error:
raise RuntimeError(f"Payment failed: {response.payment_error}")
return {
"payment_preimage": codecs.encode(response.payment_preimage, 'hex').decode(),
"payment_hash": codecs.encode(response.payment_hash, 'hex').decode(),
"fee_sats": response.payment_route.total_fees
}
Управління ліквідністю каналів
Найскладніша операційна задача у Lightning — ліквідність. Канал має дві сторони: local balance (можемо відправляти) та remote balance (можемо приймати). Новий канал: local = усі кошти, remote = 0. Потрібен баланс.
Відкриття каналів
# Відкрити канал з відомим вузлом (наприклад, Bitfinex)
lncli openchannel \
--node_key 033d8656219478701227199cbd6f670335c8d408a92ae88b176106c4db4a290f0 \
--local_amt 5000000 \
--push_amt 2500000 # одразу передаємо половину на іншу сторону
push_amt — початковий перевід партнеру при відкритті каналу. Це спосіб отримати remote balance одразу, але технічно ви віддаєте гроші.
Rebalancing через circular payments
Якщо local balance вичерпаний — потрібен rebalancing:
# Встановити bos (Balance of Satoshis) для зручного управління
npm install -g balanceofsatoshis
# Автоматичний rebalance: переливаємо через зовнішній маршрут
bos rebalance --max-fee-rate 100 --minutes 60
Або через Loop (Lightning Labs): Loop Out — відправляємо сатоші on-chain з вашого LN каналу, отримуємо on-chain BTC та створюємо нову ліквідність.
Inbound ліквідність
Щоб приймати платежі — потрібен remote balance. Способи отримати:
- LSPS (Lightning Service Provider Spec) — провайдери відкривають канал до вас з готовою inbound ліквідністю (за комісію). Провайдери: Voltage, Amboss, Olympus.
- Торгові стосунки — відкриваєте канал до крупного вузла з push_amt, вони відкривають до вас у відповідь.
- Submarine swaps — отримуєте on-chain BTC, він конвертується у inbound LN ліквідність через Loop In.
Мониторинг ноди
# Встановити Thunderhub або RTL (Ride The Lightning) — web UI для управління
docker run -p 3000:3000 \
-v /home/lnd/.lnd:/lnd \
apotdevin/thunderhub:latest
# Алерти через Grafana + Prometheus (lnd metrics endpoint)
lncli --grpc-listening-port 8080 # включити metrics
Ключові метрики для мониторингу: channel balance (local vs remote), кількість pending HTLC, utilization channel capacity, routing fee revenue.
Часові рамки
Деплой production LND ноди з базовими каналами, gRPC API інтеграцією та мониторингом: 1–2 тижні. Складна платіжна система з автоматичним rebalancing, LSP інтеграцією та високою доступністю: 3–5 тижнів.







