brainstorming
brainstorming
You MUST use this before any creative work - creating features, building components, adding functionality, modifying behavior, or planning anything new, in software or out of it (a talk, a business, a renovation).
bitcoin-message-signingGeneric Bitcoin message signing: BIP137 (legacy P2PKH-only) and BIP322 (modern, supports any output type). Used for proof-of-ownership, withdraw verification, federated authentication, exchange KYC-free attestation. USE WHEN: implementing "sign this message with your Bitcoin address", verifying ownership of an address, building auth via signing.
Independent GitHub snapshot · Automated classification · Original documentation governs
Two specifications:
prefix = "Bitcoin Signed Message:\n"
preamble = varint(len(prefix)) || prefix || varint(len(msg)) || msg
hash = SHA256d(preamble)
signature = recoverable_ecdsa_sign(privkey, hash) # 65 bytes
encoded = base64(signature)
Verify: recover pubkey from signature, derive P2PKH address, compare.
Limitations:
Generalizes signing by constructing a virtual transaction:
to_spend = transaction with:
version=0, locktime=0,
vin = [{ prevout: 0xffffffff..., scriptSig: OP_0 PUSH msg_hash, sequence: 0 }],
vout = [{ value: 0, scriptPubKey: <message-target scriptPubKey> }]
to_sign = transaction with:
version=0, locktime=0,
vin = [{ prevout: txid_of_to_spend, vout: 0, sequence: 0 }],
vout = [{ value: 0, scriptPubKey: OP_RETURN }]
Then sign to_sign as a normal transaction spending to_spend's
output. The signature can be:
to_sign PSBT-like blob. Required for
P2SH or anything with non-witness data.def verify_bip322(address, message, signature_b64):
spk = address_to_scriptPubKey(address)
msg_hash = bip322_hash(message)
to_spend = build_to_spend(spk, msg_hash)
to_sign = build_to_sign(to_spend)
apply_signature(to_sign, signature_b64)
return script_executes_successfully(to_sign, vin[0])
bitcoinjs-lib (since 6.x) — BIP322 sign/verify.python-bitcoinlib — BIP137 native, BIP322 via plugin.rust-bitcoin — BIP322 in signed-message crate.bitcoinj — BIP137; BIP322 incomplete.SIGHASH_DEFAULT to be
byte-identical to a real Taproot spend; some libraries default to
SIGHASH_ALL (0x01) which encodes a different sighash.