A simple Golang package with a single purpose, to verify messages signed via Bitcoin message signing (BMS).
- Golang 1.21+
Your $PATH
must contain the Go path and the Go bin
path (see GoLang's getting started for more information).
Once done, you can install this package:
go get -u github.com/bitonicnl/verify-signed-message
For examples, checkout the example folder.
This library tries to support as many signatures as possible, as long as they properly follow specifications.
This specification is considered legacy signing in BIP-322.
- Any wallet that does signing like Electrum, example:
- Electrum: P2PKH, P2WPKH and P2SH-P2WPKH
- Coinomi: P2PKH, P2WPKH and P2SH-P2WPKH
- Samourai: P2PKH, P2WPKH and P2SH-P2WPKH
- Mycelium: P2PKH, P2WPKH and P2SH-P2WPKH
- Any wallet that allows for legacy address signatures (P2PKH), example:
- Bitcoin Core
- Any wallet that follows BIP 137, example:
- Trezor: P2PKH, P2WPKH and P2SH-P2WPKH
- Taproot (P2TR)
- The verification is using the internal key, so only addresses without a tapscript are allowed.
- Pay-to-Witness-Script-Hash (P2WSH)
- Simple singing
- P2WPKH - Native Segwit
- P2TR - Taproot
- Simple singing of other types
- Full signing
- Full singing (Proof of Funds)
- Multisig of any kind
The UniSat wallet used to not follow established standards for signing messages when using non-taproot addresses. Specifically, it used to set incorrect recovery flags, resulting in signatures that are seen as invalid by Electrum, Bitcoin Core, Trezor, etc.
This seems to have been resolved in recent versions of Unisat. Not sure if they resolved it or one of their dependencies resolved it, but in our latest tests it worked as expected. If you run into issues, make sure you are using the latest version and generate new signatures.
This package is developed in-house and pushed from our internal repository to GitHub.
Contributions, issues and feature requests are welcome.
Copyright © 2020-2024 Bitonic. This project is ISC licensed.