메인 콘텐츠로 건너뛰기

Messages

이 섹션에서는 ocr 메시지 처리와 해당 state 업데이트에 대해 설명합니다.

Msg/CreateFeed

MsgCreateFeed는 feed config를 생성하는 메시지이며, 모듈 관리자만 실행할 수 있는 제한된 메시지입니다.
message MsgCreateFeed {
  option (gogoproto.equal) = false;
  option (gogoproto.goproto_getters) = false;
  string sender = 1;
  FeedConfig config = 2;
}
단계
  • Sender가 모듈 관리자인지 확인
  • msg.Config.OnchainConfig.LinkDenom이 모듈 param의 LinkDenom인지 확인
  • ctx.ChainID에서 OnchainConfig.ChainId 설정
  • 동일한 FeedId를 가진 FeedConfig가 존재하지 않는지 확인
  • 최신 EpochAndRound(0, 0)으로 설정
  • feedId에 대한 feed config 설정
  • Feed transmission count와 observation count를 1로 설정

Msg/UpdateFeed

MsgCreateFeed는 feed config를 업데이트하는 메시지이며, feed 관리자 또는 feed billing 관리자만 실행할 수 있는 제한된 메시지입니다.
message MsgUpdateFeed {
  option (gogoproto.equal) = false;
  option (gogoproto.goproto_getters) = false;
  string sender = 1;
  // feed_id is an unique ID for the target of this config
  string feed_id = 2;
  // signers ith element is address ith oracle uses to sign a report
  repeated string signers = 3;
  // transmitters ith element is address ith oracle uses to transmit a report via the transmit method
  repeated string transmitters = 4;
  // Fixed LINK reward for each observer
  string link_per_observation = 5[
    (gogoproto.customtype) = "cosmossdk.io/math.Int",
    (gogoproto.nullable) = true
  ];
  // Fixed LINK reward for transmitter
  string link_per_transmission = 6[
    (gogoproto.customtype) = "cosmossdk.io/math.Int",
    (gogoproto.nullable) = true
  ];
  // Native denom for LINK coin in the bank keeper
  string link_denom = 7;
  // feed administrator
  string feed_admin = 8;
  // feed billing administrator
  string billing_admin = 9;
}
단계
  • feedId로 이전 feed config를 가져오고 존재하는지 확인
  • Sender가 feed 관리자 또는 feed billing 관리자인지 확인
  • Billing 관리자가 Signer, Transmitter 및 feed 관리자를 변경하지 않는지 확인
  • 이전 feed config에 대한 보상 지급 처리
  • 이전 feed transmission 및 observation count 삭제
  • 최신 EpochAndRound(0, 0)으로 설정
  • 설정된 경우 signer, transmitter, LinkPerObservation, LinkPerTransmission, LinkDenom, FeedAdmin, BillingAdmin 업데이트

Msg/Transmit

MsgTransmit은 특정 feed에 대한 report를 전송하는 메시지입니다. 메시지를 브로드캐스트할 때, 수락되려면 observer로부터 충분한 양의 서명이 있어야 합니다.
message MsgTransmit {
  option (gogoproto.equal) = false;
  option (gogoproto.goproto_getters) = false;
  // Address of the transmitter
  string transmitter = 1;
  bytes config_digest = 2;
  string feed_id = 3;
  uint64 epoch = 4;
  uint64 round = 5;
  bytes extra_hash = 6;
  Report report = 7;
  repeated bytes signatures = 8;
}
단계
  • feedId에 대한 epoch 및 round 가져오기
  • msg.Epochmsg.Round를 확인하여 report가 오래된 것이 아닌지 확인
  • feedId에서 feed config 및 config info 가져오기
  • msg.ConfigDigest가 feed config info의 latest config digest와 같은지 확인
  • Transmitter가 feedConfig에 구성된 유효한 transmitter인지 확인
  • Transmitter report 저장
  • Transmission에 대한 이벤트 발생
  • 서명 및 서명 수 검증
  • Feed observation 및 transmission count 증가

Msg/FundFeedRewardPool

