플라즈마캐시
플라즈마캐시(plasma cash)란 모든 사용자가 모든 거래내역을 복사하여 관리하던 기존의 블록체인이나 플라즈마 알고리즘과 달리, 개별 사용자가 관심을 가진 특정 코인이 포함된 블록만 추적함으로써 처리 속도를 향상시킨 알고리즘이다. 이더리움을 창시한 비탈릭 부테린과 댄 로빈슨, 칼 플로어쉬 등이 공동 개발하고 있다.
목차
개요
2018년 3월 10일 이더리움 커뮤니티 컨퍼런스에서 비탈릭 부테린이 플라즈마캐시를 발표했다. 플라즈마캐시는 이더리움의 플라즈마 스마트 컨트랙트와 Loom 사이드 체인 스마트 컨트랙트로 구현된다.
등장배경
기존의 플라즈마 모델에서 가장 중요한 문제점으로 꼽히는 것은 3가지 이다. 첫 번째는 검증에 필요한 리소스가 너무 많다는 것, 두 번째는 거래 승인의 과정이 복잡하다는 것, 마지막은 오퍼레이터의 부정행위에 대해서, exit로 대처할 수 밖에 없다는 것이다.
- 무거운 검증
- 플라즈마 체인은 계층 형태의 구조로 이루어져 있으며, 각 체인은 독자적인 합의 방식을 가질수 있다. 독자적인 구조를 가질 수 있다는 것은, 지분증명(PoS) 뿐만 아니라 한 집단에 의해 체인이 관리되는 PoA 합의 방식도 가질 수 있다는 것이다. 다소 중앙화 되어있는 합의 방식이 채택되었음에도 플라즈마 체인의 안정성을 보장할 수 있는 이유는 챌린징(이의 제기) 시스템에 있다. 누군가 부정한 출금을 시도했을 때, 체인을 관찰하고 있는 어느 누구라도 해당 출금이 부정함을 증명하여 부정 출금을 막을 수 있다. 이러한 장점 덕에, 플라즈마는 무한한 확장을 꿈꿀 수 있으나 역설적이게도 이러한 확장성이 검증의 자율성을 해치며 도리어 무한한 확장성의 발목을 잡는다. 예를 들어, 한 체인에서 만들어진 트랜잭션이 유요한 트랜잭션임을 증명하려면, 모든 부모 체인까지 해당 정보가 올라간 것을 확인한 후 서명을 해야 한다. 만약, 누군가 부정한 출금을 시도한다면, 상황을 더욱 복잡해 진다. Simple Withdrawal의 경우 출금 신청자는 상위 체인 어디로든 출금을 신청할 수 있다. 즉, 출금 신청자가 부정 출금을 시도할 때 공격 경로가 그만큼 다양해 진다는 것이다. 부정출금을 막기 위해서는 해당 체인의 모든 조상 체인들의 데이터를 가지고 있고 관찰하고 있어야 하는 불편함이 생긴다. 이러한 불편함은 플라즈마 체인을 이용한 디앱이 있다고 했을때, 디앱의 기능이 추가되거나 이용자가 많아질수록 점점 더 커지게 된다.
- 불편한 거래
- 기존 플라즈마 모델의 두 번째 문제점은 거래 승인의 과정이 복잡하다는 것이다. 기존 거래 과정을 살펴보자면, A->B로의 거래가 있을 때,
1. A가 A->B의 거래를 생성한다. 2. 해당 거래를 오퍼레이터에게 전달한다. 3. 오퍼레이터는 P-Chain에서 해당 거래 내용을 담은 블록을 생성한다. 4. 부모 체인으로 해당 내용을 올리며, 결과적으로 루트체인까지 내용이 올라가게 된다. 5. A는 해당 사실을 확인하고 서명하여 B에게 전달한다. 6. B역시 루트체인을 확인하고 사인을 한다. 7. 둘 다 사인하고 사인 트랜잭션이 블록에 담기면 트랜잭션은 유효해진다.
- 이와 같이 꼭 필요한 작업이지만, 사용자 입장에서는 번거로울수 있다. 또한, 거래의 마지막 결정권은 마지막 사인을 하는 사람에게 있기 때문에 Free Option Problem과 같은 문제도 생길 수 있다. 물론 이는 라이트닝 네트워크의 방법을 차용하면 어느정도 도움이 될 수 있다고는 하나 이 역시 불편함을 야기한다.
- 대응책의 부재
- 예를 들어, PoA 플라즈마 체인에서 다음과 같은 어택 상황을 가정해보자.
* 오퍼레이터가 자신에게 9999PETH를 주는 부정한 거래 생성 * 해당 정보를 통해 exit를 요청
- 단순한 공격 상황이지만, 기존의 플라즈마 모델에서 참여자는 이 공격 상황을 직접적으로 방어할 수 없었다. 대신, 참여자는 오퍼레이터와 같이 출금 요청을 한다. 여러 출금 요청이 들어온 경우 플라즈마는 우선 순위가 높은 거래부터 출금을 시켜주는데, 이 우선 순위란 utxo의 나이라고 볼 수 있다. 오퍼레이터의 부정한 거래보다 참여자가 소지한 utxo가 먼저 생성되었기 때문에 같이 출금을 신청할 경우, 참여자의 자금부터 출금이 되어 부정한 출금 요청은 잔액 부족으로 실패하게 되는 것이다. 이렇게 참여자는 공격으로부터 자금을 보호할 수 는 있지만, 참여 중이었던 네트워크는 마비되는 문제가 발생한다. 만일, 이 네트워크와 교류가 많은 이웃 네트워크가 있다고 한다면, 피해는 확산될 것이다. 부정 출금을 방어하는 가장 좋은 방법은 맞출금으로 대응하는 것이 아닌, 해당 출금을 취소하는 것이다.
특징
생성과정
고유한 id와 양을 가지는 플라즈마 캐시의 생성은 deposit에서 이루어진다.
1. A가 P-chain으로 1ETH를 deposit한다. 2. A의 1ETH는 플라즈마 체인에 lock 된다. 3. 루트 체인에서 새로운 id를 생성하고 그 id와 가치(1ETH)가 매핑된다. 4. 체인 내에서는 그 id와 1ETH의 가치를 가지는 플라즈마 캐시가 생성되어 A가 이 소유권을 가지고 있다.
이러한 과정으로부터 플라즈마 체인내에서 사용될 수 있는 플라즈마 캐시가 생성되며, 이는 대체 불가능(non-fungible)한 특성을 보인다.
머클트리
플라즈마 체인의 블록은 이제 다른 방식으로 거래를 저장한다. 기존의 모델에서는, 비트코인의 utxo 모델과 같이 거래를 머클화 시켜 저장했다. 또한, utxo 모델이기에 이 거랫값이 곧 새로운 token이 되었다. 플라즈마 캐시를 도입했을 때, 블록에 담겨 머클화 되는 정보는 거래가 아닌 거래에 사용된 토큰과 새로운 주인이다. 즉, 토큰의 상태 변화를 머클 트리에 담는다고 할 수 있다. 누군가 조작을 위해 Address, 혹은 Id를 바꿀 경우 Root Hash역시 변화하여 담긴 정보가 다름을 쉽게 파악 할 수 있다. 또한, utxo 모델과 다르게, 거래와 상관없이 토큰의 양과 id는 불변이기에, 새로운 utxo도 이전과 같은 id를 가지고 있다.
토큰의 소비
플라즈마 캐시를 소비하기 위해서는 다음 두 가지 정보가 필요하다.
1. 해당 id의 토큰이 소비된 이전 모든 거래 기록 2. 해당 id의 토큰이 소비되지 않은 이전 모든 블록에 대해, 각 블록의 머클 트리에 해당 id의 토큰이 포함되지 않았음을 보여주는 증명
플라즈마 체인 위 플라즈마 캐시의 생성, 저장, 거래 과정에서 기존 모델과 다른 특징을 갖고 있다.
비교
토큰 호환성
플라즈마 체인에서 활용되는 토큰인 ERC20에는 id가 없지만, ERC721에는 id가 있기 때문에 기존의 플라즈마 모델에서 ERC721 토큰을 플라즈마 체인 내에서 사용하는 것이 복잡했던 반면, 플라즈마 캐시는 기본적으로 ERC20보다는 ERC721에 더 가깝다. 이와 더불어, 플라즈마 캐시는 '양'에 대한 정보를 포함하고 있어 ERC20과의 호환이 가능하다. 즉, 루트체인에서 통용되는 토큰을 간단하게 플라즈마 체인 내로 예치할 수 있다는 것이다.
거래과정 축소
기존의 플라즈마 모델에서 2번의 확인 +최종 confirm과 같이 복잡한 거래 과정이 필요했던 이유는 다음과 같은 공격 상황이 발생할 수 있기 때문이다.
* A가 A->B 트랜잭션 생성(현재 100번째 블록) * 오퍼레이터가 101, 102, 103의 invalid 블록을 생성 * 그 후, A->B 트랜잭션을 104블록에 올려서 루트까지 commit
이 상황에서
1. A가 withdraw를 시도하려해도 A->B 트랜잭션이 104번째 블록에 있어 불가능(누군가 챌린지를 걸 수 있음). 2. B가 withdraw를 시도하려 해도 앞선 101, 102, 103 블록의 priority가 높기 때문에 불가능
최종적인 사인 없이 첫번째 트랜잭션 사인만으로 해당 거래가 유효하다고 하면, 위와 같이 오퍼레이터가 공격했을 때 무방비하게 당하게 된다. 하지만 플라즈마 캐시에서는 이용자들이 더 이상 두번의 사인 과정을 거치지 않아도 된다. priority의 개념이 존재하지 않고 exit process에서 해당 체인의 앞에서부터 priority대로 인출을 하는 것이 아니라, 각 토큰의 거래 기록을 보고 유효한다면 인출을 할 수 있다. 즉, A->B, B->C의 거래가 각각 500번째, 504번째 블록에 있었다고 할 때, 500번째 블록과 504번째 블록 사이에 있는 다른 블록들은 해당 토큰의 거래 기록과는 상관이 없기 때문에 그 블록들은 고려하지 않는다는 것이다. 위와 같은 공격 상황에선, B는 B가 현재 가지고 있는 토큰의 거래 기록만 유효함을 보여주면 101, 102, 103 블록과 상관 없이 인출이 가능하다. A의 경우 B에게 무사히 전달이 되었기 때문에 인출이 불가능하며, 이는 A에게 전혀 손해가 아니다. 정리하자면, 기존의 플라즈마 모델은 이전 블록에 따라 현재 블록의 valid함이 좌우되기 때문에 해당 블록과 valid함을 확인했다는 2번의 사인이 필요했다. 하지만, 플라즈마 캐시의 경우 개별 토큰의 거래 기록만이 valid함을 좌우하기에 처음 거래 생성 시 들어가는 사인만 있으면 문제없이 거래 할 수 있다.
효과적인 Exit Challenging
기본적으로 토큰 C에 대한 exit를 요청하기 위해선, C의 소유권 이전에 관한 상위 두 개의 거래 내역을 제사하면 된다. 플라즈마 캐시가 도입된 플라즈마 체인에서 부정한 exit process와 그 챌린징은 다음과 같이 분류 할 수 있다.
- 사용된 토큰의 출금 : 3->4의 트랜잭션이 컴펌됐으나 블록 3에 대해 exit를 요청하는 경우이다. 챌린저는 4의 내용을 통애 챌린징할 수 있다.
- 이중 지불 후 출금 : 1->2->3의 전송 과정이 valid 하나, 공격자가 2->4 블록으로의 이중 지불을 한 후, 블록4에 대해 exit를 요청하는 경우이다. 챌린저는 3의 내용으로 챌린징을 한다. 이 토큰은 블록4 전에 생겼으며 그 정보가 블록 4의 부모 체인으로 보내졌다. 따라서 exit process는 취소된다.
- 부정한 기록을 통한 출금 : 1->2의 블록까지 valid하고 공격자가 2->3->4->5 블록을 만들어 4->5를 제출해, 5에 대한 exit를 요청하는 경우이다. 챌린저는 블록 2까지 valid함을 증명한 뒤, 공격자에게 다음 블록을 요청한다. 공격자가 블록 2->3이 valid함을 증명하지 못하면 exit process는 취소된다. 만일, 공격자가 invalid한 블록을 withhold하여 공개하지 않았더라도, 챌린징 방식은 유효하다.
중요한 점은 id의 도입으로 인해, 기존 모델에서는 불가능했던 챌린징이 가능해졌다는 것이다. 앞선 문제점에서 언급되었듯, 기존 모델에서 오퍼레이터가 부정한 토큰을 만들어 인출을 시도했을 경우, 참여자들은 순차적인 exit를 통해 빠져나가는 방법을 택할수 밖에 없었다. 그러나, id가 도입되면 같은 상황에서 오퍼레이터가 인출 대상 토큰의 모든 거래기록을 보유하고 있어야 한다. 이 기록은 deposit까지 이어지는데, 앞 상황의 경우 deposit이 존재할 수 없다. 따라서 챌린지를 걸면 공격자가 유효성 증명이 불가능하기에 참여자들은 exit가 아닌 방법으로 해당 부정 인출을 취소시킬 수 있다.
관찰 비용 절감
사실상 플라즈마 캐시의 핵심이라 할 수 있는 개선점이다. deposit 이후 생긴 모든 토큰은 루트체인에 매핑되어 기록되어 있다. 또한, 그 토큰들의 id는 불변한다. 해당 토큰 보유자는 새로 생성되는 블록 중에 자신이 보유한 토큰의 id만 확인하면 된다. 즉, P-chain이든 부모체인이든 자신의 토큰과 관련된 블록들만 선택적으로 저장, 관찰하면 자신의 자산이 안전함을 알 수 있다. 그 저장 기록들 역시, 거래 성사시에 이전 소유자에게서 받기 때문에 검증만 된다면, 이전 기록에서 하나하나 찾을 필요가 없어진다. 다시 말해, 모든 데이터를 소유해야 하는 기존의 플라즈마 모델과 달리, 플라즈마 캐시는 관찰기능이 분할되어 있다.
공격 부담 증가
기존의 플라즈마 모델에서 출금하기 위해서는 한 번의 출금과정만 거치면 됬기 때문에 공격에 노출되기가 쉬웠다. 그러나, 플라즈마 캐시의 경우 루트체인에 모든 토큰이 각각 기록되어 있다. 따라서 출금을 요청하기 위해서는 출금하고자 하는 모든 토큰에 대해 따로 출금신청을 해야한다. 즉, 기존에는 한번만 거짓말을 하면 됬지만, 플라즈마 캐시의 도입을 통해 토큰 n개의 거짓말을 해야한다는 것이다. 이는 공격자의 공격 부담을 증가시킨다.
장단점
장점
플라즈마 캐시는 클라이언트가 처리해야 할 데이터의 양을 크게 줄일 수 있다. 비탈릭 부테린은 "사용자가 거래소에 이더를 입금하면, 이더와 동일한 가치의 플라즈마 코인이 만들어지는 시스템" 이라고 설명했다. 각 프라즈마 코인은 고유 ID가 부여되어 플라즈마 캐시의 주인은 본인의 거래와 관련된 플라즈마 체인의 블록만을 검증해도 충분하다. 사용자가 추적하고 싶은 코인이 포함된 블록만 확인할 수 있도록 만들어, 전체 플라즈마 히스토리를 다운로드하고 확인해야 하는 기존 플라즈마보다 효율적이게 되는 것이다.
또한, 플라즈마캐시는 이더리움을 처음 암호화폐 거래소에 입금한 사용자의 정보가 있기 때문에 도난의 위험을 낮춰 준다. 만약 해당 플라즈마 캐시 코인이 무단으로 인출되면 플라즈마 캐시의 '증거 데이터'를 이용해 이의를 제기할 수 있다. 해킹 사건의 경우, 해당 플라즈마 캐시의 주인은 조정과정을 거쳐 플라즈마 캐시와 연동된 이더를 돌려받을 수 있게 된다. 즉, 개발자들의 실수로 인한 해킹사건으로 자산을 잃게 되는 문제를 해결할 수 있다는 것이다. [1]
단점
- 효율적인 거래의 한계
- 지폐로 예를 들자면, A가 만원 한장을 들고 있고, B에게서 5천원어치의 물건을 구입하려할 때, B가 거슬러 줄 5천원이 없을 경우, 5천원 두장을 보유하고 있는 C를 통해 A는 물건을 구입해야 한다. 물론, 네트워크 상에서는 실제보다 C를 찾는 것은 쉽겠지만, 불편한 거래 과정이 한단계 추가되는 것이며, C는 이 거래에 대한 수수료도 요구할 수 있다.
- non-existence proof의 구현
- 예를 들어, 220만개의 블록이 생성되었고, 그 동안 토큰A가 총 10번 거래되었다고 하면, 다음번 거래 시 2,199,990개의 블록에 대해 해당 토큰이 거래되지 않았음을 모두 증명해야 한다. 이 증명 제시 방법을 효율적으로 짜지 못하면, 굉장히 불편하고 무거운 작업이 될 것이다.
- 복잡한 exit 신청
- 종료를 위해 신청자는 거래를 할 때와 마찬가지로 다음과 같은 두 가지를 제출해야 한다.
* 해당 id의 토큰이 소비된 이전 거래 기록이 유효함을 보여주는 증명 * 해당 id의 토큰이 소비되지 않은 이전 모든 블록에 대해, 각 블록 머클트리에 해당 id의 토큰이 포함되지 않았음을 보여주는 증명
- 거래에서 수신자가 위 증명들을 검증했듯이, exit를 신청하면 플라즈마 컨트랙트에서 그 작업을 수행해야 한다. 자칫하다 상당히 무겁고 비싼 작업이 될 수 있으므로 이 과정을 최적화 하는 방법이 꼭 필요하다.
- 수수료
- 분할이 안되는 플라즈마 캐시 시스템에서 수수료는 굉장히 큰 걸림돌이다. 수수료 지급에 관해서는 다음과 같은 논의가 있다.
* 플라즈마 체인 내에서 사용될 수 있는 수수료용 토큰을 만든다. * 플라즈마 캐시의 id에 소수점을 넣어 사실상 '분할'한다. 예를 들어 id=12345, amount=1ether인 토큰이 있다고 할 때 이 토큰에 소수점을 도입하면 사실상 id=12345.0000이 된다. 이후, 거래가 일어날 시, (12345.0000, 1ether)토큰은 (12345.0001, 0.9ether)와 (12345.0002, 0.1ether) 토큰으로 분할되는 것이다. => 문제1:(수수로)>(토큰의 가치)가 될때까지 분할되면 그 토큰은 사실상 사용되지 못한다. => 문제2:분할로 인해 감시해야 하는 토큰의 개수가 점점 늘어날 것이다. * 플라즈마 캐시 내에 수수료 항목을 담는다. 즉 토큰은 (id, amount, total_fee)값을 가지게 된다. id=12345, amount=1ether인 토큰이 있다고 하며느 이 토큰의 초기 total_fee=0이다. 이 토큰의 소지자가 거래를 하고 나면, (12345, 1ether, 0) => (12345, 1ether, 2000gas)가 될 것이다. 이 토큰은 total_fee가 amount보다 커지기 전까지 사용될 것이고 eixt process시, 토큰의 가치는 amount_fee가 될 것이다.
- 확실한 것은 수수료를 신경쓰게 되면 구현과 작동이 매우 복잡해질 가능성이 있다.
- Block Withholding
- 이 문제는 오퍼레이터에 의해 거래 데이터가 언제 공개되는지 결정되는 문제이다. 만약, 오퍼레이터가 3번째 거래를 숨긴다면 참여자는 3번째를 못보고 2->4의 거래를 만들 수 있다. 그 직후, 오퍼레이터가 숨긴 거래를 퍼뜨리면 2->4거래는 이중 지불이 되어 버린다. 이와 같은 눔제에 대해 복구 메커니즘의 구현이 꼭 필요하다.[2]
각주
- ↑ 블록체인 VC, 〈비탈릭, 플라즈마 캐시 제안〉, 《네이버 블로그》, 2018-03-15
- ↑ Jihyeok Choy, 〈블록체인 확장성 솔루션 시리즈 2–3 :: Plasma Cash〉, 《미디엄》, 2018-05-03
참고자료
- Jihyeok Choy, 〈블록체인 확장성 솔루션 시리즈 2–3 :: Plasma Cash〉, 《미디엄》, 2018-05-03
- 블록체인 VC, 〈비탈릭, 플라즈마 캐시 제안〉, 《네이버 블로그》, 2018-03-15
같이 보기