Terra [2] (Core, SDK, Smart contract)
2023. 6. 14. 10:00ㆍBlockchain/Terra
728x90
반응형
※ 원글 작성 : 22년 4월 27일
Smart Contract
- Rust 기반(CosmWasm)
- 스마트 컨트랙트를 send하는 user(account)는 eth처럼 account sequence( ~= nonce)가 일치해야 트랜잭션을 전송할 수 있다.
- Contract State
- Terra 내 levelDB를 통해 state를 저장, key-value
- 데이터는 raw byte로만 유지될 수 있으므로 struct 또는 data 유형은 직렬화 및 역직렬화 기능의 쌍으로 표현되어야 한다.
- e.g. 객체는 바이트로 저장되어야 하기 때문에 BC에 저장하기 위해 객체 → 바이트로 인코딩하는 함수와 바이트를 contract logic이 이해할 수 있는 데이터 유형으로 디코딩하는 함수 모두 제공 필요
- 싱글톤 및 버킷(bucket)과 같은 데이터 컨테이너에 대해 편리한 고수준 추상화를 제공하는 cosmwasm_storage와 같은 유틸리티 크레이트(crates) 제공
- InstantiateMsg
- 사용자가 MsgInstantiateContract를 통해 블록체인에 컨트랙트를 생성했을 때 InstantiateMsg가 제공된다.
- InstantiateMsg는 초기상태와 configuration을 제공한다.
- Terra에서는 ETH와 달리 contract code 업로드와 contract instance화를 별도의 이벤트로 간주
- 검증된 계약 원형의 작은 세트가 동일한 기본 코드를 공유하지만 다른 매개변수로 구성된 여러 인스턴스로 존재할 수 있도록 하기 위함
- InstantiateMsg Logic
- 첫번째 진입점인 instantiate() 함수로부터 계약이 instance화 되고 InstantiateMsg가 생성. 메시지에서 카운트롤 추출하고 초기 상태를 설정(예시 컨트랙트 기반 설명)
- ExecuteMsg
- json 메시지
- MsgExecuteContract를 통해 execute() function을 통과하는 메시지
- InstantiateMsg와 달리 ExecuteMsg는 다른 타입의 메시지로 존재할 수 있다.
- execute() function은 다른 타입의 메시지들을 demultiplex하기 위해 적절한 메시지 핸들링 로직을 사용한다.
- 개발자는 enum을 사용해서 컨트랙트가 이해할 수 있도록 메시지의 다른 타입을 multiplex하기 위해 사용
- serde 속성은 속성키를 snake case 및 lower case로 재작성해주어서, JSON을 직렬화, 역직렬화를 할 때 Increment & Reset 대신에 increment/reset을 가질 수 있다.
- ExecuteMsg Logic
- src/state.rs에 정의된 편의 기능을 통해 액세스할 수 있도록 키 b”config”에 위치한 싱글톤을 업데이트 하기 위해 storage에 대한 변경 가능한 참조를 획득한다.
- OK 결과를 새 state로 반환하여 현재 state의 카운트를 업데이트 한다.
- OK 결과를 응답과 함께 반환함으로써 성공 여부를 확인하는 것으로 contract 실행을 종료한다.
- Query
- QueryMsg 형식(request)를 정의하고 query 출력의 구조를 제공해야 한다.
- query() sturct에서 json을 통해 사용자에게 정보를 다시 전송하고 response를 알려준다.
- Building the Contract
- cargo wasm을 이용하여 contract build
- optimizing build
- 수수료를 최소화하고 블록체인 크기 제한을 유지하기위해 출력 WASM 바이너리가 가능한 작은지 확인이 필요
- Rust smart contract의 프로젝트 폴더 root directory에서 cargo 명령 실행
- optimize build를 수행하고 나면 artifact/my_first_contract.wasm or artifacts/my_first_contract-aarch64.wasm 이 생성된다.
- Schemas
- json schema의 자동 생성(auto-generation)을 위해 사용자가 필요한 스키마의 데이터 스트럭처를 등록한다.
- cargo schema 명령을 통해 자동으로 json 데이터가 생성된다. directory schema 내에서 생성Terra Core Modules
- Golang 기반
- Cosmos SDK를 사용하여 구축, Tendermint consensus protocol에서 실행되는 블록체인 프레임워크를 제공
- 각 모듈의 로직은 메시지 핸들러 또는 begin-blocker/end-blocker와 같은 block transition에 위치한다.
- Module architecture
- genaccounts : import & export genesis account
- distribution : validator와 delegator 사이의 reward를 분배한다.
- reward distribution
- community pool
- staking : validators and luna
- auth : ante handler
- vesting accounts
- bank : 계정과 계정간의 fund를 전송한다.
- slashing : low-level tendermint slashing (double-signing, etc)
- oracle : exchange rate feed oracle
- 투표 집계 가중 중위수
- 투표 보상
- 잘못된 oracle slashing
- Treasury : miner의 인센티브 안정화
- macroeconomic(거시경제) 모니터링
- 통화정책 레버리지(세율, 보상 가중치)
- seigniorage settlement
- gov : on-chain 거버넌스
- proposal
- 파라미터 업데이트
- market : 가격 안정화
- Terra ↔ luna spot conversion, Tobin Tax
- Terra ↔ luna market-maker, constant-product spread
- crisis : chain을 정지할 수 있는 proof 증거와 함께 합의 failure 상태를 reporting
- genutil : gentx command를 handler
- MsgCreateValidator message를 필터링 및 핸들링
- Block lifecycle
- BeginBlock
- distribution : 이전 블록에 대한 reward를 보장한다.
- slashing : 이중 서명 및 다운타임 패널티에 대한 validator의 위반 증거 or 다운타임 check
- Process messages
- 메시지 핸들러에 의해 적절한 모듈로 라우팅되어 processing
- End block
- Crisis : 등록된 모든 불변량(invariants)을 확인하고 true임을 주장
- Oracle
- VotePeriod가 끝나면 voting procedure를 실행하고 루나 환율을 업데이트
- SlashWindow가 끝나면 허용된 VotePeriod 보다 많은 VotePeriod를 놓친 validator에게 패널티를 줌
- Governance : 비활성 proposal을 제거하고 VotePeriod가 만료된 active proposal을 확인한 후 통과된 proposal에 등록된 제안 처리기를 실행
- Market : 유동성 pool을 Replenish(보충)하여 분산 수수료를 감소시킴
- Treasury : 모든 epoch(시대)가 끝날때 마다 indicators를 업데이트하고 시뇨리지를 태우고 다음 epoch를 위해 통화 정책 레버리지(tax-rate, reward-weight)를 다시 보장한다.
- Staking : 새로운 active validator는 상위 130명의 luna staker에서 결정, validator 위치를 잃은 자는 unbonding process(결합 해제)를 실행
- BeginBlock
728x90
반응형
'Blockchain > Terra' 카테고리의 다른 글
Terra [1] (Concept, Architecture) (1) | 2023.06.13 |
---|