BSV消息签名Skill message-signing

此技能用于在BSV(Bitcoin SV)区块链上进行消息签名和验证,支持BSM、BRC-77和Sigma协议等多种方法。适用于身份认证、交易签名、脚本解析等场景,关键词包括BSV、消息签名、区块链、加密、身份验证、BRC-77、BSM、Sigma协议。

加密算法 0 次安装 0 次浏览 更新于 3/15/2026

name: message-signing description: 当用户询问“签名消息”、“验证签名”、“使用BSM”、“使用BRC-77”、“实现Sigma签名”、“创建签名消息”、“用比特币验证”或提到消息签名、签名验证或BSV上的认证协议时,应使用此技能。

BSV 消息签名

三种在BSV上进行消息签名的方法,从简单到功能齐全。

快速参考

方法 使用场景
直接SDK签名 @bsv/sdk 简单消息签名(BSM, BRC-77)
模板签名 @bopen-io/templates 协议的脚本解析/创建
Sigma协议 sigma-protocol 交易绑定签名

1. 直接SDK签名

用于没有交易上下文的简单消息认证。

BSM(比特币签名消息)

import { BSM, PrivateKey, Signature, BigNumber } from "@bsv/sdk";

const privateKey = PrivateKey.fromWif("L1...");
const message = [/* 字节数组 */];

// 签名
const signature = BSM.sign(message, privateKey, "raw") as Signature;
const h = new BigNumber(BSM.magicHash(message));
const recovery = signature.CalculateRecoveryFactor(privateKey.toPublicKey(), h);
const compactSig = signature.toCompact(recovery, true, "base64");

// 验证 - 恢复公钥并检查地址
const sig = Signature.fromCompact(compactSig, "base64");
for (let r = 0; r < 4; r++) {
  try {
    const pubKey = sig.RecoverPublicKey(r, new BigNumber(BSM.magicHash(message)));
    if (BSM.verify(message, sig, pubKey)) {
      console.log("签名者:", pubKey.toAddress());
      break;
    }
  } catch { /* 尝试下一个 */ }
}

BRC-77(签名消息)

import { SignedMessage, PrivateKey, PublicKey } from "@bsv/sdk";

const signer = PrivateKey.fromWif("L1...");
const message = [/* 字节数组 */];

// 公共签名(任何人都可以验证)
const sig = SignedMessage.sign(message, signer);
const valid = SignedMessage.verify(message, sig);

// 私有签名(只有接收者可以验证)
const recipientPubKey = PublicKey.fromString("02...");
const privateSig = SignedMessage.sign(message, signer, recipientPubKey);

const recipientKey = PrivateKey.fromWif("K1...");
const privateValid = SignedMessage.verify(message, privateSig, recipientKey);

参见: examples/bsm-sign-verify.ts, examples/brc77-private-sig.ts

2. 基于模板的签名

用于处理BitCom协议和脚本解析。使用@bopen-io/templates

Sigma模板

import { Sigma, SigmaAlgorithm, BitCom } from "@bopen-io/templates";
import { PrivateKey, Hash } from "@bsv/sdk";

// 从现有脚本解码
const bitcom = BitCom.decode(script);
const sigmas = Sigma.decode(bitcom);

// 创建签名(给定预计算的哈希)
const inputHash = Array.from(Hash.sha256(outpointBytes));
const dataHash = Array.from(Hash.sha256(scriptDataBytes));

const sigma = Sigma.sign(inputHash, dataHash, privateKey, {
  algorithm: SigmaAlgorithm.BRC77,  // 或 SigmaAlgorithm.BSM
  vin: 0
});

// 验证
const valid = sigma.verifyWithHashes(inputHash, dataHash);

// 生成锁定脚本
const lockingScript = sigma.lock();

AIP模板

import { AIP, BitCom } from "@bopen-io/templates";

// 从脚本解码AIP
const bitcom = BitCom.decode(script);
const aips = AIP.decode(bitcom);

// 创建AIP签名
const aip = await AIP.sign(dataBytes, privateKey, {
  algorithm: "BITCOIN_ECDSA",
  fieldIndexes: [0, 1, 2]  // 可选:指定要签名的字段
});

const valid = aip.verify();

参见: examples/sigma-template.ts

注意: Sigma模板需要sigma-protocol作为对等依赖项,用于算法枚举。

3. Sigma协议(完整交易签名)

用于完整的交易绑定签名。使用场景:

  • 在交易中签名OP_RETURN数据
  • 需要同一输出上的多个签名
  • 希望从交易上下文自动计算哈希
bun add sigma-protocol
import { Sigma, Algorithm } from "sigma-protocol";
import { Transaction, PrivateKey } from "@bsv/sdk";

// 创建Sigma实例
const sigma = new Sigma(tx, targetVout, sigmaInstance, refVin);

// 用BSM签名(默认)
const { signedTx } = sigma.sign(privateKey);

// 用BRC-77签名
const { signedTx: tx2 } = sigma.sign(privateKey, Algorithm.BRC77);

// 用BRC-77为特定验证者签名(私有)
const { signedTx: tx3 } = sigma.sign(privateKey, Algorithm.BRC77, verifierPubKey);

// 验证
const valid = sigma.verify();
const privateValid = sigma.verify(recipientPrivateKey);  // 用于私有BRC-77

多个签名

// 第一个签名(用户用BSM)
const sigma1 = new Sigma(tx, 0, 0);
const { signedTx } = sigma1.sign(userKey, Algorithm.BSM);

// 第二个签名(平台用BRC-77)
const sigma2 = new Sigma(signedTx, 0, 1);
sigma2.sign(platformKey, Algorithm.BRC77);

// 验证每个
sigma2.setSigmaInstance(0);
sigma2.verify();  // 用户

sigma2.setSigmaInstance(1);
sigma2.verify();  // 平台

参见: examples/sigma-multi-sig.ts

算法比较

特性 BSM BRC-77
密钥派生 直接 每个消息的子密钥
恢复 从签名中 嵌入在签名中
私有验证 是(带接收者密钥)
SDK模块 BSM SignedMessage

何时使用什么

场景 方法
简单消息认证 直接SDK(BSM或BRC-77)
BAP身份签名 bsv-bap
解析现有Sigma/AIP脚本 模板
构建BitCom交易输出 模板
签名交易OP_RETURN数据 sigma-protocol
每个输出多个签名 sigma-protocol
平台 + 用户双重签名 sigma-protocol

BAP身份签名(BSM)

BAP身份使用BSM进行签名。bsv-bap库处理此功能:

import { BAP } from "bsv-bap";
import { Utils } from "@bsv/sdk";
const { toArray } = Utils;

const bap = new BAP({ rootPk: wif });
const identity = bap.getId(bap.listIds()[0]);

// 用BSM签名(使用派生的身份签名密钥)
const message = toArray("Hello World", "utf8");
const { address, signature } = identity.signMessage(message);

// 验证BSM签名
const isValid = bap.verifySignature("Hello World", address, signature);

还可用CLI:npm install -g bsv-bap(参见**create-bap-identity**技能)。

附加资源

参考文件

  • references/brc-77-spec.md - 完整的BRC-77规范
  • references/sigma-advanced.md - 远程签名、哈希详情、高级模式

示例

  • examples/bsm-sign-verify.ts - 直接BSM签名
  • examples/brc77-private-sig.ts - BRC-77私有签名
  • examples/sigma-template.ts - 基于模板的Sigma操作
  • examples/sigma-multi-sig.ts - 完整的sigma-protocol多签名