在详细描述问题之前,我将简要地解释一下我的设置。
我是在Windows 10和使用geth客户端的光同步模式,以及web3.py木星笔记本和Metamask作为钱包。
我已经成功地连接到Rinkeby网络通过一个因弗拉节点,但现在我想做同样的使用geth。
因此,基本上,我希望类似于web3.py这样的东西能够与geth客户机进行通信。这两者都运行在同一台机器上,因此我认为没有理由在web3.py中使用HTTP提供程序。
我想使用web3.py的IPCProvider,而且我已经尝试过了,但是到目前为止还没有成功。
在光模式下启动geth之后,我在木星中尝试了这个;
from web3 import Web3
w3 = Web3(Web3.IPCProvider(''))
我将IPCProvider括号保留为空,因为它自动检测windows中geth管道的路径,也就是说(我尝试以字符串的形式手动输入路径,但它给了我错误,所以我使用了自动检测)
\.\pipe\geth.ipc
并对jupyter中的“w3”变量进行检验;
位于0x00000266CBEDB 080的web3.main.Web3对象
这意味着它确实是一个web3实例。
然而;
w3.isConnected()
结果是假的。尽管geth成功地在后台运行。
此外,使用任意web3函数都会导致操作系统错误。
例如,如果我想要一个帐户的清单;
w3.eth.accounts
将给予;
OSError:(5,“CreateFile”,“访问被拒绝”)
从windows上可用的很少的文档中,我了解到windows使用命名管道进行进程间通信,其中一个进程写入管道,另一个进程从管道读取。但是,差不多就是这样,没有任何有用的指南或教程可以恰当地说明如何实际使用windows管道。
我只想用IPC连接web3.py到geth。这样我就可以从web3.py接口向geth客户机发送命令
由于几乎没有关于带有windows的geth IPC的信息,我完全迷失了方向。
请帮帮我
发布于 2021-06-17 16:08:03
IPC构造函数允许您为IPC路径传递None (使用默认的Geth路径)。str(Path(ipc_path).expanduser().resolve())
存在一个问题。读取https://bugs.python.org/issue31842
您的解决方案是不指定IPC路径并依赖于self.ipc_path = get_default_ipc_path()
。
相关代码:
def __init__(
self,
ipc_path: Union[str, Path] = None,
timeout: int = 10,
*args: Any,
**kwargs: Any,
) -> None:
if ipc_path is None:
self.ipc_path = get_default_ipc_path()
elif isinstance(ipc_path, str) or isinstance(ipc_path, Path):
self.ipc_path = str(Path(ipc_path).expanduser().resolve())
else:
raise TypeError("ipc_path must be of type string or pathlib.Path")
尝试:
w3 = Web3(Web3.IPCProvider())
或(当Python Issue31842被修复时)
w3 = Web3(Web3.IPCProvider(web3.providers.ipc.get_default_ipc_path()))
https://ethereum.stackexchange.com/questions/76036
复制相似问题