세 번째 장에서는 라이트닝 네트워크가 어떻게 동작하는지 간단하게 살펴본다.
- 결제 채널(Payment Channel) 이란?
- 채널 파트너라고 부르는 두 라이트닝 노드간의 재정적 관계(financial relationship).
- 실제 비트코인을 할당(funding)해서 사용한다.
- 결제 채널의 기본 사항
- 비트코인 블록체인의 2-of-2 다중서명 주소를 기반으로,
- 채널 파트너는 이 다중서명 주소를 통해 거래(트랜젝션 생성)를 하고,
- 거래 트랜젝션을 블록체인에 보내지 않고 보유한다. (Off-chain)
- 새로운 거래(트랜젝션)이 발생하면 이전 거래가 취소되며 이전 거래로 돌아갈수 없다.
- 결제 라우팅
- 결제 할 노드와의 직접적인 채널 연결 없이 연결된 채널의 확장을 통해 결제하는 방법.
- A와 B가 연결되어 있고, B와 C가 연결되어 있을때 라우팅을 통해 A에서 C로 결제가 가능하다.
- 비트코인 Smart contract 의 확장으로 채널 파트너를 보호하고, 서로에 대한 신뢰가 필요없는(trustless) 방식으로 결제를 전달한다고 되어 있다.
- 채널 구성 시 2-of-2 다중서명 주소로 미리 서명된 비트코인 트랜젝션을 사용하기 때문에 라이트닝 네트워크상의 신뢰는 비트코인 네트워크의 신뢰성을 가져간다.
- Gossip 프로토콜을 사용해 모든 참가자에게 채널(Network topolgy) 정보를 배포하고, 결제 노드는 이 정보를 바탕으로 결제 경로를 찾는다.(pathfinding)
- 결제 채널의 제한 사항
- 시간: Peer 간의 트랜젝션(수백바이트)를 전송하는데 걸리는 시간
- Capacity: 채널이 열릴 때 채널에 펀딩되는 비트코인의 양(사토시)
- 비트코인 트랜젝션의 최대 크기: 전 채널을 통해 동시에 전달되는 트랜젝션(라우팅되는 것도포함)의 갯수 도 포함
- 결제 채널의 특징
- 즉시성
- 채널 내에서의 결제는 즉각적으로 확인 가능(인터넷 통신 속도에 의존)
- 결제 시 비트코인 블록 검증이 필요 없음
- 비트코인 블록이 약 10분 마다 채굴되므로 이 시간을 기다릴 필요가 없다.
- 채널 파트너간의 신뢰가 필요없도로 암호화 프로토콜이 구성된다.
- 채널의 응답이 없거나 사기에 대해서는 비트코인 시스템이 "법원" 역할을 하도록 요청가능.
- 채널이 종료되기전 이루어진 거래에 대해서는 해당 채널만 알수 있음.
- 채널 open/close 트랜젝션만 비트코인 블록체인에 저장되므로.
- 자금 거래 (Funding Transaction, 이하 FT)
- 채널 Open 시 사용되는 트랜젝션.
- 2-of-2 다중서명 주소를 기본 빌딩 블록으로 사용,
- 다중서명 주소로 비트코인을 채널에 전달해 자금을 제공.
- 이 거래는 블록체인에 저장됨(온체인 수수료 발생).
- 약정 거래 (Commitment Transaction, 이하 CT)
- 채널내에서 파트너에게 자신의 채널 잔액(balance)인 사토시를 지불하는 트랜젝션.
- 작동 방식
- (A와 B가 100,000 사토시 용량의 채널을 개설하는 예를 들어본다)
- A: 새로운 개인/공개키 쌍을 생성하고, B에게 open_channel 메시지 전달.
- B: 개인/공개키 쌍을 생성하고, A에게 accept_channel을 전달함으로써 채널 open을 수락.
- A: 잠금 스크립트(Lock script)를 사용해 다중서명 주소로 100k 사토시를 보내는 FT 생성
- (SC: 2 <Pubkey_A> <Pubkey_B> 2 CHECKMULTISIG)
- A: FT에 대한 서명과 트랜젝션ID를 함께 funding_created 메시지로 전달.
- A/B: CT 버전을 생성. 이 트랜젝션은 FT output을 사용하고, A의 주소로 모든 비트코인을 전달하는 내용이 포함된다.
- A와 B는 CT를 교환 할 필요가 없고, 그들의 서명만 교환 (모든 구성을 알고있고, 독립적 구축이 가능하기 때문)
- B는 A의 CT에 대한 서명을, funding_signed 메시지 통해 A에게 보냄.
- A는 FT을 비트코인 네트워크에 브로드캐스트.
- 이후 채널 잔액(balance)가 바뀔때마다 CT(A와 B 사이의 최신 잔액이 인코딩된)이 생성되며 서명이 교환됨.
- 이전 상태를 이용한 부정행위 (Cheating with Prior State)
- 모든 CT은 블록체인에 브로드캐스트 할 수 있고, 검증에도 문제가 없다.
- 위 예에서 A가 B에게 물건을 구매하고, 라이트닝을 통해 잔액을 보낸 후, 최초의 CT(A가 100k 사토시를 가지는)를 게시 할 수도 있다. CT에는 B의 서명이 있으므로 이 행위 자체를 막을 수 없다.
- 이런 행위를 막기위해 패널키 매커니즘이 있으며,
- 패널티에 의해 부정 행위를 한 대상의 상대방이 모든 잔액을 가져가고,
- 잔액을 완전히 소모한 상태에서의 부정행위 방지를 위해 라이트닝 프로토콜은 채널 파트너가 최소 잔액를 유지하도록 요구한다.
- 패널티 매커니즘의 작동 방법
- CT의 output을 쓰기 위한 아래의 두 가지 안정 장치를 사용한다.
- 시간 지연 (Timelock delay)
- CT내에서 자신에게 보내는 잔액은 지정된 시간 이후에 사용 할 수 있도록 한다.
- 최대 2,016개 (약 2주) 블록 수로 설정. (부정한 방법으로 CT를 게시하는 경우 2주를 기다려야 함).
- 지역 값을 파트너간 협상으로 조정 가능. (일반적으로 잔액이 큰 채널일 수록 크게 설정)
- 취소 비밀 (Revocation secret, 이하 RS)
- 부정행위에 대한 패널티를 위해, 자신에게 보내는 잔액에 대해 Timelock을 우회하여 상대방이 해당 금액을 즉시 사용 할 수 있게 한다.
- 채널의 파트너 각각은 마지막 CT에 대한 RS의 절반만 보유하고 있다가, 새 CT에 서명할 때 상대방에게 이전 CT에 대한 RS를 제공함으로써 채널 파트너 모두가 이전 CT가 취소된 거래라는 것을 증명 할 수 있도록 한다.
- A는 B가 이전 CT에 대한 RS를 제공하는 경우에만 B의 새 CT에 서명을 제공한다. (B도 동일)
- 각각의 새 CT의 전송과 함께 이전 거래를 무효화하게 되고, 이전 거래를 효과적으로 취소할 수 있도록하는 "처벌" 비밀을 공유하는 거다.
- 이전 CT는 블록체인에 사용 할 수 있지만, 페널티 메커니즘으로 사기치는게 불리하도록하는 매커니즘인 셈이다.
- 사기꾼의 상대 파트너는 언제든 자신의 잔액을 요청가능하며, (타임락이 걸려 있지 않음)
- 사기꾼이 이전 CT를 게시한 경우 RS를 이용 Timelock을 우회하여 사기꾼을 처벌 가능. (사기꾼 잔액 청구)
- 채널내 잔액이 업데이트될 때마다 새 CT와 이전 RS가 생성되고 저장되어야 하며, 채널이 열려있는 동안 나중을 위해 보관해야 한다.
- RS를 도출하는데 사용되는 smart derivation 매커니즘으로 가장 최근의 RS만 저장하면 된다고 한다.
- 채널 발표 (Announcing the Channel)
- Public 채널
- LN의 gossip 프로토콜을 사용해 채널 존재, capacity, fee에 대해 다른 노드들에 알림.
- 새 노드가 LN에 합류하면 Peer로 부터 gossip 프로토콜로 전파된 채널들을 수집, LN의 내부 맵을 구축하며,
- 맵을 사용해 지불 경로를 찾고 채널간 연결을 수행.
- Unannounced channel (미고지 채널)
- 채널이 사용되는 동안에는 채널의 정보가 공유되지 않지만, close 시 정보가 드러남. (비공개가 아닌셈)
- 채널 닫기 (Closing the Channel)
- 채널을 열고 닫을때 마다 비트코인 온체인 수수료가 발생하니, 닫지 않는데 가장 좋은 방법이라고 한다.
- Rebalancing
- 채널을 오래 유지하기 위해, 한 방향으로 채널을 용량을 사용하고, 다시 반대 방향으로 사용하는 개념.
- Channel closing이 필요 한 예,
- 보안상, 잔액을 cold storage로 보내야 할 때
- 파트너의 응답이 없을 때
- 파트너의 연결이 원할하지 않아 다른 채널로 연결이 필요 할 때
- 파트너의 SW버그 또는 프로토콜 위반으로 자금을 보호하기 위해
- 3 ways to closing channel
- 상호 협의
- 두 파트너가 동의
- CT와 유사한 closing transaction을 준비, 마지막 잔액을 인코딩, timelock은 설정하지 않음.
- On-chanin 거래 수수료는 채널 open을 요청한 파트너가 지불.
- 수수료에대해 동의 후, closing transation에 서명.
- closing transation이 비트코인 네트워크에 브로드캐스트되고, 검증되면 채널이 닫히고, 각 채널 파트너는 자신의 몫을 받음.
- 강제 종료 (Force close)
- 마지막 CT를 게시하면 됨.
- Timelock으로 output이 제한되나 상대 파트너의 output은 즉시 사용 가능.
- 이전 CT를 게시한 경우(부정행위) 상대 파트너가 RS을 사용하여 이의제기하고, 처벌할 수 있는 기회가 제공됨.
- 수수료가 높음
- 프로토콜 위반 (Protocol breach)
- 이전 CT를 게시하는 경우
- 프로토콜 위반 행위의 감지를 위해 노드는 online 상태여야하며, 새로운 블록과 트랜젝션의 관찰해야 함.
- 위반을 감지하고, 처벌을 시행하면 채널의 모든 자금을 받게 됨.
- channel closing 보다 다소 빠르게 진행됨.
- 위반을 감지 못한채 Timelock이 만료되면 게시된 CT의 output에 해당하는 자금을 받게 됨.
- 제 3자에 의해 탐지 될수 있으며, 아래 SW로 탐지 가능.
- 24시간 동작하는 라이트닝 노드
- 채널 감시를 위해 직접 실행하는 watchtower 노드
- 돈을 지불하고 실행하는 3rd-party watchtower 노드
- LN 소프트웨어는 상황에 따라 사용할 수 있는 최상의 closing 매커니즘을 자동으로 선택한다고 한다.
- 인보이스 (Invoices)
-
- LN에서 대부분의 지불은 수신자가 생성한 인보이스로 시작.
- payment hash, 수신자, 금액 및 옵션 텍스트 description 정보가 포함된다.
- Payment Hash (PH)
- invoice의 가장 중요한 부분.
- B의 PH 생성 과정
- 랜덤 숫자 R을 선택. (preimage or payment secret 이라 부름)
- SHA256을 사용해 H를 생성. (H = SHA256(R))
- 결제 하기 (Delivering the Payment)
- P2P Gossip Protocol
- 채널을 LN에 알리고, LN의 토폴로지 정보를 공유하는데 사용.
- channel_announcement
- 채널 open 후 노드는 channel_announcement 메시지를 통해 피어에게 보낼수 있음.
- 수신한 피어는 메시지의 정보를 확인하고 비트코인 블록체인에서 funding transation이 검증되었는지 확인.
- 검증 후 연결된 또 다른 피어 노드에게 gossip 메시지를 전달, 또 전달하는 식으로 전체 네트워트에 알려짐.
- 이전에 전달하지 않은 노드에만 전달.
- node_announcement
- 노드에 대한 정보를 알리는데에 사용. (노드가 적어도 하나의 공개 채널을 가져야 사용 가능)
- channel_update
- payment channel에는 네트워크의 다른 참가자들에 대한 다양한 메타데이터가 있고, 라우팅 결정에 사용됨.
- 메타데이터 변경 시 channel_update 메시지를 통해 공유되며, 하루에약 4번(채널당)만 전달 됨.
- 경로 찾기 (Pathfinding)
- Source 부터 Destination 까지 경로를 찾는 과정.
- source-based pathfinding 프로토콜 사용. (보내는 사람이 경로를 찾아야함)
- 지불을 전달할 수 있는 충분한 유동성있는 경로를 찾을때까지 경로를 반복적으로 시도.
- "probing(탐색)"은 노드나 지갑에서 수행.
- 라우팅 (Routing)
- 경로를 통해 지불하는 프로세스.
- onion-routed 프로토콜 사용. (경로가 계층화되어 있고, 각 계층이 암호화되어 있어 한번에 하나의 노드에서만 정보를 볼 수 있음)
- 라우팅에 사용되는 payment 패키지를 "onion"이라 부름.
- 최종 수신자에 대한 지불 정보를 생성, 수신자만 해독할 수 있는 암호화 계층으로 암호화.
- 그 다음, 경로상 최종 수신자 바로 앞에 있는 노드에 대한 정보를 생성하고 암호화하는 작업을 발신자 바로 앞의 것까지 반복하여 양파를만듬.
- 양파를 받은 수신자는 제일 바깥쪽의 껍질을 까듯, 자신의 암호화키로 복호화하고 정보를 읽은 후 다은 경로의 노드로 양파를 전달함.
- LN에서 사용하는 onion routing 프로토콜의 속성
- 프라이버시: 중개 노드는 양파를 전달하고/전달 할 채널만 볼수 있음. (누가 라우팅을 시작했고, 대상이 누구인지 알수 없음)
- 단일 TCP/IP 패킷과 Link 계정층(이더넷) 프레임에 들어갈 만큼 사이즈가 작음.
- 양파의 사이즈가 경로 어디에 있던 동일하므로 노드 자신이 몇번째 인지 알수 없음.(벗겨진 레이어에는 암호화된 junk 데이터로 채움)
- 각 계층에 HMAC(해시 기반 메시지 인증코드)를 가지고 있어 조작이 불가능.
- 최대 약 26개의 홉, 또는 원하는 층으로 생성 가능.
- 모든 홉에 대한 다른 암호화키를 사용. 키를 재사용하지 않기 때문에 특정 시점에 노출된 키로 해독이 불가능.
- 동일한 프로토콜을 사용해 발신자에게 에러를 전달할 수 있음.
- 결제 전달 알고리즘 (Payment Forwarding Algorithm)
- 중개 노드는 update_add_htlc 라고하는 라이트닝 메시지를 payment hash와 onion과 함께 수신하고, 아래 단계를 실행한다.
- onion의 외부 레이어를 해독하고 무결성을 확인.
- 채널 fee와 나가는 채널의 capacity를 통해 라우팅 가능함을 확인.
- 수신 채널에서 파트너와 같이 채널의 상태를 업데이트.
- onion의 길이를 유지하기 위해 패딩을 추가.
- 라우팅 힌트에 따라 수정된 onion과 update_add_htlc 메시지를 outgoing payment 채널에 전달.
- 발신 채널에서 파트너와 협의하여 채널 상태를 업데이트.
- P2P 통신 암호화
- LN 프로토콜은 참가자간의 P2P 프로토콜이며, 피어간의 모든 통신은 Lightning Message를 통해 전송된다.
- 메시지는 Noise Protocol Framwork 암호화 통신 프레임워크를 사용해 암호화 된다.
- 인증, 암호환, 순방향 비밀성 및 ID 프라이버시를 제공하는 암호화 프로토콜을 구성 가능.
- WhatsApp, WireGuard와 같은 P2P 암호화 통신 시스템에서 사용.
- 개발측면에서 패킷 캡쳐나 Wireshark로 분석이 어렵고,
- Lightning dissector와 같은 특정 노드 관점에서 프로토콜을 해독할 수 있는 플그인을 사용해야함.
- 비트코인 거래와의 차이점
- Address vs Invoces, Trancsations vs Payments
- Selecting Outputs vs Finding a Path
- Change Outputs on Bitcoin vs No Change on Lightning
- 채굴 수수료 vs 라우팅 수수료
- Varying Fees Depending on Traffic vs Announced Fees
- Publick Bitcoin Transaction vs Private Lightning Payments
- 대기 vs 즉시 정산
- Capacity 제한
- 지불 금액에 대한 인센티브
- Using the Blockchain as Ledger(원장) vs as a Court System
- Offline vs Online, Async. vs Sync.
- Satoshis vs Millisatoshis
- 비트코인 거래와의 공통점
- 비트코인을 사용
- 검증된 지불의 불가역성과 최종성
- 신뢰 및 Counterparty 리스크
- 무허가 오퍼레이션
- Opensource and Open System