跳转至

供应商

原文:https://web3py.readthedocs.io/en/stable/providers.html

提供商是 web3 与区块链对话的方式。供应商接受 JSON-RPC 请求并返回响应。这通常是通过向基于 HTTP 或 IPC 套接字的服务器提交请求来完成的。

注意

Web3.py 支持每个实例一个供应商。如果您有一个需要多个供应商的高级用例,那么为每个连接创建并配置一个新的 web3 实例。

如果您已经愉快地连接到您的以太坊节点,那么您可以跳过供应商部分的其余部分。

## 选择如何连接到您的节点

大多数节点都有多种连接方式。如果您还没有决定使用哪种节点,请转到 如何选择使用哪种节点?T3】

连接到节点的最常见方式有:

  1. IPC(使用本地文件系统:最快、最安全)
  2. Websockets(远程工作,比 HTTP 更快)
  3. 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 无法自动检测您的节点在哪里。

要深入了解自动检测的工作原理,请参见:

### 自动检测的工作原理

Web3 尝试以下列顺序连接到节点,使用它可以建立的第一个成功连接:

  1. 由环境变量指定的连接,参见 供应商通过环境变量
  2. IPCProvider ,寻找几个 IPC 文件位置。IPCProvider不会自动检测 testnet 连接,如果用户想自动检测 testnet,建议使用来自web3.auto.infura(如from web3.auto.infura.ropsten import w3)的w3实例。
  3. HTTPProvider ,试图连接到 http://localhost:8545
  4. None -如果没有供应商成功,您仍然可以使用不需要连接的 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库提供的EthereumTesterBaseChainBackend类的子类的实例。如果你想用一个定制的 eth-tester 实例进行测试,请参见eth-tester文档了解详情。

>>> from web3 import Web3, EthereumTesterProvider
>>> w3 = Web3(EthereumTesterProvider()) 

注意

要安装使用 EthereumTesterProvider 所需的依赖项,您可以安装 pip extras 包,其中包含测试所需的eth-testerpy-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
  • web3.net.listening()
  • web3.net.peer_count()
  • web3.net.version()
Geth

支持的中间件



回到顶部