Me gustaría llamar a las funciones de un contrato inteligente usando Web3 Python usando el nodo de la red principal de Infura en lugar de un nodo local. Entiendo que necesito importar la clave privada y usarla para firmar la transacción, pero no puedo ver ningún ejemplo para hacer esto llamando a contratos inteligentes.
El código que tengo es el siguiente, pero falla porque no hay una billetera adjunta:
from web3 import Web3
import json
from web3.providers.rpc import HTTPProvider
contractAddress = '0xabcd'
web3 = Web3(HTTPProvider('https://mainnet.infura.io'))
with open('abcd.abi', 'r') as abi_definition:
abi = json.load(abi_definition)
print (web3.eth.blockNumber)
fContract = web3.eth.contract(abi,contractAddress)
print ("Test",fContract.transact().test("0xabcd",100000))
Error:
ValueError: {u'message': u'gas required exceeds allowance or always failing transaction', u'code': -32000}
Esta funcionalidad es bastante nueva, solo se admite en v4-beta. Asegúrese de actualizar a la última versión con regularidad.
Echa un vistazo a los documentos para:
Aproximadamente, vas a querer:
txn = fContract.functions.test("0xabcd", 100000).buildTransaction()
signed = web3.eth.account.signTransaction(txn, privateKey)
txn_hash = web3.eth.sendRawTransaction(signed.rawTransaction)
quim
quim