-
Notifications
You must be signed in to change notification settings - Fork 48
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Introduce RewardBase #3065
Introduce RewardBase #3065
Conversation
40eca7c
to
d80cf7a
Compare
7751e9e
to
13c2fd0
Compare
444a946
to
22e55f6
Compare
if (Repository.GetRewardBase(this, recordEach.StartHeight) is not null) | ||
{ | ||
Repository.SetRewardBase(newRewardBase); | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Then, is this migration running at the end of blocks?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Nope, this migration is run on the delegation.
(Will be held on the Stake
action)
So, I expect two staking take place for proper migration.
7dc500a
to
4cdcc5b
Compare
Co-authored-by: Jeesu Choi <[email protected]>
eef7e54
into
planetarium:fix/distribution
AS-IS
LumpSumRewardsRecord를 통한 보상 분배
TO-BE
RewardBase를 통한 보상 분배
TEST
중점리뷰대상
Portion += Reward/TotalShare
를 수행, 저장StartHeight
가 없을 경우, 아직 기록으로 활용되지 않는CurrentRewardBase
임을 의미함CurrentRewardBase
가 존재하는지 여부를 플래그로, 존재할 경우 변경된 로직(RewardBase
)을 타고, 존재하지 않을 경우 기존의 로직(LumpSumRewardsRecord
)을 탐Delegatee.DistributeReward()
는CurrentRewardBase
와 이전에 마지막으로 보상수령자가 보상받은 높이에 존재하는RewardBase
를 수집, 이 두 값을 통해Delegatee.TransferReward()
를 이용하여 보상을 분배, 이 방식은 위에 설명되었듯, 보상 수령자의 지분량을Portion
정보에 곱한 뒤, 차분값을 얻는 방식Delegatee.CollectReward()
는CurrentRewardBase
에 값을 누적Delegatee.StartNewRewardPeriod()
는AttachHeight()
를 통하여StartHeight
를 부여하고 아카이빙, 그리고 이전의RewardBase
에 총 지분량을 업데이트하여 새로운CurrentRewardBase
를 생성Delegatee.StartNewRewardPeriod()
는MigrateLumpSumRewardsRecords()
를 통하여, 만약CurrentLumpSumRewardsRecord
가 존재할 경우, 이전의 모든LumpSumRewardsRecord
들을 수집하여,RewardBase
로 마이그레이션 수행, 이 마이그레이션은CurrentLumpSumRewardsRecord
를 상태에서 제거하기 때문에, 단 한번만 수행됨Delegatee.MigrateLumpSumRewardsRecords()
는LumpSumRewardRecord
를 전부 가져온 뒤, 맨 아래에서부터 이터레이션을 돌며RewardBase
로 변환, 이 때,StartHeight
가 한칸씩 뒤로 밀려야 함에 주의StartHeight = 5
였던LumpSumRewardsRecord
와,StartHeight = 10
인LumpSumRewardsRecord
가 순차적으로 존재한다고 가정할 경우, 전자는StartHeight = 10
의RewardBase
로 마이그레이션되어야 하며, 후자는StartHeight = null
의CurrentRewardBase
로 마이그레이션되어야 함, 후자가StartHeight
를 가지게 되는 시점은 다음CurrentRewardBase
가 발견된 시점임RewardBase
에StartHeight
를 선태깅할 경우, 정상적으로 작동할 수 없음, 이를테면Height = 5
에StartHeight = 5
인RewardBase
를 만든다고 가정할 경우, 이후 누적되는 보상정보들이StartHeight = 5
인RewardBase
에 쌓일 것, 이는(StartHeight = 10 RewardBase) - (StartHeight = 5 RewardBase)
로 계산이 불가능하게 만들기 때문에, 항상CurrentRewardBase
를 만들어, 여기에 차분값을 쌓도록 구현되었고, 이는 기존LumpSumRewardRecord
의 보상정보가 아래쪽 인덱스에 더해져야 하는 것이 아니라 위쪽 인덱스에 더해져야 하는 것을 의미함