Skip to main content

bsv_script/interpreter/
config.rs

1//! Interpreter configuration with pre/post-genesis limits.
2
3/// Maximum number of non-push opcodes allowed before genesis activation.
4pub const MAX_OPS_BEFORE_GENESIS: usize = 500;
5/// Maximum combined stack size (data + alt) allowed before genesis activation.
6pub const MAX_STACK_SIZE_BEFORE_GENESIS: usize = 1000;
7/// Maximum script byte size allowed before genesis activation.
8pub const MAX_SCRIPT_SIZE_BEFORE_GENESIS: usize = 10000;
9/// Maximum single data element byte size allowed before genesis activation.
10pub const MAX_SCRIPT_ELEMENT_SIZE_BEFORE_GENESIS: usize = 520;
11/// Maximum byte length for numeric script values before genesis activation.
12pub const MAX_SCRIPT_NUMBER_LENGTH_BEFORE_GENESIS: usize = 4;
13/// Maximum number of public keys in a multisig operation before genesis activation.
14pub const MAX_PUB_KEYS_PER_MULTISIG_BEFORE_GENESIS: usize = 20;
15
16/// Script configuration limits.
17pub struct Config {
18    /// Whether post-genesis rules are active (relaxes most limits).
19    pub after_genesis: bool,
20}
21
22impl Config {
23    /// Create a configuration with pre-genesis (legacy) limits.
24    pub fn before_genesis() -> Self {
25        Config {
26            after_genesis: false,
27        }
28    }
29
30    /// Create a configuration with post-genesis (relaxed) limits.
31    pub fn after_genesis() -> Self {
32        Config {
33            after_genesis: true,
34        }
35    }
36
37    /// Return the maximum number of non-push opcodes allowed per script.
38    pub fn max_ops(&self) -> usize {
39        if self.after_genesis {
40            i32::MAX as usize
41        } else {
42            MAX_OPS_BEFORE_GENESIS
43        }
44    }
45
46    /// Return the maximum combined stack size (data + alt).
47    pub fn max_stack_size(&self) -> usize {
48        if self.after_genesis {
49            i32::MAX as usize
50        } else {
51            MAX_STACK_SIZE_BEFORE_GENESIS
52        }
53    }
54
55    /// Return the maximum script byte size.
56    pub fn max_script_size(&self) -> usize {
57        if self.after_genesis {
58            i32::MAX as usize
59        } else {
60            MAX_SCRIPT_SIZE_BEFORE_GENESIS
61        }
62    }
63
64    /// Return the maximum byte size for a single data element.
65    pub fn max_script_element_size(&self) -> usize {
66        if self.after_genesis {
67            i32::MAX as usize
68        } else {
69            MAX_SCRIPT_ELEMENT_SIZE_BEFORE_GENESIS
70        }
71    }
72
73    /// Return the maximum byte length for numeric script values.
74    pub fn max_script_number_length(&self) -> usize {
75        if self.after_genesis {
76            750 * 1000
77        } else {
78            MAX_SCRIPT_NUMBER_LENGTH_BEFORE_GENESIS
79        }
80    }
81
82    /// Return the maximum number of public keys in a multisig operation.
83    pub fn max_pub_keys_per_multisig(&self) -> usize {
84        if self.after_genesis {
85            i32::MAX as usize
86        } else {
87            MAX_PUB_KEYS_PER_MULTISIG_BEFORE_GENESIS
88        }
89    }
90}