Join Nostr
2025-06-29 11:07:10 GMT

라이트닝 네트워크의 부정 행위 방지 (1)

비트코인 블록체인 외부(오프체인)에서 거래를 처리하는 라이트닝 네트워크는 '채널'이라는 개념을 기반으로 동작한다. 채널은 거래 당사자 두 사람 간의 비공개 원장과 같아서, 채널 내부에서 얼마나 많은 자금이 오가는지는 당사자 외에는 아무도 알 수 없다.

이처럼 모든 거래가 전체 네트워크에 공개되고 합의(채굴)를 거쳐야 하는 온체인 트랜잭션과 달리, 오프체인 거래는 당사자 간의 합의만으로 즉시 처리된다. 이것이 라이트닝 네트워크가 거의 즉각적인 속도와 저렴한 수수료를 구현할 수 있는 이유다. 두 당사자는 채널 안에서 수많은 거래를 주고받은 뒤, 그 최종 결과만을 단 하나의 온체인 트랜잭션으로 기록하여 거래하는 원리를 따른다.

하지만 여기서 근본적인 질문이 생긴다. 만약 상대방이 악의를 품고 잘못된 거래 기록을 진짜인 것처럼 온체인에 발행하려 한다면 어떻게 될까? 이 글에서는 라이트닝 네트워크가 신뢰의 문제를 어떻게 해결하는지 알아본다.

라이트닝 네트워크의 거래 과정

이 문제를 해결하는 방법을 이해하기 위해서는, 먼저 라이트닝 채널이 어떻게 생성되고, 거래가 어떻게 이루어지며, 어떻게 종료되는지의 전 과정을 살펴볼 필요가 있다. 채널의 전체 생명 주기를 알아야만 그 안에 숨겨진 핵심적인 안전장치를 파악할 수 있기 때문이다.

따라서 지금부터 채널의 개설(Opening)오프체인 거래(Off-chain Transaction)종료(Closing)의 세 단계로 나누어 라이트닝 네트워크의 거래 과정을 구체적으로 살펴보도록 하자. 특히 거래가 발생할 때마다 당사자가 서로 주고받는 계약서—커밋먼트 트랜잭션에 주목하길 바란다.

채널 열기

라이트닝 채널의 첫 단계는 거래할 두 당사자가 함께 사용할 일종의 '공동 예금'을 온체인에 생성하는 것이다. 두 사람이 공동 명의의 금고를 만들고, 앞으로 채널 안에서 자유롭게 주고받을 자금을 그 안에 예치하는 과정이라고 할 수 있겠다.

이 과정을 '자금 조달 트랜잭션(Funding Transaction)'을 생성한다고 말한다. 한 명 또는 두 명 모두가 이 트랜잭션에 자금을 투입해서, 두 사람 모두의 서명이 있어야만 열 수 있는 특별한 주소로 자금을 보낸다. 이 트랜잭션이 확정되면, 해당 자금은 더 이상 어느 한쪽이 단독으로 통제할 수 없는 공동 소유 상태가 되고, 자금을 이동할 수 있는 기반이 마련된다.

image

> <그림 1> 라이트닝 채널의 개설 과정

채널 개설 트랜잭션이 확정되면 두 사람 모두의 서명이 있어야만 열 수 있는 주소인 2-of-2 다중 서명 UTXO 출력이 생성된다. 바로 공동 명의 금고인 것이다. 이 UTXO는 A와 B가 모두 서명해야 사용할 수 있는 UTXO로, A와 B의 합의가 있으면 최초 채널 개설 트랜잭션에 기록된 금액 만큼 서로의 지갑으로 자금을 움직일 수 있다.

오프체인 거래와 채널 닫기

앞서 말했듯 라이트닝 거래는 거래 당사자 간에만 공유되는 오프체인 거래이다. 채널 안에서 여러 번의 오프체인 거래가 일어나면 그 거래들을 묶어 하나의 온체인 트랜잭션으로 만든다.

image

> <그림 2> 라이트닝 채널을 닫는 과정. 여러 번의 오프체인 거래를 하나의 온체인 트랜잭션으로 만들어 네트워크에 전파하면 비로소 두 라이트닝 노드의 자금 상태가 확정된다.

<그림 2> 하단 노란색 트랜잭션처럼 거래를 확정하는 온체인 트랜잭션을 커밋먼트(Commitment) 트랜잭션이라고 한다. 발생한 오프체인 거래를 합쳐 커밋먼트 트랜잭션을 만드는 과정은 A와 B가 언제든지 채널을 닫고 자금 상태를 온체인에 확정할 수 있도록 거래가 오갈 때마다 발생한다.

