|
16 | 16 | from bitcoin.wallet import CBitcoinSecret, P2PKHBitcoinAddress
|
17 | 17 | from bitcoin.signmessage import BitcoinMessage, VerifyMessage, SignMessage
|
18 | 18 |
|
19 |
| -key = CBitcoinSecret("L4vB5fomsK8L95wQ7GFzvErYGht49JsCPJyJMHpB4xGM6xgi2jvG") |
20 |
| -address = P2PKHBitcoinAddress.from_pubkey(key.pub) # "1F26pNMrywyZJdr22jErtKcjF8R3Ttt55G" |
21 |
| -message = "Hey I just met you, and this is crazy, but I'll verify my address, maybe ..." |
| 19 | +def sign_message(key, msg): |
| 20 | + secret = CBitcoinSecret(key) |
| 21 | + message = BitcoinMessage(msg) |
| 22 | + return SignMessage(secret, message) |
22 | 23 |
|
23 |
| -message = BitcoinMessage(message) |
| 24 | +def print_default(signature, key=None, msg=None): |
| 25 | + print(signature.decode('ascii')) |
24 | 26 |
|
25 |
| -signature = SignMessage(key, message) |
| 27 | +def print_verbose(signature, key, msg): |
| 28 | + secret = CBitcoinSecret(key) |
| 29 | + address = P2PKHBitcoinAddress.from_pubkey(secret.pub) |
| 30 | + message = BitcoinMessage(msg) |
| 31 | + print('Address: %s' % address) |
| 32 | + print('Message: %s' % msg) |
| 33 | + print('Signature: %s' % signature) |
| 34 | + print('Verified: %s' % VerifyMessage(address, message, signature)) |
| 35 | + print('\nTo verify using bitcoin core:') |
| 36 | + print('\n`bitcoin-cli verifymessage %s \'%s\' \'%s\'`\n' % (address, signature.decode('ascii'), msg)) |
26 | 37 |
|
27 |
| -print(key, address) |
28 |
| -print("Address: %s" % address) |
29 |
| -print("Message: %s" % message) |
30 |
| -print("\nSignature: %s" % signature) |
31 |
| -print("\nVerified: %s" % VerifyMessage(address, message, signature)) |
| 38 | +def parser(): |
| 39 | + import argparse |
| 40 | + parser = argparse.ArgumentParser( |
| 41 | + description='Sign a message with a private key.', |
| 42 | + epilog='Security warning: arguments may be visible to other users on the same host.') |
| 43 | + parser.add_argument( |
| 44 | + '-v', '--verbose', dest='print_result', |
| 45 | + action='store_const', const=print_verbose, default=print_default, |
| 46 | + help='verbose output') |
| 47 | + parser.add_argument( |
| 48 | + '-k', '--key', |
| 49 | + required=True, |
| 50 | + help='private key in base58 encoding') |
| 51 | + parser.add_argument( |
| 52 | + '-m', '--msg', |
| 53 | + required=True, |
| 54 | + help='message to sign') |
| 55 | + return parser |
32 | 56 |
|
33 |
| -print("\nTo verify using bitcoin core;") |
34 |
| -print("`bitcoin-cli verifymessage %s \"%s\" \"%s\"`" % (address, signature.decode('ascii'), message)) |
| 57 | +if __name__ == '__main__': |
| 58 | + args = parser().parse_args() |
| 59 | + try: |
| 60 | + signature = sign_message(args.key, args.msg) |
| 61 | + except Exception as error: |
| 62 | + print('%s: %s' % (error.__class__.__name__, str(error))) |
| 63 | + exit(1) |
| 64 | + else: |
| 65 | + args.print_result(signature, args.key, args.msg) |
0 commit comments