굳헬로의 스팀 프로그램 일기!! 열여섯번째 #16 스팀엔진 최신 블록을 검사하여 필요한 정보를 데이터베이스에 저장하기!! 3대 조합의 임대내역을 최신으로 저장하기!!

in sct •  11 months ago 

steem.jpg

오늘도 정말 더운 하루였죠.

저도 너무 힘들었는데...

그래도 오늘의 프로그램 일기 남겨 보겠습니다.


오늘은 3대조합의 조합원들에게 조합 운영자가 간편하고 빠르게 분배를 할 수 있는 코드를 만들어 보았습니다.

하지만 하필 오늘따라 스팀엔진 익스플로러가 정상적으로 동작하지 않는 바람에 각 조합들의 최신 임대 내역을 계산하지 못하고 있습니다.

그래서 최신의 정보로 임대내역을 갱신하기 위해서는 자주 동작을 멈추는 스팀엔진 익스플로러를 활용하기가 어려울 것 같습니다.

그래서 스팀엔진 블록을 직접 검사하여 임대내역을 실시간으로 갱신하는 코드를 만들어 보기로 했답니다.

여러가지 시행 착오가 있었지만, 현재는 최신의 블록을 검사하면서 임대내역이 있으면 데이터베이스에 추가하여 조합원의 임대정보를 잘 갱신하고 있는것 같습니다.

이제까지 열심히 공부한 보람이 있는것 같네요.

그럼 코드를 한번 살펴보도록 하겠습니다.

latest_block_num = 0
stop = 0

def run():
    while True:
        try :
            global latest_block_num
            latest_block = api.get_latest_block_info()
            latest_block_num = latest_block['blockNumber']
            print(time.strftime('%Y-%m-%d %HH:%MM:%SS', time.localtime(time.time())))
            print("새로운 블록 검사중... 시작 블록 넘버 : ", latest_block_num)   
            sct_delegate_find()     
            time.sleep(10)
        except ValueError : 
            print("오류발생")
            run() 

if __name__ == '__main__':
    global stop
    latest_block = api.get_latest_block_info()
    latest_block_num = latest_block['blockNumber']
    stop = latest_block_num - 100
    run()

먼저 최신의 블록 넘버를 latest_block_num 에 저장하고 검사가 끝난 블록넘버를 stop에 저장하면서 이미 검사한 블록은 중복해서 검사하지 않도록 하면서, run() 함수를 무한 반복 하며 임대 정보를 찾는 sct_delegate_find() 함수를 계속 호출합니다.

하지만 이상하게 블록을 검사하는 도중에 지연이 되면 한번씩 멈추더라구요.

그래서 예외상황이 발생하면 다시금 동작하게 하려고 예외처리를 두었습니다.

덕분에 멈추지 않고 계속 잘 동작하는 것 같네요.

def sct_delegate_find():  
    global latest_block_num
    global stop
    host = "localhost"
    user = "root"
    passwd = "passwd"
    db_name = "db_name"

    db = pymysql.connect(host=host, port=3306, user=user, passwd=passwd, db=db_name, charset='utf8')

    for block_num in range(latest_block_num, stop, -1):
        print(block_num)
        block = api.get_block_info(block_num)
        
        for trx in block["transactions"]:
            if trx["action"] == "delegate":
                print("발견 : " + trx["action"])
                payload = json.loads(trx["payload"])
                to = payload["to"]
                if to == "team1p" or to == "union.sct" or to == "naha.sct" or to == "goodhello.spt":
                    timestamp = block["timestamp"]
                    sender = trx["sender"]      
                    symbol = payload["symbol"]
                    quantity = payload["quantity"]
                    print("block_num : " + str(block_num) +" " + sender + "님이 " + to +"님에게 " + symbol + "토큰을 " + str(quantity) + " 임대하였습니다. timestamp : " + timestamp)
                    try:
                        cursor = db.cursor()
                        sql = "INSERT IGNORE INTO delegate (block_num, sender, to_ , symbol, quantity, timestamp) VALUES(" + str(block_num) + ", '" + sender + "', '" + to +"', '" + symbol + "', " + str(quantity) + ", '" + timestamp + "')"
                        print(sql)
                        cursor.execute(sql)

                        db.commit()
                        
                    finally:
                        print(cursor.lastrowid)
                        db.close()
            elif trx["action"] == "undelegate" : 
                print("발견 : " + trx["action"])
                payload = json.loads(trx["payload"])
                fr = payload["from"]
                if fr == "team1p" or fr == "union.sct" or fr == "naha.sct" :
                    timestamp = block["timestamp"]
                    sender = trx["sender"]      
                    symbol = payload["symbol"]
                    quantity = payload["quantity"]
                    print("block_num : " + str(block_num) +" " + sender + "님이 " + fr +"님으로부터 " + symbol + "토큰을 " + str(quantity) + " 임대회수하였습니다. timestamp : " + timestamp)
                    try:
                        cursor = db.cursor()
                        sql = "INSERT IGNORE INTO delegate (block_num, sender, to_ , symbol, quantity, timestamp) VALUES(" + str(block_num) + ", '" + sender + "', '" + fr +"', '" + symbol + "', " + str(quantity) + ", '" + timestamp + "')"
                        print(sql)
                        cursor.execute(sql)

                        db.commit()
                        
                    finally:
                        print(cursor.lastrowid)
                        db.close()
    print("검사끝 : ", block_num)
    stop = latest_block_num

