Wie erstelle ich eine Bitcoin-Adresse?

Ich studiere gerade Bitcoin und bin den Anweisungen des Bitcoin-Wikis gefolgt , um eine Adresse zu erstellen.

Aber mein Programm reagiert nie so wie die obige Site.

Angeblich sollte der 0450863AD64A87AE8A2FE83C1AF1A8403CB53F53E486D8511DAD8A04887E5B23522CD470243453A299FA9E77237716103ABC11A1DF38855ED6F2EE187E9C582BA6SHA-256 des ECDSA-Schlüssels sein 600FFE422B4E00731A59557A5CCA46CC183944191006324A447BDB2D98D4B408, aber mein Code kehrt zurück 32511e82d56dcea68eb774094e25bab0f8bdd9bc1eca1ceeda38c7a43aceddceund ich denke nicht, dass er falsch ist, weil viele Online-SHA-256-Dienste dasselbe zurückgeben.

Muss ich das Hex in etwas anderes wie Binär umwandeln, um den Hash zu generieren?

Antworten (3)

Die Hashes werden anhand des Byte-Rohwerts des Schlüssels berechnet, nicht anhand der Hex-codierten Zeichenfolge:

from hashlib import sha256
key = '0450863AD64A87AE8A2FE83C1AF1A8403CB53F53E486D8511DAD8A04887E5B23522CD470243453A299FA9E77237716103ABC11A1DF38855ED6F2EE187E9C582BA6'
sha256(key).hexdigest()
# Output: '32511e82d56dcea68eb774094e25bab0f8bdd9bc1eca1ceeda38c7a43aceddce'
sha256(key.decode('hex')).hexdigest()
# Output: '600ffe422b4e00731a59557a5cca46cc183944191006324a447bdb2d98d4b408'

Der Trick besteht also darin, den String in seine ursprüngliche Form zu hexen, bevor er gehasht wird.

Ich würde den anderen oben zustimmen.

Sehr einfach ausgedrückt, füttern Sie höchstwahrscheinlich eine Textzeichenfolge mit einer eigenen binären Darstellung der Zeichen. dies hat keine nützliche Beziehung zu den tatsächlichen binären Bitmustern, die durch die Textcodierung der Zeichen dargestellt werden. Nehmen Sie also, wie oben erwähnt, Ihren Text der Hex-Symbole und konvertieren Sie ihn in eine binäre Darstellung dessen, was ursprünglich beabsichtigt war.

Beachten Sie, dass dies nicht nur für SHA-256 gilt. Dies kann ein Problem für jedes Programm sein, das binäre Eingaben erwartet.

Ein ähnliches Problem tritt auf, wenn die Textdarstellung von Daten in einem Coinbase-Download dekodiert wird. Es hat einen Zeichenwert des Datums, aber alles, was ich brauche, ist das Datum selbst im Datumsformat. Nicht schwierig, aber es lässt einen innehalten, um wirklich darüber nachzudenken, was man braucht.

Hoffe das hilft.

Prost

Angenommen, Sie haben bereits einen öffentlichen Schlüssel, so können Sie mit Python eine Adresse generieren:

import binascii, hashlib, base58

# alias method
decode_hex = binascii.unhexlify

def gen_address(public_key):
    # perform SHA-256 hashing on the public key
    sha256 = hashlib.sha256()
    sha256.update( decode_hex(public_key) )
    hash = sha256.hexdigest()

    # public key hash (for p2pkh) - perform RIPEMD-160 hashing on the result of SHA-256
    # prepend mainnet version byte
    ripemd160 = hashlib.new('ripemd160')
    ripemd160.update( decode_hex(hash) )
    public_key_hash = ripemd160.hexdigest()
    mainnet_public_key_hash = '00' + public_key_hash

    # perform SHA-256 hash on the extended RIPEMD-160 result
    sha256 = hashlib.sha256()
    sha256.update( decode_hex(mainnet_public_key_hash) )
    hash = sha256.hexdigest()

    # perform SHA-256 on the previous SHA-256 hash
    sha256 = hashlib.sha256()
    sha256.update( decode_hex(hash) )
    hash = sha256.hexdigest()

    # create a checksum using the first 4 bytes of the previous SHA-256 hash
    # appedend the 4 checksum bytes to the extended RIPEMD-160 hash
    checksum = hash[:8]
    hash = mainnet_public_key_hash + checksum

    # convert RIPEMD-160 + checksum into base58 encoded string
    return base58.b58encode( decode_hex(hash) )