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多签名