이제 최신의 블록넘버로부터 뒤로 하나씩 블록들을 검사해가면 임대정보를 찾아 내는 코드입니다.

3대 조합의 임대 상황을 기다리다, 임대 내역을 발견하면 데이터베이스에 저장을 하게 됩니다.

테스트를 위해 오늘 드디어 임대 기능이 추가된 스팀몬스터 Splintertalk 토큰인 SPT를 제 부계정으로 임대를 보내어 결과를 확인해 보았습니다.

그동안 SPT는 임대가 되지 않아 본계정으로 보팅을 하고 다녔었는데, 이제 편하게 부계정으로 보팅을 할 수 있게 되었네요.

테스트를 위해 부계정인 goodhello.spt로 1000 SPT를 임대해 보았습니다.

1000606 블록에서 임대 내역을 발견하고 데이터베이스에 저장하는 쿼리를 만들고 실행을 한 결과

데이터베이스에 저장이 잘 되었네요.

이렇게 이제 3대조합의 사용자별 임대내역을 최신으로 유지할 수 있게 되었네요.

그리고 이 코드를 활용하면 3대조합뿐만 아니라 필요한 모든 임대내역을 데이터베이스에 저장할 수 있기에 앞으로 유용하게 사용되리라 생각합니다.

앞으로 이 코드를 좋은곳에 활용할 수 있도록 더욱 갈고 닦아 보겠습니다.


오늘은 최신 블록을 검사하면서 임대 내역을 검사하여 데이터 베이스에 저장하는 코드를 만들어 보았는데요.

사실 정말 쉽지 않았습니다.

오류도 많이 보고, 시행착오도 많이 겪으면서, 오늘은 포기할까도 생각했지만, 고비때마다 검색의 힘으로 하나 하나 극복할 수 있었네요.

그런만큼 저의 내공도 한츰 성장했으리라 생각합니다.

그럼 다음시간에는 더욱 유용한 프로그램 준비해 보겠습니다.

오늘 하루도 행복하세요.


굳헬로의 스팀 프로그램 일기!! 시리즈

#1 굳헬로의 스팀 프로그램 일기!! 대망의 시작 #1 Python 프로그램 설치 && steemengine 파이썬 api 설치 && 간단한 steemengine 예제

#2 굳헬로의 스팀 프로그램 일기!! 그 두번째 #2 비주얼 스튜디오 코드 프로그램 설치 && 비주얼 스튜디오 코드를 사용하여 파이썬 다루기 && 간단한 steemengine 예제

#3 굳헬로의 스팀 프로그램 일기!! 세번째 #3 스팀엔진 토큰의 정보를 가져오는 findOne() && 누군가의 토큰 사용 내역을 가져오는 get_history() && JSON 데이터 출력

#4 굳헬로의 스팀 프로그램 일기!! 네번째 #4 steemengine Token 클래스 && Token.get_holder() && Token.get_market_info() && Token.get_buy_book() && Token.get_sell_book()

