용어집 / 라이트닝과 레이어 2
결제 해시
- 결제 해시란 무엇입니까?
- 결제 해시는 수취인이 생성한 32바이트 비밀값의 SHA-256 해시이며, 라이트닝 결제에서 자금을 잠그는 장치이자 모두가 이 결제를 부르는 이름입니다.
라이트닝 네트워크 경로의 모든 홉은 동일한 결제 해시를 보며, 이 해시가 각 홉에 해당 결제를 식별해 줍니다. BOLT 11은 인보이스마다 이를 정확히 하나씩 요구하며, 52개의 bech32 문자로 작성되어 256비트를 담습니다. 일치하는 비밀값을 제시하는 것만이 자금을 청구할 수 있는 유일한 방법이며, 그 후 그 비밀값을 보관하는 것이 영수증입니다.
작동 방식
결제 해시는 그 반대되는 것에서 시작합니다. 수취인은 결제 프리이미지라고 불리는 32바이트의 무작위 값을 고르고, 그 값의 SHA-256 해시만 공개합니다.
그 값은 p 태그 아래 인보이스에 들어가며, BOLT 11은 이 태그의 data_length를 52로 정하고 정확히 한 번 요구합니다. 거기서부터 이 값은 update_add_htlc, 즉 메시지 유형 128 안에서 경로를 따라 내려가며, 그 필드는 채널 ID, 64비트 카운터, 밀리사토시 단위 금액, payment_hash 자체, CLTV 만료, 1366바이트 어니언입니다. 이 메시지에서 해시는 이중 역할을 합니다. 연관 데이터로서 어니언 구성에도 입력되므로 각 홉의 HMAC가 모두 이 해시를 확정합니다. 따라서 오래된 어니언 패킷을 다른 결제 해시에 다시 재생하면 이를 검사하는 첫 노드에서 실패합니다.
정산은 해시를 역방향으로 진행합니다. 수취인은 update_fulfill_htlc, 즉 메시지 유형 130에서 프리이미지를 32바이트 값 그대로 반환하고, 상류의 각 노드는 같은 채널을 따라 이를 되돌려 전달합니다. 자신이 보유한 해시와 SHA-256 결과가 일치하지 않는 프리이미지를 받은 노드는 이를 그냥 무시하지 않습니다. BOLT 2는 경고를 보내고 연결을 닫거나 오류를 보내 채널을 실패시켜야 한다고 규정하는데, 달리 설명할 여지가 없기 때문입니다.
온체인에서는 해시가 축약됩니다. HTLC 출력 스크립트에는 32바이트 값이 전혀 들어 있지 않습니다. 대신 RIPEMD160(payment_hash), 즉 20바이트 커밋먼트에 대한 OP_HASH160 비교를 실행하고, 지출자가 위트니스에 프리이미지를 제공합니다. 반올림된 금액이 같고 결제 해시가 같은 두 개의 제안된 HTLC는 만료가 달라도 바이트 단위로 동일한 출력을 만들어 내며, 그래서 BOLT 3이 이들에 대한 정렬 규칙을 규정해야 합니다.
한 요구 사항은 그 배후의 공격을 보기 전까지는 이상해 보입니다. 노드는 동일한 결제 해시를 지닌 여러 HTLC를 받아들여야 하며, BOLT 2는 그 이유를 밝힙니다. 중복을 거부한다면 공격자가 알려진 해시로 탐색하여 그 노드가 이미 해당 결제를 보유하고 있는지 알아낼 수 있기 때문입니다. 중복을 구별하기 위해 별도의 64비트 ID가 존재합니다.
비트코인을 구매할 때 이것이 중요한 이유
이 사이트에서 리뷰한 63곳의 거래소 중 두 곳이 수수료 안내에 라이트닝 지급을 명시하고 있습니다. Strike의 경우 출금 안내에 지갑 출금이 라이트닝 네트워크와 온체인으로 지원된다고 적혀 있고, Coinbase의 경우 수수료 표에 라이트닝 전송 가격이 전송 금액의 0.2%로 명시되어 있습니다.
그런 지급이 중단되면 블록체인에 아무것도 도달하지 않았으므로 조회할 트랜잭션 ID가 없습니다. 결제 해시는 지갑 로그와 거래소 백오피스가 모두 보유한 유일한 문자열이므로, 결제 상세 화면을 닫기 전에 그 값을 복사해 두십시오. 라이트닝 출금의 "트랜잭션 ID"를 요구하는 지원 데스크는 이 값을 요구하는 것입니다.
돌아오는 오류는 많은 것을 알려 주지 않으며, 이는 의도된 것입니다. BOLT 4는 다섯 가지 별개의 문제를 하나의 실패 코드 incorrect_or_unknown_payment_details, 번호 PERM|15로 묶습니다. 즉, 최종 노드가 해시를 알지 못하는 경우, 결제 시크릿이 해시와 일치하지 않는 경우, 해당 해시의 금액이 너무 낮은 경우, 만료가 현재 블록 높이에 너무 가까운 경우, 또는 필수 결제 메타데이터가 누락된 경우입니다. 명세는 이 통합의 이유를 설명합니다. 예전의 분리된 코드들은 전달 노드가 같은 해시를 훨씬 낮은 값으로 다음 노드에 보내고 응답을 읽음으로써 결제가 어디로 가는지 추측할 수 있게 했습니다. 지갑이 이유를 숨기는 것이 아니라 애초에 통보받지 못한 것이므로, 인보이스를 다시 생성하여 다시 결제하는 것이 실질적인 대응입니다.
같은 값은 다중 분할 결제의 모든 부분을 포함해 귀하의 노드에서 수취인의 노드까지 동일하게 유지되며, BOLT 4는 다중 분할 결제가 단일 결제 해시를 공유하도록 요구합니다. 이 값을 두 번 보는 사람은 하나의 결제를 보고 있음을 알게 됩니다. 이 사이트의 Phoenix 리뷰는 ACINQ 자체 FAQ가 해당 지갑을 통해 이루어진 결제의 최종 목적지와 금액을 안다고 인정한 내용을 인용하며, 이는 같은 노출에 대한 노골적인 표현으로, 이 사이트가 추론한 것이 아니라 공급업체가 밝힌 것입니다.
인보이스를 재사용하는 것은 관련된 이유로 쓸모없는 것보다 나쁩니다. BOLT 4는 이미 결제된 해시를 받은 최종 노드가 이를 알 수 없는 것으로 취급하거나 금액을 수락할 자유를 남기므로, 다시 게시된 QR 코드의 결과는 수취인이 실행 중인 구현에 따라 달라집니다.
BOLT 11 기부 테스트 벡터에서 결제 해시 디코딩하기
BOLT 11 명세에는 예제 기부 인보이스가 포함되어 있으며, 그 안의 결제 해시는 어떤 지갑도 절대 생성해서는 안 되는 고정 테스트 값입니다.
그 예시는 "Please make a donation of any amount using payment_hash 0001020304050607080900010203040506070809000102030405060708090102"라는 제목으로 시작하고 문자열은 lnbc1pvjluez로 시작합니다. lnbc 접두사와 bech32 구분자 뒤에 pvjluez는 타임스탬프로, 1970년이 시작된 시점부터 1496314658초입니다. 다음은 결제 시크릿 필드이고, 그 뒤에 p 태그, 그다음 p5가 오며 이는 길이입니다. bech32에서 p는 1이고 5는 20이므로 필드는 1 * 32 + 20 = 52개의 문자로 이루어집니다. 이 문자들인 qqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqypq는 그 제목에 인용된 해시로 디코딩됩니다.
이 중 비공개인 것은 없습니다. 명세는 예시 서명에 사용되는 개인 키 e126f68f7eafcc8b74f54d269fe206be715000f94dac067d1c04a8ca3b2db734를 공개하며, 명세에 달리 명시되지 않는 한 해당 섹션의 모든 인보이스가 결제 시크릿 1111111111111111111111111111111111111111111111111111111111111111을 지닌다고 밝히므로, 이 문자열들은 결제 요청이 아니라 파서 테스트 데이터입니다. 지갑이나 진단 도구가 테스트 스위트 밖에서 이 해시를 보여 준다면, 무언가가 귀하의 결제를 보고하는 대신 명세를 그대로 복사하고 있는 것입니다.
결제 해시 vs 트랜잭션 ID
결제 해시는 라이트닝 결제를 지칭하고, 트랜잭션 ID는 비트코인 블록체인에 존재하는 트랜잭션을 지칭합니다. 둘 다 32바이트이고 둘 다 64개의 16진수 문자로 표시되며, 그래서 서로의 지원 양식에 들어가게 됩니다. 트랜잭션 ID는 트랜잭션 자체의 바이트로부터 사후에 계산되며 어떤 블록 탐색기에도 붙여넣을 수 있습니다. 결제 해시는 결제가 존재하기 전에 수취인이 선택하고, 결제가 정상적으로 정산될 때 블록에 나타나지 않으며, 탐색기에서 아무 결과도 반환하지 않습니다. 빈 검색 결과는 보통 올바른 값을 가지고 잘못된 도구를 사용하고 있음을 의미합니다.
결제 해시 vs 결제 시크릿
결제 해시와 결제 시크릿은 같은 인보이스에 있는 256비트의 서로 다른 두 값으로, p와 s 태그에 담기고 각각 52개의 bech32 문자로 인코딩됩니다. 해시는 필연적으로 공개됩니다. 모든 홉이 HTLC를 구성하기 위해 이를 보아야 합니다. 비밀값은 어니언 내부에서 최종 노드에만 전달되며, BOLT 11은 그 역할을 한 줄로 밝힙니다. 즉 "prevents forwarding nodes from probing the payment recipient", 전달 노드가 결제 수취인을 탐색하지 못하게 한다는 것입니다. s 필드를 찾지 못한 판독기는 결제를 즉시 실패시켜야 합니다. 해시는 자물쇠이고, 비밀값은 결제하는 쪽이 인보이스를 발행한 사람으로부터 그것을 받았다는 증거입니다.