Multisig-Skript-Hashing (p2sh): Unterschied zwischen Legacy und Segwit

Vor einiger Zeit bemerkte ich, dass die Methoden von Bitcoin Core bei gleichen Eingaben addmultisigaddressunterschiedliche createmultisigp2sh (Adressen) generierten.

Ich habe mich umgehört und ein Benutzer von der Bitcoin-Entwicklerliste sagte mir, dass dies daran lag:

"addmultisigaddress verwendet den Standardadresstyp der Brieftasche, der p2sh-segwit ist, und createmultisig verwendet einen Standardadresstyp von Legacy"

Ein Beispiel für dieses Verhalten ist:

bitcoin-cli addmultisigaddress 1 '["045897fee25bd7c5692510b2f50fcae9aa20fbc4d49d59814f4c7fdb5c4bc6eb1c0ce382458f9588e922e0d509ed8d34856787380075b00418b02e0bf7c652ef9d","02ac46c6d74d15e60f4f1035ff07ef740aca1d68d55ba0b8d336a73d7a35858831","0224a4dc5620714a9ecf67a09583d1e4c04f5bedb8ecea99028da05bb15a2a7e07"]'
{
  "address": "36ULucjWUTrDvaJzCyhFoVbDoNS6Zum2Du",
  "redeemScript": "5141045897fee25bd7c5692510b2f50fcae9aa20fbc4d49d59814f4c7fdb5c4bc6eb1c0ce382458f9588e922e0d509ed8d34856787380075b00418b02e0bf7c652ef9d2102ac46c6d74d15e60f4f1035ff07ef740aca1d68d55ba0b8d336a73d7a35858831210224a4dc5620714a9ecf67a09583d1e4c04f5bedb8ecea99028da05bb15a2a7e0753ae"
}

bitcoin-cli createmultisig 1 '["045897fee25bd7c5692510b2f50fcae9aa20fbc4d49d59814f4c7fdb5c4bc6eb1c0ce382458f9588e922e0d509ed8d34856787380075b00418b02e0bf7c652ef9d","02ac46c6d74d15e60f4f1035ff07ef740aca1d68d55ba0b8d336a73d7a35858831","0224a4dc5620714a9ecf67a09583d1e4c04f5bedb8ecea99028da05bb15a2a7e07"]'
{
  "address": "3GiimyxF1R5VixfBFAbQZbuy9EesD2r6n1",
  "redeemScript": "5141045897fee25bd7c5692510b2f50fcae9aa20fbc4d49d59814f4c7fdb5c4bc6eb1c0ce382458f9588e922e0d509ed8d34856787380075b00418b02e0bf7c652ef9d2102ac46c6d74d15e60f4f1035ff07ef740aca1d68d55ba0b8d336a73d7a35858831210224a4dc5620714a9ecf67a09583d1e4c04f5bedb8ecea99028da05bb15a2a7e0753ae"
}

Der Punkt ist, dass ich später bemerkte, dass die beiden Methoden mit bestimmten öffentlichen Schlüsseln denselben Hash erzeugen:

bitcoin-cli addmultisigaddress 1 '["03fc5e16d0ece343a94735ca467d5812922fcc30e3ce43ceaf3cff7d7617631146","02ea92a0cd1738cef7502e42fe119a322845f8f1a2dd9b7216635e17dd2fffd101","04633794a75bfbd9fb2bc6bd54836831c0916dc27f9ac528045cc9352bb2cc97a003b3a6ae397101d801f3d95e6a153368b939aaf7b27bd3a5bb8a30ed92aac204"]'
{
  "address": "32AVnYUUSvm4bGgEXoQ2zuFAJBPH4P31Gi",
  "redeemScript": "512103fc5e16d0ece343a94735ca467d5812922fcc30e3ce43ceaf3cff7d76176311462102ea92a0cd1738cef7502e42fe119a322845f8f1a2dd9b7216635e17dd2fffd1014104633794a75bfbd9fb2bc6bd54836831c0916dc27f9ac528045cc9352bb2cc97a003b3a6ae397101d801f3d95e6a153368b939aaf7b27bd3a5bb8a30ed92aac20453ae"
}

bitcoin-cli createmultisig 1 '["03fc5e16d0ece343a94735ca467d5812922fcc30e3ce43ceaf3cff7d7617631146","02ea92a0cd1738cef7502e42fe119a322845f8f1a2dd9b7216635e17dd2fffd101","04633794a75bfbd9fb2bc6bd54836831c0916dc27f9ac528045cc9352bb2cc97a003b3a6ae397101d801f3d95e6a153368b939aaf7b27bd3a5bb8a30ed92aac204"]'
{
  "address": "32AVnYUUSvm4bGgEXoQ2zuFAJBPH4P31Gi",
  "redeemScript": "512103fc5e16d0ece343a94735ca467d5812922fcc30e3ce43ceaf3cff7d76176311462102ea92a0cd1738cef7502e42fe119a322845f8f1a2dd9b7216635e17dd2fffd1014104633794a75bfbd9fb2bc6bd54836831c0916dc27f9ac528045cc9352bb2cc97a003b3a6ae397101d801f3d95e6a153368b939aaf7b27bd3a5bb8a30ed92aac20453ae"
}

