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?
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.
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.
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).
Nate Eldredge