거래가 발생하면 A와 B는 거래 내용을 서로가 합의하여 커밋먼트 트랜잭션을 만들고 자신의 비밀 키로 서명한 뒤 상대방에게 건네준다. 두 당사자는 원할 때 온체인에 커밋먼트 트랜잭션을 전파해 채널 상태를 확정할 수 있다.

image

> <그림 3> 커밋먼트 트랜잭션이 생성되는 과정. 매 거래가 발생할 때마다 상호 노드가 합의하여 생성한다.

오른쪽에 계약서를 주고 받는 A와 B를 보자. A는 B에게 2 BTC를 보내는 거래를 만들고 계약서에 서명하여 B에게 보냈다. B는 계약서 내용이 올바른 것을 확인하고 마찬가지로 서명하여 A에게 보냈다. 이렇게 2-of-2 다중 서명된 계약서가 바로 커밋먼트 트랜잭션이다.

만약 누군가가 가짜 계약서를 만들어 온체인에 전파하더라도, 계약서에는 두 사람의 도장이 모두 찍혀있지 않으므로 의미 없는 쓰레기 트랜잭션이 되어버린다. 이렇게 거래 당사자들은 상대방을 신뢰하지 않고 검증함으로서 안전하게 거래를 발생시킨다.

발생하는 문제

우리는 양 당사자가 합의 하에 서명하여 생성한 커밋먼트 트랜잭션이 매 거래마다 생성됨을 알고 있다. 가짜 커밋먼트 트랜잭션이 생성될 수 없다는 사실도 알았다. 그렇다면 어떤 문제가 발생할 수 있을까? 문제는 최신 커밋먼트 트랜잭션이 아닌 이전의 커밋먼트 트랜잭션을 발행함으로서 발생한다.

그러니까, 온체인의 관점에서 바라볼 때 이전의 커밋먼트 트랜잭션도 두 사람의 도장이 모두 찍힌 유효한 계약서라는 것이다. 따라서 상대방은 본인에게 유리한 버전의 커밋먼트 트랜잭션을 온체인에 발행할 수 있다. 상대가 잘못된 트랜잭션을 발행하는 것은 어떻게 막을까?

앞선 거래에 이어, 이번에는 A가 B에게 5 BTC를 추가로 전송하는 상황을 가정한다.

image

> <그림 4> 두 번째 커밋먼트 트랜잭션을 생성하는 과정

두 사람은 새로운 잔액 상태가 기록된 두 번째 커밋먼트 트랜잭션을 생성하고 서명을 교환한다. 이제 A와 B는 언제든 이 최신 계약서를 온체인에 제출하여 채널을 닫고 각자의 몫(A: 3 BTC, B: 7 BTC)을 찾아갈 수 있게 되었다.

바로 이 지점에서 제기했던 문제가 발생한다. 현재 우리에게는 두 개의 유효한 계약서가 존재한다.

1. 계약서 Ver.1 (낡은 상태): A 잔액 8 BTC, B 잔액 2 BTC

2. 계약서 Ver.2 (최신 상태): A 잔액 3 BTC, B 잔액 7 BTC

가장 중요한 점은, 온체인 비트코인 네트워크의 관점에서 이 두 계약서 모두 A와 B의 서명이 담긴 유효한 트랜잭션이라는 것이다. 온체인은 오프체인 상에서 벌어진 거래에 대한 데이터를 가지고 있지 않기 때문에, 어떤 계약서가 낡았는지 판단할 방법이 없다.

이 상황에서 A에게 악의적인 행동을 할 경제적 유인이 생긴다. 만약 A가 정직하게 최신 계약서(Ver.2)를 제출하면 3 BTC를 받지만, B가 방심한 틈을 타 낡은 계약서(Ver.1)를 온체인에 발행한다면, 본래 자신에게 할당된 3 BTC가 아닌 8 BTC를 부당하게 차지할 수 있다.

B의 입장에서는 7 BTC를 받아야 하지만 2 BTC밖에 받지 못하게 되는, 명백한 자금 탈취가 일어나는 것이다. 만약 B가 이를 눈치채지 못하거나, 노드가 꺼져있어 온체인을 감시하지 못하는 사이에 A의 낡은 트랜잭션이 블록에 포함되어 확정되어 버린다면 B는 속수무책으로 당할 수밖에 없다.

낡은 계약서의 무력화와 정의구현 방법