Ich verstehe nicht, wie dies möglich sein kann, wenn die Eingaben und die Einlöseskripte identisch sind.

Was ist der Unterschied zwischen den beiden Fällen und im Allgemeinen zwischen einer Legacy-Multisig-Transaktion und einer Segwit-Transaktion?

Wie kann man beim Lesen von rohen Transaktionsdaten aus der Blockchain wissen, ob ein Skript mit Legacy oder Segwit gehasht werden muss?

Ich bin mir nicht sicher, warum das passiert. Wenn es mindestens einen unkomprimierten öffentlichen Schlüssel gibt, sollten beide Methoden Legacy-p2sh-Adressen liefern. Mir ist jedoch aufgefallen, dass wir im ersten Fall, wenn Sie den unkomprimierten öffentlichen Schlüssel von Position 1 auf Position 2 oder 3 verschieben, während Sie den RPC-Aufruf übergeben, mit beiden Methoden die gleichen p2sh-Adressen erhalten.
Das ist ein guter Punkt @UgamKamat, danke. Ich habe jedoch nicht gedacht, dass, wenn einer der Pubkeys unkomprimiert ist, p2sh ein Legacy sein muss, da Segwit keine unkomprimierten Schlüssel unterstützt. Für eine allgemeine Regel reicht es jedoch nicht aus, da ich denke, dass auch in dem Fall, in dem alle Pubkeys komprimiert sind, der p2sh immer noch veraltet sein kann
das ist richtig, aber was mich verwirrt, ist, warum die beiden RPC-Aufrufe in Ihrem ersten Fall unterschiedliche Adressen angeben. Sie können überprüfen, ob Sie den unkomprimierten öffentlichen Schlüssel im ersten Fall an die letzte Position verschieben und beide RPC-Aufrufe ausführen, sie geben die gleichen P2SH-Adressen. Was ich nicht verstehe, ist, warum sie unterschiedlich sind, wenn der unkomprimierte öffentliche Schlüssel zuerst kommt
Ist in beiden Beispielen der unkomprimierte Pubkey Teil Ihrer Brieftasche? Ich glaube hier liegt ein Bug vor.

Antworten (1)

Ich glaube, das Verhalten, das Sie sehen, ist tatsächlich ein Fehler.

Verwendet standardmäßig addmultisigaddressp2sh-segwit, den Standardadresstyp für die Brieftasche. Verwendet standardmäßig createmultisigLegacy. Dies sind zwei verschiedene Adresstypen, und normalerweise erhalten Sie zwei verschiedene Adressen.

Segwit erlaubt jedoch keine unkomprimierten öffentlichen Schlüssel. Wenn also das RedeemScript erstellt wird und ein unkomprimierter öffentlicher Schlüssel erkannt wird, geben beide RPCs Legacy-Adressen zurück. Deshalb sehen Sie im zweiten Beispiel dieselbe Adresse.

Aber ich glaube da ist ein Bug. Ihr erstes Beispiel sollte auch die gleichen Legacy-Adressen geben, tut es aber nicht. Ich denke, das liegt daran, dass der unkomprimierte Pubkey nicht Teil der Brieftasche ist, sodass nicht korrekt erkannt wird, dass es sich um einen unkomprimierten Pubkey handelt. Folgt also addmultisigaddressseinem Standard, um Ihnen die p2sh-segwit-Adresse zu geben, und createmultisigfolgt seinem Standard, um Ihnen die Legacy-Adresse zu geben.

Wie kann man beim Lesen von rohen Transaktionsdaten aus der Blockchain wissen, ob ein Skript mit Legacy oder Segwit gehasht werden muss?

Für p2sh-segwit ist das einlösenScript nicht wirklich das einlösenScript, das Sie von den RPCs erhalten. Vielmehr ist es das Skript für eine P2WSH-Ausgabe. Das "redeemScript" ist eigentlich das WitnessScript für das P2WSH-Skript, das das eigentliche RedeemScript ist. Der Skripttyp (entweder im scriptPubKey oder im resolveScript) bestimmt, ob diese Ausgabe segwit ist oder nicht.

Ich stimme zu, dass es einen Fehler gibt, aber selbst wenn diese öffentlichen Schlüssel nicht zur Brieftasche hinzugefügt werden und Sie den unkomprimierten öffentlichen Schlüssel von der ersten Position zur letzten verschieben, generieren beide eine Legacy-Adresse. Dies funktioniert nur, wenn der unkomprimierte öffentliche Schlüssel an letzter Stelle steht. Aus diesem Grund sind im zweiten Fall in der Frage beide Adressen gleich (der unkomprimierte öffentliche Schlüssel befindet sich in diesem Beispiel an letzter Stelle).