【问题标题】:AWS Etheruem Node Websocket Connection Keeps CLosingAWS 以太坊节点 Websocket 连接保持关闭
【发布时间】:2021-08-03 06:06:39
【问题描述】:

我正在尝试使用托管 AWS 以太坊节点订阅以太坊区块链。我按照这里的教程进行操作:https://docs.aws.amazon.com/managed-blockchain/latest/ethereum-dev/ethereum-json-rpc.html(标题为使用 web3.js 通过 WebSockets 对托管区块链上的以太坊节点进行以太坊 API 调用的部分)

一切正常,所以我在 pm2 上启动了该进程,但后来我回来发现 websocket 连接失败并显示以下错误消息:Error: CONNECTION ERROR: The connection got closed with the close code '1001' and the following reason string 'Going away'

处理这个问题的最佳策略是什么? AWS 提供了一个帮助脚本(见下文),但我认为我需要更改此代码以处理 websocket 断开连接。我对 Node 和 websockets 都很陌生,所以我很感激任何指点!

/////////////////////////////////////////////////////
// Authored by Carl Youngblood
// Senior Blockchain Solutions Architect, AWS
// Adapted from web3 npm package v1.3.0
// licensed under GNU Lesser General Public License
// https://github.com/ethereum/web3.js
/////////////////////////////////////////////////////

import AWS from 'aws-sdk';
import WebsocketProvider  from 'web3-providers-ws';
import pkg from 'websocket';
const { w3cwebsocket } = pkg;
const Ws = w3cwebsocket;

export default class AWSWebsocketProvider extends WebsocketProvider {
  connect() {
    const region = process.env.AWS_DEFAULT_REGION || 'us-east-1';
    const credentials = new AWS.EnvironmentCredentials('AWS');
    const host = new URL(this.url).hostname;
    const endpoint = new AWS.Endpoint(`https://${host}/`);
    const req = new AWS.HttpRequest(endpoint, region);
    req.method = 'GET';
    req.body = '';
    req.headers['host'] = host;
    const signer = new AWS.Signers.V4(req, 'managedblockchain');
    signer.addAuthorization(credentials, new Date());
    const headers = {
      'Authorization': req.headers['Authorization'],
      'X-Amz-Date': req.headers['X-Amz-Date'],
      ...this.headers
    }
    this.connection = new Ws(this.url, this.protocol, undefined, headers, this.requestOptions, this.clientConfig);
    this._addSocketListeners();
  }
}

这是我调用它并订阅区块链的代码

import Web3 from 'web3';
import AWSWebsocketProvider from "./aws-websocket-provider.js";
...
const web3 = new Web3(new AWSWebsocketProvider(endpoint));
var subscription = web3.eth.subscribe('newBlockHeaders', function(error, result) {
  if (error) {
    console.log(error);
  }
  else {
    analyze(result);
  }
});

【问题讨论】:

    标签: node.js websocket amazon-managed-blockchain


    【解决方案1】:

    我是 AWS 的高级区块链专家,很高兴在这里为您提供帮助。

    您可以传递其他选项作为第二个参数,指定 keep-alive 和 reconnect-on-failure 选项,其方式与 Web3.js 处理它的方式完全相同。简而言之:

    new AWSWebsocketProvider(endpoint, options)
    

    根据你提供的代码,可以改成如下:

    
    import Web3 from 'web3';
    import AWSWebsocketProvider from "./aws-websocket-provider.js";
    
    var options = {
        timeout: 30000, // ms
    
        clientConfig: {
          // Useful if requests are large
          maxReceivedFrameSize: 100000000,   // bytes - default: 1MiB
          maxReceivedMessageSize: 100000000, // bytes - default: 8MiB
    
          // Useful to keep a connection alive
          keepalive: true,
          keepaliveInterval: 60000 // ms
        },
    
        // Enable auto reconnection
        reconnect: {
            auto: true,
            delay: 5000, // ms
            maxAttempts: 5,
            onTimeout: false
        }
    };
    
    const web3 = new Web3(new AWSWebsocketProvider(endpoint, options));
    
    

    请注意,此功能在 Web3.js v1.2.7 上可用。

    参考资料:

    【讨论】:

    • 哇,谢谢!我将尝试一下,然后将您的答案标记为已接受的答案
    • 似乎它仍在关闭,尽管它不再抛出该错误消息。我尝试查找有关这些选项的文档,但它一直将我引向这个,这是相当稀疏的:github.com/theturtle32/WebSocket-Node/blob/v1.0.31/docs/…
    • 是的,我也还在关门
    猜你喜欢
    • 1970-01-01
    • 2015-11-13
    • 1970-01-01
    • 1970-01-01
    • 2013-04-17
    • 2021-03-10
    • 1970-01-01
    • 2022-07-25
    • 1970-01-01
    相关资源
    最近更新 更多