[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:
@@ -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,
|
||||
|
||||
@@ -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,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';
|
||||
|
||||
Reference in New Issue
Block a user