Warum meldet mir gettransaction nur die Empfangsadresse?

Sowohl bei "Sende"- als auch bei "Empfangs"-Transaktionen gettransactiongibt mir der Befehl den Kontonamen und die Empfangsadresse, wobei die Sendeadresse ignoriert wird. Warum sollte ich mich darum kümmern, die Adresse in einer „ Empfangs “-Transaktion zu erhalten? Ich möchte natürlich die Absenderadresse wissen ...

  • "empfangen" --> Adresse senden, Konto empfangen
  • "senden" --> Konto senden, Adresse empfangen

Warum funktioniert das nicht so, was fehlt mir und wie bekomme ich die Sendeadresse in einer Empfangstransaktion?

Bearbeiten : Ich möchte die Frage betonen, warum es sich so verhält? wie in diesem Kommentar "Ich verstehe es nicht: Wenn ich die txid in blockchain.info eingebe, sagt es mir die Absenderadresse, da sie offensichtlich in der Blockchain vorhanden ist ... also ist es nur eine Wahl bitcoind, es mir nicht zu sagen? "

Bearbeiten : Das Zurücksenden von irgendetwas an die Absenderadresse liegt völlig außerhalb des Bereichs der Frage, daher ist es irrelevant, ob sie dort möglicherweise nichts erhalten möchten.

Antworten (2)

Ich hatte vor, eine andere Frage zu beantworten , die inzwischen als Duplikat geschlossen wurde, aber ich werde den dort beschriebenen Fall als Beispiel verwenden, um diese Frage zu beantworten.

Unter der Annahme, dass es sich bei der Transaktion tatsächlich um eine Standardtransaktion handelt, gibt das Skript tatsächlich den Absender der Transaktion preis. Gemäß der Standardtransaktionsbeschreibung in der Protokollspezifikation muss die Transaktion zuerst das Eigentum an einer Ausgabe nachweisen, um sie zu beanspruchen und in der neuen Transaktion auszugeben. Die Transaktion, die dem Absender das Geld gegeben hat, gibt den Hash eines öffentlichen Schlüssels an, an den das Geld gesendet werden soll. In diesem Fall ist es das Ausgabeskript 1 der Transaktion f8c71a9f7...:

OP_DUP OP_HASH160 496650cdb4b6275ca4478c0ce98cb6f7224bb1e7 OP_EQUALVERIFY OP_CHECKSIG

Beachten Sie das 496650cdb4b6275ca4478c0ce98cb6f7224bb1e7darin. Das ist der Hash des öffentlichen Schlüssels. Um diese Ausgabe zu beanspruchen und sie dann an Sie zu senden, muss der Absender sowohl den öffentlichen Schlüssel als auch eine gültige Signatur bereitstellen. Schauen wir uns also das Skript an, das diese Ausgabe beansprucht:

304402205e81e8ed0b1f7cf6d1d415961859d3b95f5e5c353af303b6cef1e3efa6c3349702202fa9fdd6914abd0e9606c78899e7f3010cafdad211645cf459ae18b3b827b2c101 0365e0beb9a0c1497f3667067aeb8f3ea9dc4c9d5696cee7f19eae49f9457a5cfb

Da es sich um eine Standardtransaktion handelt, entspricht sie dem Format <sig> <pubKey>, also ist der öffentliche Schlüssel 0365e0beb9a0c1497f3667067aeb8f3ea9dc4c9d5696cee7f19eae49f9457a5cfb. Um dies zu überprüfen, prüfen wir, ob die Hashes übereinstimmen (Python-Code voraus):

script = "304402205e81e8ed0b1f7cf6d1d415961859d3b95f5e5c353af303b6cef1e3efa6c3349702202fa9fdd6914abd0e9606c78899e7f3010cafdad211645cf459ae18b3b827b2c101 0365e0beb9a0c1497f3667067aeb8f3ea9dc4c9d5696cee7f19eae49f9457a5cfb".split()
h = hashlib.sha256(script[1].decode("hex")).digest()
ripe160 =  hashlib.new('ripemd160')
ripe160.update(h)
d = ripe160.digest()
print d.encode("hex")

