Lightning Network (lnd)

Lightning Network (lnd)

LND는 Lightning Labs에 의해 Go로 구현되었으며, 2018년 초부터 Mainnet에서 사용되고 있다.

LND 빌드

LND는 Go를 설치한 후 다음과 같이 빌드하고, 설치(install)할 수 있다. 이 빌드는 Lightning Network 데몬인 lnd 파일과 Lightning 클라이언트 도구인 lncli 를 생성한다.

    $ git clone https://github.com/lightningnetwork/lnd
    $ cd lnd
    $ git checkout v0.16.3-beta
    $ make install

lnd 데몬 실행

LND 의 Lightning Network 데몬(lnd)은 아래와 같이 실행한다. lnd는 먼저 bitcoin 데몬(bitcoind, btcd 등)을 실행한 후에 lnd를 실행한다. LND는 디폴트로 ~/.lnd 폴더에 데이타를 생성한다. lnd 데몬은 ~/.lnd/lnd.conf 구성파일을 사용할 경우 lnd 만을 실행하고, 아래 (2)에서 처럼 모든 아규먼트를 직접 쓸 수도 있다.

    // (1) ~/.lnd/lnd.conf를 사용하는 경우
    $ lnd

    // (2) lnd 커맨드라인 아규먼트를 사용하는 경우 
    $ lnd --bitcoin.active --bitcoin.testnet --bitcoin.node=bitcoind --bitcoind.rpcuser=user --bitcoind.rpcpass=pwd

lncli 클라이언트 실행

LND의 클라이언트 프로그램은 lncli 이며, 테스트넷에서 실행하기 위해서는 --network=testnet 아규먼트를 지정한다.

    // Mainnet
    $ lncli getinfo

    // Testnet
    $ lncli --network=testnet getinfo 

처음 lnd를 실행한 경우, Lightning Network에서 사용할 Wallet을 생성하여야 한다. 이를 위해 아래와 같이 lncli create 명령을 사용하여 처음 Wallet을 생성한다. 이때 월렛에 대한 니모닉을 생성, 저장하게 된다. 일단 Wallet이 한번 생성된 후, 다음에 lnd를 다시 구동할 경우에는, lncli unlock 명령을 사용하여 월렛을 unlock 하면 된다. lncli 에서 사용하는 모든 명령들(예: getinfo 등)은 Wallet을 생성/Unlock 한 후에 사용할 수 있다.

    # Wallet 생성
    $ lncli --network=testnet create    
    # Wallet Unlock
    $ lncli --network=testnet unlock    

lncli 에서 다음과 같은 명령으로 기초적인 정보를 얻을 수 있다.

    $ lncli --network=testnet getinfo
    $ lncli --network=testnet listchannels
    $ lncli --network=testnet walletbalance
    $ lncli --network=testnet channelbalance

Lightning Network 채널 오픈

Lightning Network 을 사용하기 위해서는 먼저 Lightning Network Peer와 채널을 오픈해야 한다. 먼저 Lightning Network 월렛의 주소를 만들고, Lightning Network Peer와 연결한 후, 초기 펀드를 보내 채널을 오픈한다.

// (1) LN 새 주소 얻기
$ lncli --network=testnet newaddress p2wkh
{
   "bech32": "tb1qzrvad53f9hgf4nj7c4rp8md338ng74ynddwcjr"
}

// (2) Bitcoin network에서 LN 주소로 코인 보내기 
$ bitcoin-cli -testnet sendtoaddress "tb1qzrvad53f9hgf4nj7c4rp8md338ng74ynddwcjr" 0.011

// (3) LN 주소 코인이 보내졌는지 확인
$ lncli --network=testnet walletbalance

// (4) LN Peer와 연결 (https://1ml.com/testnet 에서 Peer 검색)
$ lncli --network=testnet connect 03bae2db4b57738c1ec1ffa1c5e5a4423968cc592b3b39cddf7d495e72919d6431@34.192.102.161:9735

// (5) 채널에 펀드를 보내면서 채널 오픈
$ lncli --network=testnet openchannel --node_key 03bae2db4b57738c1ec1ffa1c5e5a4423968cc592b3b39cddf7d495e72919d6431 --local_amt 1100000 --sat_per_vbyte 1

openchannel 명령으로 채널을 오픈한 후에는 listchannels 명령으로 채널 오픈 상태를 체크할 수 있다.

$ lncli --network=testnet listchannels

Lightning Network Invoice 생성