MsgFundFeedRewardPool은 transmitter와 observer에게 지급할 feed reward pool에 자금을 추가하는 메시지입니다.
message MsgFundFeedRewardPool {
  option (gogoproto.equal) = false;
  option (gogoproto.goproto_getters) = false;

  string sender = 1;
  string feed_id = 2;
  cosmos.base.v1beta1.Coin amount = 3 [(gogoproto.nullable) = false];
}
단계
  • feedId에서 이전 reward pool 금액 가져오기
  • 이전 금액이 비어 있으면 pool 금액을 0으로 초기화
  • 이전 금액 denom이 존재하는 경우 입금 denom과 다르지 않은지 확인
  • 계정에서 모듈 계정(ocr 모듈)으로 코인 전송
  • amount 필드 추가로 reward pool 금액 업데이트
  • Hook이 설정된 경우 AfterFundFeedRewardPool hook 호출

Msg/WithdrawFeedRewardPool

MsgFundFeedRewardPool은 feed reward pool에서 자금을 인출하는 메시지이며, feed 관리자 또는 billing 관리자로 제한됩니다.
message MsgWithdrawFeedRewardPool {
  option (gogoproto.equal) = false;
  option (gogoproto.goproto_getters) = false;

  string sender = 1;
  string feed_id = 2;
  cosmos.base.v1beta1.Coin amount = 3 [(gogoproto.nullable) = false];
}
단계
  • feedId에서 feed config 가져오기
  • msg.SenderfeedAdmin 또는 billingAdmin인지 확인
  • Feed에 대한 보상 처리
  • 모듈 계정에서 지정된 금액 msg.Amount 인출

Msg/SetPayees

MsgSetPayees는 transmitter에 대한 payee를 설정하는 메시지이며, feed 관리자로 제한됩니다. 한 번 설정되면 payee만 변경할 수 있습니다.
message MsgSetPayees {
  option (gogoproto.equal) = false;
  option (gogoproto.goproto_getters) = false;

  string sender = 1;
  string feed_id = 2;
  // addresses oracles use to transmit the reports
  repeated string transmitters = 3;
  // addresses of payees corresponding to list of transmitters
  repeated string payees = 4;
}
단계
  • feedId에서 feed config를 가져오고 feed config가 존재하는지 확인
  • msg.Sender가 feed 관리자인지 확인
  • msg.Transmitters 반복,
    1. Transmitter에 대해 payee가 이미 설정되어 있는지 확인
    1. Transmitter에 대한 payee 설정

Msg/TransferPayeeship

MsgTransferPayeeship은 feed의 특정 transmitter에 대한 payeeship을 이전하는 메시지입니다. 실행 후 pending payeeship 객체가 생성됩니다.
message MsgTransferPayeeship {
  option (gogoproto.equal) = false;
  option (gogoproto.goproto_getters) = false;

  // transmitter address of oracle whose payee is changing
  string sender = 1;
  string transmitter = 2;
  string feed_id = 3;
  // new payee address
  string proposed = 4;
}
단계
  • feedId에서 feed config를 가져오고 feed config가 존재하는지 확인
  • msg.Sender가 현재 payee인지 확인
  • 이전 pending payeeship transfer 레코드를 확인하고 이전 payeeship transfer가 충돌하지 않는지 확인
  • Payeeship transfer 레코드 설정

Msg/AcceptPayeeship

MsgTransferPayeeship은 feed의 특정 transmitter에 대한 payeeship을 수락하는 메시지입니다.
message MsgAcceptPayeeship {
  option (gogoproto.equal) = false;
  option (gogoproto.goproto_getters) = false;
  // new payee address
  string payee = 1;
  // transmitter address of oracle whose payee is changing
  string transmitter = 2;
  string feed_id = 3;
}
단계
  • feedId에서 feed config를 가져오고 feed config가 존재하는지 확인
  • msg.TransmitterfeedId에 대한 pending payeeship transfer 레코드 가져오기
  • feedIdtransmitter에 대한 payee 재설정
  • feedIdtransmitter에 대한 pending payeeship transfer 삭제