Dies sollte zu führen 496650cdb4b6275ca4478c0ce98cb6f7224bb1e7, was der Hash ist, den wir im Ausgabeskript des behaupteten Ausgangs gesehen haben, das schließlich an Sie gesendet wurde. Beachten Sie, dass wir zur Berechnung die Transaktion nicht abrufen mussten, f8c71a9f7...sondern uns lediglich auf Informationen verlassen haben, die Sie aus der von Ihnen erhaltenen Transaktion erhalten konnten. Da eine Adresse nicht viel mehr ist als der Hash eines öffentlichen Schlüssels, können wir einfach eine Adresse aus den bisher gesammelten Informationen erstellen (da wir den Hash bereits haben, beginnen wir bei Schritt 4 der Adresskonstruktion ):

#Prepend the Mainnet prefix
address = ('\x00' + d)
#Calculate checksum
checksum = hashlib.sha256(hashlib.sha256(address).digest()).digest()[:4]
# Build the raw address
address += checksum
# Encode the address in base58
encoded_address = b58encode(address)
print encoded_address

Die Codierung kann mit jedem base58-Encoder erfolgen, ich habe diesen verwendet . Dies sollte die Adresse ausdrucken, die die Adresse 17h6u26N2TVmoPRcvxwUdfAUjDzBJX513Vist, die die Bitcoins in der Transaktion gesendet hat, die wir uns die ganze Zeit angesehen haben. Sie sehen also, die Informationen, nach denen Sie gesucht haben, waren die ganze Zeit in der Transaktion enthalten, aber ziemlich versteckt. So können Sie bei einer eingehenden Transaktion (oder auch einer ausgehenden) rekonstruieren, wer der Absender (oder Empfänger) war. Beachten Sie, dass Sie dadurch den Absender jeder einzelnen Eingabe rekonstruieren können, bei der es sich möglicherweise um mehrere Adressen handelt. Die einfache Annahme, dass eine der Adressen, die die Eingaben signieren, der Absender der Transaktion ist, kann zu dem gewünschten semantischen Ergebnis führen oder auch nicht.

Ich denke, es liegt am beabsichtigten Sicherheitsmodell - Sie generieren eine Adresse für einen Kunden, der Bitcoins an sie sendet.

Wenn man Leuten erlaubt, die Absenderadresse herauszufinden, kann es dazu führen, dass Leute eine Bitcoin-Adresse erstellen und dann Kunden auffordern, ihre Absenderadresse einzugeben.

Wie...

Ich habe diese drei Threads gefunden:

Ich verstehe es nicht: Wenn ich die txid in blockchain.info eingebe, sagt es mir die Absenderadresse, da sie offensichtlich in der Blockchain vorhanden ist ... also ist es nur eine Wahl bitcoind, es mir nicht zu sagen?
Es ist keine Wahl: Bitcoin-Transaktionen haben keine Von“-Adresse. Was sie haben, sind Eingaben, und jede Eingabe bezieht sich auf eine Ausgabe einer vorherigen Transaktion. Jede dieser vorherigen Ausgaben kann eine identifizierbare Adresse haben oder nicht, an die sie Dinge gesendet hat. Es wäre sowohl ineffizient, es nachzuschlagen, als auch falsch, sich darauf zu verlassen. Es gibt Ihnen eine Adresse, die jemandem gehört, der zuvor diese Ausgaben kontrolliert hat (die sich vom Absender unterscheiden können, z. B. für E-Wallets), und der möglicherweise nicht beabsichtigt, dort etwas zu erhalten.
@PieterWuille Ich folge nicht: Wie sagt mir blockchain.info die Eingabeadresse, wie viel ist das genau? (Senden Sie alles zurück, was außerhalb des Geltungsbereichs der Frage liegt)
Sie geben Ihnen die Adresse (falls vorhanden), zu der die verbrauchten vorherigen Ausgaben gehörten. Dies ist nicht Teil der Transaktion selbst, und um dies herauszufinden, müssen alle vorherigen Transaktionen nachgeschlagen werden, deren Ausgaben von dieser ausgegeben wurden. Es ist sicherlich machbar, aber es ist ineffizient, es ist nicht Teil der Transaktion, die Sie nachschlagen (was getrawtransaction abruft), und es verstärkt die falsche Vorstellung, dass Bitcoin-Transaktionen eine Absenderadresse haben.