message-signing

Compare original and translation side by side

🇺🇸

Original

English
🇨🇳

Translation

Chinese

BSV Message Signing

BSV 消息签名

Three approaches for message signing on BSV, from simple to full-featured.
BSV上的三种消息签名方案,从简单到全功能覆盖。

Quick Reference

快速参考

ApproachPackageUse Case
Direct SDK
@bsv/sdk
Simple message signing (BSM, BRC-77)
Templates
@bopen-io/templates
Script parsing/creation for protocols
Sigma Protocol
sigma-protocol
Transaction-bound signatures
方案适用场景
直接使用SDK
@bsv/sdk
简单消息签名(BSM、BRC-77)
模板
@bopen-io/templates
协议的脚本解析/创建
Sigma协议
sigma-protocol
交易绑定签名

1. Direct SDK Signing

1. 直接使用SDK签名

For simple message authentication without transaction context.
适用于无交易上下文的简单消息身份验证。

BSM (Bitcoin Signed Message)

BSM (Bitcoin Signed Message)

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

const privateKey = PrivateKey.fromWif("L1...");
const message = [/* byte array */];

// Sign
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");

// Verify - recover public key and check address
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("Signer:", pubKey.toAddress());
      break;
    }
  } catch { /* try next */ }
}
typescript
import { BSM, PrivateKey, Signature, BigNumber } from "@bsv/sdk";

const privateKey = PrivateKey.fromWif("L1...");
const message = [/* byte array */];

// Sign
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");

// Verify - recover public key and check address
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("Signer:", pubKey.toAddress());
      break;
    }
  } catch { /* try next */ }
}

BRC-77 (SignedMessage)

BRC-77 (SignedMessage)

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

const signer = PrivateKey.fromWif("L1...");
const message = [/* byte array */];

// Public signature (anyone can verify)
const sig = SignedMessage.sign(message, signer);
const valid = SignedMessage.verify(message, sig);

// Private signature (only recipient can verify)
const recipientPubKey = PublicKey.fromString("02...");
const privateSig = SignedMessage.sign(message, signer, recipientPubKey);

const recipientKey = PrivateKey.fromWif("K1...");
const privateValid = SignedMessage.verify(message, privateSig, recipientKey);
See:
examples/bsm-sign-verify.ts
,
examples/brc77-private-sig.ts
typescript
import { SignedMessage, PrivateKey, PublicKey } from "@bsv/sdk";

const signer = PrivateKey.fromWif("L1...");
const message = [/* byte array */];

// Public signature (anyone can verify)
const sig = SignedMessage.sign(message, signer);
const valid = SignedMessage.verify(message, sig);

// Private signature (only recipient can verify)
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. Template-Based Signing

2. 基于模板的签名

For working with BitCom protocols and script parsing. Uses
@bopen-io/templates
.
适用于处理BitCom协议和脚本解析,使用
@bopen-io/templates

Sigma Template

Sigma模板

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

// Decode from existing script
const bitcom = BitCom.decode(script);
const sigmas = Sigma.decode(bitcom);

// Create signature (given pre-computed hashes)
const inputHash = Array.from(Hash.sha256(outpointBytes));
const dataHash = Array.from(Hash.sha256(scriptDataBytes));

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

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

// Generate locking script
const lockingScript = sigma.lock();
typescript
import { Sigma, SigmaAlgorithm, BitCom } from "@bopen-io/templates";
import { PrivateKey, Hash } from "@bsv/sdk";

// Decode from existing script
const bitcom = BitCom.decode(script);
const sigmas = Sigma.decode(bitcom);

// Create signature (given pre-computed hashes)
const inputHash = Array.from(Hash.sha256(outpointBytes));
const dataHash = Array.from(Hash.sha256(scriptDataBytes));

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

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

// Generate locking script
const lockingScript = sigma.lock();

AIP Template

AIP模板

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

// Decode AIP from script
const bitcom = BitCom.decode(script);
const aips = AIP.decode(bitcom);

// Create AIP signature
const aip = await AIP.sign(dataBytes, privateKey, {
  algorithm: "BITCOIN_ECDSA",
  fieldIndexes: [0, 1, 2]  // optional: specific fields to sign
});

const valid = aip.verify();
See:
examples/sigma-template.ts
Note: Sigma template requires
sigma-protocol
as peer dependency for Algorithm enum.
typescript
import { AIP, BitCom } from "@bopen-io/templates";

// Decode AIP from script
const bitcom = BitCom.decode(script);
const aips = AIP.decode(bitcom);

// Create AIP signature
const aip = await AIP.sign(dataBytes, privateKey, {
  algorithm: "BITCOIN_ECDSA",
  fieldIndexes: [0, 1, 2]  // optional: specific fields to sign
});

const valid = aip.verify();
参考:
examples/sigma-template.ts
注意: Sigma模板需要
sigma-protocol
作为对等依赖项,用于Algorithm枚举。

3. Sigma Protocol (Full Transaction Signing)

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

For complete transaction-bound signatures. Use when:
  • Signing OP_RETURN data in transactions
  • Need multiple signatures on same output
  • Want automatic hash calculation from transaction context
bash
bun add sigma-protocol
typescript
import { Sigma, Algorithm } from "sigma-protocol";
import { Transaction, PrivateKey } from "@bsv/sdk";

