bool BlockchainExplorerDataBuilder::getPaymentId(const Transaction& transaction, Crypto::Hash& paymentId) { std::vector<TransactionExtraField> txExtraFields; parseTransactionExtra(transaction.extra, txExtraFields); TransactionExtraNonce extraNonce; if (!findTransactionExtraFieldByType(txExtraFields, extraNonce)) { return false; } return getPaymentIdFromTransactionExtraNonce(extraNonce.nonce, paymentId); }
PublicKey getTransactionPublicKeyFromExtra(const std::vector<uint8_t>& tx_extra) { std::vector<TransactionExtraField> tx_extra_fields; parseTransactionExtra(tx_extra, tx_extra_fields); TransactionExtraPublicKey pub_key_field; if (!findTransactionExtraFieldByType(tx_extra_fields, pub_key_field)) return boost::value_initialized<PublicKey>(); return pub_key_field.publicKey; }
bool BlockchainExplorerDataBuilder::fillTxExtra(const std::vector<uint8_t>& rawExtra, TransactionExtraDetails& extraDetails) { extraDetails.raw = rawExtra; std::vector<TransactionExtraField> txExtraFields; parseTransactionExtra(rawExtra, txExtraFields); for (const TransactionExtraField& field : txExtraFields) { if (typeid(TransactionExtraPadding) == field.type()) { extraDetails.padding.push_back(std::move(boost::get<TransactionExtraPadding>(field).size)); } else if (typeid(TransactionExtraPublicKey) == field.type()) { extraDetails.publicKey.push_back(std::move(boost::get<TransactionExtraPublicKey>(field).publicKey)); } else if (typeid(TransactionExtraNonce) == field.type()) { extraDetails.nonce.push_back(Common::toHex(boost::get<TransactionExtraNonce>(field).nonce.data(), boost::get<TransactionExtraNonce>(field).nonce.size())); } } return true; }
bool getPaymentIdFromTxExtra(const std::vector<uint8_t>& extra, Hash& paymentId) { std::vector<TransactionExtraField> tx_extra_fields; if (!parseTransactionExtra(extra, tx_extra_fields)) { return false; } TransactionExtraNonce extra_nonce; if (findTransactionExtraFieldByType(tx_extra_fields, extra_nonce)) { if (!getPaymentIdFromTransactionExtraNonce(extra_nonce.nonce, paymentId)) { return false; } } else { return false; } return true; }
std::vector<std::string> get_messages_from_extra(const std::vector<uint8_t> &extra, const Crypto::PublicKey &txkey, const Crypto::SecretKey *recepient_secret_key) { std::vector<TransactionExtraField> tx_extra_fields; std::vector<std::string> result; if (!parseTransactionExtra(extra, tx_extra_fields)) { return result; } size_t i = 0; for (const auto& f : tx_extra_fields) { if (f.type() != typeid(tx_extra_message)) { continue; } std::string res; if (boost::get<tx_extra_message>(f).decrypt(i, txkey, recepient_secret_key, res)) { result.push_back(res); } ++i; } return result; }
bool getMergeMiningTagFromExtra(const std::vector<uint8_t>& tx_extra, TransactionExtraMergeMiningTag& mm_tag) { std::vector<TransactionExtraField> tx_extra_fields; parseTransactionExtra(tx_extra, tx_extra_fields); return findTransactionExtraFieldByType(tx_extra_fields, mm_tag); }