Wie verwende ich eine Metamask-Wallet von web3,py?

Ich habe Verträge für das Ropsten-Testnetz mit Trüffel und einem Metamask-Wallet bereitgestellt, um die Transaktionen und Infura als gehosteten Ethereum-Knoten zu bezahlen.

Um das in Truffle zu tun, muss ich das truffle-hdwallet-providerPaket verwenden, um die Schlüssel aus meiner Metamask-Brieftasche zu importieren.

var HDWalletProvider = require("truffle-hdwallet-provider")
const mnemonic = "mnemonic words from metamask here"

module.exports = {
 networks : {
    ganache : {
      host : 'localhost',
      port : 8545,    // By default Ganache runs on this port.
      network_id : "*" // network_id for ganache is 5777. However, by keeping * as value you can run this node on  any network
    },
     ropsten: {
        provider: function(){
            return new HDWalletProvider(mnemonic,'https://ropsten.infura.io/v3/<infura_api_key>')
        },
         network_id: 3,
         gas: 4500000,
     }
  }
};

Jetzt möchte ich web3.py verwenden, um mit den Verträgen zu interagieren, und ich verwende den automatischen Infura-Konnektor von web3.py, web3.auto.infura.w3. Ich habe in der Dokumentation nicht gefunden, wie ich die Schlüssel aus meiner Metamask-Brieftasche importieren kann, um die Transaktionen im Ropsten-Netzwerk zu bezahlen.

Beispiel: Angenommen, ich habe eine Vertragsinstanz und möchte eine Funktion darauf aufrufen:

token_contract_instance = w3.eth.contract(address=token_address, abi=token_artifact['abi'])
bal = token_contract_instance.functions.balanceOf(address).call()

Aber ich möchte, dass dieser msg.sender bei diesem Anruf die Ethereum-Adresse ist, die ich mit Metamask erstellt habe.

Beachten Sie, dass dies auf der Serverseite der Web-App stattfindet.

Meine Vermutung ist, dass die Antwort zu definieren ist, eth.DefaultAccountaber die Dedokumentation für diese Methode nicht existiert.

Kann mir jemand zeigen, wie man das macht?

Antworten (3)

Sie haben Zugriff auf das Netzwerk über infura, wie Sie sagten. Mit Web3py können Sie alles tun (Signieren, Senden usw.), was Sie mit Metamask -on-Websites tun. Metamask läuft auf dem Browser! und es fügt web3 ein, sodass die Methoden zur Interaktion mit dem Netzwerk auf Ihrer Webseite verfügbar sind (und Ihnen auch ermöglicht, Transaktionen zu signieren, ohne Ihre Schlüssel preiszugeben).

Kurz gesagt, mit web3py können Sie alles tun, was Sie ohne zwischengeschaltete Anwendungen benötigen.

Ja, ich weiß, ich möchte nur wissen, welche Best Practices es gibt, eine bereits vorhandene Brieftasche mit Web3.py zu verwenden: dh, wie ich eine Funktion im Vertrag mit dieser Adresse als msg.sender aufrufe.
Beispiele dafür finden Sie hier , da Sie für die Brieftasche die Adresse und den privaten Schlüssel erhalten und auf web3py verwenden können

Wenn Sie eine bestimmte Brieftasche zum Signieren von Transaktionsaktionen verwenden möchten, können Sie grundsätzlich den privaten Schlüssel von diesem Konto verwenden und zuerst die Transaktion signieren und dann als Rohtransaktion senden. Angenommen, Sie haben eine Transaktion wie diese:

transaction = {
        'from': <ethereum address which signs this transaction>,
        'to': '<ethereum address>',
        'data': bytes(mtroot, encoding='ascii'),
        'value': value,
        'gas': 100000,
        'gasPrice': 0,  # W3.eth.gasPrice,
        'nonce': 0
    }

Zuerst signieren Sie die Transaktion mit Ihrem privaten Schlüssel der Brieftasche:

signed_txn = W3.eth.account.signTransaction(transaction, private_key=os.environ['PRIVATE_KEY'])

dann senden Sie die Rohtransaktion:

txid = W3.toHex(W3.eth.sendRawTransaction(signed_txn.rawTransaction))

Das ist es!

Hallo, was ist bytes(mtroot, encoding='ascii')?

Eine andere Lösung für heute wäre, den privaten Schlüssel Ihrer Brieftasche zu erhalten und ihn in eine .env-Datei zu stecken.

Dann können Sie per Skript Ihr Konto laden:

from dotenv import load_dotenv
load_dotenv()
deployerPrivateKey = os.getenv("ACCOUNT_PRIVATE_KEY")
account = w3.eth.account.privateKeyToAccount(deployerPrivateKey)
print(account.address) # Will print your address