git / moonbite-core / src/mweb/mweb_node.h · raw
#pragma once#include <consensus/params.h>#include <mw/node/CoinsView.h>// Forward Declarationsclass CBlock;class CBlockUndo;class CBlockIndex;class CTransaction;class BlockValidationState;class TxValidationState;namespace MWEB {// MW: TODO - Fix function summaries now that we've rearranged the checks.class Node{public: /// <summary> /// Context-independent validation of the CBlock's MWEB rules. If MWEB included in block, this verifies: /// * Only the final transaction in the block is marked as the HogEx /// * All MWEB data has been stripped from canonical transactions (i.e. HasMWEBTx() should be false) /// * MWEB header hash matches hash committed to by HogEx transaction /// * Peg-In kernels match canonical peg-in outputs (amounts and commitments) /// * Peg-Out kernels match HogEx peg-out outputs (amounts and scriptPubKeys) /// * MWEB block does not exceed max weight /// * Inputs, outputs, and kernels are properly sorted /// * No invalid duplicate inputs, outputs, or kernels /// * Kernel MMR size and root match the MWEB header /// * All signatures and rangeproofs are valid /// * Kernel features are valid /// * Owner sums balance (i.e. sender keys, receiver keys, and owner offset balance out) /// </summary> /// <param name="block">The CBlock to validate.</param> /// <param name="state">The CValidationState to update if validation fails.</param> /// <returns>True if there is no MWEB included, or MWEB context-independent validation checks have succeeded</returns> static bool CheckBlock(const CBlock& block, BlockValidationState& state); /// <summary> /// MWEB validation checks that require knowledge of the block's context (i.e. the previous CBlockIndex must be known). /// The following rules are verified: /// * MWEB is included when the feature is active, or not included when MWEB has not yet been activated /// * MWEB header block height matches the expected height /// * The first input in the HogEx points to the HogAddr output of the previous HogEx (except for HogEx in first block after MWEB activated) /// * The remaining inputs in the HogEx exactly match the pegin outputs from the block's transactions /// * HogEx fee matches the total fee of the extension block /// * HogAddr amount differs from previous HogAddr amount by the exact amount expected (previous + pegins - pegouts - fees) /// </summary> /// <param name="block">The CBlock to validate.</param> /// <param name="consensus_params">The consensus parameters defined for the network.</param> /// <param name="pindexPrev">The CBlockIndex directly before the CBlock being checked.</param> /// <param name="state">The CValidationState to update if validation fails.</param> /// <returns>True if all validation checks succeed.</returns> static bool ContextualCheckBlock( const CBlock& block, const Consensus::Params& consensus_params, const CBlockIndex* pindexPrev, BlockValidationState& state ); /// <summary> /// Applies the extension block to the end of the chain in the given view, updating the UTXO set in the process. /// The following rules are verified while connecting the block: /// * Kernel sums balance, proving no inflation occurred /// * All inputs being spent were in the UTXO set /// * After applying the UTXO set updates, the TXO PMMR size & root and leafset root match the MWEB header /// </summary> /// <param name="block">The CBlock to connect.</param> /// <param name="consensus_params">The consensus parameters defined for the network.</param> /// <param name="pindexPrev">The CBlockIndex directly before the CBlock being connected.</param> /// <param name="blockundo">The CBlockUndo which will be updated to include the MWEB undo data upon success.</param> /// <param name="mweb_view">The CoinsViewCache the block should be connected to.</param> /// <param name="state">The CValidationState to update if validation fails.</param> /// <returns>True if all validation checks succeed, and the block is connected.</returns> static bool ConnectBlock( const CBlock& block, const Consensus::Params& consensus_params, const CBlockIndex* pindexPrev, CBlockUndo& blockundo, mw::CoinsViewCache& mweb_view, BlockValidationState& state ); /// <summary> /// Performs basic context-independent validation checks on individual transactions. /// The following rules are verified: /// * No pegin witness programs are included in Coinbase and HogEx outputs /// * Kernel sums balance, proving no inflation occurred, and the sender(s) knew the input blinding factors /// * Owner sums balance, proving the sender(s) knew the input receiver keys /// * MWEB transaction does not exceed max weight /// * Inputs, outputs, and kernels are properly sorted /// * No invalid duplicate inputs, outputs, or kernels /// * All signatures and rangeproofs are valid /// * Kernel features are valid /// /// WARNING: Don't apply this when validating blocks that pre-date MWEB activation. /// </summary> /// <param name="tx">The CTransaction to validate.</param> /// <param name="state">The CValidationState to update if validation fails.</param> /// <returns>True if all validation checks succeed.</returns> static bool CheckTransaction(const CTransaction& tx, TxValidationState& state);private: static bool ValidateMWEBBlock(const CBlock& block);};}