BOLT4 결제 어니언(payment onion)은 송신자가 만듭니다. 송신자는 경로 위 노드들의 공개키로 홉마다 공유 비밀(shared secret)을 계산하고, 페이로드 층과 HMAC을 맨 뒤 홉부터 차례로 감쌉니다. 중간 노드는 자기 층만 풀 수 있습니다. 그 안에서 내보낼 채널이나 다음 노드, 넘길 금액, 내보낼 CLTV를 읽고, 바로 앞뒤 피어가 누구인지 압니다. 그러나 다른 홉들, 전체 경로 길이, 경로 안에서 자신의 정확한 위치는 패킷만 보고는 알 수 없습니다. 다만 시각·금액·채널 관측을 엮는 트래픽 분석까지 막아 주는 완전한 익명성은 아닙니다.
송신자는 스핑크스(Sphinx) 패킷을 역순으로 만듭니다
출발 노드는 n1부터 최종 노드까지의 공개키와 무작위 32바이트 세션 키(sessionkey)로 ECDH 공유 비밀을 계산합니다. 비밀마다 rho·mu처럼 용도별 키를 뽑아낸 뒤, 마지막 홉의 페이로드부터 넣어 층을 감쌉니다. BOLT4 version 0 패킷은 1366바이트 고정 크기입니다.
연관 데이터(associated data)로 payment_hash를 HMAC에 묶어, 어니언을 다른 HTLC에 옮겨 붙이지 못하게 합니다. 홉 페이로드 길이는 BigSize와 TLV로 적습니다. 인코딩이 잘못됐거나 알 수 없는 짝수 타입이 나오면 프로토콜 규칙대로 실패 처리합니다. 파서는 적힌 길이를 그대로 믿고 버퍼 밖을 읽어서는 안 됩니다.
어니언 라우팅은 중간 노드에게 전체 지도를 건네지 않습니다. 다음 교차로까지의 봉인된 지시만 한 겹씩 넘겨줄 뿐입니다.
JOBCOIN 해설

