@spatium/sdk
Классы
Интерфейсы
Псевдонимы типов
Curve
Ƭ Curve: EcdsaCurve
| EddsaCurve
EcdsaCurve
Ƭ EcdsaCurve: "secp256k1"
EcdsaSignature
Ƭ EcdsaSignature: Object
Oбъявления типа
Имя | Тип |
---|---|
r |
string |
recovery |
number |
s |
string |
EddsaCurve
Ƭ EddsaCurve: "ed25519"
EddsaSignature
Ƭ EddsaSignature: Object
Oбъявления типа
Имя | Тип |
---|---|
R |
string |
s |
string |
StorageData
Ƭ StorageData: unknown
Хранение blob данных
SDK хранит только сериализуемые JSON данные
StorageFilter
Ƭ StorageFilter: Partial
<{ room
: string
; topic
: string
}>
StorageMeta
Ƭ StorageMeta: Object
Идентификационные данные хранилища
Каждая уникальная комбинация room и topic должна идентифицировать хранилище
Oбъявления типа
Имя | Тип | Описание |
---|---|---|
room |
string |
Скоуп данных, таких как отдельный пользователь, отдельный сеанс связи, и т.д. |
topic |
string |
Тэг данных внутри скоупа, например, отдельное свойство объекта пользователя, отдельный шаг сеанса сязи, и т.д. |
StoragePayload
Ƭ StoragePayload: StorageMeta
& { data
: StorageData
}
TransportCallback
Ƭ TransportCallback: (meta
: TransportMeta
, data
: TransportData
) => Promise
<void
>
Oбъявления типа
▸ (meta
, data
): Promise
<void
>
Параметры
Имя | Тип |
---|---|
meta |
TransportMeta |
data |
TransportData |
Возвращает
Promise
<void
>
TransportData
Ƭ TransportData: unknown
Отправка blob данных
SDK отправляет только сериализуемые JSON данные
TransportFilter
Ƭ TransportFilter: Partial
<TransportMeta
>
Фильтрация сообщений
В качестве фильтрации сообщений используется частичная мета. Принимающая сторона может решить дождаться сообщения с определенным room, topic или даже любого сообщения (с {}
в качестве фильтра)
TransportMeta
Ƭ TransportMeta: Object
Идентификационные данные сообщения
Каждое переданное сообщение содержит эти поля для корректной идентификации и обнаружения
Oбъявления типа
Имя | Тип | Описание |
---|---|---|
room |
string |
Скоуп сообщения, таких как отдельный пользователь, отдельный сеанс связи, и т.д. |
topic |
string |
Тэг сообщения внутри скоупа, например, отдельное свойство объекта пользователя, отдельный шаг сеанса сязи, и т.д. |
TransportPayload
Ƭ TransportPayload: TransportMeta
& { data
: TransportData
}
Переменные
NIL
• Const
NIL: string
= _NIL
Функции
decrypt
▸ decrypt(data
, key
): string
Параметры
Имя | Тип |
---|---|
data |
string |
key |
string |
Возвращает
string
deriveHDKey
▸ deriveHDKey(secret
, coin
, account
): string
Параметры
Имя | Тип |
---|---|
secret |
string |
coin |
number |
account |
number |
Возвращает
string
deserialize
▸ deserialize(data
): unknown
Параметры
Имя | Тип |
---|---|
data |
string |
Возвращает
unknown
encodeEddsaBN
▸ encodeEddsaBN(curve
, s
): string
Параметры
Имя | Тип |
---|---|
curve |
"ed25519" |
s |
string |
Возвращает
string
encodeEddsaPoint
▸ encodeEddsaPoint(curve
, p
): string
Параметры
Имя | Тип |
---|---|
curve |
"ed25519" |
p |
string |
Возвращает
string
encrypt
▸ encrypt(data
, key
, randomSource
): string
Параметры
Имя | Тип |
---|---|
data |
string |
key |
string |
randomSource |
(size : number ) => string |
Возвращает
string
fromInternal
▸ fromInternal(value
, decimals
): string
Параметры
Имя | Тип |
---|---|
value |
string |
decimals |
number |
Возвращает
string
getEcdsaPublicKey
▸ getEcdsaPublicKey(driver
, secretId
, syncSessionId
): Promise
<string
>
Получение составного публичного ключа из уже выполненного сеанса синхронизации (отдельный помощник)
См. также
Пример
// Считаем, что процедура синхронизации уже пройдена
const publicKey = await getEcdsaPublicKey(protocol, secretId, syncSessionId);
Параметры
Имя | Тип | Описание |
---|---|---|
driver |
Protocol |
имплементация протокола |
secretId |
string |
ID (UUID) of a secret used for synchronization |
syncSessionId |
string |
ID (UUID) процедуры синхронизации |
Возвращает
Promise
<string
>
составной публичный ключ, синхронизированный в ходе этой сессии
getEddsaPublicKey
▸ getEddsaPublicKey(driver
, secretId
, syncSessionId
): Promise
<string
>
Получение составного публичного ключа из уже выполненного сеанса синхронизации (отдельный помощник)
См. также
Пример
// Считаем, что процедура синхронизации уже пройдена
const publicKey = await getEddsaPublicKey(protocol, secretId, syncSessionId);
Параметры
Имя | Тип | Описание |
---|---|---|
driver |
Protocol |
имплементация протокола |
secretId |
string |
ID (UUID) секрета используемого для синхронизации |
syncSessionId |
string |
ID (UUID) процедуры синхронизации |
Возвращает
Promise
<string
>
составной публичный ключ, синхронизированный в ходе этой сессии
matchOptional
▸ matchOptional<T
>(a
, b
): boolean
Параметры типа
Имя |
---|
T |
Параметры
Имя | Тип |
---|---|
a |
T |
b |
undefined | T |
Возвращает
boolean
matchTransportMeta
▸ matchTransportMeta(meta
, filter
): boolean
Сравнение меты с фильтром
Полезная имплементация для фильтрации сообщений
Параметры
Имя | Type | Описание |
---|---|---|
meta |
TransportMeta |
идентификаторы сообщений |
filter |
Partial <TransportMeta > |
фильтр входящих сообщений |
Возвращает
boolean
true
если предоставленная мета соответствует фильтру
pack
▸ pack<T
>(_schema
, v
): unknown
Параметры типа
Имя | Тип |
---|---|
T |
extends ZodType <any , any , any , T > |
Параметры
Имя | Тип |
---|---|
_schema |
T |
v |
TypeOf <T > |
Возвращает
unknown
randomBytes
▸ randomBytes(length
): string
Параметры
Имя | Тип |
---|---|
length |
number |
Возвращает
string
read
▸ read(driver
, meta
): Promise
<StorageData
| null
>
Чтение данных, хранящихся в предоставленной мете (отдельный помощник)
Этот метод обычно используется в стратегии постоянного хранилища
См. также
Параметры
Имя | Тип | Описание |
---|---|---|
driver |
StorageDriver |
StorageDriver имплементация |
meta |
StorageMeta |
составной идентификатор |
Возвращает
Promise
<StorageData
| null
>
хранящиеся данные или null
, если такие не найдены
receive
▸ receive(driver
, filter
): Promise
<TransportPayload
>
Получение определенного сообщения
Этот метода ожидает, пока не придет подходящее сообщение (определяется параметром filter
) и возвращает
данные сообщения. Если указан фильтр assert
, сообщение так же с ним сравнивается и возвращается если не прошло подтверждение. Такое поведение может быть полезно при внезапной отписке, получении некорректных сообщений и подобных
ошибочных сценариях.
Параметры
Имя | Тип | Описание |
---|---|---|
driver |
TransportDriver |
TransportDriver имплементация |
filter |
Partial <TransportMeta > |
фильтр входящего сообщения |
Возвращает
Promise
<TransportPayload
>
payload полученного сообщения (и мета, и данные)
▸ receive(driver
, filter
, timeout?
): Promise
<TransportPayload
>
Параметры
Имя | Тип |
---|---|
driver |
TransportDriver |
filter |
Partial <TransportMeta > |
timeout? |
number |
Возвращает
Promise
<TransportPayload
>
▸ receive(driver
, filter
, assert
): Promise
<TransportPayload
>
Параметры
Имя | Тип |
---|---|
driver |
TransportDriver |
filter |
Partial <TransportMeta > |
assert |
Partial <TransportMeta > |
Возвращает
Promise
<TransportPayload
>
▸ receive(driver
, filter
, assert
, timeout?
): Promise
<TransportPayload
>
Параметры
Имя | Тип |
---|---|
driver |
TransportDriver |
filter |
Partial <TransportMeta > |
assert |
Partial <TransportMeta > |
timeout? |
number |
Возвращает
Promise
<TransportPayload
>
safeDecrypt
▸ safeDecrypt(data
, key
): null
| string
Параметры
Имя | Тип |
---|---|
data |
string |
key |
string |
Возвращает
null
| string
safeDeserialize
▸ safeDeserialize(data
): unknown
Параметры
Имя | Тип |
---|---|
data |
string |
Возвращает
unknown
safeSecureUnpack
▸ safeSecureUnpack<T
>(schema
, data
): null
| TypeOf
<T
>
Параметры типа
Имя | Тип |
---|---|
T |
extends ZodType <any , any , any , T > |
Параметры
Имя | Тип |
---|---|
schema |
T |
data |
unknown |
Возвращает
null
| TypeOf
<T
>
safeUnpack
▸ safeUnpack<T
>(_schema
, data
): null
| TypeOf
<T
>
Параметры типа
Имя | Тип |
---|---|
T |
extends ZodType <any , any , any , T > |
Параметры
Имя | Тип |
---|---|
_schema |
T |
data |
unknown |
Возвращает
null
| TypeOf
<T
>
securePack
▸ securePack<T
>(schema
, v
, randomSource
): string
Параметры типа
Имя | Тип |
---|---|
T |
extends ZodType <any , any , any , T > |
Параметры
Имя | Тип |
---|---|
schema |
T |
v |
TypeOf <T > |
randomSource |
(size : number ) => string |
Возвращает
string
secureUnpack
▸ secureUnpack<T
>(schema
, data
): TypeOf
<T
>
Параметры типа
Имя | Тип |
---|---|
T |
extends ZodType <any , any , any , T > |
Параметры
Имя | Тип |
---|---|
schema |
T |
data |
unknown |
Возвращает
TypeOf
<T
>
send
▸ send(driver
, meta
, data
): Promise
<void
>
Отправка сообщения с помощью транспорта (отдельный помощник)
Этот метода ожидает, пока сообщение будет отправлено (но не дожидается получения) и отдает в ответ возможна ли его отправка. Можно определить пункт назначения и способ отправки.
См. также
Параметры
Имя | Тип | Описание |
---|---|---|
driver |
TransportDriver |
TransportDriver имплементация |
meta |
TransportMeta |
идентификатор сообщения |
data |
unknown |
данные сообщения |
Возвращает
Promise
<void
>
serialize
▸ serialize(data
): string
Параметры
Имя | Тип |
---|---|
data |
unknown |
Возвращает
string
signEcdsaMessage
▸ signEcdsaMessage(driver
, signSessionId
, syncSessionId
, message
): Promise
<EcdsaSignature
>
Генерирует распределенную ECDSA подпись для данного сообщения (отдельный помощник)
Для этого метода необходима уже пройденная процедура синхронизации и так же ничего не должно быть помещено в постоянное хранилище. Сообщения с объемом информации отличным от 32 байт будут дополнены/урезаны в соответствии с ECDSA алгоритмом.
См. также
Пример
// Считаем, что процедура синхронизации уже пройдена и соединение установлено
// Генерируем рандомный session ID для новой сессии подписания
const signSessionId = uuid(randomBytes);
// Сообщение к подписанию
const message = '7hJ9yN2OdIQo2kJu0arZgw2EKnMX5FGtQ6jlCWuLXCM='
// Генерируем ECDSA подпись
const signature = await signEcdsaMessage(protocol, 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();
Параметры
Имя | Тип | Описание |
---|---|---|
driver |
Protocol |
имплементация протокола |
secretId |
string |
ID (UUID) секрета для синхронизации |
signSessionId |
string |
ID (UUID) данной процедуры подписания |
syncSessionId |
string |
ID (UUID) соответствующей процедуры синхронизации |
message |
string |
сообщение (32 байта base64-encoded) к подписанию |
Возвращает
Promise
<EcdsaSignature
>
ECDSA подпись в стандартном формате
signEddsaMessage
▸ signEddsaMessage(driver
, secretId
, syncSessionId
, signSessionId
, message
): Promise
<EddsaSignature
>
Генерирует распределенную EDDSA подпись для данного сообщения (отдельный помощник)
Для этого метода необходима уже пройденная процедура синхронизации и так же ничего не должно быть помещено в постоянное хранилище. Сообщения с объемом информации отличным от 32 байт будут дополнены/урезаны в соответствии с EDDSA алгоритмом.
См. также
Пример
// Считаем, что процедура синхронизации уже пройдена и соединение установлено
// Генерируем рандомный session ID для новой сессии подписания
const signSessionId = uuid(randomBytes);
// Сообщение к подписанию
const message = '7hJ9yN2OdIQo2kJu0arZgw2EKnMX5FGtQ6jlCWuLXCM='
// Генерируем EDDSA подпись
const signature = await signEddsaMessage(protocol, secretId, syncSessionId, signSessionId, message);
// Верифицируем подпись к составному ключу с внешней библиотекой (тут - elliptic.js)
expect(new ed('ed25519').verify(
Buffer.from(message, 'base64').toString('hex'),
Buffer.concat([
Buffer.from(encodeEddsaPoint('ed25519', signature.R), 'base64'),
Buffer.from(encodeEddsaBN('ed25519', signature.s), 'base64'),
]).toString('hex'),
Buffer.from(encodeEddsaPoint('ed25519', publicKey), 'base64').toString('hex'),
)).toBeTruthy();
Параметры
Имя | Тип | Описание |
---|---|---|
driver |
Protocol |
имплементация протокола |
signSessionId |
string |
ID (UUID) данной процедуры подписания |
syncSessionId |
string |
ID (UUID) соответствующей процедуры синхронизации |
message |
string |
сообщение (32 байта base64-encoded) к подписанию |
Возвращает
Promise
<EddsaSignature
>
EDDSA подпись в стандартном формате
syncDistributedEcdsaKey
▸ syncDistributedEcdsaKey(driver
, secretId
, syncSessionId
, curve
, derivationCoin
, derivationAccount
): Promise
<string
>
Выполняет процедуру синхронизации распределенного ключа (отдельный помощник)
Каждый секрет используется независимо для генерации фрагментов распределенного ключа (BIP-44 с путем m/44'/(coin)'/(account)'/0'/0'
),
и после с этими фрагментами выполняется синхронизация MPC ключа для получения составного публичного ключа для этой пары.
Вопреки тому, что каждая сессия содержит уникальный сет данных, полученный ключ детерминирован для последующих синхронизаций, например, каждый набор секретов, монета и аккаунт всегда создадут тот же составной ключ (и эфемерные приватные ключи)
В результате этой операции новые данные синхронизации сохранены в постоянное хранилище, доступ к которым можно получить с помощью session ID.
С этого момента можно свободно вызывать getEcdsaPublicKey или signEcdsaMessage пока данные синхронизации (или секрет) доступны в хранилище.
См. также
Пример
// Считаем, что процедура синхронизации уже пройдена и соединение установлено
// Генерируем рандомный session ID для новой сессии подписания
const syncSessionId = uuid(randomBytes);
// Выполняем ECDSA-over-secp256k1 процедуру синхронизации для ключа с путем ```m/44'/0'/0'/0'/0'```
const publicKey = await syncDistributedEcdsaKey(protocol, secretId, syncSessionId, 'secp256k1', 0, 0);
// К этому моменту данные синхронизации уже сохранены в хранилище и составной ключ доступен к получению
const _publicKey = await getEcdsaPublicKey(protocol, secretId, syncSessionId);
// Этот ключ, очевидно, является тем же ключом, который мы получаем из самой процедуры синхронизации
expect(publicKey).toBe(_publicKey);
Параметры
Имя | Тип | Описание |
---|---|---|
driver |
Protocol |
имплементация протокола |
syncSessionId |
string |
ID (UUID) данной процедуры синхронизации |
secretId |
string |
ID (UUID) секрета используемого для синхронизации |
curve |
"secp256k1" |
эллиптическая кривая (ECC) (на данный момент поддерживается только secp256k1 ) |
derivationCoin |
number |
coin свойство формирования HD ключа (BIP-44) |
derivationAccount |
number |
account свойство формирования HD ключа (BIP-44) |
Возвращает
Promise
<string
>
составной публичный ключ (который так же можно получить позже с помощью getEcdsaPublicKey)
syncDistributedEddsaKey
▸ syncDistributedEddsaKey(driver
, secretId
, syncSessionId
, curve
, derivationCoin
, derivationAccount
): Promise
<string
>
Выполняет процедуру синхронизации распределенного ключа (отдельный помощник)
Каждый секрет используется независимо для генерации фрагментов распределенного ключа (BIP-44 с путем m/44'/(coin)'/(account)'/0'/0'
),
и после с этими фрагментами выполняется синхронизация MPC ключа для получения составного публичного ключа для этой пары.
Вопреки тому, что каждая сессия содержит уникальный сет данных, полученный ключ детерминирован для последующих синхронизаций, например, каждый набор секретов, монета и аккаунт всегда создадут тот же составной ключ (и эфемерные приватные ключи)
В результате этой операции новые данные синхронизации сохранены в постоянное хранилище, доступ к которым можно получить с помощью session ID.
С этого момента можно свободно вызывать getEddsaPublicKey или signEddsaMessage пока данные синхронизации (или секрет) доступны в хранилище.
См. также
Пример
// Считаем, что процедура синхронизации уже пройдена и соединение установлено
// Генерируем рандомный session ID для новой сессии подписания
const syncSessionId = uuid(randomBytes);
// Выполняем EDDSA-over-secp256k1 процедуру синхронизации для ключа с путем ```m/44'/0'/0'/0'/0'```
const publicKey = await syncDistributedEddsaKey(protocol, secretId, syncSessionId, 'ed25519', 0, 0);
// К этому моменту данные синхронизации уже сохранены в хранилище и составной ключ доступен к получению
const _publicKey = await getEddsaPublicKey(protocol, secretId, syncSessionId);
// Этот ключ, очевидно, является тем же ключом, который мы получаем из самой процедуры синхронизации
expect(publicKey).toBe(_publicKey);
Параметры
Имя | Тип | Описание |
---|---|---|
driver |
Protocol |
имплементация протокола |
secretId |
string |
ID (UUID) секрета используемого для синхронизации |
syncSessionId |
string |
ID (UUID) данной процедуры синхронизации |
curve |
"secp256k1" |
эллиптическая кривая (ECC) (на данный момент поддерживается только secp256k1 ) |
derivationCoin |
number |
coin свойство формирования HD ключа (BIP-44) |
derivationAccount |
number |
account свойство формирования HD ключа (BIP-44) |
Возвращает
Promise
<string
>
составной публичный ключ (который так же можно получить позже с помощью getEddsaPublicKey)
take
▸ take(driver
, meta
): Promise
<StorageData
| null
>
Принимает данные, хранящиеся внутри предоставленной меты и удаляет оригинал (отдельный помощник)
Этот метод обычно применяется при использовании стратегии с временным хранилищем как способ удаления сохраненных записей.
См. также
Параметры
Имя | Тип | Описание |
---|---|---|
driver |
StorageDriver |
StorageDriver имплемнтация |
meta |
StorageMeta |
составной идентификатор |
Возвращает
Promise
<StorageData
| null
>
хранящиеся данные или null
, если такие не найдены
toInternal
▸ toInternal(value
, decimals
): string
Параметры
Имя | Тип |
---|---|
value |
string |
decimals |
number |
Возвращает
string
unpack
▸ unpack<T
>(_schema
, data
): TypeOf
<T
>
Параметры типа
Имя | Тип |
---|---|
T |
extends ZodType <any , any , any , T > |
Параметры
Имя | Тип |
---|---|
_schema |
T |
data |
unknown |
Возвращает
TypeOf
<T
>
uuid
▸ uuid(randomSource
): string
Параметры
Имя | Тип |
---|---|
randomSource |
(size : number ) => string |
Возвращает
string
write
▸ write(driver
, meta
, data
): Promise
<void
>
Записывает блок данных в хранилище, уникально идентифицируется метой
Если такой блок уже существует, метод его переписывает
См. также
Параметры
Имя | Тип | Описание |
---|---|---|
driver |
StorageDriver |
StorageDriver implementation |
meta |
StorageMeta |
составной идентификатор |
data |
unknown |
блок данных |
Возвращает
Promise
<void
>