Frage zum Bitcoin-Transaktionsprotokoll (möglicherweise spezifisch für Coursera Bitcoin Lecture)

Im Kurs „Bitcoin and Cryptocurrency Technologies“ von Coursera wurde eine Münze namens ScroogeCoin vorgestellt.

Diese Münze ähnelt Bitcoin darin, dass jede Transaktion aus einer Reihe von Eingaben und Ausgaben besteht. Eingaben verweisen auf Ausgaben früherer Transaktionen mit entsprechenden Signaturen, und Ausgaben enthalten den Wert und die Adresse, auf die der Wert angewendet wird.

Das Protokoll prüft, ob (Summe der Eingabewerte) – (Summe der Ausgabewerte) >= 0, und diese Differenz ist die Transaktionsgebühr.

Ich habe das Gefühl, dass dieser Zustand zu locker ist und es möglicherweise ein Problem gibt. Angenommen, Alice hat eine Münze im Wert von 50 und gibt 100 aus, während Bob eine Münze im Wert von 100 hat und 50 ausgibt. Beide befinden sich in derselben Transaktion. Dann würde das Protokoll dies zulassen.

Ich bin der Meinung, dass das Protokoll stattdessen überprüfen sollte

Für alle Adressen (Summe der Eingabewerte von der Adresse) - (Summe der Ausgabewerte, die von der Adresse ausgegeben werden) >= 0

Dies liegt daran, dass das ursprüngliche Protokoll Ausgaben von der Adresse einer anderen Person aus zulässt. Das klingt nach etwas, das ausgenutzt werden kann, zB wird eine implizite Geldüberweisung von Bob an Alice versteckt. Wir können davon ausgehen, dass Alice und Bob zusammenarbeiten, um dies zu erreichen.

Ist das gutartig?

Ich glaube nicht, dass ich wirklich verstehe, worüber Sie sich Sorgen machen. Solange Alice und Bob beide der Ausgabe ihrer Münzen zustimmen, gibt es kein Problem, oder? Machen Sie sich Sorgen, dass der Rest des Netzwerks nicht erkennen kann, wie die Münzen von Alice und Bob zwischen den beiden Ausgängen aufgeteilt wurden? Nun, warum sollten sie es sagen können? Es geht niemanden etwas an, außer Alice und Bob.

Antworten (3)

Um eine Eingabe zu erstellen, müssen Sie nachweisen können, dass Sie das Recht haben, diese Münzen auszugeben, normalerweise indem Sie den entsprechenden privaten Schlüssel für ihre Adresse besitzen.

Angenommen, Alice hat eine Münze im Wert von 50 und gibt 100 aus, während Bob eine Münze im Wert von 100 hat und 50 ausgibt. Beide befinden sich in derselben Transaktion.

Um eine Transaktion wie von Ihnen beschrieben durchzuführen, müssen die privaten Schlüssel von Alice und Bob gleichzeitig verfügbar sein. Dies entspricht konzeptionell Alice und Bob, die dieselbe Brieftasche verwenden. In der Praxis müssten Alice und Bob separate Transaktionen verwenden, wenn ihre Brieftaschen unterschiedlich wären.

Ja, die privaten Schlüssel von Alice und Bob werden verwendet, um die jeweiligen Signaturen zu erstellen. Zum Beispiel kann Alice ihren privaten Schlüssel verwenden, um die Signatur zu erstellen, die entsprechende Eingabe und Ausgabe an Bob senden, und dann schließt Bob die Erstellung der Transaktion ab, indem er Signaturen für seine Eingabe- und Ausgabemünzen erstellt. Wollen Sie damit sagen, dass dies theoretisch ein möglicher Exploit ist, aber in Bezug auf die Implementierung lehnen wir dies ab, da eine einzelne Transaktion Eingabeadressen aus einer einzelnen Brieftasche verwenden muss?
Das ist nicht möglich, während die Schlüssel geheim gehalten werden. Der Autor der Transaktion muss alle Schlüssel kennen. In Ihrem Beispiel sind also Alice und Bob dieselbe Person. Sie können keine einzelne Transaktion erstellen, die die Schlüssel verschiedener Personen enthält.
Es tut mir leid, dass ich die Eingabetaste gedrückt und versehentlich meine Antwort gesendet habe, bevor sie vollständig war. In meiner aktualisierten Antwort beschrieb ich eine Möglichkeit, eine solche Transaktion zu konspirieren und zu konstruieren, ohne private Schlüssel preiszugeben. Gibt es irgendetwas in den Protokollen oder Validierungen, das dies verbietet?
Ja, ich hatte deine Änderung nicht bemerkt. Ich bin mir nicht ganz sicher, ob das, was Sie in Bezug auf das Teilen der Signatur beschreiben, möglich ist, aber da wir theoretisch sprechen, nehmen wir an, dass dies der Fall ist. Das Ergebnis einer solchen Transaktion wäre, dass 50 von Bobs Münzen verwendet werden, um Alices Wohltäter zu bezahlen. Eine Transaktion funktioniert, indem die Eingaben summiert und dann auf die Ausgaben verteilt werden. Die Spending-Signatur gibt nicht das Ausgabeziel an, das auf Transaktionsebene definiert ist. Bob müsste diese Transaktion erstellen und hat keine Motivation dazu.
Also ich denke das ist möglich? Ich stimme zu, dass es vielleicht wenig Motivation gibt. Ich dachte, dass es Alice und Bob vielleicht aufgrund äußerer Kräfte verboten ist, sich gegenseitig Geld zu schicken, und dies erlaubt ihnen, die Tatsache zu verbergen. Andererseits ist mir gerade klar geworden, dass es für Alice und Bob mehrere andere Möglichkeiten gibt, dasselbe Ziel zu erreichen. Vielen Dank für die Diskussion!