Lightning Network에서 Payment를 받기 위해서는 "Invoice"를 생성해서 전달하고, Sender는 이 Invoice를 "Pay"하게 된다. lncli 에서 Invoice를 생성하기 위해서는 "addinvoice" 명령을 사용하고, 기본적인 아규먼트로 얼마를 보내야 하는지와 간단한 메모(memo)를 적게 된다. 이밖에, Invoice가 언제 Expire하는지 등의 추가적인 사항들을 적을 수도 있다.

    // Invoice 생성
    $ lncli --network=testnet addinvoice --amt 1500 --memo "lunch"
    {
        "r_hash": "71ff516d138e9a79a15ec6b69ea1ffd1db52026215c6423db1d0fb780c198e00",
        "payment_request": "lntb15u1pj5sgpepp5w8l4zmgn36d8ng27c6mfag0l68d4yqnzzhryy0d36rahsrqe3cqqdqgd36kucmgcqzzsxqyz5vqsp5a3xmte73cs58lmrnjksjkqwyvy9uz7rvyp4rlv996vu72thjzuss9qyyssqzqfa77f7a9c7686l34uf8tgpafh580hgdl30svumxsw0wa8gdfh9r5acraxzu7x7zcxzj932hw80s8g56fucj8926et8cmer93lpwdspxdd59z",
        "add_index": "2",
        "payment_addr": "ec4db5e7d1c4287fec7395a12b01c4610bc1786c206a3fb0a5d339e52ef21721"
    }    

Invoice의 payment_request는 lncli decodepayreq 명령을 통해 내용을 디코딩해서 출력해 볼 수 있다.

$ lncli --network=testnet decodepayreq lntb15u1pj5sgpepp5w8l4zmgn36d8ng27c6mfag0l68d4yqnzzhryy0d36rahsrqe3cqqdqgd36kucmgcqzzsxqyz5vqsp5a3xmte73cs58lmrnjksjkqwyvy9uz7rvyp4rlv996vu72thjzuss9qyyssqzqfa77f7a9c7686l34uf8tgpafh580hgdl30svumxsw0wa8gdfh9r5acraxzu7x7zcxzj932hw80s8g56fucj8926et8cmer93lpwdspxdd59z

LN Invoice 지급(payment)

"ln***" 으로 시작되는 Invoice에 대해 Sender는 코인을 보내 지불할 수 있다. Invoice 지급은 lncli payinvoice 명령을 사용하면 된다. payinvoice 명령을 실행하면 Invoice의 내용을 출력해 주는데, 이것이 맞는 지 확인하고, pay 하면 된다.

$ lncli --network=testnet payinvoice lntb15u1pj5sgpepp5w8l4zmgn36d8ng27c6mfag0l68d4yqnzzhryy0d36rahsrqe3cqqdqgd36kucmgcqzzsxqyz5vqsp5a3xmte73cs58lmrnjksjkqwyvy9uz7rvyp4rlv996vu72thjzuss9qyyssqzqfa77f7a9c7686l34uf8tgpafh580hgdl30svumxsw0wa8gdfh9r5acraxzu7x7zcxzj932hw80s8g56fucj8926et8cmer93lpwdspxdd59z

채널 닫기 (Close Channel)

Lightning Network은 온체인에 2번 기록하는데, 처음 채널을 오픈할 때와 마지막 채널을 닫을 때이다. 보통 채널을 오픈한 후 Lightning Network 상에서 여러 번의 트랜잭션들이 오고 간 후에, 마지막에 채널을 종료하게 되는데, 이때 채널 잔액이 Lightning Network 월렛 주소로 옮겨지게 된다.

채널을 닫기 위해서는 lncli closechannel 명령을 사용한다. closechannel 명령 뒤에는 channel point를 지정하는데, channel point는 listchannels 명령에서 볼 수 있다. listchannels 명령에서 확인할 것은 (1) 채널이 현재 active 인지 (active: true), 그리고 (2) channel point 값이다. 만약 상대방 채널이 오프라인이면, 나중에 다시 시도해야 하는데, 만약 계속 오프라인이면 최후의 방편으로 force close를 사용할 수 있다.

$ lncli --network=testnet listchannels
{
    "channels":  [
    {
        "active":  true,
        "channel_point":  "bee8758efe0d8a12d518508be088f482f039e5ecf9687f65f8c9aa8411eac0b7:0",
    ...
}
$ lncli --network=testnet closechannel bee8758efe0d8a12d518508be088f482f039e5ecf9687f65f8c9aa8411eac0b7 0

참고: Docker를 사용하여 한 머신에서 여러 lnd 데몬 실행하는 방법

본 웹사이트는 광고를 포함하고 있습니다. 광고 클릭에서 발생하는 수익금은 모두 웹사이트 서버의 유지 및 관리, 그리고 기술 콘텐츠 향상을 위해 쓰여집니다.