message-signing
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
ChineseBSV Message Signing
BSV 消息签名
Three approaches for message signing on BSV, from simple to full-featured.
BSV上的三种消息签名方案,从简单到全功能覆盖。
Quick Reference
快速参考
| Approach | Package | Use Case |
|---|---|---|
| Direct SDK | | Simple message signing (BSM, BRC-77) |
| Templates | | Script parsing/creation for protocols |
| Sigma Protocol | | Transaction-bound signatures |
| 方案 | 包 | 适用场景 |
|---|---|---|
| 直接使用SDK | | 简单消息签名(BSM、BRC-77) |
| 模板 | | 协议的脚本解析/创建 |
| Sigma协议 | | 交易绑定签名 |
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.tsexamples/brc77-private-sig.tstypescript
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.tsexamples/brc77-private-sig.ts2. Template-Based Signing
2. 基于模板的签名
For working with BitCom protocols and script parsing. Uses .
@bopen-io/templates适用于处理BitCom协议和脚本解析,使用。
@bopen-io/templatesSigma 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.tsNote: Sigma template requires as peer dependency for Algorithm enum.
sigma-protocoltypescript
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模板需要作为对等依赖项,用于Algorithm枚举。
sigma-protocol3. 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-protocoltypescript
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-protocoltypescript
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-77Multiple 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(); // PlatformSee:
examples/sigma-multi-sig.tstypescript
// 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.tsAlgorithm Comparison
算法对比
| Feature | BSM | BRC-77 |
|---|---|---|
| Key derivation | Direct | Child key per message |
| Recovery | From signature | Embedded in signature |
| Private verify | No | Yes (with recipient key) |
| SDK module | | |
| 特性 | BSM | BRC-77 |
|---|---|---|
| 密钥派生 | 直接派生 | 每条消息使用子密钥 |
| 恢复 | 从签名恢复 | 嵌入签名中 |
| 私有验证 | 不支持 | 支持(需接收方密钥) |
| SDK模块 | | |
When to Use What
场景选型
| Scenario | Approach |
|---|---|
| Simple message auth | Direct SDK (BSM or BRC-77) |
| BAP identity signing | |
| Parse existing Sigma/AIP scripts | Templates |
| Build BitCom transaction outputs | Templates |
| Sign transaction OP_RETURN data | sigma-protocol |
| Multiple signatures per output | sigma-protocol |
| Platform + user dual signing | sigma-protocol |
| 场景 | 方案 |
|---|---|
| 简单消息身份验证 | 直接使用SDK(BSM或BRC-77) |
| 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 library handles this:
bsv-baptypescript
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: (see skill).
npm install -g bsv-bapcreate-bap-identityBAP身份使用BSM进行签名,库可处理此功能:
bsv-baptypescript
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-bapcreate-bap-identityAdditional Resources
额外资源
Reference Files
参考文件
- - Full BRC-77 specification
references/brc-77-spec.md - - Remote signing, hash details, advanced patterns
references/sigma-advanced.md
- - 完整BRC-77规范
references/brc-77-spec.md - - 远程签名、哈希细节、高级模式
references/sigma-advanced.md
Examples
示例
- - Direct BSM signing
examples/bsm-sign-verify.ts - - BRC-77 private signatures
examples/brc77-private-sig.ts - - Template-based Sigma operations
examples/sigma-template.ts - - Full sigma-protocol with multi-sig
examples/sigma-multi-sig.ts
- - 直接BSM签名
examples/bsm-sign-verify.ts - - BRC-77私有签名
examples/brc77-private-sig.ts - - 基于模板的Sigma操作
examples/sigma-template.ts - - 完整sigma-protocol多签名示例
examples/sigma-multi-sig.ts