Validator’s Note 13 — 셀레스티아 (Celestia)의 데이터 흐름을 따라가 보자.

Youngbin Park
DSRV
Published in
13 min readMay 15, 2023

--

Disclaimer: 이 글은 정보 전달을 위한 목적으로 작성되었으며, 특정 프로젝트에 대한 투자 권고, 법률적 자문 등 목적으로 하지 않습니다. 모든 투자의 책임은 개인에게 있으며, 이로 발생한 결과에 대해 어떤 부분에서도 DSRV는 책임을 지지 않습니다. 본문이 포괄하는 내용은 특정 자산에 대한 투자를 추천하는 것이 아니며, 언제나 본문의 내용만을 통한 의사결정은 지양하시길 바랍니다.

셀레스티아에서는 현재 Incetivized Testnet인 Blockspace Race가 진행 중입니다! Blockspace Race는 지난 3월 7일부터 진행되어 현재는 마지막 단계인 phase 5가 진행 중입니다. DSRV도 현재 밸리데이터 노드를 운영하며 테스트넷에 참여 중입니다. 하지만, 셀레스티아에는 밸리데이터 노드뿐만 아니라 다양한 역할의 노드들이 존재합니다. 따라서 셀레스티아에는 어떤 역할의 노드들을 거쳐 사용자의 데이터가 저장되고 데이터 가용성이 보장되는지를 조금 더 자세하게 알아보고자, 자체적인 롤업을 배포하여 그 과정을 직접 따라가 보며 정리해 보았습니다.

들어가기 전에

셀레스티아는 우리가 일반적으로 알고 있는 이더리움과 같이 단일 블록체인이 모든 것을 수행하는 모놀리식 체인이 아닌, 체인에서 수행하는 각각의 기능을 개별적인 계층으로 분리한 모듈러 체인입니다. 셀레스티아가 소개한 모듈러 체인의 네 가지 계층은 아래와 같이 구분됩니다.
1) 트랜잭션을 실제로 실행시키는 Execution layer
2) Execution layer에서 실행된 트랜잭션들이 올바른지 그 proof 를 검증하고 여러 Execution layer를 연결하는 Settlement layer
3) 합의를 통해 트랜잭션들의 순서를 확정하는 Consensus layer
4) 실행된 트랜잭션의 Data Availability(데이터 가용성, DA)를 보장하는 DA layer
그중 셀레스티아는 롤업과 같은 Execution layer들의 데이터를 저장하기 위한 Consensus 및 DA layer 역할의 모듈러 블록체인 입니다.

출처: https://docs.celestia.org/concepts/how-celestia-works/monolithic-vs-modular/

따라서 셀레스티아는 서로 다른 유형의 노드를 가진 두 개의 네트워크로 구성되어 있습니다. Consensus layer는 코스모스 SDK를 기반으로 만들어진 PoS 네트워크로 밸리데이터 노드와 컨센서스 풀노드(RPC 노드)가 존재합니다. 그리고 Consensus layer와 DA layer를 연결하는 브릿지 노드(Bridge node)가 있으며, DA layer에는 DAS(Data Availability Sampling)를 수행하는 라이트 노드(Light node), 풀 스토리지 노드(Full storage node)가 존재합니다. (DAS에 관해서는 아래서 더 설명할 예정입니다.)

데이터 흐름을 따라가 보자

1. 소버린 롤업(Soverign Rollup) 배포

셀레스티아에는 누구나 자신만의 소버린 롤업을 배포할 수 있는 Rollkit 이라는 툴이 있습니다. 소버린 롤업이란 Execution layer 와 Settlement layer가 합쳐진, 즉 롤업의 트랜잭션을 롤업 자체에서 수행하고 DA layer를 통해 DA만을 보장하는 독립적인 롤업입니다.

저희는 소버린 롤업을 이해하기 위해, Ignite CLI와 Rollkit을 사용하여 소버린 롤업을 배포해보았습니다. 해당 롤업은 블록 타임, validators hash, app hash를 기반으로 랜덤값을 제공하는 롤업입니다. 셀레스티아를 DA layer로 사용하는 이 롤업은 자신의 데이터를 저장하기 위해 셀레스티아에 PayForBlob이라는 트랜잭션을 주기적으로 전송하였습니다.

