如何用閃電網路搭建應用程式棧

買賣虛擬貨幣
在這一週中,在構建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系統上執行比特幣。有關Windows和Linux的說明,請參閱https://bitcoin.org/en/full-node

如果您還沒有安裝,請執行以下命令在您的環境中安裝比特幣核心:

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 admin@chaindaily: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 admin@chaindaily: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個單詞更有價值。


免責聲明:

  1. 本文版權歸原作者所有,僅代表作者本人觀點,不代表鏈報觀點或立場。
  2. 如發現文章、圖片等侵權行爲,侵權責任將由作者本人承擔。
  3. 鏈報僅提供相關項目信息,不構成任何投資建議

推荐阅读

;