J’avais trois packs ouverts dans l’éditeur de politique de Newton, vaults.fyi, RedStone, Chainalysis, en vérifiant si une action de vault devait être autorisée à s’exécuter.

Vaults.fyi a renvoyé un risk_score de 0.72. RedStone a renvoyé une divergence_bps de 38. Chainalysis a renvoyé son propre risk_score, « low », ainsi qu’un indicateur sanctioned défini à false.

Deux de ces trois réponses utilisent exactement le même nom de champ, risk_score, pour deux choses complètement différentes. L’un correspond à une évaluation numérique de la santé du vault. L’autre est une étiquette catégorielle de sanctions. Rien, dans le JSON de l’un ou l’autre fournisseur, ne vous prévient à l’avance, car aucune des équipes n’a conçu son schéma en sachant que l’autre existait.

Si une fusion naïve écrivait simplement les deux réponses dans un seul objet, la deuxième écriture l’emporte. Le 0,72 de Vaults.fyi est remplacé silencieusement par « low ». La politique continue de s’exécuter. Pas d’erreur, pas d’avertissement, pas de texte rouge quelque part. Elle commence à comparer un seuil à une valeur qui n’existe plus.

J’ai cherché où Newton s’arrête réellement, parce que ce n’est manifestement pas laissé à la discrétion de la personne qui écrit le fichier Rego pour remarquer.

Chaque pack espace les noms de sa sortie sous son propre identifiant de pack avant que quoi que ce soit ne soit fusionné. Le score de risque de Vaults.fyi vit à data.wasm.vaultsfyi.risk_score. Celui de Chainalysis se trouve à data.wasm.chainalysis.risk_score, une adresse totalement différente, même avec le même nom de champ. La valeur de divergence de RedStone est à data.wasm.redstone.divergence_bps. En exécutant Simulate sur les trois en même temps, le panneau de données fusionnées a montré exactement cela : trois chemins distincts, aucun ne se touche.

Ce n’est pas une règle qui dit aux développeurs d’être prudents avec la dénomination. C’est la fusion elle-même qui refuse de laisser la collision se produire, avant même qu’un auteur de politique n’écrive une seule comparaison.

Ce qui m’est resté n’est pas le bug que je n’avais pas manqué. C’est plutôt à quel point la correction est peu spectaculaire en réalité. Personne ne fait de la publicité pour les clés JSON avec espaces de noms. Mais c’est exactement ce détail qui se tient entre une politique de coffre-fort qui bloque correctement une action risquée, et une autre qui l’approuve discrètement, parce que deux fournisseurs sans lien ont fini par tomber d’accord sur un mot.

@NewtonProtocol #Newt $NEWT