Es spielt keine Rolle, wessen Coins die Transaktion finanzieren (Eingaben), die Validierungsprüfung funktioniert immer noch.

(Summe Eingangswerte) - (Summe Ausgangswerte) >= 0

Es gibt nichts, das die Summe der Eingabewerte pro Benutzer angibt. Solange der Gesamtwert der Inputs, egal von wem oder woher sie kommen, größer oder gleich dem Gesamtwert der Outputs ist, besteht die Transaktion die Prüfung.

Update : Es ist kein Exploit. Jede Transaktionseingabe wird separat behandelt, und die Bedingung zum Ausgeben jeder Eingabe muss separat erfüllt werden. Wenn Alice eine Eingabe tx liefert, muss sie auch eine scriptSig für diese einzelne Eingabe liefern, um zu beweisen, dass sie berechtigt ist, sie auszugeben. Ähnlich wie bei Bobs Transaktion muss er eine völlig separate scriptSig liefern, die beweist, dass er berechtigt ist, seine Eingabetransaktion auszugeben.

Alice kann Bobs Transaktion nicht ausgeben und umgekehrt (es sei denn, es handelt sich um ein Multisig, Ausgaben von irgendjemandem usw.), egal wie sie als Eingaben kombiniert werden.

Ja, ich frage, warum die Validierung so gestaltet ist und ob dies ausgenutzt werden kann. Und ich habe ein Beispiel für eine mögliche Ausbeutung gegeben (oder vielleicht wird dies nicht als Ausbeutung angesehen).
Antwort auf Aktualisierung: Ich glaube, dass eine einzelne Transaktion mehrere Eingaben und mehrere Ausgaben enthalten kann. Siehe en.bitcoin.it/wiki/Transaction#Explanation . Jede Eingabe hat ihre eigene separate Signatur und die Validierungsbedingung wird auf alle Eingaben und alle Ausgaben angewendet. Wenn mir also nichts fehlt, scheint es mir, dass ich eine solche Transaktion konstruieren und das Netzwerk dazu bringen kann, sie zu akzeptieren.

Ihr Missverständnis liegt hier:

Angenommen, Alice hat eine Münze im Wert von 50 und gibt 100 aus, während Bob eine Münze im Wert von 100 hat und 50 ausgibt. 

Das ist nicht möglich. Wenn eine Ausgabe von einer Eingabe ausgegeben wird, wird sie immer vollständig ausgegeben. Sie können nicht sagen, wie viel von diesem Output übrig bleibt – die Menge, die Sie aus diesem Input erhalten, ist genau die Menge, die durch die vorherige Menge erzeugt wurde.

Wenn Bob eine Münze im Wert von 100 hat und nur 50 ausgeben möchte, kann er nur seine 100-Münze ausgeben und der Transaktion eine zusätzliche Ausgabe hinzufügen, die 50 an ihn zurücksendet (normalerweise an eine neue Adresse von ihm, aus Datenschutzgründen).

Ich war nicht klar. Was ich meinte ist. Alice gibt eine Münze von 50 aus und sendet eine Münze im Wert von 100 an eine Adresse X. Bob gibt eine Münze von 100 aus und sendet eine Münze im Wert von 50 an eine Adresse Y. Beides geschieht in derselben Transaktion. Daher sehen wir in dieser Transaktion Eingaben mit dem Wert {50, 100} und Ausgaben mit dem Wert {50, 100}.
Was hast du gemeint?