Trait BasicSnippet

Source
pub trait BasicSnippet {
    // Required methods
    fn inputs(&self) -> Vec<(DataType, String)>;
    fn outputs(&self) -> Vec<(DataType, String)>;
    fn entrypoint(&self) -> String;
    fn code(&self, library: &mut Library) -> Vec<LabelledInstruction>;

    // Provided methods
    fn annotated_code(&self, library: &mut Library) -> Vec<LabelledInstruction> { ... }
    fn link_for_isolated_run(&self) -> Vec<LabelledInstruction> { ... }
    fn init_stack_for_isolated_run(&self) -> Vec<BFieldElement> { ... }
    fn stack_diff(&self) -> isize { ... }
    fn sign_offs(&self) -> HashMap<Reviewer, SignOffFingerprint> { ... }
}
Expand description

§Dyn-Compatibility

This trait is dyn-compatible (previously known as “object safe”).

Required Methods§

Source

fn inputs(&self) -> Vec<(DataType, String)>

Source

fn outputs(&self) -> Vec<(DataType, String)>

Source

fn entrypoint(&self) -> String

Source

fn code(&self, library: &mut Library) -> Vec<LabelledInstruction>

Provided Methods§

Source

fn annotated_code(&self, library: &mut Library) -> Vec<LabelledInstruction>

Source

fn init_stack_for_isolated_run(&self) -> Vec<BFieldElement>

Initial stack on program start, when the snippet runs in isolation.

Source

fn stack_diff(&self) -> isize

Source

fn sign_offs(&self) -> HashMap<Reviewer, SignOffFingerprint>

Contains an entry for every sign off.

Many of the snippets defined in this TASM library are critical for the consensus logic of the blockchain Neptune Cash. Therefore, it is paramount that the snippets are free of errors. In order to catch as many errors as possible, the snippets are reviewed by as many developers as possible. The requirements of such a review are listed here.

A reviewer can (and should) sign off on any snippet they have reviewed and for which they found no defects. This is done by adding that snippet’s fingerprint (at the time) to the overriding implementation of this method on that snippet.

Together with the tools git blame and cryptographic signing of commits, this makes sign-offs traceable. It also guarantees that changes to snippets that have already been signed-off are easy to detect.

§For Reviewers
§Modifying snippets

While the primary intention of the review process is to review a snippet, there are circumstances under which modifying it is acceptable.

Modifying a snippet to simplify reviewing that snippet is fair game. A common example of this case is replacing a swap-juggle chain with a few picks & places.

Modifying a snippet in order to improve performance should only happen if the performance impact is meaningful. The currently agreed-upon threshold is 0.5% of at least one consensus program.

It is acceptable, and can be desired, to modify a snippet by including assumption checks. For example, if the snippet’s pre-conditions require some input to fall within a certain range, it is fine to add a corresponding range check to the snippet. Removing existing checks of such nature is considered bad practice.

In either case, modifying a snippet that has already been reviewed and signed off by someone else in a way that alters its fingerprint requires their consent.

§Checklist

Use the following checklist to guide your review. Signing off on a snippet means that in your eyes, all points on this checklist are true.

  • the snippet’s documentation lists pre- and post-conditions
  • the snippet makes no assumptions outside the stated pre-conditions
  • given all pre-conditions, all post-conditions are met
  • whenever this snippet calls another snippet, all of that other snippet’s pre-conditions are met
  • all dynamic memory offsets are range-checked before they are used
  • each field accessor is used at most once per struct instance, or range-checked before each use
  • reading from non-deterministically initialized memory only happens from the region specified in the memory convention
  • memory-writes only happen outside of page 0 (see memory convention)
§Documentation Template

If a snippet you are reviewing is not (properly) documented yet, you can use the following template to document the type implementing BasicSnippet.

/// ### Behavior
///
/// ```text
/// BEFORE: _
/// AFTER:  _
/// ```
///
/// ### Preconditions
///
/// - condition
///
/// ### Postconditions
///
/// - condition
§Non-Unit Structs

Most, but not all types implementing BasicSnippet are unit structs. Fingerprinting gets more difficult for non-unit structs. In such cases, a default instantiation should be selected and signed off.

§Overriding this Method

This default implementation is intended to be overridden for any snippet that has been signed off, but should not call the fingerprint method.

Implementors§

Source§

impl BasicSnippet for PrimitiveRootOfUnity

Source§

impl BasicSnippet for tasm_lib::arithmetic::i128::lt::Lt

Source§

impl BasicSnippet for tasm_lib::arithmetic::i128::shift_right::ShiftRight

Source§

impl BasicSnippet for IsOdd

Source§

impl BasicSnippet for IsU32

Source§

