샤딩(sharding) 이란?
샤딩(Sharding) 조각내다라는 뜻을 가지고 있고 규모가 큰 데이터베이스 혹은 네트워크에서 여러개의 작은 조각으로 쪼개어 분산 저장/관리하는 방법을 의미합니다. 작은 조각으로 쪼갠 블록들의 구간(Epoch)를 샤드(shard)라고 부릅니다. 블록체인에서 각 노드들은 체인의 사본을 저장하는데, 만약 데이터의 규모가 큰 경우 샤딩을 통해 빠르게 데이터 검증이 가능하고 결과적으로 트랜잭션의 속도를 향상시키게 됩니다.
기존 데이터베이스에서 샤딩(sharding)은 수평 분할의 대표적인 방법입니다. 블록체인에서의 샤딩은 전체 블록체인 네트워크를 분할하고 트랜잭션을 영역별로 저장하게 됩니다. 병렬적으로 트랜잭션을 처리하면서 블록체인이 해결해야할 확장성을 부여하는 온체인 솔루션으로 각광받고 있습니다.
예를 들어 10 규모의 데이터의 네트워크에 10명의 노드가 참여했다고 가정합니다. 기존의 블록체인에서는 개별 노드들이 모두 10 규모의 데이터를 가지고 있으면서 주변 노드와 동기화를 진행합니다. 반면 샤딩을 적용하면 10 규모의 데이터를 쪼개어 각각의 노드들은 1만큼의 데이터를 가지면서 동기화를 진행해 TPS를 비약적으로 향상시킬 수 있습니다.
샤딩(sharding)이 등장하게 된 배경?
모든 블록체인 네트워크들은 트릴레마에 빠져 있습니다. 확장성, 보안성, 탈중앙성 모두를 충족하는 블록체인은 존재하지 않기 때문입니다. 대표적으로 비트코인과 이더리움은 보안성과 탈중앙성을 올리면서 확장성을 포기한 모델입니다. 따라서 TPS 개선이 필요한 상황입니다.
샤딩은 블록체인 네트워크의 확장성(Scalability)를 개선하기 위한 방법입니다. 확장성을 개선하기 위해 플라즈마, 라이덴 네트워크, 라이팅 네트워크 등 레이어 1과 레이어 2로 구분되는 다양한 솔루션들이 제안되었지만 샤딩은 레이어 1의 온체인 솔루션으로 메인 체인의 성능 자체를 끌어올리는 방법입니다.
온체인 솔루션은 오프체인 솔루션이 하드포크가 필요없는 것과 다르게 반드시 하드포크가 진행되어야 합니다. 대표적으로 이더리움이 PoW(작업 증명)에서 PoS(지분 증명) 캐스퍼 알고리즘으로 전환하는 것이 하드포크입니다. 메인체인의 프로토콜을 변형시키기 때문입니다.
샤딩(sharding)의 특징
샤딩은 기존 관계형 데이터베이스에서 대량의 데이터를 처리하기 위해 파티셔닝 하는 방법입니다. 파티셔닝(Partitioning)은 데이터베이스 자체를 분할하는 것으로 애플리케이션 레벨에서 구현됩니다. 블록체인의 샤딩은 네트워크에 올라간 트랜잭션들이 서로 다른 노드들로 구성된 여러 샤드로 분할 됩니다. 각각의 노드들은 올라오는 트랜잭션의 일부만 처리하게 되고 병렬식으로 다른 노드들도 똑같이 작동합니다.
샤딩(Sharding)은 네트워크를 여러 샤드로 쪼개면서 더 많은 트랜잭션을 처리할 수 있게 되고 네트워크가 커짐에 따라 확장성이 떨어지는 문제를 개선할 수 있게 됩니다. 이런 속성을 병렬식 확장(Horizontal Scaling)이라 합니다.
수평 분할(Horizontal Partitioning)이란 스키마(Schema)가 동일한 데이터를 두개 이상의 테이블에 나눠 저장하는 디자인을 의미합니다. 스키마가 같은 데이터를 쪼개면서 인덱스 크기를 줄이고, 작업의 병렬성을 향상시킵니다.
샤딩의 장점
샤딩을 사용하면 필요한 데이터만 빠르게 조회할 수 있습니다. 즉, 쿼리가 가벼워 집니다. 또한 기간이 오래되어 조회가 불가능한 데이터는 클라우드에 올리거나 다른 디스크에 저장하면서 유연한 스토리지 운영이 가능해집니다.
샤딩의 단점
여러개의 샤드간 전송은 오히려 성능을 저하시킬 수 있습니다. 네트워크가 여러개의 샤드로 쪼개질 수록 인터 샤드 트랜잭션이 증가하게 되지만 각 샤드들은 자신만의 데이터를 가지고 있고, 샤드간 데이터 참조를 위한 알고리즘은 복잡해집니다. 또한 비확정적인 합의가 이뤄져 거래결과가 꼬이면 복구가 거의 불가능 하므로 확정합의가 필수적으로 전제되어야 합니다.
또한 시간이 지날 수록 일부 샤드의 불안정성이 증가하게 됩니다. 샤드별로 트랜잭션의 빈도나 노드 수 밸리데이터 비율등이 차이가 나기 때문입니다. 한번 샤드로 쪼갠 다음에도 지속적으로 재배치 하면서 샤드간 균형을 맞춰주는 알고리즘이 필요하게 됩니다.
네트워크가 커짐에 따라 추가로 샤드를 넣어야 하는 경우도 문제입니다. 블록체인의 경우 디지털 서명이 들어가 위변조가 불가능한 분산 원장 구조를 채택하고 있는데, 동적 샤딩으로 추가적인 샤드를 만드는 것도 기술적인 구현이 까다롭다는 단점이 있습니다.
샤딩 체인 동작 방식
메인 체인에 샤딩 체인을 연결할 때 핵심 역할을 하는 SMC(Shaking Manager Contract)가 있습니다. 메인체인의 블록은 Collation과, 트랜잭션을 담은 블록 Proposal과 유사한 개념이 됩니다. 블록이 생성되는 주기별로 무작위로 블록을 검증할 Collator를 선정해 검증 후 Collation을 생성하고 샤드 체인과 메인체인은 연결됩니다.
샤드 체인 작동 순서
- Proposer가 되고자 하는 네트워크 참여자는 SMC(Shaking Manager Contract)를 통해 Balance를 예치합니다.
- Collator가 되고자 하는 네트워크 참여자는 SMC를 통해 Deposit을 예치합니다.
- Collator들은 주기적으로 SMC Status를 체크해 자신이 Collator로 선정되었는지 확인합니다.
- Collator들은 SMC에 의해 각 샤드 체인에 Pseudo-Random 한 방식으로 배정됩니다.
- Collator들은 Look Ahead Period 동안 해당 샤드의 이전 기록들을 다운받아 선택된 Proposal을 제안했던 Proposer로 부터 Proposal Bid를 받게 됩니다.
- Proposer는 트랜잭션에 담은 Proposal을 Collator에게 제출합니다. Proposal은 아직 검증되지 않은 Collation을 의미합니다. 선택된 Proposal을 제출했던 Proposer은 트랜잭션 발송자로 부터 트랜잭션 수수료를 받게 됩니다.
- Collator들은 Proposal에 속한 트랜잭션들이 유효한지 검증하는 투표를 진행합니다. 만약 2/3 이상의 Collator들이 Proposal에 포함된 트랜잭션이 유효하다고 투표한 경우 해당 Proposal이 Collation이 됩니다.
※ 샤딩 주요 용어
- Collation : 샤드 체인에서 메인 체인의 블록과 같은 역할, 크게 Collation Header와 트랜잭션 목록으로 구분됨
- Collation Header Collation을 구성하는 정보를 담고 있음. Proposer의 Sign을 통해 메인체인에 제출하고, 트랜잭션 목록은 Collation에 담긴 트랜잭션 목록.
- Proposer : 트랜잭션들을 모아 Proposal을 생성하고 Collator에게 제출함. Proposal은 검증되지 않은 Collation.
- Collator : Proposer가 제출한 Proposal을 검증하는 역할. 각 주기(Period)별로 한개의 샤드에는 여러 Collator들이 배정됨. 해당 주기(Period)에 진입하기 전 무작위(Pseudo-Random)하게 선정됨.
- Executor(샤딩 Phase 3에 추가) : Collation Header를 메인 체인의 SMC에 전달. 이 때 샤드 체인의 실제 State가 변경됨
- Period : 메인 체인에서 샤드 체인의 Collation Header를 제출받는 주기. 예를 들어 PERIOD_LENGTH = 5인 경우 5개의 블록이 생성되는 주기가 1 period가 됨.
- Look Ahead Period : Collator는 샤드 체인에서 Collation을 검증하기 전 SMC에 의해 무작위로 선정되는데, 이 때 Look Ahead Period는 Collator가 몇 Period 이전에 어떤 샤드에 배정되었는지를 나타냄. 예를 들어 LOOKAHEAD_PERIODS=4 인 경우 4 period 이전에 Collator는 샤드 체인에 배정됨. Collator는 사전에 자신이 배정된 샤드 체인의 State 정보를 받는 시간을 확보하게 됨.
- Shaking Manager Contract(SMC) : 샤드 체인에서 가장 중요한 역할을 담당하는 스마트 컨트랙트. 메인체인과 샤드체인을 연결하고, Collator, Proposer, Collation Tree를 관리함.
이더리움 샤딩 적용
이더리움 샤딩은 메인 체인에서 처리하는 블록들을 쪼개 샤드라 불리는 오프 체인에 할당합니다. 오프 체인들은 주어진 샤드에 대해서만 유효성을 검증하게 됩니다. 각각의 샤드들이 할당된 조각들의 검증을 마치고 난 후 다시 샤드들을 묶어 블록을 검증하는 시간을 단축하게 됩니다.
샤드별로 Merkel Patricia Tree를 생성해 해당 샤드의 Root들로 만드러진 MPT Root만 블록체인에 올리기 때문에 채굴자들은 모든 트랜잭션을 실행하지 않고 샤드별로 채굴자들을 분산시키게 됩니다. 덕분에 기존 이더리움 블록생성 시간은 13초 이상 소요되었지만 샤딩이 도입되면 약 2~8초 사이로 블록 생성시간이 단축되게 됩니다.
이더리움에 샤딩을 적용하기에는 문제점들이 아직 존재합니다.
- 난수 생성 문제 : 난수를 생성해 검증자를 샤드에 배정하는 과정에서 공격자가 난수를 예측하거나 조작할 수 있습니다.
- 빠른 샤드 전환 문제 : 샤드에 대한 공격을 방어하기 위해서는 검증자들을 빨리 전환해야 합니다. 하지만 Look Ahead Time을 두고 검증자가 자신이 담당할 샤드블록을 미리 동기화하고, 동기화할 자료를 줄여 빠르게 검증을 준비하도록 Stateless Client를 제안하게 됩니다. Stateless Client는 블록헤더만 저장하고 트랜잭션 검증은 하지 않기 때문에 추가로 Witness를 첨부해야 합니다.
- 자료 가용성 문제 : 모두 Stateless Client 인 경우 블록 내용이 소실될 수 있으므로 누군가는 State를 저장하고 이에 대한 적절한 보상과 검증이 필요합니다.
- 검증자 간의 효율적인 통신 문제 : 샤드 배정이 빈번하게 바뀌는 경우 샤드 검증자들간의 효율적인 P2P 통신이 필수적입니다. 따라서 libs 2P의 Flood Sub와 Gossip Sub가 적용됩니다.
- 샤드 간 비동기 통신 문제 : 거래 당사자 또는 스마트 컨트랙트가 여러 샤드에 나눠져 있는 경우 샤드간 통신(Cross-Shard Communication)이 필요합니다. 이 때 여러 단계를 거치게 되면서 메인 체인에 부담을 주게 되고 샤딩의 장점이 사라지게 됩니다. 이더리움은 이 문제를 해결하기 위해 현재 지연상태 전이(Delayed State Transition)을 통해 샤드간 비동기 통신을 구상하고 있습니다. Cross Link를 통해 메인체인의 무리를 줄이고, Yanking으로 필요한 스마트 컨트랙트를 현재 샤드로 가져오게 됩니다.
Reference
'Blockchain' 카테고리의 다른 글
[Blockchain] W3C DIDs 탈중앙화 식별자 표준 (0) | 2022.07.25 |
---|---|
[Blockchain] W3C 데이터 탈중앙화 표준 DID란? (0) | 2022.07.25 |
[Blockchain] 이중 지불 문제란? (0) | 2022.07.22 |
[Blockchain] Local 환경에서 NFT 민팅하는 방법 (0) | 2022.07.21 |
[Blockchain] OpenSea NFT 민팅 하는 방법 (0) | 2022.07.21 |
댓글