용어집 / 라이트닝과 레이어 2
취소 키
- 취소 키란 무엇입니까?
- 취소 키는 라이트닝 커밋먼트 트랜잭션의 지연 출력과 HTLC 출력을 잠그는 블라인드 처리된 공개 키로, 해당 상태를 폐기하는 비밀을 공개하는 순간 채널 상대방이 그 출력을 사용할 수 있습니다.
모든 라이트닝 커밋먼트 트랜잭션은 한쪽이 커밋먼트별 비밀값을 공개하기 전까지 누구도 서명할 수 없는 취소 분기를 포함합니다. BOLT 3은 이 비밀값에 281,474,976,710,655부터 아래로 번호를 매기며, 수신하는 쪽은 49개 슬롯의 배열에 모든 비밀값을 보관할 수 있습니다. 이미 취소한 상태를 공개하면 상대방이 채널 잔액 전부를 가져갈 수 있으며, 이것이 시드 문구로 라이트닝을 백업할 수 없는 이유입니다.
작동 방식
취소 키는 채널의 어느 쪽도 혼자서 개인 키 절반을 계산할 수 없도록 의도적으로 구성됩니다.
노드가 상대방을 위한 새 커밋먼트를 준비할 때, 자신의 revocation_basepoint와 상대방의 per_commitment_point를 가져와, 두 지점을 연결한 값 중 해당 지점을 앞에 쓴 값의 SHA256을 각각에 곱한 뒤 두 결과를 더합니다. BOLT 3은 이 성질을 한 줄로 밝힙니다. 이 구성은 기준점을 제공하는 노드도, 지점을 제공하는 노드도 상대 노드의 비밀값 없이는 개인 키를 알 수 없도록 보장합니다. 개인 키는 나머지 절반이 도착하기 전까지 어디에도 존재하지 않습니다.
그 도착은 하나의 메시지입니다. 상대방이 자신의 새 커밋먼트에 대한 여러분의 서명을 확인하고 나면, 방금 폐기한 상태에 대한 32바이트 per_commitment_secret와 다음 상태에 대한 지점을 담아 revoke_and_ack, 메시지 유형 133으로 응답합니다. 그때부터 여러분은 옛 상태에 대한 revocationprivkey를 계산할 수 있고, 상대방은 그것을 되돌릴 수 없습니다.
이 키는 두 종류의 출력에 나타납니다. to_local 출력은 증인 스크립트가 OP_IF, revocationpubkey, OP_ELSE, to_self_delay, OP_CHECKSEQUENCEVERIFY, OP_DROP, local_delayedpubkey, OP_ENDIF, OP_CHECKSIG로 되어 있는 P2WSH입니다. 소유자는 to_self_delay 블록만큼 기다려야 하지만, 취소 키를 가진 쪽은 서명과 1로 이루어진 증인 스택으로 즉시 지출합니다. 각 HTLC 출력은 같은 키를 SHA256에 RIPEMD160을 적용해 20바이트로 해시한 값을 담고 있으며, BOLT 5는 처벌하는 노드가 사기 친 쪽의 HTLC-success 및 HTLC-timeout 트랜잭션도 그 키로 쓸어내야 한다고 요구합니다.
설계가 영리해지는 지점은 저장 방식입니다. 하나의 채널은 상태마다 하나씩, 전부 추측할 수 없는 256비트 시드 하나에서 비트를 뒤집고 해시하여 생성되는 281,474,976,710,655개의 커밋먼트별 비밀값을 소모할 수 있으며, 인덱스는 올라가지 않고 내려갑니다. 인덱스 끝에 영이 이어지는 비밀값은 그 지점부터 다음 2의 거듭제곱 경계까지의 모든 비밀값을 도출하므로, 수신 노드는 49개의 값과 인덱스 쌍만 보관하고 나머지는 필요할 때 재구성합니다. BOLT 3은 또한 수신하는 쪽이 새로 도착할 때마다 이전 비밀값을 다시 도출해 확인하도록 하므로, 몰래 시드를 바꾼 상대방은 채널을 닫을 때가 아니라 그 자리에서 드러납니다.
비트코인을 구매할 때 이것이 중요한 이유
취소 키는 라이트닝 잔액이 거래소가 보내 주는 온체인 코인과 전혀 다르게 작동하는 이유입니다.
이 사이트에서 리뷰한 지갑 41개 중 라이트닝을 제공하는 지갑들은 상태 문제를 눈에 띄게 다른 방식으로 다루며, 이 차이가 각 지갑의 평점을 설명합니다. Phoenix는 BIP84 경로의 표준 BIP39 시드 뒤에서 휴대폰에 진짜 자체 완결형 노드를 실행하며, 이 사이트의 리뷰는 시드가 채널이 아니라 온체인 대체 수단임을 분명히 밝힙니다. ACINQ가 사라지면 강제 종료를 실행하고 약 720블록, 대략 5일을 기다린 뒤 Electrum으로 온체인에서 복구하게 됩니다. Muun은 단어 목록을 아예 거부하고, 멀티시그 키 두 개와 출력 디스크립터를 담은 Emergency Kit 파일을 건넵니다. 공개된 근거는 니모닉이 키를 백업하지만 코인은 지갑에도 알려야 하는 스크립트에 있다는 것입니다. Wallet of Satoshi의 기본 수탁 모드는 여러분을 문제에서 빼내는 방식으로 문제를 없앱니다. 회사가 모든 비밀값을 보관하며, 그래서 이 사이트에서 주의 상태와 2.7 평점을 받고, 2023년 11월 23일에 미국 고객 서비스를 중단하고 2026년으로 넘어가는 시점에 EU 전역에서 서비스를 철회하여 EU 보유자에게 자기 보관 모드만 남길 수 있었습니다. BlueWallet은 온체인에서 자기 보관형이며 그 점에서 4.2 평점을 받았지만, 그곳의 라이트닝 잔액은 온체인 복구 문구가 보장하지 않는 LNDHub 계좌에 있습니다.
프로토콜은 안전망을 하나 제공하며, 그것을 정확히 아는 것이 좋습니다. 오래된 상태를 가진 채 다시 연결하면 channel_reestablish가 그것을 드러냅니다. 상대방의 메시지는 여러분이 예상한 것보다 높은 취소 번호를 지목하고 마지막으로 여러분이 보낸 커밋먼트별 비밀값을 돌려주므로, 그 주장이 정직함이 증명됩니다. 그러면 BOLT 2는 여러분이 자신의 커밋먼트 트랜잭션을 브로드캐스트해서는 안 되며, 대신 상대방에게 채널을 실패 처리하도록 요청하는 오류를 보내야 한다고 말합니다. 이는 정직한 소프트웨어가 따르는 규칙이지 합의 보장이 아니며, 여러분이 오래된 상태를 스스로 공개하지 않는 동안에만 여러분을 보호합니다. BOLT 5는 그에 상응하는 의무를 명확히 밝힙니다. 노드는 이미 커밋먼트별 비밀값을 노출한 커밋먼트 트랜잭션을 브로드캐스트해서는 안 됩니다.
실제로 위험은 여러분이 받는 지갑 안에만 존재합니다. 이 사이트가 추적하는 거래소 63곳 중 어디에서든 구매하여 라이트닝으로 출금해도 이 위험에 노출되지 않습니다. 거래소의 채널은 거래소의 문제이기 때문입니다. 여러분의 노출은 코인이 여러분이 노드를 운영해야 하는 곳에 도착하는 순간 시작됩니다.
BOLT 3 테스트 벡터, 키별로
BOLT 3은 부록에 계산 예시를 실어 두었으며, 그것을 읽는 것이 취소 키의 두 절반이 모두 필수적임을 확인하는 가장 빠른 방법입니다.
revocation_basepoint 036d6caac248af96f6afa7f904f550253a0f3ef3f5aa2fe6838a95b216691468e2와 per_commitment_point 025f7117a78150fe2ef97db7cfc83bd57b2e2c0d0dd25eaf467a4a1c2a45ce1486에서 시작합니다. 기준점을 먼저 해시하면 efbf7ba5a074276701798376950a64a90f698997cce0dff4d24a6d2785d20963이 나오고, 지점을 먼저 해시하면 cbcdd70fcfad15ea8e9e5c5a12365cf00912504f08ce01593689dd426bca9ff0이 나옵니다. 각 지점에 그 지점을 앞세운 해시를 곱하고 두 결과를 더하면 revocationpubkey 02916e326636d19c33f13e8c0c3a03dd157f332f3e99c317c141dd865eb01f8ff0이 나옵니다.
그 공개 키는 개인 키에 대해 아무것도 누설하지 않습니다. 상대방이 대응하는 per_commitment_secret인 1f1e1d1c1b1a191817161514131211100f0e0d0c0b0a09080706050403020100을 공개한 뒤에야 나타나며, 그 시점에 같은 두 해시가 그 비밀값과 기준점 비밀값과 결합하여 revocationprivkey d09ffff62ddb2297ab000cc85bcb4283fdeb6aa052affbc9dddcf33b61078110을 만들어 냅니다. 채널 업데이트 한 번, 공개 한 번으로, 조금 전까지 장식에 불과했던 공개 키가 전체 출력에 대한 청구권이 됩니다.
취소 키 vs 시드 문구
취소 키와 시드 문구는 모두 여러분의 돈이 의존하는 비밀값이며, 그중 종이에 적을 수 있는 것은 하나뿐입니다.
시드 문구는 정적입니다. 열두 개 또는 스물네 개의 단어가 지갑이 앞으로 도출할 모든 키를 고정하며, 추가 사본은 여러분을 더 안전하게 하고, 오래된 사본은 새것과 정확히 똑같이 유효합니다. 취소 비밀값은 이 세 가지 성질을 모두 뒤집습니다. 그것은 채널 업데이트마다 하나씩, revoke_and_ack 안에서 상대방으로부터 도착합니다. 중요한 사본은 상대방의 공개이며, 여러분 자신의 시드로는 재생성할 수 없습니다. 그리고 오래된 채널 상태 사본은 백업이 아니라 부채입니다. 그것에 따라 행동하는 것은 사기와 구별되지 않기 때문입니다. 49개 슬롯 저장 방식이 존재하는 이유는 바로 이 비밀값들이 적어 둘 수 없을 만큼 너무 자주 바뀌기 때문입니다.
실질적인 결과는 모든 라이트닝 지갑이 반복하는 경고입니다. 단어만으로 라이트닝 지갑을 복원하고 지출을 시작하면, 이미 취소한 상태를 다시 공개한 것이 되며, 그것은 BOLT 5가 명시적으로 금지하는 유일한 일이자 여러분의 채널 상대방의 취소 키가 기다려 온 유일한 일입니다.