コンテンツにスキップ

自分でスコアを検証する

私たちの言葉を信じる必要はありません。独立した 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):

  1. signature フィールドを取り除く;
  2. 残りを JCS で正規化(キー整列、空白なし、最小エスケープ);
  3. デバイス公開鍵(key_id = SHA-256(SPKI DER))で署名(ASN.1 DER, base64url)を検証。

署名はすべてを覆います:スコア、コア/コンテンツ/MEM/リスナーの指紋、チェックポイント、 チケット。後から 1 バイト変えれば署名は無効。

3. 先行性を検証(ブロックチェーン・アンカー)

ランクインした各スコア - と各ゲームの開始 - は Merkle ツリーにまとめられ、その根が OpenTimestamps で Bitcoin にアンカーされます。標準クライアントで、誰でも私たち抜きで、 データが特定の Bitcoin ブロック以前に存在したことを検証できます。

アンカーは先行性を証明し、真偽は証明しません:記録が開始前に遡って作られていないこと、 そして後の取り消しも同様に時刻印されること(歴史は増えるだけで書き換えられない)を保証。

3 つが合わせて確立すること

検証 証明すること
ベクタ 適用されたルールが公開されたものと完全に一致。
署名 パスポートが改変されておらずその端末から来た。
アンカー データが Bitcoin ブロック以前に存在 - 遡及なし。

証明しないこと:閉じたリスナーが正しいメモリアドレスを読んだこと。その信頼は リスナーの認定から来ます。