Ethereum  PoC-8
The C++ Implementation of Ethereum
ClientBase.h
Go to the documentation of this file.
1 /*
2  This file is part of cpp-ethereum.
3 
4  cpp-ethereum is free software: you can redistribute it and/or modify
5  it under the terms of the GNU General Public License as published by
6  the Free Software Foundation, either version 3 of the License, or
7  (at your option) any later version.
8 
9  cpp-ethereum is distributed in the hope that it will be useful,
10  but WITHOUT ANY WARRANTY; without even the implied warranty of
11  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12  GNU General Public License for more details.
13 
14  You should have received a copy of the GNU General Public License
15  along with cpp-ethereum. If not, see <http://www.gnu.org/licenses/>.
16  */
23 #pragma once
24 
25 #include <chrono>
26 #include "Interface.h"
27 #include "LogFilter.h"
28 #include "TransactionQueue.h"
29 #include "Block.h"
30 #include "CommonNet.h"
31 
32 namespace dev
33 {
34 
35 namespace eth
36 {
37 
39 {
40  InstalledFilter(LogFilter const& _f): filter(_f) {}
41 
43  unsigned refCount = 1;
45 };
46 
47 static const h256 PendingChangedFilter = u256(0);
48 static const h256 ChainChangedFilter = u256(1);
49 
50 static const LogEntry SpecialLogEntry = LogEntry(Address(), h256s(), bytes());
51 static const LocalisedLogEntry InitialChange(SpecialLogEntry);
52 
54 {
55  ClientWatch(): lastPoll(std::chrono::system_clock::now()) {}
56  explicit ClientWatch(h256 _id, Reaping _r): id(_id), lastPoll(_r == Reaping::Automatic ? std::chrono::system_clock::now() : std::chrono::system_clock::time_point::max()) {}
57 
59 #if INITIAL_STATE_AS_CHANGES
61 #else
63 #endif
64  mutable std::chrono::system_clock::time_point lastPoll = std::chrono::system_clock::now();
65 };
66 
67 class ClientBase: public Interface
68 {
69 public:
71  virtual ~ClientBase() {}
72 
76  std::pair<u256, ExecutionResult> estimateGas(Address const& _from, u256 _value, Address _dest, bytes const& _data, int64_t _maxGas, u256 _gasPrice, BlockNumber _blockNumber, GasEstimationCallback const& _callback) override;
77 
79  using Interface::countAt;
80  using Interface::stateAt;
81  using Interface::codeAt;
84 
85  u256 balanceAt(Address _a, BlockNumber _block) const override;
86  u256 countAt(Address _a, BlockNumber _block) const override;
87  u256 stateAt(Address _a, u256 _l, BlockNumber _block) const override;
88  h256 stateRootAt(Address _a, BlockNumber _block) const override;
89  bytes codeAt(Address _a, BlockNumber _block) const override;
90  h256 codeHashAt(Address _a, BlockNumber _block) const override;
91  std::map<h256, std::pair<u256, u256>> storageAt(Address _a, BlockNumber _block) const override;
92 
93  LocalisedLogEntries logs(unsigned _watchId) const override;
94  LocalisedLogEntries logs(LogFilter const& _filter) const override;
95  virtual void prependLogsFromBlock(LogFilter const& _filter, h256 const& _blockHash, BlockPolarity _polarity, LocalisedLogEntries& io_logs) const;
96 
98  unsigned installWatch(LogFilter const& _filter, Reaping _r = Reaping::Automatic) override;
99  unsigned installWatch(h256 _filterId, Reaping _r = Reaping::Automatic) override;
100  bool uninstallWatch(unsigned _watchId) override;
101  LocalisedLogEntries peekWatch(unsigned _watchId) const override;
102  LocalisedLogEntries checkWatch(unsigned _watchId) override;
103 
104  h256 hashFromNumber(BlockNumber _number) const override;
105  BlockNumber numberFromHash(h256 _blockHash) const override;
106  int compareBlockHashes(h256 _h1, h256 _h2) const override;
107  BlockHeader blockInfo(h256 _hash) const override;
108  BlockDetails blockDetails(h256 _hash) const override;
109  Transaction transaction(h256 _transactionHash) const override;
110  LocalisedTransaction localisedTransaction(h256 const& _transactionHash) const override;
111  Transaction transaction(h256 _blockHash, unsigned _i) const override;
112  LocalisedTransaction localisedTransaction(h256 const& _blockHash, unsigned _i) const override;
113  TransactionReceipt transactionReceipt(h256 const& _transactionHash) const override;
114  LocalisedTransactionReceipt localisedTransactionReceipt(h256 const& _transactionHash) const override;
115  std::pair<h256, unsigned> transactionLocation(h256 const& _transactionHash) const override;
116  Transactions transactions(h256 _blockHash) const override;
117  Transactions transactions(BlockNumber _block) const override { if (_block == PendingBlock) return postSeal().pending(); return transactions(hashFromNumber(_block)); }
118  TransactionHashes transactionHashes(h256 _blockHash) const override;
119  BlockHeader uncle(h256 _blockHash, unsigned _i) const override;
120  UncleHashes uncleHashes(h256 _blockHash) const override;
121  unsigned transactionCount(h256 _blockHash) const override;
122  unsigned transactionCount(BlockNumber _block) const override { if (_block == PendingBlock) { auto p = postSeal().pending(); return p.size(); } return transactionCount(hashFromNumber(_block)); }
123  unsigned uncleCount(h256 _blockHash) const override;
124  unsigned number() const override;
125  h256s pendingHashes() const override;
126  BlockHeader pendingInfo() const override;
127  BlockDetails pendingDetails() const override;
128 
129  EVMSchedule evmSchedule() const override { return sealEngine()->evmSchedule(pendingInfo().number()); }
130 
131  ImportResult injectBlock(bytes const& _block) override;
132 
133  using Interface::addresses;
134  Addresses addresses(BlockNumber _block) const override;
135  u256 gasLimitRemaining() const override;
136  u256 gasBidPrice() const override { return DefaultGasPrice; }
137 
139  Address author() const override;
140 
141  bool isKnown(h256 const& _hash) const override;
142  bool isKnown(BlockNumber _block) const override;
143  bool isKnownTransaction(h256 const& _transactionHash) const override;
144  bool isKnownTransaction(h256 const& _blockHash, unsigned _i) const override;
145 
146  void startSealing() override
147  {
148  BOOST_THROW_EXCEPTION(
149  InterfaceNotSupported() << errinfo_interface("ClientBase::startSealing"));
150  }
151  void stopSealing() override
152  {
153  BOOST_THROW_EXCEPTION(
154  InterfaceNotSupported() << errinfo_interface("ClientBase::stopSealing"));
155  }
156  bool wouldSeal() const override
157  {
158  BOOST_THROW_EXCEPTION(
159  InterfaceNotSupported() << errinfo_interface("ClientBase::wouldSeal"));
160  }
161 
162  SyncStatus syncStatus() const override
163  {
164  BOOST_THROW_EXCEPTION(
165  InterfaceNotSupported() << errinfo_interface("ClientBase::syncStatus"));
166  }
167 
168  Block blockByNumber(BlockNumber _h) const;
169 
170  int chainId() const override;
171 
172 protected:
175  virtual BlockChain& bc() = 0;
176  virtual BlockChain const& bc() const = 0;
177  virtual Block block(h256 const& _h) const = 0;
178  virtual Block preSeal() const = 0;
179  virtual Block postSeal() const = 0;
180  virtual void prepareForTransaction() = 0;
182 
183  // filters
185  std::unordered_map<h256, InstalledFilter> m_filters;
186  std::unordered_map<h256, h256s> m_specialFilters = std::unordered_map<h256, std::vector<h256>>{{PendingChangedFilter, {}}, {ChainChangedFilter, {}}};
188  std::map<unsigned, ClientWatch> m_watches;
189 
191 };
192 
193 }}
dev::eth::ClientBase::localisedTransaction
LocalisedTransaction localisedTransaction(h256 const &_transactionHash) const override
Definition: ClientBase.cpp:324
dev::eth::ClientBase::syncStatus
SyncStatus syncStatus() const override
Get some information on the block queue.
Definition: ClientBase.h:162
dev::eth::ClientBase::bc
virtual BlockChain & bc()=0
dev::eth::ClientBase::bc
virtual BlockChain const & bc() const =0
dev::eth::ClientBase::uninstallWatch
bool uninstallWatch(unsigned _watchId) override
Definition: ClientBase.cpp:256
dev::eth::ClientBase::codeHashAt
h256 codeHashAt(Address _a, BlockNumber _block) const override
Definition: ClientBase.cpp:119
dev::eth::ClientBase::m_loggerWatch
Logger m_loggerWatch
Definition: ClientBase.h:190
dev::eth::ClientBase::m_watches
std::map< unsigned, ClientWatch > m_watches
Each and every watch - these reference a filter.
Definition: ClientBase.h:188
dev::eth::ClientBase::startSealing
void startSealing() override
Definition: ClientBase.h:146
dev::eth::ClientBase::gasLimitRemaining
u256 gasLimitRemaining() const override
Get the remaining gas limit in this block.
Definition: ClientBase.cpp:450
dev::eth::ImportResult
ImportResult
Definition: Common.h:97
dev::eth::Transaction
Encodes a transaction, ready to be exported to or freshly imported from RLP.
Definition: Transaction.h:86
dev::eth::LogFilter
Definition: LogFilter.h:51
dev::eth::Interface::stateAt
u256 stateAt(Address _a, u256 _l) const
Definition: Interface.h:112
dev::eth::Interface::countAt
u256 countAt(Address _a) const
Definition: Interface.h:111
dev::eth::ClientBase::codeAt
bytes codeAt(Address _a, BlockNumber _block) const override
Definition: ClientBase.cpp:114
dev::eth::ClientBase::logs
LocalisedLogEntries logs(unsigned _watchId) const override
Definition: ClientBase.cpp:130
dev::eth::BlockHeader
Encapsulation of a block header. Class to contain all of a block header's data. It is able to parse a...
Definition: BlockHeader.h:97
dev::eth::ClientBase::blockDetails
BlockDetails blockDetails(h256 _hash) const override
Definition: ClientBase.cpp:314
dev::eth::ClientBase::ClientBase
ClientBase()
Definition: ClientBase.h:70
dev::eth::Transactions
std::vector< Transaction > Transactions
Nice name for vector of Transaction.
Definition: Transaction.h:122
dev::eth::ClientWatch::lastPoll
std::chrono::system_clock::time_point lastPoll
Definition: ClientBase.h:64
dev::eth::LocalisedTransaction
Definition: Transaction.h:125
dev::eth::SyncStatus
Definition: CommonNet.h:96
dev::eth::ClientBase::prepareForTransaction
virtual void prepareForTransaction()=0
dev::eth::ClientBase::numberFromHash
BlockNumber numberFromHash(h256 _blockHash) const override
Definition: ClientBase.cpp:469
dev::eth::ClientBase::transactionLocation
std::pair< h256, unsigned > transactionLocation(h256 const &_transactionHash) const override
Definition: ClientBase.cpp:371
dev::eth::Interface::sealEngine
virtual SealEngineFace * sealEngine() const
Get the seal engine.
Definition: Interface.h:236
dev::eth::ClientWatch
Definition: ClientBase.h:54
dev::eth::InstalledFilter::InstalledFilter
InstalledFilter(LogFilter const &_f)
Definition: ClientBase.h:40
dev::eth::Reaping
Reaping
Definition: Interface.h:45
dev::eth::ClientBase::postSeal
virtual Block postSeal() const =0
dev::eth::ClientWatch::ClientWatch
ClientWatch()
Definition: ClientBase.h:55
dev::eth::ClientBase::transactions
Transactions transactions(h256 _blockHash) const override
Definition: ClientBase.cpp:376
dev::eth::InstalledFilter::changes
LocalisedLogEntries changes
Definition: ClientBase.h:44
dev::eth::Interface::codeAt
bytes codeAt(Address _a) const
Definition: Interface.h:113
dev::eth::ClientBase::compareBlockHashes
int compareBlockHashes(h256 _h1, h256 _h2) const override
Definition: ClientBase.cpp:480
dev::eth::ClientBase::transactionCount
unsigned transactionCount(h256 _blockHash) const override
Definition: ClientBase.cpp:406
dev::eth::ClientBase::pendingInfo
BlockHeader pendingInfo() const override
Definition: ClientBase.cpp:430
dev::eth::ClientBase::blockInfo
BlockHeader blockInfo(h256 _hash) const override
Definition: ClientBase.cpp:307
dev::eth::ClientBase::countAt
u256 countAt(Address _a, BlockNumber _block) const override
Definition: ClientBase.cpp:99
dev::eth::ClientBase::preSeal
virtual Block preSeal() const =0
dev::eth::BlockDetails
Definition: BlockDetails.h:42
dev::Addresses
h160s Addresses
A vector of Ethereum addresses.
Definition: Address.h:33
dev::FixedHash< 32 >
dev::eth::ClientBase::storageAt
std::map< h256, std::pair< u256, u256 > > storageAt(Address _a, BlockNumber _block) const override
Definition: ClientBase.cpp:124
dev::eth::InstalledFilter
Definition: ClientBase.h:39
dev::eth::ClientBase::stateAt
u256 stateAt(Address _a, u256 _l, BlockNumber _block) const override
Definition: ClientBase.cpp:104
dev::eth::ClientBase::transactions
Transactions transactions(BlockNumber _block) const override
Definition: ClientBase.h:117
dev::eth::InstalledFilter::filter
LogFilter filter
Definition: ClientBase.h:42
dev::eth::Interface::balanceAt
u256 balanceAt(Address _a) const
Definition: Interface.h:110
dev::eth::BlockPolarity
BlockPolarity
Definition: Common.h:81
dev::eth::ClientBase::localisedTransactionReceipt
LocalisedTransactionReceipt localisedTransactionReceipt(h256 const &_transactionHash) const override
Definition: ClientBase.cpp:351
dev::eth::ClientBase::gasBidPrice
u256 gasBidPrice() const override
Definition: ClientBase.h:136
dev::eth::ClientBase::balanceAt
u256 balanceAt(Address _a, BlockNumber _block) const override
Definition: ClientBase.cpp:94
dev::eth::ClientBase::stopSealing
void stopSealing() override
Definition: ClientBase.h:151
dev::eth::ClientBase::pendingDetails
BlockDetails pendingDetails() const override
Definition: ClientBase.cpp:435
dev::h256s
std::vector< h256 > h256s
Definition: FixedHash.h:361
dev::eth::ClientBase::wouldSeal
bool wouldSeal() const override
Would we like to be sealing now?
Definition: ClientBase.h:156
dev::Logger
boost::log::sources::severity_channel_logger<> Logger
Definition: Log.h:124
Block.h
Interface.h
dev::eth::ClientBase::estimateGas
std::pair< u256, ExecutionResult > estimateGas(Address const &_from, u256 _value, Address _dest, bytes const &_data, int64_t _maxGas, u256 _gasPrice, BlockNumber _blockNumber, GasEstimationCallback const &_callback) override
Definition: ClientBase.cpp:35
dev::eth::ClientBase::isKnown
bool isKnown(h256 const &_hash) const override
Definition: ClientBase.cpp:492
dev::eth::ClientBase::evmSchedule
EVMSchedule evmSchedule() const override
Definition: ClientBase.h:129
dev::eth::ClientBase::transactionReceipt
TransactionReceipt transactionReceipt(h256 const &_transactionHash) const override
Definition: ClientBase.cpp:346
dev::eth::ClientBase::~ClientBase
virtual ~ClientBase()
Definition: ClientBase.h:71
dev::eth::ClientBase::injectBlock
ImportResult injectBlock(bytes const &_block) override
Injects the RLP-encoded block given by the _rlp into the block queue directly.
Definition: ClientBase.cpp:89
dev::bytes
std::vector< byte > bytes
Definition: Common.h:72
dev::createLogger
Logger createLogger(int _severity, std::string const &_channel)
Definition: Log.h:125
dev::eth::ClientWatch::id
h256 id
Definition: ClientBase.h:58
dev::eth::ClientBase::uncleHashes
UncleHashes uncleHashes(h256 _blockHash) const override
Definition: ClientBase.cpp:401
dev::eth::Block::pending
Transactions const & pending() const
Get the list of pending transactions.
Definition: Block.h:183
dev::eth::GasEstimationCallback
std::function< void(GasEstimationProgress const &)> GasEstimationCallback
Definition: Interface.h:62
dev::eth::BlockChain
Implements the blockchain database. All data this gives is disk-backed. @threadsafe.
Definition: BlockChain.h:105
dev::eth::ClientBase
Definition: ClientBase.h:68
dev::eth::LogEntry
Definition: LogEntry.h:35
dev::eth::Interface
Main API hub for interfacing with Ethereum.
Definition: Interface.h:68
dev::eth::ClientBase::m_specialFilters
std::unordered_map< h256, h256s > m_specialFilters
The dictionary of special filters and their additional data.
Definition: ClientBase.h:186
dev::eth::ClientBase::pendingHashes
h256s pendingHashes() const override
Definition: ClientBase.cpp:425
dev::eth::ClientBase::chainId
int chainId() const override
Gets the chain id.
Definition: ClientBase.cpp:526
dev::eth::LocalisedLogEntries
std::vector< LocalisedLogEntry > LocalisedLogEntries
Definition: LogEntry.h:94
dev::VerbosityDebug
@ VerbosityDebug
Definition: Log.h:71
dev::Mutex
std::mutex Mutex
Definition: Guards.h:37
dev::eth::Interface::storageAt
std::map< h256, std::pair< u256, u256 > > storageAt(Address _a) const
Definition: Interface.h:115
dev::eth::UncleHashes
h256s UncleHashes
Definition: BlockChain.h:81
dev::eth::ClientWatch::changes
LocalisedLogEntries changes
Definition: ClientBase.h:62
dev::eth::ClientBase::hashFromNumber
h256 hashFromNumber(BlockNumber _number) const override
Definition: ClientBase.cpp:460
dev::eth::InstalledFilter::refCount
unsigned refCount
Definition: ClientBase.h:43
dev::eth::ClientBase::isKnownTransaction
bool isKnownTransaction(h256 const &_transactionHash) const override
Definition: ClientBase.cpp:507
dev::eth::ClientBase::uncleCount
unsigned uncleCount(h256 _blockHash) const override
Definition: ClientBase.cpp:413
dev::eth::BlockNumber
unsigned BlockNumber
Definition: Common.h:64
dev::eth::ClientBase::number
unsigned number() const override
Definition: ClientBase.cpp:420
std
Definition: FixedHash.h:393
dev::eth::ClientWatch::ClientWatch
ClientWatch(h256 _id, Reaping _r)
Definition: ClientBase.h:56
dev::eth::ClientBase::x_filtersWatches
Mutex x_filtersWatches
}
Definition: ClientBase.h:184
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::Interface::addresses
virtual Addresses addresses() const
Definition: Interface.h:192
dev::eth::ClientBase::blockByNumber
Block blockByNumber(BlockNumber _h) const
Definition: ClientBase.cpp:517
dev::eth::TransactionReceipt
Definition: TransactionReceipt.h:40
dev
Definition: Address.cpp:21
dev::eth::ClientBase::prependLogsFromBlock
virtual void prependLogsFromBlock(LogFilter const &_filter, h256 const &_blockHash, BlockPolarity _polarity, LocalisedLogEntries &io_logs) const
Definition: ClientBase.cpp:208
LogFilter.h
dev::eth::ClientBase::installWatch
unsigned installWatch(LogFilter const &_filter, Reaping _r=Reaping::Automatic) override
Install, uninstall and query watches.
Definition: ClientBase.cpp:221
dev::eth::ClientBase::transactionCount
unsigned transactionCount(BlockNumber _block) const override
Definition: ClientBase.h:122
dev::eth::ClientBase::transactionHashes
TransactionHashes transactionHashes(h256 _blockHash) const override
Definition: ClientBase.cpp:386
dev::eth::ClientBase::checkWatch
LocalisedLogEntries checkWatch(unsigned _watchId) override
Definition: ClientBase.cpp:291
dev::eth::LocalisedTransactionReceipt
Definition: TransactionReceipt.h:74
CommonNet.h
dev::eth::Interface::codeHashAt
h256 codeHashAt(Address _a) const
Definition: Interface.h:114
dev::eth::ClientBase::m_filters
std::unordered_map< h256, InstalledFilter > m_filters
The dictionary of filters that are active.
Definition: ClientBase.h:185
dev::eth::ClientBase::stateRootAt
h256 stateRootAt(Address _a, BlockNumber _block) const override
Definition: ClientBase.cpp:109
dev::eth::ClientBase::block
virtual Block block(h256 const &_h) const =0
dev::eth::SealEngineFace::evmSchedule
virtual EVMSchedule const & evmSchedule(u256 const &_blockNumber) const =0
dev::eth::Reaping::Automatic
@ Automatic
dev::errinfo_interface
boost::error_info< struct tag_interface, std::string > errinfo_interface
Definition: Exceptions.h:95
dev::eth::LocalisedLogEntry
Definition: LogEntry.h:54
dev::eth::EVMSchedule
Definition: EVMSchedule.h:29
dev::eth::ClientBase::author
Address author() const override
Get the block author.
Definition: ClientBase.cpp:455
dev::eth::ClientBase::transaction
Transaction transaction(h256 _transactionHash) const override
Definition: ClientBase.cpp:319
dev::Address
h160 Address
Definition: Address.h:30
dev::eth::Block
Active model of a block within the block chain. Keeps track of all transactions, receipts and state f...
Definition: Block.h:69
TransactionQueue.h
dev::eth::ClientBase::peekWatch
LocalisedLogEntries peekWatch(unsigned _watchId) const override
Definition: ClientBase.cpp:278
dev::eth::ClientBase::uncle
BlockHeader uncle(h256 _blockHash, unsigned _i) const override
Definition: ClientBase.cpp:391
dev::eth::TransactionHashes
h256s TransactionHashes
Definition: BlockChain.h:80