impl BasicSnippet for tasm_lib::arithmetic::u32::leading_zeros::LeadingZeros

Source§

impl BasicSnippet for NextPowerOfTwo

Source§

impl BasicSnippet for tasm_lib::arithmetic::u32::or::Or

Source§

impl BasicSnippet for tasm_lib::arithmetic::u32::overflowing_add::OverflowingAdd

Source§

impl BasicSnippet for tasm_lib::arithmetic::u32::safe_add::SafeAdd

Source§

impl BasicSnippet for tasm_lib::arithmetic::u32::safe_mul::SafeMul

Source§

impl BasicSnippet for SafePow

Source§

impl BasicSnippet for SafeSub

Source§

impl BasicSnippet for tasm_lib::arithmetic::u32::shift_left::ShiftLeft

Source§

impl BasicSnippet for tasm_lib::arithmetic::u32::shift_right::ShiftRight

Source§

impl BasicSnippet for tasm_lib::arithmetic::u32::trailing_zeros::TrailingZeros

Source§

impl BasicSnippet for Add

Source§

impl BasicSnippet for And

Source§

impl BasicSnippet for Decr

Source§

impl BasicSnippet for Div2

Source§

impl BasicSnippet for DivMod

Source§

impl BasicSnippet for Incr

Source§

impl BasicSnippet for tasm_lib::arithmetic::u64::leading_zeros::LeadingZeros

Source§

impl BasicSnippet for Log2Floor

Source§

impl BasicSnippet for tasm_lib::arithmetic::u64::lt::Lt

Source§

impl BasicSnippet for LtPreserveArgs

Source§

impl BasicSnippet for MulTwoU64sToU128

Source§

impl BasicSnippet for tasm_lib::arithmetic::u64::or::Or

Source§

impl BasicSnippet for tasm_lib::arithmetic::u64::overflowing_add::OverflowingAdd

Source§

impl BasicSnippet for OverflowingSub

Source§

impl BasicSnippet for PopCount

Source§

impl BasicSnippet for Pow2

Source§

impl BasicSnippet for tasm_lib::arithmetic::u64::safe_mul::SafeMul

Source§

impl BasicSnippet for tasm_lib::arithmetic::u64::shift_left::ShiftLeft

Source§

impl BasicSnippet for tasm_lib::arithmetic::u64::shift_right::ShiftRight

Source§

impl BasicSnippet for tasm_lib::arithmetic::u64::sub::Sub

Source§

impl BasicSnippet for tasm_lib::arithmetic::u64::trailing_zeros::TrailingZeros

Source§

impl BasicSnippet for WrappingMul

Source§

impl BasicSnippet for WrappingSub

Source§

impl BasicSnippet for Xor

Source§

impl BasicSnippet for tasm_lib::arithmetic::u128::lt::Lt

Source§

impl BasicSnippet for tasm_lib::arithmetic::u128::overflowing_add::OverflowingAdd

Source§

impl BasicSnippet for tasm_lib::arithmetic::u128::safe_add::SafeAdd

Source§

impl BasicSnippet for tasm_lib::arithmetic::u128::safe_mul::SafeMul

Source§

impl BasicSnippet for tasm_lib::arithmetic::u128::shift_left::ShiftLeft

Source§

impl BasicSnippet for tasm_lib::arithmetic::u128::shift_right::ShiftRight

Source§

impl BasicSnippet for tasm_lib::arithmetic::u128::sub::Sub

Source§

impl BasicSnippet for XfeModPowU32

Source§

impl BasicSnippet for ToThePowerOfPowerOf2

Source§

impl BasicSnippet for HornerEvaluation

Source§

impl BasicSnippet for InnerProductOfThreeRowsWithWeights

Source§

impl BasicSnippet for InnerProductOfXfes

Source§

impl BasicSnippet for SumOfBfes

Source§

impl BasicSnippet for SumOfXfes

Source§

impl BasicSnippet for AbsorbMultiple

Source§

impl BasicSnippet for AbsorbMultipleStaticSize

Source§

impl BasicSnippet for HashStaticSize

Source§

impl BasicSnippet for HashVarlen

Source§

impl BasicSnippet for SampleIndices

Source§

impl BasicSnippet for SampleScalarOne

Source§

impl BasicSnippet for SampleScalars

Source§

impl BasicSnippet for SampleScalarsStaticLengthDynMalloc

Source§

impl BasicSnippet for SampleScalarsStaticLengthKMalloc

Source§

impl BasicSnippet for SampleScalarsStaticLengthStaticPointer

Source§

impl BasicSnippet for HashFromStack

Source§

impl BasicSnippet for LtDigest

Source§

impl BasicSnippet for MerkleRoot

Source§

impl BasicSnippet for MerkleRootFromXfes

