Metamask

如何使用 web3.py 和 Infura 發送交易?

  • September 16, 2020

我正在使用 Infura 與 Ropsten 測試網進行互動。我想將交易從一個帳戶發送到另一個帳戶,但以下程式碼不起作用:

w3 = Web3(Web3.HTTPProvider('InfuraUrl'))

transaction = {
   'from': 'accountAddress',
   'to': 'accountAddress',
   'value': w3.toWei(1, "ether"),
   'gas': 2000000,
   'chainId': 3
}

w3.eth.sendTransaction(transaction)

我想我必須使用從 Metamask 獲得的私鑰。如果您知道如何使用本地私鑰發送交易,請提供幫助。

Infura 是一個公共託管節點。它無法解鎖您的本地帳戶。即使有辦法,也存在安全風險,因為任何人都可以連接到同一個節點並轉移您的資金。

為了通過 Infura 發送交易,您需要使用在本地簽署交易web3.eth.sendRawTransaction()。以下範例來自web3.py 文件

>>> transaction = {
...     'to': '0xF0109fC8DF283027b6285cc889F5aA624EaC1F55',
...     'value': 1000000000,
...     'gas': 2000000,
...     'gasPrice': 234567897654321,
...     'nonce': 0,
...     'chainId': 1
... }
>>> key = '0x4c0883a69102937d6231471b5dbb6204fe5129617082792ae468d01a3f362318'
>>> signed = w3.eth.account.sign_transaction(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'

您可以嘗試使用 web3-hdwallet-provider為源自 12 字助記符的地址簽署交易。

const Web3 = require('web3');
const Web3HDWalletProvider = require('web3-hdwallet-provider');

const httpProvider = new Web3.providers.HttpProvider('InfuraUrl');
const mnemonic = 'YOUR PRIVATE KEY';
const web3 = new Web3HDWalletProvider(mnemonic, httpProvider)

transaction = {
'from': 'accountAddress',
'to': 'accountAddress',
'value': w3.toWei(1, "ether"),
'gas': 2000000,
'chainId': 3}

web3.eth.sendTransaction(transaction)

注意:注意不要暴露你的私鑰;改用文件路徑。

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