상세 컨텐츠

본문 제목

Cosmos SDK Modules 전체 개요 (2)

Blockchain/Cosmos

by Yongari 2023. 3. 29. 22:59

본문

 

 

State-machine KVstore : 블록체인은 분산 데이터베이스를 위한 것입니다. 

Message BeginBlock/EndBlock: 블록은 데이터베이스의 데이터를 변경합니다.

Consensus : 분산 데이터베이스는 항상 동일한 데이터베이스를 보유해야 합니다.

 

 

Transactions Lifecycle and Tendermint

 

1. pre-Tendermint processing : 트랜잭션 제출 애플리케이션은 사용자 입력을 텐더민트에 제출하기 위해 원하는 명령어로 사전 처리할 수 있습니다.

 

2. Mempool Cache : 멤풀에 수락되기 전에 애플리케이션이 CheckTx를 사용하여 트랜잭션을 확인합니다.

3. CheckTx 

4. pass : 멤풀의 트랜잭션이 다른 피어에게 브로드캐스트되어 블록에 포함될 수 있습니다.

5. Mempool

 

 

1.Proposer node
1-1  Proposer selects transactions from the mempool for inclusion in the proposed block

2. Node Gossip 

   invalid : pre-vote nil  (not ok)

   valid : pre-vote block (ok) 

3. Node Gossip 
   > 2/3 nodes do not pre-vote or timeout : pre-commit nil (not ok)

   > 2/3 nodes do not pre-commit or timeout : commit Block(height++) (ok)
4. New block 

 

Pre-vote round : 벨리데이터가 블록의 유효성에 대한 메시지를 네트워크에 보냅니다. "블록을 받았으며 모든 것에 동의합니다"

Pre-commit round : 사전 투표 단계에 할당된 일정 시간이 지난 후, 모든 검증자는 다른 참가자로부터 이미 받은 사전 투표 메시지 수를 확인합니다. "검증자의 3분의 2 이상이 사전 투표했습니다."

 

 

 

 

모듈의 기능은 무엇인가요?

❏ BeginBlocker에 정의된 로직을 수행합니다.
❏ 특정 메시지(msg) 수신

 메시지 내용에 따라 미리 정의된 로직 수행
 EndBlocker에 정의된 로직 수행
❏ 블록체인 데이터베이스(예: KVstore)에 데이터 저장
❏ 쿼리 제공(솔리디티의 조회 기능 등)
❏ 다른 모듈을 위한 일부 기능 제공

 

 

모듈의 기능은 무엇인가요? 은행 모듈 예시

❏ 특정 메시지(msg) 수신 → MsgSend
❏ 메시지 내용에 따라 미리 정의된 로직 수행 → MsgSend에 의해 코인이 전송됩니다.
❏ 블록체인 데이터베이스(예: KVstore)에 데이터 저장 → 계정의 코인 잔액이 저장됩니다.
❏ BeginBlock/EndBlock에서 다른 로직 수행 → 은행 모듈에서 다른 로직 없음
 쿼리 제공(솔리디티의 조회 기능 등) → 계좌의 잔액을 조회할 수 있습니다.
❏ 다른 모듈에 일부 기능 제공 → MintCoins, BurnCoins, initBalances, ...

 

 

모듈의 몇 가지 핵심

❏SDK 모듈은 애플리케이션 로직의 대부분을 구현합니다.
❏코스모스 SDK 모듈은 작은 상태 머신으로 볼 수 있습니다.
❏ 아직 존재하지 않는 특정 사용 사례에 필요한 로직으로 구현되는 새로운 모듈입니다.
❏새로운 모듈은 스테이킹, 계정 또는 토큰 관리와 같은 보다 일반적인 기능을 위해 기존 모듈과 상호 작용합니다.
❏모듈은 규칙에 따라 ./x/ 하위 폴더에 정의됩니다.

 

모듈 구축을 위한 설계 원칙

 


Composability  개발자는 코스모스 SDK의 핵심뿐만 아니라 다른 모듈과의 통합을 신중하게 고려해야 합니다.
 Specialization 개발자는 모듈의 범위를 신중하게 설정하고 여러 기능을 동일한 모듈에 일괄적으로 넣지 않아야 합니다.
 Capabilities Module개발자는 모듈이 다른 모듈과 상호 작용하는 방식뿐만 아니라 모듈의 스토어에 대한 액세스 권한을 부여하는 방법도 신중하게 고려해야 합니다.

 

 

모듈에서 검토해야 할 사항


❏ 모듈이 정의하는 상태는 무엇인가요?
❏ 모듈이 상태를 변경하기 위해 어떤 메서드를 제공하는가?
❏ 모듈이 정의하는 메시지는 무엇인가요?
❏ 모듈이 제공하는 쿼리는 무엇인가요?
❏ 모듈에 의해 BeginBlock과 EndBlock에서 어떤 일이 일어나는가?

 

 

 

구성 요소

❏ 모듈 관리자
❏ AppModuleBasic, AppModule, AppModuleGenesis 메서드 구현하기
❏ 메시지 및 쿼리 라우팅, 

❏ BeginBlocker, EndBlocker와 같은 다양한 함수의 실행 순서 설정. 

