So führen Sie Transact() für Vertragsfunktionen auf einem Remote-Knoten aus

Ich möchte eine intelligente Vertragsfunktion mit Web3 Python aufrufen, indem ich den Infura-Mainnet-Knoten anstelle eines lokalen Knotens verwende. Ich verstehe, dass ich den privaten Schlüssel importieren und zum Signieren der Transaktion verwenden muss, aber ich kann keine Beispiele dafür sehen, wie dies beim Aufrufen von Smart Contracts geschieht.

Der Code, den ich habe, ist wie folgt, aber er schlägt fehl, da keine Brieftasche angeschlossen ist:

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))

Fehler:

ValueError: {u'message': u'gas required exceeds allowance or always failing transaction', u'code': -32000}
Wenn Sie sich mit Blockchain vertraut machen, sollten Sie ein Testnet wie Ropsten oder Rinkeby verwenden. Die Verwendung von Mainnet ( mainnet.infura.io ) kostet Sie Ether, wenn Sie eine Brieftasche (z. B. MetaMask) in Ihrem Browser eingerichtet haben, oder schlägt fehl, da Sie kein Ether haben, um Benzin zu bezahlen.
Wenn Sie gerne einen JavaScript-Code lesen und die Schritte zum Signieren einer Transaktion verstehen, können Sie auf npmjs.com/package/web3js-raw & github.com/fidenz-chim/fundsplitter_web3jsraw.git verweisen

Antworten (1)

Diese Funktionalität ist ziemlich neu und wird nur in v4-beta unterstützt. Stellen Sie sicher, dass Sie regelmäßig auf die neueste Version aktualisieren.

Sehen Sie sich die Dokumente an für:

Grob wollen Sie:

txn = fContract.functions.test("0xabcd", 100000).buildTransaction()
signed = web3.eth.account.signTransaction(txn, privateKey)
txn_hash = web3.eth.sendRawTransaction(signed.rawTransaction)
Hallo Schnitzer, danke. Außerdem haben Sie den privaten Schlüssel verpasst: signed = web3.eth.account.signTransaction(txn, privateKey)
Hallo Carver, würdest du ein bisschen im Detail erklären, wie man diese Funktionen benutzt? Ich habe sie ausprobiert, aber sie funktionieren nicht. Würden Sie hier nachsehen: ethereum.stackexchange.com/questions/49038/… ? Danke dir