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 }}
virtual BlockChain & bc()=0
bool uninstallWatch(unsigned _watchId) override
Definition: ClientBase.cpp:256
Address author() const override
Get the block author.
Definition: ClientBase.cpp:455
Definition: Address.cpp:20
bytes codeAt(Address _a) const
Definition: Interface.h:113
BlockNumber numberFromHash(h256 _blockHash) const override
Definition: ClientBase.cpp:469
LocalisedLogEntries changes
Definition: ClientBase.h:62
LocalisedLogEntries logs(unsigned _watchId) const override
Definition: ClientBase.cpp:130
virtual Block postSeal() const =0
u256 gasLimitRemaining() const override
Get the remaining gas limit in this block.
Definition: ClientBase.cpp:450
h256s TransactionHashes
Definition: BlockChain.h:80
virtual EVMSchedule const & evmSchedule(u256 const &_blockNumber) const =0
Implements the blockchain database. All data this gives is disk-backed. .
Definition: BlockChain.h:104
SyncStatus syncStatus() const override
Get some information on the block queue.
Definition: ClientBase.h:162
Encapsulation of a block header. Class to contain all of a block header&#39;s data. It is able to parse a...
Definition: BlockHeader.h:96
h256 codeHashAt(Address _a, BlockNumber _block) const override
Definition: ClientBase.cpp:119
InstalledFilter(LogFilter const &_f)
Definition: ClientBase.h:40
void startSealing() override
Definition: ClientBase.h:146
u256 countAt(Address _a, BlockNumber _block) const override
Definition: ClientBase.cpp:99
virtual Block preSeal() const =0
h160 Address
Definition: Address.h:30
bytes codeAt(Address _a, BlockNumber _block) const override
Definition: ClientBase.cpp:114
LocalisedLogEntries changes
Definition: ClientBase.h:44
ClientWatch(h256 _id, Reaping _r)
Definition: ClientBase.h:56
BlockDetails blockDetails(h256 _hash) const override
Definition: ClientBase.cpp:314
std::vector< Transaction > Transactions
Nice name for vector of Transaction.
Definition: Transaction.h:122
unsigned transactionCount(h256 _blockHash) const override
Definition: ClientBase.cpp:406
Transactions const & pending() const
Get the list of pending transactions.
Definition: Block.h:183
u256 countAt(Address _a) const
Definition: Interface.h:111
Definition: FixedHash.h:390
BlockHeader blockInfo(h256 _hash) const override
Definition: ClientBase.cpp:307
int compareBlockHashes(h256 _h1, h256 _h2) const override
Definition: ClientBase.cpp:480
virtual void prepareForTransaction()=0
std::pair< h256, unsigned > transactionLocation(h256 const &_transactionHash) const override
Definition: ClientBase.cpp:371
BlockHeader pendingInfo() const override
Definition: ClientBase.cpp:430
u256 stateAt(Address _a, u256 _l) const
Definition: Interface.h:112
u256 balanceAt(Address _a, BlockNumber _block) const override
Definition: ClientBase.cpp:94
std::map< h256, std::pair< u256, u256 > > storageAt(Address _a, BlockNumber _block) const override
Definition: ClientBase.cpp:124
unsigned BlockNumber
Definition: Common.h:83
BlockDetails pendingDetails() const override
Definition: ClientBase.cpp:435
Transactions transactions(h256 _blockHash) const override
Definition: ClientBase.cpp:376
std::vector< LocalisedLogEntry > LocalisedLogEntries
Definition: LogEntry.h:94
Transactions transactions(BlockNumber _block) const override
Definition: ClientBase.h:117
h256s UncleHashes
Definition: BlockChain.h:81
ImportResult
Definition: Common.h:115
virtual SealEngineFace * sealEngine() const
Get the seal engine.
Definition: Interface.h:236
bool isKnown(h256 const &_hash) const override
Definition: ClientBase.cpp:492
u256 gasBidPrice() const override
Definition: ClientBase.h:136
EVMSchedule evmSchedule() const override
Definition: ClientBase.h:129
Active model of a block within the block chain. Keeps track of all transactions, receipts and state f...
Definition: Block.h:68
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
void stopSealing() override
Definition: ClientBase.h:151
BlockPolarity
Definition: Common.h:99
u256 stateAt(Address _a, u256 _l, BlockNumber _block) const override
Definition: ClientBase.cpp:104
ImportResult injectBlock(bytes const &_block) override
Injects the RLP-encoded block given by the _rlp into the block queue directly.
Definition: ClientBase.cpp:89
LocalisedTransactionReceipt localisedTransactionReceipt(h256 const &_transactionHash) const override
Definition: ClientBase.cpp:351
int chainId() const override
Gets the chain id.
Definition: ClientBase.cpp:526
Logger createLogger(int _severity, std::string const &_channel)
Definition: Log.h:125
std::vector< byte > bytes
Definition: Common.h:72
virtual ~ClientBase()
Definition: ClientBase.h:71
u256 balanceAt(Address _a) const
Definition: Interface.h:110
bool wouldSeal() const override
Would we like to be sealing now?
Definition: ClientBase.h:156
h160s Addresses
A vector of Ethereum addresses.
Definition: Address.h:33
Encodes a transaction, ready to be exported to or freshly imported from RLP.
Definition: Transaction.h:85
virtual Addresses addresses() const
Definition: Interface.h:192
Main API hub for interfacing with Ethereum.
Definition: Interface.h:67
TransactionReceipt transactionReceipt(h256 const &_transactionHash) const override
Definition: ClientBase.cpp:346
UncleHashes uncleHashes(h256 _blockHash) const override
Definition: ClientBase.cpp:401
std::function< void(GasEstimationProgress const &)> GasEstimationCallback
Definition: Interface.h:62
bool isKnownTransaction(h256 const &_transactionHash) const override
Definition: ClientBase.cpp:507
boost::multiprecision::number< boost::multiprecision::cpp_int_backend< 256, 256, boost::multiprecision::unsigned_magnitude, boost::multiprecision::unchecked, void > > u256
Definition: Common.h:121
virtual void prependLogsFromBlock(LogFilter const &_filter, h256 const &_blockHash, BlockPolarity _polarity, LocalisedLogEntries &io_logs) const
Definition: ClientBase.cpp:208
h256 codeHashAt(Address _a) const
Definition: Interface.h:114
h256 hashFromNumber(BlockNumber _number) const override
Definition: ClientBase.cpp:460
std::unordered_map< h256, h256s > m_specialFilters
The dictionary of special filters and their additional data.
Definition: ClientBase.h:186
h256s pendingHashes() const override
Definition: ClientBase.cpp:425
std::chrono::system_clock::time_point lastPoll
Definition: ClientBase.h:64
Block blockByNumber(BlockNumber _h) const
Definition: ClientBase.cpp:517
TransactionHashes transactionHashes(h256 _blockHash) const override
Definition: ClientBase.cpp:386
Definition: LogEntry.h:53
std::map< h256, std::pair< u256, u256 > > storageAt(Address _a) const
Definition: Interface.h:115
unsigned uncleCount(h256 _blockHash) const override
Definition: ClientBase.cpp:413
unsigned installWatch(LogFilter const &_filter, Reaping _r=Reaping::Automatic) override
Install, uninstall and query watches.
Definition: ClientBase.cpp:221
unsigned number() const override
Definition: ClientBase.cpp:420
unsigned transactionCount(BlockNumber _block) const override
Definition: ClientBase.h:122
h256 stateRootAt(Address _a, BlockNumber _block) const override
Definition: ClientBase.cpp:109
virtual Block block(h256 const &_h) const =0
LocalisedLogEntries peekWatch(unsigned _watchId) const override
Definition: ClientBase.cpp:278
std::mutex Mutex
Definition: Guards.h:37
Mutex x_filtersWatches
}
Definition: ClientBase.h:184
LocalisedTransaction localisedTransaction(h256 const &_transactionHash) const override
Definition: ClientBase.cpp:324
std::vector< h256 > h256s
Definition: FixedHash.h:359
Transaction transaction(h256 _transactionHash) const override
Definition: ClientBase.cpp:319
boost::error_info< struct tag_interface, std::string > errinfo_interface
Definition: Exceptions.h:94
std::map< unsigned, ClientWatch > m_watches
Each and every watch - these reference a filter.
Definition: ClientBase.h:188
LocalisedLogEntries checkWatch(unsigned _watchId) override
Definition: ClientBase.cpp:291
BlockHeader uncle(h256 _blockHash, unsigned _i) const override
Definition: ClientBase.cpp:391
std::unordered_map< h256, InstalledFilter > m_filters
The dictionary of filters that are active.
Definition: ClientBase.h:185
boost::log::sources::severity_channel_logger<> Logger
Definition: Log.h:124
Definition: LogEntry.h:34