❏ 메시지 서비스
❏ 메시지를 처리하는 Protobuf Msg 서비스입니다.
❏ Protobuf Msg 서비스는 정의된 모듈에 한정되며, 해당 모듈 내에 정의된 메시지만 처리합니다.
❏ 쿼리 서비스
    ❏ Protobuf Query 서비스는 쿼리를 처리합니다.
    ❏ 쿼리 서비스는 정의된 모듈에 한정되며, 해당 모듈 내에 정의된 쿼리만 처리합니다.

❏ BeginBlocker 및 EndBlocker
     ❏각 블록의 시작과 끝에서 각각 기본 합의 엔진으로부터 BeginBlock 및 EndBlock ABCI 메시지를 수신할 때 트리거됩니다.

 

❏ Keepers    
    ❏ 키퍼는 다양한 모듈에서 정의한 상태의 하위 집합에 대한 액세스를 관리합니다.
    ❏ 모듈이 정의한 상태의 하위 집합은 해당 모듈에 정의된 키퍼만 접근할 수 있습니다.
    ❏ 모듈이 다른 모듈이 정의한 상태의 하위 집합에 접근해야 하는 경우, 두 번째 모듈의 내부 키퍼에 대한 참조를 첫 번째 모듈에 전달해야 합니다.

 

❏ 불변성
   ❏불변성은 항상 참이어야 하는 애플리케이션의 속성입니다.
   ❏인바리언트는 특정 인바리언트를 확인하는 함수입니다.
   ❏버그를 조기에 발견하는 데 유용하며 개발 과정에서 유용합니다.

 

 

권장 폴더 구조

❏ {모듈_이름}.proto: 모듈의 공통 메시지 유형 정의.
❏ event.proto: 이벤트와 관련된 모듈의 메시지 유형 정의.
❏ genesis.proto: 제네시스 상태와 관련된 모듈의 메시지 타입 정의.
❏ query.proto: 모듈의 쿼리 서비스 및 관련 메시지 유형 정의.
❏ tx.proto: 모듈의 Msg 서비스 및 관련 메시지 유형 정의.
❏ client/: CLI 클라이언트 기능 및 통합 테스트 제품군.
❏ exported/: 모듈의 내보낸 유형(일반적으로 인터페이스 유형).
❏ keeper/: 모듈의 Keeper 및 MsgServer 구현.
❏ module/: 모듈의 AppModule 및 AppModuleBasic 구현.
❏ simulation/: 모듈의 시뮬레이션 패키지는 블록체인 시뮬레이터 애플리케이션(simapp)에서 사용하는 함수를 정의합니다. 

❏ spec/: 모듈의 사양 문서에는 중요한 개념, 상태 저장 구조, 메시지 및 이벤트 유형 정의가 요약되어 있습니다.
❏ abci.go: BeginBlocker 및 EndBlocker 구현
❏ codec.go: 인터페이스 유형에 대한 레지스트리 메서드.
❏ errors.go: 센티널 오류.
❏ events.go: 이벤트 유형 및 생성자.
예상 키퍼 인터페이스 

❏ expected_keepers.go: 예상 키퍼 인터페이스.
❏ genesis.go: 제네시스 상태 메서드 및 도우미 함수.
❏ keys.go: 저장소 키 및 관련 도우미 함수.
❏ msgs.go: 메시지 유형 정의 및 관련 메서드.
❏ params.go: 매개변수 유형 정의 및 관련 메서드.
❏ pb.go: 프로토콜 버퍼에 의해 생성된 유형 정의(위의 각 *.proto 파일에 정의됨).


모듈에서 검토할 내용

❏ 모듈이 정의하는 상태는 무엇인가요?
❏ 프로토/[모듈], [모듈]/유형
❏ 모듈의 키퍼가 제공하는 메서드는 무엇인가요?
❏ [모듈]/키퍼
❏ 모듈이 정의하는 메시지는 무엇인가요?
❏ proto/[module]/tx.proto, [module]/types/msgs.go, [module]/keeper/msg_server.go
❏ 모듈이 제공하는 쿼리는 무엇인가요?
❏ proto/[module]/query.proto, [module]/types/querier.go, [module]/keeper/querier.go
❏ BeginBlock과 EndBlock에서는 어떤 일이 일어나나요?
❏ abci.go

 

 

사양

❏ 모듈의 사양은 모듈 폴더의 스펙 폴더에 있습니다.
❏ 최신 버전의 코스모스 SDK에서는 메인 폴더의 README.md 파일에 사양이 있습니다.


모듈에 대한 기타 작업
❏ 앱/앱.go
    ❏ BasicManager에 새 모듈 추가하기
    새 모듈의 키퍼를 앱 구조체에 추가합니다.
    ❏ 새 모듈의 BeginBlocker/EndBlocker/Genesis 순서를 설정합니다.
    시뮬레이터 관리자/안테핸들러에 새 모듈을 추가합니다.

 


❏ 문서
    ❏ 모듈의 사양(사양 폴더 또는 README.md)
    ❏ 백서(전체 로직, CLI, API 등)

관련글 더보기