Wallets

如何使用 web3,py 中的元遮罩錢包?

  • December 9, 2021

我使用 truffle 和 metamask 錢包將合約部署到 Ropsten 測試網以支付交易費用,並將 Infura 作為託管乙太坊節點。

要在 Truffle 中做到這一點,我必須使用該truffle-hdwallet-provider包從我的元遮罩錢包中導入密鑰。

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,
    }
 }
};

現在我想使用 web3.py 與合約進行互動,我正在使用來自 web3.py 的 Automatic infura 連接器web3.auto.infura.w3。我沒有在文件中找到如何從我的元遮罩錢包中導入密鑰來支付 Ropsten 網路上的交易。

例如:假設我有一個合約實例,我想在它上面呼叫一個函式:

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

但我希望這個呼叫中的 msg.sender 是我使用元遮罩創建的乙太坊地址。

請注意,這是在 Web 應用程序的伺服器端進行的。

我的猜測是答案是定義eth.DefaultAccount,但這種方法不存在 deocumentation。

誰能告訴我如何做到這一點?

基本上,如果你想使用給定的錢包來簽署 trtansactions,你可以使用來自該賬戶的私鑰,並首先簽署交易,然後將其作為原始交易發送。例如,假設您有這樣的交易:

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
   }

首先你用你的錢包私鑰簽署交易:

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

然後,您發送原始交易:

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

而已!

如您所說,您可以通過 infura 訪問網路。Web3py 允許您做所有事情(簽名、發送等),這就是您在 metamask 網站上所做的事情。Metamask 正在瀏覽器上執行!它注入 web3 以便與網路互動的方法在您的網頁中可用(並且還允許您在不暴露密鑰的情況下簽署交易)。

簡而言之,web3py 允許您在沒有中間應用程序的情況下做所有您需要的事情。

引用自:https://ethereum.stackexchange.com/questions/62247