얼마전에 wallet of satoshi
앱을 잘 쓰고 있었는데 갑자기 미국에서 wallet of satoshi
앱 사용이 금지되었다는 소식이 전해졌다. 당시 많은 사람들이 wallet of satoshi
로부터 탈출하는 소동이 벌어졌다.
이는 wallet of satoshi
가 커스터디 기반 서비스이기 때문에 벌어진 일이다. 내가 직접 노드를 소유했다면 이런 불안 요소를 없앨 수 있다. 이번 기회에 직접 라이트닝 네트워크 노드를 설치하기로 마음을 먹었다.
umbrel에 비트코인 노드가 설치된 환경에서 라이트닝 네트워크 노드를 구축하는 방법을 알아보자.
umbrel 앱스토어에서 Lightning Node 앱을 찾아 설치하자. Lightning Node 앱이 동작하기 위해서는 비트코인 노드의 동기화 작업이 끝나있어야 한다.
앱 설치 후 실행을 해보면 비트코인과 라이트닝 월렛이 보인다. 당연한 얘기지만 라이트닝 노드에서 채널을 열기 위해서는 비트코인이 필요하다. 해당 비트코인 월렛으로 원하는 수량의 비트코인을 입금한다. 인터넷에 연결된 핫 월렛이므로 너무 많은 양의 비트코인을 입금하는 것은 추천하지 않는다.
Lightning Node 앱으로도 라이트닝 노드를 관리할 수 있지만 기능이 부족하다. 라이트닝 노드 관리를 도와주는 여러 앱이 있는데 우리는 그 중에서 ThunderHub를 활용해보자. umbrel 앱스토어에서 ThunderHub 앱을 찾아 설치하자.
Channels
메뉴에서는 개설된 채널에 대한 상세한 정보를 확인할 수 있다. 원한다면 이미 개설된 각 채널의 수수료 정보를 수정할 수도 있다. Lightning Node 앱에서는 지원하지 않는 기능이다.
위 그림처럼 각 채널별로 수수료와 잔액 정보를 확인할 수 있다. 초록색은 inbound 잔액을 나타내며 내가 받을 수 있는 수량을 뜻한다. 반대로 파란색은 outbound 잔액을 나타내며 내가 보낼 수 있는 수량을 뜻한다.
잔액이 특정 채널로 쏠려있는 경우에는 Rebalance
메뉴를 활용할 수 있다. 원하는 두 채널을 선택하고 수량을 입력하면 해당 수량 만큼 잔액을 조정해준다.
아래는 Rebalance 성공 화면이다. 21 사토시를 수수료로 지불하고 간편하게 잔액을 조정했다.
이 기능은 outbound가 많은 채널로 사토시를 내보내고 inbound가 많은 채널로 사토시를 받는 구조로 되어있다. 따라서 모든 채널이 inbound 혹은 outbound 중 한쪽으로 쏠려있는 경우에는 사용할 수 없다. 모든 채널의 잔액이 한쪽으로 쏠려있는 경우에는 새로운 채널을 개설하는 등의 온체인 트랜잭션을 발생시키는 방법을 사용할 수 밖에 없다. 요즘처럼 비트코인 온체인 수수료가 비싼 시기에는 매우 부담스러울 수 있다.
두 노드가 같은 금액으로 채널을 개설하면 잔액이 균형을 이뤄서 좋겠지만 일반적으로는 한쪽 노드에서 모든 잔액을 부담하면서 채널을 개설하게 된다. 처음 노드를 설치한 후 급한 것은 본인이기 때문에 보통 outbound 채널부터 열게 된다.
outbound 채널을 개설하기 위해서는 상대방 노드를 선택해야 한다. 필자는 초기에 가장 유명하다고 생각되는 wallet of satoshi
노드와 채널을 개설했다. wallet of satoshi
노드와 채널을 개설하려면 최소 5,000,000 사토시가 필요하다. 부담스러운 금액이었지만 다른 방법을 몰랐던 필자는 wallet of satoshi
노드로 outbound 채널을 개설했다. 그런데 wallet of satoshi
노드는 fee rate
이 10,000 PPM이라는 것을 뒤늦게 알았다. 사토시 전송 시 중간에 1%의 수수료를 가져간다는 의미다. fee rate
에 대한 자세한 설명은 밑에서 확인할 수 있다.
outbound 채널을 개설하기로 마음 먹었다면 아래와 같은 사이트를 통해서 상대방 노드를 선택하면 된다
상대적으로 inbound 채널 개설하기는 쉽지 않다. outbound 채널은 상대방 노드 ID와 사토시만 있으면 개설할 수 있다. 하지만 inbound 채널은 상대방이 자발적으로 나에게 채널 개설을 해줘야 하는데 이제 막 노드를 설치해서 네트워크 효과를 전혀 발휘하지 못하는 신생 노드에게 채널을 개설해줄 사람은 거의 없다.
outbound 채널만 있고 inbound 채널이 없다면 사토시를 보낼 수만 있고 받을 수는 없다. 보내는 용도로만 사용한다면 inbound 채널은 열지 않아도 괜찮다. 사토시를 보내면 다음부터는 그 만큼 받을 수 있게 된다.
한 가지 방법은 수수료를 지불하고 inbound 채널을 개설하는 것인데, amboss magma 같은 서비스를 이용할 수 있다. 수수료를 지불하면 상대방이 나에게 채널을 열어준다. 하지만 계약된 채널 오픈 기간이 종료되면 채널이 닫힐 수 있다. 게다가 수수료도 꽤 비싸다.
필자가 추천하는 방법은 lightningnetwork swap을 이용하는 것이다. 채널 오픈을 원하는 3~5명이 모여서 서로 채널을 개설할 수 있다. 예를 들어, a, b, c 세 사람이 모이면 a는 b에게 b는 c에게 c는 a에게 약속된 잔액으로 채널을 개설한다. 수수료가 없다는 것이 가장 큰 장점이다. 서로에 대한 신뢰를 기반으로하는 시스템이며 약속을 지키지 않으면 기록이 남아서 나중에 참여하기 힘들 수 있다.
a에서 b를 거쳐서 c로 사토시를 전송할 때 b처럼 중간에서 사토시를 전달하는 행위를 forward라고 부른다. forward 시 b가 정한 정책에 따라 b가 수수료를 받는다.
forward 수수료는 두 가지로 구성되어 있다.
base fee 1,000 msats에 fee rate 100 ppm(0.01%)이라면 10,000 sats forward 시 2 sats를 수수료로 받는다.
수수료 설정은 채널별로 결정할 수 있으며 채널 개설 시 Lightning Node 앱 설정에 입력된 값으로 결정된다. 수수료 변경은 채널 개설 후에도 가능하며 ThunderHub 앱에서도 지원한다.
수수료가 너무 높다면 내 노드를 통해서 거래를 하지 않으려고 할테니 적정 수수료로 설정하는 것이 좋다. 하나의 채널에서도 각 노드별로 수수료 정책이 다를 수 있으므로 채널 개설 후 상대방의 수수료 설정을 참고해보자.
Lightning Node 앱은 Lightning Labs의 LND(라이트닝 네트워크 노드 구현체)를 기반으로 만들어졌다. LND의 cli 명령어를 사용해서 다양한 정보를 조회해보자.
lncli를 사용하기 위해 umbrel에 접속하자.
접속에 성공했다면 채널 목록을 출력하는 listchannels 명령어를 입력해보자.
각 채널에 대한 자세한 정보를 확인할 수 있다.
그 중에서 commit_fee라는 항목은 commitment fee를 의미하며 commitment 트랜잭션의 온체인 수수료를 의미한다. 즉, 나중에 채널을 닫을 때 필요한 온체인 수수료를 따로 빼놓은 자금이다. 채널 잔액에서 차감되므로 라이트닝 네트워크에서 전송할 수 없다. 만약 100,000 sats로 채널을 열었고 commit_fee가 10,000 sats라면 라이트닝 네트워크로 전송할 수 있는 최대치는 90,000 sats이다.
아쉽게도 listchannels에서는 상대방과 나의 forward 수수료(base fee, fee rate)를 확인할 수 없다.
getchaninfo 명령어를 통해 forward 수수료를 확인할 수 있다.
Rebalance
기능이 이 명령어를 사용한다고 추측할 수 있다.umbrel에 설치된 라이트닝 노드에서 직접 사토시를 보낼 수도 있지만 모바일 앱과 연결하면 쉽고 편하게 사토시를 보낼 수 있다. 여러 앱 중에서 필자는 ZEUS 앱을 사용하고 있다. ZEUS 앱 설정에서 가장 위에 있는 메뉴를 누르고 + 버튼
을 누른다.
Lightning Node 앱 메뉴에서는 아래처럼 Connect wallet
메뉴를 눌러서 QR 코드가 보이도록 한다.
ZEUS 앱에서 카메라 버튼을 눌러서 QR 코드를 인식하면 바로 연결이 된다.
앞에서 설명한 내용은 Tor 네트워크를 통한 방법인데 네트워크가 많이 불안정하고 느리다. 가볍고 빠른 라이트닝 네트워크의 특징과는 거리가 멀다.
필자는 tailscale과 같은 private VPN을 선호한다. tailscale 사용 방법은 이전 글을 참고하자.
라이트닝 네트워크에는 다계정 기능이 없어서 기본적으로 하나의 라이트닝 노드는 한 사람의 자금만 관리할 수 있다. 가족 구성원의 자금도 같이 관리하기 위해 추가로 라이트닝 노드를 구축하는 것은 관리 부담이 있다.
이때 Lightning Terminal, LNBits 같은 앱을 활용하면 하나의 라이트닝 노드로 여러 계정을 만들어서 사용할 수 있다.
umbrel 앱스토어에서 Lightning Terminal 앱을 찾아 설치하자. 앱을 실행해서 Lightning Node Connect
메뉴로 이동하고 Create a new session
버튼을 클릭한다. PERMISSIONS
옵션에서 Custom
을 선택하고 Next
버튼을 누른다.
PERMISSION TYPE
에서 Custodial Account
를 선택하면 위 그림과 같은 화면을 볼 수 있다. 여기서 ADD BALANCE
에는 이 계정 사용자에게 할당할 사토시를 입력한다. 이 계정은 여기서 입력한 만큼만 사용할 수 있다. 물론 이후에 이 계정이 받은 사토시가 있다면 ADD BALANCE
에 입력한 것보다 잔액이 늘어날 수 있다.
계정을 생성하면 접속 정보가 담긴 QR 코드를 확인할 수 있다. 이전에 설명했던 경로를 통해 ZEUS 앱에서 QA 코드를 인식해서 연결하면 된다.
필자의 경우 ZEUS를 통한 Lightning Node Connect
계정 연결이 매우 불안정하다. 사용하려고 앱을 켜면 약 40%의 확률로 연결에 실패하고 있다. 같은 네트워크 환경에서 라이트닝 노드 본체 계정은 안정적으로 접속이 되고 있다. 아마도 Lightning Node Connect
에서 개선해야될 문제인 것 같다.
umbrel 앱스토어에서 LNBits 앱을 찾아 설치하자.
설정을 위해서는 Super User 계정이 필요하다. Super User 계정으로 접속하기 위해서는 Super User key가 필요하다.
앞에서 설명한 ssh 명령어로 umbrel에 접속 후 아래 명령어를 입력하자.
출력된 key 값과 함께 아래와 같이 접속하면 Super User 계정으로 동작한다.
LNBits의 최대 장점은 다양한 extension을 제공한다는 것이다. 우리는 모바일 앱 연결을 위한 LndHub와 계정 관리를 위한 User Manager extension을 설치하자.
Add a new wallet
버튼을 이용해서 지갑을 생성하자. 해당 지갑 화면에서 플러스 버튼을 이용해서 충분한 양의 사토시를 할당하자.
User Manager 메뉴에서 사용자와 지갑을 각각 생성하자.
Wallets 박스에서 지갑 모양 버튼을 클릭하면 해당 지갑 화면으로 이동한다.
해당 지갑 화면에서 CREATE INVOICE
버튼을 이용해서 원하는 사토시 수량을 입력한다. 인보이스를 복사하고 Super User 화면에서 만들었던 지갑 화면으로 돌아온다. Super User 지갑에서 PASTE REQUEST
버튼을 클릭하고 복사했던 인보이스를 붙여넣는다. 확인 버튼을 클릭하면 해당 사용자에게 사토시가 전달된다. 이 과정에서 실제 라이트닝 네트워크를 통해 사토시가 전송되는 것은 아니다. LNBits 데이터베이스 상의 숫자만 변경되는 것으로 보인다.
다시 이전 사용자 지갑으로 돌아가서 Extensions 메뉴로 가보자. LndHub를 활성화시키고 LndHub 메뉴로 이동하자. ADMIN URL
QR 코드를 ZEUS 앱에서 스캔하자.
ZEUS 앱도 tailscale를 이용하는 것을 추천한다. tailscale 앱에서 umbrel 주소를 복사하고 ZEUS의 Host 부분에 붙여넣자.
Lightning Node Connect
는 계정 간의 사토시 전송이 안되서 Lightning Node Connect
계정 간에 주고받아야 하는 상황에서는 wallet of satoshi
같은 제 3의 지갑을 proxy로 활용해야 한다.
하지만 다행히도 LNBits는 계정 간 사토시 전송이 가능하다. 계정 간 전송이 가능하다는 점과 Lightning Node Connect
의 불안정한 네트워크로 인해 필자는 LNBits를 주로 활용하고 있다.