9:01AM INF successfully submitted Rollkit block to DA layer daHeight=491158 module=BlockManager rollkitHeight=254
9:02AM INF successfully submitted Rollkit block to DA layer daHeight=491161 module=BlockManager rollkitHeight=255
9:02AM INF successfully submitted Rollkit block to DA layer daHeight=491164 module=BlockManager rollkitHeight=256
출처: https://celestia-rollup-explorer.bharvest.io/rollups/5c2c1304e6caea61

이 때 셀레스티아는 여러 롤업들이 공유하는 하나의 DA layer이기 때문에, 각각의 롤업이 자신들의 데이터를 다시 쿼리하기 위해서는, 저장하고 있는 많은 데이터 중 해당 롤업의 데이터를 구분하여 반환할 수 있어야 합니다. 이를 위하여 셀레스티아는 머클트리에 Namespace ID라는 필드를 추가한 NMT(Namespace Merkle Tree)로 데이터를 저장합니다. 롤업은 자신의 Namespace ID를 적은 PayForBlob 트랜잭션을 보내고, 이후 Namespace ID를 통해 자신이 저장한 데이터를 셀레스티아에서 가져올 수 있습니다.

2. 밸리데이터 노드가 블록을 생성

이렇게 전송한 PayForBlob 트랜잭션은 Consensus layer의 블록에 담기게 됩니다. 이때 블록을 생성하는 프로포저는 트랜잭션에서 실행 가능한 부분과 blob부분을 분리하여 NMT를 생성합니다. 이후 DAS를 위해 필요한 erasure coding을 수행하여, DAH(Data Avalablity Header)를 생성합니다.

출처: https://docs.celestia.org/concepts/how-celestia-works/data-availability-layer/

DAS는 데이터를 샘플링한 일부를 확인하여 전체 데이터가 사용 가능한 상태임을 증명하는 방식이며, 이를 위해 erasure coding이라는 데이터 일부가 손실되더라도 전체 데이터를 복구할 수 있도록 하는 인코딩 방식을 사용합니다. 셀레스티아가 사용하는 erasure coding의 한 종류인 2D Reed-Solomon(RS) encoding은 데이터의 75%만 온전하다면 이를 통해 손실된 데이터를 포함한 전체 데이터를 복구할 수 있는 특성을 가지고 있습니다.

출처: https://docs.celestia.org/concepts/how-celestia-works/data-availability-layer/

2D RS encoding과정에서 원본 데이터는 는 k x k 개의 조각(chunck)로 나누어진 원본 블록(parity block)을 2k x 2k 청크로 확장됩니다. 그리고 2k의 열과 2k의 행의 데이터에 대한 4k개의 머클 루트를 생성한 후, 이 머클 루트들을 대표하는 머클 루트 값을 data_hash로 블록 헤더에 포함시킵니다. 프로포징된 블록에 대하여 밸리데이터 노드들이 합의를 이루는 과정은 일반적인 텐더민트 기반의 체인들 같이 진행되어 저희의 트랜잭션이 담긴 블록도 아래와 같이 생성되었습니다.

출처: https://testnet.mintscan.io/celestia-incentivized-testnet/blocks/491158

3. 브릿지 노드가 ExtendedHeader를 생성

Consensus layer에서 새로운 블록이 생성되면, 브릿지 노드는 밸리데이터 노드 혹은 컨센서스 풀노드와 연결하여 블록을 받아옵니다. 이후 브릿지 노드는 블록에 대한 기본 유효성 검사를 수행하고 DAH, Validator Set 및 commit을 추가하여 ExtendedHeader를 생성합니다. ExtendedHeader를 가지고 라이트 노드와 풀 노드은 DAH를 참조하여, DAS를 수행하고 블록 데이터를 복구할 수 있습니다. 브릿지 노드가 생성한 ExtendedHeader를 네트워크에 전파하면, 연결된 모든 피어(라이트 및 풀 스토리지 노드)들이 이를 수신하여 샘플링을 하게 됩니다.

출처: https://github.com/celestiaorg/celestia-node/blob/main/header/header.go#L40-L45

따라서 브릿지 노드들은 DAS를 위하여 밸리데이터와 연결하여 블록 데이터를 계속 받아야 하므로, 밸리데이터 노드들은 브릿지 노드들이 원활히 블록을 받아 DA 레이어에 전달할 수 있도록 하기 위해서 밸리데이터 노드와 브릿지 노드를 함께 돌리는 것이 권장되고 있으며, 현재 저희 DSRV 또한 밸리데이터 노드와 함께 브릿지 노드를 운영하고 있습니다. 실제 저희가 운영하는 브릿지 노드가 491158 블록에 대하여 저장하고 있는 ExtendedHeader는 다음과 같았습니다.

