Wie gibt man eine bestimmte Menge Bitcoin an eine Adresse zurück?

Ich versuche, ein Programm zu schreiben, um Bitcoin zu empfangen, und nach einiger Zeit dieselbe Menge Bitcoin an dieselbe Adresse zurückzugeben.

Wie würdest du das machen? Hat Bitcoin die Möglichkeit, Coins über dieselbe Adresse zu senden und zu empfangen, oder müsste ich nach einer Rücksendeadresse fragen und die Adresse des gesendeten Betrags irgendwie mit der Rücksendeadresse verknüpfen?

Antworten (3)

Sie sollten nach einer Rücksendeadresse fragen. Bitcoin-Transaktionen enthalten keine "Von-Adresse", sie referenzieren nur die Ausgabe einer anderen (vorherigen) Transaktion. Eine Ausgabe kann ein P2PKH (Pay-to-Public-Key-Hash) sein, aber es kann genauso gut ein P2SH (Pay-to-Script-Hash) sein, und einige andere können in Zukunft implementiert werden.

Es besteht auch eine große Möglichkeit, eine Transaktion zu erhalten, die auf viele frühere Ausgaben verweist, wie es passiert, wenn jemand, der Ihnen 1 BTC zahlt, zuvor viele kleinere Transaktionen erhalten hat.

Es wäre auch für Ihre Benutzer unintuitiv, da es sich bei Bitcoin um Best Practice handelt, sich nicht darum zu kümmern, woher die Bitcoins kommen, und stattdessen für jede empfangene Transaktion eine neue Adresse zu generieren.

Außerdem sollte man keine Kryptographie selbst implementieren, wenn man nicht schon ein Top-Level-Experte ist, es gibt einfach zu viele Dinge, die schief gehen können. Ich würde empfehlen, eine geeignete API zu verwenden.

Müsste ich in meiner ursprünglichen Frage eine Art Kryptografie implementieren? Ich dachte nicht, dass ich das müsste.
Sie müssten eine Bitcoin-Transaktion erstellen, und das ist Kryptografie. Sie implementieren die Berechnungen nicht, aber Sie arbeiten mit der Schlüsselverwaltung (Auswahl, an welche Adresse gesendet werden soll).

Aus Liebe zu allem, was heilig ist, tun Sie dies nicht. Halten:

Alice möchte dir 1 Bitcoin schicken. Sie bittet ihren Wallet-Anbieter, Ihnen 1 Bitcoin zu senden. Ihr Wallet-Anbieter sendet Ihnen die Bitcoins, die er von Bob erhalten hat, als er in sein Wallet eingezahlt hat.

Sie sehen sich die Transaktion an und sehen, dass die Münzen von Bobs Einzahlungsadresse stammen. Also schickst du Coins an diese Adresse zurück. Alices Wallet-Anbieter sieht Coins, die an Bobs Einzahlungsadresse eingegangen sind, und schreibt Bob Gutschriften zu.

Bob wundert sich, warum er einige Bitcoins von einem zufälligen Fremden erhalten hat, aber da er keine Ahnung hat, wer Sie sind, und keine Möglichkeit hat, Sie zu kontaktieren, behält er sie einfach. Verdammt, vielleicht ist es eine Adresse, die er als Trinkgeld veröffentlicht hat, und er hat keinen Grund, nicht zu glauben, dass es ein Trinkgeld ist.

Alice könnte sich irgendwann fragen, warum sie ihre Bitcoins nicht bekommen hat. Wenn sie Sie kontaktiert, teilen Sie ihr die Transaktions-ID mit. Sie wird denken: "Hmm, das ist nicht meine Adresse. Aber sie muss meinem Wallet-Anbieter gehören. Also müssen sie die Bitcoins haben. Wenn ich ihnen erkläre, dass sie mir gehören, sollten sie sie mir gutschreiben."

Und jetzt haben wir ein riesiges Chaos, in dem jeder jeden beschuldigt und Alice denkt, dass ihr Wallet-Anbieter sie gestohlen hat und Sie denken, dass es nicht Ihre Schuld war. Aber du liegst falsch.

