Как отправить транзакцию с использованием bytes32 из python в частную сеть ethereum?

Я создал следующий код для транзакций в моей частной сети и реализовал следующий скрипт на Python:

import sys, os, time
from solc import compile_source, compile_files, link_code
from ethjsonrpc import EthJsonRpc

print("Using enviroment in " + sys.prefix)
print("Python version " + sys.version)

c = EthJsonRpc('127.0.0.1', 8042)
c.web3_clientVersion()

params = [1,2,3,4,5,6,b'0x2a706b3187db623b309cd7e8a8c15308160600d68b8eae590978a32ad6c967b2']
tx = c.call_with_transaction(c.eth_coinbase(),'0x1e291B2CDB574519Ee1c3d75CA849f34153EE9e5', 'post(uint8,uint8,uint8,uint8,uint8,uint8,bytes32)', params)

Когда я выполняю сценарий, я получаю следующую ошибку:

Traceback (most recent call last):
  File "write_raspberry_v1.py", line 15, in <module>
    tx = c.call_with_transaction(c.eth_coinbase(),'0x1e291B2CDB574519Ee1c3d75CA849f34153EE9e5', 'post(uint8,uint8,uint8,uint8,uint8,uint8,bytes32)', params)
  File "/usr/local/lib/python3.7/site-packages/ethjsonrpc/client.py", line 127, in call_with_transaction
    data = self._encode_function(sig, args)
  File "/usr/local/lib/python3.7/site-packages/ethjsonrpc/client.py", line 78, in _encode_function
    encoded_params = encode_abi(types, param_values)
  File "/usr/local/lib/python3.7/site-packages/ethereum/abi.py", line 369, in encode_abi
    myhead += enc(proctypes[i], args[i])
  File "/usr/local/lib/python3.7/site-packages/ethereum/abi.py", line 344, in enc
    return utils.to_string(encode_single(typ, arg))
  File "/usr/local/lib/python3.7/site-packages/ethereum/abi.py", line 211, in encode_single
    assert len(arg) <= int(sub)

Как я могу это решить? Есть ли другой способ отправить транзакцию с python в мою частную сеть (напрямую с помощью web3?)

Версия с использованием web3.py:

w3 = Web3(HTTPProvider("http://127.0.0.1:8042"))

vinduino = w3.eth.contract(
    address = "0x1e291B2CDB574519Ee1c3d75CA849f34153EE9e5",
    abi = contract_interface['abi'],
)

tx_hash = vinduino.functions.post(1,2,3,4,5,6,"0x2a706b3187db623b309cd7e8a8c15308160600d68b8eae590978a32ad6c967b2").call({'from': w3.eth.coinbase})

print(tx_hash)

Этот assert len(arg) <= int(sub) вышел из строя, что означает, что, вероятно, метод encode_single для файла /usr/local/lib/python3.7/site-packages/ethereum/abi.py ожидает меньше аргументов, чем получает.

Niloct 13.09.2018 18:32

Вы сказали «использовать web3 напрямую», но похоже, что вы не используете web3.py. Это требование, чтобы вы придерживались EthJsonRpc? Или вы можете использовать web3.py? (Если вы используете web3.py, просто передайте bytes, хотя я считаю, что шестнадцатеричная строка также подойдет.)

user94559 13.09.2018 19:55

Да, smarx, я хочу совершить эту транзакцию с помощью web3.py, но поскольку это не сработало, я попробовал EthJsonRpc. Я обновляю сообщение, чтобы добавить код web3.py как можно скорее, это вызывает проблему нехватки газа, но когда я выполняю ту же функцию из кошелька Ethereum, этого не происходит.

Jordi Estapé Canal 14.09.2018 12:36
0
3
494
0

Другие вопросы по теме