跳转至

解决冲突

原文:https://web 3py . readthedocs . io/en/stable/trouble shooting . html

## 建立一个干净的环境

许多事情都会导致环境恶化。您可能在一个不受支持的 Python 版本上。可能安装了另一个有名称或版本冲突的包。通常,保证正确环境的最好方法是使用virtualenv,例如:

# Install pip if it is not available:
$ which pip || curl https://bootstrap.pypa.io/get-pip.py | python

# Install virtualenv if it is not available:
$ which virtualenv || pip install --upgrade virtualenv

# *If* the above command displays an error, you can try installing as root:
$ sudo pip install virtualenv

# Create a virtual environment:
$ virtualenv -p python3 ~/.venv-py3

# Activate your new virtual environment:
$ source ~/.venv-py3/bin/activate

# With virtualenv active, make sure you have the latest packaging tools
$ pip install --upgrade pip setuptools

# Now we can install web3.py...
$ pip install --upgrade web3 

注意

请记住,每个新的终端会话都需要您重新激活您的 virtualenv,例如:$ source ~/.venv-py3/bin/activate ## 为什么我不能使用特定的功能?

请注意,必须先配置 Web3.py 实例,然后才能使用它的大部分功能。没有首先配置实例的一个症状是类似这样的错误:AttributeError: type object 'Web3' has no attribute 'eth'

要正确配置您的 Web3.py 实例,请指定您使用哪个提供商连接到以太坊网络。如果您连接到本地运行的节点,配置示例可能是:

>>> from web3 import Web3
>>> w3 = Web3(Web3.HTTPProvider('http://localhost:8545'))

# now `w3` is available to use:
>>> w3.isConnected()
True
>>> w3.eth.send_transaction(...) 

请参考 供应商 文档以获得更多配置帮助。 ## 为什么我的 web3 实例没有连接到网络?

您可以通过isConnected方法检查您的实例是否已连接:

>>> w3.isConnected()
False 

对于你为什么会在这里看到False有各种各样的解释。如果您正在运行一个本地节点,比如 Geth,请仔细检查您确实已经启动了二进制文件,并且已经从预定的目录启动了它——特别是如果您已经指定了它的 ipc 文件的相对路径。

如果这不能解决您的问题,那么很可能您仍然有一个供应商配置问题。配置一个供应商有几个选项,这里详细介绍

如何使用 Web3.py 中的元掩码帐户?

通常你不需要这样做,只需要在 Web3.py 中新建一个账户,将你的 MetaMask 账户中的资金转入即可。但是如果你一定要…

从 MetaMask 导出您的私钥,并使用 Web3.py 中的本地私钥工具来签名和发送事务。

参见如何导出您的私钥T3】使用本地私钥 T5。

## 我如何为我的测试网络获取以太网?

测试网络通常有一个叫做“水龙头”的东西来帮助想使用它的人获得测试以太。当你访问一个网页,或 ping 一个聊天机器人等时,水龙头简单地给你发送测试以太网。

每个测试网络都有自己版本的测试以太网,因此每个网络都必须维护自己的水龙头。如果您不确定使用哪个测试网络,请参见 我应该连接到哪个网络?T3】

水龙头机制往往来来去去,所以如果这里的任何信息都是过时的,请尝试以太坊栈交换。以下是一些 testnet 以太指令的链接(排名不分先后):

如果您看到错误The method personal_newAccount does not exist/is not available,您可能试图在连接到远程节点供应商(如 Infura)时创建一个帐户。出于安全考虑,远程节点不能创建帐户。

如果您实际上正在运行一个本地节点,请确保它被正确配置为接受personal方法。对于 Geth,根据您的配置,它看起来类似于:--http.api personal,eth,<etc>--ws.api personal,eth,<etc>。请注意,IPC 配置是最安全的,并且默认包含了personal API。

通常,您的帐户选项有:

  • 在本地运行一个节点(例如 Geth),通过本地端口连接到它,然后使用personal API。
  • 为账户导入密钥库文件 提取私钥
  • 通过 eth-account API 创建账户,如new_acct = w3.eth.account.create()
  • 使用外部服务(例如 MyCrypto)生成新帐户,然后安全地导入其私钥。

警告

在熟悉安全最佳实践之前,不要在帐户中存储实际价值。如果您丢失了您的私钥,您就失去了您的帐户!

让以太坊 JSON-RPC API 访问更快

当获取多个大型请求时,尤其是在运行批处理作业时,您的以太坊节点 JSON-RPC API 可能会很慢。这里有一些关于如何加速 web3.py 应用程序的技巧。

  • 在本地运行您的客户端,例如 Go EthereumTurboGeth 。网络延迟和速度是快速 API 访问的主要限制因素。
  • 使用 IPC 通信代替 HTTP/WebSockets。参见 选择如何连接到您的节点
  • 使用优化的 JSON 解码器。Web3.py 的未来版本可能会更改默认解码器或提供 API 来配置一个解码器,但现在,您可以修补 provider 类以使用 ujson
"""JSON-RPC decoding optimised for web3.py"""

from typing import cast

import ujson

from web3.providers import JSONBaseProvider
from web3.types import RPCResponse

def _fast_decode_rpc_response(raw_response: bytes) -> RPCResponse:
    decoded = ujson.loads(raw_response)
    return cast(RPCResponse, decoded)

def patch_provider(provider: JSONBaseProvider):
    """Monkey-patch web3.py provider for faster JSON decoding.

 Call this on your provider after construction.

 This greatly improves JSON-RPC API access speeds, when fetching
 multiple and large responses.
 """
    provider.decode_rpc_response = _fast_decode_rpc_response 

为什么我会得到 Visual C++或 Cython 未安装的错误?

一些没有安装 Microsoft Visual c++ 14.0 或更高版本的 Windows 用户在安装 Web3.py 时可能会看到如下所示的错误消息:

error: Microsoft Visual C++ 14.0 or greater is required. Get it with "Microsoft C++ Build Tools": https://visualstudio.microsoft.com/visual-cpp-build-tools/ 

若要修复此错误,请从以下网址下载并安装 Microsoft Visual C++:

用于 Visual Studio 的 Microsoft Visual C++可再发行软件



回到顶部