샤딩이란? 쉽게 이해해보자
확장성 문제의 해결2: 샤딩편
1. 확장성과 샤딩과의 관계
블록체인에서의 문제점은 크게 탈중앙화, 보안성, 확장성의 문제로 이 세 가지 문제 중 어떠한 두 가지는 만족시킬 수 있지만, 남은 한 가지는 만족시킬 수 없는 트릴레마의 문제를 가지게 됩니다. 하지만, 이 중에서 그 동안 가장 블록체인 기술에서 문제되었던 부분은 확장성의 문제였습니다.
상용화를 위해서는 기존의 서비스와 같이 불편함이 없어야하기 때문에 (TPS 즉, Transfer Per Second라는 단어를 많이 보셨을 것입니다.) TPS가 빨라야지만, 정보를 처리하는데 사용자들이 오랜시간 기다리지 않고 사용할 수 있다고 생각하기 때문입니다. 물론 확장성의 문제는 TPS만을 말하는 것은 아닙니다. 하지만, TPS의 비교를 통해 얼마나 짧은 시간 안에 많은 정보를 처리할 수 있느냐를 직관적으로 확인할 수 있기 때문에 사람들은 수많은 블록체인 프로젝트를 비교할 때 대표적으로 TPS를 비교합니다.
샤딩은 확장성의 문제를 해결해주는 한 가지의 방법으로써 노드들을 좀 더 빠르게 검증할 수 있어 빠른 트랜잭션을 통하여 좀 더 높은 TPS를 가질 수 있게 됩니다.
2. 샤딩이란 무엇일까?
샤딩이란, 단일의 데이터를 다수의 데이터 베이스로 쪼개어 나누는 것을 말합니다. 특히, 단일의 데이터 베이스에서 저장하기 너무 클 때 사용합니다. 이렇게 데이터를 구간 별로 쪼개어 나눔으로써 노드에 무겁게 가지고 있던 데이터를 빠르게 검증할 수 있어 빠른 트랜잭션 속도를 가질 수 있게 됩니다. 또한, 샤드란 샤딩을 통해 나누어진 블록들의 구간 (혹은 Epoch)을 ‘샤드’라고 부릅니다.
3. 샤딩의 종류
-네트워크 샤딩
-트랜잭션 샤딩
-스테이트 샤딩
4. 네트워크 샤딩의 특징과 단점
네트워크 샤딩은 임의로 네트워크가 무작위로 노드를 샘플링하여 블록 단위로 샤드를 형성합니다. 하지만, 네트워크가 샤드의 구성원에 대한 동의를 구하지 않아 구성원들이 원하는 방향으로 가지 않는 경우, 구성원들의 불만을 해결하지 못한다는 단점을 가지고 있습니다.
5. 트랜잭션 샤딩의 특징과 단점
트랜잭션 샤딩은 트랜잭션 해시의 마지막 몇 비트를 기반으로 샤드를 결정하고 트랜잭션의 유효성을 확인합니다. 하지만, 사용자가 악의적인 경우, 동일한 두 입력이지만 출력이 다른 트랜잭션을 생성할 수 있습니다. 또한 이중 지출을 방지하기 위해 유효기간이 진행되는 동안에 샤딩이 된 조각의 노드들은 서로 간에 통신이 필요합니다. (통신은 그만큼의 시간과 비용이 따르게 됩니다.)
6. 스테이트 샤딩의 특징과 단점
스테이트 샤딩은 account-based model입니다. 상태가 지정된 블록체인에서이 특정 샤드는 상태의 일부만을 유지합니다. 하지만, 교차분할 트랜잭션을 수행하지 못하도록 제한이 되어있습니다. 또한 시스템의 상태가 모든 샤드에 복제되어 있지 않기 때문에 네트워크는 더 이상 오프라인 샤드에 대한 트랜잭션의 요효성을 검사하지 못하게 됩니다. 오프라인 샤드를 유지하기 위해 백업 노드를 갖게된다면 중앙집중식이 되어 보안성에 위협이 됩니다. 네트워크가 한 번씩 재편성될 때 한 번에 네트워크를 전환하게 되면 일부 동기화가 완료될 때까지 전체 시스템을 사용할 수 없게 될 수도 있습니다.
7. 샤딩의 문제점이란?
확장성의 문제를 해결방책으로 나온 샤딩에도 문제점이 있습니다. 아까 1번 글의 트릴레마에서 언급했듯이, 중앙화의 문제와 보안성의 문제를 가지게 됩니다. 보안의 문제에는 1% attack의 문제가 생길 수가 있습니다. 100개의 샤드의 시스템에서는 오직 1%의 hash rate로 샤드를 지배할 수 있습니다. 이 뿐만의 문제가 아닙니다. 샤드 간의 커뮤니케이션이 너무 빈번하게 일어난다면, 커뮤니케이션으로 인한 시간지연의 문제가 생기게 됩니다.
8. 현재 진행되고 있는 샤딩 프로젝트들
-이더리움 Beacon Chain
-이더리움 Shasper (Casper + Sharding)
-질리카 샤딩
9. 이더리움 샤딩의 과제
1. 난수생성
난수를 사용하여 검증자를 샤드에 배정하는데, 공격자가 난수를 예측하거나 조작할 수 있다면, 샤딩 보안에 문제가 생길 것입니다. 기존의 RANDAO 난수 생성방식을 VDF(Verifiable Delay Function)를 통하여 개선하는 중입니다.
2. 빠른 샤드 전환
샤드에 대한 공격성공 가능성을 줄이려면 검증자를 빠르게 전환해야 합니다. 이를 위하여 이전부터 lookahead time을 두어 검증자가 자신이 맡을 샤드 블록을 미리 동기화시킵니다. 미리 동기화하기 위해서는 동기화할 자료를 줄여서 빠르게 검증자를 준비할 수 있는 stateless client를 제안합니다. stateless client는 블록 헤더만을 저장합니다. 하지만 블록헤더만을 저장하기 때문에 거래에 대한 검증은 불가능합니다. 거래 검증을 하려면 거래를 만들 때, 검증에 필요한 witness를 첨부해야 합니다. 아니면 영지식을 사용하여 witness의 크기를 줄이는 방법도 제안되었습니다.
3. 자료 가용성 (Data Availability)
만약 모두가 stateless client라면 블록의 내용을 손실할 수 있습니다. 그렇기 때문에 누군가는 state를 저장하고 있도록 해야합니다. 이를 위해 적절한 보상과 검증 (Proof of Custody)가 필요합니다. Fisherman 딜레마는 Erasure Coding으로 해결하였습니다.
4. 검증자간 효율적인 통신
샤드 배정이 자주 바뀌는 상황에서 샤드 검증자들끼리의 효율적인 P2P 통신은 필수적입니다. 이를 위해, libp2p의 floodsub와 gossipsub (meshsub)이 사용됩니다.
5. 샤드 간 비동기 통신
거래 당사자나 스마트 계약이 여러 샤드에 나누어져 있다면 샤드 간의 통신(cross-shard communication)이 필요하게 됩니다. 하지만 여러 단계를 거치게 되므로 시간이 오래 걸리므로 결국 메인 체인에 무리를 주게되고 이렇게 샤드 간 통신이 너무 자주 일어난다면 샤딩이 가지고 있는 장점은 사라지게 됩니다. 이에 이더리움은 crosslink를 가지고 메인체인의 무리를 덜고, yanking으로 필요한 스마트 계약을 현재 샤드로 가져와 샤드 간의 통신을 줄이고자 합니다 .또한 현재 지연상태 전이 (delayed state transition)을 통한 샤드 간의 비동기 통신도 구상 중에 있다고 합니다.
