So senden Sie mit Web3.py eine Transaktion an myetherapi.com

Ich habe Probleme bei der Interaktion mit myetherapi.com über web3.py. Ich bin in der Lage, einige Funktionen zu erstellen, die funktioniert haben, wie get_eth_balance()unten. Aber um Transaktionen wie zu senden send_eth(), erhalte ich immer wieder diesen ValueError:

ValueError: {'code': -32601, 'message': '{eth_sendTransaction} Method not 
found or unavailable', 'data': None}

Jede Hilfe wäre sehr dankbar, was übersehe ich hier?

from web3 import Web3, HTTPProvider

class MyWallet():
    def __init__(self, addr=None, key=None):
        self.addr = addr
        self.key = key
        self.w3 = Web3(HTTPProvider('https://api.myetherapi.com/eth'))

    def get_eth_balance(self):
        return self.w3.eth.getBalance(self.addr)

    def send_eth(self, address, amt):
        transaction = {
            'from': self.addr,
            'to': address,
            'value': Web3.toWei(amt, 'ether')
        }
        return self.w3.eth.sendTransaction(transaction)

Antworten (1)

eth_sendTransactionbefindet sich nicht auf der Liste der zulässigen Methoden, die unter http://www.myetherapi.com/ angezeigt wird.

eth_sendTransactiongeht davon aus, dass der Knoten Zugriff auf den privaten Schlüssel des Kontos hat, von dem Sie senden, myetherapi jedoch nicht. Sie müssen also lokal signieren und sendRawTransaction verwenden. Der bequemste Weg, dies (in Python) zu tun, ist der w3.eth.accountAbschnitt von Web3.py, ab Version 4.

Sie können verwenden w3.eth.account.signTransaction(), um vor dem Senden lokal zu signieren.

>>> transaction = {
        'to': '0xF0109fC8DF283027b6285cc889F5aA624EaC1F55',
        'value': 1000000000,
        'gas': 2000000,
        'gasPrice': 234567897654321,
        'nonce': 0,
        'chainId': 1
    }
>>> key = '0x4c0883a69102937d6231471b5dbb6204fe5129617082792ae468d01a3f362318'
>>> signed = w3.eth.account.signTransaction(transaction, key)

>>> signed.rawTransaction
HexBytes('0xf86a8086d55698372431831e848094f0109fc8df283027b6285cc889f5aa624eac1f55843b9aca008025a009ebb6ca057a0535d6186462bc0b465b561c94a295bdb0621fc19208ab149a9ca0440ffd775ce91a833ab410777204d5341a6f9fa91216a6f3ee2c051fea6a0428')
>>> signed.hash
HexBytes('0xd8f64a42b57be0d565f385378db2f6bf324ce14a594afc05de90436e9ce01f60')
>>> signed.r
4487286261793418179817841024889747115779324305375823110249149479905075174044
>>> signed.s
30785525769477805655994251009256770582792548537338581640010273753578382951464
>>> signed.v
37

# When you run sendRawTransaction, you get back the hash of the transaction:
>>> w3.eth.sendRawTransaction(signed.rawTransaction)  
'0xd8f64a42b57be0d565f385378db2f6bf324ce14a594afc05de90436e9ce01f60'

Quelle

Wie/wo erhalte ich den Schlüssel? Steht key für privaten Schlüssel? @Schnitzer
Ja, es ist der private Schlüssel für das Konto, von dem aus Sie die Transaktion senden möchten