2023-05-15T09:01:31.964Z	INFO	header/store	store/store.go:353	new head	{"height": 491158, "hash": "9CE58A294E8AB62E8A2518E2A8ED5C5F66E22611E4C9543C68C11C228F592D1F"}

4. 라이트 노드를 통한 DAS

브릿지 노드를 통해 ExtendedHeader를 다운로드 받은 라이트 노드는 그중 랜덤한 DAH를 선택하여, 브릿지 노드에 해당 헤더에 대한 데이터 chunk를 요청하여 DAH가 올바르게 생성되었는지를 검증합니다. DA 레이어에는 라이트 노드 뿐만 아니라 풀 스토리지 노드도 존재합니다. 풀 스토리지 노드는 라이트 노드처럼 샘플링을 하지만 라이트 노드보다 충분한 양의 shares를 다운로드 하여 확장된 전체 블록을 복구하고 저장합니다. 만약 이 과정에서 복구된 데이터가 해당 DAH와 일치하지 않으면 BEFP(Bad Encoding Fraud Proof)를 생성하고 모든 동작을 중지합니다. 라이트 노드들은 풀 스토리지 노드가 전파하는 BEFP를 받아 해당 proof가 올바른지를 검증합니다. 만약 이가 올바른 proof라면 라이트 노드도 모든 동작을 중지합니다. DAS가 문제없이 수행된 경우 롤업의 데이터가 가용한 상태로 저장되었음이 보장됩니다.

$ curl -X GET <http://localhost:26659/data_available/491158>
{"available":true,"probability_of_availability":"0.9899774042423815"}

아래처럼 저희가 배포한 롤업의 데이터가 잘 저장되어 있음을 확인할 수 있습니다.

$ curl -X GET <http://localhost:26659/namespaced_data/5c2c1304e6caea61/height/491158>
{"data":["CsMDCvwBCgIICxD+ARjn6YejBiIgXLk2rVVnq7hj8vfSGndmopHhn3i+nI63MJHRnyZPO08qIIQflZBROA/hTGwHa5QQEd8Lm/nM+NfHz+cDVSAWAcXcMiAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADogAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUhTZf9ym9eisZ/V3IG4CgBiH8NoMdlogH7pzb7uN/uxvuDYZlJEdEvZF3W8et0f/7Yhzk8V/Tq1iC3JhbmQtdGVzdC0xEkIKQOnjIGXENfttsPPzxksgEXrzcax4gO30VF68avOk2niKNq9eVZLdkqwmkXBigjUti9ur3ANXPIzy/iZs0x2nUwMafgo9ChTZf9ym9eisZ/V3IG4CgBiH8NoMdhIiCiCPlAVFrD1HMNajcBF/kc1yJnxyOdVUe0xAp1OrA+WySRjoBxI9ChTZf9ym9eisZ/V3IG4CgBiH8NoMdhIiCiCPlAVFrD1HMNajcBF/kc1yJnxyOdVUe0xAp1OrA+WySRjoBxIA"],"height":491158}

Conclusion

마지막으로 지금까지 살펴본 과정을 간단히 정리해 보겠습니다.

1. 롤업은 PayForBlob 트랜잭션을 통하여 자신의 Namespace ID로 blob 데이터 저장을 요청합니다.
2. Consensus layer의 프로포저는 erasure coding을 통해 DAH를 생성하고, 트랜잭션을 담은 새로운 블록을 생성합니다.
3. 브릿지 노드는 새로운 블록과 DAH를 받아 ExtendedHeader를 생성하여 DA 네트워크에 전파합니다.
4. 라이트 노드 및 풀 노드는 ExtendedHeader에 대한 shares를 확인하는 DAS를 수행하고, 만약 전체 데이터를 복구하는 풀 노드가 잘못 생성된 헤더를 발견하면 BEFP를 생성합니다.
5. DAS가 문제없이 수행된 경우 롤업의 데이터가 가용한 상태로 저장되었음이 보장됩니다.

본 글이 셀레스티아의 데이터 가용성 이면의 작동 원리를 이해하는 데 도움이 되셨기를 바라며, Blockspace Race가 성공적으로 마무리될 수 있기를 응원합니다! 읽어 주셔서 감사합니다.

Written by
Youngbin Park, Research Engineer, DSRV Validator Team (Twitter @bin0_0bin)

Reviewed by
Hyunggi Kim, Software Engineer and Validator, DSRV Validator Team(Twitter @HgKim00)

--

--