ropsten.infura.io 引发 405 错误

ropsten.infura.io raises 405 error

目的

我想将合约部署到 ropsten(以太坊测试网络)并使用 web3py 进行交易。

环境

我使用 remix 进行合约部署,这里是用于部署事务的 etherscan link。:etherscan.io/tx/0xb0a

为了进行交易,我使用了这个脚本:gist
(我还在 link 中附上了 solidity 合约代码。)

问题

当我尝试在 web3py

中使用 w3.personal.unlockAccount 解锁我的帐户时
w3.personal.unlockAccount(account_a, input("Password: "))

它只是引发了以下错误。

我也想使用合约中的giveToken功能进行交易。但是我执行代码时出现了同样的错误。

contract_instance.giveToken(account_b, token_amount, transact={'from': account_a}) 

对于预定义变量(例如contract_instance、account_b),您可以在下方查看完整代码或在上方查看要点link。

这是我的代码

token.sol

pragma solidity ^0.4.0;

contract BasicToken {
    // Owner
    address public owner;

    // For manage account and balance
    mapping(address => uint) userAccount;


    constructor() public {
        owner = msg.sender;
    }

    // Example
    event increaseToken(address sender, address receiver, uint amount);

    function getBalance(address addr) public view returns (uint) {
        return userAccount[addr];
    }

    function myBalance() public view returns (uint) {
        return userAccount[msg.sender];
    }

    function giveToken(address dest, uint amount) public returns (bool) {
        emit increaseToken(msg.sender, dest, amount);

        userAccount[dest] += amount;

        return true;
    }

}

web3py.py

import json
import time

from eth_utils import to_checksum_address
from web3 import Web3, HTTPProvider
from web3.contract import ConciseContract
from web3.middleware import geth_poa_middleware

INFURA_API_KEY = "this is key"

ACCOUNT_PASSWORD = "this is account password"

w3 = Web3(HTTPProvider('https://ropsten.infura.io/{}'.format(INFURA_API_KEY)))

w3.middleware_stack.inject(geth_poa_middleware, layer=0)

from eth_utils import to_checksum_address
contract_address = to_checksum_address('0xFb294910d8193DeB9a294B51F22D8878ad15f2E8')

# Instantiate and deploy contract
contract_instance = w3.eth.contract(abi=contract_abi, address=contract_address, ContractFactoryClass=ConciseContract)

account_a = "0xCa2d22Cb8ff54f2D1DCfDBb75DD6411a5A0ee6f1"
account_b = "0x8F8d1bc97E8939e3932BfBeb923A1B2B972D5A9A"

# Unlock account
w3.personal.unlockAccount(account_a, ACCOUNT_PASSWORD)  # Raise the below error!!!

"""
requests.exceptions.HTTPError: 405 Client Error: Method Not Allowed for url: https://ropsten.infura.io/API_KEY
"""

print("Contract: {}".format(contract_address))

print("Before give token")
print('My Balance: {}'.format(contract_instance.myBalance()))
print('{} Balance: {}'.format(account_a, contract_instance.getBalance(account_a)))
print('{} Balance: {}'.format(account_b, contract_instance.getBalance(account_b)))

token_amount = 1000

# Make transaction
contract_instance.giveToken(account_b, token_amount, transact={'from': account_a})  # Raise the below error!!!

"""
requests.exceptions.HTTPError: 405 Client Error: Method Not Allowed for url: https://ropsten.infura.io/API_KEY
"""

try:
    assert contract_instance.getBalance(account_b) == token_amount
except AssertionError as e:
    print("Test Error: {}".format(e))
    print("Amount: {}\t Expected: {}".format(contract_instance.getBalance(account_b), token_amount))

else:
    print("After give token")
    print('My Balance: {}'.format(contract_instance.myBalance()))
    print('{} Balance: {}'.format(account_a, contract_instance.getBalance(account_a)))
    print('{} Balance: {}'.format(account_b, contract_instance.getBalance(account_b)))

finally:
    print('Done')

仅供参考

有了remix,我就可以进行交易了。 etherscan.io/tx/0x129

Infura 不支持 unlockAccount,因为他们不知道您的私钥。 (Infura 是很多人使用的 public 以太坊节点。)

他们不支持任何需要他们知道您的私钥的方法。