Zum Inhalt springen

API invalid nonce


maxmarkus

Empfohlene Beiträge

Hallo Leute, 

Ich versuche die API via node.js anzusprechen und hänge gerade daran eine korrekte nonce zu generieren. 
Habe die von mir generierte mit der php-sdk nonce verglichen und diese sind identisch. 

PHP: 1514544275122903
JS:    1514544275199262

Dennoch erhalte ich Code 4 Invalid nonce. Der Header ist so gesetzt: 

"X-API-NONCE": 1514544365557399,

Irgendwelche Ideen? 

Viele Grüße und schon mal einen guten Rutsch in ein erfolgreiches und gesundes 2018!
Markus

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 3 Wochen später...

Ich bekomme auch regelmäßig "Invalid nonce" obwohl ich 200ms zwischen 2 Anfragen warte (hatte ich hier mal als Empfehlung gelesen).

Ich glaube meine Scripte sind OK, es liegt also an bitcoin.de - haben andere API-Nutzer das Problem auch?

Kann bitcoin.de das Problem nicht mal beheben? Ist ja echt nervig.

Bearbeitet von coder
Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo,

Nonces dienen letztendlich (vereinfacht ausgedrückt) der Sequenzierung, d.h. sie sollen (u.a.) die richtige Reihenfolge der Anfragen sicherstellen. Wie in der bitcoin.de-Dokumentation beschrieben ist der verwendete Nonce-Wert völlig egal, solange er höher ist, als der Nonce-Wert der vorherigen Anfrage. Du brauchst also für *jeden* API-Call eine neue Nonce, deren Wert *höher* ist als der vorherige. Die PHP-API v1 (die neue habe ich mir nicht angesehen) nutzt z.B. den "normalen" UNIX-Timer (Unix-Epoche in Sekunden) als Nonce, der aber nur eine Auflösung von einer Sekunde hat, d.h. der Nonce-Wert ändert sich nur einmal pro Sekunde. Es kann also schon mal zu einer "Invalid Nonce" kommen (und bei 200ms im schlimmsten Fall halt 5), wenn du innerhalb einer Sekunde zwei (oder 5) Calls durchführst...

Wenn du das verhindern willst, muss dein Noncer höher auflösen (z.B. im Millisekunden-Bereich), oder du musst zwischen den Calls eine Sekunde warten ;)

Unter dem Strich hat das Problem also nichts mit bitcoin.de zu tun, zumal eine zu offensive Anfragestrategie über die Credits unterbunden wird.

Wie man so etwas programmtechnisch löst, zeigt z.B. die node.js-API von 4ley. Link habe ich gerade nicht parat, ist aber im Forum zu finden.

Gruß, Peter

  • Like 1
Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich benutze bereits Millisekunden. Ich gebe die Nonce zu Testzwecken aus und ich benutze NIE eine Nonce mehrmals sondern immer ansteigende Nonces.

Trotzdem bekomme ich regelmäßig den Fehler "Invalid Nonce".

Z.B. wenn ich kurz hintereinander die "Buy" und die "Sell" Hälfte des Orderbuchs abrufen möchte (geht ja leider nicht anders).

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 38 Minuten schrieb coder:

Ich benutze bereits Millisekunden. Ich gebe die Nonce zu Testzwecken aus und ich benutze NIE eine Nonce mehrmals sondern immer ansteigende Nonces.

Trotzdem bekomme ich regelmäßig den Fehler "Invalid Nonce".

Z.B. wenn ich kurz hintereinander die "Buy" und die "Sell" Hälfte des Orderbuchs abrufen möchte (geht ja leider nicht anders).

deswegen mache ich alle calls nacheinander. Also erst wenn ich eine Antwort habe, mach ich den nächsten. Dauert zwar etwas länger, aber das war früher noch schlimmer :D Früher hat jeder Call bei bitcoin.de ca 10 sekunden gedauert. Heute sinds "nur" noch ~4. 
bitcoin.de ist nicht für hochfrequenzhandel geeignet, nimm da lieber einen exchange.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Oh ja, Serpens hat natürlich recht - die Anfragen müssen nacheinander eingehen (sonst macht eine Nonce auch keinen Sinn). Du hast bei asynchronen Systemen wie z.B. nodejs über das Netzwerk bei einem zustandslosen Protokoll ja keine Garantie, dass deine Anfragen in der gleichen Reihenfolge verarbeitet werden in der sie in deinem Programm stehen (Proxy, Load-Balancing, unterbrochene Route, whatever). Beim Orderbuch ist das natürlich lästig - aber so sind die Regeln. Ich halte das Orderbuch über das WS-Interface aktuell - dann geht's... Und durch das Credits-Limit kann man eh nicht viel schneller handeln. Wenn das für dich nicht akzeptabel ist, solltest du dir die großen Exchanges wie coinbase/gdax, bitfinex oder kraken ansehen (die sich mittlerweile ja wieder berappelt haben). Da sind APIs  und Geschwindigkeit (meistens ;) ) top, aber auch da gibt es natürlich Limits.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Wie bereits geschrieben: Ich warte bereits 250ms ehe ich den zweiten Request losschicke. Das ist für einen Computer eine Ewigkeit, da könnte schon eine Antwort da sein selbst wenn sich die Server von bitcoin.de an der Westküste der USA befänden. Dem ist aber nicht so, ich habe einen roundtrip delay zu api.bitcoin.de von 15ms.

