What are the standard formats of transaction outputs?

5

3

A transaction output can have the type

  • Pay to public key hash, P2PKH, where the ScriptPubKey field has the format:

    76 a9 14 <20-byte hash of pubkey> 88 ac

  • Pay to script hash, P2SH, used for e.g. multisig:

    a9 14 <20-byte hash of script> 87

There is also something called P2WPKH and P2WSH. Can you show me how these outputs are formatted, and are there any more possible output formats than these four?

Thorkil Værge

Posted 2018-04-11T11:49:40.413

Reputation: 637

2

the SegWit formats: https://en.bitcoin.it/wiki/Segregated_Witness, or here: https://bitcoincore.org/en/segwit_wallet_dev/. And then there was in early times "pay to public key", and the old "multisig" types (non-P2SH). Not sure if they are still valid today.

pebwindkraft 2018-04-11T13:29:30.497

I didn't know the pay to public key format. Interesting! I had heard about the "multisig" type but never encountered it or a description of it.Thorkil Værge 2018-04-11T13:48:34.787

I think it was called bare multisig. And was BIP0011. A quick search in the forum: https://bitcoin.stackexchange.com/questions/29708/multi-signature-and-pay-to-script-hash-vs-pay-to-pub-key-hash/29819#29819

pebwindkraft 2018-04-11T15:32:16.720

Answers

5

AFAIK there are 5 different standard non-SegWit transaction types, and 4 SegWit ones.

Non-SegWit:

Pay to public key (P2PK)

PUSH (1 byte) + <compressed/uncompressed_pk> (33/65 bytes) + OP_CHECKSIG (1 byte)

Pay to public key hash (P2PKH)

OP_DUP (1 byte) + OP_HASH160 (1 byte) + PUSH (1 byte) + <hash_160(PK)> (20 bytes) + OP_EQUALVERIFY (1 byte) + OP_CHECKSIG (1 byte)

Multisig (P2MS)

<number_of_PKs> (1 byte) PUSH (1 byte) <PK_0> (33/65 bytes) PUSH (1 byte) <PK_1> (33/65 bytes)  ... PUSH (1 byte) <PK_n-1> (33/65 bytes) OP_CHECKMULTISIG (1 byte)

P2MS allow up to 15-15 scripts, however only up to 3-3 are standard.

Pay to script hash (P2SH)

OP_HASH160 (1 byte) + PUSH (1 byte) + <hash160(redeem_script)> (20 bytes) + OP_EQUAL (1 byte)

OP_Return

OP_RETURN (1 byte) PUSH (1 byte) <0 to 83 bytes of data>

SegWit:

Regarding segwit types, there are two non-native and two native ones.

Native Pay to witness public key hash (P2WPKH)

OP_0 (1 byte) PUSH (1 byte) <hash 160(PK*)> (20 bytes)

Native Pay to witness script hash (P2WSH)

OP_0 (1 byte) PUSH (1 byte) <script_hash> (32 bytes)

Pay to witness public key hash encapsulated in a pay to script hash (P2SH-P2WPKH)

The redeem script follows the same structure than native P2WPKH:

redeem_script = OP_0 (1 byte) PUSH (1 byte) <hash_160(PK*)> (20 bytes)

While the external structure of the script (scriptPubKey) is as any other P2SH:

OP_HASH160 (1 byte) + PUSH (1 byte) + <hash_160(redeeem_script)> (20 bytes) + OP_EQUAL (1 byte)

Pay to witness script hash encapsulated in a pay to script hash (P2SH-P2WSH)

The redeem script follows the same structure than native P2WSH:

redeem_script = OP_0 (1 byte) PUSH (1 byte) <script_hash> (32 bytes)

While the external structure of the script (scriptPubKey) is as any other P2SH:

OP_HASH160 (1 byte) + PUSH (1 byte) + <hash_160(redeeem_script)> (20 bytes) + OP_EQUAL (1 byte)

*In P2WPKH scripts the hash 160 should correspond to a compressed public key, otherwise the funds will be lost.

sr-gi

Posted 2018-04-11T11:49:40.413

Reputation: 2 382

Thank you. But I do not understand your last sentence: "Non-native pay to witness script hash encapsulated in a pay to script hash (P2SH-P2WPKH) have the same structure." Can you elaborate on that? As far as I understood, non-native segwit outputs are indistinguishable from P2SH-outputs.Thorkil Værge 2018-04-11T16:42:03.150

What I ment is that in P2SH-P2WPKH the redeem script follows the structure of the native P2WPKH and in the P2SH-P2WSH the redeem script follows the structure of the native P2WSH. I'll edit it for clarification.sr-gi 2018-04-11T19:43:04.477

1Reviewing the answer I realized that the OP_Return script was not up to date. The max amount of data to be pushed is 83 bytes since Bitcoin Core 0.12. I've updated the answer to correct it.sr-gi 2018-04-20T09:36:09.467