Отправьте токен ERC20 с помощью web3.py, используя локальный закрытый ключ - PullRequest
0 голосов
/ 08 июня 2018

Я пытаюсь отправить токены ERC20 в python с помощью web3.py, используя локальный закрытый ключ.

С помощью этого кода я могу отправить эфир:

w3 = Web3(HTTPProvider('https://api.myetherapi.com/eth'))
signed_txn = w3.eth.account.signTransaction(dict(
                nonce=w3.eth.getTransactionCount(from_address),
                gasPrice=w3.eth.gasPrice,
                gas=100000,
                to=to_address,
                value=12345,
                data=b'',
            ),
                private_key,
            )
w3.eth.sendRawTransaction(signed_txn.rawTransaction)

Тогда я нашел это тоже, но всегда получаю сообщение об ошибке для оценки газа, и мне кажется, что я не могу указать адрес, с которого я отправляю, вот так или доказать, что это мой адрес с помощью какой-то подписи?

contract = w3.eth.contract(address=address, abi=EIP20_ABI, bytecode=bytecode)
contract.functions.transfer(to_address, 121212).transact()

Итак, у меня есть JSON abi, байт-код, адреса и мой закрытый ключ. Могу ли я каким-то образом создать работающий скрипт из кода, который я нашел?

Заранее спасибо!

1 Ответ

0 голосов
/ 13 июня 2018

всегда выдает ошибку для оценкиGas

Иногда вы получите ошибки, если ваша транзакция потерпит неудачу.Это может произойти, если вы отправляете «с» неправильного адреса при оценке газа.Попробуйте указать from адрес в estimateGas() следующим образом:

acct = w3.eth.account.privateKeyToAccount(private_key)
contract.functions.transfer(to_address, 121212).estimateGas({'from': acct.address})

Можно ли как-то построить рабочий скрипт из кода, который я нашел?

Одна из проблем второго подхода заключается в том, что transact() попытается использовать ваш узел для подписания транзакции.Поскольку у вас есть локальный закрытый ключ, вам нужно будет использовать buildTransaction(), чтобы затем подписать его локально.

См. это руководство по Web3.py , которое обычно касается локального подписания транзакций контракта,но случается, что используется пример ERC20.

Outline

  1. Инициализация объекта Контракта
  2. Создание транзакции
  3. Знактранзакция, с w3.eth.account.signTransaction ()
  4. Трансляция транзакции с sendRawTransaction ()

Пример

>>> from ethtoken.abi import EIP20_ABI
>>> from web3.auto import w3

>>> unicorns = w3.eth.contract(address="0xfB6916095ca1df60bB79Ce92cE3Ea74c37c5d359", abi=EIP20_ABI)

>>> nonce = w3.eth.getTransactionCount('0x5ce9454909639D2D17A3F753ce7d93fa0b9aB12E')  

# Build a transaction that invokes this contract's function, called transfer
>>> unicorn_txn = unicorns.functions.transfer(
...     '0xfB6916095ca1df60bB79Ce92cE3Ea74c37c5d359',
...     1,
... ).buildTransaction({
...     'chainId': 1,
...     'gas': 70000,
...     'gasPrice': w3.toWei('1', 'gwei'),
...     'nonce': nonce,
... })

>>> unicorn_txn
{'value': 0,
 'chainId': 1,
 'gas': 70000,
 'gasPrice': 1000000000,
 'nonce': 0,
 'to': '0xfB6916095ca1df60bB79Ce92cE3Ea74c37c5d359',
 'data': '0xa9059cbb000000000000000000000000fb6916095ca1df60bb79ce92ce3ea74c37c5d3590000000000000000000000000000000000000000000000000000000000000001'}

>>> private_key = b"\xb2\\}\xb3\x1f\xee\xd9\x12''\xbf\t9\xdcv\x9a\x96VK-\xe4\xc4rm\x03[6\xec\xf1\xe5\xb3d"
>>> signed_txn = w3.eth.account.signTransaction(unicorn_txn, private_key=private_key)
>>> signed_txn.hash
HexBytes('0x4795adc6a719fa64fa21822630c0218c04996e2689ded114b6553cef1ae36618')
>>> signed_txn.rawTransaction
HexBytes('0xf8a980843b9aca008301117094fb6916095ca1df60bb79ce92ce3ea74c37c5d35980b844a9059cbb000000000000000000000000fb6916095ca1df60bb79ce92ce3ea74c37c5d359000000000000000000000000000000000000000000000000000000000000000125a00fb532eea06b8f17d858d82ad61986efd0647124406be65d359e96cac3e004f0a02e5d7ffcfb7a6073a723be38e6733f353cf9367743ae94e2ccd6f1eba37116f4')
>>> signed_txn.r
7104843568152743554992057394334744036860247658813231830421570918634460546288
>>> signed_txn.s
20971591154030974221209741174186570949918731455961098911091818811306894497524
>>> signed_txn.v
37

>>> w3.eth.sendRawTransaction(signed_txn.rawTransaction)  

# When you run sendRawTransaction, you get the same result as the hash of the transaction:
>>> w3.toHex(w3.sha3(signed_txn.rawTransaction))
'0x4795adc6a719fa64fa21822630c0218c04996e2689ded114b6553cef1ae36618'
...