错误:Nonce太小 - Bitfinex api

时间:2017-10-05 07:32:31

标签: rest nonce

我尝试使用bitfinex库(https://www.npmjs.com/package/bitfinex)从Bitfinex调用rest API。当使用相同的API密钥同时运行多个进程时,文档警告此错误。但是,我相信我只是立即运行一个进程,即使我生成新的API密钥,错误仍然会发生。我正在考虑重写nonce或扩展它但我不知道如何做到这一点。我曾在互联网上尝试过一些建议,但仍然无效。

以下是我的参考代码:

import Bitfinex = require('bitfinex');
import pollingtoevent = require('polling-to-event');
import { Logger, LoggerFactory } from '../../common';
import { AppDataServices } from '../../data';

export class BitfinexPoller {
  private static readonly LOGGER: Logger = LoggerFactory.getLogger();
  private bitfinex: any = undefined;
  private emitter: any = undefined;
  private public_key: string = '<my-public-key>';
  private secret_key: string = '<my-secret-key>';
  private nonce: any = new Date().getTime();

  constructor(private appServices: AppDataServices) {
    BitfinexPoller.LOGGER.info('Bitfinex poller init');

    this.bitfinex = new Bitfinex(this.public_key, this.secret_key, this.nonce);

    // Lend book service
    this.emitter = pollingtoevent((done: any) => {
      this.bitfinex.lendbook('USD', (err: any, res: any, orderId: any) => {
        done(err, res);
      });
    }, { interval: 30000, eventName: 'bitfinex-lending' });

    this.emitter.on('bitfinex-lending', (data: any) => {
      BitfinexPoller.LOGGER.info(data);
      if (data.bids !== undefined) {
        for (const row of data.bids) {
          appServices.lendbookService.insert(BitfinexPoller.lendingData('BID', row));
        }
      }
      if (data.asks !== undefined) {
        for (const row of data.asks) {
          appServices.lendbookService.insert(BitfinexPoller.lendingData('ASK', row));
        }
      }
    });

    // Order book service
    this.emitter = pollingtoevent((done: any) => {
      this.bitfinex.orderbook('btcusd', (err: any, res: any, orderId: any) => {
        done(err, res);
      });
    }, { interval: 30000, eventName: 'bitfinex-order' });

    this.emitter.on('bitfinex-order', (data: any) => {
      BitfinexPoller.LOGGER.info(data);
      if (data.bids !== undefined) {
        for (const row of data.bids) {
          appServices.lendbookService.insert(BitfinexPoller.orderData('BID', row));
        }
      }
      if (data.asks !== undefined) {
        for (const row of data.asks) {
          appServices.lendbookService.insert(BitfinexPoller.orderData('ASK', row));
        }
      }
    });
  }
}

2 个答案:

答案 0 :(得分:5)

您最有可能快速连续发起两次经过身份验证的呼叫。您发送请求的顺序并不总是与它们处理的顺序相同,因此首先处理具有较高nonce的第二个请求,导致第一个请求失败。

您可以为不同的请求创建和使用多个API密钥,或者拥有一个循环使用的池,这样您就不会连续多次使用相同的api密钥。

答案 1 :(得分:0)

我对nodejs的解决方案是通过promise延迟调用。

类似这样的东西:

function sleep(millis) {
  return new Promise(resolve => setTimeout(resolve, millis));
}

sleep(500).then(() => {
   //do work
  });
  sleep(600).then(() => {
   //do work
  });

很明显,如果您正在寻找极低的延迟和极高的速度,那么这不适合您。