Grundlegende Bitcoin-Transaktionen verstehen: das scriptPubKey.addresses-Array

Früher dachte ich, dass das Adressen-Array im scriptPubKey (vout) beginnend mit dem Skript gefüllt wird, aber als ich altmodische Multisig-Transaktionen untersuchte, entdeckte ich, dass etwas meine Annahme falsch machte:

Angesichts dieser drei Vouts:

{
    "value" : 0.01000000,
    "n" : 0,
    "scriptPubKey" : {
        "asm" : "1 04cc71eb30d653c0c3163990c47b976f3fb3f37cccdcbedb169a1dfef58bbfbfaff7d8a473e7e2e6d317b87bafe8bde97e3cf8f065dec022b51d11fcdd0d348ac4 0461cbdcc5409fb4b4d42b51d33381354d80e550078cb532a34bfa2fcfdeb7d76519aecc62770f5b0e4ef8551946d8a540911abe3e7854a26f39f58b25c15342af 2 OP_CHECKMULTISIG",
        "hex" : "514104cc71eb30d653c0c3163990c47b976f3fb3f37cccdcbedb169a1dfef58bbfbfaff7d8a473e7e2e6d317b87bafe8bde97e3cf8f065dec022b51d11fcdd0d348ac4410461cbdcc5409fb4b4d42b51d33381354d80e550078cb532a34bfa2fcfdeb7d76519aecc62770f5b0e4ef8551946d8a540911abe3e7854a26f39f58b25c15342af52ae",
        "reqSigs" : 1,
        "type" : "multisig",
        "addresses" : [
            "1AJbsFZ64EpEfS5UAjAfcUG8pH8Jn3rn1F",
            "1A8JiWcwvpY7tAopUkSnGuEYHmzGYfZPiq"
        ]
    }
}

{
    "value" : 0.00000002,
    "n" : 0,
    "scriptPubKey" : {
        "asm" : "1 0351efb6e91a31221652105d032a2508275f374cea63939ad72f1b1e02f477da78 00f2b7816db49d55d24df7bdffdbc1e203b424e8cd39f5651ab938e5e4a193569e 2 OP_CHECKMULTISIG",
        "hex" : "51210351efb6e91a31221652105d032a2508275f374cea63939ad72f1b1e02f477da782100f2b7816db49d55d24df7bdffdbc1e203b424e8cd39f5651ab938e5e4a193569e52ae",
        "reqSigs" : 1,
        "type" : "multisig",
        "addresses" : [
            "1NdB761LmTmrJixxp93nz7pEiCx5cKPW44"
        ]
    }
}

die jeweils aus Transaktionen stammen:

60a20bd93aa49ab4b28d514ec10b06e1829ce6818ec06cd3aabd013ebcdc4bb1 274f8be3b7b9b1a220285f5f71f61e2691dd04df9d69bb02a8b3b85f91fb1857

Mir ist aufgefallen, dass sie dasselbe Skript verwenden:

OP1 OPDATA OPDATA OP2 OP_CHECKMULTISIG

aber mit unterschiedlichen Ergebnissen.

Bei der ersten Transaktion sehen Sie zwei Adressen im Adressfeld, bei der zweiten sehen Sie nur eine Adresse.

Auch angesichts dieser:

{
    "value" : 0.00000001,
    "n" : 22,
    "scriptPubKey" : {
        "asm" : "1 6565292c66696c653d7379732e737464657272290a0a69662046616c73653a0a202020207072696e742870726f78792e73656e647261777472616e73616374696f 6e287369676e65645f74785b27686578275d29290a656c73653a0a202020207072696e74287369676e65645f7478290a0000000000000000000000000000000000 2 OP_CHECKMULTISIG",
        "hex" : "51416565292c66696c653d7379732e737464657272290a0a69662046616c73653a0a202020207072696e742870726f78792e73656e647261777472616e73616374696f416e287369676e65645f74785b27686578275d29290a656c73653a0a202020207072696e74287369676e65645f7478290a000000000000000000000000000000000052ae",
        "type" : "multisig"
    }
}

die aus Transaktion 4b72a223007eab8a951d43edc171befeabc7b5dca4213770c88e09ba5b936e17 stammt

Die geparste Transaktion enthält keine Anforderungen oder Adressen.

Also, ich glaube, ich bin ein wenig verwirrt darüber, wie das Adressen-Array gefüllt wird.

Antworten (2)

tx: 60a20bd93aa49ab4b28d514ec10b06e1829ce6818ec06cd3aabd013ebcdc4bb1

OP_1
04cc71eb[...cut...]0d348ac4 // this is pubkey of 1AJbsFZ64EpEfS5UAjAfcUG8pH8Jn3rn1F
0461cbdc[...cut...]c15342af // this is pubkey of 1A8JiWcwvpY7tAopUkSnGuEYHmzGYfZPiq
OP_2
OP_CHECKMULTISIG

Um diese Transaktion auszuführen, sollte man sie mit einem von zwei Privatschlüsseln signieren


tx: 274f8be3b7b9b1a220285f5f71f61e2691dd04df9d69bb02a8b3b85f91fb1857

OP_1
0351efb6[...cut...]77da78 // this is public key of 1NdB761LmTmrJixxp93nz7pEiCx5cKPW44
00f2b781[...cut...]93569e // this is not a public key!
OP_2
OP_CHECKMULTISIG

tx: 4b72a223007eab8a951d43edc171befeabc7b5dca4213770c88e09ba5b936e17

Sie können über diese Transaktion hier lesen: http://www.righto.com/2014/02/ascii-bernanke-wikileaks-photographs.html [16]

Sieht so aus, als wäre es mit https://github.com/bitcoin/bitcoin/blob/master/src/pubkey.h#L48 verwandt .

Soweit ich verstanden habe (auch dank #bitcoin @ freenode-Benutzern), stimmten die Pubkeys, die ich zu dekodieren versuchte, nicht mit dieser Überprüfung überein, also für die Datensätze: In den genannten Beispielen wurden das Adress-Array (und die reqSigs int ) wird nur gefüllt, wenn das erste Byte des Pubkeys mit den Prüfungen für die relative Länge (komprimiert oder nicht) übereinstimmt.