Ethereum  PoC-8
The C++ Implementation of Ethereum
Common.h
Go to the documentation of this file.
1 // Aleth: Ethereum C++ client, tools and libraries.
2 // Copyright 2019 Aleth Authors.
3 // Licensed under the GNU General Public License, Version 3.
4 
5 #pragma once
6 
7 #include <libdevcore/Address.h>
8 #include <libdevcore/Common.h>
10 #include <libdevcore/FixedHash.h>
11 
12 #include <functional>
13 #include <string>
14 
15 namespace dev
16 {
17 
18 class RLP;
19 class RLPStream;
20 
21 namespace eth
22 {
23 
25 extern const unsigned c_protocolVersion;
26 
28 extern const unsigned c_minorProtocolVersion;
29 
31 extern const unsigned c_databaseVersion;
32 
36 extern const bytes c_blockhashContractCode;
37 
39 std::string formatBalance(bigint const& _b);
40 
41 DEV_SIMPLE_EXCEPTION(InvalidAddress);
42 
44 Address toAddress(std::string const& _s);
45 
47 std::vector<std::pair<u256, std::string>> const& units();
48 
50 using LogBloom = h2048;
51 
53 using LogBlooms = std::vector<LogBloom>;
54 
55 // The various denominations; here for ease of use where needed within code.
56 static const u256 ether = exp10<18>();
57 static const u256 finney = exp10<15>();
58 static const u256 szabo = exp10<12>();
59 static const u256 shannon = exp10<9>();
60 static const u256 wei = exp10<0>();
61 
62 using Nonce = h64;
63 
64 using BlockNumber = unsigned;
65 
66 static const BlockNumber LatestBlock = (BlockNumber)-2;
67 static const BlockNumber PendingBlock = (BlockNumber)-1;
68 static const h256 LatestBlockHash = h256(2);
69 static const h256 EarliestBlockHash = h256(1);
70 static const h256 PendingBlockHash = h256(0);
71 
72 static const u256 DefaultBlockGasLimit = 4712388;
73 
75 {
76  Latest = LatestBlock,
77  Pending = PendingBlock
78 };
79 
80 enum class BlockPolarity
81 {
82  Unknown,
83  Dead,
84  Live
85 };
86 
87 class Transaction;
88 
90 {
93  std::vector<Transaction> goodTranactions;
94 };
95 
96 enum class ImportResult
97 {
98  Success = 0,
103  AlreadyKnown,
104  Malformed,
106  BadChain,
108 };
109 
111 {
112  using value = unsigned;
113  enum
114  {
115  ValidSeal = 1,
118  UncleSeals = 16,
120  Parent = 64,
121  UncleParent = 128,
122  PostGenesis = 256,
128  None = 0
129  };
130 };
131 
133 template<typename... Args> class Signal
134 {
135 public:
136  using Callback = std::function<void(Args...)>;
137 
139  {
140  friend class Signal;
141 
142  public:
143  ~HandlerAux() { if (m_s) m_s->m_fire.erase(m_i); }
144  void reset() { m_s = nullptr; }
145  void fire(Args const&... _args) { m_h(_args...); }
146 
147  private:
148  HandlerAux(unsigned _i, Signal* _s, Callback const& _h): m_i(_i), m_s(_s), m_h(_h) {}
149 
150  unsigned m_i = 0;
151  Signal* m_s = nullptr;
152  Callback m_h;
153  };
154 
156  {
157  for (auto const& h : m_fire)
158  if (auto l = h.second.lock())
159  l->reset();
160  }
161 
162  std::shared_ptr<HandlerAux> add(Callback const& _h)
163  {
164  auto n = m_fire.empty() ? 0 : (m_fire.rbegin()->first + 1);
165  auto h = std::shared_ptr<HandlerAux>(new HandlerAux(n, this, _h));
166  m_fire[n] = h;
167  return h;
168  }
169 
170  void operator()(Args const&... _args)
171  {
172  for (auto const& f: valuesOf(m_fire))
173  if (auto h = f.lock())
174  h->fire(_args...);
175  }
176 
177 private:
178  std::map<unsigned, std::weak_ptr<typename Signal::HandlerAux>> m_fire;
179 };
180 
181 template<class... Args> using Handler = std::shared_ptr<typename Signal<Args...>::HandlerAux>;
182 
184 {
185  bool creation = false;
193 
194  std::string userReadable(bool _toProxy, std::function<std::pair<bool, std::string>(TransactionSkeleton const&)> const& _getNatSpec, std::function<std::string(Address const&)> const& _formatAddress) const;
195 };
196 
197 
198 void badBlock(bytesConstRef _header, std::string const& _err);
199 inline void badBlock(bytes const& _header, std::string const& _err) { badBlock(&_header, _err); }
200 
201 // TODO: move back into a mining subsystem and have it be accessible from Sealant only via a dynamic_cast.
206 {
207 // MiningProgress& operator+=(MiningProgress const& _mp) { hashes += _mp.hashes; ms = std::max(ms, _mp.ms); return *this; }
208  uint64_t hashes = 0;
209  uint64_t ms = 0;
210  u256 rate() const { return ms == 0 ? 0 : hashes * 1000 / ms; }
211 };
212 
214 enum class IfDropped
215 {
216  Ignore,
217  Retry
218 };
219 
222 {
223  Success = 0,
248 };
249 }
250 }
dev::eth::AlethErrors
AlethErrors
Errors returned from main.
Definition: Common.h:222
dev::eth::formatBalance
std::string formatBalance(bigint const &_b)
User-friendly string representation of the amount _b in wei.
Definition: Common.cpp:96
dev::eth::ImportRequirements::CheckUncles
@ CheckUncles
Check uncle seals.
Definition: Common.h:123
dev::eth::ImportResult::AlreadyKnown
@ AlreadyKnown
dev::eth::TransactionSkeleton
Definition: Common.h:184
dev::eth::c_databaseVersion
const unsigned c_databaseVersion
Current database version.
Definition: Common.cpp:51
dev::eth::Signal::HandlerAux::fire
void fire(Args const &... _args)
Definition: Common.h:145
dev::eth::ImportResult
ImportResult
Definition: Common.h:97
dev::eth::ImportRequirements::Everything
@ Everything
Definition: Common.h:127
dev::eth::ImportRequirements::ValidSeal
@ ValidSeal
Validate seal.
Definition: Common.h:115
dev::eth::TransactionSkeleton::to
Address to
Definition: Common.h:187
dev::vector_ref< byte const >
dev::eth::Signal::~Signal
~Signal()
Definition: Common.h:155
dev::eth::ImportRequirements::CheckTransactions
@ CheckTransactions
Check transaction signatures.
Definition: Common.h:124
dev::eth::WorkingProgress::rate
u256 rate() const
Definition: Common.h:210
dev::eth::TransactionSkeleton::creation
bool creation
Definition: Common.h:185
FixedHash.h
dev::eth::c_protocolVersion
const unsigned c_protocolVersion
Current protocol version.
Definition: Common.cpp:40
dev::eth::WorkingProgress
Describes the progress of a mining operation.
Definition: Common.h:206
dev::eth::TransactionSkeleton::userReadable
std::string userReadable(bool _toProxy, std::function< std::pair< bool, std::string >(TransactionSkeleton const &)> const &_getNatSpec, std::function< std::string(Address const &)> const &_formatAddress) const
Definition: Common.cpp:148
dev::eth::TransactionSkeleton::gasPrice
u256 gasPrice
Definition: Common.h:192
dev::eth::Signal::HandlerAux
Definition: Common.h:139
dev::eth::Signal::HandlerAux::reset
void reset()
Definition: Common.h:144
dev::h256
FixedHash< 32 > h256
Definition: FixedHash.h:356
dev::eth::ImportRequirements::value
unsigned value
Definition: Common.h:112
dev::eth::ImportRequirements::UncleBasic
@ UncleBasic
Check the basic structure of the uncles.
Definition: Common.h:116
dev::eth::BadFormatOption
@ BadFormatOption
Definition: Common.h:236
dev::eth::WorkingProgress::hashes
uint64_t hashes
Total number of hashes computed.
Definition: Common.h:208
Address.h
dev::eth::ImportResult::BadChain
@ BadChain
dev::eth::ImportResult::FutureTimeUnknown
@ FutureTimeUnknown
dev::eth::BadExtraDataOption
@ BadExtraDataOption
Definition: Common.h:233
dev::eth::badBlock
void badBlock(bytesConstRef _block, string const &_err)
Definition: Common.cpp:141
dev::eth::ImportRequirements::InOrderChecks
@ InOrderChecks
Do all checks that cannot be done independently of prior blocks having been imported.
Definition: Common.h:126
dev::eth::TransactionSkeleton::value
u256 value
Definition: Common.h:188
dev::eth::ImportRequirements::UncleSeals
@ UncleSeals
Check the basic structure of the uncles.
Definition: Common.h:118
dev::eth::UnknownNetworkType
@ UnknownNetworkType
Definition: Common.h:230
dev::eth::KeyManagerInitializationFailure
@ KeyManagerInitializationFailure
Definition: Common.h:241
dev::eth::NetworkStartFailure
@ NetworkStartFailure
Definition: Common.h:243
dev::eth::ImportResult::Malformed
@ Malformed
dev::FixedHash< 20 >
dev::eth::RelativeBlock::Latest
@ Latest
dev::eth::UnrecognizedPeerset
@ UnrecognizedPeerset
Definition: Common.h:224
dev::eth::BadUpnpOption
@ BadUpnpOption
Definition: Common.h:237
dev::eth::BadConfigOption
@ BadConfigOption
Definition: Common.h:232
dev::eth::TransactionSkeleton::nonce
u256 nonce
Definition: Common.h:190
dev::eth::BlockPolarity
BlockPolarity
Definition: Common.h:81
dev::h2048
FixedHash< 256 > h2048
Definition: FixedHash.h:352
dev::eth::BadNetworkIdOption
@ BadNetworkIdOption
Definition: Common.h:231
dev::eth::ArgumentProcessingFailure
@ ArgumentProcessingFailure
Definition: Common.h:225
dev::eth::ImportRequirements::Parent
@ Parent
Check parent block header.
Definition: Common.h:120
dev::eth::toAddress
Address toAddress(std::string const &_s)
Convert the given string into an address.
Definition: Common.cpp:56
dev::h256s
std::vector< h256 > h256s
Definition: FixedHash.h:361
Common.h
dev::eth::TransactionSkeleton::data
bytes data
Definition: Common.h:189
dev::eth::ImportResult::AlreadyInChain
@ AlreadyInChain
dev::eth::ImportRequirements::OutOfOrderChecks
@ OutOfOrderChecks
Do all checks that can be done independently of prior blocks having been imported.
Definition: Common.h:125
dev::valuesOf
std::vector< U > valuesOf(std::map< T, U > const &_m)
Definition: CommonData.h:304
dev::eth::IfDropped::Retry
@ Retry
Import transaction even if it was dropped before.
dev::eth::IfDropped
IfDropped
Import transaction policy.
Definition: Common.h:215
dev::eth::c_blockhashContractCode
const bytes c_blockhashContractCode
Code of the special contract for block hash storage defined in EIP96.
dev::eth::units
vector< pair< u256, string > > const & units()
Get information concerning the currency denominations.
Definition: Common.cpp:68
dev::bytes
std::vector< byte > bytes
Definition: Common.h:72
dev::eth::ConfigFileEmptyOrNotFound
@ ConfigFileEmptyOrNotFound
Definition: Common.h:228
dev::eth::BadBlockNumberHashOption
@ BadBlockNumberHashOption
Definition: Common.h:240
dev::eth::ImportRoute::liveBlocks
h256s liveBlocks
Definition: Common.h:92
Exceptions.h
dev::eth::LogBlooms
std::vector< LogBloom > LogBlooms
Many log blooms.
Definition: Common.h:53
dev::eth::ImportRequirements::UncleParent
@ UncleParent
Check uncle parent block header.
Definition: Common.h:121
dev::eth::c_blockhashContractAddress
const Address c_blockhashContractAddress(0xf0)
Address of the special contract for block hash storage defined in EIP96.
Definition: Common.h:34
dev::eth::BlockPolarity::Unknown
@ Unknown
dev::eth::UnknownArgument
@ UnknownArgument
Definition: Common.h:226
dev::Invalid256
constexpr u256 Invalid256
Definition: Common.h:147
dev::eth::Signal< h256s const &, h256s const & >::Callback
std::function< void(Args...)> Callback
Definition: Common.h:136
dev::eth::RelativeBlock::Pending
@ Pending
dev::eth::ImportRoute::deadBlocks
h256s deadBlocks
Definition: Common.h:91
dev::eth::RlpDataNotAList
@ RlpDataNotAList
Definition: Common.h:245
dev::eth::c_minorProtocolVersion
const unsigned c_minorProtocolVersion
Current minor protocol version.
Definition: Common.cpp:46
dev::bigint
boost::multiprecision::number< boost::multiprecision::cpp_int_backend<> > bigint
Definition: Common.h:118
dev::h64
FixedHash< 8 > h64
Definition: FixedHash.h:359
dev::eth::ConfigFileInvalid
@ ConfigFileInvalid
Definition: Common.h:229
dev::eth::BlockPolarity::Live
@ Live
dev::eth::BlockNumber
unsigned BlockNumber
Definition: Common.h:64
dev::eth::ImportRequirements
Definition: Common.h:111
dev::eth::BlockPolarity::Dead
@ Dead
dev::eth::Success
@ Success
Definition: Common.h:223
dev::eth::ImportResult::OverbidGasPrice
@ OverbidGasPrice
dev::u256
boost::multiprecision::number< boost::multiprecision::cpp_int_backend< 256, 256, boost::multiprecision::unsigned_magnitude, boost::multiprecision::unchecked, void > > u256
Definition: Common.h:121
dev::eth::Signal::add
std::shared_ptr< HandlerAux > add(Callback const &_h)
Definition: Common.h:162
dev::eth::BadHexValueInAddressOption
@ BadHexValueInAddressOption
Definition: Common.h:239
dev::eth::IfDropped::Ignore
@ Ignore
Don't import transaction that was previously dropped.
dev::eth::WorkingProgress::ms
uint64_t ms
Total number of milliseconds of mining thus far.
Definition: Common.h:209
dev::eth::Signal::HandlerAux::~HandlerAux
~HandlerAux()
Definition: Common.h:143
dev::eth::BadBidOption
@ BadBidOption
Definition: Common.h:235
dev::eth::ImportRoute
Definition: Common.h:90
dev::exp10< 0 >
u256 exp10< 0 >()
Definition: Common.h:186
dev::eth::DEV_SIMPLE_EXCEPTION
DEV_SIMPLE_EXCEPTION(NoHashRecorded)
dev
Definition: Address.cpp:21
dev::eth::Signal::operator()
void operator()(Args const &... _args)
Definition: Common.h:170
dev::eth::ImportRequirements::None
@ None
Definition: Common.h:128
dev::eth::ImportResult::ZeroSignature
@ ZeroSignature
dev::eth::ImportResult::FutureTimeKnown
@ FutureTimeKnown
dev::eth::BadRlp
@ BadRlp
Definition: Common.h:244
dev::eth::Handler
std::shared_ptr< typename Signal< Args... >::HandlerAux > Handler
Definition: Common.h:181
dev::eth::ImportRoute::goodTranactions
std::vector< Transaction > goodTranactions
Definition: Common.h:93
dev::eth::Signal
Super-duper signal mechanism. TODO: replace with somthing a bit heavier weight.
Definition: Common.h:134
dev::eth::SnapshotImportFailure
@ SnapshotImportFailure
Definition: Common.h:242
dev::eth::ImportResult::UnknownParent
@ UnknownParent
dev::eth::BadAddressOption
@ BadAddressOption
Definition: Common.h:238
dev::eth::RelativeBlock
RelativeBlock
Definition: Common.h:75
dev::eth::ImportRequirements::TransactionBasic
@ TransactionBasic
Check the basic structure of the transactions.
Definition: Common.h:117
dev::eth::UnsupportedJsonType
@ UnsupportedJsonType
Definition: Common.h:246
dev::eth::ImportRequirements::PostGenesis
@ PostGenesis
Require block to be non-genesis.
Definition: Common.h:122
dev::eth::InvalidJson
@ InvalidJson
Definition: Common.h:247
dev::eth::ImportRequirements::TransactionSignatures
@ TransactionSignatures
Check the basic structure of the transactions.
Definition: Common.h:119
dev::eth::BadAskOption
@ BadAskOption
Definition: Common.h:234
dev::eth::TransactionSkeleton::gas
u256 gas
Definition: Common.h:191
dev::eth::TransactionSkeleton::from
Address from
Definition: Common.h:186
dev::eth::UnknownMiningOption
@ UnknownMiningOption
Definition: Common.h:227