Ich hatte drei Pakete in Newtons Richtlinieneditor geöffnet, vaults.fyi, RedStone und Chainalysis, um zu prüfen, ob eine Tresoraktion ausgeführt werden darf.
Vaults.fyi gab einen risk_score von 0,72 zurück. RedStone gab eine divergence_bps von 38 zurück. Chainalysis gab seinen eigenen risk_score, „low“, plus ein genehmigtes Flag zurück, das auf false gesetzt war.
Zwei dieser drei Antworten verwenden exakt denselben Feldnamen, risk_score, für zwei völlig unterschiedliche Dinge. Das eine ist eine numerische Bewertung der Tresorgesundheit. Das andere ist eine kategorische Bezeichnung für Sanktionen. In keinem der JSONs wird Sie im Voraus gewarnt, weil weder das eine noch das andere Team sein Schema so entwickelt hat, dass es das jeweils andere kannte.
Wenn ein naives Merge einfach beide Antworten in ein Objekt geschrieben hätte, gewinnt der zweite Write. Vaults.fyi's 0.72 wird stillschweigend durch „low“ ersetzt. Die Policy läuft weiter. Kein Fehler, keine Warnung, nirgendwo roter Text. Dann fängt sie an, einen Schwellwert mit einem Wert zu vergleichen, den es nicht mehr gibt.
Ich habe nachgesehen, wo Newton tatsächlich dabei aufhört, weil es ganz offensichtlich nicht demjenigen überlassen ist, der die Rego-Datei schreibt, es zu bemerken.
Jedes Pack namespace-t seine Ausgabe unter seiner eigenen Pack-ID, bevor irgendetwas zusammengeführt wird. Der Risk-Score von Vaults.fyi lebt unter data.wasm.vaultsfyi.risk_score. Der von Chainalysis unter data.wasm.chainalysis.risk_score – eine völlig andere Adresse, selbst bei identischem Feldnamen. RedStone legt seinen Divergence-Wert unter data.wasm.redstone.divergence_bps ab. Wenn man Simulate gegen alle drei gleichzeitig laufen lässt, zeigte das zusammengeführte Data-Panel genau das: drei getrennte Pfade, keiner berührt den anderen.
Das ist keine Regel, die Entwickler dazu auffordert, beim Benennen vorsichtig zu sein. Es ist die eigentliche Zusammenführung, die die Kollision verhindert, bevor ein Policy-Autor jemals einen einzigen Vergleich hinschreibt.
Was mir geblieben ist, war nicht der Bug, den ich nicht getroffen habe. Es war, wie unsexy und unspektakulär die eigentliche Lösung ist. Niemand vermarktet Namespaced-JSON-Keys. Aber es ist genau dieses Detail, das zwischen einer Vault-Policy steht, die eine riskante Aktion korrekt blockiert, und einer, die sie stillschweigend freigibt, weil zwei völlig unverbundene Anbieter zufällig dasselbe Wort gewählt haben.

