안녕하세요 @tmkor 입니다. 오늘은 자동 보팅에 딜레이를 주는 방법을 살펴보려 합니다.
보팅 시간과 보상의 관계
스팀잇 블로그의 2년전 글을 보면 보팅 시간과 보상의 관계를 알 수 있습니다.
Our solution is to offer a reverse auction for curation rewards on votes cast within the first 30 minutes. The price starts out at 100% of your curation reward and falls toward 0% over 30 minutes using the curve (1-t2). The longer a bot waits to vote, the lower the fee will be. However, if someone else chooses to vote before you it would lower your potential absolute reward.
스팀잇 큐레이션 보상 구조 상 빠른 보팅은 큰 보상을 가져갑니다. 그렇다면 멍멍이나 고양이도 최대한 빨리 보팅하려 하겠지요, 혹은 알파고님이 줍줍 할 것입니다. 이를 방지하기 위한 방법으로 첫 30분간은 보팅 비용을 받습니다. 보팅 비용은 큐레이션 보상의 100%에서 시작해서 30분이 지나면 0가 됩니다. 보팅 비용은 저자 보상으로 들어갑니다.
fig : 보팅 비용 그래프, x축 포스팅 후 시간(분), y축 보팅 비용 %
이를 통해 알 수 있는 것은, 저자에게 최선이 되는 보팅은 글이 올라오자 마자 하는 것이고, 큐레이션 보상 확보를 위해선 일정 시간 딜레이를 두어야 하는 것 입니다.
딜레이 주기
딜레이를 주는 방법은 간단합니다.
- 글이 올라온 시간과 현재 시간을 비교한다.
- 설정된 딜레이가 지나지 않았다면 보팅하지 않는다.
보팅하는 그 외의 부분은 이전 글을 참고 바랍니다.
1. 글이 올라온 시간과 현재 시간을 비교
import datetime
def time_delay_check(post, rule):
timediff = datetime.datetime.utcnow() - post['created']
elapsed_minutes = timediff.seconds / 60
return elapsed_minutes < rule['delay']
글이 작성된 시간은 post 사전의 created를 보면 됩니다. 주의하셔야 하는 것은 블록체인에 기록된 글 작성 시간은 UTC 시간으로 기록되어 있습니다. 나라마다 시차가 다르기 때문에 전세계 공돌이들이 공용으로 쓰는 시간이 UTC 시간입니다.
위 코드로 현재 UTC 시간에서 글 작성 시간을 빼고, 이를 분 단위로 환산해서 설정된 시간이 안지났는지 확인합니다.
2. 설정된 딜레이가 되지 않을때 보팅하지 말기
def run_vote(rule, voter):
p, p_raw = get_new_post(rule['id'])
if(time_delay_check(p,rule)):
return False
if(double_vote_check(p,voter)):
return False
postId = get_identifier(p)
vote(postId, voter, voter['weight'])
return postId
이번에 만든 함수를 이용해서 시간 딜레이를 체크하고 지나지 않았을 경우 함수를 종료합니다.
결론
큐레이션 보상의 경우 글 작성 시간과 보팅 시간의 차이에 따라 일종의 패널티가 부여됩니다. 이를 이해하고 적절한 전략을 세울 때, 저자와 큐레이터의 적절한 관계가 이루어지지 않을까 싶습니다.
- 실행 가능한 소스코드는 https://github.com/taeminlee/steem.autovote 에서 확인 가능합니다. ^^
@tmkor님의 글은 깊이가 있네요 ㅎㅎ 저는 아직 부족하네요
댓글 감사드립니다. ^^
파이썬 강좌 계속 기대할께요~ 사실 저도 필요한 것만 줍줍해서 쓰고 있던터라 전체적으로 한번 보고 싶었습니다!