상태 채널, 플라즈마, 트루빗
원문 : Making Sense of Ethereum’s Layer 2 Scaling Solutions: State Channels, Plasma, and Truebit by Josh Stark
2018년 초의 글을 지금 정리하는 게 (특히나 1달이 1년 같은 변혁의 소용돌이 크립토 세상에서) 무슨 의미가 있겠냐만은, 방향성이 같고 이만큼 정리가 잘 된 글도 드물어 옮겨보았다. '오프체인'이나 '레이어2'가 생소한 독자라면 지금 이 글을 읽어도 아무 문제가 없을 것이다.
이더리움은 아직 신생아다. 그래서 사용하기 안전하기도 확장 가능하지도 않다. 2017년 ICO의 열기는 이더리움 네트워크의 현 능력치를 지나치게 과대 포장했다. 그러나 전 세계 수억 명이 이더리움과 웹3를 누리기 위해서는 먼저 인프라 구축이 필요하다.
이 주요 인프라를 짓고 이더리움의 능력치를 확장시키려는 프로젝트들이 "스케일링(scaling, 확장) 솔루션"이다. 이 글은 스케일링 솔루션 중 한 가지 카테고리인 "오프체인" 혹은 "레이어2" 솔루션에 집중한다.
독자에게 레이어2 솔루션의 작동 방법을 구체적으로 설명하는 게 이 글의 목표다. 코드나 구체적인 구현 방식은 파고들지 않을 테니 걱정 마시라.
확장성(Scaling)이란 이더리움이 수십억 명의 글로벌 유저에게 활용되기 위해 먼저 극복되어야 할 기술적 문제들의 총합이다.
가장 흔히 거론되는 확장성 문제는 거래 처리 속도(transaction throughput)다. 현재, 이더리움은 1초에 15개의 거래를 처리할 수 있는데, 비자는 45,000건 처리가 가능하다. 이더리움과 같은 퍼블릭 블록체인의 가장 큰 한계는, 네트워크가 처리해야할 할 모든 거래(transaction)를 모든 노드(네트워크 참여자)가 병렬적으로 처리해줘야 한다는 것이다. 노드들은 타자에 의존할 필요 없이 블록체인 네트워크의 현 상태를 스스로 오퍼레이션을 처리하며 알 수 있고, 퍼블릭 블록체인의 힘은 바로 이런 탈중앙화다.
그러나 이 디자인은 이더리움의 거래 처리 속도에 심각한 제약을 준다. 네트워크 전체의 속도는 개별 노드의 처리 속도보다 높아질 수 없다.
물론, 개별 노드가 한 번에 더 많은 일을 하도록 해서 처리 속도를 높일 수 있다. 그러나 이는 탈중앙화를 일정 정도 포기해야 한다는 뜻이다. 일반인들이 가지고 있는 연산 능력이 떨어지는 컴퓨터들이 네트워크에서 떨어져 나가면, 채굴은 더 많은 리소스를 가지고 있는 권력자들에게로 집중될 것이다.
그보다는 개별 노드의 일감을 늘리지 않으면서 더 의미 있는 작업들만 수행하도록 블록체인을 개발해야 할 것이다. 이 문제를 해결하는 데는 두 가지 해결책이 있다.
꼭 모든 오퍼레이션을 모든 노드가 처리해야 하는가? 그 대신, 네트워크를 두 파트로 나눠서, 각자가 세미-자율적으로 작동하면 어떨까?
섹션 1은 처리해야 하는 트렌젝션의 한 묶음(batch)을 담당하고, 섹션 2는 나머지 한 묶음을 처리하는 것이다. 이제 우리의 질문은 '각각의 파트에서 온 두 개의 노드가 동시에 처리할 수 있는 일의 양'으로 바뀌었기 때문에, 블록체인의 처리 속도는 두배로 높아질 것이다. 만약 우리가 블록체인을 여러 개의 섹션으로 나눌 수 있다면, 우리는 처리 속도는 그만큼 몇 배로 높아질 것이다.
이것이 비탈릭의 이더리움 리서치 그룹 등이 개발 중인 "샤딩(sharding)"의 기본 개념이다. 블록체인은 "샤드(shard)"라고 불리는 섹션들로 나눠지고, 각 섹션은 독립적으로 트렌젝션을 처리할 수 있다. 샤딩은 레이어1 솔루션으로 불리는데, 이더리움의 기본적인 내부 프로토콜을 바꾸는 것이기 때문이다.
이더리움 블록체인의 처리 능력(capacity)을 키우기보다, 더 의미 있는 작업만 골라서 처리해도 된다면 어떨까?
이것이 상태 채널, 플라즈마, 트루빗 같은 "오프체인" 기술의 기본 아이디어다. 이들은 메인 체인 "위에" 올라가서 구동되기 때문에 레이어2 솔루션으로도 불린다. 이들은 기본 프로토콜 레벨에서의 변화 없이 오프체인 소프트웨어와 상호작용하는 이더리움 스마트 컨트렉트다.
퍼블릭 블록체인의 근본적인 힘은 암호경제학적 합의(crypto-economic consensus)에 있다. 인센티브가 서로 시너지가 나도록(내 인센티브에 따라 행동했을 때 전체의 이익에 부합하게) 설계하고, 소프트웨어와 암호학으로 그 인센티브가 변치 않음을 보장함을 통해, 우리는 시스템의 상태(state)에 대해 네트워크 참여자 모두가 합의할 확률이 굉장히 높은 컴퓨터 네트워크를 구현할 수 있다. 이것이 비트코인 백서의 핵심 아이디어이며, 이는 비트코인과 이더리움을 포함한 여러 퍼블릭 블록체인 디자인에 적용되었다.
암호경제학적 합의는 확실성(certainty)의 핵심이다. 결제나 스마트 컨트렉트 같은 온체인 오퍼레이션이 쓰인 그대로 실행되리라는 것을 참여자 모두가 알고 있다.
레이어2 솔루션의 인사이트는 우리가 '온체인의 확실성'을 닻(anchor, 앵커)처럼 활용해서, 부가적인 경제적 메커니즘을 덧붙일 수 있다는 점이다. 최종성(finality)을 살짝 낮춰도 되는 일들에서 레이어2 솔루션은 훨씬 낮은 간접비로, 훨씬 빠르게 오퍼레이션을 처리할 수 있다.
상태 채널(State Channel)은 오프체인(off-chain, 블록체인 바깥, cf. 온/오프라인)에서 상태를 업데이트하는 기술이다. 예를 들어 보자.
철수와 영희가 틱택토 게임(5목이 아니라 3목! 구글에 치면 바로 해볼 수 있다)을 한다. 이기면 1이더를 받는다. 이 게임 전체를 이더리움 위 스마트 컨트랙트로 프로그래밍해서 만들 수 있다. 하지만 비효율적이고 느리다. 전체 이더리움 네트워크의 모든 노드가 두 명의 게임을 처리할 필요는 없지 않은가! 수를 한 번 둘 때마다 가스비(이더리움 네트워크 사용료, ETH로 지불해야 한다)를 지불해야 하고, 다음 수를 두기 전에 블록이 생성되어 이전 거래가 무사히 체결되길 기다려야 한다.
그 대신 상태 채널을 통해 오프체인에서 게임의 상태를 업데이트하고, 유사시에만 확실성이 보장된 이더리움 메인넷(본체)로 되돌아가 시비를 가릴 수도 있다. 이것이 "상태 채널"이다.
먼저, 이더리움 메인넷 상에 스마트 컨트렉트로 "심판"을 만든다. 이 심판에게 틱택토 규칙을 알려주고, 참가자가 철수와 영희라는 것도 입력한다. 1이더 상금도 이 스마트 컨트렉트에 적립해 둔다.
게임을 시작하고, 철수는 자신의 첫 수를 기록한 트렌젝션에 서명(인증)을 하고 영희에게 보낸다. 그걸 받은 영희도 자기 서명을 하고, 자기 서명으로 업데이트된 버전 다시 철수에게 보내고, 그 업데이트 본의 사본을 보관한다. 영희도 자신의 첫 수를 기록한 트렌젝션을 싸인하고 철수에게 보내고 등등 똑같은 절차를 반복한다. 매 회차에, 그들은 서로의 '게임 상태(state)'를 업데이트하는 것이다. 매 트렌젝션은 "논스(nonce, 임의의 값)"값을 가지는데, 이 논스 값은 나중에 트렌젝션(게임의 수)이 어떤 순서로 발생했는지 확인하는 데 쓰인다.
지금까지의 모든 일들은 오프체인에서 일어나고 있다. 철수와 영희는 단순히 인터넷을 통해 서로에게 트렌젝션을 보내고 있다. 하지만 이 모든 트렌젝션은 이더리움 메인넷 위 "심판" 에게 보내질 수 있다. 이것은 마치 두 사람이 서로에게 블록체인이 보증한 수표(cheque, 영미권에서는 현금 대신 자기 앞으로 발행된 수표에다 받는 사람과 금액, 날짜와 서명을 적어서 '수표를 끊어' 지불하더라)를 끊어주는 것과 같다. 실제로 은행에 돈이 입출금 된 적은 없지만, 각자가 받은 체크로 원한다면 언제든지 은행에서 돈을 인출할 수 있다.
틱택토 게임이 끝나면 블록체인 위 심판 계정에게 최종 상태(예를 들면 지금까지 발생한 트렌젝션의 목록)를 전달하며 채널을 닫는다. 이 경우, 거래 비용은 마지막 전달에 대해 단 한 번만 지불하면 된다. 심판은 제공받은 "최종 상태"가 두 사람 모두의 서명을 가지고 있는지 확인하고, 심판 결과를 확정하기 전에 일정한 "조정 기간"을 거친 다음 승자에게 1ETH를 보내준다.
왜 이런 "조정 기간"이 필요한 걸까?
게임에서 진 철수가 결과를 조작하기 위해 심판에게 최종 상태가 아니라 자신이 앞서고 있던 옛날 버전을 보낸다고 생각해보자. 여기서 심판은 그저 코드 몇 줄짜리 스마트 컨트렉트일 뿐, 혼자서는 게임의 진짜 최종 상태가 무엇이었는지, 즉 승자가 누구인지 알 수 없다.
여기서 결과를 바로잡을 인센티브를 가진 사람은 바로 억울한 영희다! 영희는 더 최신의, 철수의 서명까지 담긴 최종 트렌젝션의 사본을 가지고 있고, 이것을 조정 기간 동안 심판에게 보내면, 심판은 최신 논스 값을 가진 트렌젝션이 어느 것인지 확인하고 철수의 버전을 기각할 것이다.
상태 채널은 접근 가능성(availability)이 보장되어야 한다. 영희가 조정 기간 동안 인터넷에 접속할 수 없다거나 일정을 깜빡한다면 1이더의 상금도 찾을 수 없다. 플랜 B로 미리 대리인을 선정해놓을 수는 있다.
상태 채널은 오랜 기간 동안 여러 번의 상태 업데이트를 할 때 가장 유용하다. 왜냐하면 처음에 심판 컨트렉트를 만드는 데 초기 투자 비용이 발생하기 때문이다. 대신 한 번 채널을 구축하고 나면 그 채널 내부에서 상태를 업데이트하는 비용은 매우 낮다.
상태 채널은 참여자들이 확정된 상황에 적합하다. 심판 컨트렉트는 항상 채널의 모든 참여자(지갑 주소)를 알아야 한다. 참여자를 넣고 빼는 것은 물론 가능하지만, 이를 위해서는 매번 심판 컨트렉트 자체를 고쳐줘야 한다.
상태 채널은 프라이빗하다! 왜냐하면 모든 오퍼레이션이 채널 내부 참여자들 사이에서 일어나기 때문이다. 온체인에 기록되는 내용은 모두가 볼 수 있지만, 상태 채널의 경우 채널을 열고 닫는 트렌젝션만 온체인에 공개된다.
상태 채널은 즉시 체결(instant finality)된다. 모든 거래 당사자들이 상태 업데이트에 서명하고 나면, 그 업데이트는 최종적으로 확정된 셈이다. 참여자들은 유사시에 온체인에서 그 서명된 상태를 "강제"할 수 있다는 것을 잘 알고 있다.
플라즈마도 상태 채널처럼 이더리움 메인 블록체인을 통해 안전(security)을 담보하면서 오프체인에서 작업을 처리하는 기술이다. 플라즈마는 "메인" 블록체인으로부터 가지를 쳐서 "자식(child)" 블록체인을 만들어 전체 체인의 확장성을 높인다. 이 자식 체인들 또한 더 가지치기를 해서 손자 체인을 만들 수 있고, 증손자 고손자 등등까지 계속해서 확장 가능하다.
수천 명의 유저를 가진 복잡한 앱을 자식 체인 레벨에서 작동시키고, 이더리움 메인 체인에서의 작업은 최소화함으로써 더 빠르고 저렴하게 앱을 구동할 수 있다.
예를 들어, 이더리움 위에서 포켓몬 카드 게임을 한다고 가정해보자. 카드들은 ERC721의 NFT토큰이며, 게임의 룰이 복잡하고 경우의 수가 많아 온체인에서 게임을 통째로 처리할 수는 없다. 플라즈마를 사용해보자.
먼저, 이더리움 메인넷에 "뿌리" 스마트 컨트렉트를 만들자. 플라즈마 자식 체인은 여기서부터 뻗어나간다. 이 뿌리 컨트렉트는 자식 체인에서 일어날 기본적인 "상태 변경 규칙"("이미 사용한 아이템을 또 사용하는 트렌젝션은 처리 불가능하다"와 같은)을 담고 있다. 자식 체인의 상태에 대한 해쉬값(hashes, 암호화된 결과물)도 포함하고 있으며, 게임 유저들이 메인체인과 자식체인 사이에 (포켓몬 카드와 같은)디지털 자산을 옮기는 통로 역할도 한다.
다음으로 자식 체인을 만든다. 자식 체인은 (메인체인과 다른) 독자적인 합의 알고리즘을 가질 수도 있고, 프라이빗 블록체인으로 채굴도 사전에 지정된 노드들만 할 수 있게 설정할 수 있다. 이번 예시에서는 블록 생성자(block producer)가 한 명뿐이라고 가정해보자.
자식 체인이 구동되기 시작하면, 블록 생성자들은 뿌리 컨트렉트에 "여기 자식 체인의 최신 블록은 이겁니다"라는 소식을 주기적으로 업데이트(make commitment)해준다. 이 소식들은 온체인에 기록된다. ERC721 을 통해 생성된 포켓몬 카드들은 이더리움 메인넷에서 생성된 것이기 때문에 뿌리 컨트렉트를 통해 자식 체인으로 옮겨져야 한다. 플라즈마는 블록체인을 기반으로 한 디지털 자산의 활용을 손쉽게 만들어주지만, 이 자산들은 우선적으로 이더리움 메인 체인에서 생성돼야 한다.
마지막으로, 자식 체인에 스마트 컨트렉트를 생성해서 게임 방식과 규칙을 담은 앱을 만든다.
유저들이 게임을 플레이할 때는 자식 체인만 사용된다. 카드를 사고팔고, 대결을 하는 트렌젝션을 처리하는 노드들은 자식 체인의 노드들이고, 따라서 훨씬 저렴하고 빠르게 게임을 할 수 있다.
자식 체인에서 체결된 거래가 뒤집힐 일은 없을까? 심지어 이번 예는 블록 생성자가 단 한 명이라고 말했다. 이건 너무 중앙화 돼 있지 않은가? 내 포켓몬 카드를 이 한 명이 다 훔쳐가면 어떻게 하나!
플라즈마는 유저가 원한다면 언제든 메인 체인으로 디지털 자산을 철수시킬 수 있도록 안전장치가 마련돼 있다. 블록 생성자가 아무리 악독하더라도, 최악의 경우는 '자식 체인 강퇴' 정도다.
플라즈마는 "사기 증명" 메커니즘을 가지고 있다. 누구나 뿌리 컨트렉트에게 '이 블록 생성자가 사기 쳤다'라고 신고할 수 있다. 이 사기 증명에는 (사기 블록의) 이전 블록에 대한 정보와, (우리가 맨 처음 뿌리 컨트렉트에 입력했던) '상태 변환 규칙'에 따르면 그 이전 블록에서 사기 블록이 나올 수 없다는 정보가 들어있다. 이를 통해 사기가 입증되면, 자식 체인은 "롤백(rolled-back)" 되어 강제로 다시 사기 이전 블록으로 돌아가게 된다. 벌칙으로 사기 친 블록 생성자의 온체인 적립금(deposit)을 몰수할 수도 있다.
그런데 사기 증명을 위해서는 블록 데이터가 필요하다. 블록 생성자들이 사기 이전 블록에 대한 정보를 공유하지 않는다면 어떻게 뿌리 컨트렉트에 신고하겠는가?
이 경우, 게임 플레이어는 디지털 자산을 모두 인출해서 자식 채널을 나갈 수 있다. 플레이어가 뿌리 컨트렉트에 "소유 증명(Proof of Fund)"를 제출하고, 누구나 이 증명을 반박할(얘 이미 이 카드 저랑 대결할 때 썼어요!) 수 있는 '조정 기간'이 지난 뒤에는, 해당 자산들은 모두 이더리움 메인 체인으로 돌아간다.
블록 생성자가 특정 유저를 감시하고 그들의 게임 플레이를 담은 트렌젝션을 블록에 안 넣어주는 경우에도, 이더리움 메인 체인의 뿌리 컨트렉트에 소유 증명을 제출하는 데에는 문제가 없다.
여기에도 위험 요소는 있다. 자식 체인의 유저 모두가 동시에 인출을 요청한다면, 네트워크 과부하로 인해 조정 기간이 다 지나도록 인출을 못해줄 수도 있다. 이 경우에는 인출 요청에 비례해서 조정 기간을 연장하는 등의 대비책을 적용할 수 있다.
다만, 이상은 블록 생성자가 한 명이었을 경우를 가정한 예시이기 때문에, 더 탈중앙화 된 체인은 더 안전할 것이다.
참고로, 상태 채널에서는 플라즈마와 달리 자산의 즉시 인출이 가능하다. 채널의 참여자 모두가 인출에 동의하기만 한다면, 즉 인출 전의 최종 상태에 참여자 모두의 서명을 받을 수만 있다면, 채널에서 자산을 인출하는 것은 즉시 가능하다. 플라즈마는 조정 기간을 두고 소유 증명 과정을 거쳐야 한다.
또한, 상태 채널은 플라즈마보다 트렌젝션 처리가 더 빠르며, 저렴하다. 그래서 상태 채널은 플라즈마 자식 체인 위에 만들어질 가능성이 높다.
트루빗은 이더리움이 무겁고 복잡한 계산을 오프체인에서 처리할 수 있도록 해주는 기술이다. 더 많은 트렌젝션을 처리할 수 있게 해주는 상태 채널과 플라즈마와는 다른 접근이다.
예를 들어, 비트코인 등 다른 블록체인에 이 트렌젝션이 포함되어있었는지(SPV proof, Simple Payment Verification proof)를 증명하는 경우처럼 무거운 트렌젝션은 이더리움 메인 체인에서 처리하기 너무 비싸고 느리다. 대신 트루빗을 활용해서 다른 사람이 오프체인에서 이런 작업을 대신 처리해 주고, 일정 요금을 지불할 수 있다. 이 사람들을 해결사(solver)라고 부른다.
먼저, 해결사들이 스마트 컨트렉트에 예치금을 납부한다. 그리고 해결사가 요청받은 작업을 처리하고, 결과를 전송한다. 만일 그 결과가 정확하다면(이후 자세히 설명 예정), 예치금은 반환된다. 틀렸다면 돌려받을 수 없다.
하지만 그 결과가 맞는지 틀렸는지 어떻게 알 수 있단 말인가?
트루빗은 "검증 게임"이라는 인센티브 메커니즘을 사용한다. "도전자(Challenger)"들은 해결사들이 틀렸다는 것을 입증해 내면 보상을 받는다. 이 검증 게임은 온체인에서 진행되기 때문에, 검증을 위해 트렌젝션을 처음부터 끝까지 돌려볼 수는 없다(어차피 온체인에서 다 처리할 것이라면 트루빗은 쓸모가 없다). 그보다는, 해결사와 도전자는 정확히 어떤 지점, '코드의 몇 번째 줄'에서 둘이 서로 충돌하는지, 어디서 결과 차이가 비롯된 것인지를 콕 집어 밝혀줘야 한다.
이렇게 논쟁 범위가 줄어들면, 이더리움 메인 체인에서 그만큼의 트렌젝션만 처리해 보고 시비를 가릴 수 있다.
레이어2 솔루션은 하나의 인사이트에서 출발한다. 퍼블릭 블록체인에서 보증해주는 확실성을 근거(anchor, 닻) 삼아, 암호경제학적 시스템을 덧붙여서 블록체인의 활용성을 높이는 것이다.
이 암호경제학적 시스템은 인센티브 게임이다. 각각의 참여자들이 서로를 견제하도록 인센티브를 준다. 어떤 주장이 틀렸다는 걸 입증하는 데 큰 상금을 걸었는데, 아무도 오류를 발견하지 못한다면, 해당 주장은 맞는 내용일 확률이 매우 높다.
상태 채널, 플라즈마, 트루빗은 암호경제학을 활용한 확장성 솔루션의 일부일 뿐이다. 레이어2 확장성 솔루션은 이더리움같이 프로그래밍 가능한 블록체인의 장기적 발전에 매우 중요하다. 이런 솔루션을 통해 우리는 속도-최종성(finality)-비용(overhead cost) 간의 상충 관계(tradeoff)를 조절할 수 있다. 이런 조절을 통해 훨씬 다양한 블록체인 앱을 만들 수 있다. 정부의 공격도 버텨내야 하는 중요한 트렌젝션에는 메인 체인을 사용하고, 속도가 중요한 디지털 자산 트레이딩에는 플라즈마를 활용하는 것이다. 레이어2 솔루션은 이런 상충 관계를 조절하면서도 메인 체인을 활용해서 탈중앙성과 최종성을 보장할 수 있다.