작성자: Jonas Nick
출처: https://github.com/BlockstreamResearch/scriptless-scripts/blob/master/md/multi-hop-locks.md
"다중 홉 락(Multi-Hop Locks)"은 두 당사자가 자금과 지불 증거를 교환할 수 있게 하는 프로토콜로, 다중 서명 출력에 수동으로 자금을 예치할 필요가 없습니다. 즉, 이 두 당사자는 중간 노드를 통해 연결되며, 이 중간 노드는 양측과 공유되는 다중 서명 출력을 가지고 있습니다. 현재 암호학적 해시 함수 기반의 다중 홉 락은 라이트닝 네트워크 프로토콜에서 전달 목적으로 사용되고 있습니다.
"스크립트리스 스크립트(Scriptless Scripts)"에 기반한 다중 홉 락은 Mimblewimble 메일링 리스트의 게시물에서 처음 등장했으며, 이후 "블록체인의 확장성과 상호운용성을 위한 프라이버시 보호 다중 홉 락"이라는 논문에서 공식적으로 정의되었습니다. 스크립트리스 스크립트를 사용함으로써 최종 거래 크기가 더 작고 일반적인 거래에 더 가까워져 프라이버시가 향상됩니다. 더욱 중요한 것은, 이를 통해 지불 간 연관성을 숨길 수 있다는 점입니다. 즉, 다중 홉 락에 참여하는 노드는 자신이 동일한 경로상에 있는지, 또는 동일한 거래를 전달하고 있는지 알 수 없습니다(시간 순서 및 자금 규모 분석을 제외하고). 지불 연관성 공격은 경로의 첫 번째와 마지막 중간 노드가 동일한 사람에 의해 제어될 때 특히 위험해지는데, 이 경우 해당 사람은 지불의 출처와 목적지를 알 수 있기 때문입니다. 또한 스크립트리스 스크립트 기반 다중 홉 락은 최적화된 지불 증거와 "원자성 다중 경로 지불"(아래 참조)을 지원합니다.
기호
Pij
는 사용자i
와j
의 MuSig2 집계 공개 키입니다. MuSig2 논문에서 더 자세한 내용을 확인할 수 있습니다.T := t*G
는 랜덤하게 선택된 값t
를 "어댑터 비밀 값"이라 하고,T
를 "어댑터 포인트"라고 합니다.psig(i, m, T)
는 서명자i
가 메시지m
에 대해 어댑터 포인트T
를 사용하여 생성한 부분 서명을 나타냅니다. 다른 서명자는 문맥상 결정되므로 기호에 표시되지 않습니다. 이를 "부분" 서명이라고 하는 이유는 다른 당사자의 부분 서명과 결합되어야 유효한 Schnorr 서명이 되기 때문입니다. 또한 이를 "준비된" 부분 서명이라고도 하는데, 어댑터 비밀 값t
가 추가되어야 일반적인 부분 서명이 되기 때문입니다.sig(m, T) := psig(i, m, T) + psig(j, m, T) + t
는 사용자i
와j
의 최종 Schnorr 서명입니다.
프로토콜
초기화 단계에서 지불 수신자는 랜덤하게 z
를 선택하고 z*G
를 지불 송신자에게 보냅니다. 송신자는 성공적인 지불이 자신에게만 z
를 공개하도록 하는 다중 홉 락을 설정합니다. z
에 대한 지식은 현재 라이트닝 네트워크의 "지불 해시"와 유사한 지불 증거가 될 수 있습니다(아래 자세히 설명).
지불 흐름은 왼쪽의 송신자에서 시작하여 중간 노드를 거쳐 오른쪽의 수신자에 도달하는 것으로 표현됩니다.
그런 다음 송신자는 각 노드 i
에 대해 다음과 같은 튜플 (Li, yi, Ri)
를 설정합니다:
- 각
yi
는 균일하게 무작위로 선택된 스칼라입니다. - 송신자 자신의 왼쪽 락
L0
는 이전에 수신자로부터 받은z*G
로 설정됩니다. - 노드
0 ≤ i < n
의 오른쪽 락Ri
와 노드j = i + 1
의 왼쪽 락Lj
는Ri ← Li + yi*G
및Lj ← Ri
로 설정됩니다(위 그림 참조).
주목할 점은, 라이트닝 네트워크에서 송신자는 (Li,yi,Ri)
를 중간 노드에게 직접 보내지 않습니다. 대신 이 값들을 양파 데이터 패킷에 담아 전송하여 중간 노드가 자신의 신원을 알 수 없게 합니다.
업데이트 단계에서 인접한 노드는 현재 라이트닝 네트워크의 HTLC 출력과 유사한 다중 서명 출력을 자신의 오프체인 거래에 포함합니다. 이러한 새로운 유형의 스크립트리스 출력을 "포인트 시간 잠금 계약(PTLC)"이라고 합니다. HTLC와 마찬가지로 PTLC에도 왼쪽 노드가 지불 실패 시 자신의 자금을 회수할 수 있는 만료 조건이 있습니다. 그러나 PTLC는 단순한 2-of-2 MuSig2 출력이며, 해시 락은 부분 서명을 받을 때만 암시적으로 출력에 포함됩니다(아래 자세히 설명). 설명의 편의를 위해 eltoo 형식의 채널을 사용한다고 가정하며, 이는 양측이 대칭적인 상태를 가지고 있고 취소가 필요 없음을 의미합니다.
지불이 만료되지 않으면 인접한 두 노드가 공유하는 스크립트리스 PTLC 출력의 자금은 오른쪽 노드가 인출합니다. 따라서 왼쪽 노드 i
는 해당 PTLC를 소비하고 자금을 오른쪽 노드 j
가 통제하는 출력으로 보내는 거래 txj
를 생성합니다. MuSig2 서명 프로토콜에 필요한 논스 교환은 더 편리한 시기(예: 연결 설정 시)에 이루어졌다고 가정하므로, 이 단계의 통신은 지불 프로세스의 핵심이 되지 않습니다.
새로운 PTLC 알림을 받으면 오른쪽 노드 j
는 거래 txj
와 psig(j,txj,Lj)
라는 해당 거래에 대한 부분 서명을 생성합니다. 왼쪽 노드는 이 부분 서명을 확인한 후 다음의 두 경우 중 하나에서 자신의 부분 서명을 오른쪽 노드에게 보냅니다:
- 왼쪽 노드가 송신자인 경우
- 왼쪽 노드
i
가 이전 노드i-1
로부터txi
에 대한 부분 서명psig(i-1,txi,T-yi*G)
를 받은 경우. 이 부분 서명과 방금 받은 오른쪽 노드의 부분 서명을 결합하면, 오른쪽 노드가 자금을 소비하면 왼쪽 노드가 왼쪽 락을 열어txi
로 자금을 회수할 수 있습니다(위 그림 참조).
따라서 업데이트 단계는 가장 왼쪽의 노드 쌍부터 가장 오른쪽의 노드 쌍까지 진행됩니다. 왼쪽 노드의 부분 서명을 받은 후 오른쪽 노드는 자신의 왼쪽 락 비밀 값을 알게 되면 신속하게 서명을 완성할 수 있습니다. 전체 통신 라운드를 줄이기 위해 초기화 단계와 업데이트 단계를 함께 수행할 수 있습니다(예: 라이트닝 네트워크의 양파 데이터 패킷 사용).
정산 단계는 수신자가 왼쪽 노드의 부분 서명을 받은 후 시작됩니다. 다중 홉 락은 송신자가 설정했으므로, 수신자는 자신의 비밀 값 z
를 왼쪽 노드의 부분 서명에 추가하고 자신의 부분 서명을 더하여 최종 서명을 얻을 수 있습니다. 이제 오른쪽 노드(수신자)는 거래를 브로드캐스트하고 온체인에서 정산할 수 있습니다(왼쪽 노드가 사라지거나 사기를 시도하는 경우).
왼쪽 노드가 거래 서명을 알게 되면 이전에 오른쪽 노드로부터 받은 부분 서명과 자신의 부분 서명을 빼서 오른쪽 락 비밀 값을 알 수 있습니다.
sig(tx,T) - psig(i,tx,Ri) - psig(j,tx,Lj) = yj
또는 오른쪽 노드가 비밀값 yj
를 직접 왼쪽 노드에게 보내고 LN-penalty 기반 업데이트 거래 또는 eltoo 기반 정산 거래를 요청하여 PTLC를 제거할 수 있습니다. 그러면 왼쪽 노드의 출력은 지불 금액이 감소하고 오른쪽 노드의 출력은 지불 금액이 증가합니다. 왼쪽 노드가 업데이트에 따르지 않더라도 오른쪽 노드는 PTLC 만료 전에 자신의 거래를 브로드캐스트할 수 있습니다.
어쨌든 수신자가 지불을 받으면 왼쪽 노드는 오른쪽 잠금 비밀값을 알 수 있고 yi
를 빼서 자신의 왼쪽 잠금 비밀값을 계산할 수 있으며 자신의 최종 Schnorr 서명을 생성할 수 있습니다. 이 과정은 송신자까지 계속되며, 송신자는 지불을 완료하는 데 사용된 지불 증거 z
를 알게 됩니다.- 업데이트 단계에서 그들은 왼쪽의 피어로부터 비트코인(BTC)을 받게 될 것입니다: 그들은 아직 어떤 것도 보내지 않았기 때문에 유일한 인센티브는 그들이 받게 될 전달 수수료입니다
- 정산 단계에서 그들은 자신의 오른쪽 피어에게 비트코인(BTC)을 보냈습니다: 이제 그들은 입금 지불을 받기 위해 지불 증거를 다시 보내는 인센티브가 있습니다