git / moonbite-core / src/libmw/include/mw/consensus/Aggregation.h · raw
#pragma once#include <mw/crypto/Pedersen.h>#include <mw/models/tx/Transaction.h>#include <cassert>class Aggregation{public: // // Aggregates multiple transactions into 1. // static mw::Transaction::CPtr Aggregate(const std::vector<mw::Transaction::CPtr>& transactions) { if (transactions.empty()) { return std::make_shared<mw::Transaction>(); } if (transactions.size() == 1) { return transactions.front(); } std::vector<Input> inputs; std::vector<Output> outputs; std::vector<Kernel> kernels; std::vector<BlindingFactor> kernel_offsets; std::vector<BlindingFactor> stealth_offsets; // collect all the inputs, outputs, kernels, and owner sigs from the txs for (const mw::Transaction::CPtr& pTransaction : transactions) { inputs.insert( inputs.end(), pTransaction->GetInputs().begin(), pTransaction->GetInputs().end() ); outputs.insert( outputs.end(), pTransaction->GetOutputs().begin(), pTransaction->GetOutputs().end() ); kernels.insert( kernels.end(), pTransaction->GetKernels().begin(), pTransaction->GetKernels().end() ); kernel_offsets.push_back(pTransaction->GetKernelOffset()); stealth_offsets.push_back(pTransaction->GetStealthOffset()); } // Sum the offsets up to give us an aggregate offsets for the transaction. BlindingFactor kernel_offset = Pedersen::AddBlindingFactors(kernel_offsets); BlindingFactor stealth_offset = Pedersen::AddBlindingFactors(stealth_offsets); // Build a new aggregate tx return mw::Transaction::Create( std::move(kernel_offset), std::move(stealth_offset), std::move(inputs), std::move(outputs), std::move(kernels) ); }};