Browser 集成 Embedded MPC Node
Browser 端支持 Web 页面和浏览器插件集成 Embedded MPC Node,提供 Javascript API 供开发者使用。
交付物
| 交付物 | 说明 |
libsmnSDK-JS-vX.Y.Z.tar.gz | JavaScript 库文件 |
将 libsmnSDK-JS-vX.Y.Z.tar.gz 解压后将会得到如下四个文件:
- index.esm.js
- SDK 入口文件,开发者代码只需依赖这个文件
- mpcWorker.global.js
- 在 Web Worker 中运行的 MPC 算法层
- safeheron-crypto-sdk-wasm.wasm
- MPC 算法 WebAssembly 文件,将被 mpcWorker.global.js 加载运行
- index.esm.d.ts
- SDK 的 TypeScript 声明文件,方便 IDE 进行代码提示
将这些文件都放入浏览器端项目工程中,其中 mpcWorker.glogal.js 和 safeheron-crypto-sdk-wasm.wasm 最终需要被作为静态资源发布到 CDN 或者远程服务器上,将对应路径传递给 SDK。
运行环境和依赖
| 类型 | 说明 |
| SMN Service | 运行在服务端的 SMN Service |
| SMN Relayer | 用于 MPC Node 间通信的中间件 |
需要准备 MPC Node Service 的 Party ID 和公钥,在 MPC Node Service 的配置文件 mpc-node-config.toml 中可以找到。同时需要准备好 Relayer 的连接地址。上述配置信息在 Embedded MPC Node 初始化配置时需要用到。
使用方式
引入 SDK
// 将 sdk 路径替换为你项目中的路径
import {SMNTenantClient, SMNEcdsaClient} from './lib/index.esm.js'
const tenantConfig = {/* 具体配置项见如下说明 */}
// 创建 tenantClient 实例
const tenantClient = await SMNTenantClient.create(
tenantConfig,
'tenantName', // tenantName,不同的 tenantClient 路径应该是不一样的
// 加密公钥
'bb0d386bb542b4ef1ef5615fab1abaf9f6030ed30657e05d045bc2702485afcc'
)准备配置
Browser 端的配置内容和 Android/iOS 端基本一致,使用 JSON 格式进行配置。
{
// 必填字段,交付产物中的 mpcWorker.global.js 的下载路径
// 该文件将会在 SDK 初始化时被浏览器下载并在单独的 worker 中执行
smnMPCWorkerJSPath: '/path/to/mpcWorker.global.js',
// 必填字段,交付产物中的 safeheron-crypto-sdk-wasm.wasm 的下载路径
// 该文件将会在 mpcWorker.global.js 初始化时被浏览器下载,并编译为 JavaScript Module 执行
smnAlgoWasmPath: '/path/to/safeheron-crypto-sdk-wasm.wasm',
mpc: {
// 默认 10s,建立 MPC 节点之间连接的等待时间
// 如一个 MPC Session 需要 Party 1,Party 2,Party 3 参与,当前节点为 Party 1,
// 则需要在 10s 内完成收到 Party 2 和 Party 3 的 ReadyMessage,否则响应 ReadyTimeout 错误
readyTimeout: '10s',
// 默认 2m,当启动一个计算 Session 后,这个 Session 需要在 2m 内完成,
// 否则响应 SessionTimeout 错误
sessionTimeout: '2m',
},
party: {
// 必填字段,Embedded MPC Node 只需要配置 ID 即可,在 Tenant 初始化时,会自动生成公私钥;
// 开发者可以通过 Native 接口调用获取 Embedded MPC Node 公钥
id: 2,
},
// 远程 MPC Node Service 的 ID 和 公钥配置
remoteParty: [
{id: 1, publicKey: '040ad492d08ba2f34e8bdf44a079694b47374f89c74265700a57888ea2437ee1f4167f98fa232d33daf24440726b03a08476cd1ef697d4b0a6a145dccbea732202'},
],
relayer: {
// 必填,通信 Relayer 的地址
address: 'ws://url:9001',
},
log: {
// 日志级别,支持 Debug、Info、Warning、Error、Off 等级,其中 Off 为不输出日志
level: 'Off',
},
}集成说明
请参考 Demo。
需要注意,MPC 协议计算全部为同步方法,且在浏览器端需要占用较长时间计算,因此在 SDK 中,我们将耗时任务全部放在 Web Worker 中执行,并处理了 UI 线程与 Web Worker 之间的桥接逻辑,确保在算法执行时不会影响 UI 线程的渲染。JavaScript SDK 提供的相关方法在调用过程中会抛出对应的异常或者错误,需要开发者捕获异常以避免影响自身业务运行。