Segwit: Willkürliche Datenspeicherung als Zeuge?

Nehmen wir an, ich möchte den Text der King-James-Version der Bibel Stück für Stück in die Blockkette codieren (ersetzen Sie dies durch eine verrückte Idee, um reichlich Blockplatz zu verbrauchen). OP_RETURN ist unpraktisch, da ich nur mit 80-Byte-Chunks arbeiten kann.

Mir ist aufgefallen, dass SegWit viel mehr Daten zulässt – bis zu 3 MB/Block – in Zeugendaten.

Natürlich kann ich kein V0-Zeugenprogramm verwenden, weil meine Zeugendaten das Formular annehmen müssen

<signature> <pubkey>

Ich glaube jedoch, dass ich ein V1-Witness-Programm verwenden kann. Skripte mit dieser Version werden nicht unmittelbar nach der SegWit-Bereitstellung unterstützt, aber ich bemerke dies in BIP-141 :

Wenn das Versionsbyte 1 bis 16 ist, findet keine weitere Interpretation des Zeugenprogramms oder des Zeugenstapels statt, und es gibt keine Größenbeschränkung für den Zeugenstapel. Diese Versionen sind für zukünftige Erweiterungen reserviert.

Also hier ist mein Plan. Ich werde ein Ausgabeskript des Formulars erstellen:

<0x01> <0x0000>

Dies ist ein V1-Witness-Programm. Gemäß BIP-141 soll das Witness-Programm nicht interpretiert werden, und der nachfolgende Witness Stack hat keine Größenbeschränkung.

Dann werde ich diese Ausgabe mit einer Zeugentransaktionseingabe ausgeben. Der Zeuge meiner Transaktion verschlüsselt tausend Bytes Text.

Wenn ich diese Ausgabentransaktion veröffentliche, wird sie von den Knoten weitergegeben. Sie können es nicht als ungültig ablehnen, da dies die Vorwärtskompatibilität beeinträchtigen würde, wenn V1-Skripte eingeführt werden. BIP-141 sagt nichts darüber aus, ob solche Transaktionen weitergeleitet werden sollten oder nicht (BIP-144 auch nicht), also gehe ich davon aus, dass dies der Fall sein wird.

Solange ich eine ausreichend hohe Gebühr zahle, sollte meine Transaktion schließlich geschürft werden. Ich bekomme sogar 75 % Rabatt auf die Verwendung von OP_RETURN, weil mein Text im Zeugen verschlüsselt ist.

Und das Protokoll wird mich nicht aufhalten. Oder gibt es?

Bearbeiten: Nehmen Sie zur Vereinfachung an, dass SegWit weit verbreitet ist und dass die meisten Knoten V0-Witness-Programme verstehen. Natürlich werden Nicht-SegWit-Knoten eine Witness-Transaktion nicht weiterleiten, da sie als nicht standardisiert betrachtet wird. Ich interessiere mich für das Verhalten von SegWit-Knoten.

Wie hat sich dieses Alter nach der Einführung von SegWit entwickelt?

Antworten (1)

Obwohl Ihre Transaktion nicht ungültig ist, entspricht sie nicht dem Standard. Da es kein Standard ist, wird es nicht verbreitet und als nicht standardisiert zurückgewiesen. Dies bedeutet jedoch nicht, dass es nicht in einen Block aufgenommen werden kann; es kann. Es erfordert nur, dass der Miner und alle Knoten zwischen Ihnen und diesem Miner eine Software ausführen, die nicht standardmäßige Transaktionen akzeptiert und weiterleitet. Allerdings tun dies nicht viele Nodes, sodass es Ihnen möglicherweise schwer fällt, eine gute Verbreitung Ihrer Transaktion zu erreichen.

Nicht-Standard für einen Segwit-Knoten oder einen Nicht-Segwit-Knoten? Wenn Segwit-Knoten eine solche Transaktion als nicht standardmäßig betrachten, wo steht das in der Dokumentation?
Segwit ist so aufgebaut, dass jede SegWit-Ausgabe für Nicht-Segwit-Knoten nicht dem Standard entspricht.
@PieterWuille natürlich. Aber wie würde ein Segwit-Knoten, der nur V0-Witness-Programme versteht, auf meinen Angriff reagieren?
Zukünftige Witness-Versionen sind aus genau dem Grund, den Sie angeben, nicht standardmäßig in Bitcoin Core. Dies ist generisch: Alle existierenden Konstruktionen, die für eine zukünftige Erweiterbarkeit vorgesehen sind, werden als Nicht-Standard behandelt (zB auch die OP_NOPx-Opcodes).
@RichApodaca-Standardität für Ausgaben wird durch diese Funktion hier definiert: github.com/bitcoin/bitcoin/blob/master/src/policy/… . Die aufgerufene Solver-Funktion landet bei diesem if-Block: github.com/bitcoin/bitcoin/blob/master/src/script/… . Aus diesem Code können Sie ersehen, dass alle Nicht-v0-Zeugenausgaben im Solver false zurückgeben, was dann dazu führt, dass IsStandard ebenfalls falsch zurückgibt, was darauf hinweist, dass Nicht-v0-Zeugenausgaben nicht dem Standard entsprechen. Das gleiche passiert hier für Eingaben github.com/bitcoin/bitcoin/blob/master/src/policy/…
Danke @PieterWuille. Es sieht so aus, als hätte ich vermisst, dass alle aktualisierbaren Verhaltensweisen implizit als nicht standardmäßig gekennzeichnet sind, sodass dies nicht in den SegWit-BIPs dokumentiert werden muss.