그림은 이 주제의 공통 개념을 단순화한 설명입니다. 아래 항목에서 이 글의 구체적인 조건과 예외를 함께 읽어보세요.
- 송신자는 스핑크스(Sphinx) 패킷을 역순으로 만듭니다
출발 노드는 n1부터 최종 노드까지의 공개키와 무작위 32바이트 세션 키(sessionkey)로 ECDH 공유 비밀을 계산합니다.
- 각 홉이 아는 것과 모르는 것을 나눕니다
노드는 네트워크 연결을 통해 바로 앞 노드를 압니다.
- 임시 키 블라인딩이 패킷 사이의 연결 고리를 줄입니다
첫 홉이 보는 것은 송신자의 장기 노드 키가 아니라 임시 공개키(ephemeral public key)입니다.
설명을 위한 개념도 · 실제 가격·거래 내역·통계가 아닙니다.
각 홉이 아는 것과 모르는 것을 나눕니다
노드는 네트워크 연결을 통해 바로 앞 노드를 압니다. 복호화한 페이로드에서는 다음 홉과 내보낼 금액·CLTV를 얻습니다. 이를 들어온 HTLC의 금액·만료와 견줘 수수료와 시간 차이 조건을 검사합니다. 최종 홉은 자신이 수신자라는 페이로드와 결제 비밀, 총액 같은 값을 확인합니다.
BOLT4는 중간 노드가 경로의 다른 노드, 전체 길이, 자기 위치를 패킷에서 알 수 없다고 설명합니다. 그래도 송신자나 수신자와 직접 연결돼 있다면 그들을 이웃 피어로 볼 수 있습니다. 공개 채널 그래프와 금액 차이로 추정하는 길도 열려 있습니다. 그러니 ‘중간 노드는 아무 정보도 모른다’는 말은 정확하지 않습니다.
| 주체 | 아는 정보 | 기본적으로 모르는 정보 |
|---|---|---|
| 송신자 | 직접 고른 전체 경로·금액 | 실제 채널 유동성 |
| 중간 홉 | 앞뒤 피어·자기 페이로드 | 전체 길이·다른 홉 |
| 최종 노드 | 받은 페이로드·프리이미지 | 원래 송신자의 네트워크 신원 |
| 네트워크 관찰자 | 시각·연결·크기 | 암호화된 페이로드 내용 |
| 공모한 홉들 | 각자 관찰한 정보의 합 | 공모하지 않은 구간의 확정 경로 |
임시 키 블라인딩이 패킷 사이의 연결 고리를 줄입니다
첫 홉이 보는 것은 송신자의 장기 노드 키가 아니라 임시 공개키(ephemeral public key)입니다. 홉을 하나 지날 때마다 이 임시 키는 공유 비밀에서 만든 블라인딩 계수로 바뀝니다. 그래서 다음 홉이 받은 패킷과 이전 패킷을 같은 키로 곧바로 잇기 어렵습니다. 페이로드 바이트도 스트림 암호로 한 겹씩 벗겨지고, 채움 데이터(filler)가 길이 단서를 줄입니다.
무결성 HMAC이 맞지 않으면 노드는 패킷을 넘기지 않습니다. 같은 어니언을 다시 쓰거나 세션 키의 무작위성이 약하면 연결 불가능성(unlinkability)이 무너질 수 있습니다. 결제를 다시 시도할 때는 새 경로와 새 세션 키를 만들고, 논스나 난수 생성이 실패하면 치명적 오류로 다룹니다.
- 새 세션 키를 CSPRNG로 만듭니다.
- 경로 역순으로 공유 비밀을 계산합니다.
- 홉별 TLV와 다음 HMAC을 층에 넣습니다.
- 결제 해시를 연관 데이터로 묶습니다.
- 재시도할 때마다 새 어니언을 만들고 경로 프라이버시를 다시 따집니다.
오류도 거꾸로 암호화돼 돌아옵니다
전달하던 노드가 실패하면 공유 비밀로 실패 메시지를 감싸 앞쪽 노드로 돌려보냅니다. 앞선 홉들이 한 겹씩 덧씌우고, 송신자는 갖고 있는 비밀로 차례로 풀어 실패가 시작된 지점을 찾습니다. 송신자는 실패 코드에 따라 채널 업데이트를 반영하거나 경로를 다시 계산합니다.
오류가 돌아오는 시각과 반복된 경로 탐침은 노드 위치를 짐작하는 단서가 될 수 있습니다. BOLT4가 정한 일정한 더미 복호화 같은 대책이 시간 차이를 줄입니다. 구현체는 상세한 내부 오류를 평문 로그나 API로 그대로 드러내 원격 지문을 남기지 않도록 해야 합니다.
경로 블라인딩과 트램펄린에서는 더 많은 경로 정보가 드러날 수 있습니다
스핑크스 결제 어니언만으로는 수신자가 공개 인보이스에 노드 ID와 경로 힌트를 드러내는 문제까지 풀리지 않습니다. 경로 블라인딩(route blinding)은 수신자가 진입 지점(introduction point) 이후 경로를 암호화해 송신자에게도 숨기는 기법입니다. 기능 지원 여부와 탐침 방어 조건은 따로 확인합니다.
트램펄린 라우팅(trampoline routing)은 가벼운 송신자가 경로 탐색 일부를 트램펄린 노드에 맡기는 제안과 구현을 묶어 부르는 말입니다. 일을 넘겨받은 노드는 더 많은 경로 정보를 알게 될 수 있습니다. 이를 ‘송신자가 전체 경로를 짠다’는 기본 BOLT4 모델과 똑같이 설명해서는 안 되며, 쓰는 지갑과 피어가 실제로 어떤 기능을 지원하는지 확인합니다.
자주 묻는 질문
중간 노드는 송신자와 수신자를 전혀 모르나요?
전체 경로는 모릅니다. 하지만 바로 앞뒤 피어는 알고, 첫 홉이나 마지막 홉과 맞닿은 노드라면 상대의 역할을 짐작할 수 있습니다.
결제 어니언은 모두 크기가 같나요?
BOLT4 version 0 라우팅 패킷은 1366바이트로 고정돼 있고, TLV 페이로드와 채움 데이터로 채워집니다.
어니언 라우팅이면 시각 분석도 막을 수 있나요?
아닙니다. 시각·금액·채널 정보를 엮는 트래픽 분석 위험은 남습니다.
더 깊이 읽기
본문에서 다룬 개념과 확인 절차를 다음 글에서 이어서 살펴보세요.



