BOLT4 payment onion은 sender가 전체 route의 node public keys로 hop별 shared secrets를 만들고 역순으로 payload layers와 HMACs를 구성합니다. 각 중간 node는 자기 layer를 복호화해 outgoing channel 또는 next node, 전달 amount, outgoing CLTV 같은 정보와 바로 이전·다음 peer를 알지만 다른 hops, 전체 route 길이와 자신의 정확한 위치는 packet 자체에서 알 수 없습니다. 다만 timing·amount·channel 관측을 결합한 traffic analysis까지 막는 완전 익명성은 아닙니다.
Sender가 Sphinx packet을 역순으로 만듭니다
Origin node는 n1부터 final node까지 public keys와 random 32-byte sessionkey를 사용해 ECDH shared secret을 계산합니다. 각 secret에서 rho·mu 등 용도별 keys를 만들고 last hop부터 payload를 넣어 layers를 감쌉니다. BOLT4 version 0 packet은 1366바이트 고정 크기입니다.
Associated data로 payment_hash를 HMAC에 결합해 onion을 다른 HTLC에 옮겨 붙이는 것을 막습니다. Hop payload 길이는 BigSize와 TLV로 표현되며 malformed encoding이나 unknown even type은 protocol 규칙대로 실패합니다. Parser가 길이를 신뢰해 buffer를 넘지 않게 해야 합니다.
Onion routing은 각 중간 노드에게 전체 지도를 주지 않고, 다음 교차로까지의 봉인된 지시만 한 겹씩 전달합니다.
JOBCOIN 해설

그림은 이 주제의 공통 개념을 단순화한 설명입니다. 아래 항목에서 이 글의 구체적인 조건과 예외를 함께 읽어보세요.
- Sender가 Sphinx packet을 역순으로 만듭니다
Origin node는 n1부터 final node까지 public keys와 random 32-byte sessionkey를 사용해 ECDH shared secret을 계산합니다.
- 각 hop은 무엇을 알고 무엇을 모르는지 구분합니다
Node는 network connection으로 predecessor를 알고 decrypted payload에서 next hop과 outgoing amount·CLTV를 얻습니다.
- Ephemeral key blinding이 packet 연결을 줄입니다
첫 hop은 sender의 long-term node key 대신 ephemeral public key를 봅니다.
AI로 제작한 개념도 · 실제 가격·거래 내역·통계가 아닙니다.
각 hop은 무엇을 알고 무엇을 모르는지 구분합니다
Node는 network connection으로 predecessor를 알고 decrypted payload에서 next hop과 outgoing amount·CLTV를 얻습니다. Incoming HTLC amount·expiry와 비교해 fee·delta 조건을 검사합니다. Final hop은 자신이 recipient라는 payload와 payment secret·total amount 등을 확인할 수 있습니다.
BOLT4는 중간 node가 route의 다른 nodes, 전체 길이, 자기 위치를 packet에서 알 수 없다고 설명합니다. 그러나 직접 연결된 sender 또는 recipient를 인접 peer로 볼 수 있고 public channel graph·금액 차이를 이용한 추정도 가능합니다. ‘중간 노드는 아무 정보도 모른다’는 표현은 부정확합니다.
| 주체 | 아는 정보 | 기본적으로 모르는 정보 |
|---|---|---|
| Sender | 전체 선택 route·amounts | 실제 channel liquidity |
| 중간 hop | 이전·다음 peer·자기 payload | 전체 길이·다른 hops |
| Final node | 수신 payload·preimage | 원 sender의 network identity |
| Network observer | timing·connections·sizes | 암호화 payload 내용 |
| 공모 hops | 각자 관찰 합집합 | 비공모 구간의 확정 경로 |
Ephemeral key blinding이 packet 연결을 줄입니다
첫 hop은 sender의 long-term node key 대신 ephemeral public key를 봅니다. 각 hop 처리 뒤 ephemeral key는 shared secret에서 만든 blinding factor로 바뀌므로 next hop이 받은 packet과 이전 packet을 동일 key로 직접 연결하기 어렵습니다. Payload bytes도 stream cipher로 한 겹 벗기고 filler가 길이 단서를 줄입니다.
Integrity HMAC이 맞지 않으면 node는 packet을 forward하지 않습니다. 같은 onion을 재사용하거나 sessionkey randomness가 약하면 unlinkability가 깨질 수 있습니다. Payment retry는 새 route·sessionkey를 만들고 nonce·random source failure를 fatal하게 다룹니다.
- Fresh sessionkey를 CSPRNG로 생성합니다.
- Route 역순으로 shared secrets를 계산합니다.
- Hop TLV와 next HMAC을 layer에 넣습니다.
- Payment hash를 associated data로 결합합니다.
- Retry마다 새 onion과 route privacy를 평가합니다.
오류도 역방향 암호화됩니다
Forwarding node가 실패하면 shared secret으로 failure message를 감싸 upstream에 보냅니다. 각 이전 hop이 layer를 추가하고 sender가 secrets로 차례로 복호화해 originating failure를 찾습니다. Sender는 failure code에 따라 channel update를 적용하거나 route를 재계산합니다.
Error timing과 반복 route probes는 node 위치를 추정하는 단서가 될 수 있습니다. BOLT4의 일정한 dummy decryption cycles 같은 대책이 timing 차이를 줄입니다. 구현이 상세 내부 오류를 plaintext log·API로 그대로 노출해 remote fingerprint를 만들지 않게 합니다.
Route blinding과 trampoline은 더 많은 routing 정보를 알게 될 수 있습니다
Sphinx payment onion만으로 recipient가 public invoice에 자신의 node id와 route hints를 공개하는 문제를 모두 해결하지는 않습니다. Route blinding은 recipient가 introduction point 이후 경로를 암호화해 sender에게도 숨기는 기법입니다. Feature support와 probing 방어 조건을 따로 확인합니다.
Trampoline routing은 경량 sender가 전체 pathfinding 일부를 trampoline node에 위임하는 제안·구현 계열입니다. 위임 node는 더 많은 routing 정보를 알게 될 수 있습니다. 기본 BOLT4의 ‘sender가 전체 route를 구성’하는 모델과 동일하게 설명하지 않고 사용 wallet·peer의 실제 feature를 확인합니다.
자주 묻는 질문
중간 노드는 sender와 recipient를 전혀 모르나요?
전체 경로는 모르지만 바로 이전·다음 peer를 알고, 첫·마지막 인접 node라면 역할을 추정할 수 있습니다.
모든 payment onion 크기는 같은가요?
BOLT4 version 0 routing packet은 고정 1366바이트이며 TLV payload와 filler로 구성됩니다.
Onion routing이면 timing 분석도 불가능한가요?
아닙니다. Timing·amount·channel metadata를 결합한 traffic analysis 위험이 남습니다.
더 깊이 읽기
본문에서 다룬 개념과 확인 절차를 다음 글에서 이어서 살펴보세요.



