08 - Outpoint

The outpoint for the input being signed is a 36 byte long data item made of the concatenation of the input TXID and Vout (32 + 4 bytes).

It can be used for a variety of purposes including:

  • Source of unique token ID

  • Input randomness

  • Check input sources

We will now look at examples of each of these.

Example 1: Source of unique token ID

Tokens within the system require a unique 20 byte ID. This is achieved by hashing <outpoint> using OP_HASH160.

Stack
Script
Description

<r_tx_preimg>

...

nVersion, hashPrevouts and hashSequence have been removed

<r_tx_preimg>

0x24

add outpoint length to the stack

<r_tx_preimg> 0x24

OP_SPLIT

Split outpoint from pre-image

<outpoint> <rr_tx_preimg>

OP_SWAP

Swap outpoint to front

<rr_tx_preimg> <outpoint>

OP_HASH160

Calculate txid using OP_HASH160

<rr_tx_preimg> <token_id>

...

rest of script

The token_id can now be added to an output script and enforced forward. This will be covered later in this chapter.

Example 2: Input randomness

The TXID cannot be known until the transaction is final, making it ideal as a source of input randomness. This example uses the MODULO function to implement a Rock-Paper-Scissors game.

Stack
Script
Description

<r_tx_preimg>

...

Version, hash_prevouts and hash_nSequence have been removed

<r_tx_preimg>

0x24

add outpoint length to the stack

<r_tx_preimg> 0x24

OP_SPLIT

Split outpoint from pre-image

<outpoint> <r_tx_preimg>

OP_DROP

Drop remaining pre-image

<outpoint>

OP_SHA256

Generate random output

<random_value>

OP_3

Put 3 on the stack

<random_value> 0x03

OP_MOD

Calculate modulo 2 - 1 or 0 outcome

<rem>

OP_IFDUP

Duplicates the stack if not zero

[0x00, 0x01 0x01, 0x02 0x02]

OP_NOTIF

3 possible stack states after OP_IFDUP. If 0, enter if statement path

<rock>

Zero is rock

[0x01 , 0x02]

OP_ELSE

If not zero, duplicated outcome remains.

[0x01 , 0x02]

OP_1

Test for 1

[0x01 , 0x02] 0x01

OP_EQUAL

Equality check

<result>

OP_IF

Enter if

<paper>

1 is paper

OP_ELSE

Else

<scissors>

2 is scissors

<rock/paper/scissors>

OP_ENDIF

Endif

<rock/paper/scissors>

...

rest of script

Example 3: Check input sources

This UTXO requires that it be spent in a transaction with the two outputs below it in the previous transaction. It uses hash_prevouts which must be left on the stack in an earlier section of script.

Stack
Script
Description

<hash_prevouts> <r_tx_preimg>

...

Version and hash_nSequence have been removed and any needed conditions have been checked.

<hash_prevouts> <r_tx_preimg>

0x24

add outpoint length to the stack

<hash_prevouts> r_tx_preimg> 0x24

OP_SPLIT

Split outpoint from pre-image

<hash_prevouts> <outpoint> <r_tx_preimg>

OP_SWAP

Swap outpoint to front

<hash_prevouts> <r_tx_preimg> <outpoint>

OP_DUP

<hash_prevouts><r_tx_preimg> <outpoint> <outpoint>

0x20

add 32 to stack

<hash_prevouts><r_tx_preimg> <outpoint> <outpoint> 0x20

OP_SPLIT

Split the txid and vout from the outpoint

<hash_prevouts><r_tx_preimg> <outpoint> <txid><vout>

OP_1ADD

add 1 to the vout

<hash_prevouts><r_tx_preimg> <outpoint> <txid><vout+1>

OP_2DUP

Duplicate txid and vout+1

<hash_prevouts><r_tx_preimg> <outpoint> <txid><vout+1> <txid><vout+1>

OP_1ADD

add 1 to the vout

<hash_prevouts><r_tx_preimg> <outpoint> <txid><vout+1> <txid><vout+2>

OP_CAT

Create outpoint 3

<hash_prevouts><r_tx_preimg> <outpoint> <txid><vout+1> <outpoint3>

OP_CAT

Join to previous vout

<hash_prevouts><r_tx_preimg> <outpoint> <txid><vout+1&outpoint3>

OP_CAT

Join to txid

<hash_prevouts><r_tx_preimg> <outpoint> <outpoint2&3>

OP_CAT

Join all three outpoints together

<hash_prevouts><r_tx_preimg> <outpoint1&2&3>

OP_SHA256

hash outpoints

<hash_prevouts><r_tx_preimg> <hashoutpoints>

OP_ROT

Rotate hash_prevouts to top of stack

<r_tx_preimg> <hashoutpoints> <hash_prevouts>

OP_EQUALVERIFY

Check condition is met

<r_tx_preimg>

...

Rest of script

Last updated

Was this helpful?