파이썬에서 datetime.timezone()을 이용한 시간대 설정

by joviansummer original STEEMIT post: https://steemit.com/blog/@joviansummer/datetime-timezone 파이썬에서 datetime.timezone()을 이용해서 datetime 객체의 시간대를 설정할 수 있습니다. 예를 들어 한국시간(KST)은 GMT+9시간이므로 아래와 같이 설정해서 현재 시각을 구할 수 있습니다. import datetime KST = datetime.timezone(datetime.timedelta(hours=9)) now_kst = datetime.datetime.now(tz=KST) 시간대 정보가 없는 datetime 객체의 경우에는 앞의 예제 코드에서 정의된 변수 KST를 이용해서 아래와 같이 시간대를 할당할 수 있습니다. # 시간대 정보 없는 UTC 기준 현재시각 가져오기 - utcnow() now = datetime.datetime.utcnow() # 시간대 정보 추가 now_kst = now.astimezone(KST) @joviansummer의 스팀 프로젝트 스팀 증인노드를 운영중입니다. @jswit에 증인투표해 주시면 감사하겠습니다. ( https://steemitwallet.com/~witnesses ) jswit 증인 노드 프로젝트를 시작합니다. jsup 업보팅(upvoting) 서비스 소개 jsup 수혜자 지정 기능 추가 jsup 2.0 - 업보팅을 다시 위대하게 jSTEEM 프로젝트 - 텔레그램 챗봇으로 구현하는 스팀 블럭체인 탐색기 Steemit-Search - 스팀잇 포스팅 검색 STEEM.NFT - 디지털 아트 보존 프로젝트

파이썬 + 스팀: 트랜잭션(transaction)과 오퍼레이션(operation)

by joviansummer
original STEEMIT post: https://steemit.com/blog/@joviansummer/transaction-operation


스팀 블럭체인에서 트랜잭션(transaction)은 특정 계정이 블럭체인에 디지털 서명을 해서 기록하는 거래 단위입니다. 오퍼레이션(operation)은 실제 실행되는 구체적인 작업, 예를 들어 보팅, 송금, 포스팅 등입니다. 이러한 구분이 필요한 이유는 1개의 트랜잭션에 여러개의 오퍼레이션이 존재할 수도 있기 때문입니다.

예를 들어 A에게 송금하는 오퍼레이션과 B에게 송금하는 오퍼레이션을 하나의 트랜잭션으로 묶어서 블럭체인에 기록할 수 있습니다. 이렇게 할 경우 2개의 오퍼레이션이 1개의 트랜잭션ID를 가지게 됩니다. 일반적으로 스팀잇을 사용할 때는 이런 경우가 없겠지만, 서비스를 개발하는 입장에서는 상당히 편리한 기능입니다. API 노드와의 통신을 줄여서 부담을 경감할 수도 있고, 같이 붙여서 한번에 기록하고 싶은 정보들이 있을 수 있기 때문입니다.

어제 포스팅했던 파이선 beem을 이용한 송금 코드를 예로 한번 보겠습니다. 관련 내용은 아래의 링크입니다.

파이썬 beem에서 TransactionBuilder를 이용한 스팀/스팀달러 송금

위의 포스트에 있는 예제 코드를 다시 가져오면 아래와 같습니다.

from beem import Steem
from beem.transactionbuilder import TransactionBuilder
from beembase.operations import Transfer

node_list = ["https://api.steemit.com"]
steem = Steem(node=node_list)

# 보내는 계정: joviansummer
sender_id = 'joviansummer'
# 보내는 계정의 액티브키
sender_active_key = '5XXXXXX....'
# 받는 계정: jsup
receiver_id = 'jsup'

# 송금 설정을 위한 딕셔너리
transfer_dict = {"from":sender_id, "to":receiver_id, "amount":"0.001 STEEM", "memo":"스팀 송금 시험입니다!"}

# 송금
tx = TransactionBuilder(blockchain_instance=steem)
tx.appendOps(Transfer(transfer_dict))
tx.appendWif(sender_active_key)
signed_tx = tx.sign()
broadcast_tx = tx.broadcast(trx_id=True)

TransactionBuilder 개체의 appendOps() 함수가 오퍼레이션을 트랜잭션에 추가하는 기능을 합니다. 예제 코드에서는 appendOps()가 한번만 사용되고 있습니다만, appendWif() 함수를 실행하기 전에 여러번 appendOps() 함수를 사용하여 오퍼레이션을 추가할 수 있습니다.

예를 들어 위의 예시에서 0.001스팀과 0.001 스팀달러를 하나의 트랜잭션으로 보내고 싶다면 아래와 같이 할 수 있겠습니다.

# 송금 설정을 위한 딕셔너리
transfer_dict_steem = {"from":sender_id, "to":receiver_id, "amount":"0.001 STEEM", "memo":"스팀 송금 시험입니다!"}
transfer_dict_sbd = {"from":sender_id, "to":receiver_id, "amount":"0.001 SBD", "memo":"스팀달러 송금 시험입니다!"}

# 송금
tx = TransactionBuilder(blockchain_instance=steem)
tx.appendOps(Transfer(transfer_dict_steem))
tx.appendOps(Transfer(transfer_dict_sbd))
tx.appendWif(sender_active_key)
signed_tx = tx.sign()
broadcast_tx = tx.broadcast(trx_id=True)

한가지 유의할 점은, 모든 오퍼레이션을 다 이렇게 묶을 수 있는 것은 아니고 제약이 존재합니다.

포스팅이나 댓글처럼 Comment 객체를 사용하는 오퍼레이션은 1개만 포함할 수 있습니다. 하나의 트랜잭션에 2개 이상의 포스팅/댓글이 포함될 경우에는 오류가 발생하고 블럭체인에 기록되지 않습니다. 다른 제약 사항이 더 있을 수도 있기 때문에, 실제로 사용할 때는 시험을 해 보고 정상적으로 동작하는지 확인한 후에 코드에 적용하는 것이 좋겠습니다.


@joviansummer의 스팀 프로젝트

스팀 증인노드를 운영중입니다. @jswit에 증인투표해 주시면 감사하겠습니다.
(https://steemitwallet.com/~witnesses)

jswit 증인 노드 프로젝트를 시작합니다.

jsup 업보팅(upvoting) 서비스 소개

jsup 수혜자 지정 기능 추가

jSTEEM 프로젝트 - 텔레그램 챗봇으로 구현하는 스팀 블럭체인 탐색기

STEEM.NFT - 디지털 아트 보존 프로젝트

Comments

Popular posts from this blog

Nuitka - 파이썬 스크립트를 바이너리 실행 파일로 변환

파이썬에서 스팀잇 ID 및 포스팅 키 유효성 확인

파이썬에서 시간대(timezone) 변경