마아냐(@maanya) avatar

[코딩몰라여] steem-python으로 내가 받은 모든 보상 확인하기

maanya

Published: 25 Mar 2018 › Updated: 25 Mar 2018[코딩몰라여] steem-python으로 내가 받은 모든 보상 확인하기

[코딩몰라여] steem-python으로 내가 받은 모든 보상 확인하기

대문.png

  시리즈를 시작하기 전에, 코딩몰라여 시리즈와는 관계가 지금 당장은 없는 건에 대해 의견 제시를 하나 부탁드리고 싶습니다. 최근 유행하는 특정 유형의 댓글을 스팸으로 간주할 것인지, 그리고 대응은 어떻게 하는 것이 좋을 지에 대한 의견을 듣고 싶습니다. 부디 댓글로 의견을 말씀해주시어 제가 멋대로 설정했다는 지적도 막고, 다수의 kr 커뮤니티 유저들의 생각이 어떠한지 그들에게 전달할 수 있는 증거를 만드는 것을 도와주세요. # @steemitag에 대한 의견을 부탁드립니다.


  금요일에 '내일은 꼭 코딩몰라여 시리즈를 쓸겁니다!' 라고 했는데 지금 12시가 지나서 토요일이네요. 자고로 하루란 눈을 뜨고 잠드는 시간까지가 하루인 것입니다. 그러니 요일은 다르지만 거짓말은 하지 않은 것으로... (멍멍) 죄송합니다.

  라고 적고 새벽에 포스팅 쓰다가 어쩌다보니 잠들어서 이제 완성해서 올립니다 ' -'b 흑흑.. 미안합니다.. /사죄 x 2

  드디어 오늘은 자신이 받은 보상들의 총합을 구하는 프로그램을 만들어봅시다. 이번 포스트의 주제를 몇 번이나 말씀드리면서 쉬울거라는 말에 의심해주신 분들, 진짜 어려운지 한 번 봅시다 -ㅅ-++ 렛츠고!

01 하지마루요.png


# 보상이란 무엇인가!


02 보상.png

  먼저 스팀잇에서 보상이라는 것에 대해 코딩하는 입장의 시각으로 바라볼 필요가 있습니다. 보상은 STEEM(스팀), STEEM DOLLAR(스달), STEEM POWER(스파)로 나눠진다는 것은 모두 알고 계시겠지요? 주로 스달과 스파를 보상으로 받으셨을텐데, 최근 스달의 시가총액이 높아져 종종 스팀 또한 보상으로 들어오게 되었습니다.

  그런데 스팀 파워는 좀 특이합니다. 사실 우리가 흔히 쓰는 SP의 숫자가 스팀 파워의 본질이 아니고, Vest라는 단위가 있습니다. 이지스팀잇의 저자 중 한 분이신 twinbraidHive account@twinbraid님의 한결같이 재미난 스타일의 9개월 전 설명을 보시면 이해하실 수 있습니다. 스토킹해보면 저 땐 킹갓이라고 불리셨던 것 같은데 최근 포스트에선 그냥 샌드백이신 이유가 무엇인지...

# VEST와 스팀파워를 심심풀이로 알아보자

  또한, 시간이 갈 수록 vest 대 스팀의 가격 중에 스팀이 떡락을 하게 시스템이 만들어져있습니다. 이 글을 작성하는 현재 mvest 대 스팀의 가격 비율(steem_per_mvests)은 1:490입니다. 1: 490 스파를 보유하면 1,000,000 vests를 소유하게 됩니다. hkmoonHive account@hkmoon님의 포스트에선 1년 반 전에는 1:240이었다고 하네요.

  이런 설명을 드린 이유는, 아래와 같이 코드에서 스팀과 스달은 그대로 설정되어있지만 스팀 파워는 vest 단위로 들어오기 때문입니다.

'op': ['claim_reward_balance', {'account': 'maanya', 'reward_steem': '0.000 STEEM', 'reward_sbd': '2.333 SBD', 'reward_vests': '2316.120314 VESTS'}]}]


# 받은 보상 조회하기


구조.png

  지난 시간에 댓글 알람을 만들 땐 op가 'comment' 였던 것을 기억하시나요? 지갑에서 보상을 얻는 행동은 op가 'claim_reward_balance'로 기록됩니다. 따라서 op가 'claim_reward_balance' 로 기록된 것들을 가져오는 코드를 작성하면 됩니다. 최근 500번의 행동 중에 보상을 얻은 행동들을 조회해볼게요.

