Wie identifiziere ich eine Multisig-Transaktion?

01000000013dcd7d87904c9cb7f4b79f36b5a03f96e2e729284c09856238d5353e1182b00200000000 fd5d01004730440220762ce7bca626942975bfd5b130ed3470b9f538eb2ac120c2043b445709369628022051d73c80328b543f744aa64b7e9ebefa7ade3e5c716eab4a09b408d2c307ccd701483045022100abf740b58d79cab000f8b0d328c2fff7eb88933971d1b63f8b99e89ca3f2dae602203354770db3cc2623349c87dea7a50cee1f78753141a5052b2d58aeb592bcf50f014cc9524104a882d414e478039cd5b52a92ffb13dd5e6bd4515497439dffd691a0f12af9575fa349b5694ed3155b136f09e63975a1700c9f4d4df849323dac06cf3bd6458cd41046ce31db9bdd543e72fe3039a1f1c047dab87037c36a669ff90e28da1848f640de68c2fe913d363a51154a0c62d7adea1b822d05035077418267b1a1379790187410411ffd36c70776538d079fbae117dc38effafb33304af83ce4894589747aee1ef992f63280567f52f5ba870678b4ab4ff6c8ea600bd217870a8b4f1f09f3a8e8353aeffffffff0130d90000000000001976a914569076ba39fc4ff6a2291d9ea9196d8c08f9c7ab88ac00000000

Sie können das obige tx unter http://chainquery.com/bitcoin-api/decoderawtransaction decodieren

Im Bitcoin Explorer habe ich festgestellt, dass die obige Transaktion 2-3 Multisig-Tx ist. Ich habe verstanden, dass der fett gedruckte Teil fd5d01Skriptlänge hat. sein Wert beträgt 349 Bytes. In einem normalen TX, innerhalb der ScriptSig, das erste Byte, das uns sagt, wie lang die Signatur ist. gefolgt von der Größe des zweiten Elements und dann dem zweiten Element, das Pubkey ist. Nun, wie man die Anzahl der Signaturen identifiziert, die an einem Multisig-Tx wie dem obigen Beispiel beteiligt sind. Ich meine, wie hat der Explorer herausgefunden, dass es sich um 2-3 Multisig handelt. Erstens, wie erkennt man ein Multisig? Und welche Bedeutung hat os OP_0 am Anfang von scriptsig?

Antworten (1)

Wie Sie richtig herausgefunden haben, beschreibt das Längenfeld die folgende Schriftlänge. Dann folgt das SigScript:

004730440220762CE7BCA626942975BFD5B130ED3470B9F538EB2AC120C2043B445709369628022051D73C80328B543F744AA64B7E9EBEFA7ADE3E5C716EAB4A09B408D2C307CCD701483045022100ABF740B58D79CAB000F8B0D328C2FFF7EB88933971D1B63F8B99E89CA3F2DAE602203354770DB3CC2623349C87DEA7A50CEE1F78753141A5052B2D58AEB592BCF50F014CC9524104A882D414E478039CD5B52A92FFB13DD5E6BD4515497439DFFD691A0F12AF9575FA349B5694ED3155B136F09E63975A1700C9F4D4DF849323DAC06CF3BD6458CD41046CE31DB9BDD543E72FE3039A1F1C047DAB87037C36A669FF90E28DA1848F640DE68C2FE913D363A51154A0C62D7ADEA1B822D05035077418267B1A1379790187410411FFD36C70776538D079FBAE117DC38EFFAFB33304AF83CE4894589747AEE1EF992F63280567F52F5BA870678B4AB4FF6C8EA600BD217870A8B4F1F09F3A8E8353AE

Das Skript beginnt mit einer hexadezimalen „0“, die einen sehr frühen „off by one error“ in den Ausführungsroutinen der Checksig-Routinen kompensiert. Ein Element wurde zu viel vom Stapel entfernt. Dieser "Bug" ist so lange im System, dass sich jeder daran gewöhnt hat, und das Entfernen erfordert einen enormen Aufwand. Also wurde es ein Feature :-) Noch mehr, wenn es TX gibt, die eine Ausführungszeit in der Zukunft haben, würden sie nicht mehr funktionieren ...

