Embedded MPC Node API
概述
Embedded MPC Node 提供 iOS(Object-C & Swift)、Android 和 WASM 原生支持,接口设计几乎完全一致,方便开发者各端快速集成。API 主要通过 SMNTenantClient 、SMNECDSAClient 、SMNEdDSAClient 和 SMNSchnorrClient 四个类提供。
SMNTenantClient
SMNTenantClient 类,主要处理租户维度相关逻辑,如获取 SDK 版本信息、通信、本地私钥分片存储等。
创建 SMNTenantClient 实例
功能概述
初始化 SMNTenantClient 对象。如果参数符合要求,将会初始化并返回 一个 SMNTenantClient 实例,否则会抛出异常。
接口
| SDK | API | 方法类型 |
| JS | async create | 静态方法 |
| iOS | initWithConfig | 实例方法 |
| Android | newEmbeddedTenantClient | 静态方法 |
参数
| 字段 | 类型 | 说明 |
| config | object | string | Embedded MPC Node 配置数据,JS 中为 JSON 对象,其他 SDK 中为 TOML 格式字符串。参考 《Browser 集成 Embedded MPC Node》、《Android 集成 Embedded MPC Node》、《iOS 集成 Embedded MPC Node》中提供的配置模板 |
| tenantName | string | 当前租户的名称,租户的数据存储路径和此参数强相关,用于隔离不同租户的数据,主要是私钥分片数据。长度不能超过 200 个 UTF-8 字符 |
| encryptionKey | string | 当前租户的数据加密密钥,建议不同租户使用不同的密钥,参数值为 64 个字符长度的 16 进制字符串,例如: 47dbd298a3756e28632fdfcd9f54f8035efd0a37d13ca1f4eb756ace05b1948d。如果在初始化 SMNTenantClient 时,提供的 encryptionKey 不符合格式要求或者与之前不一致,将初始化失败,抛出异常。 |
| dbPath | string | 有效的数据库存储路径,仅 Android 和 iOS 需要此参数 |
返回值
SMNTenantClient 类的实例
查看 SDK 版本号
功能概述
获取 Embedded MPC Node SDK 的版本号。
由于 MPC 计算需要多方参与,当其中一方协议出现不兼容更新时,开发者就需要考虑不同版本嵌入式 SDK 之间以及与服务端MPC Node Service 之间的兼容性问题,建议开发者在执行 MPC 协议时上报 SDK 版本号用于将来兼容性升级。
接口
| API | 方法类型 |
| getSDKVersion | 静态方法 |
参数
无
返回值
| 字段 | 类型 | 说明 |
| version | string | SDK 版本,格式为 x.y.z,如 1.0.0 |
| versionCode | number | SDK 版本号,如 10000,计算方式为 x * 10000 + y * 100 + z |
查看 Tenant 配置信息
功能概述
获取当前 SMNTenantClient 的基本配置信息。
接口
| API | 方法类型 |
| getInfo | 实例方法 |
参数
无
返回值
| 字段 | 类型 | 说明 |
| localParty | object | 本地 Party 相关信息 |
| └─id | number | 当前节点的 ID,iOS SDK 此字段名称为 partyId |
| └─tpk | string | 公钥,不包含 0x 前缀的十六进制字符串 |
| relayer | object | Relayer 相关配置 |
| └─address | string | Relayer 连接地址 |
| remoteParties | array | 其他参与方 Party 信息 |
| └─id | number | 其他参与方的 Party ID,iOS SDK 此字段名称为 partyId |
| └─tpk | string | 公钥,不包含 0x 前缀的十六进制字符串 |
查看 Tenant 的 Party ID
功能概述
获取当前 SMNTenantClient 的 Party ID。该 ID 源自于首次创建 SMNTenantClient 对象的配置文件中的配置。
接口
| API | 方法类型 |
| getPartyId | 实例方法 |
参数
无
返回值
number
查看 Tenant 的 TPK
功能概述
获取当前 SMNTenantClient 的 Tenant Public Key(TPK)。在创建 SMNTenantClient 对象实例时,随机生成一个非对称密钥对(即 Tenant Private Key 与 Tenant Public Key)。在 MPC 计算过程中以及和 Relayer 通信鉴权时会使用此密钥对。
接口
| API | 方法类型 |
| getTpk | 实例方法 |
参数
无
返回值
string
查看 Tenant 本地 Party
功能概述
获取当前 SMNTenantClient 的 Party 信息,包含 Party ID 和 TPK。
接口
| API | 方法类型 |
| getParty | 实例方法 |
参数
无
返回值
| 字段 | 类型 | 说明 |
| id | number | 本地 Party 的 ID |
| tpk | string | 本地 Party 的 Tenant Public Key(TPK) |
修改本地数据密钥
功能概述
修改加密本地数据的密钥,该加密密钥为不包含 0x 前缀的 64 位十六进制字符串。修改成功后, 后续初始化 SMNTenantClient 需要使用新密钥,否则初始化失败。
接口
| API | 方法类型 |
| changeEncryptionKey | 实例方法 |
参数
| 字段 | 类型 | 说明 |
| encryptionKey | string | 新的加密密钥,需要满足:不包含 0x 开头的 64 位十六进制字符串 |
返回值
| SDK | 返回值 | 说明 |
| JS | 无 | 如果修改失败将会抛出异常,异常信息中包含具体的错误原因。 |
| iOS | BOOL | TRUE:表示修改成功; FALSE: 表示修改失败,需要在 Error 信息中查看具体的错误原因。 |
| Android | 无 | 如果修改失败将会抛出异常,异常信息中包含具体的错误原因。 |
设置 Relayer Token 回调函数
功能概述
设置获取 Relayer Token(OTT)的回调函数。当 Embedded MPC Node 参与 MPC 计算时,需要与 SMN Relayer 建立网络连接,和其他参与方实时通信。SDK 自动调用此函数获取一次性 Token(OTT), 在与 SMN Relayer 连接认证时使用。
接口
| API | 方法类型 |
async-in-js setRelayerTokenCallback | 实例方法 |
参数
| SDK | 参数 |
| JS | function(partyId, tpk): Promise<string[]> |
| iOS | SMNRelayerTokenCallback(partyId, tpk) |
| Android | com.smn.sdk.tenant.SMNRelayerTokenCallback.getRelayerToken(partyId, tpk) |
其中:
- partyId: 当前 SMNTenantClient 的 Party ID
- tpk: 当前 SMNTenantClient 的 TPK
返回值
| SDK | 返回值 |
| JS | Promise<boolean> |
| iOS | 无 |
| Android | 无 |
自定义 MPC 消息通信方式
功能概述
默认情况下,在进行 MPC 计算的过程中, Embedded MPC Node 和其他参与方通过 SMN Relayer 进行通信,同时可使用此方法设置自定义通信方式,如同一个应用终端内集成两个及以上的 SMNTenantClient 时, 可配合 postMessage 接口,实现多个 SMNTenantClient 直接通信,以提升 MPC 协议执行速度。
接口
| API | 方法类型 |
async addSendMessageCallback | 实例方法 |
参数
| 字段 | 类型 | 说明 |
| id | number | 接收方的 Party ID,iOS SDK 此参数名称为 partyId |
| tpk | string | 接收方的 TPK |
| callback | function | 处理消息的回调函数,将 MPC 计算过程的消息数据传递给此回调函数 |
返回值
无
SMNTenantClient 间直接通信
功能概述
一般情况下,此方法与 addSendMessageCallback 配合使用。当一个应用终端内集成两个及以上的 SMNTenantClient 时,这些 SMNTenantClient 之间无需通过 Relayer 通信。
接口
| API | 方法类型 |
async-in-js postMessage | 实例方法 |
参数
| 参数名 | 类型 | 说明 |
| message | string | 需要发送的消息,可以直接使用 addSendMessageCallback 中 callback 的入参 message |
返回值
无
算法 API
- SMNECDSAClient 类提供了 MPC-CMP 协议相关协议和辅助函数。
- SMNEdDSAClient 类提供了 Lin22 相关协议和辅助函数。
- SMNSchnorrClient 类提供了 Lin22 协议相关协议和辅助函数。
创建算法 Client 实例
功能概述
创建一个算法的 Client 实例,使用该实例完成特定算法的 MPC 计算。
接口
| SDK | 算法 Client | API | 方法类型 |
| JS、Android | SMNECDSAClient | 构造方法 new | - |
| JS、Android | SMNEdDSAClient | 构造方法 new | - |
| JS、Android | SMNSchnorrClient | 构造方法 new | - |
| iOS | SMNECDSAClient | initWithTenant | 实例方法 |
| iOS | SMNEdDSAClient | initWithTenant | 实例方法 |
| iOS | SMNSchnorrClient | initWithTenant | 实例方法 |
参数
| 参数名 | 类型 | 说明 |
| tenantClient | SMNTenantClient | SMNTenantClient 实例对象,使用该实例完成通信、存储等功能。 |
返回值
object - 算法 Client 实例对象,类型为 SMNECDSAClient、SMNEdDSAClient 或者 SMNSchnorrClient
获取本地 Party
功能概述
获取本地 Party 信息,包含 Party ID 和 TPK。
接口
| 算法 Client | API |
| SMNECDSAClient | getParty |
| SMNEdDSAClient | getParty |
| SMNSchnorrClient | getParty |
参数
无
返回值
| 字段 | 类型 | 说明 |
| id | int | 本地 Party 的 ID |
| tpk | string | 本地 Party 的 Tenant Public Key(TPK) |
generatePreKeygenData
功能概述
生成本地私钥分片对应的预计算数据,该方法为静态方法,不需要初始化 SMNECDSAClient 实例。主要应对用户的租户尚未初始化的情况下,需要生成预生成数据的场景,返回预计算数据字符串。此方法与 addPreKeygenData 搭配使用。仅 ECDSA-CMP 算法支持此接口。
接口
| 算法 Client | API | 方法类型 |
| SMNECDSAClient | async-in-jsgeneratePreKeygenData | 静态方法 |
参数
仅 JS SDK 需要以下参数,Android 和 iOS SDK 无参数
| 参数名 | 类型 | 说明 |
| smnMPCWorkerJSPath | string | 交付产物中的 mpcWorker.global.js 的 URL |
| smnAlgoWasmPath | string | 交付产物中的 safeheron-crypto-sdk-wasm.wasm 的 URL |
返回值
string - 生成的预计算数据
addPreKeygenData
功能概述
向 SMNECDSAClient 对应的 SMNTenantClient 存储中添加 MPC 预计算生成的数据。仅 ECDSA-CMP 算法支持此接口。
接口
| 算法 Client | API | 方法类型 |
| SMNECDSAClient | async-in-jsaddPreKeygenData | 实例方法 |
参数
| 参数名 | 类型 | 说明 |
| preKeygenData | string | 预生成数据,该参数为可 SMNECDSAClient.generatePreKeygenData 接口返回的数据 |
返回值
boolean 是否添加成功
preKeygen
功能概述
在分布式私钥生成的过程中,各方 Party 在本地创建私钥分片时会进行大量耗时计算,调用本接口后会预生成一个本地私钥分片对应的预计算数据,从而减少执行 keygen/recover/refresh 时的耗时。该方法需要在 keygen/recover/refresh 创建私钥分片之前调用,并且返回 true 为预计算成功。该方法可以执行多次,每次执行成功都会加密存储一份预计算数据。每次执行 keygen/recover/refresh,无论协议计算成功失败都会消耗一份存储的预计算数据。仅 ECDSA-CMP 算法支持此接口。
接口
| 算法 Client | API | 方法类型 |
| SMNECDSAClient | async-in-jspreKeygen | 实例方法 |
参数
无
返回值
boolean
getPartyId
功能概述
获取当前 SMNTenantClient 的 Party ID。
接口
| 算法 Client | API | 方法类型 |
| SMNECDSAClient | getPartyId | 实例方法 |
| SMNEdDSAClient | getPartyId | 实例方法 |
| SMNSchnorrClient | getPartyId | 实例方法 |
参数
无
返回值
number
getTpk
功能概述
获取当前 SMNTenantClient 的 TPK。
接口
| 算法 Client | API | 方法类型 |
| SMNECDSAClient | getTpk | 实例方法 |
| SMNEdDSAClient | getTpk | 实例方法 |
| SMNSchnorrClient | getTpk | 实例方法 |
参数
无
返回值
string
keygen
功能概述
该方法用于分布式私钥分片生成,需要所有参与方 MPC Node 同时调用 keygen 方法,MPC Node 接收到 keygen 指令后,根据 sessionId 和远程参与方启动本次 MPC 任务,如果 MPC 计算执行成功,则返回 keyId 和 xPub,其中 keyId 为私钥分片的标识,xPub 为扩展公钥。如果计算失败,则抛出错误信息。
注意:
- 该方法是线程不安全的,当需要执行多次 keygen 时,需要等待上一次 keygen 结束后再执行下一次 keygen
- 由于 MPC 计算是分布式计算,可能会出现服务端先完成计算或者客户端先完成计算的情况,因此建议开发者在进行下一步业务逻辑之前,通过开发者后端服务判断,是否所有参与计算的 Node 都完成计算并且取得相同的 keyId 和 xPub,判断相同后再进行后续步骤;其他协议如 sign、recover、refresh 需要进行类似判断
例如:手机端和服务端构建 MPC 钱包,服务端收到 keyId 和 xPub 后判定私钥分片创建成功,进入后续创建钱包逻辑,此时客户端由于网络问题最后一轮计算失败,本地未得到私钥分片。如果此时钱包功能正常,用户使用钱包进行转入操作,转出时由于本地私钥分片不存在造成无法签名转账,从而造成用户资产损失。
接口
| 算法 Client | API | 方法类型 |
| SMNECDSAClient | async-in-jskeygen | 实例方法 |
| SMNEdDSAClient | async-in-jskeygen | 实例方法 |
| SMNSchnorrClient | async-in-jskeygen | 实例方法 |
参数
| 参数名 | 类型 | 说明 |
| sessionId | string | MPC Session ID,唯一标识一个 MPC 任务,所有 Party 在计算同一个任务时, sessionId 必须一致。sessionId 推荐使用 UUIDv4 |
| threshold | number | 签名门限,需要满足 1 < threshold <= totalPartyNum。所有 Party 在计算同一个任务时, threshold 必须一致 |
| totalPartyNum | number | MPC 计算参与方总数,需要满足 1 < threshold <= totalPartyNum。所有 Party 在计算同一个任务时, totalPartyNum 必须一致 |
| curve | number | 签名算法需要的曲线名称,开发者可以使用已经定义好的枚举值 ECDSA 算法支持的曲线为: Secp256k1 EdDSA 算法支持的曲线为:Ed25519 Schnorr 算法支持的曲线为:Secp256k1 |
| remoteParties | array | 参与本次 MPC 计算任务的其他方, 不包含自己 ,数组长度值应为 totalPartyNum - 1 |
| └─id | number | 参与方 Party 的 ID,iOS SDK 此参数名称为 partyId |
| └─tpk | string | 参与方 Party 的 Tenant Public Key (TPK) |
| lifecycle | function | 可选参数,MPC 协议的生命周期和进度回调,参数类型说明如下: JS: (progress: number, lifecycle: LifecycleEnum, currentRound: number)⇒voidAndroid: com.smn.sdk.common.SMNLifecycleiOS: SMNProgress |
返回值
| 字段 | 类型 | 说明 |
| keyId | string | MPC Session 计算成功,每个参与方会返回相同的 Key ID |
| xPub | string | 扩展公钥,以 xpub 开头,每个参与方会返回相同的 xPub |
| signKeyVersion | string | 私钥分片数据结构版本 |
sign
功能概述
该方法用于私钥分片的分布式签名,需要所有签名参与方 MPC Node 同时调用 sign 方法,如果 MPC 任务执行成功,则返回对应响应参数,如果计算失败,抛出具体的错误信息。
注意:
- 该方法是线程不安全的,当需要执行多次 sign 时,需要等待上一次 sign 结束后再执行下一次 sign
接口
| 算法 Client | API | 方法类型 |
| SMNECDSAClient | async-in-jssign | 实例方法 |
| SMNEdDSAClient | async-in-jssign | 实例方法 |
| SMNSchnorrClient | async-in-jssign | 实例方法 |
参数
| 参数名 | 类型 | 说明 |
| sessionId | string | MPC Session ID,唯一标识一个 MPC 任务,所有 Party 在计算同一个任务时, sessionId 必须一致。sessionId 推荐使用 UUIDv4 |
| keyId | string | 需要使用的私钥分片 ID |
| algoType | string | 仅 Schnorr 算法签名时需要此参数,该参数支持 LEGACY 和 BIP340 两种类型,参数值不区分大小写;LEGACY 适用于 BCH,BIP340 适用于 BTC |
| digests | array | 需要签名的消息摘要列表,类型为数组 |
| └─path | string | 签名使用的 BIP44 路径,不可为空,输入示例:m/44/60/1/0/0。格式为必须 m 开头,/ 分割路径,每段中间必须整数,整数范围为 [0, 2^32),不能带 ',数字部分字段只能包含 5 段 |
| └─digest | string | 要签名的数据,使用 16 进制字符串表示,不包含 0x。其中 ECDSA 算法要求此参数大小为 32 字节,EdDSA 和 Schnorr 算法要求此参数大于等于 32 字节,小于等于 1M 字节 |
| remoteParties | array | MPC Session 的参与方信息,不包含自己,数组长度值应为 threshold - 1,其中 threshold 的值为生成 keyId 对应的私钥分片时传入的 threshold 参数 |
| └─id | number | 参与方 Party 的 ID,iOS SDK 此参数名称为 partyId |
| └─tpk | string | 参与方 Party 的 Tenant Public Key(TPK) |
| lifecycle | function | 可选参数,MPC 协议的生命周期和进度回调,参数类型说明如下: JS: (progress: number, lifecycle: LifecycleEnum, currentRound: number)⇒voidAndroid: com.smn.sdk.common.SMNLifecycleiOS: SMNProgress |
返回值
Array<object>
| 字段 | 类型 | 说明 |
| path | string | 签名使用的 BIP44 路径 |
| digest | string | 与请求参数对应的 16 进制格式的待签名数据,字母全小写 |
| signature | string | 签名结果 16 进制字符串表示 |
| recoveryId | number | EVM 公链签名中的 v,值为 0 或者 1。仅当使用 ECDSA 算法及 Secp256k1 曲线签名时,返回该字段 |
refresh
功能概述
该方法用于私钥分片的分布式刷新。
示例说明:对于 2/3 门限,需要 3 方同时调用 refresh 方法,当 MPC Node 收到 refresh 指令后,3 方的私钥分片全部都会刷新,得到一组新的私钥分片和对应新的 keyId。如果刷新失败,则抛出异常,需要重新触发刷新。老的私钥分片依然可用,开发者根据自己的业务决定禁用或者删除老的私钥分片。
注意:
- 该方法是线程不安全的,当需要执行多次 refresh 时,需要等待上一次 refresh 结束后再执行下一次的 refresh。
接口
| 算法 Client | API | 方法类型 |
| SMNECDSAClient | async-in-jsrefresh | 实例方法 |
| SMNEdDSAClient | async-in-jsrefresh | 实例方法 |
| SMNSchnorrClient | async-in-jsrefresh | 实例方法 |
参数
| 参数名 | 类型 | 说明 |
| sessionId | string | MPC Session ID,唯一标识一个 MPC 任务,所有 Party 在计算同一个任务时, sessionId 必须一致。sessionId 推荐使用 UUIDv4 |
| keyId | string | 私钥分片 ID |
| remoteParties | array | MPC Session 的参与方信息,不包含自己。数组长度值应为 totalPartyNum - 1,其中 totalPartyNum 的值为生成 keyId 对应的私钥分片时传入的 totalPartyNum 参数。 |
| └─id | number | 参与方 Party 的 ID,iOS SDK 此参数名称为 partyId |
| └─tpk | string | 参与方 Party 的 Tenant Public Key(TPK) |
| lifecycle | function | 可选参数,MPC 协议的生命周期和进度回调,参数类型说明如下: JS: (progress: number, lifecycle: LifecycleEnum, currentRound: number)⇒voidAndroid: com.smn.sdk.common.SMNLifecycleiOS: SMNProgress |
返回值
| 字段 | 类型 | 说明 |
| keyId | string | MPC Session 计算成功,每个参与方会返回相同的新 keyId |
| xPub | string | 扩展公钥,和刷新前私钥分片的扩展公钥一致 |
| signKeyVersion | string | 私钥分片数据结构版本 |
recover
功能概述
该方法用于私钥分片的分布式恢复,仅支持 2/3 门限场景。对于 2/3 门限,使用其中两个私钥分片恢复另外一个私钥分片,需要 3 方同时调用 recover 方法。根据输入的 sessionId 对当前计算任务达成共识,所有的参与方都必须输入 keyId,即使本地私钥分片不存在的的参与方,也需要输入 keyId。其中 recoveredParty 表示需要恢复私钥分片的一方。恢复成功后得到一组新的私钥分片和对应新的 keyId,老的私钥分片依然可用,开发者根据自己的业务决定禁用或者删除老的私钥分片。
注意:
- 该方法是线程不安全的,当需要执行多次 recover 时,需要等待上一次 recover 结束后再执行下一次 recover
接口
| 算法 Client | API | 方法类型 |
| SMNECDSAClient | async-in-jsrecover | 实例方法 |
| SMNEdDSAClient | async-in-jsrecover | 实例方法 |
| SMNSchnorrClient | async-in-jsrecover | 实例方法 |
参数
| 参数名 | 类型 | 说明 |
| sessionId | string | MPC Session ID,唯一标识一个 MPC 任务,所有 Party 在计算同一个任务时, sessionId 必须一致。sessionId 推荐使用 UUIDv4 |
| keyId | string | 私钥分片 ID |
| remoteParties | array | 所有其他的 MPC Session 参与方,不包含自己。数组长度值应为 totalPartyNum - 1,其中 totalPartyNum 的值为生成 keyId 对应的私钥分片时传入的 totalPartyNum 参数 |
| └─id | number | 参与方 Party 的 ID,iOS SDK 此参数名称为 partyId |
| └─tpk | string | 参与方 Party 的 Tenant Public Key(TPK) |
| recoveredParty | array | 被恢复的一方的 Party 信息 |
| └─id | number | 被恢复方 Party 的 ID,iOS SDK 此参数名称为 partyId |
| └─tpk | string | 被恢复方 Tenant Public Key(TPK) |
| lifecycle | function | 可选参数,MPC 协议的生命周期和进度回调,参数类型说明如下: JS: (progress: number, lifecycle: LifecycleEnum, currentRound: number)⇒voidAndroid: com.smn.sdk.common.SMNLifecycleiOS: SMNProgress |
返回值
| 字段 | 类型 | 说明 |
| keyId | string | recover 后生成新的一组私钥分片的 keyId |
| xPub | string | 扩展公钥,和恢复前私钥分片的扩展公钥一致 |
| signKeyVersion | string | 私钥分片数据结构版本 |
verify
功能概述
给定公钥、消息摘要、签名,验证签名是否是一个有效的签名。如果验证有效返回 true,否则返回 false。
接口
| 算法 Client | API | 方法类型 |
| SMNECDSAClient | async-in-jsverify | 实例方法 |
| SMNEdDSAClient | async-in-jsverify | 实例方法 |
| SMNSchnorrClient | async-in-jsverify | 实例方法 |
参数
| 参数名 | 类型 | 说明 |
| curve | number | 椭圆曲线类型,可选 CurveTypeEnum.Secp256k1 |
| algoType | string | 仅 SMNSchnorrClient 需要此参数,需要与签名时所使用的 algoType 参数值保持一致 |
| publicKey | string | 公钥 |
| digest | string | 开发者对消息 hash 后的摘要,16 进制字符串 |
| signature | string | 签名内容,签名接口返回的 16 进制字符串 |
返回值
boolean 代表是否验证成功
derivePublicKeys
功能概述
扩展公钥派生子公钥。当创建钱包时,需要使用子公钥根据不同公链的地址生成算法计算地址。
接口
| 算法 Client | API | 方法类型 |
| SMNECDSAClient | async-in-jsderivePublicKeys | 实例方法 |
| SMNEdDSAClient | async-in-jsderivePublicKeys | 实例方法 |
| SMNSchnorrClient | async-in-jsderivePublicKeys | 实例方法 |
参数
| 参数名 | 类型 | 说明 |
| keyId | string | 指定需要使用的私钥分片 |
| compressed | boolean | 是否返回压缩公钥,true 是,返回压缩公钥,false 返回未压缩公钥。仅 SMNECDSAClient 和 SMNSchnorrClient 需要此参数 |
| paths | string[] | BIP44 路径数组 |
返回值
Array<object>
| 字段 | 类型 | 说明 |
| path | string | BIP44 路径 |
| publicKey | string | BIP44 路径对应的公钥 |
recoverPublicKey
功能概述
给定摘要、签名和 recoveryId,恢复公钥。仅 ECDAS-CMP 算法支持此接口
接口
| 算法 Client | API | 方法类型 |
| SMNECDSAClient | async-in-jsrecoverPublicKey | 实例方法 |
参数
| 参数名 | 类型 | 说明 |
| curve | enum | 签名时所使用的曲线 |
| digest | string | 开发者对消息 hash 后的摘要,16 进制字符串 |
| signature | string | 消息摘要对应的签名 |
| recoveryId | number | ECDSA 签名返回的 recoveryId,0 或者 1 |
| compressed | boolean | 指定返回的公钥格式,true 返回压缩公钥,false 返回未压缩公钥 |
返回值
string 恢复出来的公钥
recoverPrivateKeys
功能概述
输入私钥分片数组和指定的 BIP44 路径数组,恢复出对应的原始私钥和公钥,其中输入的私钥分片数量需要等于签名门限,否则无法恢复私钥。需要特别注意,输入的分片数组仅支持以下场景:
假设签名门限 2/3,一组私钥分片 KeyId 为 1,三个参与方 Party 1、2、3 分别对应的私钥分片为 A、B、C;使用 A、B 执行分布式恢复协议,得到一组新的 KeyId 为 2,三个私钥分片为 A'、B'、C';使用 A、B、C 执行分布式刷新协议,得到一组新的 KeyId 为 3,得到 A*、B*、C*
(1)支持使用 A、B、C 中任意两个参与方的私钥分片
(2)支持使用 A'、B'、C' 中任意两个参与方的私钥分片
(3)支持使用 A*、B*、C* 中任意两个参与方私钥分片
(4)支持 A、B、C 和 A'、B'、C' 中任意两个参与方私钥分片,比如 A 和 B' 、A 和 C' 、B 和 A' 、B 和 C' 、B 和 A'、C 和 A'、C 和 B'
(5)不支持经过分布式刷新后的私钥分片和其他 KeyId 私钥分片合成原始私钥
接口
| 算法 Client | API | 方法类型 |
| SMNECDSAClient | async-in-jsrecoverPrivateKeys | 实例方法 |
| SMNEdDSAClient | async-in-jsrecoverPrivateKeys | 实例方法 |
| SMNSchnorrClient | async-in-jsrecoverPrivateKeys | 实例方法 |
参数
| 字段 | 类型 | 说明 |
| keyShares | string[] | 私钥分片数组,数组长度为签名门限,数组元素为 backup 接口返回的 keyShareBase64 字段值 |
| paths | string[] | BIP44 路径数组 |
| compressed | boolean | 指定返回的公钥格式,true 返回压缩公钥,false 返回未压缩公钥 |
返回值
Array<object>
| 字段 | 类型 | 说明 |
| path | string | BIP44 路径数 |
| curve | enum | 椭圆曲线类型 |
| privateKey | string | 原始私钥的 16 进制字符串编码 |
| publicKey | string | 原始私钥对应的公钥 16 进制字符串编码 |
backup
功能概述
备份私钥分片,该方法返回未加密的私钥分片内容,开发者在使用和存储时应注意安全。强烈建议开发者备份私钥分片时加密存储,避免私钥分片数据泄漏。
接口
| 算法 Client | API | 方法类型 |
| SMNECDSAClient | async-in-jsbackup | 实例方法 |
| SMNEdDSAClient | async-in-jsbackup | 实例方法 |
| SMNSchnorrClient | async-in-jsbackup | 实例方法 |
参数
| 参数名 | 类型 | 说明 |
| keyId | string | 指定要备份的私钥分片 |
返回值
| 字段 | 参数类型 | 说明 |
| curve | enum | 椭圆曲线类型 |
| signKeyVersion | string | 私钥分片数据结构版本 |
| keyShareBase64 | string | 私钥分片数据,restore 和 recoverPrivateKeys 时使用 |
restore
功能概述
恢复私钥分片,该方法将私钥分片明文导入到 SMNTenantClient 实例内。
接口
| 算法 Client | API | 方法类型 |
| SMNECDSAClient | async-in-jsrestore | 实例方法 |
| SMNEdDSAClient | async-in-jsrestore | 实例方法 |
| SMNSchnorrClient | async-in-jsrestore | 实例方法 |
参数
| 参数名 | 类型 | 说明 |
| keyShare | string | backup 方法返回结果中的 keyShareBase64 字段值 |
返回值
| 字段 | 类型 | 说明 |
| keyId | String | 导入私钥分片的 keyId |
| curve | enum | 曲线类型 |
| xPub | string | 扩展公钥 |
| signKeyVersion | string | 私钥分片数据版本 |
| parentKeyId | string | 父私钥分片 keyId:如果私钥分片由 refresh 或者 recover 得到,这里为父私钥分片的 keyId,如果 keygen 得到,这里为空字符串 |
| parentType | string | 生成类型 refresh/recover:如果存在 parentKeyId,那么这里为 refresh/recover,如果不存在 parentKeyId,这里为空 |
| createdTimestamp | number | 私钥分片的 restore 时间,格式为毫秒级时间戳 |
| threshold | number | 签名门限 |
| totalPartyNum | number | MPC 总参与方个数 |
keyInfo
给定私钥分片 keyId,获取私钥分片的可公开部分信息。
接口
| 算法 Client | API | 方法类型 |
| SMNECDSAClient | async-in-jskeyInfo | 实例方法 |
| SMNEdDSAClient | async-in-jskeyInfo | 实例方法 |
| SMNSchnorrClient | async-in-jskeyInfo | 实例方法 |
参数
| 参数名 | 类型 | 说明 |
| keyId | string | 指定的私钥分片 |
返回值
| 字段 | 类型 | 说明 |
| keyId | string | 私钥分片的 keyId |
| curve | enum | 椭圆曲线类型 |
| xPub | string | 扩展公钥 |
| signKeyVersion | string | 私钥分片数据和数据结构版本 |
| parentKeyId | string | 父私钥分片 keyId:如果私钥分片由 refresh 或者 recover 得到,这里为父私钥分片的 keyId,如果 keygen 得到,这里为空字符串 |
| parentType | string | 生成类型 refresh/recover:如果存在 parentKeyId,那么这里为 refresh/recover,如果不存在 parentKeyId,这里为空 |
| createdTimestamp | number | 私钥分片的创建时间或通过 restore 接口导入的时间,格式为毫秒级时间戳 |
| threshold | number | 签名门限 |
| totalPartyNum | number | MPC 总参与方个数 |
listKeys
功能概述
查询 keyId 列表,默认按照创建时间降序查询。
接口
| 算法 Client | API | 方法类型 |
| SMNECDSAClient | async-in-jslistKeys | 实例方法 |
| SMNEdDSAClient | async-in-jslistKeys | 实例方法 |
| SMNSchnorrClient | async-in-jslistKeys | 实例方法 |
参数
无
返回值
Array<object>
| keyId | string | 私钥分片的 keyId |
| curve | enum | 曲线类型 |
| xPub | string | 扩展公钥 |
| signKeyVersion | string | 私钥分片数据版本 |
| parentKeyId | string | 父私钥分片 keyId:如果私钥分片由 refresh 或者 recover 得到,这里为父私钥分片的 keyId,如果 keygen 得到,这里为空字符串 |
| parentType | string | 生成类型 refresh/recover:如果存在 parentKeyId,那么这里为 refresh/recover,如果不存在 parentKeyId,这里为空 |
| createdTimestamp | number | 私钥分片的创建时间或通过 restore 接口导入的时间,格式为毫秒级时间戳 |
| threshold | number | 签名门限 |
| totalPartyNum | number | MPC 总参与方总数 |
deleteKey
功能概述
指定 keyId,物理删除指定的私钥分片,一旦删除不可恢复。删除成功返回 true,失败返回 false。
接口
| 算法 Client | API | 方法类型 |
| SMNECDSAClient | async-in-jsdeleteKey | 实例方法 |
| SMNEdDSAClient | async-in-jsdeleteKey | 实例方法 |
| SMNSchnorrClient | async-in-jsdeleteKey | 实例方法 |
参数
| 参数名 | 类型 | 说明 |
| keyId | string | 指定的私钥分片 |
返回值
boolean 是否删除成功
文档变更记录
2024-07-04 1.2.0 版本更新
- 增加 getParty 接口
- 丰富 restore 接口返回值
- keygen 接口门限参数更新说明