Browser 集成 Embedded MPC Node

Browser 端支持 Web 页面和浏览器插件集成 Embedded MPC Node,提供 Javascript API 供开发者使用。

交付物

交付物说明
libsmnSDK-JS-vX.Y.Z.tar.gzJavaScript 库文件

将 libsmnSDK-JS-vX.Y.Z.tar.gz 解压后将会得到如下四个文件:

将这些文件都放入浏览器端项目工程中,其中 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 提供的相关方法在调用过程中会抛出对应的异常或者错误,需要开发者捕获异常以避免影响自身业务运行。