自分でスコアを検証する
私たちの言葉を信じる必要はありません。独立した 3 つの検証です。
1. テストベクタで検証ツールを再実行
ベクタ(vectors/*.json)は (パスポート, 期待される判定) の組です。公開検証ツール
(ref/)は厳密にその判定を返さねばなりません - どの実装(C#, PHP, C++…)でもバイト単位
で同一の判定。これがプロトコルの出口基準です。
cd ref/csharp/NelfeScoring.Vectors
dotnet run -c Release # → 11/11 ベクタが期待判定
2. パスポートの署名を検証
各パスポートは端末により正規形(JSON Canonicalization Scheme, RFC 8785)に対して 署名されています(ECDSA P-256):
signatureフィールドを取り除く;- 残りを JCS で正規化(キー整列、空白なし、最小エスケープ);
- デバイス公開鍵(
key_id = SHA-256(SPKI DER))で署名(ASN.1 DER, base64url)を検証。
署名はすべてを覆います:スコア、コア/コンテンツ/MEM/リスナーの指紋、チェックポイント、 チケット。後から 1 バイト変えれば署名は無効。
3. 先行性を検証(ブロックチェーン・アンカー)
ランクインした各スコア - と各ゲームの開始 - は Merkle ツリーにまとめられ、その根が OpenTimestamps で Bitcoin にアンカーされます。標準クライアントで、誰でも私たち抜きで、 データが特定の Bitcoin ブロック以前に存在したことを検証できます。
アンカーは先行性を証明し、真偽は証明しません:記録が開始前に遡って作られていないこと、 そして後の取り消しも同様に時刻印されること(歴史は増えるだけで書き換えられない)を保証。
3 つが合わせて確立すること
| 検証 | 証明すること |
|---|---|
| ベクタ | 適用されたルールが公開されたものと完全に一致。 |
| 署名 | パスポートが改変されておらず、その端末から来た。 |
| アンカー | データが Bitcoin ブロック以前に存在 - 遡及なし。 |
証明しないこと:閉じたリスナーが正しいメモリアドレスを読んだこと。その信頼は リスナーの認定から来ます。