一、连接方式介绍
Providers
provider是web3与区块链对话的方式。提供程序接受JSON-RPC请求并返回响应。通常通过将请求提交到基于HTTP或IPC套接字的服务器来完成。
Note
Web3.py每个实例支持一个提供程序。如果您有需要多个提供程序的高级用例,请为每个连接创建并配置一个新的web3实例。
如果您已经很高兴地连接到以太坊节点,则可以跳过“提供者”部分的其余部分。
选择如何连接到您的节点
大多数节点具有多种连接方式。如果您尚未决定要使用哪种节点,请直接转到“我如何选择要使用的节点”?
连接到节点的最常见方法是:
1. IPC(使用本地文件系统:最快,最安全)
2. Websocket(远程工作,比HTTP快)
3. HTTP(更多节点支持它)
如果不确定如何决定,请选择以下方式:
-
如果可以选择在与节点相同的机器上运行Web3.py,请选择IPC。
-
如果必须连接到另一台计算机上的节点,请使用Websockets。
-
如果您的节点不支持Websocket,请使用HTTP。
大多数节点都有一种“关闭”连接选项的方式。我们建议关闭所有未使用的连接选项。这提供了更安全的设置:它减少了恶意黑客尝试窃取您的以太币的方式。
确定连接方式后,即可使用提供程序指定详细信息。提供程序是为所需的连接类型配置的Web3.py类。
以上摘自官方开发文档(详细介绍可自行前往查看):
https://web3py.readthedocs.io/en/stable/providers.html
二、具体连接方法
在连接以太坊区块链节点前必须要做的一件事是使用geth命令启动以太坊私链服务,不同的连接方式,对应着不同的geth启动命令,如果启动命令不对,用python连接的时候就会出现各种错误。
下面将着重介绍HTTP和WebSocket这两种连接方式和可能会遇到的问题
1.HTTP方式
geth命令
geth --datadir data0 --networkid 1108 --rpc console --port 30304 --rpcport 8545 --allow-insecure-unlock --rpc.allow-unprotected-txs
HTTP连接方式比较方便也比较简单,geth命令启动不需要太多的参数,不需要最后两个参数也可以连上。
重点参数解释:
--allow-insecure-unlock
功能:Allow insecure account unlocking when account-related RPCs are exposed by http
翻译:当http暴露与帐户相关的RPC时,允许不安全的帐户解锁
如果后期进行离线签名的时候,使用的是HTTP连接,默认情况下是不允许通过HTTP解锁账户的。
无此参数情况下,python离线签名遇到的错误
Fatal:Account unlock with HTTP access is forbidden!
--rpc.allow-unprotected-txs
功能:Allow for unprotected (non EIP155 signed) transactions to be submitted via RPC
翻译:允许通过RPC提交不受保护(非EIP155签名)的事务。
无此参数情况下,python离线签名遇到的错误:
only replay-protected (EIP-155) transactions allowed over RPC.
python代码:
from web3 import Web3
web3 = Web3(Web3.HTTPProvider("http://127.0.0.1:8545"))
if web3.eth.getBlock(0) is None:
print("failure")
elif web3.isConnected():
print("successfully")
2.Websocket方式
经过上述可以发现,通过HTTP方式连接到后期使用离线签名的话会遇到诸多麻烦,下面将介绍Websocket方式。
geth命令:
geth --datadir data0 --networkid 1108 --rpc console --port 30304 --rpccorsdomain "*" --ws --ws.port 8545 --ws.origins "*" --ws.addr "127.0.0.1" --ws.api "eth,web3,personal,net"
部分参数解释:
参数 | 功能 |
---|---|
–ws | 启用WS-RPC服务器 |
–ws.addr | WS-RPC服务器侦听接口(默认值:“ localhost”) |
–ws.port | WS-RPC服务器侦听端口(默认值:8546) |
–ws.api | 通过WS-RPC接口提供的API |
–ws.origins | 接受websocket请求的来源 |
以上几个都是比较重要的参数,如果没有使用可能会导致python在连接的时候出现错误。
例如:
websockets.exceptions.InvalidStatusCode: server rejected WebSocket connection: HTTP 200
python代码:
from web3 import Web3
web3 = Web3(Web3.WebsocketProvider("ws://127.0.0.1:8545", websocket_timeout=60))
if web3.eth.getBlock(0) is None:
print("failure")
elif web3.isConnected():
print("successfully")
提示:如果不明白以上geth命令中 --datadir data0 是什么意思,可以参考我的另一篇博客:geth搭建私有链节点,并开始挖矿
三、附言
关于geth命令的各参数可以使用如下命令:
geth -h > gethArgs.txt
这样就可以得到一个写有全部参数的文本文档。
或者需要查找某个具体参数用法,可以用:
geth -h | findstr (需要查找的参数名称)
如果还想了解更多web3py中API的用法可以前往官方开发文档查看:https://web3py.readthedocs.io/en/stable/