Wallets
如何使用 web3,py 中的元遮罩錢包?
我使用 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 允許您在沒有中間應用程序的情況下做所有您需要的事情。