git / moonbite-core / src/libmw/include/mw/consensus/StealthSumValidator.h · raw
#pragma once#include <mw/crypto/PublicKeys.h>#include <mw/exceptions/ValidationException.h>#include <mw/models/crypto/BlindingFactor.h>#include <mw/models/tx/TxBody.h>class StealthSumValidator{public: // // Verifies that stealth excesses balance: // // sum(K_s) + sum(K_i) - sum(K_o) = sum(E') + x'*G // static void Validate(const BlindingFactor& stealth_offset, const TxBody& body) { std::vector<PublicKey> lhs_keys; // // sum(K_s) + sum(K_i) // std::transform( body.GetOutputs().cbegin(), body.GetOutputs().cend(), std::back_inserter(lhs_keys), [](const Output& output) { return output.GetSenderPubKey(); } ); for (const Input& input : body.GetInputs()) { if (!!input.GetInputPubKey()) { lhs_keys.push_back(*input.GetInputPubKey()); } } PublicKey lhs_total; if (!lhs_keys.empty()) { lhs_total = PublicKeys::Add(lhs_keys); } // // sum(E') + x'*G + sum(K_o) // std::vector<PublicKey> rhs_keys = body.GetStealthExcesses(); std::transform( body.GetInputs().cbegin(), body.GetInputs().cend(), std::back_inserter(rhs_keys), [](const Input& input) { return input.GetOutputPubKey(); } ); if (!stealth_offset.IsZero()) { rhs_keys.push_back(PublicKeys::Calculate(stealth_offset.GetBigInt())); } PublicKey rhs_total; if (!rhs_keys.empty()) { rhs_total = PublicKeys::Add(rhs_keys); } // sum(K_s) + sum(K_i) = sum(E') + x'*G + sum(K_o) if (lhs_total != rhs_total) { ThrowValidation(EConsensusError::STEALTH_SUMS); } }};