앞서 제기된 문제는 명확하다. 온체인 관점에서는 유효하지만 실제로는 낡은 상태인 커밋먼트 트랜잭션(Revoked Commitment 트랜잭션)을 어떻게 막을 것인가? 라이트닝 네트워크는 이를 정의구현 트랜잭션 (Justice 트랜잭션)이라는 경제적 유인책으로 해결한다.

image

> <그림 4> 두 번째 커밋먼트 트랜잭션을 생성하는 과정. "첫번째 계약은 최신 계약이 아니다"는 이전 계약의 폐기(Revoke)를 명시하고 있다.

채널의 상태가 Ver.1에서 Ver.2로 업데이트될 때, 양측은 단순히 새로운 계약서에 서명만 하는 것이 아니다. 이들은 이전 계약서를 무효화시키는 특별한 정보를 계약서에 명시한다. 바로 폐기 키 (Revocation Key)이다.

폐기 키를 교환함으로서 첫번째 계약은 양측의 합의 하에 언제든지 처벌 가능한 커밋먼트 트랜잭션이 된다. 만약 누군가가 폐기된 커밋먼트 트랜잭션을 온체인에 제출한다면, 상대방은 폐기 키를 이용해 정의구현 트랜잭션 (Justice Transaction)을 발행할 수 있게 된다.

image

> <그림 5> A가 본인에게 유리한 커밋먼트 트랜잭션을 온체인에 제출한 모습. 채굴자는 도장이 찍혀 있는지만 보고 둘 사이에 어떤 일이 일어났는지는 모르기 때문에 다음 블록에 포함하게 된다.

앞서 말했듯 채굴자는 2-of-2 다중 서명이 잘 되어있는지만 확인할 뿐, 그 밖의 정보를 알거나 검증하지 못한다. 이러한 A의 부정 행위에 대해서 B는 정의구현 트랜잭션을 제출함으로서 대응할 수 있다. 아래 그림을 보자.

image

> <그림 6> B가 온체인에 정의구현 트랜잭션을 제출한 모습.

위와 같이 폐기 키를 교환함으로서 첫번째 계약이 온체인에 제출되었을 때 B는 손해배상 합의서—정의구현 트랜잭션을 제출할 수 있게 된다. 정의구현 트랜잭션은 전체 채널 용량의 모든 잔액을 B에게 전송한다는 내용을 담고 있다. 앞서 폐기 키를 교환하여 정의구현 트랜잭션에 양측이 합의했기 때문에 채굴자는 정의구현 트랜잭션을 정상 트랜잭션으로 인식한다.

여기에 또 하나의 중요한 장치가 있다. 라이트닝 트랜잭션의 출력에는 특별한 조건이 붙는다. 채널을 일방적으로 닫으려고 트랜잭션을 발행한 당사자는 자신의 자금을 즉시 사용할 수 없다. 일정 기간(예: 144 블록, 약 24시간) 동안 자금이 묶이는 시간 잠금(Timelock)이 걸려있다. 이는 상대방에게 부당한 거래가 아닌지 확인하고 이의를 제기할 충분한 시간을 주기 위함이다.

이제 A가 8 BTC를 부당하게 차지하기 위해 낡은 계약서를 온체인에 올리는 시나리오를 다시 생각해보자.

1. A가 낡은 계약서(Ver.1)를 온체인에 전파한다.

2. B는 블록체인을 감시하다가 이 낡은 계약서가 나타난 것을 발견한다.

3. A의 자금 8 BTC는 '시간 잠금'에 걸려있어 A는 당장 인출할 수 없다.

4. B는 A로부터 미리 받아둔 'Ver.1 폐기 키'를 가지고 있다.

5. B는 이 폐기 키를 사용하여 A의 시간 잠금을 무시하고, 채널의 모든 자금(10 BTC 전부)을 즉시 자신의 지갑으로 가져오는 정의구현 트랜잭션을 생성하여 온체인에 전파한다.

결과적으로 A는 부당 이득 5 BTC는 커녕 자신의 정당한 몫인 3 BTC마저 모두 잃고 채널의 모든 자금을 B에게 빼앗긴다. 이처럼 상대방을 속이려다 모든 것을 잃게 되는 강력한 벌칙 구조 때문에, A는 처음부터 낡은 계약서를 제출할 엄두를 내지 못하게 된다. 비로소 정의의 실현을 일구어냈다!

마무리

다음 편에서는 당사자 노드의 재난재해나 정전 등으로 인해 오프라인 상태가 되어 정의구현 트랜잭션을 제출할 수 없는 상황에는 어떻게 해야할지 알아보겠다.