使用Web3连接Rinkeby测试网:本地Geth正常,Infura连接报错求助
解决Web3连接Infura Rinkeby节点报错的问题
嘿,我之前也踩过Infura连接的坑,来帮你捋捋问题所在!结合你描述的情况(本地Geth能正常连,Infura连不上),大概率是这几个原因:
1. Infura的公开端点早就改规则了!
你用的https://rinkeby.infura.io/是旧版的无项目ID端点,现在Infura已经不支持这种公开访问了,必须用带项目ID的专属端点。步骤很简单:
- 去Infura注册个免费账号,新建一个Rinkeby网络的项目
- 复制项目里的端点,格式是
https://rinkeby.infura.io/v3/你的项目ID - 替换成这个端点再初始化Web3:
var web3 = new Web3('https://rinkeby.infura.io/v3/你的项目ID');
2. Web3版本不匹配导致的写法问题
不同版本的Web3.js初始化方式不一样,你可以先在控制台敲web3.version看看版本:
- 如果是v1.x及以上,你原来的写法(直接传URL)是对的,但要确保端点是带项目ID的
- 如果是v0.x版本,得换这种写法:
var web3 = new Web3(new Web3.providers.HttpProvider('https://rinkeby.infura.io/v3/你的项目ID'));
3. 浏览器环境下的CORS跨域坑
要是你在本地静态HTML文件(file://开头的地址)里跑代码,浏览器会因为CORS限制拦截请求。解决办法:
- 把页面放到本地服务器上跑,比如用Python的
python -m http.server或者Node的http-server - 测试阶段可以临时禁用浏览器的CORS限制(注意别在生产环境这么搞)
4. 别调用Infura不支持的API!
对比你本地Geth的启动命令,你开了personal这类敏感API,但Infura的公共节点是不开放这些的。如果你的代码里调用了personal.unlockAccount这类接口,肯定会报错,这点要注意区分本地节点和公共节点的权限差异。
最后可以先验证下端点是否正常:在终端跑这个curl命令(替换成你的项目ID):
curl https://rinkeby.infura.io/v3/你的项目ID -X POST -H "Content-Type: application/json" -d '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}'
如果返回带区块号的JSON,说明端点没问题,再回头查Web3代码的问题就行。
内容的提问来源于stack exchange,提问作者rofls
相关产品推荐
相关产品推荐