[ 코드 1 ]

from steem import Steem  
from steem.account import Account  
from steem.converter import Converter  
import re  
  
username = 'maanya'
s = Steem(nodes=["https://api.steemit.com"])  
converter = Converter(steemd_instance=s)  
  
a = Account(username)  
histories = list(a.get_account_history(index = -1, limit = 500, filter_by='claim_reward_balance', raw_output=True))

for history in histories:
    print('행동 번호: %d / 스팀: %s / 스달: %s / 스파: %s' %
          (history[0], history[1]['op'][1]['reward_steem'], history[1]['op'][1]['reward_sbd'], history[1]['op'][1]['reward_vests']))


[ 결과 1 ]

 : 5304 / : 0.069 STEEM / : 13.261 SBD / : 13787.281334 VESTS
 : 5115 / : 0.000 STEEM / : 2.333 SBD / : 2316.120314 VESTS
 : 4903 / : 0.000 STEEM / : 1.611 SBD / : 1563.147655 VESTS
 : 4878 / : 0.001 STEEM / : 0.029 SBD / : 138.771895 VESTS

# 받은 보상 모두 더하기



  최근에 내부거래소 비율이 망해서 스파로 전환 못하고 존버해야하지만 13스달 보상이라니 하루 아침에 아주 부우우자아아ㅏㅏ 가 되었군요 (뿌듯). 눈여겨 보셔야 할 점은 스팀, 스달, 스파의 값이 숫자만 저장되있는 것이 아니라 STEEM, SBD, VESTS 라는 수식어가 같이 저장되어있다는 점입니다. 즉, 값이 문자열로 저장되어있어요. 그래서 뒤의 수식어를 떼내어줘야 총합을 계산할 수 있습니다. 이 작업을 이전에도 했었는데 기억하시는 분 계실까요?

  제 마스터키를 잃어버리게 된 원인이라 꼴도 보기 싫은 ^^ 코딩몰라여 2편에서 정규식(Regular Expression)을 이용해 수식어를 떼낸 적이 있습니다. 같은 방법으로 수식어를 떼어내고 숫자로 만들어줍니다. [ 결과 1 ] 에서 최근 행동 번호가 5304로 나오니 get_account_history에서 결과를 5300개 가져오도록 limit도 수정해줄게요.

[ 코드 2 ]

histories = list(a.get_account_history(index = -1, limit = 5300, filter_by='claim_reward_balance', raw_output=True))

# 누적 값을 저장할 변수
sum_steem = 0
sum_sbd = 0
sum_sp = 0

for history in histories:
    # 스팀 수식어 떼어내기
    steem = history[1]['op'][1]['reward_steem']
    steem = float(re.findall("([0-9]+(?:\.[0-9]+)?)(?:\s)", steem)[0])

    # 스달 수식어 떼어내기
    sbd = history[1]['op'][1]['reward_sbd']
    sbd = float(re.findall("([0-9]+(?:\.[0-9]+)?)(?:\s)", sbd)[0])

    # 스파 수식어 떼어내기
    sp = history[1]['op'][1]['reward_vests']
    sp = float(re.findall("([0-9]+(?:\.[0-9]+)?)(?:\s)", sp)[0])

    # 계속 더해주기
    sum_steem += steem
    sum_sbd += sbd
    sum_sp += sp
    
# 과자값 출력 
print('%s가 이웃들에게 받은 과자 값!' % username)
print('스팀: %.3f STEEM / 스달: %.3f SBD / 스파: %.3f SP' %
      (sum_steem, sum_sbd, sum_sp))


[ 결과 2 ]

maanya    !
: 0.199 STEEM / : 68.848 SBD / : 57885.482 VESTS

# VEST를 SP로 바꾸자!



  마지막으로 VEST를 우리가 잘 아는 SP로 변경해주도록 합니다. 현재 steem_per_mvests가 1:490이라고 했으니 [ 결과 2 ]의 57885의 VESTS를 SP로 환산하면 490 * 57885 / 1000000 = 28.364 SP 가 됩니다. steem_per_mvests는 계속 바뀌기 때문에 패키지를 이용해서 변경하게 코드를 만들어주어야 합니다. 이 작업을 해줄 패키지 이름이 steem.converter 의 Converter 입니다. 이미 [ 코드 1 ]에서 추가를 해두었죠. ㅅConverter는 VEST를 SP로 환산해주고, 반대로 SP를 VEST로 환산해주는 기능도 있습니다.

  코드 단 한 줄로 환산 과정을 날로 먹을 수 있습니다. 스파 수식어를 떼어난 부분의 바로 다음에 추가해주시면 됩니다.

