一文读懂闪电网络应用开发速成指南
如果你想要入门闪电网络编程,又不在乎所谓正确、最佳的做法,这篇文很适合你。换言之,这篇指南具有很强的 主观性。如果你偏好 O'Reilly 式的权威文本,这篇文章可能不对你的胃口。但是,如果你想要了解闪电网络的最小开发环境及其基本内容,不妨读一读。我写本文的目的是提炼出创建闪电网络应用的基础知识点,让新手能够快速构建和实验。
我相信,只要掌握了基础知识点,你就能编写出更加复杂安全的应用。但是,每个人都得有个开始,我个人的感受是万事开头难,我认为将这些思想整合到一起可以帮助一些迷途羔羊缓解痛苦。
在深入介绍细节之前,请允许我简单介绍一下自己的背景:
大约一个月之前,我辞去了原本稳定的数据架构师工作,开始研究日新月异的比特币生态。你会找到这篇文章,表明你已经迈出了这一步(或者正在考虑这么做)。
简单来说,我认为比特币是我所见过最有趣的技术创新。我越了解比特币,就越被它吸引。比特币技术有希望改变乃至重塑如今的交互方式,使之脱胎换骨。我希望贡献自己的一份力量。
这就是为什么我会选择在比特币上开发。我希望这篇文章能够让不熟悉闪电网络生态及其潜力的开发者受益,鼓励更多开发者为比特币领域注入创造力。
老实说,关于比特币生态,我想写的实在太多了(其中,“由能源支持的货币”这一概念排在第一位),但是只能择日再谈了。现在开始进入正题:
闪电网络的架构
-图源:lnrouter.app-
闪电网络的基础设计是利用通道实现节点间的一对一连接。开通通道需要存入一定数量的比特币,该事务会记录在比特币区块链上。然后,用户可以使用特殊的链下合约在节点之间转移通道内的比特币,无需提交新的事务到区块链上。
实际做法是实时追踪通道内的余额变化。例如,你在与 Alice 开通的通道内存入 100 satoshi,你有大约 100 satoshi (减去链上交易手续费)的转账额度,既可以直接转给 Alice ,也可通过 Alice 间接转给其他人。这些转账几乎是即时的,因为我们只需根据每笔交易调整通道的余额。这种调整是通过在付款方和收款方之间传递加密消息实现的。
闪电应用是在闪电网络(所谓的比特币二层)上运行的。闪电应用同样以比特币作为支付方式,但是结算速度更快、交易费更低。
虽然我只是非常简略地概括了闪电网络协议,但是知道这些已经足够入门了。如果你想更详细地了解闪电网络是如何运作的,这里有一些很好的阅读材料。小心不要沉溺在知识的海洋里,坐在电脑前读到很晚,却一行代码都没有敲。也不是说这样一定不好,只是我们的目的还是在于实践。另外,保证充足的睡眠也很重要。
我认为,若想了解闪电网络及其节点的运作方式,更好的办法是自己运行一个节点并弄清楚如何通过节点路由付款。虽然这个办法需要付出更多时间和金钱,但是既有趣又长知识。1
实现
闪电网络是开放式协议。这就意味着,闪电网络有标准的消息通信和解释方式。就像 HTTPS 和 TCP/IP 不归任何人所有那样,闪电网络协议也是如此。任何人只要遵守标准都可以参与闪电网络。不仅如此,随着开发者不断加固协议并增加新功能,这一标准也会持续发展。
目前有四家公司在闪电网络协议开发中处于核心地位:Lightning Labs、Blockstream、ACINQ 和 Square Crypto,而且都有自己的实现:
Lightning Labs — lnd (Go)
Blockstream — c-lighting (C)
ACINQ — eclair (Scala)
Square Crypto — Rust Lightning (Rust)
上述所有实现都能通过闪电网络进行通信。区别在于这些实现的 API。本文只聚焦于 Lightning Labs 的 lnd,因为这是我最先接触、也是了解最多的。虽然我最终选择 Ind 有偶然成分在里面,但是不得不夸一下,Lightning Labs 的 Ind 文档写得很好,而且开发者能够通过官方 Slack 频道获得很多帮助和支持。
请注意,下文将围绕 Ind 展开讨论,但是基本概念适用于所有闪电网络实现。
你的开发环境
不废话,使用 Polar 就行了。
好吧,再多说两句。无论你是开发者还是用户,在闪电网络上进行构建的最大障碍是如何创建后端。我说的不只是一个钱包,因为有很多简单快速的托管解决方案可以用。我指的是真正的后端 —— 运行比特币和闪电网络的节点。
我之所以这么说,是因为你的应用需要拥有节点的某些权限,才能完成一些重要操作,例如,通过 API/gRPC 调用创建发票和监控付款。如果有节点运营者授予你节点的访问权限,你同样可以完成这些操作,但还是自己运营一个节点比较好。
能够用于闪电网络开发的节点必须运行两个进程:(1)同步到比特币区块链最新区块的比特币客户端;(2)已开启通道(可以收发支付)的闪电网络客户端。
如果你使用的是普通的家用宽带,光是同步区块链就需要花费至少几天的时间。你可以试一下 Neutrino(一款轻量级比特币钱包),但是我听说用它在闪电网络上开发可能会导致一些问题。我没有亲身尝试过。不管怎样,如果你才刚开始接触这类工具,我想最好去除那些可能会产生负面影响的变量。因此,如果你负担得起,我建议你同步完整的区块链就好。
如果我们对比特币的分层进行排序,闪电网络层就是比特币的二层。正如我上文提到的,我们需要在闪电网络上开启通道来进行交易。虽然在闪电网络上开启通道不是很难,但是你需要一些计划和协调,还要付出比特币。你当然可以质押比特币来开启通道,然后开始交易。但是,你没必要承担这种金融风险。2
暂时先别管这些。Polar 是一个很棒的工具,可以让你在笔记本电脑上的 Docker 容器内模拟运行这些进程。另外,它还提供一个精美的 UI 界面,为你展示网络可视化效果。