2017-02-06 4 views
1

Ich versuche, Auftrag in Kraken durch API-Aufruf https://api.kraken.com/0/private/AddOrder hinzuzufügen. Ich habe EAPI gefunden: Ungültiger Nonce-Fehler beim Einfügen einer neuen Bestellung in Kraken. Rechts Nun füge ich immer nur eine Bestellung auf Knopfdruck ein, aber es kann vorkommen, dass mehrere Bestellungen eingefügt werden. Ich habe zu viele verschiedene Lösungen ausprobiert, um ein Nonce zu erzeugen. Aber immer noch das gleiche Problem. Weiß jemand was falsch ist?Kraken API: EAPI: Ungültige Nonce in C#

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); 
        } 
       } 
      } 
     } 
    } 

Antwort

0

Einige Austauschplattformen ermöglichen den Einsatz von Schwimmer Typ nonce, in Ihrem Fall, wie Sie Kraken verwenden und Kraken Api documentation nach,

nonce = immer ohne Vorzeichen steigende 64-Bit-integer

Kraken benötigen eine ganze Zahl.


Warum ungültige Nonce?

Meiner Meinung nach, tritt das Problem, wenn Sie mehr als eine Anforderung mit der gleichen nonce gesendet ...

Wenn Sie den Zeitstempel in einer ganzen Zahl konvertieren, werden Sie gesendet 1 Anfrage folglich nur dann erlaubt werden pro zweite (weil die Einschränkung in Bezug auf die ganze Zahl Nonce jede Sekunde ändert)

um die Fähigkeit, senden mehrere Anforderungen pro Sekunden zu haben, könnte man Spitzen um 1000 dann multiply Zeitstempel sein konvertieren auf ganzzahlige und verwende diesen Wert als Nonce.

nonce=integer(1000*timestamp) 

In diesem Fall, dass Sie mehr als 1 Anfrage pro Sekunde gesendet werden, (weil jeder nonce anders sein), aber das merken:

Austauschplattform haben Sicherheitsvorkehrungen getroffen gegen Missbrauch/DoS zu schützen Anschläge.