@bitcoinerlab/btcmessage

中文文档
4.0.2发布于 2026/11/05MITTypeScriptCommonJS近 30 天下载 4032

比特币-消息分叉

中文使用文档
文档目录3 节
  1. 实例( 关于 Electrum 支持在底部的说明)
  2. 关于 Electrum segwit 签名支持
  3. 自由主义 麻省理工学院

比特币消息

js-standard-style

从 比特币消息以 npm 形式发布 @bitcoinerlab/btcmessage。 。 。 .

实例( 关于 Electrum 支持在底部的说明)

var tinysecp = require('tiny-secp256k1');
var MessageFactory = require('@bitcoinerlab/btcmessage').MessageFactory;
var toBase64 = require('uint8array-tools').toBase64;
var bitcoinMessage = MessageFactory(tinysecp);

使用时 tiny-secp256k1 或者说 @bitcoin-js/tiny-secp256k1-asmjs,使用2.2.5版本或以后使用. MessageFactory 使用应用程序提供的后端,因此仅更新此软件包不会更新后端.

V4 中突破更改: 此库为 Uint8Array- first, 不返回缓冲实例 .

符号(消息、 私密密钥、 压缩 [、 网络. message Prefix、 sig options])

  • 如果您通过 sig options arg 而不是消息 Prefix, 它将会动态替换 .
  • sig 选项包含两个属性
    • segwitType 应该是一个 'p2sh(p2wpkh)' 或者说 'p2wpkh'
    • extraEntropy 将使用 RFC6979 附加的 Entropy 参数创建非决定性签名。 R值再利用不是一个问题.

签名比特币消息

var keyPair = ECPair.fromWIF(
  'L4rK1yDtCWekvXuE6oXD9jCYfFNV2cWRpVuPLBcCU2z8TrisoyY1',
);
var privateKey = keyPair.privateKey;
var message = 'This is an example of a signed message.';

var signature = bitcoinMessage.sign(message, privateKey, keyPair.compressed);
console.log(toBase64(signature));
// => 'H9L5yLFjti0QTHhPyFrZCT1V/MMnBtXKmoiKDZ78NDBjERki6ZTQZdSMCtkgoNmp17By9ItJr8o7ChX0XxY91nk='

要生成非决定性的签名, 您可以通过一个额外的签名选项( )

var { randomBytes } = require('crypto');
var keyPair = ECPair.fromWIF(
  'L4rK1yDtCWekvXuE6oXD9jCYfFNV2cWRpVuPLBcCU2z8TrisoyY1',
);
var privateKey = keyPair.privateKey;
var message = 'This is an example of a signed message.';

var signature = bitcoinMessage.sign(message, privateKey, keyPair.compressed, {
  extraEntropy: randomBytes(32),
});
console.log(toBase64(signature));
// => different (but valid) signature each time

签名比特币消息( 有 segwit 地址)

// P2SH(P2WPKH) address 'p2sh(p2wpkh)'
var signature = bitcoinMessage.sign(message, privateKey, keyPair.compressed, {
  segwitType: 'p2sh(p2wpkh)',
});
console.log(toBase64(signature));
// => 'I9L5yLFjti0QTHhPyFrZCT1V/MMnBtXKmoiKDZ78NDBjERki6ZTQZdSMCtkgoNmp17By9ItJr8o7ChX0XxY91nk='

// P2WPKH address 'p2wpkh'
var signature = bitcoinMessage.sign(message, privateKey, keyPair.compressed, {
  segwitType: 'p2wpkh',
});
console.log(toBase64(signature));
// => 'J9L5yLFjti0QTHhPyFrZCT1V/MMnBtXKmoiKDZ78NDBjERki6ZTQZdSMCtkgoNmp17By9ItJr8o7ChX0XxY91nk='

使用 Signer 接口签名比特币消息 .

var keyPair = ECPair.fromWIF(
  'L4rK1yDtCWekvXuE6oXD9jCYfFNV2cWRpVuPLBcCU2z8TrisoyY1',
);
var privateKey = keyPair.privateKey;
var message = 'This is an example of a signed message.';

var secp256k1 = require('tiny-secp256k1');
// Notice we are using the privateKey var from the outer scope inside the sign function.
var signer = {
  signRecoverable: (hash, extraData) =>
    secp256k1.signRecoverable(hash, privateKey, extraData),
};

var signature = bitcoinMessage.sign(message, signer, keyPair.compressed);
console.log(toBase64(signature));
// => 'H9L5yLFjti0QTHhPyFrZCT1V/MMnBtXKmoiKDZ78NDBjERki6ZTQZdSMCtkgoNmp17By9ItJr8o7ChX0XxY91nk='

