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 등)
Cosmos SDK Modules 전체 개요 (1) (0) | 2023.03.29 |
---|---|
Cosmos Blockchain App Architecture (공식 홈 자료) (0) | 2023.03.29 |
Cosmos Blockchain이란? (공식 홈 자료) (0) | 2023.03.29 |