В течение дня стояла задача подписать и проверить сообщение в кошельке Litecoin.Несколько дней поиска не работали, поэтому мне пришлось переписать некоторые из моих функций, используя библиотеку биткойн для подписи и проверки сообщений.Отдельное спасибо ребятам из electrum за их достижения, которые помогли найти решения.Ладно, меньше слов, больше кода ...
import bitcoin
class SignVerify:
def sign(self, address, message, private_key):
if self.check_if_not_message(message):
set_data = self.sign_message_with_private_key(private_key, address, message)
return set_data
else:
raise AttributeError('Incorrect private key.')
def verify(self, message, signature, public_key):
if self.check_if_not_message(signature):
return self.ecdsa_verify(message, signature, public_key)
else:
raise AttributeError('Signature is empty.')
def sign_message_with_private_key(self, private_key, address, message):
message_in_byte = message.encode()
return self.ecdsa_sign(message_in_byte, private_key)
@staticmethod
def check_if_not_message(message):
if message is None or not message or message == ' ':
return
return True
@staticmethod
def litecoin_sig_hash(message):
padded = b"\x19Litecoin Signed Message:\n" + bitcoin.num_to_var_int(
len(message)) + bitcoin.from_string_to_bytes(message)
return bitcoin.bin_dbl_sha256(padded)
def ecdsa_sign(self, msg, priv):
v, r, s = bitcoin.ecdsa_raw_sign(self.litecoin_sig_hash(msg), priv)
sig = bitcoin.encode_sig(v, r, s)
assert self.ecdsa_verify(msg, sig,
bitcoin.privtopub(priv)), "Bad Sig!\t %s\nv = %d\n,r = %d\ns = %d" % (sig, v, r, s)
return sig
def ecdsa_verify(self, msg, sig, pub):
return bitcoin.ecdsa_raw_verify(self.litecoin_sig_hash(msg), bitcoin.decode_sig(sig), pub)
if __name__ == '__main__':
message = 'LNXKMg8NTd5XLAF2n3HNMYYbyZB6KR7E4x'
address = 'LNXKMg8NTd5XLAF2n3HNMYYbyZB6KR7E4x'
privkey = 'T8vwiYErLrsWVytCzaFtQkaYgMYRN2qi4XaWYveeEVBfiiepnNjE'
public_key = '034835d15daca879dd91689e4f2c0650d495bdde0fdb4edb8ceb909830cdf7f26f'
a = SignVerify()
signature = a.sign(address=address, message=message, private_key=privkey)
print('sign => ', signature)
print('verify => ', a.verify(message=message, signature=signature, public_key=public_key))
Надеюсь, кто-нибудь поможет)))