Skip to content

src/account/IGeniusTransactions.cpp

Namespaces

Name
sgns

Source code

#include "IGeniusTransactions.hpp"

#include "crypto/hasher/hasher_impl.hpp"

namespace sgns
{
    outcome::result<SGTransaction::DAGStruct> IGeniusTransactions::DeSerializeDAGStruct(
        const std::vector<uint8_t> &data )
    {
        SGTransaction::DAGWrapper dag_wrap;
        if ( !dag_wrap.ParseFromArray( data.data(), data.size() ) )
        {
            std::cerr << "Failed to parse DAGStruct from array.\n";
            return outcome::failure( boost::system::error_code{} );
        }
        SGTransaction::DAGStruct dag;
        dag.CopyFrom( *dag_wrap.mutable_dag_struct() );
        return dag;
    }

    outcome::result<SGTransaction::DAGStruct> IGeniusTransactions::DeSerializeDAGStruct( const std::string &data )
    {
        SGTransaction::DAGWrapper dag_wrap;
        if ( !dag_wrap.ParseFromString( data ) )
        {
            std::cerr << "Failed to parse DAGStruct from array.\n";
            return outcome::failure( boost::system::error_code{} );
        }
        SGTransaction::DAGStruct dag;
        dag.CopyFrom( *dag_wrap.mutable_dag_struct() );
        return dag;
    }

    void IGeniusTransactions::FillHash()
    {
        auto signature = dag_st.signature();
        dag_st.clear_signature();
        dag_st.clear_data_hash();

        auto hasher_ = std::make_shared<crypto::HasherImpl>();
        auto hash    = hasher_->blake2b_256( SerializeByteVector() );

        dag_st.set_data_hash( hash.toReadableString() );
        dag_st.set_signature( std::move( signature ) );
    }

    bool IGeniusTransactions::CheckHash()
    {
        auto signature = dag_st.signature();
        auto hash      = dag_st.data_hash();
        dag_st.clear_signature();
        dag_st.clear_data_hash();

        auto hasher_         = std::make_shared<crypto::HasherImpl>();
        auto calculated_hash = hasher_->blake2b_256( SerializeByteVector() );
        dag_st.set_data_hash( hash );
        dag_st.set_signature( std::move( signature ) );

        return hash == calculated_hash.toReadableString();
    }

    std::vector<uint8_t> IGeniusTransactions::MakeSignature( GeniusAccount &account )
    {
        dag_st.clear_signature();
        auto serialized = SerializeByteVector();

        std::vector<std::uint8_t> signed_vector( 64 );

        signed_vector = account.Sign( serialized );

        dag_st.set_signature( signed_vector.data(), signed_vector.size() );
        return signed_vector;
    }

    bool IGeniusTransactions::CheckSignature()
    {
        auto str_signature = dag_st.signature();
        dag_st.clear_signature();
        auto serialized = SerializeByteVector();
        dag_st.set_signature( str_signature );

        return GeniusAccount::VerifySignature( dag_st.source_addr(), str_signature, serialized );
    }

    bool IGeniusTransactions::CheckDAGSignatureLegacy()
    {
        auto str_signature = dag_st.signature();
        dag_st.clear_signature();
        auto                 size = dag_st.ByteSizeLong();
        std::vector<uint8_t> serialized( size );
        dag_st.SerializeToArray( serialized.data(), size );
        dag_st.set_signature( str_signature );

        return GeniusAccount::VerifySignature( dag_st.source_addr(), str_signature, serialized ) && CheckHash();
    }

    std::string IGeniusTransactions::GetHash() const
    {
        return dag_st.data_hash();
    }

    std::unordered_set<std::string> IGeniusTransactions::GetTopics() const
    {
        return { GetSrcAddress() };
    }
}

Updated on 2026-03-04 at 13:10:44 -0800