From 4ece67c057f0f80fe4b686d64e582044bdb4c96d Mon Sep 17 00:00:00 2001 From: Dario Date: Wed, 16 Sep 2020 13:22:17 +0200 Subject: [PATCH] work on hedera task for hedera transactions async --- src/cpp/model/hedera/Transaction.cpp | 2 + src/cpp/model/hedera/Transaction.h | 2 + src/cpp/model/hedera/TransactionReceipt.cpp | 16 ++++++++ src/cpp/model/hedera/TransactionReceipt.h | 23 +++++++++++ src/cpp/model/hedera/TransactionRecord.cpp | 0 src/cpp/model/hedera/TransactionRecord.h | 0 src/cpp/tasks/HederaTask.cpp | 45 +++++++++++++++++++++ src/cpp/tasks/HederaTask.h | 36 ++++++++++++++++- src/cpp/tasks/SigningTransaction.cpp | 6 ++- 9 files changed, 128 insertions(+), 2 deletions(-) create mode 100644 src/cpp/model/hedera/TransactionReceipt.cpp create mode 100644 src/cpp/model/hedera/TransactionReceipt.h create mode 100644 src/cpp/model/hedera/TransactionRecord.cpp create mode 100644 src/cpp/model/hedera/TransactionRecord.h diff --git a/src/cpp/model/hedera/Transaction.cpp b/src/cpp/model/hedera/Transaction.cpp index ab786e44f..779488630 100644 --- a/src/cpp/model/hedera/Transaction.cpp +++ b/src/cpp/model/hedera/Transaction.cpp @@ -58,6 +58,8 @@ namespace model { auto signature_pair = signature_pairs->Mutable(0); auto public_key = keyPairHedera->getPublicKey(); + mTransactionId = transactionBody->getProtoTransactionBody()->transactionid(); + auto sign = keyPairHedera->sign(body_bytes); if (!sign) { printf("[Query::sign] error signing message\n"); diff --git a/src/cpp/model/hedera/Transaction.h b/src/cpp/model/hedera/Transaction.h index fe1bfed51..5938a0f1e 100644 --- a/src/cpp/model/hedera/Transaction.h +++ b/src/cpp/model/hedera/Transaction.h @@ -29,11 +29,13 @@ namespace model { inline std::string getConnectionString() const { return mConnection.getUriWithPort(); } void resetPointer() { mTransaction = nullptr; } inline TransactionBodyType getType() const { return mType; } + inline proto::TransactionID getTransactionId() const { return mTransactionId; } protected: proto::Transaction* mTransaction; controller::NodeServerConnection mConnection; TransactionBodyType mType; + proto::TransactionID mTransactionId; }; } } diff --git a/src/cpp/model/hedera/TransactionReceipt.cpp b/src/cpp/model/hedera/TransactionReceipt.cpp new file mode 100644 index 000000000..46966814d --- /dev/null +++ b/src/cpp/model/hedera/TransactionReceipt.cpp @@ -0,0 +1,16 @@ +#include "TransactionReceipt.h" + +namespace model { + namespace hedera { + + TransactionReceipt::TransactionReceipt() + { + + } + + TransactionReceipt::~TransactionReceipt() + { + + } + } +} \ No newline at end of file diff --git a/src/cpp/model/hedera/TransactionReceipt.h b/src/cpp/model/hedera/TransactionReceipt.h new file mode 100644 index 000000000..ed1036857 --- /dev/null +++ b/src/cpp/model/hedera/TransactionReceipt.h @@ -0,0 +1,23 @@ +#ifndef __GRADIDO_LOGIN_SERVER_MODEL_HEDERA_TRANSACTION_RECEIPT_H +#define __GRADIDO_LOGIN_SERVER_MODEL_HEDERA_TRANSACTION_RECEIPT_H + +#include "../proto/hedera/TransactionReceipt.pb.h" + +namespace model { + namespace hedera { + class TransactionReceipt + { + public: + TransactionReceipt(); + ~TransactionReceipt(); + + inline proto::TransactionReceipt* getProto() { return &mProtoReceipt; } + + protected: + proto::TransactionReceipt mProtoReceipt; + + }; + } +} + +#endif //__GRADIDO_LOGIN_SERVER_MODEL_HEDERA_TRANSACTION_RECEIPT_H \ No newline at end of file diff --git a/src/cpp/model/hedera/TransactionRecord.cpp b/src/cpp/model/hedera/TransactionRecord.cpp new file mode 100644 index 000000000..e69de29bb diff --git a/src/cpp/model/hedera/TransactionRecord.h b/src/cpp/model/hedera/TransactionRecord.h new file mode 100644 index 000000000..e69de29bb diff --git a/src/cpp/tasks/HederaTask.cpp b/src/cpp/tasks/HederaTask.cpp index e69de29bb..9cd152d27 100644 --- a/src/cpp/tasks/HederaTask.cpp +++ b/src/cpp/tasks/HederaTask.cpp @@ -0,0 +1,45 @@ +#include "HederaTask.h" +#include "../lib/DataTypeConverter.h" + +#include "../proto/hedera/TransactionGetReceipt.pb.h" + +HederaTask::HederaTask() + : mTransactionReceipt(nullptr) +{ + +} + +HederaTask::~HederaTask() +{ + if (mTransactionReceipt) { + delete mTransactionReceipt; + mTransactionReceipt = nullptr; + } +} + +bool HederaTask::isTimeout() +{ + std::shared_lock _lock(mWorkingMutex); + auto valid_start = mTransactionID.transactionvalidstart(); + auto poco_timestamp = DataTypeConverter::convertFromProtoTimestamp(valid_start); + auto poco_duration = DataTypeConverter::convertFromProtoDuration(mValidDuration); + return (poco_timestamp + poco_duration) > Poco::Timestamp(); +} + +void HederaTask::setTransactionReceipt(model::hedera::TransactionReceipt* transactionReceipt) +{ + assert(transactionReceipt); + + std::unique_lock _lock(mWorkingMutex); + if (mTransactionReceipt) { + printf("[HederaTask::setTransactionReceipt] warning, receipt already set\n"); + delete mTransactionReceipt; + } + mTransactionReceipt = transactionReceipt; +} + +bool HederaTask::tryQueryReceipt() +{ + proto::TransactionGetReceiptQuery get_receipt_query; + return true; +} \ No newline at end of file diff --git a/src/cpp/tasks/HederaTask.h b/src/cpp/tasks/HederaTask.h index 0c22da226..3576ca7b6 100644 --- a/src/cpp/tasks/HederaTask.h +++ b/src/cpp/tasks/HederaTask.h @@ -2,14 +2,48 @@ #define __GRADIDO_LOGIN_TASKS_HEDERA_TASKS_H #include "../model/hedera/TransactionResponse.h" +#include "../model/hedera/TransactionReceipt.h" +#include "../proto/hedera/BasicTypes.pb.h" +#include "../proto/hedera/Duration.pb.h" + +#include "Poco/Timestamp.h" + +#include class HederaTask { public: - inline model::hedera::TransactionResponse* getTransactionResponse() { return &mTransactionResponse; } + + HederaTask(); + ~HederaTask(); + + inline model::hedera::TransactionResponse* getTransactionResponse() { std::shared_lock _lock(mWorkingMutex); return &mTransactionResponse; } + inline void setTransactionId(const proto::TransactionID& transactionId) { std::unique_lock _lock(mWorkingMutex); mTransactionID = transactionId; } + inline void setValidDuration(const proto::Duration& validDuration) { std::unique_lock _lock(mWorkingMutex); mValidDuration = validDuration; } + //! \param transactionReceipt take ownership and call delete if done + void setTransactionReceipt(model::hedera::TransactionReceipt* transactionReceipt); + + inline const proto::TransactionID& getTransactionId() const { std::shared_lock _lock(mWorkingMutex); return mTransactionID; } + inline const proto::Duration& getDuration() const { std::shared_lock _lock(mWorkingMutex); return mValidDuration; } + inline const model::hedera::TransactionReceipt* getTransactionReceipt() const{ std::shared_lock _lock(mWorkingMutex); return mTransactionReceipt; } + + //! \ brief return true if transactionValidStart + validDuration > now + bool isTimeout(); + + bool tryQueryReceipt(); + protected: model::hedera::TransactionResponse mTransactionResponse; + model::hedera::TransactionReceipt* mTransactionReceipt; + + proto::TransactionID mTransactionID; + proto::Duration mValidDuration; + + // last time checked if transaction receipt is available + Poco::Timestamp mLastCheck; + + mutable std::shared_mutex mWorkingMutex; }; #endif //__GRADIDO_LOGIN_TASKS_HEDERA_TASKS_H \ No newline at end of file diff --git a/src/cpp/tasks/SigningTransaction.cpp b/src/cpp/tasks/SigningTransaction.cpp index 297d2ca1d..b05d84963 100644 --- a/src/cpp/tasks/SigningTransaction.cpp +++ b/src/cpp/tasks/SigningTransaction.cpp @@ -1,5 +1,8 @@ +#include + #include "SigningTransaction.h" + #include #include "../SingletonManager/ErrorManager.h" @@ -184,7 +187,8 @@ int SigningTransaction::run() { } else { auto hedera_precheck_code_string = hedera_task.getTransactionResponse()->getPrecheckCodeString(); - printf("hedera response: %s\n", hedera_precheck_code_string.data()); + auto cost = hedera_task.getTransactionResponse()->getCost(); + printf("hedera response: %s, cost: %" PRIu64 "\n", hedera_precheck_code_string.data(), cost); } //model::hedera::TransactionBody hedera_transaction_body() }