如何构建出LightWork Web应用程序
扫描二维码
随时随地手机看文章
在这一周中,在构建LightWork Web应用程序的第一个版本时,我遇到了一些架构问题,主要与处理ln节点和我的Web应用程序之间的bolt11发票(core to ln)有关。在经历了(大部分)这些障碍之后,我想我会写一些关于开发一个由LN驱动的应用程序以及如何减少大家在开发时遇到的主要障碍。
应用程序栈
现在大多数应用程序通常分为两个主要部分:客户端和服务器。例如,客户端可以是移动应用程序或JavaScript SPA,服务器可以由NodeJS / Go / Rust后端组成,后端主要是基于RESTful或GraphQL的API。
为应用程序添加Lightning Network支持,通常会向应用程序堆栈引入两个部分:比特币节点和Lightning Network节点。
对于比特币,有几个节点实现可供使用,其中两个最广泛接受的方式是:
· 比特币核心-比特币
· BTCD-BTCD
根据社区共识、网络上活动节点的数量以及各自代码存储库的维护统计,很明显比特币核心是最广泛使用和维护更好——也是我们将要使用的方式。
在Lightning Network方面,有(目前)三个兼容的客户端都遵循相同的BOLT规范:
1. C-Lightning(用C编写)
2. LND(用Go编写)
3. Eclair(用Scala编写)
你应该评估每个客户端,并决定那个是对你最有意义。我以前曾亲自使用过C-Lightning和LND,但也听说过有关ECLAir客户的很多事情。对于lightwork,我决定使用lnd,因为它提供了一个友好易用的grpc/rest api,以及现成的Neutrino light客户端支持(现在是testnet)。
是时候启动和运行节点了。
比特币核心设置
当前的比特币主网区块链大约有260GB的数据,挖掘了约55万个区块。由于我们的lnd节点依赖于访问底层链来打开和关闭通道事务,因此在本地机器/笔记本电脑上运行一个完整的节点似乎是一项巨大的任务。这不仅是1/4TB的数据,而且完全同步还需要几个小时(取决于您的连接,可能需要几天时间)。
比特币也有一个testnet3网络,允许开发者在不影响主网的情况下测试新功能和对协议的更改。这对于开发人员在比特币上构建应用程序和服务也很好,因为比特币能够使用无价值的TestNet BTC币测试端到端的流量。测试网的容量较小大约25GB和大约有144000个区块。如果您所要做的只是处理与闪电网络接口的应用程序,那么同步testnet3仍然是一个很大的障碍。这就是为什么比特币核心给了我们另一个网络,这一个叫regtest(simnet为btcd用户)。
RegTest是区块链的一个测试应用版本,考虑到它的唯一目的是允许在协议上进行更快的开发,作为该节点的管理员,您可以即时地挖掘任意多个区块。我在开发时使用了我的regtest网络,只占用了大约37MB容量。这更符合我们想要的。
安装比特币核心节点
以下说明用于在MacOS系统上运行比特币。
如果您还没有安装,请运行以下命令在您的环境中安装比特币核心:
curl -O https://bitcoin.org/bin/bitcoin-core-0.17.0/bitcoin-0.17.0-osx64.tar.gz
如果您熟悉PGP,还建议您检查发布的签名哈希:01EA 5486 DE18 A882 D4C2 6845 90C8 019E 36C2 E964
现在,您可以使用以下方法打开tarball:
tar -zxf bitcoin-0.17.0-osx64.tar.gz
随后使用以下方法使bitcoind二进制文件可用:
sudo mkdir -p /usr/local/bin
sudo cp bitcoin-0.17.0/bin/bitcoin* /usr/local/bin/
删除文件,您可以删除下载的文件夹:
rm -rf bitcoin-0.17.0*
您现在应该可以完全访问计算机上的bitcoind和bitcoin-cli命令。
节点配置
比特币核心完整节点有许多配置选项,因此每次运行二进制文件时,不要在命令行上传递所有这些参数,建议您使用bitcoin.conf配置文件。
有关bitcoind支持的所有命令的列表,请运行bitcoind --help。
下面是一个配置文件示例,其中包含运行regtest节点(并连接到LND节点)的(必要)参数:
# Daemon Options
server=1
# Network OpTIons
regtest=1
# RPC OpTIons
rpcport=8332
rpcuser=USERNAME_HERE
rpcpassword=PASSWORD_HERE
# ZMQ OpTIons
zmqpubrawblock=tcp://127.0.0.1:28332
zmqpubrawtx=tcp://127.0.0.1:28333
为了简单起见,您可以在完整节点在系统中创建的主比特币文件夹中创建bitcoin.conf文件。在macOS系统中,该文件夹位于〜/ Library / ApplicaTIon Support / Bitcoin。
记下您选择的RPC用户名和密码,因为我们在LND节点配置期间需要它。
然后,您可以运行以下步骤进入同一个Bitcoin目录,并使用新创建的配置文件启动节点守护程序:
cd ~/Library/Application Support/Bitcoin
bitcoind -datadir=。/ -conf=。/bitcoin.conf
您应该看到类似于的输出:
在单独的终端窗口中,您可以运行bitcoin-cli getblockchaininfo,您将看到来自regtest比特币链的最新数据集,包括当前块高度,难度级别和磁盘大小。有关bitcoin-cli命令的完整列表,请运行bitcoin-cli --help。
当您第一次运行bitcoind时,它会自动为您创建一个钱包。所以在这一点上,任何通过采矿奖励获得的BTC都将被发送到这个钱包。为了挖掘regtest块,只需运行bitcoin-cli就可以生成100,其中100是要挖掘的区块数。如果您运行bitcoin-cli getwalletinfo,您现在将拥有“余额”下的值。这些是regtest BTC硬币,非常适合测试Lightning Network应用程序。现在我们已经运行了比特币核心守护程序并且我们知道如何挖掘regtest块,现在是时候设置我们的LND节点了。
LND节点设置
要连接到闪电网络,您只需要一个连接到底层链的LND节点。但是为了可以向网络周围发送资金,您必须有另一个节点发送到或请求。一种方法是将具有不同比特币核心和LND节点的多个VPS盒旋转起来,然后在两个VPS盒之间打开通道。另一个更简单的方法是让多个LND实例在您的机器上运行,连接到一个您完全控制的比特币regtest节点。用户可以在单个环境中运行他们想要的多个LND节点,只有三个要求:
每个节点都必须有自己的专用数据目录
每个节点都必须有自己的gRPC / REST端口
每个节点必须有自己的一组TLS证书和管理Macaroon
LND创建在启动时运行节点所需的所有必要数据文件,包括身份验证macaroon文件。考虑到这一点,在启动第一个节点后,您可以简单地克隆它(并删除身份验证macaroons / TLS证书,以便在初始化第二个节点时重新创建它们)。对于macOS用户,默认的LND文件夹位于〜/ Library / Application Support / Lnd(NODE A),因此我将其克隆到〜/ Library / Application Support / Lnd Test(NODE B)中。
节点配置
与比特币核心类似,LND节点接收称为lnd.conf的配置文件。为了运行两个节点,我们需要两个文件,放在每个相应的数据目录中,配置节点以连接到正确的bitcoind实例。
NODE A将在默认数据目录和默认设置(RPC / REST / gRPC端口)上运行。我们将使用以下conf文件:
# LND Settings
debuglevel=debug
debughtlc=true
alias=YOUR_NODE_NAME
maxpendingchannels=10
color=#eeeeee
rpclisten=0.0.0.0:10009
restlisten=0.0.0.0:8080
listen=9735
externalip=127.0.0.1:9735
datadir=。/
datatlscertpath=。/tls.cert
tlskeypath=。/tls.key
adminmacaroonpath=。/data/chain/regtest/admin.macaroon
# Bitcoin
bitcoin.active=1
bitcoin.regtest=1
bitcoin.node=bitcoind
# Bitcoind
bitcoind.rpcuser=USERNAME_HERE
bitcoind.rpcpass=PASSWORD_HERE
bitcoind.zmqpubrawblock=tcp://127.0.0.1:28332
bitcoind.zmqpubrawtx=tcp://127.0.0.1:28333
请注意,ZMQ选项和RPC用户名和密码必须与先前配置的bitcoind.conf设置匹配。
除连接端口外,NODE B将具有基本相同的配置设置。更具体地说,rpclisten,restlisten,listen和externalip属性都接收新端口。
# LND Settings
debuglevel=debug
debughtlc=true
alias=YOUR_NODE_NAME
maxpendingchannels=10
color=#eeeeee
rpclisten=0.0.0.0:10008
restlisten=0.0.0.0:8090
listen=9736
externalip=127.0.0.1:9736
datadir=。/
datatlscertpath=。/tls.cert
tlskeypath=。/tls.key
adminmacaroonpath=。/data/chain/regtest/admin.macaroon
# Bitcoin
bitcoin.active=1
bitcoin.regtest=1
bitcoin.node=bitcoind
# Bitcoind
bitcoind.rpcuser=USERNAME_HERE
bitcoind.rpcpass=PASSWORD_HERE
bitcoind.zmqpubrawblock=tcp://127.0.0.1:28332
bitcoind.zmqpubrawtx=tcp://127.0.0.1:28333
此时,我们有两个LND节点在不同的数据目录上运行,具有自己的一组TLS证书和身份验证宏,并在不同的端口上运行。是时候启动网络了。在两个单独的终端shell中,使用以下命令启动NODE A和NODE B:
lnd --configfile=。/lnd.conf
在另外两个shell中,使用lncli工具向您的节点发送命令。运行以下命令以创建钱包。对于NODE A,我们只需要运行create命令,如下所示:
lncli --network=regtest create
对于NODE B,我们必须传递更多属性:
lncli --network=regtest --rpcserver=localhost:10008 --lnddir=。/ --tlscertpath=。/tls.cert create
添加的属性是为了确保第二个lncli调用与在端口10008上运行的NODE B通信。运行钱包创建过程并为每个钱包创建自己的密码。
请注意,一旦您创建了钱包,您只需运行unlock命令即可开始工作。
LND节点实际上做了很多,并且要了解它的所有功能,请转到LND的文档或运行lncli --help来查看几个命令。一些更广泛使用的是:
# Wallet balance, in Satoshis
lncli walletbalance
# Balance of all channels combined, in Satoshis
lncli channelbalance
# Generate Invoice
lncli addinvoice --amt=1000 --memo=testing
# Pay Invoice
lncli payinvoice lnbcrt10u1pdlyp6fpp50xvlxjg.。.
# Connect to specific node URI
lncli connect 03fbe39af6166273.。.@127.0.0.1:9735
# Open channel with to specific node
lncli openchannel 03fbe39af6166273.。.1af2 100000
我们将使用这些命令中的每一个在我们的两个节点之间发送LN发票,但在我们这样做之前,我们需要在我们的一个钱包中使用一些实际的regtest BTC。
将regtest BTC从比特币核心发送到LND节点
您可以使用bitcoin-cli工具将已开采的regtest BTC发送到NODE A.首先从NODE A内部生成一个新地址:
lncli --network=regtest newaddress np2wkh
然后转到比特币核心并将一些regtest BTC发送到该地址。确保生成几个区块以进行挖掘并确认交易。
# Send 250 BTC to the LND Address
bitcoin-cli sendtoaddress 2MuKLyJQn2UQ2BaVotWpCKAfXpkrsa96eL7 250
# Mine Blocks
bitcoin-cli generate 10
现在回到NODE A,我们可以获得我们的钱包余额,并看到我们的BTC已正确转移。
在两个lnd节点之间打开通道
既然我们在NODE A内有了BTC,我们就可以让NODE B为节点A创建一些付款请求。作为Lightning网络规范的一部分,如果节点想发送和接收Satoshis,则需要与其他节点打开通道(通过其他间接节点路由发票为C我们可以在真实的网络场景中使用,而不是在我们的两节点lnd regtest网络中)。
要连接两个节点,您需要获取节点的公共URI。在NODE B上,运行以下命令:
lncli --network=regtest --rpcserver=localhost:10008 --lnddir=。/
--tlscertpath=。/tls.cert getinfo
突出显示的部分是我们需要用来连接到此节点的URI。如果您没有看到列出的URI,可能是因为您没有在LND配置文件上设置externalip属性。
要在节点之间打开通道,首先我们需要连接它们。使用NODE B的URI在NODE A上运行以下命令。
lncli --network=regtest connect 0394ed661ff.。.92f446@127.0.0.1:9736
我们仍然没有开通任何渠道,因此即使我们尝试支付发票,我们也会遇到路由问题:
作为开通渠道的一部分,LND将在链上创建一个资金交易,设置一定数量的satoshis来锁定这个新创建的频道。
lncli --network=regtest openchannel NODE_PUB_KEY amount
要使资金交易有效,您需要运行比特币-cli生成10才能在比特币核心中挖掘更多的区块。此时,您可以在NODE A中运行listchannels以查看两个节点之间打开的通道:
lncli --network=regtest listchannels
处理发票(BOLT11付款请求)
既然NODE A已经获得了一些regtest BTC的资助,并且我们在两个节点之间有一个活跃的开放通道,我们可以创建一个发票来处理一些BTC。
发票是任何Lightning Network交易的核心。要了解有关LN发票(付款请求)和BOLT11规范的更多信息,请阅读我的其他文章。
从NODE B,生成300 satoshis的发票,其中包含‘测试’的说明:
lncli --network=regtest --rpcserver=localhost:10008 --lnddir=。/
--tlscertpath=。/tls.cert addinvoice --amt=300 --memo=testing
突出显示的部分是BOLT11付款请求哈希。要了解有关此发票的更多信息以及我们可以从中解码的数据类型,请转到Lightning Decoder并粘贴您的发票。
从NODE A,我们可以支付这个新创建的发票,并通过我们刚刚打开的通道通过Lightning Network路由付款。
lncli --network=regtest payinvoice lnbcrt3u1pdlygj221k0x.。.c0h503tpr
NODE B现在应该在通道的一侧列出300个satoshis。我们可以使用channelbalance命令检查它。
lncli --network=regtest --rpcserver=localhost:10008 --lnddir=。/
--tlscertpath=。/tls.cert channelbalance
瞧,我们的300个satoshis已被转移。
您已成功连接在同一regtest BTC网络上运行的两个LND节点,在它们之间打开了一个通道,并通过支付BOLT11发票来交易BTC。通过此设置,您可以通过这两个LND节点创建无限的实际付款方案。这样可以更轻松地对Lightning网络驱动的应用程序的后端服务器逻辑进行测试,迭代和故障排除。
现在,要与应用程序内的节点连接,请查看LND的gPRC或RESTful API。您还可以利用Alex Bosworth的抽象层,例如LN Service,它可以提供更友好的API。
LNET
在开发LN应用程序时,通常遵循regtest→testnet→mainnet方法,但根据您的应用程序大小和要求,添加额外步骤可能是有意义的。
在2018年Chaincode Lightning Residency的最后一天,来自Blockstream的Christian Decker演示了lnet。 lnet背后的目标是简化初始化LN网络拓扑以进行应用程序测试的过程。您需要做的就是以graphviz点格式描述网络,lnet将负责其余部分。这个库是基于C-Lightning而不是LND构建的,并没有(但是?)提供与旋转您自己的节点一样多的控制、定制和配置—但它确实有助于使用许多节点进行测试。
结论
我将继续分享这些笔记,因为我将继续开发LightWork并进一步了解Lightning Network。在下一篇文章中,我希望详细介绍用于构建LightWork对分期付款和提款的支持的实际代码片段/实现——真实世界的源代码比1000个单词更有价值。