Wie hat der Explorer herausgefunden, dass es sich um 2-3 Multisig handelt. Erstens, wie erkennt man ein Multisig?

Der Explorer findet dies im Skript sig. Es gibt die beiden Signaturen und den Teil für die Multisig:

<sig1> <sig2> <length> OP2 <pubkey1> <pubkey2> <pubkey3> OP3 AE

um es besser sehen zu können, habe ich das script etwas entschlüsselt. Die Zeichen beginnen mit Hex 0x47 oder 0x48 und enden mit 0x01. Sie sind ASN1-DER-codiert, bieten einen Einblick in die R- und S-Felder und haben umgebende Längeninformationen. Nach dem zweiten 0x01 folgt das Längenfeld, dann der Multisig OPcode (0x02) und die 3 Pubkeys.

00: OP_0, OP_FALSE:      an empty array is pushed onto the stack.
<sig1>
47: OP_DATA_0x47:        push hex 47 (decimal 71) bytes on stack
30: OP_SEQUENCE_0x30:    type tag indicating SEQUENCE, begin sigscript
44: OP_LENGTH_0x44:      length of R + S
02: OP_INT_0x02:         type tag INTEGER indicating length
20: OP_LENGTH_0x20:      this is SIG R (32 Bytes)
02: OP_INT_0x02:         type tag INTEGER indicating length
20: OP_LENGTH_0x20:      this is SIG S (32 Bytes)
01: OP_SIGHASHALL:       this terminates the ECDSA signature (ASN1-DER structure)
<sig2>
48: OP_DATA_0x48:        push hex 48 (decimal 72) bytes on stack
30: OP_SEQUENCE_0x30:    type tag indicating SEQUENCE, begin sigscript
45: OP_LENGTH_0x45:      length of R + S
02: OP_INT_0x02:         type tag INTEGER indicating length
21: OP_LENGTH_0x21:      this is SIG R (33 Bytes)
02: OP_INT_0x02:         type tag INTEGER indicating length
20: OP_LENGTH_0x20:      this is SIG S (32 Bytes)
01: OP_SIGHASHALL:       this terminates the ECDSA signature (ASN1-DER structure)

4C: OP_PUSHDATA1:        next byte is # of bytes that go onto stack
C9: OP_Int(0x01-0xff):   201 bytes onto the stack
52: OP_2:                the number 2 is pushed onto stack
    ################### we go multisig ####################################
41: OP_DATA_0x41:        uncompressed pub key (65 Bytes)
41: OP_DATA_0x41:        uncompressed pub key (65 Bytes)
41: OP_DATA_0x41:        uncompressed pub key (65 Bytes)
53: OP_3:                the number 3 is pushed onto stack
    ################### 2-of-3 Multisig ###################################
AE: OP_CHECKMULTISIG:    terminating multisig

Eine sehr gute Erklärung finden Sie in Kapitel 6 „Transaktionen“ und 7 „Fortgeschrittene Transaktionen und Scripting“ von Andreas wunderbarem Buch „Mastering Bitcoin“, das auch online verfügbar ist.

Ich habe nicht ganz verstanden, wie Sie feststellen können, dass tx 2 Signaturen hat. Beim Parsen des Skripts sind wir zuerst auf 0x47 (71 Bytes) gestoßen. Da das Skript mit einer Signatur beginnt, müssen die nächsten 71 Bytes SigA sein (bis hierher verstanden). Jetzt haben wir 0x48 (72 Bytes). Haben Sie diese 72 Bytes als SigB betrachtet, nur weil sie größer als die Standardlänge von komprimiertem/unkomprimiertem Pubkey sind? oder verwenden Sie eine andere Logik, um diese 72 Bytes als SigB zu betrachten
Richtig. Zeichen werden nach dem ASN1-Standard codiert. Sig1 ist das erste 0x47 und endet mit "01". Das zweite Hex 0x48 definiert eine Länge, zu diesem Zeitpunkt ist noch unklar, was folgen wird - kann alles sein (zB Redescript). Dann folgen 0x30 und 0x45, definieren die Länge von R+S und enden mit 0x01 - also muss es wieder eine Signatur sein, weil es dem ASN1 DER-Codierungsschema folgt.