-
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
Fix distribution with RewardBase #3086
Conversation
Co-authored-by: Jeesu Choi <[email protected]>
eef7e54
to
86b8103
Compare
Deploying lib9c with Cloudflare Pages
|
lint / check-items-without-docs-increased (pull_request) |
@OnedgeLee 새로 추가된 public 요소들에 xml 주석 첨부가 필요합니다
https://learn.microsoft.com/ko-kr/dotnet/csharp/misc/cs1573 |
사실 PoS관련 클래스들에 도큐먼트 제대로 안붙은 부분이 많은데, 연말에 찬찬히 채워넣겠습니다. 일단은 신규 변경건에 대해서만 추가하였습니다. |
9c9662d
to
04db96d
Compare
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.
PR크기가 커서 설명을 봐도 컨텍스트를 따라가기가 쉽지않네요. 제 어프루브보다는 @riemannulus 님의 승인을 받고 머지하시는게 좋을것같습니다.
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
의 보상정보가 아래쪽 인덱스에 더해져야 하는 것이 아니라 위쪽 인덱스에 더해져야 하는 것을 의미함Related PRs