Bitte mach das nicht. Es macht keinen Sinn. (Die obige Geschichte ist real. Nur die Namen wurden geändert, um die Unschuldigen ... und die Schuldigen zu schützen.)

Gibt es also keine Möglichkeit, das zu tun, was ich versuche? Auch wenn ich vom Benutzer nach einer bestimmten Rücksendeadresse frage?
Es ist in Ordnung, wenn Sie den Benutzer nach einer bestimmten Rücksendeadresse fragen. Das macht ShapeShift.
@DavidSchwartz Du sagst "Es macht keinen Sinn", aber inwiefern macht es keinen Sinn? Jede Partei macht Annahmen, und ich sage, der Wallet-Anbieter hat Geld ausgegeben, von dem er nicht sollte ... eine sehr offensichtliche Annahme für jede beteiligte Partei mit Ausnahme des Wallet-Anbieters andere Vermutungen? Warum sollte der Wallet-Anbieter ein Verschlüsselungssystem mit öffentlichem Schlüssel so verwenden, als wäre es ein symmetrisches Schlüsselsystem (z. B. Verletzung des vertrauenswürdigen privaten Eigentums an privaten Schlüsseln, deren Verwaltung ihm anvertraut wurde) und nicht schuldig gemacht werden?
@ user3338098 Ich erkläre nur, dass dies nicht funktioniert, weil das Bitcoin-System nie dafür entwickelt wurde, dass dies funktioniert. Es macht keinen Sinn, weil es die Bitcoins nicht wirklich an die richtige Partei zurückgibt und weil es keinen Grund gibt, dies zu erwarten. Es gibt keine Verletzung des vertrauenswürdigen privaten Eigentums an privaten Schlüsseln – der Anbieter besitzt die privaten Schlüssel und die öffentlichen Schlüssel sind öffentlich.
@DavidSchwartz there is no reason to expect it to do sowarum? Der Bitcoin-Kern stellt keine Aussage über das erwartete Verhalten oder die Semantik bereit, sondern stellt nur die Referenzcodebasis bereit. Das ursprüngliche Whitepaper besagt, dass coins made from digital signatures, which provides strong control of ownershipkeine Kontrolle von Benutzer zu Benutzer übertragen wird ... es besagt auch, dass a new key pair should be usedes sagen sollte, dass es nicht muss ... Ohne eine zentralisierte Autorität, die festlegt, welcher Standpunkt gültig und kanonisch ist, müssen sie beide gültig sein. Warum ist meine Sichtweise ungültig?
Es ist, als würde man sagen, dass das control of ownershipin den Händen des Webanbieters liegt und es daher keine Garantien gibt, wer das Geld erhält. Der Webanbieter könnte das gesamte Geld für sich selbst stehlen, daher sollte nicht erwartet werden, dass JEDE Webanbieter-basierte Zahlungsadresse verwendet wird um Geld an den Benutzer zu senden, von dem Sie es erwarten ...
@ user3338098 Meine Antwort erklärt, wie Ihre Sichtweise zu falschen Schlussfolgerungen führt. Ihre obige Aussage über Webanbieter ist richtig, und deshalb senden wir kein Geld willkürlich an Orte, von denen uns Webanbieter mitteilen, dass es keine Beweise dafür gibt, dass ein bestimmter Empfänger uns ausdrücklich gebeten hat, Geld an einen Ort zu senden, den wir von einem bestimmten Webanbieter erhalten haben. Diese Beweise sind speziell das, was wir im Fall von Bitcoin nicht haben.
@DavidSchwartz That evidence is specifically what we don't have, was ist dann "404371705fa9bd789a2fcd52d2c580b65d35549d" in OP_DUP OP_HASH160 404371705fa9bd789a2fcd52d2c580b65d35549d OP_EQUALVERIFY OP_CHECKSIGder scriptPubKey, und warum ist ein privater Schlüssel erforderlich, um ihn in der scriptSig. Kryptografisch signierte Beweise.
@ DavidSchwartz Your statement above about web providers is right, aber ich habe ein absurdes Argument vorgebracht ( the web-provider could steal all the money for themselves [...] should not be expected to send money to the user you expect it to...), dessen einzige Schlussfolgerung darin bestehen würde, dass niemand jemals einen Webanbieter verwenden sollte (mit Ausnahme von Geldwäsche / masochistischen Spenden auf der Grundlage von Webanbietern). Dies würde der eigentlichen Prämisse für Web-Provider-basierte Wallets widersprechen.
@DavidSchwartz machen wir es einfach, bob zahlt keine Bitcoins ein, sondern zahlt Bargeld auf sein Konto ein, und der Webanbieter, anstatt diesen Betrag wie erwartet (IMO) an seine Bitcoin-Adresse zu überweisen, wird stattdessen sein Geld von a "gepoolte Community-Bitcoin-Adresse", und das ist es, wovon Alice und Bob am Ende Geld ausgeben. Dies verstößt gegen das Eigentumsprinzip und wurde in unserem Gespräch noch nicht besprochen, aber wenn dies der Fall wäre, dann würde ich zustimmen, dass es keine Beweise gab, aber ich würde auch sagen, dass der Webanbieter im falschen Moment war.
@ user3338098 Ich verstehe nicht, gegen welches "Eigentumsprinzip" es Ihrer Meinung nach verstößt. Wenn ich Ihnen Geld schulde, ist es für mich ganz natürlich, jemanden, der mir Geld schuldet, anzuweisen, dieses Geld an Sie zu zahlen. Es ist völlig normal, dass Sie das Geld nicht direkt von der Person erhalten, die Ihnen das Geld schuldete. Aus diesem Grund gibt es Finanzvermittler, und die meisten Menschen, die Bitcoin verwenden, tun dies über Vermittler, weil es schwierig ist, die Selbstverwahrung richtig zu machen.

