eltoo: 간단한 off-chain 거래 갱신 프로토콜 Tech Info

라이트닝 네트워크 개발자 3인방이 eltoo 라는 새로운 프로토콜을 제안했다. eltoo 가 뭔 뜻인가 했는데 아마도 L2 즉 layer 2를 소리나는대로 표현한 것인듯 하다. 라이트닝 네트워크에서는 off-chain 상에서 거래내용을 on-chain 으로 broadcast 하지 않고 off-chain 상에 유지하면서 안전하게 갱신하는 기법을 사용하고 있는데, 그 기법을 좀더 단순하게 만든 것이다. 완전히 새로운건 아니고 푼이 처음 LN 제안할때 언급했던 방식이란다. 프로토콜의 단순함 때문에 이걸 구현하고 있는 개발자들 입장에서는 더 끌리나보다. 이 방식을 사용하려면 bitcoin core 쪽에 SIGHASH_NOINPUT 이라는 새로운 서명방식이 추가되야 한다는 번거로움이 기다리고 있다.

eltoo 제안서는 기존의 다른 문서들과는 다르게 꽤나 친절하게 풀어서 설명을 하고 있어서 읽어볼 만하다. 여기서는 이해를 돕고자 약간의 부연설명을 해보도록 하겠다.

제안서에서는 거래 갱신을 먼저 on-chain 상에서 구현하는 예를 보여주고 이 개념을 off-chain 으로 전환하는 방식으로 설명을 하고 있는데, on-chain 상에서의 프로토콜을 이해하면 off-chain 으로의 전환은 쉽게 이해할 수 있다. 아래 그림은 on-chain 상에서 거래가 갱신되는 흐름을 보여주고 있는데 update transaction 은 이전 상태를 무효화시키는 transaction이고 settlement transaction이 해당 상태에서 채널을 종료할때 사용되는 transaction 이다.
거래가 발생할때 마다 두 가지 transaction을 생성하는데 여기서 주목할 부분은 settlement transaction을 먼저 만들어서 양쪽이 서명한 이후에 update transaction을 만들어서 서명한다는 것이다. 즉, 채널을 닫고 정산을 하는 거래를 먼저 보장해둔 이후에 이전 거래를 무효화시키는 것이다.
위 그림을 보면, setup을 통해 20만원짜리 채널을 생성할때 먼저 Ts0를 먼저 만들어두는데 Ts0는 원래대로 10만원씩 나눠가지는 transaction이다. 이걸 broadcast 하면 채널을 종료하고 돈을 돌려받을 수 있게된다. 일반적으로는 채널을 계속 열어둘 것이라 Ts0는 broadcast 하지 않고 가지고만 있을 것이다. 그러다가 둘 사이에 거래가 발생하면 Tu1, Ts1을 생성하게 된다. Tu1이 broadcast 되면서 Ts0는 invalid 해진다. setup 에서 생성한 fund의 output을 Tu1이 새로운 output으로 바꿔두기 때문이다. 하지만 이때도 Tu1보다 Ts1을 먼저 만들어둬서 Ts1을 이용해 채널을 종료할 수 있다. 첫번째 거래가 A가 B에게 1만원을 지급한 것이라면 Ts1은 A에게 9만원을, B에게 11만원을 지급하는 내용을 담고 있게 된다.

위에서 update transaction의 역할은 이전 settlement transaction을 무효화시키는 역할 뿐이다. 이전 settlement transaction이 무력화되기 전에 항상 새로운 settlement transaction이 만들어지므로 언제나 settlement가 가능한 상태를 유지한다. settlement transaction은 off-chain 상에만 존재한다는 점을 주목하자. A,B 사이에 정산 내용이 변경될때마다 settlement transaction이 바뀌고 최종 상태의 settlement transaction만 유효한 상태로 남아있다. 마지막에 채널을 종료할때만 settlement transaction을 broadcast 해서 chain에 넣으면 정산이 완료되는 것이다. 하지만 update transaction은 항상 on-chain 상에 집어넣어야 이전 settlement transaction을 무효화시킬 수 있는데, 이걸 on-chain 상에 넣지 않고도 이전 settlement transaction을 무효화 시키기 위해 SIGHASH_NOINPUT 이라는 서명방식이 도입된다.
이 그림과 앞 그림의 차이는 하나다. update transaction 역시 broadcast 하지 않기 때문에 희미하게 표현되어 있다. 마지막 update transaction 만 broadcast 하는 것이다. 문제는 Tu,i 는 Tu,i-1 의 output만 사용할 수 있기때문에 Tu,i 를 broadcast 하려면 먼저 Tu,i-1 이 broadcast 되어 있어야 한다는 것이다. 이 문제를 해결하기 위해 Tu,i 가 Tu,i-1 의 output이 아니라 setup의 output을 사용하도록 Tu,i 의 input을 변경한다. 보통은 input을 변경하면 서명이 달라져서 input 변경이 불가능하지만 SIGHASH_NOINPUT 방식에서는 input이 서명에 포함되지 않아 input 변경이 가능하다. 따라서 Tu,i 를 broadcast 하고 이어서 이를 정산하는 Ts,i를 broadcast 함으로써 정산을 완료할 수 있게 된다.

자, 이제 A,B 중 한명이 사기치는 경우를 고려해보자. A가 i 번까지 거래를 업데이트한 상태에서 자신에게 더 유리한 Tu1 을 슬쩍 broadcast 해버리는 것이다. Ts1은 시간제한이 걸려있어서 바로 broadcast 하지는 못한다. 이때 B는 Tu,i의 input을 Tu1의 output으로 변경해서 broadcast 하면 된다. Ts,1은 무력화되고 Ts,i만 유효해져서 정상적인 정산이 가능해진다.

덧글

댓글 입력 영역



통계정보