// Create Sigma instance
const sigma = new Sigma(tx, targetVout, sigmaInstance, refVin);

// Sign with BSM (default)
const { signedTx } = sigma.sign(privateKey);

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

// Sign with BRC-77 for specific verifier (private)
const { signedTx: tx3 } = sigma.sign(privateKey, Algorithm.BRC77, verifierPubKey);

// Verify
const valid = sigma.verify();
const privateValid = sigma.verify(recipientPrivateKey);  // for private BRC-77
适用于完整的交易绑定签名。适用于以下场景:
  • 签署交易中的OP_RETURN数据
  • 同一输出需要多个签名
  • 希望从交易上下文自动计算哈希
bash
bun add sigma-protocol
typescript
import { Sigma, Algorithm } from "sigma-protocol";
import { Transaction, PrivateKey } from "@bsv/sdk";

// Create Sigma instance
const sigma = new Sigma(tx, targetVout, sigmaInstance, refVin);

// Sign with BSM (default)
const { signedTx } = sigma.sign(privateKey);

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

// Sign with BRC-77 for specific verifier (private)
const { signedTx: tx3 } = sigma.sign(privateKey, Algorithm.BRC77, verifierPubKey);

// Verify
const valid = sigma.verify();
const privateValid = sigma.verify(recipientPrivateKey);  // for private BRC-77

Multiple Signatures

多重签名

typescript
// First signature (user with BSM)
const sigma1 = new Sigma(tx, 0, 0);
const { signedTx } = sigma1.sign(userKey, Algorithm.BSM);

// Second signature (platform with BRC-77)
const sigma2 = new Sigma(signedTx, 0, 1);
sigma2.sign(platformKey, Algorithm.BRC77);

// Verify each
sigma2.setSigmaInstance(0);
sigma2.verify();  // User

sigma2.setSigmaInstance(1);
sigma2.verify();  // Platform
See:
examples/sigma-multi-sig.ts
typescript
// First signature (user with BSM)
const sigma1 = new Sigma(tx, 0, 0);
const { signedTx } = sigma1.sign(userKey, Algorithm.BSM);

// Second signature (platform with BRC-77)
const sigma2 = new Sigma(signedTx, 0, 1);
sigma2.sign(platformKey, Algorithm.BRC77);

// Verify each
sigma2.setSigmaInstance(0);
sigma2.verify();  // User

sigma2.setSigmaInstance(1);
sigma2.verify();  // Platform
参考:
examples/sigma-multi-sig.ts

Algorithm Comparison

算法对比

FeatureBSMBRC-77
Key derivationDirectChild key per message
RecoveryFrom signatureEmbedded in signature
Private verifyNoYes (with recipient key)
SDK module
BSM
SignedMessage
特性BSMBRC-77
密钥派生直接派生每条消息使用子密钥
恢复从签名恢复嵌入签名中
私有验证不支持支持(需接收方密钥)
SDK模块
BSM
SignedMessage

When to Use What

场景选型

ScenarioApproach
Simple message authDirect SDK (BSM or BRC-77)
BAP identity signing
bsv-bap
library
Parse existing Sigma/AIP scriptsTemplates
Build BitCom transaction outputsTemplates
Sign transaction OP_RETURN datasigma-protocol
Multiple signatures per outputsigma-protocol
Platform + user dual signingsigma-protocol
场景方案
简单消息身份验证直接使用SDK(BSM或BRC-77)
BAP身份签名
bsv-bap
解析现有Sigma/AIP脚本模板
构建BitCom交易输出模板
签署交易OP_RETURN数据sigma-protocol
同一输出多签名sigma-protocol
平台+用户双重签名sigma-protocol

BAP Identity Signing (BSM)

BAP身份签名(BSM)

BAP identities use BSM for signing. The
bsv-bap
library handles this:
typescript
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]);

// Sign with BSM (uses derived identity signing key)
const message = toArray("Hello World", "utf8");
const { address, signature } = identity.signMessage(message);

// Verify BSM signature
const isValid = bap.verifySignature("Hello World", address, signature);
A CLI is also available:
npm install -g bsv-bap
(see
create-bap-identity
skill).
BAP身份使用BSM进行签名,
bsv-bap
库可处理此功能:
typescript
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]);

// Sign with BSM (uses derived identity signing key)
const message = toArray("Hello World", "utf8");
const { address, signature } = identity.signMessage(message);

// Verify BSM signature
const isValid = bap.verifySignature("Hello World", address, signature);
同时提供CLI工具:
npm install -g bsv-bap
(参见**
create-bap-identity
**技能)。

Additional Resources

额外资源

Reference Files

参考文件

  • references/brc-77-spec.md
    - Full BRC-77 specification
  • references/sigma-advanced.md
    - Remote signing, hash details, advanced patterns
  • references/brc-77-spec.md
    - 完整BRC-77规范
  • references/sigma-advanced.md
    - 远程签名、哈希细节、高级模式

Examples

示例

  • examples/bsm-sign-verify.ts
    - Direct BSM signing
  • examples/brc77-private-sig.ts
    - BRC-77 private signatures
  • examples/sigma-template.ts
    - Template-based Sigma operations
  • examples/sigma-multi-sig.ts
    - Full sigma-protocol with multi-sig
  • 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多签名示例