라이트닝 네트워크의 이해 (상)
이번 글에서는 라이트닝 네트워크의 기초 개념을 잡기 위한 용어들을 최대한 간단하게 설명합니다.
서명(signature)
오프라인에서 카드결제 할 때, 택배수령 할 때, 계약서 쓸 때 서명을 하는 것은
내가 그것에 동의했다는 사실을 아무도 부정하지 못하도록 증거를 남기는 것입니다.
내가 신용카드 결제하면서 서명하고 고지서 날아왔을 때 '저 이런거 산 적 없는데요' 라고 구라를 치면
결제 받은 상점 주인은 필적 감정 전문가를 데려와서 '여기에 니가 싸인을 했단다' 라고 증거를 내밀 수 있습니다.
혹은, 남이 내 카드 훔쳐서 결제할 때 위조 싸인 하고 나중에 고지서가 나한테 날아오면
나는 필적 감정 전문가를 불러서 '이 싸인은 내것이 아니다' 라는 증거를 제시할 수 있게 됩니다.
전자 서명(e-signature)
오프라인의 아날로그 서명과 같은 것을 온라인 디지털에서 하는 것이 전자 서명입니다.
여기에 공개키-개인키 쌍(pair), 해시 함수 등이 사용되는데 굳이 몰라도 이 글을 읽는데 큰 지장이 없습니다.
어떤 디지털 문서가 있을 때 내가 여기에 동의했다 라는 뜻으로 전자 서명을 하면
거기에 동의한 사람이 바로 나 라는 것을 아무도 부정하지 못하는 빼박 증거가 됩니다.
비트코인의 트랜잭션에도 전자 서명이 들어갑니다.
내가 소유한 BTC 중에서 1 BTC 만큼의 소유권을 여기에 명시한 주소에게로 넘기겠다 라는 내용을 담은 문서에 서명을 한 것이 바로 비트코인 트랜잭션 입니다.
트랜잭션이 모여서 블록을 이루고
블록이 모여 블록체인이 됩니다.
비트코인에서의 전자서명은 트랜잭션에 개인키(Private Key)로 서명하고 그 개인키에 대해 쌍(Pair)을 이루는 공개키(Public Key) 를 가지고 그 서명이 내 서명임을 모두에게 증명합니다.
이렇게 해서 개인키는 다른 누구도 모르게 비밀을 유지하면서도 공개키만 가지고 누구나 블록 익스플로러에서 어떤 트랜잭션이 제대로 서명이 이뤄졌는지 검증해볼 수 있습니다.
트랜잭션 멜라빌리티(Transaction Malleability)
잔고가 0인 주소에 비트코인을 방금전에 받았다면
그것을 언제부터 사용할 수 있을까 하는 문제가 있습니다.
1컨펌을 받고 나면 안전하게 번복이 불가능해진 것으로 간주하여 사용할 수 있으나
0컨펌에서는 그것을 확신할 수가 없습니다.
당연히 컨펌이 날 줄 알고 이것을 0컨펌 상태에서 사용하고, 또 그걸 0컨펌 상태에서 사용하고 하다보면
분산되어 있는 비트코인 노드들 끼리 모두가 평등한 상태에서 의사 합의를 하다보면
더블 스펜딩으로 판명되거나 고아(Orphan) 블록에 포함되거나 해서 컨펌이 안나고 마는 경우도 생깁니다.
그래서 회계 장부가 꼬여서 계산을 다시 해야 하는 경우가 바로 트랜잭션 멜라빌리티 문제 입니다.
1컨펌을 받고 사용하면 안전하지만
컨펌을 기다리다가 느려서 불편함을 겪고,
그러다보면 알트코인이 비트코인보다 우월한 거 아닌가 하는 생각도 들게 됩니다.
세그윗(Segregated Witness)
세그윗으로 트랜잭션의 구조를 변경해서 트랜잭션 멜라빌리티 문제를 없애고 스마트 컨트랙트의 가능성을 열었습니다.
세그윗에 대한 자세한 이야기는 지난 글을 참조해 주세요
https://steemit.com/kr/@morning/3bjdvz
멀티시그니쳐(Multisignature)
비트코인에 멀티시그니쳐가 구현되기 전에는 싱글시그니쳐만 있었습니다.
보내는 사람이 트랜잭션에 전자서명을 하면 전송이 되는 것이 싱글시그니쳐 입니다.
지갑 주인 한 사람의 개인키로 전자서명하면 트랜잭션이 보내집니다.
멀티시그니쳐는 예를 들어 Bitfinex 고객, Bitfinex 거래소, BitGo(비트코인 보안 전문 회사) 세 주체가 그 주소에 대한 권한을 위임받아서 셋중에 둘이 서명하면 트랜잭션이 보내지는 방식입니다.
보내는 사람과 받는 사람 두 주체 중에서 둘 다 서명해야 이뤄지는 2/2 방식도 있고
다섯중의 셋 3/5 방식도 있습니다.
Bitfinex가 멀티시그를 쓰는데도 해킹을 당했었는데, 그렇다고 멀티시그가 결함이 있는건 아니고 Bitfinex 잘못이라 하더군요. 자세한건 굳이 알아보고 싶지는 않으므로 넘어갑니다.
단방향 결제 채널 (Unidirectional payment channels)
푸드코트에 가서 입구에서 2만원을 만원자리 두장 붙여서 내고 카드를 받아서
돈까스, 만두, 콜라, 커피를 각 다른 코너에서 사면서 매번 현금대신 카드를 내밀어 결제하고
나오기 전에 입구에 다시 가서 카드 돌려주고 거스름돈 7300원 받아오는 경우를 생각해 봅시다.
카드 시스템이 있었기 때문에 4번 현금 주고받을 것을 2번으로 줄일 수 있었고 각 음식코너에서는 현금을 다루는 부담을 줄일 수 있어서 좀 더 효율적이 되었습니다.
이와 같은 것을 비트코인에서도 세그윗, 라이트닝 네트워크 없이도 이미 구현되어 돌아가고 있는 기술만 가지고 할 수 있습니다. 그것도 Trustless로 할 수 있습니다. 잠시 Trusted 와 Trustless 의 개념을 짚고 넘어가죠.
Trusted: 알트코인 거래를 위해 폴로니엑스 거래소에 비트코인을 보내면 폴로니엑스가 그걸 가지고 도망가면서 해킹당했다고 핑계대는 수도 있지만 어쩌면 해킹핑계대면서 도망가지 않고 잔고를 무사히 입출금 해줄 수도 있기 때문에 그걸 믿고 폴로에 비트코인을 보낼 때 Trusted 서비스를 이용하는 겁니다.
Trustless: DASH의 마스터노드를 이용한 익명화 기능을 예로 들겠습니다. 지갑에서 코인을 익명화 시킬 때 마스터노드들을 거쳐서 익명화가 되지만 개발자 에반 더필드나 마스터노드 운영자가 그것을 꿀꺽 할 까 걱정할 필요가 없습니다. 개발자나 운영자의 인품 때문이 아니라 오픈소스에 프로토콜 스펙 그대로 구현되어 있음이 투명하게 공개되어 있기 때문입니다. 믿을 필요가 없는 trustless 서비스의 좋은 예 입니다.
멀티시그를 이용한 Trestless 단방향 결제 채널은
Off-Chain 으로 여러번의 마이크로 페이먼트를 할 수 있습니다. 이렇게 하기 위해서
nLockTime 과 CheckLockTimeVerify 라는 이미 구현되어 있는 기능을 이용합니다.
nLockTime 트랜잭션을 보낼 때 원하는 시간 만큼 트랜잭션을 완료하지 않고 잠궈놓는 기능입니다.
CheckLockTimeVerify 는 nLockTime 으로 잠궈진 트랜잭션이 시간이 지나 풀린 이후에 여전히 멀티시그 서명을 기다리는 상태의 트랜잭션을 취소하고 원래 주인에게 되돌아오도록 하는 기능입니다.
이때 사용하는 멀티시그 방식은 손님과 푸드코트, 양쪽이 참여하는 2/2 방식으로 둘 다 서명하면 트랜잭션이 이뤄지고 한쪽만 서명하면 트랜잭션이 대기상태에 있게 됩니다.
처음에 푸드코트 입구에서 카드환전할 필요 없이 바로 돈까스 코너로 가서
7000원 어치의 비트코인을 멀티시그 지갑으로 보내놓고 푸드코트에서는 당연히 그 멀티시그 주소를 알고있으므로 트랜잭션을 감지하되, 아직 서명해서 트랜잭션 완료 시키지는 않고 손님이 몇번 더 결제 하기를 기다립니다.
그다음은 만두 코너 였던가요? 5000원어치 비트코인을 같은 멀티시그 주소로 보내면, 아까 완료되지 않은 트랜잭션에 금액이 더해집니다. Off-Chain 전송인 셈이죠.
같은 방식으로 콜라도 사고 커피도 삽니다.
그후 푸드코트가 그 트랜잭션에 서명해서 트랜잭션을 완료시키면 한번의 On-Chain 트랜잭션이 수수료 지불해가면서 이뤄지게 됩니다.
근데... Trustless가 되기 위해서는 받는 측에서 오랜시간 서명하지 않는 경우에 돌려받아올 방법이 있어야 합니다.
예를들어 nLockTime 을 30분으로 해놓고 돈까스, 만두, 콜라를 주문해놓고 잠시 기다리는데 가게들이 갑자기 바쁜일이 생겨 음식도 안내주고 트랜잭션에 서명해서 클레임 해 가지도 않는 상태가 30분 이상 지속되면 아까 나왔던 CheckLockTimeVerify 기능을 사용해서 멀티시그에 걸어놓았던 코인을 돌려받을 수 있습니다.
단방향 결제채널은 말그대로 한쪽은 보내기만 하고 한쪽은 받기만 하는 한계가 있습니다.
양방향 결제채널(Bi-directional payment channels)이 Trustless 로 구현된다면 서로가 1 사토시 씩의 작은 금액도 수수료 걱정 없이 주고 받고 할 수 있고 좋을텐데 그것은 그전까지 비트코인에서 불가능 했습니다. 세그윗 이전 까지...
다음글에서 본격적으로 라이트닝 네트워크를 다룹니다.
All Images Credit: pixabay
좋은글(수준이 살짝 높구만유) 감사합니다 모닝님!! 그래도 이해가 잘되게 해주셨네요
thanks
Thank you for sharing this post, Morning.
Upvoted & Followed you as well.
좋군요... ^^
내용이 어려운건 저의 문제인가요...ㅎㅎㅎ
잘 읽고 갑니다. 다음글도 기다릴께요~
좋은 글 감사합니다. 다음 글 기대되네요 :)
(^^)좋은 글 감사드립니다
어려운 개념 쉽게 잘 설명해주셨네요!! 감사합니다:)!
감사합니다.