供应商
提供商是 web3 与区块链对话的方式。供应商接受 JSON-RPC 请求并返回响应。这通常是通过向基于 HTTP 或 IPC 套接字的服务器提交请求来完成的。
注意
Web3.py 支持每个实例一个供应商。如果您有一个需要多个供应商的高级用例,那么为每个连接创建并配置一个新的 web3 实例。
如果您已经愉快地连接到您的以太坊节点,那么您可以跳过供应商部分的其余部分。
## 选择如何连接到您的节点
大多数节点都有多种连接方式。如果您还没有决定使用哪种节点,请转到 如何选择使用哪种节点?T3】
连接到节点的最常见方式有:
- IPC(使用本地文件系统:最快、最安全)
- Websockets(远程工作,比 HTTP 更快)
- HTTP(更多节点支持)
如果你不确定如何决定,请选择以下方式:
- 如果您可以选择在与节点相同的计算机上运行 Web3.py,请选择 IPC。
- 如果必须连接到不同计算机上的节点,请使用 Websockets。
- 如果您的节点不支持 Websockets,请使用 HTTP。
大多数节点都有“关闭”连接选项的方法。我们建议关闭所有不使用的连接选项。这提供了一个更安全的设置:它减少了恶意黑客试图窃取你的以太的方法。
一旦决定了如何连接,就可以使用供应商来指定细节。供应商是为您想要的连接类型配置的 Web3.py 类。
参见:
例如,一旦您配置了您的提供商:
from web3 import Web3
my_provider = Web3.IPCProvider('/my/node/ipc/path')
然后,您就可以初始化 Web3 实例了,如下所示:
w3 = Web3(my_provider)
最后,你准备好 开始使用 Web3.py 。 ## 自动与手动供应商
如果没有指定供应商,Web3
对象将在几个标准位置寻找以太坊节点。当您像这样初始化时,会发生自动检测:
from web3.auto import w3
# which is equivalent to:
from web3 import Web3
w3 = Web3()
有时,web3 无法自动检测您的节点在哪里。
- 如果您不确定使用哪种连接方法,请参见 选择如何连接到您的节点 。
- 如果您知道连接方法,但不知道连接所需的其他信息(如 IPC 文件的路径),则需要在节点的配置中查找这些信息。
- 如果您不确定正在使用哪个节点,请参见 我如何选择使用哪个节点?T3】
要深入了解自动检测的工作原理,请参见:
### 自动检测的工作原理
Web3 尝试以下列顺序连接到节点,使用它可以建立的第一个成功连接:
- 由环境变量指定的连接,参见 供应商通过环境变量
IPCProvider
,寻找几个 IPC 文件位置。IPCProvider
不会自动检测 testnet 连接,如果用户想自动检测 testnet,建议使用来自web3.auto.infura
(如from web3.auto.infura.ropsten import w3
)的w3
实例。HTTPProvider
,试图连接到 http://localhost:8545None
-如果没有供应商成功,您仍然可以使用不需要连接的 Web3 APIs,例如:
一些节点提供了超出标准的 API。有时,相同的信息以不同的方式跨节点提供。如果您想要编写跨多个节点工作的代码,您可能想要查找您所连接的节点类型。
例如,以下代码检索 geth 和奇偶校验的客户端 enode 端点:
from web3.auto import w3
connected = w3.isConnected()
if connected and w3.clientVersion.startswith('Parity'):
enode = w3.parity.enode
elif connected and w3.clientVersion.startswith('Geth'):
enode = w3.geth.admin.nodeInfo['enode']
else:
enode = None
``` ### 通过环境变量提供程序
或者,您可以在启动脚本之前设置环境变量`WEB3_PROVIDER_URI`,web3 将首先寻找该供应商。
此环境变量的有效格式为:
* `file:///path/to/node/rpc-json/file.ipc`
* `http://192.168.1.2:8545`
* `https://node.ontheweb.com`
* `ws://127.0.0.1:8546` ## 自动初始化提供程序快捷方式
对于常见的提供程序,有几个自动初始化的快捷方式。
### Infura Mainnet
要轻松连接到 Infura Mainnet 远程节点,如果您在[https://infura.io/register](https://infura.io/register)没有项目 ID,请先注册一个免费的项目 ID。
然后用您的项目 ID 设置环境变量`WEB3_INFURA_PROJECT_ID`:
```py
$ export WEB3_INFURA_PROJECT_ID=YourProjectID
如果您选中了 Infura UI 中的复选框,表明请求需要一个可选的密钥,那么设置环境变量WEB3_INFURA_API_SECRET
:
$ export WEB3_INFURA_API_SECRET=YourProjectSecret
>>> from web3.auto.infura import w3
# confirm that the connection succeeded
>>> w3.isConnected()
True
获取开发授权证明
要使用默认值连接到geth --dev
授权证明实例:
>>> from web3.auto.gethdev import w3
# confirm that the connection succeeded
>>> w3.isConnected()
True
内置提供程序
Web3 附带了以下提供程序,它们适合连接到本地和远程 JSON-RPC 服务器。
HTTPProvider
*class* web3.providers.rpc.HTTPProvider(*endpoint_uri*[, *request_kwargs*, *session*])
这个供应商处理与基于 HTTP 或 HTTPS 的 JSON-RPC 服务器的交互。
endpoint_uri
应该是到 RPC 端点如'https://localhost:8545'
的完整 URI。对于运行在端口 80 上的 HTTP 连接和运行在端口 443 上的 HTTPS 连接后面的 RPC 服务器,可以从 URI 中省略该端口。request_kwargs
应该是一个关键字参数的字典,它将被传递到对节点发出的每个 http/https POST 请求上。session
允许您传递一个根据需要初始化的requests.Session
对象。
>>> from web3 import Web3
>>> w3 = Web3(Web3.HTTPProvider("http://127.0.0.1:8545"))
请注意,每个 python 进程应该只创建一个 HTTPProvider,因为 HTTPProvider 会回收底层 TCP/IP 网络连接,以获得更好的性能。
在幕后,HTTPProvider
使用 python 请求库来发出请求。如果您想修改请求的生成方式,您可以使用request_kwargs
来完成。一个常见的用例是增加每个请求的超时时间。
>>> from web3 import Web3
>>> w3 = Web3(Web3.HTTPProvider("http://127.0.0.1:8545", request_kwargs={'timeout': 60}))
要调整连接池的大小,您可以通过自己的requests.Session
。
>>> from web3 import Web3
>>> adapter = requests.adapters.HTTPAdapter(pool_connections=20, pool_maxsize=20)
>>> session = requests.Session()
>>> session.mount('http://', adapter)
>>> session.mount('https://', adapter)
>>> w3 = Web3(Web3.HTTPProvider("http://127.0.0.1:8545", session=session))
IPCProvider
*class* web3.providers.ipc.IPCProvider(*ipc_path=None*, *testnet=False*, *timeout=10*)
这个供应商处理与基于 IPC 套接字的 JSON-RPC 服务器的交互。
ipc_path
是 IPC 套接字的文件系统路径:
>>> from web3 import Web3
>>> w3 = Web3(Web3.IPCProvider("~/Library/Ethereum/geth.ipc"))
如果没有指定ipc_path
,它将使用从列表中找到的第一个 IPC 文件:
- 在 Linux 和 FreeBSD 上:
~/.ethereum/geth.ipc
~/.local/share/io.parity.ethereum/jsonrpc.ipc
~/.local/share/trinity/mainnet/ipcs-eth1/jsonrpc.ipc
- 在 Mac OS 上:
~/Library/Ethereum/geth.ipc
~/Library/Application Support/io.parity.ethereum/jsonrpc.ipc
~/.local/share/trinity/mainnet/ipcs-eth1/jsonrpc.ipc
- 在 Windows 上:
\\\.\pipe\geth.ipc
\\\.\pipe\jsonrpc.ipc
WebsocketProvider
*class* web3.providers.websocket.WebsocketProvider(*endpoint_uri*[, *websocket_timeout*, *websocket_kwargs*])
这个供应商处理与基于 WS 或 WSS 的 JSON-RPC 服务器的交互。
endpoint_uri
应该是到 RPC 端点如'ws://localhost:8546'
的完整 URI。websocket_timeout
是以秒为单位的超时,在通过连接接收或发送数据时使用。默认为 10。- 这应该是一个关键字参数的字典,它将被传递到 ws/wss websocket 连接上。
>>> from web3 import Web3
>>> w3 = Web3(Web3.WebsocketProvider("ws://127.0.0.1:8546"))
在幕后,WebsocketProvider
使用 python websockets 库来发出请求。如果您想修改请求的生成方式,您可以使用websocket_kwargs
来完成。参见 websockets 文档获取可用参数。
与 HTTP 连接不同,WS 连接的超时由单独的websocket_timeout
参数控制,如下所示。
>>> from web3 import Web3
>>> w3 = Web3(Web3.WebsocketProvider("ws://127.0.0.1:8546", websocket_timeout=60))
EthereumTesterProvider
警告
实验性的:这个供应商是实验性的。在功能上仍然有很大的差距。然而,它正在积极开发和支持。
*class* web3.providers.eth_tester.EthereumTesterProvider(*eth_tester=None*)
这个供应商与eth-tester
库集成在一起。eth_tester
构造函数参数应该是由eth-tester
库提供的EthereumTester
或BaseChainBackend
类的子类的实例。如果你想用一个定制的 eth-tester 实例进行测试,请参见eth-tester
库文档了解详情。
>>> from web3 import Web3, EthereumTesterProvider
>>> w3 = Web3(EthereumTesterProvider())
注意
要安装使用 EthereumTesterProvider 所需的依赖项,您可以安装 pip extras 包,其中包含测试所需的eth-tester
和py-evm
依赖项的正确互操作版本:例如pip install web3[tester]
自动供应商
AutoProvider
是在没有任何供应商的情况下初始化 web3.Web3
时使用的默认值。很少有理由明确地使用它。
异步提供程序
警告
此提供程序不稳定,在功能上仍有差距。不过正在积极开发中。
*class* web3.providers.async_rpc.AsyncHTTPProvider(*endpoint_uri*[, *request_kwargs*])
该提供程序异步处理与基于 HTTP 或 HTTPS 的 JSON-RPC 服务器的交互。
endpoint_uri
应该是到 RPC 端点如'https://localhost:8545'
的完整 URI。对于运行在端口 80 上的 HTTP 连接和运行在端口 443 上的 HTTPS 连接后面的 RPC 服务器,可以从 URI 中省略该端口。request_kwargs
应该是一个关键字参数的字典,它将被传递到对节点发出的每个 http/https POST 请求上。cache_async_session()
方法允许您使用自己的aiohttp.ClientSession
对象。这是一个异步方法,不是构造函数的一部分
>>> from aiohttp import ClientSession
>>> from web3 import Web3, AsyncHTTPProvider
>>> from web3.eth import AsyncEth
>>> from web3.net import AsyncNet
>>> from web3.geth import Geth, AsyncGethTxPool
>>> w3 = Web3(
... AsyncHTTPProvider(endpoint_uri),
... modules={'eth': (AsyncEth,),
... 'net': (AsyncNet,),
... 'geth': (Geth,
... {'txpool': (AsyncGethTxPool,),
... 'personal': (AsyncGethPersonal,),
... 'admin' : (AsyncGethAdmin,)})
... },
... middlewares=[] # See supported middleware section below for middleware options
... )
>>> custom_session = ClientSession() # If you want to pass in your own session
>>> await w3.provider.cache_async_session(custom_session) # This method is an async method so it needs to be handled accordingly
在幕后,AsyncHTTPProvider
使用 python aiohttp 库来发出请求。
支持的方法
古英语字母ð或-D
- T2
web3.eth.account
- T2
web3.eth.accounts
- T2
web3.eth.block_number
- T2
web3.eth.chain_id
- T2
web3.eth.coinbase
- T2
web3.eth.default_account
- T2
web3.eth.default_block
- T2
web3.eth.gas_price
- T2
web3.eth.hashrate
- T2
web3.eth.max_priority_fee
- T2
web3.eth.mining
- T2
web3.eth.syncing
- T2
web3.eth.call()
- T2
web3.eth.estimate_gas()
- T2
web3.eth.generate_gas_price()
- T2
web3.eth.get_balance()
- T2
web3.eth.get_block()
- T2
web3.eth.get_code()
- T2
web3.eth.get_logs()
- T2
web3.eth.get_raw_transaction()
- T2
web3.eth.get_raw_transaction_by_block()
- T2
web3.eth.get_transaction()
- T2
web3.eth.get_transaction_count()
- T2
web3.eth.get_transaction_receipt()
- T2
web3.eth.get_storage_at()
- T2
web3.eth.send_transaction()
- T2
web3.eth.send_raw_transaction()
- T2
web3.eth.wait_for_transaction_receipt()
网
web3.net.listening()
web3.net.peer_count()
web3.net.version()
Geth
- T2
web3.geth.admin.add_peer()
- T2
web3.geth.admin.datadir()
- T2
web3.geth.admin.node_info()
- T2
web3.geth.admin.peers()
- T2
web3.geth.admin.start_rpc()
- T2
web3.geth.admin.start_ws()
- T2
web3.geth.admin.stop_rpc()
- T2
web3.geth.admin.stop_ws()
web3.geth.personal.ec_recover()
- T2
web3.geth.personal.import_raw_key()
- T2
web3.geth.personal.list_accounts()
- T2
web3.geth.personal.list_wallets()
- T2
web3.geth.personal.lock_account()
- T2
web3.geth.personal.new_account()
- T2
web3.geth.personal.send_transaction()
web3.geth.personal.sign()
- T2
web3.geth.personal.unlock_account()
- T2
web3.geth.txpool.inspect()
- T2
web3.geth.txpool.content()
- T2
web3.geth.txpool.status()