符号 Async( 消息、 私密 Key、 压缩 [、 网络. message Prefix、 sig options]) 与符号相同, 除了返回一个承诺, 可以接受一个 SignerAsync 接口而不是私人 Key

同步签名比特币消息

var keyPair = ECPair.fromWIF(
  'L4rK1yDtCWekvXuE6oXD9jCYfFNV2cWRpVuPLBcCU2z8TrisoyY1',
);
var privateKey = keyPair.privateKey;
var message = 'This is an example of a signed message.';

bitcoinMessage
  .signAsync(message, privateKey, keyPair.compressed)
  .then(signature => {
    console.log(toBase64(signature));
  });
// => 'H9L5yLFjti0QTHhPyFrZCT1V/MMnBtXKmoiKDZ78NDBjERki6ZTQZdSMCtkgoNmp17By9ItJr8o7ChX0XxY91nk='

使用 SignerAsync 接口同步签名比特币消息

var keyPair = ECPair.fromWIF(
  'L4rK1yDtCWekvXuE6oXD9jCYfFNV2cWRpVuPLBcCU2z8TrisoyY1',
);
var privateKey = keyPair.privateKey;
var message = 'This is an example of a signed message.';

var secp256k1 = require('tiny-secp256k1');
// Note that a Signer will also work
var signerAsync = {
  signRecoverable: (hash, extraData) =>
    Promise.resolve(secp256k1.signRecoverable(hash, privateKey, extraData)),
};
var signer = {
  signRecoverable: (hash, extraData) =>
    secp256k1.signRecoverable(hash, privateKey, extraData),
};

bitcoinMessage
  .signAsync(message, signerAsync, keyPair.compressed)
  .then(signature => {
    console.log(toBase64(signature));
  });
// => 'H9L5yLFjti0QTHhPyFrZCT1V/MMnBtXKmoiKDZ78NDBjERki6ZTQZdSMCtkgoNmp17By9ItJr8o7ChX0XxY91nk='
bitcoinMessage
  .signAsync(message, signer, keyPair.compressed)
  .then(signature => {
    console.log(toBase64(signature));
  });
// => 'H9L5yLFjti0QTHhPyFrZCT1V/MMnBtXKmoiKDZ78NDBjERki6ZTQZdSMCtkgoNmp17By9ItJr8o7ChX0XxY91nk='

校验( 消息、 地址、 签名 [, network. messagePrefix, checkSegwitAlways])

验证比特币消息

var address = '1F3sAm6ZtwLAUnj7d38pGFxtP3RVEvtsbV';

console.log(bitcoinMessage.verify(message, address, signature));
// => true

关于 Electrum segwit 签名支持

  • 用于签名:对两种 segwit 类型(p2sh-p2wpkh和p2wpkh)使用非 segwit 压缩签名参数
  • 用于校验: 通过检查SegwitAlways 参数为真 。 (消息前缀应设定为对 Bitcoin 消息的默认无效) Prefix

自由主义 麻省理工学院

版本与发布记录

@bitcoinerlab/btcmessage 共发布 3 个版本,首次发布于 2026/02/19;过去 12 个月发布了 3 个版本。

版本发布日期距今
4.0.2latest2026/11/052 天前
4.0.12026/02/198 个月前
4.0.02026/02/198 个月前

关于 @bitcoinerlab/btcmessage 的常见问题

@bitcoinerlab/btcmessage 是什么?

比特币-消息分叉

如何安装 @bitcoinerlab/btcmessage?

在项目目录运行 npm install @bitcoinerlab/btcmessage,或使用 pnpm add / yarn add / bun add。

@bitcoinerlab/btcmessage 支持 TypeScript 吗?

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

@bitcoinerlab/btcmessage 支持 ESM 还是 CommonJS?

以 CommonJS 形式发布,可以直接 require();在 ES Module 项目中也可以用 import 引入(Node.js 会把 module.exports 作为默认导出)。

@bitcoinerlab/btcmessage 需要什么版本的 Node.js?

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

@bitcoinerlab/btcmessage 可以商用吗?

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

@bitcoinerlab/btcmessage 的下载量有多少?

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

@bitcoinerlab/btcmessage 还在维护吗?

最新版本 4.0.2 发布于 2026/11/05(2 天前);至今共发布 3 个版本,其中过去 12 个月发布了 3 个;首次发布于 2026/02/19。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。