通过 WSS 连接到本地网络上运行的 Polkadot Full Noder 失败

Min*_*Duc 4 blockchain cryptocurrency substrate polkadot-js polkadot

我已经设置了一个在 192.168.2.254 的本地服务器上运行的完整节点。我只是想制作一个简单的脚本,基本上是订阅区块链上的新头。

\n
const { ApiPromise, WsProvider } = require(\'@polkadot/api\');\n\nasync function main () {\n  const wsProvider = new WsProvider(\'wss://192.168.2.254:9944\');\n  const api = await ApiPromise.create({ provider: wsProvider });\n\n  let count = 0;\n\n  const unsubscribe = await api.rpc.chain.subscribeNewHeads((header) => {\n    console.log(`Chain is at block: #${header.number}`);\n\n    if (++count === 256) {\n      unsubscribe();\n      process.exit(0);\n    }\n  });\n}\n\nmain().catch(console.error);\n
Run Code Online (Sandbox Code Playgroud)\n

在服务器上,我还按照 Polkadot wiki 的建议使用自签名 ssl 证书设置了 nginx。这是块配置:

\n
server {\n        server_name 192.168.2.254\n\n        root /var/www/html;\n        index index.html;\n\n        location / {\n                try_files $uri $uri/ =404;\n\n                proxy_pass http://localhost:9944;\n                proxy_set_header X-Real-IP $remote_addr;\n                proxy_set_header Host $host;\n                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n\n                proxy_http_version 1.1;\n                proxy_set_header Upgrade $http_upgrade;\n                proxy_set_header Connection "upgrade";\n        }\n\n        listen [::]:443 ssl ipv6only=on;\n        listen 443 ssl;\n        ssl_certificate /etc/ssl/certs/nginx-selfsigned.crt;\n        ssl_certificate_key /etc/ssl/private/nginx-selfsigned.key;\n\n        ssl_session_cache shared:cache_nginx_SSL:1m;\n        ssl_session_timeout 1440m;\n\n        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;\n        ssl_prefer_server_ciphers on;\n\n        ssl_ciphers "ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS";\n\n        ssl_dhparam /etc/ssl/certs/dhparam.pem;\n}\n
Run Code Online (Sandbox Code Playgroud)\n

如果我直接在服务器上运行脚本,默认情况下没有配置提供程序(它将使用 ws://127.0.0.1:9944),则没有问题。但是当我在本地计算机上运行它以指向 wss://192.168.2.254:9944 时,输出为连接失败,代码为1006

\n

节点listenToBlock.js \xe2\x94\x80\xe2\x95\xaf

\n
2020-09-10 14:19:29          API-WS: disconnected from ws://192.168.2.254:9944 code: \'1006\' reason: \'connection failed\'\n_Event {\n  type: \'error\',\n  isTrusted: false,\n  _yaeti: true,\n  target:\n   W3CWebSocket {\n     _listeners: {},\n     addEventListener: [Function: _addEventListener],\n     removeEventListener: [Function: _removeEventListener],\n     dispatchEvent: [Function: _dispatchEvent],\n     _url: \'ws://192.168.2.254:9944\',\n     _readyState: 3,\n     _protocol: undefined,\n     _extensions: \'\',\n     _bufferedAmount: 0,\n     _binaryType: \'arraybuffer\',\n     _connection: undefined,\n     _client:\n      WebSocketClient {\n        _events: [Object: null prototype] {},\n        _eventsCount: 0,\n        _maxListeners: undefined,\n        config: [Object],\n        _req: null,\n        protocols: [],\n        origin: undefined,\n        url: [Url],\n        secure: false,\n        base64nonce: \'cUJFFas2Ec3aN5YlHSxehg==\' },\n     onclose: [Function: value],\n     onerror: [Function: value],\n     onmessage: [Function: value],\n     onopen: [Function: value] },\n  cancelable: true,\n  stopImmediatePropagation: [Function] }\n2020-09-10 14:19:30          API-WS: disconnected from ws://192.168.2.254:9944 code: \'1006\' reason: \'connection failed\'\n2020-09-10 14:19:31          API-WS: disconnected from ws://192.168.2.254:9944 code: \'1006\' reason: \'connection failed\'\n
Run Code Online (Sandbox Code Playgroud)\n

在浏览器中接受未经验证的证书后,我还尝试成功使用https://polkadot.js.org/apps/#/explorer并将开发端点设置为 wss://192.168.2.254 。

\n

我最好的猜测是来自本地计算机上的脚本的连接也需要接受未经验证的证书,但我找不到任何文档来帮助解决这个问题。我感谢您的任何帮助!

\n

Min*_*Duc 7

在端点 url 中,提供端口 9944 是错误的,因为 wss 始终默认使用端口 443。

我通过运行脚本解决了这个问题

NODE_TLS_REJECT_UNAUTHORIZED=0 node listenToBlock.js
Run Code Online (Sandbox Code Playgroud)

对于开发环境来说似乎是一个不错的解决方法。