콘텐츠로 이동

직접 점수 검증하기

우리 말을 믿을 필요 없습니다. 독립적인 세 가지 검사.

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 블록 이전에 존재했음을 검증할 수 있습니다.

앵커링은 선후성을 증명하지 진위를 증명하지 않습니다: 기록이 개시 이전으로 소급되지 않았고, 이후의 철회도 마찬가지로 타임스탬프됨(역사는 늘어날 뿐 다시 쓰이지 않음)을 보장합니다.

세 가지가 함께 확립하는 것

검사 증명하는 것
벡터 적용된 규칙이 공개된 것과 정확히 일치.
서명 패스포트가 변조되지 않았고 그 기기에서 옴.
앵커링 데이터가 Bitcoin 블록 이전에 존재 - 소급 없음.

증명하지 않는 것: 닫힌 리스너가 올바른 메모리 주소를 읽었다는 것. 그 신뢰는 리스너 인증에서 옵니다.