#5 굳헬로의 스팀 프로그램 일기!! 다섯번째 #5 스팀엔진 블록을 뒤져서 원하는 정보를 찾아보자!! 스팀엔진 마켓 거래 내역을 뽑아내는 예제

#6 굳헬로의 스팀 프로그램 일기!! 여섯번째 #6 파이썬으로 스팀엔진 토큰들을 클레임 해보자.

#7 굳헬로의 스팀 프로그램 일기!! 일곱번째 #7 프로그램 일기도 어느덧 1주일!! 드디어 첫 실전!! 무한 반복 작업 수행하기!! 이제 직접 클레임 하는 손맛은 잊자. 무한 반복 자동 클레임!!

#8 굳헬로의 스팀 프로그램 일기!! 여덟번째 #8 텔레그램 봇을 이용해 알림을 받아보자!! && 무한 반복 자동 클레임의 정보를 텔레그램으로 받아보기!!

#9 굳헬로의 스팀 프로그램 일기!! 아홉번째 #9 무한 반복 자동 클레임 업그레이드!! && 토큰 잔고 확인 && 토큰 전송과 토큰 전송 내역을 텔레그램으로 받아보기!!

#10 굳헬로의 스팀 프로그램 일기!! 열번째 #10 토큰 전송내역을 검사하고, 토큰을 전송 받으면 텔레그램으로 알림을 받아보기!!

#11 굳헬로의 스팀 프로그램 일기!! 열한번째 #11 스팀엔진 토큰 임대내역 추적. 쉽지 않았던 머나먼 여정 (1/2)

#12 굳헬로의 스팀 프로그램 일기!! 열두번째 #12 스팀엔진 토큰 임대내역 추적. 쉽지 않았던 머나먼 여정 (2/2) 스팀엔진 토큰 임대내역 추적 완료!!

#13 굳헬로의 스팀 프로그램 일기!! 열세번째 #13 웹 프로그래밍의 시작!! 파이썬을 이용하여 정보를 MySQL 데이터 베이스에 저장해보기!!

#14 굳헬로의 스팀 프로그램 일기!! 열네번째 #14 파이썬을 이용하여 데이터베이스로부터 정보를 가져오기 && 스팀코인판 3대풀 임대내역 데이터베이스 작업 완료!!

#15 굳헬로의 스팀 프로그램 일기!! 열다섯번째 #15 웹 프로그래밍을 이용하여 스팀코인판 3대조합의 임대 내역을 웹으로 확인해보자 !!

Authors get paid when people like you upvote their post.
If you enjoyed what you read here, create your account today and start earning FREE STEEM!
Sort Order:  

공부하느라 고생이 많으시네요!! 이런쪽은 모르니 보기만해도 머리가 지끈!! ㅋ
즐거운 불금 되세요~~

안하던 공부 하다보니 재미나네요~ ㅎㅎㅎㅎ

앗 벌써 불금이라니!! 불금인걸 잠시 까먹고 있었네요~

신나는 불금되세요~

자체 db에 업데이트를 하고 있어서 향후 검색할 때 빨라서 좋겠군요

Posted using Partiko Android

Thank you for your continued support towards JJM. For each 1000 JJM you are holding, you can get an additional 1% of upvote. 10,000JJM would give you a 11% daily voting from the 700K SP virus707 account.

union.sct님이 goodhello님을 멘션하셨습니당. 아래 링크를 누르시면 연결되용~ ^^
union.sct님의 [공지] custom_json 브로드캐스팅 오류에 따른 큐레이션 리워드 배분 지연 안내

...en, pediatrics, buchheim, matildah, happyberrysboy, chocolate1st, goodhello leeyh2, fenrir78, ukk, innovit, annvely, fur2002ks

Hi @goodhello!

Your post was upvoted by @steem-ua, new Steem dApp, using UserAuthority for algorithmic post curation!
Your UA account score is currently 4.014 which ranks you at #3887 across all Steem accounts.
Your rank has improved 341 places in the last three days (old rank 4228).

In our last Algorithmic Curation Round, consisting of 205 contributions, your post is ranked at #124.

Evaluation of your UA score:
  • You're on the right track, try to gather more followers.
  • The readers like your work!
  • Try to work on user engagement: the more people that interact with you via the comments, the higher your UA score!

Feel free to join our @steem-ua Discord server