Aller au contenu

Prix d’oracle obsolètes

Le prix d’un oracle est obsolète pour un consommateur lorsque l’heure de mise à jour documentée dépasse l’âge maximal admis pour l’action concernée ; une gestion sûre exige aussi la validité du flux, le contrôle du séquenceur, des solutions de repli et une reprise maîtrisée.

Mis à jour

À des fins éducatives uniquement ; ne constitue ni un conseil en investissement ni une recommandation d’investissement. Les investissements peuvent entraîner des pertes.

Réponse directe

La valeur d’un oracle est obsolète pour une action donnée lorsque age = consumerClock - sourceTimestamp dépasse le maxAge configuré pour cette action. Un prix inchangé peut rester récent, tandis qu’une valeur publiée récemment peut être économiquement erronée. Le consommateur doit d’abord rejeter les horodatages absents ou futurs et les réponses invalides, puis appliquer une politique d’acceptation propre au flux, à l’actif, à la blockchain, aux heures de marché et à l’action.

Le heartbeat et les seuils de déviation sont des déclencheurs de publication, non des garanties de fraîcheur ni des engagements de niveau de service. Un rapport peut être retardé après un déclenchement, et le marché peut évoluer sous le seuil alors qu’une action impose un âge maximal plus strict. Les oracles pull ajoutent une autre limite : l’appelant peut devoir soumettre une mise à jour authentifiée avant la lecture, et le contrat doit rejeter toute mise à jour plus ancienne que sa limite déclarée.

Sur une L2, l’état du séquenceur et le délai de grâce après son rétablissement forment une barrière distincte. La franchir ne prouve ni la fraîcheur du prix, ni la finalité de la L2, ni l’égalité d’accès entre utilisateurs. Les sources de repli et les derniers prix valides sont des modes contrôlés de fonctionnement dégradé, pas la vérité ; chaque source et chaque chemin de reprise doit préciser unités, horodatages, indépendance, autorisations, actions permises et règles de rapprochement.

Fonctionnement

  1. Fixer la blockchain, le bloc et l’horloge, le contrat consommateur et l’action, le proxy et l’agrégateur du flux, la paire et ses décimales, la version d’interface, la configuration de repli et l’état des mises à niveau.
  2. Lire la réponse exacte par l’interface déployée et traiter les reverts ou l’absence de données. Valider la réponse, le statut ou la confiance le cas échéant, sourceTimestamp != 0 et sourceTimestamp <= consumerClock avant toute soustraction.
  3. Consigner le heartbeat, la déviation, les heures de marché et la configuration de publication, puis définir un maxAge indépendant pour chaque action. Expliciter la frontière, par exemple accepter age <= maxAge et rejeter age > maxAge.
  4. Sur les déploiements L2 pris en charge, valider l’initialisation et l’état du flux du séquenceur, calculer le temps depuis la reprise à partir du champ documenté et imposer le délai de grâce configuré avant de contrôler séparément la fraîcheur du prix.
  5. Retracer chaque composante nécessaire des prix composites, ratios et solutions de repli. Normaliser le sens et les unités, puis borner la fraîcheur effective par la dépendance nécessaire la plus ancienne plutôt que par l’horodatage le plus récent.
  6. Définir des états normal, dégradé et suspendu pour chaque action. Nouvel emprunt, émission ou effet de levier peuvent échouer en mode fermé, tandis que remboursement ou ajout de garantie restent possibles ; tester prix obsolètes, de repli et repris au regard de l’exposition, de la liquidité et de la capacité des keepers.
  7. Surveiller changements de source et de proxy, latence, taux de rejet, séquenceur, divergence entre sources et heures de marché ; répéter les scénarios de panne, échec du repli, saut à la reprise, liquidations concentrées, MEV, comptabilisation des créances irrécouvrables et retour au mode normal.

Dans les interfaces de type Chainlink, latestRoundData() peut exposer un identifiant de round, une réponse signée, une heure de début, une heure de mise à jour et un ancien champ de round. L’API actuelle indique que answeredInRound est obsolète ; une ancienne comparaison ne doit donc pas être présentée comme règle actuelle universelle : il faut examiner précisément le proxy, l’agrégateur et l’implémentation. Un horodatage indique quand l’état documenté du flux a été mis à jour, pas que la valeur est exécutable pour n’importe quelle taille. En Solidity, block.timestamp est l’horodatage du bloc courant sous les contraintes du consensus, et non une horloge civile externe.

