@fireblocks/ncw-js-sdk

中文文档
12.5.6发布于 2025/04/20MITTypeScriptESM + CJS近 30 天下载 5368

JavaScript 中的防火块签名器

中文使用文档
文档目录7 节
  1. 快速启动
  2. 初始化
  3. 生成 MPC 密钥
  4. 签名交易
  5. 安全存储
  6. 发展
  7. 技术

全国妇女理事会

Fireblocks 非海关钱包的官方 Javascript & Typescript SDK

快速启动

初始化

import {
  FireblocksNCWFactory,
  IEventsHandler,
  IFireblocksNCW,
  IMessagesHandler,
  TEvent,
  InMemorySecureStorageProvider,
} from "@fireblocks/ncw-js-sdk";

// Example Device ID
const deviceId = "f16e05e0-1869-4a6b-9678-17a1c14ed482";

// Initiate secure storage to hold generated data during SDK usage.
const secureStorageProvider = new InMemorySecureStorageProvider();

// Register a message handler to process outgoing message to your API
const messagesHandler: IMessagesHandler = {
  handleOutgoingMessage: (message: string) => {
    // Send the message to your API service
    return {} as any;
  },
};

// Register an events handler to handle on various events that the SDK emitts
const eventsHandler: IEventsHandler = {
  handleEvent: (event: TEvent) => {
    if (
      event.type === "key_descriptor_changed" ||
      event.type === "key_takeover_changed" ||
      event.type === "transaction_signature_changed" ||
      event.type === "join_wallet_descriptor"
    ) {
      // Do something when the event is fired.
      console.log(event);
    }
  },
};

// Initialize Fireblocks NCW SDK
const fireblocksNCW = await FireblocksNCWFactory({
  deviceId,
  messagesHandler,
  eventsHandler,
  secureStorageProvider,
});

生成 MPC 密钥

import { IKeyDescriptor, TMPCAlgorithm } from "@fireblocks/ncw-js-sdk";

// Generate MPC Keys
const algorithms: Set<TMPCAlgorithm> = new Set(["MPC_CMP_ECDSA_SECP256K1"]);
const keyDescriptor: Set<IKeyDescriptor> = await fireblocksNCW.generateMPCKeys(algorithms);

生成 MPC 密钥进程将释放 IKeyTakeoverChangedEvent 事件.

签名交易

import { ITransactionSignature } from "@fireblocks/ncw-js-sdk";

// Sign transaction
const result: ITransactionSignature = await fireblocksNCW.signTransaction("SOME_TX_UUID");
console.log(
  `txId: ${result.txId}`,
  `status: ${result.transactionSignatureStatus}`, // "PENDING" | "STARTED" | "COMPLETED" | "TIMEOUT" | "ERROR"
);

标志进程会发出 ITransactionSignatureChangedEvent 事件.

安全存储

以下示例使用自定义的安全存储.

const secureStorageProvider = new PasswordEncryptedLocalStorage(deviceId, () => {
  const password = prompt("Enter password", "");
  if (password === null) {
    return Promise.reject(new Error("Rejected by user"));
  }
  return Promise.resolve(password || "");
});

// Initialize Fireblocks NCW SDK with your custom secure storage
const fireblocksNCW = await FireblocksNCW.initialize(deviceId, messagesHandler, eventsHandler, secureStorageProvider);

基于用户密码的安全存储的一个实例.

import {
  BrowserLocalStorageProvider,
  ISecureStorageProvider,
  TReleaseSecureStorageCallback,
  decryptAesGCM,
  encryptAesGCM,
} from "@fireblocks/ncw-js-sdk";
import { md } from "node-forge";

export type GetUserPasswordFunc = () => Promise<string>;

/// This secure storage implementations creates an encryption key on-demand based on a user password

export class PasswordEncryptedLocalStorage extends BrowserLocalStorageProvider implements ISecureStorageProvider {
  private encKey: string | null = null;

