Kraken API:EAPI:c#中的nonce无效

时间:2017-02-06 06:14:04

标签: asp.net api c#-4.0

我正在尝试通过API调用https://api.kraken.com/0/private/AddOrder在Kraken中添加订单。我发现EAPI:在Kraken中插入新订单时出现无效的nonce错误。现在我只在按钮点击时一次只插入一个订单,但可能会出现插入多个订单的情况。我已经尝试了太多不同的解决方案来生成一个nonce但是,仍然发现了同样的问题。有人知道什么是错的吗?

private JsonObject QueryPrivate(string a_sMethod, string props = null)
    {
        // generate a 64 bit nonce using a timestamp at tick resolution

         Int64 nonce = DateTime.Now.Ticks;


        props =  "nonce=" + nonce + props;


        string path = string.Format("/{0}/private/{1}", _version, a_sMethod);
        string address = _url + path;
        HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(address);
        webRequest.ContentType = "application/x-www-form-urlencoded";
        webRequest.Method = "POST";
        webRequest.Headers.Add("API-Key", _key);


        byte[] base64DecodedSecred = Convert.FromBase64String(_secret);

        var np = nonce + Convert.ToChar(0) + props;

        var pathBytes = Encoding.UTF8.GetBytes(path);
        var hash256Bytes = sha256_hash(np);
        var z = new byte[pathBytes.Count() + hash256Bytes.Count()];
        pathBytes.CopyTo(z, 0);
        hash256Bytes.CopyTo(z, pathBytes.Count());

        var signature = getHash(base64DecodedSecred, z);

        webRequest.Headers.Add("API-Sign", Convert.ToBase64String(signature));

        if (props != null)
        {

            using (var writer = new StreamWriter(webRequest.GetRequestStream()))
            {
                writer.Write(props);
            }
        }

        //Make the request
        try
        {
            //Wait for RateGate
            _rateGate.WaitToProceed();

            using (WebResponse webResponse = webRequest.GetResponse())
            {
                using (Stream str = webResponse.GetResponseStream())
                {
                    using (StreamReader sr = new StreamReader(str))
                    {
                        string data = sr.ReadToEnd();
                        dynamic d = JObject.Parse(data);
                        return (JsonObject)JsonConvert.Import(data);
                    }
                }
            }
        }
        catch (WebException wex)
        {
            using (HttpWebResponse response = (HttpWebResponse)wex.Response)
            {
                using (Stream str = response.GetResponseStream())
                {
                    using (StreamReader sr = new StreamReader(str))
                    {
                        string data = sr.ReadToEnd();

                        if (response.StatusCode != HttpStatusCode.InternalServerError)
                        {
                            throw;
                        }
                        return (JsonObject)JsonConvert.Import(sr);
                    }
                }
            }
        }
    }

1 个答案:

答案 0 :(得分:0)

某些交换平台允许使用浮点类型 nonce,在您使用Kraken时根据Kraken Api documentation使用

  

nonce =总是增加无符号64位整数

Kraken将需要整数nonce

为什么无效的nonce?

在我看来,当您使用相同的nonce发送多个请求时会出现问题...

当您将时间戳转换为整数时,您将被允许每秒仅发送1个请求(因为相对于每秒更改的整数随机数的限制)

为了能够每秒发送多个请求,一个提示可能是将时间戳乘以1000然后转换为整数并使用此值作为随机数。

nonce=integer(1000*timestamp)

在这种情况下,您可能每秒发送超过1个请求(因为每个nonce将不同)但请记住:

  

交流平台有保障措施以防范   滥用/ DoS攻击。