Ethereum  PoC-8
The C++ Implementation of Ethereum
BlockChain.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 */
22 #pragma once
23 
24 #include "Account.h"
25 #include "BlockDetails.h"
26 #include "BlockQueue.h"
27 #include "ChainParams.h"
28 #include "LastBlockHashesFace.h"
29 #include "State.h"
30 #include "Transaction.h"
31 #include "VerifiedBlock.h"
32 #include <libdevcore/db.h>
33 #include <libdevcore/Exceptions.h>
34 #include <libdevcore/Log.h>
35 #include <libdevcore/Guards.h>
36 #include <libethcore/BlockHeader.h>
37 #include <libethcore/Common.h>
38 #include <libethcore/SealEngine.h>
39 #include <chrono>
40 #include <deque>
41 #include <unordered_map>
42 #include <unordered_set>
43 #include <boost/filesystem/path.hpp>
44 
45 namespace std
46 {
47 template <> struct hash<pair<dev::h256, unsigned>>
48 {
49  size_t operator()(pair<dev::h256, unsigned> const& _x) const { return hash<dev::h256>()(_x.first) ^ hash<unsigned>()(_x.second); }
50 };
51 }
52 
53 namespace dev
54 {
55 
56 class OverlayDB;
57 
58 namespace eth
59 {
60 
61 static const h256s NullH256s;
62 
63 class State;
64 class Block;
65 class ImportPerformanceLogger;
66 
67 DEV_SIMPLE_EXCEPTION(AlreadyHaveBlock);
69 DEV_SIMPLE_EXCEPTION(TransientError);
70 DEV_SIMPLE_EXCEPTION(FailedToWriteChainStart);
71 DEV_SIMPLE_EXCEPTION(UnknownBlockNumber);
72 
73 // TODO: Move all this Genesis stuff into Genesis.h/.cpp
74 std::unordered_map<Address, Account> const& genesisState();
75 
76 db::Slice toSlice(h256 const& _h, unsigned _sub = 0);
77 db::Slice toSlice(uint64_t _n, unsigned _sub = 0);
78 
79 using BlocksHash = std::unordered_map<h256, bytes>;
82 
83 enum {
90 };
91 
92 using ProgressCallback = std::function<void(unsigned, unsigned)>;
93 
95 {
96 public:
97  VersionChecker(boost::filesystem::path const& _dbPath, h256 const& _genesisHash);
98 };
99 
105 {
106 public:
109  BlockChain(ChainParams const& _p, boost::filesystem::path const& _path, WithExisting _we = WithExisting::Trust, ProgressCallback const& _pc = ProgressCallback());
110  ~BlockChain();
111 
113  void reopen(WithExisting _we = WithExisting::Trust, ProgressCallback const& _pc = ProgressCallback()) { reopen(m_params, _we, _pc); }
115 
118  void process();
119 
122  std::tuple<ImportRoute, bool, unsigned> sync(BlockQueue& _bq, OverlayDB const& _stateDB, unsigned _max);
123 
126  std::pair<ImportResult, ImportRoute> attemptImport(bytes const& _block, OverlayDB const& _stateDB, bool _mutBeNew = true) noexcept;
127 
130  ImportRoute import(bytes const& _block, OverlayDB const& _stateDB, bool _mustBeNew = true);
131  ImportRoute import(VerifiedBlockRef const& _block, OverlayDB const& _db, bool _mustBeNew = true);
132 
136  void insert(bytes const& _block, bytesConstRef _receipts, bool _mustBeNew = true);
137  void insert(VerifiedBlockRef _block, bytesConstRef _receipts, bool _mustBeNew = true);
139  ImportRoute insertWithoutParent(bytes const& _block, bytesConstRef _receipts, u256 const& _totalDifficulty);
140 
142  bool isKnown(h256 const& _hash, bool _isCurrent = true) const;
143 
145  BlockHeader info(h256 const& _hash) const { return BlockHeader(headerData(_hash), HeaderData); }
146  BlockHeader info() const { return info(currentHash()); }
147 
149  bytes block(h256 const& _hash) const;
150  bytes block() const { return block(currentHash()); }
151 
153  bytes headerData(h256 const& _hash) const;
154  bytes headerData() const { return headerData(currentHash()); }
155 
157  BlockDetails details(h256 const& _hash) const { return queryExtras<BlockDetails, ExtraDetails>(_hash, m_details, x_details, NullBlockDetails); }
158  BlockDetails details() const { return details(currentHash()); }
159 
161  BlockLogBlooms logBlooms(h256 const& _hash) const { return queryExtras<BlockLogBlooms, ExtraLogBlooms>(_hash, m_logBlooms, x_logBlooms, NullBlockLogBlooms); }
163 
166  BlockReceipts receipts(h256 const& _hash) const { return queryExtras<BlockReceipts, ExtraReceipts>(_hash, m_receipts, x_receipts, NullBlockReceipts); }
168 
170  TransactionReceipt transactionReceipt(h256 const& _blockHash, unsigned _i) const { return receipts(_blockHash).receipts[_i]; }
171 
173  TransactionReceipt transactionReceipt(h256 const& _transactionHash) const { TransactionAddress ta = queryExtras<TransactionAddress, ExtraTransactionAddress>(_transactionHash, m_transactionAddresses, x_transactionAddresses, NullTransactionAddress); if (!ta) return bytesConstRef(); return transactionReceipt(ta.blockHash, ta.index); }
174 
176  TransactionHashes transactionHashes(h256 const& _hash) const { auto b = block(_hash); RLP rlp(b); h256s ret; for (auto t: rlp[1]) ret.push_back(sha3(t.data())); return ret; }
178 
180  UncleHashes uncleHashes(h256 const& _hash) const { auto b = block(_hash); RLP rlp(b); h256s ret; for (auto t: rlp[2]) ret.push_back(sha3(t.data())); return ret; }
182 
184  h256 numberHash(unsigned _i) const { if (!_i) return genesisHash(); return queryExtras<BlockHash, uint64_t, ExtraBlockHash>(_i, m_blockHashes, x_blockHashes, NullBlockHash).value; }
185 
186  LastBlockHashesFace const& lastBlockHashes() const { return *m_lastBlockHashes; }
187 
202  BlocksBlooms blocksBlooms(unsigned _level, unsigned _index) const { return blocksBlooms(chunkId(_level, _index)); }
203  BlocksBlooms blocksBlooms(h256 const& _chunkId) const { return queryExtras<BlocksBlooms, ExtraBlocksBlooms>(_chunkId, m_blocksBlooms, x_blocksBlooms, NullBlocksBlooms); }
204  LogBloom blockBloom(unsigned _number) const { return blocksBlooms(chunkId(0, _number / c_bloomIndexSize)).blooms[_number % c_bloomIndexSize]; }
205  std::vector<unsigned> withBlockBloom(LogBloom const& _b, unsigned _earliest, unsigned _latest) const;
206  std::vector<unsigned> withBlockBloom(LogBloom const& _b, unsigned _earliest, unsigned _latest, unsigned _topLevel, unsigned _index) const;
207 
209  bool isKnownTransaction(h256 const& _transactionHash) const { TransactionAddress ta = queryExtras<TransactionAddress, ExtraTransactionAddress>(_transactionHash, m_transactionAddresses, x_transactionAddresses, NullTransactionAddress); return !!ta; }
210 
212  bytes transaction(h256 const& _transactionHash) const { TransactionAddress ta = queryExtras<TransactionAddress, ExtraTransactionAddress>(_transactionHash, m_transactionAddresses, x_transactionAddresses, NullTransactionAddress); if (!ta) return bytes(); return transaction(ta.blockHash, ta.index); }
213  std::pair<h256, unsigned> transactionLocation(h256 const& _transactionHash) const { TransactionAddress ta = queryExtras<TransactionAddress, ExtraTransactionAddress>(_transactionHash, m_transactionAddresses, x_transactionAddresses, NullTransactionAddress); if (!ta) return std::pair<h256, unsigned>(h256(), 0); return std::make_pair(ta.blockHash, ta.index); }
214 
216  bytes transaction(h256 const& _blockHash, unsigned _i) const { bytes b = block(_blockHash); return RLP(b)[1][_i].data().toBytes(); }
217  bytes transaction(unsigned _i) const { return transaction(currentHash(), _i); }
218 
220  std::vector<bytes> transactions(h256 const& _blockHash) const { bytes b = block(_blockHash); std::vector<bytes> ret; for (auto const& i: RLP(b)[1]) ret.push_back(i.data().toBytes()); return ret; }
221  std::vector<bytes> transactions() const { return transactions(currentHash()); }
222 
224  unsigned number(h256 const& _hash) const { return details(_hash).number; }
225  unsigned number() const { ReadGuard l(x_lastBlockHash); return m_lastBlockNumber; }
226 
228  h256 currentHash() const { ReadGuard l(x_lastBlockHash); return m_lastBlockHash; }
229 
231  h256 genesisHash() const { return m_genesisHash; }
232 
236  h256Hash allKinFrom(h256 const& _parent, unsigned _generations) const;
237 
240  void rebuild(boost::filesystem::path const& _path, ProgressCallback const& _progress = std::function<void(unsigned, unsigned)>());
241 
243  void rewind(unsigned _newHead);
244 
246  void rescue(OverlayDB const& _db);
247 
272  std::tuple<h256s, h256, unsigned> treeRoute(h256 const& _from, h256 const& _to, bool _common = true, bool _pre = true, bool _post = true) const;
273 
274  struct Statistics
275  {
276  unsigned memBlocks = 0;
277  unsigned memDetails = 0;
278  unsigned memLogBlooms = 0;
279  unsigned memReceipts = 0;
281  unsigned memBlockHashes = 0;
283  };
284 
286  Statistics usage(bool _freshen = false) const { if (_freshen) updateStats(); return m_lastStats; }
287 
289  void garbageCollect(bool _force = false);
290 
292  void setOnBad(std::function<void(Exception&)> _t) { m_onBad = _t; }
293 
295  void setOnBlockImport(std::function<void(BlockHeader const&)> _t) { m_onBlockImport = _t; }
296 
298  Block genesisBlock(OverlayDB const& _db) const;
299 
302 
304  std::string dumpDatabase() const;
305 
306  ChainParams const& chainParams() const { return m_params; }
307 
308  SealEngineFace* sealEngine() const { return m_sealEngine.get(); }
309 
310  BlockHeader const& genesis() const;
311 
313  unsigned chainStartBlockNumber() const;
315  void setChainStartBlockNumber(unsigned _number);
316 
317 private:
318  static h256 chunkId(unsigned _level, unsigned _index) { return h256(_index * 0xff + _level); }
319 
321  void init(ChainParams const& _p);
323  unsigned open(boost::filesystem::path const& _path, WithExisting _we);
325  void open(boost::filesystem::path const& _path, WithExisting _we, ProgressCallback const& _pc);
327  void close();
328 
329  ImportRoute insertBlockAndExtras(VerifiedBlockRef const& _block, bytesConstRef _receipts, u256 const& _totalDifficulty, ImportPerformanceLogger& _performanceLogger);
330  void checkBlockIsNew(VerifiedBlockRef const& _block) const;
331  void checkBlockTimestamp(BlockHeader const& _header) const;
332 
333  template <class T, class K, unsigned N>
334  T queryExtras(K const& _h, std::unordered_map<K, T>& _m, boost::shared_mutex& _x, T const& _n,
335  db::DatabaseFace* _extrasDB = nullptr) const
336  {
337  {
338  ReadGuard l(_x);
339  auto it = _m.find(_h);
340  if (it != _m.end())
341  return it->second;
342  }
343 
344  std::string const s = (_extrasDB ? _extrasDB : m_extrasDB.get())->lookup(toSlice(_h, N));
345  if (s.empty())
346  return _n;
347 
348  noteUsed(_h, N);
349 
350  WriteGuard l(_x);
351  auto ret = _m.insert(std::make_pair(_h, T(RLP(s))));
352  return ret.first->second;
353  }
354 
355  template <class T, unsigned N>
356  T queryExtras(h256 const& _h, std::unordered_map<h256, T>& _m, boost::shared_mutex& _x,
357  T const& _n, db::DatabaseFace* _extrasDB = nullptr) const
358  {
359  return queryExtras<T, h256, N>(_h, _m, _x, _n, _extrasDB);
360  }
361 
362  void checkConsistency();
363 
366  void clearCachesDuringChainReversion(unsigned _firstInvalid);
367  void clearBlockBlooms(unsigned _begin, unsigned _end);
368 
370  mutable SharedMutex x_blocks;
371  mutable BlocksHash m_blocks;
372  mutable SharedMutex x_details;
373  mutable BlockDetailsHash m_details;
374  mutable SharedMutex x_logBlooms;
375  mutable BlockLogBloomsHash m_logBlooms;
376  mutable SharedMutex x_receipts;
377  mutable BlockReceiptsHash m_receipts;
378  mutable SharedMutex x_transactionAddresses;
379  mutable TransactionAddressHash m_transactionAddresses;
380  mutable SharedMutex x_blockHashes;
381  mutable BlockHashHash m_blockHashes;
382  mutable SharedMutex x_blocksBlooms;
383  mutable BlocksBloomsHash m_blocksBlooms;
384 
385  using CacheID = std::pair<h256, unsigned>;
386  mutable Mutex x_cacheUsage;
387  mutable std::deque<std::unordered_set<CacheID>> m_cacheUsage;
388  mutable std::unordered_set<CacheID> m_inUse;
389  void noteUsed(h256 const& _h, unsigned _extra = (unsigned)-1) const;
390  void noteUsed(uint64_t const& _h, unsigned _extra = (unsigned)-1) const { (void)_h; (void)_extra; } // don't note non-hash types
391  std::chrono::system_clock::time_point m_lastCollection;
392 
393  void noteCanonChanged() const { m_lastBlockHashes->clear(); }
394  std::unique_ptr<LastBlockHashesFace> m_lastBlockHashes;
395 
396  void updateStats() const;
397  mutable Statistics m_lastStats;
398 
400  std::unique_ptr<db::DatabaseFace> m_blocksDB;
401  std::unique_ptr<db::DatabaseFace> m_extrasDB;
402 
404  mutable boost::shared_mutex x_lastBlockHash; // should protect both m_lastBlockHash and m_lastBlockNumber
405  h256 m_lastBlockHash;
406  unsigned m_lastBlockNumber = 0;
407 
408  ChainParams m_params;
409  std::shared_ptr<SealEngineFace> m_sealEngine; // consider shared_ptr.
410  mutable SharedMutex x_genesis;
411  mutable BlockHeader m_genesis; // mutable because they're effectively memos.
412  mutable bytes m_genesisHeaderBytes; // mutable because they're effectively memos.
413  mutable h256 m_genesisHash; // mutable because they're effectively memos.
414 
415  std::function<void(Exception&)> m_onBad;
416  std::function<void(BlockHeader const&)> m_onBlockImport;
417 
418  boost::filesystem::path m_dbPath;
419 
420  mutable Logger m_logger{createLogger(VerbosityDebug, "chain")};
421  mutable Logger m_loggerDetail{createLogger(VerbosityTrace, "chain")};
422  mutable Logger m_loggerError{createLogger(VerbosityError, "chain")};
423 
424  friend std::ostream& operator<<(std::ostream& _out, BlockChain const& _bc);
425 };
426 
427 std::ostream& operator<<(std::ostream& _out, BlockChain const& _bc);
428 
429 }
430 }
dev::eth::BlockChain::currentHash
h256 currentHash() const
Get a given block (RLP format). Thread-safe.
Definition: BlockChain.h:228
dev::eth::BlockQueue
A queue of blocks. Sits between network or other I/O and the BlockChain. Sorts them ready for blockch...
Definition: BlockQueue.h:224
dev::SharedMutex
boost::shared_mutex SharedMutex
Definition: Guards.h:39
dev::eth::BlockChain::Statistics::memLogBlooms
unsigned memLogBlooms
Definition: BlockChain.h:278
dev::eth::BlockChain::insert
void insert(bytes const &_block, bytesConstRef _receipts, bool _mustBeNew=true)
Definition: BlockChain.cpp:540
dev::eth::BlockChain::isKnownTransaction
bool isKnownTransaction(h256 const &_transactionHash) const
Returns true if transaction is known. Thread-safe.
Definition: BlockChain.h:209
BlockQueue.h
dev::eth::BlockChain::Statistics::memDetails
unsigned memDetails
Definition: BlockChain.h:277
dev::eth::BlockChain::rescue
void rescue(OverlayDB const &_db)
Rescue the database.
Definition: BlockChain.cpp:1041
dev::eth::BlockChain::withBlockBloom
std::vector< unsigned > withBlockBloom(LogBloom const &_b, unsigned _earliest, unsigned _latest) const
Definition: BlockChain.cpp:1334
dev::eth::BlocksBlooms::blooms
std::array< LogBloom, c_bloomIndexSize > blooms
Definition: BlockDetails.h:75
dev::eth::TransactionAddress
Definition: BlockDetails.h:101
dev::eth::HeaderData
@ HeaderData
Definition: BlockHeader.h:69
dev::eth::BlockChain::rebuild
void rebuild(boost::filesystem::path const &_path, ProgressCallback const &_progress=std::function< void(unsigned, unsigned)>())
Definition: BlockChain.cpp:341
dev::vector_ref
Definition: vector_ref.h:22
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::SealEngineFace
Definition: SealEngine.h:46
dev::eth::BlockChain::treeRoute
std::tuple< h256s, h256, unsigned > treeRoute(h256 const &_from, h256 const &_to, bool _common=true, bool _pre=true, bool _post=true) const
Definition: BlockChain.cpp:1116
dev::eth::BlockChain::attemptImport
std::pair< ImportResult, ImportRoute > attemptImport(bytes const &_block, OverlayDB const &_stateDB, bool _mutBeNew=true) noexcept
Definition: BlockChain.cpp:507
dev::eth::BlockChain::Statistics::memTotal
unsigned memTotal() const
Definition: BlockChain.h:282
dev::eth::BlockChain::uncleHashes
UncleHashes uncleHashes() const
Definition: BlockChain.h:181
dev::eth::BlockChain::headerData
bytes headerData() const
Definition: BlockChain.h:154
dev::sha3
bool sha3(bytesConstRef _input, bytesRef o_output) noexcept
Definition: SHA3.cpp:28
dev::eth::BlockChain::reopen
void reopen(WithExisting _we=WithExisting::Trust, ProgressCallback const &_pc=ProgressCallback())
Reopen everything.
Definition: BlockChain.h:113
dev::eth::ChainParams
Definition: ChainParams.h:38
VerifiedBlock.h
dev::eth::BlockChain::genesisHash
h256 genesisHash() const
Get the hash of the genesis block. Thread-safe.
Definition: BlockChain.h:231
dev::eth::ExtraBlocksBlooms
@ ExtraBlocksBlooms
Definition: BlockChain.h:89
std::hash< pair< dev::h256, unsigned > >::operator()
size_t operator()(pair< dev::h256, unsigned > const &_x) const
Definition: BlockChain.h:49
dev::eth::BlockChain::blockBloom
LogBloom blockBloom(unsigned _number) const
Definition: BlockChain.h:204
dev::eth::genesisState
std::unordered_map< Address, Account > const & genesisState()
dev::eth::BlockChain::transactionHashes
TransactionHashes transactionHashes(h256 const &_hash) const
Get a list of transaction hashes for a given block. Thread-safe.
Definition: BlockChain.h:176
dev::eth::BlockChain::isKnown
bool isKnown(h256 const &_hash, bool _isCurrent=true) const
Returns true if the given block is known (though not necessarily a part of the canon chain).
Definition: BlockChain.cpp:1404
dev::eth::ExtraReceipts
@ ExtraReceipts
Definition: BlockChain.h:88
dev::h256
FixedHash< 32 > h256
Definition: FixedHash.h:356
dev::eth::BlockChain::Statistics::memBlockHashes
unsigned memBlockHashes
Definition: BlockChain.h:281
dev::eth::ImportRequirements::value
unsigned value
Definition: Common.h:112
dev::eth::BlockChain::logBlooms
BlockLogBlooms logBlooms(h256 const &_hash) const
Get the transactions' log blooms of a block (or the most recent mined if none given)....
Definition: BlockChain.h:161
dev::eth::BlockChain::sync
std::tuple< ImportRoute, bool, unsigned > sync(BlockQueue &_bq, OverlayDB const &_stateDB, unsigned _max)
Definition: BlockChain.cpp:443
dev::eth::BlockChain::number
unsigned number(h256 const &_hash) const
Get a number for the given hash (or the most recent mined if none given). Thread-safe.
Definition: BlockChain.h:224
std::hash< dev::h256 >
Definition: FixedHash.h:398
dev::eth::BlockChain::transaction
bytes transaction(unsigned _i) const
Definition: BlockChain.h:217
dev::eth::BlockHashHash
std::unordered_map< uint64_t, BlockHash > BlockHashHash
Definition: BlockDetails.h:118
dev::eth::BlockChain::number
unsigned number() const
Definition: BlockChain.h:225
dev::eth::BlockChain::usage
Statistics usage(bool _freshen=false) const
Definition: BlockChain.h:286
dev::eth::BlockChain::sealEngine
SealEngineFace * sealEngine() const
Definition: BlockChain.h:308
dev::eth::ExtraBlockHash
@ ExtraBlockHash
Definition: BlockChain.h:85
db.h
BlockHeader.h
dev::rlp
bytes rlp(_T _t)
Export a single item in RLP format, returning a byte array.
Definition: RLP.h:453
dev::eth::BlockChain::~BlockChain
~BlockChain()
Definition: BlockChain.cpp:180
dev::eth::BlockDetails
Definition: BlockDetails.h:42
dev::FixedHash< 32 >
dev::eth::TransactionAddress::blockHash
h256 blockHash
Definition: BlockDetails.h:108
dev::eth::ProgressCallback
std::function< void(unsigned, unsigned)> ProgressCallback
Definition: BlockChain.h:92
dev::eth::ExtraTransactionAddress
@ ExtraTransactionAddress
Definition: BlockChain.h:86
dev::VerbosityError
@ VerbosityError
Definition: Log.h:68
dev::WithExisting
WithExisting
Definition: Common.h:292
dev::Exception
Base class for all exceptions.
Definition: Exceptions.h:39
dev::WriteGuard
boost::unique_lock< boost::shared_mutex > WriteGuard
Definition: Guards.h:47
dev::eth::VersionChecker
Definition: BlockChain.h:95
dev::eth::BlockChain::details
BlockDetails details(h256 const &_hash) const
Get the familial details concerning a block (or the most recent mined if none given)....
Definition: BlockChain.h:157
dev::eth::BlockDetails::number
unsigned number
Definition: BlockDetails.h:51
dev::WithExisting::Trust
@ Trust
dev::eth::BlockChain::block
bytes block() const
Definition: BlockChain.h:150
Common.h
dev::eth::BlockChain::import
ImportRoute import(bytes const &_block, OverlayDB const &_stateDB, bool _mustBeNew=true)
Definition: BlockChain.cpp:533
dev::eth::BlockChain::logBlooms
BlockLogBlooms logBlooms() const
Definition: BlockChain.h:162
dev::eth::BlockChain::chainStartBlockNumber
unsigned chainStartBlockNumber() const
Definition: BlockChain.cpp:1606
dev::eth::BlockChain::chainParams
ChainParams const & chainParams() const
Definition: BlockChain.h:306
dev::eth::BlockChain::uncleHashes
UncleHashes uncleHashes(h256 const &_hash) const
Get a list of uncle hashes for a given block. Thread-safe.
Definition: BlockChain.h:180
dev::eth::BlockLogBloomsHash
std::unordered_map< h256, BlockLogBlooms > BlockLogBloomsHash
Definition: BlockDetails.h:115
dev::h256Hash
std::unordered_set< h256 > h256Hash
Definition: FixedHash.h:365
dev::h256s
std::vector< h256 > h256s
Definition: FixedHash.h:361
dev::Logger
boost::log::sources::severity_channel_logger<> Logger
Definition: Log.h:124
dev::eth::Asking::State
@ State
dev::eth::BlockChain::operator<<
friend std::ostream & operator<<(std::ostream &_out, BlockChain const &_bc)
dev::eth::ImportRequirements::OutOfOrderChecks
@ OutOfOrderChecks
Do all checks that can be done independently of prior blocks having been imported.
Definition: Common.h:125
dev::eth::BlockChain::details
BlockDetails details() const
Definition: BlockChain.h:158
dev::eth::BlockChain::transaction
bytes transaction(h256 const &_transactionHash) const
Get a transaction from its hash. Thread-safe.
Definition: BlockChain.h:212
dev::eth::BlockChain::process
void process()
dev::eth::BlockChain::blocksBlooms
BlocksBlooms blocksBlooms(h256 const &_chunkId) const
Definition: BlockChain.h:203
dev::eth::BlockChain::allKinFrom
h256Hash allKinFrom(h256 const &_parent, unsigned _generations) const
Definition: BlockChain.cpp:1388
dev::eth::BlockChain::receipts
BlockReceipts receipts(h256 const &_hash) const
Definition: BlockChain.h:166
dev::eth::BlockChain::numberHash
h256 numberHash(unsigned _i) const
Get the hash for a given block's number.
Definition: BlockChain.h:184
dev::eth::BlocksBloomsHash
std::unordered_map< h256, BlocksBlooms > BlocksBloomsHash
Definition: BlockDetails.h:119
dev::eth::BlockChain::Statistics::memReceipts
unsigned memReceipts
Definition: BlockChain.h:279
dev::eth::BlockLogBlooms
Definition: BlockDetails.h:60
dev::eth::BlocksBlooms
Definition: BlockDetails.h:70
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::BlockChain::verifyBlock
VerifiedBlockRef verifyBlock(bytesConstRef _block, std::function< void(Exception &)> const &_onBad, ImportRequirements::value _ir=ImportRequirements::OutOfOrderChecks) const
Verify block and prepare it for enactment.
Definition: BlockChain.cpp:1501
dev::eth::BlockChain::transactionReceipt
TransactionReceipt transactionReceipt(h256 const &_blockHash, unsigned _i) const
Get the transaction by block hash and index;.
Definition: BlockChain.h:170
SealEngine.h
Transaction.h
dev::bytesConstRef
vector_ref< byte const > bytesConstRef
Definition: Common.h:74
dev::ReadGuard
boost::shared_lock< boost::shared_mutex > ReadGuard
Definition: Guards.h:44
dev::eth::BlockChain
Implements the blockchain database. All data this gives is disk-backed. @threadsafe.
Definition: BlockChain.h:105
dev::eth::BlockChain::lastBlockHashes
LastBlockHashesFace const & lastBlockHashes() const
Definition: BlockChain.h:186
dev::eth::BlockChain::setOnBad
void setOnBad(std::function< void(Exception &)> _t)
Change the function that is called with a bad block.
Definition: BlockChain.h:292
Exceptions.h
dev::eth::BlockReceipts::receipts
TransactionReceipts receipts
Definition: BlockDetails.h:85
dev::OverlayDB
Definition: OverlayDB.h:34
dev::eth::BlockDetailsHash
std::unordered_map< h256, BlockDetails > BlockDetailsHash
Definition: BlockDetails.h:114
dev::eth::BlockChain::info
BlockHeader info() const
Definition: BlockChain.h:146
dev::RLP::data
bytesConstRef data() const
The bare data of the RLP.
Definition: RLP.h:80
dev::eth::BlockChain::transactionLocation
std::pair< h256, unsigned > transactionLocation(h256 const &_transactionHash) const
Definition: BlockChain.h:213
dev::eth::BlockChain::setOnBlockImport
void setOnBlockImport(std::function< void(BlockHeader const &)> _t)
Change the function that is called when a new block is imported.
Definition: BlockChain.h:295
dev::db::DatabaseFace
Definition: db.h:55
dev::eth::TransactionAddress::index
unsigned index
Definition: BlockDetails.h:109
dev::VerbosityDebug
@ VerbosityDebug
Definition: Log.h:71
dev::Mutex
std::mutex Mutex
Definition: Guards.h:37
dev::eth::BlockChain::genesis
BlockHeader const & genesis() const
Definition: BlockChain.cpp:185
dev::eth::UncleHashes
h256s UncleHashes
Definition: BlockChain.h:81
dev::eth::VersionChecker::VersionChecker
VersionChecker(boost::filesystem::path const &_dbPath, h256 const &_genesisHash)
ChainParams.h
dev::eth::BlockReceiptsHash
std::unordered_map< h256, BlockReceipts > BlockReceiptsHash
Definition: BlockDetails.h:116
dev::vector_ref::toBytes
std::vector< unsigned char > toBytes() const
Definition: vector_ref.h:43
dev::eth::TransactionAddressHash
std::unordered_map< h256, TransactionAddress > TransactionAddressHash
Definition: BlockDetails.h:117
LastBlockHashesFace.h
std
Definition: FixedHash.h:393
dev::eth::BlockChain::Statistics::memBlocks
unsigned memBlocks
Definition: BlockChain.h:276
dev::eth::BlocksHash
std::unordered_map< h256, bytes > BlocksHash
Definition: BlockChain.h:79
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::operator<<
std::ostream & operator<<(std::ostream &_out, BlockHeader const &_bi)
Definition: BlockHeader.h:217
dev::eth::BlockChain::garbageCollect
void garbageCollect(bool _force=false)
Deallocate unused data.
Definition: BlockChain.cpp:1211
dev::eth::VerifiedBlockRef
Verified block info, does not hold block data, but a reference instead.
Definition: VerifiedBlock.h:37
dev::eth::BlockChain::insertWithoutParent
ImportRoute insertWithoutParent(bytes const &_block, bytesConstRef _receipts, u256 const &_totalDifficulty)
Insert that doesn't require parent to be imported, useful when we don't have the full blockchain (lik...
Definition: BlockChain.cpp:733
dev::eth::TransactionReceipt
Definition: TransactionReceipt.h:40
dev::eth::ImportRoute
Definition: Common.h:90
dev::eth::DEV_SIMPLE_EXCEPTION
DEV_SIMPLE_EXCEPTION(NoHashRecorded)
dev::eth::BlockChain::transactionReceipt
TransactionReceipt transactionReceipt(h256 const &_transactionHash) const
Get the transaction receipt by transaction hash. Thread-safe.
Definition: BlockChain.h:173
dev::eth::BlockChain::BlockChain
BlockChain(ChainParams const &_p, boost::filesystem::path const &_path, WithExisting _we=WithExisting::Trust, ProgressCallback const &_pc=ProgressCallback())
Definition: BlockChain.cpp:172
dev::eth::BlockReceipts
Definition: BlockDetails.h:80
dev
Definition: Address.cpp:21
dev::eth::BlockChain::blocksBlooms
BlocksBlooms blocksBlooms(unsigned _level, unsigned _index) const
Definition: BlockChain.h:202
dev::eth::BlockChain::dumpDatabase
std::string dumpDatabase() const
Gives a dump of the blockchain database. For debug/test use only.
Definition: BlockChain.cpp:424
Guards.h
Account.h
dev::eth::BlockChain::transactionHashes
TransactionHashes transactionHashes() const
Definition: BlockChain.h:177
dev::eth::BlockChain::rewind
void rewind(unsigned _newHead)
Alter the head of the chain to some prior block along it.
Definition: BlockChain.cpp:1091
dev::eth::toSlice
db::Slice toSlice(h256 const &_h, unsigned _sub=0)
Definition: BlockChain.cpp:78
dev::eth::BlockChain::Statistics
Definition: BlockChain.h:275
dev::eth::LastBlockHashesFace
Interface for getting a list of recent block hashes @threadsafe.
Definition: LastBlockHashesFace.h:37
dev::RLP
Definition: RLP.h:48
dev::VerbosityTrace
@ VerbosityTrace
Definition: Log.h:72
dev::eth::BlockChain::setChainStartBlockNumber
void setChainStartBlockNumber(unsigned _number)
Change the chain start block.
Definition: BlockChain.cpp:1587
dev::eth::BlockChain::transaction
bytes transaction(h256 const &_blockHash, unsigned _i) const
Get a block's transaction (RLP format) for the given block hash (or the most recent mined if none giv...
Definition: BlockChain.h:216
dev::eth::ExtraDetails
@ ExtraDetails
Definition: BlockChain.h:84
Log.h
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
dev::eth::BlockChain::Statistics::memTransactionAddresses
unsigned memTransactionAddresses
Definition: BlockChain.h:280
State.h
dev::eth::BlockChain::genesisBlock
Block genesisBlock(OverlayDB const &_db) const
Get a pre-made genesis State object.
Definition: BlockChain.cpp:1479
BlockDetails.h
dev::eth::BlockChain::receipts
BlockReceipts receipts() const
Definition: BlockChain.h:167
dev::eth::BlockChain::transactions
std::vector< bytes > transactions(h256 const &_blockHash) const
Get all transactions from a block.
Definition: BlockChain.h:220
dev::eth::BlockChain::transactions
std::vector< bytes > transactions() const
Definition: BlockChain.h:221
dev::eth::ExtraLogBlooms
@ ExtraLogBlooms
Definition: BlockChain.h:87
dev::eth::TransactionHashes
h256s TransactionHashes
Definition: BlockChain.h:80