Exemples détaillés

  • Limite d’âge maximal. Soit consumerClock = 1,800,000,000 et sourceTimestamp = 1,799,999,100, donc age = 900 seconds = 15 minutes. Une règle maxAge = 600 seconds rejette la valeur avec 300 seconds de dépassement ; une règle maxAge = 1,200 seconds l’accepte avec 300 seconds de marge. Une même valeur peut donc être recevable pour une action et obsolète pour une autre.
  • Déclencheur ne signifie pas fraîcheur. Le dernier prix publié est 100.00, le seuil de déviation est 1% et le heartbeat 3,600 seconds. Après 2,700 seconds, un prix de marché observé à 100.80 ne s’écarte que de 0.8% ; aucun des déclencheurs pédagogiques n’a donc été atteint. À 101.20, la déviation vaut 1.2% et peut amorcer une publication, mais le consommateur lit encore 100.00 jusqu’à l’inclusion d’un nouveau rapport valide.
  • Double barrière L2. Un flux de séquenceur le déclare opérationnel avec startedAt = 1,799,996,400, consumerClock = 1,800,000,000 et grace = 3,600 seconds ; exactement 3,600 seconds se sont écoulées. Avec une règle qui bloque tant que elapsed <= grace, l’action reste bloquée et devient admissible à 3,601 seconds. L’admissibilité dépend encore de l’horodatage du prix, de la réponse et de tous les autres contrôles.
  • Seuil brutal de reprise. Avec 10 ETH de garantie, 12,000 USD de dette et un seuil de liquidation de 75%, une valeur obsolète de 2,000 USD/ETH donne healthFactor = 10 * 2,000 * 0.75 / 12,000 = 1.25. Une valeur reprise de 1,400 USD/ETH donne 0.875. Selon ces hypothèses pédagogiques, le compte devient liquidable, mais l’exécution dépend encore des règles, de la liquidité, des keepers, du gas, de l’ordonnancement et de la disponibilité de la blockchain.

Risques

  • Blockchain, flux, proxy, agrégateur, paire d’actifs ou version d’interface incorrects.
  • Le consommateur lit une réponse sans horodatage ni statut documenté.
  • Un horodatage nul ou futur, ou une soustraction en sous-dépassement, n’est pas rejeté.
  • L’âge maximal est trop permissif pour l’actif, l’action, les horaires ou la volatilité.
  • L’âge maximal est trop strict et provoque un déni de service ou empêche la réduction du risque.
  • Le heartbeat est pris pour une échéance garantie ou un engagement de service.
  • Une dérive ou un basis sous le seuil s’accumule sans déclencher la déviation.
  • Un rapport déclenché est retardé par la source, les signataires, le réseau, le gas, le relais ou la blockchain.
  • Un contrôle de round obsolète ou propre à une implémentation est appliqué universellement.
  • Les changements de flux, proxy, agrégateur, heartbeat, déviation ou interface passent inaperçus.
  • Les particularités des marchés fermés, fériés, suspendus ou des données reconduites sont ignorées.
  • Un prix composite ou un ratio paraît récent alors qu’une composante requise est obsolète.
  • L’état du séquenceur L2 est ignoré, non initialisé, retardé ou lu sur le mauvais réseau.
  • Le délai de grâce manque, est mal configuré ou présente une erreur de frontière.
  • Le contrôle du séquenceur passe alors que le prix reste obsolète ou indisponible.
  • Temps L1, temps de bloc L2, observation, publication et heure civile sont confondus.
  • Une mise à jour pull est absente, trop ancienne, sélectionnée, malformée ou insuffisamment financée.
  • Une solution de repli ou dernière valeur valide est obsolète, corrélée, mise à une autre échelle ou circulaire.
  • Fail-open autorise des actions dangereuses, tandis qu’un fail-closed généralisé bloque remboursement, ajout de garantie ou reprise ordonnée.
  • Saut de reprise, liquidations groupées, MEV, faible liquidité, course à la suspension ou rapprochement des créances irrécouvrables entraînent des pertes secondaires.

Idées reçues

  • « Le heartbeat garantit une mise à jour récente à chaque intervalle. » C’est un paramètre de déclenchement ; une défaillance de source ou de blockchain peut toujours retarder la publication.
  • « Un horodatage récent prouve un prix correct et exécutable. » Il prouve uniquement l’heure documentée ; qualité, unités, confiance, profondeur et logique du consommateur restent distinctes.
  • « Un âge maximal unique convient à tous les flux et actions. » Actifs, horaires, blockchains ainsi qu’emprunt, liquidation, négociation et règlement ont des besoins différents.
  • « Séquenceur opérationnel signifie reprise immédiate de toutes les actions. » Délai de grâce et fraîcheur du prix sont deux barrières indépendantes, auxquelles peuvent s’ajouter d’autres règles.
  • « Une solution de repli ou le revert de toute fonction est toujours préférable. » Un mauvais repli valorise mal le risque ; un blocage indiscriminé peut empêcher le remboursement ou le renforcement de la garantie.

Sujets connexes

Sources

Navigation

Rechercher dans le wiki...