当前位置:首页 > 物联网 > 区块链
[导读] 在这一周中,在构建LightWork Web应用程序的第一个版本时,我遇到了一些架构问题,主要与处理ln节点和我的Web应用程序之间的bolt11发票(core to ln)有关。在经历了(大部

在这一周中,在构建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个单词更有价值。

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

C语言是一种广泛应用于软件开发领域的编程语言。它是由贝尔实验室的Dennis Ritchie在20世纪70年代初创建的,旨在为UNIX操作系统的开发提供一种高级编程语言。C语言具有简洁、高效、可移植性强等特点,因此成为了...

关键字: C语言 操作系统 应用程序

北京2023年9月19日 /美通社/ -- 随着科技的快速发展,我们正处在一个数据爆炸的时代。超大规模数据中心作为数据的重要存储和处理场所,其数量在不断增长,与之而来的数据量也在呈指数级增长。这不仅包括原始数据,还包括分...

关键字: 分布式 节点 软件 数据中心

深圳2023年9月5日 /美通社/ -- 近日,山东贝工光电科技有限公司旗下品牌Eiperfic 未来光iSulight全光谱护眼吸顶灯获得了TÜV南德意志集团(以...

关键字: 吸顶灯 LIGHT RF IC

(全球TMT2023年9月5日讯)在2023年华为云沙特峰会上,华为宣布,华为云利雅得节点正式开服。本次开服后,利雅得节点将成为华为云服务中东、中亚和非洲的核心节点。华为云利雅得节点通过3AZ(可用区)架构,提供了高可...

关键字: 节点 华为云 云服务 GO

沙特阿拉伯利雅得2023年9月4日 /美通社/ -- 在2023年华为云沙特峰会上,华为宣布,华为云利雅得节点正式开服,推动该国数字经济增长。 本次开服后,利雅得节点将成为华为云服务中东、中亚和非洲的核心节点,可提供创...

关键字: 华为云 节点 AI 数字化

全闪存存储的历史性时刻到来! 北京2023年8月30日 /美通社/ -- Gartner最新数据显示,2023年第一季度全球外部存储市场同比增长0.5%;其中,全闪存阵列同比增长3.6%,市场规模超过非全闪存阵列,占整...

关键字: 数据中心 数据存储 节点 机械硬盘

洛杉矶、马德里和墨西哥城2023年8月30日 /美通社/ -- 如今,父母和看护者越来越担心孩子们的屏幕暴露和屏幕互动。 为指导父母为家人做出理想的屏幕时间决策,排名第一的儿...

关键字: LINGO BSP 应用程序 COM

瓦努阿图维拉港2023年8月28日 /美通社/ -- Vantage(或"Vantage Markets")欣然宣布在Vantage应用程序上推...

关键字: GE AN 信号 应用程序

杭州2023年8月25日 /美通社/ -- 8月17日,以"绿色永续制造"为主题,正泰新能常务副总裁、可持续发展官黄海燕在在近期的一次公开演讲中,公布了以2028年、2035年和2050年为主要时间节...

关键字: 可持续发展 光伏组件 ROM 节点

(全球TMT2023年8月14日讯)亚马逊云科技日前宣布在以色列(特拉维夫)推出亚马逊云科技基础设施区域。亚马逊云科技的区域由一个地理区域内的多个相互独立、且在物理上分隔的可用区组成。亚马逊云科技以色列(特拉维夫)区域...

关键字: 亚马逊 应用程序 开发者 数据中心
关闭
关闭