sp = converter.vests_to_sp(sp)

출력 부분도 살짝 수정해줍니다.

print('스팀: %.3f STEEM / 스달: %.3f SBD / 스파: %.3f SP' % (sum_steem, sum_sbd, sum_sp))

[ 결과 3 ]

maanya    !
: 0.199 STEEM / : 68.848 SBD / : 28.370 SP

# 끝!



어그로.png

  어떠셨나요? 이번엔 진짜 간단했죠?! 그렇죠? 아니면 죄송합니당... 코드도 중복된 부분이 자주 올라가서 그렇지 포스트 아래에 올릴 전체 코드를 보시면 짧습니다.

  오늘 알려드린 것에서 다시 생각해보면 좋은 것들을 짚어드리면

  • 스팀잇에서 스팀 파워(SP)는 VEST의 환산 값에 불가하다. 실제로 스파를 이용한 활동(e.g 보팅)의 영향은 VEST를 기준으로 계산합니다.
  • 상호 변환이 가능한 값들은 Converter 패키지를 이용해서 쉽게 변환할 수 있다.
  • 마아냐는 여러분들이 과자 값을 많이 주신걸 알아서 기분이 좋다. 항상 감사드리고 싶다.

입니다.

  다음 시간엔 여태까지 알려드린 기능들을 steem-python을 다루기 어려운 분들이 사용해보실 수 있도록 웹페이지 또는 상용 봇을 만들어보고 그 과정을 소개할 것입니다. 코딩 알려드리는 포스트에 굳이 행차하시어, 쓰지도 못하고 쓸데 없는거 알려준다며 깽판 부리시는 평행세계의 뱀파이어(hsuhouse0907Hive account@hsuhouse0907)도 나타나시고 있고요. 제령의식(?)을 해야겠습니다. 그리고 포스트를 읽기 쉽게하고, 소스코드를 편하게 이용하실 수 있도록 다음 포스팅엔 무조건 GitHub 같은걸 등록해서 가져오겠습니다. =ㅁ=)...

궁금한 부분은 언제든지 댓글로 말씀해주세요! :)
마아냐(maanyaHive account@maanya) 였습니다.

이 글도 같이 보시면 어때요?
jinukingHive account@jinuking님의 # [T!p] 스달 신규 발행이 멈춘다?! 언제?


# 전체 코드

from steem import Steem
from steem.account import Account
from steem.converter import Converter
import re

username = 'whoami' # 계정명을 입력해주세요.
s = Steem(nodes=["https://api.steemit.com"])
converter = Converter(steemd_instance=s)

a = Account(username)
histories = list(a.get_account_history(index = -1, limit = 5300, filter_by='claim_reward_balance', raw_output=True))

sum_steem = 0
sum_sbd = 0
sum_sp = 0

for history in histories:
    steem = history[1]['op'][1]['reward_steem']
    steem = float(re.findall("([0-9]+(?:\.[0-9]+)?)(?:\s)", steem)[0])

    sbd = history[1]['op'][1]['reward_sbd']
    sbd = float(re.findall("([0-9]+(?:\.[0-9]+)?)(?:\s)", sbd)[0])

    sp = history[1]['op'][1]['reward_vests']
    sp = float(re.findall("([0-9]+(?:\.[0-9]+)?)(?:\s)", sp)[0])
    sp = converter.vests_to_sp(sp)

    sum_steem += steem
    sum_sbd += sbd
    sum_sp += sp

print('%s가 이웃들에게 받은 과자 값!' % username)
print('스팀: %.3f STEEM / 스달: %.3f SBD / 스파: %.3f SP' %
      (sum_steem, sum_sbd, sum_sp))

  • 코딩몰라여 3, 4편 [댓글 알람 기능]에 대한 포스팅 아이디어를 주신 momoggoHive account@momoggo님께는 3, 4편 저자보상 스팀달러의 15%를 전달하였습니다. 감사합니다. :)

후문.gif

Leave [코딩몰라여] steem-python으로 내가 받은 모든 보상 확인하기 to:

Written by

한 걸음도 만족스럽게. 도움닫기는 두렵지 않게.

Read more #kr-dev posts


Best Posts From 마아냐(@maanya)

We have not curated any of maanya's posts yet. But you can encourage our curation team to review posts by visiting them regularly and by referring other readers. Because we give priority to frequently read content.

More Posts From 마아냐(@maanya)