解决冲突
原文: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 中的本地私钥工具来签名和发送事务。
## 我如何为我的测试网络获取以太网?
测试网络通常有一个叫做“水龙头”的东西来帮助想使用它的人获得测试以太。当你访问一个网页,或 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 Ethereum 或 TurboGeth 。网络延迟和速度是快速 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++可再发行软件