Tron Python API 모듈을 사용해서 TRC10 ‘송금’을 하려면 어떻게 해야 할까?

[참고 사이트]

GitHub의 Python API를 기본으로 하여 TRC10 토큰 송금을 구현해 보니 아래와 같은 error가 발생한다.

Github에서 제공하는 TRC 송금

from tronapi import Tron
from tronapi import HttpProvider

full_node = HttpProvider('https://api.trongrid.io')
solidity_node = HttpProvider('https://api.trongrid.io')
event_server = HttpProvider('https://api.trongrid.io')

tron = Tron(full_node=full_node,
            solidity_node=solidity_node,
            event_server=event_server)


tron.private_key = 'private_key'
tron.default_address = 'default address'

# added message
send = tron.trx.send_transaction('to', 1)

print(send)

위 제공하는 소스에서 TRC10 토큰을 송신 하려면 아래와 같이 하면 될 거라 생각 했음

from tronapi import Tron
from tronapi import HttpProvider

full_node = HttpProvider('https://api.trongrid.io')
solidity_node = HttpProvider('https://api.trongrid.io')
event_server = HttpProvider('https://api.trongrid.io')

tron = Tron(full_node=full_node,
            solidity_node=solidity_node,
            event_server=event_server)


tron.private_key = 'private_key'
tron.default_address = 'default address'

# added message
send = tron.trx.send_token('to', 1, 'token_id')

print(send)

하지만…. 오류 발생.

Traceback (most recent call last):
  .....
    send = tron.trx.send_token(to, amount, token_id)
  File ".../.venv/lib/python3.6/site-packages/tronapi/trx.py", line 458, in send_token
    sign = self.sign(tx)
  File ".../.venv/lib/python3.6/site-packages/tronapi/trx.py", line 574, in sign
    address = self.tron.address.from_private_key(self.tron.private_key).hex.lower()
  File ".../.venv/lib/python3.6/site-packages/tronapi/common/account.py", line 59, in from_private_key
    return PrivateKey(private_key).address
  File ".../.venv/lib/python3.6/site-packages/tronapi/common/account.py", line 70, in __init__
    _private = unhexlify(bytes(private_key, encoding='utf8'))
TypeError: encoding without a string argument

오류 문구 “TypeError: encoding without a string argument”

이 에러가 발생하는 이유가 결론부터 보면, 아래 줄이 문제이고

address = self.tron.address.from_private_key(self.tron.private_key).hex.lower()

그 중에서도

self.tron.private_key 의 값이 None 이라서 그렇다

제공해 주는 위의 소스에서 아래 항목을 추가 하면 해결 된다.

tron.trx.tron.private_key = 'private_key'

수정 된 전체 소스응 아래와 같다

from tronapi import Tron
from tronapi import HttpProvider

full_node = HttpProvider('https://api.trongrid.io')
solidity_node = HttpProvider('https://api.trongrid.io')
event_server = HttpProvider('https://api.trongrid.io')

tron = Tron(full_node=full_node,
            solidity_node=solidity_node,
            event_server=event_server)


tron.private_key = 'private_key'
tron.default_address = 'default address'

# added by hyunwoo.
tron.trx.tron.private_key = 'private_key'

# added message
send = tron.trx.send_token('to', 1, 'token_id')

print(send)

송금결과 Console Print

 {'result': True, 'transaction': {'visible': False, 'txID': '12db7eb293e11b3eec114cacc55bc05b8d6e1feb4f9c1d9f47bbbe3d1aabd504', 'raw_data': {'contract': [{'parameter': {'value': {'amount': 3000000000, 'asset_name': '31303030303538', 'owner_address': '410528eb23a4a716d1647372c6ba681f204a8a3c2a', 'to_address': '419f96f2fba41f70be63d0a4fce94360896058ccee'}, 'type_url': 'type.googleapis.com/protocol.TransferAssetContract'}, 'type': 'TransferAssetContract'}], 'ref_block_bytes': '0f92', 'ref_block_hash': '7f8f59b2d002667c', 'expiration': 1580722314000, 'timestamp': 1580722256591}, 'raw_data_hex': '0a020f9222087f8f59b2d002667c4090b691d3802e5a77080212730a32747970652e676f6f676c65617069732e636f6d2f70726f746f636f6c2e5472616e736665724173736574436f6e7472616374123d0a07313030303035381215410528eb23a4a716d1647372c6ba681f204a8a3c2a1a15419f96f2fba41f70be63d0a4fce94360896058ccee2080bcc1960b70cff58dd3802e', 'signature': ['ea0dd68f98fe5f0d4225d8835d15be6db4ccd432dd2ad8103c49d9cc35374e1f102400b9b6f2bb6f832d088858aca989f3bb640ffd0f2e34a5e2b4fc0e44e2661b']}}

테스트 넷 링크

송금결과

[결론]

  • TRC 송금 예시는 있었고, TRC10 송금 예시가 없길래 임의로 분석해서 진행한 거 였는데
  • 해결하고 보니 내가 API를 잘 못 이해 했거나
  • TRON Python API를 만들다 만 느낌이 든다.