bitcoin_rs_consensus/
lib.rs1#![forbid(unsafe_op_in_unsafe_fn)]
9
10pub mod bip112;
12pub mod bip113;
14pub mod bip141;
16pub mod bip143;
18pub mod bip30;
20pub mod bip34;
22pub mod bip341;
24pub mod bip342;
26pub mod bip65;
28pub mod bip66;
30pub mod bip68;
32pub mod bip9;
34pub mod connect_block;
36pub mod kernel;
38pub mod rust_path;
40pub mod verify_block;
42pub mod verify_tx;
44
45pub use bip9::{DeploymentContext, DeploymentParams, DeploymentState, compute_state};
46pub use connect_block::connect_block_dual_path;
47pub use rust_path::{BlockState, RustValidator, TipState, UtxoView};
48pub use verify_block::{
49 BlockRuleContext, verify_block_rules, verify_block_rules_borrowed,
50 verify_block_rules_borrowed_contextual, verify_block_rules_borrowed_contextual_with_txids,
51 verify_block_rules_borrowed_contextual_with_txids_and_witness_hint,
52 verify_block_rules_contextual,
53};
54pub use verify_tx::{
55 is_final_tx, verify_coinbase_script_sig_size, verify_transaction, verify_transaction_borrowed,
56 verify_transaction_borrowed_non_script_with_mtp, verify_transaction_borrowed_with_mtp,
57 verify_transaction_with_mtp,
58};
59
60use thiserror::Error;
61
62#[derive(Debug, Error, Clone, PartialEq, Eq)]
64pub enum ConsensusError {
65 #[error("transaction has no inputs")]
67 EmptyInputs,
68 #[error("transaction has no outputs")]
70 EmptyOutputs,
71 #[error("coinbase scriptSig length {len} outside allowed range 2..=100 bytes")]
73 CoinbaseScriptSigSize {
74 len: usize,
76 },
77 #[error("non-coinbase transaction input {input_index} spends a null outpoint")]
79 NullPrevout {
80 input_index: usize,
82 },
83 #[error("transaction contains duplicate input {input_index}")]
85 DuplicateInput {
86 input_index: usize,
88 },
89 #[error("missing prevout for input {input_index}")]
91 MissingPrevout {
92 input_index: usize,
94 },
95 #[error("transaction output value exceeds max money")]
97 OutputValueOverflow,
98 #[error("transaction spends {input_value} sats but creates {output_value} sats")]
100 InputsLessThanOutputs {
101 input_value: u64,
103 output_value: u64,
105 },
106 #[error("script verification failed at input {input_index}: {reason}")]
108 Script {
109 input_index: usize,
111 reason: String,
113 },
114 #[error("sigop cost {cost} exceeds max {max}")]
116 SigopsLimit {
117 cost: u32,
119 max: u32,
121 },
122 #[error("block has no transactions")]
124 EmptyBlock,
125 #[error("block first transaction is not coinbase")]
127 MissingCoinbase,
128 #[error("block transaction {tx_index} is coinbase outside position 0")]
130 ExtraCoinbase {
131 tx_index: usize,
133 },
134 #[error("block merkle tree contains a duplicate transaction mutation")]
136 MerkleMutation,
137 #[error("block merkle root mismatch")]
139 MerkleRoot,
140 #[error("block witness commitment mismatch")]
142 WitnessCommitment,
143 #[error("block weight {weight} exceeds max {max}")]
145 BlockWeight {
146 weight: u64,
148 max: u64,
150 },
151 #[error("{bip}: {reason}")]
153 Bip {
154 bip: &'static str,
156 reason: String,
158 },
159 #[error("kernel validation failed: {0}")]
161 Kernel(String),
162 #[error("consensus encoding failed: {0}")]
164 Encoding(String),
165}
166
167pub const MAX_MONEY: u64 = 21_000_000 * 100_000_000;
169
170pub const MAX_BLOCK_SIGOPS_COST: u32 = 80_000;