Module bitcoin::blockdata::script [] [src]

Script

Scripts define Bitcoin's digital signature scheme: a signature is formed from a script (the second half of which is defined by a coin to be spent, and the first half provided by the spending transaction), and is valid iff the script leaves TRUE on the stack after being evaluated. Bitcoin's script is a stack-based assembly language similar in spirit to Forth.

This module provides the structures and functions needed to support scripts.

Structs

AbstractStack

The stack used by the script satisfier

AbstractStackElem

An abstract element on the stack, used to describe a satisfying script input

Builder

An object which can be used to construct a script piece by piece

Instructions

Iterator over a script returning parsed opcodes

Script

A Bitcoin script

ScriptTrace

A full trace of a script execution

TraceIteration

A single iteration of a script execution

Validator

A rule for validating an abstract stack element

Enums

Error

Ways that a script might fail. Not everything is split up as much as it could be; patches welcome if more detailed errors would help you.

Instruction

A "parsed opcode" which allows iterating over a Script in a more sensible way

MaybeOwned

A structure that can hold either a slice or vector, as necessary

SigHashType

Hashtype of a transaction, encoded in the last byte of a signature, specifically in the last 5 bits byte & 31

Functions

read_scriptbool

This is like "read_scriptint then map 0 to false and everything else as true", except that the overflow rules don't apply.

read_scriptint

Helper to decode an integer in script format Notice that this fails on overflow: the result is the same as in bitcoind, that only 4-byte signed-magnitude values may be read as numbers. They can be added or subtracted (and a long time ago, multiplied and divided), and this may result in numbers which can't be written out in 4 bytes or less. This is ok! The number just can't be read as a number again. This is a bit crazy and subtle, but it makes sense: you can load 32-bit numbers and do anything with them, which back when mult/div was allowed, could result in up to a 64-bit number. We don't want overflow since that's suprising --- and we don't want numbers that don't fit in 64 bits (for efficiency on modern processors) so we simply say, anything in excess of 32 bits is no longer a number. This is basically a ranged type implementation.

read_uint

Read a script-encoded unsigned integer