Source§

impl BasicSnippet for MerkleStepMemU64Index

Source§

impl BasicSnippet for MerkleStepU64Index

Source§

impl BasicSnippet for MerkleVerify

Source§

impl BasicSnippet for Absorb

Source§

impl BasicSnippet for Init

Source§

impl BasicSnippet for PadAndAbsorbAll

Source§

impl BasicSnippet for Squeeze

Source§

impl BasicSnippet for SqueezeRepeatedly

Source§

impl BasicSnippet for SqueezeRepeatedlyStaticNumber

Source§

impl BasicSnippet for ReadInput

Source§

impl BasicSnippet for WriteToStdout

Source§

impl BasicSnippet for Contains

Source§

impl BasicSnippet for Get

Source§

impl BasicSnippet for All

Source§

impl BasicSnippet for Filter

Source§

impl BasicSnippet for Zip

Source§

impl BasicSnippet for HornerEvaluationDynamicLength

Source§

impl BasicSnippet for Length

Source§

impl BasicSnippet for MultisetEqualityDigests

Source§

impl BasicSnippet for MultisetEqualityU64s

Source§

impl BasicSnippet for tasm_lib::list::new::New

Source§

impl BasicSnippet for Pop

Source§

impl BasicSnippet for Push

Source§

impl BasicSnippet for Range

Source§

impl BasicSnippet for Set

Source§

impl BasicSnippet for SetLength

Source§

impl BasicSnippet for SplitOff

Source§

impl BasicSnippet for SwapUnchecked

Source§

impl BasicSnippet for DynMalloc

Source§

impl BasicSnippet for MemCpy

Source§

impl BasicSnippet for BagPeaks

Source§

impl BasicSnippet for CalculateNewPeaksFromAppend

Source§

impl BasicSnippet for MmrCalculateNewPeaksFromLeafMutationMtIndices

Source§

impl BasicSnippet for MmrLeafIndexToMtIndexAndPeakIndex

Source§

impl BasicSnippet for MmrVerifyFromMemory

Source§

impl BasicSnippet for MmrVerifyFromSecretInLeafIndexOnStack

Source§

impl BasicSnippet for MmrVerifyFromSecretInSecretLeafIndex

Source§

impl BasicSnippet for VerifyMmrSuccessor

Source§

impl BasicSnippet for Commit

Source§

impl BasicSnippet for GetSwbfIndices

Source§

impl BasicSnippet for NewEmptyInputAndOutput

Source§

impl BasicSnippet for NewGenericDynClaim

Source§

impl BasicSnippet for InstantiateFiatShamirWithClaim

Source§

impl BasicSnippet for NewRecursive

Source§

impl BasicSnippet for ComputeTerminalDynSizedDynamicSymbols

Source§

impl BasicSnippet for ComputeTerminalFromDigestInitialIsOne

Source§

impl BasicSnippet for BarycentricEvaluation

Source§

impl BasicSnippet for CollinearYXfe

Source§

impl BasicSnippet for GetCollinearityCheckX

Source§

impl BasicSnippet for DeriveFriFromStark

Source§

impl BasicSnippet for NumberOfRounds

Source§

impl BasicSnippet for FriSnippet

Source§

impl BasicSnippet for VerifyFriAuthenticationPaths

Source§

impl BasicSnippet for AirConstraintEvaluation

Source§

impl BasicSnippet for DivideOutZerofiers

Source§

impl BasicSnippet for VerifyTableRows

Source§

impl BasicSnippet for ZerofiersInverse

Source§

impl BasicSnippet for OutOfDomainPoints

Source§

impl BasicSnippet for OwnProgramDigest

Source§

impl BasicSnippet for ReadAndVerifyOwnProgramDigestFromStdIn

Source§

impl BasicSnippet for StarkVerify

Source§

impl BasicSnippet for DequeueNextAs

Source§

impl BasicSnippet for Drop

Source§

impl BasicSnippet for tasm_lib::verifier::vm_proof_iter::new::New

Source§

impl BasicSnippet for XfeNtt

Source§

impl<T: TasmObject + Clone + Debug> BasicSnippet for VerifyNdSiIntegrity<T>

Source§

impl<const N: u8> BasicSnippet for ShiftLeftStatic<N>

Source§

impl<const N: u8> BasicSnippet for ShiftRightStatic<N>

Source§

impl<const N: usize> BasicSnippet for ComputeTerminalConstSizedDynamicSymbolsReversed<N>

Source§

impl<const N: usize> BasicSnippet for ComputeTerminalConstSizedStaticSymbols<N>

Source§

impl<const NUM_INPUT_LISTS: usize> BasicSnippet for ChainMap<NUM_INPUT_LISTS>