Ich vermute dass die beiden Server die hinter "api.bitcoin.de" stecken nicht schnell genug miteinander kommunizieren und wenn mein zweiter Request bei einem anderen Server eintrifft als der erste 250ms früher dann weiß der zweite Server noch nichts vom vorher verwendeten Nonce. Das Problem sollte bitcoin.de beheben.

In meinem konkreten Fall würde es auch helfen wenn es einen API Request gäbe der das gesamte Orderbuch lieferte (und bitte auch mehr als 20 Orders je Seite).

Vielleicht werde ich als Workaround mal versuchen nur eine der beiden IP-Adressen die sich hinter api.bitcoin.de verbergen zu benutzen.

Bearbeitet von coder
Link zu diesem Kommentar
Auf anderen Seiten teilen

Das Zeug läuft soweit ich weiss über cloudflare - da sind pings/traceroutes immer schnell und spiegeln nicht das reale Bild wider. Auch IP-Adressen sind da nicht in Stein gemeisselt. Was die Serverkommunikation angeht gebe ich dir recht - der bitcoin.de-Server gleicht sich wohl nicht schnell genug mit den cloudflare-Servern ab. Das lässt sich vielleicht mit neuer(er) Hardware (ich weiss nicht, was bitcoin.de da stehen hat, aber so schlecht wird es schon nicht sein), letztendlich aber nur mit einer dicke(re)n Leitung lösen. Und ja, das mit dem Orderbuch ist lästig, aber über Websockets kann man das recht gut handhaben.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich habe das an andere Stelle schon mal geschrieben, finde den Thread aber nicht wieder. Das invalidNonce Problem bei schnell aufeinander folgenden unterschiedlichen Abfragen lässt sich relativ einfach in den Griff bekommen. Die Nonce wird pro API-Key gezählt (wohingegen die Credits für alle API-Keys zusammen gelten). Wenn man mehrere API-Keys angelegt hat, kann man Anfragen auf diese verteilen und dafür sorgen, dass man pro Key nur alle 0.5s eine Anfrage stellt. Ich gebe zu, dass es etwas mehr Aufwand beim Setup ist, aber ich habe damit gute Erfahrungen gemacht.

Zum Thema komplette Markt: Ich kann mich Klicman nur anschließen, die WebsocketAPI ist recht gut durchdacht. Der Aktuelle BTCEUR Markt ist knapp 5.5k bzw. 2.2k Angebote (sell/buy) tief und aktuell gibt es Änderungen im Sekundentakt. Da ist es schon nicht unsinnig nur die Veränderung zur Verfügung zu stellen. Gleichzeitig ist keines der top100 Angebote aktuell älter als 20 Stunden. Wenn deine Software also 24 Stunden lang dem WS-Datenstrom zugehört hat, kannst du dir relativ sicher sein eine Gute Übersicht bekommen zu haben.

Wenn man mehrere Anfragen Express/SEPA/amount/fullKYC an die Buy/Sell Seite stellt, bekommt man etwa die ersten 100 Angebote direkt ausgeliefert.  

  • Like 2
Link zu diesem Kommentar
Auf anderen Seiten teilen

Erstelle ein Benutzerkonto oder melde Dich an, um zu kommentieren

Du musst ein Benutzerkonto haben, um einen Kommentar verfassen zu können

Benutzerkonto erstellen

Neues Benutzerkonto für unsere Community erstellen. Es ist einfach!

Neues Benutzerkonto erstellen

Anmelden

Du hast bereits ein Benutzerkonto? Melde Dich hier an.

Jetzt anmelden
×
×
  • Neu erstellen...

Wichtige Information

Wir haben Cookies auf Deinem Gerät platziert. Das hilft uns diese Webseite zu verbessern. Du kannst die Cookie-Einstellungen anpassen, andernfalls gehen wir davon aus, dass Du damit einverstanden bist, weiterzumachen.