The Bitcoin Message Tool in Go
A lightweight CLI tool for signing and verification of bitcoin messages. Bitcoin message is the most straightforward and natural way to prove ownership over a given address without revealing any confidential information.
This tool closely follows specification described in BIP137
go install github.com/shadowy-pycoder/go-bitcoin-message-tool/cmd/bmt@latest
This will install the bmt
binary to your $GOPATH/bin
directory.
bmt -h
██████╗ ███╗ ███╗████████╗
██╔══██╗████╗ ████║╚══██╔══╝
██████╔╝██╔████╔██║ ██║
██╔══██╗██║╚██╔╝██║ ██║
██████╔╝██║ ╚═╝ ██║ ██║
╚═════╝ ╚═╝ ╚═╝ ╚═╝
Bitcoin Message Tool by shadowy-pycoder
GitHub: https://github.com/shadowy-pycoder
Usage: bmt [OPTIONS] COMMAND
Options:
-h show this help message and exit
Commands:
sign Create bitcoin message
verify Verify bitcoin message
create Create wallet (private key, public key, addresses)
Usage bmt sign [-h] -p -a {legacy, nested, segwit} -m [MESSAGE ...] [-d] [-e]
Options:
-a value
type of bitcoin address (legacy, nested, segwit)
-d sign deterministically (RFC6979)
-e create electrum-like signature
-h show this help message and exit
-m string
[MESSAGE ...] message to sign
-p private key in wallet import format (WIF)
Examples:
Deterministic signature for compressed private key and legacy address
bmt sign -p -a legacy -d -m "ECDSA is the most fun I have ever experienced"
PrivateKey (WIF): L3V9AFB763LKWWsMh8CyosSG8QV8KDTjYeXqkt4WX5Xyz2aNqLAY
-----BEGIN BITCOIN SIGNED MESSAGE-----
ECDSA is the most fun I have ever experienced
-----BEGIN BITCOIN SIGNATURE-----
16wrm6zJek6REbxbJSLsBHehn3Lj1vo57t
H3x5bM2MpXK9MyLLbIGWQjZQNTP6lfuIjmPqMrU7YZ5CCm5bS9L+zCtrfIOJaloDb0mf9QBSEDIs4UCd/jou1VI=
-----END BITCOIN SIGNATURE-----
Usage bmt verify [-h] [-f | -a ADDRESS -m [MESSAGE ...] -s SIGNATURE] [-e] [-v] [-r]
Options:
-a string
ADDRESS bitcoin address
-e verify electrum-like signature
-f verify message in RFC2440-like format
-h show this help message and exit
-m string
[MESSAGE ...] message to verify
-r recover public key
-s value
SIGNATURE bitcoin signature in base64 format
-v show full message
Examples:
Message verification in verbose mode
bmt verify -a 175A5YsPUdM71mnNCC3i8faxxYJgBonjWL \
-m "ECDSA is the most fun I have ever experienced" \
-s HyiLDcQQ1p2bKmyqM0e5oIBQtKSZds4kJQ+VbZWpr0kYA6Qkam2MlUeTr+lm1teUGHuLapfa43JjyrRqdSA0pxs= \
-v
true
message verified to be from 175A5YsPUdM71mnNCC3i8faxxYJgBonjWL
Display a recovered public key
bmt verify -a 175A5YsPUdM71mnNCC3i8faxxYJgBonjWL \
-m "ECDSA is the most fun I have ever experienced" \
-s HyiLDcQQ1p2bKmyqM0e5oIBQtKSZds4kJQ+VbZWpr0kYA6Qkam2MlUeTr+lm1teUGHuLapfa43JjyrRqdSA0pxs= \
-r
true
024aeaf55040fa16de37303d13ca1dde85f4ca9baa36e2963a27a1c0c1165fe2b1
Verify message in RFC2440-like format
bmt verify -f -v -r
Insert message in RFC2440-like format (or Ctrl+C to quit):
-----BEGIN BITCOIN SIGNED MESSAGE-----
ECDSA is the most fun I have ever experienced
-----BEGIN BITCOIN SIGNATURE-----
16wrm6zJek6REbxbJSLsBHehn3Lj1vo57t
H3x5bM2MpXK9MyLLbIGWQjZQNTP6lfuIjmPqMrU7YZ5CCm5bS9L+zCtrfIOJaloDb0mf9QBSEDIs4UCd/jou1VI=
-----END BITCOIN SIGNATURE-----
true
message verified to be from 16wrm6zJek6REbxbJSLsBHehn3Lj1vo57t
02700317e20cefbcd8a9e2f294ff2585bc0b8dc981bfe68f72c42497d1b5239988
Usage bmt create [-h] [-n {1...1000000}] [-path]
Options:
-h show this help message and exit
-n value
number of wallets to create [1...1000000] (default 1)
-path string
path to a file to write created wallets (if ommited prints to stdout)
Examples:
Create 100 key pairs with addresses and write to wallets.txt
bmt create -n 100 -path=./wallets.txt
Create a wallet and print to console (you can redirect output to a file)
bmt create -n 1
Private Key (HEX): 850cece14ffefdb864f6007718a5243dae9194841617c7d6d77b67482d40d856
Private Key (WIF): L1gLtHEKG4FbbxQDzth3ksCZ4jTSjRvcU7K2KDeDE368pG8MjkFg
Public Key (Raw): (X=691ab7d2b2e1b41a8df334a5471a3abd7a93c8822b2abf3de64c552147dc33b8, Y=b1eed621c6b9e790a901ca30eb55ee95d591c3e6dc2e6aa30f2b9f5c525e7e32)
Public Key (HEX Compressed): 02691ab7d2b2e1b41a8df334a5471a3abd7a93c8822b2abf3de64c552147dc33b8
Legacy Address: 1N3kZRUrEioGxXQbSyCWuBwmoFp4T62i93
Nested SegWit Address: 3KWsrxLMHPU1v8riptj33zCsWD8bf6jfLF
Native SegWit Address: bc1qum0at29ayuq2ndk39z4zwf4zdpxv5ker570ape
Taproot Address: bc1p5utaw0g77graev5yw575c3jnzh8j88ezzw39lgr250ghppwpyccsvjkvyp