# @bitcoinerlab/btcmessage 中文文档

规范地址：https://npmcn.com/package/%40bitcoinerlab/btcmessage/

版本：4\.0\.2
npm 元数据更新时间：2026-11-05T12:35:09.762Z
中文译文更新时间：2026-11-08T04:40:07.935Z
软件包许可：MIT

本文由上游 README 翻译，可能存在偏差，请结合原文核对 API、命令与配置。版权与许可归原作者所有。

原始 npm 页面：https://www.npmjs.com/package/%40bitcoinerlab/btcmessage
原文对照：https://npmcn.com/package/%40bitcoinerlab/btcmessage/?lang=original
项目主页：https://github.com/bitcoinerlab/bitcoinjs-message
源码仓库：https://github.com/bitcoinerlab/bitcoinjs-message

## 关键信息（来自 npm 元数据）

- 包体积（解压后）：17.6 kB，5 个文件
- 模块格式：CommonJS
- TypeScript 类型：包内自带
- Node.js 要求：\>=20\.0\.0
- 运行依赖：5 个
- 首次发布：2026-02-19T14:30:31.117Z
- 最新版本发布：2026-11-05T12:35:09.594Z
- 近 30 天下载量：4032（2026-10-08 至 2026-11-06，npm 官方下载统计）
- 已发布版本数：3（近 12 个月 3 个）

## 中文简介

比特币-消息分叉

## 安装

```sh
npm install @bitcoinerlab/btcmessage
```

也可以使用：`pnpm add @bitcoinerlab/btcmessage`、`yarn add @bitcoinerlab/btcmessage`、`bun add @bitcoinerlab/btcmessage`

## README

# 比特币消息

[![js-standard-style](https://cdn.rawgit.com/feross/standard/master/badge.svg)](https://github.com/feross/standard)

从 [比特币消息](https://github.com/bitcoinjs/bitcoinjs-message)以 npm 形式发布 `@bitcoinerlab/btcmessage`。 。 。 .

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

```javascript
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值再利用不是一个问题.

签名比特币消息

```javascript
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='
```

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

```javascript
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 地址)

```javascript
// 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 接口签名比特币消息 .

```javascript
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

同步签名比特币消息

```javascript
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 接口同步签名比特币消息

```javascript
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\])

验证比特币消息

```javascript
var address = '1F3sAm6ZtwLAUnj7d38pGFxtP3RVEvtsbV';

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

## 关于 Electrum segwit 签名支持

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

## 自由主义 [麻省理工学院](https://npmcn.com/package/%40bitcoinerlab/btcmessage/LICENSE)

## 常见问题

### @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 和提交记录判断。