  constructor(
    private _salt: string,
    private getPassword: GetUserPasswordFunc,
  ) {
    super();
  }

  public async getAccess(): Promise<TReleaseSecureStorageCallback> {
    this.encKey = await this._generateEncryptionKey();
    return async () => {
      await this._release();
    };
  }

  private async _release(): Promise<void> {
    this.encKey = null;
  }

  public async get(key: string): Promise<string | null> {
    if (!this.encKey) {
      throw new Error("Storage locked");
    }

    const encryptedData = await super.get(key);
    if (!encryptedData) {
      return null;
    }

    return decryptAesGCM(encryptedData, this.encKey, this._salt);
  }

  public async set(key: string, data: string): Promise<void> {
    if (!this.encKey) {
      throw new Error("Storage locked");
    }

    const encryptedData = await encryptAesGCM(data, this.encKey, this._salt);
    await super.set(key, encryptedData);
  }

  private async _generateEncryptionKey(): Promise<string> {
    let key = await this.getPassword();
    const md5 = md.md5.create();

    for (let i = 0; i < 1000; ++i) {
      md5.update(key);
      key = md5.digest().toHex();
    }

    return key;
  }
}

发展

  1. 清除仓库
  2. 安装依赖关系 yarn
  3. 以 yarn build
  4. 运行测试 yarn test

技术

版本与发布记录

@fireblocks/ncw-js-sdk 共发布 139 个版本,首次发布于 2023/07/30;过去 12 个月发布了 0 个版本。

版本发布日期距今
12.5.6latest2025/04/201.6 年前
12.5.52025/03/051.7 年前
12.5.42025/02/201.7 年前
12.5.4-beta.1.eb81d39beta2025/02/171.7 年前
0.0.0-test-ci.e81b6fdexperimental2024/11/062 年前
12.5.32024/11/052 年前

其他发布通道:experimental-ext → 12.5.0-ext.1.397a779,latest-ext → 12.5.0-ext.3,rc → 12.5.3-rc.1.7e939da,experimental → 0.0.0-test-ci.e81b6fd,beta → 12.5.4-beta.1.eb81d39。

关于 @fireblocks/ncw-js-sdk 的常见问题

@fireblocks/ncw-js-sdk 是什么?

JavaScript 中的防火块签名器

如何安装 @fireblocks/ncw-js-sdk?

在项目目录运行 npm install @fireblocks/ncw-js-sdk,或使用 pnpm add / yarn add / bun add。

@fireblocks/ncw-js-sdk 支持 TypeScript 吗?

支持。包内自带 TypeScript 类型声明(package.json 声明了 types 入口),安装后即可获得类型提示,无需再安装 @types 包。

@fireblocks/ncw-js-sdk 支持 ESM 还是 CommonJS?

同时提供 ES Module 与 CommonJS 入口,import 和 require() 都可以使用,打包工具会自动选择合适的版本。

@fireblocks/ncw-js-sdk 需要什么版本的 Node.js?

package.json 的 engines 字段要求 Node.js >=18.0.0。版本不符时 npm 默认只给出警告,开启 engine-strict 后会拒绝安装。

@fireblocks/ncw-js-sdk 可以商用吗?

@fireblocks/ncw-js-sdk 使用 MIT 许可。宽松许可:允许商业使用、修改和再分发,通常只需在分发时保留原版权与许可声明。以上为概括,不构成法律意见,请以许可原文为准。

@fireblocks/ncw-js-sdk 的下载量有多少?

根据 npm 官方下载统计,@fireblocks/ncw-js-sdk 在 2026/10/15 – 2026/11/13 这 30 天内被下载 5,368 次,日均约 179 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入,适合横向比较热度,不能直接等同于使用人数。

@fireblocks/ncw-js-sdk 还在维护吗?

最新版本 12.5.6 发布于 2025/04/20(1.6 年前);至今共发布 139 个版本,其中过去 12 个月发布了 0 个;首次发布于 2023/07/30。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。