Alcuni bug falliscono ogni volta. Altri falliscono secondo uno schema. Il difetto di firma di Huobi e HTX corretto nella 2026.9 era del secondo tipo, ed era per questo molto più difficile da individuare: su un host in esecuzione fuori dal fuso UTC, le richieste private fallivano per parte di ogni giornata e funzionavano per il resto, il che sembra esattamente un problema di autenticazione intermittente, almeno finché qualcuno non nota che lo schema coincide con l'orologio.
Un timestamp costruito da due orologi diversi
Huobi e HTX richiedono entrambi che la richiesta firmata contenga un timestamp in UTC, formattato come yyyy-MM-ddTHH:mm:ss. La routine di firma in TsgcWS_API_Huobi_Base, condivisa sia da TsgcWSAPI_Huobi che da TsgcWSAPI_HTX, costruiva quel timestamp a partire da due fonti diverse: la parte della data proveniva dall'orologio locale di sistema, la parte dell'orario proveniva dall'UTC. Per la maggior parte della giornata sulla maggior parte delle macchine, la data locale e la data UTC coincidono, quindi nulla sembrava sbagliato. Vicino alla mezzanotte UTC, su qualsiasi host il cui offset di fuso orario locale lo collocasse dall'altro lato di quel confine, la data e l'orario smettevano di coincidere tra loro, la firma calcolata da Huobi sul proprio lato non corrispondeva più, e la richiesta veniva rifiutata.
La correzione prende sia la data che l'orario dallo stesso valore UTC:
uses
sgcBase_Helpers;
var
vUTC: TDateTime;
vTimeStamp: string;
begin
vUTC := sgcGetDateTimeAsUTC;
vTimeStamp := FormatDateTime('yyyy-mm-dd', vUTC) + 'T' +
FormatDateTime('hh:nn:ss', vUTC);
end;
Non c'è nulla da configurare. TsgcWSAPI_Huobi e TsgcWSAPI_HTX chiamano entrambi questa stessa routine di firma, quindi vengono corretti insieme:
uses
sgcWebSocket, sgcWebSocket_APIs;
var
oHuobi: TsgcWSAPI_Huobi;
begin
oHuobi := TsgcWSAPI_Huobi.Create(nil);
oHuobi.Client := oClient;
oHuobi.Huobi.ApiKey := 'your_api_key';
oHuobi.Huobi.ApiSecret := 'your_api_secret';
oClient.Active := True;
// Authentication now signs with a timestamp taken entirely from UTC.
oHuobi.SubscribeOrderUpdates('btcusdt');
end;
Se i tuoi log mostrano richieste private a Huobi o HTX che falliscono in un modo che sembrava andare e venire senza un trigger chiaro, è molto probabile che questa sia la causa, in particolare se i tuoi server non sono in esecuzione in UTC.
Sottoscrizioni private perse alla riconnessione
Huobi era anche uno dei diversi client di exchange interessati da un difetto di riconnessione separato, corretto nella stessa release: dopo che il WatchDog si riconnetteva, le sottoscrizioni private, ordini, saldi, esecuzioni, non venivano ripristinate. La riconnessione in sé riusciva e veniva registrata come tale, quindi non c'era nulla che indicasse che i feed privati ricevuti prima della disconnessione fossero ora scomparsi silenziosamente. Quel ripristino ora fa parte dello stesso percorso di ri-sottoscrizione che già ripristina le sottoscrizioni ai dati di mercato pubblici dopo una riconnessione.
Aggiornamento
Entrambe le correzioni sono immediate. Non c'è nessuna proprietà da impostare né codice da modificare, la firma è semplicemente corretta ora, e il ripristino alla riconnessione ora include anche le tue sottoscrizioni private.
Domande, feedback o assistenza nella migrazione? Contattaci — riceverai una risposta da chi ha scritto il codice.
