Terra [2] (Core, SDK, Smart contract)

2023. 6. 14. 10:00Blockchain/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(결합 해제)를 실행

참고
https://terra.money

728x90
반응형

'Blockchain > Terra' 카테고리의 다른 글

Terra [1] (Concept, Architecture)  (1) 2023.06.13