cosmos-sdk/docs/kr/intro/sdk-design.md

7.5 KiB

코스모스 SDK의 주요 구성 요소

코스모스 SDK는 텐더민트 위에서 안전한 상태 기계를 구현하는 프레임워크입니다. 핵심적으로, 코스모스 SDK는 일종의 Go 언어로 구현된 ABCI 구현체 템플릿입니다. 코스모스 SDK에는 데이터를 지속하는 multistore와 트래잭션을 처리하는 router가 내장되어 있습니다.

다음은 코스모스 SDK로 만들어진 애플리케이션에서 텐더민트에서 DeliverTx로 전달된 트랜잭션이 처리되는 과정을 간소화한 설명입니다:

  1. 텐더민트 컨센서스 엔진(텐더민트는 []bytes만을 다룬다는 것을 참고하세요)에서 전달된 transaction을 디코딩
  2. transaction에서 messages를 추출한 후 기본적인 타당성 검사를 진행
  3. 각 메시지가 처리될 수 있게 올바른 모듈에게 라우팅
  4. 상태 변경 실행

baseapp

baseapp은 코스모스 SDK 애플리케이션 구현체 템플릿입니다. 하위 컨센서스 엔진과 연결을 처리하기 위한 구현체가 포함 되어있습니다. 통상, 코스모스 SDK 애플리케이션에서는 app.go내에 baseapp을 임베딩합니다. 이에 대한 예시는 코스모스 SDK 애플리케이션 튜토리얼을 참고하세요:

+++ c6754a1e31/app.go (L72-L92)

baseapp의 목표는 스토어와 확장 가능한 상태 기계간의 안전한 인터페이스를 제공함과 동시에 상태 기계를 최소한으로 정의하는(ABCI 디자인 목적에 따라) 것입니다.

baseapp에 대한 추가 정보는 여기를 참조하세요.

멀티스토어

코스모스 SDK는 지속되는 상태를 위해 멀티스토어/multistore를 제공합니다.멀티스토어는 개발자가 원하는 수량의 KVtore를 선언할 수 있도록 합니다. KVStore는 오직 []byte 타입만을 유효한 값으로 받기 때문에 자체 스트럭쳐는 코덱을 사용해 마셜된 후 저장되어야 합니다.

멀티스토어를 추상화한 이유는 상태를 구획화하기 위한 목적이 있으며, 각자 해당되는 모듈에 의해 관리됩니다. 멀티스토어 대한 추가 정보는 여기를 확인하세요.

모듈

코스모스 SDK의 강점은 바로 모듈성에 있습니다. SDK 기반 애플리케이션은 다수의 상호 호환되는 모듈을 모아서 개발됩니다. 각 모듈은 상태의 특정 분야를 정의하고 자체적인 메시지/트랜잭션 처리 기능을 가지고 있으며, 코스모스 SDK는 각 메시지를 해당되는 모듈에 라우팅하는 역할을 합니다.

다음은 어떻게 트랜잭션이 각 풀노드가 유효한 블록을 받았을때 애플리케이션에 의해 처리되는지를 설명합니다:

                                      +
                                      |
                                      |  DeliverTx를 통해 풀노드의 텐더민트에서
                                      |  노드의 애플리케이션으로 전달된 트랜잭션
                                      |
                                      |
                                      |
                +---------------------v--------------------------+
                |                애플리케이션                    |
                |                                                |
                |     베이스앱의 메서드를 사용해: Tx 디코딩,     |
                |            메시지 추출 후 라우팅               |
                |                                                |
                +---------------------+--------------------------+
                                      |
                                      |
                                      |
                                      +---------------------------+
                                                                  |
                                                                  |
                                                                  |
                                                                  |  처리를 위해 올바른
                                                                  |  모듈로 라우팅된 메시지
                                                                  |
                                                                  |
+----------------+  +---------------+  +----------------+  +------v----------+
|                |  |               |  |                |  |                 |
|    AUTH 모듈   |  |   BANK 모듈   |  |  STAKING 모듈  |  |    GOV 모듈     |
|                |  |               |  |                |  |                 |
|                |  |               |  |                |  |   메시지 처리,  |
|                |  |               |  |                |  |  상태 업데이트  |
|                |  |               |  |                |  |                 |
+----------------+  +---------------+  +----------------+  +------+----------+
                                                                  |
                                                                  |
                                                                  |
                                                                  |
                                       +--------------------------+
                                       |
                                       | 결과 값 텐더민트로 전달
                                       | (0=Ok, 1=Err)
                                       v

각 모듈은 미니 상태 기계로 볼 쑤 있습니다. 개발자는 각 모듈이 처리하는 상태의 부분과 상태를 바꾸는 고유 메시지 타입을 정의해야합니다(참고: 메시지는 트랜잭션에서 baseapp을 통해 추출됩니다). 통상적으로, 각 모듈은 각자의 KVStoremultistore에 선언하여 해당 모듈이 정의하는 상태의 부분을 지속합니다. 개발자는 본인의 모듈을 만들때 제 삼자의 모듈을 액세스해야할 수 있습니다. 코스모스-SDK는 오픈 프레임워크이기 때문에, 일부 모듈은 악성 모듈일 가능성이 존재하며 이런 인터-모듈 소통에서 보안 원칙이 존재합니다. 이런 원칙은 오브젝트-가능성(object-capabilities)를 따릅니다. 실전에서는, 각 모듈이 다른 모듈의 액세스 권한 리스트를 관리하는 것이 아니라, 각 모듈이 keeper라는 특별 오브젝트를 구현하여 접근 가능한 권한을 사전에 정의합니다.

SDK의 모듈은 x/ 폴더 내에 정의되며, 핵심 모듈 중 일부는 다음과 같습니다:

  • x/auth: 계정과 서명 관리에 사용됨
  • x/bank: 토큰과 토큰 전송 기능에 사용됨
  • x/staking + x/slashing: 지분증명 블록체인을 만들기 위해 사용됨

모두가 본인의 앱을 만들기 위해 사용할 수 있는 x/ 내 존재하는 모듈 외에도, 코스모스 SDK는 자체 모듈을 개발할 수 있도록합니다. 이에 대한 예시는 이 튜토리얼을 참고하세요.

다음 {hide}

코스모스 SDK 애플리케이션 해부학에 대해서 알아보세요 {hide}