Перейти к содержанию

Class: SignerClient

Предварительно настроенный протокол, направленный на коммуникацию с Spatium Signer Service

  • Для транспортировки он использует HTTP(S) + SSE двунаправленный транспорт.
  • Для кэша использует in-memory хранилище
  • Для крипто-драйвера использует предоставленный Crypto

Так как внутренне он использует SSETransport, нужно помнить что клиент начинает слушать события как только вызван метод connect и не прекращает, пока не вызван метод disconnect.

См. также

Протокол

Иерархия

  • SpatiumProtocol

SignerClient

Имплементирует

Конструкторы

constructor

new SignerClient(url, auth, crypto, timeout?)

Заметьте

запросы относятся к accountId сессии авторизации, тем самым хранят данные независимо для каждого авторизированного пользователя

Пример

// Считаем, что Crypto уже инициализирован

const auth = new AuthorizationSession('https://cloud.spatium.net/authorization/v1', uuid(randomBytes), ['read', 'secret']);
const signer = new SignerClient('https://cloud.spatium.net/signer/v1', auth, crypto, 10 * 1000);

// Подключение к SignerService (с 10-секундным таймаутом)
await signer.connect(10 * 1000);

// Генерируем случаный secretId для нового секрета (он должен быть сгенерирован единожды и сохранен)
const secretId = uuid(randomBytes);

// Генерируем оба секрата (первый на подлюченном сервере и второй локально) (производится единожды для каждого secretId)
await signer.generateDistributedSecret(secretId);

// Генерируем рандомный session ID для новой сессии синхронизации
const syncSessionId = uuid(randomBytes);

// Выполняем ECDSA-over-secp256k1 процедуру синхронизации для ключа с путем ```m/44'/0'/0'/0'/0'```
const publicKey = await syncDistributedEcdsaKey(signer, secretId, syncSessionId, 'secp256k1', 0, 0);

// К этому моменту данные синхронизации уже сохранены в хранилище и составной ключ доступен к получению
const _publicKey = await getEcdsaPublicKey(signer, syncSessionId);

// Этот ключ, очевидно, является тем же ключом, который мы получаем из самой процедуры синхронизации
expect(publicKey).toBe(_publicKey);

// Генерируем рандомный session ID для новой сессии подписания
const signSessionId = uuid(randomBytes);

// Сообщение к подписанию
const message = '7hJ9yN2OdIQo2kJu0arZgw2EKnMX5FGtQ6jlCWuLXCM='

//  Генерируем ECDSA подпись
const signature = await signEcdsaMessage(signer, secretId, syncSessionId, signSessionId, message);

// Верифицируем подпись к составному ключу с внешней библиотекой (тут - elliptic.js)
expect(new ec('secp256k1').verify(
  Buffer.from(message, 'base64'),
  {
    s: Buffer.from(signature.s, 'base64'),
    r: Buffer.from(signature.r, 'base64'),
    recoveryParam: signature.recovery,
  },
  Buffer.from(publicKey, 'base64'),
)).toBeTruthy();

// Отключаемся от SignerService
await signer.disconnect();

Параметры

Имя Тип Описание
url string signer service эндпоинт (HTTP(S))
auth AuthorizationSession сессия авторизации AuthorizationSession к использованию
crypto Crypto любой валидный Crypto для обработки данных и вычислений
timeout? number (опционально) таймаут запроса на каждое сообщение, по истечению которого выполнение процедуры останавливается

Overrides

SpatiumProtocol.constructor

Свойства

auth

auth: AuthorizationSession

сессия авторизации AuthorizationSession

Методы

connect

connect(timeout?): Promise<void>

Подключение и прослушивание событий

Параметры

Имя Тип
timeout? number

Возвращает

Promise<void>


disconnect

disconnect(): Promise<void>

Прекращение прослушивания событий и отключение

Возвращает

Promise<void>


generateDistributedSecret

generateDistributedSecret(secretId): Promise<void>

Одновременная генерация распределенного секрета с тем же secretId

Этот метод не строго обязателен, т.к. возможна генерация секретов с одинаковыми ID независимо с помощью Crypto Driver, однако это может быть полезно в демонстрационных целях.

Результатом этой операции будут являться новые секреты, сохраненные в постоянное хранилище, доступные по предоставленному secretId

С данного момента можно свободно вызывать syncDistributedEcdsaKey и syncDistributedEddsaKey, в том случае если секрет доступен в хранилище.

Пример

// Считаем, что SignerClient уже инициализирован и подключен

// Генерируем случаный secretId для нового секрета
const secretId = uuid(randomBytes);

// Генерируем оба секрата (первый на подлюченном сервере и второй локально)
await client.generateDistributedSecret(secretId);

// К этому моменту секрет уже сгенерирован и готов к использованию MPC

Параметры

Имя Тип Описание
secretId string ID (UUID) данного секрета

Возвращает

Promise<void>