금일 제가 소스투고로 pr 올린 voter list 를 스팀엔진측에서 추가로 변경한 것 같습니다.
안보이던 voter 별 voting 금액이 나오네요.
제가 작성한 소스에 추가로 뭔가 작업을 해서 올린게 개인적으로 참 고무적이네요 ^^
암튼 저도 해당 기능을 넣기 위해서 애를 많이 썼었는데 결국은 제 소스에서는 해당 기능을 제대로 구현하지는 못했었습니다.
그래서 비교를 해 보았습니다.
왼쪽이 현재 스코판이고 오른쪽이 제가 개발한 소스를 적용한 중국 개발자의 사이트입니다.
일단 순서는 둘다 동일하지만 voting 금액은 다릅니다.
주황색 표시를 한 것이 voting 금액이 더 적게 표시된 것입니다.
그 이유를 찾기 위해 소스를 뒤져봐습니다.
Steem Engine과 저의 소스는 Voter List 를 정렬하는 방법은 동일하기에 순서는 동일할 수 밖에 없습니다.
const avotes = active_votes.toJS();
avotes.sort(
(a, b) =>
Math.abs(parseInt(a.rshares)) >
Math.abs(parseInt(b.rshares))
? -1
: 1
);
voting 한 rshares로 내림차순 정렬을 한 것입니다.
때문에 제가 제일 처음 작성한대로 다음의 수식으로 계산을 하면 정렬한 순서대로 voting price 가 정렬될 것입니다.
pending_token * voter_rshares / total_rshares
하지만 스팀엔진 측에서 작성한 소스는 다음과 같습니다.
let currRshares = 0;
for (let i = 0; i < avotes.length; i++) {
const vote = avotes[i];
vote.estimate = (
(applyRewardsCurve(currRshares + vote.rshares) -
applyRewardsCurve(currRshares)) /
Math.pow(10, scotPrecision)
).toFixed(scotPrecision);
currRshares += vote.rshares;
}
avotes 는 voter list 인데 voting을 한 순서대로 입력이 되어 있을 겁니다.
일단은 voting 순서가 영향을 끼칠 거라는 것을 수식을 보면 짐작할 수 있습니다.
applyRewardsCurve 함수를 한번 살펴보겠습니다.
const applyRewardsCurve = r =>
Math.pow(Math.max(0, r), rewardData.author_curve_exponent) *
rewardData.reward_pool /
rewardData.pending_rshares;
입력한 값을 author_curve_exponent(1.3) 승한 후에 reward_pool 을 곱하고 pending_rshares로 나누어 줍니다.
이때 입력한 값은 계산할 순서의 voter까지의 voting 한 rshares의 합입니다.
예를 들면 30명의 voter가 있고 이것을 다음과 같이 나열합니다.
v1, v2, v3, ................, v30
v1 이 계산될 때 입력값= 0 + v1
v2 가 계산될 때 입력값 = 0 + v1 + v2
v3 가 계산될 때 입력값 = 0 + v1 + v2 + v3
.
.
.
v30 이 계산될 때 입력값은 = 0 + v1 + .... + v30
그렇다면 내가 payout 되는 글에 미치는 영향력은
- voting 하기 전에 예상 voting 금액이 많을수록
- 늦게 voting을 할수록
더 커짐을 알 수 있습니다.
글 전체에 대한 내 voting의 영향력은 알겠는데 내가 받는 Curator 보상은 얼마인지는 어떻게 알 수 있을까요?
궁금해 지는군요.
관련해서는 소스가 없는지 한번 찾아 보고 싶네요.
그런데 글 작성을 끝내고 나서 생각하니 voter list 정렬하는 걸 rshares가 아닌 estimate로 변경하면 voter 별 voting 금액에 따라 정렬이 될 것 같네요.
저것도 pr을 한번 올려봐야겠습니다. ^^