So rechnest du nach
Für jede Partie zählt der größte Modellwert. Vergleiche ihn mit dem Ergebnis-Ereignis derselben matchId. Der Tabellenfavorit ist richtig, wenn sein gespeicherter Ausgang dem Ergebnis entspricht.
Die fertig gerechnete Bilanz steht unter /v1/competitions/de.bl1/record, die Rohdaten unter /v1/ledger. Beide Antworten sind offen abrufbar und brauchen keinen Schlüssel.
Eine Partie ohne festgeschriebene Prognose zählt nicht mit. Sie verschwindet aber nicht: Sie steht als eigenes Ereignis im Protokoll, damit sichtbar bleibt, dass nachträglich nichts gefüllt wurde.
Warum nichts nachträglich passt
Jedes Ereignis trägt eine Prüfsumme über sich selbst und über seinen Vorgänger: sha256(prevHash + "\n" + JSON des Ereignisses), Schlüssel alphabetisch sortiert, ohne die Felder hash und prevHash selbst. Wer eine ältere Antwort aufbewahrt hat, erkennt jede spätere Änderung an einer Prüfsumme, die nicht mehr aufgeht.
Die Kette macht eine Änderung sichtbar, nicht unmöglich. Wir rechnen sie im Browser bewusst nicht nach: Die gespeicherte Nutzlast enthält Werte wie 0.0, die JavaScript beim Umwandeln zu 0 verkürzt — die Nachrechnung meldete dann einen Bruch, wo keiner ist. Das Werkzeug tool/verify_ledger_chain.dart rechnet sie in Dart korrekt nach.
Im Protokoll unten steht deshalb, was das Feld chainIntact der Dienstantwort meldet — eine Auskunft des Dienstes über sich selbst, keine Prüfung durch diese Seite.