[794-5][@ant] fix(api,shared): C6 — канонизация публичного ключа перед сравнением — снять ложный «ключ не активен»

Один ключ встречается как legacy EOS... (бэкфилл из снапшота) и как PUB_K1_...
(подписи нового SDK) — разные строки, строгое сравнение в checkActiveKey давало
active:false. Добавлен canonicalPublicKey (PublicKey.from().toString()) в shared;
C6 сравнивает обе стороны в канонической форме. Инцидент: документ Авдеев-Муравьев.
This commit is contained in:
coopops
2026-06-15 10:54:43 +00:00
parent 0d7e17dd83
commit c7d55ea1f9
3 changed files with 27 additions and 1 deletions
+6 -1
View File
@@ -1,4 +1,5 @@
import type { Kysely } from 'kysely';
import { canonicalPublicKey } from '@verifier/shared';
import type { Database, KeyWeight } from './db/schema.js';
import { SYNC_KEY } from './config.js';
import { classify, type HealthView } from './services/health-status.js';
@@ -53,7 +54,11 @@ export async function checkActiveKey(
}
const keys = last.keys as unknown as KeyWeight[];
const active = !last.is_deleted && keys.some((k) => k.public_key === publicKey);
// Ключ из документа (`PUB_K1_...`, новый SDK) и ключ в индексе (`EOS...` из бэкфилла
// снапшота / `PUB_K1_...` из native-deltas) — один и тот же ключ в разных кодировках.
// Сравниваем по канонической форме, иначе C6 ложно отдаёт «не активен».
const target = canonicalPublicKey(publicKey);
const active = !last.is_deleted && keys.some((k) => canonicalPublicKey(k.public_key) === target);
return {
active,
last_known_block: last.block_num,
+20
View File
@@ -0,0 +1,20 @@
import { PublicKey } from '@wharfkit/antelope';
/**
* Канонизация публичного ключа к единому строковому виду (`PUB_<curve>_...`).
*
* Один и тот же secp256k1-ключ встречается в ДВУХ кодировках: legacy `EOS...`
* (снапшот цепи / бэкфилл прав, старый SDK) и современный `PUB_K1_...` (подписи нового
* SDK, native-deltas парсера). Это разные строки с разной контрольной суммой — сравнивать
* их как есть нельзя, иначе C6 ложно отдаёт «ключ не активен на момент подписи», хотя ключ
* тот же. Приводим оба операнда к `.toString()` (новый формат) перед сравнением.
*
* На невалидной строке возвращаем вход как есть (сравнение тогда просто не совпадёт).
*/
export function canonicalPublicKey(key: string): string {
try {
return PublicKey.from(key).toString();
} catch {
return key;
}
}
+1
View File
@@ -1,4 +1,5 @@
export * from './types/index.js';
export * from './canonicalize/index.js';
export * from './crypto/sha256.js';
export * from './crypto/pubkey.js';
export * from './checks/index.js';