Ich habe also bereits den öffentlichen Schlüssel. Meine Frage ist, ob ich die b58-Codierung korrekt anwende, da Bitcoin b58check verwendet und auch das Präfix x00 hinzufügt. Kann mir das jemand erklären? Vielen Dank.
import hashlib
import base58
# ECDSA Public Key
base64_str = 'MFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAE7P0EE5amecnYKMlq96RUL3Q+mZJCQrta6iHyjQWtsbbgcBMayhR/CTzDi5j4Fb/wD9EclHt3dpYRyJcl9Rtmug=='
hex_str = base64_str.decode('base64').encode('hex')
sha = hashlib.sha256()
rip = hashlib.new('ripemd160')
sha.update(base64_str.decode('base64'))
rip.update(sha.hexdigest())
# Get address
print base58.b58encode(rip.hexdigest())
Wenn der öffentliche Schlüssel korrekt war (siehe Antwort von Mark), ist der Code nicht vollständig (fehlt der Signatur) und enthält einen Hash eines ASCII-Hexdigest, der nicht korrekt ist.
Ich möchte zu dieser Implementierung der Bitcoin-Adresse aus dem öffentlichen Schlüssel beitragen.
Es deckt sowohl den Fall von unkomprimierten als auch von komprimierten Bitcoin-Adressen ab (nur das Ändern des booleschen Werts compress_pubkey).
#!/usr/bin/env python2
# https://en.bitcoin.it/wiki/Protocol_documentation#Addresses
import hashlib
import base58
# ECDSA bitcoin Public Key
pubkey = '0450863ad64a87ae8a2fe83c1af1a8403cb53f53e486d8511dad8a04887e5b23522cd470243453a299fa9e77237716103abc11a1df38855ed6f2ee187e9c582ba6'
# See 'compressed form' at https://en.bitcoin.it/wiki/Protocol_documentation#Signatures
compress_pubkey = False
def hash160(hex_str):
sha = hashlib.sha256()
rip = hashlib.new('ripemd160')
sha.update(hex_str)
rip.update( sha.digest() )
print ( "key_hash = \t" + rip.hexdigest() )
return rip.hexdigest() # .hexdigest() is hex ASCII
if (compress_pubkey):
if (ord(pubkey[-2:].decode('hex')) % 2 == 0):
pubkey_compressed = '02'
else:
pubkey_compressed = '03'
pubkey_compressed += pubkey[2:66]
hex_str = pubkey_compressed.decode('hex')
else:
hex_str = pubkey.decode('hex')
# Obtain key:
key_hash = '00' + hash160(hex_str)
# Obtain signature:
sha = hashlib.sha256()
sha.update( key_hash.decode('hex') )
checksum = sha.digest()
sha = hashlib.sha256()
sha.update(checksum)
checksum = sha.hexdigest()[0:8]
print ( "checksum = \t" + sha.hexdigest() )
print ( "key_hash + checksum = \t" + key_hash + ' ' + checksum )
print ( "bitcoin address = \t" + base58.b58encode( (key_hash + checksum).decode('hex') ) )
Nein.
Ein öffentlicher Schlüssel (die Daten, die Sie hashen werden) sieht so aus:
04 xx xx xx xx xx ... (uncompressed, 65 hex bytes)
oder
(02 or 03) xx xx xx xx xx ... (compressed, 33 hex bytes)
Es ist kein öffentlicher Schlüssel im DER-Format.
openssl ec
oder openssl pkey
kann sowohl binäres DER als auch PEM erstellen, wodurch das Trim-and-Unbase64 gespeichert wird, aber es ist immer noch SPKI und nicht wirklich das, was Sie wollen. openssl asn1parse <pubkey.pem -strparse 20 -out point.bin
meldet Fehler 0D07207B, schreibt aber trotz Fehler den gewünschten Wert. (Beachten Sie, dass asn1parse 20 für das Tag des BIT STRING benötigt, während 23 der 'gestrippte' Wert ist.)
Stakedex.io
zirkulosmeos