NAME

Bitcoin::Crypto::Script - Bitcoin Script instance

SYNOPSIS

use Bitcoin::Crypto::Script;

my $script = Bitcoin::Crypto::Script->from_standard(
	[P2WPKH => $my_segwit_address]
);

# getting serialized script
my $serialized = $script->to_serialized();

# getting P2WSH address from script
my $sh_address = $script->get_segwit_address();

# getting back the address encoded in P2WPKH script
my $address = $script->get_address();

DESCRIPTION

This class allows you to create Perl representation of a Bitcoin script.

You can use a script object to:

  • create a script from opcodes

  • serialize a script into byte string

  • deserialize a script into a sequence of opcodes

  • create legacy (p2sh), compat (p2sh(p2wsh)) and segwit (p2wsh) addresses

  • execute the script

Note that taproot addresses (p2tr) with script spend paths are created using Bitcoin::Crypto::Key::Public.

INTERFACE

Attributes

type

Contains the type of the script, if the script is standard and the type is known. Otherwise, contains undef.

predicate: has_type

network

Instance of Bitcoin::Crypto::Network - current network for this key. Can be coerced from network id. Default: current default network.

writer: set_network

Methods

new

$script_object = $class->new()

A constructor. Returns a new empty script instance.

See "from_serialized" if you want to import a serialized script instead.

opcode_class

$class_name = $class->opcode_class()
$class->opcode_class->get_opcode_by_name($opname)

Returns the name of the class used to get the proper opcodes.

add_operation, add

$script_object = $object->add_operation($opcode)

Adds a new opcode at the end of a script. Returns the object instance for chaining.

add is a shorter alias for add_operation.

Throws an exception for unknown opcodes.

add_raw

$script_object = $object->add_raw($bytes)

Adds $bytes at the end of the script without processing them at all.

Returns the object instance for chaining.

push_bytes, push

$script_object = $object->push_bytes($bytes)

Pushes $bytes to the execution stack at the end of a script, using a minimal push opcode.

push is a shorter alias for push_bytes.

For example, running $script->push_bytes("\x03") will have the same effect as $script->add_operation('OP_3').

Throws an exception for data exceeding a 4 byte number in length.

Note that no data longer than 520 bytes can be pushed onto the stack in one operation, but this method will not check for that.

Returns the object instance for chaining.

push_number

$script_object = $object->push_number($int)

Same as push_bytes, but $int will be treated as a script number and turned into a byte representation first. Useful if you have a non-trivial number that needs to be pushed onto a stack.

to_serialized

$bytestring = $object->to_serialized()

Returns a serialized script as byte string.

from_serialized

$script = Bitcoin::Crypto::Script->from_serialized($bytestring)

Creates a new script instance from a bytestring.

from_standard

$object = Bitcoin::Crypto::Script->from_standard([P2PKH => '1Ehr6cNDzPCx3wQRu1sMdXWViEi2MQnFzH'])
$object = Bitcoin::Crypto::Script->from_standard([address => '1Ehr6cNDzPCx3wQRu1sMdXWViEi2MQnFzH'])

Creates a new object of standard type with given address. The address must be of the currently default network. In case of NULLDATA, P2MS and P2PK there is no address, and the second argument must be custom data (NULLDATA), public key (P2PK) or an array reference with number N of signatures followed by M public keys (N of M P2MS).

The first argument can also be specified as address to enable auto-detection of script type.

get_hash

$bytestring = $object->get_hash()

Returns a serialized script parsed with HASH160 (RIPEMD160 of SHA256).

get_legacy_address

$address = $object->get_legacy_address()

Returns string containing Base58Check encoded script hash (P2SH address)

get_compat_address

$address = $object->get_compat_address()

Returns string containing Base58Check encoded script hash containing a witness program for compatibility purposes (P2SH(P2WSH) address)

get_segwit_address

$address = $object->get_segwit_address()

Returns string containing Bech32 encoded witness program (P2WSH address)

get_address

$address = $object->get_address()

This method does not generate P2SH-type address, but instead returns the address encoded in the script of standard type. For example, if the script is of type P2WPKH, then a bech32 segwit address will be returned. If the script is not of standard type or the type does not use addresses, returns undef.

Currently handles script of types P2PKH, P2SH, P2WPKH, P2WSH, P2TR.

get_raw_address

$raw_address = $object->get_raw_address()

Same as "get_address", but does not encode the address with base58 / bech32, and does not add any network markers specific for this type of address. Can be used to fetch the data encoded in a standard script type, for example output xonly public key for P2TR.

operations

$ops_aref = $object->operations

Returns an array reference - An array of operations to be executed. Same as "operations" in Bitcoin::Crypto::Script::Runner, which is only filled after starting the script.

Returned operations are of type Bitcoin::Crypto::Script::Compiler::Opcode.

Note that operations are returned even for invalid scripts. See "has_errors" and "assert_valid".

has_errors

$bool = $object->has_errors()

Returns a true value if the script is syntax is invalid - has pushes past end of the script, opcode errors like unclosed OP_IFs, or opcodes that make it invalid on compilation like OP_VERIF.

Note that having errors may not be a good indicator whether the script is correct, since it may be unconditionally valid due to OP_SUCCESS (in tapscripts). Script can have errors and still be valid because of that. See "assert_valid".

assert_valid

$object->assert_valid

Checks if the script is valid - either it has no errors, or it is marked an unconditionally valid. If the script is not valid, the first error will be raised as exception. If the script is valid, returns nothing.

run

$runner = $object->run(\@initial_stack)

Executes the script and returns Bitcoin::Crypto::Script::Runner instance after running the script.

This is a convenience method which constructs runner instance in the background. This helper is only meant to run simple scripts.

is_native_segwit

$boolean = $object->is_native_segwit

Returns true if the type of the script is either P2WPKH, P2WSH or P2TR.

is_empty

$boolean = $object->is_empty

Returns true if the script is completely empty (contains no opcodes).

is_pushes_only

$boolean = $object->is_pushes_only

Returns true if the script contains only opcodes pushing to the stack.

dump

$string = $object->dump

Returns a readable representation of the script

SEE ALSO

Bitcoin::Crypto::Script::Runner
Bitcoin::Crypto::Script::Opcode
Bitcoin::Crypto::Transaction