Wie würdest du das machen?

Ich würde meine mehr oder weniger "öffentliche" Adresse angeben. Dann könnten Leute Satoshis an diese Adresse schicken. Sobald eine Transaktion mit Satoshis bestätigt ist, würde ich die Transaktion analysieren, da sie die Skriptsig und den Pubkey enthält (aus denen wir die Absenderadresse ableiten können). Also würde ich das aufbewahren und wenn es soweit ist, an diese Adresse zurücksenden. Problem hier: Es verringert die Privatsphäre. Es wird nicht empfohlen, Adressen wiederzuverwenden.

Hat Bitcoin die Möglichkeit, Münzen über dieselbe Adresse zu senden und zu empfangen?

Ja, Sie können Ihre Transaktion so einrichten/programmieren, dass Adressen wiederverwendet werden. Man muss allerdings über ausreichende Fähigkeiten verfügen :-)

oder müsste ich nach einer Rücksendeadresse fragen und die Adresse des gesendeten Betrags irgendwie mit der Rücksendeadresse verknüpfen?

Imho, das ist der bessere und gewünschte Weg, weil es die Privatsphäre schützt. Außerdem müssen Sie den Betrag nicht mit der Adresse verknüpfen - dies kann unsicher werden (zwei Personen senden denselben Betrag - wie kann man unterscheiden?). Wie zuvor kann die Transaktion überprüft werden, Sie können sig und pubkey extrahieren und den ursprünglichen Pub-Schlüssel (und seine Adresse) mit der neuen Adresse verknüpfen.
Zu Transaktionen und ihrem Inhalt: https://bitcoin.org/en/developer-reference#raw-transaction-format und auch sehr hilfreich: http://chimera.labs.oreilly.com/books/1234000001802/ch02.html# _bitcoin_transactions (und wahrscheinlich eine Million andere :-)

Datenschutz ist nicht das einzige Problem. Was ist die Sendetransaktion ein Coinjoin? Sie riskieren eine Rücksendung an die falsche Person. Und selbst wenn nicht, sollten Sie nicht erwarten, dass die Absendersoftware eine Zahlung an eine Adresse erwartet, die sie möglicherweise nie explizit als Zahlungsadresse angegeben hat (sie könnte sogar geändert worden sein, ohne zu wissen, wem sie sie gutschreiben soll).
Deshalb brauchen wir mehr PWKUs (Pieter Wuille Knowledge Units) im Blockchain-Bereich :-)