Struct Cost

Source
pub struct Cost(/* private fields */);
Expand description

CPU cost of a Simplicity expression.

The cost is measured in milli weight units and can be converted into weight units using the appropriate method.

Roughly speaking, the operational semantics of a combinator on the Bit Machine determine its cost.

First, every combinator has a fixed overhead cost. Frame allocations, copy and write operations cost proportional to the number of allocated or written bits. Frame moves / drops or cursor moves are one-step operations that are covered by the overhead.

The cost of a program is compared to its budget. A program is valid if it does not exceed its budget.

The budget is the size of the witness stack of the transaction input that includes the program. Users pay for their Simplicity programs in terms of fees which are based on transaction size, like normal Tapscript.

Programs that are CPU-heavy need to be padded so that the witness stack provides a large-enough budget.

Implementations§

Source§

impl Cost

Source

pub const CONSENSUS_MAX: Self

Maximum cost allowed by consensus.

This is equal to the maximum budget that any program can have inside a Taproot transaction: 4 million weight units plus 50 free weight units for validation.

This assumes a block that consists of a single transaction which in turn consists of nothing but its witness stack.

Transactions include other data besides the witness stack. Also, transaction may have multiple inputs and blocks usually include multiple transactions. This means that the maximum budget is an unreachable upper bound.

Source

pub const fn of_type(bit_width: usize) -> Self

Return the cost of a type with the given bit width.

Source

pub const fn from_milliweight(milliweight: u32) -> Self

Convert the given milli weight units into cost.

Source

pub fn is_consensus_valid(self) -> bool

Return whether the cost is allowed by consensus.

This means the cost is within the maximum budget that any program inside a Taproot transaction can have.

Source

pub fn is_budget_valid(self, script_witness: &Vec<Vec<u8>>) -> bool

Return whether the cost is within the budget of the given script witness of a transaction input.

The script witness is passed as &Vec<Vec<u8>> in order to use the consensus encoding implemented for this type.

Source

pub fn get_padding(self, script_witness: &Vec<Vec<u8>>) -> Option<Vec<u8>>

Return the annex bytes that are required as padding so the transaction input has enough budget to cover the cost.

The first annex byte is 0x50, as defined in BIP 341. The following padding bytes are 0x00.

Trait Implementations§

Source§

impl Add for Cost

Source§

type Output = Cost

The resulting type after applying the + operator.
Source§

fn add(self, rhs: Self) -> Self::Output

Performs the + operation. Read more
Source§

impl Clone for Cost

Source§

fn clone(&self) -> Cost

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for Cost

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Display for Cost

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl From<Cost> for Weight

Source§

fn from(value: Cost) -> Self

Converts to this type from the input type.
Source§

impl From<Weight> for Cost

Source§

fn from(value: Weight) -> Self

Converts to this type from the input type.
Source§

impl Hash for Cost

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where H: Hasher, Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl Ord for Cost

Source§

fn cmp(&self, other: &Cost) -> Ordering

This method returns an Ordering between self and other. Read more
1.21.0 · Source§

fn max(self, other: Self) -> Self
where Self: Sized,

Compares and returns the maximum of two values. Read more
1.21.0 · Source§

fn min(self, other: Self) -> Self
where Self: Sized,

Compares and returns the minimum of two values. Read more
1.50.0 · Source§

fn clamp(self, min: Self, max: Self) -> Self
where Self: Sized,

Restrict a value to a certain interval. Read more
Source§

impl PartialEq for Cost

Source§

fn eq(&self, other: &Cost) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
Source§

impl PartialOrd for Cost

Source§

fn partial_cmp(&self, other: &Cost) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the <= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by the >= operator. Read more
Source§

impl Copy for Cost

Source§

impl Eq for Cost

Source§

impl StructuralPartialEq for Cost

Auto Trait Implementations§

§

impl Freeze for Cost

§

impl RefUnwindSafe for Cost

§

impl Send for Cost

§

impl Sync for Cost

§

impl Unpin for Cost

§

impl UnwindSafe for Cost

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T> ToString for T
where T: Display + ?Sized,

Source§

fn to_string(&self) -> String

Converts the given value to a String. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V