Crate bitcoin_scripts
source · [−]Expand description
Bitcoin script types
Bitcoin doesn’t make a distinction between Bitcoin script coming from
different sources, like scriptPubKey in transaction output or witness
and scriptSig in transaction input. There are many other possible script
containers for Bitcoin script: redeem script, witness script, taproot leaf
scripts of different versions. In fact, any “script” of bitcoin::Script
type can be used for inputs and outputs. What is a valid script for in one
context will not be a valid script for some other. That would mean that in
principle with existing bitcoin::Script
type every input script can be
used as an output script, leading to potentially harmful code coming from an
unaware developer.
While all bitcoin::Script
s have the same parsing rules converting byte
string into a set of instructions (i.e. the same syntax), there are
multiple ways how the consensus meaning of these instructions will be
interpreted under different contexts (different semantics). Moreover,
the scripts may be nested - or to be committed into some other Bitcoin
script – in a nested structures like in several layers, like redeemScript
inside of scriptSig used for P2SH, or tapScript within witnessScript
coming from witness field for Taproot. These nested layers do distinguish
on the information they contain, since some of them only commit to the
hashes of the nested scripts (bitcoin::ScriptHash
, WitnessProgram
)
or public keys (bitcoin::PubkeyHash
, bitcoin::WPubkeyHash
), while
other contain the full source of the script.
The present type system represents a solution to the problem: it distinguish
different logical types by introducing Script
wrapper types. It defines
LockScript
as bottom layer of a script, containing no other script
commitments (in form of their hashes). It also defines types above on it:
PubkeyScript
(for whatever is there in scriptPubkey
field
of a bitcoin::TxOut
), SigScript
(for whatever comes from scriptSig
field of bitcoin::TxIn
), RedeemScript
and WitnessScript
.
For taproot, we define LeafScript
as a top level of specific script
branch (see bitcoin::util::psbt::TapTree
) and crate::TapScript
as a
type specific for the current 0xC0
tapleaf version semantics, defined in
BIP-342.
There are conversion functions, which, for instance, can analyse
PubkeyScript
and if it is a custom script or P2PK return a
LockScript
type - or otherwise fail with error. These conversions
functions reside in convert
module. So with this type system one is
always sure which semantic information it does contain.
Type conversion
LockScript -+-> (PubkeyScript + RedeemScript) -+-> SigScript
| +-> WitnessScript
+-> PubkeyScript
|
TapScript ----> LeafScript
PubkeyScript --?--> LockScript
Re-exports
pub use convert::ConvertInfo;
Modules
Address-related types for detailed payload analysis and memory-efficient processing.
Helper traits and supplementary types for converting different types of scripts and keys into each other.
Hash-locked contract supporting data structures.
Taproot script tree implementation allowing arbitrary tree processing/
modification (see TaprootScriptTree
structure).
Structs
Any valid branch of taproot script spending
Script whose knowledge and satisfaction is required for spending some
specific transaction output. This is the deepest nested version of Bitcoin
script containing no hashes of other scripts, including P2SH redeemScript
hashes or witnessProgram
(hash or witness script), or public key hashes.
It is also used for representing specific spending branch of the taproot
script tree.
A content of scriptPubkey
from a transaction output
Redeem script as part of the witness
or scriptSig
structure; it is
hashed for P2(W)SH output.
A representation of scriptPubkey
data used during SegWit signing procedure
Scripting data for both transaction output and spending transaction input
parts that can be generated from some complete bitcoin Script
(LockScript
) or public key using particular crate::ConvertInfo
A content of scriptSig
from a transaction input
Script at specific taproot script spend path for 0xC0
tapleaf version,
which semantics are defined in BIP-342.
Witness program: a part of post-segwit scriptPubkey
; a data pushed to the
stack following witness version
A content of the script from witness
structure; en equivalent of
redeemScript
for witness-based transaction inputs. However, unlike
RedeemScript
, WitnessScript
produce SHA256-based hashes of
WScriptHash
type.
Traits
Marker trait for all forms of hashes which may participate in the construction of taproot script tree.
Type Definitions
The hash value of a taptree node which may be a leaf node, branch node or a hidden node.