Node.js로 스티밋에서 할 수 있는 것(3): 보팅한 이웃과 금액 보기
오늘은 특정 글에 보팅한 고마운 이웃들과 각각의 금액을 확인해 보자.
과정이 생각보다 복잡하니 일단은 보팅한 이웃과 각각의 보팅 금액을 확인하는 프로그램을 먼저 만들어 보자.
1. 특정글에 보팅한 이웃 받아오기
이것을 위한 함수는 아래와 같다.
인자로는 작가명과 글의 링크이다.
steem.api.getActiveVotes(author, permlink, function (err, voters)
voters.length에는 voter의 인원 수가 들어있다.
voters.length만큼 루프를 돌면서 voter의 이름과 rshares 값을 출력한다.
var author = 'tradingideas'
var permlink = '5zkyuz-test'
steem.api.getActiveVotes(author, permlink, function (err, voters) {
var msg = "total # of voter : " + voters.length; // voters 수를 출력
console.log(msg);
for (var i = 0; i < voters.length; i++) { // voters 수 만큼 반복
var str = voters[i].voter + ' ; ' + voters[i].rshares;
console.log(str);
}
});
voter의 구조를 보면 다음과 같다. 총 4명이 보팅을 해 주셨다.

보팅을 해 준 각각의 정보를 확인해보자. 첫 번째에 있는 weight는 백분율에 100을 곱한 값이다. 즉 100이면 1.00%라는 의미이다. 나머지 변수는 변수명을 보면 의미 파악이 가능하다.

이 프로그램을 실행하면 아래와 같은 결과가 나온다. 총 4명이 보팅하였고, 각각의 rshares 값이 출력된다.

소스코드
https://github.com/multiwhs/steem-js/blob/master/app%20voter%20list%20simple.js
2. 이웃이 보팅한 rshares 값을 $로 변환하는 방법
우리가 보팅을 하면 현재 스팀파워와 보팅파워를 기반으로 weight 만큼 rshares 값이 작가에게 전달된다. $는 시세가 수시로 변경되기 때문에 글의 가치를 일정하게 평가하기에 어려움이 있다. 그래서 스티밋 시스템에서는 rshares라는 값을 사용하고 있다. $로 변환할 때는 shares와 $간의 환율을 적용하여 환산치를 보여주고 있다.
busy.org와 같은 브라우저에서는 rshares 값을 $로 변환하여 보여준다. rshares값이 어떻게 $로 변환되는지는 아래 글에서 정리한 적이 있다.
중수를 위한 .. #5 : 내 글에 찍히는 $값은 어떻게 계산되나?
위 글에서는 steemd.com에서 구할 수 있는 값으로 계산하는 법을 정리했었다. 이번에는 이것을 node.js를 이용하여 프로그램하는 방법이다.
우리가 알아야 할 값은 다음과 같다.
- reward_balance : 채굴해서 보상으로 사용할 shares
- recent_claims : 현재 지불하여야 할 전체 보상 shares
- feed_price : steemit 내부 증인들이 다수결로 정한 steem의 교환가치
아래 함수를 이용하면 reward_balance와 recent_claims 값을 받아올 수 있다.
steem.api.getRewardFund("post", function (err, rewardFund)
feed_price는 아래 함수를 이용한다.
steem.api.getCurrentMedianHistoryPrice(function (err, historyPrice)
이 함수들이 돌려주는 값은 문자열이므로, 앞에서 설명한 split() 함수와 parseFloat(), parseInt()를 이용하여 계산할 수 있는 실수 혹은 정수값으로 변환한다.
getActiveVotes()에서 구한 rshares 값은 아래 수식을 이용하여 $ 값으로 변환이 가능하다.
3. rshares 값을 $로 변환하는 프로그램 작성하기
앞에서 설명한 과정을 프로그램으로 작성하면 다음과 같다. 자바 프로그램의 큰 단점 중의 하나가 변수나 함수명이 길어서 가독성이 많이 떨어지는 점이다. C 코드에 익숙한 나는 자바 코드를 보면 머리가 아프다. 아마도 이 코드를 보는 분들도 같은 생각일 것이다. 익숙해지는 수 밖에 달리 방법이 없다. 코드에 대한 자세한 설명은 필요없을 것 같다. 어떻게 계산되는지만 알면 그대로 코딩하면 된다.
var author = 'tradingideas'
var permlink = '5zkyuz-test'
steem.api.getActiveVotes(author, permlink, function (err, voters) {
var reward_balance, recent_claims, basePrice, retSBD;
var msg = "total # of voter : " + voters.length; // voters 수를 출력
console.log(msg);
// 보상 풀에 있는 reward 잔액과 보상할 금액 정보 얻기
steem.api.getRewardFund("post", function (err, rewardFund) {
reward_balance = parseFloat(rewardFund.reward_balance.split(' '))
recent_claims = parseInt(rewardFund.recent_claims)
steem.api.getCurrentMedianHistoryPrice(function (err, historyPrice) {
var basePrice = parseFloat(historyPrice.base.split(' '))
var quotePrice = parseFloat(historyPrice.quote.split(' '))
basePrice = basePrice / quotePrice // feed_price 구함
for (var i = 0; i < voters.length; i++) { // voters 수 만큼 반복
var rshares = parseInt(voters[i].rshares) // i번째 voter가 준 shares 값
// rshares를 SBD로 변환
retSBD = ((reward_balance / recent_claims) * basePrice * rshares).toFixed(2)
var str = voters[i].voter + ' : $' + retSBD + ' : ' + voters[i].rshares;
console.log(str);
}
});
});
});
이렇게 구한 값은 busy.org에서 보여주는 값과 정확하게 일치한다.
소스코드
https://github.com/multiwhs/steem-js/blob/master/app%20voter%20list%20with%20dollar.js
4. 응용하기
이 프로그램에서 좀 더 응용을 해 보면 최근 1주일 간 내가 쓴 글에 보팅한 이웃과 금액을 뽑을 수 있을 것이다. 자주 와서 보팅해주시는 고마운 분들에게 감사표시를 해야할 때 요긴하게 사용할 수 있다.
방법은 다음과 같다.
- 1편에서 만든 특정 작가의 최신 글을 찾은 후 글에 있는 링크(permlink) 정보를 추출한다.
- 오늘 배운 함수에 작가/링크 정보를 입력으로 넣어 보팅해 준 이웃을 출력한다.
- ComMu에 출력된 리스트를 복사한 후 excel로 가져가 cell로 구분한 후 정렬을 한다.
이렇게 기본 데이터는 node.js로 뽑고, 가공은 excel을 이용하면 초보들도 원하는 작업이 가능하다.
물론 node.js에서 제공하는 리스트를 배운다면 3번도 프로그램으로 개발이 가능하다.
앞에서 기술하였듯이 7일째 정산하기 전에는 스티밋 내부적으로 rshared 값을 가지고 있다. 위에 나오는 수식의 변수 값에 따라 $ 값이 계속 바뀐다. 특히 steem 가격의 변화에 민감하다. 만약 steem이 오르면 $ 표기 값도 증가하고, 그 반대가 되면 $표기 값도 줄어든다. 따라서 payout 시점에 스팀 가격이 비싼 것이 가장 유리하다.
이전 글 보기


Node.js 를 공부해볼수 있는 좋은 기회이네요!감사합니다~
내 게시물에 대한 도움을 주시면 감사하겠습니다.
https://steemit.com/kr/@steiker1/6wzcgb
오늘도 잘 보았습니다~
열심히 공부해야겠어요
감사합니다~
나중에 제가 써먹을것 같습니다. 감사합니다 ㅎㅎ
앗 선수 입장.. 댓글 감사합니다.
Node.JS가 뭔지도 모르는 저는....
이거 먼저 뭔지 검색해서 봐야겠네요^^
그래도 이런것들을 할 수 있구나 하고 보고 갑니다!
그렇게 검색해 보면서 여기까지 왔습니다. ㅎ
좋은 내용 공유 감사합니다 !! 잘 참고하겠습니다
👍👍👍
역시 진정한 꿀팁입니당!! 보팅 댓글 달고 갑니당~~!!
왕신참이라서
낯설고 어설픈데 배워야할 것도
굉장히 많군요
이곳에서
천천히 배워나가겠습니다
팔로하고요
수업료는
개미똥구멍만한 보팅은 물론 당연하고
차 한 잔 내려 놓고 갑니다
감사합니다.
실습하지 않으면 알 수 없는 과정이네요.
결론은 명확하군요.
스팀의 가격.
평안한 하루 보내세요.