TARAXA
transaction.hpp
Go to the documentation of this file.
1 #pragma once
2 
3 #include <json/value.h>
4 #include <libdevcore/RLP.h>
5 #include <libdevcore/SHA3.h>
6 
7 #include "common/types.hpp"
8 
9 namespace taraxa {
10 
11 struct Transaction {
12  struct InvalidTransaction : std::runtime_error {
13  explicit InvalidTransaction(const std::string &msg) : runtime_error("invalid transaction - " + msg) {}
14  };
15 
17  explicit InvalidSignature(const std::string &msg) : InvalidTransaction("signature:\n" + msg) {}
18  };
19 
21  explicit InvalidFormat(const std::string &msg) : InvalidTransaction("rlp format:\n" + msg) {}
22  };
23 
24  protected:
28  gas_t gas_ = 0;
30  std::optional<addr_t> receiver_;
31  uint64_t chain_id_ = 0;
33  mutable trx_hash_t hash_;
34  mutable std::atomic_bool hash_initialized_ = false;
35  bool is_zero_ = false;
36  mutable std::mutex hash_mu_;
37  mutable std::atomic_bool sender_initialized_ = false;
38  mutable bool sender_valid_ = false;
39  mutable addr_t sender_;
40  mutable std::mutex sender_mu_;
41  mutable std::atomic_bool cached_rlp_set_ = false;
42  mutable bytes cached_rlp_;
43  mutable std::mutex cached_rlp_mu_;
44 
46  addr_t const &get_sender_() const;
47  virtual void streamRLP(dev::RLPStream &s, bool for_signature) const;
48  virtual void fromRLP(const dev::RLP &_rlp, bool verify_strict, const h256 &hash);
49 
50  public:
51  // TODO eliminate and use shared_ptr<Transaction> everywhere
52  Transaction() : is_zero_(true) {}
53  Transaction(const trx_nonce_t &nonce, const val_t &value, const val_t &gas_price, gas_t gas, bytes data,
54  const secret_t &sk, const std::optional<addr_t> &receiver = std::nullopt, uint64_t chain_id = 0);
55  explicit Transaction(const dev::RLP &_rlp, bool verify_strict = false, const h256 &hash = {});
56  explicit Transaction(const bytes &_rlp, bool verify_strict = false, const h256 &hash = {});
57 
58  auto isZero() const { return is_zero_; }
59  const trx_hash_t &getHash() const;
60  auto getNonce() const { return nonce_; }
61  const auto &getValue() const { return value_; }
62  const auto &getGasPrice() const { return gas_price_; }
63  auto getGas() const { return gas_; }
64  const auto &getData() const { return data_; }
65  const auto &getReceiver() const { return receiver_; }
66  auto getChainID() const { return chain_id_; }
67  const auto &getVRS() const { return vrs_; }
68  auto getCost() const { return gas_price_ * gas_ + value_; }
69 
70  virtual const addr_t &getSender() const;
71 
72  bool operator==(Transaction const &other) const { return getHash() == other.getHash(); }
73 
74  const bytes &rlp() const;
75 
76  Json::Value toJSON() const;
77 };
78 
79 using SharedTransaction = std::shared_ptr<Transaction>;
80 using Transactions = std::vector<Transaction>;
81 using SharedTransactions = std::vector<SharedTransaction>;
82 using TransactionHashes = std::vector<trx_hash_t>;
83 
85 
86 } // namespace taraxa
Definition: RLP.h:56
Class for writing to an RLP bytestream.
Definition: RLP.h:484
std::vector<::byte > bytes
Definition: Common.h:46
Definition: config.hpp:8
std::shared_ptr< Transaction > SharedTransaction
Definition: transaction.hpp:79
std::vector< Transaction > Transactions
Definition: transaction.hpp:80
std::vector< SharedTransaction > SharedTransactions
Definition: transaction.hpp:81
val_t trx_nonce_t
Definition: types.hpp:54
std::vector< trx_hash_t > TransactionHashes
Definition: transaction.hpp:82
TransactionHashes hashes_from_transactions(const SharedTransactions &transactions)
Definition: transaction.cpp:23
dev::u256 val_t
Definition: types.hpp:47
uint64_t gas_t
Definition: types.hpp:45
Definition: Common.h:38
Definition: transaction.hpp:20
InvalidFormat(const std::string &msg)
Definition: transaction.hpp:21
Definition: transaction.hpp:16
InvalidSignature(const std::string &msg)
Definition: transaction.hpp:17
Definition: transaction.hpp:12
InvalidTransaction(const std::string &msg)
Definition: transaction.hpp:13
Definition: transaction.hpp:11
trx_hash_t hash_
Definition: transaction.hpp:33
Transaction()
Definition: transaction.hpp:52
bytes data_
Definition: transaction.hpp:29
val_t gas_price_
Definition: transaction.hpp:27
std::atomic_bool cached_rlp_set_
Definition: transaction.hpp:41
bool sender_valid_
Definition: transaction.hpp:38
bool operator==(Transaction const &other) const
Definition: transaction.hpp:72
const auto & getValue() const
Definition: transaction.hpp:61
auto getCost() const
Definition: transaction.hpp:68
const bytes & rlp() const
Definition: transaction.cpp:141
val_t value_
Definition: transaction.hpp:26
bytes cached_rlp_
Definition: transaction.hpp:42
virtual const addr_t & getSender() const
Definition: transaction.cpp:117
auto getNonce() const
Definition: transaction.hpp:60
uint64_t chain_id_
Definition: transaction.hpp:31
std::mutex hash_mu_
Definition: transaction.hpp:36
std::mutex cached_rlp_mu_
Definition: transaction.hpp:43
const auto & getData() const
Definition: transaction.hpp:64
Json::Value toJSON() const
Definition: transaction.cpp:160
Transaction(const trx_nonce_t &nonce, const val_t &value, const val_t &gas_price, gas_t gas, bytes data, const secret_t &sk, const std::optional< addr_t > &receiver=std::nullopt, uint64_t chain_id=0)
addr_t const & get_sender_() const
Definition: transaction.cpp:103
virtual void streamRLP(dev::RLPStream &s, bool for_signature) const
Definition: transaction.cpp:125
virtual void fromRLP(const dev::RLP &_rlp, bool verify_strict, const h256 &hash)
Definition: transaction.cpp:67
auto getGas() const
Definition: transaction.hpp:63
auto getChainID() const
Definition: transaction.hpp:66
const auto & getVRS() const
Definition: transaction.hpp:67
addr_t sender_
Definition: transaction.hpp:39
std::atomic_bool hash_initialized_
Definition: transaction.hpp:34
const auto & getGasPrice() const
Definition: transaction.hpp:62
std::atomic_bool sender_initialized_
Definition: transaction.hpp:37
std::optional< addr_t > receiver_
Definition: transaction.hpp:30
auto isZero() const
Definition: transaction.hpp:58
std::mutex sender_mu_
Definition: transaction.hpp:40
const trx_hash_t & getHash() const
Definition: transaction.cpp:92
gas_t gas_
Definition: transaction.hpp:28
bool is_zero_
Definition: transaction.hpp:35
const auto & getReceiver() const
Definition: transaction.hpp:65
trx_nonce_t nonce_
Definition: transaction.hpp:25
trx_hash_t hash_for_signature() const
Definition: transaction.cpp:154
dev::SignatureStruct vrs_
Definition: transaction.hpp:32